File size: 3,830 Bytes
a2cbab6
 
 
 
 
 
097f999
 
a2cbab6
 
097f999
 
 
 
 
 
 
a2cbab6
 
097f999
 
a2cbab6
 
097f999
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from smolagents import CodeAgent, InferenceClientModel, WebSearchTool
import os
from dotenv import load_dotenv

load_dotenv()

# Configure the underlying LLM model for the agent
smol_model = InferenceClientModel(token=os.getenv("HF_TOKEN")) # You can choose to not pass any model_id to InferenceClientModel to use a default model
# you can also specify a particular provider e.g. provider="together" or provider="sambanova"

# Instantiate the CodeAgent with authorized imports for file operations
# WebSearchTool is kept as an example, you might want to add/remove tools as needed.
smol_code_agent_instance = CodeAgent(
    tools=[WebSearchTool()],
    model=smol_model,
    add_base_tools=True,
    additional_authorized_imports=["os", "io"] # Authorize os and io for file access
)

# This is the agent class that app.py will instantiate and use.
# It wraps the smolagents.CodeAgent.
class BasicAgent:
    def __init__(self):
        self.smol_agent = smol_code_agent_instance
        print("BasicAgent (using smolagents.CodeAgent) initialized.")

    def __call__(self, question: str, file_path: str | None = None) -> str:
        print(f"BasicAgent received question (first 100 chars): {question[:100]}...")
        
        task_description = question
        run_additional_args = {}

        if file_path:
            print(f"BasicAgent received file_path: {file_path}")
            # Augment the task description to inform the agent about the file
            # and how to access it via additional_args.
            task_description += (
                f"\n\nA file relevant to this task has been provided. "
                f"You can access this file's content using standard Python file operations (e.g., open(), read()). "
                f"The path to this file is available in the 'additional_args' dictionary, passed to the run method, under the key 'task_file'. "
                f"The value is: '{file_path}'."
            )
            run_additional_args["additional_args"] = {"task_file": file_path}
            print(f"Passing to smolagent: task='{task_description[:150]}...', additional_args={run_additional_args['additional_args']}")
        else:
            print("BasicAgent received no file_path.")
            print(f"Passing to smolagent: task='{task_description[:150]}...'")

        try:
            # The CodeAgent's .run() method returns the final answer.
            # Pass additional_args if they exist.
            if run_additional_args:
                answer = self.smol_agent.run(task_description, **run_additional_args)
            else:
                answer = self.smol_agent.run(task_description)
                
            print(f"smolagents.CodeAgent returned: {str(answer)[:200]}...") # Log a snippet of the answer
            return str(answer)  # Ensure the output is a string
        except Exception as e:
            print(f"Error during smolagents.CodeAgent run: {e}")
            # It's often good to return a more informative error message
            return f"AGENT_ERROR: An error occurred while processing with CodeAgent: {str(e)}"

# Example test run (optional, can be commented out for deployment)
# if __name__ == '__main__':
#     print("Testing CodeAgent with a simple task...")
#     test_agent = BasicAgent()
#     # Test without file
#     # response = test_agent("What is the capital of France?")
#     # print(f"Test response (no file): {response}")
#     # To test with a file, you'd create a dummy file and pass its path:
#     # with open("dummy_test_file.txt", "w") as f:
#     #     f.write("This is a test file for the agent.")
#     # response_with_file = test_agent("Summarize the content of the provided file.", file_path="dummy_test_file.txt")
#     # print(f"Test response (with file): {response_with_file}")
#     # os.remove("dummy_test_file.txt")