
2026/08/28 20:51
HTTPX2 への移行
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
OpenAI の Python SDK は、標準の
httpx クライアントを新たな HTTPX2 実装で置き換え、内部ネットワークアーキテクチャを根本的に変更しました。これにより、従来の httpx パッケージを必要とせずに、すべての同期および非同期操作に HTTPX2 が使用されます。以前のバージョンが certifi などの外部パッケージに依存していたのに対し、HTTPX2 はデフォルトでオペレーティングシステムの組み込み信頼ストアを使用します。この変更は、最小限のコンテナ環境やカスタムプロキシを持つ企業ネットワークでの問題を解決しますが、カスタム設定やモッキングライブラリ(例:RESPX)を使用する開発者は、証明書のパスを明示的に設定するか、httpx2 固有のコンポーネントへの移行を行う必要があります。デフォルトの設定は引き続きシームレスに動作しますが、レガシーなクライアントは現在、明示的なインポートによる一時的な移行支援手段としてのみサポートされており、これに依存するチームはコードを能動的に更新する必要があります。レガシーなサポートが終了したら API 呼び出しが壊れる可能性があるため、この移行を無視してはいけません。さらに、すべての HTTPX 固有の詳細オブジェクト(例:Timeout、Transport)および認証ハンドラも、SDK の全体での安定性を確保するために httpx2 の対応物に変更する必要があります。
テキストの翻訳:
Improved Summary: OpenAI's Python SDK has fundamentally shifted its internal network architecture by replacing the standard
httpx client with a new HTTPX2 implementation, which is now used for all synchronous and asynchronous operations without requiring the legacy httpx package. Unlike previous versions that relied on external packages like certifi, HTTPX2 defaults to using your operating system's built-in trust store. This change addresses issues in minimal container environments and corporate networks with custom proxies but requires developers using custom configurations or mocking libraries (like RESPX) to explicitly configure certificate paths or migrate to httpx2-specific components. While default setups continue to work seamlessly, the legacy client is currently supported only as a temporary migration aid via explicit imports; teams relying on it must update their code proactively, as ignoring this transition may result in broken API calls once legacy support is discontinued. Additionally, all granular HTTPX-specific objects (e.g., Timeout, Transport) and authentication handlers must be updated to use their httpx2 counterparts to ensure continued stability across the SDK.本文
OpenAI SDK HTTPX2 移行ガイド
OpenAI Python SDK は今後は、HTTP クライアントに HTTPX2 を採用します。インストール時には自動的に追加され、旧パッケージの
httpx は含まれません。
1. デフォルト設定の変更
SDK の既定値を使用する場合、以下の機能はそのまま動作します:
- API コール、レスポンスモデルのパース、ストリーミング、認証、リトライ、数値型タイムアウト
注意: インストール時に
httpx パッケージが自動的に含まれることはなくなりました。
- 明示的に依存関係として追加するか、
- 既存の
使用箇所をhttpx
に移行してください。HTTPX2
from openai import OpenAI client = OpenAI(timeout=30.0) response = client.responses.create(model="gpt-5.5", input="Hello")
2. TLS 証明書と信頼ストアの変更
デフォルトの TLS 信頼ストアが変更されました:
- 以前:
パッケージによる CA バンドル検証certifi - 現在: オペレーティングシステムの信頼ストアを使用(
は不要)certifi
影響を受ける環境
- システム CA 証明書がない最小限のコンテナイメージ
- 企業用 TLS 検査プロキシを使用する環境
- カスタム
バンドルに依存していたデプロイメントcertifi
対処法
- オペレーティングシステムの証明書をインストールする(推奨)
- 明示的な証明書バンドルを設定する:
export SSL_CERT_FILE=/path/to/ca-bundle.pem
あるいは、CA 証明書ディレクトリを構成:
export SSL_CERT_DIR=/path/to/ca-directory
上記の環境変数は
trust_env=True の設定で有効です。カスタムクライアントでは明示的に指定してください:
import ssl from openai import OpenAI, DefaultHttpx2Client ssl_context = ssl.create_default_context(cafile="/path/to/ca-bundle.pem") client = OpenAI(http_client=DefaultHttpx2Client(verify=ssl_context))
非同期設定の場合は
DefaultAsyncHttpx2Client を使用します。
3. カスタム HTTP クライアントの提供
HTTPX2 クライアントおよび構成オブジェクトを使用してください:
import httpx2 from openai import OpenAI, AsyncOpenAI, DefaultHttpx2Client, DefaultAsyncHttpx2Client # プロキシ設定 proxy_client = OpenAI(http_client=DefaultHttpx2Client(proxy="http://proxy.example.com:8080")) # 交通とタイムアウトの設定 transport_client = OpenAI( http_client=DefaultHttpx2Client( transport=httpx2.HTTPTransport(local_address="0.0.0.0"), timeout=httpx2.Timeout(30.0, connect=5.0), ) ) # 非同期クライアント async_client = AsyncOpenAI(http_client=DefaultAsyncHttpx2Client(timeout=httpx2.Timeout(30.0)))
重要な注意点
- 直接構築した
やhttpx2.Client
もサポートされていますが、HTTPX2 の固有のデフォルト値が適用されることを理解してください。httpx2.AsyncClient
/DefaultHttpxClient
という名前のクラスも機能しますが、明示的に HTTPX2 クライアントを構築するDefaultAsyncHttpxClient
/DefaultHttpx2Client
の使用を推奨します。DefaultAsyncHttpx2Client
モジュールレベルの設定例:
import openai openai.http_client = openai.DefaultHttpx2Client()
4. オブジェクト名の置き換え
HTTPX 固有のオブジェクトは、以下の対応する HTTPX2 オブジェクトに置き換えてください:
| 以前のオブジェクト | HTTPX2 のオブジェクト |
|---|---|
| |
| |
| |
| |
| |
| |
| |
| |
細粒度なタイムアウト設定例
import httpx2 from openai import OpenAI client = OpenAI(timeout=httpx2.Timeout(60.0, connect=5.0, read=20.0))
※数値型タイムアウト値や文字列 URL 形式は変更ありません。
5. 認証とイベントフック
認証ハンドラーとフックは、HTTPX2 の
Request および Response オブジェクトを受け取ります:
import httpx2 from openai import OpenAI, DefaultHttpx2Client def log_request(request: httpx2.Request) -> None: print(request.method, request.url) client = OpenAI(http_client=DefaultHttpx2Client(event_hooks={"request": [log_request]}))
- カスタム認証クラスや注釈も
に対応したインターフェースを使用してください。httpx2 - サードパーティ製ツール(計測、トレーシング、認証統合)は明示的に HTTPX2 をサポートしている必要があります。
6. 生レスポンス、ストリーミング、例外処理
- パースされた SDK レスポンスモデルには変更はありません。
- ネイティブ
クライアントを使用する場合、HTTPX2
およびhttp_response
はhttp_request
の型になります:httpx2
import httpx2 from openai import OpenAI client = OpenAI() response = client.models.with_raw_response.list() assert isinstance(response.http_response, httpx2.Response) assert isinstance(response.http_request, httpx2.Request)
- 未パースの HTTP レスポンスを要求する場合は
を指定してください。cast_to=httpx2.Response - ストリーミングレスポンスラッパーも
オブジェクトを公開します。httpx2.Response - アプリケーションコードでは、通常は
やopenai.APITimeoutError
などの SDK 例外をキャッチすべきです。openai.APIConnectionError - ネイティブクライアントを使用する場合、通信部分の例外は
例外になります。HTTPX2
型保証の注意点 これらの保証はネイティブ
HTTPX2 クライアントにのみ適用されます。従来の httpx をインジェクトした場合、cast_to=httpx2.Response を指定しても httpx のオブジェクトや例外が返される可能性があります。
7. aiohttp サポートの変更
サポートされている
aiohttp アドオンは、HTTPX2 ネイティブの通信部分を備えています:
pip install 'openai[aiohttp]'
from openai import AsyncOpenAI, DefaultAioHttpClient client = AsyncOpenAI(http_client=DefaultAioHttpClient())
は内部でDefaultAioHttpClient()
を使用します。httpx2.AsyncClient- 通信部分を直接構築したりインポートする必要はありません。
8. モックとテスト
モックは必ず HTTPX2 リクエストをインターセプトし、HTTPX2 レスポンスを返す必要があります:
import httpx2 from openai import OpenAI def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response( 200, request=request, json={"object": "list", "data": []}, ) client = OpenAI(http_client=httpx2.Client(transport=httpx2.MockTransport(handler))) assert client.models.list().data == []
RESPX のバージョン更新 テストスイートが
RESPX を使用している場合、HTTPX2 互換のバージョンへ更新してください。従来の httpx のみのパッチ版は既定のクライアントをインターセプトできません。
9. 一時的なエスケープハッチ:従来の HTTPX クライアント
移行期間中のみ、従来の
httpx をインジェクションして使用できます(将来的には終了されます)。
クライアントの指定
from typing import Any, cast import httpx from openai import OpenAI client = OpenAI(http_client=cast(Any, httpx.Client()))
同様に非同期クライアントも:
from typing import Any, cast import httpx from openai import AsyncOpenAI client = AsyncOpenAI(http_client=cast(Any, httpx.AsyncClient()))
生レスポンスの扱い
従来のクライアントを使用する場合、
httpx.Response を使用し、型チェックも httpx のクラスで行ってください:
from typing import Any, cast import httpx from openai import OpenAI client = OpenAI(http_client=cast(Any, httpx.Client())) response = client.get("/models", cast_to=cast(Any, httpx.Response)) assert isinstance(response, httpx.Response)
※
cast_to=httpx2.Response を渡しても変換されません。従来の依存関係を自前でする必要があります。
10. 既存の aiohttp アダプターの維持
既存の
httpx-aiohttp インテグレーションを維持する場合:
pip install openai httpx-aiohttp
from typing import Any, cast from httpx_aiohttp import HttpxAiohttpClient from openai import AsyncOpenAI client = AsyncOpenAI(http_client=cast(Any, HttpxAiohttpClient()))
- この方法は専用互換性テストでカバーされていますが、一時的なエスケープハッチです。
- 新規コードでは
とopenai[aiohttp]
の使用を強く推奨します。DefaultAioHttpClient()