[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 by google.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 8000
Expected
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-multipart
Confirmed: 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-storage and python-multipart to core Requires-Dist. Smallest change, matches what adk web already promises out of the box. ~50KB install bump for python-multipart; google-cloud-storage pulls 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 downstream evaluation.gcs_eval_set_results_manager) so DevServer doesn't crash when google-cloud-storage isn't present. Pair with adding python-multipart to 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 for adk 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-adk and pip install google-adk in a venv.
Related
Not filed separately because
[bug] Fresh
pip install google-adkper docs leavesadk webwithout 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 workingadk runCLI but a silently degradedadk web: the API server starts, but the dev chat UI is unreachable becauseDevServerfails 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
Expected
Per the README and AGENTS.md (
adk webis 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:
GET /returns307 → /dev-ui/but/dev-ui/404s because the static assets are served byDevServer, which never got mounted.The underlying import error (visible by reproducing
from google.adk.cli.dev_server import DevServerdirectly):Workaround
Confirmed: with both installed,
DevServerimports cleanly and/dev-ui/serves the 55KB SPA. No other code changes needed.Proposed fixes (pick one)
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.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].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
google-adk: 2.0.0 (PyPI wheel)uv add google-adkandpip install google-adkin a venv.Related
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
--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.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.