diff --git a/contributing/samples/langchain_structured_tool_agent/__init__.py b/contributing/samples/langchain_structured_tool_agent/__init__.py new file mode 100644 index 0000000..c48963c --- /dev/null +++ b/contributing/samples/langchain_structured_tool_agent/__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/langchain_structured_tool_agent/agent.py b/contributing/samples/langchain_structured_tool_agent/agent.py new file mode 100644 index 0000000..e9e3d23 --- /dev/null +++ b/contributing/samples/langchain_structured_tool_agent/agent.py @@ -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)], +) diff --git a/src/google/adk/tools/langchain_tool.py b/src/google/adk/tools/langchain_tool.py index b36c3f5..38d9a8f 100644 --- a/src/google/adk/tools/langchain_tool.py +++ b/src/google/adk/tools/langchain_tool.py @@ -12,13 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any +from __future__ import annotations + from typing import Optional from typing import Union from google.genai import types from langchain.agents import Tool from langchain_core.tools import BaseTool +from langchain_core.tools.structured import StructuredTool from typing_extensions import override from . import _automatic_function_calling_util @@ -63,7 +65,10 @@ class LangchainTool(FunctionTool): raise ValueError("Langchain tool must have a 'run' or '_run' method") # 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) self._langchain_tool = tool