Conversation de Chat
Message du Prompt IA
"Vous êtes un assistant de voyage professionnel. Vous opérez en trois phases distinctes et devez respecter des règles de formatage strictes pour chaque phase.
Veuillez engager une conversation avec l’utilisateur, le saluer et afficher le bouton selon sa demande.
PHASE 1 : Découverte des Pays
Déclencheur : Salutation initiale.
Action : Appeler get_destinations.
Format : Commencer par [TYPE:DESTINATION], suivi d’un salutation, puis le JSON brut […].
PHASE 2 : Découverte des Villes
Déclencheur : L’utilisateur sélectionne un pays.
Action : Appeler get_cities.
Format : Commencer par [TYPE:CITY], suivi d’une brève invite de sélection, puis le JSON brut […].
PHASE 3 : Découverte des Forfaits
Déclencheur : L’utilisateur sélectionne une ville.
Action : Appeler tour_packages en utilisant la valeur de payload.
Instruction pour Obtenir l’ID de Ville : Lorsque l’utilisateur sélectionne une ville, vous recevrez un message avec une valeur de payload. Ce payload est le term_id pour cette ville. Vous devez utiliser cette valeur spécifique lors de l’appel de l’outil tour_packages. Si vous n’avez pas de term_id, demandez à l’utilisateur de clarifier sa sélection de ville.
Format : Commencer par [TYPE:PACKAGES], suivi d’une brève confirmation, puis le JSON brut […].
PROTOCOLES CRITIQUES :
ENTÊTES DE ROUTAGE : Chaque message DOIT commencer par [TYPE:DESTINATION], [TYPE:CITY], ou [TYPE:PACKAGES].
PAS DE RÉSUMÉS : N’écrivez jamais de listes conversationnelles ou de comptages. Fournissez uniquement l’étiquette, une courte salutation, et le JSON brut.
LISIBLE PAR MACHINE : Le JSON […] doit être la dernière partie de chaque message.
UTILISATION D’OUTILS : Utilisez toujours les outils fournis pour récupérer les données. Ne fabriquez jamais de forfaits ou de villes."
IMPORTANT :
- Retournez UNIQUEMENT du JSON valide
- NE PAS inclure d’explications
- NE PAS échapper les guillemets
- NE PAS inclure [TYPE:…] à l’intérieur du JSON
- Le résultat doit être directement analysable par JSON.parse
Flux de Travail
Analyseur Global
const rawOutput = $input.first().json.output || “”;
// =========================
// Aide : Retour standard
// =========================
function formatResponse(data) {
return [{ json: data }];
}
// =========================
// Détecter 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;
}
// =========================
// Extraire JSON PROPRE
// =========================
function extractJSONArray(text) {
if (!text) return null;
// Supprimer les balises TYPE
let cleaned = text.replace(/\[TYPE:[A-Z]+\]/g, "").trim();
// Supprimer l'espace réservé
if (cleaned.includes("[...]")) return null;
// Obtenir les limites du JSON
const start = cleaned.indexOf('[');
const end = cleaned.lastIndexOf(']');
if (start === -1 || end === -1) return null;
let jsonString = cleaned.substring(start, end + 1);
// 🔥 Corriger les problèmes IA courants
jsonString = jsonString
.replace(/\\\//g, "/") // corriger les barres obliques échappées
.replace(/;\s*$/, "") // supprimer le ; final
.trim();
try {
let parsed = JSON.parse(jsonString);
// Gérer le JSON double-encodé
if (typeof parsed === "string") {
parsed = JSON.parse(parsed);
}
return parsed;
} catch (e) {
throw new Error("Échec de l'analyse JSON :\n" + jsonString);
}
}
// =========================
// PRINCIPAL
// =========================
const type = detectType(rawOutput);
const parsed = extractJSONArray(rawOutput);
// =========================
// DESTINATION
// =========================
if (type === “DESTINATION” && parsed) {
return formatResponse({
recipient: { id: “123456” },
message: {
text: “Sélectionnez un pays :”,
quick_replies: parsed[0].data.map(i => ({
content_type: “text”,
title: i.destination,
payload: i.id
}))
}
});
}
// =========================
// VILLE
// =========================
if (type === “CITY” && parsed) {
return formatResponse({
recipient: { id: “123456” },
message: {
text: “Sélectionnez une ville :”,
quick_replies: parsed[0].data.map(i => ({
content_type: “text”,
title: i.city || i.name,
payload: i.id
}))
}
});
}
// =========================
// FORFAITS
// =========================
if (type === “PACKAGES” && parsed) {
const packages = parsed[0].data;
const elements = packages.map(pkg => ({
title: pkg.title,
subtitle: pkg.subtitle || "Meilleur forfait touristique disponible",
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
}
}
}
});
}
// =========================
// SECOURS
// =========================
return formatResponse({
message: {
text: rawOutput || “Aucune réponse disponible.”
}
});
Mes Questions
- Je voudrais avoir la conversation aussi et l’Agent IA cherchera lui-même et donnera des résultats.
- Actuellement, cela ne fonctionne que selon le clic sur le bouton et le payload.
- Après que l’utilisateur clique sur les détails du programme, l’IA récupérera les données uniquement pour ce forfait et engagera la conversation.
Pour que tout fonctionne, veuillez me suggérer comment créer le flux de travail et la conception du système, combien d’Agents IA j’ai besoin d’utiliser, et comment indiquer au flux de travail quel outil utiliser quand c’est nécessaire ?
Veuillez m’aider à faire un remue-méninges ou me guider, merci.



