41 lines
3.5 KiB
JavaScript
41 lines
3.5 KiB
JavaScript
// n8n Code Node: "Claude Request bauen"
|
|
// Erwartet: customer, period, metrics, trends und optional context.
|
|
// Das Schema ist fuer die rohe Messages API vereinfacht. Die strengeren
|
|
// Laengen- und Wertepruefungen erfolgen anschliessend im Report Renderer.
|
|
|
|
const input = $json;
|
|
const schema = {"type": "object", "additionalProperties": false, "properties": {"summary": {"type": "object", "additionalProperties": false, "properties": {"headline": {"type": "string", "description": "Minimum characters: 8. Maximum characters: 110."}, "text": {"type": "string", "description": "Minimum characters: 80. Maximum characters: 900."}, "rating": {"type": "string", "enum": ["positive", "neutral", "watch"]}}, "required": ["headline", "text", "rating"]}, "developments": {"type": "array", "items": {"type": "object", "additionalProperties": false, "properties": {"text": {"type": "string", "description": "Minimum characters: 40. Maximum characters: 450."}, "impact": {"type": "string", "enum": ["positive", "neutral", "negative"]}}, "required": ["title", "text", "impact"]}, "description": "Minimum items: 2. Maximum items: 4."}, "recommendations": {"type": "array", "items": {"type": "object", "additionalProperties": false, "properties": {"priority": {"type": "integer", "description": "Minimum value: 1. Maximum value: 3."}, "category": {"type": "string", "description": "Minimum characters: 3. Maximum characters: 80."}, "reason": {"type": "string", "description": "Minimum characters: 40. Maximum characters: 450."}, "action": {"type": "string", "description": "Minimum characters: 30. Maximum characters: 450."}, "expected_effect": {"type": "string", "description": "Minimum characters: 20. Maximum characters: 300."}}, "required": ["priority", "category", "title", "reason", "action", "expected_effect"]}, "description": "Minimum items: 1. Maximum items: 3."}, "outlook": {"type": "object", "additionalProperties": false, "properties": {"headline": {"type": "string", "description": "Minimum characters: 5. Maximum characters: 100."}, "text": {"type": "string", "description": "Minimum characters: 60. Maximum characters: 700."}}, "required": ["headline", "text"]}, "data_quality_notes": {"type": "array", "items": {"type": "string", "description": "Minimum characters: 5. Maximum characters: 240."}, "description": "Maximum items: 4."}}, "required": ["summary", "developments", "recommendations", "outlook", "data_quality_notes"]};
|
|
|
|
const systemPrompt = `Du erstellst die redaktionellen Inhalte eines monatlichen Performance-Reports fuer Betreiber von Ferienunterkuenften.
|
|
Nutze ausschliesslich die gelieferten Daten. Erfinde keine Zahlen oder Ursachen.
|
|
Jede Empfehlung muss konkret und aus den Daten ableitbar sein.
|
|
Formuliere professionell, klar und auf Deutsch. Vermeide Marketingfloskeln und Wiederholungen.
|
|
Erzeuge 2 bis 4 Entwicklungen, 1 bis 3 Empfehlungen und hoechstens 4 Datenhinweise.
|
|
Nutze data_quality_notes fuer fehlende oder eingeschraenkte Datengrundlagen.`;
|
|
|
|
const userPrompt = `Erstelle den Monatsreport fuer diese Daten:
|
|
|
|
${JSON.stringify({
|
|
customer: input.customer,
|
|
period: input.period,
|
|
metrics: input.metrics,
|
|
trends: input.trends,
|
|
context: input.context ?? {}
|
|
}, null, 2)}`;
|
|
|
|
return [{
|
|
json: {
|
|
...input,
|
|
claudeRequest: {
|
|
model: input.claudeModel ?? 'claude-sonnet-4-6',
|
|
max_tokens: 3000,
|
|
temperature: 0.2,
|
|
system: systemPrompt,
|
|
messages: [{ role: 'user', content: userPrompt }],
|
|
output_config: {
|
|
format: { type: 'json_schema', schema }
|
|
}
|
|
}
|
|
}
|
|
}];
|