Skip to main content

DSPy integration for ChatGPT Codex subscription-backed language models

Project description

dspy-codex-auth

DSPy integration for using ChatGPT/Codex subscription credentials as a DSPy language model.

This package is intentionally narrow:

  • It includes ChatGPT/Codex OAuth login, token refresh, and Pi-compatible credential storage.
  • It installs a DSPy LM wrapper for codex/... model strings.
  • It fixes Codex Responses streaming shapes that DSPy 3.2 cannot parse from the current Codex backend response stream.

Install

uv add dspy-codex-auth

Until the first PyPI release is installed in your environment, install from the GitHub repo:

uv add "dspy-codex-auth @ git+https://github.com/hrbatra/dspy-codex-auth.git@main"

Login

If you already have Codex credentials in ~/.pi/agent/auth.json, no extra login is needed.

Otherwise:

uv run python -c "import dspy_codex_auth; dspy_codex_auth.login()"

Basic Usage

import dspy
import dspy_codex_auth

dspy_codex_auth.install()

lm = dspy.LM("codex/gpt-5.5", cache=False)
dspy.configure(lm=lm, adapter=dspy.JSONAdapter())

cache=False is recommended for Codex while iterating because stale DSPy cache entries can preserve old empty-output responses across package upgrades.

Reasoning Summary

Pass reasoning_effort as usual. This package also supports reasoning_summary, which maps to the Responses API reasoning.summary field.

lm = dspy.LM(
    "codex/gpt-5.5",
    cache=False,
    reasoning_effort="medium",
    reasoning_summary="detailed",
)

DSPy predictions expose declared output fields. The lower-level LM history can also include a returned reasoning summary:

summary = lm.history[-1]["outputs"][0].get("reasoning_content")

OpenAI-Style Model String With Codex Auth

If you prefer to keep an openai/... model string and select Codex auth explicitly:

lm = dspy_codex_auth.LM(
    "openai/gpt-5.5",
    auth_provider="codex",
    cache=False,
    reasoning_effort="medium",
    reasoning_summary="detailed",
)

What It Fixes

The ChatGPT Codex backend streams useful output events, but the completed LiteLLM Responses object can arrive with response.output == []. DSPy expects Responses output items to contain final message text, function calls, and reasoning summaries. This package reconstructs those output items from stream events before DSPy parses the response.

It currently handles:

  • response.output_item.done
  • response.output_text.done
  • response.output_text.delta
  • response.reasoning_summary_text.done
  • response.reasoning_summary_text.delta
  • streamed function-call output items

It also strips output-token cap fields that the Codex backend currently rejects:

  • max_tokens
  • max_output_tokens
  • max_completion_tokens

French Example

import dspy
import dspy_codex_auth

dspy_codex_auth.install()

lm = dspy.LM("codex/gpt-5.5", cache=False)
dspy.configure(lm=lm, adapter=dspy.JSONAdapter())


class TranslateFrenchToEnglish(dspy.Signature):
    """Translate the French input into short, natural English."""

    french: str = dspy.InputField(desc="French sentence")
    english: str = dspy.OutputField(desc="Natural English translation")


translator = dspy.Predict(TranslateFrenchToEnglish)
print(translator(french="merci beaucoup").english)

Math Example With Reasoning Summary

import dspy
import dspy_codex_auth

dspy_codex_auth.install()

lm = dspy.LM(
    "codex/gpt-5.5",
    cache=False,
    reasoning_effort="medium",
    reasoning_summary="detailed",
)
dspy.configure(lm=lm, adapter=dspy.JSONAdapter())


class SolveMath(dspy.Signature):
    """Solve the math problem. Return a concise numeric answer and a brief explanation."""

    problem: str = dspy.InputField(desc="Math problem")
    answer: str = dspy.OutputField(desc="Concise final answer")
    explanation: str = dspy.OutputField(desc="Brief explanation")


solver = dspy.Predict(SolveMath)
pred = solver(
    problem=(
        "Compute the integral of the standard normal probability density "
        "function from 0 to 1.5."
    )
)

print(pred.answer)
print(pred.explanation)
print(lm.history[-1]["outputs"][0].get("reasoning_content"))

Attribution

dspy-codex-auth includes and adapts MIT-licensed auth and DSPy integration code from dspy-lm-auth:

https://github.com/MaximeRivest/dspy-lm-auth

The streamed-output reconstruction addresses a DSPy/Codex Responses streaming compatibility issue that was also discussed in dspy-lm-auth PR #2:

https://github.com/MaximeRivest/dspy-lm-auth/pull/2

dspy-lm-auth is MIT-licensed. The original copyright notice is preserved in THIRD_PARTY_NOTICES.md.

Development

uv sync --dev
uv run pytest
uv run ruff check .
uv build --no-sources

Release

Releases are published from GitHub Actions with PyPI Trusted Publishing.

For the first release, create a pending PyPI publisher for:

  • PyPI project: dspy-codex-auth
  • Owner: hrbatra
  • Repository: dspy-codex-auth
  • Workflow: publish.yml
  • Environment: pypi

Then tag and push:

git tag v0.1.0
git push origin v0.1.0

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

dspy_codex_auth-0.1.0.tar.gz (13.9 kB view details)

Uploaded Source

Built Distribution

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

dspy_codex_auth-0.1.0-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

File details

Details for the file dspy_codex_auth-0.1.0.tar.gz.

File metadata

  • Download URL: dspy_codex_auth-0.1.0.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.4

File hashes

Hashes for dspy_codex_auth-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0a53da46456375d861030252e81a1aa35462bbf4e4b029a6bcc68f09bb5f46ea
MD5 1b08502507b116616e5ffa184b4d3cc4
BLAKE2b-256 40d943de50d6ca0a6c6a24b41b066376eace140f6ed82046313ca0ac39c3452d

See more details on using hashes here.

File details

Details for the file dspy_codex_auth-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for dspy_codex_auth-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c32cfda541f9cd04c092c3cf4251e742e1a7d4779e34cc1bd835114af6adf07b
MD5 5c304dde5ec48ebc4091df1c8ff7ba20
BLAKE2b-256 49338552482d64052b5e8f966b30625634303db48ac32e71235c96ab5d0c13d6

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