diff --git a/drizzle/0025_assistant_model.sql b/drizzle/0025_assistant_model.sql new file mode 100644 index 0000000..c612126 --- /dev/null +++ b/drizzle/0025_assistant_model.sql @@ -0,0 +1 @@ +ALTER TABLE "users" ADD COLUMN "assistant_model" text; diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 229b5ad..a0c11fb 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -176,6 +176,13 @@ "when": 1780394000000, "tag": "0024_user_assistant_customization", "breakpoints": true + }, + { + "idx": 25, + "version": "7", + "when": 1783560000000, + "tag": "0025_assistant_model", + "breakpoints": true } ] } \ No newline at end of file diff --git a/src/app/settings/assistant-actions.ts b/src/app/settings/assistant-actions.ts index 0adfe98..385fd56 100644 --- a/src/app/settings/assistant-actions.ts +++ b/src/app/settings/assistant-actions.ts @@ -9,6 +9,7 @@ import { MAX_ASSISTANT_NAME_LENGTH, MAX_ASSISTANT_SYSTEM_PROMPT_LENGTH, } from "@/lib/assistant-config"; +import { isValidLlmModelId, listLlmModels } from "@/lib/llm/models"; import { users } from "@/modules/_core/schema"; import { getCurrentSession } from "@/lib/session"; @@ -50,6 +51,25 @@ export async function setAssistantSystemPrompt(prompt: string | null): Promise { + const { user } = await getCurrentSession(); + const normalized = model?.trim() || null; + + if (normalized !== null && !isValidLlmModelId(normalized)) { + throw new Error("Invalid assistant model"); + } + + const available = await listLlmModels(); + const requested = normalized === available.fallbackModel ? null : normalized; + + if (requested !== null && !available.models.some((option) => option.id === requested)) { + throw new Error("Invalid assistant model"); + } + + await db.update(users).set({ assistantModel: requested }).where(eq(users.id, user.id)); + revalidateAssistantSurfaces(); +} + export async function resetAssistantName(): Promise { await setAssistantName(DEFAULT_ASSISTANT_NAME); } diff --git a/src/lib/assistant-preference.ts b/src/lib/assistant-preference.ts index b978671..babe897 100644 --- a/src/lib/assistant-preference.ts +++ b/src/lib/assistant-preference.ts @@ -14,6 +14,7 @@ export type AssistantPreferences = { enabled: boolean; name: string; systemPrompt: string | null; + model: string | null; }; export async function getAssistantPreferences(userId: string): Promise { @@ -22,6 +23,7 @@ export async function getAssistantPreferences(userId: string): Promise()