# Memória para o Vercel AI SDK: um middleware para wrapLanguageModel, com qualquer provedor | Niadra

> Como dar memória de cliente a uma rota de chat com o Vercel AI SDK: niadraMiddleware é um language model middleware para wrapLanguageModel, que funciona com qualquer provedor; transformParams põe o contexto, wrapGenerate e wrapStream registram a resposta, e niadraTools entrega o histórico como ferramentas do AI SDK. Código e limites.

URL: https://niadra.com/integracoes/ai-sdk

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.

[Pedir acesso antecipado](/enterprise)[Documentação do adaptador(abre docs.niadra.com)](https://docs.niadra.com/integrations/ai-sdk)

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

[Ver o contexto por dentro](/produtos/contexto)

## 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.

## Outras integrações

-   [LiveKit Agents](/integracoes/livekit)
-   [Pipecat](/integracoes/pipecat)
-   [Vapi](/integracoes/vapi)
-   [Retell AI](/integracoes/retell)
-   [ElevenLabs Agents Platform](/integracoes/elevenlabs)
-   [Twilio](/integracoes/twilio)
-   [WhatsApp Cloud API](/integracoes/whatsapp)
-   [OpenAI Agents SDK](/integracoes/openai-agents)
-   [LangGraph](/integracoes/langgraph)
-   [LangChain](/integracoes/langchain)
-   [CrewAI](/integracoes/crewai)
-   [n8n](/integracoes/n8n)
-   [As 36 integrações, na documentação(abre docs.niadra.com)](https://docs.niadra.com/integrations/overview)

## 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](/enterprise)
