feat(agent): add odoo review mode with plausibility verdict

This commit is contained in:
2026-09-17 00:29:03 +02:00
parent 7162726b66
commit ba4bf57dcf
10 changed files with 670 additions and 34 deletions
+54 -2
View File
@@ -22,7 +22,7 @@ Aufbewahrung. Ein allgemeiner API-Key allein reicht dafür nicht aus.
| Methode | Pfad | Auth | Zweck |
|---|---|---|---|
| `GET` | `/` | Eingabe im UI | Test-Frontend |
| `POST` | `/v1/ask` | Service-Key | belegte Wissensantwort |
| `POST` | `/v1/ask` | Service-Key | Wissensantwort (`mode=knowledge`) oder Plausibilitätsprüfung (`mode=review`) |
| `POST` | `/v1/ratings` | Service-Key | Antwort bewerten |
| `POST` | `/v1/comments` | Service-Key | Kommentar zu einer Antwort protokollieren |
| `GET` | `/v1/health` | öffentlich | Readiness ohne interne Hostdetails |
@@ -90,6 +90,54 @@ Request:
}
```
### `mode=review` — Odoo-Plausibilitätsprüfung (M4.2)
Mit `PV_REVIEW_MODE=true` nimmt der Dienst einen schema-gebundenen Odoo-
Kontext an und prüft das von Odoo vorgegebene Ergebnis gegen die Wissensbasis:
```json
{
"question": "Prüfe die geplante Auszahlung gegen die Regeln.",
"mode": "review",
"context": {
"facts": [
{"key": "bruttolohn_monat", "value": "3000 EUR"},
{"key": "freibetrag_620_verbraucht", "value": "340 EUR", "note": "Jahr 2026"}
],
"computation": {
"label": "AG-Kosten Barauszahlung",
"result": "612,31 EUR",
"basis": "SVDG + DB/DZ auf 500 EUR",
"components": [{"key": "svdg_gesamt", "value": "549,50 EUR"}]
}
}
}
```
Grenzen: `facts` max. 40 (key-Muster `[a-z0-9_.-]`, value ≤ 200 Zeichen),
`components` max. 40; keine freien Objekte. Ohne `PV_REVIEW_MODE` liefert
`mode=review` HTTP 422; `context` außerhalb des Review-Modus ebenfalls.
Der Antworttext endet mit einem Abschnitt `Plausibilitätsprüfung:`; daraus
extrahiert der Dienst strukturiert:
```json
"plausibility": {
"verdict": "implausible",
"checks": [
{"status": "warn", "aspect": "Freibetrag 620",
"detail": "erwartet 280 EUR steuerfrei [lb-son-04] — erhalten 500 EUR",
"source_ids": ["lb-son-04"]}
]
}
```
Semantik: `plausible` (Checks ohne Warn), `implausible` (mind. ein ⚠-Check),
`not_checkable` (kein gültiger Check, z. B. fehlender Kontext). Odoo bleibt
autoritativ für Zahlen — der Agent korrigiert nichts stillschweigend. Das
`grounding.data_scope` ist im Review-Modus
`knowledge_base_plus_review_context`.
Unbekannte Felder werden mit HTTP `422` abgewiesen. Das ist insbesondere die
technische Vertragsgrenze gegen ad-hoc-Felder wie `employee_data` oder
`payroll_context`.
@@ -148,9 +196,13 @@ Response (gekürzt):
- `assumptions` und `alternatives` sind bereits stabile Vertragsfelder, bleiben
in v1 aber leer. Der Dienst errät diese Strukturen nicht aus Freitext; ihre
spätere Befüllung benötigt einen eigenen belegbaren Generierungsvertrag.
- `grounding.data_scope=knowledge_base_only` ist in v1 unveränderlich.
- `grounding.data_scope=knowledge_base_only` ist im knowledge-Modus
unveränderlich; im Review-Modus gilt
`knowledge_base_plus_review_context`.
- `ratings_enabled` zeigt, ob diese Antwort über `/v1/ratings` bewertet werden
kann.
- `mode` spiegelt den Anfragemodus; `plausibility` ist nur im Review-Modus
gesetzt.
Der Client darf `verified=false` nicht als normale Fachantwort darstellen.
Empfohlen ist ein sichtbarer Warnzustand ohne automatische Folgeverarbeitung.