File size: 2,042 Bytes
6111b2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**

 * Provider Schema Validation — Phase 7.2

 *

 * Zod schemas for provider constant validation.

 * Validates provider category maps

 * at module load time to catch configuration drift early.

 *

 * @module shared/validation/providerSchema

 */

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);

/**

 * Validate a providers map, throwing a descriptive error on failure.

 * @param {Record<string, object>} map - The providers map to validate

 * @param {string} name - Name of the map for error messages

 */
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}`);
  }
}