LangChain Tools API
Decorador @tool
| Parámetro | Tipo | Valor predeterminado | Descripción |
|---|---|---|---|
| args_schema | BaseModel o None | None | Modelo de validación de parámetros. Si no se proporciona, se genera automáticamente desde la firma de la función. |
| return_direct | bool | False | Si devolver directamente (omitir el razonamiento del modelo) |
| name | str o None | Nombre de la función | Nombre de la herramienta |
| description | str o None | Cadena de documentación de la función | Descripción de la herramienta |
Propiedades y métodos principales de BaseTool
| Propiedad/Método | Descripción |
|---|---|
| name | Nombre de la herramienta (cadena) |
| description | Descripción de la herramienta (cadena) |
| args_schema | Modelo Pydantic de parámetros |
| return_direct | Si devolver directamente (bool) |
| invoke(input) | Invocar herramienta, input es el diccionario de parámetros |
| ainvoke(input) | Invocar herramienta de forma asíncrona |
Marcadores de inyección de dependencias
| Marcador | Propósito | Uso |
|---|---|---|
| InjectedState | Inyectar estado del Agent | Annotated[dict, InjectedState] |
| InjectedStore | Inyectar almacenamiento entre sesiones | Annotated[BaseStore, InjectedStore()] |
| InjectedToolCallId | Inyectar ID de llamada de herramienta | Annotated[str, InjectedToolCallId] |
| InjectedToolArg | Marcador de inyección genérico | Annotated[T, InjectedToolArg] |
Ejemplos de uso comunes
Ejemplo
from langchain.tools import tool, InjectedState, InjectedStore, ToolException
from typing import Annotated
from langgraph.store.base import BaseStore
# Herramienta básica
@tool
def my_tool(param: str) -> str:
"""Descripción de la herramienta"""
return f"Resultado: {param}"
# Con validación de parámetros
from pydantic import BaseModel, Field
class MyInput(BaseModel):
param: str = Field(description="Descripción de parámetros", min_length=1)
@tool(args_schema=MyInput)
def validated_tool(param: str) -> str:
return param
# Devolución directa
@tool(return_direct=True)
def query_tool(query: str) -> str:
return f"Resultado: {query}"
# Inyectar estado
@tool
def stateful_tool(
param: str,
state: Annotated[dict, InjectedState],
) -> str:
return f"Número de mensajes: {len(state.get('messages', []))}"
# Inyectar Store
@tool
def store_tool(
key: str,
store: Annotated[BaseStore, InjectedStore()],
) -> str:
item = store.get(("ns",), key)
return str(item.value if item else "Ninguno")
# Manejo de excepciones
@tool
def safe_tool(param: int) -> str:
if param < 0:
raise ToolException(f"El parámetro debe ser un número positivo: {param}")
return f"OK: {param}"
from typing import Annotated
from langgraph.store.base import BaseStore
# Herramienta básica
@tool
def my_tool(param: str) -> str:
"""Descripción de la herramienta"""
return f"Resultado: {param}"
# Con validación de parámetros
from pydantic import BaseModel, Field
class MyInput(BaseModel):
param: str = Field(description="Descripción de parámetros", min_length=1)
@tool(args_schema=MyInput)
def validated_tool(param: str) -> str:
return param
# Devolución directa
@tool(return_direct=True)
def query_tool(query: str) -> str:
return f"Resultado: {query}"
# Inyectar estado
@tool
def stateful_tool(
param: str,
state: Annotated[dict, InjectedState],
) -> str:
return f"Número de mensajes: {len(state.get('messages', []))}"
# Inyectar Store
@tool
def store_tool(
key: str,
store: Annotated[BaseStore, InjectedStore()],
) -> str:
item = store.get(("ns",), key)
return str(item.value if item else "Ninguno")
# Manejo de excepciones
@tool
def safe_tool(param: int) -> str:
if param < 0:
raise ToolException(f"El parámetro debe ser un número positivo: {param}")
return f"OK: {param}"