Spaces:
Runtime error
Runtime error
from smolagents import HfApiModel, CodeAgent, DuckDuckGoSearchTool, WikipediaSearchTool, Tool, LiteLLMModel | |
from langchain_community.tools.tavily_search import TavilySearchResults | |
from langchain_community.document_loaders import WikipediaLoader, ArxivLoader | |
class add(Tool): | |
name = "add" | |
description = """ | |
This tool adds two integers together and returns an integer. | |
Args: | |
a: first integer | |
b: second integer | |
""" | |
inputs = { | |
"a":{ | |
"type":"integer", | |
"description":"first integer" | |
}, | |
"b":{ | |
"type":"integer", | |
"description":"second integer" | |
} | |
} | |
output_type = "integer" | |
def forward(self, a: int, b: int): | |
return a + b | |
class subtract(Tool): | |
name = "subtract" | |
description = """ | |
This tool subtracts two integers and returns an integer. | |
Args: | |
a: first integer | |
b: second integer | |
""" | |
inputs = { | |
"a":{ | |
"type":"integer", | |
"description":"first integer" | |
}, | |
"b":{ | |
"type":"integer", | |
"description":"second integer" | |
} | |
} | |
output_type = "integer" | |
def forward(self, a: int, b: int): | |
return a - b | |
class multiply(Tool): | |
name = "multiply" | |
description = """ | |
This tool multiplies two integers and returns an integer. | |
Args: | |
a: first integer | |
b: second integer | |
""" | |
inputs = { | |
"a":{ | |
"type":"integer", | |
"description":"first integer" | |
}, | |
"b":{ | |
"type":"integer", | |
"description":"second integer" | |
} | |
} | |
output_type = "integer" | |
def forward(self, a: int, b: int): | |
return a * b | |
class divide(Tool): | |
name = "divide" | |
description = """ | |
This tool divides two integers and returns an integer. | |
Args: | |
a: first integer | |
b: second integer | |
""" | |
inputs = { | |
"a":{ | |
"type":"integer", | |
"description":"first integer" | |
}, | |
"b":{ | |
"type":"integer", | |
"description":"second integer" | |
} | |
} | |
output_type = "integer" | |
def forward(self, a: int, b: int): | |
if b == 0: | |
raise ValueError("Cannot divide by zero.") | |
return a / b | |
class modulo(Tool): | |
name = "modulo" | |
description = """ | |
This tool returns the modulus of two integers | |
Args: | |
a: first integer | |
b: second integer | |
""" | |
inputs = { | |
"a":{ | |
"type":"integer", | |
"description":"first integer" | |
}, | |
"b":{ | |
"type":"integer", | |
"description":"second integer" | |
} | |
} | |
output_type = "integer" | |
def forward(self, a: int, b: int): | |
return a % b | |
class WikipediaSearchTool(Tool): | |
name = "wikipedia_search_tool" | |
description = """ | |
Search Wikipedia for a query and return top 2 results. | |
Args: | |
query: the search query. | |
""" | |
inputs = { | |
"query":{ | |
"type":"string", | |
"description":"the search query" | |
} | |
} | |
output_type = "string" | |
def forward(self, query: str) -> str: | |
documents = WikipediaLoader(query=query, load_max_docs=2).load() | |
condensed_docs = "\n\n---\n\n".join( | |
[ | |
f'<Document source="{doc.metadata["source"]}" page="{doc.metadata.get("page", "")}"/>\n{doc.page_content}\n</Document>' | |
for doc in documents | |
]) | |
return {"wikipedia_results": condensed_docs} | |
class TavilySearchTool(Tool): | |
name = "tavily_search_tool" | |
description = """ | |
Search the internet using the browser Tavily and return the top 3 results. | |
Args: | |
query: the search query. | |
""" | |
inputs = { | |
"query":{ | |
"type":"string", | |
"description":"the search query" | |
} | |
} | |
output_type = "string" | |
def forward(self, query: str) -> str: | |
documents = TavilySearchResults(max_results=3).invoke(query=query) | |
condensed_docs = "\n\n---\n\n".join( | |
[ | |
f'<Document source="{doc.metadata["source"]}" page="{doc.metadata.get("page", "")}"/>\n{doc.page_content}\n</Document>' | |
for doc in documents | |
]) | |
return {"web_search_results": condensed_docs} | |
class ArvixSearchTool(Tool): | |
name = "arvix_search_tool" | |
description = """ | |
Search arxiv for a query and return maximum 3 result. | |
Args: | |
query: The search query. | |
""" | |
inputs = { | |
"query":{ | |
"type":"string", | |
"description":"the search query" | |
} | |
} | |
output_type = "string" | |
def forward(self, query: str) -> str: | |
documents = ArxivLoader(query=query, load_max_docs=3).load() | |
condensed_docs = "\n\n---\n\n".join( | |
[ | |
f'<Document source="{doc.metadata["source"]}" page="{doc.metadata.get("page", "")}"/>\n{doc.page_content[:1000]}\n</Document>' | |
for doc in documents | |
]) | |
return {"arvix_search_results": condensed_docs} | |
tools=[ | |
add(), | |
subtract(), | |
multiply(), | |
divide(), | |
modulo(), | |
WikipediaSearchTool(), | |
ArvixSearchTool(), | |
TavilySearchTool() | |
] | |
model = LiteLLMModel( | |
model_id='ollama_chat/gemma3:27b', | |
api_base="http://127.0.0.1:11434", | |
num_ctx=8192 | |
) | |
def delay_execution_10(pagent, **kwargs) -> bool: | |
""" | |
Delays the execution for 10 seconds. | |
""" | |
time.sleep(10) | |
return True | |
def create_agent(): | |
agent = CodeAgent( | |
model = model, | |
tools = tools, | |
max_steps=10, | |
verbosity_level=2, | |
additional_authorized_imports=['*'], | |
planning_interval=5, | |
step_callbacks=[delay_execution_10] | |
) | |
return agent | |