🔴 Required Information
Describe the Bug:
GcpSkillRegistry.get_skill() always fails when downloading the skill archive. The Agent Registry API serves the revision media download (?alt=media) as a 302 redirect to a short-lived GCS signed URL. The httpx.AsyncClient created in _create_httpx_client does not follow redirects (httpx default), and httpx's response.raise_for_status() raises on 3xx responses, so _make_request surfaces the redirect as an error and the skill archive can never be downloaded:
RuntimeError: API request failed with status 302: ...
This makes skill loading from the GCP Agent Registry (e.g. via SkillToolset.load_skill) unusable against the real API.
Steps to Reproduce:
- Install
google-adk==2.7.1.
- Point
GcpSkillRegistry at an Agent Registry project/location containing any skill.
await registry.get_skill(name="<any-skill>").
- The metadata request succeeds, then the
?alt=media media download fails with the RuntimeError above.
Expected Behavior:
The client follows the 302 redirect to the GCS signed URL and downloads the skill archive. (This is safe: httpx removes the Authorization header when following a cross-origin redirect, so the OAuth bearer token is not forwarded to the signed-URL host.)
Observed Behavior:
RuntimeError: API request failed with status 302: ... raised from _make_request for every skill download.
Environment Details:
Model Information:
- Are you using LiteLLM: No
- Which model is being used: N/A (client-side registry download; no model involved)
Fix
PR #6824 is open with the fix: pass follow_redirects=True to both httpx.AsyncClient constructions in _create_httpx_client (plain and mTLS/ssl-context branches). It includes unit tests and has been verified end-to-end against a real Agent Registry catalog (the identical change applied as a monkey-patch on Agent Engine runtime restores skill downloads).
🔴 Required Information
Describe the Bug:
GcpSkillRegistry.get_skill()always fails when downloading the skill archive. The Agent Registry API serves the revision media download (?alt=media) as a302redirect to a short-lived GCS signed URL. Thehttpx.AsyncClientcreated in_create_httpx_clientdoes not follow redirects (httpx default), and httpx'sresponse.raise_for_status()raises on 3xx responses, so_make_requestsurfaces the redirect as an error and the skill archive can never be downloaded:This makes skill loading from the GCP Agent Registry (e.g. via
SkillToolset.load_skill) unusable against the real API.Steps to Reproduce:
google-adk==2.7.1.GcpSkillRegistryat an Agent Registry project/location containing any skill.await registry.get_skill(name="<any-skill>").?alt=mediamedia download fails with theRuntimeErrorabove.Expected Behavior:
The client follows the 302 redirect to the GCS signed URL and downloads the skill archive. (This is safe: httpx removes the
Authorizationheader when following a cross-origin redirect, so the OAuth bearer token is not forwarded to the signed-URL host.)Observed Behavior:
RuntimeError: API request failed with status 302: ...raised from_make_requestfor every skill download.Environment Details:
Model Information:
Fix
PR #6824 is open with the fix: pass
follow_redirects=Trueto bothhttpx.AsyncClientconstructions in_create_httpx_client(plain and mTLS/ssl-context branches). It includes unit tests and has been verified end-to-end against a real Agent Registry catalog (the identical change applied as a monkey-patch on Agent Engine runtime restores skill downloads).