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
+7
View File
@@ -0,0 +1,7 @@
.venv/
__pycache__/
*.pyc
*.pyo
episodes_cache.json
sessions/
.env
+122
View File
@@ -0,0 +1,122 @@
# AGENTS.md
---
## Coding rules
1. Read `SPEC.md` first and treat it as source of truth ("the spec"). If `SPEC.md` does not exist, **stop and ask**.
2. Follow the user prompt exactly; do not omit explicitly requested steps.
3. **Avoid over-engineering.** Only make changes that are directly requested or clearly necessary. Keep solutions simple and focused:
- Scope: Don't add features, refactor code, or make "improvements" beyond what was asked. A bug fix doesn't need surrounding code cleaned up. A simple feature doesn't need extra configurability.
- Documentation: Don't add docstrings, comments, or type annotations to code you didn't change. Only add comments where the logic isn't self-evident.
- Defensive coding: Don't add error handling, fallbacks, or validation for scenarios that can't happen. Trust internal code and framework guarantees. Only validate at system boundaries (user input, external APIs).
- Abstractions: Don't create helpers, utilities, or abstractions for one-time operations. Don't design for hypothetical future requirements. The right amount of complexity is the minimum needed for the current task.
- Custom coding: Don't reinvent the wheel, use the functions the framework provides you with. If you think that using framework is not possible, consult the relevant online or MCP docs to make sure. If you still cannot find a solution within the framework, **stop and ask**.
4. Do not hard-code values or create solutions that only work for specific test inputs; implement the actual logic that solves the problem generally.
5. The resulting code must be robust, maintainable, and extendable.
6. The resulting code must not contradict the spec.
7. **Before writing code**, post a short and concise "Plan + spec mapping" summary and **ask for approval to proceed**. Do not implement until you receive the go-ahead.
8. Documentation Rules:
- filenames are always capitalized.
- describes the **current state only**. Do not include change/history phrasing.
- must always be coherent end-to-end never have stale or conflicting info.
9. Always use repo virtual environment (unless there is none).
---
## Documentation MCP policy
- We run ONE docs MCP server: `docs` (multi-library).
### Library selection
- For any docs query call (everything except `list_libraries`), you MUST set `library`.
- If the prompt or repo context involves a specific product/project unambiguously, use that as `library` (e.g. `library="haystack"`).
- If more than one library could plausibly match, call `list_libraries` and select the best match (do not invent/guess library ids).
- If the task spans multiple products, run separate docs calls per library and label results by library.
### Version selection
- If the prompt or repo context involves a version or range (e.g. `2.25`, `2.x`), call `find_version(library=..., targetVersion=...)` and record the returned `version`.
- Use that resolved `version` for all subsequent calls for that library.
- If `find_version` cannot resolve unambiguously, **stop and ask**.
- If no version is mentioned, omit `version` (defaults to latest indexed for that library).
- We also run the `github` MCP server. Consult it always for code that is in public github instead of searching at the disk or cloning the repos locally.
---
## Base branch rule
**BASE_BRANCH = the branch that new work branches are created from and PRs target.**
Default:
- If the user did not explicitly specify a base/target branch, set:
- `BASE_BRANCH=$(git branch --show-current)` (from the user's main checkout at session start)
Override:
- If the user explicitly specifies a base/target branch in the prompt, use that as `BASE_BRANCH`.
Remote base ref:
- If `origin/$BASE_BRANCH` exists, use that as `BASE_REF`, else use `$BASE_BRANCH`:
- `git show-ref --verify --quiet "refs/remotes/origin/$BASE_BRANCH" && BASE_REF="origin/$BASE_BRANCH" || BASE_REF="$BASE_BRANCH"`
Notes:
- This supports long-lived feature integration branches and stacked PRs.
- The base branch may itself be another PR branch (for stacking); set BASE_BRANCH accordingly.
---
## Before work
1. Determine base branch (unless user specified it explicitly):
- `BASE_BRANCH=$(git branch --show-current)`
2. Fetch latest refs:
- `git fetch origin --prune`
3. Update base branch (fast-forward only) if it has an `origin/` tracking ref:
- `git switch "$BASE_BRANCH"`
- `if git show-ref --verify --quiet "refs/remotes/origin/$BASE_BRANCH"; then git pull --ff-only origin "$BASE_BRANCH"; fi`
- If the pull fails for any reason, stop and ask.
4. Read `SPEC.md` + `README.md` once per session. Re-read only if changed/unsure:
- `git log -1 --oneline -- SPEC.md README.md`
5. If deviating from `SPEC.md`: **stop and ask**.
6. Create a new local work branch (once per session) **from BASE_BRANCH**. **ALWAYS push to the branch you created.**
- `git switch -c "agent/<topic>-YYYYMMDD-<shortid>"`
## Tests
- Run tests only if the prompt requests or `SPEC.md` requires them; run all requested tests.
- If any cannot be run: **stop and ask**.
## After work
1. Make sure you did not miss requested tests.
2. If you are addressing a **remote github issue** with
- "to-do" checklist: for **each** item, make sure your implementation is **fully complete** and:
- if yes, check it off
- if not, finish implementation and recheck.
- "acceptance" checklist: for **each** item, make the acceptance criterion is **completely fulfilled** and:
- if yes, check it off
- if not, implement missing code and recheck.
3. Update all relevant documentation appropriately.
4. **Before making a commit**: Stop and ask user to `/review``Review uncommited changes`.
5. Commit **only after** user confirms code review passed.
6. Open a PR or use already opened PR
- **use your created branch**.
- **Target `BASE_BRANCH`**.
- PR text requirements:
- commands in backticks
- real newlines (ANSI-C quoting/heredoc)
- if addressing a **remote github issue**, reference it so that github can close automatically after merging.
7. **Only after** PR is merged:
- switch back to base branch and sync it
- `git switch "$BASE_BRANCH"`
- `git fetch origin --prune`
- `if git show-ref --verify --quiet "refs/remotes/origin/$BASE_BRANCH"; then git reset --hard "origin/$BASE_BRANCH"; fi`
- If the reset fails, **stop and ask**.
- delete the local merged work branch
---
## Required completion checklist (final response)
- [ ] Base/target branch used correctly (BASE_BRANCH)
- [ ] **all** Coding rules followed
- [ ] All requested tests run (commands + results), or blocked → asked
- [ ] Documentation updated appropriately: **list updated files**
- [ ] PR opened (summary + command log) targeting BASE_BRANCH
- [ ] After merge (if applicable): base branch synced; merged branch deleted
---
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+6
View File
@@ -0,0 +1,6 @@
KNIEPUNKT 034: ungeprüfte KI-Gewissheit
Wer von Euch weiß genau welcher Text KI-generiert ist? Und wie viele von Euch schauen sich die Quellen unter meinen KNIEPUNKTEN an? Ist vielleicht doch alles nur KI-halluziniert? So wie in den Gerichtssälen und Entwickler-Studios derzeit. Ich komme auch nochmal auf Anthropics Mythos zurück und wundere mich über den Größenwahn. Aber es gibt ein tierisch positives Ende, versprochen.
Viel Vergnügen beim Lesen und ich freue mich weiterhin über Likes und reposts. Damit sich noch mehr Menschen lieber über Medien bilden, als gefühltes Wissen anzuhäufen.
Schönen Sonntag!
@@ -0,0 +1,302 @@
# KI-News Wochenbericht: 18.24. April 2026
**Analysezeitraum:** 18.24. April 2026 | **Erstellt am:** 24. April 2026
***
## Executive Summary
Die KI-Woche vom 18. bis 24. April 2026 war eine der ereignisreichsten des Jahres. Drei Themen dominierten das Geschehen: Googles massiver Plattform-Launch bei der Google Cloud Next, die Entlassungswellen bei Meta und Microsoft im Zuge wachsender KI-Investitionen sowie die europäische Kapitulation beim Thema KI-Souveränität durch die Übernahme von Aleph Alpha durch das kanadische Start-up Cohere. Diese Meldungen schafften es größtenteils in die deutschsprachigen Mainstream-Medien — allerdings mit deutlich unterschiedlicher Tiefe und Rahmung.
***
## Übersicht: Wichtigste Meldungen der Woche
| # | Ereignis | Relevanz KI-Experten | Relevanz Allgemeinheit | Mainstream-Präsenz (DE) |
|---|----------|----------------------|------------------------|-------------------------|
| 1 | Aleph Alpha → Cohere-Übernahme | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ Sehr hoch |
| 2 | Google Cloud Next: Gemini Enterprise Agent Platform | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⚠️ Mittel |
| 3 | Meta: 8.000 Stellen gestrichen | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ✅ Sehr hoch |
| 4 | Microsoft: freiwillige Abfindungen (~8.750 MA) | ⭐⭐⭐ | ⭐⭐⭐⭐ | ✅ Hoch |
| 5 | UK Sovereign AI Fund (£500 Mio.) gestartet | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⚠️ Gering |
| 6 | Claude Mythos & Project Glasswing (Nachwirkungen) | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⚠️ Mittel |
| 7 | Stanford HAI AI Index Report 2026 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⚠️ Gering |
| 8 | OpenAI: Führungswechsel, Codex-Fokus | ⭐⭐⭐⭐ | ⭐⭐ | ⚠️ Gering |
***
## 1. Aleph Alpha → Cohere: Das Ende des deutschen KI-Champions
### Was ist passiert?
Das kanadische KI-Unternehmen Cohere übernimmt Aleph Alpha aus Heidelberg — Deutschlands bekanntestes KI-Start-up. Der Deal wurde am 24. April 2026 offiziell bestätigt und von Bundesdigitalminister Karsten Wildberger in einer Pressekonferenz verkündet — ungewöhnlicherweise nicht von den Firmenchefs selbst. Die Schwarz Gruppe (Lidl, Kaufland) investiert 500 Millionen Euro und will die KI-Lösungen des fusionierten Unternehmens in eigenen Cloud-Diensten einsetzen. Nach Abschluss werden die bisherigen Cohere-Anteilseigner rund 90 Prozent des kombinierten Unternehmens halten.[^1][^2][^3][^4]
### Hintergründe
Aleph Alpha hatte seit Jahresbeginn mit massiven Problemen gekämpft: Im Januar musste das Unternehmen Mitarbeiter entlassen, Gründer Jonas Andrulis verließ das Unternehmen Ende 2025. Kritiker wie Golem und WirtschaftsWoche sehen in der Übernahme eine „gesichtswahrende Lösung" — weniger einen europäischen Souveränitätsgewinn als vielmehr eine geopolitisch verklärte Niederlage.[^3][^1]
### Relevanz für KI-Experten ⭐⭐⭐⭐
Die Transaktion ist ein Beleg für die anhaltende Konsolidierung im KI-Markt. Cohere positioniert sich gezielt für Unternehmens- und Behördenmärkte in regulierten Branchen — genau das Segment, das Aleph Alpha aufgebaut hatte. Für Enterprise-KI-Strategen stellt sich die Frage, ob der neue Player tatsächlich DSGVO-konforme, souveräne KI-Dienste liefern kann oder ob das politische Narrativ die technische Realität übertüncht.[^2]
### Relevanz für die Allgemeinheit ⭐⭐⭐⭐⭐
Die Geschichte berührt das Kernthema der deutschen KI-Souveränität. Wenn das mit politischem Kapital ausgestattete deutsche KI-Vorzeigeprojekt von einem ausländischen Unternehmen übernommen wird, ist das ein Signal für den digitalpolitischen Zeitgeist. ZDF heute, Tagesschau, Stern und Wirtschaftswoche berichteten prominent.[^4][^5][^1][^3]
### Mainstream-Präsenz: **✅ Sehr hoch**
Tagesschau, ZDF heute journal, Stern und WirtschaftsWoche berichteten alle ausführlich. Das Thema erreichte eine breitere Öffentlichkeit als jede andere KI-Meldung der Woche.[^5][^1][^3]
***
## 2. Google Cloud Next 2026: Die Ära der KI-Agenten beginnt
### Was ist passiert?
Google hielt vom 22. bis 24. April seine jährliche Cloud Next Konferenz in Las Vegas ab und präsentierte eine vollständige Neuausrichtung seiner KI-Plattform. Vertex AI wurde zur **Gemini Enterprise Agent Platform** umbenannt und konsolidiert. Zu den wichtigsten Ankündigungen zählen:[^6][^7]
- **Workspace Studio**: Ein No-Code-Agent-Builder für Google Workspace[^6]
- **Project Mariner**: Ein web-browsender Agentenassistent[^6]
- **Agent Memory Bank**: Langzeit-Kontextspeicher für Agenten[^7]
- **A2A Protocol v1.0**: Der Agent-zu-Agent-Kommunikationsstandard ist in 150 Organisationen produktiv im Einsatz[^6]
- **ADK v1.0**: Stable Release des Agent Development Kit in vier Programmiersprachen[^6]
- **Managed MCP Server**: Apigee als API-zu-Agent-Brücke[^6]
- Modell-Garden mit über 200 Modellen, inklusive Claude von Anthropic[^6]
Google-CEO Sundar Pichai betonte, dass 75 Prozent der Google Cloud-Kunden bereits KI-Produkte einsetzen und die API-Nutzung im letzten Quartal von 10 auf 16 Milliarden Token pro Minute gestiegen sei.[^8]
### Relevanz für KI-Experten ⭐⭐⭐⭐⭐
Der Launch ist architektonisch bedeutsam: Google vollzieht den Schritt von isolierten Modellen zur vollständigen Agenteninfrastruktur. Das A2A-Protokoll — falls es sich als Standard durchsetzt — könnte die Interoperabilität zwischen Agenten verschiedener Anbieter ermöglichen und das gesamte Enterprise-KI-Ökosystem verändern. Die Integration von Anthropic Claude in den Model Garden ist ein strategisch bemerkenswerter Schachzug.[^9][^6]
### Relevanz für die Allgemeinheit ⭐⭐⭐
Für nicht-technische Nutzer sind die Auswirkungen mittelfristig erheblich: KI-Agenten, die eigenständig in Google Workspace, GMail und Drive agieren, werden die Arbeit mit diesen Tools grundlegend verändern. Bloomberg berichtete prominent über die Agenten-Ankündigungen. Der Eintrag in die Microsoft TechWiese KW17-Übersicht spiegelt die Bedeutung für Developer-Communities wider.[^10][^11]
### Mainstream-Präsenz: **⚠️ Mittel**
Bloomberg und internationale Tech-Medien (TechCrunch, IT Pro) berichteten ausführlich. Deutschsprachige Generalmedien wie Tagesschau oder Spiegel tauchten in der direkten Berichterstattung zu Cloud Next kaum auf — das Thema wurde eher über den Hannovermesse-KI-Kontext verknüpft.[^11][^12][^13][^6]
***
## 3. Meta und Microsoft: Stellenabbau im Namen der KI
### Was ist passiert?
Meta kündigte an, rund 8.000 Mitarbeiter (10 Prozent der Belegschaft) ab dem 20. Mai zu entlassen und weitere 6.000 offene Stellen nicht zu besetzen. Dies geschieht, während das Unternehmen KI-Investitionen auf bis zu 135 Milliarden Dollar verdoppelt. CEO Mark Zuckerberg begründet den Schritt damit, dass KI-Systeme Aufgaben übernehmen, die früher ganze Teams erforderten. Im gleichen Zeitraum kündigte Microsoft an, rund 7 Prozent der US-Belegschaft (ca. 8.750 Mitarbeiter) freiwillige Abfindungen anzubieten — das erste Mal in der 51-jährigen Unternehmensgeschichte in dieser Größenordnung.[^14][^15][^16][^17]
### Relevanz für KI-Experten ⭐⭐⭐
Die Entlassungen sind keine Wachstumskrise, sondern eine strategische Transformation: Arbeitsplätze werden durch KI-Effizienzgewinne abgebaut, während Investitionen in KI-Infrastruktur explodieren. Dies bestätigt Erkenntnisse des Stanford HAI AI Index 2026, demzufolge die Beschäftigung unter US-Entwicklern der Altersgruppe 2225 Jahre seit 2024 um fast 20 Prozent gesunken ist.[^18]
### Relevanz für die Allgemeinheit ⭐⭐⭐⭐⭐
Jobverluste durch KI bei bekannten globalen Tech-Konzernen sind für die breite Bevölkerung unmittelbar nachvollziehbar und angstbesetzt. Diese Meldungen berühren Grundsorgen um Beschäftigung und wirtschaftliche Perspektiven.
### Mainstream-Präsenz: **✅ Sehr hoch**
CNBC, New York Times, Reuters und Bloomberg berichteten prominent. Deutschsprachige Medien haben das Thema aufgegriffen, allerdings primär im allgemeinen Kontext des KI-bedingten Stellenabbaus — ein Dauerthema, das von Tagesschau und Spiegel regelmäßig beleuchtet wird.[^16][^17][^19][^20][^21]
***
## 4. UK Sovereign AI Fund: £500 Millionen für britische KI-Souveränität
### Was ist passiert?
Am 16. April 2026 hat das britische Technologieministerium (DSIT) offiziell seinen £500-Millionen-Sovereign-AI-Fund gestartet. Der Fonds funktioniert wie ein staatlicher Wagniskapitalgeber und kombiniert Direktinvestitionen mit Zugang zum britischen KI-Supercomputer-Netzwerk. Erste Investitionen gingen an die KI-Infrastruktur-Start-up Callosum sowie sechs weitere Unternehmen. Startups erhalten neben Kapital auch vollständig finanzierte Supercomputing-Ressourcen, F&E-Unterstützung und beschleunigten Visa-Service.[^22][^23][^24]
### Relevanz für KI-Experten ⭐⭐⭐⭐
Der Fonds ist ein direkter staatlicher Eingriff in den KI-Wettbewerb, um britische Anbieter gegen US- und chinesische Dominanz zu stärken. Besonders relevant ist die Kombination aus Kapital und Compute-Zugang — Rechenleistung bleibt der kritische Engpass für europäische KI-Entwickler. Das Modell könnte als Blaupause für weitere EU-Initiativen dienen.[^25][^24]
### Relevanz für die Allgemeinheit ⭐⭐⭐
Ohne konkreten Produktbezug bleibt die Relevanz für die breite Bevölkerung abstrakt. Das Thema Technologiesouveränität ist jedoch mit dem Aleph-Alpha-Narrativ verknüpfbar.
### Mainstream-Präsenz: **⚠️ Gering (in Deutschland)**
Im deutschen Mediensystem fand der britische Fonds praktisch keine eigenständige Berichterstattung. Computer Weekly und IT Pro in Großbritannien berichteten ausführlich.[^24][^22]
***
## 5. Anthropic Claude Mythos: Cybersecurity-Schockwellen halten an
### Was ist passiert?
Die Nachwirkungen des am 7. April angekündigten Claude Mythos Preview beherrschten weiterhin die Experten-Diskussionen in KW17. Das World Economic Forum veröffentlichte am 19. April eine ausführliche Analyse der strategischen Implikationen. Kernpunkt: Anthropic hat erstmals ein Frontier-Modell als „zu gefährlich für die breite Verfügbarkeit" eingestuft, da es autonom Zero-Day-Schwachstellen findet, Exploits generiert und komplexe Cyber-Operationen mit minimalem menschlichem Input durchführen kann. Das US-Finanzministerium hatte bereits in KW15 eine Notfallsitzung mit CEOs von Citigroup, Morgan Stanley und Goldman Sachs einberufen — das erste Mal, dass ein KI-Modell-Launch eine solche Reaktion auslöste.[^26][^27][^28][^29]
**Kontext KW17:** Anthropic startete parallel Claude Opus 4.7 als meistgenutztes Enterprise-Modell mit führenden SWE-bench-Pro-Scores von 64,3 Prozent (vs. GPT-5.4: 57,7 Prozent).[^26]
### Relevanz für KI-Experten ⭐⭐⭐⭐⭐
Mythos markiert eine qualitative Verschiebung in der KI-Sicherheitsdiskussion: Nicht mehr regulatorische Beschränkungen, sondern offensive Cyber-Fähigkeiten sind nun der primäre Deployment-Blocker. Der Patch-Zeitraum zwischen Entdeckung und Exploit-Ausnutzung kollabiert von Monaten auf Minuten. Für Security-Teams und Enterprise-Architekten bedeutet das eine grundlegende Neubewertung von Vulnerability-Management und AI-gestützter Verteidigung.[^27][^30]
### Relevanz für die Allgemeinheit ⭐⭐⭐
Das Thema KI und Cybersicherheit ist für die breite Öffentlichkeit zunehmend greifbar, zumal Ransomware und Datenschutzverletzungen regelmäßig Schlagzeilen machen. Die konkrete Vorstellung, dass ein KI-Modell Tausende unbekannter Sicherheitslücken in wenigen Stunden findet, ist eingängig.
### Mainstream-Präsenz: **⚠️ Mittel**
Gecko.de und Cybersecurity-Fachpublikationen berichteten auf Deutsch. Die großen deutschen Nachrichtenmedien haben das Thema im Rahmen allgemeiner KI-Risikoberichterstattung gestreift — eine eigenständige Einordnung von Mythos fehlt in Tagesschau und Spiegel für KW17 weitgehend.[^31]
***
## 6. Stanford HAI AI Index 2026: Die wichtigste Datengrundlage des Jahres
### Was ist passiert?
Der Stanford HAI AI Index Report 2026 — ein 423-seitiges Standardwerk — wurde am 16. April veröffentlicht. Die wichtigsten Befunde im Überblick:[^32][^18]
- **Adoptionsgeschwindigkeit**: Generative KI erreichte innerhalb von drei Jahren eine Adoptionsrate von 53 Prozent der Bevölkerung — schneller als PC oder Internet[^18]
- **Organisatorische Adoption**: 88 Prozent der Unternehmen setzen mittlerweile generative KI ein[^18]
- **Leistungskonvergenz USAChina**: Der Rückstand Chinas auf führende US-Modelle beträgt laut Benchmarks nur noch 2,7 Prozent[^18]
- **"Jagged Frontier"**: KI-Systeme gewinnen Goldmedaillen bei der Internationalen Mathematikolympiade, lesen analoge Uhren aber nur zu 50,1 Prozent korrekt[^18]
- **Arbeitsmarkt**: Die Beschäftigung unter US-Entwicklern der Altersgruppe 2225 Jahre sank seit 2024 um fast 20 Prozent; erfahrenere Entwickler bleiben gefragt[^18]
- **Bildung**: 80 Prozent der Studierenden nutzen KI für schulische Arbeiten[^32]
- **Coding-Benchmark SWE-bench**: Leistung stieg in einem einzigen Jahr von 60 auf fast 100 Prozent des menschlichen Basiswerts[^18]
### Relevanz für KI-Experten ⭐⭐⭐⭐⭐
Der Report ist die belastbarste empirische Grundlage für strategische KI-Entscheidungen. Besonders der Governance-Gap — KI-Fähigkeiten überholen regulatorische Systeme — ist für Policy-Experten und Enterprise-Strategen zentral.[^33]
### Relevanz für die Allgemeinheit ⭐⭐⭐⭐
Konkrete Zahlen wie der 53-Prozent-Adoptionswert oder die 20-Prozent-Jobverluste bei Juniorentwicklern sind verständlich und direkt relevant.
### Mainstream-Präsenz: **⚠️ Gering (in Deutschland)**
Internationale Fachmedien und LinkedIn-Communities haben den Report breit diskutiert. In deutschen Mainstream-Medien ist der Report bislang kaum aufgegriffen worden — obwohl seine Daten für deutsche KI-Politikdebatten hochrelevant sind.[^34][^32]
***
## 7. OpenAI: Führungsturbulenzen und Neuausrichtung auf Codex
### Was ist passiert?
Am 17. April 2026 kündigten drei hochrangige OpenAI-Führungskräfte gleichzeitig ihren Abgang an: Kevin Weil (VP for Science), Bill Peebles (Sora-Chef) und weitere. Das Unternehmen stellt das experimentelle KI-Forschungsprojekt Prism ein, das Sora-Produkt wurde mangels Wirtschaftlichkeit geschlossen. OpenAI richtet sich stattdessen auf seinen Code-Agenten **Codex** und Enterprise-Geschäft aus. COO Brad Lightcap übernahm zuvor bereits eine neue Sonderrolle, während Denise Dresser als neue CRO kommerzielle Verantwortlichkeiten übernimmt — im Kontext der laufenden IPO-Vorbereitungen.[^35][^36][^37][^38][^39]
Parallel lancierte OpenAI **GPT-Rosalind** für Life Sciences und Drug Discovery sowie ein Codex-Update mit Computer-Use-Fähigkeiten.[^38]
### Relevanz für KI-Experten ⭐⭐⭐⭐
Die Führungswechsel signalisieren eine strategische Reifung: von experimenteller Forschung zur kommerziellen Skalierung. Für Enterprise-Kunden und Entwickler ist der starke Fokus auf Codex als autonomem Coding-Agenten direkt relevant — besonders angesichts des wachsenden Wettbewerbs durch Anthropic's Claude Code.[^40][^35]
### Relevanz für die Allgemeinheit ⭐⭐
Führungswechsel bei KI-Unternehmen interessieren die breite Öffentlichkeit kaum, solange keine unmittelbaren Produktauswirkungen kommuniziert werden.
### Mainstream-Präsenz: **⚠️ Gering**
TechCrunch, Gadgets360 und Fachblogs berichteten. Der LinkedIn-Newsletter „KI-Revolution KW17/2026" von Daniel Szabo führte den OpenAI-Strategieschwenk als Topthema.[^41][^36][^37]
***
## Kontext: Kontinuierliche Trends im April 2026
Die Einzelereignisse dieser Woche sind Ausläufer größerer Trends, die den gesamten April geprägt haben:
- **Modell-Wettbewerb**: GPT-5.4, Claude Opus 4.7 und Gemini 3.1 Pro haben im April historische Benchmark-Scores erreicht. GPT-5.4 erzielt 83 Prozent auf dem GDPval-Benchmark (44 Berufe), Gemini 3.1 Pro 77,1 Prozent auf ARC-AGI-2[^42]
- **Agentic AI als Paradigma**: Alle großen Anbieter — OpenAI (Codex), Anthropic (Claude Code), Google (Gemini Enterprise Agent Platform), Meta (Manus) — bauen autonome Code- und Task-Agenten zur neuen Kernprodukt-Kategorie aus[^43][^44]
- **Markt-Konsolidierung**: Q1 2026 erreichte das globale Start-up-Funding 297 Milliarden Dollar — davon 81 Prozent in KI-Start-ups[^42]
- **Infrastruktur-Backlash**: In den USA wächst der gesellschaftliche Widerstand gegen KI-Rechenzentren: Eine Stadt in Missouri wählte ihren Stadtrat ab, Maine verhängte ein Moratorium für neue Rechenzentren über 20 Megawatt, und die Unterstützung in Virginia sank von 69 auf 35 Prozent[^26]
- **Hannovermesse 2026**: In Deutschland dominierte KI als Thema der Industriemesse — Tagesschau und ZDF berichteten ausführlich über den KI-getriebenen Aufschwung in der deutschen Industrie[^12]
***
## Analyse: Vergleich KI-Experten vs. Allgemeinheit
### Informationsasymmetrie
Der wichtigste strukturelle Befund dieser Woche: Die Meldungen mit der höchsten technischen Bedeutung (Stanford AI Index, Google Cloud Next, Claude Mythos) erreichen deutschsprachige Mainstream-Medien nur fragmentiert oder mit erheblicher Zeitverzögerung. Stattdessen dominieren emotionalisierbare Themen (Stellenabbau, Aleph Alpha) die öffentliche KI-Wahrnehmung.
### Was Experten wissen, das die Öffentlichkeit noch nicht weiß
- Die technische Konvergenz zwischen US- und chinesischen Modellen auf 2,7 Prozent Abstand[^18]
- Das A2A-Protokoll als möglicher Infrastruktur-Standard für Multi-Agenten-Systeme[^6]
- Die Implikationen des „Patch-Window-Kollapses" durch Mythos-ähnliche Modelle für jeden IT-Betrieb[^30]
- Dass Coding-Benchmarks in einem einzigen Jahr von 60 auf nahezu 100 Prozent menschliche Parität gestiegen sind[^18]
### Was die Öffentlichkeit stärker wahrnimmt als Experten
- Den Symbolwert des Aleph Alpha-Verkaufs für den KI-Standort Deutschland
- Konkrete Jobverluste bei bekannten Tech-Konzernen als direkte Bestätigung von KI-Angst-Narrativen
- KI auf der Hannovermesse als „Heilsversprechen" für die deutsche Industrie[^12]
***
## Einschätzung: Kurz- und mittelfristige Relevanz
| Thema | Kurzfristige Relevanz | Mittelfristige Relevanz | Nachverfolgen? |
|-------|----------------------|------------------------|----------------|
| Aleph Alpha → Cohere | 🔴 Hoch (politisch) | 🟡 Mittel (Markt) | Ja — Regulierung, Datenschutz |
| Google Agent Platform | 🟡 Mittel | 🔴 Sehr hoch | Ja — Enterprise-KI-Architektur |
| Meta/Microsoft Layoffs | 🔴 Hoch (sozial) | 🔴 Hoch (Arbeitsmarkt) | Ja — Folgequartale |
| UK Sovereign AI Fund | 🟡 Mittel | 🔴 Hoch (Policy) | Ja — EU-Reaktion |
| Claude Mythos (Cyber) | 🔴 Hoch (Security) | 🔴 Sehr hoch | Ja — Patch-Zyklen, Regulierung |
| Stanford AI Index | 🟡 Mittel | 🔴 Sehr hoch | Ja — Governance-Gap |
| OpenAI-Führungswechsel | 🟡 Mittel | 🟡 Mittel | Beobachten — IPO-Kontext |
***
*Quellen: Tagesschau, ZDF heute, Bloomberg, CNBC, NYT, Reuters, WirtschaftsWoche, Stern, IT-ZOOM, WEF, Stanford HAI, MIT Technology Review, The Next Web, IT Pro, Computer Weekly, Hack The Box, LinkedIn Pulse (diverse), Marketingprofs, kersai.com*
---
## References
1. [Kanadisches Start-Up übernimmt einstige KI-Hoffnung Aleph Alpha](https://www.tagesschau.de/wirtschaft/unternehmen/uebernahme-aleph-alpha-100.html) - Die Nachricht des Tages: Das kanadische KI-Startup Cohere übernimmt Aleph Alpha aus Heidelberg. Solc...
2. [Kanadische KI-Firma Cohere übernimmt Aleph Alpha - IT-ZOOM](https://www.it-zoom.de/enterprise/e/kanadische-ki-firma-cohere-uebernimmt-aleph-alpha-35134/) - Der kanadische Anbieter Cohere übernimmt das deutsche KI-Unternehmens Aleph Alpha. Das teilten beide...
3. [KI: Schwarz Gruppe verkauft Aleph Alpha nach Kanada](https://www.wiwo.de/unternehmen/it/ki-schwarz-gruppe-verkauft-aleph-alpha-nach-kanada/100219633.html) - Der Heidelberger KI-Spezialist Aleph Alpha fusioniert mit Kanadas Cohere. Die Schwarz Gruppe will üb...
4. [Kanadisches Startup übernimmt deutsche KI-Firma Aleph Alpha](https://www.stern.de/news/kanadisches-startup-uebernimmt-deutsche-ki-firma-aleph-alpha-37339722.html) - Das kanadische Startup Cohere übernimmt das deutsche KI-Unternehmen Aleph Alpha aus Heidelberg. Bund...
5. [US-KI-Übermacht: Kanadische Firma übernimmt deutsches Start-Up](https://www.zdfheute.de/politik/kuenstliche-intelligenz-fusion-cohere-partnerschaft-100.html) - Die kanadische KI-Firma Cohere übernimmt den deutschen Konkrurrenten Aleph Alpha. Berlin sagt Ja zum...
6. [Google Cloud Next 2026: AI agents, A2A protocol, Workspace ...](https://thenextweb.com/news/google-cloud-next-ai-agents-agentic-era) - Google launches AI agent suite at Cloud Next 2026 with Workspace Studio, A2A protocol at 150 orgs, a...
7. [Google Launches Unified AI Agent Platform at Cloud Next - Datagrom](https://www.datagrom.com/ai-news/google-launches-unified-ai-agent-platform-at-cloud-next-223c46b9) - Google Cloud unveiled the Gemini Enterprise Agent Platform at Google Cloud Next 2026, replacing Vert...
8. [Google Cloud Next 2026: News and updates](https://blog.google/innovation-and-ai/infrastructure-and-cloud/google-cloud/next-2026/) - The Agentic Data Cloud closes the gap between thinking and doing, allowing AI agents to act on your ...
9. [Google Cloud Next 2026: Businesses Are Moving Into the 'Agentic Era'](https://biztechmagazine.com/article/2026/04/google-cloud-next-2026-businesses-are-moving-agentic-era) - Some of the new products Google Cloud announced Wednesday include Gemini Enterprise Agent Platform, ...
10. [Die wichtigsten News der Kalenderwoche 17/2026: GitHub, KI, Data ...](https://www.microsoft.com/de-de/techwiese/news/die-wichtigsten-news-der-kalenderwoche-172026-github-ki-data-und-mehr.aspx) - Was hat sich in der vergangenen Woche für Developer und IT-Pros getan? Was waren die wichtigsten Ank...
11. [Google Releases New AI Agents to Challenge OpenAI and Anthropic](https://www.bloomberg.com/news/articles/2026-04-22/google-releases-new-ai-agents-to-challenge-openai-and-anthropic) - Alphabet Inc.'s Google unveiled a slew of tools to build AI agents aimed at helping companies automa...
12. [ErklärBAR: KI statt Krise das Comeback der deutschen Wirtschaft](https://www.youtube.com/watch?v=5tZFj1Od0XE) - | Markus Lanz, April 22, 2026. ZDFheute Nachrichten. New. 154K views · 15 ... tagesschau 20:00 Uhr, ...
13. [Google Cloud Next 2026: Scaling AI agents | IT Pro - ITPro](https://www.itpro.com/technology/artificial-intelligence/google-cloud-next-2026-scaling-ai-agents) - Google expands Gemini Enterprise, consolidates Vertex AI services to simplify agent deployment · Goo...
14. [24, 2026 Patchapalooza, AI Layoffs, and Zero-Day Drama - myITforum](https://myitforum.substack.com/p/it-pros-weekly-roundup-april-18-24) - IT Pros Weekly Roundup April 18 - 24, 2026 Patchapalooza, AI Layoffs ... AI infrastructure spending ...
15. [Meta To Lay Off 10% Of Workforce Amid Ongoing AI Push - Deadline](https://deadline.com/2026/04/meta-layoffs-ai-1236870143/) - Meta, which owns Facebook, Instagram and WhatsApp, plans to lay off 10% of its workforce amid ongoin...
16. [Meta will cut 10% of workforce as company pushes deeper into AI](https://www.cnbc.com/2026/04/23/meta-will-cut-10percent-of-workforce-as-it-pushes-more-into-ai.html) - Meta plans to lay off 10% of its workforce, about 8,000 employees. · The job cuts will begin May 20,...
17. [Meta to Lay Off 10 Percent of Work Force in A.I. Push](https://www.nytimes.com/2026/04/23/technology/meta-layoffs.html) - Meta plans to cut 10 percent of its work force, or roughly 8,000 employees, and close another 6,000 ...
18. [Stanford HAI releases AI Index 2026 Annual Report on progress and ...](https://coursiv.io/news/stanford-hai-ai-index-2026-report) - Key findings: selected highlights from the report# · AI development is not slowing down its capabi...
19. [Exclusive: Meta planning sweeping layoffs as AI costs mount | Reuters](https://www.reuters.com/business/world-at-work/meta-planning-sweeping-layoffs-ai-costs-mount-2026-03-14/) - Meta's workforce could shrink by 20% amid AI focus · Meta's AI spending includes $600 billion for da...
20. [Jobverlust durch KI? Shumers Warnung und was Studien dazu sagen](https://www.tagesschau.de/wirtschaft/technologie/jobverlust-ki-shumer-warnung-arbeitsmarkt-100.html) - Der US-Unternehmer Matt Shumer hat die Angst vor Massenentlassungen wegen KI neu befeuert: Kein Büro...
21. [KI: Digitalminister Karsten Wildberger sieht klassische Berufe bedroht](https://www.spiegel.de/politik/deutschland/ki-digitalminister-karsten-wildberger-sieht-klassische-berufe-bedroht-a-8b9dd64c-8f9e-4ffe-80f2-801934f2df16) - Künstliche Intelligenz wird zu dramatischen Arbeitsplatzverlusten in Deutschland führen, hat Digital...
22. [UK announces Sovereign AI fund to fast-track domestic AI startups](https://finance.yahoo.com/sectors/technology/articles/uk-announces-sovereign-ai-fund-092804426.html) - The new scheme will offer funding, supercomputing access, and regulatory support to selected British...
23. [Sovereign AI Strategic Assets Grants Programme](https://www.find-government-grants.service.gov.uk/grants/sovereign-ai-strategic-assets-grants-programme-1) - The scheme sits within the Sovereign AI Funds wider offer to support AI firms in the UK. ... Applica...
24. [UK government's £500m sovereign AI fund bids to commercialise ...](https://www.computerweekly.com/news/366641682/UK-governments-50m-sovereign-AI-fund-bids-to-commercialise-research) - The UK government is launching a £500m Sovereign AI Unit to boost artificial intelligence startups a...
25. [UK sovereign AI fund to build up domestic computing infrastructure](https://www.artificialintelligence-news.com/news/uk-sovereign-ai-fund-build-domestic-computing-infrastructure/) - Backed by a £500 million budget from the Department for Science, Innovation and Technology, the unit...
26. [AI to ROI Weekly Recap: April 18, 2026 - LinkedIn](https://www.linkedin.com/pulse/ai-roi-weekly-recap-april-18-2026-ray-rike-blgmc) - The AI market made three big leaps this week: The release of Anthropic's Mythos model triggered an e...
27. [Anthropic's Mythos moment: how frontier AI is redefining cybersecurity](https://www.weforum.org/stories/2026/04/anthropic-mythos-ai-cybersecurity/) - On 7 April, Anthropic announced Claude Mythos Preview, a frontier AI model so powerful (or risky) th...
28. [Anthropic limits rollout of Mythos AI model over cyberattack fears](https://www.cnbc.com/2026/04/07/anthropic-claude-mythos-ai-hackers-cyberattacks.html) - Anthropic limits Mythos AI rollout over fears hackers could use model for cyberattacks. Published Tu...
29. [Anthropic's Claude Mythos Finds Thousands of Zero-Day Flaws ...](https://thehackernews.com/2026/04/anthropics-claude-mythos-finds.html) - Claude Mythos finds thousands of zero-days as Anthropic launches Project Glasswing, enhancing defens...
30. ["Too Dangerous to Ship": What the Claude Mythos Moment Asks of ...](https://www.linkedin.com/pulse/too-dangerous-ship-what-claude-mythos-moment-asks-every-sorensen--2hawc) - The unveiling of Anthropic's Claude Mythos Preview in April 2026 ... Emerging AI-Driven Threats Prom...
31. [Cybersecurity 2026 Warnung: KI erhöht das Risiko jedes Systems](https://www.gecko.de/wissenshub/cybersecurity-2026-warnung-ki-erhoeht-das-sicherheitsrisiko-jedes-it-systems/) - Die Aussage in der Überschrift ist bewusst deutlich formuliert: KI erhöht das Sicherheitsrisiko jede...
32. [Weekly Update: Stanford HAI 2026 Index Report](https://stefanbauschard.substack.com/p/weekly-update-stanford-hai-2026-index) - 80% of K-16+ students are using AI to support school work · Current models are exceeding human capac...
33. [AI Index | Stanford HAI](https://hai.stanford.edu/ai-index) - Explore the 2026 AI Index Report. This year's Index reveals a widening gap between what AI can do an...
34. [The 2026 AI Index Report | Stanford HAI | AI Access - LinkedIn](https://www.linkedin.com/posts/aiaccess_the-2026-ai-index-report-activity-7449951936172199936--hEZ) - It's one of the most reputable assessments of the state of AI globally. Here are some of the key fin...
35. [OpenAI Restructures Leadership to Strengthen IPO Readiness and ...](https://www.welcome.ai/content/openai-restructures-leadership-to-strengthen-ipo-readiness-and-focus) - The departure of Kevin Weil from OpenAI underscores a strategic realignment as the company dissolves...
36. [OpenAI Undergoes Leadership Shake-Up as COO Brad Lightcap ...](https://www.gadgets360.com/ai/news/openai-leadership-change-coo-brad-lightcap-special-projects-role-report-11316703) - OpenAI is said to be undergoing a major leadership reshuffle, with COO transitioning to a Special Pr...
37. [OpenAI executive shuffle includes new role for COO Brad Lightcap ...](https://techcrunch.com/2026/04/03/openai-executive-shuffle-new-roles-coo-brad-lightcap-fidji-simo-kate-rouch/) - OpenAI executive shuffle includes new role for COO Brad Lightcap to lead 'special projects'. Amanda ...
38. [AI Leaders Weekly Briefing April 17, 2026 - Distill](https://www.distillintelligence.com/briefings/ai-leaders-2026-04-17) - OpenAI introduced GPT-Rosalind for life sciences and drug discovery, alongside a major Codex update ...
39. [Three senior OpenAI executives announced their departures on ...](https://www.instagram.com/p/DXb6rOPjDdF/) - Three senior OpenAI executives announced their departures on 17th April, 2026 simultaneously as the ...
40. [AI News April 2026: $1.5B Coding Startup, OpenAI vs Anthropic](https://www.youtube.com/watch?v=We0SFITCtW4) - explained simply. From OpenAI and Google to startups and research breakthroughs, we cover everything...
41. [DIE KI-Revolution Kalenderwoche 17/2026 - LinkedIn](https://de.linkedin.com/pulse/die-ki-revolution-kalenderwoche-172026-daniel-szabo-vhpaf) - 1. OpenAI macht Kehrtwende: Business statt Bastelei · 2. Mistral Forge: Europas Antwort auf die US-D...
42. [AI in April 2026: Biggest Breakthroughs, Models & Industry Shifts](https://kersai.com/ai-breakthroughs-april-2026-models-funding-shifts/) - Q1 2026 saw global startup funding hit a record $297 billion — with AI startups absorbing $242 billi...
43. [Generative AI Weekly Apr 410 2026 Adoption Boom](https://bostoninstituteofanalytics.org/blog/this-week-in-generative-ai-april-4-april-10-2026-why-2026-is-seeing-record-breaking-adoption-rates/) - Explore why generative AI is seeing record-breaking adoption in April 410, 2026. Discover key trend...
44. [The Agentic AI Revolution: 7 Breakthroughs Reshaping Tech in April ...](https://www.switas.com/articles/the-agentic-ai-revolution-7-breakthroughs-reshaping-tech-in-april-2026) - The Agentic AI Revolution: 7 Breakthroughs Reshaping Tech in April 2026 · 1. The Dominance of Agenti...
+537
View File
@@ -0,0 +1,537 @@
1. Executive Summary
Product / initiative name: KNIEPUNKT Assistant
Interviewed stakeholder role: Dr. André Knie, author of the LinkedIn column “KNIEPUNKT”
Product type: New assistant supporting an existing editorial process and content base. The product builds on 34 existing KNIEPUNKT episodes.
Goal in one sentence:
The assistant should improve and accelerate the production of the KNIEPUNKT column while making quality and success metrics measurable and sustainably improvable.
Short business context:
KNIEPUNKT is a LinkedIn column about current news in the world of AI and the authors reflections on those developments. The column addresses a highly educated audience of medium-sized company CEOs, decision-makers from the Mittelstand, corporations, and public administration who are interested in moral AI.
Primary target users:
The only active product user is Dr. André Knie as author. Readers, feedback providers, and external experts may provide input, but they are not active user groups of the assistant.
Core functional scope summary:
The assistant should support weekly AI news research, source assessment, storyline development, draft preparation, tonal quality review, redundancy checks against previous KNIEPUNKT episodes, KPI and feedback analysis, teaser experimentation, visual idea generation, cover preparation, and quality assurance before publication.
In scope:
Weekly collection and preparation of relevant AI news
Suggestions for multiple sources per news item
Source quality classification
Storyline and draft preparation
Support for column-style, gloss-like, amusing, culturally literate tone
Detection of missing authorial opinion or missing reader-facing interpretation
Review against previous episodes to reduce redundancy
Length, teaser, topic, and cover experimentation
KPI and feedback collection, interpretation, and regular review
Visual and cover idea development while preserving recognizability
Quality checks before final author approval
Out of scope:
Fully automatic publication or sending of the LinkedIn newsletter/post
Replacing the authors final editorial judgment
Replacing the authors personal source review
Replacing the authors prioritization of news items
Taking the final cover decision away from the author
Producing purely technical deep dives that would make the column boring for the intended audience
Main open questions:
Which KPIs are reliably available from LinkedIn and other feedback sources?
What review cadence should be used for KPI and quality learning?
What concrete length variants should be tested?
What minimum visual identity elements are mandatory for recognizability?
How should qualitative reader feedback be categorized and weighted?
What exact thresholds define “sustainably better” performance?
Main acceptance indicators:
Production is faster than the current 23 hours per episode.
Relevant success metrics become measurable.
Key success metrics improve sustainably over time.
Source quality and factual reliability are maintained or improved.
The KNIEPUNKT tone remains recognizable, amusing, opinionated, and suitable for the audience.
The author remains in final editorial control.
2. Goal
One-sentence goal:
Enable the author to produce better, faster, more measurable KNIEPUNKT episodes while preserving the columns distinctive editorial voice and source quality.
Detailed goal:
The assistant should support the full editorial preparation process for weekly KNIEPUNKT episodes. It should help identify relevant AI news, suggest and assess sources, develop storylines, prepare draft texts, review tone and factual grounding, support visual and cover development, incorporate KPI and reader feedback, and make quality improvement more systematic over time.
Business value:
Reduce production effort from the current 23 hour process.
Increase consistency in research, source assessment, editorial quality, and tonal fit.
Make reach and audience resonance more measurable.
Support better decisions about length, teaser text, topics, and cover formats.
Preserve and strengthen the recognizable KNIEPUNKT style.
Intended outcome for users and organization:
The author can produce episodes more efficiently.
The author receives better editorial preparation and quality signals.
The column becomes more data-informed without losing opinion, humor, and cultural character.
Readers receive timely, well-sourced, amusing, and opinionated orientation on major AI developments.
3. Stakeholder Context
Respondent role:
Dr. André Knie, author of the KNIEPUNKT column.
Perspective represented:
Primary author, editor, curator, and final decision-maker for the column.
Relevant organizational or customer context:
The column is published on LinkedIn as a newsletter/post format. Its recipients include medium-sized company CEOs, decision-makers from the Mittelstand, corporations, and public administration who are interested in moral AI.
Whether this spec reflects one interview only:
This specification reflects one stakeholder interview with the author. It should be treated as the authors current product discovery input and may require later validation after prototype use or after additional KPI/feedback analysis.
4. Target Users
User groups:
Primary active user: Dr. André Knie as author.
Indirect audience: Readers of the KNIEPUNKT column.
Input sources, not users: Readers who provide feedback, external experts, and potential feedback channels such as homepage or email.
User context:
The author produces a weekly AI news column with commentary and visual presentation. The process currently relies on multiple separate tools, manual comparison, manual source validation, and subjective quality assessment.
User needs:
Faster preparation of each episode.
Better research coverage of the weeks relevant AI news.
Stronger source quality and source transparency.
Support for finding a compelling storyline.
Support for maintaining the established column tone.
Avoidance of repeated allegories, themes, and content from earlier episodes.
Better understanding of what increases reach and resonance.
Structured use of qualitative feedback.
Support for visual and cover experimentation.
Pain points:
Current production takes approximately 23 hours.
Current work is distributed across several separate tools and duplicated steps.
No systematic use of KPIs to increase reach.
No established method for continuously securing and improving quality.
Positive feedback exists, but little improvement-oriented feedback reaches the author.
LinkedIn itself provides little actionable qualitative feedback.
External feedback currently arrives mainly through direct conversations and is not systematically usable.
Important differences between groups:
The author is the only active user and decision-maker.
Readers are the intended audience, not direct product users.
Feedback providers may contribute signals but should not influence the process without author review.
5. Current Situation / Current Process
The current KNIEPUNKT production process works as follows:
The author analyzes current AI news using Perplexity for relevance and newsworthiness for AI enthusiasts and the target audience.
The author adds personal input from AI news consumed during the week.
Optionally, the author provides an initial storyline if one is already visible across the news.
The author provides input to several LLMs, currently including Claude, Gemini, and ChatGPT, to create multiple storyline options while considering previous KNIEPUNKT episodes.
The author selects one storyline per LLM to create a complete draft.
The author selects the best draft and enriches it with input from other drafts.
The author verifies source content and searches for original sources and/or high-quality sources.
The author finalizes and rereads the text, then enters it into LinkedIn.
Based on the text, the author uses LLMs to generate visual ideas.
The author selects the best visual.
The author integrates the visual into the existing visual template and adds the KNIEPUNKT logo, title, and date.
The author uploads everything to LinkedIn as a newsletter.
The author creates a personal invitation message as a LinkedIn post.
The author schedules the contribution for Sunday at 08:30.
Existing workarounds or manual steps:
Manual comparison of outputs from different LLMs.
Manual verification of sources.
Manual selection and enrichment of drafts.
Manual development and selection of cover ideas.
Manual interpretation of feedback from direct conversations.
Manual publication and scheduling on LinkedIn.
Main gaps, bottlenecks, and failure points:
High production duration.
Duplicated workflow steps across separate tools.
Limited systematic feedback.
Limited KPI-based learning.
Unclear method for quality measurement.
Risk of weak or repetitive storylines.
Risk of unsupported claims or unsuitable sources.
Risk that a text reports news without sufficient authorial interpretation.
Risk that visuals are attractive but insufficiently connected to the episode.
What should remain unchanged:
The author keeps final editorial control.
The author personally reviews sources.
The author prioritizes the news after research.
The author decides the final cover.
The author performs final quality assurance.
The author presses the final publish/send button.
6. Functional Scope
The assistant should support the KNIEPUNKT editorial workflow from weekly topic research to publication preparation, while preserving the authors final decision authority.
Main capabilities:
Weekly AI news preparation
The assistant should collect and structure relevant current AI news candidates for the column.
Author input incorporation
The assistant should allow the author to add personally relevant news, observations, or an initial storyline.
News relevance support
The assistant should help assess which news items are relevant and newsworthy for KI enthusiasts and the target audience of decision-makers interested in moral AI.
Source suggestion and source quality assessment
The assistant should propose several sources per relevant news item where useful, distinguish primary and high-quality sources from weaker sources, and flag unsuitable sources.
Storyline development
The assistant should generate several possible storylines for an episode and make differences between them visible from an editorial perspective.
Redundancy review against previous episodes
The assistant should consider the existing 34 KNIEPUNKT episodes to reduce repetition in content, allegories, themes, and references.
Draft preparation
The assistant should prepare draft column text based on selected news, sources, storyline, tone expectations, and author input.
Draft enrichment
The assistant should support combining the strongest parts of different draft directions into one improved draft.
Tonal review
The assistant should review whether the draft remains column-like, gloss-like, amusing, culturally literate, opinionated, and appropriate for the target audience.
Factual and source quality review
The assistant should flag unsupported claims, weak sourcing, contradictory sources, unclear facts, or claims that require author verification.
Opinion and interpretation check
The assistant should identify whether the episode contains sufficient authorial opinion and reader-facing interpretation.
Length experimentation support
The assistant should propose length options and help the author learn which episode lengths work well with the audience.
Teaser experimentation support
The assistant should support different teaser text options and help analyze how teaser choices relate to audience response.
KPI and feedback learning
The assistant should collect and structure available success signals such as reach, newsletter open rate, likes, comments, shares, new subscriptions, dwell time, qualitative reader input, topic resonance, and reactions to length, teaser, and cover.
Visual idea and cover support
The assistant should develop visual ideas and cover layout suggestions, including experimental variants, while preserving recognizability of the KNIEPUNKT visual identity.
Publication preparation support
The assistant should help prepare the finalized content package for publication, including article text, teaser or invitation message, source references, and cover recommendation, but must not publish automatically.
Key user interactions:
Author provides weekly personal news input.
Author optionally provides an initial storyline.
Author reviews researched news candidates.
Author prioritizes selected news items.
Author reviews source suggestions and verifies individual sources.
Author selects or adjusts a storyline.
Author reviews and edits the draft.
Author selects cover direction.
Author performs final quality assurance.
Author publishes or schedules the LinkedIn content.
Role-based differences in usage:
Only the author actively uses the assistant.
Feedback providers may submit input through a feedback channel, but they do not interact with the assistant as users.
Readers are considered only through feedback and KPI signals.
Relevant triggers, inputs, outputs, and outcomes:
Trigger: Weekly preparation of a new KNIEPUNKT episode.
Inputs: Current AI news, author-selected news, previous KNIEPUNKT episodes, source candidates, reader feedback, KPI signals, visual identity expectations.
Outputs: Curated news list, source suggestions, source quality notes, storyline options, draft text, quality warnings, teaser options, visual ideas, cover recommendations, KPI/feedback insights.
Outcome: A faster, better prepared, better measured, and editorially stronger KNIEPUNKT episode ready for author approval and LinkedIn publication.
7. Business Rules
Editorial authority rules:
The author must retain final control over all published content.
The author must personally review and prioritize news items.
The author must personally verify individual sources before publication.
The author must decide the final cover.
The assistant must not publish or send the final LinkedIn newsletter/post automatically.
Source quality rules:
Preferred sources include primary sources.
Primary sources may include scientific publications, sources from the originators of the news, and initial sources of discussions.
Initial discussion sources may include Reddit when it is the original or relevant discussion context.
Respected journalistic sources for AI topics are suitable, including The Decoder and Heise.
Established high-quality journalistic or public broadcasting sources are suitable, including ARD, ZDF, DLF, Handelsblatt, Wirtschaftswoche, Die Zeit, and Der Spiegel.
Tabloids are unsuitable.
Unknown media are unsuitable unless the author explicitly accepts them after review.
Purely reproducing or republishing media are unsuitable as primary evidence.
Unsupported claims must be flagged.
Contradictory or unclear factual situations must be flagged.
Tone and content rules:
The column should remain column-like and gloss-like.
The column should amuse readers, including through contradictions, anecdotes, and pointed framing.
The text may include references to Greek and Roman mythology, canonical literature, and classical German literature.
The text should be suitable for a highly educated and broadly culturally literate audience.
The text must not go so deeply into technical detail that it becomes boring for the audience.
The text must not be factually wrong.
The authors opinion should appear and help contextualize the news.
An episode must not merely summarize news without interpretation.
News selection rules:
News should be relevant to AI enthusiasts and the target audience.
The assistant should help ensure that readers hear about the major topics of the week.
The authors own weekly news input must be incorporated.
The authors prioritization overrides the assistants suggestions.
Redundancy rules:
The assistant should consider previous KNIEPUNKT episodes.
Repeated allegories, repeated references, and repeated content angles should be reduced or flagged.
Length and teaser rules:
The assistant should propose length options.
The assistant should support experiments with length.
The assistant should support experiments with teaser text.
The assistant should help relate length and teaser choices to later performance signals.
Visual and cover rules:
The assistant may propose strong visual and layout experiments.
Recognizability of KNIEPUNKT must remain important.
Visual decisions should be justifiable and/or informed by expert input where available.
Cover ideas should have a recognizable connection to the episode.
The author makes the final cover decision.
KPI and feedback rules:
Reach is a key KPI.
KPI selection should be reviewed regularly.
The assistant should support additional KPI suggestions.
Qualitative feedback should be treated as a useful input source.
Feedback from a homepage and/or email address may be used as an additional resource, not as a separate user group.
Exception rules:
Too few high-quality sources must be flagged.
Contradictory sources must be flagged.
Unclear factual situations must be flagged.
Weak storylines must be flagged.
Unsuitable tone must be flagged.
Too little current or newsworthy material must be flagged.
Cover ideas without a clear relation to the episode must be flagged.
Missing opinion or missing reader-facing interpretation must be flagged.
8. Business Objects / Functional Data Objects
KNIEPUNKT Episode
A complete weekly column edition, including selected news, storyline, article text, teaser/invitation message, sources, visual direction, cover, date, and publication preparation status.
Previous KNIEPUNKT Episode
One of the existing 34 episodes used to understand tone, recurring references, prior topics, allegories, and potential redundancies.
News Item
A current AI-related development that may be relevant for the weekly episode.
Author News Input
The authors personal selection of AI news, observations, or impressions gathered during the week.
Source
A piece of evidence or reporting that supports or contextualizes a news item. Sources may be primary, high-quality journalistic, initial discussion sources, unsuitable sources, or sources requiring further review.
Source Quality Assessment
A functional classification of whether a source is suitable, preferred, weak, contradictory, or unsuitable for KNIEPUNKT use.
Storyline
An editorial framing that connects selected news items into a coherent column angle.
Draft
A prepared version of the column text before final author editing and approval.
Tone Profile
The set of editorial qualities expected from KNIEPUNKT: column-like, gloss-like, amusing, culturally literate, opinionated, and suitable for a highly educated audience.
Teaser / Invitation Message
A short LinkedIn-facing message that introduces or invites readers into the episode and may be tested in relation to performance.
Visual Idea
A concept for the episodes visual representation or cover direction.
Cover
The final visual asset for the episode, including the chosen visual, layout, KNIEPUNKT logo, title, and date.
KPI Signal
A measurable performance indicator such as reach, newsletter open rate, likes, comments, shares, new subscriptions, dwell time, or reactions to length, teaser, and cover.
Qualitative Feedback
Reader or external feedback, including direct conversation input or feedback submitted through a homepage or email address.
Quality Warning
A flagged issue that may affect acceptance of the episode, such as weak sourcing, factual uncertainty, weak storyline, unsuitable tone, missing opinion, or weak cover relevance.
9. In Scope
Support for weekly AI news research.
Incorporation of the authors personal weekly news input.
Optional incorporation of an initial author-provided storyline.
Assessment of relevance and newsworthiness for the KNIEPUNKT audience.
Suggestion of multiple sources per news item where useful.
Source quality assessment based on business-defined source categories.
Flagging of weak, contradictory, unsupported, or unsuitable sources.
Generation of multiple storyline options.
Support for reducing redundancy with previous KNIEPUNKT episodes.
Preparation of full draft text options.
Support for enriching a chosen draft with useful elements from other drafts.
Review of tone, opinion, factual grounding, and reader-facing interpretation.
Support for length experimentation.
Support for teaser experimentation.
Collection and interpretation of relevant KPIs and feedback signals.
Regular review of KPIs and potential KPI adjustments.
Development of visual ideas and cover layout suggestions.
Support for visual experimentation while maintaining KNIEPUNKT recognizability.
Preparation support for the LinkedIn newsletter and related invitation post.
Quality assurance support before final author approval.
10. Out of Scope
Automatic publication or sending of the LinkedIn newsletter/post.
Removing the author from final quality control.
Automatic final prioritization of news without author decision.
Automatic acceptance of sources without author review.
Automatic final cover selection without author decision.
Treating readers, feedback providers, or experts as active assistant users.
Producing content that is too technically deep for the intended audience.
Using tabloids, unknown media, or purely reproducing media as reliable primary support without explicit author review.
Publishing claims that are unsupported, factually uncertain without disclosure, or based on false sources.
Replacing the authors opinion with neutral summarization only.
11. Requirements
A. Weekly Research and News Preparation
The assistant shall prepare a weekly list of current AI news candidates relevant to KNIEPUNKT.
The assistant shall allow the authors personally relevant weekly news input to be included in the preparation.
The assistant shall allow an optional author-provided initial storyline to influence the episode preparation.
The assistant shall distinguish between news relevance for general AI enthusiasts and relevance for the target audience of decision-makers interested in moral AI.
The assistant shall help identify the major AI topics that readers should be aware of for the week.
B. Source Support and Verification Preparation
The assistant shall suggest multiple sources per news item where useful.
The assistant shall identify whether a source appears to be a primary source, a respected AI journalism source, an established high-quality journalistic source, an initial discussion source, or a weaker source.
The assistant shall flag tabloids, unknown media, and purely reproducing media as unsuitable or requiring author review.
The assistant shall flag claims that lack adequate source support.
The assistant shall flag contradictory sources for author review.
The assistant shall flag unclear factual situations before the episode is finalized.
The assistant shall present source suggestions in a way that supports the authors personal review and prioritization.
C. Storyline and Draft Development
The assistant shall generate multiple storyline options for each episode.
The assistant shall make the editorial difference between storyline options understandable to the author.
The assistant shall support selection and refinement of a preferred storyline.
The assistant shall prepare draft column text based on selected news, sources, storyline, author input, and tone expectations.
The assistant shall support combining strong elements from multiple drafts into one improved draft.
The assistant shall identify weak storylines and explain why they may not be suitable.
D. Tone, Style, and Editorial Quality
The assistant shall evaluate whether a draft matches the KNIEPUNKT tone: column-like, gloss-like, amusing, culturally literate, and opinionated.
The assistant shall support references to Greek mythology, Roman mythology, canonical literature, and classical German literature where suitable.
The assistant shall flag text that becomes too technically detailed for the intended audience.
The assistant shall flag text that lacks authorial opinion.
The assistant shall flag text that lacks reader-facing interpretation.
The assistant shall help illuminate contradictions and anecdotes that make the column amusing.
The assistant shall support the author in filtering news rather than merely listing news.
E. Redundancy Management
The assistant shall consider previous KNIEPUNKT episodes when preparing new storylines and drafts.
The assistant shall flag repeated allegories, repeated references, or repeated content angles.
The assistant shall support variation while preserving the recognizable KNIEPUNKT style.
F. Length and Teaser Experimentation
The assistant shall propose length options for an episode.
The assistant shall help the author experiment with different episode lengths.
The assistant shall propose teaser or invitation text options.
The assistant shall support analysis of how length and teaser choices relate to audience response.
The assistant shall record which length and teaser approaches were used for later comparison.
G. KPI and Feedback Learning
The assistant shall support collection and interpretation of reach-related performance signals.
The assistant shall support consideration of newsletter open rate, where available.
The assistant shall support consideration of likes, comments, shares, new subscriptions, dwell time, qualitative reader comments, topic resonance, and reactions to length, teaser, and cover.
The assistant shall allow additional KPI suggestions to be considered.
The assistant shall support regular review of selected KPIs.
The assistant shall help convert qualitative reader feedback into usable editorial learning.
The assistant shall treat feedback from homepage or email channels as input resources, not as separate user interactions.
H. Visual and Cover Support
The assistant shall propose visual ideas based on the finalized or near-finalized episode text.
The assistant shall propose cover layout variants where useful.
The assistant shall allow strong visual experimentation.
The assistant shall preserve recognizability of the KNIEPUNKT visual identity.
The assistant shall flag cover ideas that lack a clear connection to the episode.
The assistant shall support justifiable visual decisions and may incorporate expert input where available.
The assistant shall leave the final cover decision to the author.
I. Publication Preparation and Control
The assistant shall prepare the content package needed for final author review, including article text, teaser/invitation message, source references, and cover recommendation.
The assistant shall support final quality assurance before publication.
The assistant shall not publish, send, or schedule the LinkedIn newsletter or post without the authors final action.
The assistant shall make unresolved source, factual, tonal, or visual issues visible before final approval.
12. Open Questions / Items to Clarify
Which exact KPIs are available from LinkedIn for the newsletter and related posts?
How should “reach” be defined for KNIEPUNKT: impressions, unique readers, newsletter opens, post reach, or another metric?
What KPI review cadence should be used?
What minimum improvement threshold qualifies as “sustainably better”?
What length variants should be tested first?
How should teaser experiments be compared when topics differ from week to week?
Which visual identity elements are mandatory for KNIEPUNKT recognizability?
What level of expert input is expected for cover decisions?
How should qualitative reader feedback be categorized?
How should feedback from direct conversations be captured without over-formalizing the authors process?
What role should a homepage or email feedback channel play in the first version of the assistant?
How should the assistant distinguish between a useful initial discussion source and an unreliable discussion thread?
How strict should the assistant be when flagging unknown but potentially original sources?
Which previous KNIEPUNKT episodes should be treated as the core style reference if some episodes performed better than others?
What exact acceptance baseline should be used for production time reduction?
13. Risks and Ambiguities
“Quality” is important but not yet fully operationalized; without clearer quality dimensions, the assistant may over-optimize for reach or superficial metrics.
KPI availability may be limited, which could restrict the assistants ability to measure success.
Reach may be influenced by LinkedIn distribution patterns outside the authors control, making causal interpretation difficult.
Length, teaser, topic, and cover experiments may overlap, making it hard to isolate what caused improved performance.
The desired tone combines humor, moral seriousness, cultural references, and current AI news; poor balancing could make the column either too frivolous or too dry.
Source quality expectations are high; if source assessment is too loose, factual trust may suffer.
If source assessment is too strict, relevant emerging AI discussions may be excluded too early.
Visual experimentation may weaken recognizability if minimum identity rules are not defined.
Feedback from direct conversations may be biased toward positive or socially desirable responses.
The assistant could accidentally produce polished but generic commentary unless authorial opinion remains explicit.
Without clear review points, the assistant might increase preparation options rather than reduce total production time.
14. Acceptance Perspective
The product should be accepted as successful from a business perspective when the following statements are true:
The author can produce a KNIEPUNKT episode faster than the current 23 hour process.
The author still feels in full editorial control.
The assistant reliably prepares relevant weekly AI news candidates.
The assistant improves the availability and clarity of source options.
The assistant helps prevent unsupported claims and weak sourcing.
The assistant helps maintain the recognizable KNIEPUNKT tone.
The assistant flags missing opinion or missing reader-facing interpretation.
The assistant helps reduce repetition across episodes.
The assistant supports meaningful experimentation with length, teaser, topic framing, and cover direction.
The assistant makes relevant performance metrics visible and reviewable.
The assistant helps the author learn from KPIs and qualitative feedback.
Key success metrics become measurable and improve sustainably over time.
The author does not feel that the assistant produces generic AI commentary instead of KNIEPUNKT.
The assistant supports publication preparation but never bypasses final author approval.
15. Glossary
Original term English explanation Notes / context
KNIEPUNKT Name of the LinkedIn column and initiative A column by Dr. André Knie about current AI news and reflections
Kniepunkt Individual episode or brand term of the column Should remain untranslated because it is the columns proper name
Kolumne Column Editorial format with recurring authorial voice
Glosse / glossenhaft Gloss-like commentary Amusing, pointed, opinionated, often highlighting contradictions
Mittelstand German medium-sized business sector Target audience includes CEOs and decision-makers from this context
moralische KI Moral AI The target audience is interested in ethical and moral implications of AI
Rezipienten Recipients / readers Refers to the columns intended audience
Entscheider Decision-makers Includes business and public administration leaders
öffentlich-rechtlich Public broadcasting Used as an indicator of established, high-quality journalism in Germany
Primärquelle Primary source Original source of a claim, research result, discussion, or announcement
Qualitätsquelle High-quality source Trusted source suitable for factual support
Boulevard Blätter Tabloids Explicitly unsuitable source category
The Decoder German-language AI journalism source Named as a suitable AI topic source
Heise German technology journalism source Named as a suitable AI topic source
ARD / ZDF / DLF German public broadcasting sources Named as suitable established sources
Handelsblatt / Wirtschaftswoche / Die Zeit / Der Spiegel Established German journalistic sources Named as suitable high-quality journalistic sources
Storyline Editorial framing or narrative angle Connects selected news into a coherent column
Teasertext Teaser or invitation text LinkedIn-facing text that introduces the episode
Cover Episode visual Includes visual idea, layout, title, logo, and date
Wiedererkennbarkeit Recognizability The KNIEPUNKT visual identity should remain recognizable despite experimentation
KPI Key performance indicator Includes reach, open rate, likes, comments, shares, subscriptions, dwell time, and feedback signals
Reichweite Reach A central success metric, exact operational definition still open
Verweildauer Dwell time Potential indicator of reader engagement
Themenresonanz Topic resonance How strongly a topic appears to connect with the audience
View File
+114
View File
@@ -0,0 +1,114 @@
"""Draft generation across all configured providers and author selection."""
from rich.console import Console
from rich.panel import Panel
from rich.prompt import Prompt
console = Console()
_DRAFT_SYSTEM = """Du bist ein erfahrener Ghostwriter für die LinkedIn-Kolumne KNIEPUNKT von Dr. André Knie.
Tonvorgaben:
- Kolumnenhaft und glossenhaft: pointiert, amüsant, Widersprüche und Anekdoten nutzen
- Kulturell gebildet: griechische/römische Mythologie, Kanonliteratur und klassische deutsche Literatur willkommen
- Meinungsstark: die Meinung des Autors muss deutlich erkennbar sein
- Nicht zu technisch: Entscheider-Zielgruppe, kein Tech-Deep-Dive
- Lesernahe Interpretation: nicht nur Nachrichten referieren, sondern einordnen und bewerten
Format: LinkedIn Newsletter-Artikel, 600900 Wörter. Sprache: Deutsch.
Füge am Ende an: ## Quellen (nummeriert mit URL/Fundort)."""
_ENRICHMENT_SYSTEM = _DRAFT_SYSTEM + (
"\n\nDu erhältst einen bestehenden Entwurf und Überarbeitungshinweise. "
"Ändere nur, was explizit verlangt wird. Behalte Ton, Meinung und Aufhänger bei."
)
def _build_prompt(
storyline_text: str,
storyline_choice: int,
adjustments: str,
news_digest: str,
source_assessment: str,
author_input: dict,
) -> str:
adj = f"\nAnpassungen des Autors: {adjustments}" if adjustments else ""
return f"""Schreibe einen vollständigen KNIEPUNKT-Artikel.
Ausgewählte Storyline (Option {storyline_choice}):
{storyline_text}
{adj}
Verfügbare Nachrichten:
{news_digest}
Quellenbewertung (für Quellenauswahl beachten):
{source_assessment[:800]}
Persönliche Notizen des Autors:
{author_input['author_news'][:500]}
Schreibe jetzt den vollständigen Artikel im KNIEPUNKT-Stil.
Anhang: ## Quellen (nummeriert mit URL/Fundort)."""
def generate_drafts(
providers: list,
storyline_text: str,
storyline_choice: int,
adjustments: str,
news_digest: str,
source_assessment: str,
author_input: dict,
) -> dict[str, str]:
"""Run draft generation on all providers. Returns {provider_name: draft}."""
prompt = _build_prompt(storyline_text, storyline_choice, adjustments, news_digest, source_assessment, author_input)
messages = [{"role": "user", "content": prompt}]
results = {}
for provider in providers:
console.print(f"\n[yellow]Schreibe Entwurf mit {provider.name}...[/yellow]")
try:
results[provider.name] = provider.chat(messages, _DRAFT_SYSTEM, max_tokens=4096)
except Exception as e:
console.print(f"[red]{provider.name} übersprungen: {e}[/red]")
return results
def select_draft(results: dict[str, str]) -> tuple[str, str]:
"""Show all drafts, return (provider_name, selected_draft_text)."""
if not results:
raise RuntimeError("Kein Modell hat einen Entwurf geliefert. API-Keys und Verbindung prüfen.")
provider_names = list(results.keys())
for name, draft in results.items():
console.print(Panel(draft, title=f"Entwurf {name}", border_style="green"))
console.print()
if len(provider_names) > 1:
choice = Prompt.ask(
"Welchen Entwurf als Basis verwenden?",
choices=provider_names,
default=provider_names[0],
)
else:
choice = provider_names[0]
return choice, results[choice]
def enrich_draft(client, draft: str, author_feedback: str) -> str:
"""Refine the selected draft based on author feedback (Claude only)."""
from kniepunkt.llm import chat
console.print("\n[yellow]Überarbeite Entwurf...[/yellow]")
prompt = f"""Überarbeite diesen KNIEPUNKT-Entwurf basierend auf den folgenden Autorenhinweisen.
Aktueller Entwurf:
{draft}
Hinweise des Autors:
{author_feedback}"""
return chat(client, [{"role": "user", "content": prompt}], _ENRICHMENT_SYSTEM, max_tokens=4096)
+133
View File
@@ -0,0 +1,133 @@
"""Load and index existing KNIEPUNKT episodes for redundancy checks."""
import json
from pathlib import Path
EPISODES_DIR = Path(__file__).parent.parent / "KNIEPUNKTe"
CACHE_FILE = Path(__file__).parent.parent / "episodes_cache.json"
_SYSTEM = (
"Du bist ein erfahrener Redaktionsassistent für die LinkedIn-Kolumne KNIEPUNKT "
"von Dr. André Knie. Analysiere Episodentexte präzise und strukturiert."
)
def _read_pdf(path: Path) -> str:
from pypdf import PdfReader
reader = PdfReader(str(path))
return "\n".join(page.extract_text() or "" for page in reader.pages)
def _read_docx(path: Path) -> str:
from docx import Document
doc = Document(str(path))
return "\n".join(p.text for p in doc.paragraphs)
def _read_odt(path: Path) -> str:
from odf.opendocument import load
from odf.text import P
doc = load(str(path))
paragraphs = doc.getElementsByType(P)
return "\n".join(
"".join(node.data for node in p.childNodes if hasattr(node, "data"))
for p in paragraphs
)
def _read_episode(path: Path) -> str:
suffix = path.suffix.lower()
if suffix == ".pdf":
return _read_pdf(path)
if suffix == ".docx":
return _read_docx(path)
if suffix == ".odt":
return _read_odt(path)
return ""
def _episode_files() -> list[Path]:
"""Return one canonical file per episode number, preferring DOCX/ODT over PDF."""
if not EPISODES_DIR.exists():
return []
by_number: dict[str, Path] = {}
for f in sorted(EPISODES_DIR.iterdir()):
if f.suffix.lower() not in (".pdf", ".docx", ".odt"):
continue
num = f.name.split("_")[0].split(" ")[0].strip()
try:
int(num)
except ValueError:
continue
existing = by_number.get(num)
if existing is None or f.suffix.lower() in (".docx", ".odt"):
by_number[num] = f
return [by_number[k] for k in sorted(by_number)]
def build_index(client, force: bool = False) -> list[dict]:
"""Build or load the episode summary index."""
if not force and CACHE_FILE.exists():
with open(CACHE_FILE) as f:
return json.load(f)
from kniepunkt.llm import chat
index = []
files = _episode_files()
for path in files:
text = _read_episode(path)
if not text.strip():
continue
prompt = f"""Analysiere diese KNIEPUNKT-Episode und antworte NUR mit einem JSON-Objekt:
{{
"nummer": "z.B. 001",
"titel": "Titel der Episode",
"hauptthema": "Hauptthema in 1-2 Sätzen",
"allegories": ["verwendete Allegorie oder Metapher", ...],
"kulturelle_referenzen": ["Mythos/Literatur-Referenz", ...],
"kernargument": "Hauptaussage des Autors in 1-2 Sätzen"
}}
Episodentext (gekürzt):
{text[:5000]}"""
response = chat(client, [{"role": "user", "content": prompt}], _SYSTEM, max_tokens=512)
try:
start = response.find("{")
end = response.rfind("}") + 1
data = json.loads(response[start:end])
data["file"] = str(path)
index.append(data)
except (json.JSONDecodeError, ValueError):
index.append({
"nummer": path.name.split("_")[0].strip(),
"titel": path.stem,
"hauptthema": "",
"allegories": [],
"kulturelle_referenzen": [],
"kernargument": "",
"file": str(path),
})
with open(CACHE_FILE, "w") as f:
json.dump(index, f, ensure_ascii=False, indent=2)
return index
def format_for_context(index: list[dict]) -> str:
"""Format the episode index as a compact context string for prompts."""
lines = []
for ep in index:
allegs = ", ".join(ep.get("allegories", [])) or ""
refs = ", ".join(ep.get("kulturelle_referenzen", [])) or ""
lines.append(
f"Ep.{ep.get('nummer', '?')} »{ep.get('titel', '?')}«: "
f"{ep.get('hauptthema', '')} | Allegorien: {allegs} | Referenzen: {refs}"
)
return "\n".join(lines)
+78
View File
@@ -0,0 +1,78 @@
"""Anthropic client and chat helpers."""
import os
from typing import Any
import anthropic
MODEL = "claude-sonnet-4-6"
MAX_TOKENS = 8096
def get_client() -> anthropic.Anthropic:
api_key = os.environ.get("ANTHROPIC_API_KEY")
if not api_key:
raise RuntimeError("ANTHROPIC_API_KEY environment variable not set.")
return anthropic.Anthropic(api_key=api_key)
def chat(
client: anthropic.Anthropic,
messages: list[dict],
system: str,
max_tokens: int = MAX_TOKENS,
) -> str:
response = client.messages.create(
model=MODEL,
max_tokens=max_tokens,
system=system,
messages=messages,
)
return _extract_text(response.content)
_MAX_SEARCH_ITERATIONS = 10
def chat_with_search(
client: anthropic.Anthropic,
messages: list[dict],
system: str,
) -> str:
"""Run a conversation with web search enabled. Loops on client-side tool_use only."""
current_messages = list(messages)
for _ in range(_MAX_SEARCH_ITERATIONS):
response = client.messages.create(
model=MODEL,
max_tokens=MAX_TOKENS,
system=system,
tools=[{"type": "web_search_20250305", "name": "web_search"}],
messages=current_messages,
)
if response.stop_reason == "end_turn":
return _extract_text(response.content)
if response.stop_reason == "tool_use":
current_messages.append({"role": "assistant", "content": response.content})
# Only handle client-side tool_use blocks; server_tool_use results are
# already embedded in the response and must not be echoed back.
tool_results = [
{"type": "tool_result", "tool_use_id": block.id, "content": ""}
for block in response.content
if getattr(block, "type", None) == "tool_use"
]
if tool_results:
current_messages.append({"role": "user", "content": tool_results})
else:
return _extract_text(response.content)
return _extract_text(response.content)
def _extract_text(content: list[Any]) -> str:
parts = []
for block in content:
if hasattr(block, "text"):
parts.append(block.text)
return "\n".join(parts)
+109
View File
@@ -0,0 +1,109 @@
"""LLM provider abstraction. Each provider wraps one vendor SDK."""
import os
from rich.console import Console
_console = Console()
class Provider:
name: str
def chat(self, messages: list[dict], system: str, max_tokens: int = 4096) -> str:
raise NotImplementedError
class AnthropicProvider(Provider):
name = "Claude"
def __init__(self):
import anthropic
self._client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
def chat(self, messages: list[dict], system: str, max_tokens: int = 4096) -> str:
response = self._client.messages.create(
model="claude-sonnet-4-6",
max_tokens=max_tokens,
system=system,
messages=messages,
)
return response.content[0].text
class OpenAIProvider(Provider):
name = "ChatGPT"
def __init__(self):
from openai import OpenAI
self._client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
def chat(self, messages: list[dict], system: str, max_tokens: int = 4096) -> str:
oai_messages = [{"role": "system", "content": system}] + messages
response = self._client.chat.completions.create(
model="gpt-4o",
max_tokens=max_tokens,
messages=oai_messages,
)
return response.choices[0].message.content
class GeminiProvider(Provider):
name = "Gemini"
def __init__(self):
import google.generativeai as genai
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
self._genai = genai
def chat(self, messages: list[dict], system: str, max_tokens: int = 4096) -> str:
model = self._genai.GenerativeModel(
model_name="gemini-2.0-flash",
system_instruction=system,
)
# Convert role "assistant" → "model" for Gemini
contents = [
{"role": "model" if m["role"] == "assistant" else "user", "parts": [m["content"]]}
for m in messages
]
response = model.generate_content(
contents,
generation_config=self._genai.types.GenerationConfig(max_output_tokens=max_tokens),
)
return response.text
class MistralProvider(Provider):
name = "Mistral"
def __init__(self):
from mistralai import Mistral
self._client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])
def chat(self, messages: list[dict], system: str, max_tokens: int = 4096) -> str:
mistral_messages = [{"role": "system", "content": system}] + messages
response = self._client.chat.complete(
model="mistral-large-latest",
max_tokens=max_tokens,
messages=mistral_messages,
)
return response.choices[0].message.content
_REGISTRY = [
("ANTHROPIC_API_KEY", AnthropicProvider),
("OPENAI_API_KEY", OpenAIProvider),
("GOOGLE_API_KEY", GeminiProvider),
("MISTRAL_API_KEY", MistralProvider),
]
def get_configured() -> list[Provider]:
"""Return instantiated providers for every API key that is set. Skips on init error."""
result = []
for env_var, cls in _REGISTRY:
if os.environ.get(env_var):
try:
result.append(cls())
except Exception as e:
_console.print(f"[yellow][Warnung] {cls.__name__} konnte nicht initialisiert werden: {e}[/yellow]")
return result
+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
+41
View File
@@ -0,0 +1,41 @@
"""Quality review: tone, opinion, sources, redundancy."""
from rich.console import Console
from rich.panel import Panel
console = Console()
_SYSTEM = """Du bist ein strenger Redaktions-Qualitätsprüfer für die KNIEPUNKT-Kolumne.
Flagge Probleme klar mit: [SCHWACHE QUELLE] [FEHLENDER BELEG] [ZU TECHNISCH] [FEHLENDE MEINUNG] [FEHLENDE EINORDNUNG] [REDUNDANZ] [TON-PROBLEM] [FAKTENPROBLEM]
Sei direkt und konstruktiv. Weise auch auf Stärken hin."""
def review(client, draft: str, source_assessment: str, episodes_context: str) -> str:
"""Full quality review of the draft."""
from kniepunkt.llm import chat
console.print("\n[yellow]Qualitätsprüfung...[/yellow]")
prompt = f"""Führe eine vollständige Qualitätsprüfung dieses KNIEPUNKT-Entwurfs durch.
Entwurf:
{draft}
Quellenbewertung:
{source_assessment[:800]}
Frühere Episoden (Redundanzcheck):
{episodes_context[:1500]}
Prüfe:
1. **Ton** Kolumnenhaft, amüsant, pointiert? Zielgruppengerecht?
2. **Meinung** Kommt die Autorenmeinung deutlich vor?
3. **Einordnung** Lesernahe Interpretation oder nur Nachrichtenzusammenfassung?
4. **Quellen** Belege ausreichend? Schwache oder fehlende Quellen?
5. **Redundanz** Allegorien, Referenzen oder Winkel aus früheren Episoden wiederholt?
6. **Technische Tiefe** Zu technisch für die Zielgruppe?
7. **Fakten** Ungesicherte oder widersprüchliche Aussagen?
8. **Stärken** Was funktioniert besonders gut?
Gesamtbewertung: 🟢 bereit zur Freigabe / 🟡 kleine Anpassungen nötig / 🔴 überarbeiten"""
return chat(client, [{"role": "user", "content": prompt}], _SYSTEM, max_tokens=2048)
+100
View File
@@ -0,0 +1,100 @@
"""News research: web search via Claude + author personal input."""
from rich.console import Console
from rich.panel import Panel
console = Console()
_RESEARCH_SYSTEM = """Du bist ein erfahrener Redaktionsassistent für die LinkedIn-Kolumne KNIEPUNKT von Dr. André Knie.
KNIEPUNKT richtet sich an CEOs, Führungskräfte des Mittelstands, Konzerne und öffentliche Verwaltung alle mit Interesse an moralischer KI.
Geeignete Quellen: The Decoder, Heise, ARD, ZDF, DLF, Handelsblatt, Wirtschaftswoche, Die Zeit, Der Spiegel, wissenschaftliche Publikationen, Reddit (wenn originaler Diskussionskontext), offizielle Unternehmens-Ankündigungen.
Ungeeignete Quellen: Boulevardzeitungen, unbekannte Medien, reine Aggregatoren ohne eigene Recherche.
Präsentiere Ergebnisse klar strukturiert auf Deutsch."""
_SOURCE_SYSTEM = """Du bist ein strenger Quellen-Prüfer für die KNIEPUNKT-Kolumne.
Bewerte jede Quelle nach: Primärquelle | KI-Fachjournalismus | etablierte Qualitätspresse | Erstdiskussionsquelle | schwache Quelle | ungeeignet.
Flags: [FEHLENDER BELEG] [WIDERSPRUCH] [UNKLARE FAKTENLAGE] [AUTOR-PRÜFUNG ERFORDERLICH]."""
def get_author_input() -> dict:
"""Collect the author's personal news input and optional initial storyline."""
console.print(Panel(
"[bold]Schritt 1: Ihre persönlichen Nachrichten und Notizen[/bold]\n\n"
"Bitte geben Sie Ihre KI-Nachrichten der Woche ein.\n"
"(URLs, Schlagzeilen, Beobachtungen eine Leerzeile zum Abschließen)",
title="KNIEPUNKT Wöchentliche Recherche",
border_style="cyan",
))
lines = []
while True:
line = input()
if line == "" and lines:
break
elif line:
lines.append(line)
console.print("\n[dim]Haben Sie bereits eine Storyline-Idee? (Enter zum Überspringen)[/dim]")
initial_storyline = input().strip() or None
return {"author_news": "\n".join(lines), "initial_storyline": initial_storyline}
def research_news(client, author_input: dict, episodes_context: str) -> str:
"""Use Claude with web search to research current AI news."""
from kniepunkt.llm import chat_with_search
import datetime
console.print("\n[yellow]Recherchiere aktuelle KI-Nachrichten...[/yellow]")
today = datetime.date.today().strftime("%d.%m.%Y")
prompt = f"""Recherchiere die wichtigsten KI-Nachrichten der aktuellen Woche (Stand: {today}) für die LinkedIn-Kolumne KNIEPUNKT.
Autoreneingabe (bereits bekannte Nachrichten und Notizen):
{author_input['author_news']}
Frühere KNIEPUNKT-Episoden (zur Orientierung, was bereits behandelt wurde):
{episodes_context[:2000]}
Aufgabe:
1. Suche nach 58 wichtigen KI-Entwicklungen dieser Woche
2. Priorisiere: Was sollten Entscheider mit Interesse an moralischer KI unbedingt wissen?
3. Kombiniere Recherche-Ergebnisse mit den Autoreneingaben (Dopplungen vermeiden)
Ausgabeformat für jeden Nachrichten-Kandidaten:
### [N]. [Titel]
**Zusammenfassung:** 2-3 Sätze
**Quelle(n):** Name URL
**Relevanz für KNIEPUNKT-Zielgruppe:** 1 Satz"""
return chat_with_search(
client,
[{"role": "user", "content": prompt}],
_RESEARCH_SYSTEM,
)
def assess_sources(client, news_digest: str) -> str:
"""Assess source quality for all news items in the digest."""
from kniepunkt.llm import chat
console.print("\n[yellow]Bewerte Quellen...[/yellow]")
prompt = f"""Bewerte alle Quellen in diesem Nachrichten-Digest für KNIEPUNKT:
{news_digest}
Für jede Quelle:
- Qualitätsstufe (Primärquelle / KI-Fachjournalismus / Qualitätspresse / Erstdiskussion / schwach / ungeeignet)
- Kurze Begründung (1 Satz)
- Relevante Flags
Falls Quellen fehlen oder schwach sind: schlage konkret bessere Alternativen vor."""
return chat(
client,
[{"role": "user", "content": prompt}],
_SOURCE_SYSTEM,
)
+38
View File
@@ -0,0 +1,38 @@
"""Session state: save and load the weekly editorial workflow state."""
import json
from datetime import datetime
from pathlib import Path
SESSIONS_DIR = Path(__file__).parent.parent / "sessions"
STEPS = ["research", "sources", "storyline", "draft", "quality", "publication", "done"]
def new_session() -> dict:
return {
"date": datetime.today().strftime("%Y-%m-%d"),
"step": "research",
"research": None,
"sources": None,
"storyline": None,
"draft": None,
"quality": None,
"publication": None,
}
def save(session: dict) -> None:
SESSIONS_DIR.mkdir(exist_ok=True)
path = SESSIONS_DIR / f"{session['date']}.json"
with open(path, "w") as f:
json.dump(session, f, ensure_ascii=False, indent=2)
def load_latest() -> dict | None:
if not SESSIONS_DIR.exists():
return None
files = sorted(SESSIONS_DIR.glob("*.json"), reverse=True)
if not files:
return None
with open(files[0]) as f:
return json.load(f)
+95
View File
@@ -0,0 +1,95 @@
"""Storyline generation across all configured providers and author selection."""
from rich.console import Console
from rich.panel import Panel
from rich.prompt import IntPrompt, Prompt
console = Console()
_SYSTEM = """Du bist ein erfahrener Redaktionsassistent für die LinkedIn-Kolumne KNIEPUNKT von Dr. André Knie.
KNIEPUNKT ist kolumnenhaft, glossenhaft, amüsant, kulturell gebildet und meinungsstark.
Erlaubt: griechische/römische Mythologie, Kanonliteratur, klassische deutsche Literatur.
Zielgruppe: hochgebildete Entscheider aus Mittelstand, Konzernen und öffentlicher Verwaltung mit Interesse an moralischer KI.
Eine Storyline verbindet ausgewählte Nachrichten zu einem kohärenten redaktionellen Blickwinkel kein neutrales Nachrichtenreferat."""
def _build_prompt(news_digest: str, source_assessment: str, author_input: dict, episodes_context: str) -> str:
initial = (
f"\nVorläufige Autorenstoryline: {author_input['initial_storyline']}"
if author_input.get("initial_storyline")
else ""
)
return f"""Entwickle 3 klar unterschiedliche Storyline-Optionen für die nächste KNIEPUNKT-Episode.
Nachrichten dieser Woche:
{news_digest}
Quellenbewertung (berücksichtigen):
{source_assessment[:800]}
Frühere Episoden Redundanzvermeidung:
{episodes_context[:2000]}
{initial}
Für jede Storyline:
**Option [N]: [Arbeitstitel]**
- **Kernwinkel:** Was ist der redaktionelle Blickwinkel? (2-3 Sätze)
- **Nachrichten-Auswahl:** Welche 2-3 Nachrichten werden verwendet und wie verknüpft?
- **Einstiegsidee:** Konkrete Idee für den ersten Satz oder Absatz
- **Allegorischer Rahmen:** Mythologie, Literatur oder kulturelle Referenz (falls passend)
- **Unterschied** zu den anderen Optionen
- **Stärken / Risiken**
Vermeide: Redundanzen zu früheren Episoden, reines Nachrichtenreferat ohne Meinung, zu technische Tiefe."""
def generate_storylines(
providers: list,
news_digest: str,
source_assessment: str,
author_input: dict,
episodes_context: str,
) -> dict[str, str]:
"""Run storyline generation on all providers. Returns {provider_name: result}."""
prompt = _build_prompt(news_digest, source_assessment, author_input, episodes_context)
messages = [{"role": "user", "content": prompt}]
results = {}
for provider in providers:
console.print(f"\n[yellow]Generiere Storylines mit {provider.name}...[/yellow]")
try:
results[provider.name] = provider.chat(messages, _SYSTEM, max_tokens=4096)
except Exception as e:
console.print(f"[red]{provider.name} übersprungen: {e}[/red]")
return results
def select_storyline(results: dict[str, str]) -> tuple[str, int, str, str]:
"""Show all provider results, return (provider_name, choice, selected_text, adjustments)."""
if not results:
raise RuntimeError("Kein Modell hat Storylines geliefert. API-Keys und Verbindung prüfen.")
provider_names = list(results.keys())
for name, text in results.items():
console.print(Panel(text, title=f"Storylines {name}", border_style="cyan"))
console.print()
if len(provider_names) > 1:
provider_choice = Prompt.ask(
"Von welchem Modell möchten Sie eine Storyline wählen?",
choices=provider_names,
default=provider_names[0],
)
else:
provider_choice = provider_names[0]
option_choice = IntPrompt.ask(
f"Welche Storyline von {provider_choice}? (1/2/3)",
choices=["1", "2", "3"],
default=1,
)
console.print("\n[dim]Anpassungen oder zusätzliche Hinweise zur gewählten Storyline? (Enter zum Überspringen)[/dim]")
adjustments = input().strip()
return provider_choice, option_choice, results[provider_choice], adjustments
+202
View File
@@ -0,0 +1,202 @@
#!/usr/bin/env python3
"""KNIEPUNKT Assistant — weekly editorial workflow for Dr. André Knie."""
from rich.console import Console
from rich.panel import Panel
from rich.prompt import Confirm
from kniepunkt.llm import get_client
from kniepunkt.providers import get_configured
from kniepunkt import episodes as ep_module
from kniepunkt import session as sess_module
from kniepunkt import research, storyline, drafting, quality, publication
console = Console()
def _header():
console.print(Panel(
"[bold cyan]KNIEPUNKT Assistant[/bold cyan]\n"
"[dim]Redaktioneller Workflow · Dr. André Knie[/dim]",
border_style="cyan",
))
def _build_or_load_index(client) -> list[dict]:
import json
from pathlib import Path
cache = Path("episodes_cache.json")
if cache.exists():
rebuild = Confirm.ask("\n[dim]Episode-Index vorhanden. Neu aufbauen?[/dim]", default=False)
if not rebuild:
with open(cache) as f:
index = json.load(f)
console.print(f"[green]Episode-Index: {len(index)} Episoden geladen[/green]")
return index
console.print("\n[yellow]Baue Episode-Index auf (einmalig, danach gecacht)...[/yellow]")
index = ep_module.build_index(client, force=True)
console.print(f"[green]Episode-Index erstellt: {len(index)} Episoden[/green]")
return index
def _run(client, providers: list, session: dict, index: list):
episodes_context = ep_module.format_for_context(index)
# ── 1. Research ──────────────────────────────────────────────────────────
if session["step"] == "research":
author_input = research.get_author_input()
news_digest = research.research_news(client, author_input, episodes_context)
console.print(Panel(news_digest, title="Nachrichten-Kandidaten", border_style="green"))
session["research"] = {"author_input": author_input, "news_digest": news_digest}
session["step"] = "sources"
sess_module.save(session)
# ── 2. Source assessment ─────────────────────────────────────────────────
if session["step"] == "sources":
source_assessment = research.assess_sources(client, session["research"]["news_digest"])
console.print(Panel(source_assessment, title="Quellenbewertung", border_style="yellow"))
if not Confirm.ask("\nWeiter zur Storyline-Entwicklung?", default=True):
console.print("[dim]Session gespeichert. Neustart setzt hier fort.[/dim]")
return
session["sources"] = source_assessment
session["step"] = "storyline"
sess_module.save(session)
# ── 3. Storyline ─────────────────────────────────────────────────────────
if session["step"] == "storyline":
results = storyline.generate_storylines(
providers,
session["research"]["news_digest"],
session["sources"],
session["research"]["author_input"],
episodes_context,
)
provider_name, choice, selected_text, adjustments = storyline.select_storyline(results)
session["storyline"] = {
"results": results,
"selected_provider": provider_name,
"choice": choice,
"selected_text": selected_text,
"adjustments": adjustments,
}
session["step"] = "draft"
sess_module.save(session)
# ── 4. Draft ─────────────────────────────────────────────────────────────
if session["step"] == "draft":
sl = session["storyline"]
draft_results = drafting.generate_drafts(
providers,
sl["selected_text"],
sl["choice"],
sl["adjustments"],
session["research"]["news_digest"],
session["sources"],
session["research"]["author_input"],
)
provider_name, draft = drafting.select_draft(draft_results)
console.print("\n[dim]Überarbeitungshinweise? (Enter = Entwurf übernehmen)[/dim]")
feedback = input().strip()
if feedback:
draft = drafting.enrich_draft(client, draft, feedback)
console.print(Panel(draft, title="Überarbeiteter Entwurf", border_style="green"))
session["draft_results"] = draft_results
session["draft"] = draft
session["step"] = "quality"
sess_module.save(session)
# ── 5. Quality review ────────────────────────────────────────────────────
if session["step"] == "quality":
quality_report = quality.review(
client,
session["draft"],
session["sources"],
episodes_context,
)
console.print(Panel(quality_report, title="Qualitätsprüfung", border_style="yellow"))
console.print("\n[dim]Weitere Überarbeitungen? (Enter = weiter zur Publikation)[/dim]")
feedback = input().strip()
if feedback:
draft = drafting.enrich_draft(client, session["draft"], feedback)
session["draft"] = draft
console.print(Panel(draft, title="Finalisierter Entwurf", border_style="green"))
session["quality"] = quality_report
session["step"] = "publication"
sess_module.save(session)
# ── 6. Publication prep ──────────────────────────────────────────────────
if session["step"] == "publication":
teasers = publication.generate_teasers(client, session["draft"])
console.print(Panel(teasers, title="Teaser-Varianten", border_style="cyan"))
visual_ideas = publication.generate_visual_ideas(client, session["draft"])
console.print(Panel(visual_ideas, title="Cover-Ideen", border_style="cyan"))
out_path = publication.save_package(
session["date"],
session["draft"],
teasers,
session["sources"],
visual_ideas,
)
console.print(Panel(
f"[green]Publikationspaket gespeichert:[/green] {out_path}\n\n"
"Enthält: Artikel · Teaser-Varianten · Cover-Ideen · Quellenbewertung",
title="✓ Fertig",
border_style="green",
))
session["publication"] = {"teasers": teasers, "visual_ideas": visual_ideas}
session["step"] = "done"
sess_module.save(session)
def main():
_header()
try:
client = get_client()
except RuntimeError as e:
console.print(f"[red]{e}[/red]\nBitte ANTHROPIC_API_KEY in der .env-Datei eintragen.")
return
providers = get_configured()
if not providers:
console.print("[red]Keine LLM-API-Keys konfiguriert. Bitte .env-Datei prüfen.[/red]")
return
provider_names = ", ".join(p.name for p in providers)
console.print(f"[green]Aktive Modelle: {provider_names}[/green]")
index = _build_or_load_index(client)
latest = sess_module.load_latest()
session = None
if latest and latest.get("step") not in ("done",):
if Confirm.ask(
f"\nGefundene Session vom [bold]{latest['date']}[/bold] "
f"(Schritt: [bold]{latest['step']}[/bold]). Fortfahren?",
default=True,
):
session = latest
if session is None:
session = sess_module.new_session()
console.print(f"\n[green]Neue Session: {session['date']}[/green]")
_run(client, providers, session, index)
if __name__ == "__main__":
main()
+21
View File
@@ -0,0 +1,21 @@
[project]
name = "kniepunkt"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
"anthropic>=0.49.0",
"openai>=1.0.0",
"google-generativeai>=0.8.0",
"mistralai>=1.0.0",
"rich>=13.0.0",
"pypdf>=4.0.0",
"python-docx>=1.1.0",
"odfpy>=1.4.1",
]
[tool.setuptools.packages.find]
include = ["kniepunkt*"]
[build-system]
requires = ["setuptools>=68"]
build-backend = "setuptools.build_meta"
Generated
+1250
View File
File diff suppressed because it is too large Load Diff