Python SDK
Complete Python SDK reference.
Complete reference for the Risicare Python SDK.
Installation
pip install risicareExports
The risicare package exports 70 public symbols organized by category:
Core
| Export | Description |
|---|---|
init | Initialize the SDK and return a RisicareClient |
shutdown | Graceful shutdown with optional timeout |
disable | Disable tracing at runtime |
enable | Re-enable tracing at runtime |
is_enabled | Check if tracing is active |
RisicareClient | Main client class |
RisicareConfig | Configuration dataclass |
get_client | Get the current client instance |
__version__ | SDK version string |
Tracer
| Export | Description |
|---|---|
Tracer | Low-level tracer for creating spans |
get_tracer | Get the current tracer instance |
Decorators
| Export | Description |
|---|---|
agent | Mark a function as an agent |
session | Bind a function to a user session |
trace | Generic trace decorator with customizable kind |
trace_think | Mark a thinking phase |
trace_decide | Mark a decision phase |
trace_act | Mark an action phase |
trace_observe | Mark an observation phase |
trace_message | Mark inter-agent messaging |
trace_delegate | Mark task delegation |
trace_coordinate | Mark multi-agent coordination |
Context Managers
| Export | Description |
|---|---|
session_context | Sync context manager for sessions |
async_session_context | Async context manager for sessions |
agent_context | Sync context manager for agent identity |
async_agent_context | Async context manager for agent identity |
phase_context | Context manager for semantic phases |
restore_trace_context | Restore a saved trace context |
Context Accessors
| Export | Description |
|---|---|
get_current_session | Get active session context |
get_current_agent | Get active agent context |
get_current_span | Get active span |
get_current_phase | Get active semantic phase |
get_current_context | Get full context state |
get_trace_context | Get W3C trace context |
get_current_session_id | Get active session ID |
get_current_trace_id | Get active trace ID |
get_current_span_id | Get active span ID |
get_current_agent_id | Get active agent ID |
get_current_parent_span_id | Get parent span ID |
Span Registry
| Export | Description |
|---|---|
register_span | Register a span for ID-based lookup |
get_span_by_id | Retrieve a span by its ID |
unregister_span | Remove a span from the registry |
Streaming
| Export | Description |
|---|---|
traced_stream | Wrap an async stream with tracing |
traced_stream_sync | Wrap a sync stream with tracing |
W3C Trace Context
| Export | Description |
|---|---|
inject_trace_context | Inject trace context into headers |
extract_trace_context | Extract trace context from headers |
Types
| Export | Description |
|---|---|
Span | Span data class |
SpanKind | Span kind enum |
SpanStatus | Span status enum |
SessionContext | Session context dataclass |
AgentContext | Agent context dataclass |
TraceContext | Trace context for W3C propagation |
SemanticPhase | Phase enum (THINK, DECIDE, ACT, REFLECT, OBSERVE, COMMUNICATE, COORDINATE) |
AgentRole | Agent role enum |
MessageType | Message type enum |
Fix Runtime
| Export | Description |
|---|---|
FixRuntime | Main fix runtime class |
FixLoader | Loads fix configurations |
FixApplier | Applies fixes to spans |
FixCache | Caches fix configs locally |
FixRuntimeConfig | Fix runtime configuration |
FixInterceptor | Intercepts and applies fixes |
get_runtime | Get fix runtime instance |
init_runtime | Initialize fix runtime |
shutdown_runtime | Shutdown fix runtime |
Auto-Instrumentation
| Export | Description |
|---|---|
install_import_hooks | Install auto-instrumentation hooks |
remove_import_hooks | Remove auto-instrumentation hooks |
instrument_already_imported | Instrument already-loaded modules |
is_instrumented | Check if a module is instrumented |
get_instrumented_modules | List instrumented modules |
get_supported_modules | List all supported modules |
Exporters
| Export | Description |
|---|---|
OTLPExporter | OTLP/HTTP span exporter |
risicare.init
Initialize the SDK.
risicare.init(
api_key: str | None = None,
endpoint: str | None = None,
environment: str = "development",
service_name: str | None = None,
service_version: str | None = None,
enabled: bool = True,
trace_content: bool = True,
sample_rate: float = 1.0,
batch_size: int = 100,
batch_timeout_ms: int = 1000,
auto_patch: bool = True,
debug: bool = False,
exporters: list | None = None,
metadata: dict | None = None,
otlp_endpoint: str | None = None,
otlp_headers: dict | None = None,
otel_bridge: bool = False,
) -> RisicareClient| Parameter | Type | Default | Description |
|---|---|---|---|
api_key | str | env | API key (or RISICARE_API_KEY). Each key is scoped to one project. |
endpoint | str | "https://app.risicare.ai" | Gateway endpoint URL |
environment | str | "development" | Environment name (within-project org) |
service_name | str | None | Service name (within-project org) |
service_version | str | None | Service version for traces |
enabled | bool | True | Enable tracing |
trace_content | bool | True | Capture prompts/completions |
sample_rate | float | 1.0 | Trace sampling rate (0.0-1.0) |
batch_size | int | 100 | Spans per batch |
batch_timeout_ms | int | 1000 | Milliseconds between flushes |
auto_patch | bool | True | Auto-instrument supported libraries |
debug | bool | False | Enable debug logging |
exporters | list | None | Custom span exporters |
metadata | dict | None | Global metadata for all spans |
otlp_endpoint | str | None | OTLP exporter endpoint |
otlp_headers | dict | None | OTLP exporter headers |
otel_bridge | bool | False | Bridge spans to OpenTelemetry |
risicare.shutdown
Graceful shutdown — flushes pending spans and closes connections.
risicare.shutdown(timeout_ms: int = 5000) -> None@risicare.agent
Decorator for agent functions.
@risicare.agent(
name: str | None = None,
role: str | None = None,
agent_type: str | None = None,
version: int | None = None,
)
def my_agent():
...| Parameter | Type | Default | Description |
|---|---|---|---|
name | str | Function name | Human-readable agent name (optional) |
role | str | None | Agent role (orchestrator, worker, reviewer) |
agent_type | str | None | Type identifier for filtering |
version | int | None | Agent version number |
@risicare.session
Decorator for session-bound functions.
@risicare.session(
session_id_arg: str = "session_id",
user_id_arg: str | None = "user_id",
)
def handle_request(session_id: str, user_id: str, query: str):
...| Parameter | Type | Default | Description |
|---|---|---|---|
session_id_arg | str | "session_id" | Name of the function parameter containing the session ID |
user_id_arg | str | "user_id" | Name of the function parameter containing the user ID |
@risicare.trace_think
Decorator for thinking phase.
@risicare.trace_think
def analyze():
...@risicare.trace_decide
Decorator for decision phase.
@risicare.trace_decide
def plan():
...@risicare.trace_act
Decorator for action phase.
@risicare.trace_act
def execute():
...@risicare.trace_observe
Decorator for observation phase (state reading).
@risicare.trace_observe
def check_memory(key: str):
"""Read state from memory."""
return memory.get(key)@risicare.trace_message
Decorator for inter-agent message passing.
@risicare.trace_message(
name: str | None = None,
target: str | None = None,
target_name: str | None = None,
)
def send_to_reviewer(message: str):
"""Send a message to another agent."""
return response| Parameter | Type | Default | Description |
|---|---|---|---|
name | str | Function name | Span name |
target | str | None | Target agent ID |
target_name | str | None | Target agent name |
@risicare.trace_delegate
Decorator for task delegation.
@risicare.trace_delegate(
name: str | None = None,
target: str | None = None,
target_name: str | None = None,
)
def assign_research_task(task: str):
"""Delegate a research task to a worker agent."""
return researcher.execute(task)| Parameter | Type | Default | Description |
|---|---|---|---|
name | str | Function name | Span name |
target | str | None | Target agent ID |
target_name | str | None | Target agent name |
@risicare.trace_coordinate
Decorator for multi-agent coordination.
@risicare.trace_coordinate(
name: str | None = None,
)
def sync_agents(agent_ids: list):
"""Coordinate state between multiple agents."""
return sync_result@risicare.trace
Generic trace decorator with customizable kind.
from risicare import SpanKind
@risicare.trace(
name: str | None = None,
kind: SpanKind = SpanKind.INTERNAL,
attributes: dict | None = None,
)
def custom_operation():
...| Parameter | Type | Default | Description |
|---|---|---|---|
name | str | Function name | Span name |
kind | SpanKind | INTERNAL | Span kind |
attributes | dict | None | Static attributes to attach to the span |
risicare.session_context
Context manager for sessions.
with risicare.session_context(
session_id: str,
user_id: str | None = None,
metadata: dict | None = None,
parent_session_id: str | None = None,
turn_number: int = 1,
):
...risicare.agent_context
Context manager for agents.
with risicare.agent_context(
agent_id: str,
agent_name: str | None = None,
agent_role: str | None = None,
agent_type: str | None = None,
version: str | None = None,
metadata: dict | None = None,
):
...risicare.phase_context
Context manager for phases.
from risicare import SemanticPhase
with risicare.phase_context(phase: SemanticPhase):
# Example: phase_context(SemanticPhase.THINK)
...risicare.is_enabled
Check if tracing is enabled.
risicare.is_enabled() -> boolrisicare.get_current_trace_id
Get current trace ID.
trace_id = risicare.get_current_trace_id() -> str | Nonerisicare.get_current_span_id
Get current span ID.
span_id = risicare.get_current_span_id() -> str | Nonerisicare.get_current_session_id
Get current session ID.
session_id = risicare.get_current_session_id() -> str | Nonerisicare.get_current_agent_id
Get current agent ID.
agent_id = risicare.get_current_agent_id() -> str | Nonerisicare.get_current_parent_span_id
Get the parent span ID from the current context.
parent_span_id = risicare.get_current_parent_span_id() -> str | Nonerisicare.get_current_session
Get the active SessionContext, or None if no session is active.
session = risicare.get_current_session() -> SessionContext | NoneReturns the full SessionContext dataclass with session_id, user_id, metadata, parent_session_id, and turn_number.
risicare.get_current_agent
Get the active AgentContext, or None if no agent context is active.
agent = risicare.get_current_agent() -> AgentContext | NoneReturns the full AgentContext dataclass with agent_id, agent_name, agent_role, agent_type, version, and metadata.
risicare.get_current_span
Get the current active span, or None if no span is active.
span = risicare.get_current_span() -> Span | NoneAsync generators
In async generators, contextvars may lose the span reference after the first yield. Use the span registry (get_span_by_id) instead for async generator contexts.
risicare.get_current_phase
Get the active SemanticPhase, or None if no phase is active.
phase = risicare.get_current_phase() -> SemanticPhase | NoneReturns one of: SemanticPhase.THINK, DECIDE, ACT, REFLECT, OBSERVE, COMMUNICATE, COORDINATE.
risicare.get_current_context
Get the full trace context state.
ctx = risicare.get_current_context() -> TraceContextReturns a TraceContext object containing the current session, agent, span, phase, and trace/span IDs in a single call.
risicare.get_trace_context
Get W3C trace context for distributed tracing propagation.
trace_ctx = risicare.get_trace_context() -> TraceContextrisicare.get_tracer
Get the global Tracer instance. Use this for low-level span creation.
tracer = risicare.get_tracer() -> Tracertracer = risicare.get_tracer()
span = tracer.start_span("my-operation")
span.set_attribute("key", "value")
span.end()risicare.enable
Re-enable tracing after it was disabled.
risicare.enable() -> Nonerisicare.disable
Temporarily disable all tracing. Instrumented calls become no-ops with zero overhead.
risicare.disable() -> None# Disable tracing for a sensitive operation
risicare.disable()
result = do_sensitive_work()
risicare.enable()risicare.get_client
Get the current RisicareClient instance, or None if not initialized.
client = risicare.get_client() -> RisicareClient | NoneSpan Registry
The span registry provides ID-based span lookup, which is essential for contexts where contextvars may not propagate reliably (async generators, thread pools).
risicare.register_span
Register a span in the global registry for later retrieval by ID.
risicare.register_span(span: Span) -> NoneSpans created by decorators and context managers are registered automatically. Use this for manually created spans.
risicare.get_span_by_id
Retrieve a span by its ID from the global registry.
span = risicare.get_span_by_id(span_id: str) -> Span | None# Useful in async generators where contextvars may be lost
async def stream_results(span_id: str):
span = risicare.get_span_by_id(span_id)
async for chunk in source:
span.add_event("chunk", {"size": len(chunk)})
yield chunkrisicare.unregister_span
Remove a span from the global registry.
risicare.unregister_span(span_id: str) -> NoneSpans are unregistered automatically when they end. Use this only for manual cleanup.
Streaming
Utilities for tracing streaming responses from LLM providers.
risicare.traced_stream
Wrap an async iterator with tracing. Each chunk emits an event on the span, and the span is ended when the stream completes.
risicare.traced_stream(
span_id: str,
stream: AsyncIterator,
event_name: str = "chunk",
) -> AsyncIteratorspan = tracer.start_span("stream-response")
async for chunk in risicare.traced_stream(span.span_id, response.stream()):
print(chunk)risicare.traced_stream_sync
Synchronous version of traced_stream.
risicare.traced_stream_sync(
span_id: str,
stream: Iterator,
event_name: str = "chunk",
) -> Iteratorspan = tracer.start_span("stream-response")
for chunk in risicare.traced_stream_sync(span.span_id, response.stream()):
print(chunk)W3C Trace Context
Functions for propagating trace context across service boundaries using W3C traceparent and tracestate headers.
risicare.inject_trace_context
Inject W3C traceparent and tracestate headers into a headers dict.
risicare.inject_trace_context(headers: dict) -> dictheaders = {"Content-Type": "application/json"}
risicare.inject_trace_context(headers)
# headers now includes "traceparent" and "tracestate"
response = httpx.post(url, headers=headers)risicare.extract_trace_context
Extract trace context from incoming W3C headers.
ctx = risicare.extract_trace_context(headers: dict) -> TraceContext | None# In your HTTP handler
ctx = risicare.extract_trace_context(request.headers)
with risicare.restore_trace_context(ctx):
process_request()Auto-Instrumentation
Functions to control which modules are auto-instrumented.
risicare.install_import_hooks
Install Python import hooks for auto-instrumentation. Called automatically by risicare.init() when auto_patch=True.
risicare.install_import_hooks() -> Nonerisicare.remove_import_hooks
Remove auto-instrumentation import hooks. Modules already instrumented remain instrumented.
risicare.remove_import_hooks() -> Nonerisicare.instrument_already_imported
Instrument modules that were imported before risicare.init() was called. Called automatically by init().
risicare.instrument_already_imported() -> Nonerisicare.is_instrumented
Check if a specific module is currently instrumented.
risicare.is_instrumented(module_name: str) -> boolif risicare.is_instrumented("openai"):
print("OpenAI is being traced")risicare.get_instrumented_modules
Get the set of module names currently instrumented.
modules = risicare.get_instrumented_modules() -> set[str]risicare.get_supported_modules
Get the set of all module names supported for auto-instrumentation.
supported = risicare.get_supported_modules() -> set[str]
# e.g. {"openai", "anthropic", "cohere", "langchain", ...}Exporters
OTLPExporter
Export spans via OTLP/HTTP protocol. Use this when sending traces to an OpenTelemetry-compatible backend alongside Risicare.
from risicare import OTLPExporter
exporter = OTLPExporter(
endpoint="http://localhost:4318/v1/traces",
headers={"Authorization": "Bearer token"},
)
risicare.init(exporters=[exporter])Fix Runtime
The fix runtime loads, caches, and applies fixes at the SDK level. It runs inside your agent process and intercepts matching errors to apply the configured fix strategy.
FixRuntimeConfig
Configuration for the fix runtime.
from risicare import FixRuntimeConfig
config = FixRuntimeConfig(
enabled=True,
poll_interval_s=30,
cache_ttl_s=300,
)risicare.init_runtime
Initialize the fix runtime with a configuration.
risicare.init_runtime(config: FixRuntimeConfig) -> FixRuntimerisicare.get_runtime
Get the current fix runtime instance.
runtime = risicare.get_runtime() -> FixRuntime | Nonerisicare.shutdown_runtime
Shutdown the fix runtime gracefully.
risicare.shutdown_runtime() -> NoneFixRuntime
Main fix runtime class. Coordinates FixLoader, FixCache, FixApplier, and FixInterceptor.
FixLoader
Loads fix configurations from the Risicare API.
FixCache
Caches fix configurations locally with configurable TTL to minimize API calls.
FixApplier
Applies a fix configuration to an error span (e.g., retry, fallback, parameter change).
FixInterceptor
Intercepts errors matching a fix rule and applies the configured fix before the error propagates.
Async Context Managers
risicare.async_session_context
Async version of session_context for use in async code.
async with risicare.async_session_context(
session_id: str,
user_id: str | None = None,
metadata: dict | None = None,
parent_session_id: str | None = None,
turn_number: int = 1,
):
await handle_request()risicare.async_agent_context
Async version of agent_context for use in async code.
async with risicare.async_agent_context(
agent_id: str,
agent_name: str | None = None,
agent_role: str | None = None,
agent_type: str | None = None,
version: str | None = None,
metadata: dict | None = None,
):
await run_agent()risicare.restore_trace_context
Restore a previously saved or extracted TraceContext. Use this to re-establish context in a new scope, such as after extracting from W3C headers or restoring in a background task.
with risicare.restore_trace_context(ctx: TraceContext):
process_request()Types
Span
Core span data class representing a single unit of work.
from risicare import Span
span.trace_id # str — 32 hex characters
span.span_id # str — 16 hex characters
span.parent_span_id # str | None
span.name # str
span.kind # SpanKind
span.status # SpanStatus
span.start_time # float (epoch seconds)
span.end_time # float | None
span.attributes # dict
span.events # listSpanKind
from risicare import SpanKind
# Standard (OpenTelemetry compatible)
SpanKind.INTERNAL # Default, internal operation
SpanKind.SERVER # Server-side of RPC
SpanKind.CLIENT # Client-side of RPC
SpanKind.PRODUCER # Message producer
SpanKind.CONSUMER # Message consumer
# Agent-specific
SpanKind.AGENT # Agent lifecycle span
SpanKind.LLM_CALL # LLM API call
SpanKind.TOOL_CALL # Tool/function execution
SpanKind.RETRIEVAL # RAG retrieval operation
SpanKind.DECISION # Agent decision point
SpanKind.DELEGATION # Delegation to another agent
SpanKind.COORDINATION # Multi-agent coordination
SpanKind.MESSAGE # Inter-agent message
# Phase-specific
SpanKind.THINK # Reasoning/planning phase
SpanKind.DECIDE # Decision-making phase
SpanKind.OBSERVE # Environment observation phase
SpanKind.REFLECT # Self-evaluation phaseSpanStatus
from risicare import SpanStatus
SpanStatus.OK # Successful
SpanStatus.ERROR # Error occurred
SpanStatus.UNSET # Status not setSemanticPhase
from risicare import SemanticPhase
SemanticPhase.THINK # Reasoning / analysis
SemanticPhase.DECIDE # Decision making
SemanticPhase.ACT # Action execution
SemanticPhase.REFLECT # Self-evaluation
SemanticPhase.OBSERVE # State reading
SemanticPhase.COMMUNICATE # Inter-agent messaging
SemanticPhase.COORDINATE # Multi-agent coordinationAgentRole
from risicare import AgentRole
# Primary roles
AgentRole.ORCHESTRATOR # Coordinates other agents
AgentRole.WORKER # Executes assigned tasks
AgentRole.SUPERVISOR # Monitors and validates
AgentRole.SPECIALIST # Domain expert
# Communication roles
AgentRole.ROUTER # Routes messages/tasks
AgentRole.AGGREGATOR # Aggregates results
AgentRole.BROADCASTER # Broadcasts to multiple agents
# Specialized roles
AgentRole.CRITIC # Reviews and critiques
AgentRole.PLANNER # Creates execution plans
AgentRole.EXECUTOR # Executes plans
AgentRole.RETRIEVER # Retrieves information
AgentRole.VALIDATOR # Validates outputsMessageType
from risicare import MessageType
# Control messages
MessageType.TASK # Task assignment
MessageType.RESULT # Task result
MessageType.STATUS # Status update
MessageType.ERROR # Error notification
# Communication messages
MessageType.QUERY # Information request
MessageType.RESPONSE # Information response
MessageType.BROADCAST # Broadcast to all
MessageType.DIRECT # Direct message
# Coordination messages
MessageType.PROPOSAL # Propose action
MessageType.VOTE # Vote on proposal
MessageType.CONSENSUS # Consensus reached
MessageType.CONFLICT # Conflict detected
# Lifecycle messages
MessageType.HEARTBEAT # Agent alive signal
MessageType.SHUTDOWN # Shutdown signal
MessageType.HANDOFF # Handoff to another agentSessionContext
from risicare import SessionContext
session.session_id # str
session.user_id # str | None
session.metadata # dict | None
session.parent_session_id # str | None
session.turn_number # intAgentContext
from risicare import AgentContext
agent.agent_id # str
agent.agent_name # str | None
agent.agent_role # str | None
agent.agent_type # str | None
agent.version # str | None
agent.metadata # dict | NoneTraceContext
from risicare import TraceContext
ctx.trace_id # str
ctx.span_id # str
ctx.trace_flags # int
ctx.trace_state # str | None