e08c484838
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>
86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
"""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
|