From 974094c32e9bd69e8562a7ba928a6ff58c934643 Mon Sep 17 00:00:00 2001 From: yazeedbashammakh Date: Wed, 17 Sep 2025 22:18:24 +0530 Subject: [PATCH 1/3] service_account option is added into adk deploy agent_engine cli command --- src/google/adk/cli/cli_deploy.py | 18 ++++++++++++++++++ src/google/adk/cli/cli_tools_click.py | 10 ++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/google/adk/cli/cli_deploy.py b/src/google/adk/cli/cli_deploy.py index d26b3c9660..8950c34583 100644 --- a/src/google/adk/cli/cli_deploy.py +++ b/src/google/adk/cli/cli_deploy.py @@ -350,6 +350,7 @@ def to_agent_engine( absolutize_imports: bool = True, project: Optional[str] = None, region: Optional[str] = None, + service_account: Optional[str] = None, display_name: Optional[str] = None, description: Optional[str] = None, requirements_file: Optional[str] = None, @@ -395,6 +396,7 @@ def to_agent_engine( import statements. project (str): Optional. Google Cloud project id. region (str): Optional. Google Cloud region. + service_account (str): Optional. Google Cloud service account display_name (str): Optional. The display name of the Agent Engine. description (str): Optional. The description of the Agent Engine. requirements_file (str): Optional. The filepath to the `requirements.txt` @@ -518,6 +520,19 @@ def to_agent_engine( else: region = env_region click.echo(f'{region=} set by GOOGLE_CLOUD_LOCATION in {env_file}') + if 'GOOGLE_CLOUD_SERVICE_ACCOUNT' in env_vars: + env_sa = env_vars.pop('GOOGLE_CLOUD_SERVICE_ACCOUNT') + if env_sa: + if service_account: + click.secho( + 'Ignoring GOOGLE_CLOUD_SERVICE_ACCOUNT as `--service_account`' + ' was explicitly passed and takes precedence', + fg='yellow', + ) + else: + service_account = env_sa + click.echo(f"""{service_account=} set by + GOOGLE_CLOUD_SERVICE_ACCOUNT in {env_file}""") if env_vars: if 'env_vars' in agent_config: click.echo( @@ -526,6 +541,9 @@ def to_agent_engine( agent_config['env_vars'] = env_vars # Set env_vars in agent_config to None if it is not set. agent_config['env_vars'] = agent_config.get('env_vars', env_vars) + # set service account if specified + if service_account: + agent_config['service_account'] = service_account vertexai.init( project=project, diff --git a/src/google/adk/cli/cli_tools_click.py b/src/google/adk/cli/cli_tools_click.py index 08e0e97aa2..5c0172bdeb 100644 --- a/src/google/adk/cli/cli_tools_click.py +++ b/src/google/adk/cli/cli_tools_click.py @@ -1111,6 +1111,16 @@ def cli_deploy_cloud_run( " GOOGLE_CLOUD_LOCATION in the .env file (if it exists)." ), ) +@click.option( + "--service_account", + type=str, + help=( + "Optional. Google Cloud service account to be used by the agent." + "It will override GOOGLE_CLOUD_SERVICE_ACCOUNT in the .env file " + "(if it exists). If not provided, " + "the AI Platform Reasoning Engine Service Agent will be used." + ), +) @click.option( "--staging_bucket", type=str, From b968271f415b848961c44f86acd7d37d8dbc5afd Mon Sep 17 00:00:00 2001 From: yazeedbashammakh Date: Wed, 17 Sep 2025 22:24:49 +0530 Subject: [PATCH 2/3] fix service account argument error --- src/google/adk/cli/cli_tools_click.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/google/adk/cli/cli_tools_click.py b/src/google/adk/cli/cli_tools_click.py index 5c0172bdeb..9c4cf306e5 100644 --- a/src/google/adk/cli/cli_tools_click.py +++ b/src/google/adk/cli/cli_tools_click.py @@ -1232,6 +1232,7 @@ def cli_deploy_agent_engine( agent: str, project: str, region: str, + service_account: Optional[str], staging_bucket: str, agent_engine_id: Optional[str], trace_to_cloud: bool, @@ -1257,6 +1258,7 @@ def cli_deploy_agent_engine( agent_folder=agent, project=project, region=region, + service_account=service_account, staging_bucket=staging_bucket, agent_engine_id=agent_engine_id, trace_to_cloud=trace_to_cloud, From c252c8e24c2783a04b2be4d0afba0361e721e98d Mon Sep 17 00:00:00 2001 From: yazeedbashammakh Date: Wed, 17 Sep 2025 22:54:55 +0530 Subject: [PATCH 3/3] gemini code suggested changes --- src/google/adk/cli/cli_deploy.py | 91 +++++++++++++++++++------------- 1 file changed, 53 insertions(+), 38 deletions(-) diff --git a/src/google/adk/cli/cli_deploy.py b/src/google/adk/cli/cli_deploy.py index 8950c34583..d196ba5482 100644 --- a/src/google/adk/cli/cli_deploy.py +++ b/src/google/adk/cli/cli_deploy.py @@ -83,6 +83,31 @@ """ +def _resolve_param_from_env( + param_value: Optional[str], + env_var_name: str, + param_name: str, + env_vars: dict[str, str], + env_file: str, +) -> Optional[str]: + """Resolves a parameter from environment variables, with CLI precedence.""" + if env_var_name in env_vars: + env_value = env_vars.pop(env_var_name) + if env_value: + if param_value: + click.secho( + f'Ignoring {env_var_name} in {env_file} as `--{param_name}` ' + 'was explicitly passed and takes precedence.', + fg='yellow', + ) + else: + param_value = env_value + click.echo( + f'{param_name}={param_value} set by {env_var_name} in {env_file}' + ) + return param_value + + def _resolve_project(project_in_option: Optional[str]) -> str: if project_in_option: return project_in_option @@ -396,7 +421,10 @@ def to_agent_engine( import statements. project (str): Optional. Google Cloud project id. region (str): Optional. Google Cloud region. - service_account (str): Optional. Google Cloud service account + service_account (str): Optional. Google Cloud service account to be used + by the agent. It will override GOOGLE_CLOUD_SERVICE_ACCOUNT in the .env + file (if it exists). If not provided, the AI Platform Reasoning Engine + Service Agent will be used. display_name (str): Optional. The display name of the Agent Engine. description (str): Optional. The description of the Agent Engine. requirements_file (str): Optional. The filepath to the `requirements.txt` @@ -496,43 +524,30 @@ def to_agent_engine( click.echo(f'Reading environment variables from {env_file}') env_vars = dotenv_values(env_file) - if 'GOOGLE_CLOUD_PROJECT' in env_vars: - env_project = env_vars.pop('GOOGLE_CLOUD_PROJECT') - if env_project: - if project: - click.secho( - 'Ignoring GOOGLE_CLOUD_PROJECT in .env as `--project` was' - ' explicitly passed and takes precedence', - fg='yellow', - ) - else: - project = env_project - click.echo(f'{project=} set by GOOGLE_CLOUD_PROJECT in {env_file}') - if 'GOOGLE_CLOUD_LOCATION' in env_vars: - env_region = env_vars.pop('GOOGLE_CLOUD_LOCATION') - if env_region: - if region: - click.secho( - 'Ignoring GOOGLE_CLOUD_LOCATION in .env as `--region` was' - ' explicitly passed and takes precedence', - fg='yellow', - ) - else: - region = env_region - click.echo(f'{region=} set by GOOGLE_CLOUD_LOCATION in {env_file}') - if 'GOOGLE_CLOUD_SERVICE_ACCOUNT' in env_vars: - env_sa = env_vars.pop('GOOGLE_CLOUD_SERVICE_ACCOUNT') - if env_sa: - if service_account: - click.secho( - 'Ignoring GOOGLE_CLOUD_SERVICE_ACCOUNT as `--service_account`' - ' was explicitly passed and takes precedence', - fg='yellow', - ) - else: - service_account = env_sa - click.echo(f"""{service_account=} set by - GOOGLE_CLOUD_SERVICE_ACCOUNT in {env_file}""") + project = _resolve_param_from_env( + param_value=project, + env_var_name='GOOGLE_CLOUD_PROJECT', + param_name='project', + env_vars=env_vars, + env_file=env_file + ) + + region = _resolve_param_from_env( + param_value=region, + env_var_name='GOOGLE_CLOUD_LOCATION', + param_name='region', + env_vars=env_vars, + env_file=env_file + ) + + service_account = _resolve_param_from_env( + param_value=service_account, + env_var_name='GOOGLE_CLOUD_SERVICE_ACCOUNT', + param_name='service_account', + env_vars=env_vars, + env_file=env_file + ) + if env_vars: if 'env_vars' in agent_config: click.echo(