Spaces:
Sleeping
Sleeping
Enhance project structure by adding new files and updating dependencies. Introduce model_factory.py for streamlined model creation using environment variables. Update .gitignore to exclude additional cache and model files. Modify main_v2.py to utilize ModelFactory for model instantiation and adjust API key loading. Expand requirements.txt with new dependencies for improved functionality. Add new notebooks for fine-tuning and model training, enhancing project documentation and usability.
7461cd0
unverified
| import logging | |
| import os | |
| import requests | |
| import yaml | |
| from dotenv import find_dotenv, load_dotenv | |
| from litellm._logging import _disable_debugging | |
| from openinference.instrumentation.smolagents import SmolagentsInstrumentor | |
| from phoenix.otel import register | |
| # from smolagents import CodeAgent, LiteLLMModel, LiteLLMRouterModel | |
| from smolagents import CodeAgent, LiteLLMModel | |
| from smolagents.monitoring import LogLevel | |
| from tools.smart_search.tool import SmartSearchTool | |
| from model_factory import ModelFactory | |
| _disable_debugging() | |
| # Configure OpenTelemetry with Phoenix | |
| register() | |
| SmolagentsInstrumentor().instrument() | |
| logging.basicConfig( | |
| level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" | |
| ) | |
| logger = logging.getLogger(__name__) | |
| # load_dotenv(find_dotenv()) | |
| # API_BASE = os.getenv("API_BASE") | |
| # API_KEY = os.getenv("API_KEY") | |
| # MODEL_ID = os.getenv("MODEL_ID") | |
| # Create model using the factory | |
| model = ModelFactory.create_model() | |
| # data_agent = create_data_agent(model) | |
| # media_agent = create_media_agent(model) | |
| # web_agent = create_web_agent(model) | |
| # search_agent = ToolCallingAgent( | |
| # tools=[DuckDuckGoSearchTool(), VisitWebpageTool()], | |
| # model=model, | |
| # name="search_agent", | |
| # description="This is an agent that can do web search.", | |
| # ) | |
| prompt_templates = yaml.safe_load(open("prompts/code_agent_modified.yaml", "r")) | |
| agent = CodeAgent( | |
| # add_base_tools=True, | |
| # additional_authorized_imports=[ | |
| # "json", | |
| # "pandas", | |
| # "numpy", | |
| # "re", | |
| # # "requests" | |
| # # "urllib.request", | |
| # ], | |
| # max_steps=10, | |
| # managed_agents=[web_agent, data_agent, media_agent], | |
| # managed_agents=[search_agent], | |
| model=model, | |
| prompt_templates=prompt_templates, | |
| tools=[ | |
| SmartSearchTool(), | |
| # VisitWebpageTool(max_output_length=1024), | |
| ], | |
| step_callbacks=None, | |
| verbosity_level=LogLevel.ERROR, | |
| ) | |
| agent.visualize() | |
| def main(task: str): | |
| # Format the task to request both succinct and verbose answers | |
| formatted_task = f"""Please provide two answers to the following question: | |
| 1. A succinct answer that follows these rules: | |
| - Contains ONLY the answer, nothing else | |
| - Does not repeat the question | |
| - Does not include explanations, reasoning, or context | |
| - Does not include source attribution or references | |
| - Does not use phrases like "The answer is" or "I found that" | |
| - Does not include formatting, bullet points, or line breaks | |
| - If the answer is a number, return only the number | |
| - If the answer requires multiple items, separate them with commas | |
| - If the answer requires ordering, maintain the specified order | |
| - Uses the most direct and succinct form possible | |
| 2. A verbose answer that includes: | |
| - The complete answer with all relevant details | |
| - Explanations and reasoning | |
| - Context and background information | |
| - Source attribution where appropriate | |
| Question: {task} | |
| Please format your response as a JSON object with two keys: | |
| - "succinct_answer": The concise answer following the rules above | |
| - "verbose_answer": The detailed explanation with context""" | |
| result = agent.run( | |
| additional_args=None, | |
| images=None, | |
| max_steps=3, | |
| reset=True, | |
| stream=False, | |
| task=formatted_task, | |
| ) | |
| # Parse the result into a dictionary | |
| try: | |
| import json | |
| # Find the JSON object in the response | |
| json_str = result[result.find("{") : result.rfind("}") + 1] | |
| parsed_result = json.loads(json_str) | |
| except (ValueError, AttributeError) as e: | |
| logger.error(f"Error parsing result: {e}") | |
| # If parsing fails, return the raw result | |
| return result | |
| logger.info(f"Result: {parsed_result}") | |
| return parsed_result["succinct_answer"] | |
| if __name__ == "__main__": | |
| DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space" | |
| api_url = DEFAULT_API_URL | |
| questions_url = f"{api_url}/questions" | |
| submit_url = f"{api_url}/submit" | |
| response = requests.get(questions_url, timeout=15) | |
| response.raise_for_status() | |
| questions_data = response.json() | |
| for question_data in questions_data[:1]: | |
| file_name = question_data["file_name"] | |
| level = question_data["Level"] | |
| question = question_data["question"] | |
| task_id = question_data["task_id"] | |
| logger.info(f"Question: {question}") | |
| # logger.info(f"Level: {level}") | |
| if file_name: | |
| logger.info(f"File Name: {file_name}") | |
| # logger.info(f"Task ID: {task_id}") | |
| final_answer = main(question) | |
| logger.info(f"Final Answer: {final_answer}") | |
| logger.info("--------------------------------") | |