usage.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. """Pluggable hook for persisting LLM usage / cost after each completion.
  2. Keeps the agent framework free of infrastructure (DB) dependencies.
  3. Infra registers a recorder via ``set_llm_usage_recorder``.
  4. """
  5. from __future__ import annotations
  6. from collections.abc import Callable
  7. from typing import Any
  8. LlmUsageRecorder = Callable[[dict[str, Any]], None]
  9. _recorder: LlmUsageRecorder | None = None
  10. def set_llm_usage_recorder(recorder: LlmUsageRecorder | None) -> None:
  11. """Install or clear the LLM usage recorder callback."""
  12. global _recorder
  13. _recorder = recorder
  14. def get_llm_usage_recorder() -> LlmUsageRecorder | None:
  15. return _recorder
  16. def record_llm_usage(payload: dict[str, Any]) -> None:
  17. """Invoke the registered recorder, if any. Never raises to callers."""
  18. if _recorder is None:
  19. return
  20. try:
  21. _recorder(payload)
  22. except Exception:
  23. # Billing must not break agent runs.
  24. import logging
  25. logging.getLogger(__name__).exception("LLM usage recorder failed")