ModelVerdict

Google · otevřené váhy

Gemma 4 31B

Jak Gemma 4 31B od Google zvládá skutečné firemní dokumenty: přesnost, skutečná cena, rychlost a kde chybuje.

Ceníková cena: 2,07 Kč za 1 mil. vstupních tokenů, 7,82 Kč za 1 mil. výstupních tokenů · google/gemma-4-31b-it

Výsledky

Úloha · dokumentyPořadíSprávná poleDoklady bez chybyZa 1000 dokladůK opravě / 1000Rychlost (medián)Laťka
Klauzule ze smluv · čeština7/10100,0 %99 %5,84 Kč76,0 ssplní laťku
Klauzule ze smluv · angličtina (USA)7/1099,6 %97 %4,14 Kč272,5 ssplní laťku
Klauzule ze smluv · němčina9/1094,4 %27 %5,07 Kč7272,6 spod laťkou
Třídění e-mailů · čeština7/1097,1 %75 %3,65 Kč2532,5 ssplní laťku
Třídění e-mailů · angličtina (USA)7/1096,5 %72 %2,78 Kč2802,2 ssplní laťku
Třídění e-mailů · němčina7/1095,1 %62 %3,41 Kč3803,6 ssplní laťku
Vytěžování faktur · čeština7/1096,1 %67 %4,87 Kč33310,4 ssplní laťku
Vytěžování faktur · angličtina (USA)8/1097,6 %81 %3,85 Kč1878,9 ssplní laťku
Vytěžování faktur · němčina8/1094,9 %64 %4,58 Kč3607,7 spod laťkou
Vytěžování faktur · španělština7/1095,4 %54 %4,69 Kč4608,7 ssplní laťku
Vytěžování faktur · francouzština9/1093,6 %51 %5,10 Kč4947,2 spod laťkou
Hledání osobních údajů · čeština1/1099,8 %99 %2,73 Kč132,9 ssplní laťku
Hledání osobních údajů · angličtina (USA)1/1099,9 %99 %1,94 Kč72,4 ssplní laťku
Hledání osobních údajů · němčina2/1099,9 %99 %2,34 Kč71,9 ssplní laťku

Kde chybuje

Pole, ve kterých chybuje nejčastěji, a druhy chyb, ze všech dokumentů benchmarku.

Klauzule ze smluv · čeština

Nejslabší pole

  • Účinnost od99,3 %

Druhy chyb (počet polí)

  • špatná hodnota1

Klauzule ze smluv · angličtina (USA)

Nejslabší pole

  • Poskytovatel98,0 %
  • Objednatel98,0 %
  • Účinnost od99,3 %

Druhy chyb (počet polí)

  • špatná hodnota7

Klauzule ze smluv · němčina

Nejslabší pole

  • Pokuta z prodlení (% denně)27,3 %

Druhy chyb (počet polí)

  • formát čísla109

Třídění e-mailů · čeština

Nejslabší pole

  • Priorita85,3 %
  • Nálada88,7 %

Druhy chyb (počet polí)

  • špatná hodnota39

Třídění e-mailů · angličtina (USA)

Nejslabší pole

  • Nálada83,3 %
  • Priorita85,3 %

Druhy chyb (počet polí)

  • špatná hodnota47

Třídění e-mailů · němčina

Nejslabší pole

  • Priorita78,0 %
  • Nálada78,0 %

Druhy chyb (počet polí)

  • špatná hodnota66

Vytěžování faktur · čeština

Nejslabší pole

  • Účet86,7 %
  • IČO / ID dodavatele93,3 %
  • Splatnost94,0 %
  • DUZP95,3 %

Druhy chyb (počet polí)

  • špatná hodnota66
  • chybí pole8
  • prohozená data2

Vytěžování faktur · angličtina (USA)

Nejslabší pole

  • Účet86,0 %
  • Základ podle sazeb95,3 %
  • IČO / ID dodavatele98,0 %
  • Datum vystavení98,7 %

Druhy chyb (počet polí)

  • špatná hodnota38
  • špatná sazba1

Vytěžování faktur · němčina

Nejslabší pole

  • Účet82,7 %
  • Datum vystavení87,3 %
  • Splatnost90,7 %
  • DUZP92,0 %

Druhy chyb (počet polí)

  • špatná hodnota90
  • chybí pole7
  • prohozená data3

Vytěžování faktur · španělština

Nejslabší pole

  • Účet79,3 %
  • Základ podle sazeb81,6 %
  • IČO / ID dodavatele93,1 %
  • Dodavatel95,4 %

Druhy chyb (počet polí)

  • špatná hodnota35
  • chybí pole16
  • vymyšlená hodnota1

Vytěžování faktur · francouzština

Nejslabší pole

  • Účet73,6 %
  • IČO / ID dodavatele77,0 %
  • Základ podle sazeb93,1 %
  • DUZP94,3 %

Druhy chyb (počet polí)

  • špatná hodnota64
  • chybí pole7
  • prohozená data2

Hledání osobních údajů · čeština

Nejslabší pole

  • Adresy98,7 %

Druhy chyb (počet polí)

  • chybí pole2

Hledání osobních údajů · angličtina (USA)

Nejslabší pole

  • Adresy99,3 %

Druhy chyb (počet polí)

  • chybí pole1

Hledání osobních údajů · němčina

Nejslabší pole

  • Adresy99,3 %

Druhy chyb (počet polí)

  • chybí pole1

Jazyková daň

O kolik víc tokenů model potřebuje na stejný text než v angličtině.

Jazyková daň všech modelů →

Compliance

Na OpenRouteru jen u třetích stran (bez koncového bodu v EU); lze provozovat na vlastním serveru v EU.

Jak compliance ověřujeme →

Použijte to hned

Přesně ten požadavek, který posílá benchmark (stejné zadání, JSON schéma, teplota 0), připravený pro volání Gemma 4 31B přes OpenRouter.

Klauzule ze smluv · čeština

Python · httpx · OpenRouter
import json
import os

import httpx

PROMPT = "Vytěžte klíčové podmínky smlouvy níže a vraťte pouze JSON s těmito klíči:\n\nprovider_name         strana, která plní (poskytovatel, prodávající, pronajímatel, zhotovitel),\n                      přesně jak je uvedena, včetně právní formy\nprovider_id           IČO této strany, pokud je uvedeno\nclient_name           strana, která platí (objednatel, kupující, nájemce, nabyvatel)\nclient_id             IČO této strany, pokud je uvedeno\ncontract_type         jedna z hodnot: services, supply, lease, license, maintenance\nprice                 sjednaná cena bez DPH (číslo)\ncurrency              kód měny podle ISO 4217 (CZK, EUR, USD, …)\nprice_period          jedna z hodnot: one_time, monthly, yearly\neffective_date        datum účinnosti smlouvy (YYYY-MM-DD)\nend_date              konec doby určité (YYYY-MM-DD); null, je-li smlouva na dobu neurčitou\nnotice_period_months  výpovědní lhůta v měsících (číslo); null, pokud žádná není\npenalty_pct_per_day   smluvní pokuta za prodlení s platbou v procentech dlužné částky za den\n                      (např. 0.05 pro 0,05 %); null, pokud žádná není\ngoverning_law         kód státu rozhodného práva podle ISO 3166 (např. CZ); státy USA jako US-XX\n\nPravidla:\n- Relativní data („dnem podpisu“, „prvním dnem následujícího měsíce“) přepočtěte vůči datu podpisu.\n- Datum podpisu není datum účinnosti, pokud to smlouva neříká.\n- Záloha, jistota a pevné pokuty za jiná porušení nejsou cena ani pokuta za prodlení s platbou.\n- Pokud hodnota ve smlouvě není, vraťte null. Nehádejte.\n- Částky jako čísla s desetinnou tečkou, bez oddělovačů tisíců a bez symbolu měny.\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": "google/gemma-4-31b-it",
            "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"])

Třídění e-mailů · čeština

Python · httpx · OpenRouter
import json
import os

import httpx

PROMPT = "Třídíte e-maily zákaznické podpory. Přečtěte si e-mail níže a vraťte pouze JSON s těmito klíči:\n\ncategory        jedna z hodnot: billing (faktury, platby, vyúčtování), delivery (kde je objednávka,\n                doprava, změna adresy), complaint (poškozené, chybné nebo vadné zboží, reklamace),\n                technical (přihlášení, chyby aplikace či systému, napojení), cancellation (zrušení\n                objednávky, výpověď smlouvy či předplatného), sales (poptávka, ceny, zájem před nákupem)\npriority        jedna z hodnot: urgent, high, normal, low (pravidla níže)\nsentiment       jedna z hodnot: positive, neutral, negative (tón zákazníka)\ncustomer_name   celé jméno zákazníka, který požadavek napsal\norder_number    číslo objednávky zákazníka, pokud je uvedeno\ninvoice_number  číslo faktury, pokud je uvedeno\namount          částka, které se požadavek týká (číslo)\ncurrency        kód měny té částky podle ISO 4217 (CZK, EUR, USD, …)\ndeadline        datum, do kdy zákazník chce vyřešení nebo odpověď (YYYY-MM-DD)\n\nPravidla priority:\n- urgent: zákazník teď nemůže pracovat, nebo je termín nejvýše 1 den po datu e-mailu\n- high: termín je nejvýše 7 dní po datu e-mailu, nebo zákazník hrozí ukončením spolupráce\n  či eskalací (právník)\n- low: zákazník výslovně píše, že to nespěchá\n- normal: vše ostatní\n\nPravidla:\n- Vlákno: hodnoťte nejnovější zprávu; čísla objednávek, faktur a částky mohou pocházet z citovaných\n  starších zpráv. Přeposlaný e-mail: zákazníkem je původní odesílatel, ne kolega, který ho přeposlal.\n- Relativní termíny („do pátku“, „zítra“, „do konce měsíce“) přepočtěte vůči datu zprávy,\n  která je uvádí.\n- Čísla tiketů podpory, IČO, DIČ a telefonní čísla nejsou čísla objednávek ani faktur.\n- Pokud hodnota v e-mailu není, vraťte null. Nehádejte.\n- Částky jako čísla s desetinnou tečkou, bez oddělovačů tisíců a bez symbolu měny.\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": "google/gemma-4-31b-it",
            "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"])

Vytěžování faktur · čeština

Python · httpx · OpenRouter
import json
import os

import httpx

PROMPT = "Z přiloženého dokladu vytěž údaje a vrať pouze JSON s těmito klíči:\n\nsupplier_name      název dodavatele (přesně jak je na dokladu, včetně diakritiky a právní formy)\nsupplier_id        IČO dodavatele\nvat_id             DIČ dodavatele\ninvoice_number     číslo dokladu\npayment_reference  variabilní symbol\nissue_date         datum vystavení (YYYY-MM-DD)\ntax_point_date     datum uskutečnění zdanitelného plnění, DUZP (YYYY-MM-DD)\ndue_date           datum splatnosti (YYYY-MM-DD)\nnet_by_rate        základ daně podle sazeb DPH, např. {\"21\": 18450.00, \"12\": 1200.00}\nvat_by_rate        DPH podle sazeb, např. {\"21\": 3874.50}\ntotal              celkem k úhradě (číslo, záporné u dobropisu)\ncurrency           měna podle ISO 4217 (CZK, EUR, …)\nbank_account       číslo účtu dodavatele (tvar předčíslí-číslo/kód banky) nebo IBAN\n\nPravidla:\n- Údaje odběratele nevracej, jen dodavatele.\n- Pokud údaj na dokladu není, vrať null. Nic si nedomýšlej.\n- Pokud doklad neobsahuje rozpis DPH (neplátce, zálohová faktura), vrať net_by_rate a vat_by_rate jako null.\n- Částky jako čísla s desetinnou tečkou, bez oddělovačů tisíců a bez měny.\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": "google/gemma-4-31b-it",
            "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"])

Hledání osobních údajů · čeština

Python · httpx · OpenRouter
import json
import os

import httpx

PROMPT = "Najděte v textu níže všechny osobní údaje fyzických osob (pro anonymizaci) a vraťte pouze JSON\ns těmito klíči, každý jako seznam řetězců (prázdný seznam, když žádný není):\n\nperson_names       celá jména osob, každou osobu jednou, jak jsou v textu\nemail_addresses    e-mailové adresy osob\nphone_numbers      telefonní čísla osob, jak jsou v textu\npostal_addresses   adresy bydliště nebo doručení osob, jak jsou v textu (ulice, obec, PSČ)\nbirth_dates        data narození (YYYY-MM-DD)\nnational_ids       národní identifikační čísla (např. rodné číslo, SSN)\nbank_accounts      čísla bankovních účtů osob, jak jsou v textu\n\nPravidla:\n- Jen údaje fyzických osob. Názvy firem, IČO, DIČ a jiná čísla firem, obecné firemní adresy jako\n  info@ nebo support@, čísla objednávek a tiketů nejsou osobní údaje: vynechte je.\n- Data, která nejsou datem narození (porady, dodání, nástup), nejsou osobní údaje.\n- Hodnoty nevymýšlejte ani nedoplňujte; opište je z textu.\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": "google/gemma-4-31b-it",
            "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"])

Odznak

Vložte si aktuální výsledek na svůj web; odznak se aktualizuje s každým během.

<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/contracts-cs.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/contracts-en.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/contracts-de.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/emails-cs.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/emails-en.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/emails-de.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/invoices-cs.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/invoices-en.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/invoices-de.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/invoices-es.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/invoices-fr.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/pii-cs.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/pii-en.svg" alt="Gemma 4 31B on ModelVerdict"></a>
<a href="https://modelverdict.ai/cs/models/gemma-4-31b/"><img src="https://modelverdict.ai/badge/gemma-4-31b/pii-de.svg" alt="Gemma 4 31B on ModelVerdict"></a>

Porovnat s jiným modelem