Appearance
Runbook: Adicionar uma nova AI tool (D0.4)
Tempo médio: ~20 min. Severidade: rotina (não é incidente).
Pré-condições
- Existe endpoint REST no Product API que faz a ação (a IA nunca toca o Postgres do produto, ADR-002).
- A ação tem permissão correspondente no RBAC do produto.
Passos
- Escolha o grupo em
contrasync-ai-api/src/modules/tools/(contracts,templates,org,billing,insights) ou crienome.tools.ts. - Defina o schema Zod e o objeto
definition:name(snake_case único),description(PT-BR, o LLM lê isto),permission(string RBAC),schema,audit: true,access: READ | WRITE.- Ação destrutiva →
requiresConfirmation: truee adicioneconfirm: z.boolean().optional()ao schema.
- Implemente a classe
@AITool(def) @Injectable()comreadonly definition = defeexecute(input, context)chamandoProductApiClientService.request(...)com:userToken: context.userToken,traceparent: context.traceparent, e em WRITEidempotencyKey: context.idempotencyKey. - Registre a classe no array exportado do arquivo (
*_TOOLS): oToolsModulejá injeta todos; oAIToolRegistryServiceautodescobre no boot viaDiscoveryService. - Eval: adicione casos em
eval/tool-selection.json(eintent.jsonse for nova intenção). Rodenpm run ai:eval -- --check. - Valide:
npm run format && npm run lint && npx tsc --noEmit && npm test. - Doc: atualize
architecture/ai-api/tool-framework.md(lista de tools) e o módulo de negócio emdocs/business/se for nova capacidade (regra "no doc, no merge").
Verificação
sh
curl -H "Authorization: Bearer $JWT" http://localhost:4001/ai/v1/tools.jsonA tool nova deve aparecer em { tools: [...] } com inputSchema correto.
Rollback
Remova a classe do array *_TOOLS e faça novo deploy, o registry deixa de expô-la no próximo boot. Tool calls passadas continuam auditadas em ai_tool_call.