SPB Git forge

spb/polyllm

Public
15commits 1branches 0releases
2.2 MBsize
maindefault branch
13 days agolast push
TypeScript 97.4% SQL 1% JavaScript 0.9% CSS 0.6%
1.5 KB · 32 lines typescript
Raw Blame History
1import { z } from "zod";2import { withUser, parseBody, json } from "@/lib/api";3import { listEndpoints, createEndpoint, probeEndpoint, ENDPOINT_INPUT_SCHEMA } from "@/lib/endpoints/service";4import { privateEndpointsAllowed } from "@/lib/endpoints/ssrf";5import { LIMITS } from "@/lib/rate-limit";67export const dynamic = "force-dynamic";89/** GET /api/endpoints → `{ endpoints: PublicEndpoint[], allowPrivate: boolean }` */10export const GET = withUser(async ({ user }) => json({ endpoints: await listEndpoints(user.id), allowPrivate: privateEndpointsAllowed() }));1112const createSchema = ENDPOINT_INPUT_SCHEMA.extend({ validate: z.boolean().optional() });1314/**15 * POST /api/endpoints — body `EndpointInput & { validate?: boolean }` (default true).16 * → 201 `{ endpoint: PublicEndpoint, test?: { ok, latencyMs, modelsAvailable, error? } }`17 */18export const POST = withUser(19  async ({ req, user, ip }) => {20    const { validate, ...input } = await parseBody(req, createSchema, 64_000);21    let endpoint = await createEndpoint(user.id, input, ip);22    let test: { ok: boolean; latencyMs: number; modelsAvailable: number; error?: string } | undefined;23    if (validate !== false) {24      const r = await probeEndpoint(user.id, endpoint.id);25      test = { ok: r.ok, latencyMs: r.latencyMs, modelsAvailable: r.modelsAvailable, error: r.error };26      endpoint = (await listEndpoints(user.id)).find((e) => e.id === endpoint.id) ?? endpoint;27    }28    return json({ endpoint, test }, { status: 201 });29  },30  { limit: { ...LIMITS.keySave, key: "endpoint-save" } },31);32