sdk/python/docs/faq.md
Thread is conversation state.Turn is one model execution inside that thread.Thread.run() vs stream()TurnHandle.run() / AsyncTurnHandle.run() is the easiest path. It consumes events until completion and returns the canonical generated app-server Turn model.TurnHandle.stream() / AsyncTurnHandle.stream() yields raw notifications (Notification) so you can react event-by-event.Choose run() for most apps. Choose stream() for progress UIs, custom timeout logic, or custom parsing.
Codex is the sync public API.AsyncCodex is an async replica of the same public API shape.async with AsyncCodex() for async code. It is the standard path for
explicit startup/shutdown, and AsyncCodex initializes lazily on context
entry or first awaited API use.If your app is not already async, stay with Codex.
Public API keyword names are snake_case. The SDK still maps them to wire camelCase under the hood.
If you are migrating older code, update these names:
approvalPolicy -> approval_policybaseInstructions -> base_instructionsdeveloperInstructions -> developer_instructionsmodelProvider -> model_providermodelProviders -> model_providerssortKey -> sort_keysourceKinds -> source_kindsoutputSchema -> output_schemasandboxPolicy -> sandbox_policythread_start(...) and thread_resume(...)?The public API keeps only explicit lifecycle calls:
thread_start(...) to create new threadsthread_resume(thread_id, ...) to continue existing threadsThis avoids duplicate ways to do the same operation and keeps behavior explicit.
Codex() is eager: it starts transport and calls initialize in __init__.
Common causes:
codex-cli-bin) is not installedcodex_bin override points to a missing fileMaintainers stage releases by building the SDK once and the runtime once per
platform with the same pinned runtime version. Publish codex-cli-bin as
platform wheels only; do not publish an sdist:
cd sdk/python
python scripts/update_sdk_artifacts.py generate-types
python scripts/update_sdk_artifacts.py \
stage-sdk \
/tmp/codex-python-release/codex-app-server-sdk \
--runtime-version 1.2.3
python scripts/update_sdk_artifacts.py \
stage-runtime \
/tmp/codex-python-release/codex-cli-bin \
/path/to/codex \
--runtime-version 1.2.3
A turn is complete only when turn/completed arrives for that turn ID.
run() waits for this automatically.stream(), keep consuming notifications until completion.Use retry_on_overload(...) for transient overload failures (ServerBusyError).
Do not blindly retry all errors. For InvalidParamsError or MethodNotFoundError, fix inputs/version compatibility instead.
close() (or not using context managers).run() returns extra SDK-only fields instead of the generated Turn model.