| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import { z } from "zod";
|
|
|
| const SERVICE_KIND_VALUES = [
|
| "llm",
|
| "embedding",
|
| "image",
|
| "imageToText",
|
| "tts",
|
| "stt",
|
| "webSearch",
|
| "webFetch",
|
| "video",
|
| "music",
|
| ] as const;
|
|
|
| export const ProviderSchema = z.object({
|
| id: z.string().min(1),
|
| alias: z.string().min(1).optional(),
|
| name: z.string().min(1),
|
| icon: z.string().min(1),
|
| color: z.string().regex(/^#[0-9A-Fa-f]{6}$/, "Must be a valid hex color (#RRGGBB)"),
|
| textIcon: z.string().optional(),
|
| website: z.string().url().optional(),
|
| passthroughModels: z.boolean().optional(),
|
| subscriptionRisk: z.boolean().optional(),
|
| riskNoticeVariant: z.enum(["oauth", "webCookie", "deprecated", "embedded-service"]).optional(),
|
| isEmbeddedService: z.boolean().optional(),
|
| deprecated: z.boolean().optional(),
|
| deprecationReason: z.string().optional(),
|
| hasFree: z.boolean().optional(),
|
| freeNote: z.string().optional(),
|
| authHint: z.string().optional(),
|
| apiHint: z.string().optional(),
|
| serviceKinds: z.array(z.enum(SERVICE_KIND_VALUES)).optional(),
|
| });
|
|
|
| export const ProvidersMapSchema = z.record(z.string(), ProviderSchema);
|
|
|
| |
| |
| |
| |
|
|
| export function validateProviders(map: Record<string, unknown>, name: string): void {
|
| const result = ProvidersMapSchema.safeParse(map);
|
| if (!result.success) {
|
| const issues = result.error.issues.map((i) => ` ${i.path.join(".")}: ${i.message}`).join("\n");
|
| console.error(`[PROVIDER VALIDATION] ${name} has invalid entries:\n${issues}`);
|
| throw new Error(`Provider validation failed for ${name}`);
|
| }
|
| }
|
|
|