|
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) |
|
|
|
|
|
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) |