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