diego.sancristobal
feat: Add partially working langgraph agent
4f6b4f2
from dotenv import load_dotenv
from smolagents import tool, PythonInterpreterTool, DuckDuckGoSearchTool, WikipediaSearchTool, VisitWebpageTool, GoogleSearchTool, ToolCallingAgent, CodeAgent, LiteLLMModel
from youtube_transcript_api import YouTubeTranscriptApi
import os
from typing import Dict
load_dotenv()
system_prompt = f"""
You are a general AI assistant that will receive a question.
First, provide a step-by-step explanation of your reasoning to answer the question,
providing your answer with the following template: **FINAL ANSWER: [YOUR FINAL ANSWER]**.
[YOUR FINAL ANSWER] should be a number OR as few words as possible OR a comma separated list of numbers and/or strings.
**Rules to follow when generating your answer:**
- If you are asked for a number, don't use comma to write your number neither use units such as $ or percent sign unless specified otherwise.
- If you are asked for a string, don't use articles, neither abbreviations (e.g. for cities), and write the digits in plain text unless specified otherwise.
- If you are asked for a comma separated list, apply the above rules depending of whether the element to be put in the list is a number or a string.
"""
@tool
def add(a: int, b: int) -> int:
#Google docstring style
"""
Add two numbers together
Args:
a: The first number
b: The second number
Returns:
The sum of the two numbers
"""
return a + b
@tool
def subtract(a: int, b: int) -> int:
"""
Subtract two numbers
Args:
a: The first number
b: The second number
Returns:
The difference between the two numbers
"""
return a - b
@tool
def multiply(a: int, b: int) -> int:
"""
Multiply two numbers
Args:
a: The first number
b: The second number
Returns:
The product of the two numbers
"""
return a * b
@tool
def divide(a: int, b: int) -> float:
"""
Divide two numbers
Args:
a: The first number
b: The second number
Returns:
The quotient of the two numbers
"""
return a / b
@tool
def modulo(a: int, b: int) -> int:
"""
Calculate the modulo of two numbers
Args:
a: The first number
b: The second number
Returns:
The remainder of the division of the two numbers
"""
return a % b
@tool
def youtube_transcript(url: str) -> Dict[str, str]:
"""
Get transcript of YouTube video.
Args:
url: YouTube video url in ""
Returns:
Transcript of the YouTube video
"""
video_id = url.partition("https://www.youtube.com/watch?v=")[2]
transcript = YouTubeTranscriptApi.get_transcript(video_id)
transcript_text = " ".join([item["text"] for item in transcript])
return {"youtube_transcript": transcript_text}
class BasicSmolAgent:
def __init__(self):
self.api_key = os.getenv("OPENAI_API_KEY")
self.model = LiteLLMModel(model_id="openai/o4-mini", api_key=self.api_key)
self.agent = CodeAgent(
tools=[
add, subtract, multiply, divide, modulo,
youtube_transcript,
DuckDuckGoSearchTool(),
WikipediaSearchTool(),
VisitWebpageTool(),
PythonInterpreterTool(),
],
model=self.model
)
def __call__(self, question: str) -> str:
print(f"Question: {question}")
return self.agent.run(question)