agent-starter-pack 0.6.1__py3-none-any.whl → 0.6.3__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.
Files changed (22) hide show
  1. {agent_starter_pack-0.6.1.dist-info → agent_starter_pack-0.6.3.dist-info}/METADATA +1 -1
  2. {agent_starter_pack-0.6.1.dist-info → agent_starter_pack-0.6.3.dist-info}/RECORD +22 -22
  3. agents/adk_base/template/.templateconfig.yaml +1 -1
  4. agents/adk_gemini_fullstack/README.md +3 -121
  5. agents/adk_gemini_fullstack/app/agent.py +2 -7
  6. agents/adk_gemini_fullstack/app/config.py +13 -0
  7. agents/adk_gemini_fullstack/template/.templateconfig.yaml +1 -1
  8. agents/agentic_rag/template/.templateconfig.yaml +1 -1
  9. src/resources/locks/uv-adk_base-agent_engine.lock +28 -13
  10. src/resources/locks/uv-adk_base-cloud_run.lock +28 -13
  11. src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock +28 -13
  12. src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock +28 -13
  13. src/resources/locks/uv-agentic_rag-agent_engine.lock +22 -16
  14. src/resources/locks/uv-agentic_rag-cloud_run.lock +22 -16
  15. src/resources/locks/uv-crewai_coding_crew-agent_engine.lock +101 -100
  16. src/resources/locks/uv-crewai_coding_crew-cloud_run.lock +141 -80
  17. src/resources/locks/uv-langgraph_base_react-agent_engine.lock +16 -15
  18. src/resources/locks/uv-langgraph_base_react-cloud_run.lock +16 -15
  19. src/resources/locks/uv-live_api-cloud_run.lock +12 -12
  20. {agent_starter_pack-0.6.1.dist-info → agent_starter_pack-0.6.3.dist-info}/WHEEL +0 -0
  21. {agent_starter_pack-0.6.1.dist-info → agent_starter_pack-0.6.3.dist-info}/entry_points.txt +0 -0
  22. {agent_starter_pack-0.6.1.dist-info → agent_starter_pack-0.6.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-starter-pack
3
- Version: 0.6.1
3
+ Version: 0.6.3
4
4
  Summary: CLI to bootstrap production-ready Google Cloud GenAI agent projects from templates.
5
5
  Author-email: Google LLC <agent-starter-pack@google.com>
6
6
  License: Apache-2.0
@@ -2,14 +2,14 @@ agents/adk_base/README.md,sha256=eLf-F9Z4u_mQOchAnUaSrOAHXRSx8wUQN29kkwz1SF4,894
2
2
  agents/adk_base/app/agent.py,sha256=Kt-0TQM4g9NLs7Q2KmRWPfPWWgyQEODVo0uCepLkqDw,2182
3
3
  agents/adk_base/notebooks/adk_app_testing.ipynb,sha256=kWYd-ButNGemupiPDIzhlQO0elxWCwiea0nhmnsW8cg,9619
4
4
  agents/adk_base/notebooks/evaluating_adk_agent.ipynb,sha256=OMTiT3gAFWPvE9pPL8z7tsDwOU-l8wem5wH-OXPPlvk,56805
5
- agents/adk_base/template/.templateconfig.yaml,sha256=d6f_11cA0m6VMUzVPXETSoCViQe5b49ImzJAlkhskHw,893
5
+ agents/adk_base/template/.templateconfig.yaml,sha256=y-u4rj4L90guST6mNxvjexYivwPVSn9jZTrK8kUQCfo,893
6
6
  agents/adk_base/tests/integration/test_agent.py,sha256=VypgpEWrQegJBgc58V-BlIsbqh-Hii-hwmkwcz5feFw,1969
7
- agents/adk_gemini_fullstack/README.md,sha256=C257ieCteXNqOLTKmlF2PSG1BVMr2NIX8PWz7vwYrew,7483
8
- agents/adk_gemini_fullstack/app/agent.py,sha256=4u48Sk1J8Rks5DGZjgGKPCYqgWZnrICVYD61dZU0L2U,16569
9
- agents/adk_gemini_fullstack/app/config.py,sha256=1rX_U87eH_JnFsuoSjcM7_pRmx02g575J2gFkS1ahGk,1088
7
+ agents/adk_gemini_fullstack/README.md,sha256=zWV88GJlmrIVg4OwS5rG6l0UKTrc23_VFXoLJwt3K2s,1782
8
+ agents/adk_gemini_fullstack/app/agent.py,sha256=bk67bpAge8_b-reI1VuF4PNTXFHqnD92hdVTVXslS4s,16402
9
+ agents/adk_gemini_fullstack/app/config.py,sha256=x--axECPKWW3oLANKz2_4zzHEBIU7if8iYNZRjlTNV0,1563
10
10
  agents/adk_gemini_fullstack/notebooks/adk_app_testing.ipynb,sha256=kWYd-ButNGemupiPDIzhlQO0elxWCwiea0nhmnsW8cg,9619
11
11
  agents/adk_gemini_fullstack/notebooks/evaluating_adk_agent.ipynb,sha256=OMTiT3gAFWPvE9pPL8z7tsDwOU-l8wem5wH-OXPPlvk,56805
12
- agents/adk_gemini_fullstack/template/.templateconfig.yaml,sha256=0vwRirGXHFw7RUVjS8umiMNu3TXvTKk9smufIOhDJn4,1658
12
+ agents/adk_gemini_fullstack/template/.templateconfig.yaml,sha256=0o1bJj1AOdRJEFD_1ejwK6JyX3I8R-4wA8Z2zIrFhAM,1658
13
13
  agents/adk_gemini_fullstack/tests/integration/test_agent.py,sha256=VypgpEWrQegJBgc58V-BlIsbqh-Hii-hwmkwcz5feFw,1969
14
14
  agents/agentic_rag/README.md,sha256=mxMLkq6tAghFaDmc2sc2sEQ5vn9kGWdiRxfTykwpLz0,2268
15
15
  agents/agentic_rag/app/agent.py,sha256=thaU0njJ3W90DI54EVrFe4lwx9yMWZT4jSGRMnUSdY8,3987
@@ -17,7 +17,7 @@ agents/agentic_rag/app/retrievers.py,sha256=qfxwSEixMddvAu4FvUTZAFh1Gdp3RPY65s0W
17
17
  agents/agentic_rag/app/templates.py,sha256=8N_uRchwiN7hlH9Y8rdJ1CAtOhpHUWZkXZZ7IU-YJJk,867
18
18
  agents/agentic_rag/notebooks/adk_app_testing.ipynb,sha256=kWYd-ButNGemupiPDIzhlQO0elxWCwiea0nhmnsW8cg,9619
19
19
  agents/agentic_rag/notebooks/evaluating_adk_agent.ipynb,sha256=OMTiT3gAFWPvE9pPL8z7tsDwOU-l8wem5wH-OXPPlvk,56805
20
- agents/agentic_rag/template/.templateconfig.yaml,sha256=k86nWTpBRnQPe3i9LS_KD1gK6vGXzllAlCHI6u4gQ0w,1223
20
+ agents/agentic_rag/template/.templateconfig.yaml,sha256=qCelPx9VJ_428noi_SzbYZ1E6IPyi-k26lY1qLxeDtY,1223
21
21
  agents/agentic_rag/tests/integration/test_agent.py,sha256=mxsKFyZrwXzIvAoxlqZv2JndM3VTVTKcugRYdF3APr4,2112
22
22
  agents/crewai_coding_crew/README.md,sha256=4No7sfHQVHELARGiT3fWANJzDR0NP48ow4ct3FoPwlA,1672
23
23
  agents/crewai_coding_crew/app/agent.py,sha256=axa-prJ7N8Gi8ASUSjokLeWCE-Z_cU0A99WwuLGsZyQ,3264
@@ -178,25 +178,25 @@ src/resources/containers/e2e-tests/Dockerfile,sha256=Q_aTyX_iaFY8j06XZkpMuggJnNO
178
178
  src/resources/idx/idx-template.json,sha256=07OQZCPp45Iqor2O7Tm1e1Gmsdd-AmmUofSvA7y-oRs,793
179
179
  src/resources/idx/idx-template.nix,sha256=sesHGev_PYtVDg0J5tHkg0OO7IR1Bz2iAtl_if3Ar3M,892
180
180
  src/resources/idx/.idx/dev.nix,sha256=XQ4T1xt5I-8SVwnI37v56RFFlxa58Ko-a9G2-oelYAI,1602
181
- src/resources/locks/uv-adk_base-agent_engine.lock,sha256=vpeialGn8PplTrsqx8uQYmUiwD_uDN7B5tP0-GuEXB8,352603
182
- src/resources/locks/uv-adk_base-cloud_run.lock,sha256=RSUnPpuhLBE4YJlw1W7JBp4dpQk_aUtvi99yQaqHOOY,433430
183
- src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock,sha256=vpeialGn8PplTrsqx8uQYmUiwD_uDN7B5tP0-GuEXB8,352603
184
- src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock,sha256=RSUnPpuhLBE4YJlw1W7JBp4dpQk_aUtvi99yQaqHOOY,433430
185
- src/resources/locks/uv-agentic_rag-agent_engine.lock,sha256=zWr9BhACA9f4WPmLxWgbG_m1bDpnhymY8q0IQnW3l0k,519313
186
- src/resources/locks/uv-agentic_rag-cloud_run.lock,sha256=njY24B2k7YE5nzZTpnpHMwZ0ogKHxgliK1i10velm0k,673291
187
- src/resources/locks/uv-crewai_coding_crew-agent_engine.lock,sha256=bULo05BZdi_4xV1YXU2wTRi1Ujah-Cs5JS8VGdLqqGA,779718
188
- src/resources/locks/uv-crewai_coding_crew-cloud_run.lock,sha256=jBbTXM6EC6LZ1_-a2dhnR3K2S1uKrZvsGm5rleuK2yQ,991649
189
- src/resources/locks/uv-langgraph_base_react-agent_engine.lock,sha256=C3WgRwzeH0jymFj8EfNuUwYs94E1e0s3UEbMGEsYls8,667131
190
- src/resources/locks/uv-langgraph_base_react-cloud_run.lock,sha256=sQmg4vv8bdZN9VEeNiX1CWfYHhLJMfyy-8QzvzW4xnE,865011
191
- src/resources/locks/uv-live_api-cloud_run.lock,sha256=-htrBaFgKW0dmx-Q7Ez0Vbe8r8A1hgq1IMsVzDiomDs,787143
181
+ src/resources/locks/uv-adk_base-agent_engine.lock,sha256=X-DXXxH9x4Dkg9SpWsONTM5JEEiEdqsYyrZ_jQ_wVn0,353381
182
+ src/resources/locks/uv-adk_base-cloud_run.lock,sha256=qed6p6kszJjvp2y3_IEdZCL2hOJVOkfQhFx8Qqh1ufM,434208
183
+ src/resources/locks/uv-adk_gemini_fullstack-agent_engine.lock,sha256=X-DXXxH9x4Dkg9SpWsONTM5JEEiEdqsYyrZ_jQ_wVn0,353381
184
+ src/resources/locks/uv-adk_gemini_fullstack-cloud_run.lock,sha256=qed6p6kszJjvp2y3_IEdZCL2hOJVOkfQhFx8Qqh1ufM,434208
185
+ src/resources/locks/uv-agentic_rag-agent_engine.lock,sha256=5YWdnUo_mqhM_Axja1mnVIDqERw-y8VgHs57TJSF5Ok,519482
186
+ src/resources/locks/uv-agentic_rag-cloud_run.lock,sha256=LNt_VD1bUjwZol2drWg-swIAmLtuMcuvbVEu2MCf9Pw,673460
187
+ src/resources/locks/uv-crewai_coding_crew-agent_engine.lock,sha256=TDsYJMLcWFFxaJ-NZYXyes24VjDHNlbNx8ht3bU-RKI,794055
188
+ src/resources/locks/uv-crewai_coding_crew-cloud_run.lock,sha256=HHyKWvau1GnB6T90h-97d_QstzgxMST-M33-SGxMTmc,1016961
189
+ src/resources/locks/uv-langgraph_base_react-agent_engine.lock,sha256=iHY7rPfeMQeUQy81nCEWzFheNPW49WoB3r5A92HOdiE,667164
190
+ src/resources/locks/uv-langgraph_base_react-cloud_run.lock,sha256=iA0OaAQMkxr3XCtDVsLmReD5xgZvgmYwG5XzdiRZOEI,865044
191
+ src/resources/locks/uv-live_api-cloud_run.lock,sha256=cQS22t_fueHl5qcjZ1VAUgHUY7DesxpmZinrH62rEnI,787149
192
192
  src/resources/setup_cicd/cicd_variables.tf,sha256=PMflYe1TzQi63LORHkmeCktTYzXFplJgxffNH4DtuAQ,1244
193
193
  src/resources/setup_cicd/github.tf,sha256=scTBgeZlCM74N-pzhVKsnTN0PX9a5GboNl1HN3-LlCM,2791
194
194
  src/resources/setup_cicd/providers.tf,sha256=Km4z6IJt7x7PLaa0kyZbBrO2m3lpuIJZFD5jB7QBfF0,1122
195
195
  src/utils/generate_locks.py,sha256=6V1B8V2BEuevWnXUsxZVTrLjXwFRII8UfsIGrQqZxVs,4320
196
196
  src/utils/lock_utils.py,sha256=RSE6n3hBkH64xNm3Q5wrR0Pqbeo-oc7xaTOhA9yzHjk,2275
197
197
  src/utils/watch_and_rebuild.py,sha256=vP4yIiA7E_lj5sfQdJUl8TXas6V7msDg8XWUutAC05Q,6679
198
- agent_starter_pack-0.6.1.dist-info/METADATA,sha256=UvwmnqtiGy7xpht6a-VP8x8uNOJZvlkVdXFxi0Yj7eE,10454
199
- agent_starter_pack-0.6.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
200
- agent_starter_pack-0.6.1.dist-info/entry_points.txt,sha256=U7uCxR7YulIhZ0L8R8Hui0Bsy6J7oyESBeDYJYMrQjA,56
201
- agent_starter_pack-0.6.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
202
- agent_starter_pack-0.6.1.dist-info/RECORD,,
198
+ agent_starter_pack-0.6.3.dist-info/METADATA,sha256=DhD0WFhpIaDa-TdaXBTAYS1bWDLLDDEqZvNuDl06_UI,10454
199
+ agent_starter_pack-0.6.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
200
+ agent_starter_pack-0.6.3.dist-info/entry_points.txt,sha256=U7uCxR7YulIhZ0L8R8Hui0Bsy6J7oyESBeDYJYMrQjA,56
201
+ agent_starter_pack-0.6.3.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
202
+ agent_starter_pack-0.6.3.dist-info/RECORD,,
@@ -17,6 +17,6 @@ example_question: "What's the weather in San Francisco?"
17
17
  settings:
18
18
  requires_data_ingestion: false
19
19
  deployment_targets: ["agent_engine", "cloud_run"]
20
- extra_dependencies: ["google-adk~=1.3.0"]
20
+ extra_dependencies: ["google-adk~=1.4.1"]
21
21
  tags: ["adk"]
22
22
  frontend_type: "None"
@@ -1,5 +1,7 @@
1
1
  # Gemini Fullstack Agent Development Kit (ADK) Quickstart
2
2
 
3
+ > 🔍 **Sample Agent**: This agent is part of the [ADK Samples](https://github.com/google/adk-samples) collection, showcasing agent implementations using the Agent Development Kit.
4
+
3
5
  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
6
 
5
7
  <table>
@@ -24,125 +26,5 @@ The **Gemini Fullstack Agent Development Kit (ADK) Quickstart** is a production-
24
26
  </tbody>
25
27
  </table>
26
28
 
29
+ Here's a screenshot of the application in action:
27
30
  <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 --upgrade 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
- ![ADK Gemini Fullstack Architecture](../../docs/images/adk_gemini_fullstack_architecture.png)
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.
@@ -14,12 +14,10 @@
14
14
 
15
15
  import datetime
16
16
  import logging
17
- import os
18
17
  import re
19
18
  from collections.abc import AsyncGenerator
20
19
  from typing import Literal
21
20
 
22
- import google.auth
23
21
  from google.adk.agents import BaseAgent, LlmAgent, LoopAgent, SequentialAgent
24
22
  from google.adk.agents.callback_context import CallbackContext
25
23
  from google.adk.agents.invocation_context import InvocationContext
@@ -32,11 +30,6 @@ from pydantic import BaseModel, Field
32
30
 
33
31
  from .config import config
34
32
 
35
- _, project_id = google.auth.default()
36
- os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
37
- os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
38
- os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")
39
-
40
33
 
41
34
  # --- Structured Output Models ---
42
35
  class SearchQuery(BaseModel):
@@ -263,6 +256,8 @@ research_evaluator = LlmAgent(
263
256
  Your response must be a single, raw JSON object validating against the 'Feedback' schema.
264
257
  """,
265
258
  output_schema=Feedback,
259
+ disallow_transfer_to_parent=True,
260
+ disallow_transfer_to_peers=True,
266
261
  output_key="research_evaluation",
267
262
  )
268
263
 
@@ -12,8 +12,21 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import os
15
16
  from dataclasses import dataclass
16
17
 
18
+ import google.auth
19
+
20
+ # To use AI Studio credentials:
21
+ # 1. Create a .env file in the /app directory with:
22
+ # GOOGLE_GENAI_USE_VERTEXAI=FALSE
23
+ # GOOGLE_API_KEY=PASTE_YOUR_ACTUAL_API_KEY_HERE
24
+ # 2. This will override the default Vertex AI configuration
25
+ _, project_id = google.auth.default()
26
+ os.environ.setdefault("GOOGLE_CLOUD_PROJECT", project_id)
27
+ os.environ.setdefault("GOOGLE_CLOUD_LOCATION", "global")
28
+ os.environ.setdefault("GOOGLE_GENAI_USE_VERTEXAI", "True")
29
+
17
30
 
18
31
  @dataclass
19
32
  class ResearchConfiguration:
@@ -17,7 +17,7 @@ example_question: "A report on the latest Google I/O event"
17
17
  settings:
18
18
  requires_data_ingestion: false
19
19
  deployment_targets: ["agent_engine", "cloud_run"]
20
- extra_dependencies: ["google-adk~=1.3.0"]
20
+ extra_dependencies: ["google-adk~=1.4.1"]
21
21
  tags: ["adk"]
22
22
  frontend_type: "adk_gemini_fullstack"
23
23
  commands:
@@ -18,7 +18,7 @@ settings:
18
18
  requires_data_ingestion: true
19
19
  deployment_targets: ["agent_engine", "cloud_run"]
20
20
  extra_dependencies: [
21
- "google-adk~=1.3.0",
21
+ "google-adk~=1.4.1",
22
22
  "langchain-google-vertexai~=2.0.7",
23
23
  "langchain~=0.3.24",
24
24
  "langchain-core~=0.3.55",
@@ -480,9 +480,10 @@ wheels = [
480
480
 
481
481
  [[package]]
482
482
  name = "google-adk"
483
- version = "1.3.0"
483
+ version = "1.4.1"
484
484
  source = { registry = "https://pypi.org/simple" }
485
485
  dependencies = [
486
+ { name = "anyio" },
486
487
  { name = "authlib" },
487
488
  { name = "click" },
488
489
  { name = "fastapi" },
@@ -498,16 +499,20 @@ dependencies = [
498
499
  { name = "opentelemetry-exporter-gcp-trace" },
499
500
  { name = "opentelemetry-sdk" },
500
501
  { name = "pydantic" },
502
+ { name = "python-dateutil" },
501
503
  { name = "python-dotenv" },
502
504
  { name = "pyyaml" },
505
+ { name = "requests" },
503
506
  { name = "sqlalchemy" },
507
+ { name = "starlette" },
504
508
  { name = "typing-extensions" },
505
509
  { name = "tzlocal" },
506
510
  { name = "uvicorn" },
511
+ { name = "websockets" },
507
512
  ]
508
- sdist = { url = "https://files.pythonhosted.org/packages/6a/7e/223f9244fcfb34042d9519ba13f8f017bdc077a628c204d3a6944682d4a6/google_adk-1.3.0.tar.gz", hash = "sha256:3be048cd40fb3a2c2f51ecb61233d78434cab2aba5a58507156c7daf2b9772fa", size = 1142535 }
513
+ sdist = { url = "https://files.pythonhosted.org/packages/06/c0/3585b6e731a144effd80a79400a46b25b65d0b65bdd535ccb51b2db01fe3/google_adk-1.4.1.tar.gz", hash = "sha256:fc29a3840343fae660447e594d4d4851176ddc970dcaae3082bc97f403e7e832", size = 1150267 }
509
514
  wheels = [
510
- { url = "https://files.pythonhosted.org/packages/51/94/1b86404b81ea0f282694257e31fd4fb954c8cdcadebf1fde02a056979609/google_adk-1.3.0-py3-none-any.whl", hash = "sha256:a57f05633bd2d9937b9a73ca4fc4a5c7d9d1e2d28390c8df2be134d7d4b1f79c", size = 1306110 },
515
+ { url = "https://files.pythonhosted.org/packages/53/d3/c178d0e5af8c4905495d842c3f1fc78e299d344948f745164c6cb5486b29/google_adk-1.4.1-py3-none-any.whl", hash = "sha256:f789f27eab16c499719fa66cd9033ab69a34c381368df8e43a3f9bebdcf7e3ac", size = 1316934 },
511
516
  ]
512
517
 
513
518
  [[package]]
@@ -807,7 +812,7 @@ wheels = [
807
812
 
808
813
  [[package]]
809
814
  name = "google-genai"
810
- version = "1.20.0"
815
+ version = "1.21.1"
811
816
  source = { registry = "https://pypi.org/simple" }
812
817
  dependencies = [
813
818
  { name = "anyio" },
@@ -815,12 +820,13 @@ dependencies = [
815
820
  { name = "httpx" },
816
821
  { name = "pydantic" },
817
822
  { name = "requests" },
823
+ { name = "tenacity" },
818
824
  { name = "typing-extensions" },
819
825
  { name = "websockets" },
820
826
  ]
821
- sdist = { url = "https://files.pythonhosted.org/packages/19/12/ad9f08be2ca85122ca50ac69ae70454f18a3c7d840bcc4ed43f517ab47be/google_genai-1.20.0.tar.gz", hash = "sha256:dccca78f765233844b1bd4f1f7a2237d9a76fe6038cf9aa72c0cd991e3c107b5", size = 201550 }
827
+ sdist = { url = "https://files.pythonhosted.org/packages/49/8a/4a628e2e918f8c4a48ea778b68395b97b05b6873c6e528e78ccfb02a2c8d/google_genai-1.21.1.tar.gz", hash = "sha256:5412fde7f0b39574a4670a9a25e398824a12b3cddd632fdff66d1b9bcfdbfcb4", size = 205636 }
822
828
  wheels = [
823
- { url = "https://files.pythonhosted.org/packages/b9/b4/08f3ea414060a7e7d4436c08bb22d03dabef74cc05ef13ef8cd846156d5b/google_genai-1.20.0-py3-none-any.whl", hash = "sha256:ccd61d6ebcb14f5c778b817b8010e3955ae4f6ddfeaabf65f42f6d5e3e5a8125", size = 203039 },
829
+ { url = "https://files.pythonhosted.org/packages/92/5c/659c2b992d631a873ae8fed612ce92af423fdc5f7d541dec7ce8f4b1789e/google_genai-1.21.1-py3-none-any.whl", hash = "sha256:fa6fa5311f9a757ce65cd528a938a0f309bb3032516015bf5b3022e63b2fc46b", size = 206388 },
824
830
  ]
825
831
 
826
832
  [[package]]
@@ -1492,7 +1498,7 @@ dev = [
1492
1498
  [package.metadata]
1493
1499
  requires-dist = [
1494
1500
  { name = "codespell", marker = "extra == 'lint'", specifier = "~=2.2.0" },
1495
- { name = "google-adk", specifier = "~=1.3.0" },
1501
+ { name = "google-adk", specifier = "~=1.4.1" },
1496
1502
  { name = "google-cloud-aiplatform", extras = ["evaluation", "agent-engines"], specifier = "~=1.95.1" },
1497
1503
  { name = "google-cloud-logging", specifier = "~=3.11.4" },
1498
1504
  { name = "jupyter", marker = "extra == 'jupyter'", specifier = "~=1.0.0" },
@@ -2212,7 +2218,7 @@ wheels = [
2212
2218
 
2213
2219
  [[package]]
2214
2220
  name = "pytest"
2215
- version = "8.4.0"
2221
+ version = "8.4.1"
2216
2222
  source = { registry = "https://pypi.org/simple" }
2217
2223
  dependencies = [
2218
2224
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -2223,9 +2229,9 @@ dependencies = [
2223
2229
  { name = "pygments" },
2224
2230
  { name = "tomli", marker = "python_full_version < '3.11'" },
2225
2231
  ]
2226
- sdist = { url = "https://files.pythonhosted.org/packages/fb/aa/405082ce2749be5398045152251ac69c0f3578c7077efc53431303af97ce/pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6", size = 1515232 }
2232
+ sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714 }
2227
2233
  wheels = [
2228
- { url = "https://files.pythonhosted.org/packages/2f/de/afa024cbe022b1b318a3d224125aa24939e99b4ff6f22e0ba639a2eaee47/pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e", size = 363797 },
2234
+ { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474 },
2229
2235
  ]
2230
2236
 
2231
2237
  [[package]]
@@ -2897,6 +2903,15 @@ wheels = [
2897
2903
  { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 },
2898
2904
  ]
2899
2905
 
2906
+ [[package]]
2907
+ name = "tenacity"
2908
+ version = "8.5.0"
2909
+ source = { registry = "https://pypi.org/simple" }
2910
+ sdist = { url = "https://files.pythonhosted.org/packages/a3/4d/6a19536c50b849338fcbe9290d562b52cbdcf30d8963d3588a68a4107df1/tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78", size = 47309 }
2911
+ wheels = [
2912
+ { url = "https://files.pythonhosted.org/packages/d2/3f/8ba87d9e287b9d385a02a7114ddcef61b26f86411e121c9003eb509a1773/tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687", size = 28165 },
2913
+ ]
2914
+
2900
2915
  [[package]]
2901
2916
  name = "terminado"
2902
2917
  version = "0.18.1"
@@ -3093,11 +3108,11 @@ wheels = [
3093
3108
 
3094
3109
  [[package]]
3095
3110
  name = "urllib3"
3096
- version = "2.4.0"
3111
+ version = "2.5.0"
3097
3112
  source = { registry = "https://pypi.org/simple" }
3098
- sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 }
3113
+ sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 }
3099
3114
  wheels = [
3100
- { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 },
3115
+ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 },
3101
3116
  ]
3102
3117
 
3103
3118
  [[package]]
@@ -509,9 +509,10 @@ wheels = [
509
509
 
510
510
  [[package]]
511
511
  name = "google-adk"
512
- version = "1.3.0"
512
+ version = "1.4.1"
513
513
  source = { registry = "https://pypi.org/simple" }
514
514
  dependencies = [
515
+ { name = "anyio" },
515
516
  { name = "authlib" },
516
517
  { name = "click" },
517
518
  { name = "fastapi" },
@@ -527,16 +528,20 @@ dependencies = [
527
528
  { name = "opentelemetry-exporter-gcp-trace" },
528
529
  { name = "opentelemetry-sdk" },
529
530
  { name = "pydantic" },
531
+ { name = "python-dateutil" },
530
532
  { name = "python-dotenv" },
531
533
  { name = "pyyaml" },
534
+ { name = "requests" },
532
535
  { name = "sqlalchemy" },
536
+ { name = "starlette" },
533
537
  { name = "typing-extensions" },
534
538
  { name = "tzlocal" },
535
539
  { name = "uvicorn" },
540
+ { name = "websockets" },
536
541
  ]
537
- sdist = { url = "https://files.pythonhosted.org/packages/6a/7e/223f9244fcfb34042d9519ba13f8f017bdc077a628c204d3a6944682d4a6/google_adk-1.3.0.tar.gz", hash = "sha256:3be048cd40fb3a2c2f51ecb61233d78434cab2aba5a58507156c7daf2b9772fa", size = 1142535 }
542
+ sdist = { url = "https://files.pythonhosted.org/packages/06/c0/3585b6e731a144effd80a79400a46b25b65d0b65bdd535ccb51b2db01fe3/google_adk-1.4.1.tar.gz", hash = "sha256:fc29a3840343fae660447e594d4d4851176ddc970dcaae3082bc97f403e7e832", size = 1150267 }
538
543
  wheels = [
539
- { url = "https://files.pythonhosted.org/packages/51/94/1b86404b81ea0f282694257e31fd4fb954c8cdcadebf1fde02a056979609/google_adk-1.3.0-py3-none-any.whl", hash = "sha256:a57f05633bd2d9937b9a73ca4fc4a5c7d9d1e2d28390c8df2be134d7d4b1f79c", size = 1306110 },
544
+ { url = "https://files.pythonhosted.org/packages/53/d3/c178d0e5af8c4905495d842c3f1fc78e299d344948f745164c6cb5486b29/google_adk-1.4.1-py3-none-any.whl", hash = "sha256:f789f27eab16c499719fa66cd9033ab69a34c381368df8e43a3f9bebdcf7e3ac", size = 1316934 },
540
545
  ]
541
546
 
542
547
  [[package]]
@@ -843,7 +848,7 @@ wheels = [
843
848
 
844
849
  [[package]]
845
850
  name = "google-genai"
846
- version = "1.20.0"
851
+ version = "1.21.1"
847
852
  source = { registry = "https://pypi.org/simple" }
848
853
  dependencies = [
849
854
  { name = "anyio" },
@@ -851,12 +856,13 @@ dependencies = [
851
856
  { name = "httpx" },
852
857
  { name = "pydantic" },
853
858
  { name = "requests" },
859
+ { name = "tenacity" },
854
860
  { name = "typing-extensions" },
855
861
  { name = "websockets" },
856
862
  ]
857
- sdist = { url = "https://files.pythonhosted.org/packages/19/12/ad9f08be2ca85122ca50ac69ae70454f18a3c7d840bcc4ed43f517ab47be/google_genai-1.20.0.tar.gz", hash = "sha256:dccca78f765233844b1bd4f1f7a2237d9a76fe6038cf9aa72c0cd991e3c107b5", size = 201550 }
863
+ sdist = { url = "https://files.pythonhosted.org/packages/49/8a/4a628e2e918f8c4a48ea778b68395b97b05b6873c6e528e78ccfb02a2c8d/google_genai-1.21.1.tar.gz", hash = "sha256:5412fde7f0b39574a4670a9a25e398824a12b3cddd632fdff66d1b9bcfdbfcb4", size = 205636 }
858
864
  wheels = [
859
- { url = "https://files.pythonhosted.org/packages/b9/b4/08f3ea414060a7e7d4436c08bb22d03dabef74cc05ef13ef8cd846156d5b/google_genai-1.20.0-py3-none-any.whl", hash = "sha256:ccd61d6ebcb14f5c778b817b8010e3955ae4f6ddfeaabf65f42f6d5e3e5a8125", size = 203039 },
865
+ { url = "https://files.pythonhosted.org/packages/92/5c/659c2b992d631a873ae8fed612ce92af423fdc5f7d541dec7ce8f4b1789e/google_genai-1.21.1-py3-none-any.whl", hash = "sha256:fa6fa5311f9a757ce65cd528a938a0f309bb3032516015bf5b3022e63b2fc46b", size = 206388 },
860
866
  ]
861
867
 
862
868
  [[package]]
@@ -1551,7 +1557,7 @@ dev = [
1551
1557
  requires-dist = [
1552
1558
  { name = "codespell", marker = "extra == 'lint'", specifier = "~=2.2.0" },
1553
1559
  { name = "fastapi", specifier = "~=0.115.8" },
1554
- { name = "google-adk", specifier = "~=1.3.0" },
1560
+ { name = "google-adk", specifier = "~=1.4.1" },
1555
1561
  { name = "google-cloud-aiplatform", extras = ["evaluation"], specifier = "~=1.95.1" },
1556
1562
  { name = "google-cloud-logging", specifier = "~=3.11.4" },
1557
1563
  { name = "jupyter", marker = "extra == 'jupyter'", specifier = "~=1.0.0" },
@@ -2371,7 +2377,7 @@ wheels = [
2371
2377
 
2372
2378
  [[package]]
2373
2379
  name = "pytest"
2374
- version = "8.4.0"
2380
+ version = "8.4.1"
2375
2381
  source = { registry = "https://pypi.org/simple" }
2376
2382
  dependencies = [
2377
2383
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -2382,9 +2388,9 @@ dependencies = [
2382
2388
  { name = "pygments" },
2383
2389
  { name = "tomli", marker = "python_full_version < '3.11'" },
2384
2390
  ]
2385
- sdist = { url = "https://files.pythonhosted.org/packages/fb/aa/405082ce2749be5398045152251ac69c0f3578c7077efc53431303af97ce/pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6", size = 1515232 }
2391
+ sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714 }
2386
2392
  wheels = [
2387
- { url = "https://files.pythonhosted.org/packages/2f/de/afa024cbe022b1b318a3d224125aa24939e99b4ff6f22e0ba639a2eaee47/pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e", size = 363797 },
2393
+ { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474 },
2388
2394
  ]
2389
2395
 
2390
2396
  [[package]]
@@ -3172,6 +3178,15 @@ wheels = [
3172
3178
  { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 },
3173
3179
  ]
3174
3180
 
3181
+ [[package]]
3182
+ name = "tenacity"
3183
+ version = "8.5.0"
3184
+ source = { registry = "https://pypi.org/simple" }
3185
+ sdist = { url = "https://files.pythonhosted.org/packages/a3/4d/6a19536c50b849338fcbe9290d562b52cbdcf30d8963d3588a68a4107df1/tenacity-8.5.0.tar.gz", hash = "sha256:8bc6c0c8a09b31e6cad13c47afbed1a567518250a9a171418582ed8d9c20ca78", size = 47309 }
3186
+ wheels = [
3187
+ { url = "https://files.pythonhosted.org/packages/d2/3f/8ba87d9e287b9d385a02a7114ddcef61b26f86411e121c9003eb509a1773/tenacity-8.5.0-py3-none-any.whl", hash = "sha256:b594c2a5945830c267ce6b79a166228323ed52718f30302c1359836112346687", size = 28165 },
3188
+ ]
3189
+
3175
3190
  [[package]]
3176
3191
  name = "terminado"
3177
3192
  version = "0.18.1"
@@ -3378,11 +3393,11 @@ wheels = [
3378
3393
 
3379
3394
  [[package]]
3380
3395
  name = "urllib3"
3381
- version = "2.4.0"
3396
+ version = "2.5.0"
3382
3397
  source = { registry = "https://pypi.org/simple" }
3383
- sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 }
3398
+ sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 }
3384
3399
  wheels = [
3385
- { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 },
3400
+ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 },
3386
3401
  ]
3387
3402
 
3388
3403
  [[package]]