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%
3.3 KB · 60 lines typescript
Raw Blame History
1import { z } from "zod";2import { desc, eq, sql } from "drizzle-orm";3import { NextResponse } from "next/server";4import { withUser, parseBody, json, ApiError } from "@/lib/api";5import { isAdmin } from "@/lib/session";6import { registryStats, syncAllWithEnvKeys, syncProvider } from "@/lib/ai/registry";7import { getDb, providerConnections, usageRecords, users, models } from "@/db";8import { PROVIDER_IDS, isProviderId } from "@/lib/ai/core/types";9import { ownerKey } from "@/lib/ai/providers/env-keys";1011export const dynamic = "force-dynamic";1213/** Owner-only diagnostics: provider status, model sync, discovered models, latency, errors. */14export const GET = withUser(async ({ user }) => {15  if (!isAdmin(user)) throw new ApiError(403, "Admins only", "FORBIDDEN");16  const db = getDb();17  const stats = await registryStats();18  const [userCount] = await db.select({ n: sql<number>`count(*)::int` }).from(users);19  const connections = await db.select({ provider: providerConnections.provider, status: providerConnections.status, n: sql<number>`count(*)::int` }).from(providerConnections).groupBy(providerConnections.provider, providerConnections.status);20  const errors = await db21    .select({ provider: usageRecords.provider, errorCode: usageRecords.errorCode, n: sql<number>`count(*)::int` })22    .from(usageRecords)23    .where(sql`${usageRecords.status} = 'error' and ${usageRecords.createdAt} > now() - interval '7 days'`)24    .groupBy(usageRecords.provider, usageRecords.errorCode)25    .orderBy(desc(sql`count(*)`))26    .limit(30);27  const latency = await db28    .select({ provider: usageRecords.provider, avgLatencyMs: sql<number>`coalesce(avg(${usageRecords.latencyMs}),0)::float8`, avgTtftMs: sql<number>`coalesce(avg(${usageRecords.ttftMs}),0)::float8`, requests: sql<number>`count(*)::int` })29    .from(usageRecords)30    .where(sql`${usageRecords.createdAt} > now() - interval '7 days'`)31    .groupBy(usageRecords.provider);32  const perProvider = await Promise.all(33    PROVIDER_IDS.map(async (p) => {34      const rows = await db.select({ key: models.key, displayName: models.displayName, status: models.status, hidden: models.hidden, lastSeenAt: models.lastSeenAt, source: models.source }).from(models).where(eq(models.provider, p)).orderBy(desc(models.sortWeight));35      return { provider: p, envKeyConfigured: Boolean(ownerKey(p)), models: rows.map((r) => ({ ...r, lastSeenAt: r.lastSeenAt.toISOString() })) };36    }),37  );38  return json({39    users: userCount.n,40    connections,41    counts: stats.counts,42    syncRuns: stats.lastRuns.map((r) => ({ ...r, startedAt: r.startedAt.toISOString(), finishedAt: r.finishedAt?.toISOString() ?? null })),43    errors,44    latency,45    providers: perProvider,46  });47});4849export const POST = withUser(async ({ req, user }) => {50  if (!isAdmin(user)) throw new ApiError(403, "Admins only", "FORBIDDEN");51  const body = await parseBody(req, z.object({ action: z.literal("sync"), provider: z.string().optional() }));52  if (body.provider) {53    if (!isProviderId(body.provider)) throw new ApiError(400, "Unknown provider");54    const key = ownerKey(body.provider);55    if (!key) return NextResponse.json({ error: { code: "NO_ENV_KEY", message: "No owner key configured for this provider" } }, { status: 400 });56    return json({ results: [await syncProvider(body.provider, key, "admin")] });57  }58  return json({ results: await syncAllWithEnvKeys("admin") });59});60