Add KNIEPUNKT Assistant with multi-LLM editorial workflow

Six-step weekly workflow (research → sources → storyline → draft →
quality → publication) supporting Claude, ChatGPT, Gemini, and Mistral
in parallel for creative steps. Web search via Anthropic tool for news
research. Episode index built from 34 existing KNIEPUNKT episodes for
redundancy checks. Sessions persisted as JSON for mid-workflow resume.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-24 23:54:23 +02:00
commit e08c484838
57 changed files with 3240 additions and 0 deletions
+85
View File
@@ -0,0 +1,85 @@
"""Publication preparation: teasers, visual ideas, final package."""
from pathlib import Path
from rich.console import Console
from rich.panel import Panel
console = Console()
_SYSTEM = """Du bist ein erfahrener Redaktionsassistent für KNIEPUNKT.
Erstelle prägnante, ansprechende LinkedIn-Texte und kreative Cover-Ideen für eine hochgebildete Zielgruppe."""
def generate_teasers(client, draft: str) -> str:
"""Generate 3 teaser/invitation text variants."""
from kniepunkt.llm import chat
console.print("\n[yellow]Erstelle Teaser-Varianten...[/yellow]")
prompt = f"""Erstelle 3 verschiedene LinkedIn-Einladungstexte (Teaser) für diese KNIEPUNKT-Episode.
Episodentext (Auszug):
{draft[:2000]}
**Variante 1 Neugier-Aufhänger:** stellt eine Frage oder weckt Neugier
**Variante 2 Pointierte These:** provokante Aussage oder klare Meinung
**Variante 3 Bild/Anekdote:** beginnt mit einem konkreten Bild oder einer kurzen Geschichte
Jeder Teaser: 3-5 Sätze, LinkedIn-gerecht, endet mit einer Leseeinladung und "Schönen Sonntag! 🤙" """
return chat(client, [{"role": "user", "content": prompt}], _SYSTEM, max_tokens=1024)
def generate_visual_ideas(client, draft: str) -> str:
"""Generate 3 cover/visual concept ideas."""
from kniepunkt.llm import chat
console.print("\n[yellow]Entwickle Cover-Ideen...[/yellow]")
prompt = f"""Entwickle 3 Cover-Ideen für diese KNIEPUNKT-Episode.
Episodentext (Auszug):
{draft[:1500]}
Für jede Idee:
- **Bildkonzept:** Was ist zu sehen? Konkrete Beschreibung des Motivs
- **Stil:** fotorealistisch / illustrativ / symbolisch / abstrakt
- **Verbindung zur Episode:** Wie spiegelt es das Thema wider?
- **Bildgenerierungs-Prompt (Englisch):** konkreter Prompt für DALL-E / Midjourney / Flux
Hinweis: KNIEPUNKT-Logo, Episodentitel und Datum werden vom Autor separat hinzugefügt."""
return chat(client, [{"role": "user", "content": prompt}], _SYSTEM, max_tokens=1024)
def save_package(session_date: str, draft: str, teasers: str, source_assessment: str, visual_ideas: str) -> Path:
"""Write the complete publication package to a markdown file."""
sessions_dir = Path(__file__).parent.parent / "sessions"
sessions_dir.mkdir(exist_ok=True)
out_path = sessions_dir / f"{session_date}_publikation.md"
content = f"""# KNIEPUNKT Publikationspaket {session_date}
## Artikel
{draft}
---
## Einladungstexte (Teaser-Varianten)
{teasers}
---
## Cover-Ideen
{visual_ideas}
---
## Quellenbewertung
{source_assessment}
"""
out_path.write_text(content, encoding="utf-8")
return out_path