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
@@ -9,51 +9,41 @@ dependencies = [
9
9
  {%- for dep in cookiecutter.extra_dependencies %}
10
10
  "{{ dep }}",
11
11
  {%- endfor %}
12
- "opentelemetry-exporter-gcp-trace~=1.9.0",
13
- {%- if "adk" not in cookiecutter.tags %}
14
- "langchain-core~=0.3.9",
15
- "traceloop-sdk~=0.38.7",
12
+ {%- if cookiecutter.is_adk %}
13
+ "opentelemetry-instrumentation-google-genai>=0.1.0,<1.0.0",
14
+ "gcsfs>=2024.11.0",
16
15
  {%- endif %}
17
- "google-cloud-logging~=3.11.4",
16
+ "google-cloud-logging>=3.12.0,<4.0.0",
18
17
  {%- if cookiecutter.deployment_target == 'cloud_run' %}
19
- "google-cloud-aiplatform[evaluation]~=1.88.0",
18
+ "google-cloud-aiplatform[evaluation]>=1.118.0,<2.0.0",
20
19
  "fastapi~=0.115.8",
21
- "uvicorn~=0.34.0"
20
+ "uvicorn~=0.34.0",
21
+ "psycopg2-binary>=2.9.10,<3.0.0",
22
22
  {%- elif cookiecutter.deployment_target == 'agent_engine' %}
23
- "google-cloud-aiplatform[evaluation,agent-engines]~=1.88.0"
23
+ "google-cloud-aiplatform[evaluation,agent-engines]>=1.118.0,<2.0.0",
24
+ "protobuf>=6.31.1,<7.0.0",
24
25
  {%- endif %}
25
26
  ]
26
- {% if cookiecutter.deployment_target == 'cloud_run' %}
27
27
  requires-python = ">=3.10,<3.14"
28
- {% elif cookiecutter.deployment_target == 'agent_engine' %}
29
- requires-python = ">=3.10,<3.13"
30
- {%- endif %}
28
+
31
29
 
32
30
  [dependency-groups]
33
31
  dev = [
34
- "pytest>=8.3.4",
35
- "pytest-asyncio>=0.23.8",
36
- "nest-asyncio>=1.6.0",
32
+ "pytest>=8.3.4,<9.0.0",
33
+ "pytest-asyncio>=0.23.8,<1.0.0",
34
+ "nest-asyncio>=1.6.0,<2.0.0",
37
35
  ]
38
36
 
39
37
  [project.optional-dependencies]
40
- {% if cookiecutter.agent_name != 'live_api' and "adk" not in cookiecutter.tags %}
41
- streamlit = [
42
- "streamlit~=1.42.0",
43
- "streamlit-extras~=0.4.3",
44
- "extra-streamlit-components~=0.1.71",
45
- "streamlit-feedback~=0.1.3",
46
- ]
47
- {% endif %}
48
38
  jupyter = [
49
- "jupyter~=1.0.0",
39
+ "jupyter>=1.0.0,<2.0.0",
50
40
  ]
51
41
  lint = [
52
- "ruff>=0.4.6",
53
- "mypy~=1.15.0",
54
- "codespell~=2.2.0",
55
- "types-pyyaml~=6.0.12.20240917",
56
- "types-requests~=2.32.0.20240914",
42
+ "ruff>=0.4.6,<1.0.0",
43
+ "mypy>=1.15.0,<2.0.0",
44
+ "codespell>=2.2.0,<3.0.0",
45
+ "types-pyyaml>=6.0.12.20240917,<7.0.0",
46
+ "types-requests>=2.32.0.20240914,<3.0.0",
57
47
  ]
58
48
 
59
49
  [tool.ruff]
@@ -71,10 +61,10 @@ select = [
71
61
  "UP", # pyupgrade
72
62
  "RUF", # ruff specific rules
73
63
  ]
74
- ignore = ["E501", "C901"] # ignore line too long, too complex
64
+ ignore = ["E501", "C901", "B006"] # ignore line too long, too complex
75
65
 
76
66
  [tool.ruff.lint.isort]
77
- known-first-party = ["app", "frontend"]
67
+ known-first-party = ["{{cookiecutter.agent_directory}}", "frontend"]
78
68
 
79
69
  [tool.mypy]
80
70
  disallow_untyped_calls = true
@@ -91,7 +81,7 @@ follow_imports = "silent"
91
81
  ignore_missing_imports = true
92
82
  explicit_package_bases = true
93
83
  disable_error_code = ["misc", "no-untyped-call", "no-any-return"]
94
- {% if cookiecutter.agent_name == 'live_api' %}
84
+ {% if cookiecutter.is_adk_live %}
95
85
  exclude = [".venv","./frontend"]
96
86
  {% else %}
97
87
  exclude = [".venv"]
@@ -99,11 +89,8 @@ exclude = [".venv"]
99
89
 
100
90
  [tool.codespell]
101
91
  ignore-words-list = "rouge"
102
- {% if cookiecutter.agent_name == 'live_api' %}
103
92
  skip = "./locust_env/*,uv.lock,.venv,./frontend,**/*.ipynb"
104
- {% else %}
105
- skip = "./locust_env/*,uv.lock,.venv,**/*.ipynb"
106
- {%- endif %}
93
+
107
94
 
108
95
  [build-system]
109
96
  requires = ["hatchling"]
@@ -115,4 +102,4 @@ pythonpath = "."
115
102
  asyncio_default_fixture_loop_scope = "function"
116
103
 
117
104
  [tool.hatch.build.targets.wheel]
118
- packages = ["app","frontend"]
105
+ packages = ["{{cookiecutter.agent_directory}}","frontend"]
@@ -0,0 +1,132 @@
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
+ name: Deploy to Production
16
+
17
+ on:
18
+ workflow_dispatch:
19
+ workflow_call:
20
+
21
+ jobs:
22
+ deploy:
23
+ runs-on: ubuntu-latest
24
+ # This job targets the 'production' environment, which is automatically
25
+ # created by the Terraform setup in `deployment/terraform/github.tf`.
26
+ # To enable manual approval for deployments, you must add a protection
27
+ # rule to this environment in your GitHub repository settings.
28
+ #
29
+ # 1. Go to your repository's Settings > Environments.
30
+ # 2. Select the 'production' environment.
31
+ # 3. Under 'Protection rules', check the 'Required reviewers' box.
32
+ # 4. Add the specific users or teams who must approve the deployment.
33
+ #
34
+ # Once configured, the workflow will pause at this step and wait for an
35
+ # authorized user to approve it before proceeding.
36
+ environment:
37
+ name: production
38
+ concurrency: production
39
+ permissions:
40
+ contents: 'read'
41
+ id-token: 'write'
42
+
43
+ steps:
44
+ - name: Checkout code
45
+ uses: actions/checkout@v4
46
+
47
+ - name: Set up Python 3.12
48
+ uses: actions/setup-python@v4
49
+ with:
50
+ python-version: '3.12'
51
+
52
+ - id: 'auth'
53
+ name: 'Authenticate to Google Cloud'
54
+ uses: 'google-github-actions/auth@v2'
55
+ with:
56
+ workload_identity_provider: 'projects/{% raw %}${{ vars.GCP_PROJECT_NUMBER }}{% endraw %}/locations/global/workloadIdentityPools/{% raw %}${{ secrets.WIF_POOL_ID }}{% endraw %}/providers/{% raw %}${{ secrets.WIF_PROVIDER_ID }}{% endraw %}'
57
+ service_account: '{% raw %}${{ secrets.GCP_SERVICE_ACCOUNT }}{% endraw %}'
58
+ create_credentials_file: true
59
+ project_id: {% raw %}${{ vars.CICD_PROJECT_ID }}{% endraw %}
60
+
61
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
62
+
63
+ - name: Set up Cloud SDK
64
+ uses: 'google-github-actions/setup-gcloud@v2'
65
+ {%- endif %}
66
+
67
+ {%- if cookiecutter.deployment_target == 'agent_engine' %}
68
+ - name: Install uv and dependencies
69
+ run: |
70
+ pip install uv==0.8.13
71
+ uv sync --locked
72
+ {%- if cookiecutter.is_a2a %}
73
+
74
+ - name: Extract version from pyproject.toml
75
+ id: extract-version
76
+ run: |
77
+ VERSION=$(awk -F'"' '/^version = / {print $2}' pyproject.toml || echo '0.0.0')
78
+ echo "version=${VERSION}" >> $GITHUB_OUTPUT
79
+ {%- endif %}
80
+ {%- endif %}
81
+
82
+ {%- if cookiecutter.data_ingestion %}
83
+ - name: Deploy data ingestion pipeline (Production)
84
+ run: |
85
+ cd data_ingestion && pip install uv==0.8.13 && cd data_ingestion_pipeline && \
86
+ uv sync --locked && uv run python submit_pipeline.py
87
+ env:
88
+ PIPELINE_ROOT: {% raw %}${{ vars.PIPELINE_GCS_ROOT_PROD }}{% endraw %}
89
+ REGION: {% raw %}${{ vars.REGION }}{% endraw %}
90
+ {%- if cookiecutter.datastore_type == "vertex_ai_search" %}
91
+ DATA_STORE_REGION: {% raw %}${{ vars.DATA_STORE_REGION }}{% endraw %}
92
+ DATA_STORE_ID: {% raw %}${{ vars.DATA_STORE_ID_PROD }}{% endraw %}
93
+ {%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %}
94
+ VECTOR_SEARCH_INDEX: {% raw %}${{ vars.VECTOR_SEARCH_INDEX_PROD }}{% endraw %}
95
+ VECTOR_SEARCH_INDEX_ENDPOINT: {% raw %}${{ vars.VECTOR_SEARCH_INDEX_ENDPOINT_PROD }}{% endraw %}
96
+ VECTOR_SEARCH_BUCKET: {% raw %}${{ vars.VECTOR_SEARCH_BUCKET_PROD }}{% endraw %}
97
+ {%- endif %}
98
+ PROJECT_ID: {% raw %}${{ vars.PROD_PROJECT_ID }}{% endraw %}
99
+ SERVICE_ACCOUNT: {% raw %}${{ vars.PIPELINE_SA_EMAIL_PROD }}{% endraw %}
100
+ PIPELINE_NAME: {% raw %}${{ vars.PIPELINE_NAME }}{% endraw %}
101
+ CRON_SCHEDULE: {% raw %}${{ vars.PIPELINE_CRON_SCHEDULE }}{% endraw %}
102
+ DISABLE_CACHING: "TRUE"
103
+ {%- endif %}
104
+
105
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
106
+
107
+ - name: Deploy to Production (Cloud Run)
108
+ run: |
109
+ gcloud run deploy {{cookiecutter.project_name}} \
110
+ --image {% raw %}${{ vars.REGION }}{% endraw %}-docker.pkg.dev/{% raw %}${{ vars.CICD_PROJECT_ID }}{% endraw %}/{% raw %}${{ vars.ARTIFACT_REGISTRY_REPO_NAME }}{% endraw %}/{% raw %}${{ vars.CONTAINER_NAME }}{% endraw %} \
111
+ --region {% raw %}${{ vars.REGION }}{% endraw %} \
112
+ --project {% raw %}${{ vars.PROD_PROJECT_ID }}{% endraw %}
113
+
114
+ {%- elif cookiecutter.deployment_target == 'agent_engine' %}
115
+
116
+ - name: Deploy to Production (Agent Engine)
117
+ run: |
118
+ {%- if cookiecutter.is_a2a %}
119
+ AGENT_VERSION={% raw %}${{ steps.extract-version.outputs.version }}{% endraw %}
120
+ {%- endif %}
121
+ uv export --no-hashes --no-sources --no-header --no-dev --no-emit-project --no-annotate --locked > {{cookiecutter.agent_directory}}/app_utils/.requirements.txt
122
+ uv run python -m {{cookiecutter.agent_directory}}.app_utils.deploy \
123
+ --project {% raw %}${{ vars.PROD_PROJECT_ID }}{% endraw %} \
124
+ --location {% raw %}${{ vars.REGION }}{% endraw %} \
125
+ --source-packages=./{{cookiecutter.agent_directory}} \
126
+ --entrypoint-module={{cookiecutter.agent_directory}}.agent_engine_app \
127
+ --entrypoint-object=agent_engine \
128
+ --requirements-file={{cookiecutter.agent_directory}}/app_utils/.requirements.txt \
129
+ --service-account={% raw %}${{ vars.APP_SERVICE_ACCOUNT_PROD }}{% endraw %} \
130
+ --set-env-vars="COMMIT_SHA={% raw %}${{ github.sha }}{% endraw %}{%- if cookiecutter.is_a2a %},AGENT_VERSION=$AGENT_VERSION{%- endif %},LOGS_BUCKET_NAME={% raw %}${{ vars.LOGS_BUCKET_NAME_PROD }}{% endraw %}{%- if cookiecutter.data_ingestion %}{%- if cookiecutter.datastore_type == "vertex_ai_search" %},DATA_STORE_ID={% raw %}${{ vars.DATA_STORE_ID_PROD }}{% endraw %},DATA_STORE_REGION={% raw %}${{ vars.DATA_STORE_REGION }}{% endraw %}{%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %},VECTOR_SEARCH_INDEX={% raw %}${{ vars.VECTOR_SEARCH_INDEX_PROD }}{% endraw %},VECTOR_SEARCH_INDEX_ENDPOINT={% raw %}${{ vars.VECTOR_SEARCH_INDEX_ENDPOINT_PROD }}{% endraw %},VECTOR_SEARCH_BUCKET={% raw %}${{ vars.VECTOR_SEARCH_BUCKET_PROD }}{% endraw %}{%- endif %}{%- endif %}"
131
+ {%- endif %}
132
+
@@ -0,0 +1,65 @@
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
+ name: PR Checks
16
+
17
+ on:
18
+ pull_request:
19
+ branches:
20
+ - main
21
+ paths:
22
+ - '{{cookiecutter.agent_directory}}/**'
23
+ - 'data_ingestion/**'
24
+ - 'tests/**'
25
+ - 'deployment/**'
26
+ - 'uv.lock'
27
+ {%- if cookiecutter.data_ingestion %}
28
+ - 'data_ingestion/**'
29
+ {%- endif %}
30
+
31
+ jobs:
32
+ test:
33
+ runs-on: ubuntu-latest
34
+ permissions:
35
+ contents: 'read'
36
+ id-token: 'write'
37
+ steps:
38
+ - name: Checkout code
39
+ uses: actions/checkout@v4
40
+
41
+ - id: 'auth'
42
+ name: 'Authenticate to Google Cloud'
43
+ uses: 'google-github-actions/auth@v2'
44
+ with:
45
+ workload_identity_provider: 'projects/{% raw %}${{ vars.GCP_PROJECT_NUMBER }}{% endraw %}/locations/global/workloadIdentityPools/{% raw %}${{ secrets.WIF_POOL_ID }}{% endraw %}/providers/{% raw %}${{ secrets.WIF_PROVIDER_ID }}{% endraw %}'
46
+ service_account: '{% raw %}${{ secrets.GCP_SERVICE_ACCOUNT }}{% endraw %}'
47
+ create_credentials_file: true
48
+ project_id: {% raw %}${{ vars.CICD_PROJECT_ID }}{% endraw %}
49
+
50
+
51
+ - name: Set up Python 3.12
52
+ uses: actions/setup-python@v4
53
+ with:
54
+ python-version: '3.12'
55
+
56
+ - name: Install uv and dependencies
57
+ run: |
58
+ pip install uv==0.8.13
59
+ uv sync --locked
60
+
61
+ - name: Run unit tests
62
+ run: uv run pytest tests/unit
63
+
64
+ - name: Run integration tests
65
+ run: uv run pytest tests/integration
@@ -0,0 +1,259 @@
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
+ name: Deploy to Staging
16
+
17
+ on:
18
+ push:
19
+ branches:
20
+ - main
21
+ paths:
22
+ - '{{cookiecutter.agent_directory}}/**'
23
+ - 'data_ingestion/**'
24
+ - 'tests/**'
25
+ - 'deployment/**'
26
+ - 'uv.lock'
27
+
28
+ jobs:
29
+ deploy_and_test_staging:
30
+ runs-on: ubuntu-latest
31
+ permissions:
32
+ contents: 'read'
33
+ id-token: 'write'
34
+
35
+ steps:
36
+ - name: Checkout code
37
+ uses: actions/checkout@v4
38
+
39
+ - name: Set up Python 3.12
40
+ uses: actions/setup-python@v4
41
+ with:
42
+ python-version: '3.12'
43
+
44
+ - id: 'auth'
45
+ name: 'Authenticate to Google Cloud'
46
+ uses: 'google-github-actions/auth@v2'
47
+ with:
48
+ workload_identity_provider: 'projects/{% raw %}${{ vars.GCP_PROJECT_NUMBER }}{% endraw %}/locations/global/workloadIdentityPools/{% raw %}${{ secrets.WIF_POOL_ID }}{% endraw %}/providers/{% raw %}${{ secrets.WIF_PROVIDER_ID }}{% endraw %}'
49
+ service_account: '{% raw %}${{ secrets.GCP_SERVICE_ACCOUNT }}{% endraw %}'
50
+ create_credentials_file: true
51
+ project_id: {% raw %}${{ vars.CICD_PROJECT_ID }}{% endraw %}
52
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
53
+
54
+ - name: Set up Cloud SDK
55
+ uses: 'google-github-actions/setup-gcloud@v2'
56
+ {%- endif %}
57
+ {%- if cookiecutter.data_ingestion %}
58
+
59
+ - name: Deploy data ingestion pipeline (Staging)
60
+ run: |
61
+ cd data_ingestion && pip install uv==0.8.13 && cd data_ingestion_pipeline && \
62
+ uv sync --locked && uv run python submit_pipeline.py
63
+ env:
64
+ PIPELINE_ROOT: {% raw %}${{ vars.PIPELINE_GCS_ROOT_STAGING }}{% endraw %}
65
+ REGION: {% raw %}${{ vars.REGION }}{% endraw %}
66
+ {%- if cookiecutter.datastore_type == "vertex_ai_search" %}
67
+ DATA_STORE_REGION: {% raw %}${{ vars.DATA_STORE_REGION }}{% endraw %}
68
+ DATA_STORE_ID: {% raw %}${{ vars.DATA_STORE_ID_STAGING }}{% endraw %}
69
+ {%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %}
70
+ VECTOR_SEARCH_INDEX: {% raw %}${{ vars.VECTOR_SEARCH_INDEX_STAGING }}{% endraw %}
71
+ VECTOR_SEARCH_INDEX_ENDPOINT: {% raw %}${{ vars.VECTOR_SEARCH_INDEX_ENDPOINT_STAGING }}{% endraw %}
72
+ VECTOR_SEARCH_BUCKET: {% raw %}${{ vars.VECTOR_SEARCH_BUCKET_STAGING }}{% endraw %}
73
+ {%- endif %}
74
+ PROJECT_ID: {% raw %}${{ vars.STAGING_PROJECT_ID }}{% endraw %}
75
+ SERVICE_ACCOUNT: {% raw %}${{ vars.PIPELINE_SA_EMAIL_STAGING }}{% endraw %}
76
+ PIPELINE_NAME: {% raw %}${{ vars.PIPELINE_NAME }}{% endraw %}
77
+ {%- endif %}
78
+
79
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
80
+
81
+ - name: Configure Docker for Artifact Registry
82
+ run: |
83
+ gcloud auth configure-docker {% raw %}${{ vars.REGION }}{% endraw %}-docker.pkg.dev --quiet
84
+ {%- if cookiecutter.is_a2a %}
85
+
86
+ - name: Extract version from pyproject.toml
87
+ id: extract-version
88
+ run: |
89
+ VERSION=$(awk -F'"' '/^version = / {print $2}' pyproject.toml || echo '0.0.0')
90
+ echo "version=${VERSION}" >> $GITHUB_OUTPUT
91
+ {%- endif %}
92
+
93
+ - name: Build and Push Docker Image
94
+ run: |
95
+ docker build -t {% raw %}${{ vars.REGION }}{% endraw %}-docker.pkg.dev/{% raw %}${{ vars.CICD_PROJECT_ID }}{% endraw %}/{% raw %}${{ vars.ARTIFACT_REGISTRY_REPO_NAME }}{% endraw %}/{% raw %}${{ vars.CONTAINER_NAME }}{% endraw %} \
96
+ --build-arg COMMIT_SHA={% raw %}${{ github.sha }}{% endraw %} \
97
+ {%- if cookiecutter.is_a2a %}
98
+ --build-arg AGENT_VERSION={% raw %}${{ steps.extract-version.outputs.version }}{% endraw %} \
99
+ {%- endif %}
100
+ .
101
+ docker push {% raw %}${{ vars.REGION }}{% endraw %}-docker.pkg.dev/{% raw %}${{ vars.CICD_PROJECT_ID }}{% endraw %}/{% raw %}${{ vars.ARTIFACT_REGISTRY_REPO_NAME }}{% endraw %}/{% raw %}${{ vars.CONTAINER_NAME }}{% endraw %}
102
+
103
+ - name: Deploy to Staging (Cloud Run)
104
+ run: |
105
+ gcloud run deploy {{cookiecutter.project_name}} \
106
+ --image {% raw %}${{ vars.REGION }}{% endraw %}-docker.pkg.dev/{% raw %}${{ vars.CICD_PROJECT_ID }}{% endraw %}/{% raw %}${{ vars.ARTIFACT_REGISTRY_REPO_NAME }}{% endraw %}/{% raw %}${{ vars.CONTAINER_NAME }}{% endraw %} \
107
+ --region {% raw %}${{ vars.REGION }}{% endraw %} \
108
+ --project {% raw %}${{ vars.STAGING_PROJECT_ID }}{% endraw %}
109
+
110
+ - name: Fetch Staging Service URL
111
+ id: fetch-url
112
+ run: |
113
+ _STAGING_URL=$(gcloud run services describe {{cookiecutter.project_name}} \
114
+ --region {% raw %}${{ vars.REGION }}{% endraw %} --project {% raw %}${{ vars.STAGING_PROJECT_ID }}{% endraw %} --format="value(status.url)")
115
+ echo "_staging_url=${_STAGING_URL}" >> $GITHUB_OUTPUT
116
+
117
+ - name: Fetch ID Token
118
+ id: fetch-token
119
+ run: |
120
+ _ID_TOKEN=$(gcloud auth print-identity-token --impersonate-service-account={% raw %}${{ secrets.GCP_SERVICE_ACCOUNT }}{% endraw %} -q)
121
+ echo "::add-mask::${_ID_TOKEN}"
122
+ echo "_id_token=${_ID_TOKEN}" >> $GITHUB_OUTPUT
123
+
124
+ {%- elif cookiecutter.deployment_target == 'agent_engine' %}
125
+
126
+ - name: Install uv and dependencies
127
+ run: |
128
+ pip install uv==0.8.13
129
+ uv sync --locked
130
+ {%- if cookiecutter.is_a2a %}
131
+
132
+ - name: Extract version from pyproject.toml
133
+ id: extract-version
134
+ run: |
135
+ VERSION=$(awk -F'"' '/^version = / {print $2}' pyproject.toml || echo '0.0.0')
136
+ echo "version=${VERSION}" >> $GITHUB_OUTPUT
137
+ echo "Extracted version: ${VERSION}"
138
+ {%- endif %}
139
+
140
+ - name: Deploy to Staging (Agent Engine)
141
+ run: |
142
+ uv export --no-hashes --no-sources --no-header --no-dev --no-emit-project --no-annotate --locked > {{cookiecutter.agent_directory}}/app_utils/.requirements.txt
143
+ uv run python -m {{cookiecutter.agent_directory}}.app_utils.deploy \
144
+ --project {% raw %}${{ vars.STAGING_PROJECT_ID }}{% endraw %} \
145
+ --location {% raw %}${{ vars.REGION }}{% endraw %} \
146
+ --source-packages=./{{cookiecutter.agent_directory}} \
147
+ --entrypoint-module={{cookiecutter.agent_directory}}.agent_engine_app \
148
+ --entrypoint-object=agent_engine \
149
+ --requirements-file={{cookiecutter.agent_directory}}/app_utils/.requirements.txt \
150
+ --service-account={% raw %}${{ vars.APP_SERVICE_ACCOUNT_STAGING }}{% endraw %} \
151
+ --set-env-vars="COMMIT_SHA={% raw %}${{ github.sha }}{% endraw %}{%- if cookiecutter.is_a2a %},AGENT_VERSION={% raw %}${{ steps.extract-version.outputs.version }}{% endraw %}{%- endif %},LOGS_BUCKET_NAME={% raw %}${{ vars.LOGS_BUCKET_NAME_STAGING }}{% endraw %}{%- if cookiecutter.data_ingestion %}{%- if cookiecutter.datastore_type == "vertex_ai_search" %},DATA_STORE_ID={% raw %}${{ vars.DATA_STORE_ID_STAGING }}{% endraw %},DATA_STORE_REGION={% raw %}${{ vars.DATA_STORE_REGION }}{% endraw %}{%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %},VECTOR_SEARCH_INDEX={% raw %}${{ vars.VECTOR_SEARCH_INDEX_STAGING }}{% endraw %},VECTOR_SEARCH_INDEX_ENDPOINT={% raw %}${{ vars.VECTOR_SEARCH_INDEX_ENDPOINT_STAGING }}{% endraw %},VECTOR_SEARCH_BUCKET={% raw %}${{ vars.VECTOR_SEARCH_BUCKET_STAGING }}{% endraw %}{%- endif %}{%- endif %}"
152
+
153
+ - name: Fetch Auth Token
154
+ id: fetch-token
155
+ run: |
156
+ _AUTH_TOKEN=$(gcloud auth print-access-token -q)
157
+ echo "::add-mask::${_AUTH_TOKEN}"
158
+ echo "_auth_token=${_AUTH_TOKEN}" >> $GITHUB_OUTPUT
159
+ {%- endif %}
160
+
161
+ - name: Run load test
162
+ run: |
163
+ {%- if cookiecutter.deployment_target == 'cloud_run' and cookiecutter.agent_name == 'adk_live' %}
164
+ # Install dependencies for load test
165
+ pip install locust==2.31.1 websockets
166
+
167
+ # Install Cloud Run proxy component
168
+ gcloud components install cloud-run-proxy --quiet
169
+
170
+ # Start Cloud Run proxy in background
171
+ gcloud run services proxy {{cookiecutter.project_name}} \
172
+ --port=8080 \
173
+ --region {% raw %}${{ vars.REGION }}{% endraw %} \
174
+ --project {% raw %}${{ vars.STAGING_PROJECT_ID }}{% endraw %} \
175
+ --quiet &
176
+ PROXY_PID=$!
177
+
178
+ # Wait for proxy to be ready
179
+ echo "Waiting for proxy to start..."
180
+ sleep 10
181
+
182
+ # Run load test and capture exit code
183
+ locust -f tests/load_test/load_test.py \
184
+ --headless \
185
+ -H http://127.0.0.1:8080 \
186
+ -t 30s -u 2 -r 2 \
187
+ --csv=tests/load_test/.results/results \
188
+ --html=tests/load_test/.results/report.html
189
+ LOCUST_EXIT_CODE=$?
190
+
191
+ # Clean up proxy
192
+ kill $PROXY_PID || true
193
+
194
+ # Exit with load test result to fail build if tests failed
195
+ if [ $LOCUST_EXIT_CODE -ne 0 ]; then
196
+ echo "Load test failed with exit code $LOCUST_EXIT_CODE"
197
+ exit $LOCUST_EXIT_CODE
198
+ fi
199
+ {%- elif cookiecutter.deployment_target == 'cloud_run' %}
200
+ export _ID_TOKEN="{% raw %}${{ steps.fetch-token.outputs._id_token }}{% endraw %}"
201
+ export _STAGING_URL="{% raw %}${{ steps.fetch-url.outputs._staging_url }}{% endraw %}"
202
+ pip install locust==2.31.1{%- if cookiecutter.is_a2a %} a2a-sdk~=0.3.9{%- endif %}
203
+ locust -f tests/load_test/load_test.py \
204
+ --headless \
205
+ -H ${_STAGING_URL} \
206
+ -t 30s -u 10 -r 0.5 \
207
+ --csv=tests/load_test/.results/results \
208
+ --html=tests/load_test/.results/report.html
209
+ {%- elif cookiecutter.deployment_target == 'agent_engine' and cookiecutter.is_adk_live %}
210
+ # Start expose app in remote mode (uses deployment_metadata.json by default)
211
+ uv run python -m {{cookiecutter.agent_directory}}.app_utils.expose_app --mode remote &
212
+ EXPOSE_PID=$!
213
+
214
+ # Wait for expose app to be ready
215
+ sleep 10
216
+
217
+ # Run load test against local expose app
218
+ uv run --with locust==2.31.1 --with websockets locust -f tests/load_test/load_test.py \
219
+ -H http://127.0.0.1:8000 \
220
+ --headless \
221
+ -t 30s -u 2 -r 1 \
222
+ --csv=tests/load_test/.results/results \
223
+ --html=tests/load_test/.results/report.html
224
+ LOCUST_EXIT_CODE=$?
225
+
226
+ # Stop expose app
227
+ kill $EXPOSE_PID
228
+
229
+ # Exit with error if locust test failed
230
+ if [ $LOCUST_EXIT_CODE -ne 0 ]; then
231
+ echo "Load test failed with exit code $LOCUST_EXIT_CODE"
232
+ exit $LOCUST_EXIT_CODE
233
+ fi
234
+ {%- elif cookiecutter.deployment_target == 'agent_engine' %}
235
+ export _AUTH_TOKEN="{% raw %}${{ steps.fetch-token.outputs._auth_token }}{% endraw %}"
236
+ pip install locust==2.31.1
237
+ locust -f tests/load_test/load_test.py \
238
+ --headless \
239
+ -t 30s -u 2 -r 0.5 \
240
+ --csv=tests/load_test/.results/results \
241
+ --html=tests/load_test/.results/report.html
242
+ {%- endif %}
243
+
244
+ - name: Export Load Test Results to GCS
245
+ run: |
246
+ TIMESTAMP=$(date +%Y%m%d-%H%M%S)
247
+ gcloud storage cp --recursive tests/load_test/.results gs://{% raw %}${{ vars.LOGS_BUCKET_NAME_STAGING }}{% endraw %}/load-test-results/results-${TIMESTAMP} --quiet
248
+ echo "_________________________________________________________________________"
249
+ echo "Load test results copied to gs://{% raw %}${{ vars.LOGS_BUCKET_NAME_STAGING }}{% endraw %}/load-test-results/results-${TIMESTAMP}"
250
+ echo "HTTP link: https://console.cloud.google.com/storage/browser/{% raw %}${{ vars.LOGS_BUCKET_NAME_STAGING }}{% endraw %}/load-test-results/results-${TIMESTAMP}"
251
+ echo "_________________________________________________________________________"
252
+
253
+ call_production_workflow:
254
+ needs: deploy_and_test_staging
255
+ uses: ./.github/workflows/deploy-to-prod.yaml
256
+ permissions:
257
+ contents: 'read'
258
+ id-token: 'write'
259
+ secrets: inherit