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.
- {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/METADATA +3 -2
- {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/RECORD +30 -28
- agents/adk_base/{template/.templateconfig.yaml → .template/templateconfig.yaml} +1 -1
- agents/adk_gemini_fullstack/{template/.templateconfig.yaml → .template/templateconfig.yaml} +2 -2
- agents/agentic_rag/{template/.templateconfig.yaml → .template/templateconfig.yaml} +1 -1
- src/base_template/Makefile +5 -1
- src/base_template/pyproject.toml +2 -2
- src/cli/commands/create.py +155 -43
- src/cli/commands/list.py +158 -0
- src/cli/main.py +2 -0
- src/cli/utils/remote_template.py +254 -0
- src/cli/utils/template.py +100 -25
- src/resources/locks/uv-adk_base-agent_engine.lock +151 -119
- src/resources/locks/uv-adk_base-cloud_run.lock +181 -146
- src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock +151 -119
- src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock +181 -146
- src/resources/locks/uv-agentic_rag-agent_engine.lock +154 -122
- src/resources/locks/uv-agentic_rag-cloud_run.lock +184 -149
- src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +130 -130
- src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +160 -160
- src/resources/locks/uv-langgraph_base_react-agent_engine.lock +109 -109
- src/resources/locks/uv-langgraph_base_react-cloud_run.lock +139 -139
- src/resources/locks/uv-live_api-cloud_run.lock +136 -136
- src/utils/lock_utils.py +1 -1
- {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/WHEEL +0 -0
- {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/entry_points.txt +0 -0
- {agent_starter_pack-0.8.0.dist-info → agent_starter_pack-0.9.0.dist-info}/licenses/LICENSE +0 -0
- /agents/crewai_coding_crew/{template/.templateconfig.yaml → .template/templateconfig.yaml} +0 -0
- /agents/langgraph_base_react/{template/.templateconfig.yaml → .template/templateconfig.yaml} +0 -0
- /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.
|
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
|
-
|
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=
|
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=
|
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=
|
77
|
-
src/cli/commands/create.py,sha256=
|
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/
|
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=
|
186
|
-
src/resources/locks/uv-adk_base-cloud_run.lock,sha256=
|
187
|
-
src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock,sha256=
|
188
|
-
src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock,sha256=
|
189
|
-
src/resources/locks/uv-agentic_rag-agent_engine.lock,sha256=
|
190
|
-
src/resources/locks/uv-agentic_rag-cloud_run.lock,sha256=
|
191
|
-
src/resources/locks/uv-crewai_coding_crew-agent_engine.lock,sha256=
|
192
|
-
src/resources/locks/uv-crewai_coding_crew-cloud_run.lock,sha256=
|
193
|
-
src/resources/locks/uv-langgraph_base_react-agent_engine.lock,sha256=
|
194
|
-
src/resources/locks/uv-langgraph_base_react-cloud_run.lock,sha256=
|
195
|
-
src/resources/locks/uv-live_api-cloud_run.lock,sha256=
|
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=
|
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.
|
203
|
-
agent_starter_pack-0.
|
204
|
-
agent_starter_pack-0.
|
205
|
-
agent_starter_pack-0.
|
206
|
-
agent_starter_pack-0.
|
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,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.
|
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'
|
src/base_template/Makefile
CHANGED
@@ -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
|
-
{%-
|
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
|
|
src/base_template/pyproject.toml
CHANGED
@@ -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.
|
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.
|
24
|
+
"google-cloud-aiplatform[evaluation,agent-engines]~=1.103.0"
|
25
25
|
{%- endif %}
|
26
26
|
]
|
27
27
|
{% if cookiecutter.deployment_target == 'cloud_run' %}
|
src/cli/commands/create.py
CHANGED
@@ -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(
|
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
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
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
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
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
|
-
#
|
184
|
-
|
185
|
-
|
186
|
-
if
|
187
|
-
|
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
|
-
|
190
|
-
|
191
|
-
|
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
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
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(
|
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
|
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
|
-
|
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
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
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
|
src/cli/commands/list.py
ADDED
@@ -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)
|