Protokoll #11615
| ID | 11615 |
|---|---|
| Zeitstempel | 2025-12-23 20:26:33.933064 |
| 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,911 (Input: 0, Output: 0) |
| Dauer | 75 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": "Read",
"tool_input": {
"file_path": "\/opt\/scripts\/pipeline\/generate.py",
"offset": 150,
"limit": 200
}
}
Response
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/opt\/scripts\/pipeline\/generate.py",
"content": " cursor.close()\n return result\n\n\ndef _parse_new_author_profile(config):\n \"\"\"Parse new-style author profile (Cary format) into prompt text.\"\"\"\n sections = []\n\n # Haltung\n haltung = config.get(\"haltung\", {})\n if haltung:\n sections.append(f\"\"\"### Haltung:\n- Grundhaltung: {haltung.get(\"grundhaltung\", \"\")}\n- Ausrichtung: {haltung.get(\"ausrichtung\", \"\")}\n- Spannungstoleranz: {haltung.get(\"spannungstoleranz\", \"\")}\n- Vereinfachung: {haltung.get(\"vereinfachung\", \"\")}\"\"\")\n\n # Tonalität\n tonalitaet = config.get(\"tonalitaet\", {})\n if tonalitaet:\n sections.append(f\"\"\"### Tonalität:\n- Charakter: {tonalitaet.get(\"charakter\", \"\")}\n- Stil: {tonalitaet.get(\"stil\", \"\")}\n- Wirkung: {tonalitaet.get(\"wirkung\", \"\")}\n- Abgrenzung: {tonalitaet.get(\"abgrenzung\", \"\")}\"\"\")\n\n # Sprachmodus\n sprachmodus = config.get(\"sprachmodus\", {})\n if sprachmodus:\n sections.append(f\"\"\"### Sprachmodus:\n- Denkstil: {sprachmodus.get(\"denkstil\", \"\")}\n- Aussagenform: {sprachmodus.get(\"aussagenform\", \"\")}\n- Fragenfunktion: {sprachmodus.get(\"fragenfunktion\", \"\")}\"\"\")\n\n # Grammatik und Satzbau - WICHTIG für Verbote\n grammatik = config.get(\"grammatik_und_satzbau\", {})\n if grammatik:\n verbote = []\n if grammatik.get(\"stakkato\") == \"ausgeschlossen\":\n verbote.append(\"Stakkato-Sätze\")\n if grammatik.get(\"einschuebe\") == \"keine\":\n verbote.append(\"Einschübe\")\n if grammatik.get(\"gedankenstriche\") == \"verboten\":\n verbote.append(\"Gedankenstriche (–)\")\n\n sections.append(f\"\"\"### Grammatik und Satzbau:\n- Sätze: {grammatik.get(\"saetze\", \"\")}\n- Rhythmus: {grammatik.get(\"rhythmus\", \"\")}\n- **VERBOTEN:** {\", \".join(verbote) if verbote else \"keine\"}\"\"\")\n\n # Wortwahl\n wortwahl = config.get(\"wortwahl\", {})\n if wortwahl:\n verboten = []\n if wortwahl.get(\"buzzwords\") == \"ausgeschlossen\":\n verboten.append(\"Buzzwords\")\n if wortwahl.get(\"methodennamen\") == \"ausgeschlossen\":\n verboten.append(\"Methodennamen\")\n\n sections.append(f\"\"\"### Wortwahl:\n- Niveau: {wortwahl.get(\"niveau\", \"\")}\n- Begriffe: {wortwahl.get(\"begriffe\", \"\")}\n- **VERBOTEN:** {\", \".join(verboten) if verboten else \"keine\"}\"\"\")\n\n # Adressierung\n adressierung = config.get(\"adressierung\", {})\n if adressierung:\n sections.append(f\"\"\"### Adressierung:\n- Form: {adressierung.get(\"form\", \"Sie\")}\n- Beziehung: {adressierung.get(\"beziehung\", \"\")}\n- Einladung: {adressierung.get(\"einladung\", \"\")}\"\"\")\n\n # Metaphern\n metaphern = config.get(\"metaphern\", {})\n if metaphern:\n sections.append(f\"\"\"### Metaphern:\n- Einsatz: {metaphern.get(\"einsatz\", \"\")}\n- Herkunft: {metaphern.get(\"herkunft\", \"\")}\n- Konsistenz: {metaphern.get(\"konsistenz\", \"\")}\"\"\")\n\n return \"\\n\\n\".join(sections)\n\n\ndef _parse_new_structure(config):\n \"\"\"Parse new-style structure profile into prompt text and format info.\"\"\"\n sections = []\n output_format = None\n erlaubte_tags = []\n\n # Ausgabe-Format\n ausgabe = config.get(\"ausgabe\", {})\n if ausgabe:\n output_format = ausgabe.get(\"format\", \"markdown\")\n erlaubte_tags = ausgabe.get(\"erlaubte_tags\", [])\n verbotene_tags = ausgabe.get(\"verbotene_tags\", [])\n\n if output_format == \"body-html\":\n sections.append(f\"\"\"### Ausgabe-Format: HTML\n- **Nur diese Tags verwenden:** {\", \".join(erlaubte_tags)}\n- **Verboten:** {\", \".join(verbotene_tags)}\n- {ausgabe.get(\"hinweis\", \"Sauberes semantisches HTML\")}\"\"\")\n\n # Gesamtaufbau\n aufbau = config.get(\"gesamtaufbau\", {})\n if aufbau:\n sections.append(f\"\"\"### Gesamtaufbau:\n- Form: {aufbau.get(\"form\", \"\")}\n- Dramaturgie: {aufbau.get(\"dramaturgie\", \"\")}\n- Linearität: {aufbau.get(\"linearitaet\", \"\")}\n- Themensprünge: {aufbau.get(\"themenspruenge\", \"\")}\"\"\")\n\n # Einstieg\n einstieg = config.get(\"einstieg\", {})\n if einstieg:\n sections.append(f\"\"\"### Einstieg:\n- Funktion: {einstieg.get(\"funktion\", \"\")}\n- Inhaltstyp: {einstieg.get(\"inhaltstyp\", \"\")}\n- Ausschluss: {einstieg.get(\"ausschluss\", \"\")}\"\"\")\n\n # Hauptteil-Blöcke\n hauptteil = config.get(\"hauptteil\", {})\n bloecke = hauptteil.get(\"bloecke\", [])\n if bloecke:\n bloecke_text = \"\\n\".join([f\" {i+1}. {b.get('fokus', '')} → {b.get('ziel', '')}\" for i, b in enumerate(bloecke)])\n sections.append(f\"\"\"### Hauptteil-Struktur:\n{bloecke_text}\"\"\")\n\n # Schluss\n schluss = config.get(\"schluss\", {})\n if schluss:\n sections.append(f\"\"\"### Schluss:\n- Typ: {schluss.get(\"typ\", \"\")}\n- Funktion: {schluss.get(\"funktion\", \"\")}\n- Abgrenzung: {schluss.get(\"abgrenzung\", \"\")}\"\"\")\n\n # Formatierung\n formatierung = config.get(\"formatierung\", {})\n if formatierung:\n ausschluss = formatierung.get(\"ausschluss\", [])\n if ausschluss:\n sections.append(f\"\"\"### Formatierung verboten:\n{\", \".join(ausschluss)}\"\"\")\n\n return \"\\n\\n\".join(sections), output_format, erlaubte_tags\n\n\ndef build_generation_prompt(briefing, context, profile, contract, structure=None):\n \"\"\"Build the content generation prompt.\"\"\"\n\n # Format context\n context_text = \"\"\n for i, ctx in enumerate(context, 1):\n context_text += f\"\\n[Quelle {i}: {ctx['source']}]\\n{ctx['content']}\\n\"\n\n # Build profile instructions - detect new vs old format\n profile_text = \"\"\n if profile:\n config = profile.get(\"config\", {})\n\n # Detect new format (has \"haltung\" or \"tonalitaet\" at top level)\n if \"haltung\" in config or \"tonalitaet\" in config or \"grammatik_und_satzbau\" in config:\n # New Cary-style profile\n profile_text = f\"\"\"\n## Autorenprofil: {profile.get(\"name\", \"Standard\")}\n\n{_parse_new_author_profile(config)}\n\"\"\"\n else:\n # Old format - keep backwards compatibility\n autorenprofil = config.get(\"autorenprofil\", config)\n\n stimme = autorenprofil.get(\"stimme\", {})\n stimme_text = \"\"\n if stimme:\n stimme_text = f\"\"\"\n### Stimme\/Tonalität:\n- Ton: {stimme.get(\"ton\", \"neutral\")}\n- Perspektive: {stimme.get(\"perspektive\", \"neutral\")}\n- Komplexität: {stimme.get(\"komplexitaet\", \"mittel\")}\"\"\"\n\n stil = autorenprofil.get(\"stil\", {})\n stil_text = \"\"\n if stil:\n stil_text = f\"\"\"\n### Stil:\n- Fachsprache: {\"Ja\" if stil.get(\"fachsprache\", False) else \"Nein\"}\n- Satzlänge: {stil.get(\"satzlaenge\", \"mittel\")}\"\"\"\n\n tabus = autorenprofil.get(\"tabus\", [])\n tabus_text = \"\"\n if tabus:\n tabus_text = f\"\"\"\n### Zu vermeiden:\n{\", \".join(tabus[:5])}\"\"\"\n\n profile_text = f\"\"\"\n## Autorenprofil: {profile.get(\"name\", \"Standard\")}\n{stimme_text}\n{stil_text}\n{tabus_text}",
"numLines": 200,
"startLine": 150,
"totalLines": 968
}
}
}