AgentCourseU4 / agent.py
Kaladin4's picture
ft: add basic agent
ab36e53
from se_agents.agent import Agent
from config import Config
from se_agents.tools import *
from tools import *
from se_agents.runner import Runner
from pydantic import BaseModel
class Task(BaseModel):
task_id: str
question: str
Level: str
file_name: str
async def run_agent(query):
agent = Agent(
api_key=Config.get_openrouter_api_key(),
base_url=Config.get_openrouter_api_url(),
model=Config.get_model(),
tools=[
ExaSearch(Config.get_exa_api_key()),
ExaCrawl(Config.get_exa_api_key()),
ExaSearchBase(Config.get_exa_api_key()),
ExaSearchContent(Config.get_exa_api_key()),
ExaSearchHighlights(Config.get_exa_api_key()),
OpenAIVisionTool(),
ThinkTool(),
FinalOutput(),
YoutubeVideoInterpreter(),
TaskFileDownloader(),
RetriveInfoTaskFile(),
SpeechToText(),
CodeInterpreter(),
],
description="You are a general AI assistant. You are direct and concise.",
rules="""Answer with the following template: [YOUR FINAL ANSWER].
YOUR FINAL ANSWER should be a number OR as few words as possible OR a comma separated list of numbers and/or strings, you do not explain your answer, you just provided it in the least amount of characters as possible.
For every task that is given to you first think about it using the 'think' tool.
If you are asked for a number, don't use comma to write your number neither use units such as $ or percent sign unless specified otherwise, do not write the number as a string instead used the number notation. Example: Not Sixty three, Do 63.
If you are asked for a string, don't use articles, neither abbreviations (e.g. for cities), and write the digits in plain text unless specified otherwise.
If you are asked for a comma separated list, apply the above rules depending of whether the element to be put in the list is a number or a string.
If the task at hand has any file associated with it you never give a direct answer, first use the think tool, to process the request, once the thinking is complete you must first download using the task_file_downloader tool, and the use the proper tool to analyze the file.
If the task as any audio file associated with it, you must use the speech_to_text tool to convert it to a .txt file.
If the task involves the interpretation of code, you must use the code_interpreter tool to get the content of the code file.""",
add_default_rules=False,
add_think_instructions=True,
add_final_output_instructions=True,
)
runner = Runner(agent, enforce_final=True)
final_response = ""
async for response in runner.run(query):
if response.type == "response":
# This will typically contain the final output when enforce_final=True,
# or intermediate text otherwise.
final_response += response.content
return final_response
# Note: 'thinking' is now handled via ThinkTool, resulting in 'tool_call' and 'tool_response' events.
elif response.type == "tool_call":
# Includes calls to ThinkTool, FinalOutput, and others.
print(f"\n\n\033[92m🟡 Tool Call:\n{response.content}\033[0m\n")
elif response.type == "tool_response":
print(f"\n\n\033[94m🟢 Tool Response:\n{response.content}\033[0m\n")
elif response.type == "tool_error":
print(f"\n\n\033[91m🔴 Tool Error:\n{response.content}\033[0m\n")