All checks were successful
Build & Deploy / deploy (push) Successful in 1m14s
Fehler: claude-haiku-4-5 lehnt output_config.effort mit einem 400 ab, jede Karte lief in einen Lesefehler. effort und der server-seitige Fallback werden jetzt nur an Modelle geschickt, die sie annehmen; ein unbekanntes Modell mit engerem Parametersatz wird einmal ohne Zusatzparameter wiederholt, statt die Karte zu verlieren. Tests decken die Zuordnung ab. Design: Grau kommt als Hierarchiestufe dazu. Drei Ebenen für Fläche (weiß / grau gefüllt / schwarz), Text (schwarz / --ink-2 / --ink-3) und Linie (3px / 1px schwarz / graue Haarlinie). Vorher trug alles dieselbe 3px-Kante und dasselbe Schwarz, dadurch war keine Ordnung erkennbar. Konkret: nicht gewählte Filter treten zurück, Listenzeilen bekommen drei Textstufen und Statuspillen statt einer gleichförmigen Zeile, das Kopfband über Listen ist grau hinterlegt, zweitrangige und zerstörende Aktionen sind leiser als die primäre. iOS: Datumsfelder zentrieren ihren Wert und sacken in der Höhe ein. Die WebKit-Pseudoelemente ziehen sie auf die Form der übrigen Felder. Dazu die Domain in der Dokumentation auf scanner.lucas-orth.de. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""Der Parametersatz haengt am Modell - das war ein echter Produktionsfehler:
|
|
claude-haiku-4-5 lehnt output_config.effort mit einem 400 ab.
|
|
"""
|
|
from app import extract
|
|
|
|
|
|
def test_effort_nur_fuer_modelle_die_es_koennen():
|
|
assert "claude-haiku-4-5".startswith(extract._NO_EFFORT)
|
|
assert "claude-sonnet-4-5".startswith(extract._NO_EFFORT)
|
|
assert not "claude-opus-5".startswith(extract._NO_EFFORT)
|
|
assert not "claude-sonnet-5".startswith(extract._NO_EFFORT)
|
|
|
|
|
|
def test_server_seitiger_fallback_nur_fuer_die_grossen():
|
|
assert "claude-opus-5".startswith(extract._WITH_FALLBACK)
|
|
assert "claude-fable-5-1".startswith(extract._WITH_FALLBACK)
|
|
assert not "claude-haiku-4-5".startswith(extract._WITH_FALLBACK)
|
|
assert not "claude-sonnet-5".startswith(extract._WITH_FALLBACK)
|
|
|
|
|
|
def test_output_config_ohne_effort_bleibt_gueltig():
|
|
ohne = extract._output_config(with_effort=False)
|
|
mit = extract._output_config(with_effort=True)
|
|
|
|
assert "effort" not in ohne
|
|
assert ohne["format"]["type"] == "json_schema"
|
|
assert mit["effort"] == "low"
|
|
assert mit["format"] == ohne["format"]
|
|
|
|
|
|
def test_schema_verlangt_alle_felder_und_verbietet_zusaetze():
|
|
assert extract.SCHEMA["additionalProperties"] is False
|
|
assert set(extract.SCHEMA["required"]) == {"is_business_card", *extract.FIELDS}
|
|
for field in extract.FIELDS:
|
|
assert extract.SCHEMA["properties"][field]["type"] == ["string", "null"]
|