# GWΓ–-AntragsprΓΌfer β€” Projektdokumentation **Stand:** 28.03.2026, 23:58 Uhr **Telegram-Topic:** [🌱 GWΓ–-AntragsprΓΌfer](https://t.me/c/3823618505/4247) (thread_id 4247) ## 🎯 Projektziel Automatische Bewertung von ParlamentsantrΓ€gen nach der **Gemeinwohl-Γ–konomie (GWΓ–) Matrix 2.0 fΓΌr Gemeinden**. Das Tool analysiert AntrΓ€ge aus Landesparlamenten und bewertet sie nach GWΓ–-Kriterien, vergleicht mit Wahl- und Parteiprogrammen und schlΓ€gt konkrete Textverbesserungen vor. --- ## 🌐 Live-System | Was | URL | |-----|-----| | **Webapp** | https://gwoe.toppyr.de | | **Git-Repository** | https://repo.toppyr.de/tobias/gwoe-antragspruefer | | **Server** | VServer 152.53.119.77 | | **Container** | `/opt/gwoe-antragspruefer/` | --- ## πŸ—οΈ Architektur ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Frontend β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Durchsuchen β”‚ β”‚ 🏷️ Tags β”‚ β”‚ PrΓΌfen β”‚ β”‚ β”‚ β”‚ (Liste) β”‚ β”‚ (Wolke) β”‚ β”‚ (Upload/Analyse) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FastAPI Backend β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ /api/ β”‚ β”‚ /api/ β”‚ β”‚ /api/ β”‚ β”‚ /api/ β”‚ β”‚ β”‚ β”‚assessmentsβ”‚ β”‚search- β”‚ β”‚analyze- β”‚ β”‚assessment/ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚landtag β”‚ β”‚drucksacheβ”‚ β”‚pdf β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β–Ό β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ SQLite β”‚ β”‚ OPAL API β”‚ β”‚ DashScope (Qwen) β”‚ β”‚ gwoe-antraegeβ”‚ β”‚ (Landtag β”‚ β”‚ qwen-plus-latest β”‚ β”‚ .db β”‚ β”‚ NRW) β”‚ β”‚ (LLM Analyse) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ“ Projektstruktur ``` webapp/ β”œβ”€β”€ app/ β”‚ β”œβ”€β”€ main.py # FastAPI-Endpoints + Security Middleware β”‚ β”œβ”€β”€ analyzer.py # LLM-Analyse mit v5-Prompt + Retry-Logik β”‚ β”œβ”€β”€ database.py # SQLite (aiosqlite) Persistenz β”‚ β”œβ”€β”€ models.py # Pydantic Assessment-Model β”‚ β”œβ”€β”€ parlamente.py # OPAL-Adapter fΓΌr NRW Landtag β”‚ β”œβ”€β”€ report.py # PDF-Generierung (WeasyPrint) β”‚ β”œβ”€β”€ config.py # Settings + Environment β”‚ β”œβ”€β”€ embeddings.py # Wahlprogramm-Embeddings (optional) β”‚ β”œβ”€β”€ kontext/ β”‚ β”‚ β”œβ”€β”€ gwoe-matrix-2.0.md # GWΓ–-Matrix Referenz β”‚ β”‚ β”œβ”€β”€ wahlprogramme-nrw-2022.md # Zusammenfassungen β”‚ β”‚ β”œβ”€β”€ parteiprogramme.md # Grundsatzprogramme β”‚ β”‚ └── *-nrw-2022-paged.txt # Volltext (paginiert) β”‚ β”œβ”€β”€ templates/ β”‚ β”‚ β”œβ”€β”€ index.html # Haupt-UI (Jinja2) β”‚ β”‚ └── quellen.html # QuellenΓΌbersicht β”‚ └── static/ β”‚ └── referenzen/ # Original-PDFs der Programme β”œβ”€β”€ data/ # SQLite-DBs (Docker Volume) β”‚ └── gwoe-antraege.db # Haupt-Datenbank β”œβ”€β”€ reports/ # Generierte PDFs (Docker Volume) β”œβ”€β”€ docker-compose.yml # Traefik + Let's Encrypt β”œβ”€β”€ Dockerfile # Python 3.12 + WeasyPrint β”œβ”€β”€ requirements.txt β”œβ”€β”€ .env.example β”œβ”€β”€ .gitignore β”œβ”€β”€ .dockerignore β”œβ”€β”€ LICENSE (MIT) └── README.md ``` --- ## ✨ Features (Stand 28.03.2026) ### Analyse - [x] GWΓ–-Score (0-10) mit Matrix-Zuordnung - [x] Bewertungssymbole (++/+/β—‹/βˆ’/βˆ’βˆ’) pro Matrix-Feld - [x] Wahlprogrammtreue (0-10) pro Fraktion - [x] Parteiprogrammtreue (0-10) pro Fraktion - [x] **VerbesserungsvorschlΓ€ge im Redline-Format** - Original-Zitat aus dem Antrag - Konkreter Verbesserungsvorschlag - GWΓ–-BegrΓΌndung - [x] Themen-Tags fΓΌr Kategorisierung - [x] Retry-Logik (3 Versuche) bei JSON-Parse-Fehlern ### UI - [x] Score-Filter (Alle / 8-10 / 5-7 / 0-4) - [x] **Partei-Filter** (Dropdown) - [x] **Durchschnittswerte pro Partei** (kompakte Stats-Bar) - [x] **Tag-Wolke** mit Multi-Select (Schnittmenge) - [x] Landtag-Suche via OPAL-API - [x] "Jetzt prΓΌfen"-Button fΓΌr neue AntrΓ€ge - [x] Detail-Ansicht mit allen Bewertungen - [x] PDF-Download pro Antrag ### Security - [x] Content-Security-Policy - [x] X-Frame-Options: DENY - [x] X-Content-Type-Options: nosniff - [x] X-XSS-Protection - [x] Referrer-Policy - [x] Permissions-Policy - [x] /docs, /redoc, /openapi.json deaktiviert ### Infrastruktur - [x] Docker Compose mit Traefik Reverse Proxy - [x] Let's Encrypt SSL - [x] **Persistente SQLite-DB** (Volume, ΓΌberlebt Container-Neustarts) - [x] Git-Repository auf repo.toppyr.de --- ## πŸ”§ Konfiguration ### Environment-Variablen (.env) ```bash DASHSCOPE_API_KEY=sk-... # Alibaba DashScope API KEYCLOAK_URL=https://sso.toppyr.de # Optional: SSO KEYCLOAK_REALM=collaboration KEYCLOAK_CLIENT_ID=gwoe-antragspruefer ``` ### LLM-Modelle | Modell | Verwendung | Kosten | |--------|------------|--------| | `qwen-plus-latest` | Standard (Free Tier) | Kostenlos | | `qwen-plus` | Fallback (Paid) | ~$0.80/MTok | | `qwen-max` | Premium | ~$2.40/MTok | --- ## πŸ“Š API-Endpoints | Methode | Pfad | Beschreibung | |---------|------|--------------| | GET | `/` | Web-UI | | GET | `/health` | Health Check | | GET | `/quellen` | QuellenΓΌbersicht | | GET | `/api/assessments` | Alle Bewertungen (JSON) | | GET | `/api/assessment?drucksache=18/12345` | Einzelne Bewertung | | GET | `/api/search?q=Klima` | Interne DB-Suche | | GET | `/api/search-landtag?q=Klima` | Landtag OPAL-Suche | | POST | `/api/analyze-drucksache` | Neue Analyse starten | | GET | `/api/assessment/pdf?drucksache=18/12345` | PDF-Download | | GET | `/api/bundeslaender` | VerfΓΌgbare BundeslΓ€nder | | GET | `/status/{job_id}` | Job-Status abfragen | --- ## 🧠 Prompt v5 β€” Kern-Features Der Analyse-Prompt fordert: 1. **GWΓ–-Treue (0-10)** mit Matrix-Zuordnung: - Matrix-Feld (z.B. "D1 MenschenwΓΌrde") - Symbol (++/+/β—‹/βˆ’/βˆ’βˆ’) - KurzbegrΓΌndung 2. **Programmtreue** fΓΌr Antragsteller UND Regierungsfraktionen: - Wahlprogramm-Score (0-10) - Parteiprogramm-Score (0-10) - BegrΓΌndungen 3. **VerbesserungsvorschlΓ€ge** (max. 3): ```json { "original": "Zitat aus dem Antrag", "vorschlag": "Konkret **verbesserter** Text", "begruendung": "StΓ€rkt GWΓ–-Wert X durch Y" } ``` 4. **Themen-Tags** fΓΌr Kategorisierung --- ## πŸš€ Deployment ### Erstinstallation ```bash ssh vserver cd /opt git clone https://repo.toppyr.de/tobias/gwoe-antragspruefer.git cd gwoe-antragspruefer # .env erstellen cp .env.example .env nano .env # DASHSCOPE_API_KEY eintragen # Starten docker compose up -d ``` ### Update ```bash # Lokal cd ~/Nextcloud/dotty/projekte/2026-03-23\ GWΓ–-AntragsprΓΌfer\ _WIP_/webapp git add . && git commit -m "Update" && git push # Auf Server ssh vserver 'cd /opt/gwoe-antragspruefer && git pull && docker compose up -d --build' ``` ### Manuelles Deploy (ohne Git auf Server) ```bash cd ~/Nextcloud/dotty/projekte/2026-03-23\ GWΓ–-AntragsprΓΌfer\ _WIP_/webapp tar czf /tmp/gwoe-webapp.tar.gz --exclude='venv' --exclude='__pycache__' --exclude='data' --exclude='reports' --exclude='.env' . scp /tmp/gwoe-webapp.tar.gz vserver:/tmp/ ssh vserver 'cd /opt/gwoe-antragspruefer && tar xzf /tmp/gwoe-webapp.tar.gz && docker compose up -d --build' ``` --- ## πŸ“ˆ Statistiken (28.03.2026) | Metrik | Wert | |--------|------| | Analysierte AntrΓ€ge | 20 | | Ø GWΓ–-Score gesamt | 4.6 | | Ø SPD | 7.7 | | Ø GRÜNE | 6.0 | | Ø CDU | 6.0 | | Ø FDP | 4.8 | | Ø AfD | 1.5 | --- ## πŸ› Bekannte Issues / TODOs ### Offen - [ ] Keycloak SSO-Integration aktivieren - [ ] Weitere BundeslΓ€nder (BY, BW) anbinden - [ ] Batch-Analyse fΓΌr viele AntrΓ€ge - [ ] Wahlprogramm-Zitate mit Seitenzahlen - [ ] Export als CSV/Excel ### GelΓΆst (28.03.2026) - [x] JSON-Parse-Fehler bei LLM-Output β†’ Retry-Logik - [x] DB nicht persistent β†’ Dockerfile gefixt, data/ als Volume - [x] Alte Assessments ΓΌberschreiben neue β†’ JSON-Import deaktiviert - [x] Partei-Filter zeigt "Suchfehler" β†’ JS-Bug gefixt --- ## πŸ“ Changelog ### v1.0.0 (28.03.2026) - Initial Release - GWΓ–-Matrix 2.0 Analyse fΓΌr NRW - VerbesserungsvorschlΓ€ge im Redline-Format - Tag-Wolke mit Multi-Select - Partei-Filter + Durchschnittswerte - Security Headers - Docker Deployment --- ## πŸ“š Quellen - [GWΓ–-Matrix 2.0 fΓΌr Gemeinden (Arbeitsbuch)](https://econgood.org) - [ECOnGOOD Corporate Design Manual 2024](https://econgood.org) - [NRW OPAL Parlamentsdokumentation](https://www.landtag.nrw.de) - Wahlprogramme NRW 2022 (CDU, GRÜNE, SPD, FDP, AfD) - Grundsatzprogramme der Parteien --- **Entwickelt von Tobias RΓΆdel mit UnterstΓΌtzung von Dotty** πŸ‘»