Repository navigation
[bug] Fresh pip install google-adk per docs leaves adk web without the chat UI (undeclared deps: google-cloud-storage, python-multipart) #5787
Description
[bug] Fresh pip install google-adk per docs leaves adk web without the chat UI (undeclared deps: google-cloud-storage, python-multipart)
TL;DR
Following the official install instructions at https://adk.dev/get-started/installation/ (just pip install google-adk) on Python 3.13 produces a working adk run CLI but a silently degraded adk web: the API server starts, but the dev chat UI is unreachable because DevServer fails to import on missing transitive deps that aren't declared in the core install.
Two undeclared runtime deps for the dev server:
google-cloud-storage— only declared under[gcp],[all], and[test]extras (METADATA lines 58, 117, 148), but imported unconditionally bygoogle.adk.cli.dev_server→google.adk.cli.utils.evals→google.adk.evaluation.gcs_eval_set_results_manager.python-multipart— declared nowhere in METADATA, but needed for the Builder UI endpoints.
Reproduction
# Fresh venv, Python 3.13.7 (uv-managed)
uv init adk-repro --python 3.13
cd adk-repro
uv add google-adk # matches the official docs verbatim
# Create a minimal agent at agents/demo/{__init__.py, agent.py}
uv run adk web agents --port 8000Expected
Per the README and AGENTS.md (adk web is described as "Launch web UI (recommended for development)"), opening http://127.0.0.1:8000 should show the chat UI bundled at /dev-ui/.
Actual
Server starts but logs:
WARNING - fast_api.py:525 - DevServer not found, falling back to ApiServer. Dev-only endpoints will not be available.
WARNING - fast_api.py:79 - python-multipart not installed. Builder UI endpoints will not be available.
GET / returns 307 → /dev-ui/ but /dev-ui/ 404s because the static assets are served by DevServer, which never got mounted.
The underlying import error (visible by reproducing from google.adk.cli.dev_server import DevServer directly):
ModuleNotFoundError: No module named 'google.cloud'
File ".../google/adk/cli/dev_server.py", line 69, in <module>
from .utils import evals
File ".../google/adk/cli/utils/evals.py", line 25, in <module>
from ...evaluation.gcs_eval_set_results_manager import GcsEvalSetResultsManager
File ".../google/adk/evaluation/gcs_eval_set_results_manager.py", line 19, in <module>
from google.cloud import exceptions as cloud_exceptions
Workaround
uv add google-cloud-storage python-multipartConfirmed: with both installed, DevServer imports cleanly and /dev-ui/ serves the 55KB SPA. No other code changes needed.
Proposed fixes (pick one)
- Move
google-cloud-storageandpython-multipartto coreRequires-Dist. Smallest change, matches whatadk webalready promises out of the box. ~50KB install bump forpython-multipart;google-cloud-storagepulls a heavier tail but most ADK users hit it eventually via Vertex / GCS sessions anyway. - Lazy-import the GCS eval manager inside
google.adk.cli.utils.evals(and downstreamevaluation.gcs_eval_set_results_manager) soDevServerdoesn't crash whengoogle-cloud-storageisn't present. Pair with addingpython-multipartto core, or a new[web]extra. Best behavior: full UI on minimal install, GCS-backed eval sets gated behind[gcp]. - Document the extras requirement. Update https://adk.dev/get-started/installation/ to say
pip install "google-adk[gcp]" python-multipart(or similar) is required foradk web. Lowest engineering cost, but a fresh-install user still hits the silent fallback unless they read carefully.
Option 2 seems closest to the existing extras architecture intent — the [gcp] extra exists for a reason, and the dev server hard-importing GCS-backed eval state defeats the split.
Environment
- OS: Windows 11 (10.0.26200)
- Python: 3.13.7 (uv-managed)
google-adk: 2.0.0 (PyPI wheel)- uv: 0.11.15
- Reproduced both via
uv add google-adkandpip install google-adkin a venv.
Related
- UnboundLocalError on
ApiServerin cli/fast_api.py when runningadk web --reload_agentson 2.0.0 #5765, adk web command fails with "UnboundLocalError: cannot access local variable 'ApiServer' where it is not associated with a value" #5782 — the--reload_agentsUnboundLocalErroronApiServeris a separate (already-reported) bug that becomes reachable only after this one is fixed (i.e., whenDevServeractually imports).
Not filed separately because
- The
--reload_agentsUnboundLocalErroris already tracked at UnboundLocalError onApiServerin cli/fast_api.py when runningadk web --reload_agentson 2.0.0 #5765 and adk web command fails with "UnboundLocalError: cannot access local variable 'ApiServer' where it is not associated with a value" #5782. - This issue is scoped to install-time/import-time degradation of
adk web. Once How to use api_transport "REST"? in Agent #1 of the proposed fixes lands, the chat UI works on a fresh install without surprises.
Activity
mautomo commentedon May 21, 2026
Three more issues surfaced while exploring SQLite session persistence and the A2A protocol on a fresh
pip install google-adkinstall. The first two are the same packaging-bug pattern as the original report; the third is behavioral and may warrant its own issue.4)
agent.jsonis silently skipped when--a2ais setfast_api.py:666-673iterates the agents directory andcontinues past any folder that doesn't containagent.json. There is nologger.infoorlogger.warning— the user just sees no A2A endpoints mounted and has no idea why.Repro: launch
adk api_server agents --a2a --port 8001against a normal agent folder (__init__.py+agent.py, noagent.json). The server starts,/list-appsreturns the agent, but/a2a/<agent>/.well-known/agent-card.jsonreturns 404 with no diagnostic in the server log.Suggested fix:
logger.info("Skipping %s for A2A — no agent.json found", p.name)inside the skip branch.5)
--a2arequiresa2a-sdk[http-server](undeclared)After adding an
agent.json, the next failure is at server startup:google-adk[a2a]pullsa2a-sdkbut not its[http-server]extra (which providessse-starlette). Same pattern as the original report — feature surface promised by the CLI flag, dep not in the install chain. Workaround:pip install "a2a-sdk[http-server]". This one is logged as an ERROR at least, but it's still a fresh-install-per-docs failure.Suggested fix: either bump
google-adk[a2a]to depend ona2a-sdk[http-server]rather than barea2a-sdk, or make it a soft suggestion in the error message that this can be pulled via the[a2a]extra path.6) [behavioral — possibly separate issue]
event.is_final_response()doesn't fire over A2AA
RemoteA2aAgentconsumer that filters events withevent.is_final_response()will silently drop the final text. The A2A protocol bundlestool_call + tool_response + final_textinto a single event with multiple parts, where the local-agent equivalent would emit them as separate events. Theis_final_response()heuristic appears to expect the separated form.Repro (against the server set up above):
Printing every event shows exactly one event with three parts: a
function_callpart, afunction_responsepart, and atextpart containing the final answer.is_final_response()returnsFalseon this event.This is documented nowhere I could find. Sample/quickstart code at
adk.dev/a2a/quickstart-consumingdoesn't surface the issue because the consumer there doesn't print the response, only routes it as a sub-agent.Workaround for now is "take the last non-empty text part across all events":
If
is_final_response()is supposed to be a stable cross-transport API, the bundling behavior on the A2A side or the heuristic itself probably needs a tweak. Happy to file this separately if you'd rather track it apart from the install-time issues.Environment (same as original report)
google-adk==2.0.0from PyPIa2a-sdk==0.3.26(viagoogle-adk[a2a])fix(cli): lazy-import GCS deps so `adk web` works without google-clou…
fix(cli): lazy-import GCS deps so `adk web` works without google-clou…
fix(cli): lazy-import GCS deps so `adk web` works without google-clou…
fix(cli): lazy-import GCS deps so `adk web` works without google-clou…
fix(cli): lazy-import GCS deps so `adk web` works without google-clou…
mangod12 commentedon May 21, 2026
I've submitted a PR to fix this: #5789
fix: lazy-import GCS evaluation managers in evals utility
fix(cli): lazy-import GCS deps so `adk web` works without google-clou…
fix: lazy-import GCS evaluation managers in evals utility