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.141.0.tar.gz (94.9 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.141.0-cp312-abi3-win_arm64.whl (100.2 MB view details)

Uploaded CPython 3.12+Windows ARM64

codex_python-1.141.0-cp312-abi3-win_amd64.whl (87.0 MB view details)

Uploaded CPython 3.12+Windows x86-64

codex_python-1.141.0-cp312-abi3-musllinux_1_2_x86_64.whl (102.6 MB view details)

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

codex_python-1.141.0-cp312-abi3-musllinux_1_2_aarch64.whl (96.1 MB view details)

Uploaded CPython 3.12+musllinux: musl 1.2+ ARM64

codex_python-1.141.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (102.4 MB view details)

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

codex_python-1.141.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (95.9 MB view details)

Uploaded CPython 3.12+manylinux: glibc 2.17+ ARM64

codex_python-1.141.0-cp312-abi3-macosx_11_0_arm64.whl (92.7 MB view details)

Uploaded CPython 3.12+macOS 11.0+ ARM64

codex_python-1.141.0-cp312-abi3-macosx_10_12_x86_64.whl (99.8 MB view details)

Uploaded CPython 3.12+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: codex_python-1.141.0.tar.gz
  • Upload date:
  • Size: 94.9 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.141.0.tar.gz
Algorithm Hash digest
SHA256 0645257a82073eafac6ae729486d1eaa37e1ed165552a0fb20b6674bede00db8
MD5 3b8120d3bf435927260c2d181dda57a8
BLAKE2b-256 47f05b125d450bbbdb92328fdf72aeb2b1264c3af34e571fa2466144033465e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.141.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.141.0-cp312-abi3-win_arm64.whl.

File metadata

File hashes

Hashes for codex_python-1.141.0-cp312-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 726bbba8f0e18ddc4e2c7e433732388dd22aa97df18b56a9e3614c2f6d3ec565
MD5 f4d5e09a99ad91d6347f2d2f118b37d6
BLAKE2b-256 bfa23c98ae0011f08007374d9e0460d360d5977ee3d0ab3df3ad38ea4cc66e5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.141.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.141.0-cp312-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for codex_python-1.141.0-cp312-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 1748f117b1d1696570c3ff8c7f6d37b99b20b9375fc4cb4a28874e7538ffa804
MD5 c11d60a4cf14d991ef19f123b6e67c77
BLAKE2b-256 66aaa50806588743fdd0dff216dc05f0bcf17194d299199523d061afe390c872

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.141.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.141.0-cp312-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for codex_python-1.141.0-cp312-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7b5ada69f213db8a92db1a18bf92eb45d1be26f2866e23e6e2b63f9eb44547d2
MD5 05ee1c84516942a82c31b684e68f198a
BLAKE2b-256 72d959f62bac725a701bb063247b26462e5304870ab99dea6a0c6ce609e26c20

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.141.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.141.0-cp312-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for codex_python-1.141.0-cp312-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 d5722054bf607828716bdbe27fd475a1fc34dae590b4f68e6ee361f38045f53b
MD5 289b923bc8d93e1c763e979df732db75
BLAKE2b-256 7681b9450d5ce2f70903b3063df2a0899f350c1edc5ead1f4acc8aac4d248e73

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.141.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.141.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for codex_python-1.141.0-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 050ff65b6c8854e608caa51a38764c07b151706a0a28b264f042e31fa5401f65
MD5 91bdbabeac4940d50c03ab085533016a
BLAKE2b-256 cd70b514ad5f39da5e8ff32aa45f50d24634a1f7f90d83cb15e8d4660fc96c85

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.141.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.141.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for codex_python-1.141.0-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 545527f98884c800db4a3fa8b71124e4f5b9a75d5603d942691926727df3d6a3
MD5 ffd84d3d863d4b6fb46d721b78782710
BLAKE2b-256 1feff3775bba8792a938c94ab90782a0169146fed1bdd87d02acb517a8f0536e

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.141.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.141.0-cp312-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for codex_python-1.141.0-cp312-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c7ca7c432ad55ad58567462bd5163818d27da2b5742ed519d0c9709673f7f442
MD5 0b1aa1a25e4ffd2244203d462ac4aee1
BLAKE2b-256 0a1eb29c25f1ac4b1c62a7ec0b596ca5612a2cec37dbba5d94115795629485c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.141.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.141.0-cp312-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for codex_python-1.141.0-cp312-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 66f9c53082d7745474f83379e1fd84cc848dc0ec615a542383bf3336cbc1a229
MD5 4d5470f212e21efecb90c94ec731239e
BLAKE2b-256 65a04c6847885754b5b0c1d796a6be347a0001b1ef1262226335a1867e054ffe

See more details on using hashes here.

Provenance

The following attestation bundles were made for codex_python-1.141.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