From 25ec2c6b614cf8d185ff6dbdac5697a210be68da Mon Sep 17 00:00:00 2001 From: Liang Wu Date: Tue, 10 Feb 2026 13:06:47 -0800 Subject: [PATCH] feat(web): Add /health and /version endpoints to ADK web server These endpoints provide basic health checks and version information for the running ADK server, including the ADK version and Python runtime details. The version information will be used to generate ADK conformance test report. Co-authored-by: Liang Wu PiperOrigin-RevId: 868283421 --- src/google/adk/cli/adk_web_server.py | 14 ++++++++++++++ tests/unittests/cli/test_fast_api.py | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 109d0a5d..57cf2c50 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -20,6 +20,7 @@ import importlib import json import logging import os +import sys import time import traceback import typing @@ -88,6 +89,7 @@ from ..runners import Runner from ..sessions.base_session_service import BaseSessionService from ..sessions.session import Session from ..utils.context_utils import Aclosing +from ..version import __version__ from .cli_eval import EVAL_SESSION_ID_PREFIX from .utils import cleanup from .utils import common @@ -757,6 +759,18 @@ class AdkWebServer: allow_headers=["*"], ) + @app.get("/health") + async def health() -> dict[str, str]: + return {"status": "ok"} + + @app.get("/version") + async def version() -> dict[str, str]: + return { + "version": __version__, + "language": "python", + "language_version": f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}", + } + @app.get("/list-apps") async def list_apps( detailed: bool = Query( diff --git a/tests/unittests/cli/test_fast_api.py b/tests/unittests/cli/test_fast_api.py index 25285cf6..1ab1d41f 100755 --- a/tests/unittests/cli/test_fast_api.py +++ b/tests/unittests/cli/test_fast_api.py @@ -1530,5 +1530,23 @@ def test_builder_save_rejects_traversal(builder_test_client, tmp_path): assert not (tmp_path / "app" / "tmp" / "escape.yaml").exists() +def test_health_endpoint(test_app): + """Test the health endpoint.""" + response = test_app.get("/health") + assert response.status_code == 200 + assert response.json() == {"status": "ok"} + + +def test_version_endpoint(test_app): + """Test the version endpoint.""" + response = test_app.get("/version") + assert response.status_code == 200 + data = response.json() + assert "version" in data + assert "language" in data + assert data["language"] == "python" + assert "language_version" in data + + if __name__ == "__main__": pytest.main(["-xvs", __file__])