feat: support Langchain StructuredTool for Langchain tool

for fixing: https://github.com/google/adk-python/issues/707

PiperOrigin-RevId: 764781197
This commit is contained in:
Xiang (Sean) Zhou 2025-05-29 10:15:56 -07:00 committed by Copybara-Service
parent 2a65c4118b
commit 7e637d3fa0
3 changed files with 71 additions and 2 deletions

View File

@ -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

View File

@ -0,0 +1,49 @@
# 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.
"""
This agent aims to test the Langchain tool with Langchain's StructuredTool
"""
from google.adk.agents import Agent
from google.adk.tools.langchain_tool import LangchainTool
from langchain_core.tools.structured import StructuredTool
from pydantic import BaseModel
def add(x, y) -> int:
return x + y
class AddSchema(BaseModel):
x: int
y: int
test_langchain_tool = StructuredTool.from_function(
add,
name="add",
description="Adds two numbers",
args_schema=AddSchema,
)
root_agent = Agent(
model="gemini-2.0-flash-001",
name="test_app",
description="A helpful assistant for user questions.",
instruction=(
"You are a helpful assistant for user questions, you have access to a"
" tool that adds two numbers."
),
tools=[LangchainTool(tool=test_langchain_tool)],
)

View File

@ -12,13 +12,15 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from typing import Any from __future__ import annotations
from typing import Optional from typing import Optional
from typing import Union from typing import Union
from google.genai import types from google.genai import types
from langchain.agents import Tool from langchain.agents import Tool
from langchain_core.tools import BaseTool from langchain_core.tools import BaseTool
from langchain_core.tools.structured import StructuredTool
from typing_extensions import override from typing_extensions import override
from . import _automatic_function_calling_util from . import _automatic_function_calling_util
@ -63,7 +65,10 @@ class LangchainTool(FunctionTool):
raise ValueError("Langchain tool must have a 'run' or '_run' method") raise ValueError("Langchain tool must have a 'run' or '_run' method")
# Determine which function to use # Determine which function to use
func = tool._run if hasattr(tool, '_run') else tool.run if isinstance(tool, StructuredTool):
func = tool.func
else:
func = tool._run if hasattr(tool, '_run') else tool.run
super().__init__(func) super().__init__(func)
self._langchain_tool = tool self._langchain_tool = tool