Codex Client
Lightweight Python wrapper for the Codex CLI. Stream chats, handle reasoning/tool events, and build custom MCP tools.
Installation
pip install codex-client
Requires codex executable on your PATH.
Authentication (CLI)
# Login via browser
codex-client login
# Export credentials (copy to another machine)
codex-client read
# Import credentials
codex-client set "<payload>"
# Clear credentials
codex-client logout
Basic Usage
import asyncio
from codex_client import (
AssistantMessageStream,
Client,
CodexChatConfig,
CodexProfile,
ReasoningEffort,
SandboxMode,
)
async def main():
config = CodexChatConfig(
profile=CodexProfile(
model="gpt-5",
reasoning_effort=ReasoningEffort.MINIMAL,
sandbox=SandboxMode.WORKSPACE_WRITE,
)
)
async with Client() as client:
chat = await client.create_chat("Write a Python fibonacci function", config=config)
# Stream responses
async for event in chat:
if isinstance(event, AssistantMessageStream):
async for chunk in event.stream():
print(chunk, end="", flush=True)
# Get final response
final = await chat.get()
print(f"\n\nFinal: {final}")
# Continue conversation
await chat.resume("Now make it recursive")
asyncio.run(main())
Custom Tools
from codex_client import BaseTool, tool
class CalculatorTool(BaseTool):
@tool()
async def add(self, a: float, b: float) -> dict:
"""Add two numbers."""
return {"result": a + b}
@tool()
async def multiply(self, a: float, b: float) -> dict:
"""Multiply two numbers."""
return {"result": a * b}
# Use the tool
async def main():
with CalculatorTool() as calc:
config = CodexChatConfig(
profile=CodexProfile(model="gpt-5"),
mcp_servers=[calc.config()]
)
async with Client() as client:
chat = await client.create_chat("What is 15 + 27?", config=config)
async for event in chat:
if isinstance(event, AssistantMessageStream):
async for chunk in event.stream():
print(chunk, end="", flush=True)
asyncio.run(main())
Authentication (Code)
from codex_client.auth import CodexAuth
auth = CodexAuth()
# Trigger login flow (opens browser)
session = auth.login()
print(f"Visit: {session.url}")
success = session.wait() # Blocks until user completes login
# Or import existing credentials
auth.set("<payload-from-codex-client-read>")
# Verify credentials
token = auth.read()
Examples
See src/examples/ for complete demos:
- Interactive Chat - Multi-turn conversations with streaming
- MCP Transport - HTTP and stdio MCP server connectivity
- Weather Assistant - Custom tool with state management
cd src/examples
uv sync
uv run weather/main.py
Metadata
Release files for codex-client 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| codex_client-0.1.0.tar.gz | 38.2 kB | Without provenance | Details for codex_client-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| codex_client-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for codex_client-0.1.0-py3-none-any.whl |
Total release size: 85.4 kB
Release files / codex_client-0.1.0.tar.gz
| Download URL | codex_client-0.1.0.tar.gz |
|---|---|
| Size | 38.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e510f54725db9f0f0e74e13d5a8bcb5fadc50ba815cc11376fd18322ce8713ee
|
|
BLAKE2b-256 checksum How to use checksums |
f5becd9f9e26d1b541e5c335e19e93abf83952a687bc5c78b15219ce90993834
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Release files / codex_client-0.1.0-py3-none-any.whl
| Download URL | codex_client-0.1.0-py3-none-any.whl |
|---|---|
| Size | 47.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
30da90ac93ae96a5ea6f64f033b8c58f4a8a3ab471c341d0ea062a7b873abbcd
|
|
BLAKE2b-256 checksum How to use checksums |
985bef5c1fb64eb0388ff3554749dd4a6ce437e675e56c32af8356c6541144cb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Security for codex-client 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.