@mubit-ai/ai-sdk
v0.8.0
Published
Vercel AI SDK middleware backed by MuBit memory engine
Downloads
352
Readme
@mubit-ai/ai-sdk
Vercel AI SDK middleware backed by MuBit memory engine.
Wraps any AI SDK model with automatic memory injection and interaction capture.
Targets the current AI SDK v3 language-model middleware contract
(LanguageModelV3Middleware, specificationVersion: "v3") and works with
ai@^6. The peer dependency is ai >=5; the legacy v2 contract is deprecated.
Install
npm install @mubit-ai/ai-sdk aiUsage
import { wrapLanguageModel } from "ai";
import { mubitMemoryMiddleware } from "@mubit-ai/ai-sdk";
const middleware = mubitMemoryMiddleware({
apiKey: "mbt_...",
sessionId: "session-1",
});
const model = wrapLanguageModel({
model: openai("gpt-4o"),
middleware,
});
// generateText AND streamText calls through this model
// automatically get lessons injected + interactions captured.
const { text } = await generateText({ model, prompt: "Hello" });
// Close the v0.7.0 attribution loop once you know the outcome.
await middleware.recordOutcome({
outcome: "success",
entry_ids: middleware.getLastReferenceIds(), // credit recalled evidence
verified_in_production: true,
});How it works
The middleware has three hooks:
transformParams— Before each LLM call (generate or stream), fetches relevant context + reinforced lessons from MuBit and injects them into the system prompt. Evidencereference_ids are surfaced viagetLastReferenceIds().wrapGenerate— After eachgenerateTextcall, captures the interaction and ingests it to MuBit (fire-and-forget, with an idempotency key).wrapStream— Tees thestreamTextoutput so chunks flow through untouched, then ingests the completed interaction once the stream finishes (fire-and-forget).
Attribution loop (v0.7.0)
The returned middleware object exposes attribution helpers, also available as
standalone exports (recordOutcome, recordStepOutcome):
getLastReferenceIds()—reference_ids of the most recently surfaced evidence, for crediting specific entries.recordOutcome({ reference_id?, outcome, entry_ids?, verified_in_production?, signal?, rationale? })— record a run-level (or entry-level) reinforcement outcome.recordStepOutcome({ step_id, step_name?, outcome?, signal?, rationale?, directive_hint? })— record a step-level process-reward outcome.
All writes (remember/ingest) thread an idempotency_key so retried or
double-captured interactions dedup server-side.
Options
| Option | Default | Description |
| --- | --- | --- |
| apiKey | MUBIT_API_KEY | MuBit API key |
| endpoint | MUBIT_ENDPOINT / http://127.0.0.1:3000 | MuBit endpoint URL |
| sessionId | "default" | Session/run ID for scoping memory |
| userId | "" | User ID for scoping memory |
| agentId | "ai-sdk" | Agent ID for attribution |
| maxTokenBudget | 2048 | Token budget for context retrieval |
| entryTypes | server default | Memory entry types to retrieve |
| sections | server default | Context sections to include |
| injectLessons | true | Whether to inject lessons before calls |
| captureInteractions | true | Whether to capture interactions after calls |
| failOpen | true | Proceed without lessons on error |
| mubitClient | auto-created | Pre-configured MuBit client |
Features
- TTL-bounded in-memory cache (30s, 100 entries) for context retrieval
- Fail-open by default — LLM calls proceed even if MuBit is unreachable
- Fire-and-forget ingestion — doesn't block on capture
- Idempotency-keyed writes — retried/streamed captures dedup server-side
- Built on the public MuBit SDK surface only (no private internals)
- Compatible with
generateText,streamText, and any AI SDK v3 model
Development
node --test test/**/*.test.jsLicense
Apache-2.0
