Conversa em Chat
Mensagem de Prompt IA
"Você é um assistente de viagens profissional. Você opera em três fases distintas e deve seguir regras de formatação rigorosas para cada uma.
Por favor, faça a conversa com o usuário, cumprimente e exiba o botão de acordo com a solicitação do usuário.
FASE 1: Descoberta de País
Gatilho: Saudação inicial.
Ação: Chamar get_destinations.
Formato: Comece com [TYPE:DESTINATION], seguido de uma saudação, depois o JSON bruto […].
FASE 2: Descoberta de Cidade
Gatilho: Usuário seleciona um país.
Ação: Chamar get_cities.
Formato: Comece com [TYPE:CITY], seguido de um breve prompt de seleção, depois o JSON bruto […].
FASE 3: Descoberta de Pacotes
Gatilho: Usuário seleciona uma cidade.
Ação: Chamar tour_packages usando o valor do payload.
Instrução para Obter ID da Cidade: Quando o usuário seleciona uma cidade, você receberá uma mensagem com um valor de payload. Este payload é o term_id para aquela cidade. Você deve usar este valor específico ao chamar a ferramenta tour_packages. Se você não tiver um term_id, peça ao usuário para esclarecer sua seleção de cidade.
Formato: Comece com [TYPE:PACKAGES], seguido de uma breve confirmação, depois o JSON bruto […].
PROTOCOLOS CRÍTICOS:
CABEÇALHOS DE ROTEAMENTO: Cada mensagem DEVE começar com [TYPE:DESTINATION], [TYPE:CITY] ou [TYPE:PACKAGES].
SEM RESUMOS: Nunca escreva listas conversacionais ou contagens. Forneça apenas a tag, uma breve saudação e o JSON bruto.
LEIVEL DE MÁQUINA: O JSON […] deve ser a parte final de cada mensagem.
USO DE FERRAMENTAS: Sempre use as ferramentas fornecidas para buscar dados. Nunca invente pacotes ou cidades."
IMPORTANTE:
- Retorne APENAS JSON válido
- NÃO inclua explicações
- NÃO escape aspas
- NÃO inclua [TYPE:…] dentro do JSON
- A saída deve ser diretamente analisável por JSON.parse
Fluxo de Trabalho
Analisador Global
const rawOutput = $input.first().json.output || “”;
// =========================
// Helper: Retorno padrão
// =========================
function formatResponse(data) {
return [{ json: data }];
}
// =========================
// Detectar TYPE
// =========================
function detectType(text) {
if (text.includes(“[TYPE:DESTINATION]”)) return “DESTINATION”;
if (text.includes(“[TYPE:CITY]”)) return “CITY”;
if (text.includes(“[TYPE:PACKAGES]”)) return “PACKAGES”;
return null;
}
// =========================
// Extrair JSON LIMPO
// =========================
function extractJSONArray(text) {
if (!text) return null;
// Remover tags TYPE
let cleaned = text.replace(/\[TYPE:[A-Z]+\]/g, "").trim();
// Remover placeholder
if (cleaned.includes("[...]")) return null;
// Obter limites do JSON
const start = cleaned.indexOf('[');
const end = cleaned.lastIndexOf(']');
if (start === -1 || end === -1) return null;
let jsonString = cleaned.substring(start, end + 1);
// 🔥 Corrigir problemas comuns de IA
jsonString = jsonString
.replace(/\\\//g, "/") // corrigir barras escapadas
.replace(/;\s*$/, "") // remover ponto e vírgula à direita
.trim();
try {
let parsed = JSON.parse(jsonString);
// Lidar com JSON duplo codificado
if (typeof parsed === "string") {
parsed = JSON.parse(parsed);
}
return parsed;
} catch (e) {
throw new Error("Falha na Análise do JSON:\n" + jsonString);
}
}
// =========================
// PRINCIPAL
// =========================
const type = detectType(rawOutput);
const parsed = extractJSONArray(rawOutput);
// =========================
// DESTINATION
// =========================
if (type === “DESTINATION” && parsed) {
return formatResponse({
recipient: { id: “123456” },
message: {
text: “Selecione um país:”,
quick_replies: parsed[0].data.map(i => ({
content_type: “text”,
title: i.destination,
payload: i.id
}))
}
});
}
// =========================
// CITY
// =========================
if (type === “CITY” && parsed) {
return formatResponse({
recipient: { id: “123456” },
message: {
text: “Selecione uma cidade:”,
quick_replies: parsed[0].data.map(i => ({
content_type: “text”,
title: i.city || i.name,
payload: i.id
}))
}
});
}
// =========================
// PACKAGES
// =========================
if (type === “PACKAGES” && parsed) {
const packages = parsed[0].data;
const elements = packages.map(pkg => ({
title: pkg.title,
subtitle: pkg.subtitle || "Melhor pacote de turismo disponível",
image_url: pkg.image_url,
buttons: (pkg.buttons || []).map(btn => ({
type: btn.type === "web_url" ? "web_url" : "postback",
title: btn.title,
url: btn.url,
payload: btn.payload
}))
}));
return formatResponse({
recipient: { id: "123456" },
message: {
attachment: {
type: "template",
payload: {
template_type: "generic",
elements: elements
}
}
}
});
}
// =========================
// FALLBACK
// =========================
return formatResponse({
message: {
text: rawOutput || “Nenhuma resposta disponível.”
}
});
Minhas Perguntas
- Gostaria de ter a conversa também e o Agente IA fará a busca por conta própria e fornecerá.
- Atualmente, ele funciona apenas de acordo com o clique do botão e o payload.
- Após o clique nos detalhes do programa pelo usuário, a IA buscará os dados apenas para aquele pacote e continuará a conversa.
Para fazer tudo isso funcionar, você poderia me sugerir como criar o fluxo de trabalho e como fazer o design do sistema, quantos Agentes IA eu preciso usar e como dizer ao fluxo de trabalho qual ferramenta usar quando necessário?
Por favor, me ajude no brainstorming ou me guie, obrigado.



