← NEW FLOW LEGAL

Guia de engenharia — Agentes de IA no agno

Como escrever specs de agentes de IA que rodam no nosso apps/agno e expor os endpoints (agno + espelho no backend Node). Fiel ao código atual.

Para: dev que cria specs de agentes apps/agno + apps/backend Fonte da verdade: specs/Yousa Agno/Conhecimento e Memoria/Tarefas/24-guia-agentes-ia-agno/
📌
Este é o resumo navegável. A fonte da verdade (com citações arquivo:linha, template e exemplo) vive versionada em specs/Yousa Agno/Conhecimento e Memoria/Tarefas/24-guia-agentes-ia-agno/: guia-agentes-agno.md, template-spec-agente.md, exemplo-doc-feedback-app.md. O passo a passo oficial de registrar um agente de manifesto é o apps/agno/REGISTERING-AN-AGENT.md.

1 · Quando criar um agente

Crie um agente quando a tarefa exige decisão ou linguagem natural que depende de um LLM: classificar, resumir, redigir, conversar, validar conteúdo, extrair dados de texto livre.

Se a tarefa é determinística (mover status, calcular prazo, disparar webhook), não é agente — é automação comum no backend. Todo agente é advisory: sugere, o advogado decide.

2 · Os dois estilos (coexistem)

A — Manifesto (agno Agent)B — Endpoint FastAPI
DeclaraçãoAgentManifest em manifests.pypasta minha_feature/route.py + register(app)
LLMagno Agent com OpenRouter(id=model)OpenAI SDK apontada ao OpenRouter direto
Promptseed no código → versão ativa no banco (Sandbox)constante _SYSTEM_BASE no módulo
I/Oconversacional (chat / test-run)contrato JSON próprio (você define)
Sandboxsim (registry)não (a menos que também tenha manifesto)
Use quandoconversacional geral, prompt governadoI/O estruturado, pipeline, dry-run, JSON estrito

Regra prática: agente de documentos / triagem / agendamento → estilo B. Chat do caso / assistente → estilo A. Pode combinar.

3 · Anatomia de um endpoint (estilo B)

Referência: apps/agno/pre_kickoff/route.py. Ordem do route.py:

Wire final em apps/agno/app.py: import minha_feature.route as mf e mf.register(app).

Pipeline rico (ferramentas externas, dry-run, RAG, persistência): siga apps/agno/intake/ (route → pipeline → llm → schema → data → rag).

4 · Manifesto + Sandbox (estilo A) — a pegadinha do prompt

⚠️
No boot, o registry semeia a versão 1 do prompt no banco. Depois disso, o runtime usa a versão ativa no banco (Sandbox), não a string do código. Editar o prompt em manifests.py após o seed não muda produção — muda via Sandbox (novo draft → ativar). Procedimento completo: apps/agno/REGISTERING-AN-AGENT.md.

5 · Contrato (request / response)

Exemplo real: POST /pre-kickoff/draft-message in {case_id, client_name?, case_type?} → out {message}.

6 · RAG do caso

Escrita (intake/rag.py): embeddings text-embedding-3-small (1536 dims), upsert idempotente por (case_id, source_type) em case_knowledge_chunks.

🔒
Nunca indexe PII / conteúdo cru — só resumo/estruturado (COMP-04).

Leitura: injeta os últimos N chunks no system prompt. O source_type é o que a Base de conhecimento do Caso (aba Geral) agrupa e mostra ao time — escolha um claro.

7 · Espelho no backend Node

O frontend nunca fala com o agno direto: passa pelo apps/backend. Padrão:

Convenção atual: novos routers em apps/backend/src/routes/ (ex.: agents-pre-kickoff.mjs).

8 · Testes (sem LLM real)

apps/agno/tests/ com pytest: cria FastAPI() isolado, chama register(app), TestClient, e patch("...route._complete", return_value=...) para o LLM nunca rodar.

Obrigatório: teste de contrato (mockando _complete) + teste de não-vazamento de PII em log. No espelho Node, testar a factory com fetch fake.

9 · Env / config

agno: DATABASE_URL, OPENROUTER_API_KEY, AGNO_DEFAULT_MODEL, AGNO_API_KEY, CORS_ALLOWED_ORIGINS, PORT (8000).

backend Node: AGNO_BASE_URL / AGNO_URL (default http://localhost:8000).

10 · Compliance (não negociável)

Inconsistências conhecidas (use a forma canônica)

🔧
1. Model id ponto vs traço: manifests.py/intake/llm.py usam anthropic/claude-sonnet-4.6; intake/chat.py e pre_kickoff/route.py hardcodam -4-6. Canônico: ler de AGNO_DEFAULT_MODEL, não hardcodar.
2. AGNO_BASE_URL vs AGNO_URL: feature routes usam um, a sandbox usa outro. Canônico: padronizar num nome (decisão do time).

Checklist — criar um agente novo

  1. Decidir o estilo (A manifesto / B endpoint).
  2. Escrever a spec copiando template-spec-agente.md: objetivo, contrato JSON, scoping, prompt-seed, RAG source_type, espelho Node, testes, env, compliance.
  3. Estilo B: criar minha_feature/route.py e dar register(app) no app.py. Estilo A: AgentManifest em manifests.py + seguir REGISTERING-AN-AGENT.md.
  4. RAG: se indexar, escolher source_type e garantir só-resumo idempotente.
  5. Espelho Node (se o front consome): createXHandler + requireIdentity + mount em server.mjs.
  6. Testes: contrato mockando _complete + PII-em-log.
  7. Env: OPENROUTER_API_KEY, AGNO_API_KEY, AGNO_BASE_URL, DATABASE_URL.

Exemplo aplicado — Agente de revisão de doc do APP

📄 "Doc feedback APP" (estilo B)

Quando um documento chega pelo APP, o agente revisa e gera o feedback estruturado. Consumidor visível: document.html.

POST /documents/review
in:  { case_id, document_id, document_type_expected?, file_ref }
out: { verdict: "ok"|"ressalva"|"rejeitado",
       checks: [ { name, pass, note } ],
       summary, attorney_review_required: true, disclaimer }

Checks v1: tipo confere · legível · completo · assinado/datado. O summary vira o card "Doc feedback APP"; o verdict dirige o stepper.

RAG: indexa só o summary com source_type='document_review'.

Fora do escopo v1 (vira tarefa futura): OCR/leitura do arquivo, classificação multi-tipo, extração de campos. Detalhe completo em specs/Yousa Agno/Conhecimento e Memoria/Tarefas/24-guia-agentes-ia-agno/exemplo-doc-feedback-app.md.