feat: add LLM provider settings page

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Sanju Sivalingam
2026-02-17 14:45:44 +05:30
parent 8fc5587876
commit edfc91468b
3 changed files with 123 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
import { form, query, getRequestEvent } from '$app/server';
import { db } from '$lib/server/db';
import { llmConfig } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
import { llmConfigSchema } from '$lib/schema/settings';
export const getConfig = query(async () => {
const { locals } = getRequestEvent();
if (!locals.user) return null;
const config = await db
.select()
.from(llmConfig)
.where(eq(llmConfig.userId, locals.user.id))
.limit(1);
if (config.length === 0) return null;
// mask the API key for display
return {
...config[0],
apiKey: config[0].apiKey.slice(0, 8) + '...' + config[0].apiKey.slice(-4)
};
});
export const updateConfig = form(llmConfigSchema, async (data) => {
const { locals } = getRequestEvent();
if (!locals.user) return;
const existing = await db
.select()
.from(llmConfig)
.where(eq(llmConfig.userId, locals.user.id))
.limit(1);
if (existing.length > 0) {
await db
.update(llmConfig)
.set({
provider: data.provider,
apiKey: data.apiKey,
model: data.model ?? null
})
.where(eq(llmConfig.userId, locals.user.id));
} else {
await db.insert(llmConfig).values({
id: crypto.randomUUID(),
userId: locals.user.id,
provider: data.provider,
apiKey: data.apiKey,
model: data.model ?? null
});
}
});

View File

@@ -0,0 +1,7 @@
import { object, string, pipe, minLength, optional } from 'valibot';
export const llmConfigSchema = object({
provider: pipe(string(), minLength(1)),
apiKey: pipe(string(), minLength(1)),
model: optional(string())
});