56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
import { z } from "zod";
|
|
import { requireAdmin } from "@/lib/middleware/admin";
|
|
import { ChatSDKError } from "@/lib/errors";
|
|
import {
|
|
listAiModelHealthEvents,
|
|
restoreAiModelHealth,
|
|
} from "@/lib/ai/runtime/model-health";
|
|
|
|
const restoreSchema = z.object({
|
|
modelId: z.string().uuid(),
|
|
});
|
|
|
|
export async function GET(request: Request) {
|
|
try {
|
|
await requireAdmin();
|
|
|
|
const { searchParams } = new URL(request.url);
|
|
const modelId = searchParams.get("modelId") || undefined;
|
|
const limit = Number(searchParams.get("limit") || 80);
|
|
const events = await listAiModelHealthEvents({
|
|
modelId,
|
|
limit: Number.isFinite(limit) ? limit : 80,
|
|
});
|
|
|
|
return Response.json({ events });
|
|
} catch (error) {
|
|
if (error instanceof ChatSDKError) {
|
|
return error.toResponse();
|
|
}
|
|
return new ChatSDKError("offline:admin").toResponse();
|
|
}
|
|
}
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
await requireAdmin();
|
|
|
|
const body = await request.json();
|
|
const data = restoreSchema.parse(body);
|
|
const models = await restoreAiModelHealth(data.modelId);
|
|
if (models.length === 0) {
|
|
return new ChatSDKError("bad_request:api", "Model not found").toResponse();
|
|
}
|
|
|
|
return Response.json({ model: models[0] });
|
|
} catch (error) {
|
|
if (error instanceof ChatSDKError) {
|
|
return error.toResponse();
|
|
}
|
|
if (error instanceof z.ZodError) {
|
|
return new ChatSDKError("bad_request:api", error.message).toResponse();
|
|
}
|
|
return new ChatSDKError("offline:admin").toResponse();
|
|
}
|
|
}
|