Integración de Tools en CrewAI: deja que los agentes busquen, lean y realmente trabajen
2 min read
Un agente sin tools es como un ingeniero con mucha teoría pero sin teclado.
Puede hablar mucho, pero no entrega nada.
Tools integradas comunes
Las tools más usadas en CrewAI incluyen:
SerperDevTool: búsqueda webFileReadTool: lectura de archivosFileWriterTool: escritura de archivosScrapeWebsiteTool: scraping de contenido web
Conectar tools a un agente
from crewai import Agent
from crewai_tools import SerperDevTool
search_tool = SerperDevTool()
researcher = Agent(
role="Researcher",
goal="Find trustworthy sources about the topic",
backstory="You validate facts before writing.",
tools=[search_tool],
allow_delegation=False,
verbose=True,
)💡 Puedes reutilizar el mismo
search_toolentre agentes. No hace falta recrearlo cada vez (DRY).
Plantilla mínima para tool personalizada
from crewai.tools import BaseTool
from pydantic import BaseModel, Field
class QueryInput(BaseModel):
keyword: str = Field(description="Search keyword")
class KeywordTool(BaseTool):
name: str = "Keyword Tool"
description: str = "Return a short explanation for a keyword."
args_schema: type[BaseModel] = QueryInput
def _run(self, keyword: str) -> str:
return f"Result for: {keyword}"Cuatro reglas de diseño de tools
- Haz una sola cosa: si busca, no debe además escribir archivos
- Sé explícito:
descriptiondebe indicar claramente propósito y entrada - Valida parámetros: usa schema con Pydantic
- Devuelve formato estable: facilita el parseo en tareas siguientes
Errores comunes
| Síntoma | Causa | Solución |
|---|---|---|
| La tool nunca se llama | El prompt de tarea no la exige explícitamente | Añade instrucción clara de "usar tool primero" |
| Parámetros incorrectos | args_schema poco claro |
Añade Field(description=...) |
| Salida difícil de usar | Texto libre demasiado disperso | Devuelve secciones fijas o JSON string |
Siguiente paso
Después de tools, el siguiente foco es consistencia de salida.
El próximo artículo muestra cómo fijar formato con Pydantic:
👉 Structured Output with Pydantic