chat: remember last model

This commit is contained in:
2026-02-14 22:06:30 -08:00
parent a76b4ba232
commit fb306e154a
8 changed files with 173 additions and 9 deletions

View File

@@ -0,0 +1,5 @@
-- AlterTable
ALTER TABLE "Chat" ADD COLUMN "initiatedProvider" TEXT;
ALTER TABLE "Chat" ADD COLUMN "initiatedModel" TEXT;
ALTER TABLE "Chat" ADD COLUMN "lastUsedProvider" TEXT;
ALTER TABLE "Chat" ADD COLUMN "lastUsedModel" TEXT;

View File

@@ -45,6 +45,11 @@ model Chat {
title String?
initiatedProvider Provider?
initiatedModel String?
lastUsedProvider Provider?
lastUsedModel String?
user User? @relation(fields: [userId], references: [id])
userId String?

View File

@@ -10,11 +10,12 @@ function asProviderEnum(p: Provider) {
export async function runMultiplex(req: MultiplexRequest): Promise<MultiplexResponse> {
const t0 = performance.now();
const chatId = req.chatId ?? (await prisma.chat.create({ data: {}, select: { id: true } })).id;
// Persist call record early so we can attach errors.
const call = await prisma.llmCall.create({
data: {
chatId: req.chatId ?? (await prisma.chat.create({ data: {} })).id,
chatId,
provider: asProviderEnum(req.provider) as any,
model: req.model,
request: req as any,
@@ -22,6 +23,23 @@ export async function runMultiplex(req: MultiplexRequest): Promise<MultiplexResp
select: { id: true, chatId: true },
});
await prisma.$transaction([
prisma.chat.update({
where: { id: chatId },
data: {
lastUsedProvider: asProviderEnum(req.provider) as any,
lastUsedModel: req.model,
},
}),
prisma.chat.updateMany({
where: { id: chatId, initiatedProvider: null },
data: {
initiatedProvider: asProviderEnum(req.provider) as any,
initiatedModel: req.model,
},
}),
]);
try {
let outText = "";
let usage: MultiplexResponse["usage"] | undefined;

View File

@@ -29,6 +29,23 @@ export async function* runMultiplexStream(req: MultiplexRequest): AsyncGenerator
select: { id: true },
});
await prisma.$transaction([
prisma.chat.update({
where: { id: chatId },
data: {
lastUsedProvider: req.provider as any,
lastUsedModel: req.model,
},
}),
prisma.chat.updateMany({
where: { id: chatId, initiatedProvider: null },
data: {
initiatedProvider: req.provider as any,
initiatedModel: req.model,
},
}),
]);
yield { type: "meta", chatId, callId: call.id, provider: req.provider, model: req.model };
let text = "";

View File

@@ -174,7 +174,16 @@ export async function registerRoutes(app: FastifyInstance) {
const chats = await prisma.chat.findMany({
orderBy: { updatedAt: "desc" },
take: 100,
select: { id: true, title: true, createdAt: true, updatedAt: true },
select: {
id: true,
title: true,
createdAt: true,
updatedAt: true,
initiatedProvider: true,
initiatedModel: true,
lastUsedProvider: true,
lastUsedModel: true,
},
});
return { chats };
});
@@ -183,7 +192,19 @@ export async function registerRoutes(app: FastifyInstance) {
requireAdmin(req);
const Body = z.object({ title: z.string().optional() });
const body = Body.parse(req.body ?? {});
const chat = await prisma.chat.create({ data: { title: body.title } });
const chat = await prisma.chat.create({
data: { title: body.title },
select: {
id: true,
title: true,
createdAt: true,
updatedAt: true,
initiatedProvider: true,
initiatedModel: true,
lastUsedProvider: true,
lastUsedModel: true,
},
});
return { chat };
});
@@ -203,7 +224,16 @@ export async function registerRoutes(app: FastifyInstance) {
const chat = await prisma.chat.findUnique({
where: { id: chatId },
select: { id: true, title: true, createdAt: true, updatedAt: true },
select: {
id: true,
title: true,
createdAt: true,
updatedAt: true,
initiatedProvider: true,
initiatedModel: true,
lastUsedProvider: true,
lastUsedModel: true,
},
});
if (!chat) return app.httpErrors.notFound("chat not found");
return { chat };
@@ -219,7 +249,16 @@ export async function registerRoutes(app: FastifyInstance) {
const existing = await prisma.chat.findUnique({
where: { id: body.chatId },
select: { id: true, title: true, createdAt: true, updatedAt: true },
select: {
id: true,
title: true,
createdAt: true,
updatedAt: true,
initiatedProvider: true,
initiatedModel: true,
lastUsedProvider: true,
lastUsedModel: true,
},
});
if (!existing) return app.httpErrors.notFound("chat not found");
if (existing.title?.trim()) return { chat: existing };
@@ -231,7 +270,16 @@ export async function registerRoutes(app: FastifyInstance) {
const chat = await prisma.chat.update({
where: { id: body.chatId },
data: { title },
select: { id: true, title: true, createdAt: true, updatedAt: true },
select: {
id: true,
title: true,
createdAt: true,
updatedAt: true,
initiatedProvider: true,
initiatedModel: true,
lastUsedProvider: true,
lastUsedModel: true,
},
});
return { chat };