Publicado
Engenharia

O detector de Claude falso agora é uma biblioteca de código aberto

ai-model-verifier é o motor por trás do nosso testador de modelos, publicado no npm sob AGPL-3.0. Dê a ele uma URL base, uma chave e um modelo e ele diz se o endpoint entrega o que vende, agora com verificação da assinatura de raciocínio e da cobrança de tokens.

·4 min de leitura·Por Equipe UnoRouter
engenhariaanúncio

Em abril publicamos os números sobre revendedores falsos de Claude: 183 canais em 8 provedores que respondiam como Kiro, Codeium ou outro modelo usando o crachá do Claude. As sondas que os pegaram viviam dentro do nosso pipeline de sincronização. Agora vivem em um pacote que qualquer um pode instalar.

ai-model-verifier está no npm e no GitHub sob AGPL-3.0. Ele recebe uma URL base, uma chave de API e um nome de modelo e devolve um de três veredictos, genuine, suspicious ou unverified, junto com a regra acionada e as respostas brutas das sondas.

Por que uma biblioteca

As mesmas verificações rodam agora em três lugares: no seu navegador no testador de modelos, nos nossos servidores para o ranking público e dentro do pipeline de sincronização que decide quais vias upstream o UnoRouter expõe. Três cópias de uma lista de padrões acabam divergindo. Um único pacote, não.

Ele é isomórfico de propósito. Apenas APIs padrão da web, nenhum import node:, zero dependências em tempo de execução. A chamada HTTP é injetada, então um navegador pode contornar o CORS e um servidor pode passar por um fetch protegido contra SSRF. Provedores e detectores são pontos de entrada separados, então verificar a Anthropic nunca empacota a configuração do Gemini.

O que há de novo desde abril

As quatro sondas de comportamento do primeiro artigo continuam sendo o núcleo: a história do gatinho, o haicai, a pergunta de identidade e a pergunta do nome do modelo, agora para endpoints no formato Anthropic, OpenAI e Gemini. Em volta delas há verificações que não dependem de perguntar ao modelo quem ele é.

  • Assinatura de raciocínio. O Claude anexa uma assinatura gerada no servidor a cada bloco de raciocínio. Um relay que serve outro modelo não consegue produzi-la. Sondas de identidade podem ser treinadas com um prompt de sistema; uma assinatura, não.
  • Contabilidade de tokens. Um relay pode encaminhar Claude autêntico e ainda assim inflar input_tokens em toda chamada. Dois prompts que diferem por um trecho fixo de texto devem diferir nos tokens cobrados dentro de uma faixa conhecida, count_tokens deve bater com o que foi cobrado e a saída deve ficar abaixo de max_tokens. Opus 4.7 e 4.8 usam outro tokenizador, então a faixa também funciona como verificação de nível.
  • Nível errado e substituição. Cobrar Opus e servir Sonnet passa pelas sondas de comportamento, porque o Sonnet escreve uma história de gatinho perfeitamente boa. A sonda do nome do modelo pega uma resposta que nomeia o nível mais barato, e a verificação do envelope pega um endpoint que devolve um id de modelo diferente do solicitado.
  • Mistura de respostas e vazamento de idioma. Todo prompt carrega um nonce. Uma resposta que devolve o nonce de outra pessoa significa que o proxy está misturando respostas entre usuários. Caracteres CJK na resposta a um prompt em inglês apontam para um modelo chinês substituído.
  • Metadados do envelope. Um id chatcmpl- dentro de uma resposta no formato Anthropic, ou chaves de uso da OpenAI em uma resposta Messages, significa que há uma camada de tradução entre você e o modelo. Relatado como observação, não como veredicto: o nosso próprio gateway é exatamente uma camada dessas.
  • Vazão. Modelos maiores são mais lentos por token, então uma via cobrada como Opus que roda na velocidade do Sonnet merece uma olhada. Amostrada, nunca com limiar: a comparação útil é entre vias que servem o mesmo modelo, e só quem chama consegue montá-la.

O que ele não prova

Uma assinatura válida prova que um caminho Anthropic autêntico respondeu. Não prova qual nível: o Sonnet devolve uma assinatura perfeitamente válida quando vendido como Opus, então passar ali ainda exige as verificações de nível. Reenviar o bloco de raciocínio para a Anthropic revalidar a assinatura soa como o teste definitivo. Nós o construímos, e ele não funciona através de um relay. Dois upstreams em produção devolveram 200 para um bloco autêntico e para o mesmo bloco com 308 bytes de base64 aleatório no lugar da assinatura. Um relay reemite o turno para o próprio backend, então nada valida nunca. A opção fica desligada por padrão e está documentada assim.

As verificações de assinatura e de tokens foram portadas do veridrop, também AGPL, cujas tolerâncias foram calibradas contra a API oficial. Mantivemos os limites de aparência frouxa porque respostas reais da Anthropic ficavam perto deles.

Use

O testador de modelos roda o conjunto completo no seu navegador, verificações de assinatura e de tokens incluídas, e nada sai da sua máquina além das chamadas ao seu provedor. A página de ranking publica os resultados que as pessoas escolheram compartilhar. Para o seu próprio pipeline:

typescript
import { runVerification } from "ai-model-verifier";

const result = await runVerification({
  provider: "anthropic",
  baseUrl: "https://YOUR-PROVIDER",
  apiKey: process.env.YOUR_KEY,
  model: "claude-opus-4-8",
  mode: "server",
  checkSignature: true,
  checkTokenTruth: true,
});

console.log(result.verdict, result.reasons);
// "suspicious" [ "tier-mismatch: requested claude-opus-4-8, served sonnet" ]

Ative o que precisar. checkSignature e checkTokenTruth custam requisições extras, então ficam desligados a menos que sejam pedidos. Metadados do envelope e vazão são lidos das respostas que a execução já fez e não custam nada.

Teste um provedor, leia o artigo de abril para ver os números que começaram tudo isso, ou abra uma issue no GitHub se um endpoint real receber um veredicto errado.

Postagens relacionadas