from typing import Any # Builders centralizados dos prompts usados pelo orquestrador. def _build_user_context_line(user_id: int | None) -> str: return f"Contexto de usuario autenticado: user_id={user_id}.\n" if user_id else "" def build_router_prompt( user_message: str, user_id: int | None, conversation_context: str, ) -> str: user_context = _build_user_context_line(user_id) return ( "Voce e um assistente de concessionaria. " "Sempre que a solicitacao depender de dados operacionais (estoque, validacao de cliente, " "avaliacao de troca, agendamento de revisao, realizacao ou cancelamento de pedido), use a tool correta. " "Se o usuario pedir para recomecar, esquecer contexto, cancelar fluxo atual, descartar fila pendente " "ou continuar o proximo pedido, use a tool de orquestracao apropriada. " "Mensagens de controle da conversa tem prioridade sobre qualquer fluxo em aberto. " "Se houver um rascunho ativo e o usuario mandar algo como esquecer tudo, cancelar fluxo, descartar pendencias " "ou continuar, trate isso como comando global e chame a tool correspondente. " "Se faltar parametro obrigatorio para a tool, responda em texto pedindo apenas o que falta.\n\n" f"{user_context}" f"{conversation_context}\n" f"Mensagem do usuario: {user_message}" ) def build_force_tool_prompt( user_message: str, user_id: int | None, conversation_context: str, ) -> str: user_context = _build_user_context_line(user_id) return ( "Reavalie a mensagem e priorize chamar tool se houver intencao operacional. " "Considere tambem tools de orquestracao para limpar contexto, cancelar fluxo, descartar fila ou continuar o proximo pedido. " "Mesmo com fluxo incremental ativo, se a mensagem for de controle global da conversa, a tool de orquestracao deve vencer o rascunho atual. " "Use texto apenas quando faltar dado obrigatorio.\n\n" f"{user_context}" f"{conversation_context}\n" f"Mensagem do usuario: {user_message}" ) def build_result_prompt( user_message: str, user_id: int | None, tool_name: str, tool_result: Any, conversation_context: str, ) -> str: user_context = _build_user_context_line(user_id) return ( "Responda ao usuario de forma objetiva usando o resultado da tool abaixo. " "Nao invente dados. Se a lista vier vazia, diga explicitamente que nao encontrou resultados. " "Retorne texto puro sem markdown, sem asteriscos, sem emojis e com linhas curtas.\n\n" f"{user_context}" f"{conversation_context}\n" f"Pergunta original: {user_message}\n" f"Tool executada: {tool_name}\n" f"Resultado da tool: {tool_result}" )