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.3 KB · 27 lines typescript
Raw Blame History
1import { z } from "zod";2import { withUser, parseBody, json, ApiError } from "@/lib/api";3import { validateConnection, getDecryptedKey, listConnections } from "@/lib/providers/keys";4import { syncProvider } from "@/lib/ai/registry";5import { isProviderId } from "@/lib/ai/core/types";6import { LIMITS } from "@/lib/rate-limit";78export const dynamic = "force-dynamic";910/**11 * POST /api/providers/test `{ provider }` — re-validate the stored (encrypted) key against the provider.12 * → `{ ok, latencyMs, modelsAvailable, error?, errorCode?, connections }`. The key never leaves the server.13 */14export const POST = withUser(15  async ({ req, user }) => {16    const body = await parseBody(req, z.object({ provider: z.string().max(40) }));17    if (!isProviderId(body.provider) || body.provider === "custom") throw new ApiError(400, "Unknown provider", "BAD_REQUEST");18    const res = await validateConnection(user.id, body.provider);19    if (res.ok) {20      const key = await getDecryptedKey(user.id, body.provider);21      if (key) void syncProvider(body.provider, key, "user").catch(() => {});22    }23    return json({ ok: res.ok, latencyMs: res.latencyMs, modelsAvailable: res.modelsAvailable ?? null, error: res.error?.message, errorCode: res.error?.code, connections: await listConnections(user.id) });24  },25  { limit: { ...LIMITS.keyValidate, key: "provider-test" } },26);27