from smolagents import Tool from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig import torch from wikipedia_utils import * from youtube_utils import * class MathModelQuerer(Tool): name = "math_model" description = "Solves advanced math problems using a pretrained\ large language model specialized in mathematics. Ideal for symbolic reasoning, \ calculus, algebra, and other technical math queries." inputs = { "problem": { "type": "string", "description": "Math problem to solve.", } } output_type = "string" def __init__(self, model_name="deepseek-ai/deepseek-math-7b-base"): print(f"Loading math model: {model_name}") self.tokenizer = AutoTokenizer.from_pretrained(model_name) print("loaded tokenizer") self.model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16) print("loaded auto model") self.model.generation_config = GenerationConfig.from_pretrained(model_name) print("loaded coonfig") self.model.generation_config.pad_token_id = self.model.generation_config.eos_token_id print("loaded pad token") def forward(self, problem: str) -> str: try: print(f"[MathModelTool] Question: {problem}") inputs = self.tokenizer(problem, return_tensors="pt") outputs = self.model.generate(**inputs, max_new_tokens=100) result = self.tokenizer.decode(outputs[0], skip_special_tokens=True) return result except: return f"Failed using the tool {self.name}" class CodeModelQuerer(Tool): name = "code_querer" description = "Generates code snippets based on a natural language description of a\ programming task using a powerful coding-focused language model. Suitable\ for solving coding problems, generating functions, or implementing algorithms." inputs = { "problem": { "type": "string", "description": "Description of a code sample to be generated", } } output_type = "string" def __init__(self, model_name="Qwen/Qwen2.5-Coder-32B-Instruct"): from smolagents import HfApiModel print(f"Loading llm for Code tool: {model_name}") self.model = HfApiModel() def forward(self, problem: str) -> str: try: return self.model.generate(problem, max_new_tokens=512) except: return f"Failed using the tool {self.name}" class WikipediaPageFetcher(Tool): name = "wiki_page_fetcher" description =' Searches and fetches summaries from Wikipedia for any topic,\ across all supported languages and versions. Only a single query string is required as input.' inputs = { "query": { "type": "string", "description": "Topic of wikipedia search", } } output_type = "string" def forward(self, query: str) -> str: try: wiki_query = query(query) wiki_page = fetch_wikipedia_page(wiki_query) return wiki_page except: return f"Failed using the tool {self.name}" class YoutubeTranscriptFetcher(Tool): name = "youtube_transcript_fetcher" description ="Fetches the English transcript of a YouTube video using either a direct video \ ID or a URL that includes one. Accepts a query containing the link or the raw video ID directly. Returns the transcript as plain text." inputs = { "query": { "type": "string", "description": "A query that includes youtube id." }, "video_id" : { "type" : "string", "description" : "Optional string with video id from youtube.", "nullable" : True } } output_type = "string" def forward(self, query: str, video_id=None) -> str: try: if video_id is None: video_id = get_youtube_video_id(query) fetched_transcript = fetch_transcript_english(video_id) return post_process_transcript(fetched_transcript) except: return f"Failed using the tool {self.name}"