agent-starter-pack 0.12.0__tar.gz → 0.13.0__tar.gz

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 (267) hide show
  1. agent_starter_pack-0.13.0/.claude/settings.local.json +16 -0
  2. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/GEMINI.md +49 -9
  3. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/PKG-INFO +2 -1
  4. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/pyproject.toml +3 -2
  5. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/Makefile +18 -6
  6. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/README.md +13 -48
  7. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/commands/create.py +54 -53
  8. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/commands/enhance.py +6 -2
  9. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/commands/list.py +65 -26
  10. agent_starter_pack-0.13.0/src/cli/utils/gcp.py +238 -0
  11. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/utils/remote_template.py +175 -4
  12. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/utils/template.py +72 -1
  13. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/Dockerfile +16 -0
  14. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/{{cookiecutter.agent_directory}}/server.py +49 -1
  15. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/package-lock.json +9 -9
  16. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/App.tsx +3 -2
  17. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/multimodal-live-client.ts +3 -1
  18. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/locks/uv-adk_base-agent_engine.lock +452 -452
  19. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/locks/uv-adk_base-cloud_run.lock +571 -568
  20. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/locks/uv-agentic_rag-agent_engine.lock +565 -566
  21. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/locks/uv-agentic_rag-cloud_run.lock +716 -713
  22. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +729 -735
  23. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +923 -940
  24. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/locks/uv-langgraph_base_react-agent_engine.lock +658 -664
  25. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/locks/uv-langgraph_base_react-cloud_run.lock +852 -869
  26. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/locks/uv-live_api-cloud_run.lock +758 -775
  27. agent_starter_pack-0.13.0/tests/cicd/scripts/delete_alloydb_clusters.py +950 -0
  28. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cli/commands/test_create.py +4 -7
  29. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cli/commands/test_enhance.py +1 -1
  30. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cli/utils/test_remote_template.py +6 -2
  31. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/uv.lock +3 -1
  32. agent_starter_pack-0.12.0/.claude/settings.local.json +0 -10
  33. agent_starter_pack-0.12.0/src/cli/utils/gcp.py +0 -117
  34. agent_starter_pack-0.12.0/src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock +0 -3938
  35. agent_starter_pack-0.12.0/src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock +0 -4501
  36. agent_starter_pack-0.12.0/tests/cicd/scripts/delete_alloydb_clusters.py +0 -399
  37. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/cd/test_e2e.yaml +0 -0
  38. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/ci/build_use_wheel.yaml +0 -0
  39. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/ci/lint.yaml +0 -0
  40. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/ci/lint_templated_agents.yaml +0 -0
  41. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test.yaml +0 -0
  42. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test_makefile.yaml +0 -0
  43. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test_pipeline_parity.yaml +0 -0
  44. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test_remote_template.yaml +0 -0
  45. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test_templated_agents.yaml +0 -0
  46. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/apis.tf +0 -0
  47. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/build_triggers.tf +0 -0
  48. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/service_account.tf +0 -0
  49. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/storage.tf +0 -0
  50. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/variables.tf +0 -0
  51. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.github/workflows/docs.yml +0 -0
  52. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/.gitignore +0 -0
  53. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/CLAUDE.md +0 -0
  54. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/CODE_OF_CONDUCT.md +0 -0
  55. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/CONTRIBUTING.md +0 -0
  56. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/LICENSE +0 -0
  57. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/Makefile +0 -0
  58. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/README.md +0 -0
  59. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/README.md +0 -0
  60. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/adk_base/.template/templateconfig.yaml +0 -0
  61. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/adk_base/README.md +0 -0
  62. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/adk_base/app/__init__.py +0 -0
  63. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/adk_base/app/agent.py +0 -0
  64. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/adk_base/notebooks/adk_app_testing.ipynb +0 -0
  65. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/adk_base/notebooks/evaluating_adk_agent.ipynb +0 -0
  66. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/adk_base/tests/integration/test_agent.py +0 -0
  67. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/agentic_rag/.template/templateconfig.yaml +0 -0
  68. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/agentic_rag/README.md +0 -0
  69. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/agentic_rag/app/__init__.py +0 -0
  70. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/agentic_rag/app/agent.py +0 -0
  71. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/agentic_rag/app/retrievers.py +0 -0
  72. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/agentic_rag/app/templates.py +0 -0
  73. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/agentic_rag/notebooks/adk_app_testing.ipynb +0 -0
  74. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/agentic_rag/notebooks/evaluating_adk_agent.ipynb +0 -0
  75. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/agentic_rag/tests/integration/test_agent.py +0 -0
  76. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/.template/templateconfig.yaml +0 -0
  77. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/README.md +0 -0
  78. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/app/agent.py +0 -0
  79. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/app/crew/config/agents.yaml +0 -0
  80. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/app/crew/config/tasks.yaml +0 -0
  81. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/app/crew/crew.py +0 -0
  82. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb +0 -0
  83. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/notebooks/evaluating_langgraph_agent.ipynb +0 -0
  84. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/tests/integration/test_agent.py +0 -0
  85. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/.template/templateconfig.yaml +0 -0
  86. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/README.md +0 -0
  87. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/app/agent.py +0 -0
  88. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb +0 -0
  89. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/tests/integration/test_agent.py +0 -0
  90. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/live_api/.template/templateconfig.yaml +0 -0
  91. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/live_api/README.md +0 -0
  92. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/live_api/app/agent.py +0 -0
  93. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/live_api/tests/integration/test_server_e2e.py +0 -0
  94. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/live_api/tests/load_test/load_test.py +0 -0
  95. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/agents/live_api/tests/unit/test_server.py +0 -0
  96. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/.vitepress/config.js +0 -0
  97. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/agents/overview.md +0 -0
  98. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/cli/create.md +0 -0
  99. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/cli/enhance.md +0 -0
  100. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/cli/index.md +0 -0
  101. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/cli/list.md +0 -0
  102. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/cli/setup_cicd.md +0 -0
  103. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/data-ingestion.md +0 -0
  104. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/deploy-ui.md +0 -0
  105. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/deployment.md +0 -0
  106. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/development-guide.md +0 -0
  107. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/getting-started.md +0 -0
  108. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/installation.md +0 -0
  109. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/observability.md +0 -0
  110. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/template-config-reference.md +0 -0
  111. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/troubleshooting.md +0 -0
  112. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/video-tutorials.md +0 -0
  113. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/guide/why_starter_pack.md +0 -0
  114. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/adk_gemini_fullstack.gif +0 -0
  115. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/adk_gemini_fullstack_architecture.png +0 -0
  116. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/adk_logo.png +0 -0
  117. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/agent_starter_pack_screenshot.png +0 -0
  118. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/ags_high_level_architecture.png +0 -0
  119. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/icon.png +0 -0
  120. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/logo.png +0 -0
  121. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/prototype_to_prod.png +0 -0
  122. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/why_sp_edited.png +0 -0
  123. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/images/why_starter_pack.png +0 -0
  124. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/index.md +0 -0
  125. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/package-lock.json +0 -0
  126. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/package.json +0 -0
  127. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/remote-templates/creating-remote-templates.md +0 -0
  128. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/remote-templates/index.md +0 -0
  129. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/docs/remote-templates/using-remote-templates.md +0 -0
  130. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/llm.txt +0 -0
  131. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/.gitignore +0 -0
  132. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/GEMINI.md +0 -0
  133. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/README.md +0 -0
  134. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/apis.tf +0 -0
  135. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/apis.tf +0 -0
  136. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/iam.tf +0 -0
  137. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/log_sinks.tf +0 -0
  138. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/providers.tf +0 -0
  139. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/storage.tf +0 -0
  140. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/variables.tf +0 -0
  141. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/vars/env.tfvars +0 -0
  142. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/github.tf +0 -0
  143. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/iam.tf +0 -0
  144. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/locals.tf +0 -0
  145. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/log_sinks.tf +0 -0
  146. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/providers.tf +0 -0
  147. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/service_accounts.tf +0 -0
  148. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/storage.tf +0 -0
  149. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/variables.tf +0 -0
  150. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/vars/env.tfvars +0 -0
  151. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'github_actions' %}wif.tf{% else %}unused_wif.tf{% endif %} +0 -0
  152. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}build_triggers.tf{% else %}unused_build_triggers.tf{% endif %} +0 -0
  153. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/pyproject.toml +0 -0
  154. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/tests/unit/test_dummy.py +0 -0
  155. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/deploy-to-prod.yaml +0 -0
  156. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/pr_checks.yaml +0 -0
  157. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/staging.yaml +0 -0
  158. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/deploy-to-prod.yaml +0 -0
  159. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/pr_checks.yaml +0 -0
  160. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/staging.yaml +0 -0
  161. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/{{cookiecutter.agent_directory}}/utils/gcs.py +0 -0
  162. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/{{cookiecutter.agent_directory}}/utils/tracing.py +0 -0
  163. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/base_template/{{cookiecutter.agent_directory}}/utils/typing.py +0 -0
  164. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/commands/setup_cicd.py +0 -0
  165. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/main.py +0 -0
  166. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/utils/__init__.py +0 -0
  167. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/utils/cicd.py +0 -0
  168. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/utils/datastores.py +0 -0
  169. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/utils/logging.py +0 -0
  170. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/cli/utils/version.py +0 -0
  171. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/data_ingestion/README.md +0 -0
  172. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +0 -0
  173. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/data_ingestion/data_ingestion_pipeline/components/process_data.py +0 -0
  174. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/data_ingestion/data_ingestion_pipeline/pipeline.py +0 -0
  175. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +0 -0
  176. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/data_ingestion/pyproject.toml +0 -0
  177. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/data_ingestion/uv.lock +0 -0
  178. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/deployment_metadata.json +0 -0
  179. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/notebooks/intro_agent_engine.ipynb +0 -0
  180. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +0 -0
  181. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
  182. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/tests/load_test/README.md +0 -0
  183. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/tests/load_test/load_test.py +0 -0
  184. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/agent_engine_app.py +0 -0
  185. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/deployment/terraform/dev/service.tf +0 -0
  186. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/deployment/terraform/service.tf +0 -0
  187. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +0 -0
  188. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
  189. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/tests/load_test/README.md +0 -0
  190. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/tests/load_test/load_test.py +0 -0
  191. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/package.json +0 -0
  192. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/public/favicon.ico +0 -0
  193. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/public/index.html +0 -0
  194. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/public/robots.txt +0 -0
  195. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/App.scss +0 -0
  196. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/App.test.tsx +0 -0
  197. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/audio-pulse/AudioPulse.tsx +0 -0
  198. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/audio-pulse/audio-pulse.scss +0 -0
  199. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/control-tray/ControlTray.tsx +0 -0
  200. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/control-tray/control-tray.scss +0 -0
  201. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/logger/Logger.tsx +0 -0
  202. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/logger/logger.scss +0 -0
  203. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/logger/mock-logs.ts +0 -0
  204. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/side-panel/SidePanel.tsx +0 -0
  205. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/side-panel/side-panel.scss +0 -0
  206. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/contexts/LiveAPIContext.tsx +0 -0
  207. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/hooks/use-live-api.ts +0 -0
  208. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/hooks/use-media-stream-mux.ts +0 -0
  209. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/hooks/use-screen-capture.ts +0 -0
  210. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/hooks/use-webcam.ts +0 -0
  211. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/index.css +0 -0
  212. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/index.tsx +0 -0
  213. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/multimodal-live-types.ts +0 -0
  214. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/react-app-env.d.ts +0 -0
  215. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/reportWebVitals.ts +0 -0
  216. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/setupTests.ts +0 -0
  217. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/audio-recorder.ts +0 -0
  218. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/audio-streamer.ts +0 -0
  219. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/audioworklet-registry.ts +0 -0
  220. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/store-logger.ts +0 -0
  221. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/utils.ts +0 -0
  222. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/worklets/audio-processing.ts +0 -0
  223. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/worklets/vol-meter.ts +0 -0
  224. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/tsconfig.json +0 -0
  225. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/side_bar.py +0 -0
  226. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/streamlit_app.py +0 -0
  227. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/style/app_markdown.py +0 -0
  228. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/chat_utils.py +0 -0
  229. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/local_chat_history.py +0 -0
  230. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/message_editing.py +0 -0
  231. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/multimodal_utils.py +0 -0
  232. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/stream_handler.py +0 -0
  233. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/title_summary.py +0 -0
  234. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/containers/data_processing/Dockerfile +0 -0
  235. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/containers/e2e-tests/Dockerfile +0 -0
  236. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/docs/adk-cheatsheet.md +0 -0
  237. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/idx/.idx/dev.nix +0 -0
  238. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/idx/idx-template.json +0 -0
  239. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/resources/idx/idx-template.nix +0 -0
  240. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/utils/generate_locks.py +0 -0
  241. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/utils/lock_utils.py +0 -0
  242. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/src/utils/watch_and_rebuild.py +0 -0
  243. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/__init__.py +0 -0
  244. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cicd/example.env +0 -0
  245. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cicd/scripts/delete_agent_engines.py +0 -0
  246. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cicd/scripts/delete_vector_search.py +0 -0
  247. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cicd/test_e2e_deployment.py +0 -0
  248. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cli/commands/test_create_local.py +0 -0
  249. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cli/commands/test_list.py +0 -0
  250. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cli/commands/test_setup_cicd.py +0 -0
  251. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/cli/utils/test_cicd.py +0 -0
  252. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/integration/test_agent_directory_functionality.py +0 -0
  253. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/integration/test_makefile_usability.py +0 -0
  254. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/integration/test_pipeline_parity.py +0 -0
  255. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/integration/test_remote_templating.py +0 -0
  256. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/integration/test_template_linting.py +0 -0
  257. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/integration/test_templated_patterns.py +0 -0
  258. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/integration/utils.py +0 -0
  259. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/test_frontend/test_side_bar.py +0 -0
  260. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/test_frontend/test_streamlit_app.py +0 -0
  261. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_chat_utils.py +0 -0
  262. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_local_chat_history.py +0 -0
  263. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_message_editing.py +0 -0
  264. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_multimodal_utils.py +0 -0
  265. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_stream_handler.py +0 -0
  266. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/utils/__init__.py +0 -0
  267. {agent_starter_pack-0.12.0 → agent_starter_pack-0.13.0}/tests/utils/get_agents.py +0 -0
@@ -0,0 +1,16 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(PROJECT_IDS=agent-starter-pack-e2e-dev,agent-starter-pack-e2e-st,agent-starter-pack-e2e-pr python tests/cicd/scripts/delete_vector_search.py)",
5
+ "Bash(make lint)",
6
+ "Bash(uv run pytest tests/cli/commands/test_create.py::TestCreateCommand::test_create_existing_project_dir -v -s)",
7
+ "Bash(gcloud serverless vpc-connectors list --project=agent-starter-pack-e2e-dev --region=europe-west1)",
8
+ "Bash(gcloud compute networks vpc-access connectors list --project=agent-starter-pack-e2e-dev --region=europe-west1)",
9
+ "Bash(gcloud alpha network-services address-reservations list --project=agent-starter-pack-e2e-dev --location=europe-west1)",
10
+ "Bash(gcloud beta serverless address-reservations list --project=agent-starter-pack-e2e-dev --location=europe-west1)",
11
+ "Bash(gcloud run services delete test-797fa619-1755528509 --region=europe-west1 --project=agent-starter-pack-e2e-dev --quiet)"
12
+ ],
13
+ "deny": [],
14
+ "ask": []
15
+ }
16
+ }
@@ -114,17 +114,57 @@ The project maintains parallel CI/CD implementations. **Any change to CI/CD logi
114
114
 
115
115
  When adding a new variable or secret, ensure it is configured correctly for both systems in the Terraform scripts that manage them (e.g., `github_actions_variable` resource and Cloud Build trigger substitutions).
116
116
 
117
- ## File Modification Checklist
117
+ ## Advanced Template System Patterns
118
+
119
+ ### 4-Layer Architecture
120
+ Template processing follows this hierarchy (later layers override earlier ones):
121
+ 1. **Base Template** (`src/base_template/`) - Applied to ALL projects
122
+ 2. **Deployment Targets** (`src/deployment_targets/`) - Environment overrides
123
+ 3. **Frontend Types** (`src/frontends/`) - UI-specific files
124
+ 4. **Agent Templates** (`agents/*/`) - Individual agent logic
125
+
126
+ **Rule**: Always place changes in the correct layer. Check if deployment targets need corresponding updates.
127
+
128
+ ### Template Processing Flow
129
+ 1. Variable resolution from `cookiecutter.json`
130
+ 2. File copying (base → overlays)
131
+ 3. Jinja2 rendering of content
132
+ 4. File/directory name rendering
133
+
134
+ ### Cross-File Dependencies
135
+ Changes often require coordinated updates:
136
+ - **Configuration**: `templateconfig.yaml` → `cookiecutter.json` → rendered templates
137
+ - **CI/CD**: `.github/workflows/` ↔ `.cloudbuild/` (must stay in sync)
138
+ - **Infrastructure**: Base terraform → deployment target overrides
139
+
140
+ ### Conditional Logic Patterns
141
+ ```jinja
142
+ {%- if cookiecutter.agent_name == "live_api" %}
143
+ # Agent-specific logic
144
+ {%- elif cookiecutter.deployment_target == "cloud_run" %}
145
+ # Deployment-specific logic
146
+ {%- endif %}
147
+ ```
118
148
 
119
- Before finalizing any change, verify the following:
149
+ ### Testing Strategy
150
+ Test changes across multiple dimensions:
151
+ - Agent types (live_api, adk_base, etc.)
152
+ - Deployment targets (cloud_run, agent_engine)
153
+ - Feature combinations (data_ingestion, frontend_type)
154
+
155
+ ### Common Pitfalls
156
+ - **Hardcoded URLs**: Use relative paths for frontend connections
157
+ - **Missing Conditionals**: Wrap agent-specific code in proper `{% if %}` blocks
158
+ - **Dependency Conflicts**: Some agents lack certain extras (e.g., live_api + lint)
159
+
160
+ ## File Modification Checklist
120
161
 
121
- - [ ] **Jinja Syntax:** Are all `{% if %}` and `{% for %}` blocks correctly closed with `{% endif %}` and `{% endfor %}`?
122
- - [ ] **Variable Consistency:** Is the `cookiecutter.` variable name spelled correctly and used consistently across all modified files?
123
- - [ ] **Cross-Target Impact:** If you changed the `base_template`, have you checked if any `deployment_targets` need corresponding updates?
124
- - [ ] **CI/CD Parity:** If you modified a CI/CD workflow, did you apply the equivalent change to the other system (GitHub Actions vs. Cloud Build)?
125
- - [ ] **Terraform Validation:** If you changed Terraform files, are resource references correct? Does it pass `terraform validate`?
126
- - [ ] **Documentation:** Does any user-facing documentation in `docs/` need to be updated to reflect the change?
162
+ - [ ] **Jinja Syntax:** All `{% if %}` and `{% for %}` blocks correctly closed?
163
+ - [ ] **Variable Consistency:** `cookiecutter.` variables spelled correctly?
164
+ - [ ] **Cross-Target Impact:** Base template changes checked against deployment targets?
165
+ - [ ] **CI/CD Parity:** Changes applied to both GitHub Actions and Cloud Build?
166
+ - [ ] **Multi-Agent Testing:** Tested with different agent types and configurations?
127
167
 
128
168
  ### Key Tooling
129
169
 
130
- - **`uv` for Python Command Execution:** `uv` is the primary tool used for managing Python dependencies and executing Python commands within the project, including CLI operations and CI/CD steps. This ensures consistent, isolated, and efficient execution environments.
170
+ - **`uv` for Python:** Primary tool for dependency management and CLI execution
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-starter-pack
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: CLI to bootstrap production-ready Google Cloud GenAI agent projects from templates.
5
5
  Author-email: Google LLC <agent-starter-pack@google.com>
6
6
  License: Apache-2.0
@@ -12,6 +12,7 @@ Requires-Dist: cookiecutter~=2.6.0
12
12
  Requires-Dist: google-cloud-aiplatform>=1.87.0
13
13
  Requires-Dist: pyyaml>=6.0.1
14
14
  Requires-Dist: rich>=13.7.0
15
+ Requires-Dist: tomli>=1.1.0; python_version < '3.11'
15
16
  Provides-Extra: jupyter
16
17
  Requires-Dist: ipykernel>=6.29.5; extra == 'jupyter'
17
18
  Requires-Dist: jupyter; extra == 'jupyter'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agent-starter-pack"
3
- version = "0.12.0"
3
+ version = "0.13.0"
4
4
  description = "CLI to bootstrap production-ready Google Cloud GenAI agent projects from templates."
5
5
  authors = [
6
6
  { name = "Google LLC", email = "agent-starter-pack@google.com" },
@@ -15,6 +15,7 @@ dependencies = [
15
15
  "rich>=13.7.0",
16
16
  "pyyaml>=6.0.1",
17
17
  "backoff>=2.2.1",
18
+ "tomli>=1.1.0; python_version < \"3.11\"",
18
19
  ]
19
20
 
20
21
  [dependency-groups]
@@ -88,7 +89,7 @@ select = [
88
89
  "RUF", # ruff specific rules
89
90
  "PLW1514", # unspecified-encoding (require encoding in open calls)
90
91
  ]
91
- ignore = ["E501", "C901", "RUF001"]
92
+ ignore = ["E501", "C901", "RUF001", "UP036"]
92
93
 
93
94
  [tool.ruff.lint.isort]
94
95
  known-first-party = ["app", "frontend"]
@@ -4,7 +4,7 @@ install:
4
4
  {%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("install") %}
5
5
  {{cookiecutter.settings.get("commands", {}).get("override", {}).get("install")}}
6
6
  {%- else %}
7
- uv sync --dev{% if cookiecutter.agent_name != 'live_api' and "adk" not in cookiecutter.tags %} --extra streamlit{%- endif %} --extra jupyter{% if cookiecutter.agent_name == 'live_api' %} && (cd frontend && npm install){%- endif %}
7
+ uv sync --dev{% if cookiecutter.agent_name != 'live_api' and "adk" not in cookiecutter.tags %} --extra streamlit{%- endif %}{% if cookiecutter.agent_name == 'live_api' %} && (cd frontend && npm install){%- endif %}
8
8
  {%- endif %}
9
9
 
10
10
  {%- if cookiecutter.settings.get("commands", {}).get("extra", {}) %}
@@ -23,14 +23,23 @@ install:
23
23
  {%- endif %}
24
24
  {%- endfor %}{%- endif %}
25
25
 
26
+ {%- if cookiecutter.agent_name == 'live_api' %}
27
+ # Build the frontend for production
28
+ build-frontend:
29
+ (cd frontend && npm run build)
30
+
31
+ {%- endif %}
26
32
  # Launch local dev playground
27
- playground:
33
+ playground:{%- if cookiecutter.agent_name == 'live_api' %} build-frontend{%- endif %}
28
34
  {%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("playground") %}
29
35
  {{cookiecutter.settings.get("commands", {}).get("override", {}).get("playground")}}
30
36
  {%- else %}
31
37
  @echo "==============================================================================="
32
38
  @echo "| 🚀 Starting your agent playground... |"
33
39
  @echo "| |"
40
+ {%- if cookiecutter.agent_name == 'live_api' %}
41
+ @echo "| 🌐 Access your app at: http://localhost:8000 |"
42
+ {%- endif %}
34
43
  @echo "| 💡 Try asking: {{cookiecutter.example_question}}|"
35
44
  {%- if "adk" in cookiecutter.tags %}
36
45
  @echo "| |"
@@ -41,11 +50,13 @@ playground:
41
50
  uv run adk web . --port 8501
42
51
  {%- else %}
43
52
  {%- if cookiecutter.deployment_target == 'cloud_run' %}
44
- uv run uvicorn {{cookiecutter.agent_directory}}.server:app --host 0.0.0.0 --port 8000 --reload &
45
- {%- endif %}
46
53
  {%- if cookiecutter.agent_name == 'live_api' %}
47
- (cd frontend && PORT=8501 npm start)
54
+ uv run uvicorn {{cookiecutter.agent_directory}}.server:app --host 0.0.0.0 --port 8000 --reload
48
55
  {%- else %}
56
+ uv run uvicorn {{cookiecutter.agent_directory}}.server:app --host 0.0.0.0 --port 8000 --reload &
57
+ {%- endif %}
58
+ {%- endif %}
59
+ {%- if cookiecutter.agent_name != 'live_api' %}
49
60
  {% if cookiecutter.deployment_target == 'agent_engine' %}PYTHONPATH=. {% endif %}uv run streamlit run frontend/streamlit_app.py --browser.serverAddress=localhost --server.enableCORS=false --server.enableXsrfProtection=false
50
61
  {%- endif %}
51
62
  {%- endif %}
@@ -84,7 +95,7 @@ local-backend:
84
95
  {%- if cookiecutter.deployment_target == 'cloud_run' %}
85
96
  {%- if cookiecutter.agent_name == 'live_api' %}
86
97
 
87
- # Start the frontend UI for development
98
+ # Start the frontend UI separately for development (requires backend running separately)
88
99
  ui:
89
100
  (cd frontend && PORT=8501 npm start)
90
101
  {%- endif %}
@@ -122,6 +133,7 @@ test:
122
133
 
123
134
  # Run code quality checks (codespell, ruff, mypy)
124
135
  lint:
136
+ uv sync --dev --extra lint
125
137
  uv run codespell
126
138
  uv run ruff check . --diff
127
139
  uv run ruff format . --check --diff
@@ -92,12 +92,12 @@ Here’s the recommended workflow for local development:
92
92
  make install
93
93
  ```
94
94
 
95
- 2. **Start the Backend Server:**
96
- Open a terminal and run:
95
+ 2. **Start the Full Stack Server:**
96
+ The FastAPI server now serves both the backend API and frontend interface:
97
97
  ```bash
98
98
  make local-backend
99
99
  ```
100
- The backend is ready when you see `INFO: Application startup complete.` Wait for this message before starting the frontend.
100
+ The server is ready when you see `INFO: Application startup complete.` The frontend will be available at `http://localhost:8000`.
101
101
 
102
102
  <details>
103
103
  <summary><b>Optional: Use AI Studio / API Key instead of Vertex AI</b></summary>
@@ -113,47 +113,23 @@ Here’s the recommended workflow for local development:
113
113
  </details>
114
114
  <br>
115
115
 
116
- 3. **Start the Frontend UI:**
117
- Open *another* terminal and run:
116
+ <details>
117
+ <summary><b>Alternative: Run Frontend Separately</b></summary>
118
+
119
+ If you prefer to run the frontend separately (useful for frontend development), you can still use:
118
120
  ```bash
119
121
  make ui
120
122
  ```
121
- This launches the Streamlit application, which connects to the backend server (by default at `http://localhost:8000`).
123
+ This launches the Streamlit application, which connects to the backend server at `http://localhost:8000`.
124
+ </details>
125
+ <br>
122
126
 
123
- 4. **Interact and Iterate:**
124
- * Open the Streamlit UI in your browser (usually `http://localhost:8501` or `http://localhost:3001`).
127
+ 3. **Interact and Iterate:**
128
+ * Open your browser and navigate to `http://localhost:8000` to access the integrated frontend.
125
129
  * Click the play button in the UI to connect to the backend.
126
130
  * Interact with the agent! Try prompts like: *"Using the tool you have, define Governance in the context MLOPs"*
127
131
  * Modify the agent logic in `{{cookiecutter.agent_directory}}/agent.py`. The backend server (FastAPI with `uvicorn --reload`) should automatically restart when you save changes. Refresh the frontend if needed to see behavioral changes.
128
132
 
129
- <details>
130
- <summary><b>Cloud Shell Usage</b></summary>
131
-
132
- To run the agent using Google Cloud Shell:
133
-
134
- 1. **Start the Frontend:**
135
- In a Cloud Shell tab, run:
136
- ```bash
137
- make ui
138
- ```
139
- Accept prompts to use a different port if 3000 is busy. Click the `localhost:PORT` link for the web preview.
140
-
141
- 2. **Start the Backend:**
142
- Open a *new* Cloud Shell tab. Set your project: `gcloud config set project [PROJECT_ID]`. Then run:
143
- ```bash
144
- make local-backend
145
- ```
146
-
147
- 3. **Configure Backend Web Preview:**
148
- Use the Cloud Shell Web Preview feature to expose port 8000. Change the default port from 8080 to 8000. See [Cloud Shell Web Preview documentation](https://cloud.google.com/shell/docs/using-web-preview#preview_the_application).
149
-
150
- 4. **Connect Frontend to Backend:**
151
- * Copy the URL generated by the backend web preview (e.g., `https://8000-cs-....cloudshell.dev/`).
152
- * Paste this URL into the "Server URL" field in the frontend UI settings (in the first tab).
153
- * Click the "Play button" to connect.
154
-
155
- * **Note:** The feedback feature in the frontend might not work reliably in Cloud Shell due to cross-origin issues between the preview URLs.
156
- </details>
157
133
 
158
134
  </details>
159
135
  {%- else %}
@@ -183,18 +159,7 @@ gcloud config set project <your-dev-project-id>
183
159
  make backend
184
160
  ```
185
161
  {% if cookiecutter.agent_name == 'live_api' %}
186
- **Accessing the Deployed Backend Locally:**
187
-
188
- To connect your local frontend (`make ui`) to the backend deployed on Cloud Run, use the `gcloud` proxy:
189
-
190
- 1. **Start the proxy:**
191
- ```bash
192
- # Replace with your actual service name, project, and region
193
- gcloud run services proxy gemini-agent-service --port 8000 --project $PROJECT_ID --region $REGION
194
- ```
195
- Keep this terminal running.
196
-
197
- 2. **Connect Frontend:** Your deployed backend is now accessible locally at `http://localhost:8000`. Point your Streamlit UI to this address.
162
+ **Note:** For secure access to your deployed backend, consider using Identity-Aware Proxy (IAP) by running `make backend IAP=true`.
198
163
  {%- endif %}
199
164
 
200
165
  The repository includes a Terraform configuration for the setup of the Dev Google Cloud project.
@@ -19,7 +19,6 @@ import pathlib
19
19
  import shutil
20
20
  import subprocess
21
21
  import tempfile
22
- import tomllib
23
22
  from collections.abc import Callable
24
23
 
25
24
  import click
@@ -244,6 +243,8 @@ def create(
244
243
  ) -> None:
245
244
  """Create GCP-based AI agent projects from templates."""
246
245
  try:
246
+ console = Console()
247
+
247
248
  # Display welcome banner (unless skipped)
248
249
  if not skip_welcome:
249
250
  display_welcome_banner(agent)
@@ -307,6 +308,7 @@ def create(
307
308
  selected_agent = None
308
309
  template_source_path = None
309
310
  temp_dir_to_clean = None
311
+ remote_spec = None
310
312
 
311
313
  if agent:
312
314
  if agent.startswith("local@"):
@@ -348,6 +350,20 @@ def create(
348
350
  )
349
351
  temp_dir_to_clean = str(temp_dir_path)
350
352
  selected_agent = f"remote_{hash(agent)}" # Generate unique name for remote template
353
+
354
+ # Show informational message for ADK samples with smart defaults
355
+ if remote_spec.is_adk_samples:
356
+ config = load_remote_template_config(
357
+ template_source_path, is_adk_sample=True
358
+ )
359
+ if not config.get("has_explicit_config", True):
360
+ console = Console()
361
+ console.print(
362
+ "\n[blue]ℹ️ Note: The starter pack uses heuristics to template this ADK sample agent.[/]"
363
+ )
364
+ console.print(
365
+ "[dim] The starter pack attempts to create a working codebase, but you'll need to follow the generated README for complete setup.[/]"
366
+ )
351
367
  else:
352
368
  # Handle local agent selection
353
369
  agents = get_available_agents()
@@ -397,6 +413,20 @@ def create(
397
413
  temp_dir_to_clean = str(temp_dir_path)
398
414
  final_agent = f"remote_{hash(agent)}" # Generate unique name for remote template
399
415
 
416
+ # Show informational message for ADK samples with smart defaults
417
+ if remote_spec.is_adk_samples:
418
+ config = load_remote_template_config(
419
+ template_source_path, is_adk_sample=True
420
+ )
421
+ if not config.get("has_explicit_config", True):
422
+ console = Console()
423
+ console.print(
424
+ "\n[blue]ℹ️ Note: The starter pack uses heuristics to template this ADK sample agent.[/]"
425
+ )
426
+ console.print(
427
+ "[dim] The starter pack attempts to create a working codebase, but you'll need to follow the generated README for complete setup.[/]"
428
+ )
429
+
400
430
  if debug:
401
431
  logging.debug(f"Selected agent: {final_agent}")
402
432
 
@@ -409,7 +439,9 @@ def create(
409
439
 
410
440
  # Load remote template config
411
441
  source_config = load_remote_template_config(
412
- template_source_path, cli_overrides
442
+ template_source_path,
443
+ cli_overrides,
444
+ is_adk_sample=remote_spec.is_adk_samples if remote_spec else False,
413
445
  )
414
446
 
415
447
  # Remote templates now work even without pyproject.toml thanks to defaults
@@ -774,56 +806,10 @@ def display_adk_samples_selection() -> str:
774
806
  # Fetch the repository
775
807
  repo_path, _ = fetch_remote_template(spec)
776
808
 
777
- # Scan for agents in the repository
778
- adk_agents = {}
779
- agent_count = 1
809
+ # Use shared ADK discovery function
810
+ from ..utils.remote_template import discover_adk_agents
780
811
 
781
- # Search for pyproject.toml files to identify agents
782
- for config_path in sorted(repo_path.glob("**/pyproject.toml")):
783
- try:
784
- with open(config_path, "rb") as f:
785
- pyproject_data = tomllib.load(f)
786
-
787
- config = pyproject_data.get("tool", {}).get("agent-starter-pack", {})
788
-
789
- # Skip pyproject.toml files that don't have agent-starter-pack config
790
- if not config:
791
- continue
792
-
793
- template_root = config_path.parent
794
-
795
- # Use fallbacks to [project] section if needed
796
- project_info = pyproject_data.get("project", {})
797
- agent_name = (
798
- config.get("name") or project_info.get("name") or template_root.name
799
- )
800
- description = (
801
- config.get("description") or project_info.get("description") or ""
802
- )
803
-
804
- # Get the relative path from repo root
805
- relative_path = template_root.relative_to(repo_path)
806
-
807
- # For adk-samples, use just the agent name for the spec
808
- # This handles cases like python/agents/gemini-fullstack -> gemini-fullstack
809
- agent_spec_name = (
810
- relative_path.name
811
- if relative_path != relative_path.parent
812
- else str(relative_path)
813
- )
814
-
815
- adk_agents[agent_count] = {
816
- "name": agent_name,
817
- "description": description,
818
- "path": str(relative_path),
819
- "spec": f"adk@{agent_spec_name}",
820
- }
821
- agent_count += 1
822
-
823
- except Exception as e:
824
- logging.warning(
825
- f"Could not load agent from {config_path.parent.parent}: {e}"
826
- )
812
+ adk_agents = discover_adk_agents(repo_path)
827
813
 
828
814
  if not adk_agents:
829
815
  console.print("No agents found in adk-samples repository", style="yellow")
@@ -831,9 +817,19 @@ def display_adk_samples_selection() -> str:
831
817
  return display_agent_selection()
832
818
 
833
819
  console.print("\n> Available agents from [bold blue]google/adk-samples[/]:")
820
+
821
+ # Show explanation for inferred agents at the top
822
+ from ..utils.remote_template import display_adk_caveat_if_needed
823
+
824
+ display_adk_caveat_if_needed(adk_agents)
825
+
834
826
  for num, agent in adk_agents.items():
827
+ name_with_indicator = agent["name"]
828
+ if not agent.get("has_explicit_config", True):
829
+ name_with_indicator += " *"
830
+
835
831
  console.print(
836
- f"{num}. [bold]{agent['name']}[/] - [dim]{agent['description']}[/]"
832
+ f"{num}. [bold]{name_with_indicator}[/] - [dim]{agent['description']}[/]"
837
833
  )
838
834
 
839
835
  # Add option to go back to local agents
@@ -1030,18 +1026,22 @@ def _handle_credential_verification(creds_info: dict) -> dict:
1030
1026
  return creds_info
1031
1027
 
1032
1028
 
1033
- def _test_vertex_ai_connection(project_id: str, region: str) -> None:
1029
+ def _test_vertex_ai_connection(
1030
+ project_id: str, region: str, auto_approve: bool = False
1031
+ ) -> None:
1034
1032
  """Test connection to Vertex AI.
1035
1033
 
1036
1034
  Args:
1037
1035
  project_id: GCP project ID
1038
1036
  region: GCP region for deployment
1037
+ auto_approve: Whether to auto-approve API enablement
1039
1038
  """
1040
1039
  console.print("> Testing GCP and Vertex AI Connection...")
1041
1040
  try:
1042
1041
  verify_vertex_connection(
1043
1042
  project_id=project_id,
1044
1043
  location=region,
1044
+ auto_approve=auto_approve,
1045
1045
  )
1046
1046
  console.print(
1047
1047
  f"> ✓ Successfully verified connection to Vertex AI in project {project_id}"
@@ -1053,6 +1053,7 @@ def _test_vertex_ai_connection(project_id: str, region: str) -> None:
1053
1053
  f"Visit https://cloud.google.com/vertex-ai/docs/authentication for help.",
1054
1054
  style="bold red",
1055
1055
  )
1056
+ raise
1056
1057
 
1057
1058
 
1058
1059
  def replace_region_in_files(
@@ -13,12 +13,18 @@
13
13
  # limitations under the License.
14
14
 
15
15
  import pathlib
16
+ import sys
16
17
  from typing import Any
17
18
 
18
19
  import click
19
20
  from rich.console import Console
20
21
  from rich.prompt import IntPrompt
21
22
 
23
+ if sys.version_info >= (3, 11):
24
+ import tomllib
25
+ else:
26
+ import tomli as tomllib
27
+
22
28
  from ..utils.logging import display_welcome_banner, handle_cli_error
23
29
  from ..utils.template import get_available_agents
24
30
  from .create import (
@@ -253,8 +259,6 @@ def enhance(
253
259
  pyproject_path = current_dir / "pyproject.toml"
254
260
  if pyproject_path.exists():
255
261
  try:
256
- import tomllib
257
-
258
262
  with open(pyproject_path, "rb") as f:
259
263
  pyproject_data = tomllib.load(f)
260
264
  packages = (
@@ -14,9 +14,14 @@
14
14
 
15
15
  import logging
16
16
  import pathlib
17
- import tomllib
17
+ import sys
18
18
 
19
19
  import click
20
+
21
+ if sys.version_info >= (3, 11):
22
+ import tomllib
23
+ else:
24
+ import tomli as tomllib
20
25
  from rich.console import Console
21
26
  from rich.table import Table
22
27
 
@@ -26,7 +31,9 @@ from ..utils.template import get_available_agents
26
31
  console = Console()
27
32
 
28
33
 
29
- def display_agents_from_path(base_path: pathlib.Path, source_name: str) -> None:
34
+ def display_agents_from_path(
35
+ base_path: pathlib.Path, source_name: str, is_adk_samples: bool = False
36
+ ) -> None:
30
37
  """Scans a directory and displays available agents."""
31
38
  table = Table(
32
39
  title=f"Available agents in [bold blue]{source_name}[/]",
@@ -42,41 +49,66 @@ def display_agents_from_path(base_path: pathlib.Path, source_name: str) -> None:
42
49
  return
43
50
 
44
51
  found_agents = False
45
- # Search for pyproject.toml files to identify agents (explicit opt-in)
46
- for config_path in sorted(base_path.glob("**/pyproject.toml")):
47
- try:
48
- with open(config_path, "rb") as f:
49
- pyproject_data = tomllib.load(f)
52
+ adk_agents = {}
50
53
 
51
- config = pyproject_data.get("tool", {}).get("agent-starter-pack", {})
54
+ if is_adk_samples:
55
+ # For ADK samples, use the shared discovery function
56
+ from ..utils.remote_template import discover_adk_agents
52
57
 
53
- # Skip pyproject.toml files that don't have agent-starter-pack config
54
- if not config:
55
- continue
58
+ adk_agents = discover_adk_agents(base_path)
56
59
 
57
- template_root = config_path.parent
60
+ for agent_info in adk_agents.values():
61
+ # Add indicator for inferred agents
62
+ name_with_indicator = agent_info["name"]
63
+ if not agent_info.get("has_explicit_config", True):
64
+ name_with_indicator += " *"
58
65
 
59
- # Use fallbacks to [project] section if needed
60
- project_info = pyproject_data.get("project", {})
61
- agent_name = (
62
- config.get("name") or project_info.get("name") or template_root.name
63
- )
64
- description = (
65
- config.get("description") or project_info.get("description") or ""
66
+ table.add_row(
67
+ name_with_indicator, f"/{agent_info['path']}", agent_info["description"]
66
68
  )
69
+ found_agents = True
70
+ else:
71
+ # Original logic for non-ADK sources: Search for pyproject.toml files with explicit config
72
+ for config_path in sorted(base_path.glob("**/pyproject.toml")):
73
+ try:
74
+ with open(config_path, "rb") as f:
75
+ pyproject_data = tomllib.load(f)
67
76
 
68
- # Display the agent's path relative to the scanned directory
69
- relative_path = template_root.relative_to(base_path)
77
+ config = pyproject_data.get("tool", {}).get("agent-starter-pack", {})
70
78
 
71
- table.add_row(agent_name, f"/{relative_path}", description)
72
- found_agents = True
79
+ # Skip pyproject.toml files that don't have agent-starter-pack config
80
+ if not config:
81
+ continue
82
+
83
+ template_root = config_path.parent
84
+
85
+ # Use fallbacks to [project] section if needed
86
+ project_info = pyproject_data.get("project", {})
87
+ agent_name = (
88
+ config.get("name") or project_info.get("name") or template_root.name
89
+ )
90
+ description = (
91
+ config.get("description") or project_info.get("description") or ""
92
+ )
73
93
 
74
- except Exception as e:
75
- logging.warning(f"Could not load agent from {config_path.parent}: {e}")
94
+ # Display the agent's path relative to the scanned directory
95
+ relative_path = template_root.relative_to(base_path)
96
+
97
+ table.add_row(agent_name, f"/{relative_path}", description)
98
+ found_agents = True
99
+
100
+ except Exception as e:
101
+ logging.warning(f"Could not load agent from {config_path.parent}: {e}")
76
102
 
77
103
  if not found_agents:
78
104
  console.print(f"No agents found in {source_name}", style="yellow")
79
105
  else:
106
+ # Show explanation for inferred agents at the top (only for ADK samples)
107
+ if is_adk_samples:
108
+ from ..utils.remote_template import display_adk_caveat_if_needed
109
+
110
+ display_adk_caveat_if_needed(adk_agents)
111
+
80
112
  console.print(table)
81
113
 
82
114
 
@@ -98,7 +130,14 @@ def list_remote_agents(remote_source: str, scan_from_root: bool = False) -> None
98
130
  repo_path, template_path = template_dir_path
99
131
  scan_path = repo_path if scan_from_root else template_path
100
132
 
101
- display_agents_from_path(scan_path, remote_source)
133
+ # Check if this is ADK samples to enable inference
134
+ is_adk_samples = (
135
+ spec.is_adk_samples if hasattr(spec, "is_adk_samples") else False
136
+ )
137
+
138
+ display_agents_from_path(
139
+ scan_path, remote_source, is_adk_samples=is_adk_samples
140
+ )
102
141
 
103
142
  except (RuntimeError, FileNotFoundError) as e:
104
143
  console.print(f"Error: {e}", style="bold red")