369 lines
10 KiB
JSON
369 lines
10 KiB
JSON
{
|
||
"name": "Workflow A – Mail Processing & KI Analysis",
|
||
"description": "Automated workflow to process support tickets, analyze them with AI, search knowledge base, and provide intelligent suggestions.",
|
||
"nodes": [
|
||
{
|
||
"id": "uuid-trigger-1",
|
||
"name": "Cron Trigger",
|
||
"type": "n8n-nodes-base.cron",
|
||
"typeVersion": 1,
|
||
"position": [
|
||
250,
|
||
200
|
||
],
|
||
"parameters": {
|
||
"cronExpression": "*/5 * * * *",
|
||
"timezone": "Europe/Berlin"
|
||
}
|
||
},
|
||
{
|
||
"id": "uuid-freescout-1",
|
||
"name": "Freescout Get Conversations",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4,
|
||
"position": [
|
||
450,
|
||
200
|
||
],
|
||
"parameters": {
|
||
"authentication": "predefinedCredentialType",
|
||
"url": "https://ekshelpdesk.fft-it.de/api/v1/mailboxes/1/conversations",
|
||
"method": "GET",
|
||
"options": {},
|
||
"sendQuery": true,
|
||
"queryParameters": {
|
||
"parameters": [
|
||
{
|
||
"name": "status",
|
||
"value": "active"
|
||
},
|
||
{
|
||
"name": "limit",
|
||
"value": "20"
|
||
},
|
||
{
|
||
"name": "processed_by_ai",
|
||
"value": "false"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"credentials": {
|
||
"httpBasicAuth": "Freescout API"
|
||
}
|
||
},
|
||
{
|
||
"id": "uuid-loop-1",
|
||
"name": "Loop Through Conversations",
|
||
"type": "n8n-nodes-base.loop",
|
||
"typeVersion": 1,
|
||
"position": [
|
||
650,
|
||
200
|
||
],
|
||
"parameters": {
|
||
"iterations": "={{ $json.body._embedded.conversations.length }}",
|
||
"dataPropertyName": "body._embedded.conversations"
|
||
}
|
||
},
|
||
{
|
||
"id": "uuid-set-extract-1",
|
||
"name": "Extract Conversation Data",
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3,
|
||
"position": [
|
||
850,
|
||
200
|
||
],
|
||
"parameters": {
|
||
"options": {},
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"name": "ticket_id",
|
||
"value": "={{ $json.id }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "subject",
|
||
"value": "={{ $json.subject }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "problem_text",
|
||
"value": "={{ $json.threads[0].body || 'No description' }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "customer_name",
|
||
"value": "={{ $json.customer_name }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "status",
|
||
"value": "={{ $json.status }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "mailbox_id",
|
||
"value": 1,
|
||
"type": "number"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"id": "uuid-milvus-query-1",
|
||
"name": "Milvus Query KB",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4,
|
||
"position": [
|
||
1050,
|
||
200
|
||
],
|
||
"parameters": {
|
||
"authentication": "none",
|
||
"url": "http://milvus:9091/api/v1/search",
|
||
"method": "POST",
|
||
"headers": {
|
||
"Content-Type": "application/json"
|
||
},
|
||
"body": {
|
||
"RAW_JSON": true,
|
||
"parameters": "={{ JSON.stringify({\n \"collection_name\": \"knowledge_base_embeddings\",\n \"search_params\": {\n \"metric_type\": \"L2\",\n \"params\": {\n \"nprobe\": 10\n }\n },\n \"annnSearch\": {\n \"field\": \"embedding\",\n \"limit\": 3,\n \"metric_type\": \"L2\"\n },\n \"output_fields\": [\"title\", \"content\", \"category\", \"solution_type\", \"created_at\"]\n}) }}"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"id": "uuid-llm-call-1",
|
||
"name": "LiteLLM AI Analysis",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4,
|
||
"position": [
|
||
1250,
|
||
200
|
||
],
|
||
"parameters": {
|
||
"authentication": "none",
|
||
"url": "http://llm:8000/v1/chat/completions",
|
||
"method": "POST",
|
||
"headers": {
|
||
"Content-Type": "application/json"
|
||
},
|
||
"body": {
|
||
"RAW_JSON": true,
|
||
"parameters": "={{ JSON.stringify({\n \"model\": \"gpt-3.5-turbo\",\n \"messages\": [\n {\n \"role\": \"system\",\n \"content\": \"Du bist ein IT-Support-Assistent. Analysiere das folgende Support-Ticket und:\\n1. Verstehe das Problem\\n2. Schaue in der Wissensdatenbank nach ähnlichen Problemen\\n3. Gib einen strukturierten Vorschlag zurück als JSON\\n\\nDie Lösung kann sein:\\n- BARAMUNDI_JOB: Ein automatisierter Job im Baramundi System\\n- AUTOMATISCHE_ANTWORT: Eine automatische Antwort an den Kunden\\n- ESKALATION: Manuelle Eskalation erforderlich\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Ticket ID: {{$json.ticket_id}}\\nSubjekt: {{$json.subject}}\\nProblem: {{$json.problem_text}}\\n\\nÄhnliche KB-Einträge (Top 3):\\n\" + ($json.kb_results || []).slice(0, 3).map((r, i) => `${i+1}. ${r.title}\\n${r.content}`).join('\\n\\n') + \"\\n\\nGib deine Analyse als JSON zurück mit folgendem Format:\\n{\\\"kategorie\\\": \\\"Hardware|Software|Account|Netzwerk|Sonstiges\\\", \\\"problem_verstanden\\\": \\\"Kurze Zusammenfassung\\\", \\\"lösung_typ\\\": \\\"BARAMUNDI_JOB|AUTOMATISCHE_ANTWORT|ESKALATION\\\", \\\"baramundi_job\\\": {\\\"name\\\": \\\"Job-Name\\\", \\\"parameter\\\": {}}, \\\"antwort_text\\\": \\\"Kundenfreundliche Antwort\\\", \\\"vertrauen\\\": 0.75, \\\"begründung\\\": \\\"Warum diese Lösung?\\\"}\"\n }\n ],\n \"temperature\": 0.7,\n \"max_tokens\": 1000\n}) }}"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"id": "uuid-parse-response-1",
|
||
"name": "Parse AI Response",
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3,
|
||
"position": [
|
||
1450,
|
||
200
|
||
],
|
||
"parameters": {
|
||
"options": {},
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"name": "ai_response_raw",
|
||
"value": "={{ $json.choices[0].message.content }}",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "ai_response",
|
||
"value": "={{ JSON.parse($json.ai_response_raw.match(/\\{[^{}]*(?:\\{[^{}]*\\}[^{}]*)*\\}/)[0]) }}",
|
||
"type": "object"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"id": "uuid-filter-confidence-1",
|
||
"name": "Filter by Confidence",
|
||
"type": "n8n-nodes-base.if",
|
||
"typeVersion": 2,
|
||
"position": [
|
||
1650,
|
||
200
|
||
],
|
||
"parameters": {
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"extractValue": false
|
||
},
|
||
"combinator": "and",
|
||
"conditions": [
|
||
{
|
||
"id": "condition_1",
|
||
"leftValue": "={{ $json.ai_response.vertrauen }}",
|
||
"rightValue": 0.6,
|
||
"operator": {
|
||
"name": "filter.operator.gte",
|
||
"value": ">="
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"id": "uuid-freescout-update-1",
|
||
"name": "Freescout Save Suggestion",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4,
|
||
"position": [
|
||
1850,
|
||
100
|
||
],
|
||
"parameters": {
|
||
"authentication": "predefinedCredentialType",
|
||
"url": "https://ekshelpdesk.fft-it.de/api/v1/conversations/{{ $json.ticket_id }}",
|
||
"method": "PUT",
|
||
"headers": {
|
||
"Content-Type": "application/json"
|
||
},
|
||
"body": {
|
||
"RAW_JSON": true,
|
||
"parameters": "={{ JSON.stringify({\n \"custom_fields\": {\n \"AI_SUGGESTION\": $json.ai_response.antwort_text,\n \"AI_SUGGESTION_STATUS\": \"PENDING\",\n \"PROCESSED_BY_AI\": true,\n \"AI_CATEGORY\": $json.ai_response.kategorie,\n \"AI_CONFIDENCE\": $json.ai_response.vertrauen,\n \"AI_SOLUTION_TYPE\": $json.ai_response.lösung_typ,\n \"AI_REASONING\": $json.ai_response.begründung\n }\n}) }}"
|
||
}
|
||
}
|
||
},
|
||
"credentials": {
|
||
"httpBasicAuth": "Freescout API"
|
||
}
|
||
},
|
||
{
|
||
"id": "uuid-no-action-1",
|
||
"name": "Low Confidence - No Action",
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3,
|
||
"position": [
|
||
1850,
|
||
350
|
||
],
|
||
"parameters": {
|
||
"options": {},
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"name": "skip_reason",
|
||
"value": "Confidence below threshold ({{ $json.ai_response.vertrauen }} < 0.6)",
|
||
"type": "string"
|
||
},
|
||
{
|
||
"name": "processed",
|
||
"value": false,
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
}
|
||
],
|
||
"connections": {
|
||
"Cron Trigger": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Freescout Get Conversations",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Freescout Get Conversations": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Loop Through Conversations",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Loop Through Conversations": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Extract Conversation Data",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Extract Conversation Data": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Milvus Query KB",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Milvus Query KB": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "LiteLLM AI Analysis",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"LiteLLM AI Analysis": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Parse AI Response",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Parse AI Response": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Filter by Confidence",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Filter by Confidence": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Freescout Save Suggestion",
|
||
"index": 0
|
||
}
|
||
],
|
||
[
|
||
{
|
||
"node": "Low Confidence - No Action",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
}
|
||
},
|
||
"active": false,
|
||
"settings": {
|
||
"errorHandler": "continueOnError",
|
||
"timezone": "Europe/Berlin"
|
||
},
|
||
"owner": "admin",
|
||
"versionId": "1"
|
||
}
|