SPB Git forge

spb/immbot-ai

Public
1commits 1branches 0releases
1.5 MBsize
maindefault branch
20 days agolast push
TypeScript 98.3% CSS 0.9% Shell 0.7%
2.1 KB · 57 lines typescript
Raw Blame History
1import { NextResponse } from "next/server";2import { z } from "zod";3import { apiError, parseBody } from "@/lib/api.ts";4import { assertSameOrigin, requireRole } from "@/lib/auth/session.ts";5import { run, setSetting } from "@/lib/db/index.ts";6import { listModels, invalidateModelCache, getPresets, DEFAULT_PRESETS } from "@/lib/openrouter/registry.ts";78export async function GET() {9  try {10    await requireRole("instructor");11    const models = await listModels({ includeDisabled: true });12    return NextResponse.json({ models, presets: getPresets(), defaultPresets: DEFAULT_PRESETS });13  } catch (e) {14    return apiError(e);15  }16}1718const toggleSchema = z.object({19  action: z.literal("override"),20  modelId: z.string().min(1).max(200),21  enabled: z.boolean().optional(),22  favorite: z.boolean().optional(),23  note: z.string().max(300).optional(),24});25const presetSchema = z.object({26  action: z.literal("presets"),27  presets: z.record(z.string(), z.object({ label: z.string().max(60), models: z.array(z.string()).max(10), description: z.string().max(200) })),28});2930export async function POST(req: Request) {31  try {32    await assertSameOrigin();33    await requireRole("admin");34    const body = await parseBody(req, z.discriminatedUnion("action", [toggleSchema, presetSchema]));35    if (body.action === "override") {36      run(37        `INSERT INTO model_overrides (model_id, enabled, favorite, note) VALUES (?, ?, ?, ?)38         ON CONFLICT(model_id) DO UPDATE SET39           enabled = COALESCE(?, enabled), favorite = COALESCE(?, favorite), note = COALESCE(?, note)`,40        body.modelId,41        body.enabled === undefined ? 1 : body.enabled ? 1 : 0,42        body.favorite === undefined ? 0 : body.favorite ? 1 : 0,43        body.note ?? "",44        body.enabled === undefined ? null : body.enabled ? 1 : 0,45        body.favorite === undefined ? null : body.favorite ? 1 : 0,46        body.note ?? null47      );48    } else {49      setSetting("model_presets", body.presets);50    }51    invalidateModelCache();52    return NextResponse.json({ ok: true });53  } catch (e) {54    return apiError(e);55  }56}57