API инструментов LangChain
Декоратор @tool
| Параметр | Type | Значение по умолчанию | Описание |
|---|---|---|---|
| args_schema | BaseModel или None | Отсутствует | Модель проверки параметров. Если не указана, она автоматически генерируется из сигнатуры функции. |
| return_direct | bool | False | Возвращать ли напрямую (пропустить повторное осмысление моделью) |
| name | str или None | Имя функции | Название инструмента |
| description | str или None | Строка документации функции | Описание инструмента |
Ключевые атрибуты и методы BaseTool
| Атрибут/Метод | Описание |
|---|---|
| name | Имя инструмента (string) |
| description | Описание инструмента (string) |
| args_schema | Pydantic-модель параметров |
| return_direct | Следует ли возвращать напрямую (bool) |
| invoke(input) | Вызвать инструмент; input — словарь параметров |
| ainvoke(input) | Асинхронно вызвать инструмент |
Маркеры внедрения зависимостей
| Marker | Назначение | Использование |
|---|---|---|
| InjectedState | Внедрить состояние Agent | Annotated[dict, InjectedState] |
| InjectedStore | Внедрить межсессионное хранилище | Annotated[BaseStore, InjectedStore()] |
| InjectedToolCallId | Внедрить ID вызова инструмента | Annotated[str, InjectedToolCallId] |
| InjectedToolArg | Обобщённый маркер внедрения | Annotated[T, InjectedToolArg] |
Общие примеры использования
Примеры
from langchain.tools import tool, InjectedState, InjectedStore, ToolException
from typing import Annotated
from langgraph.store.base import BaseStore
# Базовый инструмент
@tool
def my_tool(param: str) -> str:
"""Описание инструмента"""
return f"Результат: {param}"
# С валидацией параметров
from pydantic import BaseModel, Field
class MyInput(BaseModel):
param: str = Field(description="Описание параметра", min_length=1)
@tool(args_schema=MyInput)
def validated_tool(param: str) -> str:
return param
# Прямой возврат
@tool(return_direct=True)
def query_tool(query: str) -> str:
return f"Результат: {query}"
# Внедрить состояние
@tool
def stateful_tool(
param: str,
state: Annotated[dict, InjectedState],
) -> str:
return f"Количество сообщений: {len(state.get('messages', []))}"
# Внедрить Store
@tool
def store_tool(
key: str,
store: Annotated[BaseStore, InjectedStore()],
) -> str:
item = store.get(("ns",), key)
return str(item.value if item else "None")
# Обработка исключений
@tool
def safe_tool(param: int) -> str:
if param < 0:
raise ToolException(f"Параметр должен быть положительным числом: {param}")
return f"ОК: {param}"
from typing import Annotated
from langgraph.store.base import BaseStore
# Базовый инструмент
@tool
def my_tool(param: str) -> str:
"""Описание инструмента"""
return f"Результат: {param}"
# С валидацией параметров
from pydantic import BaseModel, Field
class MyInput(BaseModel):
param: str = Field(description="Описание параметра", min_length=1)
@tool(args_schema=MyInput)
def validated_tool(param: str) -> str:
return param
# Прямой возврат
@tool(return_direct=True)
def query_tool(query: str) -> str:
return f"Результат: {query}"
# Внедрить состояние
@tool
def stateful_tool(
param: str,
state: Annotated[dict, InjectedState],
) -> str:
return f"Количество сообщений: {len(state.get('messages', []))}"
# Внедрить Store
@tool
def store_tool(
key: str,
store: Annotated[BaseStore, InjectedStore()],
) -> str:
item = store.get(("ns",), key)
return str(item.value if item else "None")
# Обработка исключений
@tool
def safe_tool(param: int) -> str:
if param < 0:
raise ToolException(f"Параметр должен быть положительным числом: {param}")
return f"ОК: {param}"