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
|
@@ -20,11 +20,11 @@ from google.adk.runners import Runner
|
|
|
20
20
|
from google.adk.sessions import InMemorySessionService
|
|
21
21
|
from google.genai import types
|
|
22
22
|
|
|
23
|
-
from
|
|
23
|
+
from {{cookiecutter.agent_directory}}.agent import root_agent
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
@patch(
|
|
27
|
-
"
|
|
27
|
+
"{{cookiecutter.agent_directory}}.agent.retrieve_docs",
|
|
28
28
|
return_value="dummy content",
|
|
29
29
|
)
|
|
30
30
|
def test_agent_stream(mock_retrieve: MagicMock) -> None:
|
|
@@ -35,7 +35,7 @@ def test_agent_stream(mock_retrieve: MagicMock) -> None:
|
|
|
35
35
|
|
|
36
36
|
session_service = InMemorySessionService()
|
|
37
37
|
|
|
38
|
-
session = session_service.
|
|
38
|
+
session = session_service.create_session_sync(user_id="test_user", app_name="test")
|
|
39
39
|
runner = Runner(agent=root_agent, session_service=session_service, app_name="test")
|
|
40
40
|
|
|
41
41
|
message = types.Content(
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
description: "A base ReAct agent implemented using LangGraph with Agent2Agent (A2A) Protocol support"
|
|
16
|
+
settings:
|
|
17
|
+
requires_data_ingestion: false
|
|
18
|
+
deployment_targets: ["agent_engine", "cloud_run"]
|
|
19
|
+
extra_dependencies: [
|
|
20
|
+
"langchain-google-vertexai>=3.0.3",
|
|
21
|
+
"langchain~=1.0.7",
|
|
22
|
+
"langgraph~=1.0.3",
|
|
23
|
+
"langchain-community~=0.4.1",
|
|
24
|
+
"a2a-sdk[http-server]~=0.3.12",
|
|
25
|
+
"nest-asyncio>=1.6.0,<2.0.0",
|
|
26
|
+
"traceloop-sdk>=0.10.0,<1.0.0",
|
|
27
|
+
"opentelemetry-exporter-gcp-trace>=1.9.0,<2.0.0",
|
|
28
|
+
]
|
|
29
|
+
tags: ["langgraph", "a2a"]
|
|
30
|
+
frontend_type: "inspector"
|
|
31
|
+
example_question: "What's the weather in San Francisco?"
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# LangGraph Base ReAct Agent with A2A Protocol
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<img src="https://langchain-ai.github.io/langgraph/static/wordmark_dark.svg" width="50%" alt="LangGraph Logo" style="margin-right: 40px; vertical-align: middle;">
|
|
5
|
+
<img src="https://github.com/a2aproject/A2A/blob/main/docs/assets/a2a-logo-white.svg?raw=true" width="40%" alt="A2A Logo" style="vertical-align: middle;">
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
A base ReAct agent built using **[LangGraph](https://docs.langchain.com/oss/python/langgraph/overview)** with **[Agent2Agent (A2A) Protocol](https://a2a-protocol.org/)** support. This example demonstrates how to build a LangGraph-based agent with distributed agent communication capabilities through the A2A protocol for interoperability with agents across different frameworks and languages.
|
|
9
|
+
|
|
10
|
+
## Key Features
|
|
11
|
+
|
|
12
|
+
- **Simple Architecture**: Shows the basic building blocks of a LangGraph agent
|
|
13
|
+
- **A2A Protocol Support**: Enables distributed agent communication and interoperability
|
|
14
|
+
- **Streaming Support**: Includes streaming response capability using Vertex AI
|
|
15
|
+
- **Sample Tool Integration**: Includes a basic search tool to demonstrate tool usage
|
|
16
|
+
|
|
17
|
+
## Validating Your A2A Implementation
|
|
18
|
+
|
|
19
|
+
This template includes the **[A2A Protocol Inspector](https://github.com/a2aproject/a2a-inspector)** for validating your agent's A2A implementation.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
make inspector
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The inspector now supports both JSON-RPC 2.0 (Cloud Run) and HTTP-JSON (Agent Engine) transport protocols:
|
|
26
|
+
|
|
27
|
+
- **Cloud Run**: Test locally at `http://localhost:8000` or connect to your deployed Cloud Run URL
|
|
28
|
+
- **Agent Engine**: Must deploy first, then connect to your deployed Agent Engine URL (local testing not available)
|
|
29
|
+
|
|
30
|
+
For detailed setup instructions including local and remote testing workflows, refer to the `README.md` in your generated project.
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
from .agent import root_agent
|
|
16
|
+
|
|
17
|
+
__all__ = ["root_agent"]
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
from langchain.agents import create_agent
|
|
16
|
+
from langchain_google_vertexai import ChatVertexAI
|
|
17
|
+
from langgraph.graph.state import CompiledStateGraph
|
|
18
|
+
|
|
19
|
+
LOCATION = "global"
|
|
20
|
+
LLM = "gemini-2.5-flash"
|
|
21
|
+
|
|
22
|
+
llm = ChatVertexAI(model=LLM, location=LOCATION, temperature=0)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def get_weather(query: str) -> str:
|
|
26
|
+
"""Simulates a web search. Use it get information on weather"""
|
|
27
|
+
if "sf" in query.lower() or "san francisco" in query.lower():
|
|
28
|
+
return "It's 60 degrees and foggy."
|
|
29
|
+
return "It's 90 degrees and sunny."
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
root_agent: CompiledStateGraph = create_agent(
|
|
33
|
+
model=llm, tools=[get_weather], system_prompt="You are a helpful assistant"
|
|
34
|
+
)
|
|
@@ -143,12 +143,8 @@
|
|
|
143
143
|
},
|
|
144
144
|
"outputs": [],
|
|
145
145
|
"source": [
|
|
146
|
-
"%pip install
|
|
147
|
-
"
|
|
148
|
-
" \"langgraph\" \\\n",
|
|
149
|
-
" \"cloudpickle==3.0.0\" \\\n",
|
|
150
|
-
" \"pydantic==2.7.4\" \\\n",
|
|
151
|
-
" \"requests\""
|
|
146
|
+
"%pip install \"langchain_google_vertexai\" \"langgraph\"\n",
|
|
147
|
+
"%pip install --upgrade --user --quiet \"google-cloud-aiplatform[evaluation]\""
|
|
152
148
|
]
|
|
153
149
|
},
|
|
154
150
|
{
|
|
@@ -273,6 +269,8 @@
|
|
|
273
269
|
},
|
|
274
270
|
"outputs": [],
|
|
275
271
|
"source": [
|
|
272
|
+
"import json\n",
|
|
273
|
+
"\n",
|
|
276
274
|
"# General\n",
|
|
277
275
|
"import random\n",
|
|
278
276
|
"import string\n",
|
|
@@ -355,7 +353,7 @@
|
|
|
355
353
|
" }\n",
|
|
356
354
|
" )\n",
|
|
357
355
|
"\n",
|
|
358
|
-
" final_output[\"predicted_trajectory\"] = function_calls\n",
|
|
356
|
+
" final_output[\"predicted_trajectory\"] = json.dumps(function_calls)\n",
|
|
359
357
|
" return final_output\n",
|
|
360
358
|
"\n",
|
|
361
359
|
"\n",
|
|
@@ -365,6 +363,7 @@
|
|
|
365
363
|
" markdown += f\"{output['response']}\\n\\n\"\n",
|
|
366
364
|
"\n",
|
|
367
365
|
" if output[\"predicted_trajectory\"]:\n",
|
|
366
|
+
" output[\"predicted_trajectory\"] = json.loads(output[\"predicted_trajectory\"])\n",
|
|
368
367
|
" markdown += \"### Function Calls\\n\"\n",
|
|
369
368
|
" for call in output[\"predicted_trajectory\"]:\n",
|
|
370
369
|
" markdown += f\"- **Function**: `{call['tool_name']}`\\n\"\n",
|
|
@@ -381,7 +380,7 @@
|
|
|
381
380
|
" display(Markdown(\"### Summary Metrics\"))\n",
|
|
382
381
|
" display(metrics_df)\n",
|
|
383
382
|
"\n",
|
|
384
|
-
" display(Markdown(
|
|
383
|
+
" display(Markdown(\"### Row-wise Metrics\"))\n",
|
|
385
384
|
" display(eval_result.metrics_table)\n",
|
|
386
385
|
"\n",
|
|
387
386
|
"\n",
|
|
@@ -599,7 +598,7 @@
|
|
|
599
598
|
"source": [
|
|
600
599
|
"def router(\n",
|
|
601
600
|
" state: list[BaseMessage],\n",
|
|
602
|
-
") -> Literal[\"get_product_details\", \"get_product_price\",
|
|
601
|
+
") -> Literal[\"get_product_details\", \"get_product_price\", END]:\n",
|
|
603
602
|
" \"\"\"Initiates product details or price retrieval if the user asks for a product.\"\"\"\n",
|
|
604
603
|
" # Get the tool_calls from the last message in the conversation history.\n",
|
|
605
604
|
" tool_calls = state[-1].tool_calls\n",
|
|
@@ -614,7 +613,7 @@
|
|
|
614
613
|
" return \"get_product_details\"\n",
|
|
615
614
|
" else:\n",
|
|
616
615
|
" # End the conversation flow.\n",
|
|
617
|
-
" return
|
|
616
|
+
" return END"
|
|
618
617
|
]
|
|
619
618
|
},
|
|
620
619
|
{
|
|
@@ -636,7 +635,7 @@
|
|
|
636
635
|
},
|
|
637
636
|
"outputs": [],
|
|
638
637
|
"source": [
|
|
639
|
-
"llm = \"gemini-
|
|
638
|
+
"llm = \"gemini-2.0-flash\""
|
|
640
639
|
]
|
|
641
640
|
},
|
|
642
641
|
{
|
|
@@ -899,6 +898,7 @@
|
|
|
899
898
|
" dataset=eval_sample_dataset,\n",
|
|
900
899
|
" metrics=single_tool_usage_metrics,\n",
|
|
901
900
|
" experiment=EXPERIMENT_NAME,\n",
|
|
901
|
+
" output_uri_prefix=BUCKET_URI + \"/single-metric-eval\",\n",
|
|
902
902
|
")\n",
|
|
903
903
|
"\n",
|
|
904
904
|
"single_tool_call_eval_result = single_tool_call_eval_task.evaluate(\n",
|
|
@@ -1003,7 +1003,10 @@
|
|
|
1003
1003
|
"EXPERIMENT_RUN = f\"trajectory-{get_id()}\"\n",
|
|
1004
1004
|
"\n",
|
|
1005
1005
|
"trajectory_eval_task = EvalTask(\n",
|
|
1006
|
-
" dataset=eval_sample_dataset
|
|
1006
|
+
" dataset=eval_sample_dataset,\n",
|
|
1007
|
+
" metrics=trajectory_metrics,\n",
|
|
1008
|
+
" experiment=EXPERIMENT_NAME,\n",
|
|
1009
|
+
" output_uri_prefix=BUCKET_URI + \"/multiple-metric-eval\",\n",
|
|
1007
1010
|
")\n",
|
|
1008
1011
|
"\n",
|
|
1009
1012
|
"trajectory_eval_result = trajectory_eval_task.evaluate(\n",
|
|
@@ -1107,7 +1110,10 @@
|
|
|
1107
1110
|
"EXPERIMENT_RUN = f\"response-{get_id()}\"\n",
|
|
1108
1111
|
"\n",
|
|
1109
1112
|
"response_eval_task = EvalTask(\n",
|
|
1110
|
-
" dataset=eval_sample_dataset
|
|
1113
|
+
" dataset=eval_sample_dataset,\n",
|
|
1114
|
+
" metrics=response_metrics,\n",
|
|
1115
|
+
" experiment=EXPERIMENT_NAME,\n",
|
|
1116
|
+
" output_uri_prefix=BUCKET_URI + \"/response-metric-eval\",\n",
|
|
1111
1117
|
")\n",
|
|
1112
1118
|
"\n",
|
|
1113
1119
|
"response_eval_result = response_eval_task.evaluate(\n",
|
|
@@ -1292,6 +1298,7 @@
|
|
|
1292
1298
|
" dataset=eval_sample_dataset,\n",
|
|
1293
1299
|
" metrics=response_tool_metrics,\n",
|
|
1294
1300
|
" experiment=EXPERIMENT_NAME,\n",
|
|
1301
|
+
" output_uri_prefix=BUCKET_URI + \"/reasoning-metric-eval\",\n",
|
|
1295
1302
|
")\n",
|
|
1296
1303
|
"\n",
|
|
1297
1304
|
"response_eval_tool_result = response_eval_tool_task.evaluate(\n",
|
|
@@ -1436,15 +1443,21 @@
|
|
|
1436
1443
|
" ],\n",
|
|
1437
1444
|
" ],\n",
|
|
1438
1445
|
" \"response\": [\n",
|
|
1439
|
-
" 500,\n",
|
|
1440
|
-
" 50,\n",
|
|
1446
|
+
" \"500\",\n",
|
|
1447
|
+
" \"50\",\n",
|
|
1441
1448
|
" \"A super fast and light usb charger\",\n",
|
|
1442
|
-
" 100,\n",
|
|
1449
|
+
" \"100\",\n",
|
|
1443
1450
|
" \"A voice-controlled smart speaker that plays music, sets alarms, and controls smart home devices.\",\n",
|
|
1444
1451
|
" ],\n",
|
|
1445
1452
|
"}\n",
|
|
1446
1453
|
"\n",
|
|
1447
|
-
"byod_eval_sample_dataset = pd.DataFrame(byod_eval_data)"
|
|
1454
|
+
"byod_eval_sample_dataset = pd.DataFrame(byod_eval_data)\n",
|
|
1455
|
+
"byod_eval_sample_dataset[\"predicted_trajectory\"] = byod_eval_sample_dataset[\n",
|
|
1456
|
+
" \"predicted_trajectory\"\n",
|
|
1457
|
+
"].apply(json.dumps)\n",
|
|
1458
|
+
"byod_eval_sample_dataset[\"reference_trajectory\"] = byod_eval_sample_dataset[\n",
|
|
1459
|
+
" \"reference_trajectory\"\n",
|
|
1460
|
+
"].apply(json.dumps)"
|
|
1448
1461
|
]
|
|
1449
1462
|
},
|
|
1450
1463
|
{
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
# mypy:
|
|
16
|
-
from
|
|
15
|
+
# mypy: ignore-errors
|
|
16
|
+
from {{cookiecutter.agent_directory}}.agent import root_agent as agent
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def test_agent_stream() -> None:
|
|
@@ -189,9 +189,11 @@ Thumbs.db
|
|
|
189
189
|
.persist_vector_store
|
|
190
190
|
tests/load_test/.results/*.html
|
|
191
191
|
tests/load_test/.results/*.csv
|
|
192
|
-
locust_env
|
|
192
|
+
.locust_env
|
|
193
193
|
my_env.tfvars
|
|
194
|
-
.streamlit_chats
|
|
195
194
|
.saved_chats
|
|
196
195
|
.env
|
|
197
|
-
.requirements.txt
|
|
196
|
+
.requirements.txt
|
|
197
|
+
|
|
198
|
+
# A2A Inspector
|
|
199
|
+
tools/a2a-inspector/
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# Installation & Setup
|
|
3
|
+
# ==============================================================================
|
|
4
|
+
|
|
5
|
+
# Install dependencies using uv package manager
|
|
6
|
+
install:
|
|
7
|
+
@command -v uv >/dev/null 2>&1 || { echo "uv is not installed. Installing uv..."; curl -LsSf https://astral.sh/uv/0.8.13/install.sh | sh; source $HOME/.local/bin/env; }
|
|
8
|
+
{%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("install") %}
|
|
9
|
+
{{cookiecutter.settings.get("commands", {}).get("override", {}).get("install")}}
|
|
10
|
+
{%- else %}
|
|
11
|
+
uv sync{% if cookiecutter.is_adk_live %} && (cd frontend && npm install){%- endif %}
|
|
12
|
+
{%- endif %}
|
|
13
|
+
|
|
14
|
+
# ==============================================================================
|
|
15
|
+
# Playground Targets
|
|
16
|
+
# ==============================================================================
|
|
17
|
+
|
|
18
|
+
# Launch local dev playground
|
|
19
|
+
playground:{%- if cookiecutter.is_adk_live %} build-frontend-if-needed{%- endif %}
|
|
20
|
+
{%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("playground") %}
|
|
21
|
+
{%- if cookiecutter.settings.get("commands", {}).get("override", {}).get("playground") is mapping %}
|
|
22
|
+
{{cookiecutter.settings.get("commands", {}).get("override", {}).get("playground").get(cookiecutter.deployment_target, "")}}
|
|
23
|
+
{%- else %}
|
|
24
|
+
{{cookiecutter.settings.get("commands", {}).get("override", {}).get("playground")}}
|
|
25
|
+
{%- endif %}
|
|
26
|
+
{%- else %}
|
|
27
|
+
@echo "==============================================================================="
|
|
28
|
+
@echo "| 🚀 Starting your agent playground... |"
|
|
29
|
+
@echo "| |"
|
|
30
|
+
{%- if cookiecutter.is_adk_live %}
|
|
31
|
+
@echo "| 🌐 Access your app at: http://localhost:8000 |"
|
|
32
|
+
{%- endif %}
|
|
33
|
+
@echo "| 💡 Try asking: {{cookiecutter.example_question}}|"
|
|
34
|
+
{%- if cookiecutter.is_adk %}
|
|
35
|
+
@echo "| |"
|
|
36
|
+
@echo "| 🔍 IMPORTANT: Select the '{{cookiecutter.agent_directory}}' folder to interact with your agent. |"
|
|
37
|
+
{%- endif %}
|
|
38
|
+
@echo "==============================================================================="
|
|
39
|
+
{%- if cookiecutter.is_adk_live %}
|
|
40
|
+
{%- if cookiecutter.deployment_target == 'agent_engine' %}
|
|
41
|
+
uv run python -m {{cookiecutter.agent_directory}}.app_utils.expose_app --mode local --local-agent {{cookiecutter.agent_directory}}.agent.root_agent
|
|
42
|
+
{%- else %}
|
|
43
|
+
uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host localhost --port 8000 --reload
|
|
44
|
+
{%- endif %}
|
|
45
|
+
{%- elif cookiecutter.is_adk %}
|
|
46
|
+
uv run adk web . --port 8501 --reload_agents
|
|
47
|
+
{%- elif cookiecutter.is_a2a %}
|
|
48
|
+
{%- if cookiecutter.deployment_target == 'cloud_run' %}
|
|
49
|
+
uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host localhost --port 8000 --reload &
|
|
50
|
+
$(MAKE) inspector
|
|
51
|
+
{%- else %}
|
|
52
|
+
{%- if cookiecutter.agent_name == 'langgraph_base' %}
|
|
53
|
+
@echo "ℹ️ Note: Local playground not supported for LangGraph on Agent Engine."
|
|
54
|
+
@echo " To test your agent, deploy first with 'make deploy' then use 'make inspector'."
|
|
55
|
+
{%- else %}
|
|
56
|
+
@echo "ℹ️ Note: Local playground uses ADK web interface (not A2A endpoints)."
|
|
57
|
+
@echo " To test A2A protocol, deploy first with 'make deploy' then use 'make inspector'."
|
|
58
|
+
@echo ""
|
|
59
|
+
uv run adk web . --port 8501 --reload_agents
|
|
60
|
+
{%- endif %}
|
|
61
|
+
{%- endif %}
|
|
62
|
+
{%- else %}
|
|
63
|
+
uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host localhost --port 8000 --reload
|
|
64
|
+
{%- endif %}
|
|
65
|
+
{%- endif %}
|
|
66
|
+
{%- if cookiecutter.settings.get("commands", {}).get("extra", {}) %}
|
|
67
|
+
|
|
68
|
+
# ==============================================================================
|
|
69
|
+
# Agent-Specific Commands
|
|
70
|
+
# ==============================================================================
|
|
71
|
+
{%- for cmd_name, cmd_value in cookiecutter.settings.get("commands", {}).get("extra", {}).items() %}
|
|
72
|
+
{%- if cmd_value is mapping %}
|
|
73
|
+
{%- if cmd_value.command is mapping %}
|
|
74
|
+
{%- if cookiecutter.deployment_target in cmd_value.command %}
|
|
75
|
+
|
|
76
|
+
# {{ cmd_value.get("description") }}
|
|
77
|
+
{{ cmd_name }}:
|
|
78
|
+
{{ cmd_value.command[cookiecutter.deployment_target] }}
|
|
79
|
+
{%- endif %}
|
|
80
|
+
{%- else %}
|
|
81
|
+
|
|
82
|
+
# {{ cmd_value.get("description") }}
|
|
83
|
+
{{ cmd_name }}:
|
|
84
|
+
{{ cmd_value.command if cmd_value.command is string else "" }}
|
|
85
|
+
{%- endif %}
|
|
86
|
+
{%- else %}
|
|
87
|
+
|
|
88
|
+
# {{ cmd_value.get("description", "") }}
|
|
89
|
+
{{ cmd_name }}:
|
|
90
|
+
{{ cmd_value }}
|
|
91
|
+
{%- endif %}
|
|
92
|
+
{%- endfor %}
|
|
93
|
+
{%- endif %}
|
|
94
|
+
{%- if cookiecutter.deployment_target == 'cloud_run' or (cookiecutter.deployment_target == 'agent_engine' and cookiecutter.is_adk_live) %}
|
|
95
|
+
|
|
96
|
+
# ==============================================================================
|
|
97
|
+
# Local Development Commands
|
|
98
|
+
# ==============================================================================
|
|
99
|
+
|
|
100
|
+
# Launch local development server with hot-reload
|
|
101
|
+
local-backend:
|
|
102
|
+
{%- if cookiecutter.deployment_target == 'cloud_run' %}
|
|
103
|
+
uv run uvicorn {{cookiecutter.agent_directory}}.fast_api_app:app --host localhost --port 8000 --reload
|
|
104
|
+
{%- else %}
|
|
105
|
+
uv run python -m {{cookiecutter.agent_directory}}.app_utils.expose_app --mode local --port 8000 --local-agent {{cookiecutter.agent_directory}}.agent.root_agent
|
|
106
|
+
{%- endif %}
|
|
107
|
+
{%- endif %}
|
|
108
|
+
{%- if cookiecutter.is_adk_live %}
|
|
109
|
+
|
|
110
|
+
# ==============================================================================
|
|
111
|
+
# ADK Live Commands
|
|
112
|
+
# ==============================================================================
|
|
113
|
+
|
|
114
|
+
# Build the frontend for production
|
|
115
|
+
build-frontend:
|
|
116
|
+
(cd frontend && npm run build)
|
|
117
|
+
|
|
118
|
+
# Build the frontend only if needed (conditional build)
|
|
119
|
+
build-frontend-if-needed:
|
|
120
|
+
@if [ ! -d "frontend/build" ] || [ ! -f "frontend/build/index.html" ]; then \
|
|
121
|
+
echo "Frontend build directory not found or incomplete. Building..."; \
|
|
122
|
+
$(MAKE) build-frontend; \
|
|
123
|
+
elif [ "frontend/package.json" -nt "frontend/build/index.html" ] || \
|
|
124
|
+
find frontend/src -newer frontend/build/index.html 2>/dev/null | head -1 | grep -q .; then \
|
|
125
|
+
echo "Frontend source files are newer than build. Rebuilding..."; \
|
|
126
|
+
$(MAKE) build-frontend; \
|
|
127
|
+
else \
|
|
128
|
+
echo "Frontend build is up to date. Skipping build..."; \
|
|
129
|
+
fi
|
|
130
|
+
{%- if cookiecutter.deployment_target == 'agent_engine' %}
|
|
131
|
+
|
|
132
|
+
# Connect to remote deployed agent
|
|
133
|
+
playground-remote: build-frontend-if-needed
|
|
134
|
+
@echo "==============================================================================="
|
|
135
|
+
@echo "| 🚀 Connecting to REMOTE agent... |"
|
|
136
|
+
@echo "| |"
|
|
137
|
+
@echo "| 🌐 Access your app at: http://localhost:8000 |"
|
|
138
|
+
@echo "| ☁️ Connected to deployed agent engine |"
|
|
139
|
+
@echo "==============================================================================="
|
|
140
|
+
uv run python -m {{cookiecutter.agent_directory}}.app_utils.expose_app --mode remote
|
|
141
|
+
{%- endif %}
|
|
142
|
+
{%- endif %}
|
|
143
|
+
{%- if cookiecutter.is_adk_live and cookiecutter.deployment_target == 'agent_engine' %}
|
|
144
|
+
|
|
145
|
+
# Start the frontend UI separately for development (requires backend running separately)
|
|
146
|
+
ui:
|
|
147
|
+
(cd frontend && PORT=8501 npm start)
|
|
148
|
+
|
|
149
|
+
# Launch dev playground with both frontend and backend hot-reload
|
|
150
|
+
playground-dev:
|
|
151
|
+
@echo "==============================================================================="
|
|
152
|
+
@echo "| 🚀 Starting your agent playground in DEV MODE... |"
|
|
153
|
+
@echo "| |"
|
|
154
|
+
@echo "| 🌐 Frontend: http://localhost:8501 |"
|
|
155
|
+
@echo "| 🌐 Backend: http://localhost:8000 |"
|
|
156
|
+
@echo "| 💡 Try asking: {{cookiecutter.example_question}}|"
|
|
157
|
+
@echo "| 🔄 Both frontend and backend will auto-reload on changes |"
|
|
158
|
+
@echo "==============================================================================="
|
|
159
|
+
@echo "Starting backend server..."
|
|
160
|
+
$(MAKE) local-backend &
|
|
161
|
+
@echo "Starting frontend dev server..."
|
|
162
|
+
$(MAKE) ui
|
|
163
|
+
{%- endif %}
|
|
164
|
+
{%- if cookiecutter.is_a2a %}
|
|
165
|
+
|
|
166
|
+
# ==============================================================================
|
|
167
|
+
# A2A Protocol Inspector
|
|
168
|
+
# ==============================================================================
|
|
169
|
+
|
|
170
|
+
# Launch A2A Protocol Inspector to test your agent implementation
|
|
171
|
+
inspector: setup-inspector-if-needed build-inspector-if-needed
|
|
172
|
+
@echo "==============================================================================="
|
|
173
|
+
@echo "| 🔍 A2A Protocol Inspector |"
|
|
174
|
+
@echo "==============================================================================="
|
|
175
|
+
@echo "| 🌐 Inspector UI: http://localhost:5001 |"
|
|
176
|
+
@echo "| |"
|
|
177
|
+
{%- if cookiecutter.deployment_target == 'cloud_run' %}
|
|
178
|
+
@echo "| 💡 Testing Locally: |"
|
|
179
|
+
@echo "| Paste this URL into the inspector: |"
|
|
180
|
+
@echo "| http://localhost:8000/a2a/{{cookiecutter.agent_directory}}/.well-known/agent-card.json |"
|
|
181
|
+
@echo "| |"
|
|
182
|
+
{%- endif %}
|
|
183
|
+
@echo "| 💡 Testing Remote Deployment: |"
|
|
184
|
+
{%- if cookiecutter.deployment_target == 'cloud_run' %}
|
|
185
|
+
@echo "| Connect to your deployed Cloud Run URL |"
|
|
186
|
+
@echo "| 🔐 See README for authentication setup |"
|
|
187
|
+
{%- else %}
|
|
188
|
+
@echo "| Connect to your deployed Agent Engine URL |"
|
|
189
|
+
@echo "| 🔐 See README for authentication setup |"
|
|
190
|
+
@echo "| |"
|
|
191
|
+
@echo "| ℹ️ Note: Local testing requires deploying to Agent Engine first. |"
|
|
192
|
+
@echo "| Local 'make playground' uses ADK web interface (not A2A endpoints) |"
|
|
193
|
+
{%- endif %}
|
|
194
|
+
@echo "==============================================================================="
|
|
195
|
+
@echo ""
|
|
196
|
+
cd tools/a2a-inspector/backend && uv run app.py
|
|
197
|
+
|
|
198
|
+
# Internal: Setup inspector if not already present (runs once)
|
|
199
|
+
# TODO: Update to --branch v1.0.0 when a2a-inspector publishes releases
|
|
200
|
+
setup-inspector-if-needed:
|
|
201
|
+
@if [ ! -d "tools/a2a-inspector" ]; then \
|
|
202
|
+
echo "" && \
|
|
203
|
+
echo "📦 First-time setup: Installing A2A Inspector..." && \
|
|
204
|
+
echo "" && \
|
|
205
|
+
mkdir -p tools && \
|
|
206
|
+
git clone --quiet https://github.com/a2aproject/a2a-inspector.git tools/a2a-inspector && \
|
|
207
|
+
(cd tools/a2a-inspector && git -c advice.detachedHead=false checkout --quiet 893e4062f6fbd85a8369228ce862ebbf4a025694) && \
|
|
208
|
+
echo "📥 Installing Python dependencies..." && \
|
|
209
|
+
(cd tools/a2a-inspector && uv sync --quiet) && \
|
|
210
|
+
echo "📥 Installing Node.js dependencies..." && \
|
|
211
|
+
(cd tools/a2a-inspector/frontend && npm install --silent) && \
|
|
212
|
+
echo "🔨 Building frontend..." && \
|
|
213
|
+
(cd tools/a2a-inspector/frontend && npm run build --silent) && \
|
|
214
|
+
echo "" && \
|
|
215
|
+
echo "✅ A2A Inspector setup complete!" && \
|
|
216
|
+
echo ""; \
|
|
217
|
+
fi
|
|
218
|
+
|
|
219
|
+
# Internal: Build inspector frontend if needed
|
|
220
|
+
build-inspector-if-needed:
|
|
221
|
+
@if [ -d "tools/a2a-inspector" ] && [ ! -f "tools/a2a-inspector/frontend/public/script.js" ]; then \
|
|
222
|
+
echo "🔨 Building inspector frontend..."; \
|
|
223
|
+
cd tools/a2a-inspector/frontend && npm run build; \
|
|
224
|
+
fi
|
|
225
|
+
{%- endif %}
|
|
226
|
+
|
|
227
|
+
# ==============================================================================
|
|
228
|
+
# Backend Deployment Targets
|
|
229
|
+
# ==============================================================================
|
|
230
|
+
|
|
231
|
+
# Deploy the agent remotely
|
|
232
|
+
{%- if cookiecutter.deployment_target == 'cloud_run' %}
|
|
233
|
+
# Usage: make deploy [IAP=true] [PORT=8080] - Set IAP=true to enable Identity-Aware Proxy, PORT to specify container port
|
|
234
|
+
{%- endif %}
|
|
235
|
+
deploy:
|
|
236
|
+
{%- if cookiecutter.deployment_target == 'cloud_run' %}
|
|
237
|
+
PROJECT_ID=$$(gcloud config get-value project) && \
|
|
238
|
+
{%- if cookiecutter.is_a2a %}
|
|
239
|
+
PROJECT_NUMBER=$$(gcloud projects describe $$PROJECT_ID --format="value(projectNumber)") && \
|
|
240
|
+
{%- endif %}
|
|
241
|
+
gcloud beta run deploy {{cookiecutter.project_name}} \
|
|
242
|
+
--source . \
|
|
243
|
+
--memory "4Gi" \
|
|
244
|
+
--project $$PROJECT_ID \
|
|
245
|
+
--region "us-central1" \
|
|
246
|
+
--no-allow-unauthenticated \
|
|
247
|
+
--no-cpu-throttling \
|
|
248
|
+
--labels "{% if cookiecutter.is_adk %}created-by=adk{% if cookiecutter.agent_garden %},{% endif %}{% endif %}{% if cookiecutter.agent_garden %}deployed-with=agent-garden{% if cookiecutter.agent_sample_id %},vertex-agent-sample-id={{cookiecutter.agent_sample_id}},vertex-agent-sample-publisher={{cookiecutter.agent_sample_publisher}}{% endif %}{% endif %}" \
|
|
249
|
+
--update-build-env-vars "AGENT_VERSION=$(shell awk -F'"' '/^version = / {print $$2}' pyproject.toml || echo '0.0.0')" \
|
|
250
|
+
--set-env-vars \
|
|
251
|
+
"COMMIT_SHA=$(shell git rev-parse HEAD){%- if cookiecutter.is_a2a %},APP_URL=https://{{cookiecutter.project_name}}-$$PROJECT_NUMBER.us-central1.run.app{%- endif %}{%- if cookiecutter.data_ingestion %}{%- if cookiecutter.datastore_type == "vertex_ai_search" %},DATA_STORE_ID={{cookiecutter.project_name}}-datastore,DATA_STORE_REGION=us{%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %},VECTOR_SEARCH_INDEX={{cookiecutter.project_name}}-vector-search,VECTOR_SEARCH_INDEX_ENDPOINT={{cookiecutter.project_name}}-vector-search-endpoint,VECTOR_SEARCH_BUCKET=$$PROJECT_ID-{{cookiecutter.project_name}}-vs{%- endif %}{%- endif %}" \
|
|
252
|
+
$(if $(IAP),--iap) \
|
|
253
|
+
$(if $(PORT),--port=$(PORT))
|
|
254
|
+
{%- elif cookiecutter.deployment_target == 'agent_engine' %}
|
|
255
|
+
# Export dependencies to requirements file using uv export.
|
|
256
|
+
(uv export --no-hashes --no-header --no-dev --no-emit-project --no-annotate > {{cookiecutter.agent_directory}}/app_utils/.requirements.txt 2>/dev/null || \
|
|
257
|
+
uv export --no-hashes --no-header --no-dev --no-emit-project > {{cookiecutter.agent_directory}}/app_utils/.requirements.txt) && \
|
|
258
|
+
uv run -m {{cookiecutter.agent_directory}}.app_utils.deploy \
|
|
259
|
+
--source-packages=./{{cookiecutter.agent_directory}} \
|
|
260
|
+
--entrypoint-module={{cookiecutter.agent_directory}}.agent_engine_app \
|
|
261
|
+
--entrypoint-object=agent_engine \
|
|
262
|
+
--requirements-file={{cookiecutter.agent_directory}}/app_utils/.requirements.txt
|
|
263
|
+
{%- endif %}
|
|
264
|
+
|
|
265
|
+
# Alias for 'make deploy' for backward compatibility
|
|
266
|
+
backend: deploy
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
# ==============================================================================
|
|
270
|
+
# Infrastructure Setup
|
|
271
|
+
# ==============================================================================
|
|
272
|
+
|
|
273
|
+
# Set up development environment resources using Terraform
|
|
274
|
+
setup-dev-env:
|
|
275
|
+
PROJECT_ID=$$(gcloud config get-value project) && \
|
|
276
|
+
(cd deployment/terraform/dev && terraform init && terraform apply --var-file vars/env.tfvars --var dev_project_id=$$PROJECT_ID --auto-approve)
|
|
277
|
+
{%- if cookiecutter.data_ingestion %}
|
|
278
|
+
|
|
279
|
+
# ==============================================================================
|
|
280
|
+
# Data Ingestion (RAG capabilities)
|
|
281
|
+
# ==============================================================================
|
|
282
|
+
|
|
283
|
+
# Run the data ingestion pipeline for RAG capabilities
|
|
284
|
+
data-ingestion:
|
|
285
|
+
PROJECT_ID=$$(gcloud config get-value project) && \
|
|
286
|
+
(cd data_ingestion && uv run data_ingestion_pipeline/submit_pipeline.py \
|
|
287
|
+
--project-id=$$PROJECT_ID \
|
|
288
|
+
--region="us-central1" \
|
|
289
|
+
{%- if cookiecutter.datastore_type == "vertex_ai_search" %}
|
|
290
|
+
--data-store-id="{{cookiecutter.project_name}}-datastore" \
|
|
291
|
+
--data-store-region="us" \
|
|
292
|
+
{%- elif cookiecutter.datastore_type == "vertex_ai_vector_search" %}
|
|
293
|
+
--vector-search-index="{{cookiecutter.project_name}}-vector-search" \
|
|
294
|
+
--vector-search-index-endpoint="{{cookiecutter.project_name}}-vector-search-endpoint" \
|
|
295
|
+
--vector-search-data-bucket-name="$$PROJECT_ID-{{cookiecutter.project_name}}-vs" \
|
|
296
|
+
{%- endif %}
|
|
297
|
+
--service-account="{{cookiecutter.project_name}}-rag@$$PROJECT_ID.iam.gserviceaccount.com" \
|
|
298
|
+
--pipeline-root="gs://$$PROJECT_ID-{{cookiecutter.project_name}}-rag" \
|
|
299
|
+
--pipeline-name="data-ingestion-pipeline")
|
|
300
|
+
{%- endif %}
|
|
301
|
+
|
|
302
|
+
# ==============================================================================
|
|
303
|
+
# Testing & Code Quality
|
|
304
|
+
# ==============================================================================
|
|
305
|
+
|
|
306
|
+
# Run unit and integration tests
|
|
307
|
+
test:
|
|
308
|
+
uv sync --dev
|
|
309
|
+
uv run pytest tests/unit && uv run pytest tests/integration
|
|
310
|
+
|
|
311
|
+
# Run code quality checks (codespell, ruff, mypy)
|
|
312
|
+
lint:
|
|
313
|
+
uv sync --dev --extra lint
|
|
314
|
+
uv run codespell
|
|
315
|
+
uv run ruff check . --diff
|
|
316
|
+
uv run ruff format . --check --diff
|
|
317
|
+
uv run mypy .
|
|
318
|
+
{%- if (cookiecutter.is_a2a and cookiecutter.deployment_target == 'cloud_run') or (cookiecutter.is_adk and not cookiecutter.is_a2a and cookiecutter.deployment_target == 'agent_engine') %}
|
|
319
|
+
|
|
320
|
+
# ==============================================================================
|
|
321
|
+
# Gemini Enterprise Integration
|
|
322
|
+
# ==============================================================================
|
|
323
|
+
|
|
324
|
+
# Register the deployed agent to Gemini Enterprise
|
|
325
|
+
# Usage: make register-gemini-enterprise (interactive - will prompt for required details)
|
|
326
|
+
# For non-interactive use, set env vars: ID or GEMINI_ENTERPRISE_APP_ID (full GE resource name)
|
|
327
|
+
# Optional env vars: GEMINI_DISPLAY_NAME, GEMINI_DESCRIPTION{%- if cookiecutter.deployment_target == 'agent_engine' %}, GEMINI_TOOL_DESCRIPTION, AGENT_ENGINE_ID{%- endif %}{%- if cookiecutter.deployment_target == 'cloud_run' %}, AGENT_CARD_URL{%- endif %}
|
|
328
|
+
register-gemini-enterprise:
|
|
329
|
+
{%- if cookiecutter.deployment_target == 'cloud_run' and cookiecutter.is_a2a %}
|
|
330
|
+
@PROJECT_ID=$$(gcloud config get-value project 2>/dev/null) && \
|
|
331
|
+
PROJECT_NUMBER=$$(gcloud projects describe $$PROJECT_ID --format="value(projectNumber)" 2>/dev/null) && \
|
|
332
|
+
uvx agent-starter-pack@{{ cookiecutter.package_version }} register-gemini-enterprise \
|
|
333
|
+
--agent-card-url="https://{{cookiecutter.project_name}}-$$PROJECT_NUMBER.us-central1.run.app/a2a/{{cookiecutter.agent_directory}}/.well-known/agent-card.json" \
|
|
334
|
+
--deployment-target="{{cookiecutter.deployment_target}}" \
|
|
335
|
+
--project-number="$$PROJECT_NUMBER"
|
|
336
|
+
{%- else %}
|
|
337
|
+
@uvx agent-starter-pack@{{ cookiecutter.package_version }} register-gemini-enterprise
|
|
338
|
+
{%- endif %}
|
|
339
|
+
{%- endif %}
|