import { NextResponse } from "next/server"; import { getProviderConnections, updateProviderConnection, } from "@/lib/localDb"; const MODEL_LOCK_PREFIX = "modelLock_"; function getActiveModelLocks(connection) { const now = Date.now(); return Object.entries(connection) .filter(([key, value]) => key.startsWith(MODEL_LOCK_PREFIX) && value) .map(([key, value]) => ({ key, model: key.slice(MODEL_LOCK_PREFIX.length) || "__all", until: value, active: new Date(value).getTime() > now, })) .filter((lock) => lock.active); } export async function GET() { try { const connections = await getProviderConnections(); const models = []; for (const connection of connections) { const locks = getActiveModelLocks(connection); for (const lock of locks) { models.push({ provider: connection.provider, model: lock.model, status: "cooldown", until: lock.until, connectionId: connection.id, connectionName: connection.name || connection.email || connection.id, lastError: connection.lastError || null, }); } if (locks.length === 0 && connection.testStatus === "unavailable") { models.push({ provider: connection.provider, model: "__all", status: "unavailable", connectionId: connection.id, connectionName: connection.name || connection.email || connection.id, lastError: connection.lastError || null, }); } } return NextResponse.json({ models, unavailableCount: models.length, }); } catch (error) { console.error("[API] Failed to get model availability:", error); return NextResponse.json( { error: "Failed to fetch model availability" }, { status: 500 }, ); } } export async function POST(request) { try { const { action, provider, model } = await request.json(); if (action !== "clearCooldown" || !provider || !model) { return NextResponse.json({ error: "Invalid request" }, { status: 400 }); } const connections = await getProviderConnections({ provider }); const lockKey = `${MODEL_LOCK_PREFIX}${model}`; await Promise.all( connections .filter((connection) => connection[lockKey]) .map((connection) => updateProviderConnection(connection.id, { [lockKey]: null, ...(connection.testStatus === "unavailable" ? { testStatus: "active", lastError: null, lastErrorAt: null, backoffLevel: 0, } : {}), }), ), ); return NextResponse.json({ ok: true }); } catch (error) { console.error("[API] Failed to clear model cooldown:", error); return NextResponse.json( { error: "Failed to clear cooldown" }, { status: 500 }, ); } }