Memory
Prisma
Implement MemoryStore with Prisma ORM.
Use Prisma when your application already stores conversation data through a Prisma client. The key is to store each Anvia Message as JSON and load messages in insertion order.
Prisma Schema
model AgentMemoryMessage {
id BigInt @id @default(autoincrement())
sessionId String
userId String?
runId String
turn Int
message Json
metadata Json?
createdAt DateTime @default(now())
@@index([sessionId, id])
}
model AgentMemoryError {
id BigInt @id @default(autoincrement())
sessionId String
userId String?
runId String
error Json
messages Json
createdAt DateTime @default(now())
@@index([sessionId, createdAt])
}Store
import type {
MemoryAppendInput,
MemoryContext,
MemoryErrorInput,
MemoryStore,
Message,
} from "@anvia/core";
import { Prisma, PrismaClient } from "@prisma/client";
export class PrismaMemoryStore implements MemoryStore {
constructor(private readonly prisma: PrismaClient) {}
async load(context: MemoryContext): Promise<Message[]> {
const rows = await this.prisma.agentMemoryMessage.findMany({
where: { sessionId: context.sessionId },
orderBy: { id: "asc" },
select: { message: true },
});
return rows.map((row) => row.message as unknown as Message);
}
async append(input: MemoryAppendInput): Promise<void> {
await this.prisma.agentMemoryMessage.createMany({
data: input.messages.map((message) => ({
sessionId: input.context.sessionId,
userId: input.context.userId,
runId: input.runId,
turn: input.turn,
message: toPrismaJson(message),
metadata:
input.context.metadata === undefined
? undefined
: toPrismaJson(input.context.metadata),
})),
});
}
async clear(context: MemoryContext): Promise<void> {
await this.prisma.agentMemoryMessage.deleteMany({
where: { sessionId: context.sessionId },
});
}
async recordError(input: MemoryErrorInput): Promise<void> {
await this.prisma.agentMemoryError.create({
data: {
sessionId: input.context.sessionId,
userId: input.context.userId,
runId: input.runId,
error: toPrismaJson(serializeError(input.error)),
messages: toPrismaJson(input.messages),
},
});
}
}
function toPrismaJson(value: unknown): Prisma.InputJsonValue {
return JSON.parse(JSON.stringify(value)) as Prisma.InputJsonValue;
}
function serializeError(error: unknown): Record<string, unknown> {
if (error instanceof Error) {
return {
name: error.name,
message: error.message,
stack: error.stack,
};
}
return { message: String(error) };
}Use It
const prisma = new PrismaClient();
const memory = new PrismaMemoryStore(prisma);
const agent = new AgentBuilder("support", model)
.memory(memory, { savePolicy: "message" })
.build();
await agent.session("thread_123", { userId: "user_456" }).prompt("Hello").send();