oauth-codex
OAuth PKCE-based Python SDK for the Codex backend.
Highlights
- Resource-style clients:
ClientandAsyncClient - OAuth PKCE only, with interactive login and automatic token refresh
- OpenAI-style
chat.completions.create(...) - Lower-level
responses.create(...),responses.parse(...), andresponses.stream(...) - Callable tool loop helpers via
client.beta.chat.completions.run_tools(...)
Installation
pip install oauth-codex
Requires Python 3.11 or newer.
Quick Start
Synchronous Client
from oauth_codex import Client
client = Client()
client.authenticate()
completion = client.chat.completions.create(
model="gpt-5.3-codex",
messages=[{"role": "user", "content": "Hello from oauth-codex"}],
)
print(completion.choices[0].message.content)
Asynchronous Client
import asyncio
from oauth_codex import AsyncClient
async def main():
client = AsyncClient()
await client.authenticate()
completion = await client.chat.completions.create(
model="gpt-5.3-codex",
messages=[{"role": "user", "content": "Hello async"}],
)
print(completion.choices[0].message.content)
asyncio.run(main())
Authentication
This SDK uses OAuth PKCE only. API keys are not supported.
client = Client()
client.authenticate()
On first authentication, the SDK prints an authorization URL, waits for the browser sign-in flow, and asks you to paste the localhost callback URL back into the terminal. Tokens are stored locally and refreshed automatically on later requests.
Main API Surface
Chat Completions
response = client.chat.completions.create(
model="gpt-5.3-codex",
messages=[{"role": "user", "content": "Write a sorting function"}],
)
print(response.choices[0].message.content)
Responses Resource
response = client.responses.create(
model="gpt-5.3-codex",
input=[{"role": "user", "content": "Analyze this code snippet."}],
)
print(response.output_text)
Streaming
for event in client.responses.stream(
model="gpt-5.3-codex",
input=[{"role": "user", "content": "Say hello in three words"}],
):
if event.type == "text_delta" and event.delta:
print(event.delta, end="", flush=True)
Structured Output
from pydantic import BaseModel
class Summary(BaseModel):
title: str
score: int
response = client.responses.parse(
model="gpt-5.3-codex",
input=[{"role": "user", "content": "Return JSON with title and score"}],
response_format=Summary,
)
print(response.parsed)
Tool Execution
def add(a: int, b: int) -> int:
return a + b
completion = client.beta.chat.completions.run_tools(
model="gpt-5.3-codex",
messages=[{"role": "user", "content": "What is 2 + 3?"}],
tools=[add],
)
print(completion.choices[0].message.content)
Available Namespaces
client.chat.completionsclient.responsesclient.filesclient.vector_storesclient.vector_stores.filesclient.vector_stores.file_batchesclient.modelsclient.beta.chat.completions
AsyncClient exposes the same namespaces with async methods.
Removed In 4.0
authenticate_on_initgenerate,agenerate,stream,astream- legacy
OAuthCodexClientandAsyncOAuthCodexClient - module-level proxy usage such as
oauth_codex.responses.create(...)
Error Handling
The package exports OpenAI-style exception classes such as AuthenticationError, RateLimitError, APIConnectionError, and APIStatusError.
Documentation
- English:
docs/en/index.md - Korean:
docs/ko/index.md
Development
pip install -e .[dev]
pytest -q
python -m build
Changelog
Metadata
Release files for oauth-codex 4.0.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 | |
|---|---|---|---|
| oauth_codex-4.0.0.tar.gz | 35.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| oauth_codex-4.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 80.7 kB
Release files / oauth_codex-4.0.0.tar.gz
| Download URL | oauth_codex-4.0.0.tar.gz |
|---|---|
| Size | 35.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8288a08bdfc05174e32fad76a6c0f832ea5df178b8907bea5c861a8116213972
|
|
BLAKE2b-256 checksum How to use checksums |
609bdab1d6f4d1a9554e4ac094de489e15a8bc24284deaa184bd2963db8998ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 10, 2026.
Transparency logRelease files / oauth_codex-4.0.0-py3-none-any.whl
| Download URL | oauth_codex-4.0.0-py3-none-any.whl |
|---|---|
| Size | 45.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ccf872d8929b23b624c4dc75aa9718f927e31e86438107bc4217f4d4986913c6
|
|
BLAKE2b-256 checksum How to use checksums |
f5d341a42a8d90b850d55bfe8b75ea58b56cd46250659a55f6b72b9d7530ec0c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 10, 2026.
Transparency log