ModelVerdict

Qwen

Qwen3.8 Flash

Wie Qwen3.8 Flash von Qwen mit echten Geschäftsdokumenten umgeht: Genauigkeit, echte Kosten, Tempo und wo es Fehler macht.

Listenpreis: 0,14 € pro 1 Mio. Eingabe-Tokens, 0,43 € pro 1 Mio. Ausgabe-Tokens · qwen/qwen3.8-flash

Ergebnisse

Aufgabe · DokumenteRangRichtige FelderFehlerfreie DokumentePro 1.000 DokumenteZu korrigieren / 1.000Tempo (Median)Schwelle
Vertragsklauseln · Deutsch6/1098,0 %87 %0,72 €12719,7 Sek.erreicht die Schwelle
Vertragsklauseln · Englisch (USA)9/1095,1 %69 %0,57 €30714,1 Sek.erreicht die Schwelle
Vertragsklauseln · Tschechisch8/1099,9 %99 %0,58 €1313,6 Sek.erreicht die Schwelle
E-Mail-Triage · Deutsch4/1097,9 %81 %0,36 €18712,1 Sek.erreicht die Schwelle
E-Mail-Triage · Englisch (USA)6/1097,5 %79 %0,28 €2138,9 Sek.erreicht die Schwelle
E-Mail-Triage · Tschechisch3/1098,5 %87 %0,41 €13313,0 Sek.erreicht die Schwelle
E-Mail-Triage · Spanisch7/1096,6 %71 %0,43 €29010,9 Sek.erreicht die Schwelle
E-Mail-Triage · Französisch8/1095,8 %74 %0,43 €26013,6 Sek.erreicht die Schwelle
Rechnungsextraktion · Deutsch10/1093,5 %87 %1,03 €12719,0 Sek.unter der Schwelle
Rechnungsextraktion · Englisch (USA)10/1082,4 %57 %1,06 €42717,4 Sek.unter der Schwelle
Rechnungsextraktion · Tschechisch10/1091,8 %77 %0,94 €23317,0 Sek.unter der Schwelle
Rechnungsextraktion · Spanisch10/1087,9 %74 %1,28 €26022,3 Sek.unter der Schwelle
Rechnungsextraktion · Französisch10/1090,6 %82 %1,13 €18019,8 Sek.unter der Schwelle
Erkennung personenbezogener Daten · Deutsch9/1099,6 %99 %0,33 €712,2 Sek.erreicht die Schwelle
Erkennung personenbezogener Daten · Englisch (USA)10/1099,2 %99 %0,26 €137,5 Sek.erreicht die Schwelle
Erkennung personenbezogener Daten · Tschechisch10/1097,0 %89 %0,37 €1139,6 Sek.erreicht die Schwelle

Wo es Fehler macht

Die Felder, bei denen es am häufigsten danebenliegt, und die Fehlerarten, aus allen Dokumenten des Benchmarks.

Vertragsklauseln · Deutsch

Schwächste Felder

  • Anwendbares Recht91,3 %
  • ID Auftragnehmer94,7 %
  • ID Auftraggeber94,7 %
  • Auftragnehmer99,3 %

Fehlerarten (Anzahl Felder)

  • erfundener Wert14
  • ungültiges JSON13
  • fehlendes Feld12

Vertragsklauseln · Englisch (USA)

Schwächste Felder

  • Auftragnehmer69,3 %
  • Auftraggeber69,3 %
  • Wirksam ab99,3 %
  • Verzugsstrafe (% pro Tag)99,3 %

Fehlerarten (Anzahl Felder)

  • falscher Wert92
  • fehlendes Feld3

Vertragsklauseln · Tschechisch

Schwächste Felder

  • Vertragsart98,7 %

Fehlerarten (Anzahl Felder)

  • falscher Wert2

E-Mail-Triage · Deutsch

Schwächste Felder

  • Stimmung84,7 %
  • Priorität96,0 %

Fehlerarten (Anzahl Felder)

  • falscher Wert29

E-Mail-Triage · Englisch (USA)

Schwächste Felder

  • Stimmung80,7 %
  • Priorität97,3 %
  • Frist99,3 %

Fehlerarten (Anzahl Felder)

  • falscher Wert33
  • erfundener Wert1

E-Mail-Triage · Tschechisch

Schwächste Felder

  • Stimmung88,7 %
  • Priorität99,3 %
  • Kundenname99,3 %
  • Bestellnummer99,3 %

Fehlerarten (Anzahl Felder)

  • falscher Wert20

E-Mail-Triage · Spanisch

Schwächste Felder

  • Priorität78,0 %
  • Stimmung91,0 %

Fehlerarten (Anzahl Felder)

  • falscher Wert31

E-Mail-Triage · Französisch

Schwächste Felder

  • Priorität76,0 %
  • Stimmung94,0 %
  • Kategorie98,0 %
  • Kundenname99,0 %

Fehlerarten (Anzahl Felder)

  • falscher Wert29
  • ungültiges JSON9

Rechnungsextraktion · Deutsch

Schwächste Felder

  • Zahlungsreferenz88,7 %
  • Rechnungsnummer92,7 %
  • Lieferant94,0 %
  • Lieferanten-ID (EIN, IČO…)94,0 %

Fehlerarten (Anzahl Felder)

  • ungültiges JSON117
  • erfundener Wert8
  • falscher Wert2

Rechnungsextraktion · Englisch (USA)

Schwächste Felder

  • Netto nach Steuersatz70,0 %
  • Steuer nach Steuersatz76,0 %
  • Zahlungsreferenz79,3 %
  • Bankverbindung81,3 %

Fehlerarten (Anzahl Felder)

  • ungültiges JSON154
  • fehlendes Feld83
  • falscher Steuersatz23
  • falscher Wert18
  • erfundener Wert13

Rechnungsextraktion · Tschechisch

Schwächste Felder

  • Netto nach Steuersatz80,0 %
  • Steuer nach Steuersatz80,7 %
  • Bankverbindung90,7 %
  • Lieferant93,3 %

Fehlerarten (Anzahl Felder)

  • ungültiges JSON65
  • fehlendes Feld41
  • falscher Wert36
  • falscher Steuersatz16
  • erfundener Wert1
  • Netto statt Gesamtbetrag1

Rechnungsextraktion · Spanisch

Schwächste Felder

  • Zahlungsreferenz85,0 %
  • Lieferant86,0 %
  • USt-IdNr.86,0 %
  • Netto nach Steuersatz86,0 %

Fehlerarten (Anzahl Felder)

  • ungültiges JSON130
  • fehlendes Feld14
  • erfundener Wert10
  • falscher Wert2
  • Diakritika verloren1

Rechnungsextraktion · Französisch

Schwächste Felder

  • Zahlungsreferenz86,0 %
  • Fälligkeitsdatum89,0 %
  • Rechnungsnummer90,0 %
  • Bankverbindung90,0 %

Fehlerarten (Anzahl Felder)

  • ungültiges JSON65
  • fehlendes Feld49
  • erfundener Wert5
  • falscher Wert3

Erkennung personenbezogener Daten · Deutsch

Schwächste Felder

  • Namen99,3 %
  • E-Mail-Adressen99,3 %
  • Telefonnummern99,3 %
  • Adressen99,3 %

Fehlerarten (Anzahl Felder)

  • fehlendes Feld4

Erkennung personenbezogener Daten · Englisch (USA)

Schwächste Felder

  • Adressen98,7 %
  • Namen99,3 %
  • E-Mail-Adressen99,3 %
  • Telefonnummern99,3 %

Fehlerarten (Anzahl Felder)

  • erfundener Wert5
  • falscher Wert2
  • fehlendes Feld1

Erkennung personenbezogener Daten · Tschechisch

Schwächste Felder

  • Namen90,7 %
  • Adressen96,7 %
  • Telefonnummern97,3 %
  • E-Mail-Adressen98,0 %

Fehlerarten (Anzahl Felder)

  • falscher Wert13
  • ungültiges JSON7
  • erfundener Wert6
  • fehlendes Feld6

Sprachsteuer

Wie viele Tokens mehr dieses Modell für denselben Text braucht als auf Englisch.

Sprachsteuer aller Modelle →

Compliance

Only provider on OpenRouter: Alibaba (no EU or ZDR endpoint). DPA: general Alibaba Cloud International DPA.

Wie wir Compliance prüfen →

Direkt einsetzen

Genau die Anfrage des Benchmarks (gleicher Prompt, JSON-Schema, Temperatur 0), bereit für den Aufruf von Qwen3.8 Flash über OpenRouter.

Vertragsklauseln · Deutsch

Python · httpx · OpenRouter
import json
import os

import httpx

PROMPT = "Extrahieren Sie die wesentlichen Bedingungen des nachstehenden Vertrages und geben Sie nur JSON mit diesen Schlüsseln zurück:\n\nprovider_name         die leistende Partei (Auftragnehmer, Verkäufer, Vermieter, Lizenzgeber),\n                      genau wie angegeben, einschließlich der Rechtsform\nprovider_id           Registernummer dieser Partei (z. B. Handelsregisternummer), sofern angegeben\nclient_name           die zahlende Partei (Auftraggeber, Käufer, Mieter, Lizenznehmer)\nclient_id             Registernummer dieser Partei, sofern angegeben\ncontract_type         einer der Werte: services, supply, lease, license, maintenance\nprice                 vereinbarter Preis ohne Umsatzsteuer (Zahl)\ncurrency              Währungscode nach ISO 4217 (EUR, CHF, USD, …)\nprice_period          einer der Werte: one_time, monthly, yearly\neffective_date        Datum des Inkrafttretens des Vertrages (YYYY-MM-DD)\nend_date              Ende einer festen Laufzeit (YYYY-MM-DD); null, wenn der Vertrag auf\n                      unbestimmte Zeit geschlossen ist\nnotice_period_months  Kündigungsfrist in Monaten (Zahl); null, wenn es keine gibt\npenalty_pct_per_day   Vertragsstrafe für Zahlungsverzug in Prozent des offenen Betrags pro Tag\n                      (z. B. 0.05 für 0,05 %); null, wenn es keine gibt\ngoverning_law         Ländercode des anwendbaren Rechts nach ISO 3166 (z. B. DE); US-Bundesstaaten\n                      als US-XX\n\nRegeln:\n- Relative Daten („mit Unterzeichnung“, „zum Ersten des folgenden Monats“) bezogen auf das\n  Datum der Unterzeichnung umrechnen.\n- Das Datum der Unterzeichnung ist nicht das Datum des Inkrafttretens, sofern der Vertrag dies\n  nicht ausdrücklich bestimmt.\n- Anzahlung, Kaution und feste Vertragsstrafen für andere Verstöße sind weder der Preis noch die\n  Vertragsstrafe für Zahlungsverzug.\n- Steht ein Wert nicht im Vertrag, null zurückgeben. Nicht raten.\n- Beträge als Zahlen mit Dezimalpunkt, ohne Tausendertrennzeichen und ohne Währungssymbol.\n"
SCHEMA = json.loads("{\"type\":\"object\",\"properties\":{\"provider_name\":{\"type\":[\"string\",\"null\"]},\"provider_id\":{\"type\":[\"string\",\"null\"]},\"client_name\":{\"type\":[\"string\",\"null\"]},\"client_id\":{\"type\":[\"string\",\"null\"]},\"contract_type\":{\"type\":[\"string\",\"null\"],\"enum\":[\"services\",\"supply\",\"lease\",\"license\",\"maintenance\",null]},\"price\":{\"type\":[\"number\",\"null\"]},\"currency\":{\"type\":[\"string\",\"null\"]},\"price_period\":{\"type\":[\"string\",\"null\"],\"enum\":[\"one_time\",\"monthly\",\"yearly\",null]},\"effective_date\":{\"type\":[\"string\",\"null\"],\"description\":\"YYYY-MM-DD\"},\"end_date\":{\"type\":[\"string\",\"null\"],\"description\":\"YYYY-MM-DD\"},\"notice_period_months\":{\"type\":[\"integer\",\"null\"]},\"penalty_pct_per_day\":{\"type\":[\"number\",\"null\"]},\"governing_law\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"provider_name\",\"provider_id\",\"client_name\",\"client_id\",\"contract_type\",\"price\",\"currency\",\"price_period\",\"effective_date\",\"end_date\",\"notice_period_months\",\"penalty_pct_per_day\",\"governing_law\"],\"additionalProperties\":false}")


def run(document_text: str) -> dict:
    """Text of the document in, the extracted fields as a dict out."""
    response = httpx.post(
        "https://openrouter.ai/api/v1/chat/completions",
        headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
        json={
            "model": "qwen/qwen3.8-flash",
            "temperature": 0,
            "messages": [{"role": "user", "content": f"{PROMPT}\n\n---\n{document_text}"}],
            # For a scan or photo, send [{"type": "text", "text": PROMPT},
            # {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}] instead.
            "response_format": {
                "type": "json_schema",
                "json_schema": {"name": "contracts", "strict": False, "schema": SCHEMA},
            },
        },
        timeout=120,
    )
    response.raise_for_status()
    return json.loads(response.json()["choices"][0]["message"]["content"])

E-Mail-Triage · Deutsch

Python · httpx · OpenRouter
import json
import os

import httpx

PROMPT = "Sie sortieren E-Mails des Kundensupports. Lesen Sie die E-Mail unten und geben Sie nur JSON mit diesen Schlüsseln zurück:\n\ncategory        einer der Werte: billing (Rechnungen, Zahlungen, Abrechnung), delivery (wo ist die Bestellung,\n                Versand, Adressänderung), complaint (beschädigte, falsche oder defekte Ware, Reklamation),\n                technical (Anmeldung, Fehler in Anwendung oder System, Schnittstellen), cancellation (Stornierung\n                einer Bestellung, Kündigung eines Vertrags oder Abonnements), sales (Anfrage, Preise, Interesse vor dem Kauf)\npriority        einer der Werte: urgent, high, normal, low (Regeln unten)\nsentiment       einer der Werte: positive, neutral, negative (Ton des Kunden)\ncustomer_name   vollständiger Name des Kunden, der die Anfrage geschrieben hat\norder_number    Bestellnummer des Kunden, falls angegeben\ninvoice_number  Rechnungsnummer, falls angegeben\namount          Betrag, um den es in der Anfrage geht (Zahl)\ncurrency        Währungscode dieses Betrags nach ISO 4217 (EUR, CZK, USD, …)\ndeadline        Datum, bis zu dem der Kunde eine Lösung oder Antwort wünscht (YYYY-MM-DD)\n\nRegeln für die Priorität:\n- urgent: der Kunde kann gerade nicht arbeiten, oder die Frist liegt höchstens 1 Tag nach dem Datum der E-Mail\n- high: die Frist liegt höchstens 7 Tage nach dem Datum der E-Mail, oder der Kunde droht mit dem Ende\n  der Zusammenarbeit oder einer Eskalation (Anwalt)\n- low: der Kunde schreibt ausdrücklich, dass es nicht eilt\n- normal: alles andere\n\nRegeln:\n- Verlauf: bewerten Sie die neueste Nachricht; Bestell- und Rechnungsnummern sowie Beträge können aus\n  zitierten älteren Nachrichten stammen. Weitergeleitete E-Mail: Kunde ist der ursprüngliche Absender,\n  nicht der Kollege, der sie weitergeleitet hat.\n- Relative Fristen („bis Freitag“, „bis morgen“, „bis Ende des Monats“) rechnen Sie ausgehend vom Datum\n  der Nachricht um, in der sie stehen.\n- Ticketnummern des Supports, Handelsregisternummern, USt-IdNr. und Telefonnummern sind keine\n  Bestell- oder Rechnungsnummern.\n- Steht ein Wert nicht in der E-Mail, geben Sie null zurück. Raten Sie nicht.\n- Beträge als Zahlen mit Dezimalpunkt, ohne Tausendertrennzeichen und ohne Währungssymbol.\n"
SCHEMA = json.loads("{\"type\":\"object\",\"properties\":{\"category\":{\"type\":[\"string\",\"null\"],\"enum\":[\"billing\",\"delivery\",\"complaint\",\"technical\",\"cancellation\",\"sales\",null]},\"priority\":{\"type\":[\"string\",\"null\"],\"enum\":[\"urgent\",\"high\",\"normal\",\"low\",null]},\"sentiment\":{\"type\":[\"string\",\"null\"],\"enum\":[\"positive\",\"neutral\",\"negative\",null]},\"customer_name\":{\"type\":[\"string\",\"null\"]},\"order_number\":{\"type\":[\"string\",\"null\"]},\"invoice_number\":{\"type\":[\"string\",\"null\"]},\"amount\":{\"type\":[\"number\",\"null\"]},\"currency\":{\"type\":[\"string\",\"null\"]},\"deadline\":{\"type\":[\"string\",\"null\"],\"description\":\"YYYY-MM-DD\"}},\"required\":[\"category\",\"priority\",\"sentiment\",\"customer_name\",\"order_number\",\"invoice_number\",\"amount\",\"currency\",\"deadline\"],\"additionalProperties\":false}")


def run(document_text: str) -> dict:
    """Text of the document in, the extracted fields as a dict out."""
    response = httpx.post(
        "https://openrouter.ai/api/v1/chat/completions",
        headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
        json={
            "model": "qwen/qwen3.8-flash",
            "temperature": 0,
            "messages": [{"role": "user", "content": f"{PROMPT}\n\n---\n{document_text}"}],
            # For a scan or photo, send [{"type": "text", "text": PROMPT},
            # {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}] instead.
            "response_format": {
                "type": "json_schema",
                "json_schema": {"name": "emails", "strict": False, "schema": SCHEMA},
            },
        },
        timeout=120,
    )
    response.raise_for_status()
    return json.loads(response.json()["choices"][0]["message"]["content"])

Rechnungsextraktion · Deutsch

Python · httpx · OpenRouter
import json
import os

import httpx

PROMPT = "Entnimm dem beigefügten Beleg die folgenden Angaben und gib ausschließlich JSON mit diesen Schlüsseln zurück:\n\nsupplier_name      Name des Rechnungsstellers (genau wie auf dem Beleg, einschließlich Umlauten und Rechtsform)\nsupplier_id        Steuernummer des Rechnungsstellers (nicht die USt-IdNr. und nicht die Handelsregisternummer)\nvat_id             Umsatzsteuer-Identifikationsnummer (USt-IdNr.) des Rechnungsstellers\ninvoice_number     Belegnummer\npayment_reference  Verwendungszweck, der bei der Zahlung anzugeben ist\nissue_date         Rechnungsdatum (YYYY-MM-DD)\ntax_point_date     Liefer- bzw. Leistungsdatum (YYYY-MM-DD)\ndue_date           Fälligkeitsdatum bzw. „zahlbar bis“ (YYYY-MM-DD)\nnet_by_rate        Nettobetrag nach Umsatzsteuersätzen, z. B. {\"19\": 18450.00, \"7\": 1200.00}\nvat_by_rate        Umsatzsteuer nach Sätzen, z. B. {\"19\": 3505.50}\ntotal              Gesamtbetrag / Zahlbetrag (Zahl, bei Gutschriften negativ)\ncurrency           Währung nach ISO 4217 (EUR, CHF, …)\nbank_account       IBAN des Rechnungsstellers\n\nRegeln:\n- Gib keine Angaben des Rechnungsempfängers zurück, nur die des Rechnungsstellers.\n- Steht eine Angabe nicht auf dem Beleg, gib null zurück. Erfinde nichts.\n- Enthält der Beleg keine Aufschlüsselung der Umsatzsteuer (Kleinunternehmer, Anzahlungsanforderung), gib net_by_rate und vat_by_rate als null zurück.\n- Beträge als Zahlen mit Dezimalpunkt, ohne Tausendertrennzeichen und ohne Währung.\n"
SCHEMA = json.loads("{\"type\":\"object\",\"properties\":{\"supplier_name\":{\"type\":[\"string\",\"null\"]},\"supplier_id\":{\"type\":[\"string\",\"null\"]},\"vat_id\":{\"type\":[\"string\",\"null\"]},\"invoice_number\":{\"type\":[\"string\",\"null\"]},\"payment_reference\":{\"type\":[\"string\",\"null\"]},\"issue_date\":{\"type\":[\"string\",\"null\"],\"description\":\"YYYY-MM-DD\"},\"tax_point_date\":{\"type\":[\"string\",\"null\"],\"description\":\"YYYY-MM-DD\"},\"due_date\":{\"type\":[\"string\",\"null\"],\"description\":\"YYYY-MM-DD\"},\"net_by_rate\":{\"type\":[\"object\",\"null\"],\"additionalProperties\":{\"type\":\"number\"}},\"vat_by_rate\":{\"type\":[\"object\",\"null\"],\"additionalProperties\":{\"type\":\"number\"}},\"total\":{\"type\":[\"number\",\"null\"]},\"currency\":{\"type\":[\"string\",\"null\"]},\"bank_account\":{\"type\":[\"string\",\"null\"]}},\"required\":[\"supplier_name\",\"supplier_id\",\"vat_id\",\"invoice_number\",\"payment_reference\",\"issue_date\",\"tax_point_date\",\"due_date\",\"net_by_rate\",\"vat_by_rate\",\"total\",\"currency\",\"bank_account\"],\"additionalProperties\":false}")


def run(document_text: str) -> dict:
    """Text of the document in, the extracted fields as a dict out."""
    response = httpx.post(
        "https://openrouter.ai/api/v1/chat/completions",
        headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
        json={
            "model": "qwen/qwen3.8-flash",
            "temperature": 0,
            "messages": [{"role": "user", "content": f"{PROMPT}\n\n---\n{document_text}"}],
            # For a scan or photo, send [{"type": "text", "text": PROMPT},
            # {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}] instead.
            "response_format": {
                "type": "json_schema",
                "json_schema": {"name": "invoices", "strict": False, "schema": SCHEMA},
            },
        },
        timeout=120,
    )
    response.raise_for_status()
    return json.loads(response.json()["choices"][0]["message"]["content"])

Erkennung personenbezogener Daten · Deutsch

Python · httpx · OpenRouter
import json
import os

import httpx

PROMPT = "Finden Sie im Text unten alle personenbezogenen Daten natürlicher Personen (zur Anonymisierung) und geben Sie nur JSON\nmit diesen Schlüsseln zurück, jeweils als Liste von Zeichenketten (eine leere Liste, wenn es keine gibt):\n\nperson_names       vollständige Namen von Personen, jede Person einmal, wie im Text geschrieben\nemail_addresses    E-Mail-Adressen von Personen\nphone_numbers      Telefonnummern von Personen, wie im Text geschrieben\npostal_addresses   Wohn- oder Lieferadressen von Personen, wie im Text geschrieben (Straße, Ort, PLZ)\nbirth_dates        Geburtsdaten (YYYY-MM-DD)\nnational_ids       nationale Identifikationsnummern (z. B. Steuer-ID, Sozialversicherungsnummer)\nbank_accounts      Bankkontonummern (IBAN) von Personen, wie im Text geschrieben\n\nRegeln:\n- Nur Daten natürlicher Personen. Firmennamen, Handelsregisternummern, USt-IdNr. und andere Nummern von\n  Firmen, allgemeine Firmenadressen wie info@ oder support@, Bestell- und Ticketnummern sind keine\n  personenbezogenen Daten: lassen Sie sie weg.\n- Daten, die kein Geburtsdatum sind (Besprechungen, Lieferungen, Eintritt), sind keine personenbezogenen Daten.\n- Erfinden oder ergänzen Sie keine Werte; übernehmen Sie sie aus dem Text.\n"
SCHEMA = json.loads("{\"type\":\"object\",\"properties\":{\"person_names\":{\"type\":[\"array\",\"null\"],\"items\":{\"type\":\"string\"}},\"email_addresses\":{\"type\":[\"array\",\"null\"],\"items\":{\"type\":\"string\"}},\"phone_numbers\":{\"type\":[\"array\",\"null\"],\"items\":{\"type\":\"string\"}},\"postal_addresses\":{\"type\":[\"array\",\"null\"],\"items\":{\"type\":\"string\"}},\"birth_dates\":{\"type\":[\"array\",\"null\"],\"items\":{\"type\":\"string\"}},\"national_ids\":{\"type\":[\"array\",\"null\"],\"items\":{\"type\":\"string\"}},\"bank_accounts\":{\"type\":[\"array\",\"null\"],\"items\":{\"type\":\"string\"}}},\"required\":[\"person_names\",\"email_addresses\",\"phone_numbers\",\"postal_addresses\",\"birth_dates\",\"national_ids\",\"bank_accounts\"],\"additionalProperties\":false}")


def run(document_text: str) -> dict:
    """Text of the document in, the extracted fields as a dict out."""
    response = httpx.post(
        "https://openrouter.ai/api/v1/chat/completions",
        headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
        json={
            "model": "qwen/qwen3.8-flash",
            "temperature": 0,
            "messages": [{"role": "user", "content": f"{PROMPT}\n\n---\n{document_text}"}],
            # For a scan or photo, send [{"type": "text", "text": PROMPT},
            # {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}}] instead.
            "response_format": {
                "type": "json_schema",
                "json_schema": {"name": "pii", "strict": False, "schema": SCHEMA},
            },
        },
        timeout=120,
    )
    response.raise_for_status()
    return json.loads(response.json()["choices"][0]["message"]["content"])

Badge

Binden Sie das aktuelle Ergebnis auf Ihrer Website ein; das Badge aktualisiert sich mit jedem Lauf.

<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/contracts-de.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/contracts-en.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/contracts-cs.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/emails-de.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/emails-en.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/emails-cs.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/emails-es.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/emails-fr.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/invoices-de.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/invoices-en.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/invoices-cs.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/invoices-es.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/invoices-fr.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/pii-de.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/pii-en.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>
<a href="https://modelverdict.ai/de/models/qwen3-8-flash/"><img src="https://modelverdict.ai/badge/qwen3-8-flash/pii-cs.svg" alt="Qwen3.8 Flash on ModelVerdict"></a>

Mit einem anderen Modell vergleichen