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.
orquestrador/app/services/orchestration/prompt_builders.py

68 lines
3.0 KiB
Python

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, consulta de frota de aluguel, "
"abertura de locacao, devolucao de aluguel ou registro de pagamento de aluguel), 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 as operacoes de aluguel (consultar frota, abrir locacao, registrar devolucao ou pagamento). "
"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}"
)