Refactor digitador bot and add runtime monitoring

This commit is contained in:
erik
2026-08-30 14:02:58 -05:00
parent 3b01456875
commit d9e2012e22
46 changed files with 1720 additions and 248 deletions
+17 -4
View File
@@ -24,6 +24,8 @@ from domain.profiles import get_profile
from domain.prompts import PromptBuilder
from domain.normalizer import normalize_to_schema
from domain.rate_limiter import get_rate_limiter
from domain.config import settings
from domain.usage_tracking import record_api_usage
logger = logging.getLogger(__name__)
@@ -131,8 +133,8 @@ async def process_document(
await rate_limiter.acquire(estimated_tokens=estimated_tokens)
# Extracción + normalización (CPU + IO bound, en thread pool)
def _extract_and_normalize() -> tuple[dict, dict]:
data, _usage = service.extract_full_from_pdf(
def _extract_and_normalize() -> tuple[dict, dict, dict | None, dict | None]:
data, extraction_usage = service.extract_full_from_pdf(
queue_path,
instruction=prompt,
tiff_page_range=tiff_range,
@@ -149,11 +151,13 @@ async def process_document(
profile_name=prof.get("name", "invoice"),
)
normalized_obj = data
normalizer_usage = None
if isinstance(norm, dict):
normalized_obj = norm.get("normalized") or data
return raw_data, normalized_obj
normalizer_usage = norm.get("_usage")
return raw_data, normalized_obj, extraction_usage, normalizer_usage
_raw, normalized_obj = await asyncio.to_thread(_extract_and_normalize)
_raw, normalized_obj, extraction_usage, normalizer_usage = await asyncio.to_thread(_extract_and_normalize)
# Persistir resultado en BD
def _persist() -> dict[str, Any]:
@@ -164,6 +168,15 @@ async def process_document(
return {"skipped": True, "reason": "task_not_found"}
result = dict(task.result or {})
result = record_api_usage(
result, phase="extract", model=str(effective_model), usage=extraction_usage,
radicado=radicado, filename=filename,
)
result = record_api_usage(
result, phase="normalize", model=str(settings.api.normalizer_model), usage=normalizer_usage,
radicado=radicado, filename=filename,
)
task.result = result
if structure_mode == "radicados" and doc_types and doc_type:
partials = dict(result.get("partials") or {})