Files
Jyotisha/frontend/src/lib/public-models.ts
T
2026-07-17 13:07:17 +08:00

41 lines
1.4 KiB
TypeScript

import { z } from "zod";
const publicLanguageModelSchema = z.object({
id: z.string().trim().min(1).max(64).regex(/^[a-z0-9][a-z0-9._-]*$/),
label: z.string().trim().min(1).max(60),
description: z.string().trim().max(100),
creditCost: z.literal(1),
isDefault: z.boolean(),
}).strict();
const publicLanguageModelCatalogSchema = z.object({
models: z.array(publicLanguageModelSchema).min(1),
defaultModelId: z.string().trim().min(1).max(64),
}).strict().superRefine((catalog, context) => {
const ids = new Set(catalog.models.map((model) => model.id));
if (ids.size !== catalog.models.length) {
context.addIssue({ code: z.ZodIssueCode.custom, message: "model_ids_not_unique" });
}
const declaredDefault = catalog.models.filter((model) => model.isDefault);
if (declaredDefault.length !== 1 || declaredDefault[0]?.id !== catalog.defaultModelId) {
context.addIssue({ code: z.ZodIssueCode.custom, message: "default_model_mismatch" });
}
});
export type PublicLanguageModel = {
readonly id: string;
readonly label: string;
readonly description: string;
readonly creditCost: 1;
readonly isDefault: boolean;
};
export type PublicLanguageModelCatalog = {
readonly models: readonly PublicLanguageModel[];
readonly defaultModelId: string;
};
export function parsePublicModelCatalog(value: unknown): PublicLanguageModelCatalog {
return publicLanguageModelCatalogSchema.parse(value);
}