diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index b073f1a7b0..42ae092f42 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -436,6 +436,7 @@ def __init__( extra_plugins: Optional[list[str]] = None, logo_text: Optional[str] = None, logo_image_url: Optional[str] = None, + root_path: Optional[str] = None, ): self.agent_loader = agent_loader self.session_service = session_service @@ -452,6 +453,7 @@ def __init__( self.runners_to_clean: set[str] = set() self.current_app_name_ref: SharedValue[str] = SharedValue(value="") self.runner_dict = {} + self.root_path = root_path async def get_runner_async(self, app_name: str) -> Runner: """Returns the cached runner for the given app.""" @@ -559,6 +561,7 @@ def _setup_runtime_config(self, web_assets_dir: str): " overwritten.", runtime_config_path, ) + runtime_config["backendUrl"] = self.root_path if self.root_path else "" # Set custom logo config. if self.logo_text or self.logo_image_url: @@ -1562,6 +1565,9 @@ async def process_messages(): mimetypes.add_type("application/javascript", ".js", True) mimetypes.add_type("text/javascript", ".js", True) + devRedirectUrl = "/dev-ui/" + if self.root_path: + devRedirectUrl = self.root_path + "/dev-ui/" @app.get("/dev-ui/config") async def get_ui_config(): return { @@ -1571,11 +1577,11 @@ async def get_ui_config(): @app.get("/") async def redirect_root_to_dev_ui(): - return RedirectResponse("/dev-ui/") + return RedirectResponse(devRedirectUrl) @app.get("/dev-ui") async def redirect_dev_ui_add_slash(): - return RedirectResponse("/dev-ui/") + return RedirectResponse(devRedirectUrl) app.mount( "/dev-ui/", diff --git a/src/google/adk/cli/cli_tools_click.py b/src/google/adk/cli/cli_tools_click.py index b841e017ad..dbd81dbdb2 100644 --- a/src/google/adk/cli/cli_tools_click.py +++ b/src/google/adk/cli/cli_tools_click.py @@ -1028,6 +1028,11 @@ def decorator(func): ), multiple=True, ) + @click.option( + "--root_path", + type=str, + default = None, + ) @functools.wraps(func) @click.pass_context def wrapper(ctx, *args, **kwargs): @@ -1065,6 +1070,7 @@ def cli_web( allow_origins: Optional[list[str]] = None, host: str = "127.0.0.1", port: int = 8000, + root_path: str = None, trace_to_cloud: bool = False, otel_to_cloud: bool = False, reload: bool = True, @@ -1128,6 +1134,7 @@ async def _lifespan(app: FastAPI): a2a=a2a, host=host, port=port, + root_path=root_path, reload_agents=reload_agents, extra_plugins=extra_plugins, logo_text=logo_text, diff --git a/src/google/adk/cli/fast_api.py b/src/google/adk/cli/fast_api.py index 7e1e18bec9..d284fa88c7 100644 --- a/src/google/adk/cli/fast_api.py +++ b/src/google/adk/cli/fast_api.py @@ -64,6 +64,7 @@ def get_fast_api_app( a2a: bool = False, host: str = "127.0.0.1", port: int = 8000, + root_path = None, trace_to_cloud: bool = False, otel_to_cloud: bool = False, reload_agents: bool = False, @@ -144,6 +145,7 @@ def get_fast_api_app( extra_plugins=extra_plugins, logo_text=logo_text, logo_image_url=logo_image_url, + root_path=root_path ) # Callbacks & other optional args for when constructing the FastAPI instance