O Padrão AGENT.md: Ensinando Agentes de IA a Usar Suas Ferramentas
Você dá a um agente de IA acesso à sua plataforma de dados. Ele tem o CLI instalado. Ele tem o SDK Python disponível. O que ele faz?
Ele adivinha. Ele alucina flags. Ele inventa métodos de API que não existem. Ele gasta 4 chamadas de ferramenta descobrindo o fluxo básico de trabalho, queimando tokens e sua paciência.
Existe um caminho melhor. Um único arquivo Markdown que ensina qualquer agente de IA exatamente como usar suas ferramentas. Nós chamamos de AGENT.md.
O Problema
Aqui está o que acontece quando um agente de IA tenta usar uma ferramenta sem documentação:
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.Quatro tentativas, quatro falhas. O agente eventualmente chega lá, mas levou 8 chamadas de ferramenta e 10.000 tokens de tentativa e erro.
A Solução: AGENT.md
AGENT.md é um arquivo Markdown projetado especificamente para agentes de IA lerem. Não para humanos (eles têm o README), não para código (isso são os docstrings). Para agentes.
Aqui está o AGENT.md do 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 Que Isso Funciona
Agentes de IA (Claude, GPT-4, Gemini, modelos locais) todos compartilham um comportamento: eles leem contexto e seguem instruções. Quando encontram o AGENT.md, eles:
1. **Escaneiam a tabela de capacidades** — sabem exatamente quais ações são possíveis2. **Copiam os exemplos do SDK Python** — usam a sintaxe correta na primeira tentativa3. **Seguem os padrões** — executam fluxos de trabalho multi-etapa corretamente4. **Respeitam as restrições** — evitam erros comuns5. **Usam a recuperação de erros** — se autocorrigem sem tentativa e erro
O resultado: uma chamada de ferramenta em vez de oito. Correto na primeira tentativa.
## Comparação: Três Abordagens
### Sem DocumentaçãoAgent 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 (Projetado 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 (Projetado 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
## Como Escrever AGENT.md para Suas Próprias Ferramentas
### Passo 1: Tabela de Capacidades
Liste cada ação que sua ferramenta pode fazer. Uma linha por ação. Inclua o comando exato ou chamada de função.
```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)` |Passo 2: Exemplos de Código
Mostre o import e a inicialização exatos. Mostre as operações mais comuns com código real e executável:
## 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")### Passo 3: Padrões (Fluxos de Trabalho Multi-Etapa)
Agentes precisam saber a ordem das operações. Mostre fluxos de trabalho comuns como passos 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"])`Passo 4: Restrições
O que o agente NUNCA deve fazer? Quais são as regras rígidas?
## 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 timezonePasso 5: Tabela de Recuperação de Erros
Agentes encontram erros. Diga a eles o que cada erro significa e como corrigir:
## 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 |Template Completo
Aqui está um template pronto para copiar e colar para suas próprias ferramentas:
# 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 |
|---|---|---|
| … | … | … |
## Onde Colocar o AGENT.md
Coloque-o onde agentes de IA irão encontrá-lo:
- **Raiz do repositório** — agentes explorando seu codebase irão encontrá-lo imediatamente- **Diretório do pacote** — agentes usando seu pacote instalado podem localizá-lo- **Site de documentação** — agentes com acesso web podem buscá-lo- **System prompt** — se você controla o agente, injete-o diretamente
O DataSpoc inclui o AGENT.md no pacote instalado:
```pythonimport importlib.resourcesagent_instructions = importlib.resources.read_text("dataspoc_lens", "AGENT.md")Servidores MCP podem expô-lo como um recurso:
@server.resource("dataspoc://agent-instructions")def get_agent_instructions(): return read_file("AGENT.md")Impacto no Mundo Real
Testamos a mesma tarefa (“ingerir dados do Postgres e treinar um modelo de churn”) com e sem AGENT.md em três agentes de IA:
| Agent | Sem AGENT.md | Com AGENT.md |
|---|---|---|
| Claude | 7 chamadas, 2 erros | 3 chamadas, 0 erros |
| GPT-4 | 9 chamadas, 4 erros | 3 chamadas, 0 erros |
| Gemini | 11 chamadas, 5 erros | 4 chamadas, 1 erro |
O padrão funciona porque corresponde a como agentes processam informação: estruturado, escaneável, pronto para copiar e colar. Sem prosa para interpretar, sem ambiguidade para resolver, sem contexto humano para inferir.
Escreva um AGENT.md para suas ferramentas. Seus agentes de IA irão agradecer funcionando de primeira.