From cb3b76fc3ed44e232342c3d8907717a18d93897b Mon Sep 17 00:00:00 2001 From: Edwin Kim <143031742+ekimcodes@users.noreply.github.com> Date: Tue, 27 Jan 2026 22:01:24 +0000 Subject: [PATCH 1/5] feat(cli): add --auto_create_session flag to api_server command --- src/google/adk/cli/adk_web_server.py | 88 +++++++++++++++++++++++++++ src/google/adk/cli/cli_tools_click.py | 10 +++ src/google/adk/cli/fast_api.py | 2 + 3 files changed, 100 insertions(+) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index e57e0c8fa9..181a9409b3 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -492,6 +492,7 @@ def __init__( logo_text: Optional[str] = None, logo_image_url: Optional[str] = None, url_prefix: Optional[str] = None, + auto_create_session: bool = False, ): self.agent_loader = agent_loader self.session_service = session_service @@ -509,6 +510,7 @@ def __init__( self.current_app_name_ref: SharedValue[str] = SharedValue(value="") self.runner_dict = {} self.url_prefix = url_prefix + self.auto_create_session = auto_create_session async def get_runner_async(self, app_name: str) -> Runner: """Returns the cached runner for the given app.""" @@ -558,6 +560,7 @@ def _create_runner(self, agentic_app: App) -> Runner: session_service=self.session_service, memory_service=self.memory_service, credential_service=self.credential_service, + auto_create_session=self.auto_create_session, ) def _instantiate_extra_plugins(self) -> list[BasePlugin]: @@ -946,6 +949,27 @@ async def create_eval_set( detail=str(ve), ) from ve + @deprecated( + "Please use create_eval_set instead. This will be removed in future" + " releases." + ) + @app.post( + "/apps/{app_name}/eval_sets/{eval_set_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def create_eval_set_legacy( + app_name: str, + eval_set_id: str, + ): + """Creates an eval set, given the id.""" + await create_eval_set( + app_name=app_name, + create_eval_set_request=CreateEvalSetRequest( + eval_set=EvalSet(eval_set_id=eval_set_id, eval_cases=[]) + ), + ) + @app.get( "/apps/{app_name}/eval-sets", response_model_exclude_none=True, @@ -961,6 +985,19 @@ async def list_eval_sets(app_name: str) -> ListEvalSetsResponse: return ListEvalSetsResponse(eval_set_ids=eval_sets) + @deprecated( + "Please use list_eval_sets instead. This will be removed in future" + " releases." + ) + @app.get( + "/apps/{app_name}/eval_sets", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_sets_legacy(app_name: str) -> list[str]: + list_eval_sets_response = await list_eval_sets(app_name) + return list_eval_sets_response.eval_set_ids + @app.post( "/apps/{app_name}/eval-sets/{eval_set_id}/add-session", response_model_exclude_none=True, @@ -1108,6 +1145,22 @@ async def delete_eval( except NotFoundError as nfe: raise HTTPException(status_code=404, detail=str(nfe)) from nfe + @deprecated( + "Please use run_eval instead. This will be removed in future releases." + ) + @app.post( + "/apps/{app_name}/eval_sets/{eval_set_id}/run_eval", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def run_eval_legacy( + app_name: str, eval_set_id: str, req: RunEvalRequest + ) -> list[RunEvalResult]: + run_eval_response = await run_eval( + app_name=app_name, eval_set_id=eval_set_id, req=req + ) + return run_eval_response.run_eval_results + @app.post( "/apps/{app_name}/eval-sets/{eval_set_id}/run", response_model_exclude_none=True, @@ -1201,6 +1254,28 @@ async def get_eval_result( except ValidationError as ve: raise HTTPException(status_code=500, detail=str(ve)) from ve + @deprecated( + "Please use get_eval_result instead. This will be removed in future" + " releases." + ) + @app.get( + "/apps/{app_name}/eval_results/{eval_result_id}", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def get_eval_result_legacy( + app_name: str, + eval_result_id: str, + ) -> EvalSetResult: + try: + return self.eval_set_results_manager.get_eval_set_result( + app_name, eval_result_id + ) + except ValueError as ve: + raise HTTPException(status_code=404, detail=str(ve)) from ve + except ValidationError as ve: + raise HTTPException(status_code=500, detail=str(ve)) from ve + @app.get( "/apps/{app_name}/eval-results", response_model_exclude_none=True, @@ -1213,6 +1288,19 @@ async def list_eval_results(app_name: str) -> ListEvalResultsResponse: ) return ListEvalResultsResponse(eval_result_ids=eval_result_ids) + @deprecated( + "Please use list_eval_results instead. This will be removed in future" + " releases." + ) + @app.get( + "/apps/{app_name}/eval_results", + response_model_exclude_none=True, + tags=[TAG_EVALUATION], + ) + async def list_eval_results_legacy(app_name: str) -> list[str]: + list_eval_results_response = await list_eval_results(app_name) + return list_eval_results_response.eval_result_ids + @app.get( "/apps/{app_name}/metrics-info", response_model_exclude_none=True, diff --git a/src/google/adk/cli/cli_tools_click.py b/src/google/adk/cli/cli_tools_click.py index c4f1d405ad..cb7d08ddf3 100644 --- a/src/google/adk/cli/cli_tools_click.py +++ b/src/google/adk/cli/cli_tools_click.py @@ -1378,6 +1378,14 @@ async def _lifespan(app: FastAPI): @fast_api_common_options() @adk_services_options(default_use_local_storage=True) @deprecated_adk_services_options() +@click.option( + "--auto_create_session", + is_flag=True, + default=False, + help=( + "Automatically create a session if it doesn't exist when calling /run." + ), +) def cli_api_server( agents_dir: str, eval_storage_uri: Optional[str] = None, @@ -1398,6 +1406,7 @@ def cli_api_server( a2a: bool = False, reload_agents: bool = False, extra_plugins: Optional[list[str]] = None, + auto_create_session: bool = False, ): """Starts a FastAPI server for agents. @@ -1430,6 +1439,7 @@ def cli_api_server( url_prefix=url_prefix, reload_agents=reload_agents, extra_plugins=extra_plugins, + auto_create_session=auto_create_session, ), host=host, port=port, diff --git a/src/google/adk/cli/fast_api.py b/src/google/adk/cli/fast_api.py index 287fce6796..9956fc5587 100644 --- a/src/google/adk/cli/fast_api.py +++ b/src/google/adk/cli/fast_api.py @@ -91,6 +91,7 @@ def get_fast_api_app( extra_plugins: Optional[list[str]] = None, logo_text: Optional[str] = None, logo_image_url: Optional[str] = None, + auto_create_session: bool = False, ) -> FastAPI: # Set up eval managers. @@ -153,6 +154,7 @@ def get_fast_api_app( logo_text=logo_text, logo_image_url=logo_image_url, url_prefix=url_prefix, + auto_create_session=auto_create_session, ) # Callbacks & other optional args for when constructing the FastAPI instance From fbf3f811f30f92ed8560d308b6d24430e5a922e3 Mon Sep 17 00:00:00 2001 From: Edwin Kim <143031742+ekimcodes@users.noreply.github.com> Date: Wed, 28 Jan 2026 15:55:15 -0800 Subject: [PATCH 2/5] Update src/google/adk/cli/adk_web_server.py Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/google/adk/cli/adk_web_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 181a9409b3..844bab3b28 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -990,7 +990,7 @@ async def list_eval_sets(app_name: str) -> ListEvalSetsResponse: " releases." ) @app.get( - "/apps/{app_name}/eval_sets", + "/apps/{app_name}/eval_sets_legacy", response_model_exclude_none=True, tags=[TAG_EVALUATION], ) From 8e540a0f33e532c237c19936eec194fab5f8011c Mon Sep 17 00:00:00 2001 From: Liang Wu <18244712+wuliang229@users.noreply.github.com> Date: Tue, 10 Feb 2026 14:11:02 -0800 Subject: [PATCH 3/5] Remove deprecated legacy evaluation endpoints --- src/google/adk/cli/adk_web_server.py | 64 ---------------------------- 1 file changed, 64 deletions(-) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index dee07dad6c..c3b81b287b 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -1068,19 +1068,6 @@ async def list_eval_sets(app_name: str) -> ListEvalSetsResponse: return ListEvalSetsResponse(eval_set_ids=eval_sets) - @deprecated( - "Please use list_eval_sets instead. This will be removed in future" - " releases." - ) - @app.get( - "/apps/{app_name}/eval_sets_legacy", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_sets_legacy(app_name: str) -> list[str]: - list_eval_sets_response = await list_eval_sets(app_name) - return list_eval_sets_response.eval_set_ids - @app.post( "/apps/{app_name}/eval-sets/{eval_set_id}/add-session", response_model_exclude_none=True, @@ -1228,22 +1215,6 @@ async def delete_eval( except NotFoundError as nfe: raise HTTPException(status_code=404, detail=str(nfe)) from nfe - @deprecated( - "Please use run_eval instead. This will be removed in future releases." - ) - @app.post( - "/apps/{app_name}/eval_sets/{eval_set_id}/run_eval", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def run_eval_legacy( - app_name: str, eval_set_id: str, req: RunEvalRequest - ) -> list[RunEvalResult]: - run_eval_response = await run_eval( - app_name=app_name, eval_set_id=eval_set_id, req=req - ) - return run_eval_response.run_eval_results - @app.post( "/apps/{app_name}/eval-sets/{eval_set_id}/run", response_model_exclude_none=True, @@ -1337,28 +1308,6 @@ async def get_eval_result( except ValidationError as ve: raise HTTPException(status_code=500, detail=str(ve)) from ve - @deprecated( - "Please use get_eval_result instead. This will be removed in future" - " releases." - ) - @app.get( - "/apps/{app_name}/eval_results/{eval_result_id}", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def get_eval_result_legacy( - app_name: str, - eval_result_id: str, - ) -> EvalSetResult: - try: - return self.eval_set_results_manager.get_eval_set_result( - app_name, eval_result_id - ) - except ValueError as ve: - raise HTTPException(status_code=404, detail=str(ve)) from ve - except ValidationError as ve: - raise HTTPException(status_code=500, detail=str(ve)) from ve - @app.get( "/apps/{app_name}/eval-results", response_model_exclude_none=True, @@ -1371,19 +1320,6 @@ async def list_eval_results(app_name: str) -> ListEvalResultsResponse: ) return ListEvalResultsResponse(eval_result_ids=eval_result_ids) - @deprecated( - "Please use list_eval_results instead. This will be removed in future" - " releases." - ) - @app.get( - "/apps/{app_name}/eval_results", - response_model_exclude_none=True, - tags=[TAG_EVALUATION], - ) - async def list_eval_results_legacy(app_name: str) -> list[str]: - list_eval_results_response = await list_eval_results(app_name) - return list_eval_results_response.eval_result_ids - @app.get( "/apps/{app_name}/metrics-info", response_model_exclude_none=True, From ef36177ffd5d7df4da9543a7c06266cf67fde296 Mon Sep 17 00:00:00 2001 From: Liang Wu <18244712+wuliang229@users.noreply.github.com> Date: Tue, 10 Feb 2026 14:23:32 -0800 Subject: [PATCH 4/5] Fix pyink --- src/google/adk/cli/adk_web_server.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index c3b81b287b..654a9e2f9f 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -771,7 +771,9 @@ 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}", + "language_version": ( + f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}" + ), } @app.get("/list-apps") From 3c8d299a88b21789431dbda488befba7ee3ace81 Mon Sep 17 00:00:00 2001 From: Liang Wu <18244712+wuliang229@users.noreply.github.com> Date: Tue, 10 Feb 2026 15:34:52 -0800 Subject: [PATCH 5/5] Revert Pyink change --- src/google/adk/cli/adk_web_server.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 654a9e2f9f..c3b81b287b 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -771,9 +771,7 @@ 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}" - ), + "language_version": f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}", } @app.get("/list-apps")