agent-starter-pack 0.5.3__tar.gz → 0.6.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.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/terraform/build_triggers.tf +12 -1
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/Makefile +3 -1
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/PKG-INFO +1 -1
- {agent_starter_pack-0.5.3/agents/agentic_rag → agent_starter_pack-0.6.0/agents/adk_base}/notebooks/adk_app_testing.ipynb +1 -1
- agent_starter_pack-0.6.0/agents/adk_gemini_fullstack/README.md +148 -0
- agent_starter_pack-0.6.0/agents/adk_gemini_fullstack/app/agent.py +349 -0
- agent_starter_pack-0.6.0/agents/adk_gemini_fullstack/app/config.py +11 -0
- {agent_starter_pack-0.5.3/agents/adk_base → agent_starter_pack-0.6.0/agents/adk_gemini_fullstack}/notebooks/adk_app_testing.ipynb +1 -1
- agent_starter_pack-0.6.0/agents/adk_gemini_fullstack/template/.templateconfig.yaml +37 -0
- agent_starter_pack-0.6.0/agents/adk_gemini_fullstack/tests/integration/test_agent.py +58 -0
- agent_starter_pack-0.6.0/agents/agentic_rag/notebooks/adk_app_testing.ipynb +353 -0
- agent_starter_pack-0.6.0/agents/agentic_rag/notebooks/evaluating_adk_agent.ipynb +1528 -0
- agent_starter_pack-0.6.0/docs/images/adk_gemini_fullstack_architecture.png +0 -0
- agent_starter_pack-0.6.0/docs/images/adk_gemini_fullstack_preview.png +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/pyproject.toml +2 -2
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/Makefile +21 -2
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/README.md +8 -3
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/pyproject.toml +1 -4
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/commands/create.py +17 -10
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/utils/template.py +13 -10
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/cloud_run/app/server.py +7 -1
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/cloud_run/tests/integration/test_server_e2e.py +1 -1
- agent_starter_pack-0.6.0/src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +321 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/components.json +21 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/eslint.config.js +28 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/index.html +12 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/package-lock.json +5829 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/package.json +46 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/public/vite.svg +1 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/App.tsx +565 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ActivityTimeline.tsx +244 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ChatMessagesView.tsx +419 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/InputForm.tsx +60 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/WelcomeScreen.tsx +56 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ui/badge.tsx +46 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ui/button.tsx +59 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ui/card.tsx +92 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ui/input.tsx +21 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ui/scroll-area.tsx +56 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ui/select.tsx +183 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ui/tabs.tsx +64 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/components/ui/textarea.tsx +18 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/global.css +154 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/main.tsx +13 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/utils.ts +7 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/src/vite-env.d.ts +1 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/tsconfig.json +28 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/tsconfig.node.json +24 -0
- agent_starter_pack-0.6.0/src/frontends/adk_gemini_fullstack/frontend/vite.config.ts +26 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/locks/uv-adk_base-agent_engine.lock +24 -24
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/locks/uv-adk_base-cloud_run.lock +24 -24
- agent_starter_pack-0.6.0/src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock +3217 -0
- agent_starter_pack-0.6.0/src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock +3513 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/locks/uv-agentic_rag-agent_engine.lock +88 -85
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/locks/uv-agentic_rag-cloud_run.lock +124 -119
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +94 -91
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +130 -125
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/locks/uv-langgraph_base_react-agent_engine.lock +91 -88
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/locks/uv-langgraph_base_react-cloud_run.lock +130 -125
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/locks/uv-live_api-cloud_run.lock +121 -116
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/cli/commands/test_create.py +39 -109
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/uv.lock +2582 -2582
- agent_starter_pack-0.5.3/src/deployment_targets/cloud_run/tests/load_test/.results/.placeholder +0 -0
- agent_starter_pack-0.5.3/src/frontends/streamlit_adk/frontend/side_bar.py +0 -214
- agent_starter_pack-0.5.3/src/frontends/streamlit_adk/frontend/streamlit_app.py +0 -314
- agent_starter_pack-0.5.3/src/frontends/streamlit_adk/frontend/style/app_markdown.py +0 -37
- agent_starter_pack-0.5.3/src/frontends/streamlit_adk/frontend/utils/chat_utils.py +0 -84
- agent_starter_pack-0.5.3/src/frontends/streamlit_adk/frontend/utils/local_chat_history.py +0 -110
- agent_starter_pack-0.5.3/src/frontends/streamlit_adk/frontend/utils/message_editing.py +0 -61
- agent_starter_pack-0.5.3/src/frontends/streamlit_adk/frontend/utils/multimodal_utils.py +0 -223
- agent_starter_pack-0.5.3/src/frontends/streamlit_adk/frontend/utils/stream_handler.py +0 -311
- agent_starter_pack-0.5.3/src/frontends/streamlit_adk/frontend/utils/title_summary.py +0 -129
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/cd/test_e2e.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/ci/build_use_wheel.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/ci/lint.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/ci/lint_templated_agents.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/ci/test.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/ci/test_templated_agents.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/terraform/apis.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/terraform/service_account.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/terraform/storage.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/terraform/variables.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.github/workflows/docs.yml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.gitignore +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/CODE_OF_CONDUCT.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/CONTRIBUTING.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/LICENSE +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/adk_base/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/adk_base/app/agent.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/adk_base/notebooks/evaluating_adk_agent.ipynb +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/adk_base/template/.templateconfig.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/adk_base/tests/integration/test_agent.py +0 -0
- {agent_starter_pack-0.5.3/agents/agentic_rag → agent_starter_pack-0.6.0/agents/adk_gemini_fullstack}/notebooks/evaluating_adk_agent.ipynb +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/agentic_rag/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/agentic_rag/app/agent.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/agentic_rag/app/retrievers.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/agentic_rag/app/templates.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/agentic_rag/template/.templateconfig.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/agentic_rag/tests/integration/test_agent.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/crewai_coding_crew/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/crewai_coding_crew/app/agent.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/crewai_coding_crew/app/crew/config/agents.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/crewai_coding_crew/app/crew/config/tasks.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/crewai_coding_crew/app/crew/crew.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/crewai_coding_crew/notebooks/evaluating_crewai_agent.ipynb +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/crewai_coding_crew/notebooks/evaluating_langgraph_agent.ipynb +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/crewai_coding_crew/template/.templateconfig.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/crewai_coding_crew/tests/integration/test_agent.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/langgraph_base_react/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/langgraph_base_react/app/agent.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/langgraph_base_react/notebooks/evaluating_langgraph_agent.ipynb +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/langgraph_base_react/template/.templateconfig.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/langgraph_base_react/tests/integration/test_agent.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/live_api/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/live_api/app/agent.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/live_api/app/server.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/live_api/template/.templateconfig.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/live_api/tests/integration/test_server_e2e.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/live_api/tests/load_test/load_test.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/agents/live_api/tests/unit/test_server.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/.vitepress/config.js +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/agents/overview.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/cli/create.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/cli/index.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/cli/setup_cicd.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/guide/data-ingestion.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/guide/deployment.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/guide/development-guide.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/guide/getting-started.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/guide/installation.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/guide/observability.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/guide/troubleshooting.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/guide/video-tutorials.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/guide/why_starter_pack.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/images/adk_logo.png +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/images/agent_starter_pack_screenshot.png +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/images/ags_high_level_architecture.png +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/images/icon.png +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/images/logo.png +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/images/prototype_to_prod.png +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/images/why_sp_edited.png +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/images/why_starter_pack.png +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/index.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/package-lock.json +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/docs/package.json +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/.gitignore +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/app/__init__.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/app/utils/gcs.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/app/utils/tracing.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/app/utils/typing.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/cd/deploy-to-prod.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/cd/staging.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/ci/pr_checks.yaml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/apis.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/build_triggers.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/dev/apis.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/dev/iam.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/dev/log_sinks.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/dev/providers.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/dev/storage.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/dev/variables.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/dev/vars/env.tfvars +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/iam.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/locals.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/log_sinks.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/providers.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/service_accounts.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/storage.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/variables.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/deployment/terraform/vars/env.tfvars +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/base_template/tests/unit/test_dummy.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/commands/setup_cicd.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/main.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/utils/__init__.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/utils/cicd.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/utils/datastores.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/utils/gcp.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/utils/logging.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/cli/utils/version.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/data_ingestion/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/data_ingestion/data_ingestion_pipeline/components/ingest_data.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/data_ingestion/data_ingestion_pipeline/components/process_data.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/data_ingestion/data_ingestion_pipeline/pipeline.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/data_ingestion/data_ingestion_pipeline/submit_pipeline.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/data_ingestion/pyproject.toml +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/data_ingestion/uv.lock +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/agent_engine/app/agent_engine_app.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/agent_engine/deployment_metadata.json +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/agent_engine/notebooks/intro_agent_engine.ipynb +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/agent_engine/tests/integration/test_agent_engine_app.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/agent_engine/tests/load_test/.results/.placeholder +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/agent_engine/tests/load_test/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/agent_engine/tests/load_test/load_test.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/cloud_run/Dockerfile +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/cloud_run/tests/load_test/README.md +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/cloud_run/tests/load_test/load_test.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/deployment_targets/cloud_run/uv.lock +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/package-lock.json +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/package.json +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/public/favicon.ico +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/public/index.html +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/public/robots.txt +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/App.scss +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/App.test.tsx +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/App.tsx +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/components/audio-pulse/AudioPulse.tsx +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/components/audio-pulse/audio-pulse.scss +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/components/control-tray/ControlTray.tsx +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/components/control-tray/control-tray.scss +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/components/logger/Logger.tsx +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/components/logger/logger.scss +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/components/logger/mock-logs.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/components/side-panel/SidePanel.tsx +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/components/side-panel/side-panel.scss +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/contexts/LiveAPIContext.tsx +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/hooks/use-live-api.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/hooks/use-media-stream-mux.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/hooks/use-screen-capture.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/hooks/use-webcam.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/index.css +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/index.tsx +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/multimodal-live-types.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/react-app-env.d.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/reportWebVitals.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/setupTests.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/utils/audio-recorder.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/utils/audio-streamer.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/utils/audioworklet-registry.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/utils/multimodal-live-client.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/utils/store-logger.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/utils/utils.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/utils/worklets/audio-processing.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/src/utils/worklets/vol-meter.ts +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/live_api_react/frontend/tsconfig.json +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/streamlit/frontend/side_bar.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/streamlit/frontend/streamlit_app.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/streamlit/frontend/style/app_markdown.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/streamlit/frontend/utils/chat_utils.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/streamlit/frontend/utils/local_chat_history.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/streamlit/frontend/utils/message_editing.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/streamlit/frontend/utils/multimodal_utils.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/streamlit/frontend/utils/stream_handler.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/frontends/streamlit/frontend/utils/title_summary.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/containers/data_processing/Dockerfile +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/containers/e2e-tests/Dockerfile +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/idx/.idx/dev.nix +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/idx/idx-template.json +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/idx/idx-template.nix +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/setup_cicd/cicd_variables.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/setup_cicd/github.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/resources/setup_cicd/providers.tf +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/utils/generate_locks.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/utils/lock_utils.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/src/utils/watch_and_rebuild.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/__init__.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/cicd/example.env +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/cicd/test_e2e_deployment.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/cli/commands/test_setup_cicd.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/cli/utils/test_cicd.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/integration/test_template_linting.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/integration/test_templated_patterns.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/test_frontend/test_side_bar.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/test_frontend/test_streamlit_app.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/test_frontend/test_utils/test_chat_utils.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/test_frontend/test_utils/test_local_chat_history.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/test_frontend/test_utils/test_message_editing.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/test_frontend/test_utils/test_multimodal_utils.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/test_frontend/test_utils/test_stream_handler.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/utils/__init__.py +0 -0
- {agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/tests/utils/get_agents.py +0 -0
{agent_starter_pack-0.5.3 → agent_starter_pack-0.6.0}/.cloudbuild/terraform/build_triggers.tf
RENAMED
@@ -84,6 +84,14 @@ locals {
|
|
84
84
|
name = "live_api-cloud_run"
|
85
85
|
value = "live_api,cloud_run"
|
86
86
|
},
|
87
|
+
{
|
88
|
+
name = "adk_gemini_fullstack-agent_engine"
|
89
|
+
value = "adk_gemini_fullstack,agent_engine"
|
90
|
+
},
|
91
|
+
{
|
92
|
+
name = "adk_gemini_fullstack-cloud_run"
|
93
|
+
value = "adk_gemini_fullstack,cloud_run"
|
94
|
+
},
|
87
95
|
]
|
88
96
|
|
89
97
|
agent_testing_included_files = { for combo in local.agent_testing_combinations :
|
@@ -126,8 +134,11 @@ locals {
|
|
126
134
|
name = "live_api-cloud_run"
|
127
135
|
value = "live_api,cloud_run"
|
128
136
|
},
|
137
|
+
{
|
138
|
+
name = "adk_gemini_fullstack-agent_engine"
|
139
|
+
value = "adk_gemini_fullstack,agent_engine"
|
140
|
+
},
|
129
141
|
]
|
130
|
-
|
131
142
|
# Create a safe trigger name by replacing underscores with hyphens and dots with hyphens
|
132
143
|
# This ensures we have valid trigger names that don't exceed character limits
|
133
144
|
trigger_name_safe = { for combo in local.agent_testing_combinations :
|
@@ -13,7 +13,7 @@ generate-lock:
|
|
13
13
|
lint:
|
14
14
|
uv run ruff check . --config pyproject.toml --diff
|
15
15
|
uv run ruff format . --check --config pyproject.toml --diff
|
16
|
-
uv run mypy --config-file pyproject.toml ./agents ./src/cli ./tests ./src/frontends/streamlit
|
16
|
+
uv run mypy --config-file pyproject.toml ./agents ./src/cli ./tests ./src/frontends/streamlit
|
17
17
|
|
18
18
|
lint-templated-agents:
|
19
19
|
uv run tests/integration/test_template_linting.py
|
@@ -26,3 +26,5 @@ install:
|
|
26
26
|
|
27
27
|
docs-dev:
|
28
28
|
cd docs && npm install && NODE_OPTIONS="--no-warnings" npm run docs:dev
|
29
|
+
|
30
|
+
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# Gemini Fullstack Agent Development Kit (ADK) Quickstart
|
2
|
+
|
3
|
+
The **Gemini Fullstack Agent Development Kit (ADK) Quickstart** is a production-ready blueprint for building a sophisticated, fullstack research agent with Gemini. It's built to demonstrate how the ADK helps structure complex agentic workflows, build modular agents, and incorporate critical Human-in-the-Loop (HITL) steps.
|
4
|
+
|
5
|
+
<table>
|
6
|
+
<thead>
|
7
|
+
<tr>
|
8
|
+
<th colspan="2">Key Features</th>
|
9
|
+
</tr>
|
10
|
+
</thead>
|
11
|
+
<tbody>
|
12
|
+
<tr>
|
13
|
+
<td>🏗️</td>
|
14
|
+
<td><strong>Fullstack & Production-Ready:</strong> A complete React frontend and ADK-powered FastAPI backend, with deployment options for <a href="https://cloud.google.com/run">Google Cloud Run</a> and <a href="https://cloud.google.com/vertex-ai/generative-ai/docs/agent-engine/overview">Vertex AI Agent Engine</a>.</td>
|
15
|
+
</tr>
|
16
|
+
<tr>
|
17
|
+
<td>🧠</td>
|
18
|
+
<td><strong>Advanced Agentic Workflow:</strong> The agent uses Gemini to <strong>strategize</strong> a multi-step plan, <strong>reflect</strong> on findings to identify gaps, and <strong>synthesize</strong> a final, comprehensive report.</td>
|
19
|
+
</tr>
|
20
|
+
<tr>
|
21
|
+
<td>🔄</td>
|
22
|
+
<td><strong>Iterative & Human-in-the-Loop Research:</strong> Involves the user for plan approval, then autonomously loops through searching (via Gemini function calling) and refining its results until it has gathered sufficient information.</td>
|
23
|
+
</tr>
|
24
|
+
</tbody>
|
25
|
+
</table>
|
26
|
+
|
27
|
+
<img src="../../docs/images/adk_gemini_fullstack_preview.png" alt="Gemini Fullstack ADK Preview">
|
28
|
+
|
29
|
+
This project adapts concepts from the [Gemini FullStack LangGraph Quickstart](https://github.com/google-gemini/gemini-fullstack-langgraph-quickstart) for the frontend app.
|
30
|
+
|
31
|
+
## 🚀 Getting Started: From Zero to Running Agent in 1 Minute
|
32
|
+
|
33
|
+
**Prerequisites:**
|
34
|
+
|
35
|
+
* **[Python 3.10+](https://www.python.org/downloads/)**
|
36
|
+
* **[Node.js and npm](https://nodejs.org/)**
|
37
|
+
* **[Google Cloud SDK](https://cloud.google.com/sdk/docs/install)**
|
38
|
+
|
39
|
+
### Step 1: Create Your Agent Project
|
40
|
+
|
41
|
+
|
42
|
+
This command uses the [Agent Starter Pack](goo.gle/agent-starter-pack) to create a new directory (`my-fullstack-agent`) with all the necessary code.
|
43
|
+
```bash
|
44
|
+
# Create and activate a virtual environment
|
45
|
+
python -m venv .venv && source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
46
|
+
|
47
|
+
# Install the starter pack and create your project
|
48
|
+
pip install agent-starter-pack
|
49
|
+
agent-starter-pack create my-fullstack-agent -a adk_gemini_fullstack
|
50
|
+
```
|
51
|
+
|
52
|
+
<details>
|
53
|
+
<summary>⚡️ Alternative: Using uv</summary>
|
54
|
+
|
55
|
+
If you have [`uv`](https://github.com/astral-sh/uv) installed, you can create and set up your project with a single command:
|
56
|
+
|
57
|
+
```bash
|
58
|
+
uvx agent-starter-pack create my-fullstack-agent -a adk_gemini_fullstack
|
59
|
+
```
|
60
|
+
This command handles creating the project without needing to pre-install the package into a virtual environment.
|
61
|
+
|
62
|
+
</details>
|
63
|
+
|
64
|
+
You'll be prompted to select a deployment option (Agent Engine or Cloud Run) and verify your Google Cloud credentials.
|
65
|
+
|
66
|
+
### Step 2: Install Dependencies & Run the Agent
|
67
|
+
|
68
|
+
Now, navigate into your new project, install the dependencies, and start the servers with a single command.
|
69
|
+
|
70
|
+
```bash
|
71
|
+
cd my-fullstack-agent && make install && make dev
|
72
|
+
```
|
73
|
+
|
74
|
+
Your agent should now be running!
|
75
|
+
* Backend API: `http://localhost:8000`
|
76
|
+
* Frontend UI: `http://localhost:5173`
|
77
|
+
|
78
|
+
## ☁️ Deployment
|
79
|
+
|
80
|
+
You can quickly deploy your agent to a **development environment** on Google Cloud. You can deploy your latest code at any time with:
|
81
|
+
|
82
|
+
```bash
|
83
|
+
# Replace YOUR_DEV_PROJECT_ID with your actual Google Cloud Project ID
|
84
|
+
gcloud config set project YOUR_DEV_PROJECT_ID
|
85
|
+
make backend
|
86
|
+
```
|
87
|
+
|
88
|
+
For robust, **production-ready deployments** with automated CI/CD, please follow the detailed instructions in the **[Agent Starter Pack Development Guide](https://googlecloudplatform.github.io/agent-starter-pack/guide/development-guide.html#b-production-ready-deployment-with-ci-cd)**.
|
89
|
+
|
90
|
+
## How the Agent Thinks: A Two-Phase Workflow
|
91
|
+
|
92
|
+
The backend agent, defined in `app/agent.py`, follows a sophisticated workflow to move from a simple topic to a fully-researched report.
|
93
|
+
|
94
|
+
The following diagram illustrates the agent's architecture and workflow:
|
95
|
+
|
96
|
+

|
97
|
+
|
98
|
+
This process is broken into two main phases:
|
99
|
+
|
100
|
+
### Phase 1: Plan & Refine (Human-in-the-Loop)
|
101
|
+
|
102
|
+
This is the collaborative brainstorming phase.
|
103
|
+
|
104
|
+
1. **You provide a research topic.**
|
105
|
+
2. The agent generates a high-level research plan with several key goals (e.g., "Analyze the market impact," "Identify key competitors").
|
106
|
+
3. The plan is presented to **you**. You can approve it, or chat with the agent to add, remove, or change goals until you're satisfied. Nothing happens without your explicit approval.
|
107
|
+
|
108
|
+
### Phase 2: Execute Autonomous Research
|
109
|
+
|
110
|
+
Once you approve the plan, the agent's `research_pipeline` takes over and works autonomously.
|
111
|
+
|
112
|
+
1. **Outlining:** It first converts the approved plan into a structured report outline (like a table of contents).
|
113
|
+
2. **Iterative Research & Critique Loop:** For each section of the outline, it repeats a cycle:
|
114
|
+
* **Search:** It performs web searches to gather information.
|
115
|
+
* **Critique:** A "critic" model evaluates the findings for gaps or weaknesses.
|
116
|
+
* **Refine:** If the critique finds weaknesses, the agent generates more specific follow-up questions and searches again. This loop continues until the research meets a high-quality bar.
|
117
|
+
3. **Compose Final Report:** After the research loop is complete, a final agent takes all the verified findings and writes a polished report, automatically adding inline citations that link back to the original sources.
|
118
|
+
|
119
|
+
You can edit key parameters (Gemini models, research loop iterations) in the `ResearchConfiguration` dataclass within `app/config.py`.
|
120
|
+
|
121
|
+
## 🔄 Frontend-Backend Integration
|
122
|
+
|
123
|
+
The frontend UI integrates with the backend through specific agent names that:
|
124
|
+
|
125
|
+
1. **Process agent outputs** - Different outputs are handled in specific ways (research findings vs. final report)
|
126
|
+
2. **Update the activity timeline** - Each agent's activity appears with appropriate titles and icons
|
127
|
+
3. **Track research metrics** - Website counts and progress indicators are based on agent activities
|
128
|
+
|
129
|
+
Important agent names for frontend functionality:
|
130
|
+
|
131
|
+
- `section_researcher` & `enhanced_search_executor`: Track websites consulted
|
132
|
+
- `report_composer_with_citations`: Processes final report with citations
|
133
|
+
- `interactive_planner_agent`: Updates AI messages during planning
|
134
|
+
- Other agents (`plan_generator`, `section_planner`, etc.): Used for timeline labels
|
135
|
+
|
136
|
+
If you modify agent names in `app/agent.py`, update the frontend code accordingly to maintain functionality.
|
137
|
+
|
138
|
+
## 🛠️ Technologies Used
|
139
|
+
|
140
|
+
### Backend
|
141
|
+
* [**Agent Development Kit (ADK)**](https://github.com/google/adk-python): The core framework for building the stateful, multi-turn agent.
|
142
|
+
* [**FastAPI**](https://fastapi.tiangolo.com/): High-performance web framework for the backend API.
|
143
|
+
* [**Google Gemini**](https://cloud.google.com/vertex-ai/generative-ai/docs): Used for planning, reasoning, search query generation, and final synthesis.
|
144
|
+
|
145
|
+
### Frontend
|
146
|
+
* [**React**](https://reactjs.org/) (with [Vite](https://vitejs.dev/)): For building the interactive user interface.
|
147
|
+
* [**Tailwind CSS**](https://tailwindcss.com/): For utility-first styling.
|
148
|
+
* [**Shadcn UI**](https://ui.shadcn.com/): A set of beautifully designed, accessible components.
|
@@ -0,0 +1,349 @@
|
|
1
|
+
import datetime
|
2
|
+
import logging
|
3
|
+
import os
|
4
|
+
import re
|
5
|
+
from collections.abc import AsyncGenerator
|
6
|
+
from typing import Literal
|
7
|
+
|
8
|
+
import google.auth
|
9
|
+
from google.adk.agents import BaseAgent, LlmAgent, LoopAgent, SequentialAgent
|
10
|
+
from google.adk.agents.callback_context import CallbackContext
|
11
|
+
from google.adk.agents.invocation_context import InvocationContext
|
12
|
+
from google.adk.events import Event, EventActions
|
13
|
+
from google.adk.planners import BuiltInPlanner
|
14
|
+
from google.adk.tools import google_search
|
15
|
+
from google.adk.tools.agent_tool import AgentTool
|
16
|
+
from google.genai import types as genai_types
|
17
|
+
from pydantic import BaseModel, Field
|
18
|
+
|
19
|
+
from .config import config
|
20
|
+
|
21
|
+
_, project_id = google.auth.default()
|
22
|
+
os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
|
23
|
+
os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
|
24
|
+
os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")
|
25
|
+
|
26
|
+
|
27
|
+
# --- Structured Output Models ---
|
28
|
+
class SearchQuery(BaseModel):
|
29
|
+
"""Model representing a specific search query for web search."""
|
30
|
+
|
31
|
+
search_query: str = Field(
|
32
|
+
description="A highly specific and targeted query for web search."
|
33
|
+
)
|
34
|
+
|
35
|
+
|
36
|
+
class Feedback(BaseModel):
|
37
|
+
"""Model for providing evaluation feedback on research quality."""
|
38
|
+
|
39
|
+
grade: Literal["pass", "fail"] = Field(
|
40
|
+
description="Evaluation result. 'pass' if the research is sufficient, 'fail' if it needs revision."
|
41
|
+
)
|
42
|
+
comment: str = Field(
|
43
|
+
description="Detailed explanation of the evaluation, highlighting strengths and/or weaknesses of the research."
|
44
|
+
)
|
45
|
+
follow_up_queries: list[SearchQuery] | None = Field(
|
46
|
+
default=None,
|
47
|
+
description="A list of specific, targeted follow-up search queries needed to fix research gaps. This should be null or empty if the grade is 'pass'.",
|
48
|
+
)
|
49
|
+
|
50
|
+
|
51
|
+
# --- Callbacks ---
|
52
|
+
def collect_research_sources_callback(callback_context: CallbackContext) -> None:
|
53
|
+
"""Collects and organizes web-based research sources and their supported claims from agent events.
|
54
|
+
|
55
|
+
This function processes the agent's `session.events` to extract web source details (URLs,
|
56
|
+
titles, domains from `grounding_chunks`) and associated text segments with confidence scores
|
57
|
+
(from `grounding_supports`). The aggregated source information and a mapping of URLs to short
|
58
|
+
IDs are cumulatively stored in `callback_context.state`.
|
59
|
+
|
60
|
+
Args:
|
61
|
+
callback_context (CallbackContext): The context object providing access to the agent's
|
62
|
+
session events and persistent state.
|
63
|
+
"""
|
64
|
+
session = callback_context._invocation_context.session
|
65
|
+
url_to_short_id = callback_context.state.get("url_to_short_id", {})
|
66
|
+
sources = callback_context.state.get("sources", {})
|
67
|
+
id_counter = len(url_to_short_id) + 1
|
68
|
+
for event in session.events:
|
69
|
+
if not (event.grounding_metadata and event.grounding_metadata.grounding_chunks):
|
70
|
+
continue
|
71
|
+
chunks_info = {}
|
72
|
+
for idx, chunk in enumerate(event.grounding_metadata.grounding_chunks):
|
73
|
+
if not chunk.web:
|
74
|
+
continue
|
75
|
+
url = chunk.web.uri
|
76
|
+
title = (
|
77
|
+
chunk.web.title
|
78
|
+
if chunk.web.title != chunk.web.domain
|
79
|
+
else chunk.web.domain
|
80
|
+
)
|
81
|
+
if url not in url_to_short_id:
|
82
|
+
short_id = f"src-{id_counter}"
|
83
|
+
url_to_short_id[url] = short_id
|
84
|
+
sources[short_id] = {
|
85
|
+
"short_id": short_id,
|
86
|
+
"title": title,
|
87
|
+
"url": url,
|
88
|
+
"domain": chunk.web.domain,
|
89
|
+
"supported_claims": [],
|
90
|
+
}
|
91
|
+
id_counter += 1
|
92
|
+
chunks_info[idx] = url_to_short_id[url]
|
93
|
+
if event.grounding_metadata.grounding_supports:
|
94
|
+
for support in event.grounding_metadata.grounding_supports:
|
95
|
+
confidence_scores = support.confidence_scores or []
|
96
|
+
chunk_indices = support.grounding_chunk_indices or []
|
97
|
+
for i, chunk_idx in enumerate(chunk_indices):
|
98
|
+
if chunk_idx in chunks_info:
|
99
|
+
short_id = chunks_info[chunk_idx]
|
100
|
+
confidence = (
|
101
|
+
confidence_scores[i] if i < len(confidence_scores) else 0.5
|
102
|
+
)
|
103
|
+
text_segment = support.segment.text if support.segment else ""
|
104
|
+
sources[short_id]["supported_claims"].append(
|
105
|
+
{
|
106
|
+
"text_segment": text_segment,
|
107
|
+
"confidence": confidence,
|
108
|
+
}
|
109
|
+
)
|
110
|
+
callback_context.state["url_to_short_id"] = url_to_short_id
|
111
|
+
callback_context.state["sources"] = sources
|
112
|
+
|
113
|
+
|
114
|
+
def citation_replacement_callback(
|
115
|
+
callback_context: CallbackContext,
|
116
|
+
) -> genai_types.Content:
|
117
|
+
"""Replaces citation tags in a report with Markdown-formatted links.
|
118
|
+
|
119
|
+
Processes 'final_cited_report' from context state, converting tags like
|
120
|
+
`<cite source="src-N"/>` into hyperlinks using source information from
|
121
|
+
`callback_context.state["sources"]`. Also fixes spacing around punctuation.
|
122
|
+
|
123
|
+
Args:
|
124
|
+
callback_context (CallbackContext): Contains the report and source information.
|
125
|
+
|
126
|
+
Returns:
|
127
|
+
genai_types.Content: The processed report with Markdown citation links.
|
128
|
+
"""
|
129
|
+
final_report = callback_context.state.get("final_cited_report", "")
|
130
|
+
sources = callback_context.state.get("sources", {})
|
131
|
+
|
132
|
+
def tag_replacer(match: re.Match) -> str:
|
133
|
+
short_id = match.group(1)
|
134
|
+
if not (source_info := sources.get(short_id)):
|
135
|
+
logging.warning(f"Invalid citation tag found and removed: {match.group(0)}")
|
136
|
+
return ""
|
137
|
+
display_text = source_info.get("title", source_info.get("domain", short_id))
|
138
|
+
return f" [{display_text}]({source_info['url']})"
|
139
|
+
|
140
|
+
processed_report = re.sub(
|
141
|
+
r'<cite\s+source\s*=\s*["\']?\s*(src-\d+)\s*["\']?\s*/>',
|
142
|
+
tag_replacer,
|
143
|
+
final_report,
|
144
|
+
)
|
145
|
+
processed_report = re.sub(r"\s+([.,;:])", r"\1", processed_report)
|
146
|
+
callback_context.state["final_report_with_citations"] = processed_report
|
147
|
+
return genai_types.Content(parts=[genai_types.Part(text=processed_report)])
|
148
|
+
|
149
|
+
|
150
|
+
# --- Custom Agent for Loop Control ---
|
151
|
+
class EscalationChecker(BaseAgent):
|
152
|
+
"""Checks research evaluation and escalates to stop the loop if grade is 'pass'."""
|
153
|
+
|
154
|
+
def __init__(self, name: str):
|
155
|
+
super().__init__(name=name)
|
156
|
+
|
157
|
+
async def _run_async_impl(
|
158
|
+
self, ctx: InvocationContext
|
159
|
+
) -> AsyncGenerator[Event, None]:
|
160
|
+
evaluation_result = ctx.session.state.get("research_evaluation")
|
161
|
+
if evaluation_result and evaluation_result.get("grade") == "pass":
|
162
|
+
logging.info(
|
163
|
+
f"[{self.name}] Research evaluation passed. Escalating to stop loop."
|
164
|
+
)
|
165
|
+
yield Event(author=self.name, actions=EventActions(escalate=True))
|
166
|
+
else:
|
167
|
+
logging.info(
|
168
|
+
f"[{self.name}] Research evaluation failed or not found. Loop will continue."
|
169
|
+
)
|
170
|
+
# Yielding an event without content or actions just lets the flow continue.
|
171
|
+
yield Event(author=self.name)
|
172
|
+
|
173
|
+
|
174
|
+
# --- AGENT DEFINITIONS ---
|
175
|
+
plan_generator = LlmAgent(
|
176
|
+
model=config.worker_model,
|
177
|
+
name="plan_generator",
|
178
|
+
description="Generates a 4-5 line action-oriented research plan, using minimal search only for topic clarification.",
|
179
|
+
instruction=f"""
|
180
|
+
You are a research strategist. Your job is to create a high-level RESEARCH PLAN, not a summary.
|
181
|
+
**RULE: Your output MUST be a bulleted list of 4-5 action-oriented research goals or key questions.**
|
182
|
+
- A good goal starts with a verb like "Analyze," "Identify," "Investigate."
|
183
|
+
- A bad output is a statement of fact like "The event was in April 2024."
|
184
|
+
**TOOL USE IS STRICTLY LIMITED:**
|
185
|
+
Your goal is to create a generic, high-quality plan *without searching*.
|
186
|
+
Only use `google_search` if a topic is ambiguous or time-sensitive and you absolutely cannot create a plan without a key piece of identifying information.
|
187
|
+
You are explicitly forbidden from researching the *content* or *themes* of the topic. That is the next agent's job. Your search is only to identify the subject, not to investigate it.
|
188
|
+
Current date: {datetime.datetime.now().strftime("%Y-%m-%d")}
|
189
|
+
""",
|
190
|
+
tools=[google_search],
|
191
|
+
)
|
192
|
+
|
193
|
+
|
194
|
+
section_planner = LlmAgent(
|
195
|
+
model=config.worker_model,
|
196
|
+
name="section_planner",
|
197
|
+
description="Breaks down the research plan into a structured markdown outline of report sections.",
|
198
|
+
instruction="""
|
199
|
+
You are an expert report architect. Using the research topic and the plan from the 'research_plan' state key, design a logical structure for the final report.
|
200
|
+
Your task is to create a markdown outline with 4-6 distinct sections that cover the topic comprehensively without overlap.
|
201
|
+
You can use any markdown format you prefer, but here's a suggested structure:
|
202
|
+
# Section Name
|
203
|
+
A brief overview of what this section covers
|
204
|
+
Feel free to add subsections or bullet points if needed to better organize the content.
|
205
|
+
Make sure your outline is clear and easy to follow.
|
206
|
+
Do not include a "References" or "Sources" section in your outline. Citations will be handled in-line.
|
207
|
+
""",
|
208
|
+
output_key="report_sections",
|
209
|
+
)
|
210
|
+
|
211
|
+
|
212
|
+
section_researcher = LlmAgent(
|
213
|
+
model=config.worker_model,
|
214
|
+
name="section_researcher",
|
215
|
+
description="Performs the crucial first pass of web research.",
|
216
|
+
planner=BuiltInPlanner(
|
217
|
+
thinking_config=genai_types.ThinkingConfig(include_thoughts=True)
|
218
|
+
),
|
219
|
+
instruction="""
|
220
|
+
You are a diligent and exhaustive researcher. Your task is to perform the initial, broad information gathering for a report.
|
221
|
+
You will be provided with a list of sections in the 'report_sections' state key.
|
222
|
+
For each section where 'research' is marked as 'true', generate a comprehensive list of 4-5 targeted search queries to cover the topic from multiple angles.
|
223
|
+
Execute all of these queries using the 'google_search' tool and synthesize the results into a detailed summary for that section.
|
224
|
+
""",
|
225
|
+
tools=[google_search],
|
226
|
+
output_key="section_research_findings",
|
227
|
+
after_agent_callback=collect_research_sources_callback,
|
228
|
+
)
|
229
|
+
|
230
|
+
research_evaluator = LlmAgent(
|
231
|
+
model=config.critic_model,
|
232
|
+
name="research_evaluator",
|
233
|
+
description="Critically evaluates research and generates follow-up queries.",
|
234
|
+
instruction=f"""
|
235
|
+
You are a meticulous quality assurance analyst evaluating the research findings in 'section_research_findings'.
|
236
|
+
|
237
|
+
**CRITICAL RULES:**
|
238
|
+
1. Assume the given research topic is correct. Do not question or try to verify the subject itself.
|
239
|
+
2. Your ONLY job is to assess the quality, depth, and completeness of the research provided *for that topic*.
|
240
|
+
3. Focus on evaluating: Comprehensiveness of coverage, logical flow and organization, use of credible sources, depth of analysis, and clarity of explanations.
|
241
|
+
4. Do NOT fact-check or question the fundamental premise or timeline of the topic.
|
242
|
+
5. If suggesting follow-up queries, they should dive deeper into the existing topic, not question its validity.
|
243
|
+
|
244
|
+
Be very critical about the QUALITY of research. If you find significant gaps in depth or coverage, assign a grade of "fail",
|
245
|
+
write a detailed comment about what's missing, and generate 5-7 specific follow-up queries to fill those gaps.
|
246
|
+
If the research thoroughly covers the topic, grade "pass".
|
247
|
+
|
248
|
+
Current date: {datetime.datetime.now().strftime("%Y-%m-%d")}
|
249
|
+
Your response must be a single, raw JSON object validating against the 'Feedback' schema.
|
250
|
+
""",
|
251
|
+
output_schema=Feedback,
|
252
|
+
output_key="research_evaluation",
|
253
|
+
)
|
254
|
+
|
255
|
+
enhanced_search_executor = LlmAgent(
|
256
|
+
model=config.worker_model,
|
257
|
+
name="enhanced_search_executor",
|
258
|
+
description="Executes follow-up searches and integrates new findings.",
|
259
|
+
planner=BuiltInPlanner(
|
260
|
+
thinking_config=genai_types.ThinkingConfig(include_thoughts=True)
|
261
|
+
),
|
262
|
+
instruction="""
|
263
|
+
You are a specialist researcher executing a refinement pass.
|
264
|
+
You have been activated because the previous research was graded as 'fail'.
|
265
|
+
|
266
|
+
1. Review the 'research_evaluation' state key to understand the feedback and required fixes.
|
267
|
+
2. Execute EVERY query listed in 'follow_up_queries' using the 'google_search' tool.
|
268
|
+
3. Synthesize the new findings and COMBINE them with the existing information in 'section_research_findings'.
|
269
|
+
4. Your output MUST be the new, complete, and improved set of research findings.
|
270
|
+
""",
|
271
|
+
tools=[google_search],
|
272
|
+
output_key="section_research_findings",
|
273
|
+
after_agent_callback=collect_research_sources_callback,
|
274
|
+
)
|
275
|
+
|
276
|
+
report_composer = LlmAgent(
|
277
|
+
model=config.critic_model,
|
278
|
+
name="report_composer_with_citations",
|
279
|
+
include_contents="none",
|
280
|
+
description="Transforms research data and a markdown outline into a final, cited report.",
|
281
|
+
instruction="""
|
282
|
+
Transform the provided data into a polished, professional, and meticulously cited research report.
|
283
|
+
|
284
|
+
---
|
285
|
+
### INPUT DATA
|
286
|
+
* Research Plan: `{research_plan}`
|
287
|
+
* Research Findings: `{section_research_findings}`
|
288
|
+
* Citation Sources: `{sources}`
|
289
|
+
* Report Structure: `{report_sections}`
|
290
|
+
|
291
|
+
---
|
292
|
+
### CRITICAL: Citation System
|
293
|
+
To cite a source, you MUST insert a special citation tag directly after the claim it supports.
|
294
|
+
|
295
|
+
**The only correct format is:** `<cite source="src-ID_NUMBER" />`
|
296
|
+
|
297
|
+
---
|
298
|
+
### Final Instructions
|
299
|
+
Generate a comprehensive report using ONLY the `<cite source="src-ID_NUMBER" />` tag system for all citations.
|
300
|
+
The final report must strictly follow the structure provided in the **Report Structure** markdown outline.
|
301
|
+
Do not include a "References" or "Sources" section; all citations must be in-line.
|
302
|
+
""",
|
303
|
+
output_key="final_cited_report",
|
304
|
+
after_agent_callback=citation_replacement_callback,
|
305
|
+
)
|
306
|
+
|
307
|
+
research_pipeline = SequentialAgent(
|
308
|
+
name="research_pipeline",
|
309
|
+
description="Executes a pre-approved research plan. It performs iterative research, evaluation, and composes a final, cited report.",
|
310
|
+
sub_agents=[
|
311
|
+
section_planner,
|
312
|
+
section_researcher,
|
313
|
+
LoopAgent(
|
314
|
+
name="iterative_refinement_loop",
|
315
|
+
max_iterations=config.max_search_iterations,
|
316
|
+
sub_agents=[
|
317
|
+
research_evaluator,
|
318
|
+
EscalationChecker(name="escalation_checker"),
|
319
|
+
enhanced_search_executor,
|
320
|
+
],
|
321
|
+
),
|
322
|
+
report_composer,
|
323
|
+
],
|
324
|
+
)
|
325
|
+
|
326
|
+
interactive_planner_agent = LlmAgent(
|
327
|
+
name="interactive_planner_agent",
|
328
|
+
model=config.worker_model,
|
329
|
+
description="The primary research assistant. It collaborates with the user to create a research plan, and then executes it upon approval.",
|
330
|
+
instruction=f"""
|
331
|
+
You are a research planning assistant. Your primary function is to convert ANY user request into a research plan.
|
332
|
+
|
333
|
+
**CRITICAL RULE: Never answer a question directly or refuse a request.** Your one and only first step is to use the `plan_generator` tool to propose a research plan for the user's topic.
|
334
|
+
If the user asks a question, you MUST immediately call `plan_generator` to create a plan to answer the question.
|
335
|
+
|
336
|
+
Your workflow is:
|
337
|
+
1. **Plan:** Use `plan_generator` to create a draft plan and present it to the user.
|
338
|
+
2. **Refine:** Incorporate user feedback until the plan is approved.
|
339
|
+
3. **Execute:** Once the user gives EXPLICIT approval (e.g., "looks good, run it"), you MUST delegate the task to the `research_pipeline` agent, passing the approved plan.
|
340
|
+
|
341
|
+
Current date: {datetime.datetime.now().strftime("%Y-%m-%d")}
|
342
|
+
Do not perform any research yourself. Your job is to Plan, Refine, and Delegate.
|
343
|
+
""",
|
344
|
+
sub_agents=[research_pipeline],
|
345
|
+
tools=[AgentTool(plan_generator)],
|
346
|
+
output_key="research_plan",
|
347
|
+
)
|
348
|
+
|
349
|
+
root_agent = interactive_planner_agent
|
@@ -0,0 +1,37 @@
|
|
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 production-ready fullstack research agent that uses Gemini to strategize, research, and synthesize comprehensive reports with human-in-the-loop collaboration"
|
16
|
+
example_question: "A report on the latest Google I/O event"
|
17
|
+
settings:
|
18
|
+
requires_data_ingestion: false
|
19
|
+
deployment_targets: ["agent_engine", "cloud_run"]
|
20
|
+
extra_dependencies: ["google-adk~=1.3.0"]
|
21
|
+
tags: ["adk"]
|
22
|
+
frontend_type: "adk_gemini_fullstack"
|
23
|
+
commands:
|
24
|
+
override:
|
25
|
+
install: "npm --prefix frontend install"
|
26
|
+
extra:
|
27
|
+
dev:
|
28
|
+
command: 'make dev-backend & make dev-frontend'
|
29
|
+
description: "Start the ADK API server and React frontend development server simultaneously"
|
30
|
+
dev-backend:
|
31
|
+
command:
|
32
|
+
agent_engine: 'uv run adk api_server app --allow_origins="*"'
|
33
|
+
cloud_run: 'ALLOW_ORIGINS="*" uv run uvicorn app.server:app --host 0.0.0.0 --port 8000 --reload'
|
34
|
+
description: "Start the ADK API server"
|
35
|
+
dev-frontend:
|
36
|
+
command: 'npm --prefix frontend run dev'
|
37
|
+
description: "Start the React frontend development server"
|