Skip to content
Reference

m3.observability ​

Signatures use ... for factory-backed or opaque defaults. Model field tables show required status, defaults, constraints, and descriptions.

ACPTrace ​

python
m3.observability.ACPTrace(
    *,
    kind: Literal['acp'] = 'acp',
    session_id: m3.observability.Observation[str] = ...,
    protocol_version: m3.observability.Observation[str] = ...,
    agent_identity: m3.observability.Observation[JsonValue] = ...,
    available_modes: m3.observability.Observation[JsonValue] = ...,
    current_mode: m3.observability.Observation[str] = ...,
    config_options: m3.observability.Observation[JsonValue] = ...,
    selected_config: m3.observability.Observation[JsonValue] = ...,
    plan_state_available: m3.observability.Observation[bool] = ...,
    usage: m3.observability.Observation[m3.observability.UsageValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
kindLiteral['acp']No'acp'——
session_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
protocol_versionm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
agent_identitym3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
available_modesm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
current_modem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
config_optionsm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
selected_configm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
plan_state_availablem3.observability.Observation[bool]Nofactory m3.observability._not_emitted()——
usagem3.observability.Observation[m3.observability.UsageValue]Nofactory m3.observability.ACPTrace.<lambda>()——

ArtifactEntry ​

python
m3.observability.ArtifactEntry(
    *,
    entry_id: str,
    kind: Literal['artifact'] = 'artifact',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    artifact: m3.types.ArtifactRef,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['artifact']No'artifact'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
artifactm3.types.ArtifactRefYes———

CaptureOptions ​

python
m3.observability.CaptureOptions(
    *,
    capture_raw_evidence: bool = True,
    capture_provider_messages: bool = True,
    capture_stderr: bool = True,
    raw_preview_bytes: int = 65536,
    raw_frame_bytes: int = 1048576,
    raw_execution_bytes: int = 67108864,
) -> None

Boundaries for redacted provider/MCP evidence capture.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
capture_raw_evidenceboolNoTrue——
capture_provider_messagesboolNoTrue——
capture_stderrboolNoTrue——
raw_preview_bytesintNo65536gt=0—
raw_frame_bytesintNo1048576gt=0—
raw_execution_bytesintNo67108864gt=0—

ClaudeCodeTrace ​

python
m3.observability.ClaudeCodeTrace(
    *,
    kind: Literal['claude_code'] = 'claude_code',
    session_id: m3.observability.Observation[str] = ...,
    model_id: m3.observability.Observation[str] = ...,
    result_subtype: m3.observability.Observation[str] = ...,
    stop_reason: m3.observability.Observation[str] = ...,
    service_tier: m3.observability.Observation[str] = ...,
    api_duration_ms: m3.observability.Observation[float] = ...,
    encrypted_reasoning: m3.observability.Observation[bool] = ...,
    usage: m3.observability.Observation[m3.observability.UsageValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
kindLiteral['claude_code']No'claude_code'——
session_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
model_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
result_subtypem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
stop_reasonm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
service_tierm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
api_duration_msm3.observability.Observation[float]Nofactory m3.observability._not_emitted()——
encrypted_reasoningm3.observability.Observation[bool]Nofactory m3.observability._not_emitted()——
usagem3.observability.Observation[m3.observability.UsageValue]Nofactory m3.observability._not_emitted()——

CodexTrace ​

python
m3.observability.CodexTrace(
    *,
    kind: Literal['codex'] = 'codex',
    thread_id: m3.observability.Observation[str] = ...,
    turn_id: m3.observability.Observation[str] = ...,
    model_id: m3.observability.Observation[str] = ...,
    finish_reason: m3.observability.Observation[str] = ...,
    sandbox: m3.observability.Observation[str] = ...,
    usage: m3.observability.Observation[m3.observability.UsageValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
kindLiteral['codex']No'codex'——
thread_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
turn_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
model_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
finish_reasonm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
sandboxm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
usagem3.observability.Observation[m3.observability.UsageValue]Nofactory m3.observability._not_emitted()——

CorrelationState ​

python
m3.observability.CorrelationState(
    *values,
)
  • CORRELATED = 'correlated'
  • REPORTED_ONLY = 'reported_only'
  • WIRE_ONLY = 'wire_only'
  • AMBIGUOUS = 'ambiguous'
  • UNAVAILABLE = 'unavailable'

DiagnosticEntry ​

python
m3.observability.DiagnosticEntry(
    *,
    entry_id: str,
    kind: Literal['diagnostic'] = 'diagnostic',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    code: str,
    message: str,
    stage: str | None = None,
    operation: str | None = None,
    elapsed_seconds: float | None = None,
    timeout_seconds: float | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['diagnostic']No'diagnostic'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
codestrYes—min_length=1, max_length=128—
messagestrYes—min_length=1, max_length=4096—
stagestr | NoneNoNonemax_length=128—
operationstr | NoneNoNonemax_length=256—
elapsed_secondsfloat | NoneNoNonege=0—
timeout_secondsfloat | NoneNoNonegt=0—

DirectTrace ​

python
m3.observability.DirectTrace(
    *,
    kind: Literal['direct'] = 'direct',
    transport: m3.observability.Observation[m3.types.TransportKind] = ...,
    protocol: m3.observability.Observation[str] = ...,
    initialization: m3.observability.Observation[m3.observability.InitializationValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
kindLiteral['direct']No'direct'——
transportm3.observability.Observation[m3.types.TransportKind]Nofactory m3.observability._not_emitted()——
protocolm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
initializationm3.observability.Observation[m3.observability.InitializationValue]Nofactory m3.observability._not_emitted()——

ElicitationEntry ​

python
m3.observability.ElicitationEntry(
    *,
    entry_id: str,
    kind: Literal['elicitation'] = 'elicitation',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    server: str | None = None,
    operation_kind: Literal['tool', 'prompt', 'resource'],
    operation_name: str,
    logical_operation_id: str,
    round_index: int,
    request_key: str,
    mode: Literal['form', 'url'],
    message: m3.observability.Observation[str] = ...,
    requested_schema: m3.observability.Observation[JsonValue] = ...,
    url: m3.observability.Observation[str] = ...,
    elicitation_id: m3.observability.Observation[str] = ...,
    request_state: m3.observability.Observation[str] = ...,
    input_responses: m3.observability.Observation[JsonValue] = ...,
    action: Literal['accept', 'decline', 'cancel'] | None = None,
    content: m3.observability.Observation[JsonValue] = ...,
) -> None

One keyed elicitation embedded in an MRTR input-required round.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['elicitation']No'elicitation'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
serverstr | NoneNoNonemin_length=1, max_length=256—
operation_kindLiteral['tool', 'prompt', 'resource']Yes———
operation_namestrYes—min_length=1, max_length=256—
logical_operation_idstrYes—min_length=1, max_length=256—
round_indexintYes—ge=1—
request_keystrYes—min_length=1, max_length=256—
modeLiteral['form', 'url']Yes———
messagem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
requested_schemam3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
urlm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
elicitation_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
request_statem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
input_responsesm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
actionLiteral['accept', 'decline', 'cancel'] | NoneNoNone——
contentm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——

EvaluationEntry ​

python
m3.observability.EvaluationEntry(
    *,
    entry_id: str,
    kind: Literal['evaluation'] = 'evaluation',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    evaluation: m3.types.EvaluationResult,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['evaluation']No'evaluation'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
evaluationm3.types.EvaluationResultYes———

EvidenceCapture ​

python
m3.observability.EvidenceCapture(
    *,
    reference: m3.types.EvidenceRef,
    preview: m3.observability.Observation[str],
    original_size_bytes: int,
    stored_size_bytes: int,
    redacted: bool,
    truncated: bool,
) -> None

Typed result of bounded, redacted raw-evidence capture.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
referencem3.types.EvidenceRefYes———
previewm3.observability.Observation[str]Yes———
original_size_bytesintYes—ge=0—
stored_size_bytesintYes—ge=0—
redactedboolYes———
truncatedboolYes———

EvidenceConflict ​

python
m3.observability.EvidenceConflict(
    *,
    field: Literal['server', 'tool', 'arguments', 'result', 'status'],
    reported: m3.observability.Observation[JsonValue],
    wire: m3.observability.Observation[JsonValue],
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
fieldLiteral['server', 'tool', 'arguments', 'result', 'status']Yes———
reportedm3.observability.Observation[JsonValue]Yes———
wirem3.observability.Observation[JsonValue]Yes———

HttpExchange ​

python
m3.observability.HttpExchange(
    *,
    method: str,
    status_code: int,
    headers: tuple[m3.observability.SafeHttpHeader, ...] = (),
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
methodstrYes—min_length=1—
status_codeintYes—ge=100, le=599—
headerstuple[m3.observability.SafeHttpHeader, ...]No()——

InitializationEntry ​

python
m3.observability.InitializationEntry(
    *,
    entry_id: str,
    kind: Literal['initialization'] = 'initialization',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    protocol_version: m3.observability.Observation[str] = ...,
    server_name: m3.observability.Observation[str] = ...,
    server_version: m3.observability.Observation[str] = ...,
    instructions: m3.observability.Observation[str] = ...,
    capabilities: m3.observability.Observation[JsonValue] = ...,
    tools: m3.observability.Observation[tuple[m3.types.ToolInfo, ...]] = ...,
    resources: m3.observability.Observation[tuple[m3.types.ResourceInfo, ...]] = ...,
    resource_templates: m3.observability.Observation[tuple[m3.types.TemplateInfo, ...]] = ...,
    prompts: m3.observability.Observation[tuple[m3.types.PromptInfo, ...]] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['initialization']No'initialization'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
protocol_versionm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
server_namem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
server_versionm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
instructionsm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
capabilitiesm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
toolsm3.observability.Observation[tuple[m3.types.ToolInfo, ...]]Nofactory m3.observability._not_emitted()——
resourcesm3.observability.Observation[tuple[m3.types.ResourceInfo, ...]]Nofactory m3.observability._not_emitted()——
resource_templatesm3.observability.Observation[tuple[m3.types.TemplateInfo, ...]]Nofactory m3.observability._not_emitted()——
promptsm3.observability.Observation[tuple[m3.types.PromptInfo, ...]]Nofactory m3.observability._not_emitted()——

InitializationValue ​

python
m3.observability.InitializationValue(
    *,
    protocol_version: m3.observability.Observation[str] = ...,
    server_name: m3.observability.Observation[str] = ...,
    server_version: m3.observability.Observation[str] = ...,
    instructions: m3.observability.Observation[str] = ...,
    capabilities: m3.observability.Observation[JsonValue] = ...,
    tools: m3.observability.Observation[tuple[m3.types.ToolInfo, ...]] = ...,
    resources: m3.observability.Observation[tuple[m3.types.ResourceInfo, ...]] = ...,
    resource_templates: m3.observability.Observation[tuple[m3.types.TemplateInfo, ...]] = ...,
    prompts: m3.observability.Observation[tuple[m3.types.PromptInfo, ...]] = ...,
) -> None

Value-only initialization metadata used by runtime information.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
protocol_versionm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
server_namem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
server_versionm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
instructionsm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
capabilitiesm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
toolsm3.observability.Observation[tuple[m3.types.ToolInfo, ...]]Nofactory m3.observability._not_emitted()——
resourcesm3.observability.Observation[tuple[m3.types.ResourceInfo, ...]]Nofactory m3.observability._not_emitted()——
resource_templatesm3.observability.Observation[tuple[m3.types.TemplateInfo, ...]]Nofactory m3.observability._not_emitted()——
promptsm3.observability.Observation[tuple[m3.types.PromptInfo, ...]]Nofactory m3.observability._not_emitted()——

InteractionEntry ​

python
m3.observability.InteractionEntry(
    *,
    entry_id: str,
    kind: Literal['interaction'] = 'interaction',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    interaction_kind: str,
    request: m3.observability.Observation[JsonValue] = ...,
    response: m3.observability.Observation[JsonValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['interaction']No'interaction'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
interaction_kindstrYes—min_length=1, max_length=128—
requestm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
responsem3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——

LifecycleEntry ​

python
m3.observability.LifecycleEntry(
    *,
    entry_id: str,
    kind: Literal['lifecycle'] = 'lifecycle',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    phase: str,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['lifecycle']No'lifecycle'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
phasestrYes—min_length=1, max_length=128—

MessageEntry ​

python
m3.observability.MessageEntry(
    *,
    entry_id: str,
    kind: Literal['message'] = 'message',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    message_id: m3.observability.Observation[str] = ...,
    role: m3.observability.MessageRole = MessageRole.ASSISTANT,
    content: tuple[m3.types.TextContent | m3.types.FileContent | m3.types.ImageContent | m3.types.AudioContent | m3.types.ResourceLink | m3.types.OpaqueContent, ...] = (),
    stop_reason: m3.observability.Observation[str] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['message']No'message'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
message_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
rolem3.observability.MessageRoleNoMessageRole.ASSISTANT ('assistant')——
contenttuple[m3.types.TextContent | m3.types.FileContent | m3.types.ImageContent | m3.types.AudioContent | m3.types.ResourceLink | m3.types.OpaqueContent, ...]No()type argument 1: discriminator='kind'—
stop_reasonm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——

MessageRole ​

python
m3.observability.MessageRole(
    *values,
)
  • USER = 'user'
  • ASSISTANT = 'assistant'
  • SYSTEM = 'system'
  • TOOL = 'tool'

Observation ​

python
m3.observability.Observation(
    *,
    state: m3.observability.ObservationState,
    value: _T | None = None,
    reason: m3.observability.ObservationReason | None = None,
    provenance: tuple[m3.types.EventSource, ...] = (),
    evidence_ref: m3.types.EvidenceRef | None = None,
) -> None

A typed value with explicit availability and provenance.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
statem3.observability.ObservationStateYes———
value_T | NoneNoNone——
reasonm3.observability.ObservationReason | NoneNoNone——
provenancetuple[m3.types.EventSource, ...]No()——
evidence_refm3.types.EvidenceRef | NoneNoNone——

ObservationReason ​

python
m3.observability.ObservationReason(
    *values,
)
  • PROVIDER_DID_NOT_EMIT = 'provider_did_not_emit'
  • PROVIDER_HIDDEN = 'provider_hidden'
  • PROVIDER_ENCRYPTED = 'provider_encrypted'
  • HARNESS_UNSUPPORTED = 'harness_unsupported'
  • TRANSPORT_NOT_APPLICABLE = 'transport_not_applicable'
  • CAPTURE_DISABLED = 'capture_disabled'
  • CAPTURE_FAILED = 'capture_failed'
  • EVIDENCE_TRUNCATED = 'evidence_truncated'
  • REDACTED_BY_POLICY = 'redacted_by_policy'
  • CORRELATION_UNAVAILABLE = 'correlation_unavailable'
  • MALFORMED_SOURCE = 'malformed_source'

ObservationState ​

python
m3.observability.ObservationState(
    *values,
)

How completely a provider-dependent value was observed.

  • OBSERVED = 'observed'
  • NOT_EMITTED = 'not_emitted'
  • UNSUPPORTED = 'unsupported'
  • UNAVAILABLE = 'unavailable'
  • PROVIDER_HIDDEN = 'provider_hidden'
  • ENCRYPTED = 'encrypted'
  • REDACTED = 'redacted'
  • TRUNCATED = 'truncated'

OpenCodeTrace ​

python
m3.observability.OpenCodeTrace(
    *,
    kind: Literal['opencode'] = 'opencode',
    session_id: m3.observability.Observation[str] = ...,
    provider_id: m3.observability.Observation[str] = ...,
    model_id: m3.observability.Observation[str] = ...,
    finish_reason: m3.observability.Observation[str] = ...,
    http_lifecycle: m3.observability.Observation[JsonValue] = ...,
    usage: m3.observability.Observation[m3.observability.UsageValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
kindLiteral['opencode']No'opencode'——
session_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
provider_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
model_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
finish_reasonm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
http_lifecyclem3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
usagem3.observability.Observation[m3.observability.UsageValue]Nofactory m3.observability._not_emitted()——

PiTrace ​

python
m3.observability.PiTrace(
    *,
    kind: Literal['pi'] = 'pi',
    session_id: m3.observability.Observation[str] = ...,
    provider_id: m3.observability.Observation[str] = ...,
    model_id: m3.observability.Observation[str] = ...,
    finish_reason: m3.observability.Observation[str] = ...,
    usage: m3.observability.Observation[m3.observability.UsageValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
kindLiteral['pi']No'pi'——
session_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
provider_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
model_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
finish_reasonm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
usagem3.observability.Observation[m3.observability.UsageValue]Nofactory m3.observability._not_emitted()——

ProcessEntry ​

python
m3.observability.ProcessEntry(
    *,
    entry_id: str,
    kind: Literal['process'] = 'process',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    executable: m3.observability.Observation[str] = ...,
    pid: m3.observability.Observation[int] = ...,
    exit_code: m3.observability.Observation[int] = ...,
    signal: m3.observability.Observation[int] = ...,
    stderr: m3.observability.Observation[str] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['process']No'process'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
executablem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
pidm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
exit_codem3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
signalm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
stderrm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——

ProtocolCallAttempt ​

python
m3.observability.ProtocolCallAttempt(
    *,
    attempt_index: int,
    jsonrpc_id: m3.observability.Observation[int | str] = ...,
    request_state: m3.observability.Observation[str] = ...,
    continuation_state: m3.observability.Observation[str] = ...,
    input_responses: m3.observability.Observation[JsonValue] = ...,
    operation_params: m3.observability.Observation[JsonValue] = ...,
    input_required: bool = False,
    result: m3.observability.Observation[JsonValue] = ...,
    raw_result: m3.observability.Observation[JsonValue] = ...,
    status: m3.observability.TraceStatus = TraceStatus.INCOMPLETE,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
) -> None

One wire-level attempt belonging to a prompt or resource call.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
attempt_indexintYes—ge=0—
jsonrpc_idm3.observability.Observation[int | str]Nofactory m3.observability._not_emitted()variant 1: strict=True, variant 2: strict=True—
request_statem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
continuation_statem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
input_responsesm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
operation_paramsm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
input_requiredboolNoFalse——
resultm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
raw_resultm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
statusm3.observability.TraceStatusNoTraceStatus.INCOMPLETE ('incomplete')——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——

ProtocolEntry ​

python
m3.observability.ProtocolEntry(
    *,
    entry_id: str,
    kind: Literal['protocol'] = 'protocol',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    protocol: m3.observability.ProtocolKind,
    method: m3.observability.Observation[str] = ...,
    direction: m3.types.EventDirection = EventDirection.INTERNAL,
    jsonrpc_id: m3.observability.Observation[int | str] = ...,
    request: m3.observability.Observation[JsonValue] = ...,
    response: m3.observability.Observation[JsonValue] = ...,
    error: m3.observability.Observation[m3.observability.ProtocolErrorInfo] = ...,
    http: m3.observability.Observation[m3.observability.HttpExchange] = ...,
    operation_kind: Literal['prompt', 'resource'] | None = None,
    operation_name: m3.observability.Observation[str] = ...,
    attempts: tuple[m3.observability.ProtocolCallAttempt, ...] = (),
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['protocol']No'protocol'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
protocolm3.observability.ProtocolKindYes———
methodm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
directionm3.types.EventDirectionNoEventDirection.INTERNAL ('internal')——
jsonrpc_idm3.observability.Observation[int | str]Nofactory m3.observability._not_emitted()variant 1: strict=True, variant 2: strict=True—
requestm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
responsem3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
errorm3.observability.Observation[m3.observability.ProtocolErrorInfo]Nofactory m3.observability._not_emitted()——
httpm3.observability.Observation[m3.observability.HttpExchange]Nofactory m3.observability._not_emitted()——
operation_kindLiteral['prompt', 'resource'] | NoneNoNone——
operation_namem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
attemptstuple[m3.observability.ProtocolCallAttempt, ...]No()——

ProtocolErrorInfo ​

python
m3.observability.ProtocolErrorInfo(
    *,
    code: int | str | None = None,
    message: str,
    data: m3.observability.Observation[JsonValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
codeint | str | NoneNoNone——
messagestrYes—min_length=1, max_length=4096—
datam3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——

ProtocolKind ​

python
m3.observability.ProtocolKind(
    *values,
)
  • MCP = 'mcp'
  • ACP = 'acp'
  • PROVIDER_HTTP = 'provider_http'
  • PROVIDER_STREAM = 'provider_stream'

ProviderEntry ​

python
m3.observability.ProviderEntry(
    *,
    entry_id: str,
    kind: Literal['provider'] = 'provider',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    provider: str,
    category: str,
    data: m3.observability.Observation[JsonValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['provider']No'provider'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
providerstrYes—min_length=1, max_length=128—
categorystrYes—min_length=1, max_length=128—
datam3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——

RawEvidence ​

python
m3.observability.RawEvidence(
    *,
    reference: m3.types.EvidenceRef,
    media_type: str,
    content: JsonValue | str,
    size_bytes: int,
    returned_size_bytes: int,
    truncated: bool = False,
    redacted: Literal[True] = True,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
referencem3.types.EvidenceRefYes———
media_typestrYes—min_length=1, max_length=256—
contentJsonValue | strYes———
size_bytesintYes—ge=0—
returned_size_bytesintYes—ge=0—
truncatedboolNoFalse——
redactedLiteral[True]NoTrue——

RawEvidenceSource ​

python
m3.observability.RawEvidenceSource(
    *values,
)
  • MCP = 'mcp'
  • ACP = 'acp'
  • OPENCODE = 'opencode'
  • CLAUDE_CODE = 'claude_code'
  • PROCESS_STDERR = 'process_stderr'

RawMessageEntry ​

python
m3.observability.RawMessageEntry(
    *,
    entry_id: str,
    kind: Literal['raw_message'] = 'raw_message',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    source: m3.observability.RawEvidenceSource,
    direction: m3.types.EventDirection = EventDirection.INTERNAL,
    media_type: str,
    preview: m3.observability.Observation[JsonValue | str] = ...,
    evidence_ref: m3.types.EvidenceRef | None = None,
    size_bytes: int = 0,
    redacted: Literal[True] = True,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['raw_message']No'raw_message'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
sourcem3.observability.RawEvidenceSourceYes———
directionm3.types.EventDirectionNoEventDirection.INTERNAL ('internal')——
media_typestrYes—min_length=1, max_length=256—
previewm3.observability.Observation[JsonValue | str]Nofactory m3.observability._not_emitted()——
evidence_refm3.types.EvidenceRef | NoneNoNone——
size_bytesintNo0ge=0—
redactedLiteral[True]NoTrue——

ReasoningEntry ​

python
m3.observability.ReasoningEntry(
    *,
    entry_id: str,
    kind: Literal['reasoning'] = 'reasoning',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    block_id: m3.observability.Observation[str] = ...,
    content: m3.observability.Observation[tuple[m3.types.TextContent | m3.types.FileContent | m3.types.ImageContent | m3.types.AudioContent | m3.types.ResourceLink | m3.types.OpaqueContent, ...]] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['reasoning']No'reasoning'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
block_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
contentm3.observability.Observation[tuple[m3.types.TextContent | m3.types.FileContent | m3.types.ImageContent | m3.types.AudioContent | m3.types.ResourceLink | m3.types.OpaqueContent, ...]]Nofactory m3.observability._not_emitted()type argument 1: discriminator='kind'—

ReportedToolCall ​

python
m3.observability.ReportedToolCall(
    *,
    provider_call_id: m3.observability.Observation[str] = ...,
    server: m3.observability.Observation[str] = ...,
    tool: m3.observability.Observation[str] = ...,
    arguments: m3.observability.Observation[JsonValue] = ...,
    result: m3.observability.Observation[JsonValue] = ...,
    status: m3.observability.Observation[str] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
provider_call_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
serverm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
toolm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
argumentsm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
resultm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
statusm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——

RuntimeTraceInfo ​

python
m3.observability.RuntimeTraceInfo(
    *args,
    **kwargs,
)

SafeHttpHeader ​

python
m3.observability.SafeHttpHeader(
    *,
    name: Literal['content-type', 'content-length', 'retry-after', 'request-id', 'x-request-id'],
    value: str,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
nameLiteral['content-type', 'content-length', 'retry-after', 'request-id', 'x-request-id']Yes———
valuestrYes———

ToolCallAttempt ​

python
m3.observability.ToolCallAttempt(
    *,
    attempt_index: int,
    jsonrpc_id: m3.observability.Observation[int | str] = ...,
    request_state: m3.observability.Observation[str] = ...,
    continuation_state: m3.observability.Observation[str] = ...,
    input_responses: m3.observability.Observation[JsonValue] = ...,
    operation_params: m3.observability.Observation[JsonValue] = ...,
    input_required: bool = False,
    result: m3.observability.Observation[m3.observability.ToolResult] = ...,
    raw_result: m3.observability.Observation[JsonValue] = ...,
    status: m3.observability.ToolCallStatus = ToolCallStatus.INCOMPLETE,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
) -> None

One wire-level attempt belonging to a logical tool call.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
attempt_indexintYes—ge=0—
jsonrpc_idm3.observability.Observation[int | str]Nofactory m3.observability._not_emitted()variant 1: strict=True, variant 2: strict=True—
request_statem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
continuation_statem3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
input_responsesm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
operation_paramsm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
input_requiredboolNoFalse——
resultm3.observability.Observation[m3.observability.ToolResult]Nofactory m3.observability._not_emitted()——
raw_resultm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
statusm3.observability.ToolCallStatusNoToolCallStatus.INCOMPLETE ('incomplete')——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——

ToolCallEntry ​

python
m3.observability.ToolCallEntry(
    *,
    entry_id: str,
    kind: Literal['tool_call'] = 'tool_call',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    call_id: str,
    provider_call_id: m3.observability.Observation[str] = ...,
    server: m3.observability.Observation[str] = ...,
    tool: m3.observability.Observation[str] = ...,
    arguments: m3.observability.Observation[JsonValue] = ...,
    result: m3.observability.Observation[m3.observability.ToolResult] = ...,
    tool_status: m3.observability.ToolCallStatus = ToolCallStatus.INCOMPLETE,
    correlation: m3.observability.CorrelationState = CorrelationState.UNAVAILABLE,
    jsonrpc_id: m3.observability.Observation[int | str] = ...,
    server_latency_ms: m3.observability.Observation[float] = ...,
    policy: m3.observability.Observation[m3.policy.ToolPolicyDecision] = ...,
    reported: m3.observability.Observation[m3.observability.ReportedToolCall] = ...,
    wire: m3.observability.Observation[m3.observability.WireToolCall] = ...,
    conflicts: tuple[m3.observability.EvidenceConflict, ...] = (),
    attempts: tuple[m3.observability.ToolCallAttempt, ...] = (),
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['tool_call']No'tool_call'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
call_idstrYes—min_length=1, max_length=256—
provider_call_idm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
serverm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
toolm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
argumentsm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
resultm3.observability.Observation[m3.observability.ToolResult]Nofactory m3.observability._not_emitted()——
tool_statusm3.observability.ToolCallStatusNoToolCallStatus.INCOMPLETE ('incomplete')——
correlationm3.observability.CorrelationStateNoCorrelationState.UNAVAILABLE ('unavailable')——
jsonrpc_idm3.observability.Observation[int | str]Nofactory m3.observability._not_emitted()variant 1: strict=True, variant 2: strict=True—
server_latency_msm3.observability.Observation[float]Nofactory m3.observability._not_emitted()——
policym3.observability.Observation[m3.policy.ToolPolicyDecision]Nofactory m3.observability._not_emitted()——
reportedm3.observability.Observation[m3.observability.ReportedToolCall]Nofactory m3.observability._not_emitted()——
wirem3.observability.Observation[m3.observability.WireToolCall]Nofactory m3.observability._not_emitted()——
conflictstuple[m3.observability.EvidenceConflict, ...]No()——
attemptstuple[m3.observability.ToolCallAttempt, ...]No()——

ToolCallStatus ​

python
m3.observability.ToolCallStatus(
    *values,
)
  • SUCCESS = 'success'
  • TOOL_ERROR = 'tool_error'
  • PROTOCOL_ERROR = 'protocol_error'
  • TRANSPORT_ERROR = 'transport_error'
  • CANCELLED = 'cancelled'
  • TIMED_OUT = 'timed_out'
  • INCOMPLETE = 'incomplete'

ToolResult ​

python
m3.observability.ToolResult(
    *,
    content: tuple[m3.types.TextContent | m3.types.FileContent | m3.types.ImageContent | m3.types.AudioContent | m3.types.ResourceLink | m3.types.OpaqueContent, ...] = (),
    structured_content: m3.observability.Observation[JsonValue] = ...,
    is_error: bool = False,
    error: m3.observability.Observation[m3.types.ErrorInfo] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
contenttuple[m3.types.TextContent | m3.types.FileContent | m3.types.ImageContent | m3.types.AudioContent | m3.types.ResourceLink | m3.types.OpaqueContent, ...]No()type argument 1: discriminator='kind'—
structured_contentm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
is_errorboolNoFalse——
errorm3.observability.Observation[m3.types.ErrorInfo]Nofactory m3.observability._not_emitted()——

TraceEntry ​

python
m3.observability.TraceEntry(
    *args,
    **kwargs,
)

TraceEntryBase ​

python
m3.observability.TraceEntryBase(
    *,
    entry_id: str,
    kind: str,
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindstrYes—min_length=1, max_length=64—
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——

TraceStatus ​

python
m3.observability.TraceStatus(
    *values,
)
  • COMPLETED = 'completed'
  • FAILED = 'failed'
  • TOOL_ERROR = 'tool_error'
  • PROTOCOL_ERROR = 'protocol_error'
  • TRANSPORT_ERROR = 'transport_error'
  • TIMED_OUT = 'timed_out'
  • CANCELLED = 'cancelled'
  • INTERRUPTED = 'interrupted'
  • INCOMPLETE = 'incomplete'
  • UNAVAILABLE = 'unavailable'

TraceSummary ​

python
m3.observability.TraceSummary(
    *,
    timing: m3.observability.TraceTiming = ...,
    usage: m3.observability.Observation[m3.observability.UsageValue] = ...,
    turn_count: int = 0,
    message_count: int = 0,
    reasoning_count: int = 0,
    tool_call_count: int = 0,
    successful_tool_call_count: int = 0,
    failed_tool_call_count: int = 0,
    protocol_error_count: int = 0,
    activity_health: m3.types.ActivityHealth = ActivityHealth.NO_CALLS,
    cleanup_status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
usagem3.observability.Observation[m3.observability.UsageValue]Nofactory m3.observability._not_emitted()——
turn_countintNo0ge=0—
message_countintNo0ge=0—
reasoning_countintNo0ge=0—
tool_call_countintNo0ge=0—
successful_tool_call_countintNo0ge=0—
failed_tool_call_countintNo0ge=0—
protocol_error_countintNo0ge=0—
activity_healthm3.types.ActivityHealthNoActivityHealth.NO_CALLS ('no_calls')——
cleanup_statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——

TraceTiming ​

python
m3.observability.TraceTiming(
    *,
    started_at: datetime.datetime = ...,
    finished_at: datetime.datetime | None = None,
    start_offset_ms: float = 0,
    end_offset_ms: float = 0,
    duration_ms: float = 0,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
started_atdatetime.datetimeNofactory m3.observability.TraceTiming.<lambda>()——
finished_atdatetime.datetime | NoneNoNone——
start_offset_msfloatNo0ge=0—
end_offset_msfloatNo0ge=0—
duration_msfloatNo0ge=0—

TraceView ​

python
m3.observability.TraceView(
    *,
    schema_id: Literal['m3.trace_view'] = 'm3.trace_view',
    schema_version: Literal['1.1', '1.2'] = '1.1',
    trace_id: m3.types.TraceId,
    execution_id: m3.types.ExecutionId,
    outcome: m3.types.ExecutionOutcome = ExecutionOutcome.COMPLETED,
    completeness: Literal['complete', 'partial'] = 'complete',
    limitations: tuple[str, ...] = (),
    agent: m3.types.AgentIdentity | None = None,
    runtime: m3.observability.DirectTrace | m3.observability.OpenCodeTrace | m3.observability.ClaudeCodeTrace | m3.observability.CodexTrace | m3.observability.PiTrace | m3.observability.ACPTrace = ...,
    summary: m3.observability.TraceSummary = ...,
    timeline: tuple[m3.observability.LifecycleEntry | m3.observability.MessageEntry | m3.observability.ReasoningEntry | m3.observability.ToolCallEntry | m3.observability.ProtocolEntry | m3.observability.TransportEntry | m3.observability.InitializationEntry | m3.observability.UsageEntry | m3.observability.InteractionEntry | m3.observability.ElicitationEntry | m3.observability.ProcessEntry | m3.observability.WorkspaceEntry | m3.observability.ArtifactEntry | m3.observability.EvaluationEntry | m3.observability.DiagnosticEntry | m3.observability.RawMessageEntry | m3.observability.ProviderEntry, ...] = (),
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
schema_idLiteral['m3.trace_view']No'm3.trace_view'——
schema_versionLiteral['1.1', '1.2']No'1.1'——
trace_idm3.types.TraceIdYes———
execution_idm3.types.ExecutionIdYes———
outcomem3.types.ExecutionOutcomeNoExecutionOutcome.COMPLETED ('completed')——
completenessLiteral['complete', 'partial']No'complete'——
limitationstuple[str, ...]No()——
agentm3.types.AgentIdentity | NoneNoNone——
runtimem3.observability.DirectTrace | m3.observability.OpenCodeTrace | m3.observability.ClaudeCodeTrace | m3.observability.CodexTrace | m3.observability.PiTrace | m3.observability.ACPTraceNofactory m3.observability.DirectTrace()discriminator='kind'—
summarym3.observability.TraceSummaryNofactory m3.observability.TraceSummary()——
timelinetuple[m3.observability.LifecycleEntry | m3.observability.MessageEntry | m3.observability.ReasoningEntry | m3.observability.ToolCallEntry | m3.observability.ProtocolEntry | m3.observability.TransportEntry | m3.observability.InitializationEntry | m3.observability.UsageEntry | m3.observability.InteractionEntry | m3.observability.ElicitationEntry | m3.observability.ProcessEntry | m3.observability.WorkspaceEntry | m3.observability.ArtifactEntry | m3.observability.EvaluationEntry | m3.observability.DiagnosticEntry | m3.observability.RawMessageEntry | m3.observability.ProviderEntry, ...]No()type argument 1: discriminator='kind'—
  • tool_calls (property)
  • messages (property)
  • reasoning (property)
  • protocol (property)
  • transports (property)
  • raw_messages (property)
  • interactions (property)
  • elicitations (property): Return keyed elicitation interactions correlated to MRTR rounds.
  • processes (property)
  • diagnostics (property)
python
for_turn(
    self,
    turn: _TurnResult | _TurnState | _TurnId | str,
) -> TraceView

Return the finalized evidence belonging to one turn.

python
for_session(
    self,
    session_id: _SessionId | str,
) -> TraceView
python
for_server(
    self,
    server_binding: str,
) -> TraceView
python
between(
    self,
    start_offset_ms: float,
    end_offset_ms: float,
) -> TraceView

TransportEntry ​

python
m3.observability.TransportEntry(
    *,
    entry_id: str,
    kind: Literal['transport'] = 'transport',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    phase: Literal['connected', 'disconnected'],
    configured: m3.observability.Observation[m3.types.TransportKind] = ...,
    instrumented: m3.observability.Observation[m3.types.TransportKind] = ...,
) -> None

A stable MCP transport lifecycle observation.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['transport']No'transport'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
phaseLiteral['connected', 'disconnected']Yes———
configuredm3.observability.Observation[m3.types.TransportKind]Nofactory m3.observability._not_emitted()——
instrumentedm3.observability.Observation[m3.types.TransportKind]Nofactory m3.observability._not_emitted()——

UsageEntry ​

python
m3.observability.UsageEntry(
    *,
    entry_id: str,
    kind: Literal['usage'] = 'usage',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    input_tokens: m3.observability.Observation[int] = ...,
    output_tokens: m3.observability.Observation[int] = ...,
    reasoning_tokens: m3.observability.Observation[int] = ...,
    cache_creation_tokens: m3.observability.Observation[int] = ...,
    cache_read_tokens: m3.observability.Observation[int] = ...,
    cache_write_tokens: m3.observability.Observation[int] = ...,
    total_tokens: m3.observability.Observation[int] = ...,
    cost: m3.observability.Observation[float] = ...,
    currency: m3.observability.Observation[str] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['usage']No'usage'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
input_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
output_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
reasoning_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
cache_creation_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
cache_read_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
cache_write_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
total_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
costm3.observability.Observation[float]Nofactory m3.observability._not_emitted()——
currencym3.observability.Observation[str]Nofactory m3.observability._not_emitted()——

UsageValue ​

python
m3.observability.UsageValue(
    *,
    input_tokens: m3.observability.Observation[int] = ...,
    output_tokens: m3.observability.Observation[int] = ...,
    reasoning_tokens: m3.observability.Observation[int] = ...,
    cache_creation_tokens: m3.observability.Observation[int] = ...,
    cache_read_tokens: m3.observability.Observation[int] = ...,
    cache_write_tokens: m3.observability.Observation[int] = ...,
    total_tokens: m3.observability.Observation[int] = ...,
    cost: m3.observability.Observation[float] = ...,
    currency: m3.observability.Observation[str] = ...,
) -> None

Value-only usage aggregate used by summaries and runtime metadata.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
input_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
output_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
reasoning_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
cache_creation_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
cache_read_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
cache_write_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
total_tokensm3.observability.Observation[int]Nofactory m3.observability._not_emitted()——
costm3.observability.Observation[float]Nofactory m3.observability._not_emitted()——
currencym3.observability.Observation[str]Nofactory m3.observability._not_emitted()——

WireToolCall ​

python
m3.observability.WireToolCall(
    *,
    jsonrpc_id: m3.observability.Observation[int | str] = ...,
    server: m3.observability.Observation[str] = ...,
    tool: m3.observability.Observation[str] = ...,
    arguments: m3.observability.Observation[JsonValue] = ...,
    result: m3.observability.Observation[m3.observability.ToolResult] = ...,
    latency_ms: m3.observability.Observation[float] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
jsonrpc_idm3.observability.Observation[int | str]Nofactory m3.observability._not_emitted()variant 1: strict=True, variant 2: strict=True—
serverm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
toolm3.observability.Observation[str]Nofactory m3.observability._not_emitted()——
argumentsm3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——
resultm3.observability.Observation[m3.observability.ToolResult]Nofactory m3.observability._not_emitted()——
latency_msm3.observability.Observation[float]Nofactory m3.observability._not_emitted()——

WorkspaceEntry ​

python
m3.observability.WorkspaceEntry(
    *,
    entry_id: str,
    kind: Literal['workspace'] = 'workspace',
    parent_id: str | None = None,
    execution_id: m3.types.ExecutionId,
    session_id: m3.types.SessionId | None = None,
    turn_id: m3.types.TurnId | None = None,
    server_binding: str | None = None,
    connection_id: m3.types.ConnectionId | None = None,
    sequence_start: int,
    sequence_end: int,
    timing: m3.observability.TraceTiming = ...,
    status: m3.observability.TraceStatus = TraceStatus.COMPLETED,
    provenance: tuple[m3.types.EventSource, ...] = (),
    limitations: tuple[str, ...] = (),
    change: m3.observability.Observation[JsonValue] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
entry_idstrYes—min_length=1, max_length=256—
kindLiteral['workspace']No'workspace'——
parent_idstr | NoneNoNone——
execution_idm3.types.ExecutionIdYes———
session_idm3.types.SessionId | NoneNoNone——
turn_idm3.types.TurnId | NoneNoNone——
server_bindingstr | NoneNoNone——
connection_idm3.types.ConnectionId | NoneNoNone——
sequence_startintYes—ge=0—
sequence_endintYes—ge=0—
timingm3.observability.TraceTimingNofactory m3.observability.TraceTiming()——
statusm3.observability.TraceStatusNoTraceStatus.COMPLETED ('completed')——
provenancetuple[m3.types.EventSource, ...]No()——
limitationstuple[str, ...]No()——
changem3.observability.Observation[JsonValue]Nofactory m3.observability._not_emitted()——