agent-starter-pack 0.0.1b0__py3-none-any.whl → 0.0.2b0__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.
- {agent_starter_pack-0.0.1b0.dist-info → agent_starter_pack-0.0.2b0.dist-info}/METADATA +7 -5
- {agent_starter_pack-0.0.1b0.dist-info → agent_starter_pack-0.0.2b0.dist-info}/RECORD +20 -20
- src/base_template/deployment/terraform/dev/vars/env.tfvars +1 -1
- src/base_template/deployment/terraform/vars/env.tfvars +1 -1
- src/base_template/pyproject.toml +2 -2
- src/cli/commands/create.py +37 -29
- src/cli/commands/setup_cicd.py +12 -2
- src/cli/utils/cicd.py +66 -1
- src/cli/utils/gcp.py +1 -1
- src/cli/utils/template.py +6 -2
- src/resources/locks/uv-agentic_rag_vertexai_search-agent_engine.lock +155 -51
- src/resources/locks/uv-agentic_rag_vertexai_search-cloud_run.lock +84 -83
- src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +179 -75
- src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +108 -107
- src/resources/locks/uv-langgraph_base_react-agent_engine.lock +155 -51
- src/resources/locks/uv-langgraph_base_react-cloud_run.lock +84 -83
- src/resources/locks/uv-multimodal_live_api-cloud_run.lock +81 -80
- {agent_starter_pack-0.0.1b0.dist-info → agent_starter_pack-0.0.2b0.dist-info}/WHEEL +0 -0
- {agent_starter_pack-0.0.1b0.dist-info → agent_starter_pack-0.0.2b0.dist-info}/entry_points.txt +0 -0
- {agent_starter_pack-0.0.1b0.dist-info → agent_starter_pack-0.0.2b0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-starter-pack
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.2b0
|
|
4
4
|
Summary: CLI tool to create GCP-based AI agent projects from templates
|
|
5
5
|
Author-email: Google LLC <agent-starter-pack@google.com>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -34,7 +34,7 @@ It accelerates development by providing a holistic, production-ready solution, a
|
|
|
34
34
|
|
|
35
35
|
| ⚡️ Launch | 🧪 Experiment | ✅ Deploy | 🛠️ Customize |
|
|
36
36
|
|---|---|---|---|
|
|
37
|
-
| Pre-built agent templates (ReAct, RAG, multi-agent, Live Multimodal API). | Vertex AI evaluation and an interactive playground. | Production-ready
|
|
37
|
+
| [Pre-built agent templates](./agents/) (ReAct, RAG, multi-agent, Live Multimodal API). | [Vertex AI evaluation]() and an interactive playground. | Production-ready infra with [monitoring](./docs/monitoring.md), [observability](./docs/observability.md), and [CI/CD](./docs/deployment.md) on [Cloud Run](https://cloud.google.com/run) or [Agent Engine](https://cloud.google.com/vertex-ai/generative-ai/docs/reasoning-engine/overview). | Extend and customize templates according to your needs. |
|
|
38
38
|
|
|
39
39
|
---
|
|
40
40
|
|
|
@@ -43,10 +43,13 @@ It accelerates development by providing a holistic, production-ready solution, a
|
|
|
43
43
|
Ready to build your AI agent? Simply run this command:
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
#
|
|
46
|
+
# Create and activate a Python virtual environment
|
|
47
|
+
python -m venv venv && source venv/bin/activate
|
|
48
|
+
|
|
49
|
+
# Install the agent starter pack
|
|
47
50
|
pip install agent-starter-pack
|
|
48
51
|
|
|
49
|
-
#
|
|
52
|
+
# Create a new agent project
|
|
50
53
|
agent-starter-pack create my-awesome-agent
|
|
51
54
|
```
|
|
52
55
|
|
|
@@ -105,7 +108,6 @@ This project represents the next evolution of the [e2e-gen-ai-app-starter-pack](
|
|
|
105
108
|
|
|
106
109
|
- Python 3.10+
|
|
107
110
|
- [Google Cloud SDK](https://cloud.google.com/sdk/docs/install)
|
|
108
|
-
- [uv](https://github.com/astral-sh/uv)
|
|
109
111
|
- [Terraform](https://developer.hashicorp.com/terraform/downloads) (for deployment)
|
|
110
112
|
|
|
111
113
|
|
|
@@ -31,7 +31,7 @@ agents/multimodal_live_api/tests/unit/test_server.py,sha256=_TjlgQgNkjerIaBGnu8P
|
|
|
31
31
|
src/base_template/.gitignore,sha256=mJKTZIcVdAFiIUQicRfPNGUg6WvwcfTEC2xbmAaU34g,2579
|
|
32
32
|
src/base_template/Makefile,sha256=YQXymaikoFP3r7MN1EiNbQv8VZKjrVzeRoksIPHNX0E,1568
|
|
33
33
|
src/base_template/README.md,sha256=LS07ZhCLj2SXew3j3xEWaaXwsf3aIjyvQpkp0S0l8nA,4194
|
|
34
|
-
src/base_template/pyproject.toml,sha256=
|
|
34
|
+
src/base_template/pyproject.toml,sha256=Yyk30u_QBtwHmFaEC40PyJe3Smt6snzSZxd5usoO9tA,2777
|
|
35
35
|
src/base_template/app/utils/tracing.py,sha256=ovp6tgwgo_tqibpbhhHl8cWIqqUWVYfV0AL7XPDEPpM,5661
|
|
36
36
|
src/base_template/app/utils/typing.py,sha256=UUFm74qiKGtT8pLuE_3yRpcmntRCt91wH_Q-LKdjQuQ,3194
|
|
37
37
|
src/base_template/deployment/README.md,sha256=8AorSeF2Aj0kvPmuQLFrmAAUWVbdTzg0S-rVBbfdirQ,4835
|
|
@@ -53,17 +53,17 @@ src/base_template/deployment/terraform/dev/log_sinks.tf,sha256=SPse4k-L8f6-vEYMt
|
|
|
53
53
|
src/base_template/deployment/terraform/dev/providers.tf,sha256=DoRNfVxdpwnTHTxQ97-cguBCeeRDYz7EPKsy0-f_t1I,878
|
|
54
54
|
src/base_template/deployment/terraform/dev/storage.tf,sha256=bjpZ5WzO0w6wGAIT_Ye61aS1sTlO128uayIvcgqGMoA,2965
|
|
55
55
|
src/base_template/deployment/terraform/dev/variables.tf,sha256=wMgDgp1E-piGhcF1WbwHFSj2NJseB7eZzAjup6bBhEQ,4063
|
|
56
|
-
src/base_template/deployment/terraform/dev/vars/env.tfvars,sha256=
|
|
57
|
-
src/base_template/deployment/terraform/vars/env.tfvars,sha256=
|
|
56
|
+
src/base_template/deployment/terraform/dev/vars/env.tfvars,sha256=xz5cYG29ZIgqM1K-0o-RB10oBTDKNIhHMY7qrmjHk8I,922
|
|
57
|
+
src/base_template/deployment/terraform/vars/env.tfvars,sha256=2dxWRDzeolN2f7eKSHXcBiBt9fRcIMO6VH-2MAZevLQ,1633
|
|
58
58
|
src/base_template/tests/unit/test_utils/test_tracing_exporter.py,sha256=JAb0vIB7wNFPm_kaDaHcxtPKNReypDHjdsMQyzpuePQ,4687
|
|
59
59
|
src/cli/main.py,sha256=134KpcOQlexr_vR-KT3D3B1jKh1Y6S3qHGJ-9uD9Kkg,950
|
|
60
|
-
src/cli/commands/create.py,sha256=
|
|
61
|
-
src/cli/commands/setup_cicd.py,sha256=
|
|
60
|
+
src/cli/commands/create.py,sha256=JjrHnn0EVqiQL98HOJ9IYSvanODnqlOpHrz8LmzOLmk,19537
|
|
61
|
+
src/cli/commands/setup_cicd.py,sha256=EgVkDdA94npDHHPTuYDmWNIiRscnsXtN7CbTuelrTVU,28347
|
|
62
62
|
src/cli/utils/__init__.py,sha256=x-k6jfcv68_zYS88LrA1mr0yB5y5SekJ0nc5Tvt6iDA,1064
|
|
63
|
-
src/cli/utils/cicd.py,sha256=
|
|
64
|
-
src/cli/utils/gcp.py,sha256=
|
|
63
|
+
src/cli/utils/cicd.py,sha256=x-8PKp4aevkUwAmtbEZVwu0UlrA6ifXGbouxICu1D0o,25664
|
|
64
|
+
src/cli/utils/gcp.py,sha256=zs7JJP79IAO5zvUe4Ttwr_qlTC0jtBK87AP6Ug8Nj4Y,4164
|
|
65
65
|
src/cli/utils/logging.py,sha256=0lHe4EPi1A8sOx9xkA7gS4UNl0GsIyp2ahydkkuCzLY,1570
|
|
66
|
-
src/cli/utils/template.py,sha256=
|
|
66
|
+
src/cli/utils/template.py,sha256=p7uKv5yHkXIOWo8EJJ0IjUh57lOSDL7kYHA9OZ7j-z4,25447
|
|
67
67
|
src/data_ingestion/README.md,sha256=QlomTIZINvZxf2ftCkm2_QVozlivJqAfFKyfiGMZDpY,4217
|
|
68
68
|
src/data_ingestion/pyproject.toml,sha256=ArworDzIofX4oTU6iVol1PA-Z3qClLsFGsO8FnmwrdI,397
|
|
69
69
|
src/data_ingestion/uv.lock,sha256=HzSD6_IxS2urt49EefD9MvVxBwxW_bJ-k0XltTDT3Vc,144223
|
|
@@ -142,21 +142,21 @@ src/frontends/streamlit/frontend/utils/multimodal_utils.py,sha256=v6YbCkz_YcnEo-
|
|
|
142
142
|
src/frontends/streamlit/frontend/utils/stream_handler.py,sha256=J7MMsOR2GvDEsyJbsv8VQeZbMs7mNySrclZNfuzsZD4,11578
|
|
143
143
|
src/frontends/streamlit/frontend/utils/title_summary.py,sha256=JtFnPzS3JcEcZRrRmFVz5wZacORVLtN86MEjCTqP-wA,2405
|
|
144
144
|
src/resources/containers/data_processing/Dockerfile,sha256=uXjqDiSrr7YpoX-vtzaIJIVXZ2qeUpu1Nzju9qWZ9oI,859
|
|
145
|
-
src/resources/locks/uv-agentic_rag_vertexai_search-agent_engine.lock,sha256=
|
|
146
|
-
src/resources/locks/uv-agentic_rag_vertexai_search-cloud_run.lock,sha256=
|
|
147
|
-
src/resources/locks/uv-crewai_coding_crew-agent_engine.lock,sha256=
|
|
148
|
-
src/resources/locks/uv-crewai_coding_crew-cloud_run.lock,sha256=
|
|
149
|
-
src/resources/locks/uv-langgraph_base_react-agent_engine.lock,sha256=
|
|
150
|
-
src/resources/locks/uv-langgraph_base_react-cloud_run.lock,sha256=
|
|
151
|
-
src/resources/locks/uv-multimodal_live_api-cloud_run.lock,sha256=
|
|
145
|
+
src/resources/locks/uv-agentic_rag_vertexai_search-agent_engine.lock,sha256=6muWlgt4dduqGDiGUvTg-d2zzY5rgW9zP9DbDnt3krc,474353
|
|
146
|
+
src/resources/locks/uv-agentic_rag_vertexai_search-cloud_run.lock,sha256=ViUzp35RGWZiiQvvVi6ntFTT-bEbHg4_HDDQznD4ML8,756574
|
|
147
|
+
src/resources/locks/uv-crewai_coding_crew-agent_engine.lock,sha256=TOICJcW3ajjycUfK-bzY6hEZaMRiGf521z1e9n0BwQI,568962
|
|
148
|
+
src/resources/locks/uv-crewai_coding_crew-cloud_run.lock,sha256=FUwOcG2_RzxKvKHSxA833EXkVC4P8geVYH-3GWI2QXI,878413
|
|
149
|
+
src/resources/locks/uv-langgraph_base_react-agent_engine.lock,sha256=DihpnjNFvnfPP9k-YmQVpEHWbE0Zx-aYbiqjZNi0LU0,469496
|
|
150
|
+
src/resources/locks/uv-langgraph_base_react-cloud_run.lock,sha256=nMsiSn0weaVWrMxrH8-SnNtuKAEe3byvMOjrQ-UcS4I,751717
|
|
151
|
+
src/resources/locks/uv-multimodal_live_api-cloud_run.lock,sha256=gLLVXP01wVom5fnvpFoYmue6Ynx3qiFbb1FOfDDQy34,751312
|
|
152
152
|
src/resources/setup_cicd/cicd_variables.tf,sha256=OHNKglkpN2TSTnfgpd-fM-eNUbWhs6grNwBIKHoLyfU,1097
|
|
153
153
|
src/resources/setup_cicd/github.tf,sha256=g7gMQqPZI69XteCSruNfiT00GBGawuXANHj-F0fc-GE,2727
|
|
154
154
|
src/resources/setup_cicd/providers.tf,sha256=Km4z6IJt7x7PLaa0kyZbBrO2m3lpuIJZFD5jB7QBfF0,1122
|
|
155
155
|
src/utils/generate_locks.py,sha256=xu5IAhGGBPkVQGSJX4kk7_JNDwWJUEaXAHbmaQIohbg,4386
|
|
156
156
|
src/utils/lock_utils.py,sha256=plw3vWkRViCMxBK3IrLRHtF_I0kbbP043T9KIYxcb20,2423
|
|
157
157
|
src/utils/watch_and_rebuild.py,sha256=IdbTLReYknTXXu5KWPz3sc7Zg5HTEMS5UVlMSnuhs5E,6067
|
|
158
|
-
agent_starter_pack-0.0.
|
|
159
|
-
agent_starter_pack-0.0.
|
|
160
|
-
agent_starter_pack-0.0.
|
|
161
|
-
agent_starter_pack-0.0.
|
|
162
|
-
agent_starter_pack-0.0.
|
|
158
|
+
agent_starter_pack-0.0.2b0.dist-info/METADATA,sha256=GLlhPwsoHan0T4bSNR5qF80V8aNGnk_UzEVMTzgffpI,6805
|
|
159
|
+
agent_starter_pack-0.0.2b0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
160
|
+
agent_starter_pack-0.0.2b0.dist-info/entry_points.txt,sha256=U7uCxR7YulIhZ0L8R8Hui0Bsy6J7oyESBeDYJYMrQjA,56
|
|
161
|
+
agent_starter_pack-0.0.2b0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
162
|
+
agent_starter_pack-0.0.2b0.dist-info/RECORD,,
|
|
@@ -6,7 +6,7 @@ region = "us-central1"
|
|
|
6
6
|
|
|
7
7
|
telemetry_bigquery_dataset_id = "telemetry_genai_app_sample_sink"
|
|
8
8
|
telemetry_sink_name = "telemetry_logs_genai_app_sample"
|
|
9
|
-
telemetry_logs_filter = "jsonPayload.attributes.\"traceloop.association.properties.log_type\"=\"tracing\" jsonPayload.resource.attributes.\"service.name\"=\"
|
|
9
|
+
telemetry_logs_filter = "jsonPayload.attributes.\"traceloop.association.properties.log_type\"=\"tracing\" jsonPayload.resource.attributes.\"service.name\"=\"{{cookiecutter.project_name}}\""
|
|
10
10
|
|
|
11
11
|
feedback_bigquery_dataset_id = "feedback_genai_app_sample_sink"
|
|
12
12
|
feedback_sink_name = "feedback_logs_genai_app_sample"
|
|
@@ -22,7 +22,7 @@ cloud_run_app_sa_name = "{{cookiecutter.project_name}}-cr"
|
|
|
22
22
|
|
|
23
23
|
telemetry_bigquery_dataset_id = "telemetry_genai_app_sample_sink"
|
|
24
24
|
telemetry_sink_name = "telemetry_logs_genai_app_sample"
|
|
25
|
-
telemetry_logs_filter = "jsonPayload.attributes.\"traceloop.association.properties.log_type\"=\"tracing\" jsonPayload.resource.attributes.\"service.name\"=\"
|
|
25
|
+
telemetry_logs_filter = "jsonPayload.attributes.\"traceloop.association.properties.log_type\"=\"tracing\" jsonPayload.resource.attributes.\"service.name\"=\"{{cookiecutter.project_name}}\""
|
|
26
26
|
|
|
27
27
|
feedback_bigquery_dataset_id = "feedback_genai_app_sample_sink"
|
|
28
28
|
feedback_sink_name = "feedback_logs_genai_app_sample"
|
src/base_template/pyproject.toml
CHANGED
|
@@ -14,11 +14,11 @@ dependencies = [
|
|
|
14
14
|
"traceloop-sdk~=0.38.7",
|
|
15
15
|
"google-cloud-logging~=3.11.4",
|
|
16
16
|
{%- if cookiecutter.deployment_target == 'cloud_run' %}
|
|
17
|
-
"google-cloud-aiplatform[evaluation]~=1.
|
|
17
|
+
"google-cloud-aiplatform[evaluation]~=1.81.0",
|
|
18
18
|
"fastapi~=0.115.8",
|
|
19
19
|
"uvicorn~=0.34.0"
|
|
20
20
|
{%- elif cookiecutter.deployment_target == 'agent_engine' %}
|
|
21
|
-
"google-cloud-aiplatform[evaluation,langchain,reasoningengine]~=1.
|
|
21
|
+
"google-cloud-aiplatform[evaluation,langchain,reasoningengine]~=1.81.0"
|
|
22
22
|
{%- endif %}
|
|
23
23
|
]
|
|
24
24
|
{% if cookiecutter.deployment_target == 'cloud_run' %}
|
src/cli/commands/create.py
CHANGED
|
@@ -149,11 +149,16 @@ def create(
|
|
|
149
149
|
logging.debug(f"Selected deployment target: {final_deployment}")
|
|
150
150
|
|
|
151
151
|
# Data pipeline selection
|
|
152
|
-
include_data_ingestion = include_data_ingestion or prompt_data_ingestion(
|
|
152
|
+
include_data_ingestion = include_data_ingestion or prompt_data_ingestion(
|
|
153
|
+
final_agent
|
|
154
|
+
)
|
|
153
155
|
if debug:
|
|
154
156
|
logging.debug(f"Include data pipeline: {include_data_ingestion}")
|
|
155
157
|
# Region confirmation (if not explicitly passed)
|
|
156
|
-
if
|
|
158
|
+
if (
|
|
159
|
+
not auto_approve
|
|
160
|
+
and ctx.get_parameter_source("region") != ParameterSource.COMMANDLINE
|
|
161
|
+
):
|
|
157
162
|
region = prompt_region_confirmation(region)
|
|
158
163
|
if debug:
|
|
159
164
|
logging.debug(f"Selected region: {region}")
|
|
@@ -197,11 +202,11 @@ def create(
|
|
|
197
202
|
Prompt.ask(
|
|
198
203
|
f"\n> You are logged in with account '{creds_info['account']}' "
|
|
199
204
|
f"and using project '{creds_info['project']}'. "
|
|
200
|
-
"
|
|
201
|
-
choices=["
|
|
202
|
-
default="
|
|
205
|
+
"Is this correct?",
|
|
206
|
+
choices=["Y", "n"],
|
|
207
|
+
default="Y",
|
|
203
208
|
).lower()
|
|
204
|
-
== "
|
|
209
|
+
== "n"
|
|
205
210
|
)
|
|
206
211
|
|
|
207
212
|
if change_creds:
|
|
@@ -215,27 +220,30 @@ def create(
|
|
|
215
220
|
# Check for uv installation
|
|
216
221
|
console.print("> Checking for uv installation...")
|
|
217
222
|
check_and_install_uv()
|
|
223
|
+
|
|
224
|
+
# Test Vertex AI connection
|
|
225
|
+
console.print("> Testing GCP and Vertex AI Connection...")
|
|
226
|
+
try:
|
|
227
|
+
verify_vertex_connection(
|
|
228
|
+
project_id=creds_info["project"],
|
|
229
|
+
location=region,
|
|
230
|
+
)
|
|
231
|
+
console.print(
|
|
232
|
+
f"> ✓ Successfully verified connection to Vertex AI in project {creds_info['project']}"
|
|
233
|
+
)
|
|
234
|
+
except Exception as e:
|
|
235
|
+
console.print(
|
|
236
|
+
f"> ✗ Failed to connect to Vertex AI: {e!s}", style="bold red"
|
|
237
|
+
)
|
|
238
|
+
raise
|
|
218
239
|
else:
|
|
219
240
|
if debug:
|
|
220
241
|
logging.debug("Skipping verification checks due to --skip-checks flag")
|
|
221
242
|
console.print("> Skipping verification checks", style="yellow")
|
|
222
243
|
# Set a default creds_info when skipping checks
|
|
223
|
-
creds_info =
|
|
224
|
-
|
|
225
|
-
console.print("> Testing GCP and Vertex AI Connection...")
|
|
226
|
-
try:
|
|
227
|
-
verify_vertex_connection(
|
|
228
|
-
project_id=creds_info["project"],
|
|
229
|
-
location=region,
|
|
230
|
-
)
|
|
231
|
-
console.print(
|
|
232
|
-
f"> ✓ Successfully verified connection to Vertex AI in project {creds_info['project']}"
|
|
233
|
-
)
|
|
234
|
-
except Exception as e:
|
|
235
|
-
console.print(
|
|
236
|
-
f"> ✗ Failed to connect to Vertex AI: {e!s}", style="bold red"
|
|
244
|
+
creds_info = (
|
|
245
|
+
{"project": gcp_project} if gcp_project else {"project": "unknown"}
|
|
237
246
|
)
|
|
238
|
-
raise
|
|
239
247
|
|
|
240
248
|
# Process template
|
|
241
249
|
template_path = get_template_path(final_agent, debug=debug)
|
|
@@ -263,10 +271,14 @@ def create(
|
|
|
263
271
|
console.print("\n> 👍 Done. Execute the following command to get started:")
|
|
264
272
|
if output_dir:
|
|
265
273
|
# If output_dir was specified, use the absolute path
|
|
266
|
-
console.print(
|
|
274
|
+
console.print(
|
|
275
|
+
f"[bold bright_green]cd {project_path} && make install && make playground[/]"
|
|
276
|
+
)
|
|
267
277
|
else:
|
|
268
278
|
# If no output_dir specified, just use project name
|
|
269
|
-
console.print(
|
|
279
|
+
console.print(
|
|
280
|
+
f"[bold bright_green]cd {project_name} && make install && make playground[/]"
|
|
281
|
+
)
|
|
270
282
|
|
|
271
283
|
# Replace region in all files if a different region was specified
|
|
272
284
|
if region != "us-central1":
|
|
@@ -475,11 +487,7 @@ def check_and_install_uv() -> None:
|
|
|
475
487
|
try:
|
|
476
488
|
# Use shell=True for Windows compatibility and add timeout
|
|
477
489
|
process = subprocess.run(
|
|
478
|
-
"uv --version",
|
|
479
|
-
shell=True,
|
|
480
|
-
capture_output=True,
|
|
481
|
-
text=True,
|
|
482
|
-
timeout=10
|
|
490
|
+
"uv --version", shell=True, capture_output=True, text=True, timeout=10
|
|
483
491
|
)
|
|
484
492
|
if process.returncode == 0:
|
|
485
493
|
logging.debug("uv is already installed")
|
|
@@ -512,7 +520,7 @@ def check_and_install_uv() -> None:
|
|
|
512
520
|
install_command,
|
|
513
521
|
shell=True,
|
|
514
522
|
check=True,
|
|
515
|
-
timeout=60 # Give installation more time
|
|
523
|
+
timeout=60, # Give installation more time
|
|
516
524
|
)
|
|
517
525
|
console.print("> uv installed successfully!", style="green")
|
|
518
526
|
except subprocess.TimeoutExpired:
|
src/cli/commands/setup_cicd.py
CHANGED
|
@@ -31,6 +31,8 @@ from src.cli.utils.cicd import (
|
|
|
31
31
|
create_github_connection,
|
|
32
32
|
create_github_repository,
|
|
33
33
|
ensure_apis_enabled,
|
|
34
|
+
handle_github_authentication,
|
|
35
|
+
is_github_authenticated,
|
|
34
36
|
print_cicd_summary,
|
|
35
37
|
run_command,
|
|
36
38
|
)
|
|
@@ -84,7 +86,7 @@ def setup_git_repository(config: ProjectConfig) -> str:
|
|
|
84
86
|
|
|
85
87
|
# Initialize git if not already initialized
|
|
86
88
|
if not (Path.cwd() / ".git").exists():
|
|
87
|
-
run_command(["git", "init"])
|
|
89
|
+
run_command(["git", "init", "-b", "main"])
|
|
88
90
|
console.print("✅ Git repository initialized")
|
|
89
91
|
|
|
90
92
|
# Get current GitHub username for the remote URL
|
|
@@ -470,6 +472,14 @@ def setup_cicd(
|
|
|
470
472
|
if not git_provider:
|
|
471
473
|
git_provider = prompt_for_git_provider()
|
|
472
474
|
|
|
475
|
+
# Check GitHub authentication if GitHub is selected
|
|
476
|
+
if git_provider == "github" and not (github_pat and github_app_installation_id):
|
|
477
|
+
if not is_github_authenticated():
|
|
478
|
+
console.print("\n⚠️ Not authenticated with GitHub CLI", style="yellow")
|
|
479
|
+
handle_github_authentication()
|
|
480
|
+
else:
|
|
481
|
+
console.print("✅ GitHub CLI authentication verified")
|
|
482
|
+
|
|
473
483
|
# Only prompt for repository details if not provided via CLI
|
|
474
484
|
if not (repository_name and repository_owner):
|
|
475
485
|
repository_name, repository_owner = prompt_for_repository_details(
|
|
@@ -676,7 +686,7 @@ def setup_cicd(
|
|
|
676
686
|
|
|
677
687
|
# Initialize git if not already initialized
|
|
678
688
|
if not (Path.cwd() / ".git").exists():
|
|
679
|
-
run_command(["git", "init"])
|
|
689
|
+
run_command(["git", "init", "-b", "main"])
|
|
680
690
|
console.print("✅ Git repository initialized")
|
|
681
691
|
|
|
682
692
|
# Get current GitHub username for the remote URL
|
src/cli/utils/cicd.py
CHANGED
|
@@ -22,6 +22,7 @@ from dataclasses import dataclass
|
|
|
22
22
|
from enum import Enum
|
|
23
23
|
from pathlib import Path
|
|
24
24
|
|
|
25
|
+
import click
|
|
25
26
|
from rich.console import Console
|
|
26
27
|
from rich.prompt import IntPrompt, Prompt
|
|
27
28
|
|
|
@@ -407,6 +408,7 @@ def run_command(
|
|
|
407
408
|
cwd: Path | None = None,
|
|
408
409
|
capture_output: bool = False,
|
|
409
410
|
shell: bool = False,
|
|
411
|
+
input: str | None = None,
|
|
410
412
|
) -> subprocess.CompletedProcess:
|
|
411
413
|
"""Run a command and display it to the user"""
|
|
412
414
|
# Format command for display
|
|
@@ -417,7 +419,13 @@ def run_command(
|
|
|
417
419
|
|
|
418
420
|
# Run the command
|
|
419
421
|
result = subprocess.run(
|
|
420
|
-
cmd,
|
|
422
|
+
cmd,
|
|
423
|
+
check=check,
|
|
424
|
+
cwd=cwd,
|
|
425
|
+
capture_output=capture_output,
|
|
426
|
+
text=True,
|
|
427
|
+
shell=shell,
|
|
428
|
+
input=input,
|
|
421
429
|
)
|
|
422
430
|
|
|
423
431
|
# Display output if captured
|
|
@@ -429,6 +437,63 @@ def run_command(
|
|
|
429
437
|
return result
|
|
430
438
|
|
|
431
439
|
|
|
440
|
+
def is_github_authenticated() -> bool:
|
|
441
|
+
"""Check if the user is authenticated with GitHub CLI.
|
|
442
|
+
|
|
443
|
+
Returns:
|
|
444
|
+
bool: True if authenticated, False otherwise
|
|
445
|
+
"""
|
|
446
|
+
try:
|
|
447
|
+
# Try to get the current user, which will fail if not authenticated
|
|
448
|
+
result = run_command(["gh", "auth", "status"], check=False, capture_output=True)
|
|
449
|
+
return result.returncode == 0
|
|
450
|
+
except Exception:
|
|
451
|
+
return False
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
def handle_github_authentication() -> None:
|
|
455
|
+
"""Handle GitHub CLI authentication interactively."""
|
|
456
|
+
console.print("\n🔑 GitHub Authentication Required", style="bold yellow")
|
|
457
|
+
console.print("You need to authenticate with GitHub CLI to continue.")
|
|
458
|
+
console.print("Choose an authentication method:")
|
|
459
|
+
console.print("1. Login with browser")
|
|
460
|
+
console.print("2. Login with token")
|
|
461
|
+
|
|
462
|
+
choice = click.prompt(
|
|
463
|
+
"Select authentication method", type=click.Choice(["1", "2"]), default="1"
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
try:
|
|
467
|
+
if choice == "1":
|
|
468
|
+
# Browser-based authentication
|
|
469
|
+
run_command(["gh", "auth", "login", "--web"])
|
|
470
|
+
else:
|
|
471
|
+
# Token-based authentication
|
|
472
|
+
token = click.prompt(
|
|
473
|
+
"Enter your GitHub Personal Access Token", hide_input=True
|
|
474
|
+
)
|
|
475
|
+
# Use a subprocess with pipe to avoid showing the token in process list
|
|
476
|
+
process = subprocess.Popen(
|
|
477
|
+
["gh", "auth", "login", "--with-token"],
|
|
478
|
+
stdin=subprocess.PIPE,
|
|
479
|
+
stdout=subprocess.PIPE,
|
|
480
|
+
stderr=subprocess.PIPE,
|
|
481
|
+
text=True,
|
|
482
|
+
)
|
|
483
|
+
stdout, stderr = process.communicate(input=token + "\n")
|
|
484
|
+
|
|
485
|
+
if process.returncode != 0:
|
|
486
|
+
console.print(f"❌ Authentication failed: {stderr}", style="bold red")
|
|
487
|
+
raise subprocess.CalledProcessError(
|
|
488
|
+
process.returncode, ["gh", "auth", "login"], stdout, stderr
|
|
489
|
+
)
|
|
490
|
+
|
|
491
|
+
console.print("✅ Successfully authenticated with GitHub", style="green")
|
|
492
|
+
except subprocess.CalledProcessError as e:
|
|
493
|
+
console.print(f"❌ Authentication failed: {e}", style="bold red")
|
|
494
|
+
raise click.Abort() from e
|
|
495
|
+
|
|
496
|
+
|
|
432
497
|
def create_github_repository(repository_owner: str, repository_name: str) -> None:
|
|
433
498
|
"""Create GitHub repository if it doesn't exist.
|
|
434
499
|
|
src/cli/utils/gcp.py
CHANGED
|
@@ -64,7 +64,7 @@ def verify_vertex_connection(
|
|
|
64
64
|
api_endpoint=f"{location}-aiplatform.googleapis.com"
|
|
65
65
|
),
|
|
66
66
|
client_info=get_client_info(),
|
|
67
|
-
transport=
|
|
67
|
+
transport="rest",
|
|
68
68
|
)
|
|
69
69
|
request = get_dummy_request(project_id=project_id, location=location)
|
|
70
70
|
client.generate_content(request=request)
|
src/cli/utils/template.py
CHANGED
|
@@ -344,7 +344,9 @@ def process_template(
|
|
|
344
344
|
requires_data_ingestion = template_config.get("settings", {}).get(
|
|
345
345
|
"requires_data_ingestion", False
|
|
346
346
|
)
|
|
347
|
-
should_include_data_ingestion =
|
|
347
|
+
should_include_data_ingestion = (
|
|
348
|
+
include_data_ingestion or requires_data_ingestion
|
|
349
|
+
)
|
|
348
350
|
|
|
349
351
|
if should_include_data_ingestion:
|
|
350
352
|
logging.debug("3. Including data processing files")
|
|
@@ -400,7 +402,9 @@ def process_template(
|
|
|
400
402
|
requires_data_ingestion = template_config.get("settings", {}).get(
|
|
401
403
|
"requires_data_ingestion", False
|
|
402
404
|
)
|
|
403
|
-
should_include_data_ingestion =
|
|
405
|
+
should_include_data_ingestion = (
|
|
406
|
+
include_data_ingestion or requires_data_ingestion
|
|
407
|
+
)
|
|
404
408
|
|
|
405
409
|
if should_include_data_ingestion:
|
|
406
410
|
logging.debug(
|