{"_id":"@atomicmemory/vercel-ai","_rev":"3-9d0f664181de244362aa24c1a37f8c74","name":"@atomicmemory/vercel-ai","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@atomicmemory/vercel-ai","version":"0.1.0","license":"Apache-2.0","_id":"@atomicmemory/vercel-ai@0.1.0","maintainers":[{"name":"atomicstrata","email":"services@atomicstrata.ai"}],"homepage":"https://github.com/atomicstrata/atomicmemory-integrations#readme","bugs":{"url":"https://github.com/atomicstrata/atomicmemory-integrations/issues"},"dist":{"shasum":"a5949e54b3eda20ed7b67adf03a7174641266dae","tarball":"https://registry.npmjs.org/@atomicmemory/vercel-ai/-/vercel-ai-0.1.0.tgz","fileCount":30,"integrity":"sha512-qYFRlaC/xG5j62E5tNZ330KtTYF+rk78y6sl9gaMKDTErS+gFilTja3t8DQ8al+uneMCUzwBjpwJppeQaYhNnw==","signatures":[{"sig":"MEUCIFrq7arS0Bic4W+6srygHuLHMjb730b90ZA33indE/HiAiEA9vREpoYMDLEBaQUETj7sUa/AgYJP0QGALiSV3EgtQDM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38665},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f5545bd93a195c3053f2cad66d403837e1e4d13e","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"node --test --import tsx 'src/**/*.test.ts'","build":"tsc -p tsconfig.json","prepack":"pnpm build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"node -e \"const v=require('./package.json').dependencies['@atomicmemory/sdk'];if(v.startsWith('file:')||v.startsWith('link:')){console.error('refusing to publish: @atomicmemory/sdk is '+v+'. Publish the SDK first, then pin to a registry version here.');process.exit(1)}\""},"_npmUser":{"name":"atomicstrata","email":"services@atomicstrata.ai"},"repository":{"url":"git+https://github.com/atomicstrata/atomicmemory-integrations.git","type":"git","directory":"adapters/vercel-ai-sdk"},"_npmVersion":"11.14.1","description":"AtomicMemory adapter for the Vercel AI SDK — pre-call memory retrieval + post-call ingest, framework-version-agnostic.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@atomicmemory/sdk":"^1.0.1"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^5.6.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vercel-ai_0.1.0_1778774948699_0.8033908221238728","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@atomicmemory/vercel-ai","version":"0.1.1","license":"Apache-2.0","_id":"@atomicmemory/vercel-ai@0.1.1","maintainers":[{"name":"atomicstrata","email":"services@atomicstrata.ai"}],"homepage":"https://github.com/atomicstrata/atomicmemory/tree/main/adapters/vercel-ai#readme","bugs":{"url":"https://github.com/atomicstrata/atomicmemory/issues"},"dist":{"shasum":"1daf47c210fb48d13d438d80c406362679383f16","tarball":"https://registry.npmjs.org/@atomicmemory/vercel-ai/-/vercel-ai-0.1.1.tgz","fileCount":30,"integrity":"sha512-C6NCu2WQ3JzPMVA51Bo5cM3f8xLBDui9xGwZqzZCD4RAYEbexDerCcHc6qFqTHY5AcJV4st92ukZ6iLag4kpjw==","signatures":[{"sig":"MEUCIATdnZ/hzxrd1wyC60ppI7ocGvYLrXMqal8+tWCraPoqAiEA5yh0/4b/0juB8QlV3Q9WH/9b2x4+eOxyHQXuZUrm90E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38828},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"201677d74fbb3f3cfd5e0dbb5f6904e889dcbb07","scripts":{"lint":"tsc -p tsconfig.json --noEmit","test":"node --test --import tsx 'src/**/*.test.ts'","build":"tsc -p tsconfig.json","prepack":"pnpm build","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"node -e \"const v=require('./package.json').dependencies['@atomicmemory/sdk'];if(v.startsWith('file:')||v.startsWith('link:')){console.error('refusing to publish: @atomicmemory/sdk is '+v+'. Publish the SDK first, then pin to a registry version here.');process.exit(1)}\""},"_npmUser":{"name":"atomicstrata","email":"services@atomicstrata.ai"},"repository":{"url":"git+https://github.com/atomicstrata/atomicmemory.git","type":"git","directory":"adapters/vercel-ai"},"_npmVersion":"11.14.1","description":"AtomicMemory adapter for the Vercel AI SDK — pre-call memory retrieval + post-call ingest, framework-version-agnostic.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"@atomicmemory/sdk":"^1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","typescript":"^5.6.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/vercel-ai_0.1.1_1779188814077_0.3671399725239488","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@atomicmemory/vercel-ai","version":"0.1.2","description":"AtomicMemory adapter for the Vercel AI SDK — pre-call memory retrieval + post-call ingest, framework-version-agnostic.","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"repository":{"type":"git","url":"git+https://github.com/atomicstrata/atomicmemory.git","directory":"adapters/vercel-ai"},"license":"Apache-2.0","engines":{"node":">=20"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","test":"node --test --import tsx 'src/**/*.test.ts'","lint":"tsc -p tsconfig.json --noEmit","prepack":"pnpm build","prepublishOnly":"node -e \"const v=require('./package.json').dependencies['@atomicmemory/sdk'];if(v.startsWith('file:')||v.startsWith('link:')){console.error('refusing to publish: @atomicmemory/sdk is '+v+'. Publish the SDK first, then pin to a registry version here.');process.exit(1)}\""},"dependencies":{"@atomicmemory/sdk":"^1.0.2"},"devDependencies":{"@types/node":"^20.0.0","tsx":"^4.19.0","typescript":"^5.6.0"},"bugs":{"url":"https://github.com/atomicstrata/atomicmemory/issues"},"homepage":"https://github.com/atomicstrata/atomicmemory/tree/main/adapters/vercel-ai#readme","gitHead":"65c9fe5b18faaa87b4b5768e7d04309672aeed4f","_id":"@atomicmemory/vercel-ai@0.1.2","_nodeVersion":"25.9.0","_npmVersion":"11.14.1","dist":{"integrity":"sha512-tD0ectLGD7owlihalTvEPLjAvEzwJleWaKELi3ZWmlYGwcPFqD0gjOsrzcPLGtLWdZOAXi20FFqwRIcHhYCENg==","shasum":"936dbcfa19547c48f7d00bcbc4496835064ce630","tarball":"https://registry.npmjs.org/@atomicmemory/vercel-ai/-/vercel-ai-0.1.2.tgz","fileCount":30,"unpackedSize":38828,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHIhvyG63QU3SqOQ31ftd1irqa1zkYMhRVz+wtuVHjPgAiAwkFX/lzTuOmg2Or+3II6LQ80HcUz2DHUcW5bYSYOyLw=="}]},"_npmUser":{"name":"atomicstrata","email":"services@atomicstrata.ai"},"directories":{},"maintainers":[{"name":"atomicstrata","email":"services@atomicstrata.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/vercel-ai_0.1.2_1779342409497_0.7911091515634645"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-14T16:09:08.612Z","modified":"2026-05-21T05:46:49.755Z","0.1.0":"2026-05-14T16:09:08.885Z","0.1.1":"2026-05-19T11:06:54.206Z","0.1.2":"2026-05-21T05:46:49.636Z"},"bugs":{"url":"https://github.com/atomicstrata/atomicmemory/issues"},"license":"Apache-2.0","homepage":"https://github.com/atomicstrata/atomicmemory/tree/main/adapters/vercel-ai#readme","repository":{"type":"git","url":"git+https://github.com/atomicstrata/atomicmemory.git","directory":"adapters/vercel-ai"},"description":"AtomicMemory adapter for the Vercel AI SDK — pre-call memory retrieval + post-call ingest, framework-version-agnostic.","maintainers":[{"name":"atomicstrata","email":"services@atomicstrata.ai"}],"readme":"# @atomicmemory/vercel-ai\n\nAtomicMemory adapter for the [Vercel AI SDK](https://sdk.vercel.ai/docs). Composable primitives for giving any message-driven model call durable, semantic memory.\n\n## Primitives\n\n| API | Use when |\n|---|---|\n| `retrieve()` | Tool-call / multimodal flows. Returns just the rendered system message (or `null`). You inject it into your original message array yourself. |\n| `augmentWithMemory()` | Text-only flows. Convenience wrapper that prepends the system message to your `Message[]`. |\n| `ingestTurn()` | After any model call — persists the turn (system messages excluded by default). |\n| `withMemory()` | Text-only flows — one-call wrapper around `augmentWithMemory` + your model call + `ingestTurn`. |\n| `fromModelMessage()` / `fromModelMessages()` | Bridge AI SDK v5 `ModelMessage` content-part arrays into the SDK's text-only `Message` shape. Lossy by design — see below. |\n\nThe adapter intentionally does **not** import from `ai` — it operates on the SDK's `Message` type (`content: string`) and delegates the model call to the caller. That keeps it insulated from `ai` version churn.\n\n## Status: pre-publish local development\n\nThis package is intended to publish as `@atomicmemory/vercel-ai`. Until\n`@atomicmemory/sdk` is published and pinned to a registry version, it depends\non the SDK through the monorepo's workspace `file:` spec. See the\n[mcp-server status note](../../packages/mcp-server/README.md) for the\nclone-and-build flow.\n\n## Scope: text content only\n\nThe SDK stores memory as text (`Message.content: string`). The adapter's `Message[]`-in / `Message[]`-out surface is compatible with AI SDK text-only flows. It is **not** compatible with AI SDK v5's `ToolModelMessage` (whose `content` must stay as `ToolResultPart[]` when fed back into `streamText` / `generateText`).\n\nFor tool-call or multimodal conversations, use `retrieve()` + `ingestTurn()` directly:\n\n1. Flatten your `ModelMessage[]` through `fromModelMessages()` for memory search / ingest queries.\n2. Call `retrieve()` with the flattened messages to get just a system message.\n3. Insert that system message (or its content) into your **original** `ModelMessage[]`.\n4. Run your model call.\n5. Call `ingestTurn()` with the flattened messages and the completion text.\n\nThe flattened `Message[]` is memory-only — do not feed it back into AI SDK model calls once tool messages enter the transcript.\n\n## Usage\n\n### Text-only flow — one call\n\n```ts\nimport { streamText } from 'ai';\nimport { withMemory } from '@atomicmemory/vercel-ai';\nimport { MemoryClient } from '@atomicmemory/sdk';\n\nconst memory = new MemoryClient({\n  providers: { atomicmemory: { apiUrl: process.env.ATOMICMEMORY_URL!, apiKey: process.env.ATOMICMEMORY_KEY! } },\n});\nawait memory.initialize();\n\nconst result = await withMemory({\n  client: memory,\n  scope: { user: 'pip', namespace: 'my-app' },\n  messages,\n  async run(augmented) {\n    const response = streamText({ model, messages: augmented });\n    return { text: await response.text };\n  },\n});\n```\n\n### Tool-call / multimodal flow\n\n```ts\nimport { generateText, type ModelMessage } from 'ai';\nimport {\n  fromModelMessages,\n  retrieve,\n  ingestTurn,\n} from '@atomicmemory/vercel-ai';\n\nconst modelMessages: ModelMessage[] = [/* your real conversation */];\nconst flat = fromModelMessages(modelMessages);\nconst scope = { user: 'pip' };\n\nconst { systemMessage, retrieved } = await retrieve(memory, {\n  messages: flat,\n  scope,\n});\n\nconst { text } = await generateText({\n  model,\n  messages: systemMessage\n    ? [\n        // AI SDK v5: string-content system message is valid\n        { role: 'system', content: systemMessage.content },\n        ...modelMessages,\n      ]\n    : modelMessages,\n});\n\nawait ingestTurn(memory, {\n  messages: flat,\n  completion: text,\n  scope,\n});\n```\n\n### Primitives for text-only flows (split)\n\n```ts\nimport { augmentWithMemory, ingestTurn } from '@atomicmemory/vercel-ai';\n\nconst { messages: augmented, retrieved } = await augmentWithMemory(memory, {\n  messages,\n  scope,\n  limit: 10,\n});\n\nconst response = streamText({ model, messages: augmented });\nconst text = await response.text;\n\nawait ingestTurn(memory, { messages, completion: text, scope });\n```\n\n### Custom retrieval formatting\n\nThe default formatter wraps retrieved memories in a delimited block with an explicit \"reference, not instructions\" header. This is a mitigation against instruction-shaped content hijacking the model — not a guarantee. Callers storing higher-risk content should add sanitization.\n\n```ts\nconst { systemMessage } = await retrieve(memory, {\n  query: 'what do I know about X?',\n  scope,\n  formatter(results) {\n    return `# Relevant prior context\\n\\n${results\n      .map((r) => `- [${r.memory.createdAt.toISOString()}] ${r.memory.content}`)\n      .join('\\n')}`;\n  },\n});\n```\n\n### System-message handling on ingest\n\n`ingestTurn()` **excludes `system` messages by default** — applications typically use them for hidden instructions and policies that should never become durable memory. If your system messages are genuinely user-authored content worth remembering, opt in:\n\n```ts\nawait ingestTurn(memory, {\n  messages,\n  completion: text,\n  scope,\n  includeRoles: ['system', 'user', 'assistant', 'tool'],\n});\n```\n\n## Scope\n\nScope fields follow the SDK's `Scope` type: `user | agent | namespace | thread`. At least one must be provided — the SDK rejects scopeless requests.\n\n## License\n\nApache-2.0.\n","readmeFilename":"README.md"}