File size: 2,979 Bytes
4436f89
d919051
 
 
4436f89
d919051
4436f89
 
 
 
d919051
 
 
 
 
 
 
 
 
 
 
 
 
 
067e6fe
d919051
067e6fe
 
d919051
 
 
 
 
067e6fe
 
d919051
 
 
 
 
 
 
b830998
d919051
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
067e6fe
 
d919051
 
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
from smolagents import Tool
import os
import asyncio

from ressources_getter import save_file, \
    get_prompt_with_file_content, extract_text_from_file, convert_excel_to_text, delete_tmp_files
from hf_api import get_file_by_task_id
from agent_websearch import create_wikipedia_agent
from agent_multimedia import create_multimedia_agent
from agent_code import create_code_analyzer_agent
from smolagents import ToolCallingAgent, LiteLLMModel
from dotenv import load_dotenv

load_dotenv()

agent_wikipedia = create_wikipedia_agent()
agent_multimedia = create_multimedia_agent()
agent_code = create_code_analyzer_agent()


gemini_flash_manager_model = LiteLLMModel(model_id="gemini/gemini-2.5-flash", api_key=os.getenv("GOOGLE_API_KEY"))


manager_agent = ToolCallingAgent(
    tools=[extract_text_from_file,convert_excel_to_text,delete_tmp_files], # Les agents workers sont des outils pour le manager
    model=gemini_flash_manager_model,
    managed_agents=[agent_wikipedia,agent_multimedia,agent_code],
    name="manager_agent",
    description=(
        "Je suis un agent manager. Mon rôle est de comprendre les requêtes complexes, "
        "de les décomposer en tâches plus petites et de déléguer ces tâches "
        "aux agents spécialisés (WikiAgent) pour obtenir la meilleure réponse. "
        "Je coordonne leurs actions et synthétise les résultats."
        "Le résultat final est une réponse concise et directe à la requête de l'utilisateur. Si la requête applique un resultat numérique, on ne retourne que le nombre."
        "Après avoir répondu à la requête, je supprime les fichiers temporaires téléchargés pour économiser de l'espace disque avec l'outil delete_tmp_files."
        "Si tu ne trouve pas une réponse satisfaisante sous 5 étapes ou que tu n'as pas les outils pour y répondre, renvoie une chaine de caractères vide."
    )
)

# Pour interagir avec l'agent manager
async def run_multi_agent_system(prompt: str):
    print(f"\nRequête au Manager : {prompt}")
    return manager_agent.run(prompt,max_steps=5)


class BasicAgent:
    task_id:str
    file_content_type:str
    agent = manager_agent
    def __init__(self):
        print("BasicAgent initialized.")
    def __call__(self, question: str, task_id :str) -> str:
        print(f"Agent received question (first 50 chars): {question[:50]}...")
        file_bytes,file_name=get_file_by_task_id(task_id)
        print(file_name)
        file_path = save_file(file_bytes,file_name)
        prompt = get_prompt_with_file_content(question,file_path)
        answer = asyncio.run(run_multi_agent_system(prompt))
        print(f"Agent returning fixed answer: {answer}")
        return answer


# if __name__ == "__main__":
#     agent = BasicAgent()
#     question = ".rewsna eht sa 'tfel' drow eht fo etisoppo eht etirw ,ecnetnes siht dnatsrednu uoy fI"
#     task_id = "2d83110e-a098-4ebb-9987-066c06fa42d0"
#     response = agent(question,task_id)
#     print(response)