feat(agent_registry): the Console code snippet uses AgentRegistry(project=...).published_skills.get(name=...), which does not exist in ADK
- Dominant language
- Python
- Stars
- 21.5k
- Forks
- 4k
- Avg merge
- 1d 14h
- Merged PRs (30d)
- 37
Description
## 🔴 Required Information
### Is your feature request related to a specific problem?
The Google Cloud Console (Agent Registry > Skill Registry > skill detail page) shows a Python code snippet for using a published skill with ADK. The same snippet is also shipped inside every published skill archive as `COPYTOREPOTOUSE.txt`. It looks like this (project/skill from our catalog):
```python
from google.adk.agents.llm_agent import LlmAgent
from google.adk.integrations.agent_registry import AgentRegistry
from google.adk.tools import skill_toolset
PROJECT_ID = "my-project"
LOCATION = "global"
SKILL_NAME = "projects/my-project/locations/global/skills/cloud.google.com-google-cloud-networking-observability"
agent_registry = AgentRegistry(project=PROJECT_ID, location=LOCATION)
skill = agent_registry.published_skills.get(name=SKILL_NAME)
skill_tools = skill_toolset.SkillToolset(skills=[skill])
root_agent = LlmAgent(
model="gemini-3.6-flash",
name="sample_agent",
instruction="Use the tools you have access to help answer user questions",
tools=[skill_tools],
)
```
This snippet cannot run on any released `google-adk` (checked 2.9.1 and `main` @ 3a06a862):
- `AgentRegistry.__init__` takes `project_id`, `location`, `header_provider`; `project=` raises `TypeError`.
- `AgentRegistry` has no `published_skills` attribute. Nothing named `published_skills` exists in the package, the tests, the samples, or the git history of any branch. `AgentRegistry` only covers MCP servers, A2A agents and model endpoints; the adk.dev Agent Registry page documents the same surface and does not mention skills.
- Skills are handled by a separate class, `google.adk.integrations.skill_registry.GCPSkillRegistry`, whose `get_skill()` is `async`, takes a bare skill id rather than a full resource name, and currently rejects every Google-published skill id (#7136) and fails on the media-download redirect (#6908 / #6824).
So a developer who copies the snippet from the Console gets a `TypeError` on the first line, and the nearest working alternative does not work for Google-published skills either. We hit this the day Skill Registry launched and it is still the case today.
### Describe the Solution You'd Like
Make the Console snippet true, i.e. add a synchronous, resource-name based skill accessor on `AgentRegistry` that returns a `google.adk.skills.models.Skill` ready to be passed to `SkillToolset(skills=[...])`:
```python
registry = AgentRegistry(project_id="my-project", location="global")
skill = registry.published_skills.get(
name="projects/my-project/locations/global/skills/cloud.google.com-google-cloud-networking-observability"
)
SkillToolset(skills=[skill])
```
Suggested semantics:
- `published_skills.get(name=)` fetches the skill metadata, follows the `?alt=media` redirect for the default revision, and returns a `Skill` (same loader as `GCPSkillRegistry`). A `list(...)` / `search(query=...)` pair on the same namespace would mirror the existing `list_mcp_servers` / `search_mcp_servers` / `list_agents` / `search_agents` methods.
- Accepting the full resource name sidesteps the id-validation problem in #7136: the id is not interpolated into a URL by the client, so only "is this a well-formed `projects/*/locations/*/skills/*` name" needs checking.
- Synchronous, like the rest of `AgentRegistry`, so it can be used at module import time in `agent.py` (the snippet's use case). `GCPSkillRegistry` stays the async registry for `SkillToolset(registry=...)`.
- Either accept `project=` as an alias of `project_id`, or fix the snippet; whichever is easier, but today the two disagree.
### Impact on your work
We build agents on Agent Engine that consume Google-published skills from Agent Registry. The Console tells users to write code that does not exist, and the alternative path is blocked by two other bugs, so there is currently no way to use a Google-published skill from ADK at all. Not blocking a launch, but it has been confusing since the Skill Registry launch and it is the first thing a new user of the feature runs into.
### Willingness to contribute
Yes, I can send a PR for the `AgentRegistry` side once the maintainers confirm the intended shape (the Console/template side is presumably owned by another team; happy to have this routed there as well).
---
## 🟡 Recommended Information
### Describe Alternatives You've Considered
- `GCPSkillRegistry.get_skill(name=)` + `SkillToolset(skills=[skill])`: async, so it needs `asyncio.run` at import (which fails under `adk run` / `adk web` because the module is imported inside a running loop), and it is blocked by #7136 and #6824 for Google-published skills.
- `SkillToolset(registry=GCPSkillRegistry(...))` with `search_skills` at runtime: Google-published skills are filtered out of the results (#7136), and it costs an extra model turn per conversation (#7130 / #7135).
### Additional Context
- `google-cloud-agentregistry` 0.1.0 on PyPI (2026-07-08) is an empty placeholder package (no services), so there is no other public SDK that provides `published_skills` either.
- Related: #7136 (dotted ids rejected), #6908 / #6824 (redirect), #7130 / #7135 (pinning registry skills).
Contributor guide
Research direction
Read google.adk.integrations.agent_registry.AgentRegistry and google.adk.integrations.skill_registry.GCPSkillRegistry, then inspect the related tests and samples mentioned in the issue. Compare their loading and async behavior, and confirm the intended API with maintainers. Done means the Console snippet works with a full skill resource name, including metadata and media loading, with tests covering the supported behavior.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- gcp, python
- Domain
- ai, api
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100