import { z } from "zod"; import { requireAdmin } from "@/lib/middleware/admin"; import { getAllAiProviders, getAiProviderById, createAiProvider, updateAiProvider, deleteAiProvider, } from "@/lib/db/queries"; import { ChatSDKError } from "@/lib/errors"; const createProviderSchema = z.object({ name: z.string().min(1).max(128), type: z.enum(["alibaba", "openai", "custom", "local", "gemini", "qianwen-video", "volcano-vision", "volcano-video"]), baseUrl: z.string().min(1), // 改为简单的字符串验证,支持 localhost apiKey: z.string().min(1), isEnabled: z.boolean().optional(), }); const updateProviderSchema = z.object({ id: z.string().uuid(), name: z.string().min(1).max(128).optional(), type: z.enum(["alibaba", "openai", "custom", "local", "gemini", "qianwen-video", "volcano-vision", "volcano-video"]).optional(), baseUrl: z.string().min(1).optional(), // 改为简单的字符串验证,支持 localhost apiKey: z.string().min(1).optional(), isEnabled: z.boolean().optional(), }); export async function GET(request: Request) { try { await requireAdmin(); const { searchParams } = new URL(request.url); const id = searchParams.get("id"); if (id) { const provider = await getAiProviderById({ id }); if (!provider) { return new ChatSDKError("bad_request:api", "Provider not found").toResponse(); } // 隐藏 API Key 的部分内容 return Response.json({ provider: { ...provider, apiKey: provider.apiKey.slice(0, 8) + "****" + provider.apiKey.slice(-4), }, }); } const providers = await getAllAiProviders(); // 隐藏 API Key 的部分内容 return Response.json({ providers: providers.map((p) => ({ ...p, apiKey: p.apiKey.slice(0, 8) + "****" + p.apiKey.slice(-4), })), }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } return new ChatSDKError("offline:admin").toResponse(); } } export async function POST(request: Request) { try { const session = await requireAdmin(); const body = await request.json(); console.log("[Admin API] Create provider request body:", JSON.stringify(body)); const data = createProviderSchema.parse(body); console.log("[Admin API] Validation passed, creating provider..."); const provider = await createAiProvider({ ...data, updatedBy: session.user.id, }); console.log("[Admin API] Provider created successfully:", provider[0].id); return Response.json({ provider: provider[0] }); } catch (error) { console.error("[Admin API] Create provider error:", error); if (error instanceof ChatSDKError) { return error.toResponse(); } if (error instanceof z.ZodError) { console.error("[Admin API] Validation error details:", error.errors); return new ChatSDKError("bad_request:api", JSON.stringify(error.errors)).toResponse(); } return new ChatSDKError("offline:admin").toResponse(); } } export async function PUT(request: Request) { try { const session = await requireAdmin(); const body = await request.json(); const data = updateProviderSchema.parse(body); const provider = await updateAiProvider({ ...data, updatedBy: session.user.id, }); if (provider.length === 0) { return new ChatSDKError("bad_request:api", "Provider not found").toResponse(); } return Response.json({ provider: provider[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(); } } export async function DELETE(request: Request) { try { await requireAdmin(); const { searchParams } = new URL(request.url); const id = searchParams.get("id"); if (!id) { return new ChatSDKError("bad_request:api", "Provider ID is required").toResponse(); } await deleteAiProvider({ id }); return Response.json({ success: true }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } return new ChatSDKError("offline:admin").toResponse(); } }