feat(api)!: migrate to HTTPX2 - #3594
Conversation
Castiron-Internal-PR: openai/openai-python-internal#19 Castiron-Source-SHA: 4e6fde5c2ff2e0ddcf7a6421317ad8af3f20f46c Castiron-Public-Base-SHA: ea17fda
OkTest Summary❌ Failed for Python SDK PR #3594. SDK merge ( |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2e4a69261f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| AIOHTTP_EXC_MAP = { | ||
| aiohttp.ServerTimeoutError: httpx.TimeoutException, | ||
| aiohttp.SocketTimeoutError: httpx.ReadTimeout, | ||
| aiohttp.ClientConnectionError: httpx.ConnectTimeout, |
There was a problem hiding this comment.
Map generic aiohttp connection failures as connect errors
When DefaultAioHttpClient encounters a refused connection, DNS failure, or proxy connection failure, aiohttp raises a ClientConnectorError, which first matches its ClientConnectionError base here and is mapped to ConnectTimeout. The later ConnectError/ProxyError mappings cannot replace it because those exception classes are siblings of ConnectTimeout, while the selection logic only replaces a mapping with a subclass. Consequently, the SDK reports ordinary connection failures as APITimeoutError rather than APIConnectionError; map the broad base to ConnectError or prioritize the most specific source exception.
Useful? React with 👍 / 👎.
jbeckwith-oai
left a comment
There was a problem hiding this comment.
The SDK implementation and package validation look clean, but two first-party rollout gates are still broken on this exact head:
- Detect Agents SDK regressions fails with 38 mypy errors in
openai-agents-python. The HTTPX2 type migration changesAsyncClient,URL, request, response, and SDK exception surfaces out from under that consumer. Please coordinate/update the Agents SDK (or otherwise stage the major-version rollout) so this regression gate is green before merging. - The linked OkTest run cannot start the Python bridge. Its image still installs a hard-coded legacy
httpxdependency set, then installs this wheel with--no-deps, sohttpx2is absent at runtime and the bridge never becomes healthy. Please update the OkTest Python harness/dependency installation for this new default and rerun it successfully.
I audited the complete 165-file diff, surrounding transport/provider/error/response paths, generated surfaces, vendored attribution, security-sensitive TLS/proxy/auth behavior, and file-size thresholds. Locally, lint/mypy/import checks, wheel build, Python-policy validation, Bedrock-wheel validation, HTTPX2-only/aiohttp/isolated legacy-wheel validation, and 486 focused transport/client/provider tests all pass. No file crossed the 1k-line threshold. Once the two integration gates above are green, I did not find another blocker.
Makes HTTPX2 the default HTTP client for the next major Python SDK release. See the HTTPX Migration Guide for complete customer-facing migration instructions.
Customer migration
OpenAI()andAsyncOpenAI()use HTTPX2 automatically; API calls, parsed responses, streaming, retries, authentication, and numeric timeouts retain their existing interfaces.pip install openaiinstalls HTTPX2 instead of HTTPX. Applications importinghttpxthrough the SDK's former transitive dependency must migrate tohttpx2or installhttpxexplicitly.certifi. This can break certificate verification even with the default client; configure the system trust store,SSL_CERT_FILE,SSL_CERT_DIR, or a customssl.SSLContextas needed.openai[aiohttp]andDefaultAioHttpClient()remain supported through an HTTPX2-native transport without installing HTTPX orhttpx-aiohttp.httpx.Client,httpx.AsyncClient, andhttpx-aiohttpclients remain supported when passed throughhttp_client. This compatibility is runtime-only; legacy clients are not supported by static type checkers such as mypy or Pyright. Legacy HTTPX support is provided as a migration aid and may be discontinued.See httpx2.md for examples and detailed migration cases.
Implementation notes
Vendored dependencies
We've vendored a few dependencies in so that we can avoid installing
httpxby default for both normal dependencies and dev dependencies. This was the fastest path to unblock migration; we are happy to upstreamthese changes if it makes sense for those package's dependencies.
tests/respx2so existing request-mocking tests work without HTTPX.aiohttpbringing inhttpxby default for now.Issues