| 12345678910111213141516171819202122232425262728293031323334353637 |
- """Pluggable hook for persisting LLM usage / cost after each completion.
- Keeps the agent framework free of infrastructure (DB) dependencies.
- Infra registers a recorder via ``set_llm_usage_recorder``.
- """
- from __future__ import annotations
- from collections.abc import Callable
- from typing import Any
- LlmUsageRecorder = Callable[[dict[str, Any]], None]
- _recorder: LlmUsageRecorder | None = None
- def set_llm_usage_recorder(recorder: LlmUsageRecorder | None) -> None:
- """Install or clear the LLM usage recorder callback."""
- global _recorder
- _recorder = recorder
- def get_llm_usage_recorder() -> LlmUsageRecorder | None:
- return _recorder
- def record_llm_usage(payload: dict[str, Any]) -> None:
- """Invoke the registered recorder, if any. Never raises to callers."""
- if _recorder is None:
- return
- try:
- _recorder(payload)
- except Exception:
- # Billing must not break agent runs.
- import logging
- logging.getLogger(__name__).exception("LLM usage recorder failed")
|