Skip to main content

Codex OAuth-based Python SDK with resource-style Client and AsyncClient APIs

Project description

English | 한국어

oauth-codex

OAuth PKCE-based Python SDK for the Codex backend.

Highlights

  • Resource-style clients: Client and AsyncClient
  • OAuth PKCE only, with interactive login and automatic token refresh
  • OpenAI-style chat.completions.create(...)
  • Lower-level responses.create(...), responses.parse(...), and responses.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.

By default, oauth-codex stores tokens in the OS keyring when available. If keyring storage fails, it falls back to a per-user file in the platform-native config directory, such as %LOCALAPPDATA%\\oauth-codex\\auth.json on Windows, ~/Library/Application Support/oauth-codex/auth.json on macOS, or ~/.config/oauth-codex/auth.json on Linux. Legacy ~/.oauth_codex/auth.json files are migrated automatically when read.

For deterministic deployments on clean machines, you can control the storage backend explicitly:

  • CODEX_OAUTH_TOKEN_STORE=auto uses keyring first, then file fallback.
  • CODEX_OAUTH_TOKEN_STORE=keyring requires OS keyring storage and fails if keyring is unavailable.
  • CODEX_OAUTH_TOKEN_STORE=file always uses the file backend.
  • CODEX_OAUTH_TOKEN_PATH=/absolute/path/to/auth.json overrides the file location when using file storage or auto fallback.

For headless servers, use CODEX_OAUTH_TOKEN_STORE=file and set CODEX_OAUTH_TOKEN_PATH to a deployment-managed per-user secret path if you do not want keyring-dependent behavior.

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.completions
  • client.responses
  • client.files
  • client.vector_stores
  • client.vector_stores.files
  • client.vector_stores.file_batches
  • client.models
  • client.beta.chat.completions

AsyncClient exposes the same namespaces with async methods.

Removed In 4.0

  • authenticate_on_init
  • generate, agenerate, stream, astream
  • legacy OAuthCodexClient and AsyncOAuthCodexClient
  • 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

Development

pip install -e .[dev]
pytest -q
python -m build

Changelog

CHANGELOG.md

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

flowalto_oauth-4.0.2.tar.gz (39.6 kB view details)

Uploaded Source

Built Distribution

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

flowalto_oauth-4.0.2-py3-none-any.whl (50.9 kB view details)

Uploaded Python 3

File details

Details for the file flowalto_oauth-4.0.2.tar.gz.

File metadata

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

File hashes

Hashes for flowalto_oauth-4.0.2.tar.gz
Algorithm Hash digest
SHA256 84180d9ad37889c0cc833c1693d3399e8d76c8cd18061f70cb5db1af8d77cfe3
MD5 4a3c729bff4e00e54cb315b652799cf4
BLAKE2b-256 ca6d43bb179c9a2644da223412fc50e4f2d1117aa78b952735787e37621f89ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for flowalto_oauth-4.0.2.tar.gz:

Publisher: publish-pypi.yml on flowalto/flowalto-oauth

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

File details

Details for the file flowalto_oauth-4.0.2-py3-none-any.whl.

File metadata

  • Download URL: flowalto_oauth-4.0.2-py3-none-any.whl
  • Upload date:
  • Size: 50.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for flowalto_oauth-4.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 51adb541417ff00bed26006dd13409e82d66cf3019d85cc8d1bf986d26781195
MD5 cd0d192d8c083b5d8f0bfaf9b2a934de
BLAKE2b-256 219fb16e34ea87bfc200b498e4f93d8a4a328e8de29ffee26e078c9e8a057a3d

See more details on using hashes here.

Provenance

The following attestation bundles were made for flowalto_oauth-4.0.2-py3-none-any.whl:

Publisher: publish-pypi.yml on flowalto/flowalto-oauth

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