El Patrón AGENT.md: Enseñando a los Agentes de IA a Usar Tus Herramientas
Le das a un agente de IA acceso a tu plataforma de datos. Tiene el CLI instalado. Tiene el SDK de Python disponible. ¿Qué hace?
Adivina. Alucina flags. Inventa métodos de API que no existen. Gasta 4 llamadas de herramientas averiguando el flujo de trabajo básico, quemando tokens y tu paciencia.
Hay una forma mejor. Un solo archivo Markdown que enseña a cualquier agente de IA exactamente cómo usar tus herramientas. Lo llamamos AGENT.md.
El Problema
Esto es lo que pasa cuando un agente de IA intenta usar una herramienta sin documentación:
Agent: I'll use the dataspoc CLI to ingest data.Agent: Running: dataspoc ingest --from postgres --to s3://bucketError: No such command 'ingest'
Agent: Let me try: dataspoc pipe create --source postgresError: No such command 'pipe'
Agent: Maybe: dataspoc-pipe --help[reads 50 lines of help text, burns 2000 tokens]
Agent: OK, I think it's: dataspoc-pipe run my-pipelineError: Pipeline 'my-pipeline' not found. Run 'dataspoc-pipe add' first.Cuatro intentos, cuatro fallos. El agente eventualmente lo logra, pero tomó 8 llamadas de herramientas y 10,000 tokens de tanteo.
La Solución: AGENT.md
AGENT.md es un archivo Markdown diseñado específicamente para que los agentes de IA lo lean. No para humanos (ellos tienen README), no para código (eso son los docstrings). Para agentes.
Este es el AGENT.md de DataSpoc:
# AGENT.md — DataSpoc Platform
## Capabilities
| Action | Tool | Command ||--------|------|---------|| Ingest data | Pipe | `dataspoc-pipe run <pipeline>` || Add new source | Pipe | `dataspoc-pipe add <name> --source <type>` || Query data | Lens | `dataspoc-lens shell` then SQL || Ask questions | Lens | `dataspoc-lens ask "<question>"` || Train model | Lens | `dataspoc-lens ml train --table <t> --target <col>` || Predict | Lens | `dataspoc-lens ml predict --model <name> --input <table>` |
## Python SDK
```pythonfrom dataspoc_pipe import PipeClientfrom dataspoc_lens import LensClient
pipe = PipeClient(project_path="./my-project")lens = LensClient(bucket_alias="company")
# Ingestpipe.run("my-pipeline")
# Queryresult = lens.sql("SELECT * FROM raw__postgres__orders LIMIT 10")
# AI Askanswer = lens.ask("What is the total revenue this month?")
# Trainlens.ml_train(table="curated__sales__customers", target="churned", model_name="churn-v1")Patterns
Ingest then Query
pipe.run("pipeline-name")lens.sql("SELECT COUNT(*) FROM raw__source__table")
Explore then Model
lens.tables()— see what is availablelens.sql("SELECT * FROM table LIMIT 5")— understand the schemalens.ml_train(table=..., target=..., model_name=...)— train
Ask then Verify
lens.ask("business question")— get SQL + resultlens.sql(answer.sql)— re-run to verify
Constraints
- Never modify bucket structure directly. Always use Pipe or Lens.
- Table names follow:
layer__source__tablename(double underscore). - Pipe writes raw/ and curated/. Lens writes gold/.
- ML models go to ml/models/. Predictions go to ml/predictions/.
- All credentials come from environment variables. Never hardcode.
Error Recovery
| Error | Cause | Fix |
|---|---|---|
| ”Pipeline not found” | Wrong name | Run pipe.list_pipelines() |
| ”Table not found” | Data not ingested | Run the pipeline first |
| ”No manifest” | Bucket not initialized | Run dataspoc-pipe init |
| ”Access denied” | Missing AWS creds | Check AWS_* env vars |
## Por Qué Funciona
Los agentes de IA (Claude, GPT-4, Gemini, modelos locales) comparten un comportamiento: leen contexto y siguen instrucciones. Cuando encuentran AGENT.md:
1. **Escanean la tabla de capacidades** — saben exactamente qué acciones son posibles2. **Copian los ejemplos del SDK de Python** — usan la sintaxis correcta en el primer intento3. **Siguen los patrónes** — ejecutan flujos de trabajo de múltiples pasos correctamente4. **Respetan las restricciones** — evitan errores comunes5. **Usan la recuperación de errores** — se autocorrigen sin ensayo y error
El resultado: una llamada de herramienta en lugar de ocho. Correcto en el primer intento.
## Comparación: Tres Enfoques
### Sin DocumentaciónAgent behavior:
- Guesses command names (wrong 80% of the time)
- Invents flags that don’t exist
- Takes 5-10 attempts to complete a task
- Burns 10,000+ tokens on exploration
- May give up entirely
### README.md (Diseñado para Humanos)Agent behavior:
- Finds installation instructions (not useful, already installed)
- Reads feature list (marketing language, not actionable)
- Finds some code examples (buried in prose)
- Takes 2-4 attempts to complete a task
- Burns 5,000+ tokens parsing human-friendly text
### AGENT.md (Diseñado para Máquinas)Agent behavior:
- Finds exact command in capabilities table (1 lookup)
- Copies Python SDK example (correct syntax)
- Follows pattern for multi-step task (no guessing)
- Completes task on first attempt
- Burns <1,000 tokens on the documentation
## Cómo Escribir AGENT.md para Tus Propias Herramientas
### Paso 1: Tabla de Capacidades
Lista cada acción que tu herramienta puede hacer. Una fila por acción. Incluye el comando exacto o la llamada a función.
```markdown## Capabilities
| Action | Command/Function ||--------|-----------------|| Create user | `api.create_user(email, name)` || List users | `api.list_users(filters={})` || Delete user | `api.delete_user(user_id)` |Paso 2: Ejemplos de Código
Muestra el import exacto y la inicialización. Muestra las operaciónes más comunes con código real y ejecutable:
## SDK
```pythonfrom myservice import Client
client = Client(api_key=os.environ["MY_API_KEY"])
# Createuser = client.create_user(email="test@example.com", name="Test")
# Readusers = client.list_users(filters={"active": True})
# Updateclient.update_user(user.id, name="New Name")### Paso 3: Patrones (Flujos de Trabajo de Múltiples Pasos)
Los agentes necesitan saber el orden de las operaciónes. Muestra flujos de trabajo comunes cómo pasos numerados:
```markdown## Patterns
### Onboard a New Customer1. `client.create_org(name="Acme")`2. `client.create_user(email="admin@acme.com", org_id=org.id, role="admin")`3. `client.send_invite(user.id)`
### Generate Monthly Report1. `data = client.get_metrics(period="last_month")`2. `report = client.generate_report(data, format="pdf")`3. `client.email_report(report, recipients=["cfo@company.com"])`Paso 4: Restricciones
¿Qué NO debe hacer nunca el agente? ¿Cuáles son las reglas firmes?
## Constraints
- Never delete production data without confirmation- Always use pagination for list endpoints (max 100 per page)- Rate limit: 60 requests per minute- IDs are UUIDs, never integers- Dates are always ISO 8601 with timezonePaso 5: Tabla de Recuperación de Errores
Los agentes encuentran errores. Diles qué significa cada error y cómo soluciónarlo:
## Error Recovery
| Error | Fix ||-------|-----|| 401 Unauthorized | Re-check API_KEY env var || 404 Not Found | Verify resource ID with list endpoint || 429 Rate Limited | Wait 60 seconds, retry || 500 Server Error | Retry up to 3 times with backoff |Plantilla Completa
Aquí hay una plantilla para copiar y pegar para tus propias herramientas:
# AGENT.md — [Your Tool Name]
## Capabilities
| Action | Command/Function | Returns ||--------|-----------------|---------|| ... | ... | ... |
## Setup
```pythonfrom your_tool import Clientclient = Client() # or however initialization worksCommon Operations
# Operation 1result = client.do_thing(param1, param2)
# Operation 2items = client.list_things(filter="active")Patterns
Pattern Name
- Step one
- Step two
- Step three
Constraints
- Rule 1
- Rule 2
- Rule 3
Error Recovery
| Error | Cause | Fix |
|---|---|---|
| … | … | … |
## Dónde Colocar AGENT.md
Colócalo donde los agentes de IA lo encontrarán:
- **Raíz del repositorio** — los agentes explorando tu código base lo encontrarán inmediatamente- **Directorio del paquete** — los agentes usando tu paquete instalado pueden localizarlo- **Sitio de documentación** — los agentes con acceso web pueden descargarlo- **System prompt** — si controlas el agente, inyéctalo directamente
DataSpoc incluye AGENT.md en el paquete instalado:
```pythonimport importlib.resourcesagent_instructions = importlib.resources.read_text("dataspoc_lens", "AGENT.md")Los servidores MCP pueden exponerlo cómo un recurso:
@server.resource("dataspoc://agent-instructions")def get_agent_instructions(): return read_file("AGENT.md")Impacto en el Mundo Real
Probamos la misma tarea (“ingestar datos de Postgres y entrenar un modelo de churn”) con y sin AGENT.md en tres agentes de IA:
| Agent | Sin AGENT.md | Con AGENT.md |
|---|---|---|
| Claude | 7 llamadas, 2 errores | 3 llamadas, 0 errores |
| GPT-4 | 9 llamadas, 4 errores | 3 llamadas, 0 errores |
| Gemini | 11 llamadas, 5 errores | 4 llamadas, 1 error |
El patrón funcióna porque coincide con la forma en que los agentes procesan información: estructurada, escaneable, lista para copiar y pegar. Sin prosa que analizar, sin ambigüedad que resolver, sin contexto humano que inferir.
Escribe un AGENT.md para tus herramientas. Tus agentes de IA te lo agradecerán funciónando correctamente en el primer intento.