diff --git a/src/config/types.agent-defaults.ts b/src/config/types.agent-defaults.ts index 9c6ce0211..6e3a7ed55 100644 --- a/src/config/types.agent-defaults.ts +++ b/src/config/types.agent-defaults.ts @@ -16,6 +16,21 @@ export type AgentModelEntryConfig = { alias?: string; /** Provider-specific API parameters (e.g., GLM-4.7 thinking mode). */ params?: Record; + /** Model compatibility overrides (e.g., OpenRouter routing preferences). */ + compat?: ModelCompatEntryConfig; +}; + +export type ModelCompatEntryConfig = { + supportsStore?: boolean; + supportsDeveloperRole?: boolean; + supportsReasoningEffort?: boolean; + maxTokensField?: "max_completion_tokens" | "max_tokens"; + openRouterRouting?: OpenRouterRoutingConfig; +}; + +export type OpenRouterRoutingConfig = { + only?: string[]; + order?: string[]; }; export type AgentModelListConfig = { diff --git a/src/config/zod-schema.agent-defaults.ts b/src/config/zod-schema.agent-defaults.ts index a849078ed..bd9a8448a 100644 --- a/src/config/zod-schema.agent-defaults.ts +++ b/src/config/zod-schema.agent-defaults.ts @@ -37,6 +37,24 @@ export const AgentDefaultsSchema = z alias: z.string().optional(), /** Provider-specific API parameters (e.g., GLM-4.7 thinking mode). */ params: z.record(z.string(), z.unknown()).optional(), + /** Model compatibility overrides (e.g., OpenRouter routing preferences). */ + compat: z + .object({ + supportsStore: z.boolean().optional(), + supportsDeveloperRole: z.boolean().optional(), + supportsReasoningEffort: z.boolean().optional(), + maxTokensField: z + .union([z.literal("max_completion_tokens"), z.literal("max_tokens")]) + .optional(), + openRouterRouting: z + .object({ + only: z.array(z.string()).optional(), + order: z.array(z.string()).optional(), + }) + .optional(), + }) + .strict() + .optional(), }) .strict(), ) diff --git a/src/config/zod-schema.core.ts b/src/config/zod-schema.core.ts index 4a8c80bcc..f4d3a48cf 100644 --- a/src/config/zod-schema.core.ts +++ b/src/config/zod-schema.core.ts @@ -19,6 +19,12 @@ export const ModelCompatSchema = z maxTokensField: z .union([z.literal("max_completion_tokens"), z.literal("max_tokens")]) .optional(), + openRouterRouting: z + .object({ + only: z.array(z.string()).optional(), + order: z.array(z.string()).optional(), + }) + .optional(), }) .strict() .optional();