294 lines
10 KiB
Markdown
294 lines
10 KiB
Markdown
|
|
# 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** 👻
|