Chat-Konversation
KI-Eingabeaufforderung
"Du bist ein professioneller Reiseassistent. Du arbeitest in drei unterschiedlichen Phasen und musst strenge Formatierungsregeln für jede Phase befolgen.
Bitte führe ein Gespräch mit dem Benutzer, begrüße ihn und zeige die Schaltfläche gemäß der Benutzeranfrage.
PHASE 1: Länder-Erkennung
Auslöser: Anfängliche Begrüßung.
Aktion: get_destinations aufrufen.
Format: Beginne mit [TYPE:DESTINATION], gefolgt von einer Begrüßung, dann das rohe JSON […].
PHASE 2: Stadt-Erkennung
Auslöser: Der Benutzer wählt ein Land aus.
Aktion: get_cities aufrufen.
Format: Beginne mit [TYPE:CITY], gefolgt von einer kurzen Auswahlbitte, dann das rohe JSON […].
PHASE 3: Paket-Erkennung
Auslöser: Der Benutzer wählt eine Stadt aus.
Aktion: tour_packages unter Verwendung des Payload-Wertes aufrufen.
Anleitung zum Abrufen der Stadt-ID: Wenn der Benutzer eine Stadt auswählt, erhältst du eine Nachricht mit einem Payload-Wert. Dieser Payload ist die term_id für diese Stadt. Du musst diesen spezifischen Wert beim Aufrufen des tour_packages-Tools verwenden. Wenn du keine term_id hast, bitte den Benutzer, seine Stadtauswahl zu klären.
Format: Beginne mit [TYPE:PACKAGES], gefolgt von einer kurzen Bestätigung, dann das rohe JSON […].
KRITISCHE PROTOKOLLE:
ROUTING-ÜBERSCHRIFTEN: Jede Nachricht MUSS mit [TYPE:DESTINATION], [TYPE:CITY] oder [TYPE:PACKAGES] beginnen.
KEINE ZUSAMMENFASSUNGEN: Schreibe niemals Gesprächslisten oder Zählungen. Gebe nur das Tag, eine kurze Begrüßung und das rohe JSON an.
MASCHINENLESBAR: Das JSON […] muss der letzte Teil jeder Nachricht sein.
TOOL-VERWENDUNG: Verwende immer die bereitgestellten Tools zum Abrufen von Daten. Erfinde nie Pakete oder Städte."
WICHTIG:
- Gebe NUR gültiges JSON zurück
- KEINE Erklärungen
- KEINE escaped Anführungszeichen
- KEINE [TYPE:…] innerhalb von JSON
- Die Ausgabe muss direkt von JSON.parse analysierbar sein
Arbeitsablauf
Globaler Parser
const rawOutput = $input.first().json.output || “”;
// =========================
// Hilfsfunktion: Standardrückgabe
// =========================
function formatResponse(data) {
return [{ json: data }];
}
// =========================
// Erkenne 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;
}
// =========================
// Extrahiere SAUBERES JSON
// =========================
function extractJSONArray(text) {
if (!text) return null;
// Entferne TYPE-Tags
let cleaned = text.replace(/\[TYPE:[A-Z]+\]/g, "").trim();
// Entferne Platzhalter
if (cleaned.includes("[...]")) return null;
// Finde JSON-Grenzen
const start = cleaned.indexOf('[');
const end = cleaned.lastIndexOf(']');
if (start === -1 || end === -1) return null;
let jsonString = cleaned.substring(start, end + 1);
// 🔥 Behebe häufige KI-Probleme
jsonString = jsonString
.replace(/\\\//g, "/") // behebe escaped slashes
.replace(/;\s*$/, "") // entferne nachfolgende ;
.trim();
try {
let parsed = JSON.parse(jsonString);
// Behandle doppelt kodiertes JSON
if (typeof parsed === "string") {
parsed = JSON.parse(parsed);
}
return parsed;
} catch (e) {
throw new Error("JSON Parse Fehlgeschlagen:\n" + jsonString);
}
}
// =========================
// HAUPTFUNKTION
// =========================
const type = detectType(rawOutput);
const parsed = extractJSONArray(rawOutput);
// =========================
// DESTINATION
// =========================
if (type === “DESTINATION” && parsed) {
return formatResponse({
recipient: { id: “123456” },
message: {
text: “Wähle ein Land:”,
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: “Wähle eine Stadt:”,
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 || "Bestes verfügbares Reisepaket",
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 || “Keine Antwort verfügbar.”
}
});
Meine Fragen
- Ich möchte auch die Konversation haben und der KI-Agent soll selbst suchen und liefern.
- Derzeit funktioniert es nur gemäß Schaltflächenklick und Payload.
- Nachdem der Benutzer auf die Programmdetails klickt, soll die KI die Daten nur für dieses Paket abrufen und das Gespräch fortsetzen.
Um all das zum Funktionieren zu bringen, bitte ich um Vorschläge, wie ich den Arbeitsablauf gestalte, wie das System-Design aussehen sollte, wie viele KI-Agenten ich benötige und wie ich dem Arbeitsablauf mitteile, welches Tool wann verwendet werden soll?
Bitte helfen Sie mir beim Brainstorming oder leiten Sie mich an. Danke!



