Pular para o conteúdo
niadra
Integração · Vercel AI SDK

Memória para o Vercel AI SDK.

niadraMiddleware(session) é um language model middleware para wrapLanguageModel({ model, middleware }): a via idiomática do AI SDK, que funciona com todo provedor sem pacote de provedor separado. niadraTools(session) devolve o kit do histórico como ferramentas do AI SDK. Só em TypeScript.

O AI SDK entrega as mensagens da interface ao modelo e devolve o stream. A memória, se existe, é o que a sua rota carrega do banco para esta sessão de chat. O que a mesma pessoa disse no WhatsApp a outro fornecedor, ou o que o agente de pedidos fez no ERP, não chega à rota.

O middleware entra no wrapLanguageModel, uma vez, para qualquer provedor: transformParams põe o contexto da cliente como mensagem de sistema logo depois das suas e o sufixo, com os deltas e as falas de outros canais, no fim da última mensagem do usuário, onde todo provedor aceita. wrapGenerate e wrapStream registram o texto do modelo como turno do agente, com o uso informado.

O exemplo mínimo, como está na documentação
npm install @niadra/sdk ai   # ai 5, 6 or 7, as an optional peer dependency
// A chat route with the Vercel AI SDK (Next.js App Router or any fetch handler): the model gets
// the customer's context through a middleware, and the history tools next to your own.
import { openai } from "@ai-sdk/openai";
import {
  type UIMessage,
  convertToModelMessages,
  createUIMessageStreamResponse,
  isStepCount,
  streamText,
  toUIMessageStream,
  wrapLanguageModel,
} from "ai";
import { Niadra, handles } from "@niadra/sdk";
import { niadraMiddleware, niadraTools } from "@niadra/sdk/ai-sdk";

const niadra = new Niadra();

/** `userId` comes from your session: the customer is never something the model or the browser picks. */
export async function POST(request: Request, userId: string): Promise<Response> {
  const { id, messages } = (await request.json()) as { id: string; messages: UIMessage[] };
  const convo = niadra.conversation({ subject: handles.appUserId(userId), channel: "web_chat", conversation_id: id });

  const tools = niadraTools(convo);
  const result = streamText({
    model: wrapLanguageModel({
      model: openai("gpt-4.1"),
      // The user signed in, which proves V2 in this space's policy.
      middleware: niadraMiddleware(convo, { verify: { method: "login", level: "V2" } }),
    }),
    system: "You are Acme's support agent. Be brief.",
    messages: await convertToModelMessages(messages),
    tools,
    stopWhen: isStepCount(4),
  });
  return createUIMessageStreamResponse({ stream: toUIMessageStream({ stream: result.stream, tools }) });
}
  • TypeScript

O mesmo código está em examples/ai-sdk.ts nos repositórios dos SDKs, onde roda na CI contra os tipos reais do framework e o emulador da Niadra. Para testar sem a nuvem da Niadra, niadra-mock e NIADRA_BASE_URL=http://127.0.0.1:8765.

Como o adaptador se liga

As cinco primitivas de toda integração da Niadra, nos pontos de extensão deste framework.

Contexto
transformParams põe o contexto como mensagem de sistema logo depois das suas mensagens de sistema e o sufixo (deltas e falas de outros canais) como parte de texto no fim da última mensagem do usuário, onde todo provedor aceita.
Turnos
transformParams registra a mensagem mais nova do cliente; wrapGenerate e wrapStream registram o texto do modelo como turno do agente, com o uso que o provedor informou: tokens do prompt, leituras e escritas de cache. Passos que só chamam ferramentas não registram nada.
Ferramentas
niadraTools(session): o kit como ferramentas do AI SDK, amarradas ao cliente; junte às suas com spread.
Verificação
niadraMiddleware(session, { verify: { method, level } }) registra o que o seu app provou antes da primeira leitura, um login, por exemplo.
Transbordo
conv.handoff() onde a sua rota transfere.

O que o agente recebe

O contexto é compilado quando a memória muda e servido pronto, sem modelo de IA na leitura. O que outro canal disse durante a conversa chega como delta, no fim do prompt.

  • Quem é o cliente, pelo que a conversa já provou: o nível de verificação decide o que entra
  • Fatos, pendências e promessas, com a data e o canal de origem
  • O que outros agentes fizeram por dentro, confirmado pelo sistema de registro
  • Padrões calculados por regra, com as evidências e o prazo
  • As três ferramentas do histórico: buscar, linha do tempo e abrir um item, amarradas ao cliente no seu código
  • Comprovante de cada leitura, encadeado por SHA-256

O que o adaptador não faz

  • Nada aqui derruba a chamada ao modelo: um contexto que não chega fica de fora, e uma falha ao registrar vai para o log, sem conteúdo.
  • O middleware não embrulha o provedor: qualquer LanguageModel do AI SDK, de qualquer provedor, funciona.
  • Testado contra ai 7, com os tipos das versões 5 e 6, e um modelo falso, com a Niadra no emulador, em Node, Deno, Bun, workerd e no Edge Runtime.

Perguntas frequentes

Funciona no Edge Runtime e nos Workers?

Funciona: o SDK de TypeScript roda em Node, Deno, Bun, workerd e no Edge Runtime, e o middleware é testado nos cinco. A chave da Niadra fica na rota do servidor, nunca no navegador.

Quem decide qual é o cliente?

O seu código, a partir da sessão autenticada: handles.appUserId(userId) abre a conversa. O cliente nunca é algo que o modelo ou o navegador escolhe. O login prova o nível que a sua política define, e o middleware o registra antes da primeira leitura.

Posso misturar as ferramentas do histórico com as minhas?

Pode: niadraTools(session) devolve ferramentas do AI SDK, e você as junta às suas com spread no mesmo objeto tools. O stopWhen e o resto da chamada continuam como estão.

Preciso trocar de modelo, de prompt ou de fornecedor?

Não. O adaptador coloca o contexto depois das suas instruções e o delta no fim do prompt, nos pontos de extensão que o framework já tem. O seu modelo, o seu prompt e o seu fornecedor continuam os mesmos, e trocar qualquer um deles depois não apaga a memória.

Onde ficam os dados e quanto custa?

Os dados ficam numa região só, informada no contrato, cifrados com AES-256-GCM e chave exclusiva por empresa, protegida em HSM FIPS 140-3. O preço é por conversa ou tarefa em que um agente leu a memória: de US$ 2 a 3 a cada mil, conforme o volume, com leituras, buscas e eventos de sistema incluídos. A Niadra está abrindo para empresas por pedido, antes do lançamento.

Conte o que você está construindo.

E-mail corporativo e duas linhas sobre os seus agentes bastam. Quem responde é quem escreve o código, com uma proposta de acesso antecipado para o seu caso.

Prefere contar mais sobre a sua empresa? Use o formulário completo

Só aceitamos e-mail corporativo. Usamos estes dados apenas para responder ao seu pedido; para apagá-los, peça por este formulário.

O próximo agente já pode chegar sabendo.

A Niadra está abrindo para empresas por pedido, antes do lançamento. Conte o que você está construindo: quem responde é quem escreve o código.