Skip to main content

Python SDK for Codex CLI with bundled platform binaries

Project description

codex-python

Python SDK for Codex with bundled codex binaries inside platform wheels.

This package exposes two supported APIs:

  • Codex: a simple, local convenience interface backed by a private stdio app-server session
  • AppServerClient: a richer app-server client for thread management, streaming events, approvals, and typed protocol access

Canonical import paths:

  • use from codex import ... for the high-level Codex facade
  • use from codex.app_server import ... for the raw app-server client and app-server option types

Install

pip install codex-python

Which API should I use?

Codex

Use Codex when you want the smallest surface area for local automation:

  • one private local app-server session per Codex instance
  • stateless run*() convenience (fresh internal thread per call)
  • stateful thread workflows when needed via start_thread() / resume_thread()
  • simple request/response usage
  • optional streaming over the exec event stream
  • structured output via TurnOptions(output_schema=...)

AppServerClient

Use AppServerClient when you want a deeper integration:

  • persistent app-server connection
  • thread objects and turn streams
  • protocol-native notifications
  • server-driven requests such as tool callbacks and approvals
  • typed protocol models and raw JSON-RPC access when needed

Quickstart: Codex

from codex import Codex, ThreadStartOptions

client = Codex()

# Simplest one-shot call.
summary = client.run_text("Diagnose the failing tests and propose a fix")
print(summary)

# One-shot call with thread-scoped defaults for that run's fresh internal thread.
summary = client.run_text(
    "Diagnose the failing tests in this repo",
    thread_options=ThreadStartOptions(
        cwd="/repo",
        model="gpt-5",
    ),
)
print(summary)

Use thread_options= on run(), run_text(), run_json(), and run_model() when you want to set defaults on the fresh internal thread created for that one-shot call. Use start_thread() / resume_thread() when later runs should share context.

More Codex examples: docs/exec_api.md

Quickstart: AppServerClient

from codex.app_server import AppServerClient, AppServerClientInfo, AppServerInitializeOptions

initialize_options = AppServerInitializeOptions(
    client_info=AppServerClientInfo(
        name="my_integration",
        title="My Integration",
        version="0.1.0",
    )
)

with AppServerClient.connect_stdio(initialize_options=initialize_options) as client:
    thread = client.start_thread()
    summary = thread.run_text("Briefly summarize this repository's purpose.")
    print(summary)

More app-server examples: docs/app_server.md For websocket transport, install the optional extra: pip install "codex-python[websocket]".

Dynamic tools

Decorator-driven dynamic tools are available on both SDK surfaces.

Codex

from codex import Codex, dynamic_tool


@dynamic_tool
def lookup_ticket(id: str) -> str:
    """Look up a support ticket by id."""
    return f"Ticket {id}: Login requests time out in eu-west-1."


client = Codex()
summary = client.run_text(
    "Use the lookup_ticket dynamic tool for ticket 123 and summarize the result.",
    tools=[lookup_ticket],
)
print(summary)

AppServerClient

For a complete app-server example using the same decorator-driven flow, see examples/app_server_dynamic_tool.py.

Structured output

Codex

from codex import Codex, TurnOptions

schema = {
    "type": "object",
    "properties": {"summary": {"type": "string"}},
    "required": ["summary"],
    "additionalProperties": False,
}

client = Codex()
payload = client.run_json("Summarize repository status", TurnOptions(output_schema=schema))
print(payload["summary"])

AppServerClient

from pydantic import BaseModel

from codex.app_server import AppServerClient, AppServerTurnOptions


class Summary(BaseModel):
    summary: str


with AppServerClient.connect_stdio() as client:
    thread = client.start_thread()
    result = thread.run_model(
        "Summarize repository status",
        Summary,
    )
    print(result.summary)

run_model() uses Summary both as the validation model and, by default, as the output schema sent to Codex. If you want JSON back without validation, you can also pass the model class directly to output_schema, for example thread.run_json(..., AppServerTurnOptions(output_schema=Summary)).

Streaming

Codex stream

from codex import Codex
from codex.protocol import types as protocol

client = Codex()
stream = client.run("Investigate this bug")
for event in stream:
    if isinstance(event, protocol.ItemAgentMessageDeltaNotification):
        print(event.params.delta, end="", flush=True)

print()

Codex.run*() starts a fresh internal thread for each call. Use start_thread() or resume_thread() when you want later runs to share context.

High-level Codex helpers raise ThreadRunError on failed or interrupted terminal turns and preserve the final turn metadata on the exception for debugging and UI handling.

App-server stream

from codex.app_server import AppServerClient
from codex.protocol import types as protocol

with AppServerClient.connect_stdio() as client:
    thread = client.start_thread()
    stream = thread.run("Investigate this bug")

    for event in stream:
        if isinstance(event, protocol.ItemAgentMessageDeltaNotification):
            print(event.params.delta, end="", flush=True)

    print()

Advanced app-server usage, including typed stable RPC domains such as client.models and the raw client.rpc fallback: docs/app_server_advanced.md

Examples

Bundled binary behavior

By default, the SDK resolves the bundled binary at:

codex/vendor/<target-triple>/codex/{codex|codex.exe}

If the bundled binary is not present, for example in a source checkout, the SDK falls back to codex on PATH.

You can override the executable path with:

  • CodexOptions(codex_path_override=...)
  • codex.app_server.AppServerProcessOptions(codex_path_override=...)

Development

make lint
make test

make test emits a terminal coverage report, writes coverage.xml, and enforces the repository coverage gate.

If you want to test vendored-binary behavior locally, fetch binaries into codex/vendor:

python scripts/fetch_codex_binary.py --target-triple x86_64-unknown-linux-musl

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

codex_python-1.122.0.tar.gz (81.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

codex_python-1.122.0-cp312-abi3-win_arm64.whl (70.2 MB view details)

Uploaded CPython 3.12+Windows ARM64

codex_python-1.122.0-cp312-abi3-win_amd64.whl (76.1 MB view details)

Uploaded CPython 3.12+Windows x86-64

codex_python-1.122.0-cp312-abi3-musllinux_1_2_x86_64.whl (76.9 MB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ x86-64

codex_python-1.122.0-cp312-abi3-musllinux_1_2_aarch64.whl (71.9 MB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ ARM64

codex_python-1.122.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (76.7 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ x86-64

codex_python-1.122.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (71.7 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ ARM64

codex_python-1.122.0-cp312-abi3-macosx_11_0_arm64.whl (73.4 MB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

codex_python-1.122.0-cp312-abi3-macosx_10_12_x86_64.whl (80.6 MB view details)

Uploaded CPython 3.12+macOS 10.12+ x86-64

File details

Details for the file codex_python-1.122.0.tar.gz.

File metadata

  • Download URL: codex_python-1.122.0.tar.gz
  • Upload date:
  • Size: 81.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for codex_python-1.122.0.tar.gz
Algorithm Hash digest
SHA256 45b97ae73cb6f303371650ff9fb7be52a62079d76a7b01b3bd66b191e644cf20
MD5 8228bc5c2525a91dcc0bd5ca88358ba2
BLAKE2b-256 88ec05eb4c790e930ee8561c201986ae4696153da04e464b3ff2f53faa8ed746

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.122.0.tar.gz:

Publisher: release-published.yml on gersmann/codex-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codex_python-1.122.0-cp312-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for codex_python-1.122.0-cp312-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 f29fbdccfb922e1e7371435327de22b5b2f48679fcb6c2469de3eb3957aa34f2
MD5 ec538ceb992a152c214027e6ffd1ded1
BLAKE2b-256 0ee91d86867be770346a60d6a6bf29b337e04b25c33531155a5ebee8840aa478

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.122.0-cp312-abi3-win_arm64.whl:

Publisher: release-published.yml on gersmann/codex-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codex_python-1.122.0-cp312-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for codex_python-1.122.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 e5bb5035b38e16f1ec4859c3fdb3a42b151571aa1376b62dcd5183029f41e78e
MD5 f3c67488a13ff166a4e954bd2a3811d8
BLAKE2b-256 047a349e04e9b787a6edff1948ec51a32230cca5eb8e6ff479e40841bfe27b52

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.122.0-cp312-abi3-win_amd64.whl:

Publisher: release-published.yml on gersmann/codex-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codex_python-1.122.0-cp312-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for codex_python-1.122.0-cp312-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e0c152d9a54e1b9d48301ec50b8a91623a820b5c708c7da22ffd59bb96deeb65
MD5 d8ae0e71287c79c2ed168aadc1d69af8
BLAKE2b-256 d775a25153ecb4bf1c180fe5c2d923258379cac62bd383bdb7bea5ca6057fad6

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.122.0-cp312-abi3-musllinux_1_2_x86_64.whl:

Publisher: release-published.yml on gersmann/codex-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codex_python-1.122.0-cp312-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for codex_python-1.122.0-cp312-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 bc27cc4b01950e88a4ea141302b1d5c9034de644b8ac416fcad3763a1d0386bc
MD5 4ec2da464aeec06e3ddcddfa1a47a217
BLAKE2b-256 92b5069cee18d23ba38bf810133d4ba23daac0f8c4fb17ac90ad8412c26ea991

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.122.0-cp312-abi3-musllinux_1_2_aarch64.whl:

Publisher: release-published.yml on gersmann/codex-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codex_python-1.122.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for codex_python-1.122.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ee69050a0dd7140497ec0782eb7737a25aa7025f485283aaed3e3c99a72fd051
MD5 5230294c73e113b387ce3429a056cbd1
BLAKE2b-256 c58954ce3630d2eea9c30777f96dccbd286e58fa6ef0a8992b3ca6da65aa6b12

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.122.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release-published.yml on gersmann/codex-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codex_python-1.122.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for codex_python-1.122.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0a32c18745959b9a2de3ba4c770f0cb09775a89c5c7db1348ea81f20a489bc57
MD5 dd6827bd4c328d39cfa830bddc4abf69
BLAKE2b-256 cc3ab074b22bd2cea8ba8eac08c78cb7c004f399c4af4360b5a87fc97322f2bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.122.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release-published.yml on gersmann/codex-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codex_python-1.122.0-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for codex_python-1.122.0-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 04099e13837a9cf5542f5f68a8525c037b14edd076ff6ea339e26354027d5751
MD5 353ba2ddc0bbfebb11137d2bd90fdd95
BLAKE2b-256 3e727480141d44f2d6f5d83833303fb2d924a5033f4ed48cfec5b41f6c7daa27

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.122.0-cp312-abi3-macosx_11_0_arm64.whl:

Publisher: release-published.yml on gersmann/codex-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file codex_python-1.122.0-cp312-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for codex_python-1.122.0-cp312-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5013978a0a4ee37281126a17c1c002dbcf5baa9b322d8aaa50aa025e4c01c0c9
MD5 89caf385557984f67c37e594db19fa62
BLAKE2b-256 abc6b66356e4956d5298042cab157ae4d8adca2c1b2e27ea112fd64cd672e4e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.122.0-cp312-abi3-macosx_10_12_x86_64.whl:

Publisher: release-published.yml on gersmann/codex-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page