- UsageStore with async SQLite persistence via aiosqlite - Background batch writer for non-blocking event persistence - Auto-subscribes to UsageTracker for transparent capture - Query methods: query(), get_billing_summary(), get_daily_usage() - REST API endpoints: /usage/history, /usage/billing, /usage/daily - Filtering by org_id, agent_id, model, time range - 18 new tests for persistence layer Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
93 lines
2.1 KiB
Python
93 lines
2.1 KiB
Python
"""
|
|
LLM abstraction layer.
|
|
|
|
Usage:
|
|
from xml_pipeline.llm import router
|
|
|
|
# Configure once at startup (or via organism.yaml)
|
|
router.configure_router({
|
|
"strategy": "failover",
|
|
"backends": [
|
|
{"provider": "xai", "api_key_env": "XAI_API_KEY"},
|
|
]
|
|
})
|
|
|
|
# Then anywhere in your code:
|
|
response = await router.complete(
|
|
model="grok-4.1",
|
|
messages=[{"role": "user", "content": "Hello"}],
|
|
thread_id=metadata.thread_id, # For budget enforcement
|
|
agent_id=metadata.own_name, # For usage tracking
|
|
)
|
|
|
|
Usage Tracking:
|
|
from xml_pipeline.llm import get_usage_tracker
|
|
|
|
tracker = get_usage_tracker()
|
|
|
|
# Subscribe to events for billing
|
|
tracker.subscribe(lambda event: billing_api.record(event))
|
|
|
|
# Query totals
|
|
totals = tracker.get_totals()
|
|
|
|
Usage Persistence (for billing):
|
|
from xml_pipeline.llm import get_usage_store
|
|
|
|
store = await get_usage_store()
|
|
|
|
# Query historical usage
|
|
events = await store.query(
|
|
start_time="2025-01-01T00:00:00Z",
|
|
org_id="org-123",
|
|
)
|
|
|
|
# Get billing summary
|
|
summary = await store.get_billing_summary(org_id="org-123")
|
|
"""
|
|
|
|
from xml_pipeline.llm.router import (
|
|
LLMRouter,
|
|
get_router,
|
|
configure_router,
|
|
complete,
|
|
Strategy,
|
|
)
|
|
from xml_pipeline.llm.backend import LLMRequest, LLMResponse, BackendError
|
|
from xml_pipeline.llm.usage_tracker import (
|
|
UsageTracker,
|
|
UsageEvent,
|
|
get_usage_tracker,
|
|
reset_usage_tracker,
|
|
)
|
|
from xml_pipeline.llm.usage_store import (
|
|
UsageStore,
|
|
BillingSummary,
|
|
get_usage_store,
|
|
close_usage_store,
|
|
reset_usage_store,
|
|
)
|
|
|
|
__all__ = [
|
|
# Router
|
|
"LLMRouter",
|
|
"get_router",
|
|
"configure_router",
|
|
"complete",
|
|
"Strategy",
|
|
# Backend
|
|
"LLMRequest",
|
|
"LLMResponse",
|
|
"BackendError",
|
|
# Usage tracking (in-memory)
|
|
"UsageTracker",
|
|
"UsageEvent",
|
|
"get_usage_tracker",
|
|
"reset_usage_tracker",
|
|
# Usage persistence (SQLite)
|
|
"UsageStore",
|
|
"BillingSummary",
|
|
"get_usage_store",
|
|
"close_usage_store",
|
|
"reset_usage_store",
|
|
]
|