orc-renaming/tests/test_ollama.py

107 lines
3.5 KiB
Python

import json
from datetime import date
import httpx
from orc_renaming.models import DocumentScope, DocumentType, ExtractionResult
from orc_renaming.ollama import OllamaAnalyzer, merge_results
def test_stammdaten_override_llm() -> None:
rules = ExtractionResult(
document_type=DocumentType.INVOICE,
scope=DocumentScope.PROPERTY,
document_date=date(2026, 7, 18),
company="Kanonische-Firma",
property_id="WH1",
confidence=0.93,
evidence=["Stammdatentreffer"],
)
llm = ExtractionResult(
document_type=DocumentType.CORRESPONDENCE,
scope=DocumentScope.PRIVATE,
document_date=date(2026, 7, 17),
company="Halluzinierte Firma",
topic="Rechnung",
confidence=0.99,
evidence=["Modelltreffer"],
source="ollama",
model="qwen3.5:4B",
)
result = merge_results(rules, llm)
assert result.document_type == DocumentType.INVOICE
assert result.scope == DocumentScope.PROPERTY
assert result.document_date == date(2026, 7, 18)
assert result.company == "Kanonische-Firma"
assert result.property_id == "WH1"
assert result.source == "rules+ollama:qwen3.5:4B"
def test_ollama_structured_response(config) -> None:
def handler(request: httpx.Request) -> httpx.Response:
assert request.url.path == "/api/chat"
body = json.loads(request.read())
assert isinstance(body["format"], dict)
assert body["options"]["temperature"] == 0
assert body["options"]["presence_penalty"] == 0
assert body["think"] is False
assert body["options"]["num_ctx"] == 8192
assert body["messages"][1]["images"] == ["aW1hZ2UtYnl0ZXM="]
return httpx.Response(
200,
json={
"message": {
"content": (
'{"document_type":"invoice","scope":"property",'
'"document_date":"2026-07-18","company":"Firma",'
'"property_id":"WH1","topic":null,"confidence":0.94,'
'"evidence":["Rechnung"]}'
)
}
},
)
analyzer = OllamaAnalyzer(config)
analyzer.client.close()
analyzer.client = httpx.Client(
base_url="http://ollama.test",
transport=httpx.MockTransport(handler),
)
result = analyzer.analyze(
"Rechnung für Musterstraße 12",
image_bytes=b"image-bytes",
)
analyzer.close()
assert result.document_type == DocumentType.INVOICE
assert result.property_id == "WH1"
assert result.document_date == date(2026, 7, 18)
assert result.model == "qwen3.5:4B"
def test_incomplete_ollama_json_is_kept_as_low_confidence(config) -> None:
def handler(_request: httpx.Request) -> httpx.Response:
return httpx.Response(
200,
json={
"message": {
"content": '{"company":"Firma GmbH","confidence":0.94}'
}
},
)
analyzer = OllamaAnalyzer(config)
analyzer.client.close()
analyzer.client = httpx.Client(
base_url="http://ollama.test",
transport=httpx.MockTransport(handler),
)
result = analyzer.analyze("Brief")
analyzer.close()
assert result.company == "Firma GmbH"
assert result.document_type == DocumentType.UNKNOWN
assert result.confidence == 0.65
assert any("unvollständig" in warning for warning in result.warnings)