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
@@ -20,11 +20,11 @@ from google.adk.runners import Runner
20
20
  from google.adk.sessions import InMemorySessionService
21
21
  from google.genai import types
22
22
 
23
- from app.agent import root_agent
23
+ from {{cookiecutter.agent_directory}}.agent import root_agent
24
24
 
25
25
 
26
26
  @patch(
27
- "app.agent.retrieve_docs",
27
+ "{{cookiecutter.agent_directory}}.agent.retrieve_docs",
28
28
  return_value="dummy content",
29
29
  )
30
30
  def test_agent_stream(mock_retrieve: MagicMock) -> None:
@@ -35,7 +35,7 @@ def test_agent_stream(mock_retrieve: MagicMock) -> None:
35
35
 
36
36
  session_service = InMemorySessionService()
37
37
 
38
- session = session_service.create_session(user_id="test_user", app_name="test")
38
+ session = session_service.create_session_sync(user_id="test_user", app_name="test")
39
39
  runner = Runner(agent=root_agent, session_service=session_service, app_name="test")
40
40
 
41
41
  message = types.Content(
@@ -0,0 +1,31 @@
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
+ description: "A base ReAct agent implemented using LangGraph with Agent2Agent (A2A) Protocol support"
16
+ settings:
17
+ requires_data_ingestion: false
18
+ deployment_targets: ["agent_engine", "cloud_run"]
19
+ extra_dependencies: [
20
+ "langchain-google-vertexai>=3.0.3",
21
+ "langchain~=1.0.7",
22
+ "langgraph~=1.0.3",
23
+ "langchain-community~=0.4.1",
24
+ "a2a-sdk[http-server]~=0.3.12",
25
+ "nest-asyncio>=1.6.0,<2.0.0",
26
+ "traceloop-sdk>=0.10.0,<1.0.0",
27
+ "opentelemetry-exporter-gcp-trace>=1.9.0,<2.0.0",
28
+ ]
29
+ tags: ["langgraph", "a2a"]
30
+ frontend_type: "inspector"
31
+ example_question: "What's the weather in San Francisco?"
@@ -0,0 +1,30 @@
1
+ # LangGraph Base ReAct Agent with A2A Protocol
2
+
3
+ <p align="center">
4
+ <img src="https://langchain-ai.github.io/langgraph/static/wordmark_dark.svg" width="50%" alt="LangGraph Logo" style="margin-right: 40px; vertical-align: middle;">
5
+ <img src="https://github.com/a2aproject/A2A/blob/main/docs/assets/a2a-logo-white.svg?raw=true" width="40%" alt="A2A Logo" style="vertical-align: middle;">
6
+ </p>
7
+
8
+ A base ReAct agent built using **[LangGraph](https://docs.langchain.com/oss/python/langgraph/overview)** with **[Agent2Agent (A2A) Protocol](https://a2a-protocol.org/)** support. This example demonstrates how to build a LangGraph-based agent with distributed agent communication capabilities through the A2A protocol for interoperability with agents across different frameworks and languages.
9
+
10
+ ## Key Features
11
+
12
+ - **Simple Architecture**: Shows the basic building blocks of a LangGraph agent
13
+ - **A2A Protocol Support**: Enables distributed agent communication and interoperability
14
+ - **Streaming Support**: Includes streaming response capability using Vertex AI
15
+ - **Sample Tool Integration**: Includes a basic search tool to demonstrate tool usage
16
+
17
+ ## Validating Your A2A Implementation
18
+
19
+ This template includes the **[A2A Protocol Inspector](https://github.com/a2aproject/a2a-inspector)** for validating your agent's A2A implementation.
20
+
21
+ ```bash
22
+ make inspector
23
+ ```
24
+
25
+ The inspector now supports both JSON-RPC 2.0 (Cloud Run) and HTTP-JSON (Agent Engine) transport protocols:
26
+
27
+ - **Cloud Run**: Test locally at `http://localhost:8000` or connect to your deployed Cloud Run URL
28
+ - **Agent Engine**: Must deploy first, then connect to your deployed Agent Engine URL (local testing not available)
29
+
30
+ For detailed setup instructions including local and remote testing workflows, refer to the `README.md` in your generated project.
@@ -0,0 +1,17 @@
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
+ from .agent import root_agent
16
+
17
+ __all__ = ["root_agent"]
@@ -0,0 +1,34 @@
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
+ from langchain.agents import create_agent
16
+ from langchain_google_vertexai import ChatVertexAI
17
+ from langgraph.graph.state import CompiledStateGraph
18
+
19
+ LOCATION = "global"
20
+ LLM = "gemini-2.5-flash"
21
+
22
+ llm = ChatVertexAI(model=LLM, location=LOCATION, temperature=0)
23
+
24
+
25
+ def get_weather(query: str) -> str:
26
+ """Simulates a web search. Use it get information on weather"""
27
+ if "sf" in query.lower() or "san francisco" in query.lower():
28
+ return "It's 60 degrees and foggy."
29
+ return "It's 90 degrees and sunny."
30
+
31
+
32
+ root_agent: CompiledStateGraph = create_agent(
33
+ model=llm, tools=[get_weather], system_prompt="You are a helpful assistant"
34
+ )
@@ -143,12 +143,8 @@
143
143
  },
144
144
  "outputs": [],
145
145
  "source": [
146
- "%pip install --upgrade --user --quiet \"google-cloud-aiplatform[evaluation]\" \\\n",
147
- " \"langchain_google_vertexai\" \\\n",
148
- " \"langgraph\" \\\n",
149
- " \"cloudpickle==3.0.0\" \\\n",
150
- " \"pydantic==2.7.4\" \\\n",
151
- " \"requests\""
146
+ "%pip install \"langchain_google_vertexai\" \"langgraph\"\n",
147
+ "%pip install --upgrade --user --quiet \"google-cloud-aiplatform[evaluation]\""
152
148
  ]
153
149
  },
154
150
  {
@@ -273,6 +269,8 @@
273
269
  },
274
270
  "outputs": [],
275
271
  "source": [
272
+ "import json\n",
273
+ "\n",
276
274
  "# General\n",
277
275
  "import random\n",
278
276
  "import string\n",
@@ -355,7 +353,7 @@
355
353
  " }\n",
356
354
  " )\n",
357
355
  "\n",
358
- " final_output[\"predicted_trajectory\"] = function_calls\n",
356
+ " final_output[\"predicted_trajectory\"] = json.dumps(function_calls)\n",
359
357
  " return final_output\n",
360
358
  "\n",
361
359
  "\n",
@@ -365,6 +363,7 @@
365
363
  " markdown += f\"{output['response']}\\n\\n\"\n",
366
364
  "\n",
367
365
  " if output[\"predicted_trajectory\"]:\n",
366
+ " output[\"predicted_trajectory\"] = json.loads(output[\"predicted_trajectory\"])\n",
368
367
  " markdown += \"### Function Calls\\n\"\n",
369
368
  " for call in output[\"predicted_trajectory\"]:\n",
370
369
  " markdown += f\"- **Function**: `{call['tool_name']}`\\n\"\n",
@@ -381,7 +380,7 @@
381
380
  " display(Markdown(\"### Summary Metrics\"))\n",
382
381
  " display(metrics_df)\n",
383
382
  "\n",
384
- " display(Markdown(f\"### Row-wise Metrics\"))\n",
383
+ " display(Markdown(\"### Row-wise Metrics\"))\n",
385
384
  " display(eval_result.metrics_table)\n",
386
385
  "\n",
387
386
  "\n",
@@ -599,7 +598,7 @@
599
598
  "source": [
600
599
  "def router(\n",
601
600
  " state: list[BaseMessage],\n",
602
- ") -> Literal[\"get_product_details\", \"get_product_price\", \"__end__\"]:\n",
601
+ ") -> Literal[\"get_product_details\", \"get_product_price\", END]:\n",
603
602
  " \"\"\"Initiates product details or price retrieval if the user asks for a product.\"\"\"\n",
604
603
  " # Get the tool_calls from the last message in the conversation history.\n",
605
604
  " tool_calls = state[-1].tool_calls\n",
@@ -614,7 +613,7 @@
614
613
  " return \"get_product_details\"\n",
615
614
  " else:\n",
616
615
  " # End the conversation flow.\n",
617
- " return \"__end__\""
616
+ " return END"
618
617
  ]
619
618
  },
620
619
  {
@@ -636,7 +635,7 @@
636
635
  },
637
636
  "outputs": [],
638
637
  "source": [
639
- "llm = \"gemini-1.5-pro\""
638
+ "llm = \"gemini-2.0-flash\""
640
639
  ]
641
640
  },
642
641
  {
@@ -899,6 +898,7 @@
899
898
  " dataset=eval_sample_dataset,\n",
900
899
  " metrics=single_tool_usage_metrics,\n",
901
900
  " experiment=EXPERIMENT_NAME,\n",
901
+ " output_uri_prefix=BUCKET_URI + \"/single-metric-eval\",\n",
902
902
  ")\n",
903
903
  "\n",
904
904
  "single_tool_call_eval_result = single_tool_call_eval_task.evaluate(\n",
@@ -1003,7 +1003,10 @@
1003
1003
  "EXPERIMENT_RUN = f\"trajectory-{get_id()}\"\n",
1004
1004
  "\n",
1005
1005
  "trajectory_eval_task = EvalTask(\n",
1006
- " dataset=eval_sample_dataset, metrics=trajectory_metrics, experiment=EXPERIMENT_NAME\n",
1006
+ " dataset=eval_sample_dataset,\n",
1007
+ " metrics=trajectory_metrics,\n",
1008
+ " experiment=EXPERIMENT_NAME,\n",
1009
+ " output_uri_prefix=BUCKET_URI + \"/multiple-metric-eval\",\n",
1007
1010
  ")\n",
1008
1011
  "\n",
1009
1012
  "trajectory_eval_result = trajectory_eval_task.evaluate(\n",
@@ -1107,7 +1110,10 @@
1107
1110
  "EXPERIMENT_RUN = f\"response-{get_id()}\"\n",
1108
1111
  "\n",
1109
1112
  "response_eval_task = EvalTask(\n",
1110
- " dataset=eval_sample_dataset, metrics=response_metrics, experiment=EXPERIMENT_NAME\n",
1113
+ " dataset=eval_sample_dataset,\n",
1114
+ " metrics=response_metrics,\n",
1115
+ " experiment=EXPERIMENT_NAME,\n",
1116
+ " output_uri_prefix=BUCKET_URI + \"/response-metric-eval\",\n",
1111
1117
  ")\n",
1112
1118
  "\n",
1113
1119
  "response_eval_result = response_eval_task.evaluate(\n",
@@ -1292,6 +1298,7 @@
1292
1298
  " dataset=eval_sample_dataset,\n",
1293
1299
  " metrics=response_tool_metrics,\n",
1294
1300
  " experiment=EXPERIMENT_NAME,\n",
1301
+ " output_uri_prefix=BUCKET_URI + \"/reasoning-metric-eval\",\n",
1295
1302
  ")\n",
1296
1303
  "\n",
1297
1304
  "response_eval_tool_result = response_eval_tool_task.evaluate(\n",
@@ -1436,15 +1443,21 @@
1436
1443
  " ],\n",
1437
1444
  " ],\n",
1438
1445
  " \"response\": [\n",
1439
- " 500,\n",
1440
- " 50,\n",
1446
+ " \"500\",\n",
1447
+ " \"50\",\n",
1441
1448
  " \"A super fast and light usb charger\",\n",
1442
- " 100,\n",
1449
+ " \"100\",\n",
1443
1450
  " \"A voice-controlled smart speaker that plays music, sets alarms, and controls smart home devices.\",\n",
1444
1451
  " ],\n",
1445
1452
  "}\n",
1446
1453
  "\n",
1447
- "byod_eval_sample_dataset = pd.DataFrame(byod_eval_data)"
1454
+ "byod_eval_sample_dataset = pd.DataFrame(byod_eval_data)\n",
1455
+ "byod_eval_sample_dataset[\"predicted_trajectory\"] = byod_eval_sample_dataset[\n",
1456
+ " \"predicted_trajectory\"\n",
1457
+ "].apply(json.dumps)\n",
1458
+ "byod_eval_sample_dataset[\"reference_trajectory\"] = byod_eval_sample_dataset[\n",
1459
+ " \"reference_trajectory\"\n",
1460
+ "].apply(json.dumps)"
1448
1461
  ]
1449
1462
  },
1450
1463
  {
@@ -12,8 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- # mypy: disable-error-code="union-attr"
16
- from app.agent import agent
15
+ # mypy: ignore-errors
16
+ from {{cookiecutter.agent_directory}}.agent import root_agent as agent
17
17
 
18
18
 
19
19
  def test_agent_stream() -> None:
@@ -189,9 +189,11 @@ Thumbs.db
189
189
  .persist_vector_store
190
190
  tests/load_test/.results/*.html
191
191
  tests/load_test/.results/*.csv
192
- locust_env
192
+ .locust_env
193
193
  my_env.tfvars
194
- .streamlit_chats
195
194
  .saved_chats
196
195
  .env
197
- .requirements.txt
196
+ .requirements.txt
197
+
198
+ # A2A Inspector
199
+ tools/a2a-inspector/
@@ -0,0 +1,5 @@
1
+ Coding Agent guidance:
2
+ {%- if cookiecutter.is_adk %}
3
+ {{ cookiecutter.adk_cheatsheet }}
4
+ {%- endif %}
5
+ {{ cookiecutter.llm_txt }}
@@ -0,0 +1,339 @@
1
+ # ==============================================================================
2
+ # Installation & Setup
3
+ # ==============================================================================
4
+
5
+ # Install dependencies using uv package manager
6
+ install:
7
+ @command -v uv >/dev/null 2>&1 || { echo "uv is not installed. Installing uv..."; curl -LsSf https://astral.sh/uv/0.8.13/install.sh | sh; source $HOME/.local/bin/env; }
8
+ {%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("install") %}
9
+ {{cookiecutter.settings.get("commands", {}).get("override", {}).get("install")}}
10
+ {%- else %}
11
+ uv sync{% if cookiecutter.is_adk_live %} && (cd frontend && npm install){%- endif %}
12
+ {%- endif %}
13
+
14
+ # ==============================================================================
15
+ # Playground Targets
16
+ # ==============================================================================
17
+
18
+ # Launch local dev playground
19
+ playground:{%- if cookiecutter.is_adk_live %} build-frontend-if-needed{%- endif %}
20
+ {%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("playground") %}
21
+ {%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("playground") is mapping %}
22
+ {{cookiecutter.settings.get("commands", {}).get("override", {}).get("playground").get(cookiecutter.deployment_target, "")}}
23
+ {%- else %}
24
+ {{cookiecutter.settings.get("commands", {}).get("override", {}).get("playground")}}
25
+ {%- endif %}
26
+ {%- else %}
27
+ @echo "==============================================================================="
28
+ @echo "| 🚀 Starting your agent playground... |"
29
+ @echo "| |"
30
+ {%- if cookiecutter.is_adk_live %}
31
+ @echo "| 🌐 Access your app at: http://localhost:8000 |"
32
+ {%- endif %}
33
+ @echo "| 💡 Try asking: {{cookiecutter.example_question}}|"
34
+ {%- if cookiecutter.is_adk %}
35
+ @echo "| |"
36
+ @echo "| 🔍 IMPORTANT: Select the '{{cookiecutter.agent_directory}}' folder to interact with your agent. |"
37
+ {%- endif %}
38
+ @echo "==============================================================================="
39
+ {%- if cookiecutter.is_adk_live %}
40
+ {%- if cookiecutter.deployment_target == 'agent_engine' %}
41
+ uv run python -m {{cookiecutter.agent_directory}}.app_utils.expose_app --mode local --local-agent {{cookiecutter.agent_directory}}.agent.root_agent
42
+ {%- else %}
43
+ uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host localhost --port 8000 --reload
44
+ {%- endif %}
45
+ {%- elif cookiecutter.is_adk %}
46
+ uv run adk web . --port 8501 --reload_agents
47
+ {%- elif cookiecutter.is_a2a %}
48
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
49
+ uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host localhost --port 8000 --reload &
50
+ $(MAKE) inspector
51
+ {%- else %}
52
+ {%- if cookiecutter.agent_name == 'langgraph_base' %}
53
+ @echo "ℹ️ Note: Local playground not supported for LangGraph on Agent Engine."
54
+ @echo " To test your agent, deploy first with 'make deploy' then use 'make inspector'."
55
+ {%- else %}
56
+ @echo "ℹ️ Note: Local playground uses ADK web interface (not A2A endpoints)."
57
+ @echo " To test A2A protocol, deploy first with 'make deploy' then use 'make inspector'."
58
+ @echo ""
59
+ uv run adk web . --port 8501 --reload_agents
60
+ {%- endif %}
61
+ {%- endif %}
62
+ {%- else %}
63
+ uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host localhost --port 8000 --reload
64
+ {%- endif %}
65
+ {%- endif %}
66
+ {%- if cookiecutter.settings.get("commands", {}).get("extra", {}) %}
67
+
68
+ # ==============================================================================
69
+ # Agent-Specific Commands
70
+ # ==============================================================================
71
+ {%- for cmd_name, cmd_value in cookiecutter.settings.get("commands", {}).get("extra", {}).items() %}
72
+ {%- if cmd_value is mapping %}
73
+ {%- if cmd_value.command is mapping %}
74
+ {%- if cookiecutter.deployment_target in cmd_value.command %}
75
+
76
+ # {{ cmd_value.get("description") }}
77
+ {{ cmd_name }}:
78
+ {{ cmd_value.command[cookiecutter.deployment_target] }}
79
+ {%- endif %}
80
+ {%- else %}
81
+
82
+ # {{ cmd_value.get("description") }}
83
+ {{ cmd_name }}:
84
+ {{ cmd_value.command if cmd_value.command is string else "" }}
85
+ {%- endif %}
86
+ {%- else %}
87
+
88
+ # {{ cmd_value.get("description", "") }}
89
+ {{ cmd_name }}:
90
+ {{ cmd_value }}
91
+ {%- endif %}
92
+ {%- endfor %}
93
+ {%- endif %}
94
+ {%- if cookiecutter.deployment_target == 'cloud_run' or (cookiecutter.deployment_target == 'agent_engine' and cookiecutter.is_adk_live) %}
95
+
96
+ # ==============================================================================
97
+ # Local Development Commands
98
+ # ==============================================================================
99
+
100
+ # Launch local development server with hot-reload
101
+ local-backend:
102
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
103
+ uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host localhost --port 8000 --reload
104
+ {%- else %}
105
+ uv run python -m {{cookiecutter.agent_directory}}.app_utils.expose_app --mode local --port 8000 --local-agent {{cookiecutter.agent_directory}}.agent.root_agent
106
+ {%- endif %}
107
+ {%- endif %}
108
+ {%- if cookiecutter.is_adk_live %}
109
+
110
+ # ==============================================================================
111
+ # ADK Live Commands
112
+ # ==============================================================================
113
+
114
+ # Build the frontend for production
115
+ build-frontend:
116
+ (cd frontend && npm run build)
117
+
118
+ # Build the frontend only if needed (conditional build)
119
+ build-frontend-if-needed:
120
+ @if [ ! -d "frontend/build" ] || [ ! -f "frontend/build/index.html" ]; then \
121
+ echo "Frontend build directory not found or incomplete. Building..."; \
122
+ $(MAKE) build-frontend; \
123
+ elif [ "frontend/package.json" -nt "frontend/build/index.html" ] || \
124
+ find frontend/src -newer frontend/build/index.html 2>/dev/null | head -1 | grep -q .; then \
125
+ echo "Frontend source files are newer than build. Rebuilding..."; \
126
+ $(MAKE) build-frontend; \
127
+ else \
128
+ echo "Frontend build is up to date. Skipping build..."; \
129
+ fi
130
+ {%- if cookiecutter.deployment_target == 'agent_engine' %}
131
+
132
+ # Connect to remote deployed agent
133
+ playground-remote: build-frontend-if-needed
134
+ @echo "==============================================================================="
135
+ @echo "| 🚀 Connecting to REMOTE agent... |"
136
+ @echo "| |"
137
+ @echo "| 🌐 Access your app at: http://localhost:8000 |"
138
+ @echo "| ☁️ Connected to deployed agent engine |"
139
+ @echo "==============================================================================="
140
+ uv run python -m {{cookiecutter.agent_directory}}.app_utils.expose_app --mode remote
141
+ {%- endif %}
142
+ {%- endif %}
143
+ {%- if cookiecutter.is_adk_live and cookiecutter.deployment_target == 'agent_engine' %}
144
+
145
+ # Start the frontend UI separately for development (requires backend running separately)
146
+ ui:
147
+ (cd frontend && PORT=8501 npm start)
148
+
149
+ # Launch dev playground with both frontend and backend hot-reload
150
+ playground-dev:
151
+ @echo "==============================================================================="
152
+ @echo "| 🚀 Starting your agent playground in DEV MODE... |"
153
+ @echo "| |"
154
+ @echo "| 🌐 Frontend: http://localhost:8501 |"
155
+ @echo "| 🌐 Backend: http://localhost:8000 |"
156
+ @echo "| 💡 Try asking: {{cookiecutter.example_question}}|"
157
+ @echo "| 🔄 Both frontend and backend will auto-reload on changes |"
158
+ @echo "==============================================================================="
159
+ @echo "Starting backend server..."
160
+ $(MAKE) local-backend &
161
+ @echo "Starting frontend dev server..."
162
+ $(MAKE) ui
163
+ {%- endif %}
164
+ {%- if cookiecutter.is_a2a %}
165
+
166
+ # ==============================================================================
167
+ # A2A Protocol Inspector
168
+ # ==============================================================================
169
+
170
+ # Launch A2A Protocol Inspector to test your agent implementation
171
+ inspector: setup-inspector-if-needed build-inspector-if-needed
172
+ @echo "==============================================================================="
173
+ @echo "| 🔍 A2A Protocol Inspector |"
174
+ @echo "==============================================================================="
175
+ @echo "| 🌐 Inspector UI: http://localhost:5001 |"
176
+ @echo "| |"
177
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
178
+ @echo "| 💡 Testing Locally: |"
179
+ @echo "| Paste this URL into the inspector: |"
180
+ @echo "| http://localhost:8000/a2a/{{cookiecutter.agent_directory}}/.well-known/agent-card.json |"
181
+ @echo "| |"
182
+ {%- endif %}
183
+ @echo "| 💡 Testing Remote Deployment: |"
184
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
185
+ @echo "| Connect to your deployed Cloud Run URL |"
186
+ @echo "| 🔐 See README for authentication setup |"
187
+ {%- else %}
188
+ @echo "| Connect to your deployed Agent Engine URL |"
189
+ @echo "| 🔐 See README for authentication setup |"
190
+ @echo "| |"
191
+ @echo "| ℹ️ Note: Local testing requires deploying to Agent Engine first. |"
192
+ @echo "| Local 'make playground' uses ADK web interface (not A2A endpoints) |"
193
+ {%- endif %}
194
+ @echo "==============================================================================="
195
+ @echo ""
196
+ cd tools/a2a-inspector/backend && uv run app.py
197
+
198
+ # Internal: Setup inspector if not already present (runs once)
199
+ # TODO: Update to --branch v1.0.0 when a2a-inspector publishes releases
200
+ setup-inspector-if-needed:
201
+ @if [ ! -d "tools/a2a-inspector" ]; then \
202
+ echo "" && \
203
+ echo "📦 First-time setup: Installing A2A Inspector..." && \
204
+ echo "" && \
205
+ mkdir -p tools && \
206
+ git clone --quiet https://github.com/a2aproject/a2a-inspector.git tools/a2a-inspector && \
207
+ (cd tools/a2a-inspector && git -c advice.detachedHead=false checkout --quiet 893e4062f6fbd85a8369228ce862ebbf4a025694) && \
208
+ echo "📥 Installing Python dependencies..." && \
209
+ (cd tools/a2a-inspector && uv sync --quiet) && \
210
+ echo "📥 Installing Node.js dependencies..." && \
211
+ (cd tools/a2a-inspector/frontend && npm install --silent) && \
212
+ echo "🔨 Building frontend..." && \
213
+ (cd tools/a2a-inspector/frontend && npm run build --silent) && \
214
+ echo "" && \
215
+ echo "✅ A2A Inspector setup complete!" && \
216
+ echo ""; \
217
+ fi
218
+
219
+ # Internal: Build inspector frontend if needed
220
+ build-inspector-if-needed:
221
+ @if [ -d "tools/a2a-inspector" ] && [ ! -f "tools/a2a-inspector/frontend/public/script.js" ]; then \
222
+ echo "🔨 Building inspector frontend..."; \
223
+ cd tools/a2a-inspector/frontend && npm run build; \
224
+ fi
225
+ {%- endif %}
226
+
227
+ # ==============================================================================
228
+ # Backend Deployment Targets
229
+ # ==============================================================================
230
+
231
+ # Deploy the agent remotely
232
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
233
+ # Usage: make deploy [IAP=true] [PORT=8080] - Set IAP=true to enable Identity-Aware Proxy, PORT to specify container port
234
+ {%- endif %}
235
+ deploy:
236
+ {%- if cookiecutter.deployment_target == 'cloud_run' %}
237
+ PROJECT_ID=$$(gcloud config get-value project) && \
238
+ {%- if cookiecutter.is_a2a %}
239
+ PROJECT_NUMBER=$$(gcloud projects describe $$PROJECT_ID --format="value(projectNumber)") && \
240
+ {%- endif %}
241
+ gcloud beta run deploy {{cookiecutter.project_name}} \
242
+ --source . \
243
+ --memory "4Gi" \
244
+ --project $$PROJECT_ID \
245
+ --region "us-central1" \
246
+ --no-allow-unauthenticated \
247
+ --no-cpu-throttling \
248
+ --labels "{% if cookiecutter.is_adk %}created-by=adk{% if cookiecutter.agent_garden %},{% endif %}{% endif %}{% if cookiecutter.agent_garden %}deployed-with=agent-garden{% if cookiecutter.agent_sample_id %},vertex-agent-sample-id={{cookiecutter.agent_sample_id}},vertex-agent-sample-publisher={{cookiecutter.agent_sample_publisher}}{% endif %}{% endif %}" \
249
+ --update-build-env-vars "AGENT_VERSION=$(shell awk -F'"' '/^version = / {print $$2}' pyproject.toml || echo '0.0.0')" \
250
+ --set-env-vars \
251
+ "COMMIT_SHA=$(shell git rev-parse HEAD){%- if cookiecutter.is_a2a %},APP_URL=https://{{cookiecutter.project_name}}-$$PROJECT_NUMBER.us-central1.run.app{%- endif %}{%- if cookiecutter.data_ingestion %}{%- if cookiecutter.datastore_type == "vertex_ai_search" %},DATA_STORE_ID={{cookiecutter.project_name}}-datastore,DATA_STORE_REGION=us{%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %},VECTOR_SEARCH_INDEX={{cookiecutter.project_name}}-vector-search,VECTOR_SEARCH_INDEX_ENDPOINT={{cookiecutter.project_name}}-vector-search-endpoint,VECTOR_SEARCH_BUCKET=$$PROJECT_ID-{{cookiecutter.project_name}}-vs{%- endif %}{%- endif %}" \
252
+ $(if $(IAP),--iap) \
253
+ $(if $(PORT),--port=$(PORT))
254
+ {%- elif cookiecutter.deployment_target == 'agent_engine' %}
255
+ # Export dependencies to requirements file using uv export.
256
+ (uv export --no-hashes --no-header --no-dev --no-emit-project --no-annotate > {{cookiecutter.agent_directory}}/app_utils/.requirements.txt 2>/dev/null || \
257
+ uv export --no-hashes --no-header --no-dev --no-emit-project > {{cookiecutter.agent_directory}}/app_utils/.requirements.txt) && \
258
+ uv run -m {{cookiecutter.agent_directory}}.app_utils.deploy \
259
+ --source-packages=./{{cookiecutter.agent_directory}} \
260
+ --entrypoint-module={{cookiecutter.agent_directory}}.agent_engine_app \
261
+ --entrypoint-object=agent_engine \
262
+ --requirements-file={{cookiecutter.agent_directory}}/app_utils/.requirements.txt
263
+ {%- endif %}
264
+
265
+ # Alias for 'make deploy' for backward compatibility
266
+ backend: deploy
267
+
268
+
269
+ # ==============================================================================
270
+ # Infrastructure Setup
271
+ # ==============================================================================
272
+
273
+ # Set up development environment resources using Terraform
274
+ setup-dev-env:
275
+ PROJECT_ID=$$(gcloud config get-value project) && \
276
+ (cd deployment/terraform/dev && terraform init && terraform apply --var-file vars/env.tfvars --var dev_project_id=$$PROJECT_ID --auto-approve)
277
+ {%- if cookiecutter.data_ingestion %}
278
+
279
+ # ==============================================================================
280
+ # Data Ingestion (RAG capabilities)
281
+ # ==============================================================================
282
+
283
+ # Run the data ingestion pipeline for RAG capabilities
284
+ data-ingestion:
285
+ PROJECT_ID=$$(gcloud config get-value project) && \
286
+ (cd data_ingestion && uv run data_ingestion_pipeline/submit_pipeline.py \
287
+ --project-id=$$PROJECT_ID \
288
+ --region="us-central1" \
289
+ {%- if cookiecutter.datastore_type == "vertex_ai_search" %}
290
+ --data-store-id="{{cookiecutter.project_name}}-datastore" \
291
+ --data-store-region="us" \
292
+ {%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %}
293
+ --vector-search-index="{{cookiecutter.project_name}}-vector-search" \
294
+ --vector-search-index-endpoint="{{cookiecutter.project_name}}-vector-search-endpoint" \
295
+ --vector-search-data-bucket-name="$$PROJECT_ID-{{cookiecutter.project_name}}-vs" \
296
+ {%- endif %}
297
+ --service-account="{{cookiecutter.project_name}}-rag@$$PROJECT_ID.iam.gserviceaccount.com" \
298
+ --pipeline-root="gs://$$PROJECT_ID-{{cookiecutter.project_name}}-rag" \
299
+ --pipeline-name="data-ingestion-pipeline")
300
+ {%- endif %}
301
+
302
+ # ==============================================================================
303
+ # Testing & Code Quality
304
+ # ==============================================================================
305
+
306
+ # Run unit and integration tests
307
+ test:
308
+ uv sync --dev
309
+ uv run pytest tests/unit && uv run pytest tests/integration
310
+
311
+ # Run code quality checks (codespell, ruff, mypy)
312
+ lint:
313
+ uv sync --dev --extra lint
314
+ uv run codespell
315
+ uv run ruff check . --diff
316
+ uv run ruff format . --check --diff
317
+ uv run mypy .
318
+ {%- if (cookiecutter.is_a2a and cookiecutter.deployment_target == 'cloud_run') or (cookiecutter.is_adk and not cookiecutter.is_a2a and cookiecutter.deployment_target == 'agent_engine') %}
319
+
320
+ # ==============================================================================
321
+ # Gemini Enterprise Integration
322
+ # ==============================================================================
323
+
324
+ # Register the deployed agent to Gemini Enterprise
325
+ # Usage: make register-gemini-enterprise (interactive - will prompt for required details)
326
+ # For non-interactive use, set env vars: ID or GEMINI_ENTERPRISE_APP_ID (full GE resource name)
327
+ # Optional env vars: GEMINI_DISPLAY_NAME, GEMINI_DESCRIPTION{%- if cookiecutter.deployment_target == 'agent_engine' %}, GEMINI_TOOL_DESCRIPTION, AGENT_ENGINE_ID{%- endif %}{%- if cookiecutter.deployment_target == 'cloud_run' %}, AGENT_CARD_URL{%- endif %}
328
+ register-gemini-enterprise:
329
+ {%- if cookiecutter.deployment_target == 'cloud_run' and cookiecutter.is_a2a %}
330
+ @PROJECT_ID=$$(gcloud config get-value project 2>/dev/null) && \
331
+ PROJECT_NUMBER=$$(gcloud projects describe $$PROJECT_ID --format="value(projectNumber)" 2>/dev/null) && \
332
+ uvx agent-starter-pack@{{ cookiecutter.package_version }} register-gemini-enterprise \
333
+ --agent-card-url="https://{{cookiecutter.project_name}}-$$PROJECT_NUMBER.us-central1.run.app/a2a/{{cookiecutter.agent_directory}}/.well-known/agent-card.json" \
334
+ --deployment-target="{{cookiecutter.deployment_target}}" \
335
+ --project-number="$$PROJECT_NUMBER"
336
+ {%- else %}
337
+ @uvx agent-starter-pack@{{ cookiecutter.package_version }} register-gemini-enterprise
338
+ {%- endif %}
339
+ {%- endif %}