agent-starter-pack 0.3.3__py3-none-any.whl → 0.21.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. agent_starter_pack/agents/README.md +7 -0
  2. agents/langgraph_base_react/template/.templateconfig.yaml → agent_starter_pack/agents/adk_a2a_base/.template/templateconfig.yaml +5 -10
  3. agent_starter_pack/agents/adk_a2a_base/README.md +37 -0
  4. src/deployment_targets/cloud_run/Dockerfile → agent_starter_pack/agents/adk_a2a_base/app/__init__.py +2 -14
  5. agent_starter_pack/agents/adk_a2a_base/app/agent.py +70 -0
  6. agent_starter_pack/agents/adk_a2a_base/notebooks/adk_a2a_app_testing.ipynb +583 -0
  7. agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb → agent_starter_pack/agents/adk_a2a_base/notebooks/evaluating_adk_agent.ipynb +163 -199
  8. {agents/adk_base → agent_starter_pack/agents/adk_a2a_base}/tests/integration/test_agent.py +2 -2
  9. agents/adk_base/template/.templateconfig.yaml → agent_starter_pack/agents/adk_base/.template/templateconfig.yaml +4 -1
  10. {agents → agent_starter_pack/agents}/adk_base/README.md +1 -1
  11. agent_starter_pack/agents/adk_base/app/__init__.py +17 -0
  12. {agents → agent_starter_pack/agents}/adk_base/app/agent.py +5 -2
  13. {agents → agent_starter_pack/agents}/adk_base/notebooks/adk_app_testing.ipynb +128 -82
  14. agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb → agent_starter_pack/agents/adk_base/notebooks/evaluating_adk_agent.ipynb +181 -207
  15. agent_starter_pack/agents/adk_base/tests/integration/test_agent.py +58 -0
  16. agents/crewai_coding_crew/template/.templateconfig.yaml → agent_starter_pack/agents/adk_live/.template/templateconfig.yaml +5 -9
  17. agent_starter_pack/agents/adk_live/README.md +32 -0
  18. agent_starter_pack/agents/adk_live/app/__init__.py +17 -0
  19. agent_starter_pack/agents/adk_live/app/agent.py +51 -0
  20. agent_starter_pack/agents/adk_live/tests/unit/test_dummy.py +38 -0
  21. agents/agentic_rag/template/.templateconfig.yaml → agent_starter_pack/agents/agentic_rag/.template/templateconfig.yaml +7 -3
  22. {agents → agent_starter_pack/agents}/agentic_rag/README.md +1 -1
  23. agent_starter_pack/agents/agentic_rag/app/__init__.py +17 -0
  24. {agents → agent_starter_pack/agents}/agentic_rag/app/agent.py +8 -4
  25. {agents → agent_starter_pack/agents}/agentic_rag/notebooks/adk_app_testing.ipynb +128 -82
  26. agent_starter_pack/agents/agentic_rag/notebooks/evaluating_adk_agent.ipynb +1535 -0
  27. {agents → agent_starter_pack/agents}/agentic_rag/tests/integration/test_agent.py +3 -3
  28. agent_starter_pack/agents/langgraph_base/.template/templateconfig.yaml +31 -0
  29. agent_starter_pack/agents/langgraph_base/README.md +30 -0
  30. agent_starter_pack/agents/langgraph_base/app/__init__.py +17 -0
  31. agent_starter_pack/agents/langgraph_base/app/agent.py +34 -0
  32. {agents/crewai_coding_crew → agent_starter_pack/agents/langgraph_base}/notebooks/evaluating_langgraph_agent.ipynb +30 -17
  33. {agents/langgraph_base_react → agent_starter_pack/agents/langgraph_base}/tests/integration/test_agent.py +2 -2
  34. {src → agent_starter_pack}/base_template/.gitignore +5 -3
  35. agent_starter_pack/base_template/GEMINI.md +5 -0
  36. agent_starter_pack/base_template/Makefile +339 -0
  37. agent_starter_pack/base_template/README.md +267 -0
  38. agent_starter_pack/base_template/deployment/README.md +11 -0
  39. {src → agent_starter_pack}/base_template/deployment/terraform/apis.tf +2 -2
  40. {src → agent_starter_pack}/base_template/deployment/terraform/dev/apis.tf +6 -1
  41. {src → agent_starter_pack}/base_template/deployment/terraform/dev/iam.tf +12 -11
  42. {src → agent_starter_pack}/base_template/deployment/terraform/dev/providers.tf +5 -1
  43. {src → agent_starter_pack}/base_template/deployment/terraform/dev/storage.tf +1 -1
  44. {src → agent_starter_pack}/base_template/deployment/terraform/dev/variables.tf +10 -10
  45. agent_starter_pack/base_template/deployment/terraform/dev/{% if cookiecutter.is_adk %}telemetry.tf{% else %}unused_telemetry.tf{% endif %} +193 -0
  46. agent_starter_pack/base_template/deployment/terraform/github.tf +337 -0
  47. {src → agent_starter_pack}/base_template/deployment/terraform/iam.tf +20 -41
  48. {src → agent_starter_pack}/base_template/deployment/terraform/locals.tf +10 -3
  49. {src/resources/setup_cicd → agent_starter_pack/base_template/deployment/terraform}/providers.tf +8 -1
  50. {src → agent_starter_pack}/base_template/deployment/terraform/service_accounts.tf +7 -8
  51. agent_starter_pack/base_template/deployment/terraform/sql/completions.sql +138 -0
  52. {src → agent_starter_pack}/base_template/deployment/terraform/storage.tf +7 -16
  53. {src → agent_starter_pack}/base_template/deployment/terraform/variables.tf +61 -28
  54. {src → agent_starter_pack}/base_template/deployment/terraform/vars/env.tfvars +6 -1
  55. agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'github_actions' %}wif.tf{% else %}unused_wif.tf{% endif %} +43 -0
  56. src/base_template/deployment/terraform/build_triggers.tf → agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}build_triggers.tf{% else %}unused_build_triggers.tf{% endif %} +55 -38
  57. agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.is_adk %}telemetry.tf{% else %}unused_telemetry.tf{% endif %} +206 -0
  58. {src → agent_starter_pack}/base_template/pyproject.toml +24 -37
  59. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/deploy-to-prod.yaml +132 -0
  60. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/pr_checks.yaml +65 -0
  61. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/staging.yaml +259 -0
  62. src/base_template/deployment/cd/deploy-to-prod.yaml → agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/deploy-to-prod.yaml +38 -30
  63. src/base_template/deployment/ci/pr_checks.yaml → agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/pr_checks.yaml +5 -5
  64. agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/staging.yaml +322 -0
  65. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/telemetry.py +96 -0
  66. {src/base_template/app/utils → agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils}/typing.py +7 -9
  67. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}converters{% else %}unused_converters{% endif %}/__init__.py +25 -0
  68. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}converters{% else %}unused_converters{% endif %}/part_converter.py +138 -0
  69. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/__init__.py +13 -0
  70. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/a2a_agent_executor.py +265 -0
  71. agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/task_result_aggregator.py +152 -0
  72. agent_starter_pack/cli/commands/create.py +1256 -0
  73. agent_starter_pack/cli/commands/enhance.py +611 -0
  74. agent_starter_pack/cli/commands/list.py +203 -0
  75. agent_starter_pack/cli/commands/register_gemini_enterprise.py +1070 -0
  76. agent_starter_pack/cli/commands/setup_cicd.py +862 -0
  77. {src → agent_starter_pack}/cli/main.py +10 -2
  78. {src → agent_starter_pack}/cli/utils/cicd.py +139 -48
  79. agent_starter_pack/cli/utils/gcp.py +263 -0
  80. agent_starter_pack/cli/utils/logging.py +103 -0
  81. agent_starter_pack/cli/utils/remote_template.py +677 -0
  82. agent_starter_pack/cli/utils/template.py +1466 -0
  83. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/process_data.py +1 -1
  84. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +20 -6
  85. {src → agent_starter_pack}/data_ingestion/pyproject.toml +1 -0
  86. {src → agent_starter_pack}/data_ingestion/uv.lock +602 -494
  87. agent_starter_pack/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +484 -0
  88. agent_starter_pack/deployment_targets/agent_engine/tests/load_test/README.md +84 -0
  89. agent_starter_pack/deployment_targets/agent_engine/tests/load_test/load_test.py +424 -0
  90. agent_starter_pack/deployment_targets/agent_engine/tests/{% if cookiecutter.is_a2a %}helpers.py{% else %}unused_helpers.py{% endif %} +138 -0
  91. agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/agent_engine_app.py +263 -0
  92. agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/app_utils/deploy.py +414 -0
  93. agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_adk_live %}expose_app.py{% else %}unused_expose_app.py{% endif %} +519 -0
  94. agent_starter_pack/deployment_targets/cloud_run/Dockerfile +51 -0
  95. agent_starter_pack/deployment_targets/cloud_run/deployment/terraform/dev/service.tf +243 -0
  96. agent_starter_pack/deployment_targets/cloud_run/deployment/terraform/service.tf +417 -0
  97. agent_starter_pack/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +705 -0
  98. agent_starter_pack/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +321 -0
  99. agent_starter_pack/deployment_targets/cloud_run/tests/load_test/README.md +165 -0
  100. agent_starter_pack/deployment_targets/cloud_run/tests/load_test/load_test.py +329 -0
  101. agent_starter_pack/deployment_targets/cloud_run/{{cookiecutter.agent_directory}}/fast_api_app.py +556 -0
  102. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/package-lock.json +79 -1044
  103. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/package.json +1 -9
  104. agent_starter_pack/frontends/adk_live_react/frontend/src/App.tsx +65 -0
  105. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/Logger.tsx +8 -3
  106. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/logger.scss +26 -0
  107. agent_starter_pack/frontends/adk_live_react/frontend/src/components/side-panel/SidePanel.tsx +516 -0
  108. agent_starter_pack/frontends/adk_live_react/frontend/src/components/side-panel/side-panel.scss +563 -0
  109. agent_starter_pack/frontends/adk_live_react/frontend/src/components/transcription-preview/TranscriptionPreview.tsx +106 -0
  110. agent_starter_pack/frontends/adk_live_react/frontend/src/components/transcription-preview/transcription-preview.scss +150 -0
  111. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-live-api.ts +8 -2
  112. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/multimodal-live-types.ts +40 -2
  113. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audio-recorder.ts +1 -1
  114. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audio-streamer.ts +1 -1
  115. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/multimodal-live-client.ts +210 -24
  116. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/utils.ts +27 -5
  117. agent_starter_pack/resources/docs/adk-cheatsheet.md +1628 -0
  118. agent_starter_pack/resources/locks/uv-adk_a2a_base-agent_engine.lock +4966 -0
  119. agent_starter_pack/resources/locks/uv-adk_a2a_base-cloud_run.lock +5011 -0
  120. agent_starter_pack/resources/locks/uv-adk_base-agent_engine.lock +4946 -0
  121. agent_starter_pack/resources/locks/uv-adk_base-cloud_run.lock +4991 -0
  122. agent_starter_pack/resources/locks/uv-adk_live-agent_engine.lock +4963 -0
  123. agent_starter_pack/resources/locks/uv-adk_live-cloud_run.lock +5006 -0
  124. agent_starter_pack/resources/locks/uv-agentic_rag-agent_engine.lock +5487 -0
  125. agent_starter_pack/resources/locks/uv-agentic_rag-cloud_run.lock +5532 -0
  126. agent_starter_pack/resources/locks/uv-langgraph_base-agent_engine.lock +5788 -0
  127. agent_starter_pack/resources/locks/uv-langgraph_base-cloud_run.lock +5811 -0
  128. {src → agent_starter_pack}/utils/generate_locks.py +15 -12
  129. {src → agent_starter_pack}/utils/lock_utils.py +4 -7
  130. {src → agent_starter_pack}/utils/watch_and_rebuild.py +2 -2
  131. agent_starter_pack-0.21.0.dist-info/METADATA +182 -0
  132. agent_starter_pack-0.21.0.dist-info/RECORD +171 -0
  133. agent_starter_pack-0.21.0.dist-info/entry_points.txt +2 -0
  134. llm.txt +362 -0
  135. agent_starter_pack-0.3.3.dist-info/METADATA +0 -164
  136. agent_starter_pack-0.3.3.dist-info/RECORD +0 -176
  137. agent_starter_pack-0.3.3.dist-info/entry_points.txt +0 -2
  138. agents/crewai_coding_crew/README.md +0 -34
  139. agents/crewai_coding_crew/app/agent.py +0 -86
  140. agents/crewai_coding_crew/app/crew/config/agents.yaml +0 -39
  141. agents/crewai_coding_crew/app/crew/config/tasks.yaml +0 -37
  142. agents/crewai_coding_crew/app/crew/crew.py +0 -71
  143. agents/crewai_coding_crew/tests/integration/test_agent.py +0 -47
  144. agents/langgraph_base_react/README.md +0 -9
  145. agents/langgraph_base_react/app/agent.py +0 -73
  146. agents/live_api/README.md +0 -37
  147. agents/live_api/app/agent.py +0 -78
  148. agents/live_api/app/server.py +0 -196
  149. agents/live_api/app/templates.py +0 -51
  150. agents/live_api/app/vector_store.py +0 -55
  151. agents/live_api/template/.templateconfig.yaml +0 -29
  152. agents/live_api/tests/integration/test_server_e2e.py +0 -254
  153. agents/live_api/tests/load_test/load_test.py +0 -40
  154. agents/live_api/tests/unit/test_server.py +0 -143
  155. src/base_template/Makefile +0 -72
  156. src/base_template/README.md +0 -208
  157. src/base_template/app/__init__.py +0 -3
  158. src/base_template/app/utils/tracing.py +0 -155
  159. src/base_template/deployment/README.md +0 -126
  160. src/base_template/deployment/cd/staging.yaml +0 -216
  161. src/base_template/deployment/terraform/dev/log_sinks.tf +0 -63
  162. src/base_template/deployment/terraform/log_sinks.tf +0 -70
  163. src/base_template/deployment/terraform/providers.tf +0 -37
  164. src/cli/commands/create.py +0 -664
  165. src/cli/commands/setup_cicd.py +0 -829
  166. src/cli/utils/gcp.py +0 -117
  167. src/cli/utils/logging.py +0 -51
  168. src/cli/utils/template.py +0 -737
  169. src/deployment_targets/agent_engine/app/agent_engine_app.py +0 -336
  170. src/deployment_targets/agent_engine/notebooks/intro_agent_engine.ipynb +0 -1025
  171. src/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +0 -183
  172. src/deployment_targets/agent_engine/tests/load_test/README.md +0 -42
  173. src/deployment_targets/agent_engine/tests/load_test/load_test.py +0 -107
  174. src/deployment_targets/cloud_run/app/server.py +0 -154
  175. src/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +0 -249
  176. src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
  177. src/deployment_targets/cloud_run/tests/load_test/README.md +0 -83
  178. src/deployment_targets/cloud_run/tests/load_test/load_test.py +0 -118
  179. src/deployment_targets/cloud_run/uv.lock +0 -6952
  180. src/frontends/live_api_react/frontend/src/App.tsx +0 -205
  181. src/frontends/live_api_react/frontend/src/components/control-tray/ControlTray.tsx +0 -217
  182. src/frontends/live_api_react/frontend/src/components/control-tray/control-tray.scss +0 -201
  183. src/frontends/live_api_react/frontend/src/components/side-panel/SidePanel.tsx +0 -161
  184. src/frontends/live_api_react/frontend/src/components/side-panel/side-panel.scss +0 -285
  185. src/frontends/streamlit/frontend/side_bar.py +0 -214
  186. src/frontends/streamlit/frontend/streamlit_app.py +0 -265
  187. src/frontends/streamlit/frontend/style/app_markdown.py +0 -37
  188. src/frontends/streamlit/frontend/utils/chat_utils.py +0 -67
  189. src/frontends/streamlit/frontend/utils/local_chat_history.py +0 -125
  190. src/frontends/streamlit/frontend/utils/message_editing.py +0 -59
  191. src/frontends/streamlit/frontend/utils/multimodal_utils.py +0 -217
  192. src/frontends/streamlit/frontend/utils/stream_handler.py +0 -301
  193. src/frontends/streamlit/frontend/utils/title_summary.py +0 -94
  194. src/frontends/streamlit_adk/frontend/side_bar.py +0 -214
  195. src/frontends/streamlit_adk/frontend/streamlit_app.py +0 -314
  196. src/frontends/streamlit_adk/frontend/style/app_markdown.py +0 -37
  197. src/frontends/streamlit_adk/frontend/utils/chat_utils.py +0 -84
  198. src/frontends/streamlit_adk/frontend/utils/local_chat_history.py +0 -110
  199. src/frontends/streamlit_adk/frontend/utils/message_editing.py +0 -61
  200. src/frontends/streamlit_adk/frontend/utils/multimodal_utils.py +0 -223
  201. src/frontends/streamlit_adk/frontend/utils/stream_handler.py +0 -311
  202. src/frontends/streamlit_adk/frontend/utils/title_summary.py +0 -129
  203. src/resources/containers/data_processing/Dockerfile +0 -27
  204. src/resources/containers/e2e-tests/Dockerfile +0 -19
  205. src/resources/idx/.idx/dev.nix +0 -57
  206. src/resources/idx/idx-template.json +0 -21
  207. src/resources/idx/idx-template.nix +0 -26
  208. src/resources/locks/uv-adk_base-agent_engine.lock +0 -5338
  209. src/resources/locks/uv-adk_base-cloud_run.lock +0 -5930
  210. src/resources/locks/uv-agentic_rag-agent_engine.lock +0 -5528
  211. src/resources/locks/uv-agentic_rag-cloud_run.lock +0 -6120
  212. src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +0 -6231
  213. src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +0 -6839
  214. src/resources/locks/uv-langgraph_base_react-agent_engine.lock +0 -5233
  215. src/resources/locks/uv-langgraph_base_react-cloud_run.lock +0 -5862
  216. src/resources/locks/uv-live_api-cloud_run.lock +0 -5832
  217. src/resources/setup_cicd/cicd_variables.tf +0 -41
  218. src/resources/setup_cicd/github.tf +0 -87
  219. {agents → agent_starter_pack/agents}/agentic_rag/app/retrievers.py +0 -0
  220. {agents → agent_starter_pack/agents}/agentic_rag/app/templates.py +0 -0
  221. {src → agent_starter_pack}/base_template/deployment/terraform/dev/vars/env.tfvars +0 -0
  222. {src → agent_starter_pack}/base_template/tests/unit/test_dummy.py +0 -0
  223. {src/deployment_targets/agent_engine/app/utils → agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils}/gcs.py +0 -0
  224. {src → agent_starter_pack}/cli/utils/__init__.py +0 -0
  225. {src → agent_starter_pack}/cli/utils/datastores.py +0 -0
  226. {src → agent_starter_pack}/cli/utils/version.py +0 -0
  227. {src → agent_starter_pack}/data_ingestion/README.md +0 -0
  228. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +0 -0
  229. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/pipeline.py +0 -0
  230. {src → agent_starter_pack}/deployment_targets/agent_engine/deployment_metadata.json +0 -0
  231. {src → agent_starter_pack}/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
  232. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/favicon.ico +0 -0
  233. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/index.html +0 -0
  234. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/robots.txt +0 -0
  235. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/App.scss +0 -0
  236. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/App.test.tsx +0 -0
  237. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/audio-pulse/AudioPulse.tsx +0 -0
  238. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/audio-pulse/audio-pulse.scss +0 -0
  239. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/mock-logs.ts +0 -0
  240. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/contexts/LiveAPIContext.tsx +0 -0
  241. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-media-stream-mux.ts +0 -0
  242. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-screen-capture.ts +0 -0
  243. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-webcam.ts +0 -0
  244. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/index.css +0 -0
  245. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/index.tsx +0 -0
  246. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/react-app-env.d.ts +0 -0
  247. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/reportWebVitals.ts +0 -0
  248. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/setupTests.ts +0 -0
  249. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audioworklet-registry.ts +0 -0
  250. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/store-logger.ts +0 -0
  251. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/worklets/audio-processing.ts +0 -0
  252. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/worklets/vol-meter.ts +0 -0
  253. {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/tsconfig.json +0 -0
  254. {agent_starter_pack-0.3.3.dist-info → agent_starter_pack-0.21.0.dist-info}/WHEEL +0 -0
  255. {agent_starter_pack-0.3.3.dist-info → agent_starter_pack-0.21.0.dist-info}/licenses/LICENSE +0 -0
@@ -13,11 +13,15 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import importlib.metadata
16
+ import sys
16
17
 
17
18
  import click
18
19
  from rich.console import Console
19
20
 
20
21
  from .commands.create import create
22
+ from .commands.enhance import enhance
23
+ from .commands.list import list_agents
24
+ from .commands.register_gemini_enterprise import register_gemini_enterprise
21
25
  from .commands.setup_cicd import setup_cicd
22
26
  from .utils import display_update_message
23
27
 
@@ -46,13 +50,17 @@ def print_version(ctx: click.Context, param: click.Parameter, value: bool) -> No
46
50
  help="Show the version and exit.",
47
51
  )
48
52
  def cli() -> None:
49
- # Check for updates at startup
50
- display_update_message()
53
+ # Check for updates at startup (skip if --agent-garden, -ag, or --locked is used)
54
+ if not any(flag in sys.argv for flag in ("--agent-garden", "-ag", "--locked")):
55
+ display_update_message()
51
56
 
52
57
 
53
58
  # Register commands
54
59
  cli.add_command(create)
60
+ cli.add_command(enhance)
61
+ cli.add_command(register_gemini_enterprise)
55
62
  cli.add_command(setup_cicd)
63
+ cli.add_command(list_agents, name="list")
56
64
 
57
65
 
58
66
  if __name__ == "__main__":
@@ -89,11 +89,7 @@ def setup_repository_name(
89
89
 
90
90
 
91
91
  def create_github_connection(
92
- project_id: str,
93
- region: str,
94
- connection_name: str,
95
- repository_name: str,
96
- repository_owner: str,
92
+ project_id: str, region: str, connection_name: str
97
93
  ) -> tuple[str, str]:
98
94
  """Create and verify GitHub connection using gcloud command.
99
95
 
@@ -101,52 +97,132 @@ def create_github_connection(
101
97
  project_id: GCP project ID
102
98
  region: GCP region
103
99
  connection_name: Name for the GitHub connection
104
- repository_name: Name of repository to create
105
- repository_owner: Owner of repository
106
100
 
107
101
  Returns:
108
102
  tuple[str, str]: The OAuth token secret ID and the app installation ID
109
103
  """
110
104
  console.print("\n🔗 Creating GitHub connection...")
111
105
 
112
- # Create repository if details provided
106
+ # First, ensure required APIs are enabled
107
+ console.print("🔧 Ensuring required APIs are enabled...")
113
108
  try:
114
- # Check if repo exists
115
- result = run_command(
109
+ # Enable Cloud Build API
110
+ run_command(
116
111
  [
117
- "gh",
118
- "repo",
119
- "view",
120
- f"{repository_owner}/{repository_name}",
121
- "--json",
122
- "name",
112
+ "gcloud",
113
+ "services",
114
+ "enable",
115
+ "cloudbuild.googleapis.com",
116
+ "--project",
117
+ project_id,
123
118
  ],
124
119
  capture_output=True,
125
- check=False,
120
+ check=False, # Don't fail if already enabled
126
121
  )
122
+ console.print("✅ Cloud Build API enabled")
127
123
 
128
- if result.returncode != 0:
129
- # Repository doesn't exist, create it
130
- console.print(
131
- f"\n📦 Creating GitHub repository: {repository_owner}/{repository_name}"
132
- )
133
- run_command(
134
- [
135
- "gh",
136
- "repo",
137
- "create",
138
- f"{repository_owner}/{repository_name}",
139
- "--private",
140
- "--description",
141
- "Repository created by Terraform",
142
- ]
143
- )
144
- console.print("✅ GitHub repository created")
145
- else:
146
- console.print("✅ Using existing GitHub repository")
124
+ # Enable Secret Manager API
125
+ run_command(
126
+ [
127
+ "gcloud",
128
+ "services",
129
+ "enable",
130
+ "secretmanager.googleapis.com",
131
+ "--project",
132
+ project_id,
133
+ ],
134
+ capture_output=True,
135
+ check=False, # Don't fail if already enabled
136
+ )
137
+ console.print(" Secret Manager API enabled")
138
+
139
+ # Wait for the APIs to fully initialize and create the service account
140
+ console.print(
141
+ "⏳ Waiting for Cloud Build service account to be created (this typically takes 5-10 seconds)..."
142
+ )
143
+ time.sleep(10)
147
144
  except subprocess.CalledProcessError as e:
148
- console.print(f" Failed to create/check repository: {e!s}", style="bold red")
149
- raise
145
+ console.print(f"⚠️ Could not enable required APIs: {e}", style="yellow")
146
+
147
+ # Get the Cloud Build service account and grant permissions with retry logic
148
+ try:
149
+ project_number_result = run_command(
150
+ [
151
+ "gcloud",
152
+ "projects",
153
+ "describe",
154
+ project_id,
155
+ "--format=value(projectNumber)",
156
+ ],
157
+ capture_output=True,
158
+ check=True,
159
+ )
160
+ project_number = project_number_result.stdout.strip()
161
+ cloud_build_sa = (
162
+ f"service-{project_number}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
163
+ )
164
+
165
+ console.print(
166
+ "🔧 Granting Secret Manager permissions to Cloud Build service account..."
167
+ )
168
+
169
+ # Try to grant permissions with retry logic
170
+ max_retries = 3
171
+ for attempt in range(max_retries):
172
+ try:
173
+ # Grant Secret Manager Admin role to Cloud Build service account
174
+ result = run_command(
175
+ [
176
+ "gcloud",
177
+ "projects",
178
+ "add-iam-policy-binding",
179
+ project_id,
180
+ f"--member=serviceAccount:{cloud_build_sa}",
181
+ "--role=roles/secretmanager.admin",
182
+ "--condition=None",
183
+ ],
184
+ capture_output=True,
185
+ check=True,
186
+ )
187
+ console.print(
188
+ "✅ Secret Manager permissions granted to Cloud Build service account"
189
+ )
190
+ break
191
+ except subprocess.CalledProcessError as e:
192
+ if "does not exist" in str(e.stderr) and attempt < max_retries - 1:
193
+ console.print(
194
+ f"⚠️ Service account not ready yet (attempt {attempt + 1}/{max_retries}). Retrying in 10 seconds...",
195
+ style="yellow",
196
+ )
197
+ time.sleep(10)
198
+ elif attempt < max_retries - 1:
199
+ console.print(
200
+ f"⚠️ Failed to grant permissions (attempt {attempt + 1}/{max_retries}). Retrying in 5 seconds...",
201
+ style="yellow",
202
+ )
203
+ time.sleep(5)
204
+ else:
205
+ console.print(
206
+ f"⚠️ Could not grant Secret Manager permissions after {max_retries} attempts",
207
+ style="yellow",
208
+ )
209
+ console.print(
210
+ "You may need to manually grant the permissions if the connection creation fails."
211
+ )
212
+ # Don't fail here, let the connection creation attempt proceed
213
+
214
+ # Wait for IAM changes to propagate
215
+ console.print(
216
+ "⏳ Waiting for IAM permissions to propagate (this typically takes 5-10 seconds)..."
217
+ )
218
+ time.sleep(10) # Give IAM time to propagate before proceeding
219
+ except subprocess.CalledProcessError as e:
220
+ console.print(
221
+ f"⚠️ Could not setup Cloud Build service account: {e}", style="yellow"
222
+ )
223
+ console.print(
224
+ "You may need to manually grant the permissions if the connection creation fails."
225
+ )
150
226
 
151
227
  def try_create_connection() -> subprocess.CompletedProcess[str]:
152
228
  cmd = [
@@ -170,6 +246,7 @@ def create_github_connection(
170
246
  stdout=subprocess.PIPE,
171
247
  stderr=subprocess.PIPE,
172
248
  text=True,
249
+ encoding="utf-8",
173
250
  )
174
251
 
175
252
  # Send 'y' followed by enter key to handle both the API enablement prompt and any other prompts
@@ -257,7 +334,10 @@ def create_github_connection(
257
334
  return secret_id, app_installation_id
258
335
  elif status == "PENDING_USER_OAUTH" or status == "PENDING_INSTALL_APP":
259
336
  if attempt < max_retries - 1: # Don't print waiting on last attempt
260
- console.print("⏳ Waiting for GitHub authorization...")
337
+ console.print("⏳ Waiting for authorization...")
338
+ print(
339
+ f"Console: https://console.cloud.google.com/cloud-build/repositories?project={project_id}"
340
+ )
261
341
  # Extract and print the action URI for user authentication
262
342
  try:
263
343
  action_uri = (
@@ -270,9 +350,9 @@ def create_github_connection(
270
350
  "\n🔑 Authentication Required:", style="bold yellow"
271
351
  )
272
352
  console.print(
273
- f"Please visit [link={action_uri}]this page[/link] to authenticate Cloud Build with GitHub:"
353
+ f"Please visit [link={action_uri}][bold blue]this page[/bold blue][/link] to authenticate Cloud Build with GitHub:"
274
354
  )
275
- console.print(f"{action_uri}", style="bold blue")
355
+ print(f"\n{action_uri}\n")
276
356
  console.print(
277
357
  "(Copy and paste the link into your browser if clicking doesn't work)"
278
358
  )
@@ -305,12 +385,12 @@ class ProjectConfig:
305
385
  cicd_project_id: str
306
386
  agent: str
307
387
  deployment_target: str
388
+ repository_name: str
389
+ repository_owner: str
308
390
  region: str = "us-central1"
309
391
  dev_project_id: str | None = None
310
392
  project_name: str | None = None
311
- repository_name: str | None = None
312
- repository_owner: str | None = None
313
- repository_exists: bool | None = None
393
+ create_repository: bool | None = None
314
394
  host_connection_name: str | None = None
315
395
  github_pat: str | None = None
316
396
  github_app_installation_id: str | None = None
@@ -447,6 +527,7 @@ def run_command(
447
527
  capture_output: bool = False,
448
528
  shell: bool = False,
449
529
  input: str | None = None,
530
+ env_vars: dict[str, str] | None = None,
450
531
  ) -> subprocess.CompletedProcess:
451
532
  """Run a command and display it to the user"""
452
533
  # Format command for display
@@ -455,6 +536,14 @@ def run_command(
455
536
  if cwd:
456
537
  print(f"📂 In directory: {cwd}")
457
538
 
539
+ # Prepare environment variables
540
+ env = None
541
+ if env_vars:
542
+ import os
543
+
544
+ env = os.environ.copy()
545
+ env.update(env_vars)
546
+
458
547
  # Run the command
459
548
  result = subprocess.run(
460
549
  cmd,
@@ -464,6 +553,7 @@ def run_command(
464
553
  text=True,
465
554
  shell=shell,
466
555
  input=input,
556
+ env=env,
467
557
  )
468
558
 
469
559
  # Display output if captured
@@ -517,6 +607,7 @@ def handle_github_authentication() -> None:
517
607
  stdout=subprocess.PIPE,
518
608
  stderr=subprocess.PIPE,
519
609
  text=True,
610
+ encoding="utf-8",
520
611
  )
521
612
  stdout, stderr = process.communicate(input=token + "\n")
522
613
 
@@ -607,7 +698,7 @@ class E2EDeployment:
607
698
  project_dir / "deployment" / "terraform" / "dev" / "vars" / "env.tfvars"
608
699
  )
609
700
 
610
- with open(tf_vars_path) as f:
701
+ with open(tf_vars_path, encoding="utf-8") as f:
611
702
  content = f.read()
612
703
 
613
704
  # Replace dev project ID
@@ -622,7 +713,7 @@ class E2EDeployment:
622
713
  project_dir / "deployment" / "terraform" / "vars" / "env.tfvars"
623
714
  )
624
715
 
625
- with open(tf_vars_path) as f:
716
+ with open(tf_vars_path, encoding="utf-8") as f:
626
717
  content = f.read()
627
718
 
628
719
  # Replace all project IDs
@@ -655,7 +746,7 @@ class E2EDeployment:
655
746
  )
656
747
 
657
748
  # Write updated content
658
- with open(tf_vars_path, "w") as f:
749
+ with open(tf_vars_path, "w", encoding="utf-8") as f:
659
750
  f.write(content)
660
751
 
661
752
  def setup_terraform_state(self, project_dir: Path, env: Environment) -> None:
@@ -709,7 +800,7 @@ class E2EDeployment:
709
800
  state_prefix = "dev" if is_dev_dir else "prod"
710
801
 
711
802
  backend_file = tf_dir / "backend.tf"
712
- with open(backend_file, "w") as f:
803
+ with open(backend_file, "w", encoding="utf-8") as f:
713
804
  f.write(f'''terraform {{
714
805
  backend "gcs" {{
715
806
  bucket = "{bucket_name}"
@@ -0,0 +1,263 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # ruff: noqa: E722
16
+ import os
17
+ import subprocess
18
+ import time
19
+
20
+ # Suppress gRPC verbose logging
21
+ os.environ["GRPC_VERBOSITY"] = "NONE"
22
+
23
+ import google.auth
24
+ from google.api_core.client_options import ClientOptions
25
+ from google.api_core.exceptions import PermissionDenied
26
+ from google.api_core.gapic_v1.client_info import ClientInfo
27
+ from google.cloud.aiplatform import initializer
28
+ from google.cloud.aiplatform_v1beta1.services.prediction_service import (
29
+ PredictionServiceClient,
30
+ )
31
+ from google.cloud.aiplatform_v1beta1.types.prediction_service import (
32
+ CountTokensRequest,
33
+ )
34
+ from rich.console import Console
35
+ from rich.prompt import Confirm
36
+
37
+ from agent_starter_pack.cli.utils.version import PACKAGE_NAME, get_current_version
38
+
39
+ console = Console()
40
+
41
+ _AUTH_ERROR_MESSAGE = (
42
+ "Looks like you are not authenticated with Google Cloud.\n"
43
+ "Please run: `gcloud auth login --update-adc`\n"
44
+ "Then set your project: `gcloud config set project YOUR_PROJECT_ID`"
45
+ )
46
+
47
+
48
+ def enable_vertex_ai_api(
49
+ project_id: str, auto_approve: bool = False, context: str | None = None
50
+ ) -> bool:
51
+ """Enable Vertex AI API with user confirmation and propagation waiting."""
52
+ api_name = "aiplatform.googleapis.com"
53
+
54
+ # First test if API is already working with a direct connection
55
+ if _test_vertex_ai_connection(project_id, context=context):
56
+ return True
57
+
58
+ if not auto_approve:
59
+ console.print(
60
+ f"Vertex AI API is not enabled in project '{project_id}'.", style="yellow"
61
+ )
62
+ console.print(
63
+ "To continue, we need to enable the Vertex AI API.", style="yellow"
64
+ )
65
+
66
+ if not Confirm.ask(
67
+ "Do you want to enable the Vertex AI API now?", default=True
68
+ ):
69
+ return False
70
+
71
+ try:
72
+ console.print("Enabling Vertex AI API...")
73
+ subprocess.run(
74
+ [
75
+ "gcloud",
76
+ "services",
77
+ "enable",
78
+ api_name,
79
+ "--project",
80
+ project_id,
81
+ ],
82
+ check=True,
83
+ capture_output=True,
84
+ text=True,
85
+ )
86
+ console.print("✓ Vertex AI API enabled successfully")
87
+
88
+ # Wait for API propagation
89
+ console.print("⏳ Waiting for API availability to propagate...")
90
+ max_wait_time = 180 # 3 minutes
91
+ check_interval = 10 # 10 seconds
92
+ start_time = time.time()
93
+
94
+ while time.time() - start_time < max_wait_time:
95
+ if _test_vertex_ai_connection(project_id, context=context):
96
+ console.print("✓ Vertex AI API is now available")
97
+ return True
98
+ time.sleep(check_interval)
99
+ console.print("⏳ Still waiting for API propagation...")
100
+
101
+ console.print(
102
+ "⚠️ API propagation took longer than expected, but continuing...",
103
+ style="yellow",
104
+ )
105
+ return True
106
+
107
+ except subprocess.CalledProcessError as e:
108
+ console.print(f"Failed to enable Vertex AI API: {e.stderr}", style="bold red")
109
+ return False
110
+
111
+
112
+ def _test_vertex_ai_connection(
113
+ project_id: str, location: str = "us-central1", context: str | None = None
114
+ ) -> bool:
115
+ """Test Vertex AI connection without raising exceptions."""
116
+ try:
117
+ credentials, _ = google.auth.default()
118
+ client = PredictionServiceClient(
119
+ credentials=credentials,
120
+ client_options=ClientOptions(
121
+ api_endpoint=f"{location}-aiplatform.googleapis.com"
122
+ ),
123
+ client_info=get_client_info(context),
124
+ transport=initializer.global_config._api_transport,
125
+ )
126
+ request = get_dummy_request(project_id=project_id)
127
+ client.count_tokens(request=request)
128
+ return True
129
+ except Exception:
130
+ return False
131
+
132
+
133
+ def get_user_agent(context: str | None = None) -> str:
134
+ """Returns a custom user agent string."""
135
+ version = get_current_version()
136
+ prefix = "ag" if context == "agent-garden" else ""
137
+ return f"{prefix}{version}-{PACKAGE_NAME}/{prefix}{version}-{PACKAGE_NAME}"
138
+
139
+
140
+ def get_client_info(context: str | None = None) -> ClientInfo:
141
+ """Returns ClientInfo with custom user agent."""
142
+ user_agent = get_user_agent(context)
143
+ return ClientInfo(client_library_version=user_agent, user_agent=user_agent)
144
+
145
+
146
+ def get_dummy_request(project_id: str) -> CountTokensRequest:
147
+ """Creates a simple test request for Gemini."""
148
+ return CountTokensRequest(
149
+ contents=[{"role": "user", "parts": [{"text": "Hi"}]}],
150
+ endpoint=f"projects/{project_id}/locations/global/publishers/google/models/gemini-2.5-flash",
151
+ )
152
+
153
+
154
+ def verify_vertex_connection(
155
+ project_id: str,
156
+ location: str = "us-central1",
157
+ auto_approve: bool = False,
158
+ context: str | None = None,
159
+ ) -> None:
160
+ """Verifies Vertex AI connection with a test Gemini request."""
161
+ # First try direct connection - if it works, we're done
162
+ if _test_vertex_ai_connection(project_id, location, context):
163
+ return
164
+
165
+ # If that failed, try to enable the API
166
+ if not enable_vertex_ai_api(project_id, auto_approve, context):
167
+ raise Exception("Vertex AI API is not enabled and user declined to enable it")
168
+
169
+ # After enabling, test again with proper error handling
170
+ credentials, _ = google.auth.default()
171
+ client = PredictionServiceClient(
172
+ credentials=credentials,
173
+ client_options=ClientOptions(
174
+ api_endpoint=f"{location}-aiplatform.googleapis.com"
175
+ ),
176
+ client_info=get_client_info(context),
177
+ transport=initializer.global_config._api_transport,
178
+ )
179
+ request = get_dummy_request(project_id=project_id)
180
+
181
+ try:
182
+ client.count_tokens(request=request)
183
+ except PermissionDenied as e:
184
+ error_message = str(e)
185
+ # Check if the error is specifically about API not being enabled
186
+ if (
187
+ "has not been used" in error_message
188
+ and "aiplatform.googleapis.com" in error_message
189
+ ):
190
+ # This shouldn't happen since we checked above, but handle it gracefully
191
+ console.print(
192
+ "⚠️ API may still be propagating, retrying in 30 seconds...",
193
+ style="yellow",
194
+ )
195
+ time.sleep(30)
196
+ try:
197
+ client.count_tokens(request=request)
198
+ except PermissionDenied:
199
+ raise Exception(
200
+ "Vertex AI API is enabled but not yet available. Please wait a few more minutes and try again."
201
+ ) from e
202
+ else:
203
+ # Re-raise other permission errors
204
+ raise
205
+
206
+
207
+ def verify_credentials() -> dict:
208
+ """Verify GCP credentials and return current project and account."""
209
+ try:
210
+ # Get credentials and project
211
+ credentials, project = google.auth.default()
212
+
213
+ # Try multiple methods to get account email
214
+ account = None
215
+
216
+ # Method 1: Try _account attribute
217
+ if hasattr(credentials, "_account"):
218
+ account = credentials._account
219
+
220
+ # Method 2: Try service_account_email
221
+ if not account and hasattr(credentials, "service_account_email"):
222
+ account = credentials.service_account_email
223
+
224
+ # Method 3: Try getting from token info if available
225
+ if not account and hasattr(credentials, "id_token"):
226
+ try:
227
+ import jwt
228
+
229
+ decoded = jwt.decode(
230
+ credentials.id_token, options={"verify_signature": False}
231
+ )
232
+ account = decoded.get("email")
233
+ except:
234
+ pass
235
+
236
+ # Method 4: Try getting from gcloud config as fallback
237
+ if not account:
238
+ try:
239
+ result = subprocess.run(
240
+ ["gcloud", "config", "get-value", "account"],
241
+ capture_output=True,
242
+ text=True,
243
+ )
244
+ account = result.stdout.strip()
245
+ except:
246
+ pass
247
+
248
+ # Fallback if all methods fail
249
+ if not account:
250
+ account = "Unknown account"
251
+
252
+ return {"project": project, "account": account}
253
+ except google.auth.exceptions.DefaultCredentialsError as e:
254
+ # Authentication error - provide friendly message
255
+ raise Exception(_AUTH_ERROR_MESSAGE) from e
256
+ except Exception as e:
257
+ # Check if the error message indicates authentication issues
258
+ error_str = str(e).lower()
259
+ if any(
260
+ keyword in error_str for keyword in ["credential", "auth", "login", "token"]
261
+ ):
262
+ raise Exception(_AUTH_ERROR_MESSAGE) from e
263
+ raise Exception(f"Failed to verify GCP credentials: {e!s}") from e