|
import os |
|
import torch |
|
from huggingface_hub import InferenceClient |
|
|
|
|
|
from smolagents import ToolCallingAgent, InferenceClientModel |
|
from smolagents.tool_calling import Tool |
|
|
|
|
|
|
|
from tavily_search import search_tavily |
|
from asr_tool import transcribe_audio |
|
from excel_tool import analyze_excel |
|
from math_tool import calculate_math |
|
|
|
class GaiaAgent: |
|
def __init__(self, model_id: str = "google/gemma-2b-it"): |
|
""" |
|
Initialiserar GaiaAgent, som nu använder smolagents.ToolCallingAgent internt. |
|
""" |
|
print(f"Initialiserar GaiaAgent med modell: {model_id}") |
|
|
|
|
|
hf_token = os.getenv("HF_TOKEN") or os.getenv("HUGGING_FACE_HUB_TOKEN") |
|
if not hf_token: |
|
raise ValueError( |
|
"Hugging Face token (HF_TOKEN eller HUGGING_FACE_HUB_TOKEN) är inte konfigurerad i miljövariabler." |
|
"Vänligen lägg till din token som en 'Repository secret' i dina Space-inställningar." |
|
) |
|
|
|
|
|
try: |
|
|
|
self.llm_model = InferenceClientModel( |
|
model=InferenceClient(model=model_id, token=hf_token) |
|
) |
|
print("InferenceClientModel laddad framgångsrikt.") |
|
except Exception as e: |
|
raise RuntimeError( |
|
f"Misslyckades att initialisera InferenceClientModel: {e}." |
|
"Vänligen kontrollera din HF token och att modellen är tillgänglig/laddningsbar." |
|
) |
|
|
|
|
|
|
|
tools_list = [ |
|
Tool( |
|
name="search_tavily", |
|
description="Användbart för att söka information online med Tavily Search. Returnerar en sammanfattning av de mest relevanta resultaten från webben. Kräver en fråga som input.", |
|
function=search_tavily |
|
), |
|
Tool( |
|
name="transcribe_audio", |
|
description="Transkriberar ljudfil till text. Användbart för att omvandla tal till text från en angiven ljudfilsväg. Kräver en filsökväg till ljudfilen som input.", |
|
function=transcribe_audio |
|
), |
|
Tool( |
|
name="analyze_excel", |
|
description="Analysera Excel-filer och returnera detaljerad information om rader, kolumner, datatyper och statistik (summa, medelvärde, max, min för numeriska kolumner). Kan ta både en lokal filväg eller en URL till Excel-filen som input.", |
|
function=analyze_excel |
|
), |
|
Tool( |
|
name="calculate_math", |
|
description="Beräkna matematiska uttryck. Användbart för att utföra aritmetiska operationer som addition, subtraktion, multiplikation, division och potenser. Tar ett matematiskt uttryck som en sträng som input.", |
|
function=calculate_math |
|
) |
|
] |
|
print(f"Laddade {len(tools_list)} anpassade verktyg.") |
|
|
|
|
|
self.agent = ToolCallingAgent( |
|
tools=tools_list, |
|
model=self.llm_model, |
|
verbosity_level=2 |
|
) |
|
print("ToolCallingAgent initialiserad.") |
|
|
|
def process_task(self, task_prompt: str) -> str: |
|
""" |
|
Bearbetar en uppgift med den interna ToolCallingAgent. |
|
Denna metod ersätter den tidigare manuella verktygsexekveringsloopen. |
|
""" |
|
print(f"\nBearbetar uppgift med ToolCallingAgent: '{task_prompt}'") |
|
try: |
|
final_answer = self.agent.run(task_prompt) |
|
print(f"\nToolCallingAgent avslutad. Slutgiltigt svar: {final_answer}") |
|
return final_answer |
|
except Exception as e: |
|
error_message = f"Ett fel uppstod under agentens bearbetning: {e}" |
|
print(error_message) |
|
return f"Agenten kunde inte slutföra uppgiften på grund av ett fel: {error_message}" |
|
|