1024 lines
23 KiB
Markdown
1024 lines
23 KiB
Markdown
|
|
# AI-gestützte IT-Support-Automatisierung Implementation Plan
|
|||
|
|
|
|||
|
|
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|||
|
|
|
|||
|
|
**Goal:** Ein produktives Hybrid-System bauen, das Freescout-Mails analysiert, KI-Vorschläge macht, Mensch-Approval einholt, und eine selbstlernende Wissensdatenbank aufbaut.
|
|||
|
|
|
|||
|
|
**Architecture:** 4-phasiger Ansatz:
|
|||
|
|
1. **Phase 1 (Setup):** Docker Compose + Vector DB + Freescout Custom Fields
|
|||
|
|
2. **Phase 2 (Workflows):** n8n Workflows A (Mail-Processing), B (Approval), C (KB-Update)
|
|||
|
|
3. **Phase 3 (Integration):** End-to-End Testing + API Connections
|
|||
|
|
4. **Phase 4 (Production):** Monitoring + Dokumentation + Go-Live
|
|||
|
|
|
|||
|
|
**Tech Stack:**
|
|||
|
|
- **Orchestrierung:** n8n (vorhanden, Docker)
|
|||
|
|
- **Vector DB:** Milvus (Docker)
|
|||
|
|
- **KI:** LiteLLM API (extern: http://llm.eks-ai.apps.asgard.eks-lnx.fft-it.de)
|
|||
|
|
- **Mail-Source:** Freescout API (extern: https://ekshelpdesk.fft-it.de)
|
|||
|
|
- **Job-Execution:** Baramundi Management Server API (extern)
|
|||
|
|
- **Audit Trail:** PostgreSQL (Docker)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Chunk 1: Infrastructure & Setup
|
|||
|
|
|
|||
|
|
### Task 1.1: Vector Database in Docker Compose integrieren
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Modify: `compose.yaml`
|
|||
|
|
- Create: `.env.example` (aktualisieren mit neuen Vars)
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: compose.yaml lesen und Struktur verstehen**
|
|||
|
|
|
|||
|
|
Schau dir die aktuelle Struktur an (Traefik, n8n).
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Milvus Service zu compose.yaml hinzufügen**
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
milvus:
|
|||
|
|
image: milvusdb/milvus:latest
|
|||
|
|
restart: always
|
|||
|
|
environment:
|
|||
|
|
COMMON_STORAGETYPE: local
|
|||
|
|
COMMON_LOG_LEVEL: info
|
|||
|
|
ports:
|
|||
|
|
- "127.0.0.1:19530:19530"
|
|||
|
|
- "127.0.0.1:9091:9091"
|
|||
|
|
volumes:
|
|||
|
|
- milvus_data:/var/lib/milvus
|
|||
|
|
healthcheck:
|
|||
|
|
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
|
|||
|
|
interval: 30s
|
|||
|
|
timeout: 10s
|
|||
|
|
retries: 5
|
|||
|
|
|
|||
|
|
postgres:
|
|||
|
|
image: postgres:15-alpine
|
|||
|
|
restart: always
|
|||
|
|
environment:
|
|||
|
|
POSTGRES_DB: n8n_kb
|
|||
|
|
POSTGRES_USER: kb_user
|
|||
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|||
|
|
ports:
|
|||
|
|
- "127.0.0.1:5432:5432"
|
|||
|
|
volumes:
|
|||
|
|
- postgres_data:/var/lib/postgresql/data
|
|||
|
|
healthcheck:
|
|||
|
|
test: ["CMD-SHELL", "pg_isready -U kb_user"]
|
|||
|
|
interval: 10s
|
|||
|
|
timeout: 5s
|
|||
|
|
retries: 5
|
|||
|
|
|
|||
|
|
volumes:
|
|||
|
|
traefik_data:
|
|||
|
|
n8n_data:
|
|||
|
|
milvus_data:
|
|||
|
|
postgres_data:
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: .env mit neuen Variablen aktualisieren**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Existing
|
|||
|
|
SSL_EMAIL=your-email@example.com
|
|||
|
|
SUBDOMAIN=n8n
|
|||
|
|
DOMAIN_NAME=example.com
|
|||
|
|
GENERIC_TIMEZONE=Europe/Berlin
|
|||
|
|
|
|||
|
|
# New für KB
|
|||
|
|
POSTGRES_PASSWORD=secure_password_change_me
|
|||
|
|
MILVUS_API_URL=http://milvus:19530
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 4: Services starten und healthcheck testen**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker-compose up -d milvus postgres
|
|||
|
|
docker-compose logs -f milvus
|
|||
|
|
# Expected: "Milvus is ready to serve"
|
|||
|
|
|
|||
|
|
curl http://127.0.0.1:9091/healthz
|
|||
|
|
# Expected: 200 OK
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 5: Commit**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add compose.yaml .env.example
|
|||
|
|
git commit -m "infra: add Milvus vector DB and PostgreSQL for KB audit trail"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 1.2: PostgreSQL Audit Schema erstellen
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Create: `sql/01-audit-schema.sql`
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Erstelle SQL Schema Datei**
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
-- Audit Trail für KB Updates
|
|||
|
|
CREATE TABLE knowledge_base_updates (
|
|||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|||
|
|
ticket_id INTEGER NOT NULL,
|
|||
|
|
problem_text TEXT NOT NULL,
|
|||
|
|
kategorie VARCHAR(100),
|
|||
|
|
lösung TEXT,
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
approved_at TIMESTAMP,
|
|||
|
|
executed_at TIMESTAMP,
|
|||
|
|
status VARCHAR(50) CHECK (status IN ('PENDING', 'APPROVED', 'REJECTED', 'EXECUTED')),
|
|||
|
|
freescout_note TEXT
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
CREATE INDEX idx_kbu_ticket ON knowledge_base_updates(ticket_id);
|
|||
|
|
CREATE INDEX idx_kbu_status ON knowledge_base_updates(status);
|
|||
|
|
CREATE INDEX idx_kbu_kategorie ON knowledge_base_updates(kategorie);
|
|||
|
|
|
|||
|
|
CREATE TABLE kb_feedback (
|
|||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|||
|
|
kb_entry_id VARCHAR(255) NOT NULL,
|
|||
|
|
feedback VARCHAR(50) CHECK (feedback IN ('helpful', 'not_helpful')),
|
|||
|
|
reason TEXT,
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
CREATE INDEX idx_kbf_entry ON kb_feedback(kb_entry_id);
|
|||
|
|
|
|||
|
|
CREATE TABLE workflow_executions (
|
|||
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|||
|
|
workflow_name VARCHAR(255),
|
|||
|
|
ticket_id INTEGER,
|
|||
|
|
status VARCHAR(50),
|
|||
|
|
error_message TEXT,
|
|||
|
|
execution_time_ms INTEGER,
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
CREATE INDEX idx_we_ticket ON workflow_executions(ticket_id);
|
|||
|
|
CREATE INDEX idx_we_workflow ON workflow_executions(workflow_name);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Initialisiere PostgreSQL mit Schema**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker-compose exec postgres psql -U kb_user -d n8n_kb < sql/01-audit-schema.sql
|
|||
|
|
# Expected: CREATE TABLE, CREATE INDEX messages
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Teste Schema**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker-compose exec postgres psql -U kb_user -d n8n_kb -c "\dt"
|
|||
|
|
# Expected: 3 tables angezeigt
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 4: Commit**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add sql/01-audit-schema.sql
|
|||
|
|
git commit -m "infra: PostgreSQL audit schema for KB tracking"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 1.3: Freescout Custom Fields erstellen (manuell)
|
|||
|
|
|
|||
|
|
**Dokumentation:** Freescout API Docs
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Freescout API Key vorbereiten**
|
|||
|
|
|
|||
|
|
Erstelle `.env` Eintrag:
|
|||
|
|
```bash
|
|||
|
|
FREESCOUT_API_KEY=your_api_key_here
|
|||
|
|
FREESCOUT_API_BASE=https://ekshelpdesk.fft-it.de/api/v1
|
|||
|
|
FREESCOUT_MAILBOX_ID=1
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Test Freescout API Verbindung**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -H "Authorization: Bearer $FREESCOUT_API_KEY" \
|
|||
|
|
https://ekshelpdesk.fft-it.de/api/v1/mailboxes/1
|
|||
|
|
# Expected: Mailbox JSON angezeigt
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Erstelle Setup-Skript für Custom Fields**
|
|||
|
|
|
|||
|
|
Datei: `scripts/setup-freescout-fields.sh`
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
|
|||
|
|
API_BASE="${FREESCOUT_API_BASE}"
|
|||
|
|
API_KEY="${FREESCOUT_API_KEY}"
|
|||
|
|
MAILBOX_ID="${FREESCOUT_MAILBOX_ID}"
|
|||
|
|
|
|||
|
|
echo "Creating Freescout Custom Fields..."
|
|||
|
|
|
|||
|
|
# Field 1: AI_SUGGESTION (Text für JSON)
|
|||
|
|
curl -X POST "$API_BASE/mailboxes/$MAILBOX_ID/custom-fields" \
|
|||
|
|
-H "Authorization: Bearer $API_KEY" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"name": "AI_SUGGESTION",
|
|||
|
|
"title": "KI-Vorschlag",
|
|||
|
|
"type": "text",
|
|||
|
|
"required": false
|
|||
|
|
}' && echo "✅ AI_SUGGESTION created"
|
|||
|
|
|
|||
|
|
# Field 2: AI_SUGGESTION_STATUS (Dropdown)
|
|||
|
|
curl -X POST "$API_BASE/mailboxes/$MAILBOX_ID/custom-fields" \
|
|||
|
|
-H "Authorization: Bearer $API_KEY" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"name": "AI_SUGGESTION_STATUS",
|
|||
|
|
"title": "KI-Status",
|
|||
|
|
"type": "select",
|
|||
|
|
"required": false,
|
|||
|
|
"options": ["PENDING", "APPROVED", "REJECTED", "EXECUTED"]
|
|||
|
|
}' && echo "✅ AI_SUGGESTION_STATUS created"
|
|||
|
|
|
|||
|
|
# Field 3: PROCESSED_BY_AI (Boolean)
|
|||
|
|
curl -X POST "$API_BASE/mailboxes/$MAILBOX_ID/custom-fields" \
|
|||
|
|
-H "Authorization: Bearer $API_KEY" \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"name": "PROCESSED_BY_AI",
|
|||
|
|
"title": "Von KI verarbeitet",
|
|||
|
|
"type": "checkbox",
|
|||
|
|
"required": false
|
|||
|
|
}' && echo "✅ PROCESSED_BY_AI created"
|
|||
|
|
|
|||
|
|
echo "✅ All custom fields created!"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 4: Führe Setup Skript aus**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
bash scripts/setup-freescout-fields.sh
|
|||
|
|
# Expected: 3x ✅ created
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 5: Commit**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add scripts/setup-freescout-fields.sh
|
|||
|
|
git commit -m "scripts: setup Freescout custom fields"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Chunk 2: n8n Workflows Setup & Workflow A (Mail Processing)
|
|||
|
|
|
|||
|
|
### Task 2.1: n8n Credentials & Collections vorbereiten
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Create: `n8n-workflows/00-SETUP.md`
|
|||
|
|
- Create: `n8n-workflows/workflow-a-mail-processing.json`
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Verstehe n8n Workflow Export Format**
|
|||
|
|
|
|||
|
|
n8n Workflows werden als JSON exportiert. Struktur:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"name": "Workflow Name",
|
|||
|
|
"nodes": [...],
|
|||
|
|
"connections": {...},
|
|||
|
|
"active": true
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Erstelle Setup-Dokumentation**
|
|||
|
|
|
|||
|
|
Datei: `n8n-workflows/00-SETUP.md`
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
# n8n Workflows Setup
|
|||
|
|
|
|||
|
|
## Benötigte Credentials
|
|||
|
|
|
|||
|
|
1. **Freescout API:**
|
|||
|
|
- Type: HTTP Request (Generic Credentials)
|
|||
|
|
- Base URL: https://ekshelpdesk.fft-it.de/api/v1
|
|||
|
|
- Auth: Bearer Token (von .env FREESCOUT_API_KEY)
|
|||
|
|
|
|||
|
|
2. **LiteLLM API:**
|
|||
|
|
- Type: HTTP Request
|
|||
|
|
- Base URL: http://llm.eks-ai.apps.asgard.eks-lnx.fft-it.de
|
|||
|
|
- No auth needed (lokal)
|
|||
|
|
|
|||
|
|
3. **PostgreSQL:**
|
|||
|
|
- Host: postgres (Docker)
|
|||
|
|
- Port: 5432
|
|||
|
|
- Database: n8n_kb
|
|||
|
|
- User: kb_user
|
|||
|
|
- Password: (von .env POSTGRES_PASSWORD)
|
|||
|
|
|
|||
|
|
4. **Milvus:**
|
|||
|
|
- Host: milvus
|
|||
|
|
- Port: 19530
|
|||
|
|
- No auth
|
|||
|
|
|
|||
|
|
## Workflow Import
|
|||
|
|
|
|||
|
|
Importiere folgende Workflows in n8n:
|
|||
|
|
1. workflow-a-mail-processing.json
|
|||
|
|
2. workflow-b-approval-execution.json
|
|||
|
|
3. workflow-c-kb-update.json
|
|||
|
|
|
|||
|
|
Schalte sie in dieser Reihenfolge an:
|
|||
|
|
1. Workflow A (Mail Processing) – hauptziel
|
|||
|
|
2. Workflow B (Approval) – triggered bei Field-Änderung
|
|||
|
|
3. Workflow C (KB Update) – triggered nach Workflow B
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Commit Setup Dokumentation**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add n8n-workflows/00-SETUP.md
|
|||
|
|
git commit -m "docs: n8n setup and credential configuration"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 2.2: Workflow A – Mail Processing (Polling + KI-Analyse)
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Create: `n8n-workflows/workflow-a-mail-processing.json`
|
|||
|
|
|
|||
|
|
**Logik:**
|
|||
|
|
1. Trigger: Cron (alle 5 Min)
|
|||
|
|
2. Freescout API: neue Tickets fetchen
|
|||
|
|
3. Für jedes Ticket: Vector DB Query + LLM Call
|
|||
|
|
4. Speichere Vorschlag in Freescout
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Workflow-Struktur in n8n UI bauen**
|
|||
|
|
|
|||
|
|
Node 1: **Cron Trigger**
|
|||
|
|
- Cron: `*/5 * * * *` (alle 5 Min)
|
|||
|
|
|
|||
|
|
Node 2: **Freescoot API – Get Conversations**
|
|||
|
|
- Method: GET
|
|||
|
|
- URL: `https://ekshelpdesk.fft-it.de/api/v1/mailboxes/1/conversations?status=active`
|
|||
|
|
- Auth: Bearer Token
|
|||
|
|
- Params: `status=active&limit=20&processed_by_ai=false`
|
|||
|
|
|
|||
|
|
Node 3: **Loop through Conversations**
|
|||
|
|
- Use: Loop node über Array aus Node 2
|
|||
|
|
|
|||
|
|
Node 4: **Extract Conversation Details**
|
|||
|
|
- Use: Set node um Subject, Body zu extrahieren
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
ticket_id: item.id,
|
|||
|
|
subject: item.subject,
|
|||
|
|
body: item.threads[0].body,
|
|||
|
|
customer_email: item.customer.email
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Node 5: **Vector DB Query (Milvus)**
|
|||
|
|
- Python node um ähnliche KB-Einträge zu finden
|
|||
|
|
```python
|
|||
|
|
from pymilvus import Collection
|
|||
|
|
|
|||
|
|
# Connect to Milvus
|
|||
|
|
collection = Collection("knowledge_base")
|
|||
|
|
|
|||
|
|
# Search for similar problems
|
|||
|
|
results = collection.search(
|
|||
|
|
data=[embedding_vector], # zu erzeugen via LLM
|
|||
|
|
anns_field="embedding",
|
|||
|
|
param={
|
|||
|
|
"metric_type": "L2",
|
|||
|
|
"params": {"nprobe": 10}
|
|||
|
|
},
|
|||
|
|
limit=3,
|
|||
|
|
output_fields=["problem_text", "kategorie", "lösung"]
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
return results
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Node 6: **LLM Call (LiteLLM)**
|
|||
|
|
- HTTP Request zu LiteLLM
|
|||
|
|
- Method: POST
|
|||
|
|
- URL: `http://llm.eks-ai.apps.asgard.eks-lnx.fft-it.de/v1/chat/completions`
|
|||
|
|
- Body:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"model": "available-model",
|
|||
|
|
"messages": [
|
|||
|
|
{
|
|||
|
|
"role": "system",
|
|||
|
|
"content": "Du bist IT-Support-Assistent..."
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"role": "user",
|
|||
|
|
"content": "Ticket: [subject]\n[body]\n\nÄhnliche Lösungen aus KB: [top 3 results]"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"temperature": 0.3
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Node 7: **Parse LLM Response**
|
|||
|
|
- Extract JSON aus response
|
|||
|
|
```javascript
|
|||
|
|
{
|
|||
|
|
kategorie: json.kategorie,
|
|||
|
|
lösung_typ: json.lösung_typ,
|
|||
|
|
vertrauen: json.vertrauen,
|
|||
|
|
antwort_text: json.antwort_text,
|
|||
|
|
begründung: json.begründung
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Node 8: **Save to Freescout (Custom Fields)**
|
|||
|
|
- HTTP Request
|
|||
|
|
- Method: PUT
|
|||
|
|
- URL: `https://ekshelpdesk.fft-it.de/api/v1/conversations/{ticket_id}`
|
|||
|
|
- Body:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"custom_fields": {
|
|||
|
|
"AI_SUGGESTION": "{{$node[\"Parse LLM Response\"].json}}",
|
|||
|
|
"AI_SUGGESTION_STATUS": "PENDING",
|
|||
|
|
"PROCESSED_BY_AI": true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Exportiere Workflow als JSON**
|
|||
|
|
|
|||
|
|
In n8n: Menu → Export → Full Workflow JSON
|
|||
|
|
Speichere als `n8n-workflows/workflow-a-mail-processing.json`
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Teste Workflow manuell**
|
|||
|
|
|
|||
|
|
- Starte Workflow manuell (Test-Button)
|
|||
|
|
- Check Freescout UI: neue Custom Fields angezeigt?
|
|||
|
|
- Check n8n Logs auf Fehler
|
|||
|
|
|
|||
|
|
- [ ] **Step 4: Aktiviere Cron Trigger**
|
|||
|
|
|
|||
|
|
Schalte Workflow an. Sollte jetzt alle 5 Min laufen.
|
|||
|
|
|
|||
|
|
- [ ] **Step 5: Commit**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add n8n-workflows/workflow-a-mail-processing.json
|
|||
|
|
git commit -m "feat: workflow A – mail processing and KI analysis"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Chunk 3: Workflow B & C (Approval + KB Update)
|
|||
|
|
|
|||
|
|
### Task 3.1: Workflow B – Approval & Execution
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Create: `n8n-workflows/workflow-b-approval-execution.json`
|
|||
|
|
|
|||
|
|
**Logik:**
|
|||
|
|
1. Trigger: Webhook oder Polling (wenn AI_SUGGESTION_STATUS geändert)
|
|||
|
|
2. Validiere: APPROVED oder REJECTED
|
|||
|
|
3. Wenn APPROVED: Branching
|
|||
|
|
- Baramundi Job? → Baramundi API Call
|
|||
|
|
- Automatische Antwort? → Email senden
|
|||
|
|
4. Trigger Workflow C
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Baue Trigger Node**
|
|||
|
|
|
|||
|
|
Option A: **Webhook Trigger** (empfohlen)
|
|||
|
|
- Freescout muss Webhook supportieren
|
|||
|
|
- Trigger bei Field-Änderung
|
|||
|
|
|
|||
|
|
Option B: **Polling via HTTP**
|
|||
|
|
- Alle 2 Min abfragen: welche Conversations haben AI_SUGGESTION_STATUS = APPROVED
|
|||
|
|
- Fallback wenn Webhook nicht verfügbar
|
|||
|
|
|
|||
|
|
Für MVP: **Option B (Polling)**
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Baue Approval Check Node**
|
|||
|
|
|
|||
|
|
HTTP Request zu Freescout:
|
|||
|
|
```
|
|||
|
|
GET /api/v1/conversations?custom_field_AI_SUGGESTION_STATUS=APPROVED&processed_approval=false
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Baue Branching Logic**
|
|||
|
|
|
|||
|
|
Für jedes approved Ticket:
|
|||
|
|
- Parse AI_SUGGESTION
|
|||
|
|
- Check: ist `lösung_typ == "BARAMUNDI_JOB"` oder `"AUTOMATISCHE_ANTWORT"`?
|
|||
|
|
|
|||
|
|
- [ ] **Step 4: Baramundi Job Node**
|
|||
|
|
|
|||
|
|
Wenn Baramundi:
|
|||
|
|
```
|
|||
|
|
POST /api/jobs (Baramundi Management Server)
|
|||
|
|
{
|
|||
|
|
"name": "{{$node[...].json.baramundi_job.name}}",
|
|||
|
|
"parameter": {...}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 5: Email/Reply Node**
|
|||
|
|
|
|||
|
|
Wenn Automatische Antwort:
|
|||
|
|
```
|
|||
|
|
POST /api/v1/conversations/{id}/threads
|
|||
|
|
{
|
|||
|
|
"from": "support@company.com",
|
|||
|
|
"to": "{{customer_email}}",
|
|||
|
|
"subject": "Re: {{subject}}",
|
|||
|
|
"body": "{{antwort_text}}"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 6: Mark as Executed**
|
|||
|
|
|
|||
|
|
Nach Success: Update Custom Field
|
|||
|
|
```
|
|||
|
|
PUT /api/v1/conversations/{id}
|
|||
|
|
{
|
|||
|
|
"custom_fields": {
|
|||
|
|
"AI_SUGGESTION_STATUS": "EXECUTED"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 7: Trigger Workflow C**
|
|||
|
|
|
|||
|
|
Webhook Call zu Workflow C:
|
|||
|
|
```
|
|||
|
|
POST http://n8n:5678/webhook/kb-update
|
|||
|
|
{
|
|||
|
|
"ticket_id": "...",
|
|||
|
|
"status": "EXECUTED"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 8: Exportiere & Teste**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Export Workflow B
|
|||
|
|
# In n8n: Menu → Export
|
|||
|
|
|
|||
|
|
git add n8n-workflows/workflow-b-approval-execution.json
|
|||
|
|
git commit -m "feat: workflow B – approval gate and execution"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 3.2: Workflow C – Knowledge Base Update
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Create: `n8n-workflows/workflow-c-kb-update.json`
|
|||
|
|
|
|||
|
|
**Logik:**
|
|||
|
|
1. Trigger: Webhook von Workflow B
|
|||
|
|
2. Hole Lösungs-Details
|
|||
|
|
3. Generiere Embedding (LLM)
|
|||
|
|
4. Speichere in Milvus
|
|||
|
|
5. Update Häufigkeit bestehender Einträge
|
|||
|
|
6. Log in PostgreSQL
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Webhook Trigger Node**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
POST http://n8n:5678/webhook/kb-update
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Payload:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"ticket_id": "123",
|
|||
|
|
"problem_text": "...",
|
|||
|
|
"kategorie": "Hardware",
|
|||
|
|
"lösung": "Drucker-Treiber neu installiert"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Embedding Generation Node**
|
|||
|
|
|
|||
|
|
LLM Call für Embedding:
|
|||
|
|
```
|
|||
|
|
POST http://llm.eks-ai.apps.asgard.eks-lnx.fft-it.de/v1/embeddings
|
|||
|
|
{
|
|||
|
|
"model": "available",
|
|||
|
|
"input": "Hardware: {{kategorie}} + {{problem_text}}"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Milvus Insert Node**
|
|||
|
|
|
|||
|
|
Python Node:
|
|||
|
|
```python
|
|||
|
|
from pymilvus import Collection
|
|||
|
|
import json
|
|||
|
|
|
|||
|
|
collection = Collection("knowledge_base")
|
|||
|
|
|
|||
|
|
entity = {
|
|||
|
|
"id": uuid4(),
|
|||
|
|
"problem_text": "{{problem_text}}",
|
|||
|
|
"kategorie": "{{kategorie}}",
|
|||
|
|
"lösung": "{{lösung}}",
|
|||
|
|
"häufigkeit": 1,
|
|||
|
|
"embedding": embedding_vector,
|
|||
|
|
"timestamp": datetime.now(),
|
|||
|
|
"freescout_ticket_id": ticket_id
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
collection.insert([entity])
|
|||
|
|
collection.flush()
|
|||
|
|
|
|||
|
|
return {"status": "inserted"}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 4: Update Häufigkeit (Optional)**
|
|||
|
|
|
|||
|
|
Suche ähnliche KB-Einträge und erhöhe deren Häufigkeit:
|
|||
|
|
```python
|
|||
|
|
results = collection.search(
|
|||
|
|
data=[embedding_vector],
|
|||
|
|
limit=5,
|
|||
|
|
threshold=0.85
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
for result in results:
|
|||
|
|
# Update entry
|
|||
|
|
collection.delete(id=result.id)
|
|||
|
|
result.häufigkeit += 1
|
|||
|
|
collection.insert([result])
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 5: PostgreSQL Audit Log Node**
|
|||
|
|
|
|||
|
|
PostgreSQL Node:
|
|||
|
|
```sql
|
|||
|
|
INSERT INTO knowledge_base_updates
|
|||
|
|
(ticket_id, problem_text, kategorie, lösung, status, created_at, approved_at, executed_at)
|
|||
|
|
VALUES
|
|||
|
|
('{{ticket_id}}', '{{problem_text}}', '{{kategorie}}', '{{lösung}}', 'EXECUTED', NOW(), NOW(), NOW())
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 6: Error Handling**
|
|||
|
|
|
|||
|
|
Wenn einer der Steps fehlschlägt:
|
|||
|
|
- Log Error in PostgreSQL
|
|||
|
|
- Notify Admin (optional Email)
|
|||
|
|
- STOP (nicht crashen)
|
|||
|
|
|
|||
|
|
- [ ] **Step 7: Exportiere & Teste**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add n8n-workflows/workflow-c-kb-update.json
|
|||
|
|
git commit -m "feat: workflow C – knowledge base auto-update"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Chunk 4: Integration, Testing & Production
|
|||
|
|
|
|||
|
|
### Task 4.1: End-to-End Testing
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Create: `tests/e2e-test-scenario.md`
|
|||
|
|
- Create: `tests/curl-test-collection.sh`
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Schreibe E2E Test Szenario**
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
# E2E Test: Full Workflow
|
|||
|
|
|
|||
|
|
## Setup
|
|||
|
|
- Milvus läuft
|
|||
|
|
- PostgreSQL läuft
|
|||
|
|
- n8n läuft
|
|||
|
|
- Freescout erreichbar
|
|||
|
|
- LiteLLM erreichbar
|
|||
|
|
|
|||
|
|
## Test Steps
|
|||
|
|
|
|||
|
|
1. **Create Test Ticket in Freescout**
|
|||
|
|
- Subject: "Drucker funktioniert nicht"
|
|||
|
|
- Body: "Jeder Druck-Befehl wird abgelehnt. Fehlercode 5."
|
|||
|
|
- Customer: test@example.com
|
|||
|
|
|
|||
|
|
2. **Warte 5 Min** (Workflow A Cycle)
|
|||
|
|
- Check n8n Logs: Mail verarbeitet?
|
|||
|
|
- Check Freescout: Custom Field AI_SUGGESTION gefüllt?
|
|||
|
|
|
|||
|
|
3. **Approve Vorschlag**
|
|||
|
|
- Freescout: AI_SUGGESTION_STATUS = APPROVED
|
|||
|
|
|
|||
|
|
4. **Warte 2 Min** (Workflow B Cycle)
|
|||
|
|
- Check n8n: Job ausgelöst oder Email gesendet?
|
|||
|
|
- Check Baramundi: Job erstellt?
|
|||
|
|
|
|||
|
|
5. **Warte 1 Min** (Workflow C Cycle)
|
|||
|
|
- Check PostgreSQL: INSERT in knowledge_base_updates?
|
|||
|
|
- Check Milvus: KB-Eintrag erstellt?
|
|||
|
|
|
|||
|
|
6. **Vector DB Search Test**
|
|||
|
|
- Query Milvus mit ähnlichem Problem
|
|||
|
|
- Sollte neuen Eintrag finden mit hoher Similarity
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Schreibe Test Curl Commands**
|
|||
|
|
|
|||
|
|
`tests/curl-test-collection.sh`:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
#!/bin/bash
|
|||
|
|
|
|||
|
|
echo "=== E2E Test Collection ==="
|
|||
|
|
|
|||
|
|
# 1. Check Milvus Health
|
|||
|
|
echo "✓ Testing Milvus..."
|
|||
|
|
curl http://127.0.0.1:9091/healthz
|
|||
|
|
|
|||
|
|
# 2. Check PostgreSQL
|
|||
|
|
echo "✓ Testing PostgreSQL..."
|
|||
|
|
docker-compose exec postgres psql -U kb_user -d n8n_kb -c "SELECT COUNT(*) FROM knowledge_base_updates;"
|
|||
|
|
|
|||
|
|
# 3. Check Freescout API
|
|||
|
|
echo "✓ Testing Freescout API..."
|
|||
|
|
curl -H "Authorization: Bearer $FREESCOUT_API_KEY" \
|
|||
|
|
https://ekshelpdesk.fft-it.de/api/v1/mailboxes/1/conversations?limit=5
|
|||
|
|
|
|||
|
|
# 4. Check LiteLLM
|
|||
|
|
echo "✓ Testing LiteLLM..."
|
|||
|
|
curl -X POST http://llm.eks-ai.apps.asgard.eks-lnx.fft-it.de/v1/chat/completions \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"model": "any",
|
|||
|
|
"messages": [{"role": "user", "content": "test"}]
|
|||
|
|
}'
|
|||
|
|
|
|||
|
|
echo "=== All tests passed ==="
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Führe Tests aus**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
bash tests/curl-test-collection.sh
|
|||
|
|
# Expected: ✓ All tests passed
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 4: Erstelle echtes Test-Ticket in Freescout**
|
|||
|
|
|
|||
|
|
Manuell oder via Freescout UI:
|
|||
|
|
- Subject: "Drucker funktioniert nicht"
|
|||
|
|
- Body: "Fehlercode 5 beim Drucken"
|
|||
|
|
|
|||
|
|
Überwache:
|
|||
|
|
- n8n Logs
|
|||
|
|
- Freescout Custom Fields
|
|||
|
|
- PostgreSQL
|
|||
|
|
|
|||
|
|
- [ ] **Step 5: Commit**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add tests/
|
|||
|
|
git commit -m "test: E2E test scenarios and curl collection"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 4.2: Monitoring & Logging Setup
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Create: `docker-compose.override.yml` (für Logging)
|
|||
|
|
- Create: `docs/MONITORING.md`
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Füge n8n Logging zu Compose hinzu**
|
|||
|
|
|
|||
|
|
`docker-compose.override.yml`:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
services:
|
|||
|
|
n8n:
|
|||
|
|
environment:
|
|||
|
|
- N8N_LOG_LEVEL=debug
|
|||
|
|
- N8N_LOG_OUTPUT=stdout
|
|||
|
|
logging:
|
|||
|
|
driver: "json-file"
|
|||
|
|
options:
|
|||
|
|
max-size: "100m"
|
|||
|
|
max-file: "10"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Erstelle Monitoring Dokumentation**
|
|||
|
|
|
|||
|
|
`docs/MONITORING.md`:
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
# Monitoring & Debugging
|
|||
|
|
|
|||
|
|
## Key Metrics
|
|||
|
|
|
|||
|
|
1. **Mail Processing Rate**
|
|||
|
|
- N8N Logs: "processed X conversations"
|
|||
|
|
- PostgreSQL: `SELECT COUNT(*) FROM workflow_executions WHERE workflow_name='workflow-a'`
|
|||
|
|
|
|||
|
|
2. **Approval Rate**
|
|||
|
|
- PostgreSQL: `SELECT status, COUNT(*) FROM knowledge_base_updates GROUP BY status`
|
|||
|
|
- Expected: Meiste APPROVED
|
|||
|
|
|
|||
|
|
3. **KB Growth**
|
|||
|
|
- Milvus: `SELECT COUNT(*) FROM knowledge_base` (via Python)
|
|||
|
|
- Expected: +1 pro appropierten Ticket
|
|||
|
|
|
|||
|
|
4. **Error Rate**
|
|||
|
|
- PostgreSQL: `SELECT * FROM workflow_executions WHERE status='ERROR'`
|
|||
|
|
- Expected: < 5%
|
|||
|
|
|
|||
|
|
## Troubleshooting
|
|||
|
|
|
|||
|
|
### Workflow A läuft nicht
|
|||
|
|
- Check: Cron trigger aktiv?
|
|||
|
|
- Check: n8n credentials valid?
|
|||
|
|
- Check: Freescout API erreichbar?
|
|||
|
|
|
|||
|
|
### Workflow B triggert nicht
|
|||
|
|
- Check: AI_SUGGESTION_STATUS im Freescout updatet?
|
|||
|
|
- Check: Polling Interval (2 Min)?
|
|||
|
|
|
|||
|
|
### Workflow C speichert nicht in KB
|
|||
|
|
- Check: Milvus läuft?
|
|||
|
|
- Check: Embedding generiert?
|
|||
|
|
|
|||
|
|
## Logs
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# n8n Logs
|
|||
|
|
docker-compose logs -f n8n
|
|||
|
|
|
|||
|
|
# PostgreSQL
|
|||
|
|
docker-compose exec postgres psql -U kb_user -d n8n_kb -c "SELECT * FROM workflow_executions LIMIT 10;"
|
|||
|
|
|
|||
|
|
# Milvus
|
|||
|
|
docker-compose logs -f milvus
|
|||
|
|
```
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Commit**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add docker-compose.override.yml docs/MONITORING.md
|
|||
|
|
git commit -m "infra: logging and monitoring setup"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 4.3: Production Dokumentation & Go-Live Checklist
|
|||
|
|
|
|||
|
|
**Files:**
|
|||
|
|
- Create: `docs/DEPLOYMENT.md`
|
|||
|
|
- Create: `docs/GO-LIVE-CHECKLIST.md`
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Schreibe Deployment Guide**
|
|||
|
|
|
|||
|
|
`docs/DEPLOYMENT.md`:
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
# Deployment Guide
|
|||
|
|
|
|||
|
|
## Prerequisites
|
|||
|
|
|
|||
|
|
- Docker & Docker Compose installed
|
|||
|
|
- Freescout API Key
|
|||
|
|
- Baramundi API Access
|
|||
|
|
- PostgreSQL Backup Strategy
|
|||
|
|
|
|||
|
|
## Deployment Steps
|
|||
|
|
|
|||
|
|
1. Clone Repository
|
|||
|
|
2. Setup .env (siehe .env.example)
|
|||
|
|
3. Run Docker Services: `docker-compose up -d`
|
|||
|
|
4. Run DB Schema: `sql/01-audit-schema.sql`
|
|||
|
|
5. Setup Freescout Custom Fields: `bash scripts/setup-freescout-fields.sh`
|
|||
|
|
6. Import n8n Workflows (manual via n8n UI)
|
|||
|
|
7. Run E2E Tests: `bash tests/curl-test-collection.sh`
|
|||
|
|
8. Enable Workflows (schalte alle 3 Workflows an)
|
|||
|
|
|
|||
|
|
## Monitoring
|
|||
|
|
|
|||
|
|
See docs/MONITORING.md
|
|||
|
|
|
|||
|
|
## Rollback
|
|||
|
|
|
|||
|
|
1. Deaktiviere alle n8n Workflows
|
|||
|
|
2. Lösche PostgreSQL Daten (optional)
|
|||
|
|
3. Setze KB zurück (optional)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Go-Live Checklist**
|
|||
|
|
|
|||
|
|
`docs/GO-LIVE-CHECKLIST.md`:
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
# Go-Live Checklist
|
|||
|
|
|
|||
|
|
## 1 Week Before
|
|||
|
|
|
|||
|
|
- [ ] E2E Tests durchgeführt (alle ✓)
|
|||
|
|
- [ ] Staging Environment getestet
|
|||
|
|
- [ ] Team Training abgeschlossen
|
|||
|
|
- [ ] Backup-Strategie definiert
|
|||
|
|
|
|||
|
|
## Go-Live Day
|
|||
|
|
|
|||
|
|
- [ ] Alle Docker Services laufen
|
|||
|
|
- [ ] All n8n Workflows aktiv
|
|||
|
|
- [ ] Monitoring Dashboard aktiv
|
|||
|
|
- [ ] Backup vor Go-Live
|
|||
|
|
|
|||
|
|
## Während Launch
|
|||
|
|
|
|||
|
|
- [ ] Monitor n8n Logs
|
|||
|
|
- [ ] Monitor Freescout
|
|||
|
|
- [ ] Monitor Baramundi Job Queue
|
|||
|
|
- [ ] Alert System aktiv
|
|||
|
|
|
|||
|
|
## Nach 24h
|
|||
|
|
|
|||
|
|
- [ ] KI-Vorschläge angezeigt?
|
|||
|
|
- [ ] Approvals funktionieren?
|
|||
|
|
- [ ] Jobs werden ausgelöst?
|
|||
|
|
- [ ] KB wächst?
|
|||
|
|
|
|||
|
|
## Nach 1 Woche
|
|||
|
|
|
|||
|
|
- [ ] Statistiken: Wie viele Mails verarbeitet?
|
|||
|
|
- [ ] Wie viele Approvals?
|
|||
|
|
- [ ] Wie viele Baramundi Jobs?
|
|||
|
|
- [ ] Feedback vom Team sammeln
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Commit**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add docs/DEPLOYMENT.md docs/GO-LIVE-CHECKLIST.md
|
|||
|
|
git commit -m "docs: deployment and go-live documentation"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### Task 4.4: Final Testing & Acceptance
|
|||
|
|
|
|||
|
|
- [ ] **Step 1: Führe alle E2E Tests durch**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
bash tests/curl-test-collection.sh
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- [ ] **Step 2: Teste mit echtem Ticket (Staging)**
|
|||
|
|
|
|||
|
|
Erstelle Test-Ticket in Freescout:
|
|||
|
|
- Subject: "Test: Drucker funktioniert nicht"
|
|||
|
|
- Body: "Fehlercode 5"
|
|||
|
|
|
|||
|
|
Überwache 15 Min:
|
|||
|
|
- Mail analysiert?
|
|||
|
|
- KI-Vorschlag angezeigt?
|
|||
|
|
- Approve Vorschlag
|
|||
|
|
- Job ausgelöst oder Email gesendet?
|
|||
|
|
- KB aktualisiert?
|
|||
|
|
|
|||
|
|
- [ ] **Step 3: Dokumentiere Ergebnisse**
|
|||
|
|
|
|||
|
|
Wenn alles ✓: Go-Live bereit!
|
|||
|
|
|
|||
|
|
- [ ] **Step 4: Final Commit**
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
git add .
|
|||
|
|
git commit -m "feat: AI-support-automation MVP complete and tested"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Summary
|
|||
|
|
|
|||
|
|
✅ **Phase 1:** Milvus + PostgreSQL + Freescout Custom Fields
|
|||
|
|
✅ **Phase 2:** Workflow A (Mail Processing) + Workflow B (Approval) + Workflow C (KB Update)
|
|||
|
|
✅ **Phase 3:** E2E Testing + Monitoring
|
|||
|
|
✅ **Phase 4:** Production Ready
|
|||
|
|
|
|||
|
|
**Status:** Bereit für Implementation via `superpowers:subagent-driven-development` oder `superpowers:executing-plans`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Next Steps
|
|||
|
|
|
|||
|
|
🚀 **Sollen wir starten?**
|
|||
|
|
- Wenn ja: Nutze `superpowers:executing-plans` um den Plan zu implementieren
|
|||
|
|
- Wenn nein: Änderungen an Plan vornehmen
|