agent-starter-pack 0.12.1__tar.gz → 0.13.0__tar.gz
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.13.0/.claude/settings.local.json +16 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/GEMINI.md +49 -9
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/PKG-INFO +1 -1
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/pyproject.toml +1 -1
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/Makefile +18 -6
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/README.md +13 -48
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/commands/create.py +54 -58
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/commands/list.py +59 -25
- agent_starter_pack-0.13.0/src/cli/utils/gcp.py +238 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/utils/remote_template.py +170 -3
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/utils/template.py +72 -1
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/Dockerfile +16 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/{{cookiecutter.agent_directory}}/server.py +49 -1
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/App.tsx +3 -2
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/multimodal-live-client.ts +3 -1
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cicd/scripts/delete_alloydb_clusters.py +191 -7
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cli/commands/test_create.py +4 -7
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cli/commands/test_enhance.py +1 -1
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cli/utils/test_remote_template.py +6 -2
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/uv.lock +1 -1
- agent_starter_pack-0.12.1/.claude/settings.local.json +0 -10
- agent_starter_pack-0.12.1/src/cli/utils/gcp.py +0 -117
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/cd/test_e2e.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/ci/build_use_wheel.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/ci/lint.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/ci/lint_templated_agents.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test_makefile.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test_pipeline_parity.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test_remote_template.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/ci/test_templated_agents.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/apis.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/build_triggers.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/service_account.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/storage.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.cloudbuild/terraform/variables.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.github/workflows/docs.yml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/.gitignore +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/CLAUDE.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/CODE_OF_CONDUCT.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/CONTRIBUTING.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/LICENSE +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/Makefile +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/adk_base/.template/templateconfig.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/adk_base/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/adk_base/app/__init__.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/adk_base/app/agent.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/adk_base/notebooks/adk_app_testing.ipynb +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/adk_base/notebooks/evaluating_adk_agent.ipynb +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/adk_base/tests/integration/test_agent.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/agentic_rag/.template/templateconfig.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/agentic_rag/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/agentic_rag/app/__init__.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/agentic_rag/app/agent.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/agentic_rag/app/retrievers.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/agentic_rag/app/templates.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/agentic_rag/notebooks/adk_app_testing.ipynb +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/agentic_rag/notebooks/evaluating_adk_agent.ipynb +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/agentic_rag/tests/integration/test_agent.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/.template/templateconfig.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/app/agent.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/app/crew/config/agents.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/app/crew/config/tasks.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/app/crew/crew.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/notebooks/evaluating_langgraph_agent.ipynb +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/crewai_coding_crew/tests/integration/test_agent.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/.template/templateconfig.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/app/agent.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/langgraph_base_react/tests/integration/test_agent.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/live_api/.template/templateconfig.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/live_api/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/live_api/app/agent.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/live_api/tests/integration/test_server_e2e.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/live_api/tests/load_test/load_test.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/agents/live_api/tests/unit/test_server.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/.vitepress/config.js +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/agents/overview.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/cli/create.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/cli/enhance.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/cli/index.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/cli/list.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/cli/setup_cicd.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/data-ingestion.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/deploy-ui.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/deployment.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/development-guide.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/getting-started.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/installation.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/observability.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/template-config-reference.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/troubleshooting.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/video-tutorials.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/guide/why_starter_pack.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/adk_gemini_fullstack.gif +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/adk_gemini_fullstack_architecture.png +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/adk_logo.png +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/agent_starter_pack_screenshot.png +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/ags_high_level_architecture.png +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/icon.png +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/logo.png +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/prototype_to_prod.png +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/why_sp_edited.png +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/images/why_starter_pack.png +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/index.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/package-lock.json +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/package.json +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/remote-templates/creating-remote-templates.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/remote-templates/index.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/docs/remote-templates/using-remote-templates.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/llm.txt +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/.gitignore +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/GEMINI.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/apis.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/apis.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/iam.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/log_sinks.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/providers.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/storage.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/variables.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/dev/vars/env.tfvars +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/github.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/iam.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/locals.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/log_sinks.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/providers.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/service_accounts.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/storage.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/variables.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/vars/env.tfvars +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'github_actions' %}wif.tf{% else %}unused_wif.tf{% endif %} +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/deployment/terraform/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}build_triggers.tf{% else %}unused_build_triggers.tf{% endif %} +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/pyproject.toml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/tests/unit/test_dummy.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/deploy-to-prod.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/pr_checks.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'github_actions' %}.github{% else %}unused_github{% endif %}/workflows/staging.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/deploy-to-prod.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/pr_checks.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/{% if cookiecutter.cicd_runner == 'google_cloud_build' %}.cloudbuild{% else %}unused_.cloudbuild{% endif %}/staging.yaml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/{{cookiecutter.agent_directory}}/utils/gcs.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/{{cookiecutter.agent_directory}}/utils/tracing.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/base_template/{{cookiecutter.agent_directory}}/utils/typing.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/commands/enhance.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/commands/setup_cicd.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/main.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/utils/__init__.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/utils/cicd.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/utils/datastores.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/utils/logging.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/cli/utils/version.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/data_ingestion/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/data_ingestion/data_ingestion_pipeline/components/process_data.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/data_ingestion/data_ingestion_pipeline/pipeline.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/data_ingestion/pyproject.toml +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/data_ingestion/uv.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/deployment_metadata.json +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/notebooks/intro_agent_engine.ipynb +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/tests/load_test/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/tests/load_test/load_test.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/agent_engine/{{cookiecutter.agent_directory}}/agent_engine_app.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/deployment/terraform/dev/service.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/deployment/terraform/service.tf +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/tests/load_test/README.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/deployment_targets/cloud_run/tests/load_test/load_test.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/package-lock.json +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/package.json +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/public/favicon.ico +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/public/index.html +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/public/robots.txt +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/App.scss +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/App.test.tsx +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/audio-pulse/AudioPulse.tsx +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/audio-pulse/audio-pulse.scss +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/control-tray/ControlTray.tsx +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/control-tray/control-tray.scss +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/logger/Logger.tsx +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/logger/logger.scss +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/logger/mock-logs.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/side-panel/SidePanel.tsx +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/components/side-panel/side-panel.scss +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/contexts/LiveAPIContext.tsx +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/hooks/use-live-api.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/hooks/use-media-stream-mux.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/hooks/use-screen-capture.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/hooks/use-webcam.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/index.css +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/index.tsx +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/multimodal-live-types.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/react-app-env.d.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/reportWebVitals.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/setupTests.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/audio-recorder.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/audio-streamer.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/audioworklet-registry.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/store-logger.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/utils.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/worklets/audio-processing.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/src/utils/worklets/vol-meter.ts +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/live_api_react/frontend/tsconfig.json +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/side_bar.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/streamlit_app.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/style/app_markdown.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/chat_utils.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/local_chat_history.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/message_editing.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/multimodal_utils.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/stream_handler.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/frontends/streamlit/frontend/utils/title_summary.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/containers/data_processing/Dockerfile +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/containers/e2e-tests/Dockerfile +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/docs/adk-cheatsheet.md +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/idx/.idx/dev.nix +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/idx/idx-template.json +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/idx/idx-template.nix +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/locks/uv-adk_base-agent_engine.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/locks/uv-adk_base-cloud_run.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/locks/uv-agentic_rag-agent_engine.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/locks/uv-agentic_rag-cloud_run.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/locks/uv-langgraph_base_react-agent_engine.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/locks/uv-langgraph_base_react-cloud_run.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/resources/locks/uv-live_api-cloud_run.lock +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/utils/generate_locks.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/utils/lock_utils.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/src/utils/watch_and_rebuild.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/__init__.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cicd/example.env +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cicd/scripts/delete_agent_engines.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cicd/scripts/delete_vector_search.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cicd/test_e2e_deployment.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cli/commands/test_create_local.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cli/commands/test_list.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cli/commands/test_setup_cicd.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/cli/utils/test_cicd.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/integration/test_agent_directory_functionality.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/integration/test_makefile_usability.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/integration/test_pipeline_parity.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/integration/test_remote_templating.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/integration/test_template_linting.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/integration/test_templated_patterns.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/integration/utils.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/test_frontend/test_side_bar.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/test_frontend/test_streamlit_app.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_chat_utils.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_local_chat_history.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_message_editing.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_multimodal_utils.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/test_frontend/test_utils/test_stream_handler.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/utils/__init__.py +0 -0
- {agent_starter_pack-0.12.1 → agent_starter_pack-0.13.0}/tests/utils/get_agents.py +0 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"permissions": {
|
3
|
+
"allow": [
|
4
|
+
"Bash(PROJECT_IDS=agent-starter-pack-e2e-dev,agent-starter-pack-e2e-st,agent-starter-pack-e2e-pr python tests/cicd/scripts/delete_vector_search.py)",
|
5
|
+
"Bash(make lint)",
|
6
|
+
"Bash(uv run pytest tests/cli/commands/test_create.py::TestCreateCommand::test_create_existing_project_dir -v -s)",
|
7
|
+
"Bash(gcloud serverless vpc-connectors list --project=agent-starter-pack-e2e-dev --region=europe-west1)",
|
8
|
+
"Bash(gcloud compute networks vpc-access connectors list --project=agent-starter-pack-e2e-dev --region=europe-west1)",
|
9
|
+
"Bash(gcloud alpha network-services address-reservations list --project=agent-starter-pack-e2e-dev --location=europe-west1)",
|
10
|
+
"Bash(gcloud beta serverless address-reservations list --project=agent-starter-pack-e2e-dev --location=europe-west1)",
|
11
|
+
"Bash(gcloud run services delete test-797fa619-1755528509 --region=europe-west1 --project=agent-starter-pack-e2e-dev --quiet)"
|
12
|
+
],
|
13
|
+
"deny": [],
|
14
|
+
"ask": []
|
15
|
+
}
|
16
|
+
}
|
@@ -114,17 +114,57 @@ The project maintains parallel CI/CD implementations. **Any change to CI/CD logi
|
|
114
114
|
|
115
115
|
When adding a new variable or secret, ensure it is configured correctly for both systems in the Terraform scripts that manage them (e.g., `github_actions_variable` resource and Cloud Build trigger substitutions).
|
116
116
|
|
117
|
-
##
|
117
|
+
## Advanced Template System Patterns
|
118
|
+
|
119
|
+
### 4-Layer Architecture
|
120
|
+
Template processing follows this hierarchy (later layers override earlier ones):
|
121
|
+
1. **Base Template** (`src/base_template/`) - Applied to ALL projects
|
122
|
+
2. **Deployment Targets** (`src/deployment_targets/`) - Environment overrides
|
123
|
+
3. **Frontend Types** (`src/frontends/`) - UI-specific files
|
124
|
+
4. **Agent Templates** (`agents/*/`) - Individual agent logic
|
125
|
+
|
126
|
+
**Rule**: Always place changes in the correct layer. Check if deployment targets need corresponding updates.
|
127
|
+
|
128
|
+
### Template Processing Flow
|
129
|
+
1. Variable resolution from `cookiecutter.json`
|
130
|
+
2. File copying (base → overlays)
|
131
|
+
3. Jinja2 rendering of content
|
132
|
+
4. File/directory name rendering
|
133
|
+
|
134
|
+
### Cross-File Dependencies
|
135
|
+
Changes often require coordinated updates:
|
136
|
+
- **Configuration**: `templateconfig.yaml` → `cookiecutter.json` → rendered templates
|
137
|
+
- **CI/CD**: `.github/workflows/` ↔ `.cloudbuild/` (must stay in sync)
|
138
|
+
- **Infrastructure**: Base terraform → deployment target overrides
|
139
|
+
|
140
|
+
### Conditional Logic Patterns
|
141
|
+
```jinja
|
142
|
+
{%- if cookiecutter.agent_name == "live_api" %}
|
143
|
+
# Agent-specific logic
|
144
|
+
{%- elif cookiecutter.deployment_target == "cloud_run" %}
|
145
|
+
# Deployment-specific logic
|
146
|
+
{%- endif %}
|
147
|
+
```
|
118
148
|
|
119
|
-
|
149
|
+
### Testing Strategy
|
150
|
+
Test changes across multiple dimensions:
|
151
|
+
- Agent types (live_api, adk_base, etc.)
|
152
|
+
- Deployment targets (cloud_run, agent_engine)
|
153
|
+
- Feature combinations (data_ingestion, frontend_type)
|
154
|
+
|
155
|
+
### Common Pitfalls
|
156
|
+
- **Hardcoded URLs**: Use relative paths for frontend connections
|
157
|
+
- **Missing Conditionals**: Wrap agent-specific code in proper `{% if %}` blocks
|
158
|
+
- **Dependency Conflicts**: Some agents lack certain extras (e.g., live_api + lint)
|
159
|
+
|
160
|
+
## File Modification Checklist
|
120
161
|
|
121
|
-
- [ ] **Jinja Syntax:**
|
122
|
-
- [ ] **Variable Consistency:**
|
123
|
-
- [ ] **Cross-Target Impact:**
|
124
|
-
- [ ] **CI/CD Parity:**
|
125
|
-
- [ ] **
|
126
|
-
- [ ] **Documentation:** Does any user-facing documentation in `docs/` need to be updated to reflect the change?
|
162
|
+
- [ ] **Jinja Syntax:** All `{% if %}` and `{% for %}` blocks correctly closed?
|
163
|
+
- [ ] **Variable Consistency:** `cookiecutter.` variables spelled correctly?
|
164
|
+
- [ ] **Cross-Target Impact:** Base template changes checked against deployment targets?
|
165
|
+
- [ ] **CI/CD Parity:** Changes applied to both GitHub Actions and Cloud Build?
|
166
|
+
- [ ] **Multi-Agent Testing:** Tested with different agent types and configurations?
|
127
167
|
|
128
168
|
### Key Tooling
|
129
169
|
|
130
|
-
- **`uv` for Python
|
170
|
+
- **`uv` for Python:** Primary tool for dependency management and CLI execution
|
@@ -4,7 +4,7 @@ install:
|
|
4
4
|
{%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("install") %}
|
5
5
|
{{cookiecutter.settings.get("commands", {}).get("override", {}).get("install")}}
|
6
6
|
{%- else %}
|
7
|
-
uv sync --dev{% if cookiecutter.agent_name != 'live_api' and "adk" not in cookiecutter.tags %} --extra streamlit{%- endif %}
|
7
|
+
uv sync --dev{% if cookiecutter.agent_name != 'live_api' and "adk" not in cookiecutter.tags %} --extra streamlit{%- endif %}{% if cookiecutter.agent_name == 'live_api' %} && (cd frontend && npm install){%- endif %}
|
8
8
|
{%- endif %}
|
9
9
|
|
10
10
|
{%- if cookiecutter.settings.get("commands", {}).get("extra", {}) %}
|
@@ -23,14 +23,23 @@ install:
|
|
23
23
|
{%- endif %}
|
24
24
|
{%- endfor %}{%- endif %}
|
25
25
|
|
26
|
+
{%- if cookiecutter.agent_name == 'live_api' %}
|
27
|
+
# Build the frontend for production
|
28
|
+
build-frontend:
|
29
|
+
(cd frontend && npm run build)
|
30
|
+
|
31
|
+
{%- endif %}
|
26
32
|
# Launch local dev playground
|
27
|
-
playground:
|
33
|
+
playground:{%- if cookiecutter.agent_name == 'live_api' %} build-frontend{%- endif %}
|
28
34
|
{%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("playground") %}
|
29
35
|
{{cookiecutter.settings.get("commands", {}).get("override", {}).get("playground")}}
|
30
36
|
{%- else %}
|
31
37
|
@echo "==============================================================================="
|
32
38
|
@echo "| 🚀 Starting your agent playground... |"
|
33
39
|
@echo "| |"
|
40
|
+
{%- if cookiecutter.agent_name == 'live_api' %}
|
41
|
+
@echo "| 🌐 Access your app at: http://localhost:8000 |"
|
42
|
+
{%- endif %}
|
34
43
|
@echo "| 💡 Try asking: {{cookiecutter.example_question}}|"
|
35
44
|
{%- if "adk" in cookiecutter.tags %}
|
36
45
|
@echo "| |"
|
@@ -41,11 +50,13 @@ playground:
|
|
41
50
|
uv run adk web . --port 8501
|
42
51
|
{%- else %}
|
43
52
|
{%- if cookiecutter.deployment_target == 'cloud_run' %}
|
44
|
-
uv run uvicorn {{cookiecutter.agent_directory}}.server:app --host 0.0.0.0 --port 8000 --reload &
|
45
|
-
{%- endif %}
|
46
53
|
{%- if cookiecutter.agent_name == 'live_api' %}
|
47
|
-
|
54
|
+
uv run uvicorn {{cookiecutter.agent_directory}}.server:app --host 0.0.0.0 --port 8000 --reload
|
48
55
|
{%- else %}
|
56
|
+
uv run uvicorn {{cookiecutter.agent_directory}}.server:app --host 0.0.0.0 --port 8000 --reload &
|
57
|
+
{%- endif %}
|
58
|
+
{%- endif %}
|
59
|
+
{%- if cookiecutter.agent_name != 'live_api' %}
|
49
60
|
{% if cookiecutter.deployment_target == 'agent_engine' %}PYTHONPATH=. {% endif %}uv run streamlit run frontend/streamlit_app.py --browser.serverAddress=localhost --server.enableCORS=false --server.enableXsrfProtection=false
|
50
61
|
{%- endif %}
|
51
62
|
{%- endif %}
|
@@ -84,7 +95,7 @@ local-backend:
|
|
84
95
|
{%- if cookiecutter.deployment_target == 'cloud_run' %}
|
85
96
|
{%- if cookiecutter.agent_name == 'live_api' %}
|
86
97
|
|
87
|
-
# Start the frontend UI for development
|
98
|
+
# Start the frontend UI separately for development (requires backend running separately)
|
88
99
|
ui:
|
89
100
|
(cd frontend && PORT=8501 npm start)
|
90
101
|
{%- endif %}
|
@@ -122,6 +133,7 @@ test:
|
|
122
133
|
|
123
134
|
# Run code quality checks (codespell, ruff, mypy)
|
124
135
|
lint:
|
136
|
+
uv sync --dev --extra lint
|
125
137
|
uv run codespell
|
126
138
|
uv run ruff check . --diff
|
127
139
|
uv run ruff format . --check --diff
|
@@ -92,12 +92,12 @@ Here’s the recommended workflow for local development:
|
|
92
92
|
make install
|
93
93
|
```
|
94
94
|
|
95
|
-
2. **Start the
|
96
|
-
|
95
|
+
2. **Start the Full Stack Server:**
|
96
|
+
The FastAPI server now serves both the backend API and frontend interface:
|
97
97
|
```bash
|
98
98
|
make local-backend
|
99
99
|
```
|
100
|
-
The
|
100
|
+
The server is ready when you see `INFO: Application startup complete.` The frontend will be available at `http://localhost:8000`.
|
101
101
|
|
102
102
|
<details>
|
103
103
|
<summary><b>Optional: Use AI Studio / API Key instead of Vertex AI</b></summary>
|
@@ -113,47 +113,23 @@ Here’s the recommended workflow for local development:
|
|
113
113
|
</details>
|
114
114
|
<br>
|
115
115
|
|
116
|
-
|
117
|
-
|
116
|
+
<details>
|
117
|
+
<summary><b>Alternative: Run Frontend Separately</b></summary>
|
118
|
+
|
119
|
+
If you prefer to run the frontend separately (useful for frontend development), you can still use:
|
118
120
|
```bash
|
119
121
|
make ui
|
120
122
|
```
|
121
|
-
This launches the Streamlit application, which connects to the backend server
|
123
|
+
This launches the Streamlit application, which connects to the backend server at `http://localhost:8000`.
|
124
|
+
</details>
|
125
|
+
<br>
|
122
126
|
|
123
|
-
|
124
|
-
* Open
|
127
|
+
3. **Interact and Iterate:**
|
128
|
+
* Open your browser and navigate to `http://localhost:8000` to access the integrated frontend.
|
125
129
|
* Click the play button in the UI to connect to the backend.
|
126
130
|
* Interact with the agent! Try prompts like: *"Using the tool you have, define Governance in the context MLOPs"*
|
127
131
|
* Modify the agent logic in `{{cookiecutter.agent_directory}}/agent.py`. The backend server (FastAPI with `uvicorn --reload`) should automatically restart when you save changes. Refresh the frontend if needed to see behavioral changes.
|
128
132
|
|
129
|
-
<details>
|
130
|
-
<summary><b>Cloud Shell Usage</b></summary>
|
131
|
-
|
132
|
-
To run the agent using Google Cloud Shell:
|
133
|
-
|
134
|
-
1. **Start the Frontend:**
|
135
|
-
In a Cloud Shell tab, run:
|
136
|
-
```bash
|
137
|
-
make ui
|
138
|
-
```
|
139
|
-
Accept prompts to use a different port if 3000 is busy. Click the `localhost:PORT` link for the web preview.
|
140
|
-
|
141
|
-
2. **Start the Backend:**
|
142
|
-
Open a *new* Cloud Shell tab. Set your project: `gcloud config set project [PROJECT_ID]`. Then run:
|
143
|
-
```bash
|
144
|
-
make local-backend
|
145
|
-
```
|
146
|
-
|
147
|
-
3. **Configure Backend Web Preview:**
|
148
|
-
Use the Cloud Shell Web Preview feature to expose port 8000. Change the default port from 8080 to 8000. See [Cloud Shell Web Preview documentation](https://cloud.google.com/shell/docs/using-web-preview#preview_the_application).
|
149
|
-
|
150
|
-
4. **Connect Frontend to Backend:**
|
151
|
-
* Copy the URL generated by the backend web preview (e.g., `https://8000-cs-....cloudshell.dev/`).
|
152
|
-
* Paste this URL into the "Server URL" field in the frontend UI settings (in the first tab).
|
153
|
-
* Click the "Play button" to connect.
|
154
|
-
|
155
|
-
* **Note:** The feedback feature in the frontend might not work reliably in Cloud Shell due to cross-origin issues between the preview URLs.
|
156
|
-
</details>
|
157
133
|
|
158
134
|
</details>
|
159
135
|
{%- else %}
|
@@ -183,18 +159,7 @@ gcloud config set project <your-dev-project-id>
|
|
183
159
|
make backend
|
184
160
|
```
|
185
161
|
{% if cookiecutter.agent_name == 'live_api' %}
|
186
|
-
**
|
187
|
-
|
188
|
-
To connect your local frontend (`make ui`) to the backend deployed on Cloud Run, use the `gcloud` proxy:
|
189
|
-
|
190
|
-
1. **Start the proxy:**
|
191
|
-
```bash
|
192
|
-
# Replace with your actual service name, project, and region
|
193
|
-
gcloud run services proxy gemini-agent-service --port 8000 --project $PROJECT_ID --region $REGION
|
194
|
-
```
|
195
|
-
Keep this terminal running.
|
196
|
-
|
197
|
-
2. **Connect Frontend:** Your deployed backend is now accessible locally at `http://localhost:8000`. Point your Streamlit UI to this address.
|
162
|
+
**Note:** For secure access to your deployed backend, consider using Identity-Aware Proxy (IAP) by running `make backend IAP=true`.
|
198
163
|
{%- endif %}
|
199
164
|
|
200
165
|
The repository includes a Terraform configuration for the setup of the Dev Google Cloud project.
|
@@ -18,17 +18,11 @@ import os
|
|
18
18
|
import pathlib
|
19
19
|
import shutil
|
20
20
|
import subprocess
|
21
|
-
import sys
|
22
21
|
import tempfile
|
23
22
|
from collections.abc import Callable
|
24
23
|
|
25
24
|
import click
|
26
25
|
from click.core import ParameterSource
|
27
|
-
|
28
|
-
if sys.version_info >= (3, 11):
|
29
|
-
import tomllib
|
30
|
-
else:
|
31
|
-
import tomli as tomllib
|
32
26
|
from rich.console import Console
|
33
27
|
from rich.prompt import IntPrompt, Prompt
|
34
28
|
|
@@ -249,6 +243,8 @@ def create(
|
|
249
243
|
) -> None:
|
250
244
|
"""Create GCP-based AI agent projects from templates."""
|
251
245
|
try:
|
246
|
+
console = Console()
|
247
|
+
|
252
248
|
# Display welcome banner (unless skipped)
|
253
249
|
if not skip_welcome:
|
254
250
|
display_welcome_banner(agent)
|
@@ -312,6 +308,7 @@ def create(
|
|
312
308
|
selected_agent = None
|
313
309
|
template_source_path = None
|
314
310
|
temp_dir_to_clean = None
|
311
|
+
remote_spec = None
|
315
312
|
|
316
313
|
if agent:
|
317
314
|
if agent.startswith("local@"):
|
@@ -353,6 +350,20 @@ def create(
|
|
353
350
|
)
|
354
351
|
temp_dir_to_clean = str(temp_dir_path)
|
355
352
|
selected_agent = f"remote_{hash(agent)}" # Generate unique name for remote template
|
353
|
+
|
354
|
+
# Show informational message for ADK samples with smart defaults
|
355
|
+
if remote_spec.is_adk_samples:
|
356
|
+
config = load_remote_template_config(
|
357
|
+
template_source_path, is_adk_sample=True
|
358
|
+
)
|
359
|
+
if not config.get("has_explicit_config", True):
|
360
|
+
console = Console()
|
361
|
+
console.print(
|
362
|
+
"\n[blue]ℹ️ Note: The starter pack uses heuristics to template this ADK sample agent.[/]"
|
363
|
+
)
|
364
|
+
console.print(
|
365
|
+
"[dim] The starter pack attempts to create a working codebase, but you'll need to follow the generated README for complete setup.[/]"
|
366
|
+
)
|
356
367
|
else:
|
357
368
|
# Handle local agent selection
|
358
369
|
agents = get_available_agents()
|
@@ -402,6 +413,20 @@ def create(
|
|
402
413
|
temp_dir_to_clean = str(temp_dir_path)
|
403
414
|
final_agent = f"remote_{hash(agent)}" # Generate unique name for remote template
|
404
415
|
|
416
|
+
# Show informational message for ADK samples with smart defaults
|
417
|
+
if remote_spec.is_adk_samples:
|
418
|
+
config = load_remote_template_config(
|
419
|
+
template_source_path, is_adk_sample=True
|
420
|
+
)
|
421
|
+
if not config.get("has_explicit_config", True):
|
422
|
+
console = Console()
|
423
|
+
console.print(
|
424
|
+
"\n[blue]ℹ️ Note: The starter pack uses heuristics to template this ADK sample agent.[/]"
|
425
|
+
)
|
426
|
+
console.print(
|
427
|
+
"[dim] The starter pack attempts to create a working codebase, but you'll need to follow the generated README for complete setup.[/]"
|
428
|
+
)
|
429
|
+
|
405
430
|
if debug:
|
406
431
|
logging.debug(f"Selected agent: {final_agent}")
|
407
432
|
|
@@ -414,7 +439,9 @@ def create(
|
|
414
439
|
|
415
440
|
# Load remote template config
|
416
441
|
source_config = load_remote_template_config(
|
417
|
-
template_source_path,
|
442
|
+
template_source_path,
|
443
|
+
cli_overrides,
|
444
|
+
is_adk_sample=remote_spec.is_adk_samples if remote_spec else False,
|
418
445
|
)
|
419
446
|
|
420
447
|
# Remote templates now work even without pyproject.toml thanks to defaults
|
@@ -779,56 +806,10 @@ def display_adk_samples_selection() -> str:
|
|
779
806
|
# Fetch the repository
|
780
807
|
repo_path, _ = fetch_remote_template(spec)
|
781
808
|
|
782
|
-
#
|
783
|
-
|
784
|
-
agent_count = 1
|
785
|
-
|
786
|
-
# Search for pyproject.toml files to identify agents
|
787
|
-
for config_path in sorted(repo_path.glob("**/pyproject.toml")):
|
788
|
-
try:
|
789
|
-
with open(config_path, "rb") as f:
|
790
|
-
pyproject_data = tomllib.load(f)
|
791
|
-
|
792
|
-
config = pyproject_data.get("tool", {}).get("agent-starter-pack", {})
|
793
|
-
|
794
|
-
# Skip pyproject.toml files that don't have agent-starter-pack config
|
795
|
-
if not config:
|
796
|
-
continue
|
797
|
-
|
798
|
-
template_root = config_path.parent
|
799
|
-
|
800
|
-
# Use fallbacks to [project] section if needed
|
801
|
-
project_info = pyproject_data.get("project", {})
|
802
|
-
agent_name = (
|
803
|
-
config.get("name") or project_info.get("name") or template_root.name
|
804
|
-
)
|
805
|
-
description = (
|
806
|
-
config.get("description") or project_info.get("description") or ""
|
807
|
-
)
|
809
|
+
# Use shared ADK discovery function
|
810
|
+
from ..utils.remote_template import discover_adk_agents
|
808
811
|
|
809
|
-
|
810
|
-
relative_path = template_root.relative_to(repo_path)
|
811
|
-
|
812
|
-
# For adk-samples, use just the agent name for the spec
|
813
|
-
# This handles cases like python/agents/gemini-fullstack -> gemini-fullstack
|
814
|
-
agent_spec_name = (
|
815
|
-
relative_path.name
|
816
|
-
if relative_path != relative_path.parent
|
817
|
-
else str(relative_path)
|
818
|
-
)
|
819
|
-
|
820
|
-
adk_agents[agent_count] = {
|
821
|
-
"name": agent_name,
|
822
|
-
"description": description,
|
823
|
-
"path": str(relative_path),
|
824
|
-
"spec": f"adk@{agent_spec_name}",
|
825
|
-
}
|
826
|
-
agent_count += 1
|
827
|
-
|
828
|
-
except Exception as e:
|
829
|
-
logging.warning(
|
830
|
-
f"Could not load agent from {config_path.parent.parent}: {e}"
|
831
|
-
)
|
812
|
+
adk_agents = discover_adk_agents(repo_path)
|
832
813
|
|
833
814
|
if not adk_agents:
|
834
815
|
console.print("No agents found in adk-samples repository", style="yellow")
|
@@ -836,9 +817,19 @@ def display_adk_samples_selection() -> str:
|
|
836
817
|
return display_agent_selection()
|
837
818
|
|
838
819
|
console.print("\n> Available agents from [bold blue]google/adk-samples[/]:")
|
820
|
+
|
821
|
+
# Show explanation for inferred agents at the top
|
822
|
+
from ..utils.remote_template import display_adk_caveat_if_needed
|
823
|
+
|
824
|
+
display_adk_caveat_if_needed(adk_agents)
|
825
|
+
|
839
826
|
for num, agent in adk_agents.items():
|
827
|
+
name_with_indicator = agent["name"]
|
828
|
+
if not agent.get("has_explicit_config", True):
|
829
|
+
name_with_indicator += " *"
|
830
|
+
|
840
831
|
console.print(
|
841
|
-
f"{num}. [bold]{
|
832
|
+
f"{num}. [bold]{name_with_indicator}[/] - [dim]{agent['description']}[/]"
|
842
833
|
)
|
843
834
|
|
844
835
|
# Add option to go back to local agents
|
@@ -1035,18 +1026,22 @@ def _handle_credential_verification(creds_info: dict) -> dict:
|
|
1035
1026
|
return creds_info
|
1036
1027
|
|
1037
1028
|
|
1038
|
-
def _test_vertex_ai_connection(
|
1029
|
+
def _test_vertex_ai_connection(
|
1030
|
+
project_id: str, region: str, auto_approve: bool = False
|
1031
|
+
) -> None:
|
1039
1032
|
"""Test connection to Vertex AI.
|
1040
1033
|
|
1041
1034
|
Args:
|
1042
1035
|
project_id: GCP project ID
|
1043
1036
|
region: GCP region for deployment
|
1037
|
+
auto_approve: Whether to auto-approve API enablement
|
1044
1038
|
"""
|
1045
1039
|
console.print("> Testing GCP and Vertex AI Connection...")
|
1046
1040
|
try:
|
1047
1041
|
verify_vertex_connection(
|
1048
1042
|
project_id=project_id,
|
1049
1043
|
location=region,
|
1044
|
+
auto_approve=auto_approve,
|
1050
1045
|
)
|
1051
1046
|
console.print(
|
1052
1047
|
f"> ✓ Successfully verified connection to Vertex AI in project {project_id}"
|
@@ -1058,6 +1053,7 @@ def _test_vertex_ai_connection(project_id: str, region: str) -> None:
|
|
1058
1053
|
f"Visit https://cloud.google.com/vertex-ai/docs/authentication for help.",
|
1059
1054
|
style="bold red",
|
1060
1055
|
)
|
1056
|
+
raise
|
1061
1057
|
|
1062
1058
|
|
1063
1059
|
def replace_region_in_files(
|
@@ -31,7 +31,9 @@ from ..utils.template import get_available_agents
|
|
31
31
|
console = Console()
|
32
32
|
|
33
33
|
|
34
|
-
def display_agents_from_path(
|
34
|
+
def display_agents_from_path(
|
35
|
+
base_path: pathlib.Path, source_name: str, is_adk_samples: bool = False
|
36
|
+
) -> None:
|
35
37
|
"""Scans a directory and displays available agents."""
|
36
38
|
table = Table(
|
37
39
|
title=f"Available agents in [bold blue]{source_name}[/]",
|
@@ -47,41 +49,66 @@ def display_agents_from_path(base_path: pathlib.Path, source_name: str) -> None:
|
|
47
49
|
return
|
48
50
|
|
49
51
|
found_agents = False
|
50
|
-
|
51
|
-
for config_path in sorted(base_path.glob("**/pyproject.toml")):
|
52
|
-
try:
|
53
|
-
with open(config_path, "rb") as f:
|
54
|
-
pyproject_data = tomllib.load(f)
|
52
|
+
adk_agents = {}
|
55
53
|
|
56
|
-
|
54
|
+
if is_adk_samples:
|
55
|
+
# For ADK samples, use the shared discovery function
|
56
|
+
from ..utils.remote_template import discover_adk_agents
|
57
57
|
|
58
|
-
|
59
|
-
if not config:
|
60
|
-
continue
|
58
|
+
adk_agents = discover_adk_agents(base_path)
|
61
59
|
|
62
|
-
|
60
|
+
for agent_info in adk_agents.values():
|
61
|
+
# Add indicator for inferred agents
|
62
|
+
name_with_indicator = agent_info["name"]
|
63
|
+
if not agent_info.get("has_explicit_config", True):
|
64
|
+
name_with_indicator += " *"
|
63
65
|
|
64
|
-
|
65
|
-
|
66
|
-
agent_name = (
|
67
|
-
config.get("name") or project_info.get("name") or template_root.name
|
68
|
-
)
|
69
|
-
description = (
|
70
|
-
config.get("description") or project_info.get("description") or ""
|
66
|
+
table.add_row(
|
67
|
+
name_with_indicator, f"/{agent_info['path']}", agent_info["description"]
|
71
68
|
)
|
69
|
+
found_agents = True
|
70
|
+
else:
|
71
|
+
# Original logic for non-ADK sources: Search for pyproject.toml files with explicit config
|
72
|
+
for config_path in sorted(base_path.glob("**/pyproject.toml")):
|
73
|
+
try:
|
74
|
+
with open(config_path, "rb") as f:
|
75
|
+
pyproject_data = tomllib.load(f)
|
72
76
|
|
73
|
-
|
74
|
-
relative_path = template_root.relative_to(base_path)
|
77
|
+
config = pyproject_data.get("tool", {}).get("agent-starter-pack", {})
|
75
78
|
|
76
|
-
|
77
|
-
|
79
|
+
# Skip pyproject.toml files that don't have agent-starter-pack config
|
80
|
+
if not config:
|
81
|
+
continue
|
82
|
+
|
83
|
+
template_root = config_path.parent
|
84
|
+
|
85
|
+
# Use fallbacks to [project] section if needed
|
86
|
+
project_info = pyproject_data.get("project", {})
|
87
|
+
agent_name = (
|
88
|
+
config.get("name") or project_info.get("name") or template_root.name
|
89
|
+
)
|
90
|
+
description = (
|
91
|
+
config.get("description") or project_info.get("description") or ""
|
92
|
+
)
|
93
|
+
|
94
|
+
# Display the agent's path relative to the scanned directory
|
95
|
+
relative_path = template_root.relative_to(base_path)
|
78
96
|
|
79
|
-
|
80
|
-
|
97
|
+
table.add_row(agent_name, f"/{relative_path}", description)
|
98
|
+
found_agents = True
|
99
|
+
|
100
|
+
except Exception as e:
|
101
|
+
logging.warning(f"Could not load agent from {config_path.parent}: {e}")
|
81
102
|
|
82
103
|
if not found_agents:
|
83
104
|
console.print(f"No agents found in {source_name}", style="yellow")
|
84
105
|
else:
|
106
|
+
# Show explanation for inferred agents at the top (only for ADK samples)
|
107
|
+
if is_adk_samples:
|
108
|
+
from ..utils.remote_template import display_adk_caveat_if_needed
|
109
|
+
|
110
|
+
display_adk_caveat_if_needed(adk_agents)
|
111
|
+
|
85
112
|
console.print(table)
|
86
113
|
|
87
114
|
|
@@ -103,7 +130,14 @@ def list_remote_agents(remote_source: str, scan_from_root: bool = False) -> None
|
|
103
130
|
repo_path, template_path = template_dir_path
|
104
131
|
scan_path = repo_path if scan_from_root else template_path
|
105
132
|
|
106
|
-
|
133
|
+
# Check if this is ADK samples to enable inference
|
134
|
+
is_adk_samples = (
|
135
|
+
spec.is_adk_samples if hasattr(spec, "is_adk_samples") else False
|
136
|
+
)
|
137
|
+
|
138
|
+
display_agents_from_path(
|
139
|
+
scan_path, remote_source, is_adk_samples=is_adk_samples
|
140
|
+
)
|
107
141
|
|
108
142
|
except (RuntimeError, FileNotFoundError) as e:
|
109
143
|
console.print(f"Error: {e}", style="bold red")
|