Files
config-center/schemas/model-spec.schema.json
Yige c46cf07d2f feat(compute): 补 GLM-5.3 系列规格并标注 Ox Alpha 真身 (#81)
* feat(compute): 补 GLM-5.3 系列规格并标注 Ox Alpha 真身

Ox Alpha 是智谱 GLM-5.3-Flash 的匿名发布别名(canonical_slug
z-ai/glm-5.3-flash-20260826,2026-08-26 揭晓后已从 OpenRouter 列表下架)。

改动:
- model-specs/zhipu.json 新增 glm-5.3 与 glm-5.3-flash 正式规格。两者均
  强制思考(z.ai 文档:thinking.type 仅接受 enabled;OpenRouter models API:
  reasoning.mandatory=true,supported_efforts=[max,high,low]),故
  routing.reasoning.supportedModes 不含 off。按 #79 的教训只用 exact 匹配,
  避免 glm-5.3* 误吞 glm-5.3-flash。
- model-specs/stealth.json 的 ox-alpha 用 spec.extra.modelOrigin 标注真身。
  条目保留:云端算力可能仍以旧别名下发该模型。
- schemas/model-spec.schema.json 为 extra.thinkingOnly / thinkingDefault
  补正式定义与 description。此前这两个键无任何说明,客户端因此从未消费,
  用户选「关闭思考」即触发上游 400(见 desirecore#2307)。
- scripts/validate.mjs 新增静默失效键名巡检:extra 是开放对象,写错键名
  既不报错也无告警。当前巡出 17 处扁平 extra.reasoningEffort。刻意只告警
  不失败——存量取值需逐个核实各自接入面实际接受哪些 effort。

* docs(schema): 写明 extra.reasoning 与 thinkingOnly 的职责边界

provider schema 的 extra.reasoning 此前只有子字段 description、对象本身没有,
维护者看不出它与 model-spec 的 thinkingOnly 分别回答什么问题——issue
desirecore#2307 的误解正源于此。补上对象级说明:本键答「接入面接受哪些 effort
值」且只能写在 provider model;thinkingOnly 答「off 能不能用」、不声明深度档位。
2026-08-27 15:21:25 +08:00

193 lines
11 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://desirecore.net/schemas/config-center/model-spec.schema.json",
"title": "ModelSpecFile",
"description": "模型规格库compute/model-specs/*.json数据契约。\n\n用途维护模型的唯一规格主数据内在参数上下文窗口、最大输出、能力标签、serviceType、默认采样参数等以及智能路由策略量级、排序、Agent 可选性和标准化 reasoning 合同)。同一事实不得再写入独立 smart-routing 目录。\n\nProvider 文件只描述接入面、可用性和明确的接入面覆盖;历史 Provider 条目中已有的规格字段为旧客户端兼容副本,不能覆盖本文件。\n\n严禁写入价格字段inputPrice/outputPrice/cache 等)——价签真相源永远是 NewAPI pricing。",
"type": "object",
"required": ["specs"],
"properties": {
"description": {
"type": "string",
"description": "文件说明(如所属厂商、收录范围)"
},
"specs": {
"type": "array",
"description": "模型规格条目列表",
"items": { "$ref": "#/definitions/modelSpec" }
}
},
"additionalProperties": false,
"definitions": {
"modelSpec": {
"type": "object",
"required": ["id", "spec"],
"properties": {
"id": {
"type": "string",
"description": "模型标准标识符,通常等于上游 model_name 原样(保留大小写与点号,如 claude-sonnet-4-6、MiniMax-M2.7)。同时作为精确匹配键;匹配时大小写/分隔符不敏感(由匹配器归一化)。",
"minLength": 1
},
"displayName": {
"type": "string",
"description": "模型友好显示名(如 Claude Sonnet 4.6)。命中后可覆盖 NewAPI 返回的原始 model_name优化 UI 展示。"
},
"family": {
"type": "string",
"description": "模型家族标识(如 claude-sonnet、gpt-5、gemini-2.5)。当精确/别名/pattern 匹配均失败时,按最长 family 前缀兜底匹配,返回保守参数并标记 inferred。"
},
"match": {
"type": "object",
"description": "通用匹配规则。匹配器会先做归一化(小写、去 vendor 前缀如 anthropic/、去网关装饰、统一分隔符、去日期戳与波动后缀再分层匹配exact > 归一化 exact > 去日期戳后 exact > pattern取最长 > family 兜底。",
"properties": {
"exact": {
"type": "array",
"description": "精确别名列表(除 id 外的已知精确名,含网关可能使用的全名)。归一化后比对。",
"items": { "type": "string", "minLength": 1 }
},
"patterns": {
"type": "array",
"description": "glob 模式列表(如 claude-sonnet-4-6*)。仅在 exact + 去日期戳仍无法覆盖变体时使用;避免对存在子型号的父模型(如 gpt-4o 之于 gpt-4o-mini使用宽泛通配以防误吞。多命中取最长 pattern。",
"items": { "type": "string", "minLength": 1 }
}
},
"additionalProperties": false
},
"routing": {
"type": "object",
"description": "智能路由策略。存在即表示该精确模型可进入路由候选;模型能力和 reasoning 合同均以本条目为准Provider 只能为接入面收紧。",
"required": ["tier", "routingPriority", "eligibleForAgent", "defaultReference", "reasoning"],
"properties": {
"tier": {
"type": "string",
"enum": ["flagship", "balanced", "lightweight"],
"description": "模型在智能路由中的能力量级。"
},
"routingPriority": {
"type": "integer",
"minimum": 0,
"maximum": 10000,
"description": "同一量级内的稳定优先级,数值越小越优先。"
},
"eligibleForAgent": {
"type": "boolean",
"description": "是否允许作为 Agent 主模型;媒体专用模型必须为 false。"
},
"defaultReference": {
"type": "boolean",
"description": "是否是默认模型的策略参考,只影响同级排序,不是强制选择。"
},
"reasoning": {
"type": "object",
"description": "模型级标准化 reasoning 合同。auto 为不发送参数off 为显式关闭Provider 接入面可收紧此集合,但不得扩张。",
"required": ["supportedModes", "defaultMode"],
"properties": {
"supportedModes": {
"type": "array",
"minItems": 1,
"uniqueItems": true,
"items": {
"type": "string",
"enum": ["auto", "off", "minimal", "low", "medium", "high", "xhigh", "max"]
},
"description": "产品层可用的 reasoning 档位。"
},
"defaultMode": {
"type": "string",
"enum": ["auto", "off", "minimal", "low", "medium", "high", "xhigh", "max"],
"description": "没有显式请求时的策略默认档位,必须包含在 supportedModes 中。"
}
},
"allOf": [
{ "if": { "properties": { "defaultMode": { "const": "auto" } } }, "then": { "properties": { "supportedModes": { "contains": { "const": "auto" } } } } },
{ "if": { "properties": { "defaultMode": { "const": "off" } } }, "then": { "properties": { "supportedModes": { "contains": { "const": "off" } } } } },
{ "if": { "properties": { "defaultMode": { "const": "minimal" } } }, "then": { "properties": { "supportedModes": { "contains": { "const": "minimal" } } } } },
{ "if": { "properties": { "defaultMode": { "const": "low" } } }, "then": { "properties": { "supportedModes": { "contains": { "const": "low" } } } } },
{ "if": { "properties": { "defaultMode": { "const": "medium" } } }, "then": { "properties": { "supportedModes": { "contains": { "const": "medium" } } } } },
{ "if": { "properties": { "defaultMode": { "const": "high" } } }, "then": { "properties": { "supportedModes": { "contains": { "const": "high" } } } } },
{ "if": { "properties": { "defaultMode": { "const": "xhigh" } } }, "then": { "properties": { "supportedModes": { "contains": { "const": "xhigh" } } } } },
{ "if": { "properties": { "defaultMode": { "const": "max" } } }, "then": { "properties": { "supportedModes": { "contains": { "const": "max" } } } } }
],
"additionalProperties": false
}
},
"additionalProperties": false
},
"spec": {
"type": "object",
"description": "模型内在参数(不含任何价格字段)",
"properties": {
"contextWindow": {
"type": "number",
"description": "上下文窗口大小token 数)。下游用于上下文裁剪阈值计算。",
"minimum": 0
},
"maxOutputTokens": {
"type": "number",
"description": "单次请求最大输出 token 数。tags 字符串无法表达,是本规格库相对 NewAPI tags 的核心补充。",
"minimum": 0
},
"capabilities": {
"type": "array",
"description": "模型能力标签chat、vision、tool_use、code、reasoning 等。与 NewAPI tags 解析结果取并集。",
"items": { "type": "string" }
},
"serviceType": {
"type": ["string", "array"],
"items": { "type": "string" },
"description": "服务类型单个字符串或数组chat、reasoning、fast、vision、embedding、image_gen、tts、asr 等。命中时优先于 tags 解析。"
},
"defaultTemperature": {
"type": ["number", "null"],
"description": "推荐默认温度0-2。null 表示模型不支持温度调节(如 reasoning 模型),调用方应跳过该参数。本文件为新文件,老客户端不读,故允许 null。",
"minimum": 0,
"maximum": 2
},
"defaultTopP": {
"type": ["number", "null"],
"description": "推荐默认 Top-P0-1。null 表示不支持调节。",
"minimum": 0,
"maximum": 1
},
"supportsReasoning": {
"type": "boolean",
"description": "是否为推理模型。用于运行时决定是否启用 reasoning 相关处理。"
},
"description": {
"type": "string",
"description": "模型简要描述(一句话特点与适用场景)。命中后可覆盖 NewAPI 原值。"
},
"extra": {
"type": "object",
"description": "模型内在附加配置(如 apiModelId 全名、推理预算等)。不含价格,也不得声明 Provider/接入面的 reasoning effort 能力。",
"not": { "required": ["reasoning"] },
"properties": {
"thinkingOnly": {
"type": "boolean",
"description": "模型强制思考、无法关闭(如 GLM-5.3 系列 thinking.type 仅接受 enabled。true 时客户端把 off 从可选档位移除,并把内部 suppressThinking 降级为 auto避免发出必然被上游拒绝的关闭参数。只描述模型固有属性不声明接入面支持哪些深度档位——后者只能写在 provider model 的 extra.reasoning 中。"
},
"thinkingDefault": {
"type": "boolean",
"description": "模型默认开启思考。当前不改变客户端行为,仅供维护者参考。"
}
},
"additionalProperties": true
},
"releasedAt": {
"type": "string",
"description": "厂商发布年月YYYY-MM 或 YYYY-MM-DD辅助人工判断模型新旧。无客户端行为仅供维护者参考何时清理该条规格。",
"pattern": "^\\d{4}-\\d{2}(-\\d{2})?$"
},
"retiredAt": {
"type": "string",
"description": "厂商宣布停止访问的日期YYYY-MM-DD辅助人工批量删除已退役的规格条目。无客户端行为仅作数据清理依据。",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}