Files
monthly-report-kit/n8n/code-build-claude-request.js
2026-06-24 14:40:43 +00:00

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 }
}
}
}
}];