Protokoll #2549
| ID | 2549 |
|---|---|
| Zeitstempel | 2025-12-21 23:10:40.468627 |
| Client | root |
| IP | Warning: Undefined array key "request_ip" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 Deprecated: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 13 |
| Modell | claude-sonnet-4-20250514 |
| Status | completed |
| Tokens | 1,649 (Input: 0, Output: 0) |
| Dauer | 76 ms |
| Request-Zeit | Warning: Undefined array key "request_timestamp" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 18 |
| Response-Zeit | - |
Warning: Undefined array key "error_message" in /var/www/dev.campus.systemische-tools.de/src/View/protokoll/show.php on line 22
Request
{
"event": "PreToolUse",
"tool_name": "mcp__mcp-docs__docs_get",
"tool_input": {
"id": 52
}
}
Response
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"doc\": {\n \"id\": 52,\n \"parent_id\": 51,\n \"slug\": \"chat\",\n \"path\": \"\/api\/chat\",\n \"title\": \"Chat-API\",\n \"description\": \"RAG-basierter Chat mit Vektorsuche und LLM-Integration. Verwendet lokale Embeddings (Ollama), Vektorsuche (Qdrant) und Claude (Anthropic) oder Ollama als LLM.\",\n \"content\": \"<nav class=\\\"breadcrumb\\\">\\n <a href=\\\"\/docs\\\">Dokumentation<\/a> » <a href=\\\"\/docs\/api\\\">API<\/a> » Chat\\n<\/nav>\\n\\n<h1>Chat API<\/h1>\\n<p>RAG-basierter Chat mit Vektorsuche und LLM-Integration. Verwendet lokale Embeddings (Ollama), Vektorsuche (Qdrant) und Claude (Anthropic) oder Ollama als LLM.<\/p>\\n\\n<table>\\n <tr><th>Endpunkt (HTML)<\/th><td>POST \/chat\/message<\/td><\/tr>\\n <tr><th>Endpunkt (JSON)<\/th><td>POST \/api\/v1\/chat<\/td><\/tr>\\n <tr><th>Controller<\/th><td>\/src\/Controller\/ChatController.php<\/td><\/tr>\\n <tr><th>Service<\/th><td>\/src\/Infrastructure\/AI\/ChatService.php<\/td><\/tr>\\n<\/table>\\n\\n<h2>Request<\/h2>\\n<pre><code>POST \/api\/v1\/chat\\nContent-Type: application\/json\\n\\n{\\n \\\"question\\\": \\\"Was ist systemische Therapie?\\\",\\n \\\"model\\\": \\\"anthropic\\\",\\n \\\"collection\\\": \\\"documents\\\",\\n \\\"limit\\\": 5\\n}<\/code><\/pre>\\n\\n<table>\\n <tr><th>Parameter<\/th><th>Typ<\/th><th>Default<\/th><th>Beschreibung<\/th><\/tr>\\n <tr><td>question<\/td><td>string<\/td><td>required<\/td><td>Benutzer-Frage<\/td><\/tr>\\n <tr><td>model<\/td><td>string<\/td><td>\\\"anthropic\\\"<\/td><td>\\\"anthropic\\\" (claude-opus-4-5-20251101) oder \\\"ollama\\\" (gemma3:4b-it-qat)<\/td><\/tr>\\n <tr><td>collection<\/td><td>string<\/td><td>\\\"documents\\\"<\/td><td>Qdrant Collection<\/td><\/tr>\\n <tr><td>limit<\/td><td>int<\/td><td>5<\/td><td>Max. Kontext-Chunks<\/td><\/tr>\\n<\/table>\\n\\n<h2>Response<\/h2>\\n<pre><code>{\\n \\\"answer\\\": \\\"Systemische Therapie ist ein psychotherapeutischer Ansatz...\\\",\\n \\\"sources\\\": [\\n {\\n \\\"title\\\": \\\"Einführung in die systemische Therapie\\\",\\n \\\"content\\\": \\\"...\\\",\\n \\\"score\\\": 0.89,\\n \\\"path\\\": \\\"\/Documents\/therapie\/einfuehrung.pdf\\\"\\n }\\n ],\\n \\\"model\\\": \\\"claude-opus-4-5-20251101\\\",\\n \\\"tokens\\\": 1234\\n}<\/code><\/pre>\\n\\n<h2>RAG-Pipeline<\/h2>\\n<p>Die Chat-Funktionalität nutzt native PHP-Services (keine Python-Aufrufe mehr):<\/p>\\n<pre><code>1. Embedding erstellen (OllamaService)\\n question → mxbai-embed-large → [1024-dim vector]\\n\\n2. Vektorsuche (QdrantService)\\n vector → Qdrant :6333 → top-k similar chunks\\n\\n3. Kontext aufbauen (ChatService)\\n chunks → formatierter Kontext mit Quellenangaben\\n max. 3000 tokens (~12000 chars)\\n\\n4. LLM-Anfrage (ClaudeService oder OllamaService)\\n system_prompt + rag_prompt + context → answer\\n\\n5. Quellen extrahieren (ChatService)\\n search_results → deduplizierte Quellen-Liste\\n\\n6. Response zusammenstellen (ChatService)\\n answer + sources + metadata + usage<\/code><\/pre>\\n\\n<h2>Architektur<\/h2>\\n<pre><code>Browser\/Client\\n ↓\\nChatController (\/src\/Controller\/)\\n ↓\\nChatService (\/src\/Infrastructure\/AI\/)\\n ↓\\n┌──────────────────┬──────────────────┬──────────────────┐\\n│ OllamaService │ QdrantService │ ClaudeService │\\n│ (Embeddings) │ (Vektorsuche) │ (LLM) │\\n└──────────────────┴──────────────────┴──────────────────┘\\n ↓ ↓ ↓\\n┌──────────────────┬──────────────────┬──────────────────┐\\n│ Ollama API │ Qdrant API │ Anthropic API │\\n│ :11434 │ :6333 │ api.anthropic... │\\n└──────────────────┴──────────────────┴──────────────────┘\\n\\nMigration: Python shell_exec → Native PHP (2025-12-20)\\nStatus: Produktiv<\/code><\/pre>\\n\\n<h2>Fehlerbehandlung<\/h2>\\n<table>\\n <tr><th>HTTP Code<\/th><th>Bedeutung<\/th><\/tr>\\n <tr><td>400<\/td><td>Fehlende oder ungültige Parameter<\/td><\/tr>\\n <tr><td>500<\/td><td>Service-Fehler (Ollama, Qdrant, Claude)<\/td><\/tr>\\n <tr><td>503<\/td><td>Service nicht verfügbar<\/td><\/tr>\\n<\/table>\\n\\n<h3>Exception-Handling<\/h3>\\n<p>Alle Services werfen RuntimeException bei Fehlern:<\/p>\\n<pre><code>try {\\n $config = AIConfig::fromCredentialsFile();\\n $chat = $config->createChatService();\\n $result = $chat->chat($question);\\n} catch (RuntimeException $e) {\\n \/\/ Fehler-Logging\\n error_log('Chat failed: ' . $e->getMessage());\\n\\n \/\/ JSON Response\\n http_response_code(500);\\n echo json_encode([\\n 'error' => 'Chat request failed',\\n 'message' => $e->getMessage()\\n ]);\\n}<\/code><\/pre>\\n\\n<h3>Typische Fehler<\/h3>\\n<table>\\n <tr><th>Fehler<\/th><th>Ursache<\/th><th>Lösung<\/th><\/tr>\\n <tr><td>Embedding generation failed<\/td><td>Ollama nicht erreichbar<\/td><td>systemctl status ollama prüfen<\/td><\/tr>\\n <tr><td>Vector search failed<\/td><td>Qdrant nicht erreichbar<\/td><td>systemctl status qdrant prüfen<\/td><\/tr>\\n <tr><td>No relevant documents found<\/td><td>Keine Treffer in Collection<\/td><td>Collection prüfen, limit erhöhen<\/td><\/tr>\\n <tr><td>Claude API request failed<\/td><td>API-Key ungültig, Rate-Limit<\/td><td>credentials.md prüfen, warten<\/td><\/tr>\\n<\/table>\\n\\n<h2>HTMX-Integration<\/h2>\\n<pre><code><form hx-post=\\\"\/chat\/message\\\" hx-target=\\\"#chat-messages\\\" hx-swap=\\\"beforeend\\\">\\n <select name=\\\"model\\\" id=\\\"chat-model\\\">\\n <option value=\\\"anthropic\\\">claude-opus-4-5-20251101<\/option>\\n <option value=\\\"ollama\\\">gemma3:4b-it-qat (lokal)<\/option>\\n <\/select>\\n <input type=\\\"text\\\" name=\\\"message\\\" placeholder=\\\"Frage stellen...\\\">\\n <button type=\\\"submit\\\">Senden<\/button>\\n<\/form>\\n\\n<div id=\\\"chat-messages\\\"><\/div><\/code><\/pre>\\n\\n<h3>Model-Persistenz<\/h3>\\n<p>Die Modell-Auswahl wird im localStorage gespeichert und beim Seitenaufruf wiederhergestellt:<\/p>\\n<pre><code>\/\/ Speichern\\nlocalStorage.setItem('chat-model-preference', model);\\n\\n\/\/ Laden\\nconst saved = localStorage.getItem('chat-model-preference');<\/code><\/pre>\",\n \"status\": \"published\",\n \"sort_order\": 1,\n \"depth\": 1,\n \"created_at\": \"2025-12-20T11:13:58\",\n \"updated_at\": \"2025-12-20T11:13:58\"\n }\n}"
}
]
}