Protokoll #27831

ID27831
Zeitstempel2025-12-28 12:25:40.780715
Clientroot
IP145.224.72.140
Modellclaude-sonnet-4-20250514
Statuscompleted
Tokens3,997 (Input: 1,884, Output: 2,113)
Dauer471 ms
Request-Zeit2025-12-28 12:25:40.780715
Response-Zeit2025-12-28 12:25:41.252044

Request

{
    "event": "PreToolUse",
    "tool_name": "mcp__mcp-tasks__tasks_create",
    "tool_input": {
        "title": "Hardcodierte Model-Werte in Pipeline entfernen",
        "description": "# Hardcodierte Model-Werte in Pipeline entfernen\n\n## Status: Zur Prüfung durch externe Supervision\n\n---\n\n## 1. PROBLEM-BESCHREIBUNG\n\nDie Python-Pipeline (`\/var\/www\/scripts\/pipeline\/`) hat hardcodierte LLM-Modellnamen, die die zentrale Konfiguration in `pipeline_steps.config` (Datenbank) umgehen.\n\n### Symptom\n- Änderung des Modells in der GUI\/DB hat keine Wirkung\n- Code verwendet Fallback-Werte statt DB-Konfiguration\n\n### Root Cause\nHardcodierte Fallback-Werte in Python-Dateien:\n```python\n# Beispiel aus step_semantic_extended.py:126\nmodel = config.get(\"model\", \"mistral\")  # ← Fallback \"mistral\"\n```\n\n---\n\n## 2. IST-ZUSTAND: Betroffene Dateien\n\n### 2.1 KRITISCH: Pipeline-Kernlogik\n\n| Datei | Zeile | Code | Auswirkung |\n|-------|-------|------|------------|\n| `pipeline.py` | 242 | `{\"model\": \"mistral\"}` | Text-Semantik ignoriert DB |\n| `pipeline.py` | 286 | `{\"model\": \"mistral\"}` | Knowledge-Semantik ignoriert DB |\n| `pipeline.py` | 557 | `model = \"mistral:latest\"` | Entity-Enrichment ignoriert DB |\n| `step_semantic_extended.py` | 126 | `config.get(\"model\", \"mistral\")` | Fallback statt Exception |\n| `step_semantic_extended.py` | 286 | `config.get(\"model\", \"mistral\")` | Fallback statt Exception |\n| `step_entity_enrich.py` | 20 | `DEFAULT_MODEL = \"mistral:latest\"` | Konstante statt DB |\n\n### 2.2 MITTEL: Standalone-Scripts\n\n| Datei | Zeile | Code | Auswirkung |\n|-------|-------|------|------------|\n| `generate_entity_descriptions.py` | 30 | `DEFAULT_MODEL = \"mistral:latest\"` | Standalone-Script |\n| `generate_semantics.py` | 14 | `MODEL = \"gemma3:27b-it-qat\"` | Standalone-Script |\n\n### 2.3 BEREITS KORREKT (Reference)\n\n| Datei | Implementierung |\n|-------|----------------|\n| `backfill_text_semantics.py` | `get_pipeline_model(\"text_semantic_analyze\")` ✅ |\n| `backfill_knowledge_semantics.py` | `get_pipeline_model(\"knowledge_semantic_analyze\")` ✅ |\n\n---\n\n## 3. SOLL-ZUSTAND: Datenbank-Konfiguration\n\n### 3.1 Aktuelle DB-Konfiguration (ki_content.pipeline_steps)\n\n| step_type | model_in_config |\n|-----------|-----------------|\n| text_semantic_analyze | \"mistral\" |\n| knowledge_semantic_analyze | \"mistral\" |\n| entity_extract | \"mistral\" |\n| relation_extract | \"mistral\" |\n| ontology_classify | \"mistral\" |\n| taxonomy_build | \"gemma3:27b-it-qat\" |\n| vision | \"minicpm-v:latest\" |\n| embed | \"nomic-embed-text\" |\n\n### 3.2 Ziel-Architektur\n\n```\n┌─────────────────────┐\n│  GUI \/ PHP-Backend  │\n└──────────┬──────────┘\n           │ UPDATE pipeline_steps SET config = ...\n           ▼\n┌─────────────────────┐\n│ ki_content.pipeline_steps │\n│ (Single Source of Truth)  │\n└──────────┬──────────┘\n           │ get_pipeline_model(step_type)\n           ▼\n┌─────────────────────┐\n│   Python Pipeline   │\n│ (Kein Hardcoding!)  │\n└─────────────────────┘\n```\n\n---\n\n## 4. LÖSUNGSANSATZ\n\n### 4.1 Zentrales Modul erstellen: `pipeline_config.py`\n\n```python\n\"\"\"Zentrale Pipeline-Konfiguration aus DB.\"\"\"\n\nfrom db import db\n\nclass PipelineConfigError(Exception):\n    \"\"\"Fehler wenn Config fehlt - KEIN stilles Fallback!\"\"\"\n    pass\n\ndef get_step_model(step_type: str, pipeline_id: int = 5) -> str:\n    \"\"\"\n    Liest Model aus pipeline_steps.config.\n    \n    WICHTIG: Wirft Exception wenn nicht konfiguriert!\n    Kein stilles Fallback auf hardcodierte Werte.\n    \"\"\"\n    cursor = db.execute(\n        \"\"\"SELECT JSON_UNQUOTE(JSON_EXTRACT(config, '$.model')) as model\n           FROM pipeline_steps\n           WHERE pipeline_id = %s AND step_type = %s AND enabled = 1\"\"\",\n        (pipeline_id, step_type)\n    )\n    row = cursor.fetchone()\n    cursor.close()\n    \n    if not row or not row.get(\"model\"):\n        raise PipelineConfigError(\n            f\"Kein Model konfiguriert für step_type='{step_type}' \"\n            f\"in pipeline_id={pipeline_id}. \"\n            f\"Bitte in pipeline_steps.config setzen!\"\n        )\n    \n    return row[\"model\"]\n```\n\n### 4.2 Änderungen pro Datei\n\n**pipeline.py:242**\n```python\n# ALT:\nanalyzed_chunks = text_semantic_analyze.execute(chunk_data, {\"model\": \"mistral\"})\n\n# NEU:\nfrom pipeline_config import get_step_model\nmodel = get_step_model(\"text_semantic_analyze\")\nanalyzed_chunks = text_semantic_analyze.execute(chunk_data, {\"model\": model})\n```\n\n**step_semantic_extended.py:126**\n```python\n# ALT:\nmodel = config.get(\"model\", \"mistral\")\n\n# NEU:\nmodel = config.get(\"model\")\nif not model:\n    raise ValueError(\"Model muss in config übergeben werden!\")\n```\n\n---\n\n## 5. IMPACT-ANALYSE\n\n### 5.1 Betroffene Klassen (MCP-Code Analyse)\n\n| Klasse | Datei | Abhängigkeiten |\n|--------|-------|----------------|\n| `SemanticChunkPipeline` | pipeline.py | Zentraler Einstiegspunkt |\n| `TextSemanticAnalyzeStep` | step_semantic_extended.py | Von Pipeline aufgerufen |\n| `KnowledgeSemanticAnalyzeStep` | step_semantic_extended.py | Von Pipeline aufgerufen |\n| `EntityEnrichStep` | step_entity_enrich.py | CLI-Command |\n\n### 5.2 Aufrufpfade\n\n```\nContentPipelineController.php\n  └── RunPipelineUseCase.php\n       └── subprocess: python pipeline.py process <doc_id>\n            └── SemanticChunkPipeline.process_document()\n                 ├── text_semantic_analyze.execute()  ← HIER\n                 └── knowledge_semantic_analyze.execute()  ← HIER\n```\n\n### 5.3 Risiko-Bewertung\n\n| Risiko | Bewertung | Mitigation |\n|--------|-----------|------------|\n| Pipeline-Ausfall bei fehlendem Config | MITTEL | Exception mit klarer Fehlermeldung |\n| Bestehende DB-Config falsch | NIEDRIG | Bereits \"mistral\" konfiguriert |\n| Breaking Change für CLI-Scripts | NIEDRIG | --model Parameter bleibt als Override |\n\n---\n\n## 6. TEST-PLAN\n\n### 6.1 Unit-Tests\n- [ ] `get_step_model()` wirft Exception bei fehlendem Config\n- [ ] `get_step_model()` gibt korrekten Wert aus DB zurück\n\n### 6.2 Integration-Tests\n- [ ] Pipeline-Run mit DB-Config \"mistral\" → verwendet mistral\n- [ ] Pipeline-Run nach DB-Update auf \"gemma3:27b-it-qat\" → verwendet gemma\n\n### 6.3 Manuelle Tests\n- [ ] GUI: Model ändern → Pipeline verwendet neues Model\n- [ ] CLI: `python pipeline.py process 1` ohne Fehler\n\n---\n\n## 7. DATEIEN ZUR ÄNDERUNG\n\n| Datei | Aktion | Zeilen |\n|-------|--------|--------|\n| `pipeline_config.py` | NEU ERSTELLEN | - |\n| `pipeline.py` | ÄNDERN | 242, 286, 557 |\n| `step_semantic_extended.py` | ÄNDERN | 126, 286 |\n| `step_entity_enrich.py` | ÄNDERN | 20 |\n| `generate_entity_descriptions.py` | ÄNDERN | 30 |\n| `generate_semantics.py` | ÄNDERN | 14 |\n\n---\n\n## 8. ABHÄNGIGKEITEN\n\n- Hook-System (PP1.1) blockiert jetzt hardcodierte Model-Werte ✅\n- `json_utils.py` für robuste LLM-Response-Verarbeitung ✅\n- DB-Schema `pipeline_steps.config` bereits vorhanden ✅\n\n---\n\n## 9. ROLLBACK-PLAN\n\nBei Problemen:\n1. Alte Dateien aus Backup wiederherstellen\n2. Hardcodierte Werte sind funktional (nur nicht konfigurierbar)\n\n---\n\n## 10. GENEHMIGUNG\n\n**Angefordert**: Externe Supervision zur Prüfung vor Implementierung\n\n**Fragen an Supervisor**:\n1. Soll Exception geworfen werden oder Fallback mit Warning?\n2. Sollen alle Standalone-Scripts ebenfalls umgestellt werden?\n3. Gewünschtes Default-Model für DB-Update: \"gemma3:27b-it-qat\"?",
        "type": "ai_task"
    }
}

Response

{
    "tool_response": [
        {
            "type": "text",
            "text": "{\n  \"success\": true,\n  \"task\": {\n    \"id\": 516,\n    \"uuid\": \"e293c47c-ebe7-48d0-97cc-1890e4805a60\",\n    \"title\": \"Hardcodierte Model-Werte in Pipeline entfernen\",\n    \"description\": \"# Hardcodierte Model-Werte in Pipeline entfernen\\n\\n## Status: Zur Prüfung durch externe Supervision\\n\\n---\\n\\n## 1. PROBLEM-BESCHREIBUNG\\n\\nDie Python-Pipeline (`\/var\/www\/scripts\/pipeline\/`) hat hardcodierte LLM-Modellnamen, die die zentrale Konfiguration in `pipeline_steps.config` (Datenbank) umgehen.\\n\\n### Symptom\\n- Änderung des Modells in der GUI\/DB hat keine Wirkung\\n- Code verwendet Fallback-Werte statt DB-Konfiguration\\n\\n### Root Cause\\nHardcodierte Fallback-Werte in Python-Dateien:\\n```python\\n# Beispiel aus step_semantic_extended.py:126\\nmodel = config.get(\\\"model\\\", \\\"mistral\\\")  # ← Fallback \\\"mistral\\\"\\n```\\n\\n---\\n\\n## 2. IST-ZUSTAND: Betroffene Dateien\\n\\n### 2.1 KRITISCH: Pipeline-Kernlogik\\n\\n| Datei | Zeile | Code | Auswirkung |\\n|-------|-------|------|------------|\\n| `pipeline.py` | 242 | `{\\\"model\\\": \\\"mistral\\\"}` | Text-Semantik ignoriert DB |\\n| `pipeline.py` | 286 | `{\\\"model\\\": \\\"mistral\\\"}` | Knowledge-Semantik ignoriert DB |\\n| `pipeline.py` | 557 | `model = \\\"mistral:latest\\\"` | Entity-Enrichment ignoriert DB |\\n| `step_semantic_extended.py` | 126 | `config.get(\\\"model\\\", \\\"mistral\\\")` | Fallback statt Exception |\\n| `step_semantic_extended.py` | 286 | `config.get(\\\"model\\\", \\\"mistral\\\")` | Fallback statt Exception |\\n| `step_entity_enrich.py` | 20 | `DEFAULT_MODEL = \\\"mistral:latest\\\"` | Konstante statt DB |\\n\\n### 2.2 MITTEL: Standalone-Scripts\\n\\n| Datei | Zeile | Code | Auswirkung |\\n|-------|-------|------|------------|\\n| `generate_entity_descriptions.py` | 30 | `DEFAULT_MODEL = \\\"mistral:latest\\\"` | Standalone-Script |\\n| `generate_semantics.py` | 14 | `MODEL = \\\"gemma3:27b-it-qat\\\"` | Standalone-Script |\\n\\n### 2.3 BEREITS KORREKT (Reference)\\n\\n| Datei | Implementierung |\\n|-------|----------------|\\n| `backfill_text_semantics.py` | `get_pipeline_model(\\\"text_semantic_analyze\\\")` ✅ |\\n| `backfill_knowledge_semantics.py` | `get_pipeline_model(\\\"knowledge_semantic_analyze\\\")` ✅ |\\n\\n---\\n\\n## 3. SOLL-ZUSTAND: Datenbank-Konfiguration\\n\\n### 3.1 Aktuelle DB-Konfiguration (ki_content.pipeline_steps)\\n\\n| step_type | model_in_config |\\n|-----------|-----------------|\\n| text_semantic_analyze | \\\"mistral\\\" |\\n| knowledge_semantic_analyze | \\\"mistral\\\" |\\n| entity_extract | \\\"mistral\\\" |\\n| relation_extract | \\\"mistral\\\" |\\n| ontology_classify | \\\"mistral\\\" |\\n| taxonomy_build | \\\"gemma3:27b-it-qat\\\" |\\n| vision | \\\"minicpm-v:latest\\\" |\\n| embed | \\\"nomic-embed-text\\\" |\\n\\n### 3.2 Ziel-Architektur\\n\\n```\\n┌─────────────────────┐\\n│  GUI \/ PHP-Backend  │\\n└──────────┬──────────┘\\n           │ UPDATE pipeline_steps SET config = ...\\n           ▼\\n┌─────────────────────┐\\n│ ki_content.pipeline_steps │\\n│ (Single Source of Truth)  │\\n└──────────┬──────────┘\\n           │ get_pipeline_model(step_type)\\n           ▼\\n┌─────────────────────┐\\n│   Python Pipeline   │\\n│ (Kein Hardcoding!)  │\\n└─────────────────────┘\\n```\\n\\n---\\n\\n## 4. LÖSUNGSANSATZ\\n\\n### 4.1 Zentrales Modul erstellen: `pipeline_config.py`\\n\\n```python\\n\\\"\\\"\\\"Zentrale Pipeline-Konfiguration aus DB.\\\"\\\"\\\"\\n\\nfrom db import db\\n\\nclass PipelineConfigError(Exception):\\n    \\\"\\\"\\\"Fehler wenn Config fehlt - KEIN stilles Fallback!\\\"\\\"\\\"\\n    pass\\n\\ndef get_step_model(step_type: str, pipeline_id: int = 5) -> str:\\n    \\\"\\\"\\\"\\n    Liest Model aus pipeline_steps.config.\\n    \\n    WICHTIG: Wirft Exception wenn nicht konfiguriert!\\n    Kein stilles Fallback auf hardcodierte Werte.\\n    \\\"\\\"\\\"\\n    cursor = db.execute(\\n        \\\"\\\"\\\"SELECT JSON_UNQUOTE(JSON_EXTRACT(config, '$.model')) as model\\n           FROM pipeline_steps\\n           WHERE pipeline_id = %s AND step_type = %s AND enabled = 1\\\"\\\"\\\",\\n        (pipeline_id, step_type)\\n    )\\n    row = cursor.fetchone()\\n    cursor.close()\\n    \\n    if not row or not row.get(\\\"model\\\"):\\n        raise PipelineConfigError(\\n            f\\\"Kein Model konfiguriert für step_type='{step_type}' \\\"\\n            f\\\"in pipeline_id={pipeline_id}. \\\"\\n            f\\\"Bitte in pipeline_steps.config setzen!\\\"\\n        )\\n    \\n    return row[\\\"model\\\"]\\n```\\n\\n### 4.2 Änderungen pro Datei\\n\\n**pipeline.py:242**\\n```python\\n# ALT:\\nanalyzed_chunks = text_semantic_analyze.execute(chunk_data, {\\\"model\\\": \\\"mistral\\\"})\\n\\n# NEU:\\nfrom pipeline_config import get_step_model\\nmodel = get_step_model(\\\"text_semantic_analyze\\\")\\nanalyzed_chunks = text_semantic_analyze.execute(chunk_data, {\\\"model\\\": model})\\n```\\n\\n**step_semantic_extended.py:126**\\n```python\\n# ALT:\\nmodel = config.get(\\\"model\\\", \\\"mistral\\\")\\n\\n# NEU:\\nmodel = config.get(\\\"model\\\")\\nif not model:\\n    raise ValueError(\\\"Model muss in config übergeben werden!\\\")\\n```\\n\\n---\\n\\n## 5. IMPACT-ANALYSE\\n\\n### 5.1 Betroffene Klassen (MCP-Code Analyse)\\n\\n| Klasse | Datei | Abhängigkeiten |\\n|--------|-------|----------------|\\n| `SemanticChunkPipeline` | pipeline.py | Zentraler Einstiegspunkt |\\n| `TextSemanticAnalyzeStep` | step_semantic_extended.py | Von Pipeline aufgerufen |\\n| `KnowledgeSemanticAnalyzeStep` | step_semantic_extended.py | Von Pipeline aufgerufen |\\n| `EntityEnrichStep` | step_entity_enrich.py | CLI-Command |\\n\\n### 5.2 Aufrufpfade\\n\\n```\\nContentPipelineController.php\\n  └── RunPipelineUseCase.php\\n       └── subprocess: python pipeline.py process <doc_id>\\n            └── SemanticChunkPipeline.process_document()\\n                 ├── text_semantic_analyze.execute()  ← HIER\\n                 └── knowledge_semantic_analyze.execute()  ← HIER\\n```\\n\\n### 5.3 Risiko-Bewertung\\n\\n| Risiko | Bewertung | Mitigation |\\n|--------|-----------|------------|\\n| Pipeline-Ausfall bei fehlendem Config | MITTEL | Exception mit klarer Fehlermeldung |\\n| Bestehende DB-Config falsch | NIEDRIG | Bereits \\\"mistral\\\" konfiguriert |\\n| Breaking Change für CLI-Scripts | NIEDRIG | --model Parameter bleibt als Override |\\n\\n---\\n\\n## 6. TEST-PLAN\\n\\n### 6.1 Unit-Tests\\n- [ ] `get_step_model()` wirft Exception bei fehlendem Config\\n- [ ] `get_step_model()` gibt korrekten Wert aus DB zurück\\n\\n### 6.2 Integration-Tests\\n- [ ] Pipeline-Run mit DB-Config \\\"mistral\\\" → verwendet mistral\\n- [ ] Pipeline-Run nach DB-Update auf \\\"gemma3:27b-it-qat\\\" → verwendet gemma\\n\\n### 6.3 Manuelle Tests\\n- [ ] GUI: Model ändern → Pipeline verwendet neues Model\\n- [ ] CLI: `python pipeline.py process 1` ohne Fehler\\n\\n---\\n\\n## 7. DATEIEN ZUR ÄNDERUNG\\n\\n| Datei | Aktion | Zeilen |\\n|-------|--------|--------|\\n| `pipeline_config.py` | NEU ERSTELLEN | - |\\n| `pipeline.py` | ÄNDERN | 242, 286, 557 |\\n| `step_semantic_extended.py` | ÄNDERN | 126, 286 |\\n| `step_entity_enrich.py` | ÄNDERN | 20 |\\n| `generate_entity_descriptions.py` | ÄNDERN | 30 |\\n| `generate_semantics.py` | ÄNDERN | 14 |\\n\\n---\\n\\n## 8. ABHÄNGIGKEITEN\\n\\n- Hook-System (PP1.1) blockiert jetzt hardcodierte Model-Werte ✅\\n- `json_utils.py` für robuste LLM-Response-Verarbeitung ✅\\n- DB-Schema `pipeline_steps.config` bereits vorhanden ✅\\n\\n---\\n\\n## 9. ROLLBACK-PLAN\\n\\nBei Problemen:\\n1. Alte Dateien aus Backup wiederherstellen\\n2. Hardcodierte Werte sind funktional (nur nicht konfigurierbar)\\n\\n---\\n\\n## 10. GENEHMIGUNG\\n\\n**Angefordert**: Externe Supervision zur Prüfung vor Implementierung\\n\\n**Fragen an Supervisor**:\\n1. Soll Exception geworfen werden oder Fallback mit Warning?\\n2. Sollen alle Standalone-Scripts ebenfalls umgestellt werden?\\n3. Gewünschtes Default-Model für DB-Update: \\\"gemma3:27b-it-qat\\\"?\",\n    \"type\": \"ai_task\",\n    \"status\": \"pending\",\n    \"created_by\": \"mcp-tasks\",\n    \"created_by_type\": \"ai\",\n    \"parent_task_id\": null,\n    \"due_date\": null,\n    \"created_at\": \"2025-12-28T12:25:40.981298\",\n    \"updated_at\": \"2025-12-28T12:25:40.981299\",\n    \"completed_at\": null,\n    \"metadata\": {}\n  },\n  \"message\": \"Task #516 created\"\n}"
        }
    ]
}
← Vorheriger Zur Liste Nächster →