Complete reference for all public classes in agent-sre.
- Core SLO
- Alerting
- Chaos Engineering
- Circuit Breaker
- Cost Management
- Replay & Tracing
- Fleet Management
- Delivery
- Framework Adapters
- Integrations
Module: agent_sre.slo.objectives
Service Level Objective for an AI agent. Combines multiple SLIs with targets and an error budget to define what "reliable" means.
from agent_sre import SLO, ErrorBudget
from agent_sre.slo.indicators import TaskSuccessRate
slo = SLO(
name="my-agent",
indicators=[TaskSuccessRate(target=0.95)],
error_budget=ErrorBudget(total=0.05),
description="Production agent SLO",
labels={"team": "platform"},
agent_id="agent-1",
)
slo.record_event(good=True)
status = slo.evaluate() # SLOStatus.HEALTHY
print(slo.to_dict())| Parameter | Type | Default | Description |
|---|---|---|---|
name |
str |
required | Unique SLO name |
indicators |
list[SLI] |
required | Service level indicators to track |
error_budget |
ErrorBudget | None |
None |
Error budget configuration; auto-derived from strictest indicator target if omitted |
description |
str |
"" |
Human-readable description |
labels |
dict[str, str] | None |
None |
Key-value labels for filtering |
alert_manager |
AlertManager | None |
None |
Alert manager for automatic breach notifications |
agent_id |
str |
"" |
Agent identifier for alerts |
| Method | Returns | Description |
|---|---|---|
evaluate() |
SLOStatus |
Evaluate current SLO health. Returns HEALTHY, WARNING, CRITICAL, EXHAUSTED, or UNKNOWN |
record_event(good: bool) |
None |
Record a good or bad event and re-evaluate status |
indicator_summary() |
list[dict] |
Summary of all indicator values |
to_dict() |
dict |
Serialize SLO state including status, budget, and indicators |
Module: agent_sre.slo.objectives
Tracks error budget consumption and burn rate alerting.
from agent_sre import ErrorBudget
from agent_sre.slo.objectives import ExhaustionAction
budget = ErrorBudget(
total=0.05,
burn_rate_alert=2.0,
burn_rate_critical=10.0,
exhaustion_action=ExhaustionAction.FREEZE_DEPLOYMENTS,
)
budget.record_event(good=False)
print(budget.remaining_percent) # Remaining budget as %
print(budget.burn_rate()) # Current burn rate
print(budget.is_exhausted) # True if budget consumed| Parameter | Type | Default | Description |
|---|---|---|---|
total |
float |
0.0 |
Total error budget (typically 1 - target) |
consumed |
float |
0.0 |
Already consumed budget |
window_seconds |
int |
2592000 |
Budget window (default 30 days) |
burn_rate_alert |
float |
2.0 |
Burn rate threshold for warning alerts |
burn_rate_critical |
float |
10.0 |
Burn rate threshold for critical alerts |
exhaustion_action |
ExhaustionAction |
ALERT |
Action when budget exhausted (ALERT, FREEZE_DEPLOYMENTS, CIRCUIT_BREAK, THROTTLE) |
| Property | Type | Description |
|---|---|---|
remaining |
float |
Remaining budget as fraction (0.0–1.0) |
remaining_percent |
float |
Remaining budget as percentage |
is_exhausted |
bool |
True when budget fully consumed |
| Method | Returns | Description |
|---|---|---|
record_event(good: bool) |
None |
Record a good or bad event |
burn_rate(window_seconds: int | None) |
float |
Current burn rate; 1.0 = consuming at expected rate, >1.0 = faster |
firing_alerts() |
list[BurnRateAlert] |
Alerts currently firing |
to_dict() |
dict |
Serialize budget state |
Module: agent_sre.slo.indicators
Base class for all Service Level Indicators. Subclass this to define custom measurements.
| Parameter | Type | Default | Description |
|---|---|---|---|
name |
str |
required | Indicator name |
target |
float |
required | Target value |
window |
TimeWindow | str |
required | Aggregation window ("1h", "6h", "24h", "7d", "30d") |
| Method | Returns | Description |
|---|---|---|
collect() |
SLIValue |
(abstract) Collect a new measurement |
record(value, metadata) |
SLIValue |
Record a measurement value |
values_in_window() |
list[SLIValue] |
Measurements within current time window |
current_value() |
float | None |
Aggregated value within window |
compliance() |
float | None |
Fraction of measurements meeting the target |
to_dict() |
dict |
Serialize indicator state |
All built-in SLIs extend SLI and are available from agent_sre.slo.indicators.
Measures the fraction of tasks completed successfully.
from agent_sre.slo.indicators import TaskSuccessRate
sli = TaskSuccessRate(target=0.95, window="24h")
sli.record_task(success=True)
sli.record_task(success=False)
print(sli.current_value()) # 0.5| Parameter | Type | Default | Description |
|---|---|---|---|
target |
float |
0.995 |
Success rate target |
window |
TimeWindow | str |
"30d" |
Measurement window |
Key method: record_task(success: bool, metadata: dict | None) → SLIValue
Measures the fraction of tool calls that selected the correct tool.
from agent_sre.slo.indicators import ToolCallAccuracy
sli = ToolCallAccuracy(target=0.99, window="7d")
sli.record_call(correct=True)| Parameter | Type | Default | Description |
|---|---|---|---|
target |
float |
0.999 |
Accuracy target |
window |
TimeWindow | str |
"7d" |
Measurement window |
Key method: record_call(correct: bool, metadata: dict | None) → SLIValue
Measures response latency at a given percentile.
from agent_sre.slo.indicators import ResponseLatency
sli = ResponseLatency(target_ms=5000.0, percentile=0.95, window="1h")
sli.record_latency(latency_ms=1200.0)| Parameter | Type | Default | Description |
|---|---|---|---|
target_ms |
float |
5000.0 |
Latency target in milliseconds |
percentile |
float |
0.95 |
Percentile to measure (e.g. 0.95 for p95) |
window |
TimeWindow | str |
"1h" |
Measurement window |
Key method: record_latency(latency_ms: float, metadata: dict | None) → SLIValue
Measures the average cost per task in USD.
from agent_sre.slo.indicators import CostPerTask
sli = CostPerTask(target_usd=0.50, window="24h")
sli.record_cost(cost_usd=0.35)| Parameter | Type | Default | Description |
|---|---|---|---|
target_usd |
float |
0.50 |
Cost target in USD |
window |
TimeWindow | str |
"24h" |
Measurement window |
Key method: record_cost(cost_usd: float, metadata: dict | None) → SLIValue
Measures hallucination rate via LLM-as-judge evaluation. Lower is better.
from agent_sre.slo.indicators import HallucinationRate
sli = HallucinationRate(target=0.05, window="24h")
sli.record_evaluation(hallucinated=False, confidence=0.95)| Parameter | Type | Default | Description |
|---|---|---|---|
target |
float |
0.05 |
Maximum hallucination rate |
window |
TimeWindow | str |
"24h" |
Measurement window |
Key method: record_evaluation(hallucinated: bool, confidence: float, metadata: dict | None) → SLIValue
Measures adherence to policies (100% target by default).
| Parameter | Type | Default | Description |
|---|---|---|---|
target |
float |
1.0 |
Compliance target |
window |
TimeWindow | str |
"24h" |
Measurement window |
Key method: record_check(compliant: bool, metadata: dict | None) → SLIValue
Measures scope chain depth (lower is better).
| Parameter | Type | Default | Description |
|---|---|---|---|
max_depth |
int |
3 |
Maximum acceptable depth |
window |
TimeWindow | str |
"24h" |
Measurement window |
Key method: record_depth(depth: int, metadata: dict | None) → SLIValue
Module: agent_sre.slo.indicators
Registry for discovering and managing SLI types and instances.
from agent_sre import SLIRegistry
from agent_sre.slo.indicators import TaskSuccessRate
registry = SLIRegistry()
sli = TaskSuccessRate(target=0.95)
registry.register_instance("agent-1", sli)
registry.collect_all("agent-1")| Method | Returns | Description |
|---|---|---|
register_type(sli_class) |
None |
Register a custom SLI type |
register_instance(agent_id, sli) |
None |
Register an SLI instance for an agent |
get_type(name) |
type[SLI] | None |
Look up SLI type by name |
get_instances(agent_id) |
list[SLI] |
Get all SLIs for an agent |
list_types() |
list[str] |
List all registered SLI type names |
collect_all(agent_id) |
list[SLIValue] |
Collect current values for all SLIs of an agent |
Module: agent_sre.slo.spec
Pydantic model for declarative SLO specifications. Supports YAML serialization.
from agent_sre.slo.spec import SLOSpec
spec = SLOSpec.from_yaml("slo.yaml")
spec.to_yaml("slo-out.yaml")| Field | Type | Description |
|---|---|---|
name |
str |
SLO name |
description |
str |
Human-readable description |
service |
str |
Service/agent name |
target |
float |
SLO target |
window |
str |
Time window |
error_budget_policy |
ErrorBudgetPolicy |
Budget policy configuration |
labels |
dict |
Metadata labels |
inherits_from |
str | None |
Parent SLO spec for inheritance |
Module: agent_sre.alerts
Manages alert channels and dispatches alerts with deduplication. Supports Slack, PagerDuty, OpsGenie, Microsoft Teams, generic webhooks, and in-process callbacks.
from agent_sre.alerts import AlertManager, Alert, AlertSeverity, ChannelConfig, AlertChannel
manager = AlertManager(dedup_window_seconds=300)
manager.add_channel(ChannelConfig(
channel_type=AlertChannel.SLACK,
name="ops-slack",
url="https://hooks.slack.com/services/...",
))
manager.send(Alert(
title="SLO Breach",
message="Error budget exhausted for agent-1",
severity=AlertSeverity.CRITICAL,
agent_id="agent-1",
slo_name="my-slo",
dedup_key="agent-1:my-slo",
))| Parameter | Type | Default | Description |
|---|---|---|---|
dedup_window_seconds |
float |
300.0 |
Suppress duplicate alerts within this window |
| Method | Returns | Description |
|---|---|---|
add_channel(config: ChannelConfig) |
None |
Register an alert channel |
remove_channel(name: str) |
None |
Remove a channel by name |
list_channels() |
list[str] |
List registered channel names |
send(alert: Alert) |
list[DeliveryResult] |
Send alert to all matching channels |
get_stats() |
dict |
Delivery statistics |
clear_history() |
None |
Clear delivery history |
Module: agent_sre.alerts
Extends AlertManager with SQLite-backed alert persistence for audit trails.
from agent_sre.alerts import PersistentAlertManager
manager = PersistentAlertManager(db_path="alerts.db")
results = manager.query_alerts(agent_id="agent-1", severity="critical")| Parameter | Type | Default | Description |
|---|---|---|---|
db_path |
str |
"agent_sre_alerts.db" |
SQLite database path |
dedup_window_seconds |
float |
300.0 |
Deduplication window |
| Method | Returns | Description |
|---|---|---|
query_alerts(agent_id, severity, limit) |
list[dict] |
Query persisted alerts |
alert_count() |
int |
Total persisted alert count |
Module: agent_sre.alerts
Dataclass representing an alert to be sent to external systems.
| Field | Type | Default | Description |
|---|---|---|---|
title |
str |
required | Alert title |
message |
str |
required | Alert body |
severity |
AlertSeverity |
WARNING |
INFO, WARNING, CRITICAL, or RESOLVED |
source |
str |
"agent-sre" |
Alert source |
agent_id |
str |
"" |
Agent identifier |
slo_name |
str |
"" |
Related SLO |
metadata |
dict |
{} |
Additional context |
dedup_key |
str |
"" |
Key for deduplication |
Module: agent_sre.alerts
Configuration for an alert channel.
| Field | Type | Default | Description |
|---|---|---|---|
channel_type |
AlertChannel |
required | SLACK, PAGERDUTY, GENERIC_WEBHOOK, CALLBACK, OPSGENIE, TEAMS |
name |
str |
required | Channel name |
url |
str |
"" |
Webhook URL |
token |
str |
"" |
Auth token (PagerDuty routing key, OpsGenie API key) |
callback |
Callable | None |
None |
In-process callback for CALLBACK type |
min_severity |
AlertSeverity |
WARNING |
Minimum severity to deliver |
enabled |
bool |
True |
Whether channel is active |
Module: agent_sre.chaos.engine
A chaos engineering experiment that injects faults into agent systems.
from agent_sre.chaos.engine import ChaosExperiment, Fault, AbortCondition
experiment = ChaosExperiment(
name="tool-timeout-test",
target_agent="agent-1",
faults=[Fault.timeout_injection("search-tool", delay_ms=30000)],
duration_seconds=600,
abort_conditions=[AbortCondition(metric="success_rate", threshold=0.5)],
blast_radius=0.5,
)
experiment.start()
# ... run agent workload ...
experiment.check_abort({"success_rate": 0.8})
score = experiment.calculate_resilience(
baseline_success_rate=0.99,
experiment_success_rate=0.95,
)
experiment.complete(resilience=score)| Parameter | Type | Default | Description |
|---|---|---|---|
name |
str |
required | Experiment name |
target_agent |
str |
required | Agent to target |
faults |
list[Fault] |
required | Faults to inject |
duration_seconds |
int |
1800 |
Maximum duration |
abort_conditions |
list[AbortCondition] | None |
None |
Safety abort conditions |
blast_radius |
float |
1.0 |
Fraction of traffic affected (0.0–1.0) |
description |
str |
"" |
Human-readable description |
| Property | Type | Description |
|---|---|---|
elapsed_seconds |
float |
Time since start |
remaining_seconds |
float |
Time remaining |
is_expired |
bool |
Whether duration exceeded |
| Method | Returns | Description |
|---|---|---|
start() |
None |
Start the experiment |
inject_fault(fault, applied, details) |
None |
Record a fault injection event |
check_abort(metrics: dict) |
bool |
Check abort conditions; returns True if experiment should stop |
abort(reason: str) |
None |
Abort the experiment |
complete(resilience) |
None |
Mark experiment as completed |
calculate_resilience(baseline_success_rate, experiment_success_rate, ...) |
ResilienceScore |
Calculate resilience score |
to_dict() |
dict |
Serialize experiment state |
Module: agent_sre.chaos.engine
A fault to inject during a chaos experiment.
from agent_sre.chaos.engine import Fault
# Static factory methods
latency = Fault.latency_injection("llm-provider", delay_ms=5000, rate=0.5)
error = Fault.error_injection("search-tool", error="internal_error")
timeout = Fault.timeout_injection("api-tool", delay_ms=30000)| Field | Type | Default | Description |
|---|---|---|---|
fault_type |
FaultType |
required | LATENCY_INJECTION, ERROR_INJECTION, or TIMEOUT_INJECTION |
target |
str |
required | Tool name, agent ID, or provider name |
rate |
float |
1.0 |
Fraction of calls affected (0.0–1.0) |
params |
dict |
{} |
Fault-specific parameters |
| Method | Description |
|---|---|
latency_injection(target, delay_ms=5000, rate=1.0) |
Inject latency |
error_injection(target, error="internal_error", rate=1.0) |
Inject errors |
timeout_injection(target, delay_ms=30000, rate=1.0) |
Inject timeouts |
Module: agent_sre.chaos.engine
Safety condition that stops a chaos experiment.
| Field | Type | Default | Description |
|---|---|---|---|
metric |
str |
required | Metric name to monitor |
threshold |
float |
required | Threshold value |
comparator |
str |
"lte" |
"lte" (abort when ≤) or "gte" (abort when ≥) |
Key method: should_abort(value: float) → bool
Module: agent_sre.chaos.library
Reusable chaos experiment template.
from agent_sre.chaos.library import ChaosLibrary
library = ChaosLibrary()
templates = library.list_templates()
experiment = templates[0].instantiate(target_agent="agent-1")| Method | Returns | Description |
|---|---|---|
instantiate(target_agent, **overrides) |
ChaosExperiment |
Create experiment from template |
to_dict() |
dict |
Serialize template |
Module: agent_sre.chaos.library
Registry of reusable experiment templates.
| Method | Returns | Description |
|---|---|---|
register_template(template) |
None |
Register a template |
get_template(template_id) |
ExperimentTemplate | None |
Look up template |
list_templates() |
list[ExperimentTemplate] |
List all templates |
Module: agent_sre.cascade.circuit_breaker
Per-agent circuit breaker that prevents cascading failures (OWASP ASI08). Transitions through CLOSED → OPEN → HALF_OPEN states.
from agent_sre.cascade.circuit_breaker import CircuitBreaker, CircuitBreakerConfig
cb = CircuitBreaker(
agent_id="agent-1",
config=CircuitBreakerConfig(
failure_threshold=5,
recovery_timeout_seconds=30.0,
half_open_max_calls=1,
),
)
# Wrap calls through the circuit breaker
result = cb.call(my_function, arg1, arg2, fallback="default")
# Or record manually
cb.record_success()
cb.record_failure()
print(cb.state) # "CLOSED", "OPEN", or "HALF_OPEN"| Parameter | Type | Default | Description |
|---|---|---|---|
agent_id |
str |
required | Agent identifier |
config |
CircuitBreakerConfig | None |
None |
Configuration (uses defaults if omitted) |
| Property | Type | Description |
|---|---|---|
state |
str |
Current state: "CLOSED", "OPEN", or "HALF_OPEN" |
failure_count |
int |
Current consecutive failure count |
| Method | Returns | Description |
|---|---|---|
call(func, *args, fallback=None, **kwargs) |
T | Any |
Execute function through the circuit breaker; uses fallback when open |
record_success() |
None |
Record a successful call |
record_failure() |
None |
Record a failed call |
reset() |
None |
Manually reset to CLOSED state |
Raises: CircuitOpenError when circuit is open and no fallback is provided.
Module: agent_sre.cascade.circuit_breaker
| Field | Type | Default | Description |
|---|---|---|---|
failure_threshold |
int |
5 |
Failures before opening circuit |
recovery_timeout_seconds |
float |
30.0 |
Seconds before attempting recovery |
half_open_max_calls |
int |
1 |
Trial calls allowed in HALF_OPEN |
Module: agent_sre.cascade.circuit_breaker
Detects cascading failures across multiple agents by monitoring circuit breaker states.
from agent_sre.cascade.circuit_breaker import CascadeDetector
detector = CascadeDetector(
agents=["agent-1", "agent-2", "agent-3", "agent-4"],
cascade_threshold=3,
)
breaker = detector.get_breaker("agent-1")
breaker.record_failure()
if detector.check_cascade():
print("Cascade detected!", detector.get_affected_agents())| Parameter | Type | Default | Description |
|---|---|---|---|
agents |
list[str] |
required | Agent IDs to monitor |
cascade_threshold |
int |
3 |
Open circuits needed to declare cascade |
config |
CircuitBreakerConfig | None |
None |
Shared config for all breakers |
| Method | Returns | Description |
|---|---|---|
get_breaker(agent_id) |
CircuitBreaker |
Get breaker for an agent |
check_cascade() |
bool |
True if cascade detected |
get_affected_agents() |
list[str] |
Agent IDs with open circuits |
reset_all() |
None |
Reset all circuit breakers |
Module: agent_sre.cost.guard
Cost tracking, budgeting, anomaly detection, and auto-throttling for agents.
from agent_sre.cost.guard import CostGuard
guard = CostGuard(
per_task_limit=2.0,
per_agent_daily_limit=100.0,
org_monthly_budget=5000.0,
auto_throttle=True,
)
# Check before running a task
allowed, reason = guard.check_task("agent-1", estimated_cost=0.50)
if allowed:
# ... run task ...
alerts = guard.record_cost("agent-1", "task-123", cost_usd=0.45)
print(guard.summary())| Parameter | Type | Default | Description |
|---|---|---|---|
per_task_limit |
float |
2.0 |
Maximum cost per task (USD) |
per_agent_daily_limit |
float |
100.0 |
Daily budget per agent (USD) |
org_monthly_budget |
float |
5000.0 |
Organization monthly budget (USD) |
anomaly_detection |
bool |
True |
Enable Z-score anomaly detection |
auto_throttle |
bool |
True |
Auto-throttle/kill agents exceeding budgets |
kill_switch_threshold |
float |
0.95 |
Budget utilization to kill agent |
alert_thresholds |
list[float] | None |
[0.50, 0.75, 0.90, 0.95] |
Budget utilization alert thresholds |
| Property | Type | Description |
|---|---|---|
org_spent_month |
float |
Total org spend this month |
org_remaining_month |
float |
Remaining org budget |
alerts |
list[CostAlert] |
All generated alerts |
| Method | Returns | Description |
|---|---|---|
get_budget(agent_id) |
AgentBudget |
Get or create budget for an agent |
check_task(agent_id, estimated_cost) |
tuple[bool, str] |
Check if task is allowed (allowed, reason) |
record_cost(agent_id, task_id, cost_usd, breakdown) |
list[CostAlert] |
Record cost and return triggered alerts |
reset_daily(agent_id) |
None |
Reset daily budgets (call at start of day) |
summary() |
dict |
Cost summary across all agents |
Module: agent_sre.cost.guard
Budget state for a single agent.
| Field | Type | Default | Description |
|---|---|---|---|
agent_id |
str |
required | Agent identifier |
daily_limit_usd |
float |
100.0 |
Daily limit |
per_task_limit_usd |
float |
2.0 |
Per-task limit |
spent_today_usd |
float |
0.0 |
Amount spent today |
throttled |
bool |
False |
Whether agent is throttled |
killed |
bool |
False |
Whether agent is killed |
| Property | Type | Description |
|---|---|---|
remaining_today_usd |
float |
Remaining daily budget |
utilization_percent |
float |
Budget utilization percentage |
avg_cost_per_task |
float |
Average cost per task today |
Module: agent_sre.tracing
Distributed tracing for A2A and MCP protocol calls with W3C Trace Context propagation.
from agent_sre.tracing import ProtocolTracer
tracer = ProtocolTracer(agent_id="agent-1")
# Trace an A2A call
span = tracer.a2a_call(
target_agent="agent-2",
task="summarize",
target_url="https://agent-2/api",
)
span.set_response(response={"result": "done"}, cost_usd=0.05)
# Trace an MCP tool call
span = tracer.mcp_call(
server_id="search-server",
tool="web_search",
params={"query": "test"},
)
report = tracer.report()| Parameter | Type | Default | Description |
|---|---|---|---|
agent_id |
str |
required | Agent identifier |
parent_context |
TraceContext | None |
None |
Parent trace context for distributed tracing |
| Method | Returns | Description |
|---|---|---|
a2a_call(target_agent, task, target_url, message_id) |
ProtocolSpan |
Start an A2A protocol span |
mcp_call(server_id, tool, params, request_id) |
ProtocolSpan |
Start an MCP protocol span |
inject(pspan) |
dict |
Inject trace context into outgoing headers |
extract(headers) |
TraceContext |
Extract trace context from incoming headers |
report() |
TracingReport |
Generate tracing report |
Module: agent_sre.tracing
W3C Trace Context for distributed tracing.
| Field | Type | Description |
|---|---|---|
trace_id |
str |
Unique trace identifier |
span_id |
str |
Current span identifier |
parent_span_id |
str | None |
Parent span identifier |
sampled |
bool |
Whether trace is sampled |
baggage |
dict |
Propagated key-value pairs |
| Method | Returns | Description |
|---|---|---|
to_traceparent() |
str |
Serialize to W3C traceparent header |
from_traceparent(value) |
TraceContext |
(static) Parse traceparent header |
child() |
TraceContext |
Create child context |
to_headers() |
dict |
Generate propagation headers |
from_headers(headers) |
TraceContext |
(static) Extract from headers |
Module: agent_sre.replay.engine
Replays recorded traces for regression testing and golden-trace validation.
from agent_sre.replay.engine import ReplayEngine
engine = ReplayEngine(golden_traces=golden_suite.traces)
result = engine.replay_trace(recorded_trace)
suite_result = engine.run_suite(golden_suite)| Method | Returns | Description |
|---|---|---|
replay_trace(trace) |
ReplayResult |
Replay a single trace |
run_suite(suite) |
GoldenSuiteResult |
Run all traces in a golden suite |
Module: agent_sre.fleet
Manages a fleet of agents with heartbeats, health monitoring, and SLO tracking.
from agent_sre.fleet import FleetManager
fleet = FleetManager(heartbeat_timeout=60.0, success_rate_threshold=0.95)
fleet.register("agent-1", tags={"team": "platform"})
fleet.heartbeat("agent-1")
fleet.record_event("agent-1", success=True, latency_ms=120, cost_usd=0.05)
health = fleet.agent_health("agent-1")
status = fleet.status()
print(status.to_dict())| Parameter | Type | Default | Description |
|---|---|---|---|
heartbeat_timeout |
float |
required | Seconds before agent is unresponsive |
success_rate_threshold |
float |
required | Success rate below which agent is degraded |
| Method | Returns | Description |
|---|---|---|
register(agent_id, tags, slo, heartbeat_timeout) |
AgentRegistration |
Register an agent |
heartbeat(agent_id) |
bool |
Record heartbeat |
record_event(agent_id, success, latency_ms, cost_usd, metadata) |
bool |
Record an agent event |
agent_health(agent_id) |
AgentHealth | None |
Get agent health status |
status() |
FleetStatus |
Get fleet-wide status |
Module: agent_sre.delivery.blue_green
Blue-green deployment manager for agent version rollouts.
from agent_sre.delivery.blue_green import BlueGreenManager
manager = BlueGreenManager()
env = manager.deploy(version="v2.0.0")
if manager.validate():
manager.switch()
else:
manager.rollback()| Method | Returns | Description |
|---|---|---|
deploy(version) |
AgentEnvironment |
Deploy a new version to inactive environment |
validate() |
bool |
Validate deployment health |
switch() |
None |
Switch traffic to new version |
rollback() |
None |
Rollback to previous version |
get_active() |
AgentEnvironment |
Get active environment |
get_inactive() |
AgentEnvironment |
Get inactive environment |
Module: agent_sre.adapters
Lightweight wrappers that instrument popular agent frameworks with SLO monitoring, cost tracking, and evaluation. All adapters are duck-typed — no framework imports required.
from agent_sre.adapters import LangGraphAdapter
adapter = LangGraphAdapter()
task = adapter.on_graph_start("my-graph")
adapter.on_node_start("retriever")
adapter.on_tool_call("search", error="")
adapter.on_llm_call(input_tokens=100, output_tokens=50, cost_usd=0.01)
adapter.on_node_end("retriever")
task = adapter.on_graph_end(success=True)
print(adapter.get_sli_snapshot())| Method | Returns | Description |
|---|---|---|
on_graph_start(graph_name) |
TaskRecord |
Start tracking a graph execution |
on_node_start(node_name) |
None |
Record node start |
on_node_end(node_name, error) |
None |
Record node end |
on_llm_call(input_tokens, output_tokens, cost_usd) |
None |
Record LLM call |
on_tool_call(tool_name, error) |
None |
Record tool call |
on_graph_end(success, error) |
TaskRecord |
Finish tracking |
get_sli_snapshot() |
dict |
Get SLI metrics snapshot |
clear() |
None |
Reset all recorded data |
| Property | Type | Description |
|---|---|---|
task_success_rate |
float |
Fraction of tasks succeeded |
total_cost_usd |
float |
Total cost across all tasks |
avg_duration_ms |
float |
Average task duration |
tool_accuracy |
float |
Tool call success rate |
from agent_sre.adapters import CrewAIAdapter
adapter = CrewAIAdapter()
adapter.on_crew_start("research-crew", num_agents=3)
adapter.on_agent_task("researcher", "Find papers")
adapter.on_agent_complete("researcher", success=True, cost_usd=0.05)
adapter.on_crew_end(success=True)| Method | Returns | Description |
|---|---|---|
on_crew_start(crew_name, num_agents) |
TaskRecord |
Start crew run |
on_agent_task(agent_role, task_description) |
None |
Record agent task |
on_agent_complete(agent_role, success, cost_usd) |
None |
Record agent completion |
on_tool_use(tool_name, error) |
None |
Record tool use |
on_crew_end(success, error) |
TaskRecord |
Finish crew run |
from agent_sre.adapters import AutoGenAdapter
adapter = AutoGenAdapter()
adapter.on_conversation_start("user-proxy")
adapter.on_message("assistant", "Hello!")
adapter.on_function_call("search")
adapter.on_conversation_end(success=True)| Method | Returns | Description |
|---|---|---|
on_conversation_start(initiator) |
TaskRecord |
Start conversation |
on_message(sender, content) |
None |
Record a message |
on_function_call(function_name, error) |
None |
Record function call |
on_llm_call(input_tokens, output_tokens, cost_usd) |
None |
Record LLM call |
on_conversation_end(success, error) |
TaskRecord |
End conversation |
from agent_sre.adapters import OpenAIAgentsAdapter
adapter = OpenAIAgentsAdapter()
adapter.on_run_start("triage-agent")
adapter.on_tool_call("file_search")
adapter.on_handoff("triage-agent", "specialist-agent")
adapter.on_guardrail_check("content-filter", passed=True)
adapter.on_run_end(success=True)| Method | Returns | Description |
|---|---|---|
on_run_start(agent_name) |
TaskRecord |
Start run |
on_tool_call(tool_name, error) |
None |
Record tool call |
on_handoff(from_agent, to_agent) |
None |
Record agent handoff |
on_guardrail_check(guardrail_name, passed) |
None |
Record guardrail check |
on_llm_call(input_tokens, output_tokens, cost_usd) |
None |
Record LLM call |
on_run_end(success, error) |
TaskRecord |
End run |
from agent_sre.adapters import SemanticKernelAdapter
adapter = SemanticKernelAdapter()
adapter.on_kernel_start("my-kernel")
adapter.on_plugin_call("WebSearchPlugin", "search")
adapter.on_function_result("WebSearchPlugin", "search", success=True)
adapter.on_kernel_end(success=True)| Method | Returns | Description |
|---|---|---|
on_kernel_start(kernel_name) |
TaskRecord |
Start kernel execution |
on_plugin_call(plugin_name, function_name, error) |
None |
Record plugin call |
on_function_result(plugin_name, function_name, success, cost_usd) |
None |
Record function result |
on_plan_step(step_name) |
None |
Record planner step |
on_llm_call(input_tokens, output_tokens, cost_usd) |
None |
Record LLM call |
on_kernel_end(success, error) |
TaskRecord |
End kernel execution |
from agent_sre.adapters import DifyAdapter
adapter = DifyAdapter()
adapter.on_workflow_start("my-workflow")
adapter.on_node_start("llm-1", node_type="llm")
adapter.on_node_end("llm-1")
adapter.on_workflow_end(success=True)| Method | Returns | Description |
|---|---|---|
on_workflow_start(workflow_name) |
TaskRecord |
Start workflow |
on_node_start(node_id, node_type) |
None |
Record node start |
on_node_end(node_id, error) |
None |
Record node end |
on_tool_call(tool_name, error) |
None |
Record tool call |
on_llm_call(input_tokens, output_tokens, cost_usd) |
None |
Record LLM call |
on_http_request(url, status_code, error) |
None |
Record HTTP request |
on_workflow_end(success, error) |
TaskRecord |
End workflow |
Module: agent_sre.integrations.langchain.callback
LangChain callback handler for automatic SLI collection.
from agent_sre.integrations.langchain.callback import AgentSRECallback
callback = AgentSRECallback(cost_per_1k_input=0.003, cost_per_1k_output=0.015)
# Pass to LangChain: chain.invoke(input, config={"callbacks": [callback]})
print(callback.task_success_rate)
print(callback.total_cost_usd)
print(callback.get_sli_snapshot())Module: agent_sre.integrations.llamaindex.handler
LlamaIndex event handler for SLI collection.
from agent_sre.integrations.llamaindex.handler import AgentSRELlamaIndexHandler
handler = AgentSRELlamaIndexHandler(cost_per_1k_input=0.003, cost_per_1k_output=0.015)
print(handler.get_sli_snapshot())Module: agent_sre.integrations.prometheus.exporter
Exports SLO metrics in Prometheus exposition format.
from agent_sre.integrations.prometheus.exporter import PrometheusExporter
exporter = PrometheusExporter()
exporter.export_slo(slo, agent_id="agent-1")
print(exporter.render()) # Prometheus text format| Method | Returns | Description |
|---|---|---|
set_gauge(name, value, labels, help_text) |
None |
Set a gauge metric |
inc_counter(name, value, labels, help_text) |
None |
Increment a counter |
export_slo(slo, agent_id) |
None |
Export SLO as Prometheus metrics |
render() |
str |
Render in Prometheus text format |
clear() |
None |
Clear all metrics |
Module: agent_sre.integrations.datadog.exporter
Exports metrics and events to Datadog.
from agent_sre.integrations.datadog.exporter import DatadogExporter
exporter = DatadogExporter(api_key="your-key")
exporter.export_slo(slo, agent_id="agent-1")
exporter.export_cost("agent-1", cost_usd=0.45)| Method | Returns | Description |
|---|---|---|
submit_metric(metric_name, value, tags, metric_type) |
DatadogMetric |
Submit a metric |
submit_event(title, text, alert_type, tags) |
DatadogEvent |
Submit an event |
export_slo(slo, agent_id) |
list[DatadogMetric] |
Export SLO metrics |
export_cost(agent_id, cost_usd, task_id, tags) |
DatadogMetric |
Export cost metric |
Module: agent_sre.integrations.langfuse.exporter
Exports SLO scores and cost observations to Langfuse.
from agent_sre.integrations.langfuse.exporter import LangfuseExporter
exporter = LangfuseExporter()
exporter.score_slo("trace-id", slo)
exporter.record_cost("trace-id", "agent-1", cost_usd=0.50)Module: agent_sre.integrations.langsmith.exporter
Exports runs and SLO feedback to LangSmith.
from agent_sre.integrations.langsmith.exporter import LangSmithExporter
exporter = LangSmithExporter(api_key="your-key", project_name="my-project")
run = exporter.create_run("my-chain", run_type="chain")
exporter.end_run(run.run_id, outputs={"result": "done"})
exporter.export_slo(slo, run_id=run.run_id)Module: agent_sre.integrations.arize.exporter
Exports SLO evaluations and incidents to Arize Phoenix.
from agent_sre.integrations.arize.exporter import PhoenixExporter
exporter = PhoenixExporter()
exporter.export_slo_evaluation("my-slo", status="healthy", budget_remaining=0.95, burn_rate=0.5)
exporter.export_cost_record("agent-1", "task-1", cost_usd=0.30)Module: agent_sre.integrations.braintrust.exporter
Exports evaluations and experiments to Braintrust.
Module: agent_sre.integrations.wandb.exporter
Exports runs and SLO metrics to Weights & Biases.
Module: agent_sre.integrations.mlflow.exporter
Exports runs, SLO metrics, and artifacts to MLflow.
Module: agent_sre.integrations.agentops.exporter
Exports sessions and events to AgentOps.
Module: agent_sre.integrations.helicone.headers
Generates Helicone proxy headers for LLM cost tracking.
from agent_sre.integrations.helicone.headers import HeliconeHeaders
helicone = HeliconeHeaders(api_key="your-key", agent_id="agent-1")
headers = helicone.get_headers(session_name="my-session")
# Add headers to your LLM API callsModule: agent_sre.integrations.mcp
Detects schema drift in MCP tool definitions between versions.
from agent_sre.integrations.mcp import DriftDetector
detector = DriftDetector()
detector.set_baseline(baseline_snapshot)
report = detector.compare(current_snapshot)
print(report) # Shows added, removed, and changed tools| Method | Returns | Description |
|---|---|---|
set_baseline(snapshot) |
None |
Set baseline tool snapshot |
get_baseline(server_id) |
ToolSnapshot | None |
Get baseline for a server |
compare(current) |
DriftReport |
Compare current vs baseline |
update_baseline(snapshot) |
None |
Update baseline |