48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
"use server";
|
|
|
|
import { revalidatePath } from "next/cache";
|
|
import { getPublicAiSettings, updateAiSettings } from "@/server/settings/ai";
|
|
import { requireFreelancerBackend } from "@/server/web/freelancer";
|
|
import { cleanText } from "@/server/web/form-data";
|
|
|
|
export async function saveAiSettingsAction(formData: FormData) {
|
|
try {
|
|
const { actor } = await requireFreelancerBackend();
|
|
const provider = cleanText(formData.get("provider")) ?? "";
|
|
const model = cleanText(formData.get("model")) ?? "";
|
|
const apiKey = cleanText(formData.get("apiKey")) ?? "";
|
|
const current = getPublicAiSettings(actor);
|
|
|
|
if (!["gemini", "openai", "groq", "ollama"].includes(provider)) {
|
|
return { errorKey: "settings.ai.errors.provider" };
|
|
}
|
|
if (model.length > 200) {
|
|
return { errorKey: "settings.ai.errors.model" };
|
|
}
|
|
if (apiKey.length > 4_096) {
|
|
return { errorKey: "settings.ai.errors.apiKey" };
|
|
}
|
|
if (
|
|
provider !== "ollama"
|
|
&& !apiKey
|
|
&& (!current.hasApiKey || current.provider !== provider)
|
|
) {
|
|
return { errorKey: "settings.ai.errors.apiKeyRequired" };
|
|
}
|
|
|
|
const settings = updateAiSettings(actor, {
|
|
provider,
|
|
model,
|
|
apiKey,
|
|
});
|
|
revalidatePath("/settings/ai");
|
|
return {
|
|
success: true,
|
|
hasApiKey: settings.hasApiKey,
|
|
};
|
|
} catch (error) {
|
|
console.error("AI settings update failed", error);
|
|
return { errorKey: "settings.ai.errors.saveFailed" };
|
|
}
|
|
}
|