agent-starter-pack 0.16.0__py3-none-any.whl → 0.17.1__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.

Potentially problematic release.


This version of agent-starter-pack might be problematic. Click here for more details.

Files changed (180) hide show
  1. {agents → agent_starter_pack/agents}/adk_live/.template/templateconfig.yaml +1 -1
  2. {agents → agent_starter_pack/agents}/adk_live/README.md +2 -1
  3. {src → agent_starter_pack}/base_template/Makefile +2 -2
  4. {src → agent_starter_pack}/base_template/deployment/terraform/dev/log_sinks.tf +31 -25
  5. {src → agent_starter_pack}/base_template/deployment/terraform/dev/providers.tf +1 -1
  6. {src → agent_starter_pack}/base_template/deployment/terraform/github.tf +14 -0
  7. {src → agent_starter_pack}/base_template/deployment/terraform/log_sinks.tf +37 -28
  8. {src → agent_starter_pack}/base_template/deployment/terraform/providers.tf +1 -1
  9. {src → agent_starter_pack}/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}build_triggers.tf{% else %}unused_build_triggers.tf{% endif %} +4 -2
  10. {src → agent_starter_pack}/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/deploy-to-prod.yaml +3 -3
  11. {src → agent_starter_pack}/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/pr_checks.yaml +2 -2
  12. {src → agent_starter_pack}/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/staging.yaml +3 -3
  13. {src → agent_starter_pack}/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/deploy-to-prod.yaml +4 -4
  14. {src → agent_starter_pack}/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/pr_checks.yaml +3 -3
  15. {src → agent_starter_pack}/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/staging.yaml +7 -7
  16. {src → agent_starter_pack}/cli/commands/setup_cicd.py +1 -1
  17. {src → agent_starter_pack}/cli/main.py +2 -2
  18. {src → agent_starter_pack}/cli/utils/gcp.py +1 -1
  19. {src → agent_starter_pack}/cli/utils/remote_template.py +12 -9
  20. {src → agent_starter_pack}/cli/utils/template.py +15 -18
  21. agent_starter_pack/deployment_targets/agent_engine/deployment/terraform/{% if not cookiecutter.is_adk_live %}service.tf{% else %}unused_service.tf{% endif %} +82 -0
  22. {src → agent_starter_pack}/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/agent_engine_app.py +29 -11
  23. {src → agent_starter_pack}/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/utils/deployment.py +11 -6
  24. {src → agent_starter_pack}/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/utils/{% if cookiecutter.is_adk_live %}expose_app.py{% else %}unused_expose_app.py{% endif %} +110 -51
  25. {src → agent_starter_pack}/deployment_targets/cloud_run/{{cookiecutter.agent_directory}}/server.py +12 -0
  26. {src → agent_starter_pack}/resources/docs/adk-cheatsheet.md +5 -5
  27. {src → agent_starter_pack}/resources/locks/uv-adk_base-agent_engine.lock +741 -701
  28. {src → agent_starter_pack}/resources/locks/uv-adk_base-cloud_run.lock +1032 -993
  29. {src → agent_starter_pack}/resources/locks/uv-adk_live-agent_engine.lock +742 -702
  30. {src → agent_starter_pack}/resources/locks/uv-adk_live-cloud_run.lock +1033 -994
  31. {src → agent_starter_pack}/resources/locks/uv-agentic_rag-agent_engine.lock +769 -744
  32. {src → agent_starter_pack}/resources/locks/uv-agentic_rag-cloud_run.lock +1076 -1052
  33. {src → agent_starter_pack}/resources/locks/uv-crewai_coding_crew-agent_engine.lock +930 -916
  34. {src → agent_starter_pack}/resources/locks/uv-crewai_coding_crew-cloud_run.lock +1263 -1253
  35. {src → agent_starter_pack}/resources/locks/uv-langgraph_base_react-agent_engine.lock +814 -807
  36. {src → agent_starter_pack}/resources/locks/uv-langgraph_base_react-cloud_run.lock +1170 -1167
  37. {src → agent_starter_pack}/utils/generate_locks.py +4 -3
  38. {src → agent_starter_pack}/utils/lock_utils.py +2 -2
  39. {src → agent_starter_pack}/utils/watch_and_rebuild.py +1 -1
  40. {agent_starter_pack-0.16.0.dist-info → agent_starter_pack-0.17.1.dist-info}/METADATA +17 -18
  41. agent_starter_pack-0.17.1.dist-info/RECORD +179 -0
  42. agent_starter_pack-0.17.1.dist-info/entry_points.txt +2 -0
  43. agent_starter_pack-0.16.0.dist-info/RECORD +0 -178
  44. agent_starter_pack-0.16.0.dist-info/entry_points.txt +0 -2
  45. {agents → agent_starter_pack/agents}/README.md +0 -0
  46. {agents → agent_starter_pack/agents}/adk_base/.template/templateconfig.yaml +0 -0
  47. {agents → agent_starter_pack/agents}/adk_base/README.md +0 -0
  48. {agents → agent_starter_pack/agents}/adk_base/app/__init__.py +0 -0
  49. {agents → agent_starter_pack/agents}/adk_base/app/agent.py +0 -0
  50. {agents → agent_starter_pack/agents}/adk_base/notebooks/adk_app_testing.ipynb +0 -0
  51. {agents → agent_starter_pack/agents}/adk_base/notebooks/evaluating_adk_agent.ipynb +0 -0
  52. {agents → agent_starter_pack/agents}/adk_base/tests/integration/test_agent.py +0 -0
  53. {agents → agent_starter_pack/agents}/adk_live/app/agent.py +0 -0
  54. {agents → agent_starter_pack/agents}/adk_live/tests/unit/test_dummy.py +0 -0
  55. {agents → agent_starter_pack/agents}/agentic_rag/.template/templateconfig.yaml +0 -0
  56. {agents → agent_starter_pack/agents}/agentic_rag/README.md +0 -0
  57. {agents → agent_starter_pack/agents}/agentic_rag/app/__init__.py +0 -0
  58. {agents → agent_starter_pack/agents}/agentic_rag/app/agent.py +0 -0
  59. {agents → agent_starter_pack/agents}/agentic_rag/app/retrievers.py +0 -0
  60. {agents → agent_starter_pack/agents}/agentic_rag/app/templates.py +0 -0
  61. {agents → agent_starter_pack/agents}/agentic_rag/notebooks/adk_app_testing.ipynb +0 -0
  62. {agents → agent_starter_pack/agents}/agentic_rag/notebooks/evaluating_adk_agent.ipynb +0 -0
  63. {agents → agent_starter_pack/agents}/agentic_rag/tests/integration/test_agent.py +0 -0
  64. {agents → agent_starter_pack/agents}/crewai_coding_crew/.template/templateconfig.yaml +0 -0
  65. {agents → agent_starter_pack/agents}/crewai_coding_crew/README.md +0 -0
  66. {agents → agent_starter_pack/agents}/crewai_coding_crew/app/agent.py +0 -0
  67. {agents → agent_starter_pack/agents}/crewai_coding_crew/app/crew/config/agents.yaml +0 -0
  68. {agents → agent_starter_pack/agents}/crewai_coding_crew/app/crew/config/tasks.yaml +0 -0
  69. {agents → agent_starter_pack/agents}/crewai_coding_crew/app/crew/crew.py +0 -0
  70. {agents → agent_starter_pack/agents}/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb +0 -0
  71. {agents → agent_starter_pack/agents}/crewai_coding_crew/notebooks/evaluating_langgraph_agent.ipynb +0 -0
  72. {agents → agent_starter_pack/agents}/crewai_coding_crew/tests/integration/test_agent.py +0 -0
  73. {agents → agent_starter_pack/agents}/langgraph_base_react/.template/templateconfig.yaml +0 -0
  74. {agents → agent_starter_pack/agents}/langgraph_base_react/README.md +0 -0
  75. {agents → agent_starter_pack/agents}/langgraph_base_react/app/agent.py +0 -0
  76. {agents → agent_starter_pack/agents}/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb +0 -0
  77. {agents → agent_starter_pack/agents}/langgraph_base_react/tests/integration/test_agent.py +0 -0
  78. {src → agent_starter_pack}/base_template/.gitignore +0 -0
  79. {src → agent_starter_pack}/base_template/GEMINI.md +0 -0
  80. {src → agent_starter_pack}/base_template/README.md +0 -0
  81. {src → agent_starter_pack}/base_template/deployment/README.md +0 -0
  82. {src → agent_starter_pack}/base_template/deployment/terraform/apis.tf +0 -0
  83. {src → agent_starter_pack}/base_template/deployment/terraform/dev/apis.tf +0 -0
  84. {src → agent_starter_pack}/base_template/deployment/terraform/dev/iam.tf +0 -0
  85. {src → agent_starter_pack}/base_template/deployment/terraform/dev/storage.tf +0 -0
  86. {src → agent_starter_pack}/base_template/deployment/terraform/dev/variables.tf +0 -0
  87. {src → agent_starter_pack}/base_template/deployment/terraform/dev/vars/env.tfvars +0 -0
  88. {src → agent_starter_pack}/base_template/deployment/terraform/iam.tf +0 -0
  89. {src → agent_starter_pack}/base_template/deployment/terraform/locals.tf +0 -0
  90. {src → agent_starter_pack}/base_template/deployment/terraform/service_accounts.tf +0 -0
  91. {src → agent_starter_pack}/base_template/deployment/terraform/storage.tf +0 -0
  92. {src → agent_starter_pack}/base_template/deployment/terraform/variables.tf +0 -0
  93. {src → agent_starter_pack}/base_template/deployment/terraform/vars/env.tfvars +0 -0
  94. {src → agent_starter_pack}/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'github_actions' %}wif.tf{% else %}unused_wif.tf{% endif %} +0 -0
  95. {src → agent_starter_pack}/base_template/pyproject.toml +0 -0
  96. {src → agent_starter_pack}/base_template/tests/unit/test_dummy.py +0 -0
  97. {src → agent_starter_pack}/base_template/{{cookiecutter.agent_directory}}/utils/gcs.py +0 -0
  98. {src → agent_starter_pack}/base_template/{{cookiecutter.agent_directory}}/utils/tracing.py +0 -0
  99. {src → agent_starter_pack}/base_template/{{cookiecutter.agent_directory}}/utils/typing.py +0 -0
  100. {src → agent_starter_pack}/cli/commands/create.py +0 -0
  101. {src → agent_starter_pack}/cli/commands/enhance.py +0 -0
  102. {src → agent_starter_pack}/cli/commands/list.py +0 -0
  103. {src → agent_starter_pack}/cli/utils/__init__.py +0 -0
  104. {src → agent_starter_pack}/cli/utils/cicd.py +0 -0
  105. {src → agent_starter_pack}/cli/utils/datastores.py +0 -0
  106. {src → agent_starter_pack}/cli/utils/logging.py +0 -0
  107. {src → agent_starter_pack}/cli/utils/version.py +0 -0
  108. {src → agent_starter_pack}/data_ingestion/README.md +0 -0
  109. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +0 -0
  110. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/process_data.py +0 -0
  111. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/pipeline.py +0 -0
  112. {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +0 -0
  113. {src → agent_starter_pack}/data_ingestion/pyproject.toml +0 -0
  114. {src → agent_starter_pack}/data_ingestion/uv.lock +0 -0
  115. {src → agent_starter_pack}/deployment_targets/agent_engine/deployment_metadata.json +0 -0
  116. {src → agent_starter_pack}/deployment_targets/agent_engine/notebooks/intro_agent_engine.ipynb +0 -0
  117. {src → agent_starter_pack}/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +0 -0
  118. {src → agent_starter_pack}/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
  119. {src → agent_starter_pack}/deployment_targets/agent_engine/tests/load_test/README.md +0 -0
  120. {src → agent_starter_pack}/deployment_targets/agent_engine/tests/load_test/load_test.py +0 -0
  121. {src → agent_starter_pack}/deployment_targets/cloud_run/Dockerfile +0 -0
  122. {src → agent_starter_pack}/deployment_targets/cloud_run/deployment/terraform/dev/service.tf +0 -0
  123. {src → agent_starter_pack}/deployment_targets/cloud_run/deployment/terraform/service.tf +0 -0
  124. {src → agent_starter_pack}/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +0 -0
  125. {src → agent_starter_pack}/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
  126. {src → agent_starter_pack}/deployment_targets/cloud_run/tests/load_test/README.md +0 -0
  127. {src → agent_starter_pack}/deployment_targets/cloud_run/tests/load_test/load_test.py +0 -0
  128. {src → agent_starter_pack}/frontends/adk_live_react/frontend/package-lock.json +0 -0
  129. {src → agent_starter_pack}/frontends/adk_live_react/frontend/package.json +0 -0
  130. {src → agent_starter_pack}/frontends/adk_live_react/frontend/public/favicon.ico +0 -0
  131. {src → agent_starter_pack}/frontends/adk_live_react/frontend/public/index.html +0 -0
  132. {src → agent_starter_pack}/frontends/adk_live_react/frontend/public/robots.txt +0 -0
  133. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/App.scss +0 -0
  134. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/App.test.tsx +0 -0
  135. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/App.tsx +0 -0
  136. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/components/audio-pulse/AudioPulse.tsx +0 -0
  137. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/components/audio-pulse/audio-pulse.scss +0 -0
  138. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/components/logger/Logger.tsx +0 -0
  139. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/components/logger/logger.scss +0 -0
  140. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/components/logger/mock-logs.ts +0 -0
  141. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/components/side-panel/SidePanel.tsx +0 -0
  142. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/components/side-panel/side-panel.scss +0 -0
  143. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/components/transcription-preview/TranscriptionPreview.tsx +0 -0
  144. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/components/transcription-preview/transcription-preview.scss +0 -0
  145. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/contexts/LiveAPIContext.tsx +0 -0
  146. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/hooks/use-live-api.ts +0 -0
  147. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/hooks/use-media-stream-mux.ts +0 -0
  148. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/hooks/use-screen-capture.ts +0 -0
  149. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/hooks/use-webcam.ts +0 -0
  150. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/index.css +0 -0
  151. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/index.tsx +0 -0
  152. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/multimodal-live-types.ts +0 -0
  153. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/react-app-env.d.ts +0 -0
  154. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/reportWebVitals.ts +0 -0
  155. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/setupTests.ts +0 -0
  156. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/utils/audio-recorder.ts +0 -0
  157. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/utils/audio-streamer.ts +0 -0
  158. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/utils/audioworklet-registry.ts +0 -0
  159. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/utils/multimodal-live-client.ts +0 -0
  160. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/utils/store-logger.ts +0 -0
  161. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/utils/utils.ts +0 -0
  162. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/utils/worklets/audio-processing.ts +0 -0
  163. {src → agent_starter_pack}/frontends/adk_live_react/frontend/src/utils/worklets/vol-meter.ts +0 -0
  164. {src → agent_starter_pack}/frontends/adk_live_react/frontend/tsconfig.json +0 -0
  165. {src → agent_starter_pack}/frontends/streamlit/frontend/side_bar.py +0 -0
  166. {src → agent_starter_pack}/frontends/streamlit/frontend/streamlit_app.py +0 -0
  167. {src → agent_starter_pack}/frontends/streamlit/frontend/style/app_markdown.py +0 -0
  168. {src → agent_starter_pack}/frontends/streamlit/frontend/utils/chat_utils.py +0 -0
  169. {src → agent_starter_pack}/frontends/streamlit/frontend/utils/local_chat_history.py +0 -0
  170. {src → agent_starter_pack}/frontends/streamlit/frontend/utils/message_editing.py +0 -0
  171. {src → agent_starter_pack}/frontends/streamlit/frontend/utils/multimodal_utils.py +0 -0
  172. {src → agent_starter_pack}/frontends/streamlit/frontend/utils/stream_handler.py +0 -0
  173. {src → agent_starter_pack}/frontends/streamlit/frontend/utils/title_summary.py +0 -0
  174. {src → agent_starter_pack}/resources/containers/data_processing/Dockerfile +0 -0
  175. {src → agent_starter_pack}/resources/containers/e2e-tests/Dockerfile +0 -0
  176. {src → agent_starter_pack}/resources/idx/.idx/dev.nix +0 -0
  177. {src → agent_starter_pack}/resources/idx/idx-template.json +0 -0
  178. {src → agent_starter_pack}/resources/idx/idx-template.nix +0 -0
  179. {agent_starter_pack-0.16.0.dist-info → agent_starter_pack-0.17.1.dist-info}/WHEEL +0 -0
  180. {agent_starter_pack-0.16.0.dist-info → agent_starter_pack-0.17.1.dist-info}/licenses/LICENSE +0 -0
@@ -17,6 +17,6 @@ settings:
17
17
  requires_data_ingestion: false
18
18
  frontend_type: "adk_live_react"
19
19
  deployment_targets: ["agent_engine", "cloud_run"]
20
- extra_dependencies: ["google-adk>=1.15.0,<2.0.0", "click>=8.0.0,<9.0.0", "uvicorn>=0.18.0,<1.0.0", "fastapi>=0.75.0,<1.0.0", "backoff>=2.0.0,<3.0.0"]
20
+ extra_dependencies: ["google-adk>=1.16.0,<2.0.0", "click>=8.0.0,<9.0.0", "uvicorn>=0.18.0,<1.0.0", "fastapi>=0.75.0,<1.0.0", "backoff>=2.0.0,<3.0.0"]
21
21
  tags: ["adk", "adk_live"]
22
22
  example_question: "What's the weather in San Francisco?"
@@ -2,7 +2,7 @@
2
2
 
3
3
  Real-time conversational agent built with Google ADK and Gemini's live audio model. Supports audio, video, and text interactions with native tool calling.
4
4
 
5
- ![adk_live_diagram](https://storage.googleapis.com/github-repo/generative-ai/sample-apps/e2e-gen-ai-app-starter-pack/adk_live_diagram.png)
5
+ ![live_api_diagram](https://storage.googleapis.com/github-repo/generative-ai/sample-apps/e2e-gen-ai-app-starter-pack/live_api_diagram.png)
6
6
 
7
7
  **Key components:**
8
8
 
@@ -19,6 +19,7 @@ Once running, click the play button to connect and interact with the agent. Try
19
19
  Explore these resources to learn more about the Multimodal Live API and see examples of its usage:
20
20
 
21
21
  - [Project Pastra](https://github.com/heiko-hotz/gemini-multimodal-live-dev-guide/tree/main): a comprehensive developer guide for the Gemini Multimodal Live API.
22
+ - [ADK Samples: Realtime Conversational Agent](https://github.com/google/adk-samples/tree/main/python/agents/realtime-conversational-agent): Full-stack, reusable template using Agent Development Kit (ADK) with the Gemini Live API.
22
23
  - [Google Cloud Multimodal Live API demos and samples](https://github.com/GoogleCloudPlatform/generative-ai/tree/main/gemini/multimodal-live-api): Collection of code samples and demo applications leveraging multimodal live API in Vertex AI
23
24
  - [Gemini 2 Cookbook](https://github.com/google-gemini/cookbook/tree/main/gemini-2): Practical examples and tutorials for working with Gemini 2
24
25
  - [Multimodal Live API Web Console](https://github.com/google-gemini/multimodal-live-api-web-console): Interactive React-based web interface for testing and experimenting with Gemini Multimodal Live API.
@@ -38,7 +38,7 @@ playground:{%- if cookiecutter.is_adk_live %} build-frontend-if-needed{%- endif
38
38
  @echo "==============================================================================="
39
39
  {%- if cookiecutter.is_adk_live %}
40
40
  {%- if cookiecutter.deployment_target == 'agent_engine' %}
41
- uv run python -m {{cookiecutter.agent_directory}}.utils.expose_app --mode local
41
+ uv run python -m {{cookiecutter.agent_directory}}.utils.expose_app --mode local --local-agent {{cookiecutter.agent_directory}}.agent.root_agent
42
42
  {%- else %}
43
43
  uv run uvicorn {{cookiecutter.agent_directory}}.server:app --host localhost --port 8000 --reload
44
44
  {%- endif %}
@@ -111,7 +111,7 @@ local-backend:
111
111
 
112
112
  # Launch local development server with hot-reload
113
113
  local-backend:
114
- uv run python -m {{cookiecutter.agent_directory}}.utils.expose_app --mode local --port 8000
114
+ uv run python -m {{cookiecutter.agent_directory}}.utils.expose_app --mode local --port 8000 --local-agent {{cookiecutter.agent_directory}}.agent.root_agent
115
115
 
116
116
  # Connect to remote deployed agent
117
117
  playground-remote: build-frontend-if-needed
@@ -12,13 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- resource "google_project_iam_member" "bigquery_data_editor" {
16
-
17
- project = var.dev_project_id
18
- role = "roles/bigquery.dataEditor"
19
- member = module.log_export_to_bigquery.writer_identity
20
- }
21
-
22
15
  resource "google_bigquery_dataset" "feedback_dataset" {
23
16
  project = var.dev_project_id
24
17
  dataset_id = replace("${var.project_name}_feedback", "-", "_")
@@ -35,29 +28,42 @@ resource "google_bigquery_dataset" "telemetry_logs_dataset" {
35
28
  depends_on = [resource.google_project_service.services]
36
29
  }
37
30
 
38
- module "feedback_export_to_bigquery" {
39
- source = "terraform-google-modules/log-export/google"
40
- version = "10.0.0"
41
- log_sink_name = "${var.project_name}_feedback"
42
- parent_resource_type = "project"
43
- parent_resource_id = var.dev_project_id
44
- destination_uri = "bigquery.googleapis.com/projects/${var.dev_project_id}/datasets/${google_bigquery_dataset.feedback_dataset.dataset_id}"
45
- filter = var.feedback_logs_filter
46
- bigquery_options = { use_partitioned_tables = true }
31
+ resource "google_logging_project_sink" "feedback_export_to_bigquery" {
32
+ name = "${var.project_name}_feedback"
33
+ project = var.dev_project_id
34
+ destination = "bigquery.googleapis.com/projects/${var.dev_project_id}/datasets/${google_bigquery_dataset.feedback_dataset.dataset_id}"
35
+ filter = var.feedback_logs_filter
36
+
37
+ bigquery_options {
38
+ use_partitioned_tables = true
39
+ }
40
+
47
41
  unique_writer_identity = true
48
42
  depends_on = [google_bigquery_dataset.feedback_dataset]
49
43
  }
50
44
 
51
- module "log_export_to_bigquery" {
52
- source = "terraform-google-modules/log-export/google"
53
- version = "10.0.0"
45
+ resource "google_logging_project_sink" "log_export_to_bigquery" {
46
+ name = "${var.project_name}_telemetry"
47
+ project = var.dev_project_id
48
+ destination = "bigquery.googleapis.com/projects/${var.dev_project_id}/datasets/${google_bigquery_dataset.telemetry_logs_dataset.dataset_id}"
49
+ filter = var.telemetry_logs_filter
50
+
51
+ bigquery_options {
52
+ use_partitioned_tables = true
53
+ }
54
54
 
55
- log_sink_name = "${var.project_name}_telemetry"
56
- parent_resource_type = "project"
57
- parent_resource_id = var.dev_project_id
58
- destination_uri = "bigquery.googleapis.com/projects/${var.dev_project_id}/datasets/${google_bigquery_dataset.telemetry_logs_dataset.dataset_id}"
59
- filter = var.telemetry_logs_filter
60
- bigquery_options = { use_partitioned_tables = true }
61
55
  unique_writer_identity = true
62
56
  depends_on = [google_bigquery_dataset.telemetry_logs_dataset]
63
57
  }
58
+
59
+ resource "google_project_iam_member" "bigquery_data_editor" {
60
+ project = var.dev_project_id
61
+ role = "roles/bigquery.dataEditor"
62
+ member = google_logging_project_sink.log_export_to_bigquery.writer_identity
63
+ }
64
+
65
+ resource "google_project_iam_member" "feedback_bigquery_data_editor" {
66
+ project = var.dev_project_id
67
+ role = "roles/bigquery.dataEditor"
68
+ member = google_logging_project_sink.feedback_export_to_bigquery.writer_identity
69
+ }
@@ -17,7 +17,7 @@ terraform {
17
17
  required_providers {
18
18
  google = {
19
19
  source = "hashicorp/google"
20
- version = "< 7.0.0"
20
+ version = "> 7.0.0"
21
21
  }
22
22
  }
23
23
  }
@@ -119,6 +119,20 @@ resource "github_actions_variable" "app_sa_email_prod" {
119
119
  depends_on = [github_repository.repo]
120
120
  }
121
121
 
122
+ resource "github_actions_variable" "logs_bucket_name_staging" {
123
+ repository = var.repository_name
124
+ variable_name = "LOGS_BUCKET_NAME_STAGING"
125
+ value = google_storage_bucket.logs_data_bucket[var.staging_project_id].url
126
+ depends_on = [github_repository.repo]
127
+ }
128
+
129
+ resource "github_actions_variable" "logs_bucket_name_prod" {
130
+ repository = var.repository_name
131
+ variable_name = "LOGS_BUCKET_NAME_PROD"
132
+ value = google_storage_bucket.logs_data_bucket[var.prod_project_id].url
133
+ depends_on = [github_repository.repo]
134
+ }
135
+
122
136
  {% if cookiecutter.deployment_target == 'cloud_run' %}
123
137
  resource "github_actions_variable" "container_name" {
124
138
  repository = var.repository_name
@@ -12,14 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- resource "google_project_iam_member" "bigquery_data_editor" {
16
- for_each = local.deploy_project_ids
17
-
18
- project = each.value
19
- role = "roles/bigquery.dataEditor"
20
- member = module.log_export_to_bigquery[each.key].writer_identity
21
- }
22
-
23
15
  resource "google_bigquery_dataset" "feedback_dataset" {
24
16
  for_each = local.deploy_project_ids
25
17
  project = each.value
@@ -38,33 +30,50 @@ resource "google_bigquery_dataset" "telemetry_logs_dataset" {
38
30
  depends_on = [resource.google_project_service.cicd_services, resource.google_project_service.deploy_project_services]
39
31
  }
40
32
 
41
- module "log_export_to_bigquery" {
33
+ resource "google_logging_project_sink" "feedback_export_to_bigquery" {
42
34
  for_each = local.deploy_project_ids
43
35
 
44
- source = "terraform-google-modules/log-export/google"
45
- version = "10.0.0"
36
+ name = "${var.project_name}_feedback"
37
+ project = each.value
38
+ destination = "bigquery.googleapis.com/projects/${each.value}/datasets/${google_bigquery_dataset.feedback_dataset[each.key].dataset_id}"
39
+ filter = var.feedback_logs_filter
40
+
41
+ bigquery_options {
42
+ use_partitioned_tables = true
43
+ }
46
44
 
47
- log_sink_name = "${var.project_name}_telemetry"
48
- parent_resource_type = "project"
49
- parent_resource_id = each.value
50
- destination_uri = "bigquery.googleapis.com/projects/${each.value}/datasets/${google_bigquery_dataset.telemetry_logs_dataset[each.key].dataset_id}"
51
- filter = var.telemetry_logs_filter
52
- bigquery_options = { use_partitioned_tables = true }
53
45
  unique_writer_identity = true
54
- depends_on = [google_bigquery_dataset.telemetry_logs_dataset]
46
+ depends_on = [google_bigquery_dataset.feedback_dataset]
55
47
  }
56
48
 
57
- module "feedback_export_to_bigquery" {
49
+ resource "google_logging_project_sink" "log_export_to_bigquery" {
58
50
  for_each = local.deploy_project_ids
59
51
 
60
- source = "terraform-google-modules/log-export/google"
61
- version = "10.0.0"
62
- log_sink_name = "${var.project_name}_feedback"
63
- parent_resource_type = "project"
64
- parent_resource_id = each.value
65
- destination_uri = "bigquery.googleapis.com/projects/${each.value}/datasets/${google_bigquery_dataset.feedback_dataset[each.key].dataset_id}"
66
- filter = var.feedback_logs_filter
67
- bigquery_options = { use_partitioned_tables = true }
52
+ name = "${var.project_name}_telemetry"
53
+ project = each.value
54
+ destination = "bigquery.googleapis.com/projects/${each.value}/datasets/${google_bigquery_dataset.telemetry_logs_dataset[each.key].dataset_id}"
55
+ filter = var.telemetry_logs_filter
56
+
57
+ bigquery_options {
58
+ use_partitioned_tables = true
59
+ }
60
+
68
61
  unique_writer_identity = true
69
- depends_on = [google_bigquery_dataset.feedback_dataset]
62
+ depends_on = [google_bigquery_dataset.telemetry_logs_dataset]
63
+ }
64
+
65
+ resource "google_project_iam_member" "bigquery_data_editor" {
66
+ for_each = local.deploy_project_ids
67
+
68
+ project = each.value
69
+ role = "roles/bigquery.dataEditor"
70
+ member = google_logging_project_sink.log_export_to_bigquery[each.key].writer_identity
71
+ }
72
+
73
+ resource "google_project_iam_member" "feedback_bigquery_data_editor" {
74
+ for_each = local.deploy_project_ids
75
+
76
+ project = each.value
77
+ role = "roles/bigquery.dataEditor"
78
+ member = google_logging_project_sink.feedback_export_to_bigquery[each.key].writer_identity
70
79
  }
@@ -18,7 +18,7 @@ terraform {
18
18
  required_providers {
19
19
  google = {
20
20
  source = "hashicorp/google"
21
- version = "< 7.0.0"
21
+ version = "> 7.0.0"
22
22
  }
23
23
  github = {
24
24
  source = "integrations/github"
@@ -74,12 +74,13 @@ resource "google_cloudbuild_trigger" "cd_pipeline" {
74
74
  substitutions = {
75
75
  _STAGING_PROJECT_ID = var.staging_project_id
76
76
  _BUCKET_NAME_LOAD_TEST_RESULTS = resource.google_storage_bucket.bucket_load_test_results.name
77
+ _LOGS_BUCKET_NAME_STAGING = resource.google_storage_bucket.logs_data_bucket[var.staging_project_id].url
77
78
  _REGION = var.region
78
79
  {% if cookiecutter.deployment_target == 'cloud_run' %}
79
80
  _CONTAINER_NAME = var.project_name
80
81
  _ARTIFACT_REGISTRY_REPO_NAME = resource.google_artifact_registry_repository.repo-artifacts-genai.repository_id
81
82
  {% elif cookiecutter.deployment_target == 'agent_engine' %}
82
- _APP_SA_EMAIL_STAGING = resource.google_service_account.app_sa["staging"].email
83
+
83
84
  {% endif %}
84
85
  {% if cookiecutter.data_ingestion %}
85
86
  _PIPELINE_GCS_ROOT_STAGING = "gs://${resource.google_storage_bucket.data_ingestion_pipeline_gcs_root["staging"].name}"
@@ -123,12 +124,13 @@ resource "google_cloudbuild_trigger" "deploy_to_prod_pipeline" {
123
124
  }
124
125
  substitutions = {
125
126
  _PROD_PROJECT_ID = var.prod_project_id
127
+ _LOGS_BUCKET_NAME_PROD = resource.google_storage_bucket.logs_data_bucket[var.prod_project_id].url
126
128
  _REGION = var.region
127
129
  {% if cookiecutter.deployment_target == 'cloud_run' %}
128
130
  _CONTAINER_NAME = var.project_name
129
131
  _ARTIFACT_REGISTRY_REPO_NAME = resource.google_artifact_registry_repository.repo-artifacts-genai.repository_id
130
132
  {% elif cookiecutter.deployment_target == 'agent_engine' %}
131
- _APP_SA_EMAIL_PROD = resource.google_service_account.app_sa["prod"].email
133
+
132
134
  {% endif %}
133
135
  {% if cookiecutter.data_ingestion %}
134
136
  _PIPELINE_GCS_ROOT_PROD = "gs://${resource.google_storage_bucket.data_ingestion_pipeline_gcs_root["prod"].name}"
@@ -44,10 +44,10 @@ jobs:
44
44
  - name: Checkout code
45
45
  uses: actions/checkout@v4
46
46
 
47
- - name: Set up Python 3.11
47
+ - name: Set up Python 3.12
48
48
  uses: actions/setup-python@v4
49
49
  with:
50
- python-version: '3.11'
50
+ python-version: '3.12'
51
51
 
52
52
  - id: 'auth'
53
53
  name: 'Authenticate to Google Cloud'
@@ -111,7 +111,7 @@ jobs:
111
111
  uv run {{cookiecutter.agent_directory}}/agent_engine_app.py \
112
112
  --project {% raw %}${{ vars.PROD_PROJECT_ID }}{% endraw %} \
113
113
  --location {% raw %}${{ vars.REGION }}{% endraw %} \
114
- --service-account {% raw %}${{ vars.APP_SA_EMAIL_PROD }}{% endraw %} \
114
+ --artifacts-bucket-name {% raw %}${{ vars.LOGS_BUCKET_NAME_PROD }}{% endraw %} \
115
115
  --set-env-vars="COMMIT_SHA={% raw %}${{ github.sha }}{% endraw %}{%- if cookiecutter.data_ingestion %}{%- if cookiecutter.datastore_type == "vertex_ai_search" %},DATA_STORE_ID={% raw %}${{ vars.DATA_STORE_ID_PROD }}{% endraw %},DATA_STORE_REGION={% raw %}${{ vars.DATA_STORE_REGION }}{% endraw %}{%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %},VECTOR_SEARCH_INDEX={% raw %}${{ vars.VECTOR_SEARCH_INDEX_PROD }}{% endraw %},VECTOR_SEARCH_INDEX_ENDPOINT={% raw %}${{ vars.VECTOR_SEARCH_INDEX_ENDPOINT_PROD }}{% endraw %},VECTOR_SEARCH_BUCKET={% raw %}${{ vars.VECTOR_SEARCH_BUCKET_PROD }}{% endraw %}{%- endif %}{%- endif %}"
116
116
  {%- endif %}
117
117
 
@@ -48,10 +48,10 @@ jobs:
48
48
  project_id: {% raw %}${{ vars.CICD_PROJECT_ID }}{% endraw %}
49
49
 
50
50
 
51
- - name: Set up Python 3.11
51
+ - name: Set up Python 3.12
52
52
  uses: actions/setup-python@v4
53
53
  with:
54
- python-version: '3.11'
54
+ python-version: '3.12'
55
55
 
56
56
  - name: Install uv and dependencies
57
57
  run: |
@@ -36,10 +36,10 @@ jobs:
36
36
  - name: Checkout code
37
37
  uses: actions/checkout@v4
38
38
 
39
- - name: Set up Python 3.11
39
+ - name: Set up Python 3.12
40
40
  uses: actions/setup-python@v4
41
41
  with:
42
- python-version: '3.11'
42
+ python-version: '3.12'
43
43
 
44
44
  - id: 'auth'
45
45
  name: 'Authenticate to Google Cloud'
@@ -122,7 +122,7 @@ jobs:
122
122
  uv run {{cookiecutter.agent_directory}}/agent_engine_app.py \
123
123
  --project {% raw %}${{ vars.STAGING_PROJECT_ID }}{% endraw %} \
124
124
  --location {% raw %}${{ vars.REGION }}{% endraw %} \
125
- --service-account {% raw %}${{ vars.APP_SA_EMAIL_STAGING }}{% endraw %} \
125
+ --artifacts-bucket-name {% raw %}${{ vars.LOGS_BUCKET_NAME_STAGING }}{% endraw %} \
126
126
  --set-env-vars="COMMIT_SHA={% raw %}${{ github.sha }}{% endraw %}{%- if cookiecutter.data_ingestion %}{%- if cookiecutter.datastore_type == "vertex_ai_search" %},DATA_STORE_ID={% raw %}${{ vars.DATA_STORE_ID_STAGING }}{% endraw %},DATA_STORE_REGION={% raw %}${{ vars.DATA_STORE_REGION }}{% endraw %}{%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %},VECTOR_SEARCH_INDEX={% raw %}${{ vars.VECTOR_SEARCH_INDEX_STAGING }}{% endraw %},VECTOR_SEARCH_INDEX_ENDPOINT={% raw %}${{ vars.VECTOR_SEARCH_INDEX_ENDPOINT_STAGING }}{% endraw %},VECTOR_SEARCH_BUCKET={% raw %}${{ vars.VECTOR_SEARCH_BUCKET_STAGING }}{% endraw %}{%- endif %}{%- endif %}"
127
127
 
128
128
  - name: Fetch Auth Token
@@ -14,7 +14,7 @@
14
14
 
15
15
  steps:
16
16
  {%- if cookiecutter.data_ingestion %}
17
- - name: "python:3.11-slim"
17
+ - name: "python:3.12-slim"
18
18
  id: deploy-data-ingestion-pipeline-prod
19
19
  entrypoint: bash
20
20
  args:
@@ -57,7 +57,7 @@ steps:
57
57
  - $_PROD_PROJECT_ID
58
58
 
59
59
  {%- elif cookiecutter.deployment_target == 'agent_engine' %}
60
- - name: "python:3.11-slim"
60
+ - name: "python:3.12-slim"
61
61
  id: install-dependencies
62
62
  entrypoint: /bin/bash
63
63
  args:
@@ -67,7 +67,7 @@ steps:
67
67
  env:
68
68
  - 'PATH=/usr/local/bin:/usr/bin:~/.local/bin'
69
69
 
70
- - name: "python:3.11-slim"
70
+ - name: "python:3.12-slim"
71
71
  id: trigger-deployment
72
72
  entrypoint: /bin/bash
73
73
  args:
@@ -77,7 +77,7 @@ steps:
77
77
  uv run {{cookiecutter.agent_directory}}/agent_engine_app.py \
78
78
  --project ${_PROD_PROJECT_ID} \
79
79
  --location ${_REGION} \
80
- --service-account ${_APP_SA_EMAIL_PROD} \
80
+ --artifacts-bucket-name ${_LOGS_BUCKET_NAME_PROD} \
81
81
  --set-env-vars="COMMIT_SHA=${COMMIT_SHA}{%- if cookiecutter.data_ingestion %}{%- if cookiecutter.datastore_type == "vertex_ai_search" %},DATA_STORE_ID=${_DATA_STORE_ID_PROD},DATA_STORE_REGION=${_DATA_STORE_REGION}{%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %},VECTOR_SEARCH_INDEX=${_VECTOR_SEARCH_INDEX_PROD},VECTOR_SEARCH_INDEX_ENDPOINT=${_VECTOR_SEARCH_INDEX_ENDPOINT_PROD},VECTOR_SEARCH_BUCKET=${_VECTOR_SEARCH_BUCKET_PROD}{%- endif %}{%- endif %}"
82
82
  env:
83
83
  - 'PATH=/usr/local/bin:/usr/bin:~/.local/bin'
@@ -14,7 +14,7 @@
14
14
 
15
15
  steps:
16
16
  # Install uv package manager and sync dependencies
17
- - name: "python:3.11-slim"
17
+ - name: "python:3.12-slim"
18
18
  id: install-dependencies
19
19
  entrypoint: /bin/bash
20
20
  args:
@@ -25,7 +25,7 @@ steps:
25
25
  - 'PATH=/usr/local/bin:/usr/bin:~/.local/bin'
26
26
 
27
27
  # Run unit tests using pytest
28
- - name: "python:3.11-slim"
28
+ - name: "python:3.12-slim"
29
29
  id: unit-tests
30
30
  entrypoint: /bin/bash
31
31
  args:
@@ -36,7 +36,7 @@ steps:
36
36
  - 'PATH=/usr/local/bin:/usr/bin:~/.local/bin'
37
37
 
38
38
  # Run integration tests
39
- - name: "python:3.11-slim"
39
+ - name: "python:3.12-slim"
40
40
  id: integration-tests
41
41
  entrypoint: /bin/bash
42
42
  args:
@@ -14,7 +14,7 @@
14
14
 
15
15
  steps:
16
16
  {%- if cookiecutter.data_ingestion %}
17
- - name: "python:3.11-slim"
17
+ - name: "python:3.12-slim"
18
18
  id: deploy-data-ingestion-pipeline-staging
19
19
  entrypoint: bash
20
20
  args:
@@ -91,7 +91,7 @@ steps:
91
91
  - |
92
92
  echo $(gcloud auth print-identity-token -q) > id_token.txt
93
93
  {%- elif cookiecutter.deployment_target == 'agent_engine' %}
94
- - name: "python:3.11-slim"
94
+ - name: "python:3.12-slim"
95
95
  id: install-dependencies
96
96
  entrypoint: /bin/bash
97
97
  args:
@@ -101,7 +101,7 @@ steps:
101
101
  env:
102
102
  - 'PATH=/usr/local/bin:/usr/bin:~/.local/bin'
103
103
 
104
- - name: "python:3.11-slim"
104
+ - name: "python:3.12-slim"
105
105
  id: deploy-staging
106
106
  entrypoint: /bin/bash
107
107
  args:
@@ -111,7 +111,7 @@ steps:
111
111
  uv run {{cookiecutter.agent_directory}}/agent_engine_app.py \
112
112
  --project ${_STAGING_PROJECT_ID} \
113
113
  --location ${_REGION} \
114
- --service-account ${_APP_SA_EMAIL_STAGING} \
114
+ --artifacts-bucket-name ${_LOGS_BUCKET_NAME_STAGING} \
115
115
  --set-env-vars="COMMIT_SHA=${COMMIT_SHA}{%- if cookiecutter.data_ingestion %}{%- if cookiecutter.datastore_type == "vertex_ai_search" %},DATA_STORE_ID=${_DATA_STORE_ID_STAGING},DATA_STORE_REGION=${_DATA_STORE_REGION}{%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %},VECTOR_SEARCH_INDEX=${_VECTOR_SEARCH_INDEX_STAGING},VECTOR_SEARCH_INDEX_ENDPOINT=${_VECTOR_SEARCH_INDEX_ENDPOINT_STAGING},VECTOR_SEARCH_BUCKET=${_VECTOR_SEARCH_BUCKET_STAGING}{%- endif %}{%- endif %}"
116
116
  env:
117
117
  - 'PATH=/usr/local/bin:/usr/bin:~/.local/bin'
@@ -167,7 +167,7 @@ steps:
167
167
  # Exit with load test result to fail build if tests failed
168
168
  exit $$_LOAD_TEST_EXIT_CODE
169
169
  {%- elif cookiecutter.deployment_target == 'cloud_run' %}
170
- - name: "python:3.11-slim"
170
+ - name: "python:3.12-slim"
171
171
  id: load_test
172
172
  entrypoint: /bin/bash
173
173
  args:
@@ -185,7 +185,7 @@ steps:
185
185
  env:
186
186
  - 'PATH=/usr/local/bin:/usr/bin:~/.local/bin'
187
187
  {%- elif cookiecutter.deployment_target == 'agent_engine' and cookiecutter.is_adk_live %}
188
- - name: "python:3.11-slim"
188
+ - name: "python:3.12-slim"
189
189
  id: load_test
190
190
  entrypoint: /bin/bash
191
191
  args:
@@ -218,7 +218,7 @@ steps:
218
218
  env:
219
219
  - 'PATH=/usr/local/bin:/usr/bin:~/.local/bin'
220
220
  {%- elif cookiecutter.deployment_target == 'agent_engine' %}
221
- - name: "python:3.11-slim"
221
+ - name: "python:3.12-slim"
222
222
  id: load_test
223
223
  entrypoint: /bin/bash
224
224
  args:
@@ -24,7 +24,7 @@ import backoff
24
24
  import click
25
25
  from rich.console import Console
26
26
 
27
- from src.cli.utils.cicd import (
27
+ from agent_starter_pack.cli.utils.cicd import (
28
28
  ProjectConfig,
29
29
  create_github_connection,
30
30
  handle_github_authentication,
@@ -49,8 +49,8 @@ def print_version(ctx: click.Context, param: click.Parameter, value: bool) -> No
49
49
  help="Show the version and exit.",
50
50
  )
51
51
  def cli() -> None:
52
- # Check for updates at startup (skip if --agent-garden or -ag is used)
53
- if "--agent-garden" not in sys.argv and "-ag" not in sys.argv:
52
+ # Check for updates at startup (skip if --agent-garden, -ag, or --locked is used)
53
+ if not any(flag in sys.argv for flag in ("--agent-garden", "-ag", "--locked")):
54
54
  display_update_message()
55
55
 
56
56
 
@@ -34,7 +34,7 @@ from google.cloud.aiplatform_v1beta1.types.prediction_service import (
34
34
  from rich.console import Console
35
35
  from rich.prompt import Confirm
36
36
 
37
- from src.cli.utils.version import PACKAGE_NAME, get_current_version
37
+ from agent_starter_pack.cli.utils.version import PACKAGE_NAME, get_current_version
38
38
 
39
39
  console = Console()
40
40
 
@@ -167,15 +167,18 @@ def check_and_execute_with_version_lock(
167
167
 
168
168
  # Add version lock specific parameters and handle remote URL replacement
169
169
  if original_agent_spec:
170
- # Replace remote agent spec with local path
171
- modified_args = []
172
- for arg in original_args:
173
- if arg == original_agent_spec:
174
- # Replace remote URL with local template directory
175
- modified_args.append(f"local@{template_dir}")
176
- else:
177
- modified_args.append(arg)
178
- original_args = modified_args
170
+ # Check if --agent flag exists in original args
171
+ agent_flag_exists = "--agent" in original_args or "-a" in original_args
172
+
173
+ if agent_flag_exists:
174
+ # Replace remote agent spec with local path
175
+ original_args = [
176
+ f"local@{template_dir}" if arg == original_agent_spec else arg
177
+ for arg in original_args
178
+ ]
179
+ else:
180
+ # Agent was selected interactively, add --agent flag
181
+ original_args.extend(["--agent", f"local@{template_dir}"])
179
182
 
180
183
  # Add version lock flags only for ASP versions 0.14.1 and above
181
184
  if pkg_version.parse(version) > pkg_version.parse("0.14.1"):
@@ -26,7 +26,7 @@ from cookiecutter.main import cookiecutter
26
26
  from rich.console import Console
27
27
  from rich.prompt import IntPrompt, Prompt
28
28
 
29
- from src.cli.utils.version import get_current_version
29
+ from agent_starter_pack.cli.utils.version import get_current_version
30
30
 
31
31
  from .datastores import DATASTORES
32
32
  from .remote_template import (
@@ -100,7 +100,7 @@ def get_overwrite_folders(agent_directory: str) -> list[str]:
100
100
 
101
101
  TEMPLATE_CONFIG_FILE = "templateconfig.yaml"
102
102
  DEPLOYMENT_FOLDERS = ["cloud_run", "agent_engine"]
103
- DEFAULT_FRONTEND = "streamlit"
103
+ DEFAULT_FRONTEND = "None"
104
104
 
105
105
 
106
106
  def get_available_agents(deployment_target: str | None = None) -> dict:
@@ -119,7 +119,7 @@ def get_available_agents(deployment_target: str | None = None) -> dict:
119
119
 
120
120
  agents_list = []
121
121
  priority_agents_dict = dict.fromkeys(PRIORITY_AGENTS) # Track priority agents
122
- agents_dir = pathlib.Path(__file__).parent.parent.parent.parent / "agents"
122
+ agents_dir = pathlib.Path(__file__).parent.parent.parent / "agents"
123
123
 
124
124
  for agent_dir in agents_dir.iterdir():
125
125
  if agent_dir.is_dir() and not agent_dir.name.startswith("__"):
@@ -191,7 +191,7 @@ def get_deployment_targets(
191
191
  config = remote_config
192
192
  else:
193
193
  template_path = (
194
- pathlib.Path(__file__).parent.parent.parent.parent
194
+ pathlib.Path(__file__).parent.parent.parent
195
195
  / "agents"
196
196
  / agent_name
197
197
  / ".template"
@@ -309,7 +309,7 @@ def prompt_datastore_selection(
309
309
 
310
310
  # Otherwise, proceed with normal flow
311
311
  template_path = (
312
- pathlib.Path(__file__).parent.parent.parent.parent
312
+ pathlib.Path(__file__).parent.parent.parent
313
313
  / "agents"
314
314
  / agent_name
315
315
  / ".template"
@@ -418,7 +418,7 @@ def prompt_cicd_runner_selection() -> str:
418
418
 
419
419
  def get_template_path(agent_name: str, debug: bool = False) -> pathlib.Path:
420
420
  """Get the absolute path to the agent template directory."""
421
- current_dir = pathlib.Path(__file__).parent.parent.parent.parent
421
+ current_dir = pathlib.Path(__file__).parent.parent.parent
422
422
  template_path = current_dir / "agents" / agent_name / ".template"
423
423
  if debug:
424
424
  logging.debug(f"Looking for template in: {template_path}")
@@ -526,9 +526,7 @@ def process_template(
526
526
  # For remote templates, determine the base template
527
527
  base_template_name = get_base_template_name(remote_config or {})
528
528
  agent_path = (
529
- pathlib.Path(__file__).parent.parent.parent.parent
530
- / "agents"
531
- / base_template_name
529
+ pathlib.Path(__file__).parent.parent.parent / "agents" / base_template_name
532
530
  )
533
531
  logging.debug(f"Remote template using base: {base_template_name}")
534
532
  else:
@@ -1076,8 +1074,7 @@ def process_template(
1076
1074
  elif deployment_target:
1077
1075
  # For local templates, use the existing logic
1078
1076
  lock_path = (
1079
- pathlib.Path(__file__).parent.parent.parent.parent
1080
- / "src"
1077
+ pathlib.Path(__file__).parent.parent.parent
1081
1078
  / "resources"
1082
1079
  / "locks"
1083
1080
  / f"uv-{agent_name}-{deployment_target}.lock"
@@ -1185,14 +1182,11 @@ def copy_files(
1185
1182
 
1186
1183
  def copy_frontend_files(frontend_type: str, project_template: pathlib.Path) -> None:
1187
1184
  """Copy files from the specified frontend folder directly to project root."""
1188
- # Skip copying if frontend_type is "None"
1189
- if frontend_type == "None":
1190
- logging.debug("Frontend type is 'None', skipping frontend files")
1185
+ # Skip copying if frontend_type is "None" or empty
1186
+ if not frontend_type or frontend_type == "None":
1187
+ logging.debug("Frontend type is 'None' or empty, skipping frontend files")
1191
1188
  return
1192
1189
 
1193
- # Use default frontend if none specified
1194
- frontend_type = frontend_type or DEFAULT_FRONTEND
1195
-
1196
1190
  # Get the frontends directory path
1197
1191
  frontends_path = (
1198
1192
  pathlib.Path(__file__).parent.parent.parent / "frontends" / frontend_type
@@ -1204,9 +1198,12 @@ def copy_frontend_files(frontend_type: str, project_template: pathlib.Path) -> N
1204
1198
  copy_files(frontends_path, project_template, overwrite=True)
1205
1199
  else:
1206
1200
  logging.warning(f"Frontend type directory not found: {frontends_path}")
1207
- if frontend_type != DEFAULT_FRONTEND:
1201
+ # Don't fall back to default if it's "None" - just skip
1202
+ if DEFAULT_FRONTEND != "None":
1208
1203
  logging.info(f"Falling back to default frontend: {DEFAULT_FRONTEND}")
1209
1204
  copy_frontend_files(DEFAULT_FRONTEND, project_template)
1205
+ else:
1206
+ logging.debug("No default frontend configured, skipping frontend files")
1210
1207
 
1211
1208
 
1212
1209
  def copy_deployment_files(