From b0f0698ec27b73cadec36f8fd9da1275c69c6b6f Mon Sep 17 00:00:00 2001 From: Xuan Yang Date: Tue, 7 Oct 2025 15:08:15 -0700 Subject: [PATCH] chore: Add a sample agent to demonstrate that built-in google search tool and VertexAiSearchTool can be used together with other tools PiperOrigin-RevId: 816396360 --- .../samples/built_in_multi_tools/README.md | 14 +++++ .../samples/built_in_multi_tools/__init__.py | 15 +++++ .../samples/built_in_multi_tools/agent.py | 63 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 contributing/samples/built_in_multi_tools/README.md create mode 100644 contributing/samples/built_in_multi_tools/__init__.py create mode 100644 contributing/samples/built_in_multi_tools/agent.py diff --git a/contributing/samples/built_in_multi_tools/README.md b/contributing/samples/built_in_multi_tools/README.md new file mode 100644 index 00000000..a31bd6a8 --- /dev/null +++ b/contributing/samples/built_in_multi_tools/README.md @@ -0,0 +1,14 @@ +This agent is to demonstrate that the built-in google search tool and the +VertexAiSearchTool can be used together with other tools, even though the model +has the limitation that built-in tool cannot be used by other tools. + +It is achieved by the workarounds added in https://github.com/google/adk-python/blob/4485379a049a5c84583a43c85d444ea1f1ba6f12/src/google/adk/agents/llm_agent.py#L124-L149. + +To run this agent, set the environment variable `VERTEXAI_DATASTORE_ID` +(e.g. +`projects/{project}/locations/{location}/collections/{collection}/dataStores/{dataStore}`) +and use `adk web`. + +You can follow +https://cloud.google.com/generative-ai-app-builder/docs/create-data-store-es +to set up the datastore. diff --git a/contributing/samples/built_in_multi_tools/__init__.py b/contributing/samples/built_in_multi_tools/__init__.py new file mode 100644 index 00000000..c48963cd --- /dev/null +++ b/contributing/samples/built_in_multi_tools/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/built_in_multi_tools/agent.py b/contributing/samples/built_in_multi_tools/agent.py new file mode 100644 index 00000000..5194e0ef --- /dev/null +++ b/contributing/samples/built_in_multi_tools/agent.py @@ -0,0 +1,63 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import random + +from dotenv import load_dotenv +from google.adk import Agent +from google.adk.tools.google_search_tool import google_search +from google.adk.tools.tool_context import ToolContext +from google.adk.tools.vertex_ai_search_tool import VertexAiSearchTool + +load_dotenv(override=True) + +VERTEXAI_DATASTORE_ID = os.getenv("VERTEXAI_DATASTORE_ID") +if not VERTEXAI_DATASTORE_ID: + raise ValueError("VERTEXAI_DATASTORE_ID environment variable not set") + + +def roll_die(sides: int, tool_context: ToolContext) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + result = random.randint(1, sides) + if "rolls" not in tool_context.state: + tool_context.state["rolls"] = [] + + tool_context.state["rolls"] = tool_context.state["rolls"] + [result] + return result + + +root_agent = Agent( + model="gemini-2.5-pro", + name="hello_world_agent", + description="A hello world agent with multiple tools.", + instruction=""" + You are a helpful assistant which can help user to roll dice and search for information. + - Use `roll_die` tool to roll dice. + - Use `VertexAISearchTool` to search for Google Agent Development Kit (ADK) information in the datastore. + - Use `google_search` to search for general information. + """, + tools=[ + roll_die, + VertexAiSearchTool(data_store_id=VERTEXAI_DATASTORE_ID), + google_search, + ], +)