diff --git a/__tests__/validate.test.mjs b/__tests__/validate.test.mjs index 64ce9d9..4978c54 100644 --- a/__tests__/validate.test.mjs +++ b/__tests__/validate.test.mjs @@ -105,7 +105,7 @@ describe('真实数据全量校验', () => { if (spec.routing) routed.push(spec) } } - assert.equal(routed.length, 58) + assert.equal(routed.length, 60) assert.equal(routed.every((spec) => spec.routing.reasoning.supportedModes.includes(spec.routing.reasoning.defaultMode)), true) assert.equal(routed.every((spec) => Array.isArray(spec.spec.capabilities)), true) }) @@ -154,9 +154,11 @@ describe('真实数据全量校验', () => { 'claude-opus-5-5', 'claude-fable-5-1', 'claude-opus-5', + 'claude-sonnet-5-5', 'claude-sonnet-5', ]) assert.deepEqual(enabled(openai), [ + 'gpt-6.1-sol', 'gpt-6-sol', 'gpt-6-luna', 'gpt-6-astra', @@ -584,6 +586,8 @@ describe('真实数据全量校验', () => { it('新增主流模型应在官方 Provider 与共享规格中保持 ID、窗口和推理配置一致', () => { const cases = [ + ['openai', 'openai', 'gpt-6.1-sol', 1050000, 128000, 2, 10, 'medium'], + ['anthropic', 'anthropic', 'claude-sonnet-5-5', 1000000, 128000, 2, 10, 'high'], ['openai', 'openai', 'gpt-6-sol', 1050000, 128000, 2, 10, 'medium'], ['openai', 'openai', 'gpt-6-luna', 1050000, 128000, 0.1, 0.5, 'medium'], ['anthropic', 'anthropic', 'claude-opus-5-5', 1000000, 128000, 4, 20, 'medium'], @@ -623,7 +627,7 @@ describe('真实数据全量校验', () => { assert.deepEqual(xai.models.find((item) => item.modelName === 'grok-4.7').extra.reasoning.supportedEfforts, ['low', 'medium', 'high', 'xhigh']) const codex = JSON.parse(readFileSync(join(ROOT, 'compute', 'providers', 'openai-codex.json'), 'utf8')) - for (const id of ['gpt-6-sol', 'gpt-6-luna']) { + for (const id of ['gpt-6.1-sol', 'gpt-6-sol', 'gpt-6-luna']) { const model = codex.models.find((item) => item.modelName === id) assert.ok(model, `Codex 订阅 Provider 缺少 ${id}`) assert.equal(model.source, 'preset') @@ -631,6 +635,35 @@ describe('真实数据全量校验', () => { } }) + it('GPT-6.1 与 Sonnet 5.5 的协议约束在 API、订阅与共享规格中保持一致', () => { + const read = (dir, name) => JSON.parse(readFileSync(join(ROOT, 'compute', dir, `${name}.json`), 'utf8')) + const efforts = ['low', 'medium', 'high', 'xhigh', 'max'] + for (const provider of ['openai', 'openai-codex']) { + const model = read('providers', provider).models.find((item) => item.modelName === 'gpt-6.1-sol') + assert.deepEqual(model.extra.reasoning.supportedEfforts, efforts) + if (provider === 'openai') { + assert.equal(model.extra.responsesOnly, true) + assert.equal(model.extra.cachedInputPrice, 0.1) + } + } + const gpt = read('model-specs', 'openai').specs.find((item) => item.id === 'gpt-6.1-sol') + assert.deepEqual(gpt.match.exact, ['gpt-6.1-sol']) + assert.deepEqual(gpt.routing.reasoning.supportedModes, ['auto', ...efforts]) + for (const provider of ['anthropic', 'anthropic-claude']) { + const model = read('providers', provider).models.find((item) => item.modelName === 'claude-sonnet-5-5') + assert.equal(model.extra.reasoning.defaultEffort, 'high') + assert.equal(model.extra.forcedToolChoiceUnsupported, true) + assert.equal(model.extra.samplingParametersDeprecated, true) + assert.equal(model.extra.thinkingOnly, undefined) + if (provider === 'anthropic') assert.equal(model.extra.promptCacheMinTokens, 512) + } + const sonnet = read('model-specs', 'anthropic').specs.find((item) => item.id === 'claude-sonnet-5-5') + assert.deepEqual(sonnet.match.exact, ['claude-sonnet-5-5']) + assert.equal(sonnet.spec.extra.forcedToolChoiceUnsupported, true) + assert.equal(sonnet.spec.extra.thinkingOnly, undefined) + assert.equal(sonnet.routing.reasoning.defaultMode, 'high') + }) + it('Codex 订阅接入面不声明 none 档:ChatGPT 后端不接受关闭思考', () => { // OpenAI 下发给 Codex 的模型元数据(models_cache.json#supported_reasoning_levels)里, // 该接入面没有任何模型支持 none。声明了 none,客户端会在 AI 审批等关闭思考的调用上发 @@ -847,7 +880,7 @@ describe('真实数据全量校验', () => { // 只做单向断言(已知拒绝的代际必须声明),新代际按官方文档补声明即可,不维护反向代际表。 // 订阅(claude-oauth)请求由 Claude CLI 自建,客户端 compat 层对这两类参数显式 fail closed,不依赖声明。 const samplingRemoved = /^claude-(?:fable|mythos)-|^claude-(?:opus|sonnet)-5(?:$|-)|^claude-opus-4-[78](?:$|-)/ - const forcedToolChoiceRemoved = /^claude-(?:fable|mythos)-5-1(?:$|-)|^claude-opus-5-5(?:$|-)/ + const forcedToolChoiceRemoved = /^claude-(?:fable|mythos)-5-1(?:$|-)|^claude-(?:opus|sonnet)-5-5(?:$|-)/ const specFile = JSON.parse(readFileSync(join(ROOT, 'compute', 'model-specs', 'anthropic.json'), 'utf8')) for (const id of ['claude-fable-5-1', 'claude-opus-5-5', 'claude-opus-5', 'claude-opus-4-8', 'claude-opus-4-7', 'claude-sonnet-5']) { diff --git a/compute/model-specs/anthropic.json b/compute/model-specs/anthropic.json index e084124..03a69c2 100644 --- a/compute/model-specs/anthropic.json +++ b/compute/model-specs/anthropic.json @@ -31,7 +31,8 @@ "thinkingOnly": true, "samplingParametersDeprecated": true, "forcedToolChoiceUnsupported": true - } + }, + "releasedAt": "2026-09-22" }, "routing": { "tier": "flagship", @@ -235,6 +236,57 @@ "supportsReasoning": true } }, + { + "id": "claude-sonnet-5-5", + "displayName": "Claude Sonnet 5.5", + "family": "claude-sonnet-5-5", + "match": { + "exact": [ + "claude-sonnet-5-5" + ] + }, + "spec": { + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "capabilities": [ + "chat", + "reasoning", + "code", + "vision", + "tool_use", + "computer_use", + "long_context" + ], + "serviceType": [ + "chat" + ], + "supportsReasoning": true, + "description": "Claude Sonnet 5.5,速度与智能平衡,默认 high effort,自适应思考", + "extra": { + "adaptiveThinking": true, + "samplingParametersDeprecated": true, + "forcedToolChoiceUnsupported": true + }, + "releasedAt": "2026-09-28" + }, + "routing": { + "tier": "balanced", + "routingPriority": 18, + "eligibleForAgent": true, + "defaultReference": false, + "reasoning": { + "supportedModes": [ + "auto", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "defaultMode": "high" + } + } + }, { "id": "claude-sonnet-5", "displayName": "Claude Sonnet 5", diff --git a/compute/model-specs/openai.json b/compute/model-specs/openai.json index 55a87aa..20cdbf4 100644 --- a/compute/model-specs/openai.json +++ b/compute/model-specs/openai.json @@ -1,6 +1,51 @@ { "description": "OpenAI GPT / o 系列模型规格。参数来源:config-center compute/providers/openai.json。注意:gpt-4o / gpt-5 等存在子型号(-mini/-nano),故只用 exact 主键匹配,不使用宽泛 pattern 以防误吞子型号。o 系列 serviceType 由 responses 调整为 reasoning(responses 为 OpenAI 直连专有,对 NewAPI 网关不适用)。", "specs": [ + { + "id": "gpt-6.1-sol", + "displayName": "GPT-6.1 Sol", + "family": "gpt-6.1-sol", + "match": { + "exact": [ + "gpt-6.1-sol" + ] + }, + "spec": { + "contextWindow": 1050000, + "maxOutputTokens": 128000, + "capabilities": [ + "chat", + "reasoning", + "code", + "vision", + "long_context", + "tool_use", + "agent" + ], + "serviceType": [ + "chat" + ], + "supportsReasoning": true, + "description": "GPT-6.1 Sol,1.05M 上下文,128K 最大输出;工具调用需要 Responses API,不支持关闭推理" + }, + "routing": { + "tier": "balanced", + "routingPriority": 4, + "eligibleForAgent": true, + "defaultReference": false, + "reasoning": { + "supportedModes": [ + "auto", + "low", + "medium", + "high", + "xhigh", + "max" + ], + "defaultMode": "medium" + } + } + }, { "id": "gpt-image-2.5-sunburst", "displayName": "GPT Image 2.5 Sunburst", diff --git a/compute/providers/anthropic-claude.json b/compute/providers/anthropic-claude.json index 9ef6805..ff45479 100644 --- a/compute/providers/anthropic-claude.json +++ b/compute/providers/anthropic-claude.json @@ -147,6 +147,48 @@ }, "source": "preset" }, + { + "modelName": "claude-sonnet-5-5", + "displayName": "Claude Sonnet 5.5", + "serviceType": [ + "chat" + ], + "description": "Claude Sonnet 5.5,速度与智能平衡,1M 上下文,默认 high effort,自适应思考", + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "capabilities": [ + "chat", + "reasoning", + "code", + "vision", + "tool_use", + "agent", + "long_context" + ], + "extra": { + "adaptiveThinking": true, + "reasoning": { + "supportedEfforts": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "defaultEffort": "high" + }, + "thinkingRoundTrip": { + "enabled": true, + "protocol": "anthropic-messages", + "allowEmptySignature": false, + "scope": "active-tool-turn" + }, + "thinkingToolTurnValidation": "accepts-thinkless", + "samplingParametersDeprecated": true, + "forcedToolChoiceUnsupported": true + }, + "source": "preset" + }, { "modelName": "claude-sonnet-5", "displayName": "Claude Sonnet 5", diff --git a/compute/providers/anthropic.json b/compute/providers/anthropic.json index 118c674..86d6e38 100644 --- a/compute/providers/anthropic.json +++ b/compute/providers/anthropic.json @@ -186,6 +186,65 @@ "pricingNotes": "Prices are per 1M tokens. Full 1M context is billed at standard pricing." } }, + { + "modelName": "claude-sonnet-5-5", + "displayName": "Claude Sonnet 5.5", + "serviceType": [ + "chat", + "computer_use" + ], + "description": "Claude Sonnet 5.5,速度与智能平衡,1M 上下文,默认 high effort,自适应思考", + "contextWindow": 1000000, + "maxOutputTokens": 128000, + "capabilities": [ + "chat", + "reasoning", + "code", + "vision", + "tool_use", + "computer_use", + "agent", + "long_context" + ], + "inputPrice": 2, + "outputPrice": 10, + "extra": { + "thinkingRoundTrip": { + "enabled": true, + "protocol": "anthropic-messages", + "allowEmptySignature": false, + "scope": "active-tool-turn" + }, + "thinkingToolTurnValidation": "accepts-thinkless", + "serverSideWebSearch": { + "enabled": true, + "dialect": "anthropic-messages", + "fallbackPriority": 3, + "searchRequestPriceUsd": 0.01, + "toolType": "web_search_20260318" + }, + "cachePricing": { + "write5m": 2.5, + "write1h": 4, + "read": 0.2 + }, + "adaptiveThinking": true, + "reasoning": { + "supportedEfforts": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "defaultEffort": "high" + }, + "defaultEffort": "xhigh", + "samplingParametersDeprecated": true, + "forcedToolChoiceUnsupported": true, + "promptCacheMinTokens": 512 + } + }, { "modelName": "claude-sonnet-5", "displayName": "Claude Sonnet 5", diff --git a/compute/providers/openai-codex.json b/compute/providers/openai-codex.json index b9f6746..6e5492c 100644 --- a/compute/providers/openai-codex.json +++ b/compute/providers/openai-codex.json @@ -24,6 +24,38 @@ "reasoning" ], "models": [ + { + "modelName": "gpt-6.1-sol", + "displayName": "GPT-6.1 Sol", + "serviceType": [ + "chat" + ], + "description": "GPT-6.1 Sol,面向复杂编程、电脑使用和专业工作,1.05M 上下文;工具调用使用 Responses API", + "contextWindow": 1050000, + "maxOutputTokens": 128000, + "capabilities": [ + "chat", + "reasoning", + "code", + "vision", + "ultra_long_context", + "tool_use", + "agent" + ], + "extra": { + "reasoning": { + "supportedEfforts": [ + "low", + "medium", + "high", + "xhigh", + "max" + ], + "defaultEffort": "medium" + } + }, + "source": "preset" + }, { "modelName": "gpt-6-sol", "displayName": "GPT-6 Sol", diff --git a/compute/providers/openai.json b/compute/providers/openai.json index 847724a..a72a974 100644 --- a/compute/providers/openai.json +++ b/compute/providers/openai.json @@ -24,6 +24,44 @@ "translation" ], "models": [ + { + "modelName": "gpt-6.1-sol", + "displayName": "GPT-6.1 Sol", + "serviceType": [ + "chat", + "responses" + ], + "contextWindow": 1050000, + "maxOutputTokens": 128000, + "capabilities": [ + "chat", + "reasoning", + "code", + "vision", + "ultra_long_context", + "tool_use", + "agent" + ], + "description": "GPT-6.1 Sol,面向复杂编程、电脑使用和专业工作,1.05M 上下文;工具调用使用 Responses API", + "inputPrice": 2, + "outputPrice": 10, + "extra": { + "serverSideWebSearch": { + "enabled": true, + "dialect": "openai-responses", + "fallbackPriority": 2, + "searchRequestPriceUsd": 0.01, + "toolType": "web_search" + }, + "cachedInputPrice": 0.1, + "reasoning": { + "supportedEfforts": ["low", "medium", "high", "xhigh", "max"], + "defaultEffort": "medium" + }, + "pricingNotes": "Prices are per 1M tokens. Cache writes $2.50/M. Above 272K input tokens, input and cache rates are 2x and output rates are 1.5x for the full request. Fast mode is 2x; Batch and Flex are 50% lower. Tool calling requires Responses API; none/minimal reasoning are unsupported.", + "responsesOnly": true + } + }, { "modelName": "gpt-image-2.5-sunburst", "displayName": "GPT Image 2.5 Sunburst", diff --git a/manifest.json b/manifest.json index 82539bb..78ad417 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "presetDataVersion": 122, - "updatedAt": "2026-09-26", + "presetDataVersion": 123, + "updatedAt": "2026-10-01", "description": "DesireCore 官方配置中心" }