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/2] 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/2] 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], )