TypeScript 97.4%
SQL 1%
JavaScript 0.9%
CSS 0.6%
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