You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
from sqlalchemy.orm import Session
|
|
|
|
from app.services.llm_service import LLMService
|
|
from app.services.tool_registry import ToolRegistry
|
|
|
|
|
|
class OrquestradorService:
|
|
|
|
def __init__(self, db: Session):
|
|
"""Inicializa servicos de LLM e registro de tools para a sessao atual."""
|
|
self.llm = LLMService()
|
|
self.registry = ToolRegistry(db)
|
|
|
|
async def handle_message(self, message: str) -> str:
|
|
"""Processa mensagem, executa tool quando necessario e retorna resposta final."""
|
|
|
|
tools = self.registry.get_tools()
|
|
|
|
llm_result = await self.llm.generate_response(
|
|
message=message,
|
|
tools=tools,
|
|
)
|
|
|
|
if llm_result["tool_call"]:
|
|
tool_name = llm_result["tool_call"]["name"]
|
|
arguments = llm_result["tool_call"]["arguments"]
|
|
|
|
tool_result = await self.registry.execute(tool_name, arguments)
|
|
|
|
# Segunda rodada para formatar resposta
|
|
final_response = await self.llm.generate_response(
|
|
message=f"Resultado da funcao {tool_name}: {tool_result}",
|
|
tools=tools,
|
|
)
|
|
|
|
return final_response["response"]
|
|
|
|
# Se o modelo nao chamou nenhuma tool,
|
|
# significa que ele respondeu diretamente em texto.
|
|
return llm_result["response"]
|