Skip to main content

Python wrapper for Codex app-server JSON-RPC interface

Project description

codex-python-sdk

GitHub | English | 简体中文 | Docs

Production-focused Python SDK for running Codex agents through codex app-server.

codex-python-sdk gives you a stable Python interface over Codex JSON-RPC so you can automate agent workflows, stream structured runtime events, and enforce runtime policy from your own applications.

Why This SDK

  • Script-first API: built for automation pipelines, not only interactive CLI sessions.
  • Sync + async parity: same mental model and similar method names in both clients.
  • Structured streaming: consume normalized ResponseEvent objects for observability and UI.
  • Predictable failures: explicit error types such as NotAuthenticatedError and SessionNotFoundError.
  • Policy control: approval/file-change/tool-input/tool-call hooks and policy engine integration.
  • Thin protocol wrapper: close to codex app-server behavior, easier to reason about and debug.

30-Second Quick Start

from codex_python_sdk import create_client

with create_client() as client:
    result = client.responses_create(prompt="Reply with exactly: READY")
    print(result.session_id)
    print(result.text)

Core Workflows

Stream events (for logs/UI)

from codex_python_sdk import create_client, render_exec_style_events

with create_client() as client:
    events = client.responses_events(prompt="Summarize this repository")
    render_exec_style_events(events)

Async flow

import asyncio
from codex_python_sdk import create_async_client


async def main() -> None:
    async with create_async_client() as client:
        result = await client.responses_create(prompt="Reply with exactly: ASYNC_READY")
        print(result.text)


asyncio.run(main())

Smoke and demo runner

# Quick health check (default mode)
codex-python-sdk-demo --mode smoke

# Stable API showcase
codex-python-sdk-demo --mode demo

# Demo + unstable remote/interrupt/compact paths
codex-python-sdk-demo --mode full

Note: the demo runner uses explicit permissive hooks (accept for command/file approvals and empty tool-input answers) so it can run unattended. The SDK defaults are now fail-closed; keep permissive behavior explicit in demos and automation.

Mental Model: How It Works

codex app-server is Codex CLI's local JSON-RPC runtime over stdio.

One responses_create(prompt=...) call is essentially:

  1. create_client() creates a sync facade (CodexAgenticClient).
  2. Sync call forwards to AsyncCodexAgenticClient via a dedicated event-loop thread.
  3. connect() starts codex app-server and performs initialize/initialized.
  4. _request(method, params) handles all JSON-RPC request/response plumbing.
  5. responses_events() streams notifications; responses_create() aggregates them into final text.

For a deeper walkthrough, see docs/core_mechanism.md.

Safety Defaults (Important)

Default behavior without hooks/policy:

  • Command approval: decline
  • File change approval: decline
  • Permissions approval: empty grant with turn scope
  • MCP elicitation: decline
  • Tool user input: empty answers
  • Tool call: failure response with explanatory text

This is production-safer by default, but may block unattended workflows unless you opt into looser hooks.

Recommended setup: rely on native automatic approval review and keep local policy deterministic.

from codex_python_sdk import RuleBasedPolicyEngine, create_client

engine = RuleBasedPolicyEngine(
    {
        "system_rubric": "Allow read-only operations. Decline unknown write operations.",
        "command_rules": [
            {"name": "readonly-shell", "when": {"command_regex": r"^(pwd|ls|cat|rg)\\b"}, "decision": "accept"}
        ],
        "defaults": {"command": "decline", "file_change": "decline", "tool_input": "auto_empty"},
    }
)

with create_client(
    automatic_approval_review=True,
    policy_engine=engine,
) as client:
    result = client.responses_create(prompt="Show git status.")
    print(result.text)

automatic_approval_review=True enables the runtime's native approval reviewer (guardian_approval).

Recommended default operating mode for most repository automation:

  • automatic_approval_review=True
  • thread sandbox remains workspace-write
  • thread approval policy remains on-request

This gives the agent writable access inside the workspace while keeping sandboxing and approval flows intact. It is usually the right default for coding agents that only need to read and write within the current repo.

Do not treat this as equivalent to bypass mode:

  • danger-full-access removes sandbox restrictions for command execution
  • --dangerously-bypass-approvals-and-sandbox skips both approvals and sandbox protections

Those higher-permission modes should stay explicit opt-ins for externally sandboxed or highly trusted environments.

Install

Prerequisites

  • Python 3.9+ (recommended: 3.12)
  • uv (recommended for development workflows)
  • codex CLI installed and runnable
  • Authentication completed via codex login

Install from PyPI

uv add codex-python-sdk
uv run codex-python-sdk-demo --help

or

pip install codex-python-sdk
codex-python-sdk-demo --help

Developer setup (for contributors)

./uv-sync.sh

This bootstraps a local .venv and installs project/test/build dependencies.

API Snapshot

Factory:

  • create_client(**kwargs) -> CodexAgenticClient
  • create_async_client(**kwargs) -> AsyncCodexAgenticClient

Important runtime kwargs:

  • automatic_approval_review=True
  • enabled_features=[...] / disabled_features=[...]
  • enable_web_search as a compatibility alias for web_search="live"

High-frequency response APIs:

  • responses_create(...) -> AgentResponse
  • responses_events(...) -> Iterator[ResponseEvent] / AsyncIterator[ResponseEvent]
  • responses_stream_text(...) -> Iterator[str] / AsyncIterator[str]

Thread basics:

  • thread_start, thread_read, thread_list, thread_archive

Runtime discovery:

  • experimental_feature_list(limit=None, cursor=None)

Account basics:

  • account_read, account_rate_limits_read

Documentation Map

English:

  • docs/tutorial.md: practical workflows and end-to-end usage
  • docs/core_mechanism.md: architecture-level core control flow
  • docs/config.md: server/thread/turn configuration model
  • docs/api.md: full API reference (sync + async)
  • docs/policy.md: hooks and policy engine integration
  • docs/app_server.md: app-server concepts and protocol mapping

简体中文:

  • docs/zh/tutorial.md
  • docs/zh/core_mechanism.md
  • docs/zh/config.md
  • docs/zh/api.md
  • docs/zh/policy.md
  • docs/zh/app_server.md

Notes

  • After AppServerConnectionError, recreate the client instead of relying on implicit reconnect behavior.
  • Internal app-server stderr buffering keeps only the latest 500 lines in SDK-captured diagnostics.
  • review_start(...) is for code review flows; it is not the same feature as runtime approval review.
  • Invalid command/file policy decision values (allowed: accept, acceptForSession, decline, cancel) raise CodexAgenticError.

Development

./uv-sync.sh
uv run python3 -m pytest -q -m "not real"

Release

# Default: test + build + twine check (no upload)
./build.sh

# Build only
./build.sh build

# Release to pypi (upload enabled explicitly)
TWINE_UPLOAD=1 ./build.sh release --repo pypi

# Release to testpypi
TWINE_UPLOAD=1 ./build.sh release --repo testpypi

# Upload existing artifacts only
./build.sh upload --repo pypi

# Help
./build.sh help

Recommended upload auth: ~/.pypirc with API token.

Project Layout

  • codex_python_sdk/: SDK source code
  • codex_python_sdk/examples/: runnable demo code
  • tests/: unit and real-runtime integration tests
  • uv-sync.sh: dev environment bootstrap
  • build.sh: build/release script

Error Types

  • CodexAgenticError: base SDK error
  • AppServerConnectionError: app-server transport/setup failure
  • SessionNotFoundError: unknown thread/session id
  • NotAuthenticatedError: auth unavailable or invalid

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_sdk-0.2.0.tar.gz (48.4 kB view details)

Uploaded Source

Built Distribution

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

codex_python_sdk-0.2.0-py3-none-any.whl (33.5 kB view details)

Uploaded Python 3

File details

Details for the file codex_python_sdk-0.2.0.tar.gz.

File metadata

  • Download URL: codex_python_sdk-0.2.0.tar.gz
  • Upload date:
  • Size: 48.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for codex_python_sdk-0.2.0.tar.gz
Algorithm Hash digest
SHA256 841aa44bc63a25e8633dd1867507c13df49a031726df791b554d0dc09e1dca54
MD5 8171a34dd62f0afd636d20924fb4dd0a
BLAKE2b-256 8442a57debe56518c2cd67b6112e2560a461651fd8c8a56f7ccf20485d3237f0

See more details on using hashes here.

File details

Details for the file codex_python_sdk-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for codex_python_sdk-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a442952e016519bcf60c5dccb6f3bd696fa3f787a723ff813eaef24db321be78
MD5 aee784351e6b4715e6a32b3a92c6f4ef
BLAKE2b-256 d82b455c3685c294ec8cc6d37a40e90a1db56a4982a12350678fa8c5fb88595e

See more details on using hashes here.

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