Skip to content
Reference

m3.sync_api ​

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

AgentSession ​

python
m3.sync_api.AgentSession(
    portal: _SyncPortal,
    spec: _AgentSpec,
    adapter: _AgentAdapter | None = None,
    runtime_servers: _Iterable[_Any] = (),
    interaction_handlers: InteractionHandlers | None = None,
    _handle: int | None = None,
    harness_cache_dir: str | _Path | None = None,
) -> None

Blocking proxy for the async session state machine.

python
send(
    self,
    message: str | _UserMessage,
    *,
    timeout: float | None = None,
    metadata: dict[str, object] | None = None,
    elicitation: ElicitationPlan | None = None,
    elicitation_round_limit: int = 10,
) -> _TurnResult
python
enqueue_turn(
    self,
    message: str | _UserMessage,
    *,
    timeout: float | None = None,
    metadata: dict[str, object] | None = None,
) -> _Any
python
snapshot(
    self,
) -> _ExecutionState
  • provenance (property)
  • interactions (property): Policy-gated handlers owned by this session's portal task.
  • result (property)
python
cancel(
    self,
) -> None
python
fork(
    self,
    request: _SessionForkRequest,
    *,
    adapter_factory: _Callable[..., _Any],
) -> AgentSession
python
close(
    self,
) -> None

HarnessAdapter ​

python
m3.sync_api.HarnessAdapter(
    *args,
    **kwargs,
)

Minimal injected adapter contract for one continuing conversation.

python
start(
    self,
    spec: AgentSpec,
) -> None
python
send(
    self,
    message: UserMessage,
    *,
    timeout: float | None = None,
    metadata: Mapping[str, object] | None = None,
) -> TurnResponse | AdapterTurn
python
close(
    self,
) -> None

Probes ​

python
m3.sync_api.Probes(
    *,
    timeout_seconds: float = 5.0,
    output_limit: int = 65536,
) -> None

Probe only explicitly requested capability targets.

python
probe_binary(
    self,
    name: str,
    executable: str | os.PathLike[str],
    *,
    args: Sequence[str] = ('--version',),
    env: Mapping[str, str] | None = None,
    timeout_seconds: float | None = None,
) -> ProbeResult

Check one explicitly selected executable and record its version.

python
probe_protocol(
    self,
    name: str,
    executable: str | os.PathLike[str],
    *,
    args: Sequence[str] = ('--protocol-version',),
    env: Mapping[str, str] | None = None,
    timeout_seconds: float | None = None,
    transport: str | TransportKind | None = None,
) -> ProbeResult

Run the caller-selected protocol probe without version allowlists.

python
probe_harness(
    self,
    name: str,
    executable: str | os.PathLike[str],
    *,
    args: Sequence[str] = ('--version',),
    env: Mapping[str, str] | None = None,
    timeout_seconds: float | None = None,
    transport: str | TransportKind | None = None,
) -> ProbeResult

Probe exactly one harness executable; never select a fallback.

python
probe_transport(
    self,
    name: str,
    *,
    transport: str | TransportKind,
    executable: str | os.PathLike[str] | None = None,
    args: Sequence[str] = ('--transport-ready',),
    module: str | None = None,
    env: Mapping[str, str] | None = None,
    timeout_seconds: float | None = None,
) -> ProbeResult

Probe a selected transport through an explicit command or module.

python
probe_storage(
    self,
    name: str = 'memory',
    *,
    module: str | None = None,
) -> ProbeResult

Report in-memory storage as ready; check optional storage lazily.

python
probe_requested(
    self,
    requests: Iterable[ProbeRequest],
) -> ProbeReport

Run only the supplied requests, retaining each independent result.

CallToolResult ​

python
m3.sync_api.CallToolResult(
    *,
    raw: Any = None,
    content: tuple[collections.abc.Mapping[str, Any], ...] = (),
    structured_content: Any = None,
    is_error: bool = False,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
contenttuple[collections.abc.Mapping[str, Any], ...]No()——
structured_contentAnyNoNone——
is_errorboolNoFalse——

CompletionResult ​

python
m3.sync_api.CompletionResult(
    *,
    raw: Any = None,
    values: tuple[str, ...] = (),
    total: int | None = None,
    has_more: bool | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
valuestuple[str, ...]No()——
totalint | NoneNoNone——
has_morebool | NoneNoNone——

ConfigOrigin ​

python
m3.sync_api.ConfigOrigin(
    *,
    source: m3.configuration.ConfigSource,
    origin: str,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
sourcem3.configuration.ConfigSourceYes———
originstrYes—min_length=1, max_length=4096—

ConfigSource ​

python
m3.sync_api.ConfigSource(
    *values,
)
  • EXPLICIT = 'explicit'
  • ENVIRONMENT = 'environment'
  • PROJECT = 'project'
  • DEFAULT = 'default'

Config ​

python
m3.sync_api.Config(
    *,
    artifact_policy: Literal['failed', 'always', 'never'] = 'failed',
    protocol_revision: str = 'auto',
    telemetry_enabled: bool = False,
    sources: collections.abc.Mapping[str, m3.configuration.ConfigOrigin] = ...,
) -> None

Effective SDK-wide settings and the origin of each setting.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
artifact_policyLiteral['failed', 'always', 'never']No'failed'——
protocol_revisionstrNo'auto'strict=True—
telemetry_enabledboolNoFalsestrict=True—
sourcescollections.abc.Mapping[str, m3.configuration.ConfigOrigin]Nofactory m3.configuration._default_origins()——
  • provenance (property): Compatibility name for callers that call origins provenance.
python
source_for(
    self,
    field: str,
) -> ConfigOrigin

ConfigError ​

python
m3.sync_api.ConfigError(
    *,
    field: str,
    origin: str,
    reason: str,
    code: str | None = None,
) -> None

A strict, value-free configuration diagnostic.

DirectClient ​

python
m3.sync_api.DirectClient(
    portal: _SyncPortal,
    server: _ServerValue | _ServerBinding,
    options: _Mapping[str, _Any],
) -> None

Synchronous proxy whose async protocol state remains in a portal thread.

python
close(
    self,
) -> None
  • initialization (property)
  • timeout (property)
  • trace (property)
  • final_trace (property)
  • transport_evidence (property)
python
initialize(
    self,
) -> InitializationResult
python
list_tools(
    self,
    *,
    cursor: str | None = None,
) -> ListToolsResult
python
list_all_tools(
    self,
) -> tuple[Tool, ...]
python
list_resources(
    self,
    *,
    cursor: str | None = None,
) -> ListResourcesResult
python
list_all_resources(
    self,
) -> tuple[Resource, ...]
python
list_resource_templates(
    self,
    *,
    cursor: str | None = None,
) -> ListResourceTemplatesResult
python
list_all_resource_templates(
    self,
) -> tuple[ResourceTemplate, ...]
python
list_prompts(
    self,
    *,
    cursor: str | None = None,
) -> ListPromptsResult
python
list_all_prompts(
    self,
) -> tuple[PromptInfo, ...]
python
read_resource(
    self,
    uri: str,
    *,
    input_responses: _Any = None,
    request_state: str | None = None,
    meta: _Any = None,
    allow_input_required: bool = False,
    elicitation: ElicitationPlan | None = None,
    elicitation_round_limit: int = 10,
) -> ResourceReadResult | InputRequiredResult
python
get_prompt(
    self,
    name: str,
    arguments: _Mapping[str, str] | None = None,
    *,
    input_responses: _Any = None,
    request_state: str | None = None,
    meta: _Any = None,
    allow_input_required: bool = False,
    elicitation: ElicitationPlan | None = None,
    elicitation_round_limit: int = 10,
) -> PromptResult | InputRequiredResult
python
call_tool(
    self,
    name: str,
    arguments: _Mapping[str, _Any] | None = None,
    *,
    timeout: float | None = None,
    progress_callback: _Any = None,
    input_responses: _Any = None,
    request_state: str | None = None,
    meta: _Any = None,
    allow_input_required: bool = False,
    allow_claimed: bool = False,
    elicitation: ElicitationPlan | None = None,
    elicitation_round_limit: int = 10,
) -> ToolCallResult | InputRequiredResult
python
complete(
    self,
    reference: _Any,
    argument: _Mapping[str, str],
    context_arguments: _Mapping[str, str] | None = None,
) -> CompletionResult
python
subscribe_resource(
    self,
    uri: str,
    *,
    meta: _Any = None,
) -> EmptyResult
python
unsubscribe_resource(
    self,
    uri: str,
    *,
    meta: _Any = None,
) -> EmptyResult
python
ping(
    self,
    *,
    meta: _Any = None,
) -> EmptyResult
python
set_logging_level(
    self,
    level: str,
    *,
    meta: _Any = None,
) -> EmptyResult
python
send_progress_notification(
    self,
    progress_token: str | int,
    progress: float,
    total: float | None = None,
    message: str | None = None,
    *,
    meta: _Any = None,
) -> None
python
send_notification(
    self,
    notification: _Any,
) -> None
python
send_roots_list_changed(
    self,
) -> None
python
register_callbacks(
    self,
    **callbacks: _Any,
) -> _NoReturn

ExecutionHandle ​

python
m3.sync_api.ExecutionHandle(
    portal: _SyncPortal,
    identifier: int,
) -> None

Blocking twin of :class:AsyncExecutionHandle with no async leakage.

  • execution_id (property)
  • spec (property)
  • submitted_spec (property)
python
snapshot(
    self,
) -> _ExecutionState
python
pending_elicitation(
    self,
) -> PendingElicitationRound | None
python
respond_elicitation(
    self,
    round_id: str,
    responses: _Mapping[str, ElicitationResponse],
    *,
    idempotency_key: str,
) -> None
python
result(
    self,
    timeout: float | None = None,
) -> _ExecutionResult
python
cancel(
    self,
) -> None
python
events(
    self,
    *,
    after_sequence: int = -1,
) -> _Iterator[_Event]
python
on_event(
    self,
    callback: _Callable[[_Event], _Any],
) -> _Callable[[], None]

PromptInfo ​

python
m3.sync_api.PromptInfo(
    *,
    raw: Any = None,
    name: str,
    title: str | None = None,
    description: str | None = None,
    arguments: tuple[collections.abc.Mapping[str, Any], ...] = (),
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
namestrYes—min_length=1, max_length=256—
titlestr | NoneNoNone——
descriptionstr | NoneNoNone——
argumentstuple[collections.abc.Mapping[str, Any], ...]No()——

ResourceInfo ​

python
m3.sync_api.ResourceInfo(
    *,
    raw: Any = None,
    name: str,
    title: str | None = None,
    uri: str,
    description: str | None = None,
    mime_type: str | None = None,
    size: int | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
namestrYes—min_length=1, max_length=256—
titlestr | NoneNoNone——
uristrYes—min_length=1, max_length=4096—
descriptionstr | NoneNoNone——
mime_typestr | NoneNoNone——
sizeint | NoneNoNonege=0—

TemplateInfo ​

python
m3.sync_api.TemplateInfo(
    *,
    raw: Any = None,
    name: str,
    title: str | None = None,
    uri_template: str,
    description: str | None = None,
    mime_type: str | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
namestrYes—min_length=1, max_length=256—
titlestr | NoneNoNone——
uri_templatestrYes—min_length=1, max_length=4096—
descriptionstr | NoneNoNone——
mime_typestr | NoneNoNone——

ToolInfo ​

python
m3.sync_api.ToolInfo(
    *,
    raw: Any = None,
    name: str,
    title: str | None = None,
    description: str | None = None,
    input_schema: collections.abc.Mapping[str, Any] | bool = ...,
    output_schema: collections.abc.Mapping[str, Any] | bool | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
namestrYes—min_length=1, max_length=256—
titlestr | NoneNoNone——
descriptionstr | NoneNoNone——
input_schemacollections.abc.Mapping[str, Any] | boolNofactory builtins.dict()——
output_schemacollections.abc.Mapping[str, Any] | bool | NoneNoNone——

EmptyResult ​

python
m3.sync_api.EmptyResult(
    *,
    raw: Any = None,
    result_type: str | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
result_typestr | NoneNoNone——

GetPromptResult ​

python
m3.sync_api.GetPromptResult(
    *,
    raw: Any = None,
    description: str | None = None,
    messages: tuple[collections.abc.Mapping[str, Any], ...] = (),
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
descriptionstr | NoneNoNone——
messagestuple[collections.abc.Mapping[str, Any], ...]No()——

InitializationResult ​

python
m3.sync_api.InitializationResult(
    *,
    raw: Any = None,
    protocol_version: str,
    server_info: collections.abc.Mapping[str, Any],
    instructions: str | None = None,
    capabilities: collections.abc.Mapping[str, Any] = ...,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
protocol_versionstrYes———
server_infocollections.abc.Mapping[str, Any]Yes———
instructionsstr | NoneNoNone——
capabilitiescollections.abc.Mapping[str, Any]Nofactory builtins.dict()——

InputRequiredResult ​

python
m3.sync_api.InputRequiredResult(
    *,
    raw: Any = None,
    result_type: Literal['input_required'] = 'input_required',
    input_requests: collections.abc.Mapping[str, Any] | None = None,
    request_state: str | None = None,
) -> None

Official MCP interactive result, preserved instead of coercing empty data.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
result_typeLiteral['input_required']No'input_required'——
input_requestscollections.abc.Mapping[str, Any] | NoneNoNone——
request_statestr | NoneNoNone——

ListPromptsResult ​

python
m3.sync_api.ListPromptsResult(
    *,
    raw: Any = None,
    prompts: tuple[m3.types.PromptInfo, ...] = (),
    next_cursor: str | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
promptstuple[m3.types.PromptInfo, ...]No()——
next_cursorstr | NoneNoNone——

ListResourcesResult ​

python
m3.sync_api.ListResourcesResult(
    *,
    raw: Any = None,
    resources: tuple[m3.types.ResourceInfo, ...] = (),
    next_cursor: str | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
resourcestuple[m3.types.ResourceInfo, ...]No()——
next_cursorstr | NoneNoNone——

ListResourceTemplatesResult ​

python
m3.sync_api.ListResourceTemplatesResult(
    *,
    raw: Any = None,
    resource_templates: tuple[m3.types.TemplateInfo, ...] = (),
    next_cursor: str | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
resource_templatestuple[m3.types.TemplateInfo, ...]No()——
next_cursorstr | NoneNoNone——

ListToolsResult ​

python
m3.sync_api.ListToolsResult(
    *,
    raw: Any = None,
    tools: tuple[m3.types.ToolInfo, ...] = (),
    next_cursor: str | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
toolstuple[m3.types.ToolInfo, ...]No()——
next_cursorstr | NoneNoNone——

MCPTestKit ​

python
m3.sync_api.MCPTestKit(
    config: Config | _Mapping[str, _Any] | None = None,
    *,
    env: _Mapping[str, str] | None = None,
    cwd: str | _Path | None = None,
    probe_timeout_seconds: float = 5.0,
    probe_output_limit: int = 65536,
    store: _ExecutionStore | None = None,
    embedded_worker: bool = True,
    adapter_registry: _HarnessAdapterRegistry | None = None,
    run_id: _RunId | str | None = None,
    suite_name: str | None = None,
    project_id: _ProjectId | str | None = None,
    record_checks: bool = False,
    max_judge_requests: int | None = None,
    harness_cache_dir: str | _Path | None = None,
) -> None

Lifecycle-safe synchronous configuration and capability shell.

  • probes (property): Synchronous capability namespace owned by this kit.
  • store (property): The optional execution store configured on this kit.
  • run_id (property)
python
get_trace(
    self,
    execution_id: _ExecutionId | str,
) -> _TraceResult

Return the finalized stable trace for an execution.

python
get_trace_view(
    self,
    execution_id: _ExecutionId | str,
) -> TraceView

Return the finalized typed trace view for an execution.

python
read_raw_evidence(
    self,
    reference: _EvidenceRef,
    *,
    max_bytes: int = 1048576,
) -> RawEvidence

Read bounded, redacted raw evidence by its durable reference.

python
close(
    self,
) -> None

Close the shell; repeated calls are intentionally harmless.

python
capabilities(
    self,
    requests: _Iterable[ProbeRequest] = (),
) -> ProbeReport

Return the baseline or exactly the explicitly requested probes.

python
register_evaluator(
    self,
    name: str,
    evaluator: _EvaluatorCallable,
) -> None

Register an evaluator callback by its serializable name.

python
evaluate(
    self,
    subject: _Any,
    evaluator: str | _EvaluatorCallable,
    *,
    required: bool = False,
    goal: str | None = None,
    trace: _Any = None,
    artifacts: _Any = (),
    metadata: _Mapping[str, str | int | float | bool | None] | None = None,
    execution_id: _Any = None,
    turn_id: _Any = None,
    case_id: str | None = None,
) -> _EvaluationResult

Run and persist one evaluation without changing lifecycle.

python
judge_response(
    self,
    *,
    name: str,
    input: str,
    actual: str,
    expected: str,
    judge: _LLMJudge,
    required: bool = False,
    execution_id: _Any = None,
    turn_id: _Any = None,
    case_id: str | None = None,
) -> _EvaluationResult

Judge one response and persist the result through this kit's runner.

python
evaluation_results(
    self,
) -> tuple[_EvaluationResult, ...]
python
agents(
    self,
    selections: _Any,
    *,
    trials: int = 1,
) -> tuple[_Any, ...]

Expand ordered agent dictionaries without starting any I/O.

python
run(
    self,
    spec: _DirectSpec | _AgentSpec,
) -> _ExecutionResult
python
submit(
    self,
    spec: _ExecutionSpec,
    *,
    human_input: _HumanInput = 'fail',
) -> ExecutionHandle
python
direct(
    self,
    server: _ServerValue | _ServerBinding,
    *,
    protocol: object | None = None,
    timeout: float | None = None,
    validate_schemas: bool = False,
    secret_resolver: _Any = None,
    bearer_token: _Any = None,
    auth: _Any = None,
    for_agent: bool = False,
    resolve_host: _Any = None,
    raise_server_exceptions: bool = True,
    sampling_callback: _Any = None,
    elicitation_callback: _RemovedElicitationCallback = ...,
    list_roots_callback: _Any = None,
    logging_callback: _Any = None,
    message_handler: _Any = None,
    client_info: _Any = None,
    log_level: _Any = None,
    sampling_capabilities: _Any = None,
    result_claims: _Any = None,
    extensions: _Mapping[str, _Mapping[str, _Any]] | None = None,
    notification_bindings: _Iterable[_Any] | None = None,
    dispatcher: _Any = None,
    trace_bridge: _Any = None,
    trace_owner: bool = True,
    workspace_root: str | None = None,
) -> DirectClient
python
agent_session(
    self,
    spec: _AgentSpec,
    *,
    adapter: _AgentAdapter | None = None,
    runtime_servers: _Iterable[_Any] = (),
    interaction_handlers: InteractionHandlers | None = None,
    harness_cache_dir: str | _Path | None = None,
) -> AgentSession

ProbeEvidence ​

python
m3.sync_api.ProbeEvidence(
    *,
    kind: m3.services.probes.ProbeKind,
    target: str,
    command: tuple[str, ...] = (),
    resolved_executable: str | None = None,
    detected_version: str | None = None,
    protocol_version: str | None = None,
    output: str = '',
    details: collections.abc.Mapping[str, Any] = ...,
) -> None

Safe evidence collected by one probe.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
kindm3.services.probes.ProbeKindYes———
targetstrYes—min_length=1, max_length=512—
commandtuple[str, ...]No()——
resolved_executablestr | NoneNoNone——
detected_versionstr | NoneNoNone——
protocol_versionstr | NoneNoNone——
outputstrNo''max_length=65536—
detailscollections.abc.Mapping[str, Any]Nofactory builtins.dict()——

ProbeKind ​

python
m3.sync_api.ProbeKind(
    *values,
)

The independently requestable capability categories.

  • CONFIGURATION = 'configuration'
  • BINARY = 'binary'
  • PROTOCOL = 'protocol'
  • TRANSPORT = 'transport'
  • STORAGE = 'storage'
  • HARNESS = 'harness'

ProbeReport ​

python
m3.sync_api.ProbeReport(
    *,
    readiness: m3.types.Readiness,
    results: tuple[m3.services.probes.ProbeResult, ...] = (),
) -> None

Aggregate readiness for exactly the requested probes.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
readinessm3.types.ReadinessYes———
resultstuple[m3.services.probes.ProbeResult, ...]No()——
  • capabilities (property)
python
result_for(
    self,
    name: str,
) -> ProbeResult | None

Return the result for name without guessing another target.

ProbeRequest ​

python
m3.sync_api.ProbeRequest(
    kind: ProbeKind,
    name: str,
    executable: str | None = None,
    args: tuple[str, ...] = (),
    env: Mapping[str, str] | None = None,
    module: str | None = None,
    transport: str | None = None,
    timeout_seconds: float | None = None,
) -> None

Typed request used by :meth:Probes.probe_requested.

ProbeResult ​

python
m3.sync_api.ProbeResult(
    *,
    capability: m3.types.Capability,
    evidence: m3.services.probes.ProbeEvidence,
) -> None

One capability result and its separately inspectable evidence.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
capabilitym3.types.CapabilityYes———
evidencem3.services.probes.ProbeEvidenceYes———
  • status (property)

PromptResult ​

python
m3.sync_api.PromptResult(
    *,
    raw: Any = None,
    description: str | None = None,
    messages: tuple[collections.abc.Mapping[str, Any], ...] = (),
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
descriptionstr | NoneNoNone——
messagestuple[collections.abc.Mapping[str, Any], ...]No()——

ResourceReadResult ​

python
m3.sync_api.ResourceReadResult(
    *,
    raw: Any = None,
    contents: tuple[collections.abc.Mapping[str, Any], ...] = (),
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
contentstuple[collections.abc.Mapping[str, Any], ...]No()——
  • text (property)

ToolCallResult ​

python
m3.sync_api.ToolCallResult(
    *,
    raw: Any = None,
    content: tuple[collections.abc.Mapping[str, Any], ...] = (),
    structured_content: Any = None,
    is_error: bool = False,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
contenttuple[collections.abc.Mapping[str, Any], ...]No()——
structured_contentAnyNoNone——
is_errorboolNoFalse——

Tool ​

python
m3.sync_api.Tool(
    *,
    raw: Any = None,
    name: str,
    title: str | None = None,
    description: str | None = None,
    input_schema: collections.abc.Mapping[str, Any] | bool = ...,
    output_schema: collections.abc.Mapping[str, Any] | bool | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
namestrYes—min_length=1, max_length=256—
titlestr | NoneNoNone——
descriptionstr | NoneNoNone——
input_schemacollections.abc.Mapping[str, Any] | boolNofactory builtins.dict()——
output_schemacollections.abc.Mapping[str, Any] | bool | NoneNoNone——

Resource ​

python
m3.sync_api.Resource(
    *,
    raw: Any = None,
    name: str,
    title: str | None = None,
    uri: str,
    description: str | None = None,
    mime_type: str | None = None,
    size: int | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
namestrYes—min_length=1, max_length=256—
titlestr | NoneNoNone——
uristrYes—min_length=1, max_length=4096—
descriptionstr | NoneNoNone——
mime_typestr | NoneNoNone——
sizeint | NoneNoNonege=0—

ResourceTemplate ​

python
m3.sync_api.ResourceTemplate(
    *,
    raw: Any = None,
    name: str,
    title: str | None = None,
    uri_template: str,
    description: str | None = None,
    mime_type: str | None = None,
) -> None

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
rawAnyNoNone——
namestrYes—min_length=1, max_length=256—
titlestr | NoneNoNone——
uri_templatestrYes—min_length=1, max_length=4096—
descriptionstr | NoneNoNone——
mime_typestr | NoneNoNone——

load_config ​

python
m3.sync_api.load_config(
    explicit: _Mapping[str, _Any] | None = None,
    *,
    env: _Mapping[str, str] | None = None,
    cwd: str | _Path | None = None,
    artifact_policy: _Any = ...,
    protocol_revision: _Any = ...,
    telemetry_enabled: _Any = ...,
) -> Config

Resolve SDK settings using explicit, environment, project, default order.

AllowedCommands ​

python
m3.sync_api.AllowedCommands(
    *,
    allowed_executables: Sequence[str],
    root: str | Path,
    environment: Mapping[str, str] | None = None,
    allowed_environment: Sequence[str] = (),
) -> None

Safe argv-only terminal handler with cwd, timeout, and output bounds.

FilesystemHandler ​

python
m3.sync_api.FilesystemHandler(
    *args,
    **kwargs,
)

FilesystemRequest ​

python
m3.sync_api.FilesystemRequest(
    operation: FilesystemOperation,
    path: str,
    data: bytes | None = None,
    max_bytes: int = 1048576,
) -> None

FilesystemResult ​

python
m3.sync_api.FilesystemResult(
    allowed: bool,
    data: bytes | tuple[str, ...] | None,
    receipt: InteractionReceipt,
) -> None

Interactions ​

python
m3.sync_api.Interactions(
    *,
    permission_policy: PermissionPolicy | None = None,
    sampling_policy: SamplingPolicy | None = None,
    filesystem_policy: FilesystemPolicy | None = None,
    terminal_policy: TerminalPolicy | None = None,
    handlers: InteractionHandlers | None = None,
) -> None

Apply immutable policies around explicit interaction callbacks.

python
receipts(
    self,
) -> tuple[InteractionReceipt, ...]
python
permission(
    self,
    request: PermissionRequest,
) -> PermissionResult
python
sample(
    self,
    request: SamplingRequest,
) -> SamplingResult
python
filesystem(
    self,
    request: FilesystemRequest,
) -> FilesystemResult
python
terminal(
    self,
    request: TerminalRequest,
) -> TerminalResult

InteractionHandlers ​

python
m3.sync_api.InteractionHandlers(
    permission: PermissionCallback | None = None,
    sampling: SamplingCallback | None = None,
    filesystem: FilesystemHandler | None = None,
    terminal: TerminalHandler | None = None,
) -> None

Optional callbacks; absent callbacks are always default-deny.

InteractionReceipt ​

python
m3.sync_api.InteractionReceipt(
    request_id: str,
    kind: str,
    decision: Decision,
    reason: str,
    timestamp: datetime = ...,
) -> None

Safe decision evidence; request values and handler errors are excluded.

PermissionRequest ​

python
m3.sync_api.PermissionRequest(
    operation: str,
    resource: str = '',
    destructive: bool = False,
) -> None

PermissionResult ​

python
m3.sync_api.PermissionResult(
    allowed: bool,
    receipt: InteractionReceipt,
    confirmation_required: bool = False,
) -> None

PermissionHandler ​

python
m3.sync_api.PermissionHandler(
    *args,
    **kwargs,
)

SamplingRequest ​

python
m3.sync_api.SamplingRequest(
    prompt: str,
    model: str | None = None,
    metadata: Mapping[str, str | int | float | bool | None] = ...,
) -> None

SamplingResult ​

python
m3.sync_api.SamplingResult(
    accepted: bool,
    content: str | None,
    receipt: InteractionReceipt,
) -> None

SamplingHandler ​

python
m3.sync_api.SamplingHandler(
    *args,
    **kwargs,
)

TerminalHandler ​

python
m3.sync_api.TerminalHandler(
    *args,
    **kwargs,
)

TerminalRequest ​

python
m3.sync_api.TerminalRequest(
    argv: tuple[str, ...],
    cwd: str | None = None,
    environment: Mapping[str, str] = ...,
    timeout_seconds: float = 30.0,
    max_output_bytes: int = 1048576,
) -> None

TerminalResult ​

python
m3.sync_api.TerminalResult(
    allowed: bool,
    returncode: int | None,
    stdout: bytes,
    stderr: bytes,
    timed_out: bool,
    truncated: bool,
    receipt: InteractionReceipt,
) -> None

WorkspaceFiles ​

python
m3.sync_api.WorkspaceFiles(
    root: str | Path,
    *,
    mode: Literal['read_only', 'read_write'] = 'read_only',
    max_bytes: int = 1048576,
) -> None

Bounded filesystem handler rooted inside one owned workspace.

ElicitationPlan ​

python
m3.sync_api.ElicitationPlan(
    *,
    node: Literal['leaf', 'sequence', 'optional', 'one_of', 'round_of'] = 'leaf',
    request: m3.elicitation._FormExpectation | m3.elicitation._UrlExpectation | None = None,
    response: m3.elicitation.ElicitationResponse | None = None,
    children: tuple[m3.elicitation.ElicitationPlan, ...] = (),
    optional_occurrence: bool = False,
) -> None

An immutable, serializable elicitation expectation tree.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
nodeLiteral['leaf', 'sequence', 'optional', 'one_of', 'round_of']No'leaf'——
requestm3.elicitation._FormExpectation | m3.elicitation._UrlExpectation | NoneNoNonevariant 1: discriminator='mode'—
responsem3.elicitation.ElicitationResponse | NoneNoNone——
childrentuple[m3.elicitation.ElicitationPlan, ...]No()——
optional_occurrenceboolNoFalse——
  • is_complete (property)
  • mode (property)
  • requested_schema (property)
  • optional (property)
python
accept(
    self,
    content: Mapping[str, object] | None = None,
) -> ElicitationPlan
python
decline(
    self,
) -> ElicitationPlan
python
cancel(
    self,
) -> ElicitationPlan
python
canonical_identity(
    self,
) -> str
python
canonical_json(
    self,
) -> str
python
model_dump(
    self,
    *args: Any,
    **kwargs: Any,
) -> dict[str, Any]
python
model_dump_json(
    self,
    *args: Any,
    **kwargs: Any,
) -> str
python
matcher(
    self,
) -> PlanMatcher

ElicitationResponse ​

python
m3.sync_api.ElicitationResponse(
    *,
    action: Literal['accept', 'decline', 'cancel'],
    content: collections.abc.Mapping[str, object] | None = None,
    meta: collections.abc.Mapping[str, object] | None = None,
) -> None

The response that will be associated with one request key.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
actionLiteral['accept', 'decline', 'cancel']Yes———
contentcollections.abc.Mapping[str, object] | NoneNoNone——
metacollections.abc.Mapping[str, object] | NoneNoNone——

FormElicitationRequest ​

python
m3.sync_api.FormElicitationRequest(
    *,
    request_key: str,
    mode: Literal['form'] = 'form',
    message: str,
    requested_schema: collections.abc.Mapping[str, object],
    meta: collections.abc.Mapping[str, object] | None = None,
    task: collections.abc.Mapping[str, object] | None = None,
    server: str | None = None,
    operation_kind: Literal['tool', 'prompt', 'resource'] | None = None,
    operation_name: str | None = None,
) -> None

A normalized form-mode elicitation request.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
request_keystrYes—min_length=1—
modeLiteral['form']No'form'——
messagestrYes———
requested_schemacollections.abc.Mapping[str, object]Yes———
metacollections.abc.Mapping[str, object] | NoneNoNone——
taskcollections.abc.Mapping[str, object] | NoneNoNone——
serverstr | NoneNoNone——
operation_kindLiteral['tool', 'prompt', 'resource'] | NoneNoNone——
operation_namestr | NoneNoNone——

PendingElicitationRound ​

python
m3.sync_api.PendingElicitationRound(
    *,
    round_id: str,
    execution_id: str,
    logical_operation_id: str,
    server: str,
    operation_kind: Literal['tool', 'prompt', 'resource'],
    operation_name: str,
    request_state: str | None = None,
    requests: collections.abc.Mapping[str, m3.elicitation.FormElicitationRequest | m3.elicitation.UrlElicitationRequest],
    created_at: datetime.datetime,
    deadline: datetime.datetime | None = None,
) -> None

A persisted, keyed set of elicitation requests awaiting responses.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
round_idstrYes—min_length=1—
execution_idstrYes—min_length=1—
logical_operation_idstrYes—min_length=1—
serverstrYes—min_length=1—
operation_kindLiteral['tool', 'prompt', 'resource']Yes———
operation_namestrYes—min_length=1—
request_statestr | NoneNoNone——
requestscollections.abc.Mapping[str, m3.elicitation.FormElicitationRequest | m3.elicitation.UrlElicitationRequest]Yes—type argument 2: discriminator='mode'—
created_atdatetime.datetimeYes———
deadlinedatetime.datetime | NoneNoNone——

UrlElicitationRequest ​

python
m3.sync_api.UrlElicitationRequest(
    *,
    request_key: str,
    mode: Literal['url'] = 'url',
    message: str,
    url: str,
    elicitation_id: str | None = None,
    meta: collections.abc.Mapping[str, object] | None = None,
    task: collections.abc.Mapping[str, object] | None = None,
    server: str | None = None,
    operation_kind: Literal['tool', 'prompt', 'resource'] | None = None,
    operation_name: str | None = None,
) -> None

A normalized URL-mode elicitation request.

Model fields:

FieldTypeRequiredDefaultConstraintsDescription
request_keystrYes—min_length=1—
modeLiteral['url']No'url'——
messagestrYes———
urlstrYes———
elicitation_idstr | NoneNoNone——
metacollections.abc.Mapping[str, object] | NoneNoNone——
taskcollections.abc.Mapping[str, object] | NoneNoNone——
serverstr | NoneNoNone——
operation_kindLiteral['tool', 'prompt', 'resource'] | NoneNoNone——
operation_namestr | NoneNoNone——

expect_form ​

python
m3.sync_api.expect_form(
    request_key: str,
    *,
    message: str | None = None,
    schema: Mapping[str, object] | None = None,
    server: object | None = None,
    operation_kind: OperationKind | None = None,
    operation_name: str | None = None,
) -> ElicitationPlan

expect_url ​

python
m3.sync_api.expect_url(
    request_key: str,
    *,
    message: str | None = None,
    url: str | None = None,
    elicitation_id: str | None = None,
    server: object | None = None,
    operation_kind: OperationKind | None = None,
    operation_name: str | None = None,
) -> ElicitationPlan

maybe_form ​

python
m3.sync_api.maybe_form(
    request_key: str,
    *,
    message: str | None = None,
    schema: Mapping[str, object] | None = None,
    server: object | None = None,
    operation_kind: OperationKind | None = None,
    operation_name: str | None = None,
) -> ElicitationPlan

maybe_url ​

python
m3.sync_api.maybe_url(
    request_key: str,
    *,
    message: str | None = None,
    url: str | None = None,
    elicitation_id: str | None = None,
    server: object | None = None,
    operation_kind: OperationKind | None = None,
    operation_name: str | None = None,
) -> ElicitationPlan

one_of ​

python
m3.sync_api.one_of(
    *children: ElicitationPlan,
) -> ElicitationPlan

optional ​

python
m3.sync_api.optional(
    child: ElicitationPlan,
) -> ElicitationPlan

round_of ​

python
m3.sync_api.round_of(
    *children: ElicitationPlan,
) -> ElicitationPlan

sequence ​

python
m3.sync_api.sequence(
    *children: ElicitationPlan,
) -> ElicitationPlan

ACPTrace ​

python
m3.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.CorrelationState(
    *values,
)
  • CORRELATED = 'correlated'
  • REPORTED_ONLY = 'reported_only'
  • WIRE_ONLY = 'wire_only'
  • AMBIGUOUS = 'ambiguous'
  • UNAVAILABLE = 'unavailable'

DiagnosticEntry ​

python
m3.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.MessageRole(
    *values,
)
  • USER = 'user'
  • ASSISTANT = 'assistant'
  • SYSTEM = 'system'
  • TOOL = 'tool'

Observation ​

python
m3.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.ProtocolKind(
    *values,
)
  • MCP = 'mcp'
  • ACP = 'acp'
  • PROVIDER_HTTP = 'provider_http'
  • PROVIDER_STREAM = 'provider_stream'

ProviderEntry ​

python
m3.sync_api.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.sync_api.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.sync_api.RawEvidenceSource(
    *values,
)
  • MCP = 'mcp'
  • ACP = 'acp'
  • OPENCODE = 'opencode'
  • CLAUDE_CODE = 'claude_code'
  • PROCESS_STDERR = 'process_stderr'

RawMessageEntry ​

python
m3.sync_api.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.sync_api.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.sync_api.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.sync_api.RuntimeTraceInfo(
    *args,
    **kwargs,
)

SafeHttpHeader ​

python
m3.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.TraceEntry(
    *args,
    **kwargs,
)

TraceEntryBase ​

python
m3.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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.sync_api.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()——