Files
TaxHacker/models/settings.ts
Dmitrii Anfimov dee915ffd6 feat: more llm provider options (google, mistral) (#28)
* feat: add google provider

* fix: default for google model

* feat: multiple providers

* fix: defaults from env for login form

* fix: add mistral to env files

* chore: delete unused code

* chore: revert database url to original

* fix: render default value for api key from env on server

* fix: type errors during compilation

---------

Co-authored-by: Vasily Zubarev <me@vas3k.ru>
2025-07-22 21:49:54 +02:00

67 lines
1.9 KiB
TypeScript

import { prisma } from "@/lib/db"
import { PROVIDERS } from "@/lib/llm-providers"
import { cache } from "react"
import { LLMProvider } from "@/ai/providers/llmProvider"
export type SettingsMap = Record<string, string>
/**
* Helper to extract LLM provider settings from SettingsMap.
*/
export function getLLMSettings(settings: SettingsMap) {
const priorities = (settings.llm_providers || "openai,google,mistral").split(",").map(p => p.trim()).filter(Boolean)
const providers = priorities.map((provider) => {
if (provider === "openai") {
return {
provider: provider as LLMProvider,
apiKey: settings.openai_api_key || "",
model: settings.openai_model_name || PROVIDERS[0]['defaultModelName'],
}
}
if (provider === "google") {
return {
provider: provider as LLMProvider,
apiKey: settings.google_api_key || "",
model: settings.google_model_name || PROVIDERS[1]['defaultModelName'],
}
}
if (provider === "mistral") {
return {
provider: provider as LLMProvider,
apiKey: settings.mistral_api_key || "",
model: settings.mistral_model_name || PROVIDERS[2]['defaultModelName'],
}
}
return null
}).filter((provider): provider is NonNullable<typeof provider> => provider !== null)
return {
providers,
}
}
export const getSettings = cache(async (userId: string): Promise<SettingsMap> => {
const settings = await prisma.setting.findMany({
where: { userId },
})
return settings.reduce((acc, setting) => {
acc[setting.code] = setting.value || ""
return acc
}, {} as SettingsMap)
})
export const updateSettings = cache(async (userId: string, code: string, value: string | undefined) => {
return await prisma.setting.upsert({
where: { userId_code: { code, userId } },
update: { value },
create: {
code,
value,
name: code,
userId,
},
})
})