Martin Bär
commited on
Commit
·
4022a3e
1
Parent(s):
31f8487
Update web search tool
Browse files- basic_agent.py +9 -10
- web_tools.py +28 -0
basic_agent.py
CHANGED
|
@@ -2,7 +2,6 @@ import os
|
|
| 2 |
import re
|
| 3 |
import asyncio
|
| 4 |
|
| 5 |
-
from tavily import AsyncTavilyClient
|
| 6 |
from llama_index.core.tools import FunctionTool
|
| 7 |
from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI
|
| 8 |
from llama_index.tools.duckduckgo import DuckDuckGoSearchToolSpec
|
|
@@ -19,6 +18,11 @@ from llama_index.core.agent.workflow import (
|
|
| 19 |
|
| 20 |
from multimodality_tools import get_image_qa_tool, get_transcription_tool, \
|
| 21 |
get_excel_analysis_tool, get_excel_tool, get_csv_analysis_tool, get_csv_tool, _get_file, get_read_file_tool
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
|
| 23 |
class BasicAgent:
|
| 24 |
def __init__(self, ollama=False, langfuse=False):
|
|
@@ -42,8 +46,8 @@ class BasicAgent:
|
|
| 42 |
system_prompt=(
|
| 43 |
"You are a general AI assistant. I will ask you a question. "
|
| 44 |
"Report your thoughts, delegate work to other agents if necessary, and"
|
| 45 |
-
"finish your answer with the following template
|
| 46 |
-
"FINAL ANSWER: [YOUR FINAL ANSWER].
|
| 47 |
"OR as few words as possible OR a comma separated list of numbers and/or "
|
| 48 |
"strings. If you are asked for a number, don't use comma to write your "
|
| 49 |
"number neither use units such as $ or percent sign unless specified otherwise. "
|
|
@@ -75,12 +79,7 @@ class BasicAgent:
|
|
| 75 |
)
|
| 76 |
|
| 77 |
tool_spec = DuckDuckGoSearchToolSpec()
|
| 78 |
-
search_tool = FunctionTool.from_defaults(tool_spec.duckduckgo_full_search)
|
| 79 |
-
# In case DuckDuckGo is not good enough
|
| 80 |
-
async def search_web(query: str) -> str:
|
| 81 |
-
"""Searches the web to answer questions."""
|
| 82 |
-
client = AsyncTavilyClient(api_key=os.getenv("TAVILY"))
|
| 83 |
-
return str(await client.search(query))
|
| 84 |
|
| 85 |
web_search_agent = FunctionAgent(
|
| 86 |
name="WebAgent",
|
|
@@ -91,7 +90,7 @@ class BasicAgent:
|
|
| 91 |
"you communicate this clearly. Always hand off your answer to MainAgent."
|
| 92 |
),
|
| 93 |
llm=llm,
|
| 94 |
-
tools=[
|
| 95 |
can_handoff_to=["MainAgent"],
|
| 96 |
)
|
| 97 |
|
|
|
|
| 2 |
import re
|
| 3 |
import asyncio
|
| 4 |
|
|
|
|
| 5 |
from llama_index.core.tools import FunctionTool
|
| 6 |
from llama_index.llms.huggingface_api import HuggingFaceInferenceAPI
|
| 7 |
from llama_index.tools.duckduckgo import DuckDuckGoSearchToolSpec
|
|
|
|
| 18 |
|
| 19 |
from multimodality_tools import get_image_qa_tool, get_transcription_tool, \
|
| 20 |
get_excel_analysis_tool, get_excel_tool, get_csv_analysis_tool, get_csv_tool, _get_file, get_read_file_tool
|
| 21 |
+
from web_tools import get_search_web_tool
|
| 22 |
+
|
| 23 |
+
answer_specifics = ("When answering, provide ONLY the precise answer requested. "
|
| 24 |
+
"Do not include explanations, steps, reasoning, or additional text. Be direct and specific. "
|
| 25 |
+
'For example, if asked "What is the capital of France?", respond simply with "Paris".')
|
| 26 |
|
| 27 |
class BasicAgent:
|
| 28 |
def __init__(self, ollama=False, langfuse=False):
|
|
|
|
| 46 |
system_prompt=(
|
| 47 |
"You are a general AI assistant. I will ask you a question. "
|
| 48 |
"Report your thoughts, delegate work to other agents if necessary, and"
|
| 49 |
+
"finish your answer with the following template:\n"
|
| 50 |
+
"FINAL ANSWER: [YOUR FINAL ANSWER]. \nYOUR FINAL ANSWER should be a number "
|
| 51 |
"OR as few words as possible OR a comma separated list of numbers and/or "
|
| 52 |
"strings. If you are asked for a number, don't use comma to write your "
|
| 53 |
"number neither use units such as $ or percent sign unless specified otherwise. "
|
|
|
|
| 79 |
)
|
| 80 |
|
| 81 |
tool_spec = DuckDuckGoSearchToolSpec()
|
| 82 |
+
search_tool = FunctionTool.from_defaults(tool_spec.duckduckgo_full_search)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
|
| 84 |
web_search_agent = FunctionAgent(
|
| 85 |
name="WebAgent",
|
|
|
|
| 90 |
"you communicate this clearly. Always hand off your answer to MainAgent."
|
| 91 |
),
|
| 92 |
llm=llm,
|
| 93 |
+
tools=[get_search_web_tool()],
|
| 94 |
can_handoff_to=["MainAgent"],
|
| 95 |
)
|
| 96 |
|
web_tools.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Tools to search the web and extract information."""
|
| 2 |
+
import os
|
| 3 |
+
|
| 4 |
+
from tavily import AsyncTavilyClient
|
| 5 |
+
from llama_index.core.tools import FunctionTool
|
| 6 |
+
|
| 7 |
+
async def tavily_web_tool(query: str) -> str:
|
| 8 |
+
"""
|
| 9 |
+
Search the web with a given query and return the first two results.
|
| 10 |
+
If results do not return what you are looking for, rephrasing the query can help.
|
| 11 |
+
"""
|
| 12 |
+
client = AsyncTavilyClient(api_key=os.getenv("TAVILY"))
|
| 13 |
+
res = await client.search(query)
|
| 14 |
+
urls = [r.get("url") for r in res.get("results", []) if "url" in r][:2]
|
| 15 |
+
page_contents = {
|
| 16 |
+
url: await client.extract(url)
|
| 17 |
+
for url in urls
|
| 18 |
+
}
|
| 19 |
+
return "\n\n".join(
|
| 20 |
+
f"RESULT {i}:\n{content}"
|
| 21 |
+
for i, content in enumerate(page_contents.values())
|
| 22 |
+
)
|
| 23 |
+
|
| 24 |
+
def get_search_web_tool():
|
| 25 |
+
return FunctionTool.from_defaults(
|
| 26 |
+
fn=tavily_web_tool,
|
| 27 |
+
description="Search the web with a given query and return the first two results."
|
| 28 |
+
)
|