fix(auth): SubjectTokenProviderError drops response and duplicates error message in workload identity providers
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 86/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- python
- Domaine
- authentication
Piste de recherche
Commencez dans src/openai/auth/_workload.py et examinez la gestion des exceptions dans k8s_service_account_token_provider, azure_managed_identity_token_provider et gcp_id_token_provider. Reproduisez le problème avec la réponse HTTP 500 simulée décrite ci-dessus, puis vérifiez que SubjectTokenProviderError conserve la réponse et évite les messages dupliqués ainsi que le chaînage d’exceptions redondant.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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
- Langage dominant
- Python
- Étoiles
- 31.8k
- Forks
- 7.3k
- Merge moyen
- 1 j 3 h
- PR mergées (30 j)
- 131
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de openai/openai-python
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
openai/openai-python#4022 · 8 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Querystring drops explicit empty-string scalar valuesPeut-être pris @sylvesterkaczmarek l’a pris il y a 29 jours. Ouvertesdk-breaking-change v4
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
openai/openai-python#3837 ·
Les mainteneurs répondent en général sous 1 jour
-
Define + export `ServiceTiers` string literalPeut-être pris @SparshGarg999 l’a pris il y a 55 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
openai/openai-python#3556 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Empty OPENAI_BASE_URL prevents fallback to default API endpointPeut-être pris @Sehastrajit-S l’a pris il y a 21 jours. Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
openai/openai-python#2927 · 6 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Realtime API Pydantic Models incomplete for RealtimeResponseStatus typePeut-être pris @LuminaX-alt l’a pris il y a 435 jours. Ouvertebug openapi
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
openai/openai-python#2502 · 7 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de openai/openai-python
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
pyjanitor-devs/pyjanitor#1758 ·
Les mainteneurs répondent en général sous 1 jour
-
bug ready for review
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
odysseus-dev/odysseus#6641 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
happypawspillaro/happypaws#78 ·
Les mainteneurs répondent en général sous 4 jours
-
pydanty:is-working
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
pydantic/pydantic-ai#10020 ·
Les mainteneurs répondent en général sous 1 jour
-
stdlib type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
python/cpython#159044 · 4 commentaires ·
Les mainteneurs répondent en général sous 1 jour