Back to Openai Agents Python

RunState Schema and Resume Boundary

.agents/references/runstate-schema.md

0.17.73.8 KB
Original Source

RunState Schema and Resume Boundary

Use this reference for changes involving RunState serialization, deserialization, approvals, trace state, sandbox state, agent identity, tool output payloads, or any persisted resume data.

Compatibility Boundary

RunState is the durable SDK pause/resume boundary. Treat the serialized JSON shape as compatibility-sensitive once a schema version has shipped in a release.

  • to_json() always emits CURRENT_SCHEMA_VERSION.
  • from_json() must continue reading every version in SUPPORTED_SCHEMA_VERSIONS.
  • Older SDKs intentionally reject newer or unsupported versions rather than attempting forward compatibility.
  • Unreleased schema versions may be renumbered or squashed before release when intermediate snapshots are intentionally unsupported.
  • Every supported version must have a non-empty one-line entry in SCHEMA_VERSION_SUMMARIES.

When to Bump the Schema

Bump CURRENT_SCHEMA_VERSION when a serialized RunState snapshot changes in a way that affects resume correctness or would silently lose data when read under an older schema label.

Examples include:

  • New persisted fields on RunState, ModelResponse, ProcessedResponse, interruptions, approvals, tool outputs, sandbox state, trace state, or agent-owned state.
  • New run item, tool call, approval, or output item variants that can appear in serialized state.
  • New SDK-only metadata needed to route, dedupe, approve, retry, or resume a tool call.
  • A changed meaning for an existing serialized field.

Do not rely on current-reader tests alone. Add a regression that rewrites $schemaVersion to an older supported label when appropriate and proves the old label is accepted, rejected, or migrated deliberately.

Identity and Routing State

Serialized state must preserve enough identity to resume without changing behavior:

  • Agent identity must distinguish duplicate agent names in the same graph.
  • Function tools should persist canonical lookup keys, including bare, namespaced, and deferred_top_level.
  • Tool call IDs must remain provider-supplied strings; do not coerce arbitrary values into IDs.
  • Approval decisions and rejection messages must restore against the same tool identity and call ID they originally targeted.
  • The per-agent tool-use tracker must preserve stable duplicate-agent identity so tool-choice reset behaves the same after resume.
  • Server-managed conversation identifiers must restore into OpenAIServerConversationTracker without replaying acknowledged input.

Context and Secrets

Context serialization is intentionally conservative.

  • Mapping contexts can round-trip directly.
  • Custom contexts need explicit serializers and deserializers when exact restoration matters.
  • Without a safe serializer, snapshots may record metadata and warnings rather than the raw object.
  • Do not persist secrets in RunContextWrapper.context, trace data, tool outputs, or custom data unless the caller explicitly chose that durability boundary.

Review Checklist

  1. Identify every serialized field whose shape or meaning changes.
  2. Decide whether the affected schema version is released or unreleased.
  3. Update CURRENT_SCHEMA_VERSION and SCHEMA_VERSION_SUMMARIES when resume compatibility requires it.
  4. Keep released schema versions readable, or fail with an explicit compatibility error if the old label cannot safely represent the new data.
  5. Test to_json() output, from_json() restoration, string round-trips, and resumed execution through the public Runner.run(...) or Runner.run_streamed(...) path.

Sources

  • src/agents/run_state.py
  • src/agents/result.py
  • src/agents/run_internal/agent_runner_helpers.py
  • src/agents/run_internal/oai_conversation.py
  • src/agents/run_internal/run_steps.py
  • src/agents/run_internal/tool_execution.py
  • tests/test_run_state.py