{
"event": "PreToolUse",
"tool_name": "Bash",
"tool_input": {
"command": "source \/var\/www\/dev.campus.systemische-tools.de\/.env && export DB_PASSWORD=\"$MARIADB_ROOT_PASSWORD\" && .\/venv\/bin\/python -c \"\nimport json\nimport time\nimport requests\nfrom db import db\n\nOLLAMA_HOST = 'http:\/\/localhost:11434'\nMODEL = 'gemma3:27b-it-qat'\n\ndef run_ollama(prompt, timeout=300):\n start = time.time()\n try:\n response = requests.post(\n f'{OLLAMA_HOST}\/api\/generate',\n json={\n 'model': MODEL,\n 'prompt': prompt,\n 'stream': False,\n 'format': 'json',\n 'options': {'temperature': 0.3, 'num_predict': 2000}\n },\n timeout=timeout,\n )\n response.raise_for_status()\n data = response.json()\n elapsed = time.time() - start\n return {\n 'response': data.get('response', ''),\n 'tokens': data.get('eval_count', 0),\n 'duration_ms': elapsed * 1000,\n 'success': True\n }\n except Exception as e:\n return {'response': '', 'error': str(e), 'success': False, 'duration_ms': (time.time() - start) * 1000}\n\n# Get document content\ndb.connect()\ncursor = db.execute(\n '''SELECT c.content FROM chunks c\n WHERE c.document_id = 2\n ORDER BY c.chunk_index''',\n ()\n)\nchunks = cursor.fetchall()\ncursor.close()\ndb.disconnect()\n\nfull_text = '\\n\\n'.join([c['content'] for c in chunks])\n\n# Test 2: Taxonomy Classification\nprint('[2\/3] Taxonomy Classification...')\nprompt2 = f'''Klassifiziere den folgenden Text in passende Kategorien.\n\nWähle aus diesen Hauptkategorien:\n- Methoden (Therapiemethoden, Coaching-Techniken)\n- Theorie (Konzepte, Modelle, Grundlagen)\n- Praxis (Anwendung, Fallbeispiele, Übungen)\n- Organisation (Strukturen, Prozesse, Rollen)\n- Kommunikation (Gesprächsführung, Interaktion)\n- Entwicklung (Persönliche Entwicklung, Veränderung)\n- Teamarbeit (Teamdynamik, Zusammenarbeit)\n\nAntworte NUR im JSON-Format:\n{{\\\"categories\\\": [\\\"...\\\", \\\"...\\\"], \\\"confidence\\\": 0.0-1.0, \\\"reasoning\\\": \\\"kurze Begründung\\\"}}\n\nText:\n{full_text[:2500]}'''\n\nresult2 = run_ollama(prompt2)\nprint(f' Duration: {result2[\\\"duration_ms\\\"]:.0f}ms')\nprint(f' Tokens: {result2.get(\\\"tokens\\\", \\\"?\\\")}')\nif result2['success']:\n try:\n import re\n json_match = re.search(r'\\{[\\s\\S]*\\}', result2['response'])\n if json_match:\n data = json.loads(json_match.group())\n categories = data.get('categories', [])\n confidence = data.get('confidence', 0)\n reasoning = data.get('reasoning', '')\n print(f' Categories: {categories}')\n print(f' Confidence: {confidence}')\n print(f' Reasoning: {reasoning[:150]}...')\n else:\n print(' JSON parsing failed')\n print(f' Raw: {result2[\\\"response\\\"][:200]}...')\n except Exception as ex:\n print(f' JSON parsing error: {ex}')\n print(f' Raw: {result2[\\\"response\\\"][:200]}...')\nelse:\n print(f' Error: {result2.get(\\\"error\\\")}')\n\n# Test 3: Question Generation\nprint()\nprint('[3\/3] Question Generation...')\nprompt3 = f'''Erstelle 3 Verständnisfragen zu folgendem Lerntext.\nDie Fragen sollen das Verständnis der Kernkonzepte prüfen.\n\nAntworte NUR im JSON-Format:\n{{\\\"questions\\\": [\n {{\\\"question\\\": \\\"...\\\", \\\"answer\\\": \\\"...\\\", \\\"difficulty\\\": \\\"leicht|mittel|schwer\\\"}}\n]}}\n\nText:\n{full_text[:2500]}'''\n\nresult3 = run_ollama(prompt3)\nprint(f' Duration: {result3[\\\"duration_ms\\\"]:.0f}ms')\nprint(f' Tokens: {result3.get(\\\"tokens\\\", \\\"?\\\")}')\nif result3['success']:\n try:\n import re\n json_match = re.search(r'\\{[\\s\\S]*\\}', result3['response'])\n if json_match:\n data = json.loads(json_match.group())\n questions = data.get('questions', [])\n print(f' Questions generated: {len(questions)}')\n for i, q in enumerate(questions[:3], 1):\n print(f' {i}. {q.get(\\\"question\\\", \\\"?\\\")[:70]}...')\n print(f' Answer: {q.get(\\\"answer\\\", \\\"?\\\")[:60]}...')\n print(f' Difficulty: {q.get(\\\"difficulty\\\", \\\"?\\\")}')\n else:\n print(' JSON parsing failed')\n print(f' Raw: {result3[\\\"response\\\"][:200]}...')\n except Exception as ex:\n print(f' JSON parsing error: {ex}')\n print(f' Raw: {result3[\\\"response\\\"][:200]}...')\nelse:\n print(f' Error: {result3.get(\\\"error\\\")}')\n\"\n",
"timeout": 600000,
"description": "Run taxonomy and question tests with gemma3:27b"
}
}
{
"tool_response": {
"stdout": "[2\/3] Taxonomy Classification...\n Duration: 7789ms\n Tokens: 91\n Categories: ['Praxis', 'Kommunikation', 'Teamarbeit', 'Entwicklung']\n Confidence: 0.9\n Reasoning: Der Text beschreibt die Anwendung der Auftragsklärung (Praxis), die damit verbundene Gesprächsführung (Kommunikation) und die verschiedenen Kontexte i...\n\n[3\/3] Question Generation...\n Duration: 19444ms\n Tokens: 256\n Questions generated: 3\n 1. Warum ist eine gute Auftragsklärung so wichtig?...\n Answer: Eine gute Auftragsklärung ist wichtig, da sie eng mit den Er...\n Difficulty: leicht\n 2. Nenne mindestens drei Beispiele für mögliche Aufgaben, die im Rahmen e...\n Answer: Mögliche Aufgaben sind: Teambuilding, Prozessbegleitung bei ...\n Difficulty: mittel\n 3. Der Text beschreibt die Auftragsklärung als mehr als nur eine Servicel...\n Answer: Die Auftragsklärung wird als erste Intervention betrachtet, ...\n Difficulty: schwer",
"stderr": "",
"interrupted": false,
"isImage": false
}
}