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.
68 lines
3.0 KiB
Python
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, registro de pagamento de aluguel ou registro de multa 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, pagamento ou multa). "
|
|
"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}"
|
|
)
|