|
from smolagents import DuckDuckGoSearchTool, HfApiModel, load_tool, CodeAgent, PythonInterpreterTool, VisitWebpageTool, \
|
|
Tool
|
|
import hashlib
|
|
import json
|
|
from transformers import AutoTokenizer, AutoModelForCausalLM
|
|
import os
|
|
|
|
|
|
class ModelMathTool(Tool):
|
|
name = "math_model"
|
|
description = "Answers advanced math questions using a pretrained math model."
|
|
|
|
inputs = {
|
|
"problem": {
|
|
"type": "string",
|
|
"description": "Math problem to solve.",
|
|
}
|
|
}
|
|
|
|
output_type = "string"
|
|
|
|
def __init__(self, model_id="Qwen/Qwen2.5-Math-7B"):
|
|
print(f"Loading math model: {model_id}")
|
|
self.tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
|
|
self.model = HfApiModel(model_id=model_id, max_tokens=512)
|
|
|
|
def forward(self, problem: str) -> str:
|
|
print(f"[MathModelTool] Question: {problem}")
|
|
response = self.model.__call__(problem)
|
|
return response
|
|
|
|
|
|
|
|
|
|
DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space"
|
|
|
|
web_search = DuckDuckGoSearchTool()
|
|
python_interpreter = PythonInterpreterTool()
|
|
visit_webpage_tool = VisitWebpageTool()
|
|
model_math_tool = ModelMathTool()
|
|
|
|
|
|
|
|
|
|
model = HfApiModel(model_id="HuggingFaceH4/zephyr-7b-beta", max_tokens=512, token=tok)
|
|
|
|
|
|
def get_cache_key(question: str) -> str:
|
|
return hashlib.sha256(question.encode()).hexdigest()
|
|
|
|
|
|
def load_cached_answer(question: str) -> str | None:
|
|
key = get_cache_key(question)
|
|
path = f"cache/{key}.json"
|
|
if os.path.exists(path):
|
|
with open(path, "r") as f:
|
|
data = json.load(f)
|
|
return data.get("answer")
|
|
return None
|
|
|
|
|
|
def cache_answer(question: str, answer: str):
|
|
key = get_cache_key(question)
|
|
path = f"cache/{key}.json"
|
|
with open(path, "w") as f:
|
|
json.dump({"question": question, "answer": answer}, f)
|
|
|
|
|
|
class BasicAgent:
|
|
def __init__(self):
|
|
print("BasicAgent initialized.")
|
|
self.agent = CodeAgent(
|
|
model=model,
|
|
tools=[model_math_tool],
|
|
max_steps=1,
|
|
verbosity_level=0,
|
|
grammar=None,
|
|
planning_interval=3,
|
|
|
|
)
|
|
|
|
def __call__(self, question: str) -> str:
|
|
print(f"Agent received question (first 50 chars): {question[:50]}...")
|
|
answer = self.agent.run(question)
|
|
return answer
|
|
|
|
|
|
|
|
agent = BasicAgent()
|
|
|
|
response = agent.__call__(question="How much is 2*2?")
|
|
print(response) |