fix(auth): SubjectTokenProviderError drops response and duplicates error message in workload identity providers
メンテナーはふだん 1 日以内に返信
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 86/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- python
調査の方向性
src/openai/auth/_workload.py から始め、k8s_service_account_token_provider、azure_managed_identity_token_provider、gcp_id_token_provider の例外処理を確認してください。上記で説明されているモック HTTP 500 レスポンスで問題を再現し、その後、SubjectTokenProviderError がレスポンスを保持し、重複したメッセージと冗長な例外チェーンを回避することを検証してください。
索引モデルが issue の本文から書いたものです。
説明
Confirm this is an issue with the Python library and not an underlying OpenAI API
- This is an issue with the Python library
Describe the bug
In src/openai/auth/_workload.py, the built-in workload identity subject token providers (azure_managed_identity_token_provider(), gcp_id_token_provider(), and k8s_service_account_token_provider()) catch their own intentionally raised SubjectTokenProviderError exceptions inside generic except Exception as e: blocks.
This leads to two issues:
- Lost
responseproperty:SubjectTokenProviderErrordefines aresponse: httpx2.Response | Noneattribute. The provider functions explicitly passresponse=responsewhen the metadata server returns an error status (response.is_error) or an empty body. However, the outerexcept Exception as e:intercepts this error (asSubjectTokenProviderErrorinherits fromOpenAIError->Exception) and instantiates a brand newSubjectTokenProviderError(...)without passingresponse, settingerr.responsetoNone. Callers attempting to inspecterr.responsefor headers, status codes, or error details receiveNone. - Duplicated error message prefixes: The re-wrapped exception message duplicates the prefix (e.g.
"Failed to fetch Azure subject token from IMDS: Failed to fetch Azure subject token from IMDS: HTTP 500"). - Redundant exception nesting: A
SubjectTokenProviderErroris chained as the__cause__of an identicalSubjectTokenProviderError.
To Reproduce
Steps:
- Initialize
azure_managed_identity_token_provider()orgcp_id_token_provider()with anhttp_clientmock returning an HTTP 500 (or non-200) error. - Call
provider["get_token"](). - Catch
SubjectTokenProviderErrorand inspecterr.responseandstr(err).
Code snippets
import httpx2
from openai.auth._workload import azure_managed_identity_token_provider
from openai._exceptions import SubjectTokenProviderError
mock_client = httpx2.Client(
transport=httpx2.MockTransport(lambda req: httpx2.Response(500, text="Internal Server Error"))
)
provider = azure_managed_identity_token_provider(http_client=mock_client)
try:
provider["get_token"]()
except SubjectTokenProviderError as err:
print(f"err.response is: {err.response}") # Actual: None | Expected: <Response [500]>
print(f"Error message: {err}")
print(f"err.__cause__: {repr(err.__cause__)}")
Actual Output:
err.response is: None
Error message: Failed to fetch Azure subject token from IMDS: Failed to fetch Azure subject token from IMDS: HTTP 500
err.__cause__: SubjectTokenProviderError('Failed to fetch Azure subject token from IMDS: HTTP 500')
Expected Output:
err.response should retain the <Response [500 Internal Server Error]> object attached when the initial SubjectTokenProviderError was raised, and the error message should not contain duplicated prefixes.
Proposed fix
In src/openai/auth/_workload.py:
In k8s_service_account_token_provider, azure_managed_identity_token_provider, and gcp_id_token_provider, re-raise SubjectTokenProviderError before the generic except Exception block:
except SubjectTokenProviderError:
raise
except Exception as e:
raise SubjectTokenProviderError(f"...: {e}") from e
OS
All platforms (cross-platform library error handling)
Python version
Python 3.10+
Library version
openai v1.x / latest main
- 主要言語
- Python
- スター
- 31.8k
- フォーク
- 7.3k
- 平均マージ
- 1日 3時間
- マージ済み PR(30日)
- 128
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
openai/openai-python のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
openai/openai-python#4022 · コメント 6 件 ·
メンテナーはふだん 1 日以内に返信
-
Querystring drops explicit empty-string scalar values対応中かも @sylvesterkaczmarek が 28 日前に担当しました。 オープンsdk-breaking-change v4
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
openai/openai-python#3837 ·
メンテナーはふだん 1 日以内に返信
-
Define + export `ServiceTiers` string literal対応中かも @SparshGarg999 が 54 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
openai/openai-python#3556 · コメント 3 件 ·
メンテナーはふだん 1 日以内に返信
-
Empty OPENAI_BASE_URL prevents fallback to default API endpoint対応中かも @Sehastrajit-S が 21 日前に担当しました。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
openai/openai-python#2927 · コメント 7 件 ·
メンテナーはふだん 1 日以内に返信
-
Realtime API Pydantic Models incomplete for RealtimeResponseStatus type対応中かも @LuminaX-alt が 434 日前に担当しました。 オープンbug openapi
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
openai/openai-python#2502 · コメント 7 件 ·
メンテナーはふだん 1 日以内に返信
openai/openai-python の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
RedHatQE/mtv-api-tests#721 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1〜3時間 初心者へのやさしさ 85/100
pytest-dev/pluggy#757 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1〜3時間 初心者へのやさしさ 85/100
NousResearch/hermes-agent#134960 ·
メンテナーはふだん 1 日以内に返信
-
HTML backend: `<br>` leaks the internal sentinel U+E000 into list items, headings and captions対応中かも @morten-lagabote が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 67/100
docling-project/docling#4671 ·
メンテナーはふだん 1 日以内に返信