Source code for lalandre_extraction.metrics
"""Metrics hook interfaces for extraction LLM instrumentation."""
from abc import ABC, abstractmethod
[docs]
class ExtractionMetricsRecorder(ABC):
"""Backend-agnostic hook interface for extraction LLM metrics."""
[docs]
@abstractmethod
def observe_call(
self,
*,
provider: str,
model: str,
outcome: str,
duration_seconds: float,
) -> None:
"""Record one extraction LLM call outcome and latency."""
...
[docs]
@abstractmethod
def observe_error(
self,
*,
provider: str,
model: str,
error_type: str,
) -> None:
"""Record one extraction LLM error bucket."""
...
[docs]
@abstractmethod
def observe_json_parse(
self,
*,
provider: str,
model: str,
parse_mode: str,
) -> None:
"""Record how raw model output was parsed into structured relations."""
...
[docs]
@abstractmethod
def observe_relations(
self,
*,
provider: str,
model: str,
count: int,
) -> None:
"""Record the number of relations produced by a successful call."""
...
class _NoopExtractionMetricsRecorder(ExtractionMetricsRecorder):
def observe_call(
self,
*,
provider: str,
model: str,
outcome: str,
duration_seconds: float,
) -> None:
return None
def observe_error(
self,
*,
provider: str,
model: str,
error_type: str,
) -> None:
return None
def observe_json_parse(
self,
*,
provider: str,
model: str,
parse_mode: str,
) -> None:
return None
def observe_relations(
self,
*,
provider: str,
model: str,
count: int,
) -> None:
return None
_recorder: ExtractionMetricsRecorder = _NoopExtractionMetricsRecorder()
[docs]
def set_extraction_metrics_recorder(recorder: ExtractionMetricsRecorder) -> None:
"""Register the active extraction metrics recorder backend."""
global _recorder
_recorder = recorder
[docs]
def observe_extraction_llm_call(
*,
provider: str,
model: str,
outcome: str,
duration_seconds: float,
) -> None:
"""Forward one extraction-call latency observation to the active recorder."""
_recorder.observe_call(
provider=provider,
model=model,
outcome=outcome,
duration_seconds=duration_seconds,
)
[docs]
def observe_extraction_llm_error(
*,
provider: str,
model: str,
error_type: str,
) -> None:
"""Forward one extraction error observation to the active recorder."""
_recorder.observe_error(
provider=provider,
model=model,
error_type=error_type,
)
[docs]
def observe_extraction_llm_relations(
*,
provider: str,
model: str,
count: int,
) -> None:
"""Forward one extracted-relations count observation to the active recorder."""
_recorder.observe_relations(
provider=provider,
model=model,
count=count,
)