| | from smolagents import Tool, tool, CodeAgent, OpenAIServerModel, DuckDuckGoSearchTool |
| | import time |
| | import os |
| | import requests |
| | import markdownify |
| | |
| | import whisper |
| | import tempfile |
| | import io |
| |
|
| |
|
| | class Mod4Agent: |
| | |
| | def __init__(self): |
| | self.api_key=os.getenv("OPENAI_KEY") |
| | |
| | |
| | self.model = OpenAIServerModel( |
| | model_id="gpt-4o", |
| | api_base="https://api.openai.com/v1", |
| | temperature=0.0, |
| | api_key=self.api_key) |
| |
|
| | |
| | self.base_prompt=""" |
| | You are an agent with a set of tools for answering to questions. |
| | You need to be accurate and get the best possible answer in the simplest possible way. |
| | You need to think step-by-step, and if at some point there is an error, backtrack and use a different method. |
| | It is important to adhere to the instructions of the question as close as possible. |
| | IMPORTANT: always answer according to the format required to the best of your abilities. Stating that you do not know, or explaining why, will give a score of 0 therefore it is to be avoided. |
| | You can do it! |
| | |
| | Question: |
| | """ |
| |
|
| |
|
| | @tool |
| | def audio_interpreter(input: bytes)->str: |
| | """ |
| | Function to transcribe an mp3 file from raw bytes or file path into the corresponding text |
| | |
| | Args: |
| | input: raw bytes content of the input mp3 file, or its file path |
| | |
| | Return: |
| | str: a string with the text corresponding to the mp3 input file |
| | """ |
| |
|
| | model = whisper.load_model("tiny") |
| | |
| | if isinstance(input, bytes): |
| | with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as tmp: |
| | tmp.write(input) |
| | tmp.flush() |
| | result = model.transcribe(tmp.name) |
| | |
| | elif isinstance(input, str) and os.path.exists(input): |
| | |
| | result = model.transcribe(input) |
| | |
| | else: |
| | raise TypeError("Unsupported input type. Expected bytes or a valid file path.") |
| |
|
| | return result["text"] |
| |
|
| | |
| |
|
| |
|
| | |
| | self.list_tools=[DuckDuckGoSearchTool(), audio_interpreter] |
| | |
| | self.agent = CodeAgent(tools=self.list_tools, |
| | model=self.model, |
| | additional_authorized_imports=['pandas','io', 'requests','markdownify'], |
| | max_steps=10, |
| | add_base_tools=True |
| | |
| | ) |
| | |
| | print("BasicAgent initialized.") |
| |
|
| | |
| | |
| | def retry(self, prompt): |
| | backoff = 20 |
| | while True: |
| | try: |
| | response = self.agent.run(prompt) |
| | return response |
| | break |
| | except Exception as e: |
| | if "429" in str(e): |
| | print(f"Rate limit hit. Sleeping for {backoff} seconds...") |
| | time.sleep(backoff) |
| | backoff = min(backoff * 2, 80) |
| | else: |
| | print("Error:", e) |
| | break |
| |
|
| | |
| | def __call__(self, question: str) -> str: |
| | print(f"Agent received question (first 50 chars): {question[:50]}...") |
| | prompt=f'{self.base_prompt}\n {question}' |
| | answer = self.retry(prompt) |
| | print(f"Agent returning fixed answer: {answer}") |
| | return answer |
| |
|
| |
|
| |
|
| |
|