2026-02-12 12:03:36 +01:00
|
|
|
import { z } from "zod"
|
|
|
|
|
|
2026-02-13 16:00:04 +01:00
|
|
|
/** Validates model string format: "provider/model-id" (e.g., "openai/gpt-5.3-codex"). */
|
|
|
|
|
const ModelStringSchema = z
|
|
|
|
|
.string()
|
|
|
|
|
.min(1)
|
|
|
|
|
.refine(
|
|
|
|
|
(model) => {
|
|
|
|
|
const slashIndex = model.indexOf("/")
|
|
|
|
|
return slashIndex > 0 && slashIndex < model.length - 1
|
|
|
|
|
},
|
|
|
|
|
{ message: 'Model must be in "provider/model-id" format (e.g., "openai/gpt-5.3-codex")' }
|
|
|
|
|
)
|
|
|
|
|
|
2026-02-12 12:03:36 +01:00
|
|
|
export const CouncilMemberSchema = z.object({
|
2026-02-13 16:00:04 +01:00
|
|
|
model: ModelStringSchema,
|
2026-02-12 12:03:36 +01:00
|
|
|
variant: z.string().optional(),
|
|
|
|
|
name: z.string().optional(),
|
2026-02-18 20:55:05 +01:00
|
|
|
}).strict()
|
2026-02-12 12:03:36 +01:00
|
|
|
|
|
|
|
|
export const CouncilConfigSchema = z.object({
|
|
|
|
|
members: z.array(CouncilMemberSchema).min(2),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
export const AthenaConfigSchema = z.object({
|
|
|
|
|
model: z.string().optional(),
|
|
|
|
|
council: CouncilConfigSchema,
|
|
|
|
|
})
|