import { z } from "zod"; import { requireAdmin } from "@/lib/middleware/admin"; import { getAllSystemSettings, getSystemSetting, upsertSystemSetting, } from "@/lib/db/queries"; import { ChatSDKError } from "@/lib/errors"; import { probeBflModelSupport } from "@/lib/realtime/bfl-capability"; import { probeReplicateModelSupport } from "@/lib/realtime/replicate-capability"; import { normalizeRealtimeCanvasConfigForStorage, resolveRealtimeProviders, } from "@/lib/realtime/config"; const settingSchema = z.object({ key: z.string(), value: z.any(), }); function isObjectLike(value: unknown): value is Record { return Boolean(value) && typeof value === "object" && !Array.isArray(value); } function mapProbeStatus(code: string) { if (code === "UPSTREAM_ERROR") return 502; return 400; } export async function GET(request: Request) { try { await requireAdmin(); const { searchParams } = new URL(request.url); const key = searchParams.get("key"); if (key) { const setting = await getSystemSetting({ key }); return Response.json({ setting }); } const settings = await getAllSystemSettings(); return Response.json({ settings }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } return new ChatSDKError("offline:admin").toResponse(); } } export async function POST(request: Request) { try { const session = await requireAdmin(); const body = await request.json(); const { key, value } = settingSchema.parse(body); let nextValue = value; if (key === "realtime_canvas_config") { if (!isObjectLike(value)) { return new ChatSDKError("bad_request:api", "realtime_canvas_config value 必须为对象").toResponse(); } const enabled = value.enabled !== false; const normalizedValue = normalizeRealtimeCanvasConfigForStorage(value); const providers = resolveRealtimeProviders(normalizedValue); if (enabled) { if (providers.length === 0) { return new ChatSDKError("bad_request:api", "启用实时画布必须至少配置一个可用服务").toResponse(); } for (const provider of providers) { const probeResult = provider.type === "replicate" ? await probeReplicateModelSupport({ apiKey: provider.apiKey, modelId: provider.model, baseUrl: provider.baseUrl, }) : await probeBflModelSupport({ apiKey: provider.apiKey, modelId: provider.model, baseUrl: provider.baseUrl, }); if (!probeResult.supported) { return Response.json( { code: probeResult.code, message: `${provider.label}校验失败:${probeResult.message}`, }, { status: mapProbeStatus(probeResult.code) } ); } } } nextValue = normalizedValue; } const setting = await upsertSystemSetting({ key, value: nextValue, updatedBy: session.user.id, }); return Response.json({ setting: setting[0] }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } if (error instanceof z.ZodError) { return new ChatSDKError("bad_request:api", error.message).toResponse(); } return new ChatSDKError("offline:admin").toResponse(); } }