File size: 3,267 Bytes
95da673 59ff18d e836bd4 ffe4aa3 95da673 92b0d1a 2fcd193 ffe4aa3 92b0d1a 95da673 59ff18d 95da673 ffe4aa3 95da673 e836bd4 95da673 e836bd4 95da673 59ff18d 95da673 ffe4aa3 95da673 59ff18d ffe4aa3 95da673 59ff18d ffe4aa3 95da673 ffe4aa3 95da673 ffe4aa3 95da673 ffe4aa3 95da673 ffe4aa3 95da673 ffe4aa3 95da673 59ff18d 95da673 59ff18d ffe4aa3 59ff18d ffe4aa3 59ff18d 95da673 92b0d1a 2fcd193 5db119a 59ff18d e836bd4 2fcd193 95da673 59ff18d e103f3d 5db119a 95da673 5db119a 95da673 e103f3d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
# agent.py — full GAIA-ready agent with working WikipediaQueryRun + tools
import os
import asyncio
from llama_index.llms.openai import OpenAI
from llama_index.core.agent.react.base import ReActAgent
from llama_index.core.tools import FunctionTool
from langchain_community.tools.wikipedia.tool import WikipediaQueryRun
from langchain_community.utilities.wikipedia import WikipediaAPIWrapper
from langchain_experimental.tools.python.tool import PythonREPLTool
from langchain_community.document_loaders import YoutubeLoader
import whisper
import openpyxl
# Check OpenAI key
if os.getenv("OPENAI_API_KEY"):
print("✅ Detected OPENAI_API_KEY")
else:
print("⚠️ Missing OPENAI_API_KEY – LLM may fail")
# Tools definitions
api_wrapper = WikipediaAPIWrapper(top_k_results=1, doc_content_chars_max=1000)
def wikipedia_search(query: str) -> str:
return WikipediaQueryRun(api_wrapper=api_wrapper).run({"query": query})
def run_python_with_output(code: str) -> str:
if "print(" not in code:
code = f"print({code})"
return PythonREPLTool().run(code)
def get_youtube_transcript(url: str) -> str:
try:
loader = YoutubeLoader.from_youtube_url(url, add_video_info=False)
docs = loader.load()
return " ".join(d.page_content for d in docs)
except Exception as e:
return "[YOUTUBE ERROR] " + str(e)
def transcribe_audio(file_path: str) -> str:
try:
model = whisper.load_model("base")
res = model.transcribe(file_path)
return res["text"]
except Exception as e:
return "[AUDIO ERROR] " + str(e)
def extract_excel_total_food_sales(file_path: str) -> str:
try:
wb = openpyxl.load_workbook(file_path)
sheet = wb.active
total = 0.0
for _, category, amount in sheet.iter_rows(min_row=2, values_only=True):
if isinstance(category, str) and "food" in category.lower():
total += float(amount or 0)
return f"${total:.2f}"
except Exception as e:
return "[EXCEL ERROR] " + str(e)
# Assemble tools
TOOLS = [
FunctionTool.from_defaults(wikipedia_search),
FunctionTool.from_defaults(run_python_with_output),
FunctionTool.from_defaults(get_youtube_transcript),
FunctionTool.from_defaults(transcribe_audio),
FunctionTool.from_defaults(extract_excel_total_food_sales),
]
# LLM and Agent
llm = OpenAI(model="gpt-4")
agent = ReActAgent.from_tools(
tools=TOOLS,
llm=llm,
verbose=True,
system_prompt="""
You are an expert AI assistant on the GAIA benchmark.
Use available tools (Wikipedia, Python, YouTube transcript, audio, Excel).
Output ONLY the final answer. No reasoning or commentary.
Format exactly as requested (list, number, name, chess move, currency).
If tool fails, output "Tool not available".
""",
)
def answer_question_sync(question: str) -> str:
try:
resp = agent.chat(question)
if hasattr(resp, "response") and hasattr(resp.response, "content"):
return resp.response.content.strip()
return str(resp).strip()
except Exception as e:
print("❌ Agent exception:", e)
return "[ERROR] " + str(e)
async def answer_question(question: str) -> str:
return answer_question_sync(question) |