Download agent.py from Hemimoon/Agents-Course-Final-Assignment: direct link, hf CLI and curl.
- Browser
- Download file 3.5 kB
-
https://huggingface.co/spaces/Hemimoon/Agents-Course-Final-Assignment/resolve/main/agent.py
- Command line
-
hf download hf://spaces/Hemimoon/Agents-Course-Final-Assignment/agent.py
-
curl -L -o agent.py https://huggingface.co/spaces/Hemimoon/Agents-Course-Final-Assignment/resolve/main/agent.py
3.5 kB
| import os | |
| import pathlib | |
| import dotenv | |
| from smolagents import ( | |
| CodeAgent, | |
| OpenAIServerModel, | |
| VisitWebpageTool, | |
| WebSearchTool, | |
| WikipediaSearchTool, | |
| ) | |
| from prompt import ( | |
| calc_agent_prompt, | |
| gen_GAIA_answer_formatter_prompt, | |
| web_search_agent_prompt, | |
| ) | |
| if pathlib.Path(".env").exists(): | |
| dotenv.load_dotenv(".env") | |
| OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", None) | |
| if not OPENAI_API_KEY: | |
| raise ValueError( | |
| "Please set either OPENAI_API_KEY in your .env file or Huggingface Space settings." | |
| ) | |
| model = OpenAIServerModel( | |
| model_id="gpt-4.1", | |
| api_key=OPENAI_API_KEY, | |
| ) | |
| web_search_agent = CodeAgent( | |
| model=model, | |
| name="web_search_agent", | |
| description="An agent that can search the web, visit webpages, and summarize information.", | |
| prompt_templates=web_search_agent_prompt, | |
| additional_authorized_imports=["requests", "beautifulsoup4"], | |
| tools=[ | |
| WebSearchTool(), | |
| VisitWebpageTool(), | |
| WikipediaSearchTool(), | |
| ], | |
| ) | |
| calc_agent = CodeAgent( | |
| model=model, | |
| name="calc_agent", | |
| description="An agent that can perform calculations, solve math problems, and analyze data.", | |
| prompt_templates=calc_agent_prompt, | |
| additional_authorized_imports=["pandas", "numpy", "math", "statistics", "scipy"], | |
| tools=[] | |
| ) | |
| class ExtractFailedException(Exception): | |
| """Custom exception for failed extraction of formatted answer.""" | |
| pass | |
| class GAIAAnswerFormatter: | |
| model = OpenAIServerModel( | |
| model_id="gpt-4.1-mini", | |
| api_key=OPENAI_API_KEY, | |
| ) | |
| def extract_formatted_answer(self, llm_response: str) -> str: | |
| import re | |
| match = re.search(r'<formated_answer>(.*?)</formated_answer>', llm_response, re.DOTALL) | |
| if match: | |
| return match.group(1).strip() | |
| raise ExtractFailedException( | |
| "Failed to extract formatted answer from the LLM response." | |
| ) | |
| def __call__(self, question: str, answer: str) -> str: | |
| message = [{ | |
| "role": "user", | |
| "content": gen_GAIA_answer_formatter_prompt(question, answer), | |
| }] | |
| response = self.model.generate(messages=message) | |
| try: | |
| return self.extract_formatted_answer(response.content) | |
| except ExtractFailedException: | |
| return answer | |
| answer_formatter = GAIAAnswerFormatter() | |
| class Agent: | |
| def __init__(self): | |
| self.agent = CodeAgent( | |
| model=model, | |
| managed_agents=[web_search_agent, calc_agent], | |
| tools=[], | |
| add_base_tools=True, | |
| ) | |
| def __call__(self, question: str) -> str: | |
| answer = self.agent.run(question) | |
| return answer_formatter(question, answer) | |
| if __name__ == "__main__": | |
| GAIA_EXAMPLE_QUESTION = """ | |
| In NASA’s Astronomy Picture of the Day on 2006 January 21, two astronauts are visible, | |
| with one appearing much smaller than the other. As of August 2023, out of the astronauts in the | |
| NASA Astronaut Group that the smaller astronaut was a member of, which one spent the least time | |
| in space, and how many minutes did he spend in space, rounded to the nearest minute? Exclude any | |
| astronauts who did not spend any time in space. Give the last name of the astronaut, separated from | |
| the number of minutes by a semicolon. Use commas as thousands separators in the number of minutes. | |
| """ | |
| agent = Agent() | |
| final_answer = agent(GAIA_EXAMPLE_QUESTION) | |
| print(f"\n\n---\n\nFinal answer: {final_answer}") |