Refactor digitador bot and add runtime monitoring
This commit is contained in:
@@ -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 {})
|
||||
|
||||
Reference in New Issue
Block a user