@anvia/memory-prisma
v0.2.3
Published
Prisma-backed durable session memory store for Anvia.
Readme
@anvia/memory-prisma
Prisma-backed durable session memory store for Anvia agents.
Use this package when an application already uses Prisma and wants Anvia session memory to live in the same database and migration workflow.
Installation
pnpm add @anvia/memory-prisma @anvia/core @prisma/clientIn this monorepo, the package is available through the workspace:
pnpm --filter @anvia/memory-prisma buildGenerate Prisma models
Run the init command from the application root:
npx @anvia/memory-prisma initThe command is a dry run by default. To write the generated Prisma model file:
npx @anvia/memory-prisma init --writeBy default it writes prisma/models/anvia-memory.prisma. If you need to append to an existing schema.prisma, pass the explicit append flag:
npx @anvia/memory-prisma init --write --append-to-schemaThe append path prints a warning before writing because it modifies the existing Prisma schema file.
After writing schema changes, run:
npx prisma validate
npx prisma migrate dev --name add_anvia_memoryUsage
import { AgentBuilder } from "@anvia/core";
import { createPrismaMemoryStore } from "@anvia/memory-prisma";
import { prisma } from "./db";
const memory = createPrismaMemoryStore(prisma, {
scope: {
metadataKeys: ["tenantId"],
},
});
const agent = new AgentBuilder("support", model)
.memory(memory, { savePolicy: "turn" })
.build();
await agent
.session("thread_123", {
userId: "user_456",
metadata: { tenantId: "tenant_789" },
})
.prompt("Where is my order?")
.send();scope defines the database key for one memory thread. By default the key includes sessionId and userId; metadataKeys: ["tenantId"] also includes metadata.tenantId, which isolates memory across tenants or workspaces. Scope is storage isolation, not authorization.
Custom delegates
The default client path expects Prisma delegates named agentMemorySession, agentMemoryMessage, and agentMemoryError. If your app uses custom model names, pass delegates explicitly:
const memory = PrismaMemoryStore.fromDelegates({
sessions: prisma.customMemorySession,
messages: prisma.customMemoryMessage,
errors: prisma.customMemoryError,
transaction: (operation, options) =>
prisma.$transaction(
(tx) =>
operation({
sessions: tx.customMemorySession,
messages: tx.customMemoryMessage,
errors: tx.customMemoryError,
transaction: async (nested) => nested({
sessions: tx.customMemorySession,
messages: tx.customMemoryMessage,
errors: tx.customMemoryError,
transaction: async () => {
throw new Error("Nested transactions are not supported.");
},
}),
}),
options,
),
});Development
pnpm --filter @anvia/memory-prisma typecheck
pnpm --filter @anvia/memory-prisma test
pnpm --filter @anvia/memory-prisma build