Livro de prompts
Com o servidor MCP conectado, você constrói uma integração com a Cogneris descrevendo o que quer. Estes prompts funcionam como estão no chat de agente do VS Code, Visual Studio, Cursor e Claude Code — cole um, ajuste os nomes e caminhos ao seu projeto e revise o que o assistente propõe antes de aceitar.
Este vídeo mostra o fluxo inteiro no VS Code: uma chave de API, a extração e a classificação em Python e um webhook com assinatura verificada.
No VS Code e no Visual Studio, as ferramentas da Cogneris só ficam disponíveis com o Copilot Chat no modo Agent.
Como escrever um prompt que funciona de primeira
- Diga "Cogneris". Isso faz o assistente usar as ferramentas da Cogneris em vez de adivinhar a API.
- Diga a linguagem e o framework se o projeto não deixar isso óbvio — ".NET 8 minimal API", "Node com TypeScript", "Python com FastAPI".
- Diga onde ficam os segredos. "Leia a chave de
COGNERIS_API_KEY" mantém a chave fora do código. - Diga sandbox ou produção. Chaves de sandbox (
xtkt_test_…) cobrem o fluxo assíncrono de jobs (/api/v1/artifactse/api/v1/document-jobs); as rotas síncronas/Document/*e os classificadores precisam de uma chave de produção (xtkt_live_…). - Peça um teste. "…e rode contra
samples/nota.pdf" faz o assistente provar a integração em vez de só escrevê-la.
Integrar a extração
Envie um documento para a Cogneris e receba os campos em JSON.
- C# · Visual Studio
- TypeScript · VS Code
- Python
Usando a Cogneris, adicione a esta solução .NET um serviço
InvoiceExtractor. Ele recebe o caminho de um PDF, envia o arquivo para a API de extração da Cogneris e devolve os campos extraídos num record tipadoInvoice(fornecedor, número da nota, data de emissão, total, moeda). Leia a chave de API deCOGNERIS_API_KEYe a URL base deCOGNERIS_API_BASE_URL. TratehasErrorse o limite de taxa429com nova tentativa. Adicione um teste xUnit que rode contrasamples/nota.pdf.
Usando a Cogneris, escreva
src/cogneris/extract.ts: uma funçãoextractDocument(path)que envia o arquivo para a API de extração da Cogneris e devolve os campos. Depois observe a pastainbox/e, para cada PDF novo, salve o resultado ao lado como<nome>.json. Leia a chave deCOGNERIS_API_KEY. Usefetch, sem SDK.
Usando a Cogneris, adicione um módulo
cogneris_client.pycomextract(path) -> dictque chama a API de extração da Cogneris comhttpx, levanta um erro claro quandohasErrorsvier verdadeiro, e uma CLI que extrai todos os PDFs de uma pasta para um CSV. Leia a chave deCOGNERIS_API_KEY.
O que o assistente faz
cogneris_whoami— confirma o seu tenant, o ambiente e a URL base da API a usar.cogneris_docs_searchecogneris_api_referenceparaPOST /Document/extraction— lê a requisição (multipart/form-data, campofile,ComplementaryPromptopcional), o envelope da resposta, os erros e os limites (10 MB por arquivo, 50 requisições por minuto por chave).- Escreve o código no seu projeto, seguindo o exemplo de referência da sua linguagem.
- Roda o teste, se você pediu — depois de conferir que há uma chave em
COGNERIS_API_KEY(crie uma se não houver).
O tipo de código que volta (C#, resumido):
using System.Net.Http.Headers;
using System.Text.Json;
public sealed class InvoiceExtractor(HttpClient http)
{
public async Task<JsonElement> ExtractAsync(string path, CancellationToken ct = default)
{
await using var file = File.OpenRead(path);
using var form = new MultipartFormDataContent();
var part = new StreamContent(file);
part.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
form.Add(part, "file", Path.GetFileName(path));
using var response = await http.PostAsync("/Document/extraction", form, ct);
// The body is JSON even when Content-Type says text/plain.
using var body = JsonDocument.Parse(await response.Content.ReadAsStringAsync(ct));
var root = body.RootElement;
if (!response.IsSuccessStatusCode || root.GetProperty("hasErrors").GetBoolean())
throw new InvalidOperationException($"Cogneris extraction failed: {root}");
return root.GetProperty("data").GetProperty("metadata").GetProperty("fields").Clone();
}
}
// Program.cs
builder.Services.AddHttpClient<InvoiceExtractor>(c =>
{
c.BaseAddress = new Uri(builder.Configuration["COGNERIS_API_BASE_URL"] ?? "https://api-eu.cogneris.ai");
c.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", builder.Configuration["COGNERIS_API_KEY"]);
});
Para volumes altos: o fluxo assíncrono
Usando a Cogneris, mude o extrator para o fluxo assíncrono de jobs: envie o arquivo como artefato, submeta um document job de
Extractioncom umIdempotency-Keyderivado do hash do arquivo e aguarde o resultado. Tem que funcionar com uma chave de sandbox.
O assistente passa a usar POST /api/v1/artifacts → POST /api/v1/document-jobs →
GET /api/v1/document-jobs/{jobId} e lê o resultado no artefato de saída do job. Uma submissão repetida com o
mesmo Idempotency-Key devolve o job original em vez de processar o documento duas vezes. Combine com um
webhook para parar de consultar.
Criar uma chave de API
Crie uma chave de API de sandbox da Cogneris chamada
invoice-importer-dev, só com os escopos de que este projeto precisa, e coloque-a no.envcomoCOGNERIS_API_KEY. Garanta que o.envestá no.gitignore.
O que o assistente faz
cogneris_apikeys_create— uma chave de sandbox, com os escopos mínimos para o código que ele viu.- Confere que o
.envé ignorado pelo git, grava o valor ali e não o repete no chat. O valor aparece uma única vez; depois a Cogneris mostra só os quatro últimos caracteres.
Para produção, diga explicitamente — "crie uma chave de produção…" — e o assistente pede a sua confirmação antes de criá-la. Para fazer a limpeza depois:
Liste as minhas chaves de API da Cogneris e revogue as que não foram usadas nos últimos 90 dias. Mostre a lista antes de revogar.
Isso exige um token de desenvolvedor com o escopo apikeys.manage. Prefere a tela?
Gere uma chave de API na plataforma.
Gerar a sua própria API sobre a Cogneris
Exponha a extração para o resto da sua empresa por uma API que é sua, com a sua autenticação e o seu formato de resposta.
- C# · Visual Studio
- TypeScript · VS Code
Usando a Cogneris, crie um novo projeto ASP.NET Core minimal API
DocumentGatewaycomPOST /invoices/extract: ele recebe o upload de um PDF (máx. 10 MB), envia para a extração da Cogneris e devolve{ supplier, invoiceNumber, issueDate, total, currency }. Devolva422quando a Cogneris reportar erros e503comRetry-Afterem caso de limite de taxa. Adicione OpenAPI, health check, um Dockerfile, e leia a chave da Cogneris da configuração — nunca do código. Crie uma chave de API de sandbox da Cogneris para o desenvolvimento local.
Usando a Cogneris, crie um serviço Express + TypeScript com
POST /documents/classify-and-extract: ele classifica o upload com a API de classificação da Cogneris e, para notas fiscais e recibos, também extrai os campos. Valide o upload commulter(PDF, PNG, JPG, máx. 10 MB), adicione um documento OpenAPI, um teste Vitest que simula a Cogneris, e leia a chave deCOGNERIS_API_KEY.
O assistente lê as duas rotas da Cogneris com cogneris_api_reference, cria o projeto, conecta o cliente, cria
a chave de sandbox no .env e, se você pedir, sobe o serviço e o chama com um arquivo de exemplo.
Criar um webhook
Seja avisado quando a Cogneris terminar um documento, em vez de ficar consultando.
Usando a Cogneris, registre um webhook em
https://api.example.com/hooks/cognerispara documentos processados. Escreva o receptor neste projeto como um endpoint ASP.NET Core que verifica a assinatura da Cogneris sobre o corpo bruto, ignora entregas que já viu e enfileira o id do job. Guarde o segredo de assinatura no.envcomoCOGNERIS_WEBHOOK_SECRET. Depois envie uma entrega de teste e me mostre o resultado.
O que o assistente faz
cogneris_webhooks_event_types— encontra o evento,com.cogneris.document.processed.v1, e confere se ele está ativo (enviado hoje) e não apenas planejado.cogneris_webhooks_create— registra o endpoint. O segredo de assinatura volta uma única vez, junto com o código do receptor em Node, Python e C#; o assistente grava o segredo no.env.- Escreve o receptor: verifica
Cogneris-Webhook-Signature, rejeita carimbos de tempo com mais de 300 segundos e usaCogneris-Webhook-Id(o mesmo em toda nova tentativa) como chave de idempotência. cogneris_webhooks_teste depoiscogneris_webhooks_deliveries_get— envia uma entrega de teste assinada e mostra o código de status que o seu receptor respondeu.
A assinatura é t=<segundos unix>,v1=<hex>: um HMAC-SHA256 de "<t>." + corpo bruto, com o segredo de
assinatura decodificado de base64url como chave — usar o texto do segredo como chave nunca confere. Esta é a
verificação que o assistente escreve:
- C#
- Node
- Python
static bool VerifyCogneris(byte[] rawBody, string? signatureHeader, string secret)
{
string? ts = null, v1 = null;
foreach (var part in (signatureHeader ?? "").Split(',', StringSplitOptions.TrimEntries))
{
if (part.StartsWith("t=")) ts = part[2..];
else if (part.StartsWith("v1=")) v1 = part[3..];
}
if (!long.TryParse(ts, out var t) || v1 is null) return false;
if (Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - t) > 300) return false;
byte[] supplied;
try { supplied = Convert.FromHexString(v1); } catch (FormatException) { return false; }
var key = Base64Url.DecodeFromChars(secret);
var signed = Encoding.UTF8.GetBytes($"{t}.").Concat(rawBody).ToArray();
return CryptographicOperations.FixedTimeEquals(HMACSHA256.HashData(key, signed), supplied);
}
import crypto from 'node:crypto';
// Express: mount the route with express.raw({ type: 'application/json' }) to keep the raw body.
export function verifyCogneris(rawBody, signatureHeader, secret = process.env.COGNERIS_WEBHOOK_SECRET) {
const parts = Object.fromEntries(String(signatureHeader ?? '').split(',').map((p) => p.trim().split('=', 2)));
const t = Number(parts.t);
if (!Number.isInteger(t) || !/^[0-9a-f]{64}$/.test(parts.v1 ?? '')) return false;
if (Math.abs(Date.now() / 1000 - t) > 300) return false;
const key = Buffer.from(secret, 'base64url');
const expected = crypto.createHmac('sha256', key).update(`${t}.`).update(rawBody).digest();
return crypto.timingSafeEqual(expected, Buffer.from(parts.v1, 'hex'));
}
import base64, hashlib, hmac, os, time
def verify_cogneris(raw_body: bytes, signature_header: str | None, secret: str | None = None) -> bool:
secret = secret or os.environ["COGNERIS_WEBHOOK_SECRET"]
parts = dict(p.strip().split("=", 1) for p in (signature_header or "").split(",") if "=" in p)
try:
t = int(parts["t"])
supplied = bytes.fromhex(parts["v1"])
except (KeyError, ValueError):
return False
if abs(time.time() - t) > 300:
return False
key = base64.urlsafe_b64decode(secret + "=" * (-len(secret) % 4))
expected = hmac.new(key, f"{t}.".encode() + raw_body, hashlib.sha256).digest()
return hmac.compare_digest(expected, supplied)
O endpoint precisa ser HTTPS público na porta 443 — para um receptor na sua máquina, exponha-o antes por um
túnel. Isso exige um token de desenvolvedor com o escopo webhooks.manage.
Quando uma entrega falhar:
Por que as últimas entregas de webhook da Cogneris falharam? Mostre os códigos de status que o meu endpoint respondeu e reenvie as que falharam depois que o receptor estiver corrigido.
Criar o seu próprio tipo de documento
O servidor traz este fluxo como prompt pronto — no VS Code, digite / no chat e escolha Create and train a
Cogneris classifier. Ou escreva:
Usando a Cogneris, crie um classificador chamado "Nota fiscal de fornecedor" a partir dos PDFs em
samples/notas/, treine e me avise quando estiver pronto.
O assistente envia as amostras (até 10 arquivos de 10 MB cada por chamada), inicia o treinamento e acompanha o
status até Finished. Um classificador pronto passa a conduzir a classificação e a extração do seu tenant.
Perguntar sobre a sua conta
Quantos documentos e páginas processamos na Cogneris nos últimos 7 dias, por tipo de documento?
Quais rotas da API da Cogneris fazem face match? Mostre a requisição em curl.