WOLBΛRG

Vercel AI SDK

Official @wolbarg/vercel-ai middleware — automatic recall, system injection, and remember with generateText and streamText (AI SDK v7+).

What is it?

@wolbarg/vercel-ai is the official AI SDK Language Model Middleware for Wolbarg.

It follows the same pattern the AI SDK documents for RAG, logging, and guardrails:

  • transformParams — recall + inject memory into a tagged system message
  • wrapGenerate / wrapStream — remember after the model step finishes

The core wolbarg package stays framework-agnostic. This package is the only place that depends on ai.

Requires AI SDK v7+ (LanguageModelV4 middleware).

Install

npm install wolbarg @wolbarg/vercel-ai ai @ai-sdk/openai

Requires Node ≥ 22, wolbarg >= 0.5.3, and ai ^7.0.0.

Quick start

import { generateText, wrapLanguageModel } from "ai";
import { openai } from "@ai-sdk/openai";
import { wolbarg, sqlite, openaiEmbedding } from "wolbarg";
import { wolbargMiddleware } from "@wolbarg/vercel-ai";

const memory = wolbarg({
  organization: "my-app",
  storage: sqlite("./memory.db"),
  embedding: openaiEmbedding({
    apiKey: process.env.OPENAI_API_KEY!,
    model: "text-embedding-3-small",
  }),
});
await memory.ready();

const model = wrapLanguageModel({
  model: openai("gpt-4.1-mini"),
  middleware: wolbargMiddleware({
    memory,
    agent: "assistant",
  }),
});

const { text } = await generateText({
  model,
  system: "You are a concise assistant.", // preserved
  messages: [{ role: "user", content: "What do I prefer?" }],
});

Convenience helper:

import { createWolbargModel } from "@wolbarg/vercel-ai";

const model = createWolbargModel({
  model: openai("gpt-4.1-mini"),
  memory,
  agent: "assistant",
});

Streaming

import { streamText } from "ai";

const result = streamText({
  model, // already wrapped with wolbargMiddleware
  messages,
});

for await (const chunk of result.textStream) {
  process.stdout.write(chunk);
}

Remember starts when the model emits finish (with a flush backup). Canceling after finish still persists memory. Canceling mid-generation before finish does not remember incomplete turns.

Tools / multi-step

Middleware runs per model step. By default remember: "final-step" skips intermediate steps where finishReason.unified === "tool-calls", so tool loops do not spam duplicate memories. Recall still runs every step so tools see memory context.

wolbargMiddleware({
  memory,
  agent: "assistant",
  remember: "final-step", // default — or "every-step" | "never" | false
});

Per-request metadata

await generateText({
  model,
  messages,
  providerOptions: {
    wolbarg: {
      sessionId: "s1",
      userId: "u1",
      tags: ["support"],
      namespace: "prod",
    },
  },
});

These fold into rememberFromMessages metadata (source: "wolbarg-vercel-ai").

Multimodal messages

User messages with file/image parts contribute [attachment:mediaType:filename] placeholders to the recall query so memory search still has text signal alongside captions.

Failure semantics

Recall and remember failures never crash model generation. Use hooks:

wolbargMiddleware({
  memory,
  agent: "assistant",
  onError: (error, phase) => {
    console.warn("[wolbarg]", phase, error);
  },
  onTelemetry: (event) => {
    // phase: recall | remember | inject
  },
});

Options reference

OptionDefaultMeaning
memoryrequiredWolbarg instance
agentrequiredAgent id for recall filter + remember
recalltrueRun recall before generate/stream
remember"final-step"When to persist after a step
topK / threshold5 / unsetRecall knobs
injection"system-prepend"Or "system-append"
rememberMode"raw"Passed to experimental rememberFromMessages
formatContextbuilt-inCustomize memory system text
filter / metadata / sessionId / userId / tags / namespaceScoping + stored metadata