check_invoice_reading
Letzter Schritt des Lesens mit DEINEM Modell: prüft deine Antwort auf den Leseauftrag aus get_invoice_reading_task. Gridbert ruft hier KEIN Modell auf. Geprüft wird deterministisch: Schema, wörtliches Zitat gegen die Textebene, Kreuzproben (Summen, Verbrauch, Arbeitspreis), Zuschuss und Rabatt; danach wird mit dem Regelleser zusammengeführt (sicher gelesene Regel-Felder haben Vorrang, deine Felder stehen höchstens auf 'mittel'). Das Ergebnis hat EXAKT die Form von read_invoice_facts — je Feld Wert, Zitat und Konfidenz (hoch|mittel|niedrig|fehlt) — und ist dem User vorzulegen und bestätigen zu lassen, bevor submit_invoice_facts es rechnet ('quellen_anker' unverändert weitergeben). rechnungsbetrag_brutto_eur ist der Betrag des Strombezugs (betrag_umfang='strombezug'); ist er gerechnet (begleitangaben.herkunft='gerechnet'), ist eine Summenprobe gegen die Blocksummen zirkulär und kein Beweis. Rechnet nichts, speichert nichts. Eingabe: rechnung_ref, 'regelwerk_version' UNVERÄNDERT aus get_invoice_reading_task, und 'antwort' (dein JSON-Objekt in Kompaktform, oder derselbe Text; ein Codeblock drumherum wird toleriert; null, wenn lesen_noetig=false war). Fehler: error_class 'antwort_ungueltig' mit einer lesbaren Liste unter 'fehler' — korrigiere genau diese Stellen und rufe noch einmal auf (ein Nachbesserungsversuch genügt in der Regel); 'regelwerk_veraltet': das Regelwerk hat sich geändert, hol die Aufgabe mit get_invoice_reading_task neu. Gabst du bei get_invoice_reading_task seitentexte mit, gib dieselben hier wieder mit.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"rechnung_ref": "<rechnung_ref>",
"regelwerk_version": "<regelwerk_version>"
},
"name": "check_invoice_reading"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| antwort | No | Deine Antwort auf den Leseauftrag: das JSON-Objekt in Kompaktform (oder ein Text mit genau diesem JSON). null, wenn get_invoice_reading_task lesen_noetig=false meldete. | |
| seitentexte | No | Optional, nur wenn schon bei get_invoice_reading_task angegeben: derselbe Text je Seite (Index 0 = Seite 1). | |
| rechnung_ref | Yes | Dieselbe Kennung wie bei get_invoice_reading_task. | |
| regelwerk_version | Yes | Die regelwerk_version aus get_invoice_reading_task, unverändert. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ok | Yes | immer true. Fehler kommen als isError ohne structuredContent zurück (errors.error_result: {ok:false, error_class, fehler}). | |
| felder | Yes | Ein Eintrag je gelesenem Feld. | |
| hinweis | No | Optionaler Hinweis ans Modell (F14) — Datenstand-Warnung, nächster Schritt, Granularitäts-Caveat. Darf null sein. | |
| rabatte | No | Die Rabatt- und Bonuszeilen des Lieferanten hinter einmalrabatte_brutto_eur. Nur zur Anzeige; NICHT an submit_invoice_facts weitergeben. | |
| pruefbar | Yes | false = keine prüfbare Jahres-, Zwischen- oder Monatsrechnung. Dann steht der Grund in 'ablehnungsgrund' und es gibt keine Prüfung. | |
| workspace | No | Nur bei Berater-Accounts: der Arbeitsbereich, in dem dieser Call gelandet ist (dispatch.py stempelt ihn zentral an JEDES Result). Haushalts-Results tragen das Feld nicht. | |
| energieart | No | strom | gas | kombi | unbekannt. | |
| gelesen_mit | No | textebene = aus der Textebene des PDFs gelesen (nur dann kann ein Feld 'hoch' sein). ocr = aus einem Scan oder Foto bzw. aus Seitentexten des Aufrufers gelesen (höchstens 'mittel'). | |
| rechnungstyp | Yes | jahresrechnung | zwischenrechnung | monatsrechnung | unbekannt. | |
| betrag_umfang | No | 'strombezug' = rechnungsbetrag_brutto_eur ist der Betrag des STROMBEZUGS (Regelwerk v4: gedruckte Strom-Endsumme ohne andere Sparte und ohne Einspeisung, oder aus den drei Strom-Blocksummen gerechnet). FEHLT das Feld, stammt der Betrag aus einem Weg, der das nicht zusagt (Altpfad, Regelleser bei Einspeisung) oder es gibt keinen Betrag: Kombi- und PV-Rechnungen sind dann abzuweisen, nicht zu prüfen. | |
| quellen_anker | Yes | Fertig für die Übergabe an submit_invoice_facts: Objekte {feld, zitat}. NICHT neu bauen — dort wird geprüft, ob der übergebene Zahlenwert im Zitat wirklich vorkommt. | |
| ablehnungsgrund | No | teilbetrag | einspeisung | energiegemeinschaft | grosskunde | ausland | keine_energierechnung — oder null, wenn prüfbar. | |
| energiepositionen | No | Die EINZELNEN Zeilen des Energieblocks, wenn die Rechnung dort mehr als eine führt (z.B. Spotpreis, Stromqualität, Mehrkosten Ökoenergie/HKN). Jeder Eintrag ist fertig für submit_invoice_facts: {bezeichnung, wert_eur, ist_netto}. **Unverändert weiterreichen, nichts ergänzen** — ein viertes Feld lässt die ganze Einreichung ablehnen. LEERE LISTE heisst 'keine erkannt', NICHT 'der Energieblock ist leer': dann wird der Block wie bisher über Arbeitspreis × Menge nachgerechnet. Die Belege dazu stehen in quellen_anker unter dem Feldnamen 'energiepositionen'. | |
| einmalrabatte_brutto_eur | No | Einmaleffekte dieser Rechnung in €, brutto und positiv — oder null: befristete und einmalige Rabatte des Lieferanten (Neukunden-, Wechsel-, Aktionsbonus, Gratis-/Freimonate) × 1,2 plus ein Stromkostenzuschuss, der im Rechnungsbetrag schon abgezogen ist. Dauerhafte Nachlässe (Online, Bankeinzug, Bestandskunde) zählen nie, sie stecken im Arbeitspreis; ein Zuschuss ausserhalb des Betrags nie. Wiederkehrende Kosten der Periode = rechnungsbetrag_brutto_eur + einmalrabatte_brutto_eur. Gerechnet, nicht gelesen; NICHT an submit_invoice_facts weitergeben. | |
| einspeisung_auf_rechnung | No | true = die Rechnung rechnet neben dem Strombezug auch Einspeisung, Überschuss oder den Verkauf erzeugter Energie ab (PV). Dann ist rechnungsbetrag_brutto_eur der Betrag des BEZUGS, nicht der gedruckte Saldo. false = keine Einspeisung auf der Rechnung. FEHLT das Feld, ist es unbekannt (Regelleser, Antwort ohne die Angabe) — nicht als false lesen. | |
| rabatt_im_energieblock_eur | No | Summe der gelesenen Rabatte des Lieferanten in €, netto und positiv — oder null. Unverändert an submit_invoice_facts weitergeben: die Nachrechnung zieht ihn nur ab, wenn der Energieblock danach aufgeht. | |
| rabatt_ausserhalb_bloecke_eur | No | Rabatt-/Bonuszeile AUSSERHALB der drei Blöcke in €, netto und negativ (Rabatt = Minuszahl) — oder null. Nur gesetzt, wenn die Rechnung damit aufgeht. Unverändert an submit_invoice_facts weitergeben: (Summe Blöcke + Rabatt) × 1,2 − Zuschuss = Rechnungsbetrag. |