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 messagewrapGenerate/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/openaiRequires 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
| Option | Default | Meaning |
|---|---|---|
memory | required | Wolbarg instance |
agent | required | Agent id for recall filter + remember |
recall | true | Run recall before generate/stream |
remember | "final-step" | When to persist after a step |
topK / threshold | 5 / unset | Recall knobs |
injection | "system-prepend" | Or "system-append" |
rememberMode | "raw" | Passed to experimental rememberFromMessages |
formatContext | built-in | Customize memory system text |
filter / metadata / sessionId / userId / tags / namespace | — | Scoping + stored metadata |