agent-starter-pack 0.8.0__py3-none-any.whl → 0.9.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/METADATA +3 -2
  2. {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/RECORD +30 -28
  3. agents/adk_base/{template/.templateconfig.yaml → .template/templateconfig.yaml} +1 -1
  4. agents/adk_gemini_fullstack/{template/.templateconfig.yaml → .template/templateconfig.yaml} +2 -2
  5. agents/agentic_rag/{template/.templateconfig.yaml → .template/templateconfig.yaml} +1 -1
  6. src/base_template/Makefile +5 -1
  7. src/base_template/pyproject.toml +2 -2
  8. src/cli/commands/create.py +155 -43
  9. src/cli/commands/list.py +158 -0
  10. src/cli/main.py +2 -0
  11. src/cli/utils/remote_template.py +254 -0
  12. src/cli/utils/template.py +100 -25
  13. src/resources/locks/uv-adk_base-agent_engine.lock +151 -119
  14. src/resources/locks/uv-adk_base-cloud_run.lock +181 -146
  15. src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock +151 -119
  16. src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock +181 -146
  17. src/resources/locks/uv-agentic_rag-agent_engine.lock +154 -122
  18. src/resources/locks/uv-agentic_rag-cloud_run.lock +184 -149
  19. src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +130 -130
  20. src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +160 -160
  21. src/resources/locks/uv-langgraph_base_react-agent_engine.lock +109 -109
  22. src/resources/locks/uv-langgraph_base_react-cloud_run.lock +139 -139
  23. src/resources/locks/uv-live_api-cloud_run.lock +136 -136
  24. src/utils/lock_utils.py +1 -1
  25. {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/WHEEL +0 -0
  26. {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/entry_points.txt +0 -0
  27. {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/licenses/LICENSE +0 -0
  28. /agents/crewai_coding_crew/{template/.templateconfig.yaml → .template/templateconfig.yaml} +0 -0
  29. /agents/langgraph_base_react/{template/.templateconfig.yaml → .template/templateconfig.yaml} +0 -0
  30. /agents/live_api/{template/.templateconfig.yaml → .template/templateconfig.yaml} +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-starter-pack
3
- Version: 0.8.0
3
+ Version: 0.9.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
@@ -103,7 +103,8 @@ Looking to explore more ADK examples? Check out the [ADK Samples Repository](htt
103
103
  The `agent-starter-pack` offers two key features to accelerate and simplify the development of your agent:
104
104
  - **🔄 [CI/CD Automation (Experimental)](https://googlecloudplatform.github.io/agent-starter-pack/cli/setup_cicd)** - One command to set up a complete GitHub + Cloud Build pipeline for all environments
105
105
  - **📥 [Data Pipeline for RAG with Terraform/CI-CD](https://googlecloudplatform.github.io/agent-starter-pack/guide/data-ingestion)** - Seamlessly integrate a data pipeline to process embeddings for RAG into your agent system. Supporting [Vertex AI Search](https://cloud.google.com/generative-ai-app-builder/docs/enterprise-search-introduction) and [Vector Search](https://cloud.google.com/vertex-ai/docs/vector-search/overview).
106
- * **🤖 Gemini CLI Integration** - Use the [Gemini CLI](https://github.com/google-gemini/gemini-cli) and the included `GEMINI.md` context file to ask questions about your template, agent architecture, and the path to production. Get instant guidance and code examples directly in your terminal.
106
+ - **[Remote Templates](docs/guide/remote-templating.md)**: Create and share your own agent starter packs templates from any Git repository.
107
+ - **🤖 Gemini CLI Integration** - Use the [Gemini CLI](https://github.com/google-gemini/gemini-cli) and the included `GEMINI.md` context file to ask questions about your template, agent architecture, and the path to production. Get instant guidance and code examples directly in your terminal.
107
108
 
108
109
  ## High-Level Architecture
109
110
 
@@ -1,52 +1,52 @@
1
1
  agents/README.md,sha256=L8__lIXXjxLTZbkCmTC4taTFUMRVrO3QI2mCKZTdhJM,462
2
2
  agents/adk_base/README.md,sha256=eLf-F9Z4u_mQOchAnUaSrOAHXRSx8wUQN29kkwz1SF4,894
3
+ agents/adk_base/.template/templateconfig.yaml,sha256=CUhOW807Ap2XDk3ZRK-OWP4-tD5fUUr8Nvv4yrOfjJk,923
3
4
  agents/adk_base/app/agent.py,sha256=6Q6QegQDxEaAck989DPIb3ArHMZtw_YJBqhHFqg-UjQ,2182
4
5
  agents/adk_base/notebooks/adk_app_testing.ipynb,sha256=wgFzBo7hX393NVzy3ZfZHncs1ptiQbM_8he3XxJu4yM,9763
5
6
  agents/adk_base/notebooks/evaluating_adk_agent.ipynb,sha256=OMTiT3gAFWPvE9pPL8z7tsDwOU-l8wem5wH-OXPPlvk,56805
6
- agents/adk_base/template/.templateconfig.yaml,sha256=VsyR_CmcOhFA3cLYiq-vLlvAxfM468hGGseIqWHKe-E,923
7
7
  agents/adk_base/tests/integration/test_agent.py,sha256=VypgpEWrQegJBgc58V-BlIsbqh-Hii-hwmkwcz5feFw,1969
8
8
  agents/adk_gemini_fullstack/README.md,sha256=yQFFcESALj5Q6eweyIyPx__U74obUM88aCBJYNV2UWs,1674
9
+ agents/adk_gemini_fullstack/.template/templateconfig.yaml,sha256=gU0EeLdr2INQDZKeypofUoZw-lcwq3qV6E8AVeowTQg,1716
9
10
  agents/adk_gemini_fullstack/app/agent.py,sha256=NXOkYFxDccJaSq55CTS-UYY8z5-WgBZqexII0Ybzk9c,22662
10
11
  agents/adk_gemini_fullstack/app/config.py,sha256=x--axECPKWW3oLANKz2_4zzHEBIU7if8iYNZRjlTNV0,1563
11
12
  agents/adk_gemini_fullstack/notebooks/adk_app_testing.ipynb,sha256=wgFzBo7hX393NVzy3ZfZHncs1ptiQbM_8he3XxJu4yM,9763
12
13
  agents/adk_gemini_fullstack/notebooks/evaluating_adk_agent.ipynb,sha256=OMTiT3gAFWPvE9pPL8z7tsDwOU-l8wem5wH-OXPPlvk,56805
13
- agents/adk_gemini_fullstack/template/.templateconfig.yaml,sha256=MjLSQvi1Uq2No_pA9VfmiJfcTmJhRev3z8ByjLfcP6I,1683
14
14
  agents/adk_gemini_fullstack/tests/integration/test_agent.py,sha256=VypgpEWrQegJBgc58V-BlIsbqh-Hii-hwmkwcz5feFw,1969
15
15
  agents/agentic_rag/README.md,sha256=mxMLkq6tAghFaDmc2sc2sEQ5vn9kGWdiRxfTykwpLz0,2268
16
+ agents/agentic_rag/.template/templateconfig.yaml,sha256=VC0Ss-QmLjROtSy3Dx_BSDV5xSgvr-yI1doBkKXBjc4,1248
16
17
  agents/agentic_rag/app/agent.py,sha256=tKtzez7vGu6JgMWmZN7QrKkyLBvHu1ondAuICjKoC-g,3983
17
18
  agents/agentic_rag/app/retrievers.py,sha256=qfxwSEixMddvAu4FvUTZAFh1Gdp3RPY65s0Wp6gEFVk,4561
18
19
  agents/agentic_rag/app/templates.py,sha256=8N_uRchwiN7hlH9Y8rdJ1CAtOhpHUWZkXZZ7IU-YJJk,867
19
20
  agents/agentic_rag/notebooks/adk_app_testing.ipynb,sha256=wgFzBo7hX393NVzy3ZfZHncs1ptiQbM_8he3XxJu4yM,9763
20
21
  agents/agentic_rag/notebooks/evaluating_adk_agent.ipynb,sha256=OMTiT3gAFWPvE9pPL8z7tsDwOU-l8wem5wH-OXPPlvk,56805
21
- agents/agentic_rag/template/.templateconfig.yaml,sha256=PMb7H913ZxGOhGzt4RPc2-QyzrOrycboh0ZZIHyk8Wg,1248
22
22
  agents/agentic_rag/tests/integration/test_agent.py,sha256=mxsKFyZrwXzIvAoxlqZv2JndM3VTVTKcugRYdF3APr4,2112
23
23
  agents/crewai_coding_crew/README.md,sha256=4No7sfHQVHELARGiT3fWANJzDR0NP48ow4ct3FoPwlA,1672
24
+ agents/crewai_coding_crew/.template/templateconfig.yaml,sha256=q2KH2Hkq7MkGkVup9pIj2E3tosy7paQW2WiEHA2Qw_Y,1051
24
25
  agents/crewai_coding_crew/app/agent.py,sha256=yd-P2Jzx3Do4FQuhwDsok-YRNYFi9Vl8OTqSlbdn4Sw,3260
25
26
  agents/crewai_coding_crew/app/crew/crew.py,sha256=pqeeJ4txP-gcVT3PKEAw2zZ4x8g4cDlnFFbf0_zZRr4,2000
26
27
  agents/crewai_coding_crew/app/crew/config/agents.yaml,sha256=Cn9zTcP3C-8MvlV19cYdlxR0iIs2_FOy2gKOJLUpNRo,1154
27
28
  agents/crewai_coding_crew/app/crew/config/tasks.yaml,sha256=SSFuiSQPhi4dM0V5HdNuMqtN7JJr5RUCMhhBzUkPBpc,1511
28
29
  agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb,sha256=ifTn4RfrJeYQ8ell9n6VE65ZEfcnKGkMLFG8RBlPK70,57974
29
30
  agents/crewai_coding_crew/notebooks/evaluating_langgraph_agent.ipynb,sha256=PlW41fL-ji9NKkimW6u25YRLGWN2pgoX2G8w5nzIEPE,58737
30
- agents/crewai_coding_crew/template/.templateconfig.yaml,sha256=q2KH2Hkq7MkGkVup9pIj2E3tosy7paQW2WiEHA2Qw_Y,1051
31
31
  agents/crewai_coding_crew/tests/integration/test_agent.py,sha256=0uvfmM3FSdESIU7ICb2oqABsQqylQU2PE3UBwbpif-A,1629
32
32
  agents/langgraph_base_react/README.md,sha256=KZQ0e8q9CqnIEiItH9Tc2Ceb2mC3sBcyQUo-ZAmO-zs,482
33
+ agents/langgraph_base_react/.template/templateconfig.yaml,sha256=jHh3WDNT70KMbA2zy3Da_J_jIWeGfeiqIKfUs5B8OBk,1049
33
34
  agents/langgraph_base_react/app/agent.py,sha256=yzCc5JaOJgItoBiZOzHPiSy9aD2HGeGI_pH7nrysSmg,2505
34
35
  agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb,sha256=PlW41fL-ji9NKkimW6u25YRLGWN2pgoX2G8w5nzIEPE,58737
35
- agents/langgraph_base_react/template/.templateconfig.yaml,sha256=jHh3WDNT70KMbA2zy3Da_J_jIWeGfeiqIKfUs5B8OBk,1049
36
36
  agents/langgraph_base_react/tests/integration/test_agent.py,sha256=wg2Y8V4l7dh7rhWy7Z8zioDW5ILRsz7RZJ-mz0AhK3U,1619
37
37
  agents/live_api/README.md,sha256=c3lu5WguOUBc5hO_UtNZfVhfYxvSzMXuGFICn9M38mU,2897
38
+ agents/live_api/.template/templateconfig.yaml,sha256=DD_hihMsuqmd5VWS18vVGZ3ZGVVpFWVXJ2dU07eKb6k,964
38
39
  agents/live_api/app/agent.py,sha256=dYE2qd64OhL-fOgwzrjqN50LYXAgJ1TWbx6ohqtV5Rc,2434
39
40
  agents/live_api/app/server.py,sha256=ZXriNDl_zo7WDRBke85lyzMsy66qGzPaRXY1FMy4Fdw,7793
40
- agents/live_api/template/.templateconfig.yaml,sha256=DD_hihMsuqmd5VWS18vVGZ3ZGVVpFWVXJ2dU07eKb6k,964
41
41
  agents/live_api/tests/integration/test_server_e2e.py,sha256=D2VETDIyTD2fQyQ6DXwLr-POSYyVzzzcpIFLt5Ppyx4,8398
42
42
  agents/live_api/tests/load_test/load_test.py,sha256=HHZyfC4gqiQtZVF_CbbxENGgWQccMLpwMv0IdoQ6cbQ,1275
43
43
  agents/live_api/tests/unit/test_server.py,sha256=_TjlgQgNkjerIaBGnu8P8_KB8ZlSolDcivALpUOn_Rw,4786
44
44
  llm.txt,sha256=DZaO2YqDmvigYzqIvMsNPYilmbNqZfJL9hTicZHpvZc,13561
45
45
  src/base_template/.gitignore,sha256=Fq0w34x4sfbwP4RqDqh6hdHNYRUEsFNI-9XONzLWBIs,2580
46
46
  src/base_template/GEMINI.md,sha256=WzscHWlQeYkKORZ-453P8KM9IHuj1kAxW-69c7Ytuwk,133
47
- src/base_template/Makefile,sha256=037wvhexHIZyWW451D4vkvNnldTznxDFZ0sleUvl8jU,6115
47
+ src/base_template/Makefile,sha256=MEsMvBosWrSVgUPRucTjsxYovl41rQc3d8Vw8dxdPoA,6128
48
48
  src/base_template/README.md,sha256=xAz5JXSnhCjXtvw5wSl6AVn6DJBlQIhSl4exyO5N4nc,10929
49
- src/base_template/pyproject.toml,sha256=ltiZufJ8BFbsRoWs2EcldWLzFd41du1YdAhldecwUfw,2874
49
+ src/base_template/pyproject.toml,sha256=TEu9_gZT9tRuV6x8CcVIpC4Lcetbr0mHMPcJAab0aq4,2874
50
50
  src/base_template/app/__init__.py,sha256=UyAgc2l8nkVIUPUzL9hKR7EgzCsc2jSYcOcjHNNmpMU,59
51
51
  src/base_template/app/utils/gcs.py,sha256=jKblaWOGQEigw3esaawcfX178shhZi2Fyk0fJSA4T68,1501
52
52
  src/base_template/app/utils/tracing.py,sha256=2rv1Ukh2jTBENDwoghCItJ28l-Sjz9gMlzdojlVgJa4,6052
@@ -73,15 +73,17 @@ src/base_template/deployment/terraform/dev/variables.tf,sha256=7uQeqzN6IR14h1iTh
73
73
  src/base_template/deployment/terraform/dev/vars/env.tfvars,sha256=LoQMjh1AAMR-MGfaSCsVMjdoYTk2T4oS4D9vMH54CdQ,714
74
74
  src/base_template/deployment/terraform/vars/env.tfvars,sha256=Nze8q1x2Aj6ZUeWC2hDeZWqNUkLp13DgzA_LFmmOzCo,1216
75
75
  src/base_template/tests/unit/test_dummy.py,sha256=2exfCH8qhkZrLWvK04ZxNTO9MV3fdTbZkJN3uK6zvok,850
76
- src/cli/main.py,sha256=pMsSlNwkrFqHUHHA5U-WMZ4QRquaI_F7OXQt6yxuugE,1688
77
- src/cli/commands/create.py,sha256=PRqIu4fxgN3KCpzbiMC0jcghpsgt1LatShfvs2qP2xw,26396
76
+ src/cli/main.py,sha256=fyJKjU1gvRQmuqS-J6sExvqXo0-z7n6Bce8PSbDPa6E,1769
77
+ src/cli/commands/create.py,sha256=yIHngbbeUBvLKWg6IkH87yFwf-IJqdzbebkdqpwEFRQ,31818
78
+ src/cli/commands/list.py,sha256=50sxEcYY5T4Q34Uj7J5h8A9Tq5Zw8GQhkqunBdzzD0U,5288
78
79
  src/cli/commands/setup_cicd.py,sha256=1ZvgTD-Z2bZk6pWuinz4IP2G1Eb8H1MibRLPS-mZ6Ng,31721
79
80
  src/cli/utils/__init__.py,sha256=_cTmsXGPqOtK0q8UW5164QTltbJRJFR_Efxq_BRL1-o,1311
80
81
  src/cli/utils/cicd.py,sha256=VSkJTL7OBnXQ6Zbb2gzgw5gLWpwUjfr9XthqTpJ2Oj8,26197
81
82
  src/cli/utils/datastores.py,sha256=gv1V6eDcOEKx4MRNG5C3Y-VfixYq1AzQuaYMLp8QRNo,1058
82
83
  src/cli/utils/gcp.py,sha256=cnuCyN144eiyYc9aJNEK9JnyWN66rdevugoMdDYC1UU,4032
83
84
  src/cli/utils/logging.py,sha256=0lHe4EPi1A8sOx9xkA7gS4UNl0GsIyp2ahydkkuCzLY,1570
84
- src/cli/utils/template.py,sha256=VYg59SwfgYmvcq09mD7xz-wTj2LodPBH2bjlEesu8ag,30482
85
+ src/cli/utils/remote_template.py,sha256=LA2gAo1i_PCMMB6gqWPOH-WWR8MFyr9CrK9_-f1jVIY,7895
86
+ src/cli/utils/template.py,sha256=GpUWMQ7hfO5nkACRQ3_aFbn5yT2MjO58nr9Hs0Fp8kM,33700
85
87
  src/cli/utils/version.py,sha256=F4udQmzniPStqWZFIgnv3Qg3l9non4mfy2An-Oveqmc,2916
86
88
  src/data_ingestion/README.md,sha256=LNxSQoJW9JozK-TbyGQLj5L_MGWNwrfLk6V6RmQ2oBQ,4032
87
89
  src/data_ingestion/pyproject.toml,sha256=-1Mf2QB8K70ICQV5UPZDpf-fN3UwEQLVzQyxfakCSTY,445
@@ -182,25 +184,25 @@ src/resources/docs/adk-cheatsheet.md,sha256=KTCdM7hOvsv1-GgwEBMMU6kLk3WHQ69RAs6V
182
184
  src/resources/idx/idx-template.json,sha256=07OQZCPp45Iqor2O7Tm1e1Gmsdd-AmmUofSvA7y-oRs,793
183
185
  src/resources/idx/idx-template.nix,sha256=sesHGev_PYtVDg0J5tHkg0OO7IR1Bz2iAtl_if3Ar3M,892
184
186
  src/resources/idx/.idx/dev.nix,sha256=XQ4T1xt5I-8SVwnI37v56RFFlxa58Ko-a9G2-oelYAI,1602
185
- src/resources/locks/uv-adk_base-agent_engine.lock,sha256=At7JUJjTZ7fqapE-yTv6KOnZnmEUFfggc6fR670088M,477091
186
- src/resources/locks/uv-adk_base-cloud_run.lock,sha256=y9E2KvWDophBoEb3VOlD08g45Xzz91iOfW4kUotKJFM,630449
187
- src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock,sha256=At7JUJjTZ7fqapE-yTv6KOnZnmEUFfggc6fR670088M,477091
188
- src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock,sha256=y9E2KvWDophBoEb3VOlD08g45Xzz91iOfW4kUotKJFM,630449
189
- src/resources/locks/uv-agentic_rag-agent_engine.lock,sha256=BuOCpKLD7hZMAAcoUEn52-q5ZjgfRXjtkgGwa9oFrcw,535028
190
- src/resources/locks/uv-agentic_rag-cloud_run.lock,sha256=cgWp0MrqkagHZlJpzrl_BR2qXy6LH6R5zat88wY_QqY,708082
191
- src/resources/locks/uv-crewai_coding_crew-agent_engine.lock,sha256=sjCgdsjhHLT_BymEjHF4e12ptEilMqEgOzK2WifutnQ,813067
192
- src/resources/locks/uv-crewai_coding_crew-cloud_run.lock,sha256=I7UZ6TRKwBQhQu9gZ7PiNZf0fiu0XeFT6LQ000X2hdw,1060937
193
- src/resources/locks/uv-langgraph_base_react-agent_engine.lock,sha256=2LK-b_sXcECpCOyB8c8Hg_Tn-oWoPywTjoXtPIkofAo,681742
194
- src/resources/locks/uv-langgraph_base_react-cloud_run.lock,sha256=890djdH1xysQjvyNYsR2e-gBMqIvY1sSd1nGrIdrwKs,899376
195
- src/resources/locks/uv-live_api-cloud_run.lock,sha256=pzzQFnkozda6LCKiWgaw933YaQT0nlV8R2RLLnQ4aAI,822935
187
+ src/resources/locks/uv-adk_base-agent_engine.lock,sha256=hK9YQfIRT6kfSlFUBrhUEXeXZ3IS2muNV8T3lkihQAY,483186
188
+ src/resources/locks/uv-adk_base-cloud_run.lock,sha256=6t7zeqDFtMyPFrIiF6Xo1p4POyyYEnc6pyUtkHzf2EA,637362
189
+ src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock,sha256=hK9YQfIRT6kfSlFUBrhUEXeXZ3IS2muNV8T3lkihQAY,483186
190
+ src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock,sha256=6t7zeqDFtMyPFrIiF6Xo1p4POyyYEnc6pyUtkHzf2EA,637362
191
+ src/resources/locks/uv-agentic_rag-agent_engine.lock,sha256=1eA8gC_Y42ooUbJ4JxAG5n2cbHHKUBZe6D4FItc_Mvg,541123
192
+ src/resources/locks/uv-agentic_rag-cloud_run.lock,sha256=j8vpv7fa0ndEPYKzG71vkwZmHQ8f5AdtTqb2WwlgzXc,714995
193
+ src/resources/locks/uv-crewai_coding_crew-agent_engine.lock,sha256=EagJM13n7X8vqcE3HO7rF-Z2jMEobFlWPZjOqEEW_Fo,813064
194
+ src/resources/locks/uv-crewai_coding_crew-cloud_run.lock,sha256=WzCE7940FbtzjVnpy5vPe4Mp7JA9nQvE2ROuWmhEHzc,1060934
195
+ src/resources/locks/uv-langgraph_base_react-agent_engine.lock,sha256=b9wpOgH6uqdFTDfCxxfN1dVCH1ZFb_SJhhZh51fkxBE,681721
196
+ src/resources/locks/uv-langgraph_base_react-cloud_run.lock,sha256=zmX9dyHsaOt62LoItbhn1h7BiyGqdk-07Mbf8GEvxU0,899355
197
+ src/resources/locks/uv-live_api-cloud_run.lock,sha256=JsTYkungSDMWm756YxXmHXJ2LNO9dhS8DEBTJTuIquk,822914
196
198
  src/resources/setup_cicd/cicd_variables.tf,sha256=PMflYe1TzQi63LORHkmeCktTYzXFplJgxffNH4DtuAQ,1244
197
199
  src/resources/setup_cicd/github.tf,sha256=V2XZ7bKdJ9fzibsjIrI-loHQ1eQbfjNWVPLDPIAUeTA,2807
198
200
  src/resources/setup_cicd/providers.tf,sha256=Km4z6IJt7x7PLaa0kyZbBrO2m3lpuIJZFD5jB7QBfF0,1122
199
201
  src/utils/generate_locks.py,sha256=6V1B8V2BEuevWnXUsxZVTrLjXwFRII8UfsIGrQqZxVs,4320
200
- src/utils/lock_utils.py,sha256=RSE6n3hBkH64xNm3Q5wrR0Pqbeo-oc7xaTOhA9yzHjk,2275
202
+ src/utils/lock_utils.py,sha256=IFOMUWtb-ypm2Y8w8J5y2oI_-MaPuwPF_JOAAlnNudA,2275
201
203
  src/utils/watch_and_rebuild.py,sha256=vP4yIiA7E_lj5sfQdJUl8TXas6V7msDg8XWUutAC05Q,6679
202
- agent_starter_pack-0.8.0.dist-info/METADATA,sha256=nCOvlOlpJzDrhmFh5PCLWyEAso0H8t0s3NkR-l4uSeM,11146
203
- agent_starter_pack-0.8.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
204
- agent_starter_pack-0.8.0.dist-info/entry_points.txt,sha256=U7uCxR7YulIhZ0L8R8Hui0Bsy6J7oyESBeDYJYMrQjA,56
205
- agent_starter_pack-0.8.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
206
- agent_starter_pack-0.8.0.dist-info/RECORD,,
204
+ agent_starter_pack-0.9.0.dist-info/METADATA,sha256=tm8hhXSmxExEPbCj30Q1GlG9U0W5xiLP84JTavvezJI,11286
205
+ agent_starter_pack-0.9.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
206
+ agent_starter_pack-0.9.0.dist-info/entry_points.txt,sha256=U7uCxR7YulIhZ0L8R8Hui0Bsy6J7oyESBeDYJYMrQjA,56
207
+ agent_starter_pack-0.9.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
208
+ agent_starter_pack-0.9.0.dist-info/RECORD,,
@@ -18,7 +18,7 @@ settings:
18
18
  requires_data_ingestion: false
19
19
  requires_session: true
20
20
  deployment_targets: ["agent_engine", "cloud_run"]
21
- extra_dependencies: ["google-adk~=1.5.0"]
21
+ extra_dependencies: ["google-adk~=1.6.0"]
22
22
  tags: ["adk"]
23
23
  frontend_type: "None"
24
24
 
@@ -18,12 +18,12 @@ settings:
18
18
  requires_data_ingestion: false
19
19
  requires_session: true
20
20
  deployment_targets: ["agent_engine", "cloud_run"]
21
- extra_dependencies: ["google-adk~=1.5.0"]
21
+ extra_dependencies: ["google-adk~=1.6.0"]
22
22
  tags: ["adk"]
23
23
  frontend_type: "adk_gemini_fullstack"
24
24
  commands:
25
25
  override:
26
- install: "npm --prefix frontend install"
26
+ install: "uv sync --dev --extra jupyter && npm --prefix frontend install"
27
27
  extra:
28
28
  dev:
29
29
  command: 'make dev-backend & make dev-frontend'
@@ -19,7 +19,7 @@ settings:
19
19
  requires_session: true
20
20
  deployment_targets: ["agent_engine", "cloud_run"]
21
21
  extra_dependencies: [
22
- "google-adk~=1.5.0",
22
+ "google-adk~=1.6.0",
23
23
  "langchain-google-vertexai~=2.0.7",
24
24
  "langchain~=0.3.24",
25
25
  "langchain-core~=0.3.55",
@@ -1,8 +1,12 @@
1
1
  # Install dependencies using uv package manager
2
2
  install:
3
3
  @command -v uv >/dev/null 2>&1 || { echo "uv is not installed. Installing uv..."; curl -LsSf https://astral.sh/uv/0.6.12/install.sh | sh; source $HOME/.local/bin/env; }
4
+ {%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("install") %}
5
+ {{cookiecutter.settings.get("commands", {}).get("override", {}).get("install")}}
6
+ {%- else %}
4
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' %} && npm --prefix frontend install{%- endif %}
5
- {%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("install") %} && {{cookiecutter.settings.get("commands", {}).get("override", {}).get("install")}}{%- endif %}
8
+ {%- endif %}
9
+
6
10
  {%- if cookiecutter.settings.get("commands", {}).get("extra", {}) %}
7
11
  {%- for cmd_name, cmd_value in cookiecutter.settings.get("commands", {}).get("extra", {}).items() %}
8
12
 
@@ -16,12 +16,12 @@ dependencies = [
16
16
  {%- endif %}
17
17
  "google-cloud-logging~=3.11.4",
18
18
  {%- if cookiecutter.deployment_target == 'cloud_run' %}
19
- "google-cloud-aiplatform[evaluation]~=1.101.0",
19
+ "google-cloud-aiplatform[evaluation]~=1.103.0",
20
20
  "fastapi~=0.115.8",
21
21
  "uvicorn~=0.34.0",
22
22
  "psycopg2-binary>=2.9.10",
23
23
  {%- elif cookiecutter.deployment_target == 'agent_engine' %}
24
- "google-cloud-aiplatform[evaluation,agent-engines]~=1.101.0"
24
+ "google-cloud-aiplatform[evaluation,agent-engines]~=1.103.0"
25
25
  {%- endif %}
26
26
  ]
27
27
  {% if cookiecutter.deployment_target == 'cloud_run' %}
@@ -25,6 +25,13 @@ from rich.prompt import IntPrompt, Prompt
25
25
  from ..utils.datastores import DATASTORE_TYPES
26
26
  from ..utils.gcp import verify_credentials, verify_vertex_connection
27
27
  from ..utils.logging import handle_cli_error
28
+ from ..utils.remote_template import (
29
+ fetch_remote_template,
30
+ get_base_template_name,
31
+ load_remote_template_config,
32
+ merge_template_configs,
33
+ parse_agent_spec,
34
+ )
28
35
  from ..utils.template import (
29
36
  get_available_agents,
30
37
  get_template_path,
@@ -75,7 +82,11 @@ def normalize_project_name(project_name: str) -> str:
75
82
  @click.command()
76
83
  @click.pass_context
77
84
  @click.argument("project_name")
78
- @click.option("--agent", "-a", help="agent name or number to use")
85
+ @click.option(
86
+ "--agent",
87
+ "-a",
88
+ help="Template identifier to use. Can be a local agent name (e.g., `chat_agent`), a local path (`local@/path/to/template`), an `adk-samples` shortcut (e.g., `adk@data-science`), or a remote Git URL. Both shorthand (e.g., `github.com/org/repo/path@main`) and full URLs from your browser (e.g., `https://github.com/org/repo/tree/main/path`) are supported. Lists available local templates if omitted.",
89
+ )
79
90
  @click.option(
80
91
  "--deployment-target",
81
92
  "-d",
@@ -138,11 +149,26 @@ def create(
138
149
  """Create GCP-based AI agent projects from templates."""
139
150
  try:
140
151
  # Display welcome banner
141
- console.print("\n=== GCP Agent Starter Pack :rocket:===", style="bold blue")
142
- console.print("Welcome to the Agent Starter Pack!")
143
- console.print(
144
- "This tool will help you create an end-to-end production-ready AI agent in Google Cloud!\n"
145
- )
152
+ if agent and agent.startswith("adk@"):
153
+ console.print(
154
+ "\n=== Welcome to [link=https://github.com/google/adk-samples]google/adk-samples[/link]! ✨ ===",
155
+ style="bold blue",
156
+ )
157
+ console.print(
158
+ "Powered by ([link=https://goo.gle/agent-starter-pack]Google's Agent Starter Pack [/link])\n",
159
+ )
160
+ console.print(
161
+ "This tool will help you create an end-to-end production-ready AI agent in Google Cloud!\n"
162
+ )
163
+ else:
164
+ console.print(
165
+ "\n=== Google Cloud Agent Starter Pack :rocket:===",
166
+ style="bold blue",
167
+ )
168
+ console.print("Welcome to the Agent Starter Pack!")
169
+ console.print(
170
+ "This tool will help you create an end-to-end production-ready AI agent in Google Cloud!\n"
171
+ )
146
172
  # Validate project name
147
173
  if len(project_name) > 26:
148
174
  console.print(
@@ -172,23 +198,51 @@ def create(
172
198
  )
173
199
  return
174
200
 
175
- # Agent selection
201
+ # Agent selection - handle remote templates
176
202
  selected_agent = None
203
+ template_source_path = None
204
+
177
205
  if agent:
178
- agents = get_available_agents()
179
- # First check if it's a valid agent name
180
- if any(p["name"] == agent for p in agents.values()):
181
- selected_agent = agent
206
+ if agent.startswith("local@"):
207
+ path_str = agent.split("@", 1)[1]
208
+ template_source_path = pathlib.Path(path_str).resolve()
209
+ if not template_source_path.is_dir():
210
+ raise click.ClickException(
211
+ f"Local path not found or not a directory: {template_source_path}"
212
+ )
213
+ selected_agent = f"local_{template_source_path.name}"
214
+ console.print(f"Using local template: {template_source_path}")
182
215
  else:
183
- # Try numeric agent selection if input is a number
184
- try:
185
- agent_num = int(agent)
186
- if agent_num in agents:
187
- selected_agent = agents[agent_num]["name"]
216
+ # Check if it's a remote template specification
217
+ remote_spec = parse_agent_spec(agent)
218
+ if remote_spec:
219
+ if remote_spec.is_adk_samples:
220
+ console.print(
221
+ f"> Fetching template: {remote_spec.template_path}",
222
+ style="bold blue",
223
+ )
188
224
  else:
189
- raise ValueError(f"Invalid agent number: {agent_num}")
190
- except ValueError as err:
191
- raise ValueError(f"Invalid agent name or number: {agent}") from err
225
+ console.print(f"Fetching remote template: {agent}")
226
+ template_source_path = fetch_remote_template(remote_spec)
227
+ selected_agent = f"remote_{hash(agent)}" # Generate unique name for remote template
228
+ else:
229
+ # Handle local agent selection
230
+ agents = get_available_agents()
231
+ # First check if it's a valid agent name
232
+ if any(p["name"] == agent for p in agents.values()):
233
+ selected_agent = agent
234
+ else:
235
+ # Try numeric agent selection if input is a number
236
+ try:
237
+ agent_num = int(agent)
238
+ if agent_num in agents:
239
+ selected_agent = agents[agent_num]["name"]
240
+ else:
241
+ raise ValueError(f"Invalid agent number: {agent_num}")
242
+ except ValueError as err:
243
+ raise ValueError(
244
+ f"Invalid agent name or number: {agent}"
245
+ ) from err
192
246
 
193
247
  final_agent = (
194
248
  selected_agent
@@ -198,13 +252,54 @@ def create(
198
252
  if debug:
199
253
  logging.debug(f"Selected agent: {agent}")
200
254
 
201
- template_path = (
202
- pathlib.Path(__file__).parent.parent.parent.parent
203
- / "agents"
204
- / final_agent
205
- / "template"
206
- )
207
- config = load_template_config(template_path)
255
+ # Load template configuration based on whether it's remote or local
256
+ if template_source_path:
257
+ # Load remote template config
258
+ source_config = load_remote_template_config(template_source_path)
259
+
260
+ # Check if remote template has the required structure
261
+ template_config_path = (
262
+ template_source_path / ".template" / "templateconfig.yaml"
263
+ )
264
+
265
+ if not template_config_path.exists():
266
+ console.print(
267
+ "Error: Template is invalid or improperly structured.",
268
+ style="bold red",
269
+ )
270
+ console.print(
271
+ "Templates must contain a '.template/templateconfig.yaml' file.\n\n"
272
+ "Expected structure:\n"
273
+ " your-template/\n"
274
+ " └── .template/\n"
275
+ " ├── templateconfig.yaml\n"
276
+ " └── [other template files...]",
277
+ style="yellow",
278
+ )
279
+ return
280
+
281
+ # Load base template config for inheritance
282
+ base_template_name = get_base_template_name(source_config)
283
+ base_template_path = (
284
+ pathlib.Path(__file__).parent.parent.parent.parent
285
+ / "agents"
286
+ / base_template_name
287
+ / ".template"
288
+ )
289
+ base_config = load_template_config(base_template_path)
290
+
291
+ # Merge configs: remote inherits from and overrides base
292
+ config = merge_template_configs(base_config, source_config)
293
+ # For remote templates, use the template/ subdirectory as the template source
294
+ template_path = template_source_path / ".template"
295
+ else:
296
+ template_path = (
297
+ pathlib.Path(__file__).parent.parent.parent.parent
298
+ / "agents"
299
+ / final_agent
300
+ / ".template"
301
+ )
302
+ config = load_template_config(template_path)
208
303
  # Data ingestion and datastore selection
209
304
  if include_data_ingestion or datastore:
210
305
  # If datastore is specified but include_data_ingestion is not, set it to True
@@ -231,10 +326,20 @@ def create(
231
326
  logging.debug(f"Selected datastore type: {datastore}")
232
327
 
233
328
  # Deployment target selection
329
+ # For remote templates, we need to use the base template name for deployment target selection
330
+ deployment_agent_name = final_agent
331
+ remote_config = None
332
+ if template_source_path:
333
+ # Use the base template name from remote config for deployment target selection
334
+ deployment_agent_name = get_base_template_name(config)
335
+ remote_config = config
336
+
234
337
  final_deployment = (
235
338
  deployment_target
236
339
  if deployment_target
237
- else prompt_deployment_target(final_agent)
340
+ else prompt_deployment_target(
341
+ deployment_agent_name, remote_config=remote_config
342
+ )
238
343
  )
239
344
  if debug:
240
345
  logging.debug(f"Selected deployment target: {final_deployment}")
@@ -254,7 +359,7 @@ def create(
254
359
  )
255
360
  return
256
361
 
257
- if final_deployment == "cloud_run" and not session_type:
362
+ if final_deployment in ("cloud_run") and not session_type:
258
363
  final_session_type = prompt_session_type_selection()
259
364
  else:
260
365
  # Agents that don't require session management always use in-memory sessions
@@ -307,7 +412,10 @@ def create(
307
412
  )
308
413
 
309
414
  # Process template
310
- template_path = get_template_path(final_agent, debug=debug)
415
+ if not template_source_path:
416
+ template_path = get_template_path(final_agent, debug=debug)
417
+ # template_path is already set above for remote templates
418
+
311
419
  if debug:
312
420
  logging.debug(f"Template path: {template_path}")
313
421
  logging.debug(f"Processing template for project: {project_name}")
@@ -319,20 +427,24 @@ def create(
319
427
  if debug:
320
428
  logging.debug(f"Output directory: {destination_dir}")
321
429
 
322
- process_template(
323
- final_agent,
324
- template_path,
325
- project_name,
326
- deployment_target=final_deployment,
327
- include_data_ingestion=include_data_ingestion,
328
- datastore=datastore,
329
- session_type=final_session_type,
330
- output_dir=destination_dir,
331
- )
332
-
333
- # Replace region in all files if a different region was specified
334
- if region != "us-central1":
335
- replace_region_in_files(project_path, region, debug=debug)
430
+ try:
431
+ # Process template (handles both local and remote templates)
432
+ process_template(
433
+ final_agent,
434
+ template_path,
435
+ project_name,
436
+ deployment_target=final_deployment,
437
+ include_data_ingestion=include_data_ingestion,
438
+ datastore=datastore,
439
+ session_type=final_session_type,
440
+ output_dir=destination_dir,
441
+ remote_template_path=template_source_path,
442
+ remote_config=config if template_source_path else None,
443
+ )
444
+ finally:
445
+ # Replace region in all files if a different region was specified
446
+ if region != "us-central1":
447
+ replace_region_in_files(project_path, region, debug=debug)
336
448
 
337
449
  project_path = destination_dir / project_name
338
450
  cd_path = project_path if output_dir else project_name
@@ -0,0 +1,158 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import logging
16
+ import pathlib
17
+
18
+ import click
19
+ import yaml
20
+ from rich.console import Console
21
+ from rich.table import Table
22
+
23
+ from ..utils.remote_template import fetch_remote_template, parse_agent_spec
24
+ from ..utils.template import get_available_agents
25
+
26
+ console = Console()
27
+
28
+
29
+ def display_agents_from_path(base_path: pathlib.Path, source_name: str) -> None:
30
+ """Scans a directory and displays available agents."""
31
+ table = Table(
32
+ title=f"Available agents in [bold blue]{source_name}[/]",
33
+ show_header=True,
34
+ header_style="bold magenta",
35
+ )
36
+ table.add_column("Name", style="bold")
37
+ table.add_column("Path", style="cyan")
38
+ table.add_column("Description", style="dim")
39
+
40
+ if not base_path.is_dir():
41
+ console.print(f"Directory not found: {base_path}", style="bold red")
42
+ return
43
+
44
+ found_agents = False
45
+ # Search for templateconfig.yaml files to identify agents
46
+ for config_path in sorted(base_path.glob("**/templateconfig.yaml")):
47
+ try:
48
+ with open(config_path) as f:
49
+ config = yaml.safe_load(f)
50
+
51
+ agent_name = config.get("name", config_path.parent.parent.name)
52
+ description = config.get("description", "No description.")
53
+
54
+ # Display the agent's path relative to the scanned directory
55
+ relative_path = config_path.parent.parent.relative_to(base_path)
56
+
57
+ table.add_row(agent_name, f"/{relative_path}", description)
58
+ found_agents = True
59
+
60
+ except Exception as e:
61
+ logging.warning(
62
+ f"Could not load agent from {config_path.parent.parent}: {e}"
63
+ )
64
+
65
+ if not found_agents:
66
+ console.print(f"No agents found in {source_name}", style="yellow")
67
+ else:
68
+ console.print(table)
69
+
70
+
71
+ def list_remote_agents(remote_source: str, scan_from_root: bool = False) -> None:
72
+ """Lists agents from a remote source (Git URL)."""
73
+ spec = parse_agent_spec(remote_source)
74
+ if not spec:
75
+ console.print(f"Invalid remote source: {remote_source}", style="bold red")
76
+ return
77
+
78
+ console.print(f"\nFetching agents from [bold blue]{remote_source}[/]...")
79
+
80
+ try:
81
+ # fetch_remote_template clones the repo and returns a path to the
82
+ # specific template directory within the repo.
83
+ template_dir_path = fetch_remote_template(spec)
84
+
85
+ if scan_from_root:
86
+ # For ADK, we want to scan the entire repo. We need to find the
87
+ # root of the repo and scan from there.
88
+ scan_path = template_dir_path
89
+ while not (scan_path / ".git").exists() and scan_path.parent != scan_path:
90
+ scan_path = scan_path.parent
91
+ else:
92
+ # For other git repos, respect the path given in the URL.
93
+ scan_path = template_dir_path
94
+
95
+ display_agents_from_path(scan_path, remote_source)
96
+
97
+ except (RuntimeError, FileNotFoundError) as e:
98
+ console.print(f"Error: {e}", style="bold red")
99
+
100
+
101
+ @click.command("list")
102
+ @click.option(
103
+ "--adk",
104
+ is_flag=True,
105
+ help="List agents from the official google/adk-samples repository.",
106
+ )
107
+ @click.option(
108
+ "--source",
109
+ "-s",
110
+ help="List agents from a local path or a remote Git URL.",
111
+ )
112
+ def list_agents(adk: bool, source: str | None) -> None:
113
+ """
114
+ Lists available agent templates.
115
+
116
+ Defaults to listing built-in agents if no options are provided.
117
+ """
118
+ if adk and source:
119
+ console.print(
120
+ "Error: --adk and --source are mutually exclusive.", style="bold red"
121
+ )
122
+ return
123
+
124
+ if adk:
125
+ list_remote_agents("https://github.com/google/adk-samples", scan_from_root=True)
126
+ return
127
+
128
+ if source:
129
+ source_path = pathlib.Path(source)
130
+ if source_path.is_dir():
131
+ display_agents_from_path(source_path, f"local directory '{source}'")
132
+ elif parse_agent_spec(source):
133
+ list_remote_agents(source)
134
+ else:
135
+ console.print(
136
+ f"Error: Source '{source}' is not a valid local directory or remote URL.",
137
+ style="bold red",
138
+ )
139
+ return
140
+
141
+ # Default behavior: list built-in agents
142
+ agents = get_available_agents()
143
+ if not agents:
144
+ console.print("No built-in agents found.", style="yellow")
145
+ return
146
+
147
+ table = Table(
148
+ title="Available built-in agents",
149
+ show_header=True,
150
+ header_style="bold magenta",
151
+ )
152
+ table.add_column("Number", style="dim", width=12)
153
+ table.add_column("Name", style="bold")
154
+ table.add_column("Description")
155
+
156
+ for i, (_, agent) in enumerate(agents.items()):
157
+ table.add_row(str(i + 1), agent["name"], agent["description"])
158
+ console.print(table)