evo-ai/src/services/agent_runner.py
2025-04-25 19:10:26 -03:00

98 lines
3.5 KiB
Python

import os
from typing import Any, Dict
from google.adk.agents.llm_agent import LlmAgent
from google.adk.models.lite_llm import LiteLlm
from google.adk.agents import SequentialAgent, ParallelAgent, LoopAgent
from google.adk.runners import Runner
from google.genai.types import Content, Part
from google.adk.sessions import DatabaseSessionService
from google.adk.memory import InMemoryMemoryService
from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService
from src.utils.logger import setup_logger
from src.core.exceptions import AgentNotFoundError, InternalServerError
from src.services.agent_service import get_agent
from src.services.agent_builder import AgentBuilder
from sqlalchemy.orm import Session
from contextlib import AsyncExitStack
logger = setup_logger(__name__)
async def run_agent(
agent_id: str,
contact_id: str,
message: str,
session_service: DatabaseSessionService,
artifacts_service: InMemoryArtifactService,
memory_service: InMemoryMemoryService,
db: Session,
):
try:
logger.info(
f"Iniciando execução do agente {agent_id} para contato {contact_id}"
)
logger.info(f"Mensagem recebida: {message}")
get_root_agent = get_agent(db, agent_id)
logger.info(
f"Agente root encontrado: {get_root_agent.name} (tipo: {get_root_agent.type})"
)
if get_root_agent is None:
raise AgentNotFoundError(f"Agente com ID {agent_id} não encontrado")
# Usando o AgentBuilder para criar o agente
agent_builder = AgentBuilder(db, memory_service)
root_agent, exit_stack = await agent_builder.build_agent(get_root_agent)
logger.info("Configurando Runner")
agent_runner = Runner(
agent=root_agent,
app_name=get_root_agent.name,
session_service=session_service,
artifact_service=artifacts_service,
)
session_id = contact_id + "_" + agent_id
logger.info(f"Buscando sessão para contato {contact_id}")
session = session_service.get_session(
app_name=root_agent.name,
user_id=contact_id,
session_id=session_id,
)
if session is None:
logger.info(f"Criando nova sessão para contato {contact_id}")
session = session_service.create_session(
app_name=root_agent.name,
user_id=contact_id,
session_id=session_id,
)
content = Content(role="user", parts=[Part(text=message)])
logger.info("Iniciando execução do agente")
final_response_text = None
try:
for event in agent_runner.run(
user_id=contact_id,
session_id=session_id,
new_message=content,
):
if event.is_final_response() and event.content and event.content.parts:
final_response_text = event.content.parts[0].text
logger.info(f"Resposta final recebida: {final_response_text}")
finally:
# Garante que o exit_stack seja fechado corretamente
if exit_stack:
await exit_stack.aclose()
logger.info("Execução do agente concluída com sucesso")
return final_response_text
except AgentNotFoundError as e:
logger.error(f"Erro ao processar requisição: {str(e)}")
raise e
except Exception as e:
logger.error(f"Erro interno ao processar requisição: {str(e)}", exc_info=True)
raise InternalServerError(str(e))