add support for switching preferred model per chat session

This commit is contained in:
2026-09-08 23:26:24 +02:00
parent 2b754f664b
commit 0546bcaf33
5 changed files with 41 additions and 4 deletions
+2
View File
@@ -163,6 +163,7 @@ export function createRepositories(db, config) {
SET preferred_model = ?, temperature = ?, context_length = ?, response_length = ?, system_instruction = ?, updated_at = CURRENT_TIMESTAMP
WHERE id = ? AND username = ?
`),
updateChatPreferredModel: db.prepare("UPDATE chat_sessions SET preferred_model = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND username = ?"),
updateChatActiveLeaf: db.prepare("UPDATE chat_sessions SET active_leaf_message_id = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND username = ?"),
updateChatBranchSource: db.prepare("UPDATE chat_sessions SET source_chat_id = ?, branched_from_message_id = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND username = ?"),
setChatActiveLeafById: db.prepare("UPDATE chat_sessions SET active_leaf_message_id = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?"),
@@ -1027,6 +1028,7 @@ export function createRepositories(db, config) {
chatId,
username
),
updateChatPreferredModel: (chatId, username, model) => statements.updateChatPreferredModel.run(model || null, chatId, username),
updateChatMessage: (chatId, messageId, content) => statements.updateChatMessage.run(content, messageId, chatId),
updateChatMessageRetryState: (chatId, messageId, payload) => statements.updateChatMessageWithRetryState.run(
payload.content,
+14
View File
@@ -91,6 +91,13 @@ const generationSettingsValidator = (body) => {
}};
};
const preferredModelValidator = (body) => {
const model = String(body?.model || "").trim();
if (!model) return {error: "Model is required"};
if (model.length > 200) return {error: "Model must be 200 characters or fewer"};
return {value: {model}};
};
export function createChatsRouter({repositories, chatService, modelService, config, chatRateLimiters}) {
const router = express.Router();
router.use(requireLogin);
@@ -180,6 +187,13 @@ export function createChatsRouter({repositories, chatService, modelService, conf
return res.json({chat: repositories.getChat(chatId, req.session.user)});
});
router.put("/chats/:id/model", validateBody(preferredModelValidator), (req, res) => {
const chatId = Number(req.params.id);
if (!repositories.getChat(chatId, req.session.user)) return res.status(404).json({error: "Chat not found"});
repositories.updateChatPreferredModel(chatId, req.session.user, req.validatedBody.model);
return res.json({chat: repositories.getChat(chatId, req.session.user)});
});
router.post("/chats/:id/branches/:messageId/activate", (req, res) => {
const result = chatService.activateBranch({
user: req.session.user,
+1 -1
View File
@@ -65,7 +65,7 @@ export function createChatService(repositories, modelService, config) {
};
const getGenerationSettings = (session, requestedModel) => ({
model: session.preferred_model || requestedModel || "mistral:latest",
model: requestedModel || session.preferred_model || "mistral:latest",
generation: {
temperature: session.temperature ?? undefined,
contextLength: session.context_length ?? undefined,