GitHub Action
Automated sync to Hugging Face
bcce530
import { NextRequest, NextResponse } from "next/server"
import prisma from "@/lib/prisma"
import { stackServerApp } from "@/lib/stack-server"
import { generateText } from "ai"
import { openai } from "@ai-sdk/openai"
// GET - Get memory for a character
export async function GET(request: NextRequest) {
try {
const user = await stackServerApp.getUser()
if (!user) {
return NextResponse.json(
{ error: "Authentication required" },
{ status: 401 }
)
}
const { searchParams } = new URL(request.url)
const characterId = searchParams.get("characterId")
if (!characterId) {
return NextResponse.json(
{ error: "characterId is required" },
{ status: 400 }
)
}
const memory = await prisma.characterMemory.findUnique({
where: {
characterId_userId: {
characterId,
userId: user.id,
},
},
})
return NextResponse.json({ memory })
} catch (error) {
console.error("Error fetching character memory:", error)
return NextResponse.json(
{ error: "Failed to fetch memory" },
{ status: 500 }
)
}
}
// POST - Update memory with new messages
export async function POST(request: NextRequest) {
try {
const user = await stackServerApp.getUser()
if (!user) {
return NextResponse.json(
{ error: "Authentication required" },
{ status: 401 }
)
}
const { characterId, messages, newMessage, characterResponse } = await request.json()
if (!characterId) {
return NextResponse.json(
{ error: "characterId is required" },
{ status: 400 }
)
}
// Get or create memory
let memory = await prisma.characterMemory.findUnique({
where: {
characterId_userId: {
characterId,
userId: user.id,
},
},
})
if (!memory) {
memory = await prisma.characterMemory.create({
data: {
characterId,
userId: user.id,
recentMessages: [],
userFacts: [],
messageCount: 0,
},
})
}
// Update recent messages
const recentMessages = memory.recentMessages as Array<{ role: string; content: string }>
const updatedMessages = [
...recentMessages,
{ role: "user", content: newMessage },
{ role: "assistant", content: characterResponse },
].slice(-20) // Keep last 20 messages
// If we have enough messages, summarize the context
let contextSummary = memory.contextSummary
if (updatedMessages.length >= 10 && (!contextSummary || memory.messageCount % 10 === 0)) {
try {
const { text } = await generateText({
model: openai("gpt-4o-mini"),
prompt: `Summarize the key points from this conversation for context retention. Focus on:
1. User preferences and interests
2. Important facts mentioned
3. Ongoing topics or tasks
Conversation:
${updatedMessages.map(m => `${m.role}: ${m.content}`).join("\n")}
Provide a brief summary (2-3 sentences):`,
})
contextSummary = text
} catch (error) {
console.error("Failed to summarize context:", error)
}
}
// Extract user facts (simple keyword extraction)
const userFacts = memory.userFacts as string[]
// This could be enhanced with AI extraction
// Update memory
const updatedMemory = await prisma.characterMemory.update({
where: {
characterId_userId: {
characterId,
userId: user.id,
},
},
data: {
recentMessages: updatedMessages,
contextSummary,
userFacts,
messageCount: { increment: 2 },
},
})
return NextResponse.json({ memory: updatedMemory })
} catch (error) {
console.error("Error updating character memory:", error)
return NextResponse.json(
{ error: "Failed to update memory" },
{ status: 500 }
)
}
}
// DELETE - Clear memory for a character
export async function DELETE(request: NextRequest) {
try {
const user = await stackServerApp.getUser()
if (!user) {
return NextResponse.json(
{ error: "Authentication required" },
{ status: 401 }
)
}
const { searchParams } = new URL(request.url)
const characterId = searchParams.get("characterId")
if (!characterId) {
return NextResponse.json(
{ error: "characterId is required" },
{ status: 400 }
)
}
await prisma.characterMemory.deleteMany({
where: {
characterId,
userId: user.id,
},
})
return NextResponse.json({ success: true })
} catch (error) {
console.error("Error clearing character memory:", error)
return NextResponse.json(
{ error: "Failed to clear memory" },
{ status: 500 }
)
}
}