agent-starter-pack 0.3.3__py3-none-any.whl → 0.21.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/agents/README.md +7 -0
- agents/langgraph_base_react/template/.templateconfig.yaml → agent_starter_pack/agents/adk_a2a_base/.template/templateconfig.yaml +5 -10
- agent_starter_pack/agents/adk_a2a_base/README.md +37 -0
- src/deployment_targets/cloud_run/Dockerfile → agent_starter_pack/agents/adk_a2a_base/app/__init__.py +2 -14
- agent_starter_pack/agents/adk_a2a_base/app/agent.py +70 -0
- agent_starter_pack/agents/adk_a2a_base/notebooks/adk_a2a_app_testing.ipynb +583 -0
- agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb → agent_starter_pack/agents/adk_a2a_base/notebooks/evaluating_adk_agent.ipynb +163 -199
- {agents/adk_base → agent_starter_pack/agents/adk_a2a_base}/tests/integration/test_agent.py +2 -2
- agents/adk_base/template/.templateconfig.yaml → agent_starter_pack/agents/adk_base/.template/templateconfig.yaml +4 -1
- {agents → agent_starter_pack/agents}/adk_base/README.md +1 -1
- agent_starter_pack/agents/adk_base/app/__init__.py +17 -0
- {agents → agent_starter_pack/agents}/adk_base/app/agent.py +5 -2
- {agents → agent_starter_pack/agents}/adk_base/notebooks/adk_app_testing.ipynb +128 -82
- agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb → agent_starter_pack/agents/adk_base/notebooks/evaluating_adk_agent.ipynb +181 -207
- agent_starter_pack/agents/adk_base/tests/integration/test_agent.py +58 -0
- agents/crewai_coding_crew/template/.templateconfig.yaml → agent_starter_pack/agents/adk_live/.template/templateconfig.yaml +5 -9
- agent_starter_pack/agents/adk_live/README.md +32 -0
- agent_starter_pack/agents/adk_live/app/__init__.py +17 -0
- agent_starter_pack/agents/adk_live/app/agent.py +51 -0
- agent_starter_pack/agents/adk_live/tests/unit/test_dummy.py +38 -0
- agents/agentic_rag/template/.templateconfig.yaml → agent_starter_pack/agents/agentic_rag/.template/templateconfig.yaml +7 -3
- {agents → agent_starter_pack/agents}/agentic_rag/README.md +1 -1
- agent_starter_pack/agents/agentic_rag/app/__init__.py +17 -0
- {agents → agent_starter_pack/agents}/agentic_rag/app/agent.py +8 -4
- {agents → agent_starter_pack/agents}/agentic_rag/notebooks/adk_app_testing.ipynb +128 -82
- agent_starter_pack/agents/agentic_rag/notebooks/evaluating_adk_agent.ipynb +1535 -0
- {agents → agent_starter_pack/agents}/agentic_rag/tests/integration/test_agent.py +3 -3
- agent_starter_pack/agents/langgraph_base/.template/templateconfig.yaml +31 -0
- agent_starter_pack/agents/langgraph_base/README.md +30 -0
- agent_starter_pack/agents/langgraph_base/app/__init__.py +17 -0
- agent_starter_pack/agents/langgraph_base/app/agent.py +34 -0
- {agents/crewai_coding_crew → agent_starter_pack/agents/langgraph_base}/notebooks/evaluating_langgraph_agent.ipynb +30 -17
- {agents/langgraph_base_react → agent_starter_pack/agents/langgraph_base}/tests/integration/test_agent.py +2 -2
- {src → agent_starter_pack}/base_template/.gitignore +5 -3
- agent_starter_pack/base_template/GEMINI.md +5 -0
- agent_starter_pack/base_template/Makefile +339 -0
- agent_starter_pack/base_template/README.md +267 -0
- agent_starter_pack/base_template/deployment/README.md +11 -0
- {src → agent_starter_pack}/base_template/deployment/terraform/apis.tf +2 -2
- {src → agent_starter_pack}/base_template/deployment/terraform/dev/apis.tf +6 -1
- {src → agent_starter_pack}/base_template/deployment/terraform/dev/iam.tf +12 -11
- {src → agent_starter_pack}/base_template/deployment/terraform/dev/providers.tf +5 -1
- {src → agent_starter_pack}/base_template/deployment/terraform/dev/storage.tf +1 -1
- {src → agent_starter_pack}/base_template/deployment/terraform/dev/variables.tf +10 -10
- agent_starter_pack/base_template/deployment/terraform/dev/{% if cookiecutter.is_adk %}telemetry.tf{% else %}unused_telemetry.tf{% endif %} +193 -0
- agent_starter_pack/base_template/deployment/terraform/github.tf +337 -0
- {src → agent_starter_pack}/base_template/deployment/terraform/iam.tf +20 -41
- {src → agent_starter_pack}/base_template/deployment/terraform/locals.tf +10 -3
- {src/resources/setup_cicd → agent_starter_pack/base_template/deployment/terraform}/providers.tf +8 -1
- {src → agent_starter_pack}/base_template/deployment/terraform/service_accounts.tf +7 -8
- agent_starter_pack/base_template/deployment/terraform/sql/completions.sql +138 -0
- {src → agent_starter_pack}/base_template/deployment/terraform/storage.tf +7 -16
- {src → agent_starter_pack}/base_template/deployment/terraform/variables.tf +61 -28
- {src → agent_starter_pack}/base_template/deployment/terraform/vars/env.tfvars +6 -1
- agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'github_actions' %}wif.tf{% else %}unused_wif.tf{% endif %} +43 -0
- src/base_template/deployment/terraform/build_triggers.tf → agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}build_triggers.tf{% else %}unused_build_triggers.tf{% endif %} +55 -38
- agent_starter_pack/base_template/deployment/terraform/{% if cookiecutter.is_adk %}telemetry.tf{% else %}unused_telemetry.tf{% endif %} +206 -0
- {src → agent_starter_pack}/base_template/pyproject.toml +24 -37
- agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/deploy-to-prod.yaml +132 -0
- agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/pr_checks.yaml +65 -0
- agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/staging.yaml +259 -0
- src/base_template/deployment/cd/deploy-to-prod.yaml → agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/deploy-to-prod.yaml +38 -30
- src/base_template/deployment/ci/pr_checks.yaml → agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/pr_checks.yaml +5 -5
- agent_starter_pack/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/staging.yaml +322 -0
- agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/telemetry.py +96 -0
- {src/base_template/app/utils → agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils}/typing.py +7 -9
- agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}converters{% else %}unused_converters{% endif %}/__init__.py +25 -0
- agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}converters{% else %}unused_converters{% endif %}/part_converter.py +138 -0
- agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/__init__.py +13 -0
- agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/a2a_agent_executor.py +265 -0
- agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_a2a and cookiecutter.agent_name == 'langgraph_base' %}executor{% else %}unused_executor{% endif %}/task_result_aggregator.py +152 -0
- agent_starter_pack/cli/commands/create.py +1256 -0
- agent_starter_pack/cli/commands/enhance.py +611 -0
- agent_starter_pack/cli/commands/list.py +203 -0
- agent_starter_pack/cli/commands/register_gemini_enterprise.py +1070 -0
- agent_starter_pack/cli/commands/setup_cicd.py +862 -0
- {src → agent_starter_pack}/cli/main.py +10 -2
- {src → agent_starter_pack}/cli/utils/cicd.py +139 -48
- agent_starter_pack/cli/utils/gcp.py +263 -0
- agent_starter_pack/cli/utils/logging.py +103 -0
- agent_starter_pack/cli/utils/remote_template.py +677 -0
- agent_starter_pack/cli/utils/template.py +1466 -0
- {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/process_data.py +1 -1
- {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +20 -6
- {src → agent_starter_pack}/data_ingestion/pyproject.toml +1 -0
- {src → agent_starter_pack}/data_ingestion/uv.lock +602 -494
- agent_starter_pack/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +484 -0
- agent_starter_pack/deployment_targets/agent_engine/tests/load_test/README.md +84 -0
- agent_starter_pack/deployment_targets/agent_engine/tests/load_test/load_test.py +424 -0
- agent_starter_pack/deployment_targets/agent_engine/tests/{% if cookiecutter.is_a2a %}helpers.py{% else %}unused_helpers.py{% endif %} +138 -0
- agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/agent_engine_app.py +263 -0
- agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/app_utils/deploy.py +414 -0
- agent_starter_pack/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/app_utils/{% if cookiecutter.is_adk_live %}expose_app.py{% else %}unused_expose_app.py{% endif %} +519 -0
- agent_starter_pack/deployment_targets/cloud_run/Dockerfile +51 -0
- agent_starter_pack/deployment_targets/cloud_run/deployment/terraform/dev/service.tf +243 -0
- agent_starter_pack/deployment_targets/cloud_run/deployment/terraform/service.tf +417 -0
- agent_starter_pack/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +705 -0
- agent_starter_pack/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +321 -0
- agent_starter_pack/deployment_targets/cloud_run/tests/load_test/README.md +165 -0
- agent_starter_pack/deployment_targets/cloud_run/tests/load_test/load_test.py +329 -0
- agent_starter_pack/deployment_targets/cloud_run/{{cookiecutter.agent_directory}}/fast_api_app.py +556 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/package-lock.json +79 -1044
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/package.json +1 -9
- agent_starter_pack/frontends/adk_live_react/frontend/src/App.tsx +65 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/Logger.tsx +8 -3
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/logger.scss +26 -0
- agent_starter_pack/frontends/adk_live_react/frontend/src/components/side-panel/SidePanel.tsx +516 -0
- agent_starter_pack/frontends/adk_live_react/frontend/src/components/side-panel/side-panel.scss +563 -0
- agent_starter_pack/frontends/adk_live_react/frontend/src/components/transcription-preview/TranscriptionPreview.tsx +106 -0
- agent_starter_pack/frontends/adk_live_react/frontend/src/components/transcription-preview/transcription-preview.scss +150 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-live-api.ts +8 -2
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/multimodal-live-types.ts +40 -2
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audio-recorder.ts +1 -1
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audio-streamer.ts +1 -1
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/multimodal-live-client.ts +210 -24
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/utils.ts +27 -5
- agent_starter_pack/resources/docs/adk-cheatsheet.md +1628 -0
- agent_starter_pack/resources/locks/uv-adk_a2a_base-agent_engine.lock +4966 -0
- agent_starter_pack/resources/locks/uv-adk_a2a_base-cloud_run.lock +5011 -0
- agent_starter_pack/resources/locks/uv-adk_base-agent_engine.lock +4946 -0
- agent_starter_pack/resources/locks/uv-adk_base-cloud_run.lock +4991 -0
- agent_starter_pack/resources/locks/uv-adk_live-agent_engine.lock +4963 -0
- agent_starter_pack/resources/locks/uv-adk_live-cloud_run.lock +5006 -0
- agent_starter_pack/resources/locks/uv-agentic_rag-agent_engine.lock +5487 -0
- agent_starter_pack/resources/locks/uv-agentic_rag-cloud_run.lock +5532 -0
- agent_starter_pack/resources/locks/uv-langgraph_base-agent_engine.lock +5788 -0
- agent_starter_pack/resources/locks/uv-langgraph_base-cloud_run.lock +5811 -0
- {src → agent_starter_pack}/utils/generate_locks.py +15 -12
- {src → agent_starter_pack}/utils/lock_utils.py +4 -7
- {src → agent_starter_pack}/utils/watch_and_rebuild.py +2 -2
- agent_starter_pack-0.21.0.dist-info/METADATA +182 -0
- agent_starter_pack-0.21.0.dist-info/RECORD +171 -0
- agent_starter_pack-0.21.0.dist-info/entry_points.txt +2 -0
- llm.txt +362 -0
- agent_starter_pack-0.3.3.dist-info/METADATA +0 -164
- agent_starter_pack-0.3.3.dist-info/RECORD +0 -176
- agent_starter_pack-0.3.3.dist-info/entry_points.txt +0 -2
- agents/crewai_coding_crew/README.md +0 -34
- agents/crewai_coding_crew/app/agent.py +0 -86
- agents/crewai_coding_crew/app/crew/config/agents.yaml +0 -39
- agents/crewai_coding_crew/app/crew/config/tasks.yaml +0 -37
- agents/crewai_coding_crew/app/crew/crew.py +0 -71
- agents/crewai_coding_crew/tests/integration/test_agent.py +0 -47
- agents/langgraph_base_react/README.md +0 -9
- agents/langgraph_base_react/app/agent.py +0 -73
- agents/live_api/README.md +0 -37
- agents/live_api/app/agent.py +0 -78
- agents/live_api/app/server.py +0 -196
- agents/live_api/app/templates.py +0 -51
- agents/live_api/app/vector_store.py +0 -55
- agents/live_api/template/.templateconfig.yaml +0 -29
- agents/live_api/tests/integration/test_server_e2e.py +0 -254
- agents/live_api/tests/load_test/load_test.py +0 -40
- agents/live_api/tests/unit/test_server.py +0 -143
- src/base_template/Makefile +0 -72
- src/base_template/README.md +0 -208
- src/base_template/app/__init__.py +0 -3
- src/base_template/app/utils/tracing.py +0 -155
- src/base_template/deployment/README.md +0 -126
- src/base_template/deployment/cd/staging.yaml +0 -216
- src/base_template/deployment/terraform/dev/log_sinks.tf +0 -63
- src/base_template/deployment/terraform/log_sinks.tf +0 -70
- src/base_template/deployment/terraform/providers.tf +0 -37
- src/cli/commands/create.py +0 -664
- src/cli/commands/setup_cicd.py +0 -829
- src/cli/utils/gcp.py +0 -117
- src/cli/utils/logging.py +0 -51
- src/cli/utils/template.py +0 -737
- src/deployment_targets/agent_engine/app/agent_engine_app.py +0 -336
- src/deployment_targets/agent_engine/notebooks/intro_agent_engine.ipynb +0 -1025
- src/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +0 -183
- src/deployment_targets/agent_engine/tests/load_test/README.md +0 -42
- src/deployment_targets/agent_engine/tests/load_test/load_test.py +0 -107
- src/deployment_targets/cloud_run/app/server.py +0 -154
- src/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +0 -249
- src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
- src/deployment_targets/cloud_run/tests/load_test/README.md +0 -83
- src/deployment_targets/cloud_run/tests/load_test/load_test.py +0 -118
- src/deployment_targets/cloud_run/uv.lock +0 -6952
- src/frontends/live_api_react/frontend/src/App.tsx +0 -205
- src/frontends/live_api_react/frontend/src/components/control-tray/ControlTray.tsx +0 -217
- src/frontends/live_api_react/frontend/src/components/control-tray/control-tray.scss +0 -201
- src/frontends/live_api_react/frontend/src/components/side-panel/SidePanel.tsx +0 -161
- src/frontends/live_api_react/frontend/src/components/side-panel/side-panel.scss +0 -285
- src/frontends/streamlit/frontend/side_bar.py +0 -214
- src/frontends/streamlit/frontend/streamlit_app.py +0 -265
- src/frontends/streamlit/frontend/style/app_markdown.py +0 -37
- src/frontends/streamlit/frontend/utils/chat_utils.py +0 -67
- src/frontends/streamlit/frontend/utils/local_chat_history.py +0 -125
- src/frontends/streamlit/frontend/utils/message_editing.py +0 -59
- src/frontends/streamlit/frontend/utils/multimodal_utils.py +0 -217
- src/frontends/streamlit/frontend/utils/stream_handler.py +0 -301
- src/frontends/streamlit/frontend/utils/title_summary.py +0 -94
- src/frontends/streamlit_adk/frontend/side_bar.py +0 -214
- src/frontends/streamlit_adk/frontend/streamlit_app.py +0 -314
- src/frontends/streamlit_adk/frontend/style/app_markdown.py +0 -37
- src/frontends/streamlit_adk/frontend/utils/chat_utils.py +0 -84
- src/frontends/streamlit_adk/frontend/utils/local_chat_history.py +0 -110
- src/frontends/streamlit_adk/frontend/utils/message_editing.py +0 -61
- src/frontends/streamlit_adk/frontend/utils/multimodal_utils.py +0 -223
- src/frontends/streamlit_adk/frontend/utils/stream_handler.py +0 -311
- src/frontends/streamlit_adk/frontend/utils/title_summary.py +0 -129
- src/resources/containers/data_processing/Dockerfile +0 -27
- src/resources/containers/e2e-tests/Dockerfile +0 -19
- src/resources/idx/.idx/dev.nix +0 -57
- src/resources/idx/idx-template.json +0 -21
- src/resources/idx/idx-template.nix +0 -26
- src/resources/locks/uv-adk_base-agent_engine.lock +0 -5338
- src/resources/locks/uv-adk_base-cloud_run.lock +0 -5930
- src/resources/locks/uv-agentic_rag-agent_engine.lock +0 -5528
- src/resources/locks/uv-agentic_rag-cloud_run.lock +0 -6120
- src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +0 -6231
- src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +0 -6839
- src/resources/locks/uv-langgraph_base_react-agent_engine.lock +0 -5233
- src/resources/locks/uv-langgraph_base_react-cloud_run.lock +0 -5862
- src/resources/locks/uv-live_api-cloud_run.lock +0 -5832
- src/resources/setup_cicd/cicd_variables.tf +0 -41
- src/resources/setup_cicd/github.tf +0 -87
- {agents → agent_starter_pack/agents}/agentic_rag/app/retrievers.py +0 -0
- {agents → agent_starter_pack/agents}/agentic_rag/app/templates.py +0 -0
- {src → agent_starter_pack}/base_template/deployment/terraform/dev/vars/env.tfvars +0 -0
- {src → agent_starter_pack}/base_template/tests/unit/test_dummy.py +0 -0
- {src/deployment_targets/agent_engine/app/utils → agent_starter_pack/base_template/{{cookiecutter.agent_directory}}/app_utils}/gcs.py +0 -0
- {src → agent_starter_pack}/cli/utils/__init__.py +0 -0
- {src → agent_starter_pack}/cli/utils/datastores.py +0 -0
- {src → agent_starter_pack}/cli/utils/version.py +0 -0
- {src → agent_starter_pack}/data_ingestion/README.md +0 -0
- {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +0 -0
- {src → agent_starter_pack}/data_ingestion/data_ingestion_pipeline/pipeline.py +0 -0
- {src → agent_starter_pack}/deployment_targets/agent_engine/deployment_metadata.json +0 -0
- {src → agent_starter_pack}/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/favicon.ico +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/index.html +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/public/robots.txt +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/App.scss +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/App.test.tsx +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/audio-pulse/AudioPulse.tsx +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/audio-pulse/audio-pulse.scss +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/components/logger/mock-logs.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/contexts/LiveAPIContext.tsx +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-media-stream-mux.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-screen-capture.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/hooks/use-webcam.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/index.css +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/index.tsx +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/react-app-env.d.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/reportWebVitals.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/setupTests.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/audioworklet-registry.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/store-logger.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/worklets/audio-processing.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/src/utils/worklets/vol-meter.ts +0 -0
- {src/frontends/live_api_react → agent_starter_pack/frontends/adk_live_react}/frontend/tsconfig.json +0 -0
- {agent_starter_pack-0.3.3.dist-info → agent_starter_pack-0.21.0.dist-info}/WHEEL +0 -0
- {agent_starter_pack-0.3.3.dist-info → agent_starter_pack-0.21.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -13,11 +13,15 @@
|
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
15
|
import importlib.metadata
|
|
16
|
+
import sys
|
|
16
17
|
|
|
17
18
|
import click
|
|
18
19
|
from rich.console import Console
|
|
19
20
|
|
|
20
21
|
from .commands.create import create
|
|
22
|
+
from .commands.enhance import enhance
|
|
23
|
+
from .commands.list import list_agents
|
|
24
|
+
from .commands.register_gemini_enterprise import register_gemini_enterprise
|
|
21
25
|
from .commands.setup_cicd import setup_cicd
|
|
22
26
|
from .utils import display_update_message
|
|
23
27
|
|
|
@@ -46,13 +50,17 @@ def print_version(ctx: click.Context, param: click.Parameter, value: bool) -> No
|
|
|
46
50
|
help="Show the version and exit.",
|
|
47
51
|
)
|
|
48
52
|
def cli() -> None:
|
|
49
|
-
# Check for updates at startup
|
|
50
|
-
|
|
53
|
+
# Check for updates at startup (skip if --agent-garden, -ag, or --locked is used)
|
|
54
|
+
if not any(flag in sys.argv for flag in ("--agent-garden", "-ag", "--locked")):
|
|
55
|
+
display_update_message()
|
|
51
56
|
|
|
52
57
|
|
|
53
58
|
# Register commands
|
|
54
59
|
cli.add_command(create)
|
|
60
|
+
cli.add_command(enhance)
|
|
61
|
+
cli.add_command(register_gemini_enterprise)
|
|
55
62
|
cli.add_command(setup_cicd)
|
|
63
|
+
cli.add_command(list_agents, name="list")
|
|
56
64
|
|
|
57
65
|
|
|
58
66
|
if __name__ == "__main__":
|
|
@@ -89,11 +89,7 @@ def setup_repository_name(
|
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
def create_github_connection(
|
|
92
|
-
project_id: str,
|
|
93
|
-
region: str,
|
|
94
|
-
connection_name: str,
|
|
95
|
-
repository_name: str,
|
|
96
|
-
repository_owner: str,
|
|
92
|
+
project_id: str, region: str, connection_name: str
|
|
97
93
|
) -> tuple[str, str]:
|
|
98
94
|
"""Create and verify GitHub connection using gcloud command.
|
|
99
95
|
|
|
@@ -101,52 +97,132 @@ def create_github_connection(
|
|
|
101
97
|
project_id: GCP project ID
|
|
102
98
|
region: GCP region
|
|
103
99
|
connection_name: Name for the GitHub connection
|
|
104
|
-
repository_name: Name of repository to create
|
|
105
|
-
repository_owner: Owner of repository
|
|
106
100
|
|
|
107
101
|
Returns:
|
|
108
102
|
tuple[str, str]: The OAuth token secret ID and the app installation ID
|
|
109
103
|
"""
|
|
110
104
|
console.print("\n🔗 Creating GitHub connection...")
|
|
111
105
|
|
|
112
|
-
#
|
|
106
|
+
# First, ensure required APIs are enabled
|
|
107
|
+
console.print("🔧 Ensuring required APIs are enabled...")
|
|
113
108
|
try:
|
|
114
|
-
#
|
|
115
|
-
|
|
109
|
+
# Enable Cloud Build API
|
|
110
|
+
run_command(
|
|
116
111
|
[
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
120
|
-
|
|
121
|
-
"--
|
|
122
|
-
|
|
112
|
+
"gcloud",
|
|
113
|
+
"services",
|
|
114
|
+
"enable",
|
|
115
|
+
"cloudbuild.googleapis.com",
|
|
116
|
+
"--project",
|
|
117
|
+
project_id,
|
|
123
118
|
],
|
|
124
119
|
capture_output=True,
|
|
125
|
-
check=False,
|
|
120
|
+
check=False, # Don't fail if already enabled
|
|
126
121
|
)
|
|
122
|
+
console.print("✅ Cloud Build API enabled")
|
|
127
123
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
124
|
+
# Enable Secret Manager API
|
|
125
|
+
run_command(
|
|
126
|
+
[
|
|
127
|
+
"gcloud",
|
|
128
|
+
"services",
|
|
129
|
+
"enable",
|
|
130
|
+
"secretmanager.googleapis.com",
|
|
131
|
+
"--project",
|
|
132
|
+
project_id,
|
|
133
|
+
],
|
|
134
|
+
capture_output=True,
|
|
135
|
+
check=False, # Don't fail if already enabled
|
|
136
|
+
)
|
|
137
|
+
console.print("✅ Secret Manager API enabled")
|
|
138
|
+
|
|
139
|
+
# Wait for the APIs to fully initialize and create the service account
|
|
140
|
+
console.print(
|
|
141
|
+
"⏳ Waiting for Cloud Build service account to be created (this typically takes 5-10 seconds)..."
|
|
142
|
+
)
|
|
143
|
+
time.sleep(10)
|
|
147
144
|
except subprocess.CalledProcessError as e:
|
|
148
|
-
console.print(f"
|
|
149
|
-
|
|
145
|
+
console.print(f"⚠️ Could not enable required APIs: {e}", style="yellow")
|
|
146
|
+
|
|
147
|
+
# Get the Cloud Build service account and grant permissions with retry logic
|
|
148
|
+
try:
|
|
149
|
+
project_number_result = run_command(
|
|
150
|
+
[
|
|
151
|
+
"gcloud",
|
|
152
|
+
"projects",
|
|
153
|
+
"describe",
|
|
154
|
+
project_id,
|
|
155
|
+
"--format=value(projectNumber)",
|
|
156
|
+
],
|
|
157
|
+
capture_output=True,
|
|
158
|
+
check=True,
|
|
159
|
+
)
|
|
160
|
+
project_number = project_number_result.stdout.strip()
|
|
161
|
+
cloud_build_sa = (
|
|
162
|
+
f"service-{project_number}@gcp-sa-cloudbuild.iam.gserviceaccount.com"
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
console.print(
|
|
166
|
+
"🔧 Granting Secret Manager permissions to Cloud Build service account..."
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
# Try to grant permissions with retry logic
|
|
170
|
+
max_retries = 3
|
|
171
|
+
for attempt in range(max_retries):
|
|
172
|
+
try:
|
|
173
|
+
# Grant Secret Manager Admin role to Cloud Build service account
|
|
174
|
+
result = run_command(
|
|
175
|
+
[
|
|
176
|
+
"gcloud",
|
|
177
|
+
"projects",
|
|
178
|
+
"add-iam-policy-binding",
|
|
179
|
+
project_id,
|
|
180
|
+
f"--member=serviceAccount:{cloud_build_sa}",
|
|
181
|
+
"--role=roles/secretmanager.admin",
|
|
182
|
+
"--condition=None",
|
|
183
|
+
],
|
|
184
|
+
capture_output=True,
|
|
185
|
+
check=True,
|
|
186
|
+
)
|
|
187
|
+
console.print(
|
|
188
|
+
"✅ Secret Manager permissions granted to Cloud Build service account"
|
|
189
|
+
)
|
|
190
|
+
break
|
|
191
|
+
except subprocess.CalledProcessError as e:
|
|
192
|
+
if "does not exist" in str(e.stderr) and attempt < max_retries - 1:
|
|
193
|
+
console.print(
|
|
194
|
+
f"⚠️ Service account not ready yet (attempt {attempt + 1}/{max_retries}). Retrying in 10 seconds...",
|
|
195
|
+
style="yellow",
|
|
196
|
+
)
|
|
197
|
+
time.sleep(10)
|
|
198
|
+
elif attempt < max_retries - 1:
|
|
199
|
+
console.print(
|
|
200
|
+
f"⚠️ Failed to grant permissions (attempt {attempt + 1}/{max_retries}). Retrying in 5 seconds...",
|
|
201
|
+
style="yellow",
|
|
202
|
+
)
|
|
203
|
+
time.sleep(5)
|
|
204
|
+
else:
|
|
205
|
+
console.print(
|
|
206
|
+
f"⚠️ Could not grant Secret Manager permissions after {max_retries} attempts",
|
|
207
|
+
style="yellow",
|
|
208
|
+
)
|
|
209
|
+
console.print(
|
|
210
|
+
"You may need to manually grant the permissions if the connection creation fails."
|
|
211
|
+
)
|
|
212
|
+
# Don't fail here, let the connection creation attempt proceed
|
|
213
|
+
|
|
214
|
+
# Wait for IAM changes to propagate
|
|
215
|
+
console.print(
|
|
216
|
+
"⏳ Waiting for IAM permissions to propagate (this typically takes 5-10 seconds)..."
|
|
217
|
+
)
|
|
218
|
+
time.sleep(10) # Give IAM time to propagate before proceeding
|
|
219
|
+
except subprocess.CalledProcessError as e:
|
|
220
|
+
console.print(
|
|
221
|
+
f"⚠️ Could not setup Cloud Build service account: {e}", style="yellow"
|
|
222
|
+
)
|
|
223
|
+
console.print(
|
|
224
|
+
"You may need to manually grant the permissions if the connection creation fails."
|
|
225
|
+
)
|
|
150
226
|
|
|
151
227
|
def try_create_connection() -> subprocess.CompletedProcess[str]:
|
|
152
228
|
cmd = [
|
|
@@ -170,6 +246,7 @@ def create_github_connection(
|
|
|
170
246
|
stdout=subprocess.PIPE,
|
|
171
247
|
stderr=subprocess.PIPE,
|
|
172
248
|
text=True,
|
|
249
|
+
encoding="utf-8",
|
|
173
250
|
)
|
|
174
251
|
|
|
175
252
|
# Send 'y' followed by enter key to handle both the API enablement prompt and any other prompts
|
|
@@ -257,7 +334,10 @@ def create_github_connection(
|
|
|
257
334
|
return secret_id, app_installation_id
|
|
258
335
|
elif status == "PENDING_USER_OAUTH" or status == "PENDING_INSTALL_APP":
|
|
259
336
|
if attempt < max_retries - 1: # Don't print waiting on last attempt
|
|
260
|
-
console.print("⏳ Waiting for
|
|
337
|
+
console.print("⏳ Waiting for authorization...")
|
|
338
|
+
print(
|
|
339
|
+
f"Console: https://console.cloud.google.com/cloud-build/repositories?project={project_id}"
|
|
340
|
+
)
|
|
261
341
|
# Extract and print the action URI for user authentication
|
|
262
342
|
try:
|
|
263
343
|
action_uri = (
|
|
@@ -270,9 +350,9 @@ def create_github_connection(
|
|
|
270
350
|
"\n🔑 Authentication Required:", style="bold yellow"
|
|
271
351
|
)
|
|
272
352
|
console.print(
|
|
273
|
-
f"Please visit [link={action_uri}]this page[/link] to authenticate Cloud Build with GitHub:"
|
|
353
|
+
f"Please visit [link={action_uri}][bold blue]this page[/bold blue][/link] to authenticate Cloud Build with GitHub:"
|
|
274
354
|
)
|
|
275
|
-
|
|
355
|
+
print(f"\n{action_uri}\n")
|
|
276
356
|
console.print(
|
|
277
357
|
"(Copy and paste the link into your browser if clicking doesn't work)"
|
|
278
358
|
)
|
|
@@ -305,12 +385,12 @@ class ProjectConfig:
|
|
|
305
385
|
cicd_project_id: str
|
|
306
386
|
agent: str
|
|
307
387
|
deployment_target: str
|
|
388
|
+
repository_name: str
|
|
389
|
+
repository_owner: str
|
|
308
390
|
region: str = "us-central1"
|
|
309
391
|
dev_project_id: str | None = None
|
|
310
392
|
project_name: str | None = None
|
|
311
|
-
|
|
312
|
-
repository_owner: str | None = None
|
|
313
|
-
repository_exists: bool | None = None
|
|
393
|
+
create_repository: bool | None = None
|
|
314
394
|
host_connection_name: str | None = None
|
|
315
395
|
github_pat: str | None = None
|
|
316
396
|
github_app_installation_id: str | None = None
|
|
@@ -447,6 +527,7 @@ def run_command(
|
|
|
447
527
|
capture_output: bool = False,
|
|
448
528
|
shell: bool = False,
|
|
449
529
|
input: str | None = None,
|
|
530
|
+
env_vars: dict[str, str] | None = None,
|
|
450
531
|
) -> subprocess.CompletedProcess:
|
|
451
532
|
"""Run a command and display it to the user"""
|
|
452
533
|
# Format command for display
|
|
@@ -455,6 +536,14 @@ def run_command(
|
|
|
455
536
|
if cwd:
|
|
456
537
|
print(f"📂 In directory: {cwd}")
|
|
457
538
|
|
|
539
|
+
# Prepare environment variables
|
|
540
|
+
env = None
|
|
541
|
+
if env_vars:
|
|
542
|
+
import os
|
|
543
|
+
|
|
544
|
+
env = os.environ.copy()
|
|
545
|
+
env.update(env_vars)
|
|
546
|
+
|
|
458
547
|
# Run the command
|
|
459
548
|
result = subprocess.run(
|
|
460
549
|
cmd,
|
|
@@ -464,6 +553,7 @@ def run_command(
|
|
|
464
553
|
text=True,
|
|
465
554
|
shell=shell,
|
|
466
555
|
input=input,
|
|
556
|
+
env=env,
|
|
467
557
|
)
|
|
468
558
|
|
|
469
559
|
# Display output if captured
|
|
@@ -517,6 +607,7 @@ def handle_github_authentication() -> None:
|
|
|
517
607
|
stdout=subprocess.PIPE,
|
|
518
608
|
stderr=subprocess.PIPE,
|
|
519
609
|
text=True,
|
|
610
|
+
encoding="utf-8",
|
|
520
611
|
)
|
|
521
612
|
stdout, stderr = process.communicate(input=token + "\n")
|
|
522
613
|
|
|
@@ -607,7 +698,7 @@ class E2EDeployment:
|
|
|
607
698
|
project_dir / "deployment" / "terraform" / "dev" / "vars" / "env.tfvars"
|
|
608
699
|
)
|
|
609
700
|
|
|
610
|
-
with open(tf_vars_path) as f:
|
|
701
|
+
with open(tf_vars_path, encoding="utf-8") as f:
|
|
611
702
|
content = f.read()
|
|
612
703
|
|
|
613
704
|
# Replace dev project ID
|
|
@@ -622,7 +713,7 @@ class E2EDeployment:
|
|
|
622
713
|
project_dir / "deployment" / "terraform" / "vars" / "env.tfvars"
|
|
623
714
|
)
|
|
624
715
|
|
|
625
|
-
with open(tf_vars_path) as f:
|
|
716
|
+
with open(tf_vars_path, encoding="utf-8") as f:
|
|
626
717
|
content = f.read()
|
|
627
718
|
|
|
628
719
|
# Replace all project IDs
|
|
@@ -655,7 +746,7 @@ class E2EDeployment:
|
|
|
655
746
|
)
|
|
656
747
|
|
|
657
748
|
# Write updated content
|
|
658
|
-
with open(tf_vars_path, "w") as f:
|
|
749
|
+
with open(tf_vars_path, "w", encoding="utf-8") as f:
|
|
659
750
|
f.write(content)
|
|
660
751
|
|
|
661
752
|
def setup_terraform_state(self, project_dir: Path, env: Environment) -> None:
|
|
@@ -709,7 +800,7 @@ class E2EDeployment:
|
|
|
709
800
|
state_prefix = "dev" if is_dev_dir else "prod"
|
|
710
801
|
|
|
711
802
|
backend_file = tf_dir / "backend.tf"
|
|
712
|
-
with open(backend_file, "w") as f:
|
|
803
|
+
with open(backend_file, "w", encoding="utf-8") as f:
|
|
713
804
|
f.write(f'''terraform {{
|
|
714
805
|
backend "gcs" {{
|
|
715
806
|
bucket = "{bucket_name}"
|
|
@@ -0,0 +1,263 @@
|
|
|
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
|
+
# ruff: noqa: E722
|
|
16
|
+
import os
|
|
17
|
+
import subprocess
|
|
18
|
+
import time
|
|
19
|
+
|
|
20
|
+
# Suppress gRPC verbose logging
|
|
21
|
+
os.environ["GRPC_VERBOSITY"] = "NONE"
|
|
22
|
+
|
|
23
|
+
import google.auth
|
|
24
|
+
from google.api_core.client_options import ClientOptions
|
|
25
|
+
from google.api_core.exceptions import PermissionDenied
|
|
26
|
+
from google.api_core.gapic_v1.client_info import ClientInfo
|
|
27
|
+
from google.cloud.aiplatform import initializer
|
|
28
|
+
from google.cloud.aiplatform_v1beta1.services.prediction_service import (
|
|
29
|
+
PredictionServiceClient,
|
|
30
|
+
)
|
|
31
|
+
from google.cloud.aiplatform_v1beta1.types.prediction_service import (
|
|
32
|
+
CountTokensRequest,
|
|
33
|
+
)
|
|
34
|
+
from rich.console import Console
|
|
35
|
+
from rich.prompt import Confirm
|
|
36
|
+
|
|
37
|
+
from agent_starter_pack.cli.utils.version import PACKAGE_NAME, get_current_version
|
|
38
|
+
|
|
39
|
+
console = Console()
|
|
40
|
+
|
|
41
|
+
_AUTH_ERROR_MESSAGE = (
|
|
42
|
+
"Looks like you are not authenticated with Google Cloud.\n"
|
|
43
|
+
"Please run: `gcloud auth login --update-adc`\n"
|
|
44
|
+
"Then set your project: `gcloud config set project YOUR_PROJECT_ID`"
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def enable_vertex_ai_api(
|
|
49
|
+
project_id: str, auto_approve: bool = False, context: str | None = None
|
|
50
|
+
) -> bool:
|
|
51
|
+
"""Enable Vertex AI API with user confirmation and propagation waiting."""
|
|
52
|
+
api_name = "aiplatform.googleapis.com"
|
|
53
|
+
|
|
54
|
+
# First test if API is already working with a direct connection
|
|
55
|
+
if _test_vertex_ai_connection(project_id, context=context):
|
|
56
|
+
return True
|
|
57
|
+
|
|
58
|
+
if not auto_approve:
|
|
59
|
+
console.print(
|
|
60
|
+
f"Vertex AI API is not enabled in project '{project_id}'.", style="yellow"
|
|
61
|
+
)
|
|
62
|
+
console.print(
|
|
63
|
+
"To continue, we need to enable the Vertex AI API.", style="yellow"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
if not Confirm.ask(
|
|
67
|
+
"Do you want to enable the Vertex AI API now?", default=True
|
|
68
|
+
):
|
|
69
|
+
return False
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
console.print("Enabling Vertex AI API...")
|
|
73
|
+
subprocess.run(
|
|
74
|
+
[
|
|
75
|
+
"gcloud",
|
|
76
|
+
"services",
|
|
77
|
+
"enable",
|
|
78
|
+
api_name,
|
|
79
|
+
"--project",
|
|
80
|
+
project_id,
|
|
81
|
+
],
|
|
82
|
+
check=True,
|
|
83
|
+
capture_output=True,
|
|
84
|
+
text=True,
|
|
85
|
+
)
|
|
86
|
+
console.print("✓ Vertex AI API enabled successfully")
|
|
87
|
+
|
|
88
|
+
# Wait for API propagation
|
|
89
|
+
console.print("⏳ Waiting for API availability to propagate...")
|
|
90
|
+
max_wait_time = 180 # 3 minutes
|
|
91
|
+
check_interval = 10 # 10 seconds
|
|
92
|
+
start_time = time.time()
|
|
93
|
+
|
|
94
|
+
while time.time() - start_time < max_wait_time:
|
|
95
|
+
if _test_vertex_ai_connection(project_id, context=context):
|
|
96
|
+
console.print("✓ Vertex AI API is now available")
|
|
97
|
+
return True
|
|
98
|
+
time.sleep(check_interval)
|
|
99
|
+
console.print("⏳ Still waiting for API propagation...")
|
|
100
|
+
|
|
101
|
+
console.print(
|
|
102
|
+
"⚠️ API propagation took longer than expected, but continuing...",
|
|
103
|
+
style="yellow",
|
|
104
|
+
)
|
|
105
|
+
return True
|
|
106
|
+
|
|
107
|
+
except subprocess.CalledProcessError as e:
|
|
108
|
+
console.print(f"Failed to enable Vertex AI API: {e.stderr}", style="bold red")
|
|
109
|
+
return False
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _test_vertex_ai_connection(
|
|
113
|
+
project_id: str, location: str = "us-central1", context: str | None = None
|
|
114
|
+
) -> bool:
|
|
115
|
+
"""Test Vertex AI connection without raising exceptions."""
|
|
116
|
+
try:
|
|
117
|
+
credentials, _ = google.auth.default()
|
|
118
|
+
client = PredictionServiceClient(
|
|
119
|
+
credentials=credentials,
|
|
120
|
+
client_options=ClientOptions(
|
|
121
|
+
api_endpoint=f"{location}-aiplatform.googleapis.com"
|
|
122
|
+
),
|
|
123
|
+
client_info=get_client_info(context),
|
|
124
|
+
transport=initializer.global_config._api_transport,
|
|
125
|
+
)
|
|
126
|
+
request = get_dummy_request(project_id=project_id)
|
|
127
|
+
client.count_tokens(request=request)
|
|
128
|
+
return True
|
|
129
|
+
except Exception:
|
|
130
|
+
return False
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def get_user_agent(context: str | None = None) -> str:
|
|
134
|
+
"""Returns a custom user agent string."""
|
|
135
|
+
version = get_current_version()
|
|
136
|
+
prefix = "ag" if context == "agent-garden" else ""
|
|
137
|
+
return f"{prefix}{version}-{PACKAGE_NAME}/{prefix}{version}-{PACKAGE_NAME}"
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def get_client_info(context: str | None = None) -> ClientInfo:
|
|
141
|
+
"""Returns ClientInfo with custom user agent."""
|
|
142
|
+
user_agent = get_user_agent(context)
|
|
143
|
+
return ClientInfo(client_library_version=user_agent, user_agent=user_agent)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def get_dummy_request(project_id: str) -> CountTokensRequest:
|
|
147
|
+
"""Creates a simple test request for Gemini."""
|
|
148
|
+
return CountTokensRequest(
|
|
149
|
+
contents=[{"role": "user", "parts": [{"text": "Hi"}]}],
|
|
150
|
+
endpoint=f"projects/{project_id}/locations/global/publishers/google/models/gemini-2.5-flash",
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def verify_vertex_connection(
|
|
155
|
+
project_id: str,
|
|
156
|
+
location: str = "us-central1",
|
|
157
|
+
auto_approve: bool = False,
|
|
158
|
+
context: str | None = None,
|
|
159
|
+
) -> None:
|
|
160
|
+
"""Verifies Vertex AI connection with a test Gemini request."""
|
|
161
|
+
# First try direct connection - if it works, we're done
|
|
162
|
+
if _test_vertex_ai_connection(project_id, location, context):
|
|
163
|
+
return
|
|
164
|
+
|
|
165
|
+
# If that failed, try to enable the API
|
|
166
|
+
if not enable_vertex_ai_api(project_id, auto_approve, context):
|
|
167
|
+
raise Exception("Vertex AI API is not enabled and user declined to enable it")
|
|
168
|
+
|
|
169
|
+
# After enabling, test again with proper error handling
|
|
170
|
+
credentials, _ = google.auth.default()
|
|
171
|
+
client = PredictionServiceClient(
|
|
172
|
+
credentials=credentials,
|
|
173
|
+
client_options=ClientOptions(
|
|
174
|
+
api_endpoint=f"{location}-aiplatform.googleapis.com"
|
|
175
|
+
),
|
|
176
|
+
client_info=get_client_info(context),
|
|
177
|
+
transport=initializer.global_config._api_transport,
|
|
178
|
+
)
|
|
179
|
+
request = get_dummy_request(project_id=project_id)
|
|
180
|
+
|
|
181
|
+
try:
|
|
182
|
+
client.count_tokens(request=request)
|
|
183
|
+
except PermissionDenied as e:
|
|
184
|
+
error_message = str(e)
|
|
185
|
+
# Check if the error is specifically about API not being enabled
|
|
186
|
+
if (
|
|
187
|
+
"has not been used" in error_message
|
|
188
|
+
and "aiplatform.googleapis.com" in error_message
|
|
189
|
+
):
|
|
190
|
+
# This shouldn't happen since we checked above, but handle it gracefully
|
|
191
|
+
console.print(
|
|
192
|
+
"⚠️ API may still be propagating, retrying in 30 seconds...",
|
|
193
|
+
style="yellow",
|
|
194
|
+
)
|
|
195
|
+
time.sleep(30)
|
|
196
|
+
try:
|
|
197
|
+
client.count_tokens(request=request)
|
|
198
|
+
except PermissionDenied:
|
|
199
|
+
raise Exception(
|
|
200
|
+
"Vertex AI API is enabled but not yet available. Please wait a few more minutes and try again."
|
|
201
|
+
) from e
|
|
202
|
+
else:
|
|
203
|
+
# Re-raise other permission errors
|
|
204
|
+
raise
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def verify_credentials() -> dict:
|
|
208
|
+
"""Verify GCP credentials and return current project and account."""
|
|
209
|
+
try:
|
|
210
|
+
# Get credentials and project
|
|
211
|
+
credentials, project = google.auth.default()
|
|
212
|
+
|
|
213
|
+
# Try multiple methods to get account email
|
|
214
|
+
account = None
|
|
215
|
+
|
|
216
|
+
# Method 1: Try _account attribute
|
|
217
|
+
if hasattr(credentials, "_account"):
|
|
218
|
+
account = credentials._account
|
|
219
|
+
|
|
220
|
+
# Method 2: Try service_account_email
|
|
221
|
+
if not account and hasattr(credentials, "service_account_email"):
|
|
222
|
+
account = credentials.service_account_email
|
|
223
|
+
|
|
224
|
+
# Method 3: Try getting from token info if available
|
|
225
|
+
if not account and hasattr(credentials, "id_token"):
|
|
226
|
+
try:
|
|
227
|
+
import jwt
|
|
228
|
+
|
|
229
|
+
decoded = jwt.decode(
|
|
230
|
+
credentials.id_token, options={"verify_signature": False}
|
|
231
|
+
)
|
|
232
|
+
account = decoded.get("email")
|
|
233
|
+
except:
|
|
234
|
+
pass
|
|
235
|
+
|
|
236
|
+
# Method 4: Try getting from gcloud config as fallback
|
|
237
|
+
if not account:
|
|
238
|
+
try:
|
|
239
|
+
result = subprocess.run(
|
|
240
|
+
["gcloud", "config", "get-value", "account"],
|
|
241
|
+
capture_output=True,
|
|
242
|
+
text=True,
|
|
243
|
+
)
|
|
244
|
+
account = result.stdout.strip()
|
|
245
|
+
except:
|
|
246
|
+
pass
|
|
247
|
+
|
|
248
|
+
# Fallback if all methods fail
|
|
249
|
+
if not account:
|
|
250
|
+
account = "Unknown account"
|
|
251
|
+
|
|
252
|
+
return {"project": project, "account": account}
|
|
253
|
+
except google.auth.exceptions.DefaultCredentialsError as e:
|
|
254
|
+
# Authentication error - provide friendly message
|
|
255
|
+
raise Exception(_AUTH_ERROR_MESSAGE) from e
|
|
256
|
+
except Exception as e:
|
|
257
|
+
# Check if the error message indicates authentication issues
|
|
258
|
+
error_str = str(e).lower()
|
|
259
|
+
if any(
|
|
260
|
+
keyword in error_str for keyword in ["credential", "auth", "login", "token"]
|
|
261
|
+
):
|
|
262
|
+
raise Exception(_AUTH_ERROR_MESSAGE) from e
|
|
263
|
+
raise Exception(f"Failed to verify GCP credentials: {e!s}") from e
|