145 lines
4.4 KiB
TypeScript
145 lines
4.4 KiB
TypeScript
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", "huanke-gemini", "qianwen-video", "volcano-vision", "volcano-video", "alibaba-image", "ruxa-image"]),
|
|
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", "huanke-gemini", "qianwen-video", "volcano-vision", "volcano-video", "alibaba-image", "ruxa-image"]).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();
|
|
}
|
|
}
|