From 642985e8193848b23e1ad004d333cb4cc163c2d1 Mon Sep 17 00:00:00 2001 From: Yige Date: Sat, 3 Oct 2026 03:49:55 -0700 Subject: [PATCH] fix(data): complete verified contracts and source maintenance (#114) --- AGENTS.md | 4 + __tests__/data-completion.test.mjs | 39 ++ __tests__/reasoning-lifecycle.test.mjs | 26 + __tests__/runtime-catalog.test.mjs | 50 ++ __tests__/supplier-contract-updates.test.mjs | 47 ++ __tests__/validate-data-sources.test.mjs | 67 +++ __tests__/validate-runtime-sources.test.mjs | 43 ++ __tests__/validate.test.mjs | 6 +- .../vendor-interface-boundaries.test.mjs | 31 + compute/coding-plans/baidu-coding.json | 5 +- .../coding-plans/dashscope-token-plan.json | 4 - compute/coding-plans/minimax-coding.json | 4 +- compute/coding-plans/zhipu-coding.json | 8 +- compute/model-specs/_index.json | 20 +- compute/model-specs/cohere.json | 42 +- compute/model-specs/deepseek.json | 6 +- compute/model-specs/minimax.json | 16 +- compute/model-specs/openai.json | 4 +- compute/model-specs/stealth.json | 11 +- compute/model-specs/xunfei.json | 12 +- compute/providers/_index.json | 1 + compute/providers/anthropic-claude.json | 4 +- compute/providers/anthropic.json | 7 +- compute/providers/cohere.json | 24 +- compute/providers/minimax.json | 14 +- compute/providers/moonshot.json | 9 +- compute/providers/openai.json | 96 ++-- compute/providers/xai.json | 17 +- compute/providers/xiaomi.json | 6 +- compute/providers/xunfei-x2.json | 41 ++ compute/providers/xunfei.json | 32 +- compute/providers/zhipu.json | 8 +- docs/README.md | 6 + docs/data-maintenance/CLIENT-DEPENDENCIES.md | 37 ++ docs/data-maintenance/PLAN.md | 34 ++ docs/data-maintenance/RESULTS.md | 46 ++ docs/data-sources/README.md | 16 + docs/data-sources/api-providers/brave.md | 55 ++ .../configured-vision-anthropic.md | 69 +++ .../api-providers/configured-vision-openai.md | 62 ++ .../api-providers/doubao-search-global.md | 55 ++ docs/data-sources/api-providers/serper.md | 49 ++ docs/data-sources/api-providers/tavily.md | 58 ++ docs/data-sources/policies/pricing.md | 20 + docs/data-sources/policies/service-map.md | 104 ++++ docs/model-sources/MAINTENANCE.md | 7 +- docs/model-sources/providers/alibaba/AUDIT.md | 35 ++ .../model-sources/providers/alibaba/README.md | 2 +- .../alibaba/models/deepseek-v4-flash-0731.md | 2 +- .../providers/anthropic/AUDIT.md | 29 + .../providers/anthropic/README.md | 2 +- .../providers/anthropic/SOURCES.md | 77 ++- .../anthropic/models/claude-fable-5-1.md | 25 +- .../anthropic/models/claude-opus-5-5.md | 26 +- .../anthropic/models/claude-opus-5.md | 29 +- .../anthropic/models/claude-sonnet-5-5.md | 26 +- .../anthropic/models/claude-sonnet-5.md | 29 +- .../model-sources/providers/baichuan/AUDIT.md | 27 + .../providers/baichuan/README.md | 2 +- docs/model-sources/providers/baidu/AUDIT.md | 33 ++ docs/model-sources/providers/baidu/README.md | 2 +- .../baidu/models/ernie-4.5-turbo-20260402.md | 8 +- .../providers/baidu/models/glm-5.1.md | 7 +- docs/model-sources/providers/cohere/AUDIT.md | 27 + docs/model-sources/providers/cohere/README.md | 7 +- .../model-sources/providers/cohere/SOURCES.md | 40 +- .../cohere/access/model-specs--cohere.md | 3 +- .../cohere/access/providers--cohere.md | 7 +- .../providers/cohere/models/embed-v4.0.md | 23 +- .../cohere/models/embed-v5.0-fast.md | 14 +- .../providers/cohere/models/embed-v5.0-pro.md | 14 +- .../cohere/models/north-mini-code-1-0.md | 66 +++ .../cohere/models/north-mini-code.md | 64 +-- .../models/north-small-translate-1-0.md | 64 +++ .../providers/cohere/models/rerank-v3.5.md | 48 +- .../model-sources/providers/deepseek/AUDIT.md | 18 + .../providers/deepseek/README.md | 2 +- .../deepseek/models/deepseek-v4-flash-0731.md | 6 +- .../providers/github-copilot/AUDIT.md | 27 + .../providers/github-copilot/README.md | 2 +- .../providers/github-copilot/SOURCES.md | 2 +- docs/model-sources/providers/google/AUDIT.md | 23 + docs/model-sources/providers/google/README.md | 2 +- .../model-sources/providers/google/SOURCES.md | 151 ++++- .../google/models/gemini-2.5-flash.md | 14 +- .../providers/google/models/gemini-2.5-pro.md | 14 +- .../google/models/gemini-3-flash-preview.md | 14 +- .../google/models/gemini-3.1-flash-lite.md | 12 +- .../google/models/gemini-3.1-pro-preview.md | 14 +- .../google/models/gemini-3.5-flash-lite.md | 14 +- .../google/models/gemini-3.5-flash.md | 14 +- .../google/models/gemini-3.7-flash.md | 14 +- .../google/models/gemini-3.8-flash.md | 14 +- docs/model-sources/providers/infini/AUDIT.md | 27 + docs/model-sources/providers/infini/README.md | 2 +- docs/model-sources/providers/kling/AUDIT.md | 27 + docs/model-sources/providers/kling/README.md | 2 +- docs/model-sources/providers/kwai/AUDIT.md | 27 + docs/model-sources/providers/kwai/README.md | 2 +- docs/model-sources/providers/minimax/AUDIT.md | 23 + .../model-sources/providers/minimax/README.md | 2 +- .../providers/minimax/SOURCES.md | 8 +- .../minimax/models/minimax-m2.1-highspeed.md | 14 +- .../providers/minimax/models/minimax-m2.1.md | 14 +- .../minimax/models/minimax-m2.5-highspeed.md | 14 +- .../providers/minimax/models/minimax-m2.5.md | 14 +- .../minimax/models/minimax-m2.7-highspeed.md | 23 +- .../providers/minimax/models/minimax-m2.7.md | 25 +- .../providers/minimax/models/minimax-m3.md | 16 +- .../minimax/models/music-2.5--da64d60f.md | 8 +- .../providers/minimax/models/music-2.5.md | 8 +- .../providers/minimax/models/music-2.6.md | 8 +- .../providers/minimax/models/music-cover.md | 8 +- docs/model-sources/providers/mistral/AUDIT.md | 23 + .../model-sources/providers/mistral/README.md | 2 +- .../providers/mistral/SOURCES.md | 23 +- .../mistral/models/codestral-latest.md | 6 +- .../model-sources/providers/moonshot/AUDIT.md | 31 + .../providers/moonshot/README.md | 2 +- .../providers/moonshot/SOURCES.md | 48 +- .../providers/moonshot/models/kimi-k2.6.md | 10 +- .../models/kimi-k2.7-code-highspeed.md | 8 +- .../moonshot/models/kimi-k2.7-code.md | 10 +- .../providers/moonshot/models/kimi-k3.md | 11 +- .../providers/moorethread/AUDIT.md | 27 + .../providers/moorethread/README.md | 2 +- docs/model-sources/providers/ollama/AUDIT.md | 27 + docs/model-sources/providers/ollama/README.md | 2 +- docs/model-sources/providers/openai/AUDIT.md | 23 + docs/model-sources/providers/openai/README.md | 2 +- .../model-sources/providers/openai/SOURCES.md | 96 ++++ .../providers/openai/models/gpt-5.4-mini.md | 21 +- .../providers/openai/models/gpt-5.4-nano.md | 19 +- .../providers/openai/models/gpt-5.4-pro.md | 18 +- .../providers/openai/models/gpt-5.4.md | 21 +- .../providers/openai/models/gpt-5.5-pro.md | 18 +- .../providers/openai/models/gpt-5.5.md | 22 +- .../providers/openai/models/gpt-reserve.md | 8 +- .../providers/openrouter/AUDIT.md | 27 + .../providers/openrouter/README.md | 2 +- .../providers/openrouter/SOURCES.md | 2 +- .../providers/perplexity/AUDIT.md | 27 + .../providers/perplexity/README.md | 2 +- .../providers/perplexity/SOURCES.md | 2 +- .../providers/siliconflow/AUDIT.md | 27 + .../providers/siliconflow/README.md | 2 +- .../providers/stability/AUDIT.md | 23 + .../providers/stability/README.md | 2 +- .../providers/stability/SOURCES.md | 17 +- docs/model-sources/providers/stealth/AUDIT.md | 15 + .../model-sources/providers/stealth/README.md | 2 +- .../providers/stealth/SOURCES.md | 4 + .../providers/stealth/models/ox-alpha.md | 6 +- docs/model-sources/providers/tencent/AUDIT.md | 29 + .../model-sources/providers/tencent/README.md | 2 +- .../providers/tencent/models/hy4-preview.md | 4 +- .../providers/volcengine/AUDIT.md | 29 + .../providers/volcengine/README.md | 2 +- docs/model-sources/providers/xai/AUDIT.md | 18 + docs/model-sources/providers/xai/README.md | 2 +- docs/model-sources/providers/xai/SOURCES.md | 19 + .../providers/xai/models/grok-4.3.md | 17 +- docs/model-sources/providers/xiaomi/AUDIT.md | 31 + docs/model-sources/providers/xiaomi/README.md | 2 +- .../model-sources/providers/xiaomi/SOURCES.md | 57 ++ .../providers/xiaomi/models/mimo-v2.5-asr.md | 6 +- .../providers/xiaomi/models/mimo-v2.5-pro.md | 11 +- .../xiaomi/models/mimo-v2.5-tts-voiceclone.md | 6 +- .../models/mimo-v2.5-tts-voicedesign.md | 6 +- .../providers/xiaomi/models/mimo-v2.5-tts.md | 6 +- .../xiaomi/models/mimo-v2.6-flash.md | 6 +- .../xiaomi/models/mimo-v2.6-pro-ultraspeed.md | 6 +- .../providers/xiaomi/models/mimo-v2.6-pro.md | 6 +- docs/model-sources/providers/xunfei/AUDIT.md | 29 + docs/model-sources/providers/xunfei/README.md | 5 +- .../model-sources/providers/xunfei/SOURCES.md | 2 + .../xunfei/access/providers--xunfei-x2.md | 42 ++ .../xunfei/access/providers--xunfei.md | 3 +- .../providers/xunfei/models/spark-x.md | 36 +- docs/model-sources/providers/zhipu/AUDIT.md | 18 + docs/model-sources/providers/zhipu/README.md | 2 +- docs/model-sources/providers/zhipu/SOURCES.md | 34 ++ .../providers/zhipu/models/glm-5.2.md | 38 +- docs/runtime-sources/README.md | 23 + docs/runtime-sources/node-recommended.md | 17 + docs/runtime-sources/node-snapshot.md | 11 + .../package-managers/npm-snapshot.md | 11 + .../package-managers/pnpm-snapshot.md | 11 + .../package-managers/yarn-snapshot.md | 11 + docs/runtime-sources/python-fallback.md | 25 + docs/runtime-sources/python-recommended.md | 19 + manifest.json | 2 +- package.json | 8 +- runtimes/versions-fallback.json | 522 +++++++---------- scripts/update-runtime-catalog.mjs | 128 +++++ scripts/validate-data-sources.mjs | 91 +++ scripts/validate-runtime-sources.mjs | 62 ++ scripts/validate-sources.mjs | 2 +- scripts/validate.mjs | 1 + tools/README.md | 7 + ...pply_all_updates_and_build_diff_report.mjs | 240 +------- ..._all_updates_and_build_diff_report.mjs.txt | 237 ++++++++ .../archive/batch_update_model_jsons.mjs.txt | 277 +++++++++ .../generate_current_audit_artifacts.mjs.txt | 531 +++++++++++++++++ .../generate_field_tables_per_json.mjs.txt | 371 ++++++++++++ tools/batch_update_model_jsons.mjs | 280 +-------- tools/generate_current_audit_artifacts.mjs | 534 +----------------- tools/generate_field_tables_per_json.mjs | 374 +----------- 208 files changed, 5313 insertions(+), 2285 deletions(-) create mode 100644 __tests__/data-completion.test.mjs create mode 100644 __tests__/reasoning-lifecycle.test.mjs create mode 100644 __tests__/runtime-catalog.test.mjs create mode 100644 __tests__/supplier-contract-updates.test.mjs create mode 100644 __tests__/validate-data-sources.test.mjs create mode 100644 __tests__/validate-runtime-sources.test.mjs create mode 100644 __tests__/vendor-interface-boundaries.test.mjs create mode 100644 compute/providers/xunfei-x2.json create mode 100644 docs/data-maintenance/CLIENT-DEPENDENCIES.md create mode 100644 docs/data-maintenance/PLAN.md create mode 100644 docs/data-maintenance/RESULTS.md create mode 100644 docs/data-sources/README.md create mode 100644 docs/data-sources/api-providers/brave.md create mode 100644 docs/data-sources/api-providers/configured-vision-anthropic.md create mode 100644 docs/data-sources/api-providers/configured-vision-openai.md create mode 100644 docs/data-sources/api-providers/doubao-search-global.md create mode 100644 docs/data-sources/api-providers/serper.md create mode 100644 docs/data-sources/api-providers/tavily.md create mode 100644 docs/data-sources/policies/pricing.md create mode 100644 docs/data-sources/policies/service-map.md create mode 100644 docs/model-sources/providers/alibaba/AUDIT.md create mode 100644 docs/model-sources/providers/anthropic/AUDIT.md create mode 100644 docs/model-sources/providers/baichuan/AUDIT.md create mode 100644 docs/model-sources/providers/baidu/AUDIT.md create mode 100644 docs/model-sources/providers/cohere/AUDIT.md create mode 100644 docs/model-sources/providers/cohere/models/north-mini-code-1-0.md create mode 100644 docs/model-sources/providers/cohere/models/north-small-translate-1-0.md create mode 100644 docs/model-sources/providers/deepseek/AUDIT.md create mode 100644 docs/model-sources/providers/github-copilot/AUDIT.md create mode 100644 docs/model-sources/providers/google/AUDIT.md create mode 100644 docs/model-sources/providers/infini/AUDIT.md create mode 100644 docs/model-sources/providers/kling/AUDIT.md create mode 100644 docs/model-sources/providers/kwai/AUDIT.md create mode 100644 docs/model-sources/providers/minimax/AUDIT.md create mode 100644 docs/model-sources/providers/mistral/AUDIT.md create mode 100644 docs/model-sources/providers/moonshot/AUDIT.md create mode 100644 docs/model-sources/providers/moorethread/AUDIT.md create mode 100644 docs/model-sources/providers/ollama/AUDIT.md create mode 100644 docs/model-sources/providers/openai/AUDIT.md create mode 100644 docs/model-sources/providers/openrouter/AUDIT.md create mode 100644 docs/model-sources/providers/perplexity/AUDIT.md create mode 100644 docs/model-sources/providers/siliconflow/AUDIT.md create mode 100644 docs/model-sources/providers/stability/AUDIT.md create mode 100644 docs/model-sources/providers/stealth/AUDIT.md create mode 100644 docs/model-sources/providers/tencent/AUDIT.md create mode 100644 docs/model-sources/providers/volcengine/AUDIT.md create mode 100644 docs/model-sources/providers/xai/AUDIT.md create mode 100644 docs/model-sources/providers/xiaomi/AUDIT.md create mode 100644 docs/model-sources/providers/xunfei/AUDIT.md create mode 100644 docs/model-sources/providers/xunfei/access/providers--xunfei-x2.md create mode 100644 docs/model-sources/providers/zhipu/AUDIT.md create mode 100644 docs/runtime-sources/README.md create mode 100644 docs/runtime-sources/node-recommended.md create mode 100644 docs/runtime-sources/node-snapshot.md create mode 100644 docs/runtime-sources/package-managers/npm-snapshot.md create mode 100644 docs/runtime-sources/package-managers/pnpm-snapshot.md create mode 100644 docs/runtime-sources/package-managers/yarn-snapshot.md create mode 100644 docs/runtime-sources/python-fallback.md create mode 100644 docs/runtime-sources/python-recommended.md create mode 100644 scripts/update-runtime-catalog.mjs create mode 100644 scripts/validate-data-sources.mjs create mode 100644 scripts/validate-runtime-sources.mjs create mode 100644 tools/README.md create mode 100644 tools/archive/apply_all_updates_and_build_diff_report.mjs.txt create mode 100644 tools/archive/batch_update_model_jsons.mjs.txt create mode 100644 tools/archive/generate_current_audit_artifacts.mjs.txt create mode 100644 tools/archive/generate_field_tables_per_json.mjs.txt diff --git a/AGENTS.md b/AGENTS.md index cc9a276..fbb5a49 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -62,6 +62,8 @@ - 基于已有文件增量编辑,保留既有证据、日期、待核实项和历史说明。批量迁移目录只能迁移记录,不能凭迁移提高核验状态或刷新核验日期。 - 同步单模型参数详情、字段→官网引用、核验状态和模型指纹;平台字段变化时更新单接入面文件及平台指纹。禁止只换指纹来掩盖未重新核实的数据。 - `partial` 只核实列出的字段,`pending` 尚缺字段级证据,`historical` 仅作历史兼容。来源目录读取失败、返回壳或需要权限时如实记录,不用第三方补数。 +- 修改共享规格时同步更新 `compute/model-specs/_index.json` 的数据批次说明;已核客户端使用该索引 mtime 失效规格缓存,仅修改单个规格文件可能不触发重读。 +- 非模型官方 API 契约与本仓定价/默认策略分别记录在 `docs/data-sources`;运行时官方目录、归档摘要及 Hatch pin 记录在 `docs/runtime-sources`。离线来源校验只验证配置与记录一致,联网刷新和安装/账号验收分别进行。 - 数据变化时基于最新远端版本递增 `manifest.json#presetDataVersion` 并更新日期;仅文档结构/工作规范调整不改变预设数据版本。 - 禁止将 API Key、密码、Token、私有运行时配置写入聊天、文档、日志或源码。来源链接不含凭据,官网内容只保存必要摘要/指纹与核验结论。 @@ -69,6 +71,8 @@ ```bash npm run validate:sources +npm run validate:data-sources +npm run validate:runtimes npm run validate npm test git diff --check diff --git a/__tests__/data-completion.test.mjs b/__tests__/data-completion.test.mjs new file mode 100644 index 0000000..722db10 --- /dev/null +++ b/__tests__/data-completion.test.mjs @@ -0,0 +1,39 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { readFileSync, readdirSync } from 'node:fs' +const read = file => JSON.parse(readFileSync(new URL(`../${file}`, import.meta.url), 'utf8')) + +test('Spark X2 must not inherit Ultra endpoint or X1.5 output limits', () => { + const old = read('compute/providers/xunfei.json') + const x2 = read('compute/providers/xunfei-x2.json') + assert.ok(old.models.some(model => model.modelName === '4.0Ultra')) + assert.ok(!old.models.some(model => model.modelName === 'spark-x')) + assert.ok(old.tombstones.includes('spark-x')) + assert.equal(x2.baseUrl, 'https://spark-api-open.xf-yun.com/x2') + const model = x2.models.find(model => model.modelName === 'spark-x') + assert.equal(model.maxOutputTokens, 131072) + assert.ok(model.capabilities.includes('tool_use')) + assert.ok(read('compute/providers/_index.json').order.includes('xunfei-x2')) +}) +test('Anthropic API defaults do not retain contradictory legacy flat effort', () => { + for (const config of ['anthropic', 'anthropic-claude']) { + const models = read(`compute/providers/${config}.json`).models + for (const model of models) assert.equal(model.extra?.defaultEffort, undefined) + for (const id of ['claude-opus-5', 'claude-sonnet-5', 'claude-sonnet-5-5']) { + assert.equal(models.find(model => model.modelName === id).extra.reasoning.defaultEffort, 'high') + } + assert.equal(models.find(model => model.modelName === 'claude-opus-5-5').extra.reasoning.defaultEffort, 'medium') + } +}) +test('all published reasoning contracts use consumed fields after migration', () => { + for (const folder of ['providers', 'coding-plans', 'model-specs']) { + for (const name of readdirSync(new URL(`../compute/${folder}/`, import.meta.url)).filter(name => name.endsWith('.json') && name !== '_index.json')) { + const config = read(`compute/${folder}/${name}`) + for (const model of config.models ?? config.specs) { + const extra = model.spec?.extra ?? model.extra ?? {} + assert.equal(extra.reasoningEffort, undefined, `${folder}/${name}: ${model.modelName ?? model.id}`) + assert.equal(extra.defaultReasoningEffort, undefined) + } + } + } +}) diff --git a/__tests__/reasoning-lifecycle.test.mjs b/__tests__/reasoning-lifecycle.test.mjs new file mode 100644 index 0000000..3fb1a2d --- /dev/null +++ b/__tests__/reasoning-lifecycle.test.mjs @@ -0,0 +1,26 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { readFileSync } from 'node:fs' +const read = (name) => JSON.parse(readFileSync(new URL(`../${name}`, import.meta.url), 'utf8')) +test('verified API effort fields are client-readable and Pro defaults remain distinct', () => { + const rows = read('compute/providers/openai.json').models + for (const id of ['gpt-5.5', 'gpt-5.5-pro', 'gpt-5.4', 'gpt-5.4-pro', 'gpt-5.4-mini', 'gpt-5.4-nano']) { + const row = rows.find((x) => x.modelName === id) + assert.deepEqual(row.extra.reasoning.supportedEfforts, id.endsWith('-pro') + ? ['medium', 'high', 'xhigh'] + : ['none', 'low', 'medium', 'high', 'xhigh']) + assert.equal(row.extra.reasoningEffort, undefined) + assert.equal(row.extra.defaultReasoningEffort, undefined) + if (id.endsWith('-pro')) assert.equal(row.extra.responsesOnly, true) + } + assert.equal(rows.find((x) => x.modelName === 'gpt-5.4-pro').extra.reasoning.defaultEffort, 'medium') + assert.equal(rows.find((x) => x.modelName === 'gpt-5.5-pro').extra.reasoning.defaultEffort, 'high') +}) +test('provisional and historical identities cannot become automatic official models', () => { + const reserve = read('compute/model-specs/openai.json').specs.find((x) => x.id === 'gpt-reserve') + assert.ok(reserve) + assert.equal(reserve.routing.eligibleForAgent, false) + const ox = read('compute/model-specs/stealth.json').specs.find((x) => x.id === 'ox-alpha') + assert.deepEqual(ox.match.exact, ['ox-alpha', 'stealth/ox-alpha']) + assert.equal(ox.spec.extra.modelOrigin, undefined) +}) diff --git a/__tests__/runtime-catalog.test.mjs b/__tests__/runtime-catalog.test.mjs new file mode 100644 index 0000000..c852d91 --- /dev/null +++ b/__tests__/runtime-catalog.test.mjs @@ -0,0 +1,50 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { readFileSync } from 'node:fs' +import { selectNodeVersions, selectPackageReleases, verifyRecommended } from '../scripts/update-runtime-catalog.mjs' + +const now = '2026-10-03T12:00:00Z' +test('runtime snapshot excludes future, prerelease and monorepo library releases', () => { + const rows = [ + { tag_name: 'config-v11.2.0', published_at: now }, + { tag_name: 'v12.3.0-beta.1', published_at: now }, + { tag_name: 'v12.2.0', published_at: '2026-09-30T00:00:00Z' }, + { tag_name: 'v12.3.0', published_at: '2026-10-04T00:00:00Z' }, + { tag_name: 'v12.1.0', published_at: now, prerelease: true }, + ] + assert.deepEqual(selectPackageReleases(rows, 'npm', now), [{ tag_name: 'v12.2.0', created_at: '2026-09-30T00:00:00Z' }]) + assert.deepEqual(selectPackageReleases([{ tag_name: '@yarnpkg/cli/4.18.1', published_at: now }, { tag_name: '@yarnpkg/core/4.18.1', published_at: now }], 'yarn', now), [{ tag_name: 'v4.18.1', created_at: now }]) +}) +test('Node snapshot caps each major and excludes future/pre-release entries', () => { + const rows = ['v26.10.0', 'v26.9.0', 'v26.8.2', 'v26.8.1', 'v24.21.0', 'v24.22.0-rc1', 'v15.0.0'].map(version => ({ version, date: '2026-09-30' })) + rows.unshift({ version: 'v27.0.0', date: '2026-10-10' }) + assert.deepEqual(selectNodeVersions(rows, now).map(row => row.version), ['v26.10.0', 'v26.9.0', 'v26.8.2', 'v24.21.0']) +}) +test('recommended verifier rejects mismatched digest and cross-platform archive', () => { + const r = JSON.parse(readFileSync(new URL('../runtimes/recommended.json', import.meta.url))) + const nodes = [{ version: `v${r.node.version}`, lts: r.node.ltsCodename, date: '2026-09-07' }] + const sums = Object.entries(r.node.archives).map(([key, path]) => `${r.node.sha256[key]} ${path.split('/').at(-1)}`).join('\n') + const release = { published_at: '2026-10-01T22:37:31Z', tag_name: r.python.distTag, assets: Object.entries(r.python.archives).map(([key, path]) => ({ name: path.split('/').at(-1), state: 'uploaded', digest: `sha256:${r.python.sha256[key]}` })) } + verifyRecommended(r, nodes, sums, release, now) + assert.throws(() => verifyRecommended(r, nodes, sums, { ...release, published_at: '2026-10-04T00:00:00Z' }, now), /future publication/) + assert.throws(() => verifyRecommended(r, nodes, sums, { ...release, published_at: undefined }, now), /unpublished/) + assert.throws(() => verifyRecommended(r, [{ ...nodes[0], date: '2026-10-04' }], sums, release, now), /future publication/) + const badDigest = structuredClone(r) + badDigest.node.sha256['linux-x64'] = '0'.repeat(64) + assert.throws(() => verifyRecommended(badDigest, nodes, sums, release, now), /digest mismatch/) + const badPlatform = structuredClone(r) + badPlatform.python.archives['linux-arm64'] = r.python.archives['linux-x64'] + assert.throws(() => verifyRecommended(badPlatform, nodes, sums, release, now), /Unsafe Python archive/) +}) +test('each refreshed runtime catalog snapshot matches its documented fingerprint', async () => { + const { createHash } = await import('node:crypto') + const fallback = JSON.parse(readFileSync(new URL('../runtimes/versions-fallback.json', import.meta.url))) + for (const name of ['node', 'npm', 'pnpm', 'yarn']) { + const rows = name === 'node' ? fallback.node : fallback.pkgManagers[name] + const path = name === 'node' ? 'node-snapshot.md' : `package-managers/${name}-snapshot.md` + const doc = readFileSync(new URL(`../docs/runtime-sources/${path}`, import.meta.url), 'utf8') + const hash = createHash('sha256').update(JSON.stringify(rows)).digest('hex') + assert.ok(doc.includes(hash), `${name}: stale provenance fingerprint`) + assert.ok(doc.includes(fallback.generatedAt), `${name}: stale provenance date`) + } +}) diff --git a/__tests__/supplier-contract-updates.test.mjs b/__tests__/supplier-contract-updates.test.mjs new file mode 100644 index 0000000..d51b6d1 --- /dev/null +++ b/__tests__/supplier-contract-updates.test.mjs @@ -0,0 +1,47 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { readFileSync, readdirSync } from 'node:fs' +import { fileURLToPath } from 'node:url' +import { join } from 'node:path' +import { parseSourcePage } from '../scripts/validate-sources.mjs' + +const root = fileURLToPath(new URL('../', import.meta.url)) +const read = path => JSON.parse(readFileSync(join(root, path), 'utf8')) +test('Kimi domestic token prices remain distinct from write TTL and subscription prices', () => { + const provider = read('compute/providers/moonshot.json') + const model = provider.models.find(item => item.modelName === 'kimi-k3') + assert.equal(provider.priceCurrency, 'CNY') + assert.deepEqual([model.inputPrice, model.outputPrice, model.extra.cacheHitPrice], [20, 100, 2]) + assert.equal(model.maxOutputTokens, 1048576) + assert.match(model.extra.pricingNotes, /TTL 5min 20, TTL 1h 40/) + const page = parseSourcePage(readFileSync(join(root, 'docs/model-sources/providers/moonshot/models/kimi-k3.md'), 'utf8')) + const proof = page.records.find(item => item.config === 'compute/providers/moonshot.json').fieldSources + for (const field of ['inputPrice', 'outputPrice', 'extra.cacheHitPrice']) assert.ok(proof.some(item => item.field === field && item.source === 'kimi-pricing')) +}) +test('Xiaomi normal API prices do not use batch rates or ASR duration as token prices', () => { + const provider = read('compute/providers/xiaomi.json') + const old = provider.models.find(item => item.modelName === 'mimo-v2.5-pro') + assert.deepEqual([old.inputPrice, old.outputPrice, old.extra.cachedInputPrice], [3, 6, 0.025]) + const asr = provider.models.find(item => item.modelName === 'mimo-v2.5-asr') + assert.equal(asr.inputPrice, undefined) + assert.equal(asr.outputPrice, undefined) + const fast = provider.models.find(item => item.modelName === 'mimo-v2.6-pro-ultraspeed') + assert.deepEqual([fast.inputPrice, fast.outputPrice], [30, 60]) +}) +test('Baidu Coding Plan does not inherit native ERNIE vision or obsolete quota multipliers', () => { + const plan = read('compute/coding-plans/baidu-coding.json') + assert.equal(plan.models.some(item => item.capabilities?.includes('vision')), false) + const glm = plan.models.find(item => item.modelName === 'glm-5.1') + assert.match(glm.description, /高峰抵扣 ×4 \/ 低峰 ×3/) + assert.ok(read('compute/providers/baidu.json').models.find(item => item.modelName === 'ernie-5.0').capabilities.includes('vision')) +}) +test('JavaScript shell pages cannot silently become verified Volcengine parameters', () => { + const directory = join(root, 'docs/model-sources/providers/volcengine/models') + for (const file of readdirSync(directory)) { + const page = parseSourcePage(readFileSync(join(directory, file), 'utf8')) + for (const record of page.records) { + assert.equal(record.status, 'pending') + assert.deepEqual(record.fieldSources, []) + } + } +}) diff --git a/__tests__/validate-data-sources.test.mjs b/__tests__/validate-data-sources.test.mjs new file mode 100644 index 0000000..1c2168c --- /dev/null +++ b/__tests__/validate-data-sources.test.mjs @@ -0,0 +1,67 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { cpSync, mkdtempSync, readFileSync, writeFileSync, rmSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { spawnSync } from 'node:child_process' +import { validateDataSources } from '../scripts/validate-data-sources.mjs' + +const repo = fileURLToPath(new URL('../', import.meta.url)) +function fixture(run) { + const root = mkdtempSync(join(tmpdir(), 'data-contract-')) + for (const path of ['docs/data-sources', 'api-providers', 'compute/providers']) cpSync(join(repo, path), join(root, path), { recursive: true }) + for (const file of ['pricing.json', 'service-map.json']) cpSync(join(repo, 'compute', file), join(root, 'compute', file)) + try { run(root) } finally { rmSync(root, { recursive: true, force: true }) } +} +function change(root, path, mutate) { + const file = join(root, path), data = JSON.parse(readFileSync(file, 'utf8')) + mutate(data) + writeFileSync(file, JSON.stringify(data)) +} +test('non-model source records cover current policy and API configuration', () => { + assert.deepEqual(validateDataSources(repo), { errors: [], records: 8 }) +}) +test('API authentication and result mapping changes require contract review', () => fixture(root => { + change(root, 'api-providers/web-search/tavily.json', data => { data.auth.type = 'none'; data.response.resultsPath = 'wrong' }) + assert.match(validateDataSources(root).errors.join('\n'), /contract drift: auth/) +})) +test('new API provider must have its own source record', () => fixture(root => { + cpSync(join(root, 'api-providers/web-search/tavily.json'), join(root, 'api-providers/web-search/new.json')) + assert.match(validateDataSources(root).errors.join('\n'), /missing source record: api-providers\/web-search\/new.json/) +})) +test('pricing assumptions cannot drift without policy record update', () => fixture(root => { + change(root, 'compute/pricing.json', data => { data.usdToCny = 8 }) + assert.match(validateDataSources(root).errors.join('\n'), /contract drift: usdToCny/) +})) +test('default mappings cannot reference absent models', () => fixture(root => { + change(root, 'compute/service-map.json', data => { data.chat.modelName = 'nonexistent' }) + assert.match(validateDataSources(root).errors.join('\n'), /unresolved route chat/) +})) +test('changing a default to an existing model still requires a policy record update', () => fixture(root => { + change(root, 'compute/service-map.json', data => { data.chat.modelName = 'gpt-5.5' }) + assert.match(validateDataSources(root).errors.join('\n'), /routing policy drift/) +})) +test('third-party hosts cannot be presented as official evidence', () => fixture(root => { + const path = join(root, 'docs/data-sources/api-providers/tavily.md') + writeFileSync(path, readFileSync(path, 'utf8').replace('https://docs.tavily.com/', 'https://third-party.example/')) + assert.match(validateDataSources(root).errors.join('\n'), /unapproved source URL/) +})) +test('an official entry cannot redirect verification to a third-party site', () => fixture(root => { + const path = join(root, 'docs/data-sources/api-providers/tavily.md') + writeFileSync(path, readFileSync(path, 'utf8').replace('"resolvedUrl": "https://docs.tavily.com/', '"resolvedUrl": "https://third-party.example/')) + assert.match(validateDataSources(root).errors.join('\n'), /unapproved resolved source URL/) +})) +test('a page shell cannot prove verified API fields', () => fixture(root => { + const path = join(root, 'docs/data-sources/api-providers/tavily.md') + writeFileSync(path, readFileSync(path, 'utf8').replace('"retrieval": "fetched"', '"retrieval": "shell"')) + assert.match(validateDataSources(root).errors.join('\n'), /verified field without fetched source/) +})) +test('retired ZenMux tools fail before reading or writing data', () => { + for (const entry of ['batch_update_model_jsons', 'apply_all_updates_and_build_diff_report', 'generate_current_audit_artifacts', 'generate_field_tables_per_json']) { + const result = spawnSync(process.execPath, [join(repo, 'tools', `${entry}.mjs`)], { encoding: 'utf8', env: { ...process.env, CONFIG_CENTER_ROOT: '/nonexistent-root', ZENMUX_FILE: '/nonexistent-snapshot' } }) + assert.equal(result.status, 1) + assert.match(result.stderr, /retired/) + assert.doesNotMatch(result.stderr, /ENOENT/) + } +}) diff --git a/__tests__/validate-runtime-sources.test.mjs b/__tests__/validate-runtime-sources.test.mjs new file mode 100644 index 0000000..bfa07bb --- /dev/null +++ b/__tests__/validate-runtime-sources.test.mjs @@ -0,0 +1,43 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { cpSync, mkdtempSync, readFileSync, writeFileSync, rmSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { validateRuntimeSources } from '../scripts/validate-runtime-sources.mjs' +const repo = fileURLToPath(new URL('../', import.meta.url)) +function fixture(run) { + const root = mkdtempSync(join(tmpdir(), 'runtime-provenance-')) + for (const path of ['docs/runtime-sources', 'runtimes']) cpSync(join(repo, path), join(root, path), { recursive: true }) + try { run(root) } finally { rmSync(root, { recursive: true, force: true }) } +} +function change(root, path, mutate) { + const file = join(root, path), data = JSON.parse(readFileSync(file, 'utf8')) + mutate(data) + writeFileSync(file, JSON.stringify(data)) +} +test('runtime documentation matches current recommended archives and fallback rows', () => { + assert.deepEqual(validateRuntimeSources(repo), { errors: [] }) +}) +test('recommended checksum or version cannot change without source table review', () => fixture(root => { + change(root, 'runtimes/recommended.json', data => { data.node.sha256['linux-x64'] = '0'.repeat(64); data.python.version = '3.14.9' }) + const errors = validateRuntimeSources(root).errors.join('\n') + assert.match(errors, /node: recommended archive\/hash table drift/) + assert.match(errors, /python: recommended version drift/) +})) +test('offline snapshot data and Hatch pin cannot drift from source records', () => fixture(root => { + change(root, 'runtimes/versions-fallback.json', data => { data.node[0].version = 'v26.11.0'; data.python[0].version = '3.7.10' }) + const errors = validateRuntimeSources(root).errors.join('\n') + assert.match(errors, /node: snapshot fingerprint drift/) + assert.match(errors, /node: first version drift/) + assert.match(errors, /python: Hatch pin table drift/) +})) +test('runtime metadata guards dates, counts, LTS and standalone tag', () => fixture(root => { + change(root, 'runtimes/versions-fallback.json', data => { data.generatedAt = '2099-01-01T00:00:00Z'; data.pkgManagers.npm.pop() }) + change(root, 'runtimes/recommended.json', data => { data.node.ltsCodename = 'Future'; data.python.distTag = '20990101' }) + const errors = validateRuntimeSources(root).errors.join('\n') + assert.match(errors, /future generatedAt/) + assert.match(errors, /npm: snapshot count drift/) + assert.match(errors, /node: recommended LTS drift/) + assert.match(errors, /python: recommended distTag drift/) +})) diff --git a/__tests__/validate.test.mjs b/__tests__/validate.test.mjs index c645ff1..3acee37 100644 --- a/__tests__/validate.test.mjs +++ b/__tests__/validate.test.mjs @@ -937,7 +937,9 @@ describe('真实数据全量校验', () => { assert.equal(kimi.extra.reasoning.defaultEffort, 'max') assert.deepEqual(kimiSpec.routing.reasoning.supportedModes, ['auto', 'low', 'high', 'max']) assert.equal(kimi.maxOutputTokens, 1048576) - assert.equal(kimi.inputPrice, undefined, '不把国际美元价混写到国内人民币 Provider') + assert.equal(kimi.inputPrice, 20, '采用国内官网人民币单价,不换算国际美元价') + assert.equal(kimi.outputPrice, 100) + assert.equal(kimi.extra.cacheHitPrice, 2) const previewId = 'MiniMax-M3.1-Flash-Preview' const preview = findModel('coding-plans', 'minimax-coding', previewId) assert.equal(preview.extra.thinkingOnly, true) @@ -1064,7 +1066,7 @@ describe('真实数据全量校验', () => { ) } - assert.deepEqual(actualProviders.sort(), Object.keys(expectedCurrencies).sort()) + assert.deepEqual([...new Set(actualProviders)].sort(), Object.keys(expectedCurrencies).sort()) }) it('MiniMax 应使用国内开放平台人民币价', () => { diff --git a/__tests__/vendor-interface-boundaries.test.mjs b/__tests__/vendor-interface-boundaries.test.mjs new file mode 100644 index 0000000..f52d289 --- /dev/null +++ b/__tests__/vendor-interface-boundaries.test.mjs @@ -0,0 +1,31 @@ +import { test } from 'node:test' +import assert from 'node:assert/strict' +import { readFileSync } from 'node:fs' +const read = (path) => JSON.parse(readFileSync(new URL(`../${path}`, import.meta.url), 'utf8')) +test('Cohere compatibility provider excludes native rerank and tombstones old preset', () => { + const d = read('compute/providers/cohere.json') + assert.ok(d.tombstones.includes('rerank-v3.5')) + assert.equal(d.models.some((r) => r.serviceType.includes('rerank')), false) + assert.equal(read('compute/model-specs/cohere.json').specs.find((r) => r.id === 'rerank-v3.5').spec.contextWindow, 4096) +}) +test('MiniMax SDK text-only M2 models cannot advertise image/video input', () => { + for (const path of ['compute/providers/minimax.json', 'compute/coding-plans/minimax-coding.json', 'compute/model-specs/minimax.json']) { + const d = read(path) + for (const row of d.models ?? d.specs) { + if (!/^MiniMax-M2(?:\.|$)/.test(row.modelName ?? row.id)) continue + const caps = (row.spec ?? row).capabilities + assert.equal(caps.some((v) => ['vision', 'image_understanding', 'video_understanding'].includes(v)), false) + } + } + assert.equal(read('compute/model-specs/minimax.json').specs.find((r) => r.id === 'MiniMax-M3').spec.contextWindow, 1000000) +}) +test('North canonical IDs match official API IDs without broad alias inheritance', () => { + const rows = read('compute/model-specs/cohere.json').specs + assert.equal(rows.some((r) => r.id === 'north-mini-code'), false) + const mini = rows.find((r) => r.id === 'north-mini-code-1-0') + assert.deepEqual(mini.match.exact, ['north-mini-code-1-0', 'north-mini-code']) + assert.equal(mini.match.patterns, undefined) + assert.equal(mini.spec.supportsReasoning, undefined) + assert.deepEqual(rows.find((r) => r.id === 'north-small-translate-1-0').match.exact, ['north-small-translate-1-0']) + assert.equal(read('compute/providers/cohere.json').models.some((r) => r.modelName.startsWith('north-')), false) +}) diff --git a/compute/coding-plans/baidu-coding.json b/compute/coding-plans/baidu-coding.json index 47a2da5..88890c1 100644 --- a/compute/coding-plans/baidu-coding.json +++ b/compute/coding-plans/baidu-coding.json @@ -72,11 +72,10 @@ "serviceType": [ "chat" ], - "description": "百度 ERNIE 4.5 Turbo(千帆 Coding Plan 渠道)", + "description": "百度 ERNIE 4.5 Turbo(千帆 Coding Plan 渠道);套餐当前不支持图像理解", "capabilities": [ "chat", "code", - "vision", "fast" ], "source": "preset" @@ -102,7 +101,7 @@ "serviceType": [ "chat" ], - "description": "智谱 GLM-5.1(千帆 Coding Plan 渠道),倍率 ×6", + "description": "智谱 GLM-5.1(千帆 Coding Plan 渠道),高峰抵扣 ×4 / 低峰 ×3;高峰时段随流量动态调整", "capabilities": [ "chat", "reasoning", diff --git a/compute/coding-plans/dashscope-token-plan.json b/compute/coding-plans/dashscope-token-plan.json index 800d0a9..a189baf 100644 --- a/compute/coding-plans/dashscope-token-plan.json +++ b/compute/coding-plans/dashscope-token-plan.json @@ -303,10 +303,6 @@ "extra": { "supportsThinking": true, "thinkingDefault": true, - "reasoningEffort": [ - "high", - "max" - ], "reasoning": { "supportedEfforts": [ "high", diff --git a/compute/coding-plans/minimax-coding.json b/compute/coding-plans/minimax-coding.json index d0f4360..8257ba4 100644 --- a/compute/coding-plans/minimax-coding.json +++ b/compute/coding-plans/minimax-coding.json @@ -100,8 +100,7 @@ "chat", "reasoning", "code", - "tool_use", - "vision" + "tool_use" ], "source": "preset" }, @@ -119,7 +118,6 @@ "reasoning", "code", "tool_use", - "vision", "fast" ], "source": "preset" diff --git a/compute/coding-plans/zhipu-coding.json b/compute/coding-plans/zhipu-coding.json index 94a45a7..0b4951d 100644 --- a/compute/coding-plans/zhipu-coding.json +++ b/compute/coding-plans/zhipu-coding.json @@ -130,9 +130,8 @@ ], "extra": { "codingPlanLongContextModelId": "glm-5.2[1m]", - "reasoningEffort": { - "default": "max", - "supported": [ + "reasoning": { + "supportedEfforts": [ "max", "xhigh", "high", @@ -140,7 +139,8 @@ "low", "minimal", "none" - ] + ], + "defaultEffort": "max" } }, "source": "preset" diff --git a/compute/model-specs/_index.json b/compute/model-specs/_index.json index 565e610..db5d991 100644 --- a/compute/model-specs/_index.json +++ b/compute/model-specs/_index.json @@ -1,5 +1,5 @@ { - "description": "模型规格库加载顺序索引,以及智能路由三档的同域定义。模型级路由策略仅写入各 ModelSpec 的 routing 字段,不另建 smart-routing 目录。", + "description": "模型规格库加载顺序索引,以及智能路由三档的同域定义。模型级路由策略仅写入各 ModelSpec 的 routing 字段,不另建 smart-routing 目录。 数据批次 126:官方字段复核与临时、历史规格边界。", "order": [ "anthropic", "openai", @@ -31,21 +31,33 @@ "label": "旗舰", "labelEn": "Flagship", "description": "最高能力,适合复杂推理、关键交付和长程智能体任务。", - "fallbackOrder": ["flagship", "balanced", "lightweight"] + "fallbackOrder": [ + "flagship", + "balanced", + "lightweight" + ] }, { "id": "balanced", "label": "均衡", "labelEn": "Balanced", "description": "质量、速度与成本平衡,适合大多数日常任务。", - "fallbackOrder": ["balanced", "flagship", "lightweight"] + "fallbackOrder": [ + "balanced", + "flagship", + "lightweight" + ] }, { "id": "lightweight", "label": "轻量", "labelEn": "Lightweight", "description": "优先低延迟与低成本,适合明确、短链路和批量任务。", - "fallbackOrder": ["lightweight", "balanced", "flagship"] + "fallbackOrder": [ + "lightweight", + "balanced", + "flagship" + ] } ] } diff --git a/compute/model-specs/cohere.json b/compute/model-specs/cohere.json index 2fb46cb..f9beef7 100644 --- a/compute/model-specs/cohere.json +++ b/compute/model-specs/cohere.json @@ -137,15 +137,13 @@ } }, { - "id": "north-mini-code", + "id": "north-mini-code-1-0", "displayName": "North Mini Code", - "family": "north", + "family": "north-mini-code-1-0", "match": { "exact": [ + "north-mini-code-1-0", "north-mini-code" - ], - "patterns": [ - "north-mini-code*" ] }, "spec": { @@ -159,8 +157,27 @@ "serviceType": [ "chat" ], - "supportsReasoning": true, - "description": "Cohere North 系列首发编程模型" + "description": "Cohere North Mini Code 1.0,原厂API精确ID为north-mini-code-1-0;north-mini-code仅保留本仓历史配置匹配,不声明原厂接受该简称" + } + }, + { + "id": "north-small-translate-1-0", + "displayName": "North Small Translate 1.0", + "family": "north-small-translate-1-0", + "match": { + "exact": [ + "north-small-translate-1-0" + ] + }, + "spec": { + "serviceType": [ + "chat" + ], + "capabilities": [ + "chat", + "multilingual" + ], + "description": "Cohere原厂机器翻译模型,支持50多种语言;官网窗口与输出为16k简写,本轮不猜测精确整数。只登记共享规格,原生接入与账号权限需独立验证" } }, { @@ -240,7 +257,16 @@ "serviceType": [ "embedding" ], - "description": "Cohere 最新 Embedding 模型,128K 上下文,多语言支持" + "description": "Cohere 最新 Embedding 模型,128K 上下文,多语言支持", + "extra": { + "dimensions": [ + 256, + 512, + 1024, + 1536 + ], + "defaultDimension": 1536 + } } }, { diff --git a/compute/model-specs/deepseek.json b/compute/model-specs/deepseek.json index 62bb6fd..e006210 100644 --- a/compute/model-specs/deepseek.json +++ b/compute/model-specs/deepseek.json @@ -280,11 +280,7 @@ "supportsReasoning": true, "extra": { "supportsThinking": true, - "thinkingDefault": true, - "reasoningEffort": [ - "high", - "max" - ] + "thinkingDefault": true }, "description": "DeepSeek V4 Flash 0731 固定版本,100 万上下文" }, diff --git a/compute/model-specs/minimax.json b/compute/model-specs/minimax.json index c64bb41..d0a59df 100644 --- a/compute/model-specs/minimax.json +++ b/compute/model-specs/minimax.json @@ -94,7 +94,7 @@ ] }, "spec": { - "contextWindow": 1048576, + "contextWindow": 1000000, "maxOutputTokens": 512000, "capabilities": [ "chat", @@ -142,8 +142,7 @@ "chat", "reasoning", "code", - "tool_use", - "vision" + "tool_use" ], "serviceType": [ "chat", @@ -210,8 +209,7 @@ "reasoning", "code", "tool_use", - "fast", - "vision" + "fast" ], "serviceType": [ "fast" @@ -692,7 +690,7 @@ "serviceType": [ "music_gen" ], - "description": "MiniMax AI 音乐生成模型,支持音乐灵感描述和歌词输入" + "description": "MiniMax AI 音乐生成模型,支持音乐灵感描述和歌词输入;音乐付费 API 自2026-08-20起仅历史付费用户可继续使用,不向新用户开放;免费音乐接口已停止服务" } }, { @@ -714,7 +712,7 @@ "serviceType": [ "music_gen" ], - "description": "MiniMax AI 音乐生成(2.5+ 版),音质提升" + "description": "MiniMax AI 音乐生成(2.5+ 版),音质提升;音乐付费 API 自2026-08-20起仅历史付费用户可继续使用,不向新用户开放;免费音乐接口已停止服务" } }, { @@ -736,7 +734,7 @@ "serviceType": [ "music_gen" ], - "description": "MiniMax AI 音乐生成(2.5 版)" + "description": "MiniMax AI 音乐生成(2.5 版);音乐付费 API 自2026-08-20起仅历史付费用户可继续使用,不向新用户开放;免费音乐接口已停止服务" } }, { @@ -757,7 +755,7 @@ "serviceType": [ "music_gen" ], - "description": "MiniMax AI 翻唱模型,基于参考音频生成翻唱版本" + "description": "MiniMax AI 翻唱模型,基于参考音频生成翻唱版本;音乐付费 API 自2026-08-20起仅历史付费用户可继续使用,不向新用户开放;免费音乐接口已停止服务" } } ] diff --git a/compute/model-specs/openai.json b/compute/model-specs/openai.json index 769cc5a..b257694 100644 --- a/compute/model-specs/openai.json +++ b/compute/model-specs/openai.json @@ -245,12 +245,12 @@ "chat" ], "supportsReasoning": true, - "description": "参数暂按 GPT-5.6 Luna 配置,待官方规格确认" + "description": "参数暂按 GPT-5.6 Luna 配置,待官方规格确认;保留手动选择,未经官方规格核验前不参与 Agent 自动选型" }, "routing": { "tier": "lightweight", "routingPriority": 10, - "eligibleForAgent": true, + "eligibleForAgent": false, "defaultReference": false, "reasoning": { "supportedModes": [ diff --git a/compute/model-specs/stealth.json b/compute/model-specs/stealth.json index c5c904b..a672513 100644 --- a/compute/model-specs/stealth.json +++ b/compute/model-specs/stealth.json @@ -3,7 +3,7 @@ "specs": [ { "id": "ox-alpha", - "displayName": "GLM-5.3-Flash (Ox Alpha)", + "displayName": "Ox Alpha (Historical)", "family": "ox-alpha", "match": { "exact": [ @@ -34,15 +34,10 @@ "defaultTemperature": 1, "defaultTopP": 0.95, "supportsReasoning": true, - "description": "Ox Alpha 是智谱 GLM-5.3-Flash 的匿名发布别名(2026-08-26 揭晓)。原生多模态推理模型,面向高效编码与长程 Agent 任务,100 万上下文;强制思考,无法关闭", + "description": "Ox Alpha 历史匿名模型兼容记录;当前官方目录未列出。旧记录曾关联 GLM-5.3-Flash,但本轮未取得官方身份揭示证据,不下发未证实的原厂身份映射;历史参数不代表当前可用性", "extra": { "thinkingDefault": true, - "thinkingOnly": true, - "modelOrigin": { - "vendor": "zhipu", - "canonicalModelId": "glm-5.3-flash", - "family": "glm-5.3-flash" - } + "thinkingOnly": true }, "releasedAt": "2026-08-21" } diff --git a/compute/model-specs/xunfei.json b/compute/model-specs/xunfei.json index 0bfa50b..b5470c1 100644 --- a/compute/model-specs/xunfei.json +++ b/compute/model-specs/xunfei.json @@ -3,32 +3,30 @@ "specs": [ { "id": "spark-x", - "displayName": "讯飞星火 X1", + "displayName": "讯飞星火 X2", "family": "spark-x", "match": { "exact": [ "spark-x" - ], - "patterns": [ - "spark-x*" ] }, "spec": { "contextWindow": 65536, - "maxOutputTokens": 128000, + "maxOutputTokens": 131072, "capabilities": [ "chat", "reasoning", "deep_thinking", "math", - "code" + "code", + "tool_use" ], "serviceType": [ "reasoning" ], "defaultTemperature": 1.2, "supportsReasoning": true, - "description": "讯飞深度推理模型,64K 输入/128K 输出,支持思考模式与函数调用" + "description": "讯飞星火 X2,/x2 接入合同:输入 65536 / 输出 131072;spark-x 同名在 /v2 上指向 X1.5,不能复用本输出限制" } }, { diff --git a/compute/providers/_index.json b/compute/providers/_index.json index af997d6..3d85aa3 100644 --- a/compute/providers/_index.json +++ b/compute/providers/_index.json @@ -18,6 +18,7 @@ "baidu", "tencent", "xunfei", + "xunfei-x2", "siliconflow", "local-whisper", "ollama", diff --git a/compute/providers/anthropic-claude.json b/compute/providers/anthropic-claude.json index ff45479..1437919 100644 --- a/compute/providers/anthropic-claude.json +++ b/compute/providers/anthropic-claude.json @@ -135,7 +135,7 @@ "xhigh", "max" ], - "defaultEffort": "xhigh" + "defaultEffort": "high" }, "thinkingRoundTrip": { "enabled": true, @@ -217,7 +217,7 @@ "xhigh", "max" ], - "defaultEffort": "xhigh" + "defaultEffort": "high" }, "thinkingRoundTrip": { "enabled": true, diff --git a/compute/providers/anthropic.json b/compute/providers/anthropic.json index 86d6e38..a4f8621 100644 --- a/compute/providers/anthropic.json +++ b/compute/providers/anthropic.json @@ -179,9 +179,8 @@ "xhigh", "max" ], - "defaultEffort": "xhigh" + "defaultEffort": "high" }, - "defaultEffort": "xhigh", "samplingParametersDeprecated": true, "pricingNotes": "Prices are per 1M tokens. Full 1M context is billed at standard pricing." } @@ -239,7 +238,6 @@ ], "defaultEffort": "high" }, - "defaultEffort": "xhigh", "samplingParametersDeprecated": true, "forcedToolChoiceUnsupported": true, "promptCacheMinTokens": 512 @@ -296,9 +294,8 @@ "xhigh", "max" ], - "defaultEffort": "xhigh" + "defaultEffort": "high" }, - "defaultEffort": "xhigh", "samplingParametersDeprecated": true } } diff --git a/compute/providers/cohere.json b/compute/providers/cohere.json index 512bb65..9d91f6e 100644 --- a/compute/providers/cohere.json +++ b/compute/providers/cohere.json @@ -93,7 +93,7 @@ "long_context" ], "inputPrice": 2.5, - "outputPrice": 10.0, + "outputPrice": 10, "defaultTemperature": 0.3, "defaultTopP": 0.75, "extra": { @@ -143,25 +143,9 @@ "defaultDimension": 1536, "pricingNotes": "Embedding models are priced by embedded tokens; price is per 1M tokens. Compatibility API 不接受 dimensions 参数;返回默认维度,多维度选择需原生 Embed API。" } - }, - { - "modelName": "rerank-v3.5", - "displayName": "Rerank V3.5", - "serviceType": [ - "rerank" - ], - "description": "Cohere 语义重排序模型,用于检索结果精排,默认单文档截断 4096 token", - "contextWindow": 4096, - "maxOutputTokens": 0, - "capabilities": [ - "rerank", - "semantic_reranking" - ], - "inputPrice": 2.0, - "outputPrice": 0, - "extra": { - "pricingNotes": "Cohere Rerank is priced by search units, not input/output tokens; one search unit is one query with up to 100 documents. The token price fields are retained for schema compatibility." - } } + ], + "tombstones": [ + "rerank-v3.5" ] } diff --git a/compute/providers/minimax.json b/compute/providers/minimax.json index 5b3fddb..51c7b81 100644 --- a/compute/providers/minimax.json +++ b/compute/providers/minimax.json @@ -91,8 +91,7 @@ "chat", "reasoning", "code", - "tool_use", - "vision" + "tool_use" ], "inputPrice": 2.1, "outputPrice": 8.4, @@ -118,8 +117,7 @@ "reasoning", "code", "tool_use", - "fast", - "vision" + "fast" ], "inputPrice": 4.2, "outputPrice": 16.8, @@ -630,7 +628,7 @@ "serviceType": [ "music_gen" ], - "description": "MiniMax AI 音乐生成模型,支持音乐灵感描述和歌词输入,可生成带人声或纯音乐", + "description": "MiniMax AI 音乐生成模型,支持音乐灵感描述和歌词输入,可生成带人声或纯音乐;音乐付费 API 自2026-08-20起仅历史付费用户可继续使用,不向新用户开放;免费音乐接口已停止服务", "capabilities": [ "music_generation", "lyrics_input", @@ -665,7 +663,7 @@ "serviceType": [ "music_gen" ], - "description": "MiniMax AI 音乐生成模型(2.5+ 版),音质提升", + "description": "MiniMax AI 音乐生成模型(2.5+ 版),音质提升;音乐付费 API 自2026-08-20起仅历史付费用户可继续使用,不向新用户开放;免费音乐接口已停止服务", "capabilities": [ "music_generation", "lyrics_input", @@ -686,7 +684,7 @@ "serviceType": [ "music_gen" ], - "description": "MiniMax AI 音乐生成模型(2.5 版)", + "description": "MiniMax AI 音乐生成模型(2.5 版);音乐付费 API 自2026-08-20起仅历史付费用户可继续使用,不向新用户开放;免费音乐接口已停止服务", "capabilities": [ "music_generation", "lyrics_input", @@ -707,7 +705,7 @@ "serviceType": [ "music_gen" ], - "description": "MiniMax AI 翻唱模型,基于参考音频生成翻唱版本,支持修改歌词", + "description": "MiniMax AI 翻唱模型,基于参考音频生成翻唱版本,支持修改歌词;音乐付费 API 自2026-08-20起仅历史付费用户可继续使用,不向新用户开放;免费音乐接口已停止服务", "capabilities": [ "music_generation", "cover", diff --git a/compute/providers/moonshot.json b/compute/providers/moonshot.json index 54f8749..fdc956c 100644 --- a/compute/providers/moonshot.json +++ b/compute/providers/moonshot.json @@ -59,9 +59,12 @@ ], "defaultEffort": "max" }, - "pricingNotes": "国内官方价格表当前未返回模型单价;不将国际美元价格换算为国内人民币价格。", - "samplingParametersDeprecated": true - } + "pricingNotes": "CNY per 1M tokens: input 20, output 100, cache hit 2. Cache writes: TTL 5min 20, TTL 1h 40; recorded separately from cache-hit billing.", + "samplingParametersDeprecated": true, + "cacheHitPrice": 2 + }, + "inputPrice": 20, + "outputPrice": 100 }, { "modelName": "kimi-k2.7-code", diff --git a/compute/providers/openai.json b/compute/providers/openai.json index a72a974..d616d21 100644 --- a/compute/providers/openai.json +++ b/compute/providers/openai.json @@ -264,15 +264,17 @@ "toolType": "web_search" }, "cachedInputPrice": 0.5, - "reasoningEffort": [ - "none", - "low", - "medium", - "high", - "xhigh" - ], - "defaultReasoningEffort": "medium", - "pricingNotes": "Prices are per 1M tokens; long-context requests may use higher-tier pricing per OpenAI pricing page." + "pricingNotes": "Prices are per 1M tokens; long-context requests may use higher-tier pricing per OpenAI pricing page.", + "reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "defaultEffort": "medium" + } } }, { @@ -304,13 +306,15 @@ "toolType": "web_search" }, "responsesOnly": true, - "reasoningEffort": [ - "medium", - "high", - "xhigh" - ], - "defaultReasoningEffort": "high", - "pricingNotes": "No cached-input discount is listed for GPT-5.5 Pro on the official pricing page." + "pricingNotes": "No cached-input discount is listed for GPT-5.5 Pro on the official pricing page.", + "reasoning": { + "supportedEfforts": [ + "medium", + "high", + "xhigh" + ], + "defaultEffort": "high" + } } }, { @@ -342,13 +346,16 @@ "toolType": "web_search" }, "cachedInputPrice": 0.25, - "reasoningEffort": [ - "none", - "low", - "medium", - "high" - ], - "pricingNotes": "Prices are per 1M tokens; long-context requests may use higher-tier pricing per OpenAI pricing page." + "pricingNotes": "Prices are per 1M tokens; long-context requests may use higher-tier pricing per OpenAI pricing page.", + "reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } } }, { @@ -379,12 +386,14 @@ "toolType": "web_search" }, "responsesOnly": true, - "reasoningEffort": [ - "medium", - "high", - "xhigh" - ], - "defaultReasoningEffort": "high" + "reasoning": { + "supportedEfforts": [ + "medium", + "high", + "xhigh" + ], + "defaultEffort": "medium" + } } }, { @@ -418,12 +427,15 @@ "toolType": "web_search" }, "cachedInputPrice": 0.075, - "reasoningEffort": [ - "none", - "low", - "medium", - "high" - ] + "reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } } }, { @@ -454,11 +466,15 @@ "toolType": "web_search" }, "cachedInputPrice": 0.02, - "reasoningEffort": [ - "none", - "low", - "medium" - ] + "reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } } }, { diff --git a/compute/providers/xai.json b/compute/providers/xai.json index a28ad73..3e8be38 100644 --- a/compute/providers/xai.json +++ b/compute/providers/xai.json @@ -71,16 +71,19 @@ "defaultTopP": 1, "extra": { "cachedInputPrice": 0.2, - "reasoningEffort": [ - "none", - "low", - "medium", - "high" - ], "aliases": [ "grok-4.3-latest", "grok-latest" - ] + ], + "reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high" + ], + "defaultEffort": "low" + } } }, { diff --git a/compute/providers/xiaomi.json b/compute/providers/xiaomi.json index e49e4f7..6924abb 100644 --- a/compute/providers/xiaomi.json +++ b/compute/providers/xiaomi.json @@ -157,7 +157,11 @@ "tool_use", "code" ], - "extra": {} + "extra": { + "cachedInputPrice": 0.025 + }, + "inputPrice": 3, + "outputPrice": 6 }, { "modelName": "mimo-v2.5-tts", diff --git a/compute/providers/xunfei-x2.json b/compute/providers/xunfei-x2.json new file mode 100644 index 0000000..1b374c7 --- /dev/null +++ b/compute/providers/xunfei-x2.json @@ -0,0 +1,41 @@ +{ + "id": "provider-xunfei-x2-001", + "provider": "xunfei", + "label": "讯飞星火 X2", + "baseUrl": "https://spark-api-open.xf-yun.com/x2", + "apiFormat": "openai-completions", + "apiKeyRef": "xunfei", + "apiKeyVerified": false, + "enabled": false, + "status": "unconfigured", + "priceCurrency": "CNY", + "services": [ + "chat", + "reasoning" + ], + "models": [ + { + "modelName": "spark-x", + "displayName": "讯飞星火 X2", + "serviceType": [ + "reasoning" + ], + "description": "讯飞深度推理模型(X2),输入64K/输出128K,支持思考模式与函数调用", + "contextWindow": 65536, + "maxOutputTokens": 131072, + "capabilities": [ + "chat", + "reasoning", + "deep_thinking", + "math", + "code", + "tool_use" + ], + "defaultTemperature": 1.2, + "defaultTopP": 0.95, + "extra": { + "pricingNote": "官方公开文档说明模型价格以控制台及实际购买页为准,未公开固定 token 单价" + } + } + ] +} diff --git a/compute/providers/xunfei.json b/compute/providers/xunfei.json index c236129..f609f3c 100644 --- a/compute/providers/xunfei.json +++ b/compute/providers/xunfei.json @@ -9,32 +9,17 @@ "enabled": false, "status": "unconfigured", "priceCurrency": "CNY", - "services": ["chat", "reasoning"], + "services": [ + "chat", + "reasoning" + ], "models": [ - { - "modelName": "spark-x", - "displayName": "讯飞星火 X1", - "serviceType": ["reasoning"], - "description": "讯飞深度推理模型(X2),输入64K/输出128K,支持思考模式与函数调用", - "contextWindow": 65536, - "maxOutputTokens": 128000, - "capabilities": [ - "chat", - "reasoning", - "deep_thinking", - "math", - "code" - ], - "defaultTemperature": 1.2, - "defaultTopP": 0.95, - "extra": { - "pricingNote": "官方公开文档说明模型价格以控制台及实际购买页为准,未公开固定 token 单价" - } - }, { "modelName": "4.0Ultra", "displayName": "讯飞星火 4.0 Ultra", - "serviceType": ["chat"], + "serviceType": [ + "chat" + ], "description": "讯飞星火最强通用模型,支持推理、代码和工具调用", "contextWindow": 32768, "maxOutputTokens": 32768, @@ -50,5 +35,8 @@ "pricingNote": "官方公开文档说明模型价格以控制台及实际购买页为准,未公开固定 token 单价" } } + ], + "tombstones": [ + "spark-x" ] } diff --git a/compute/providers/zhipu.json b/compute/providers/zhipu.json index 47ca552..80aa949 100644 --- a/compute/providers/zhipu.json +++ b/compute/providers/zhipu.json @@ -175,9 +175,8 @@ "thinking": { "default": "enabled" }, - "reasoningEffort": { - "default": "max", - "supported": [ + "reasoning": { + "supportedEfforts": [ "max", "xhigh", "high", @@ -185,7 +184,8 @@ "low", "minimal", "none" - ] + ], + "defaultEffort": "max" } } }, diff --git a/docs/README.md b/docs/README.md index 9958753..350888e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,3 +3,9 @@ - [模型来源分层导航](model-sources/README.md) - [来源维护规则](model-sources/MAINTENANCE.md) - [项目更新前核查清单](../AGENTS.md) + +- [数据维护计划](data-maintenance/PLAN.md) +- [本轮执行结果与剩余工作](data-maintenance/RESULTS.md) +- [客户端与账号验收依赖](data-maintenance/CLIENT-DEPENDENCIES.md) +- [非模型来源与策略](data-sources/README.md) +- [运行时官方来源](runtime-sources/README.md) diff --git a/docs/data-maintenance/CLIENT-DEPENDENCIES.md b/docs/data-maintenance/CLIENT-DEPENDENCIES.md new file mode 100644 index 0000000..70dd1f9 --- /dev/null +++ b/docs/data-maintenance/CLIENT-DEPENDENCIES.md @@ -0,0 +1,37 @@ +# 需要客户端或账号验收的数据任务 + +[维护计划](PLAN.md) · [执行结果](RESULTS.md) + +本轮只修改 config-center。以下事项不因单模型官网字段已核或本仓校验通过而视为客户端已实现。 + +## 原生协议接入 + +| 原厂/型号 | 本仓状态 | 实施步骤与验收条件 | +| --- | --- | --- | +| Google:gemini-3.8-flash-tts、gemini-3.8-flash-lite-tts | 原生语音型号仅共享规格 | 核音频响应和输入/输出独立预算;实现原生请求、音频解码、流式与声音参数;固定 fixture 后用授权账号验证,再设置已支持的客户端版本门槛并增加 Provider | +| Google:gemini-3.8-live、gemini-3.8-live-extended-thinking | 原生 Live 规格 | 核 WebSocket 会话、身份验证、实时输入/输出和中断;验证流式事件、断线重连及工具事件;不能放入普通 Chat Completions Provider | +| Google:gemini-3.5-transcribe、gemini-3.5-transcribe-live | 转写规格 | 实现文件/流式转写、语言检测、时间戳、说话人字段与错误处理;验收音频时长/格式/费用,不把它们当普通文本 Chat | +| MiniMax:MiniMax-H3、MiniMax-H3-Max | 视频 V2 共享规格 | 核 submit/query 原生任务、参数约束、时长/分辨率与下载结果;完成异步轮询和计费后单独接入,不通过 Anthropic Messages | +| Kling:kling-3.0-turbo | 新协议共享规格,官网入口页面壳 | 先获取可读取官方任务 API 合同,再实现 submit/query、凭据、视频参数和超时;既有 kling-v3 名称不证明新型号同协议 | +| Cohere:rerank-v3.5、rerank-v4.0-pro、rerank-v4.0-fast | 原生共享规格,兼容 Provider 不提供 Rerank | 核原生 /v2/rerank、query/documents/top_n/返回排序和 search unit 单位;从客户端计费到响应映射独立验收后再增加接入 | +| Cohere:Embed 4/5 的多模态与可选维度 | 原生能力与文本兼容端点分开 | 原生文本/图片/PDF输入、返回默认/指定维度和费用分别验收;兼容端点不发送 dimensions | +| Cohere:north-mini-code-1-0、north-small-translate-1-0 | 原厂精确 ID 共享规格 | 核原生 Chat 与兼容 API 开放名单和账号授权,验证窗口/输出明文整数;旧 north-mini-code 仅本仓历史匹配,不作为调用实参 | +| Stability:stable-audio-3.0 | 发布公告与共享规格 | 获取官方 API 身份、音频参数、输出形状和计价;授权账号验收后接入,不凭发布公告推算端点 | +| Tencent:hy4-preview | 原厂规格;OpenRouter 已有独立前缀接入 | 国内 Hunyuan、TokenHub、OpenRouter 的 ID/币种/窗口分别核;不把 Tencent 新闻价格直接填国内现有 Provider | +| Perplexity:Agent API | 旧 Sonar 同步/流式兼容保留 | 实现 /v1/agent 的 input/preset、typed output、search_results、工具/背景任务和费用;对照旧同步兼容响应回归,不能只换 model 字符串 | + +## 预算、安装和默认策略 + +| 事项 | 当前处理 | 后续完成条件 | +| --- | --- | --- | +| GPT-5.4 Mini/Nano 独立输入预算 | 总窗口不冒充最大输入,官方输入 272000/总窗口 400000 差异已记录 | 客户端独立输入预算字段及 schema 消费;先发布客户端再声明新字段,回归输入截断与输出预留 | +| GPT-5.4 系列默认 none | supportedEfforts 包含 none,defaultEffort 当前 frozen schema 不接受 none | 复核客户端默认推理模式及现有产品策略;按兼容规范发布支持 none 默认值的客户端,不能先扩本仓 enum | +| Python 推荐归档与 Hatch pin | 推荐 3.14.8 官网摘要真实;fallback 保留 Hatch 1.16.5 映射 3.14.0 | 首启导入、重复安装/更新幂等、路径识别及 minClientVersion 验收;不能为表面一致修改 pin 表 | +| 默认 service-map | 原默认保留,完整策略映射绑定校验 | 选取代表性任务与明确费用/延迟预算,比较同接入新旧模型、工具/模态、错误回退;记录测量日期和选择理由后更新默认 | +| 真实账号调用 | 本轮没有收费账号调用 | 获得对应账号授权后逐接入面做最小请求、流式、工具、推理、媒体任务及用量核对;保存不含凭据的结果摘要 | + +## 同步与字段移除边界 + +本轮对照 DesireCore 远端 main `412e05b043656d1f3ba2b56307ef5ceabbf8a77a`:预置模型合并会用新预置对象替换 preset 模型,保留用户覆写;保护 user-added/synced 模型。共享规格从官方目录重读并替换缓存,不是把 extra 逐键合并到旧规格。因此本轮不下发未证实的 Ox Alpha modelOrigin,未覆盖用户自建配置。 + +该版本共享规格缓存使用 `_index.json` 的 mtime 失效;本轮同时更新规格索引的批次说明以触发重读。以后修改共享规格时需一并更新索引,或客户端完成更细粒度的缓存失效;不同历史客户端不能据此宣布全部行为已验收。 diff --git a/docs/data-maintenance/PLAN.md b/docs/data-maintenance/PLAN.md new file mode 100644 index 0000000..99c6219 --- /dev/null +++ b/docs/data-maintenance/PLAN.md @@ -0,0 +1,34 @@ +# 数据维护闭环计划 + +核查基线:2026-10-03,远端 main 的 presetDataVersion 125。模型来源登记覆盖 619 条接入面记录,不能等同于 619 个独立模型或完整官网验收。 + +## 工作拆分与验收 + +| 工作线 | 现状与影响 | 实施范围 | 验收条件 | +| --- | --- | --- | --- | +| 推理合同迁移 | 14 个旧键客户端不读取;不同平台的档位不能共用 | Provider、套餐、共享规格、单模型来源及回归 | 官网核对后使用有效嵌套字段;不遗漏关闭思考限制;清除全部旧键警告 | +| 临时与历史规格 | GPT-Reserve 借用其他型号参数;Ox Alpha 身份映射待证实 | 临时参数、自动路由资格、历史身份说明 | 保留兼容边界,未证实数据不扩大自动选模;历史记录不冒充当前可用性 | +| 字段级官网核验 | 301 pending,258 条 partial 仅确认 ID | 每家供应商 SOURCES、单模型参数、接入面差异 | 实际读取官方内容;只提高有明确证据的字段;冲突/失败有逐项后续任务 | +| 原生协议接入 | 部分新音频、视频、Rerank 只有共享规格 | 本仓型号登记与客户端待办 | 标明协议、依赖、验收方法;未证实客户端支持前不向普通 Provider 上架 | +| 旧工具退出 | 第三方快照、模糊匹配、硬编码路径可覆盖数据 | tools 历史脚本与维护入口 | 原入口不能覆写主数据;历史可追溯;新流程只以官方证据作为写入依据 | +| 非模型来源 | 汇率/加价属于本仓策略,搜索 API 契约未被模型来源门禁覆盖 | docs/data-sources、独立校验及回归 | 明确策略含义和官方合同;配置漂移、目录遗漏及错误引用能被检查发现 | +| 运行时目录 | recommended 与 fallback 更新时间及内容不同 | runtimes、官方来源、可重复刷新脚本 | 核实两者的不同语义;官网版本/下载/摘要有效;刷新不随意更改客户端工具版本 | +| 默认服务选择 | 新型号发布未必适合替换默认 | service-map 选择依据与后续验收清单 | 引用可解析;默认保留/升级有明确策略,需性能和费用证据时不凭营销直接替换 | + +## 并行边界 + +- 推理与历史工作线独占 OpenAI、xAI、智谱、DeepSeek 和匿名历史规格;百炼套餐中对应 DeepSeek 单条来源由该工作线同步。 +- 工具与非模型工作线独占 tools、docs/data-sources、独立校验、package scripts 和对应测试。 +- 运行时工作线独占 runtimes、docs/runtime-sources、刷新脚本和对应测试。 +- 主工作线负责其余供应商的官网核验、总体来源规则、未完成接入清单、manifest 与最终 review。 +- 所有工作使用同一 checkout,保留 logs 等无关文件;不并行修改同一文件,不在子任务中提交。 + +## 合并工作线后的门禁 + +1. 对照最新版 origin/main 确认没有混入其他变更,审查差异中的数据是否有字段级依据。 +2. 运行来源校验、完整配置校验、测试和 git diff --check。 +3. 只有预设数据变化才递增 manifest;文档和工具改造不单独递增。 +4. 逐项报告完成内容、证据限制和跨仓依赖;官网读取、Schema 通过不代替真实账号调用。 +5. 按已有授权完成提交、PR、受保护合并及远端 CI 复查。 + +后续结果见 [本轮执行记录](RESULTS.md)。每家供应商的具体证据仍保存在各自来源目录,不在此重复拼成总证据表。 diff --git a/docs/data-maintenance/RESULTS.md b/docs/data-maintenance/RESULTS.md new file mode 100644 index 0000000..74cd4ef --- /dev/null +++ b/docs/data-maintenance/RESULTS.md @@ -0,0 +1,46 @@ +# 2026-10-03 数据维护执行记录 + +[详细计划](PLAN.md) · [客户端与账号依赖](CLIENT-DEPENDENCIES.md) · [供应商来源导航](../model-sources/README.md) + +预设数据批次:125 → 126。主工作线与三个并行子任务共同核验,最后统一 review。所有事实主证据为官方文档、官方 API 或官方仓库;旧第三方工具不再参与主数据写入。 + +## 数据变化 + +本轮相对 main 更新 39 条既有接入面/共享规格记录,新增 3 条、移除 3 条;这是配置记录数,不是独立模型数。身份迁移和端点分离计入新增/移除。 + +| 范围 | 修改内容 | 验收与边界 | +| --- | --- | --- | +| OpenAI、xAI、智谱、百炼 | 清除 14 处不被读取的旧推理键;改为嵌套 supportedEfforts/defaultEffort;补 GPT-5.4 系列 xhigh;GPT-5.4 Pro 默认 medium | 逐接入面官网核实,回归比较完整档位;Grok 同页 xhigh 冲突不擅自增加;none 默认受 frozen schema 限制 | +| Anthropic | Opus 5、Sonnet 5 默认 xhigh → high;清除三个扁平 defaultEffort,含 Sonnet 5.5 的冲突旧默认 | 直连默认与共享路由策略分开;补单型号规格与 effort 官方来源,订阅权限仍另核 | +| 临时/匿名身份 | GPT-Reserve 保留手动使用、关闭 Agent 自动资格;Ox Alpha 移除未证实原厂身份映射 | 未获取正式参数不删除用户要求的临时配置,也不让假定参数扩大自动路由 | +| 讯飞 | 新增独立 /x2 Provider;旧 /v1 保留 Ultra 并墓碑移除错放的 spark-x;X2 展示名与输出上限 131072、函数调用标签同步 | 官网确认 X2/X1.5 同名不同端点;旧账号自建模型受客户端保护;真实请求与 thinking 转译待验收 | +| Kimi、小米 | K3 国内输入/输出/缓存命中 20/100/2 CNY 每百万 token;MiMo V2.5 Pro 3/6/0.025 补齐 | 国内官方价格,不换算国际美元;MiMo 保留到已记录的退役日,不提前删除 | +| 百度套餐 | 移除 ERNIE 4.5 套餐图像理解标签;GLM 5.1 抵扣说明由 ×6 改为高峰 ×4 /低峰 ×3 | 官方套餐 FAQ 与原厂 API 分开;不把套餐限制回写原厂能力 | +| MiniMax | M3 共享窗口 1048576 → 1000000;M2.7 API/套餐/规格移除误标 vision;补音乐存量用户资格说明 | M3 原有共享输出 512000 尚无本轮原厂证明;不将 OpenRouter 限制冒充原厂,也不删历史付费型号 | +| Cohere | 原生 Rerank3.5 从兼容 Provider 移除并墓碑保留;Embed4 原生维度补齐;North Mini 使用准确 ID,新增 North Small Translate 共享身份 | 原生模型未向普通兼容 Provider 强行上架;旧 North 简称仅作历史匹配,去掉宽泛 pattern | +| Google、Mistral | Google 九个单型号页补最大输出证据;Codestral 补官方价格来源 | 最大输入与总窗口不混用,尚未适配音频协议只保留共享规格 | +| 运行时 | 更新 Node/npm/pnpm/Yarn 官方离线目录;推荐六平台 Node、六平台 Python 档名/摘要核实 | Node 33 条,npm13/pnpm30/Yarn30;Python fallback 按内置 Hatch pin 保留;未下载全档或进行安装实测 | + +## 维护机制闭环 + +- 每家供应商均有独立 `AUDIT.md`,共 28 家;原字段级证明继续在单模型文件中维护,不集中复制成大表。 +- 来源记录仍覆盖 619 条。原 301 pending → 272,317 partial → 346,historical 保持 1。partial 中只确认 ID 的记录从 258 → 214;核实过其他字段的记录从 59 → 132,**仍不代表这些记录全部规格通过**。当前字段级引用 738 项。 +- 新增八份非模型政策/API 合同记录,区分产品策略与官方事实。来源保存真实读取日期、最终地址和内容摘要;页面壳与失败不能支持已核字段。默认映射完整快照受门禁保护,换成另一个有效型号也必须更新策略记录。 +- 运行时来源细分为推荐、Python pin、Node 与三个包管理器快照。离线门禁防止配置与文档漂移;联网更新脚本默认只读,显式 `--write` 才更新目录,读取/摘要失败时不写入。 +- 四个旧 ZenMux 入口显式失败,原文归档为 `.txt` 供追溯,避免第三方相似匹配再覆盖价格或窗口。 +- 共享规格索引同步更新批次说明,确保已核客户端能按索引 mtime 失效缓存;AGENTS.md 补充维护约束和全部来源校验命令。 + +## 尚未完成的工作 + +272 条 pending 仍缺字段证明,214 条 partial 仅确认身份。待办按各供应商 AUDIT 和单模型文件逐条处理:旧型号、套餐权限、国内/国际价格、独立输入输出预算、JS 页面壳与登录/账号目录均不能用其他平台参数代替。 + +跨仓依赖详见 [客户端与账号任务表](CLIENT-DEPENDENCIES.md),包含原生音频/视频/Rerank、Perplexity Agent API、独立输入预算、Python 安装契约和默认模型评估。本仓已经修正能由官方证据证明的问题;本轮没有进行收费模型调用、安装或默认模型性能评测,不将这些待办标为完成。 + +## 验证 + +- 完整配置校验:79 项通过,3 项跳过,0 项失败,旧推理字段告警为 0。 +- 模型来源:452 个机器记录页面、619 条记录,0 项失败。 +- 非模型来源:8 条政策/API 合同记录,0 项失败。 +- 运行时来源离线一致性:0 项失败。 +- 单元测试:118 项通过;回归覆盖端点分离、完整推理档位、临时身份、套餐模态、原生协议边界、来源跳转/页面壳、运行时摘要和未来日期。 +- `git diff --check` 通过。配置校验及测试不代表账号调用或安装验收。 diff --git a/docs/data-sources/README.md b/docs/data-sources/README.md new file mode 100644 index 0000000..0e5b45c --- /dev/null +++ b/docs/data-sources/README.md @@ -0,0 +1,16 @@ +# 非模型数据来源导航 + +模型事实见 [模型来源](../model-sources/README.md)。这里按政策和具体 API 接入拆分;不将产品决策伪装为官网事实。 + +- [计价策略](policies/pricing.md) +- [默认服务映射](policies/service-map.md) +- [Tavily](api-providers/tavily.md) +- [Brave](api-providers/brave.md) +- [Serper](api-providers/serper.md) +- [豆包搜索 Global](api-providers/doubao-search-global.md) +- [OpenAI 格式视觉](api-providers/configured-vision-openai.md) +- [Anthropic 格式视觉](api-providers/configured-vision-anthropic.md) + +`npm run validate:data-sources` 检查 API 接入覆盖、记录的合同字段与 JSON 一致、供应商官网归属、政策值以及默认映射引用。不检查账号可用性。官方证据不足仍为 pending;partial 仅证明 verifiedFields,且正文说明更细限制。运行时来源仍由其独立维护文档负责,不在此声称已覆盖。 + +每次 API 合同变化先读官方文档/官方仓库(记录最终 URL、日期、读取失败),保留未核项,再更新本页所属单接入文件。新接入必须建立对应文档。不得用更新 claims、日期或状态绕过复核。 diff --git a/docs/data-sources/api-providers/brave.md b/docs/data-sources/api-providers/brave.md new file mode 100644 index 0000000..b391509 --- /dev/null +++ b/docs/data-sources/api-providers/brave.md @@ -0,0 +1,55 @@ +# Brave Search API + +本轮读取失败,以下仅锁定现有待核合同,尚未证明字段有效。补官网正文并核实字段后再提升状态。 + +数据区中的 claims 是复核边界,pending 字段是当前配置快照,不能当官方证明。enabled/priority/timeout 是产品策略,未复制到合同中。更新合同必须重新读官方正文、记录实际证明字段;结构校验不等于账号可用。 + + +```json +{ + "kind": "api-contract", + "config": "api-providers/web-search/brave.json", + "checkedAt": "2026-10-03", + "status": "pending", + "sources": [ + { + "url": "https://api.search.brave.com/app/documentation/web-search/get-started", + "retrieval": "failed", + "checkedAt": "2026-10-03", + "resolvedUrl": null, + "contentSha256": null, + "failure": "HTTP Error 403: Forbidden" + } + ], + "verifiedFields": [], + "claims": { + "endpoint": "https://api.search.brave.com/res/v1/web/search", + "method": "GET", + "auth": { + "type": "header", + "headerName": "X-Subscription-Token", + "apiKeyRef": "brave" + }, + "request": { + "headers": { + "Accept": "application/json", + "Accept-Encoding": "gzip" + }, + "queryParams": { + "q": "${query}", + "count": "${maxResults}" + } + }, + "response": { + "resultsPath": "web.results", + "item": { + "titlePath": "title", + "urlPath": "url", + "snippetPath": "description", + "pageAgePath": "page_age" + } + } + } +} +``` + diff --git a/docs/data-sources/api-providers/configured-vision-anthropic.md b/docs/data-sources/api-providers/configured-vision-anthropic.md new file mode 100644 index 0000000..cfb66e3 --- /dev/null +++ b/docs/data-sources/api-providers/configured-vision-anthropic.md @@ -0,0 +1,69 @@ +# 视觉模型(Anthropic 兼容,复用默认映射) + +旧 docs.anthropic.com 跳转至此官方域名,正文证明 Messages 的 image/base64/media_type/data 结构;max_tokens=1024 是本仓输出预算策略,官网示例使用该值不证明它是默认或上限。认证、API 版本和 content.0.text 不因本篇已读而视作全部核验;任意网关仍需验收。 + +数据区中的 claims 是复核边界,pending 字段是当前配置快照,不能当官方证明。enabled/priority/timeout 是产品策略,未复制到合同中。更新合同必须重新读官方正文、记录实际证明字段;结构校验不等于账号可用。 + + +```json +{ + "kind": "api-contract", + "config": "api-providers/image-understanding/configured-vision-anthropic.json", + "checkedAt": "2026-10-03", + "status": "partial", + "sources": [ + { + "url": "https://platform.claude.com/docs/en/build-with-claude/vision", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "resolvedUrl": "https://platform.claude.com/docs/en/build-with-claude/vision", + "contentSha256": "b35b04f339283acf2d250590830e7c552575c27d78c9b694523a6417a7a58044" + } + ], + "verifiedFields": [ + "request.bodyTemplate.messages.0.content.0.type", + "request.bodyTemplate.messages.0.content.0.source.type" + ], + "claims": { + "endpoint": "${baseUrl}/messages", + "method": "POST", + "auth": { + "type": "header", + "headerName": "x-api-key" + }, + "request": { + "imageMode": "base64", + "headers": { + "anthropic-version": "2023-06-01" + }, + "bodyTemplate": { + "model": "${model}", + "max_tokens": 1024, + "messages": [ + { + "role": "user", + "content": [ + { + "type": "image", + "source": { + "type": "base64", + "media_type": "${imageMime}", + "data": "${imageBase64}" + } + }, + { + "type": "text", + "text": "${prompt}" + } + ] + } + ] + } + }, + "response": { + "textPath": "content.0.text" + } + } +} +``` + diff --git a/docs/data-sources/api-providers/configured-vision-openai.md b/docs/data-sources/api-providers/configured-vision-openai.md new file mode 100644 index 0000000..d772ae7 --- /dev/null +++ b/docs/data-sources/api-providers/configured-vision-openai.md @@ -0,0 +1,62 @@ +# 视觉模型(OpenAI 兼容,复用默认映射) + +OpenAI Docs 明示 Chat Completions 的 image_url 内容块与 choices.message.content。只证明 OpenAI 原生格式;任意兼容网关、所选模型和动态 baseUrl 需分别验收。 + +数据区中的 claims 是复核边界,pending 字段是当前配置快照,不能当官方证明。enabled/priority/timeout 是产品策略,未复制到合同中。更新合同必须重新读官方正文、记录实际证明字段;结构校验不等于账号可用。 + + +```json +{ + "kind": "api-contract", + "config": "api-providers/image-understanding/configured-vision-openai.json", + "checkedAt": "2026-10-03", + "status": "partial", + "sources": [ + { + "url": "https://developers.openai.com/api/docs/guides/images-vision", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "resolvedUrl": "https://developers.openai.com/api/docs/guides/images-vision", + "contentSha256": "be92335e88c4af71534c352bb82f67040afac9fc96bcef3c2b5a7a103fd5163a" + } + ], + "verifiedFields": [ + "request.bodyTemplate.messages.0.content.1.type", + "response.textPath" + ], + "claims": { + "endpoint": "${baseUrl}/chat/completions", + "method": "POST", + "auth": { + "type": "bearer" + }, + "request": { + "imageMode": "url", + "bodyTemplate": { + "model": "${model}", + "messages": [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "${prompt}" + }, + { + "type": "image_url", + "image_url": { + "url": "${imageUrl}" + } + } + ] + } + ] + } + }, + "response": { + "textPath": "choices.0.message.content" + } + } +} +``` + diff --git a/docs/data-sources/api-providers/doubao-search-global.md b/docs/data-sources/api-providers/doubao-search-global.md new file mode 100644 index 0000000..f46f71e --- /dev/null +++ b/docs/data-sources/api-providers/doubao-search-global.md @@ -0,0 +1,55 @@ +# 豆包搜索 Global + +火山文档读取失败;不能认定其证明 feedcoopapi 的合同。需确认该具体域名所属服务、地域、认证和结果映射。 + +数据区中的 claims 是复核边界,pending 字段是当前配置快照,不能当官方证明。enabled/priority/timeout 是产品策略,未复制到合同中。更新合同必须重新读官方正文、记录实际证明字段;结构校验不等于账号可用。 + + +```json +{ + "kind": "api-contract", + "config": "api-providers/web-search/doubao-search-global.json", + "checkedAt": "2026-10-03", + "status": "pending", + "sources": [ + { + "url": "https://www.volcengine.com/docs/85508/1650263", + "retrieval": "shell", + "checkedAt": "2026-10-03", + "resolvedUrl": "https://docs.volcengine.com/docs/NetworkedQAAgent/FusionInformationSearchAPI?lang=zh", + "contentSha256": "98f4de231487390a83d6929b01e41e83de77b884dccc3f93e2adeb8036eb1bcc" + } + ], + "verifiedFields": [], + "claims": { + "endpoint": "https://open.feedcoopapi.com/search_api/global_search", + "method": "POST", + "auth": { + "type": "bearer", + "apiKeyRef": "doubao-search-global" + }, + "request": { + "bodyTemplate": { + "Query": "${query}", + "SearchType": "web", + "DocCount": "${maxResults}", + "MaxSnippetLength": 500 + } + }, + "response": { + "resultsPath": "Result.Documents", + "item": { + "titlePath": "Title", + "urlPath": "Url", + "snippetPath": "Snippet.0.Text", + "pageAgePath": "DocumentInfo.PublishTime" + }, + "successCondition": { + "path": "Result.ErrorCode", + "equals": 0 + } + } + } +} +``` + diff --git a/docs/data-sources/api-providers/serper.md b/docs/data-sources/api-providers/serper.md new file mode 100644 index 0000000..d45534b --- /dev/null +++ b/docs/data-sources/api-providers/serper.md @@ -0,0 +1,49 @@ +# Serper + +首页可读,但未找到认证请求与完整响应契约,本轮不能据此确认 X-API-KEY、organic 等字段。需官方控制台文档或示例。 + +数据区中的 claims 是复核边界,pending 字段是当前配置快照,不能当官方证明。enabled/priority/timeout 是产品策略,未复制到合同中。更新合同必须重新读官方正文、记录实际证明字段;结构校验不等于账号可用。 + + +```json +{ + "kind": "api-contract", + "config": "api-providers/web-search/serper.json", + "checkedAt": "2026-10-03", + "status": "pending", + "sources": [ + { + "url": "https://serper.dev/", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "resolvedUrl": "https://serper.dev/", + "contentSha256": "ad5b407c075ef4357fc4674cafb1b215d2713dc17d65d0607504bfec29b62c6c" + } + ], + "verifiedFields": [], + "claims": { + "endpoint": "https://google.serper.dev/search", + "method": "POST", + "auth": { + "type": "header", + "headerName": "X-API-KEY", + "apiKeyRef": "serper" + }, + "request": { + "bodyTemplate": { + "q": "${query}", + "num": "${maxResults}" + } + }, + "response": { + "resultsPath": "organic", + "item": { + "titlePath": "title", + "urlPath": "link", + "snippetPath": "snippet" + } + } + } +} +``` + diff --git a/docs/data-sources/api-providers/tavily.md b/docs/data-sources/api-providers/tavily.md new file mode 100644 index 0000000..a222de9 --- /dev/null +++ b/docs/data-sources/api-providers/tavily.md @@ -0,0 +1,58 @@ +# Tavily + +官网明示 POST /search、Bearer、query/max_results/search_depth 与 results 的 title/url/content;本仓模板仍需客户端插值为正确类型。未进行账号调用。 + +数据区中的 claims 是复核边界,pending 字段是当前配置快照,不能当官方证明。enabled/priority/timeout 是产品策略,未复制到合同中。更新合同必须重新读官方正文、记录实际证明字段;结构校验不等于账号可用。 + + +```json +{ + "kind": "api-contract", + "config": "api-providers/web-search/tavily.json", + "checkedAt": "2026-10-03", + "status": "partial", + "sources": [ + { + "url": "https://docs.tavily.com/documentation/api-reference/endpoint/search", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "resolvedUrl": "https://docs.tavily.com/documentation/api-reference/endpoint/search", + "contentSha256": "66af3f0a8b6a72650ba5a1e99a8f72818dc2e8dab81ae8dcd88437330181f912" + } + ], + "verifiedFields": [ + "endpoint", + "method", + "auth.type", + "request.bodyTemplate.search_depth", + "response.resultsPath", + "response.item.titlePath", + "response.item.urlPath", + "response.item.snippetPath" + ], + "claims": { + "endpoint": "https://api.tavily.com/search", + "method": "POST", + "auth": { + "type": "bearer", + "apiKeyRef": "tavily" + }, + "request": { + "bodyTemplate": { + "query": "${query}", + "max_results": "${maxResults}", + "search_depth": "basic" + } + }, + "response": { + "resultsPath": "results", + "item": { + "titlePath": "title", + "urlPath": "url", + "snippetPath": "content" + } + } + } +} +``` + diff --git a/docs/data-sources/policies/pricing.md b/docs/data-sources/policies/pricing.md new file mode 100644 index 0000000..3bdf5ad --- /dev/null +++ b/docs/data-sources/policies/pricing.md @@ -0,0 +1,20 @@ +# 计价策略 + +markupRatio=1.5 为仓库产品加价系数;usdToCny=7.2 为现有固定美元折人民币结算假设,不能称为实时市场汇率,也不是供应商原价。历史批准依据与生效日期未记录,本次保留原值,不补造批准记录。 + +变更前确认结算负责人给出的系数、币种、是否追踪市场、取值来源/日期及生效范围;核对上下游舍入与单位,评估旧客户端影响并更新 manifest。每次计价变更和全供应商刷新时复查,本次未从汇率网站自动替换。 + + +```json +{ + "kind": "policy", + "config": "compute/pricing.json", + "checkedAt": "2026-10-03", + "status": "policy", + "claims": { + "markupRatio": 1.5, + "usdToCny": 7.2 + } +} +``` + diff --git a/docs/data-sources/policies/service-map.md b/docs/data-sources/policies/service-map.md new file mode 100644 index 0000000..65c03af --- /dev/null +++ b/docs/data-sources/policies/service-map.md @@ -0,0 +1,104 @@ +# 默认模型选择 + +默认映射属于本仓产品策略,最新型号不自动替换旧默认。所有本地 providerId/modelName 必须实际存在;云端动态目录例外逐项记录。引用校验不代表新模型质量、成本、延迟或协议实测。 + +当前保留 GPT-5.4 Mini/Nano、Sonnet 5、MiMo V2.5 等默认。下一次调整前对所选接入做质量、成本、延迟、工具/多模态和失败回退比较,登记选择理由与测量日期;没有客户端实测证据时不改变默认。新增型号、退役、端点迁移后触发复查。逐模型官方事实继续使用 ../../model-sources/README.md 的分供应商来源。 + + +```json +{ + "kind": "routing-policy", + "config": "compute/service-map.json", + "checkedAt": "2026-10-03", + "status": "policy", + "externalProviders": [ + { + "id": "desirecore-cloud", + "reason": "云端动态目录不在本仓 Provider 文件中,需部署方独立确认 summary 模型可用。" + } + ], + "claims": { + "chat": { + "modelName": "gpt-5.4-mini", + "providerId": "provider-openai-001" + }, + "reasoning": { + "modelName": "deepseek-flash", + "providerId": "provider-deepseek-001" + }, + "fast": { + "modelName": "gpt-5.4-nano", + "providerId": "provider-openai-001" + }, + "embedding": { + "modelName": "text-embedding-3-small", + "providerId": "provider-openai-001" + }, + "rerank": { + "modelName": "qwen3-rerank", + "providerId": "provider-dashscope-001" + }, + "vision": { + "modelName": "gpt-5.4-mini", + "providerId": "provider-openai-001" + }, + "tts": { + "modelName": "tts-1", + "providerId": "provider-openai-001" + }, + "asr": { + "modelName": "whisper-large-v3", + "providerId": "provider-local-whisper" + }, + "ocr": { + "modelName": "qwen3-vl-plus", + "providerId": "provider-dashscope-001" + }, + "responses": { + "modelName": "gpt-5.5", + "providerId": "provider-openai-001" + }, + "image_gen": { + "modelName": "image-01", + "providerId": "provider-minimax-001" + }, + "video_gen": { + "modelName": "MiniMax-Hailuo-2.3", + "providerId": "provider-minimax-001" + }, + "omni": { + "modelName": "gpt-realtime-2.1", + "providerId": "provider-openai-001" + }, + "voice_clone": { + "modelName": "cosyvoice-clone", + "providerId": "provider-dashscope-001" + }, + "realtime_voice": { + "modelName": "gpt-realtime-2.1", + "providerId": "provider-openai-001" + }, + "simultaneous_interpret": { + "modelName": "volc-simultaneous", + "providerId": "provider-volcengine-001" + }, + "translation": { + "modelName": "qwen-mt-plus", + "providerId": "provider-dashscope-001" + }, + "computer_use": { + "modelName": "claude-sonnet-5", + "providerId": "provider-anthropic-001" + }, + "music_gen": { + "modelName": "music-2.6", + "providerId": "provider-minimax-001" + }, + "summary": { + "modelName": "mimo-v2.5", + "providerId": "desirecore-cloud" + } + } +} +``` + diff --git a/docs/model-sources/MAINTENANCE.md b/docs/model-sources/MAINTENANCE.md index da68e17..f73a26c 100644 --- a/docs/model-sources/MAINTENANCE.md +++ b/docs/model-sources/MAINTENANCE.md @@ -5,10 +5,11 @@ ## 本轮核验范围 - 核验日期:2026-10-03。 -- 配置范围:28 个 Provider、11 个套餐、23 个共享规格文件。 +- 配置范围:29 个 Provider、11 个套餐、23 个共享规格文件。 - 当前模型记录:619 条(同一模型在不同接入面会分别计数)。 -- 317 条 `partial`:只核实表中列出的字段,可能仅确认官网出现该 ID;不是整条规格全通过。 -- 301 条 `pending`:登记官网入口,但尚未取得该条模型的字段级证明。 +- 346 条 `partial`:只核实表中列出的字段,可能仅确认官网出现该 ID;不是整条规格全通过。 +- 272 条 `pending`:登记官网入口,但尚未取得该条模型的字段级证明。 +- 346 条 partial 中,214 条仅确认 ID,132 条还核实过其他字段;仍不代表整条通过。 - 1 条 `historical`:匿名模型的历史兼容记录,不证明当前平台可用。 没有把所有存量数据写成已核实。当前确认的是本轮明确核对的字段、官网公共目录以及本地配置契约;没有执行逐供应商账号的收费模型调用。 diff --git a/docs/model-sources/providers/alibaba/AUDIT.md b/docs/model-sources/providers/alibaba/AUDIT.md new file mode 100644 index 0000000..69bc237 --- /dev/null +++ b/docs/model-sources/providers/alibaba/AUDIT.md @@ -0,0 +1,35 @@ +# alibaba:2026-10-03 字段复核与剩余过程 + +[官网证据](SOURCES.md) · [模型与接入导航](README.md) + +本轮实际读取模型选择页、qwen3.7-max详情、定价表相关文本。qwen3.7-max 明示上下文1000000、非思考输入991808/思考输入983616、输出131072、思维链262144;不是把最大输入当总窗口。价格表北京原价qwen3.8-max12/36 CNY/M,Prime24/72;地域/Batch/缓存分表不能混用。既有记录已有qwen3.7-max核心证明,不因重复读取提高其他型号状态。此工作流不自动改阿里套餐模型参数,避免把普通API价格或国际GLM合同复制到国内套餐。 + +下一步按北京/新加坡/国际站分别打开每个精确型号页,优先 qwen3.8-max/flash、qwen3.7-plus、音视频/图像型号;对Token Plan和Coding Plan独立确认ID/窗口/推理约束。以下pending和仅ID记录都仍缺字段级证明,定价入口大量型号出现不代表所有值已复核。 + +## 待核实队列 + +本轮收尾快照:118条接入面记录,15 pending,96条partial只核ID;同一模型可占多条,非独立型号数。partial是已列字段证明,不是全部通过。 + +### 尚无字段证明 + +- `compute/providers/dashscope.json`:`cosyvoice-clone`、`qwen-image-3.0`、`wan2.7-image`。 +- `compute/model-specs/qwen.json`:`cosyvoice-clone`、`qwen-image-3.0`、`qwen3-235b`、`qwen3-coder-480b`、`qwen3-coder`、`qwen3-max-trans`、`wan2.7-image`。 +- `compute/coding-plans/dashscope-token-plan.json`:`deepseek-v4-pro`、`glm-5.3`、`glm-5`、`wan2.7-image`。 +- `compute/coding-plans/dashscope-coding.json`:`glm-5`。 + +### 仅ID有证明 + +- `compute/providers/dashscope.json`:`cosyvoice-v2`、`happyhorse-1.0-i2v`、`happyhorse-1.0-r2v`、`happyhorse-1.0-t2v`、`paraformer-v2`、`qwen-image-2.0-pro`、`qwen-image-2.0`、`qwen-image-3.0-pro`、`qwen-long`、`qwen-mt-plus`、`qwen-omni-turbo`、`qwen3-rerank`、`qwen3-vl-flash`、`qwen3-vl-plus`、`qwen3.6-flash`、`qwen3.7-plus`、`qwen3.7-text-rerank`、`qwen3.8-flash`、`qwen3.8-max`、`text-embedding-v3`、`text-embedding-v4`、`wan2.2-t2i-flash`、`wan2.2-t2i-plus`、`wan2.6-t2i`、`wan2.6-t2v`、`wan2.7-image-pro`、`wan3.0-video-prime`、`wan3.0-video`。 +- `compute/model-specs/qwen.json`:`cosyvoice-v2`、`paraformer-v2`、`qwen-image-2.0-pro`、`qwen-image-2.0`、`qwen-image-3.0-pro`、`qwen-long`、`qwen-max`、`qwen-omni-turbo`、`qwen-plus`、`qwen-turbo`、`qwen3-max`、`qwen3-rerank`、`qwen3-vl-flash`、`qwen3-vl-plus`、`qwen3.5-27b`、`qwen3.5-35b-a3b`、`qwen3.5-plus`、`qwen3.6-flash`、`qwen3.6-plus`、`qwen3.7-plus`、`qwen3.7-text-embedding-flash`、`qwen3.7-text-embedding`、`qwen3.7-text-rerank`、`qwen3.8-flash`、`qwen3.8-max-preview`、`qwen3.8-max-prime`、`qwen3.8-max`、`text-embedding-v3`、`text-embedding-v4`、`wan2.2-t2i-flash`、`wan2.2-t2i-plus`、`wan2.6-t2i`、`wan2.6-t2v`、`wan2.7-image-pro`。 +- `compute/coding-plans/dashscope-token-plan.json`:`deepseek-v4-flash-0731`、`deepseek-v4-pro-0813`、`deepseek-v4.1-flash`、`glm-4.7`、`glm-5.2`、`happyhorse-1.1-i2v`、`happyhorse-1.1-r2v`、`happyhorse-1.1-t2v`、`kimi-k2.5`、`MiniMax-M2.5`、`qwen-image-3.0-pro`、`qwen3.6-flash`、`qwen3.6-plus`、`qwen3.7-plus`、`qwen3.8-flash`、`qwen3.8-max`、`wan2.7-image-pro`。 +- `compute/coding-plans/dashscope-coding.json`:`glm-4.7`、`kimi-k2.5`、`MiniMax-M2.5`、`qwen3-coder-next`、`qwen3-coder-plus`、`qwen3-max-2026-01-23`、`qwen3.5-plus`、`qwen3.6-plus`、`qwen3.7-plus`。 +- `compute/model-specs/happyhorse.json`:`happyhorse-1.0-i2v`、`happyhorse-1.0-r2v`、`happyhorse-1.0-t2v`、`happyhorse-1.1-i2v`、`happyhorse-1.1-r2v`、`happyhorse-1.1-t2v`。 +- `compute/model-specs/wan.json`:`wan3.0-video-prime`、`wan3.0-video`。 + +## 完成标准 + +逐条打开对应官网正文/官方API,按原厂、套餐、地域分别登记精确参数和单位;有差异才改canonical JSON,同步该模型详情、字段引用和指纹。保留未证实字段。运行来源/结构测试;协议改动需客户端和实际调用验收。没有账号授权,本轮未执行收费模型调用。 + +## 本轮最终记录统计 + +本仓记录 118 条:pending 15、partial 103、historical 0;partial 中仅 ID 证明 96 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/alibaba/README.md b/docs/model-sources/providers/alibaba/README.md index ef58b69..48d77dc 100644 --- a/docs/model-sources/providers/alibaba/README.md +++ b/docs/model-sources/providers/alibaba/README.md @@ -1,6 +1,6 @@ # 阿里云百炼 / Qwen / Wan / HappyHorse:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 65 个单模型文件、6 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/alibaba/models/deepseek-v4-flash-0731.md b/docs/model-sources/providers/alibaba/models/deepseek-v4-flash-0731.md index fdd8050..bb43de3 100644 --- a/docs/model-sources/providers/alibaba/models/deepseek-v4-flash-0731.md +++ b/docs/model-sources/providers/alibaba/models/deepseek-v4-flash-0731.md @@ -51,7 +51,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `deepseek-v4-flash-0731` | 1000000 / 384000 | 套餐:未声明 / 未声明 | `modelName`→[qwen-pricing](../SOURCES.md#qwen-pricing) | [qwen-pricing](../SOURCES.md#qwen-pricing) | partial | `668722afd2a91f31c52d3d0684b357171b00ef0f7f59c8bef4b9fa83736f51d4` | +| `deepseek-v4-flash-0731` | 1000000 / 384000 | 套餐:未声明 / 未声明 | `modelName`→[qwen-pricing](../SOURCES.md#qwen-pricing) | [qwen-pricing](../SOURCES.md#qwen-pricing) | partial | `19a26fe374a6f1dd642fb7caa9eff0a6675558e4ba28a0af67f602551bdbd566` | ## 下次更新核查 diff --git a/docs/model-sources/providers/anthropic/AUDIT.md b/docs/model-sources/providers/anthropic/AUDIT.md new file mode 100644 index 0000000..290a03a --- /dev/null +++ b/docs/model-sources/providers/anthropic/AUDIT.md @@ -0,0 +1,29 @@ +# anthropic:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +原厂 API 的窗口、最大输出、标准 USD 价格与默认 effort 按型号文档复核;订阅权限和资源预算不借用直连证据。 + +移除 Sonnet 5.5 中与嵌套 high 默认冲突的旧 extra.defaultEffort。历史型号的单独文档、完整 effort 表和真实订阅调用仍须分别核查。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [claude-models](https://platform.claude.com/docs/en/models/overview.md) | 正文已读取 | 17143 字节;摘要与 SOURCES.md 同步 | +| [claude-opus55](https://platform.claude.com/docs/en/models/opus-5-5/overview.md) | 正文已读取 | 14275 字节;摘要与 SOURCES.md 同步 | +| [claude-sonnet55](https://platform.claude.com/docs/en/models/sonnet-5-5/overview.md) | 正文已读取 | 14476 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:21 条;pending 6、partial 15、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 21 条:pending 6、partial 15、historical 0;partial 中仅 ID 证明 3 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/anthropic/README.md b/docs/model-sources/providers/anthropic/README.md index 49ba9df..bf7ff3a 100644 --- a/docs/model-sources/providers/anthropic/README.md +++ b/docs/model-sources/providers/anthropic/README.md @@ -1,6 +1,6 @@ # Anthropic:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 11 个单模型文件、3 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/anthropic/SOURCES.md b/docs/model-sources/providers/anthropic/SOURCES.md index 8c668f8..8a30630 100644 --- a/docs/model-sources/providers/anthropic/SOURCES.md +++ b/docs/model-sources/providers/anthropic/SOURCES.md @@ -19,9 +19,34 @@ - 入口:[claude-sonnet55](https://platform.claude.com/docs/en/models/sonnet-5-5/overview.md) - 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Anthropic 原厂 Sonnet 5.5;USD 标准价格`。 +### claude-fable51 + +- 入口:[claude-fable51](https://platform.claude.com/docs/en/models/fable-5-1/overview.md) +- 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限`。 + +### claude-opus5 + +- 入口:[claude-opus5](https://platform.claude.com/docs/en/models/opus-5/overview.md) +- 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限`。 + +### claude-sonnet5 + +- 入口:[claude-sonnet5](https://platform.claude.com/docs/en/models/sonnet-5/overview.md) +- 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限`。 + +### claude-effort + +- 入口:[claude-effort](https://platform.claude.com/docs/en/build-with-claude/effort.md) +- 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限`。 + +### claude-haiku45 + +- 入口:[claude-haiku45](https://platform.claude.com/docs/en/models/haiku-4-5/overview.md) +- 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限`。 + ## 已知边界与核验说明 -Opus 5.5 和 Sonnet 5.5 的窗口、输出、默认 effort、强制工具选择限制已再次核对。订阅接入与直连价格分别记录;历史型号不据此声明已核实。 +Opus 5.5 和 Sonnet 5.5 的窗口、输出、默认 effort、强制工具选择限制已再次核对。订阅接入与直连价格分别记录;Opus 5/Sonnet 5 原厂默认均为 high,清除旧 xhigh 默认与重复扁平 defaultEffort;共享 routing 的 xhigh 仍是本仓策略,与 API 默认分开记录。未取得单型号证明的其他历史型号不据此声明已核实。 状态 `partial` 仅表示列出的字段已核实;不能推断整条配置、价格、账号权限或真实模型调用都已验收。`pending` 没有已核字段;`historical` 只作历史兼容参考。路由 tier/priority、产品标签和默认选择属于本仓策略,不伪装成官网数据。 @@ -61,6 +86,56 @@ Opus 5.5 和 Sonnet 5.5 的窗口、输出、默认 effort、强制工具选择 "checkedAt": "2026-10-03", "contentSha256": "0d7f0d48ddb9a796caf739e677f5cf882089ffd70dcb3fdb400432af43b83120", "resolvedUrl": "https://platform.claude.com/docs/en/models/sonnet-5-5/overview.md" + }, + { + "id": "claude-fable51", + "url": "https://platform.claude.com/docs/en/models/fable-5-1/overview.md", + "kind": "official-doc", + "scope": "Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "f32fbe39812dd73d0bfc8e58de18da67a59571ac5abb43a4c0bc645d9c8a8904", + "resolvedUrl": "https://platform.claude.com/docs/en/models/fable-5-1/overview.md" + }, + { + "id": "claude-opus5", + "url": "https://platform.claude.com/docs/en/models/opus-5/overview.md", + "kind": "official-doc", + "scope": "Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "18a78d2967ab31b92fb5651ead59c539b45ece7c33b5e857a6f8f3e72c74272d", + "resolvedUrl": "https://platform.claude.com/docs/en/models/opus-5/overview.md" + }, + { + "id": "claude-sonnet5", + "url": "https://platform.claude.com/docs/en/models/sonnet-5/overview.md", + "kind": "official-doc", + "scope": "Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "68f590298ac0f5e6271fd2d9707084e4f9d2e7e22358d4bfa8f5279cbd690708", + "resolvedUrl": "https://platform.claude.com/docs/en/models/sonnet-5/overview.md" + }, + { + "id": "claude-effort", + "url": "https://platform.claude.com/docs/en/build-with-claude/effort.md", + "kind": "official-doc", + "scope": "Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "073ce24b7a8922388477281126b05dca553ed3d95efa86e3256402b55044bd64", + "resolvedUrl": "https://platform.claude.com/docs/en/build-with-claude/effort.md" + }, + { + "id": "claude-haiku45", + "url": "https://platform.claude.com/docs/en/models/haiku-4-5/overview.md", + "kind": "official-doc", + "scope": "Anthropic 原厂 API 单型号规格/effort;不证明订阅账号权限", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "be8631fdf43f4edd374e980f82d5578e9795a09637c9a0b70d353139a0fec173", + "resolvedUrl": "https://platform.claude.com/docs/en/models/haiku-4-5/overview.md" } ] } diff --git a/docs/model-sources/providers/anthropic/models/claude-fable-5-1.md b/docs/model-sources/providers/anthropic/models/claude-fable-5-1.md index df807ab..f0f9c75 100644 --- a/docs/model-sources/providers/anthropic/models/claude-fable-5-1.md +++ b/docs/model-sources/providers/anthropic/models/claude-fable-5-1.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`claude-fable-5-1`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮复核仅限下表已核字段,其余仍待核实。 ## 适用接入面 @@ -49,7 +49,8 @@ "defaultEffort": "high" }, "extra.thinkingOnly": true, - "extra.adaptiveThinking": true + "extra.adaptiveThinking": true, + "modelName": "claude-fable-5-1" } ``` @@ -58,7 +59,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-fable-5-1` | 1000000 / 128000 | USD:未声明 / 未声明 | `modelName`→[claude-models](../SOURCES.md#claude-models) | [claude-models](../SOURCES.md#claude-models) | partial | `8676a78498c4b22fa8d9a383970c53c8a20da7a335a507290c4e5513c29d0e99` | +| `claude-fable-5-1` | 1000000 / 128000 | USD:未声明 / 未声明 | `modelName`→[claude-fable51](../SOURCES.md#claude-fable51) | [claude-models](../SOURCES.md#claude-models), [claude-fable51](../SOURCES.md#claude-fable51) | partial | `8676a78498c4b22fa8d9a383970c53c8a20da7a335a507290c4e5513c29d0e99` | ### compute/providers/anthropic.json @@ -104,7 +105,16 @@ "write1h": 20, "read": 0.25 }, - "extra.pricingNotes": "Prices are per 1M tokens. Full 1M context is billed at standard pricing." + "extra.pricingNotes": "Prices are per 1M tokens. Full 1M context is billed at standard pricing.", + "modelName": "claude-fable-5-1", + "extra.reasoning.defaultEffort": "high", + "extra.reasoning.supportedEfforts": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } ``` @@ -113,7 +123,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-fable-5-1` | 1000000 / 128000 | USD:10 / 50 | `modelName`→[claude-models](../SOURCES.md#claude-models) | [claude-models](../SOURCES.md#claude-models) | partial | `0c277612edfecf40cf814529cde3510488e8690ec2dc483d61ebd4fb354c352a` | +| `claude-fable-5-1` | 1000000 / 128000 | USD:10 / 50 | `modelName`→[claude-fable51](../SOURCES.md#claude-fable51), `contextWindow`→[claude-fable51](../SOURCES.md#claude-fable51), `maxOutputTokens`→[claude-fable51](../SOURCES.md#claude-fable51), `inputPrice`→[claude-fable51](../SOURCES.md#claude-fable51), `outputPrice`→[claude-fable51](../SOURCES.md#claude-fable51), `extra.reasoning.defaultEffort`→[claude-fable51](../SOURCES.md#claude-fable51), `extra.reasoning.supportedEfforts`→[claude-effort](../SOURCES.md#claude-effort) | [claude-models](../SOURCES.md#claude-models), [claude-fable51](../SOURCES.md#claude-fable51), [claude-effort](../SOURCES.md#claude-effort) | partial | `0c277612edfecf40cf814529cde3510488e8690ec2dc483d61ebd4fb354c352a` | ### compute/model-specs/anthropic.json @@ -156,7 +166,8 @@ "max" ], "defaultMode": "high" - } + }, + "id": "claude-fable-5-1" } ``` @@ -165,7 +176,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-fable-5-1` | 1000000 / 128000 | 非计价主数据 | `id`→[claude-models](../SOURCES.md#claude-models) | [claude-models](../SOURCES.md#claude-models) | partial | `fc72b0d7c506d81052e9545c27713e6a0283730973b7df96bf64755a054c0b23` | +| `claude-fable-5-1` | 1000000 / 128000 | 非计价主数据 | `id`→[claude-fable51](../SOURCES.md#claude-fable51), `spec.contextWindow`→[claude-fable51](../SOURCES.md#claude-fable51), `spec.maxOutputTokens`→[claude-fable51](../SOURCES.md#claude-fable51) | [claude-models](../SOURCES.md#claude-models), [claude-fable51](../SOURCES.md#claude-fable51) | partial | `fc72b0d7c506d81052e9545c27713e6a0283730973b7df96bf64755a054c0b23` | ## 下次更新核查 diff --git a/docs/model-sources/providers/anthropic/models/claude-opus-5-5.md b/docs/model-sources/providers/anthropic/models/claude-opus-5-5.md index 8ac162f..425e3a9 100644 --- a/docs/model-sources/providers/anthropic/models/claude-opus-5-5.md +++ b/docs/model-sources/providers/anthropic/models/claude-opus-5-5.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`claude-opus-5-5`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮复核仅限下表已核字段,其余仍待核实。 ## 适用接入面 @@ -49,7 +49,9 @@ "defaultEffort": "medium" }, "extra.thinkingOnly": true, - "extra.adaptiveThinking": true + "extra.adaptiveThinking": true, + "extra.reasoning.defaultEffort": "medium", + "modelName": "claude-opus-5-5" } ``` @@ -58,7 +60,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-opus-5-5` | 1000000 / 128000 | USD:未声明 / 未声明 | `contextWindow`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.adaptiveThinking`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.reasoning.defaultEffort`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.thinkingOnly`→[claude-opus55](../SOURCES.md#claude-opus55), `maxOutputTokens`→[claude-opus55](../SOURCES.md#claude-opus55), `modelName`→[claude-models](../SOURCES.md#claude-models) | [claude-models](../SOURCES.md#claude-models), [claude-opus55](../SOURCES.md#claude-opus55) | partial | `0b8cbd3d1097c7d7474a32bcdab30bb2c24d433e810e9cf6ec34d0eb1c853d25` | +| `claude-opus-5-5` | 1000000 / 128000 | USD:未声明 / 未声明 | `contextWindow`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.adaptiveThinking`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.reasoning.defaultEffort`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.thinkingOnly`→[claude-opus55](../SOURCES.md#claude-opus55), `maxOutputTokens`→[claude-opus55](../SOURCES.md#claude-opus55), `modelName`→[claude-opus55](../SOURCES.md#claude-opus55) | [claude-models](../SOURCES.md#claude-models), [claude-opus55](../SOURCES.md#claude-opus55) | partial | `0b8cbd3d1097c7d7474a32bcdab30bb2c24d433e810e9cf6ec34d0eb1c853d25` | ### compute/providers/anthropic.json @@ -104,7 +106,16 @@ "write1h": 8, "read": 0.2 }, - "extra.pricingNotes": "Prices are per 1M tokens. Full 1M context is billed at standard pricing." + "extra.pricingNotes": "Prices are per 1M tokens. Full 1M context is billed at standard pricing.", + "extra.reasoning.defaultEffort": "medium", + "modelName": "claude-opus-5-5", + "extra.reasoning.supportedEfforts": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } ``` @@ -113,7 +124,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-opus-5-5` | 1000000 / 128000 | USD:4 / 20 | `contextWindow`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.adaptiveThinking`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.forcedToolChoiceUnsupported`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.reasoning.defaultEffort`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.thinkingOnly`→[claude-opus55](../SOURCES.md#claude-opus55), `inputPrice`→[claude-opus55](../SOURCES.md#claude-opus55), `maxOutputTokens`→[claude-opus55](../SOURCES.md#claude-opus55), `modelName`→[claude-models](../SOURCES.md#claude-models), `outputPrice`→[claude-opus55](../SOURCES.md#claude-opus55) | [claude-models](../SOURCES.md#claude-models), [claude-opus55](../SOURCES.md#claude-opus55) | partial | `4104980fbc4161efe7f38cb45343ec308be4f5893d13733ebac51c0562ef1413` | +| `claude-opus-5-5` | 1000000 / 128000 | USD:4 / 20 | `contextWindow`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.adaptiveThinking`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.forcedToolChoiceUnsupported`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.reasoning.defaultEffort`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.thinkingOnly`→[claude-opus55](../SOURCES.md#claude-opus55), `inputPrice`→[claude-opus55](../SOURCES.md#claude-opus55), `maxOutputTokens`→[claude-opus55](../SOURCES.md#claude-opus55), `modelName`→[claude-opus55](../SOURCES.md#claude-opus55), `outputPrice`→[claude-opus55](../SOURCES.md#claude-opus55), `extra.reasoning.supportedEfforts`→[claude-effort](../SOURCES.md#claude-effort) | [claude-models](../SOURCES.md#claude-models), [claude-opus55](../SOURCES.md#claude-opus55), [claude-effort](../SOURCES.md#claude-effort) | partial | `4104980fbc4161efe7f38cb45343ec308be4f5893d13733ebac51c0562ef1413` | ### compute/model-specs/anthropic.json @@ -156,7 +167,8 @@ "max" ], "defaultMode": "medium" - } + }, + "id": "claude-opus-5-5" } ``` @@ -165,7 +177,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-opus-5-5` | 1000000 / 128000 | 非计价主数据 | `id`→[claude-models](../SOURCES.md#claude-models), `spec.contextWindow`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.extra.adaptiveThinking`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.extra.forcedToolChoiceUnsupported`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.extra.thinkingOnly`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.maxOutputTokens`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.releasedAt`→[claude-opus55](../SOURCES.md#claude-opus55) | [claude-models](../SOURCES.md#claude-models), [claude-opus55](../SOURCES.md#claude-opus55) | partial | `221e150e5cd55620f88f614fc65d95620a39463bbc27b387525254d4bc9bc143` | +| `claude-opus-5-5` | 1000000 / 128000 | 非计价主数据 | `id`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.contextWindow`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.extra.adaptiveThinking`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.extra.forcedToolChoiceUnsupported`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.extra.thinkingOnly`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.maxOutputTokens`→[claude-opus55](../SOURCES.md#claude-opus55), `spec.releasedAt`→[claude-opus55](../SOURCES.md#claude-opus55) | [claude-models](../SOURCES.md#claude-models), [claude-opus55](../SOURCES.md#claude-opus55) | partial | `221e150e5cd55620f88f614fc65d95620a39463bbc27b387525254d4bc9bc143` | ## 下次更新核查 diff --git a/docs/model-sources/providers/anthropic/models/claude-opus-5.md b/docs/model-sources/providers/anthropic/models/claude-opus-5.md index c9655db..ce5cead 100644 --- a/docs/model-sources/providers/anthropic/models/claude-opus-5.md +++ b/docs/model-sources/providers/anthropic/models/claude-opus-5.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`claude-opus-5`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮复核仅限下表已核字段,其余仍待核实。 ## 适用接入面 @@ -46,9 +46,10 @@ "xhigh", "max" ], - "defaultEffort": "xhigh" + "defaultEffort": "high" }, - "extra.adaptiveThinking": true + "extra.adaptiveThinking": true, + "modelName": "claude-opus-5" } ``` @@ -57,7 +58,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-opus-5` | 1000000 / 128000 | USD:未声明 / 未声明 | 待核实 | [claude-models](../SOURCES.md#claude-models) | pending | `4bd4586e538272194f94a15442412a1600a7c1e9a34413562b774e705f9180ec` | +| `claude-opus-5` | 1000000 / 128000 | USD:未声明 / 未声明 | `modelName`→[claude-opus5](../SOURCES.md#claude-opus5) | [claude-models](../SOURCES.md#claude-models), [claude-opus5](../SOURCES.md#claude-opus5) | partial | `ef23d88fc4278a457a6556b7f6ada39411ea55853a19e93a83f851dd832bb66f` | ### compute/providers/anthropic.json @@ -92,7 +93,7 @@ "xhigh", "max" ], - "defaultEffort": "xhigh" + "defaultEffort": "high" }, "extra.adaptiveThinking": true, "extra.samplingParametersDeprecated": true, @@ -101,7 +102,16 @@ "write1h": 10, "read": 0.5 }, - "extra.pricingNotes": "Prices are per 1M tokens. Full 1M context is billed at standard pricing." + "extra.pricingNotes": "Prices are per 1M tokens. Full 1M context is billed at standard pricing.", + "modelName": "claude-opus-5", + "extra.reasoning.defaultEffort": "high", + "extra.reasoning.supportedEfforts": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } ``` @@ -110,7 +120,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-opus-5` | 1000000 / 128000 | USD:5 / 25 | 待核实 | [claude-models](../SOURCES.md#claude-models) | pending | `0fd79697ff2f6a334afdb1d53631abd318cf15af2d29ad2652090b350ecc7d50` | +| `claude-opus-5` | 1000000 / 128000 | USD:5 / 25 | `modelName`→[claude-opus5](../SOURCES.md#claude-opus5), `contextWindow`→[claude-opus5](../SOURCES.md#claude-opus5), `maxOutputTokens`→[claude-opus5](../SOURCES.md#claude-opus5), `inputPrice`→[claude-opus5](../SOURCES.md#claude-opus5), `outputPrice`→[claude-opus5](../SOURCES.md#claude-opus5), `extra.reasoning.defaultEffort`→[claude-opus5](../SOURCES.md#claude-opus5), `extra.reasoning.supportedEfforts`→[claude-effort](../SOURCES.md#claude-effort) | [claude-models](../SOURCES.md#claude-models), [claude-opus5](../SOURCES.md#claude-opus5), [claude-effort](../SOURCES.md#claude-effort) | partial | `74cfedb13361958fb1516fabc63fcd5db7a182b3711b354f327cf0e883a19a63` | ### compute/model-specs/anthropic.json @@ -150,7 +160,8 @@ "max" ], "defaultMode": "xhigh" - } + }, + "id": "claude-opus-5" } ``` @@ -159,7 +170,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-opus-5` | 1000000 / 128000 | 非计价主数据 | 待核实 | [claude-models](../SOURCES.md#claude-models) | pending | `8e0685c775c05ce4b4682a8d41ac3ccc423c6bb714c01678a9a46518be4a3ce4` | +| `claude-opus-5` | 1000000 / 128000 | 非计价主数据 | `id`→[claude-opus5](../SOURCES.md#claude-opus5), `spec.contextWindow`→[claude-opus5](../SOURCES.md#claude-opus5), `spec.maxOutputTokens`→[claude-opus5](../SOURCES.md#claude-opus5) | [claude-models](../SOURCES.md#claude-models), [claude-opus5](../SOURCES.md#claude-opus5) | partial | `8e0685c775c05ce4b4682a8d41ac3ccc423c6bb714c01678a9a46518be4a3ce4` | ## 下次更新核查 diff --git a/docs/model-sources/providers/anthropic/models/claude-sonnet-5-5.md b/docs/model-sources/providers/anthropic/models/claude-sonnet-5-5.md index d776c52..eec7ae9 100644 --- a/docs/model-sources/providers/anthropic/models/claude-sonnet-5-5.md +++ b/docs/model-sources/providers/anthropic/models/claude-sonnet-5-5.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`claude-sonnet-5-5`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮复核仅限下表已核字段,其余仍待核实。 ## 适用接入面 @@ -50,7 +50,9 @@ }, "extra.adaptiveThinking": true, "extra.samplingParametersDeprecated": true, - "extra.forcedToolChoiceUnsupported": true + "extra.forcedToolChoiceUnsupported": true, + "extra.reasoning.defaultEffort": "high", + "modelName": "claude-sonnet-5-5" } ``` @@ -59,7 +61,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-sonnet-5-5` | 1000000 / 128000 | USD:未声明 / 未声明 | `contextWindow`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.adaptiveThinking`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.forcedToolChoiceUnsupported`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.reasoning.defaultEffort`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `maxOutputTokens`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `modelName`→[claude-models](../SOURCES.md#claude-models) | [claude-models](../SOURCES.md#claude-models), [claude-sonnet55](../SOURCES.md#claude-sonnet55) | partial | `deaa1823c6e0e828c96669746a571641da9d5878c7e7078834d326f290534255` | +| `claude-sonnet-5-5` | 1000000 / 128000 | USD:未声明 / 未声明 | `contextWindow`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.adaptiveThinking`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.forcedToolChoiceUnsupported`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.reasoning.defaultEffort`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `maxOutputTokens`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `modelName`→[claude-sonnet55](../SOURCES.md#claude-sonnet55) | [claude-models](../SOURCES.md#claude-models), [claude-sonnet55](../SOURCES.md#claude-sonnet55) | partial | `deaa1823c6e0e828c96669746a571641da9d5878c7e7078834d326f290534255` | ### compute/providers/anthropic.json @@ -105,7 +107,16 @@ "write5m": 2.5, "write1h": 4, "read": 0.2 - } + }, + "extra.reasoning.defaultEffort": "high", + "modelName": "claude-sonnet-5-5", + "extra.reasoning.supportedEfforts": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } ``` @@ -114,7 +125,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-sonnet-5-5` | 1000000 / 128000 | USD:2 / 10 | `contextWindow`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.adaptiveThinking`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.forcedToolChoiceUnsupported`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.reasoning.defaultEffort`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `inputPrice`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `maxOutputTokens`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `modelName`→[claude-models](../SOURCES.md#claude-models), `outputPrice`→[claude-sonnet55](../SOURCES.md#claude-sonnet55) | [claude-models](../SOURCES.md#claude-models), [claude-sonnet55](../SOURCES.md#claude-sonnet55) | partial | `91493f5adabf726879df34330d61069199c0659e5cf5d5159508991522b847bb` | +| `claude-sonnet-5-5` | 1000000 / 128000 | USD:2 / 10 | `contextWindow`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.adaptiveThinking`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.forcedToolChoiceUnsupported`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.reasoning.defaultEffort`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `inputPrice`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `maxOutputTokens`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `modelName`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `outputPrice`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `extra.reasoning.supportedEfforts`→[claude-effort](../SOURCES.md#claude-effort) | [claude-models](../SOURCES.md#claude-models), [claude-sonnet55](../SOURCES.md#claude-sonnet55), [claude-effort](../SOURCES.md#claude-effort) | partial | `9f9e6e077d1cffb9a2618b56c95bc82d9e1730a627538e08fba3b032e9ba6955` | ### compute/model-specs/anthropic.json @@ -157,7 +168,8 @@ "max" ], "defaultMode": "high" - } + }, + "id": "claude-sonnet-5-5" } ``` @@ -166,7 +178,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-sonnet-5-5` | 1000000 / 128000 | 非计价主数据 | `id`→[claude-models](../SOURCES.md#claude-models), `spec.contextWindow`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `spec.extra.adaptiveThinking`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `spec.extra.forcedToolChoiceUnsupported`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `spec.maxOutputTokens`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `spec.releasedAt`→[claude-sonnet55](../SOURCES.md#claude-sonnet55) | [claude-models](../SOURCES.md#claude-models), [claude-sonnet55](../SOURCES.md#claude-sonnet55) | partial | `721b450117510321de0f49c3b45ec80e2b35091c8d4fa38ceeb99b958deea141` | +| `claude-sonnet-5-5` | 1000000 / 128000 | 非计价主数据 | `id`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `spec.contextWindow`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `spec.extra.adaptiveThinking`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `spec.extra.forcedToolChoiceUnsupported`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `spec.maxOutputTokens`→[claude-sonnet55](../SOURCES.md#claude-sonnet55), `spec.releasedAt`→[claude-sonnet55](../SOURCES.md#claude-sonnet55) | [claude-models](../SOURCES.md#claude-models), [claude-sonnet55](../SOURCES.md#claude-sonnet55) | partial | `721b450117510321de0f49c3b45ec80e2b35091c8d4fa38ceeb99b958deea141` | ## 下次更新核查 diff --git a/docs/model-sources/providers/anthropic/models/claude-sonnet-5.md b/docs/model-sources/providers/anthropic/models/claude-sonnet-5.md index c3ea3d6..672cb8f 100644 --- a/docs/model-sources/providers/anthropic/models/claude-sonnet-5.md +++ b/docs/model-sources/providers/anthropic/models/claude-sonnet-5.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`claude-sonnet-5`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮复核仅限下表已核字段,其余仍待核实。 ## 适用接入面 @@ -46,9 +46,10 @@ "xhigh", "max" ], - "defaultEffort": "xhigh" + "defaultEffort": "high" }, - "extra.adaptiveThinking": true + "extra.adaptiveThinking": true, + "modelName": "claude-sonnet-5" } ``` @@ -57,7 +58,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-sonnet-5` | 1000000 / 128000 | USD:未声明 / 未声明 | 待核实 | [claude-models](../SOURCES.md#claude-models) | pending | `5fe127d1328fb81bb768e48a41fe1aeb5a1b84964d53ab31f4029e6332b350ef` | +| `claude-sonnet-5` | 1000000 / 128000 | USD:未声明 / 未声明 | `modelName`→[claude-sonnet5](../SOURCES.md#claude-sonnet5) | [claude-models](../SOURCES.md#claude-models), [claude-sonnet5](../SOURCES.md#claude-sonnet5) | partial | `daaa7c192cdaa2865f9d20fb67a4ea0310fd1eeb127f1c2aa95c3e125aebf91a` | ### compute/providers/anthropic.json @@ -94,7 +95,7 @@ "xhigh", "max" ], - "defaultEffort": "xhigh" + "defaultEffort": "high" }, "extra.adaptiveThinking": true, "extra.samplingParametersDeprecated": true, @@ -102,7 +103,16 @@ "write5m": 2.5, "write1h": 4, "read": 0.2 - } + }, + "modelName": "claude-sonnet-5", + "extra.reasoning.defaultEffort": "high", + "extra.reasoning.supportedEfforts": [ + "low", + "medium", + "high", + "xhigh", + "max" + ] } ``` @@ -111,7 +121,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-sonnet-5` | 1000000 / 128000 | USD:2 / 10 | 待核实 | [claude-models](../SOURCES.md#claude-models) | pending | `8bd2e7fbcf50edef6b02c4d40be10a94ffbbdc9183f40d026555383b23dbe1c8` | +| `claude-sonnet-5` | 1000000 / 128000 | USD:2 / 10 | `modelName`→[claude-sonnet5](../SOURCES.md#claude-sonnet5), `contextWindow`→[claude-sonnet5](../SOURCES.md#claude-sonnet5), `maxOutputTokens`→[claude-sonnet5](../SOURCES.md#claude-sonnet5), `inputPrice`→[claude-sonnet5](../SOURCES.md#claude-sonnet5), `outputPrice`→[claude-sonnet5](../SOURCES.md#claude-sonnet5), `extra.reasoning.defaultEffort`→[claude-sonnet5](../SOURCES.md#claude-sonnet5), `extra.reasoning.supportedEfforts`→[claude-effort](../SOURCES.md#claude-effort) | [claude-models](../SOURCES.md#claude-models), [claude-sonnet5](../SOURCES.md#claude-sonnet5), [claude-effort](../SOURCES.md#claude-effort) | partial | `59a0116abbb73302f4c23a75125a8613134f011974a92aa39f4ee34b6e1b1640` | ### compute/model-specs/anthropic.json @@ -152,7 +162,8 @@ "max" ], "defaultMode": "xhigh" - } + }, + "id": "claude-sonnet-5" } ``` @@ -161,7 +172,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `claude-sonnet-5` | 1000000 / 128000 | 非计价主数据 | 待核实 | [claude-models](../SOURCES.md#claude-models) | pending | `e740026b7275cd07ed37afa3044e12e6e6221a1723126aa100774ea167d53ba8` | +| `claude-sonnet-5` | 1000000 / 128000 | 非计价主数据 | `id`→[claude-sonnet5](../SOURCES.md#claude-sonnet5), `spec.contextWindow`→[claude-sonnet5](../SOURCES.md#claude-sonnet5), `spec.maxOutputTokens`→[claude-sonnet5](../SOURCES.md#claude-sonnet5) | [claude-models](../SOURCES.md#claude-models), [claude-sonnet5](../SOURCES.md#claude-sonnet5) | partial | `e740026b7275cd07ed37afa3044e12e6e6221a1723126aa100774ea167d53ba8` | ## 下次更新核查 diff --git a/docs/model-sources/providers/baichuan/AUDIT.md b/docs/model-sources/providers/baichuan/AUDIT.md new file mode 100644 index 0000000..ebe1502 --- /dev/null +++ b/docs/model-sources/providers/baichuan/AUDIT.md @@ -0,0 +1,27 @@ +# baichuan:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +本次原官网入口仍发生 TLS EOF,未取得正文。 + +按官方可读取的模型/API 文档补上下文、输出、价格和版本;当前 8 条 pending 不提高状态,不以第三方替代。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [baichuan](https://www.baichuan-ai.com/blog/baichuan-M3) | 读取失败 | | + +## 完成边界 + +当前单接入面记录:8 条;pending 8、partial 0、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 8 条:pending 8、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/baichuan/README.md b/docs/model-sources/providers/baichuan/README.md index 1153722..90b48a8 100644 --- a/docs/model-sources/providers/baichuan/README.md +++ b/docs/model-sources/providers/baichuan/README.md @@ -1,6 +1,6 @@ # 百川:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 4 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/baidu/AUDIT.md b/docs/model-sources/providers/baidu/AUDIT.md new file mode 100644 index 0000000..de3b393 --- /dev/null +++ b/docs/model-sources/providers/baidu/AUDIT.md @@ -0,0 +1,33 @@ +# baidu:2026-10-03 字段复核与剩余过程 + +[官网证据](SOURCES.md) · [模型与接入导航](README.md) + +本轮实际读取国际模型目录与国内Coding Plan。国际目录ERNIE5.0输出65536、GLM5.2输出131072等不能直接证明国内qianfan.baidubce.com合同,未复制其数字或美元价格。国内普通模型路径补读最终跳转文档首页,不是目标规格。 + +Coding Plan明确仅编程工具使用、专属BaseURL/API Key;FAQ明确当前套餐不支持图像理解。已移除套餐ERNIE4.5 Turbo的vision标签,保留原厂普通API视觉规格。GLM5.1官方抵扣为高峰4/低峰3,修正旧描述6;高峰时段随流量可变。页面固定modelName列表不含Kimi K2.6,但未以目录缺席直接删掉该历史套餐项,需更当前的Token Plan公告/控制台验证。MiniMaxM2.5标“即将下线”未给精确时间,不提前删除。 + +下一步核国内普通API精确ID/限制/价格,以及Coding→Token Plan停售迁移、缺席模型是否仍可用、配额和版本门控;以下仅ID证明仍不代表参数或套餐账号权限验证。 + +## 待核实队列 + +本轮收尾快照:20条接入面记录,5 pending,13条partial只核ID;同一模型可占多条,非独立型号数。partial是已列字段证明,不是全部通过。 + +### 尚无字段证明 + +- `compute/providers/baidu.json`:`ernie-5.0-thinking-latest`、`ernie-x1.1`。 +- `compute/model-specs/baidu.json`:`ernie-5.0-thinking-latest`、`ernie-x1.1`。 +- `compute/coding-plans/baidu-coding.json`:`minimax-m2.7`。 + +### 仅ID有证明 + +- `compute/coding-plans/baidu-coding.json`:`deepseek-v3.2`、`deepseek-v4-flash`、`glm-5`、`kimi-k2.5`、`kimi-k2.6`、`minimax-m2.5`、`qianfan-code-latest`。 +- `compute/providers/baidu.json`:`ernie-4.5-turbo-128k`、`ernie-4.5-turbo-20260402`、`ernie-5.0`。 +- `compute/model-specs/baidu.json`:`ernie-4.5-turbo-128k`、`ernie-4.5-turbo-20260402`、`ernie-5.0`。 + +## 完成标准 + +逐条打开对应官网正文/官方API,按原厂、套餐、地域分别登记精确参数和单位;有差异才改canonical JSON,同步该模型详情、字段引用和指纹。保留未证实字段。运行来源/结构测试;协议改动需客户端和实际调用验收。没有账号授权,本轮未执行收费模型调用。 + +## 本轮最终记录统计 + +本仓记录 20 条:pending 5、partial 15、historical 0;partial 中仅 ID 证明 13 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/baidu/README.md b/docs/model-sources/providers/baidu/README.md index 65a109d..b1a1dcb 100644 --- a/docs/model-sources/providers/baidu/README.md +++ b/docs/model-sources/providers/baidu/README.md @@ -1,6 +1,6 @@ # 百度千帆:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 14 个单模型文件、3 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/baidu/models/ernie-4.5-turbo-20260402.md b/docs/model-sources/providers/baidu/models/ernie-4.5-turbo-20260402.md index f81b399..06be789 100644 --- a/docs/model-sources/providers/baidu/models/ernie-4.5-turbo-20260402.md +++ b/docs/model-sources/providers/baidu/models/ernie-4.5-turbo-20260402.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`ernie-4.5-turbo-20260402`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -66,9 +66,9 @@ "capabilities": [ "chat", "code", - "vision", "fast" - ] + ], + "description": "百度 ERNIE 4.5 Turbo(千帆 Coding Plan 渠道);套餐当前不支持图像理解" } ``` @@ -77,7 +77,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `ernie-4.5-turbo-20260402` | 未声明 / 未声明 | 套餐:未声明 / 未声明 | `modelName`→[baidu-plan](../SOURCES.md#baidu-plan) | [baidu-plan](../SOURCES.md#baidu-plan) | partial | `ec09b5b3ba218316c6e5f71cf06ca9a11b788ac8c1d2fe0aa0a73f5e47d02007` | +| `ernie-4.5-turbo-20260402` | 未声明 / 未声明 | 套餐:未声明 / 未声明 | `modelName`→[baidu-plan](../SOURCES.md#baidu-plan)、`description`→[baidu-plan](../SOURCES.md#baidu-plan) | [baidu-plan](../SOURCES.md#baidu-plan) | partial | `337c98aa957e3d321a455737fceb12bf03e6ed75e31b777c6b6c309323c7dcfa` | ### compute/model-specs/baidu.json diff --git a/docs/model-sources/providers/baidu/models/glm-5.1.md b/docs/model-sources/providers/baidu/models/glm-5.1.md index 659831e..1758dfa 100644 --- a/docs/model-sources/providers/baidu/models/glm-5.1.md +++ b/docs/model-sources/providers/baidu/models/glm-5.1.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`glm-5.1`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -30,7 +30,8 @@ "reasoning", "code", "agent" - ] + ], + "description": "智谱 GLM-5.1(千帆 Coding Plan 渠道),高峰抵扣 ×4 / 低峰 ×3;高峰时段随流量动态调整" } ``` @@ -39,7 +40,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `glm-5.1` | 未声明 / 未声明 | 套餐:未声明 / 未声明 | `modelName`→[baidu-models](../SOURCES.md#baidu-models) | [baidu-models](../SOURCES.md#baidu-models) | partial | `11dd1635dc2418f5f7c9511cfdd5fa1efa3ce8655c496770a9d309f49b12f1ae` | +| `glm-5.1` | 未声明 / 未声明 | 套餐:未声明 / 未声明 | `modelName`→[baidu-plan](../SOURCES.md#baidu-plan)、`description`→[baidu-plan](../SOURCES.md#baidu-plan) | [baidu-plan](../SOURCES.md#baidu-plan) | partial | `ff54cb27e29dab6558fbec8835341eab50ee7d2a15e7c0d80d265efb1e435591` | ## 下次更新核查 diff --git a/docs/model-sources/providers/cohere/AUDIT.md b/docs/model-sources/providers/cohere/AUDIT.md new file mode 100644 index 0000000..6fef747 --- /dev/null +++ b/docs/model-sources/providers/cohere/AUDIT.md @@ -0,0 +1,27 @@ +# Cohere:2026-10-03 数据核验与后续计划 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +## 本轮完成 + +实读型号表、兼容接口、Embed与Rerank文档。核实Embed4/5原生维度与默认值,补Embed4共享规格;兼容Provider不新增dimensions参数。原生Rerank3.5确认4096限制,从不提供Rerank的compatibility/v1 Provider移除并登记tombstone,保留共享规格。原来2美元search unit被写入token价格的问题随错误接入移除,不新增伪造token价。 + +## 待完成与验收标准 + +| 事项 | 当前边界 | 下一步与完成条件 | +| --- | --- | --- | +| 原生Rerank3.5/4 | shared spec可以描述能力,但当前Provider仅Chat/文本Embed | 客户端支持原生/v2/rerank响应和search unit计价后增加独立Provider;不强挂OpenAI兼容端点 | +| 原生多模态Embed | 原生支持图片/PDF,兼容接口不同 | 分协议建立输入合同与fixture,验证实际返回维度与计费 | +| 原生窗口/输出简写 | 官方使用128k/64k等简写 | 明确K换算依据或取得API整数元数据后核验准确限制 | +| 价格 | 部分旧Command价格尚未逐项复核 | 官方pricing按模型与单位核查,保留未核边界,不把目录ID存在当价格正确 | +| North接入与规格 | 本轮canonical已规范north-mini-code-1-0,增加north-small-translate-1-0共享身份 | 旧简称仅本仓exact兼容;未上Provider,256k/64k与16k精确换算、价格、原生接口权限仍待核 | + +没有账号实测;兼容接口证明只覆盖文档明确声明的合同。 + +## North精确身份修正 + +本轮以原厂型号表核准north-mini-code-1-0、north-small-translate-1-0,补读取两者独立官方页;Translate代码示例也明确同一ID。原North简称不再作为canonical或宽pattern,不宣称是原厂别名。两者未新增Provider。 + +## 本轮最终记录统计 + +本仓记录 17 条:pending 0、partial 17、historical 0;partial 中仅 ID 证明 9 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/cohere/README.md b/docs/model-sources/providers/cohere/README.md index 815b6aa..f2ec840 100644 --- a/docs/model-sources/providers/cohere/README.md +++ b/docs/model-sources/providers/cohere/README.md @@ -1,8 +1,8 @@ # Cohere:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) -本目录包含 10 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 +本目录包含 11 个当前单模型记录及1个历史简称导航文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 ## 接入面 @@ -17,7 +17,8 @@ - [`embed-v4.0`](models/embed-v4.0.md) - [`embed-v5.0-fast`](models/embed-v5.0-fast.md) - [`embed-v5.0-pro`](models/embed-v5.0-pro.md) -- [`north-mini-code`](models/north-mini-code.md) +- [`north-mini-code-1-0`](models/north-mini-code-1-0.md) +- [`north-small-translate-1-0`](models/north-small-translate-1-0.md) - [`rerank-v3.5`](models/rerank-v3.5.md) - [`rerank-v4.0-fast`](models/rerank-v4.0-fast.md) - [`rerank-v4.0-pro`](models/rerank-v4.0-pro.md) diff --git a/docs/model-sources/providers/cohere/SOURCES.md b/docs/model-sources/providers/cohere/SOURCES.md index 32f351e..5a4f379 100644 --- a/docs/model-sources/providers/cohere/SOURCES.md +++ b/docs/model-sources/providers/cohere/SOURCES.md @@ -27,6 +27,16 @@ - 入口:[cohere-rerank](https://docs.cohere.com/docs/rerank.md) - 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Cohere 原生 Rerank;未接入当前兼容 Provider`。 +### north-mini-doc + +- 入口:[north-mini-doc](https://docs.cohere.com/docs/north-mini-code-1.0.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Cohere原厂North Mini Code独立说明;精确API ID见cohere-models型号表。 + +### north-translate-doc + +- 入口:[north-translate-doc](https://docs.cohere.com/docs/north-small-translate-1.0.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Cohere原厂North Small Translate;代码示例明确API ID,16K为窗口简写。 + ## 已知边界与核验说明 当前兼容 API 支持 Embed 5 的文本 embeddings;原厂多模态 Embed 能力不等于兼容端点支持图片输入。Compatibility API 官网明确不支持 `dimensions` 参数,Provider 移除可选维度列表;默认输出维度保留为响应元数据,共享规格继续记录原生支持的多维度。A+ 的 compatibility reasoning_effort 仅 none/high。Rerank 4 只保留共享规格。单位简写 128k/64k 按该记录既有十进制值展示,官网未返回 token 单价,不填写。 @@ -44,7 +54,7 @@ "id": "cohere-models", "url": "https://docs.cohere.com/docs/models.md", "kind": "official-doc", - "scope": "Cohere 原厂型号/规格目录;不证明所有接入面开放", + "scope": "本轮读取 cohere 官方 cohere-models 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "ada3af943113fdaaaada15b61d7b537f9ec2e340ca51adba6bfab852933dd8f1", @@ -54,7 +64,7 @@ "id": "cohere-command", "url": "https://docs.cohere.com/docs/command-a-plus.md", "kind": "official-doc", - "scope": "Cohere 原厂 Command A+;兼容 reasoning 档位另核", + "scope": "本轮读取 cohere 官方 cohere-command 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "b1156c3b9e2229046dc672aa2dc44de3b41aaab5de8bbe26e4dab85d11546c9b", @@ -64,7 +74,7 @@ "id": "cohere-embed", "url": "https://docs.cohere.com/v2/docs/cohere-embed.md", "kind": "official-doc", - "scope": "Cohere 原生多模态 Embed;兼容端点只核实文本 Embed", + "scope": "本轮读取 cohere 官方 cohere-embed 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "f5fc5abd4a5891a635069c8767a4570464310db33dbb9dc1ba68ee048b45fa90", @@ -74,7 +84,7 @@ "id": "cohere-compat", "url": "https://docs.cohere.com/docs/compatibility-api.md", "kind": "official-doc", - "scope": "Cohere /compatibility/v1;OpenAI 兼容 Chat/文本 Embed", + "scope": "本轮读取 cohere 官方 cohere-compat 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "351a667d388039ee2724fae229b1cb6653ede0d41e6175d36cda76b483a1b07d", @@ -84,11 +94,31 @@ "id": "cohere-rerank", "url": "https://docs.cohere.com/docs/rerank.md", "kind": "official-doc", - "scope": "Cohere 原生 Rerank;未接入当前兼容 Provider", + "scope": "本轮读取 cohere 官方 cohere-rerank 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "f3118586467d700939f82151110632e8271cc50fbadcf9a2943fcc1a333d82c0", "resolvedUrl": "https://docs.cohere.com/docs/rerank.md" + }, + { + "id": "north-mini-doc", + "url": "https://docs.cohere.com/docs/north-mini-code-1.0.md", + "kind": "official-doc", + "scope": "Cohere原厂North Mini Code独立说明;精确API ID见cohere-models型号表", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "22a6ee1c7ce4a2339066f4ade915836c5e464252dfa15c1cc01a1aeeedfe57d4", + "resolvedUrl": "https://docs.cohere.com/docs/north-mini-code-1.0.md" + }, + { + "id": "north-translate-doc", + "url": "https://docs.cohere.com/docs/north-small-translate-1.0.md", + "kind": "official-doc", + "scope": "Cohere原厂North Small Translate;代码示例明确API ID,16K为窗口简写", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "3104fc5e8efbc7f218ecf70b7202985b9ba9ca9c2aa7979d8a38dc05198694c4", + "resolvedUrl": "https://docs.cohere.com/docs/north-small-translate-1.0.md" } ] } diff --git a/docs/model-sources/providers/cohere/access/model-specs--cohere.md b/docs/model-sources/providers/cohere/access/model-specs--cohere.md index 527d1a1..88ac34e 100644 --- a/docs/model-sources/providers/cohere/access/model-specs--cohere.md +++ b/docs/model-sources/providers/cohere/access/model-specs--cohere.md @@ -22,7 +22,8 @@ - [`rerank-v4.0-pro`](../models/rerank-v4.0-pro.md) - [`embed-v5.0-pro`](../models/embed-v5.0-pro.md) - [`command-a-plus-05-2026`](../models/command-a-plus-05-2026.md) -- [`north-mini-code`](../models/north-mini-code.md) +- [`north-mini-code-1-0`](../models/north-mini-code-1-0.md) +- [`north-small-translate-1-0`](../models/north-small-translate-1-0.md) - [`command-a-03-2025`](../models/command-a-03-2025.md) - [`command-r7b-12-2024`](../models/command-r7b-12-2024.md) - [`embed-v4.0`](../models/embed-v4.0.md) diff --git a/docs/model-sources/providers/cohere/access/providers--cohere.md b/docs/model-sources/providers/cohere/access/providers--cohere.md index afaefdc..0910885 100644 --- a/docs/model-sources/providers/cohere/access/providers--cohere.md +++ b/docs/model-sources/providers/cohere/access/providers--cohere.md @@ -16,7 +16,7 @@ 以上是配置快照,不能据此宣布该端点或账号已实际验收。核查地域、套餐支持、凭据来源及协议时,对照官网证据目录并记录结论。 - + ## 关联模型 @@ -26,7 +26,6 @@ - [`command-a-03-2025`](../models/command-a-03-2025.md) - [`command-r7b-12-2024`](../models/command-r7b-12-2024.md) - [`embed-v4.0`](../models/embed-v4.0.md) -- [`rerank-v3.5`](../models/rerank-v3.5.md) ## 更新前检查 @@ -44,3 +43,7 @@ } ``` + +## 接入面边界 + +本端点只有官方明确的 Chat/文本 Embed 兼容能力。2026-10-03 移除误列的原生 Rerank3.5;tombstone 使存量预设停止继续宣称可用,独立原生 Rerank 适配另行验收。 diff --git a/docs/model-sources/providers/cohere/models/embed-v4.0.md b/docs/model-sources/providers/cohere/models/embed-v4.0.md index 88aea61..594167a 100644 --- a/docs/model-sources/providers/cohere/models/embed-v4.0.md +++ b/docs/model-sources/providers/cohere/models/embed-v4.0.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`embed-v4.0`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -44,7 +44,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `embed-v4.0` | 128000 / 0 | USD:0.12 / 0 | `modelName`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-models](../SOURCES.md#cohere-models) | partial | `1b14287bc87b2f32efa8a5a8eafc13c972fa2e4fd7bc3fa4c00262dfe33ecf0d` | +| `embed-v4.0` | 128000 / 0 | USD:0.12 / 0 | `modelName`→[cohere-models](../SOURCES.md#cohere-models);`extra.defaultDimension`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-models](../SOURCES.md#cohere-models) | partial | `1b14287bc87b2f32efa8a5a8eafc13c972fa2e4fd7bc3fa4c00262dfe33ecf0d` | ### compute/model-specs/cohere.json @@ -62,7 +62,14 @@ "spec.capabilities": [ "text_embedding", "multilingual" - ] + ], + "spec.extra.dimensions": [ + 256, + 512, + 1024, + 1536 + ], + "spec.extra.defaultDimension": 1536 } ``` @@ -71,7 +78,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `embed-v4.0` | 128000 / 未声明 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-models](../SOURCES.md#cohere-models) | partial | `1d31441bbfbb712efab4911ea9e1274b254356ba5432c93348666bc769d54dca` | +| `embed-v4.0` | 128000 / 未声明 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models);`spec.extra.dimensions`→[cohere-models](../SOURCES.md#cohere-models);`spec.extra.defaultDimension`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-models](../SOURCES.md#cohere-models) | partial | `46794dc51487aa6af50a9bc92e9aae5e38dc9de06e8104669a28a225e6e8a0cd` | + +## 本轮补充核验 + +官方型号表逐一给出原生向量维度与默认值;兼容接口不支持 dimensions 请求参数,Provider 不因此新增可选维度。128k 为简写,未提高精确窗口证明。 + +## 本轮补充核验 + +官方原生默认向量维度已核;兼容 API 不接受 dimensions 参数,本文不把原生多模态与可变维度等同于兼容端点。 ## 下次更新核查 diff --git a/docs/model-sources/providers/cohere/models/embed-v5.0-fast.md b/docs/model-sources/providers/cohere/models/embed-v5.0-fast.md index e5144de..5d2476b 100644 --- a/docs/model-sources/providers/cohere/models/embed-v5.0-fast.md +++ b/docs/model-sources/providers/cohere/models/embed-v5.0-fast.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`embed-v5.0-fast`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -41,7 +41,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `embed-v5.0-fast` | 128000 / 未声明 | USD:未声明 / 未声明 | `extra.defaultDimension`→[cohere-embed](../SOURCES.md#cohere-embed), `modelName`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-embed](../SOURCES.md#cohere-embed), [cohere-models](../SOURCES.md#cohere-models) | partial | `0028df6b24ded4e2557122d597dd9e79699bb8590aaa53c950d5cb61a32a2c15` | +| `embed-v5.0-fast` | 128000 / 未声明 | USD:未声明 / 未声明 | `extra.defaultDimension`→[cohere-embed](../SOURCES.md#cohere-embed), `modelName`→[cohere-models](../SOURCES.md#cohere-models);`extra.defaultDimension`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-embed](../SOURCES.md#cohere-embed), [cohere-models](../SOURCES.md#cohere-models) | partial | `0028df6b24ded4e2557122d597dd9e79699bb8590aaa53c950d5cb61a32a2c15` | ### compute/model-specs/cohere.json @@ -79,7 +79,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `embed-v5.0-fast` | 128000 / 未声明 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models), `spec.extra.defaultDimension`→[cohere-embed](../SOURCES.md#cohere-embed), `spec.extra.dimensions`→[cohere-embed](../SOURCES.md#cohere-embed) | [cohere-embed](../SOURCES.md#cohere-embed), [cohere-models](../SOURCES.md#cohere-models) | partial | `df36c5648277525a4ea74d15747684b65a8df39795ab121f8f1814fa45c16864` | +| `embed-v5.0-fast` | 128000 / 未声明 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models), `spec.extra.defaultDimension`→[cohere-embed](../SOURCES.md#cohere-embed), `spec.extra.dimensions`→[cohere-embed](../SOURCES.md#cohere-embed);`spec.extra.dimensions`→[cohere-models](../SOURCES.md#cohere-models);`spec.extra.defaultDimension`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-embed](../SOURCES.md#cohere-embed), [cohere-models](../SOURCES.md#cohere-models) | partial | `df36c5648277525a4ea74d15747684b65a8df39795ab121f8f1814fa45c16864` | + +## 本轮补充核验 + +官方型号表逐一给出原生向量维度与默认值;兼容接口不支持 dimensions 请求参数,Provider 不因此新增可选维度。128k 为简写,未提高精确窗口证明。 + +## 本轮补充核验 + +官方原生默认向量维度已核;兼容 API 不接受 dimensions 参数,本文不把原生多模态与可变维度等同于兼容端点。 ## 下次更新核查 diff --git a/docs/model-sources/providers/cohere/models/embed-v5.0-pro.md b/docs/model-sources/providers/cohere/models/embed-v5.0-pro.md index 6eb1533..3610d7f 100644 --- a/docs/model-sources/providers/cohere/models/embed-v5.0-pro.md +++ b/docs/model-sources/providers/cohere/models/embed-v5.0-pro.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`embed-v5.0-pro`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -41,7 +41,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `embed-v5.0-pro` | 128000 / 未声明 | USD:未声明 / 未声明 | `extra.defaultDimension`→[cohere-embed](../SOURCES.md#cohere-embed), `modelName`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-embed](../SOURCES.md#cohere-embed), [cohere-models](../SOURCES.md#cohere-models) | partial | `c39dbf7e430873ac18f25292da6308ced9910764055d5a1558c965731d556564` | +| `embed-v5.0-pro` | 128000 / 未声明 | USD:未声明 / 未声明 | `extra.defaultDimension`→[cohere-embed](../SOURCES.md#cohere-embed), `modelName`→[cohere-models](../SOURCES.md#cohere-models);`extra.defaultDimension`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-embed](../SOURCES.md#cohere-embed), [cohere-models](../SOURCES.md#cohere-models) | partial | `c39dbf7e430873ac18f25292da6308ced9910764055d5a1558c965731d556564` | ### compute/model-specs/cohere.json @@ -79,7 +79,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `embed-v5.0-pro` | 128000 / 未声明 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models), `spec.extra.defaultDimension`→[cohere-embed](../SOURCES.md#cohere-embed), `spec.extra.dimensions`→[cohere-embed](../SOURCES.md#cohere-embed) | [cohere-embed](../SOURCES.md#cohere-embed), [cohere-models](../SOURCES.md#cohere-models) | partial | `da0a4136e27363bcc3c73806d7c2ef3f696698f3373799b7aad4a378d3a3bc4d` | +| `embed-v5.0-pro` | 128000 / 未声明 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models), `spec.extra.defaultDimension`→[cohere-embed](../SOURCES.md#cohere-embed), `spec.extra.dimensions`→[cohere-embed](../SOURCES.md#cohere-embed);`spec.extra.dimensions`→[cohere-models](../SOURCES.md#cohere-models);`spec.extra.defaultDimension`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-embed](../SOURCES.md#cohere-embed), [cohere-models](../SOURCES.md#cohere-models) | partial | `da0a4136e27363bcc3c73806d7c2ef3f696698f3373799b7aad4a378d3a3bc4d` | + +## 本轮补充核验 + +官方型号表逐一给出原生向量维度与默认值;兼容接口不支持 dimensions 请求参数,Provider 不因此新增可选维度。128k 为简写,未提高精确窗口证明。 + +## 本轮补充核验 + +官方原生默认向量维度已核;兼容 API 不接受 dimensions 参数,本文不把原生多模态与可变维度等同于兼容端点。 ## 下次更新核查 diff --git a/docs/model-sources/providers/cohere/models/north-mini-code-1-0.md b/docs/model-sources/providers/cohere/models/north-mini-code-1-0.md new file mode 100644 index 0000000..b91b98d --- /dev/null +++ b/docs/model-sources/providers/cohere/models/north-mini-code-1-0.md @@ -0,0 +1,66 @@ +# north-mini-code-1-0:模型来源与接入记录 + +[供应商索引](../README.md) · [官网证据目录](../SOURCES.md) + +- 精确模型 ID:`north-mini-code-1-0`。 +- 核验日期:2026-10-03;本轮实读原厂型号表与独立说明,规范精确身份;其余未核参数保持边界。 + +## 适用接入面 + +- [compute/model-specs/cohere.json](../access/model-specs--cohere.md) + +## 字段级来源记录 + +各接入面分开记录;价格为 inputPrice/outputPrice 快照,具体单位和限制看配置及引用官网。partial 只确认已列字段,不代表全部参数、平台可用性或账号调用已验收。 + +### compute/model-specs/cohere.json + +[查看配置](../../../../../compute/model-specs/cohere.json) · [接入面说明](../access/model-specs--cohere.md) + +当前配置详情(不是全部官网确认值;routing 是本仓策略): + + +```json +{ + "spec.contextWindow": 256000, + "spec.maxOutputTokens": 64000, + "spec.serviceType": [ + "chat" + ], + "spec.capabilities": [ + "chat", + "code", + "tool_use" + ] +} +``` + + + + +| 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | +| --- | --- | --- | --- | --- | --- | --- | +| `north-mini-code-1-0` | 256000 / 64000 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-models](../SOURCES.md#cohere-models) | partial | `67111742bda27c80bbccdd4244d8a24122e4d75207d31de60aa4e6f538118894` | + +## 下次更新核查 + +- 对照官网核查精确 ID/别名、是否仍列出、上下文/输入/输出限制及单位。 +- 分别核查推理档位、默认值、是否可关闭思考、采样和强制工具选择限制、多模态输入/输出。 +- 按本接入面核对价格、缓存、阶梯/峰谷、套餐支持;不能把其他平台参数直接复制。 +- 只更新真正复核的字段与引用来源;保留其余待核实项及历史记录。 +- 同步对应 canonical JSON、回归和模型指纹,再运行来源校验。 + + +```json +{ + "formatVersion": 1, + "supplier": "cohere", + "checkedAt": "2026-10-03", + "sourceCatalog": "../SOURCES.md" +} +``` + + +## 精确身份与历史简称 + +官网型号表明确API ID为north-mini-code-1-0,独立产品页标题North Mini Code不能证明north-mini-code是原厂请求别名。旧简称仅在match.exact保留为本仓历史配置兼容,不以官网来源证明;移除north-mini-code*宽匹配,防止未来代际继承该规格。原厂256k/64k简写沿用已有256000/64000但未标为精确字段证明。旧supportsReasoning=true未取得请求合同依据,移除,不以算法推理能力介绍推断可配置thinking。 diff --git a/docs/model-sources/providers/cohere/models/north-mini-code.md b/docs/model-sources/providers/cohere/models/north-mini-code.md index 3bb066c..dac96af 100644 --- a/docs/model-sources/providers/cohere/models/north-mini-code.md +++ b/docs/model-sources/providers/cohere/models/north-mini-code.md @@ -1,63 +1,3 @@ -# north-mini-code:模型来源与接入记录 +# north-mini-code:历史简称 -[供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - -- 精确模型 ID:`north-mini-code`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 - -## 适用接入面 - -- [compute/model-specs/cohere.json](../access/model-specs--cohere.md) - -## 字段级来源记录 - -各接入面分开记录;价格为 inputPrice/outputPrice 快照,具体单位和限制看配置及引用官网。partial 只确认已列字段,不代表全部参数、平台可用性或账号调用已验收。 - -### compute/model-specs/cohere.json - -[查看配置](../../../../../compute/model-specs/cohere.json) · [接入面说明](../access/model-specs--cohere.md) - -当前配置详情(不是全部官网确认值;routing 是本仓策略): - - -```json -{ - "spec.contextWindow": 256000, - "spec.maxOutputTokens": 64000, - "spec.serviceType": [ - "chat" - ], - "spec.capabilities": [ - "chat", - "code", - "tool_use" - ], - "spec.supportsReasoning": true -} -``` - - - - -| 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | -| --- | --- | --- | --- | --- | --- | --- | -| `north-mini-code` | 256000 / 64000 | 非计价主数据 | 待核实 | [cohere-models](../SOURCES.md#cohere-models) | pending | `23b56d984a044c5bd5a19eeb85485485a1aded65c92332bdf247b3dcbf7d81b9` | - -## 下次更新核查 - -- 对照官网核查精确 ID/别名、是否仍列出、上下文/输入/输出限制及单位。 -- 分别核查推理档位、默认值、是否可关闭思考、采样和强制工具选择限制、多模态输入/输出。 -- 按本接入面核对价格、缓存、阶梯/峰谷、套餐支持;不能把其他平台参数直接复制。 -- 只更新真正复核的字段与引用来源;保留其余待核实项及历史记录。 -- 同步对应 canonical JSON、回归和模型指纹,再运行来源校验。 - - -```json -{ - "formatVersion": 1, - "supplier": "cohere", - "checkedAt": "2026-10-03", - "sourceCatalog": "../SOURCES.md" -} -``` - +已规范为[官网精确模型ID north-mini-code-1-0](north-mini-code-1-0.md)。旧简称只保留本仓历史exact配置匹配,未确认原厂API接受该简称;没有独立官网身份参数证明。 diff --git a/docs/model-sources/providers/cohere/models/north-small-translate-1-0.md b/docs/model-sources/providers/cohere/models/north-small-translate-1-0.md new file mode 100644 index 0000000..b69dd7f --- /dev/null +++ b/docs/model-sources/providers/cohere/models/north-small-translate-1-0.md @@ -0,0 +1,64 @@ +# north-small-translate-1-0:模型来源与接入记录 + +[供应商索引](../README.md) · [官网证据目录](../SOURCES.md) + +- 精确模型 ID:`north-small-translate-1-0`。 +- 核验日期:2026-10-03;本轮实读原厂型号表与独立说明,规范精确身份;其余未核参数保持边界。 + +## 适用接入面 + +- [compute/model-specs/cohere.json](../access/model-specs--cohere.md) + +## 字段级来源记录 + +各接入面分开记录;价格为 inputPrice/outputPrice 快照,具体单位和限制看配置及引用官网。partial 只确认已列字段,不代表全部参数、平台可用性或账号调用已验收。 + +### compute/model-specs/cohere.json + +[查看配置](../../../../../compute/model-specs/cohere.json) · [接入面说明](../access/model-specs--cohere.md) + +当前配置详情(不是全部官网确认值;routing 是本仓策略): + + +```json +{ + "spec.serviceType": [ + "chat" + ], + "spec.capabilities": [ + "chat", + "multilingual" + ] +} +``` + + + + +| 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | +| --- | --- | --- | --- | --- | --- | --- | +| `north-small-translate-1-0` | 未声明 / 未声明 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models);`id`→[north-translate-doc](../SOURCES.md#north-translate-doc) | [cohere-models](../SOURCES.md#cohere-models);[north-translate-doc](../SOURCES.md#north-translate-doc) | partial | `a3ca2ed7f61b7cabca2e413574994827a8e9c515d25d1e40740e0a077e2e76b5` | + +## 下次更新核查 + +- 对照官网核查精确 ID/别名、是否仍列出、上下文/输入/输出限制及单位。 +- 分别核查推理档位、默认值、是否可关闭思考、采样和强制工具选择限制、多模态输入/输出。 +- 按本接入面核对价格、缓存、阶梯/峰谷、套餐支持;不能把其他平台参数直接复制。 +- 只更新真正复核的字段与引用来源;保留其余待核实项及历史记录。 +- 同步对应 canonical JSON、回归和模型指纹,再运行来源校验。 + + +```json +{ + "formatVersion": 1, + "supplier": "cohere", + "checkedAt": "2026-10-03", + "sourceCatalog": "../SOURCES.md" +} +``` + + + +## 本轮身份核验与规格边界 + +原厂型号表及独立页面Python示例model="north-small-translate-1-0"一致。官网窗口与最大输出均写16k,未取得明文整数,本轮不补猜测值。仅共享规格登记,不上架任何Provider;原生Chat合同、授权账号、价格、采样与reasoning仍需独立核验。 diff --git a/docs/model-sources/providers/cohere/models/rerank-v3.5.md b/docs/model-sources/providers/cohere/models/rerank-v3.5.md index 383c8e4..84aa449 100644 --- a/docs/model-sources/providers/cohere/models/rerank-v3.5.md +++ b/docs/model-sources/providers/cohere/models/rerank-v3.5.md @@ -3,48 +3,16 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`rerank-v3.5`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 -- [compute/providers/cohere.json](../access/providers--cohere.md) - [compute/model-specs/cohere.json](../access/model-specs--cohere.md) ## 字段级来源记录 各接入面分开记录;价格为 inputPrice/outputPrice 快照,具体单位和限制看配置及引用官网。partial 只确认已列字段,不代表全部参数、平台可用性或账号调用已验收。 -### compute/providers/cohere.json - -[查看配置](../../../../../compute/providers/cohere.json) · [接入面说明](../access/providers--cohere.md) - -当前配置详情(不是全部官网确认值;routing 是本仓策略): - - -```json -{ - "contextWindow": 4096, - "maxOutputTokens": 0, - "serviceType": [ - "rerank" - ], - "capabilities": [ - "rerank", - "semantic_reranking" - ], - "inputPrice": 2, - "outputPrice": 0, - "extra.pricingNotes": "Cohere Rerank is priced by search units, not input/output tokens; one search unit is one query with up to 100 documents. The token price fields are retained for schema compatibility." -} -``` - - - - -| 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | -| --- | --- | --- | --- | --- | --- | --- | -| `rerank-v3.5` | 4096 / 0 | USD:2 / 0 | `modelName`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-models](../SOURCES.md#cohere-models) | partial | `aa55d4660b80ea3f2a34ede077aee72bc4f22d505fc5dc212439ea37ce74474a` | - ### compute/model-specs/cohere.json [查看配置](../../../../../compute/model-specs/cohere.json) · [接入面说明](../access/model-specs--cohere.md) @@ -70,7 +38,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `rerank-v3.5` | 4096 / 未声明 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models) | [cohere-models](../SOURCES.md#cohere-models) | partial | `dfb7f20fb7d49a6a6188859b78c4d5f6b58a405cb06cf8fac18d02d9a4a057d4` | +| `rerank-v3.5` | 4096 / 未声明 | 非计价主数据 | `id`→[cohere-models](../SOURCES.md#cohere-models);`spec.contextWindow`→[cohere-rerank](../SOURCES.md#cohere-rerank) |[cohere-models](../SOURCES.md#cohere-models);[cohere-rerank](../SOURCES.md#cohere-rerank) | partial | `dfb7f20fb7d49a6a6188859b78c4d5f6b58a405cb06cf8fac18d02d9a4a057d4` | + +## 本轮补充核验 + +官网 Rerank 页明确 context4096。移除错误单位的 token 单价;服务需要原生 /v2/rerank,当前 compatibility/v1 没有对应端点,不能把结构校验通过宣称为可调用。 + +## 本轮补充核验 + +官网 Rerank 页明文4096,本轮确认共享参数;接口与计价独立。 ## 下次更新核查 @@ -90,3 +66,7 @@ } ``` + +## 历史兼容接入下架 + +2026-10-03 从 OpenAI compatibility/v1 Provider 移除 rerank-v3.5,并加入 tombstones。旧条目 inputPrice=2/outputPrice=0 把 search unit 误装入 token 价字段,已随错误接入条目移除;不宣称它是免费 token 输出。原生共享规格保留;未来应在客户端支持原生 /v2/rerank 后增加独立接入面,核验 search unit 单位与实际请求。 diff --git a/docs/model-sources/providers/deepseek/AUDIT.md b/docs/model-sources/providers/deepseek/AUDIT.md new file mode 100644 index 0000000..b19cc97 --- /dev/null +++ b/docs/model-sources/providers/deepseek/AUDIT.md @@ -0,0 +1,18 @@ +# DeepSeek:2026-10-03 数据核验与后续计划 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +本轮清除共享DeepSeekV4Flash0731中的网关effort旧字段;接入合同由Provider定义,已有路由策略保持。百炼TokenPlan并列旧字段删除,保留已生效high/max矩阵,不把原厂档位抄入套餐。 + +| 待完成 | 验收标准 | +| --- | --- | +| 动态原厂flash身份 | 当前官方API参考使用deepseek-flash,核与固定0731/V4.1身份差异,不跨代合并 | +| 百炼输出393216与历史384000 | 百炼按量官方明确393216,但套餐合同独立;先核套餐表再改,不直接套原厂spec | +| 原厂1M/384K精确换算 | 取得Models API明文整数,区别输入/总窗口/输出与thinking共享预算 | +| 旧chat/reasoner生命周期 | 官方change log已列退役计划,更新前确认当前可用性、映射与tombstone | + +没有账号调用;本轮字段删除不提高未知参数的来源状态。 + +## 本轮最终记录统计 + +本仓记录 12 条:pending 3、partial 9、historical 0;partial 中仅 ID 证明 5 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/deepseek/README.md b/docs/model-sources/providers/deepseek/README.md index 072c416..2fc6d1d 100644 --- a/docs/model-sources/providers/deepseek/README.md +++ b/docs/model-sources/providers/deepseek/README.md @@ -1,6 +1,6 @@ # DeepSeek:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 8 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/deepseek/models/deepseek-v4-flash-0731.md b/docs/model-sources/providers/deepseek/models/deepseek-v4-flash-0731.md index 8a2eb6d..e75f173 100644 --- a/docs/model-sources/providers/deepseek/models/deepseek-v4-flash-0731.md +++ b/docs/model-sources/providers/deepseek/models/deepseek-v4-flash-0731.md @@ -57,7 +57,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `deepseek-v4-flash-0731` | 1000000 / 384000 | 非计价主数据 | 待核实 | [deepseek-pricing](../SOURCES.md#deepseek-pricing) | pending | `a7e00817468dfc4f7b45e9de8fc3d9fabb4d417f1535ea36f03533855b0b0368` | +| `deepseek-v4-flash-0731` | 1000000 / 384000 | 非计价主数据 | 待核实 | [deepseek-pricing](../SOURCES.md#deepseek-pricing) | pending | `78655b7df315439489b83557a8add0821837471cfab1177f24765323dd87f26e` | ## 下次更新核查 @@ -77,3 +77,7 @@ } ``` + +## 本轮接入合同清理 + +共享规格的 spec.extra.reasoningEffort 已移除:它属于具体网关可接受的请求档位,不能作为内在规格下发。保留既有 routing.reasoning 策略及其他参数,不借此提高官方核验状态。百炼套餐已有生效的 extra.reasoning high/max;只删除并列旧键,不把原厂或按量 API 的 low 档位自动套用到套餐。 diff --git a/docs/model-sources/providers/github-copilot/AUDIT.md b/docs/model-sources/providers/github-copilot/AUDIT.md new file mode 100644 index 0000000..4d38de8 --- /dev/null +++ b/docs/model-sources/providers/github-copilot/AUDIT.md @@ -0,0 +1,27 @@ +# github-copilot:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +本次官方支持型号文档可读取,但产品支持列表不等于每个订阅账号的 /models 结果。 + +保持登录后动态发现。验收需按订阅/组织策略读取官方认证模型目录并验证 endpoint,不能预置整个官网列表。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [copilot](https://docs.github.com/en/copilot/reference/ai-models/supported-models) | 正文已读取 | 415569 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:0 条;pending 0、partial 0、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 0 条:pending 0、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/github-copilot/README.md b/docs/model-sources/providers/github-copilot/README.md index 76d9b96..b9fd429 100644 --- a/docs/model-sources/providers/github-copilot/README.md +++ b/docs/model-sources/providers/github-copilot/README.md @@ -1,6 +1,6 @@ # GitHub Copilot:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 0 个单模型文件、1 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/github-copilot/SOURCES.md b/docs/model-sources/providers/github-copilot/SOURCES.md index 764b2f7..3172eb9 100644 --- a/docs/model-sources/providers/github-copilot/SOURCES.md +++ b/docs/model-sources/providers/github-copilot/SOURCES.md @@ -31,7 +31,7 @@ "scope": "github-copilot 官方入口;具体地域与接入面待该页面逐字段确认", "retrieval": "fetched", "checkedAt": "2026-10-03", - "contentSha256": "04fdb2b49d58e908eab50c8011142c575bafe78e184ed090c4c514a3eca78758", + "contentSha256": "85108143a4acd41577bbd1008ce224538fb3bd1ff77948d22008212f51ca0494", "resolvedUrl": "https://docs.github.com/en/copilot/reference/ai-models/supported-models" } ] diff --git a/docs/model-sources/providers/google/AUDIT.md b/docs/model-sources/providers/google/AUDIT.md new file mode 100644 index 0000000..f00a0b5 --- /dev/null +++ b/docs/model-sources/providers/google/AUDIT.md @@ -0,0 +1,23 @@ +# Google:2026-10-03 数据核验与后续计划 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +## 本轮完成 + +实际读取9个文本模型的独立官方模型页,确认输出上限65536,并补单模型字段引用与源码内容摘要。保留独立输入限额1048576的原文语义,不把它自动作为输入加输出总窗口证明。Embedding2与TTS既有独立限制记录继续保留。 + +## 待完成与验收标准 + +| 事项 | 当前边界 | 下一步与完成条件 | +| --- | --- | --- | +| 窗口语义 | 官方字段是 Input token limit,而当前配置名为 contextWindow | 确认客户端对该字段的使用及请求预算;输入与总窗口不得混算 | +| 原生音频接入 | Live、Transcribe、新TTS只登记共享规格 | 客户端实现对应协议、流式或会话事件及鉴权,版本门控后以聚焦请求验收 | +| 定价 | 本轮未完整逐项核对现有文本价格、缓存和阶梯 | 分付费tier/地区/计价单位读取官方pricing,再核单模型价;不复用Vertex价格到Developer API | +| 存量精确身份 | text-embedding-005 属于Vertex接入合同,不能用Developer目录证明 | 单独读取Vertex接口和模型页,确认baseUrl、ID与凭据机制是否实际支持 | +| Preview生命周期 | preview名可能改变或退役 | 读取官方deprecations,核停止时间、替代ID、别名与tombstones | + +没有进行账号调用;结构和来源校验不代表请求已验收。 + +## 本轮最终记录统计 + +本仓记录 30 条:pending 2、partial 28、historical 0;partial 中仅 ID 证明 8 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/google/README.md b/docs/model-sources/providers/google/README.md index 8568bf5..6ad7a7c 100644 --- a/docs/model-sources/providers/google/README.md +++ b/docs/model-sources/providers/google/README.md @@ -1,6 +1,6 @@ # Google Gemini:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 20 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/google/SOURCES.md b/docs/model-sources/providers/google/SOURCES.md index 4b853f2..8b5c260 100644 --- a/docs/model-sources/providers/google/SOURCES.md +++ b/docs/model-sources/providers/google/SOURCES.md @@ -23,6 +23,51 @@ - 入口:[google-transcribe](https://ai.google.dev/gemini-api/docs/models/gemini-3.5-transcribe) - 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Gemini Developer API 原生转写,客户端协议适配另核`。 +### gemini-3-8-flash-limits + +- 入口:[gemini-3-8-flash-limits](https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Gemini Developer API 精确模型页;input 与 output 限额独立。 + +### gemini-3-7-flash-limits + +- 入口:[gemini-3-7-flash-limits](https://ai.google.dev/gemini-api/docs/models/gemini-3.7-flash) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Gemini Developer API 精确模型页;input 与 output 限额独立。 + +### gemini-3-5-flash-lite-limits + +- 入口:[gemini-3-5-flash-lite-limits](https://ai.google.dev/gemini-api/docs/models/gemini-3.5-flash-lite) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Gemini Developer API 精确模型页;input 与 output 限额独立。 + +### gemini-3-5-flash-limits + +- 入口:[gemini-3-5-flash-limits](https://ai.google.dev/gemini-api/docs/models/gemini-3.5-flash) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Gemini Developer API 精确模型页;input 与 output 限额独立。 + +### gemini-3-1-flash-lite-limits + +- 入口:[gemini-3-1-flash-lite-limits](https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Gemini Developer API 精确模型页;input 与 output 限额独立。 + +### gemini-3-1-pro-preview-limits + +- 入口:[gemini-3-1-pro-preview-limits](https://ai.google.dev/gemini-api/docs/models/gemini-3.1-pro-preview) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Gemini Developer API 精确模型页;input 与 output 限额独立。 + +### gemini-3-flash-preview-limits + +- 入口:[gemini-3-flash-preview-limits](https://ai.google.dev/gemini-api/docs/models/gemini-3-flash-preview) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Gemini Developer API 精确模型页;input 与 output 限额独立。 + +### gemini-2-5-pro-limits + +- 入口:[gemini-2-5-pro-limits](https://ai.google.dev/gemini-api/docs/models/gemini-2.5-pro) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Gemini Developer API 精确模型页;input 与 output 限额独立。 + +### gemini-2-5-flash-limits + +- 入口:[gemini-2-5-flash-limits](https://ai.google.dev/gemini-api/docs/models/gemini-2.5-flash) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Gemini Developer API 精确模型页;input 与 output 限额独立。 + ## 已知边界与核验说明 Embedding 2 的最大输入 8192 和推荐维度 768/1536/3072 已再次核对。新 TTS 的输入 8192 与输出 16384 是分别的限制,不用 output<=input 判断错误。新音频协议只有共享规格,不能宣称客户端已适配。 @@ -40,41 +85,131 @@ Embedding 2 的最大输入 8192 和推荐维度 768/1536/3072 已再次核对 "id": "google-models", "url": "https://ai.google.dev/gemini-api/docs/models", "kind": "official-doc", - "scope": "google 官方入口;具体地域与接入面待该页面逐字段确认", + "scope": "本轮读取 google 官方 google-models 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", - "contentSha256": "4075eec253ae128a90047a245782171c0fa7661547ee57c58d480c5720adbbb6", + "contentSha256": "6e733f05dd42bc5645b98f0c7e882d39992043a01ef70409c4046b44525b0f62", "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models" }, { "id": "google-embedding", "url": "https://ai.google.dev/gemini-api/docs/embeddings", "kind": "official-doc", - "scope": "Gemini Developer API 原生 Embedding 2;输入限额与输出向量维度", + "scope": "本轮读取 google 官方 google-embedding 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", - "contentSha256": "a77debcbe84ab080c4e1fa7ca70b34c74f2b9c4dde3bdcfaaed24b8368cf0e82", + "contentSha256": "8c689e5b0d6efc4877bf8bee2c47d86a6aa95a4759f753f70909b72d7731575d", "resolvedUrl": "https://ai.google.dev/gemini-api/docs/embeddings" }, { "id": "google-tts", "url": "https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash-tts", "kind": "official-doc", - "scope": "Gemini Developer API 原生 TTS;输入和输出分别限额", + "scope": "本轮读取 google 官方 google-tts 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", - "contentSha256": "7bd15a9d4430fefb6772aa9a8c9b314aa3be86968e9f6a36743b497eb1bc6d3f", + "contentSha256": "85dd9fcd358abbfe7a60eddb2e555bd575e9e67f8619101cc221bdc8dbbb0e96", "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash-tts" }, { "id": "google-transcribe", "url": "https://ai.google.dev/gemini-api/docs/models/gemini-3.5-transcribe", "kind": "official-doc", - "scope": "Gemini Developer API 原生转写,客户端协议适配另核", + "scope": "本轮读取 google 官方 google-transcribe 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", - "contentSha256": "2482c6436e9cae98619b62ecaf291772974f23f22be59dbbf2ecce79dc376983", + "contentSha256": "5bc7197abb570de7d97328156ae6945e5ac2f4bc4f71b25241af356003779b63", "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-3.5-transcribe" + }, + { + "id": "gemini-3-8-flash-limits", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash", + "kind": "official-doc", + "scope": "Gemini Developer API 精确模型页;input 与 output 限额独立", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "501054658f82eef3a1b77fa07dba4f7e9a2707d2e05967edfd5c4f86d9cb8b94", + "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash" + }, + { + "id": "gemini-3-7-flash-limits", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-3.7-flash", + "kind": "official-doc", + "scope": "Gemini Developer API 精确模型页;input 与 output 限额独立", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "cbf8b675f6646f7ad9531ded395231116852649da894b9dedfdc443649de2c4c", + "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-3.7-flash" + }, + { + "id": "gemini-3-5-flash-lite-limits", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-3.5-flash-lite", + "kind": "official-doc", + "scope": "Gemini Developer API 精确模型页;input 与 output 限额独立", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "f882612c75dc5c05dd3a81731a74619b43ada1f6e0299d78410ef997735e4cdb", + "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-3.5-flash-lite" + }, + { + "id": "gemini-3-5-flash-limits", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-3.5-flash", + "kind": "official-doc", + "scope": "Gemini Developer API 精确模型页;input 与 output 限额独立", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "9064efb36a594cac683f0bc8e485ef9ed2af6d4819dc4519b371b880e91e05fc", + "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-3.5-flash" + }, + { + "id": "gemini-3-1-flash-lite-limits", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite", + "kind": "official-doc", + "scope": "Gemini Developer API 精确模型页;input 与 output 限额独立", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "b3eb09cfc8702dec2304a0040d80da4340afbf9832b5420f7b9fa0b6c6ef629b", + "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-3.1-flash-lite" + }, + { + "id": "gemini-3-1-pro-preview-limits", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-3.1-pro-preview", + "kind": "official-doc", + "scope": "Gemini Developer API 精确模型页;input 与 output 限额独立", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "a23d9b5e92d9bc2f600442b71e564758836c5f6581f447eed9d36e0a83b7e085", + "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-3.1-pro-preview" + }, + { + "id": "gemini-3-flash-preview-limits", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-3-flash-preview", + "kind": "official-doc", + "scope": "Gemini Developer API 精确模型页;input 与 output 限额独立", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "f2dfffd80a12490e9d5955adfd76243802237c118748f6f3aefa05109cab8732", + "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-3-flash-preview" + }, + { + "id": "gemini-2-5-pro-limits", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-2.5-pro", + "kind": "official-doc", + "scope": "Gemini Developer API 精确模型页;input 与 output 限额独立", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "0d16c0b445ced4f8999f6d1013ae2462b4f4415faf4928e3b94fc20e07bab418", + "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-2.5-pro" + }, + { + "id": "gemini-2-5-flash-limits", + "url": "https://ai.google.dev/gemini-api/docs/models/gemini-2.5-flash", + "kind": "official-doc", + "scope": "Gemini Developer API 精确模型页;input 与 output 限额独立", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "e362b28bbf49e3baf48f6e8b97dd01c00456c0a23ca0f84badc5f5218eca8679", + "resolvedUrl": "https://ai.google.dev/gemini-api/docs/models/gemini-2.5-flash" } ] } diff --git a/docs/model-sources/providers/google/models/gemini-2.5-flash.md b/docs/model-sources/providers/google/models/gemini-2.5-flash.md index 47bf1ec..9b629c3 100644 --- a/docs/model-sources/providers/google/models/gemini-2.5-flash.md +++ b/docs/model-sources/providers/google/models/gemini-2.5-flash.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gemini-2.5-flash`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -49,7 +49,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-2.5-flash` | 1048576 / 65536 | USD:0.3 / 2.5 | `modelName`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `0d86d9b041dfb7e5480c6d27fdcdfbbf5bd57273af980a83eb794b389750861a` | +| `gemini-2.5-flash` | 1048576 / 65536 | USD:0.3 / 2.5 | `modelName`→[google-models](../SOURCES.md#google-models);`maxOutputTokens`→[gemini-2-5-flash-limits](../SOURCES.md#gemini-2-5-flash-limits) |[google-models](../SOURCES.md#google-models);[gemini-2-5-flash-limits](../SOURCES.md#gemini-2-5-flash-limits) | partial | `0d86d9b041dfb7e5480c6d27fdcdfbbf5bd57273af980a83eb794b389750861a` | ### compute/model-specs/google.json @@ -84,7 +84,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-2.5-flash` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `a1284981557da3f541a483a6f9e043878a70206720163aaa03e2e3e5e43ac5f0` | +| `gemini-2.5-flash` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models);`spec.maxOutputTokens`→[gemini-2-5-flash-limits](../SOURCES.md#gemini-2-5-flash-limits) |[google-models](../SOURCES.md#google-models);[gemini-2-5-flash-limits](../SOURCES.md#gemini-2-5-flash-limits) | partial | `a1284981557da3f541a483a6f9e043878a70206720163aaa03e2e3e5e43ac5f0` | + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 ## 下次更新核查 diff --git a/docs/model-sources/providers/google/models/gemini-2.5-pro.md b/docs/model-sources/providers/google/models/gemini-2.5-pro.md index 1190f2c..d803634 100644 --- a/docs/model-sources/providers/google/models/gemini-2.5-pro.md +++ b/docs/model-sources/providers/google/models/gemini-2.5-pro.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gemini-2.5-pro`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -48,7 +48,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-2.5-pro` | 1048576 / 65536 | USD:1.25 / 10 | `modelName`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `279a602a413df050eb26dcd4bc0fba8e0959a9cbc9d5f9e4d214254e436496fe` | +| `gemini-2.5-pro` | 1048576 / 65536 | USD:1.25 / 10 | `modelName`→[google-models](../SOURCES.md#google-models);`maxOutputTokens`→[gemini-2-5-pro-limits](../SOURCES.md#gemini-2-5-pro-limits) |[google-models](../SOURCES.md#google-models);[gemini-2-5-pro-limits](../SOURCES.md#gemini-2-5-pro-limits) | partial | `279a602a413df050eb26dcd4bc0fba8e0959a9cbc9d5f9e4d214254e436496fe` | ### compute/model-specs/google.json @@ -82,7 +82,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-2.5-pro` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `60befa10269058a2885f56e99514b6b7b2d22612538f3dc7e5f9e91ae14bf940` | +| `gemini-2.5-pro` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models);`spec.maxOutputTokens`→[gemini-2-5-pro-limits](../SOURCES.md#gemini-2-5-pro-limits) |[google-models](../SOURCES.md#google-models);[gemini-2-5-pro-limits](../SOURCES.md#gemini-2-5-pro-limits) | partial | `60befa10269058a2885f56e99514b6b7b2d22612538f3dc7e5f9e91ae14bf940` | + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 ## 下次更新核查 diff --git a/docs/model-sources/providers/google/models/gemini-3-flash-preview.md b/docs/model-sources/providers/google/models/gemini-3-flash-preview.md index 7e17c63..b23327d 100644 --- a/docs/model-sources/providers/google/models/gemini-3-flash-preview.md +++ b/docs/model-sources/providers/google/models/gemini-3-flash-preview.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gemini-3-flash-preview`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -55,7 +55,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3-flash-preview` | 1048576 / 65536 | USD:0.5 / 3 | `modelName`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `1284ca213f087183f56a40f4a07744f0a233b8c632ed6df09804f47be104f791` | +| `gemini-3-flash-preview` | 1048576 / 65536 | USD:0.5 / 3 | `modelName`→[google-models](../SOURCES.md#google-models);`maxOutputTokens`→[gemini-3-flash-preview-limits](../SOURCES.md#gemini-3-flash-preview-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-flash-preview-limits](../SOURCES.md#gemini-3-flash-preview-limits) | partial | `1284ca213f087183f56a40f4a07744f0a233b8c632ed6df09804f47be104f791` | ### compute/model-specs/google.json @@ -90,7 +90,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3-flash-preview` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `f65fed502e4ec44d76e84e0ad84fbc528537399cc9887cd0386ccb45f76cdea7` | +| `gemini-3-flash-preview` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models);`spec.maxOutputTokens`→[gemini-3-flash-preview-limits](../SOURCES.md#gemini-3-flash-preview-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-flash-preview-limits](../SOURCES.md#gemini-3-flash-preview-limits) | partial | `f65fed502e4ec44d76e84e0ad84fbc528537399cc9887cd0386ccb45f76cdea7` | + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 ## 下次更新核查 diff --git a/docs/model-sources/providers/google/models/gemini-3.1-flash-lite.md b/docs/model-sources/providers/google/models/gemini-3.1-flash-lite.md index 25835be..d38dab2 100644 --- a/docs/model-sources/providers/google/models/gemini-3.1-flash-lite.md +++ b/docs/model-sources/providers/google/models/gemini-3.1-flash-lite.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gemini-3.1-flash-lite`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -52,7 +52,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.1-flash-lite` | 1048576 / 65536 | USD:0.25 / 1.5 | `modelName`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `0bc291abaf42630b9129274538fa483184805ef0060a1a6edc8064aa0df059fa` | +| `gemini-3.1-flash-lite` | 1048576 / 65536 | USD:0.25 / 1.5 | `modelName`→[google-models](../SOURCES.md#google-models);`maxOutputTokens`→[gemini-3-1-flash-lite-limits](../SOURCES.md#gemini-3-1-flash-lite-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-1-flash-lite-limits](../SOURCES.md#gemini-3-1-flash-lite-limits) | partial | `0bc291abaf42630b9129274538fa483184805ef0060a1a6edc8064aa0df059fa` | + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 ## 下次更新核查 diff --git a/docs/model-sources/providers/google/models/gemini-3.1-pro-preview.md b/docs/model-sources/providers/google/models/gemini-3.1-pro-preview.md index 9b69ae2..d4b4012 100644 --- a/docs/model-sources/providers/google/models/gemini-3.1-pro-preview.md +++ b/docs/model-sources/providers/google/models/gemini-3.1-pro-preview.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gemini-3.1-pro-preview`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -54,7 +54,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.1-pro-preview` | 1048576 / 65536 | USD:2 / 12 | `modelName`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `e0ff474a5b961de0689767ccf1cf0940b39073b2047cc6c2007630a7b9e00b2e` | +| `gemini-3.1-pro-preview` | 1048576 / 65536 | USD:2 / 12 | `modelName`→[google-models](../SOURCES.md#google-models);`maxOutputTokens`→[gemini-3-1-pro-preview-limits](../SOURCES.md#gemini-3-1-pro-preview-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-1-pro-preview-limits](../SOURCES.md#gemini-3-1-pro-preview-limits) | partial | `e0ff474a5b961de0689767ccf1cf0940b39073b2047cc6c2007630a7b9e00b2e` | ### compute/model-specs/google.json @@ -88,7 +88,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.1-pro-preview` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `956b2a0f20fd0a6a949cef14361095fb5e913353878890549110db469e0aa77d` | +| `gemini-3.1-pro-preview` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models);`spec.maxOutputTokens`→[gemini-3-1-pro-preview-limits](../SOURCES.md#gemini-3-1-pro-preview-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-1-pro-preview-limits](../SOURCES.md#gemini-3-1-pro-preview-limits) | partial | `956b2a0f20fd0a6a949cef14361095fb5e913353878890549110db469e0aa77d` | + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 ## 下次更新核查 diff --git a/docs/model-sources/providers/google/models/gemini-3.5-flash-lite.md b/docs/model-sources/providers/google/models/gemini-3.5-flash-lite.md index 87a7c04..e39098a 100644 --- a/docs/model-sources/providers/google/models/gemini-3.5-flash-lite.md +++ b/docs/model-sources/providers/google/models/gemini-3.5-flash-lite.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gemini-3.5-flash-lite`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -53,7 +53,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.5-flash-lite` | 1048576 / 65536 | USD:0.3 / 2.5 | `modelName`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `0e891cbbf2af69ee07da9c4febdae81d0dc86f9d00472150b14ba4a60e7b2cfd` | +| `gemini-3.5-flash-lite` | 1048576 / 65536 | USD:0.3 / 2.5 | `modelName`→[google-models](../SOURCES.md#google-models);`maxOutputTokens`→[gemini-3-5-flash-lite-limits](../SOURCES.md#gemini-3-5-flash-lite-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-5-flash-lite-limits](../SOURCES.md#gemini-3-5-flash-lite-limits) | partial | `0e891cbbf2af69ee07da9c4febdae81d0dc86f9d00472150b14ba4a60e7b2cfd` | ### compute/model-specs/google.json @@ -102,7 +102,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.5-flash-lite` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `b0ecfb99c59f4f8ccaba348794f9f6e0c41f2919f032fe03e1bd4f72c655cbc0` | +| `gemini-3.5-flash-lite` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models);`spec.maxOutputTokens`→[gemini-3-5-flash-lite-limits](../SOURCES.md#gemini-3-5-flash-lite-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-5-flash-lite-limits](../SOURCES.md#gemini-3-5-flash-lite-limits) | partial | `b0ecfb99c59f4f8ccaba348794f9f6e0c41f2919f032fe03e1bd4f72c655cbc0` | + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 ## 下次更新核查 diff --git a/docs/model-sources/providers/google/models/gemini-3.5-flash.md b/docs/model-sources/providers/google/models/gemini-3.5-flash.md index 77372b2..dbf6728 100644 --- a/docs/model-sources/providers/google/models/gemini-3.5-flash.md +++ b/docs/model-sources/providers/google/models/gemini-3.5-flash.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gemini-3.5-flash`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -53,7 +53,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.5-flash` | 1048576 / 65536 | USD:1.5 / 9 | `modelName`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `28cc479cd067575aa5465a6e91f9226b7540892a654dc7122528ad84ee88e054` | +| `gemini-3.5-flash` | 1048576 / 65536 | USD:1.5 / 9 | `modelName`→[google-models](../SOURCES.md#google-models);`maxOutputTokens`→[gemini-3-5-flash-limits](../SOURCES.md#gemini-3-5-flash-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-5-flash-limits](../SOURCES.md#gemini-3-5-flash-limits) | partial | `28cc479cd067575aa5465a6e91f9226b7540892a654dc7122528ad84ee88e054` | ### compute/model-specs/google.json @@ -90,7 +90,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.5-flash` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `c8029230918f8b2e7ad90c279c083b22555467d92d0055681ad56dd91d94646f` | +| `gemini-3.5-flash` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models);`spec.maxOutputTokens`→[gemini-3-5-flash-limits](../SOURCES.md#gemini-3-5-flash-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-5-flash-limits](../SOURCES.md#gemini-3-5-flash-limits) | partial | `c8029230918f8b2e7ad90c279c083b22555467d92d0055681ad56dd91d94646f` | + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 ## 下次更新核查 diff --git a/docs/model-sources/providers/google/models/gemini-3.7-flash.md b/docs/model-sources/providers/google/models/gemini-3.7-flash.md index d5417f6..d09a6de 100644 --- a/docs/model-sources/providers/google/models/gemini-3.7-flash.md +++ b/docs/model-sources/providers/google/models/gemini-3.7-flash.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gemini-3.7-flash`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -61,7 +61,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.7-flash` | 1048576 / 65536 | USD:0.75 / 3.75 | `modelName`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `bb6f8f4c6068eda2e4cfbf11ccd73946eca0b7f425e0d162765cf15a9c303b0f` | +| `gemini-3.7-flash` | 1048576 / 65536 | USD:0.75 / 3.75 | `modelName`→[google-models](../SOURCES.md#google-models);`maxOutputTokens`→[gemini-3-7-flash-limits](../SOURCES.md#gemini-3-7-flash-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-7-flash-limits](../SOURCES.md#gemini-3-7-flash-limits) | partial | `bb6f8f4c6068eda2e4cfbf11ccd73946eca0b7f425e0d162765cf15a9c303b0f` | ### compute/model-specs/google.json @@ -110,7 +110,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.7-flash` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `41b312b6191649ae61949f1bb26fd863b6d85f2d6351e640717dd3f5fa796f33` | +| `gemini-3.7-flash` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models);`spec.maxOutputTokens`→[gemini-3-7-flash-limits](../SOURCES.md#gemini-3-7-flash-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-7-flash-limits](../SOURCES.md#gemini-3-7-flash-limits) | partial | `41b312b6191649ae61949f1bb26fd863b6d85f2d6351e640717dd3f5fa796f33` | + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 ## 下次更新核查 diff --git a/docs/model-sources/providers/google/models/gemini-3.8-flash.md b/docs/model-sources/providers/google/models/gemini-3.8-flash.md index b0e4331..48a59d0 100644 --- a/docs/model-sources/providers/google/models/gemini-3.8-flash.md +++ b/docs/model-sources/providers/google/models/gemini-3.8-flash.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gemini-3.8-flash`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -61,7 +61,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.8-flash` | 1048576 / 65536 | USD:0.75 / 3.75 | `modelName`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `9d5a25d19ff7e9d6b9ebe25a34b5e7b94d58548283a513920067d853bd182454` | +| `gemini-3.8-flash` | 1048576 / 65536 | USD:0.75 / 3.75 | `modelName`→[google-models](../SOURCES.md#google-models);`maxOutputTokens`→[gemini-3-8-flash-limits](../SOURCES.md#gemini-3-8-flash-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-8-flash-limits](../SOURCES.md#gemini-3-8-flash-limits) | partial | `9d5a25d19ff7e9d6b9ebe25a34b5e7b94d58548283a513920067d853bd182454` | ### compute/model-specs/google.json @@ -110,7 +110,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gemini-3.8-flash` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models) | [google-models](../SOURCES.md#google-models) | partial | `60f05148792c14f1c6db7ff16b6f8e69a2903dfeed1b0585b1b8b3f60fa8ca63` | +| `gemini-3.8-flash` | 1048576 / 65536 | 非计价主数据 | `id`→[google-models](../SOURCES.md#google-models);`spec.maxOutputTokens`→[gemini-3-8-flash-limits](../SOURCES.md#gemini-3-8-flash-limits) |[google-models](../SOURCES.md#google-models);[gemini-3-8-flash-limits](../SOURCES.md#gemini-3-8-flash-limits) | partial | `60f05148792c14f1c6db7ff16b6f8e69a2903dfeed1b0585b1b8b3f60fa8ca63` | + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 + +## 本轮补充核验 + +实际读取该模型页:Input token limit 1048576、Output token limit 65536。仅将输出字段标为已核;contextWindow 是既有窗口配置,本轮不将 input limit 误当 input+output 总窗口证明。价格、effort、采样与账号权限仍独立待核。 ## 下次更新核查 diff --git a/docs/model-sources/providers/infini/AUDIT.md b/docs/model-sources/providers/infini/AUDIT.md new file mode 100644 index 0000000..9c44708 --- /dev/null +++ b/docs/model-sources/providers/infini/AUDIT.md @@ -0,0 +1,27 @@ +# infini:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +本次官方文档根入口发生 TLS EOF,无法核实托管模型/币种。 + +找到可读取的官方模型目录与计价页面后逐条复核;保留 pending,不搬运原厂或聚合平台限制。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [infini](https://docs.infini-ai.com/) | 读取失败 | | + +## 完成边界 + +当前单接入面记录:1 条;pending 1、partial 0、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 1 条:pending 1、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/infini/README.md b/docs/model-sources/providers/infini/README.md index fe9a8d6..0984cf9 100644 --- a/docs/model-sources/providers/infini/README.md +++ b/docs/model-sources/providers/infini/README.md @@ -1,6 +1,6 @@ # 无问芯穹:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 1 个单模型文件、1 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/kling/AUDIT.md b/docs/model-sources/providers/kling/AUDIT.md new file mode 100644 index 0000000..54bb91b --- /dev/null +++ b/docs/model-sources/providers/kling/AUDIT.md @@ -0,0 +1,27 @@ +# kling:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +正文清洗后只有 KlingAI Open Platform 标题,本次仍是页面壳。 + +需读取原生 API 文档中精确型号、异步提交/查询合同、分辨率和时长;新 3.0 Turbo 不因型号存在就进入旧端点。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [kling](https://kling.ai/document-api/api/video/3-0-omni/text-to-video/legacy) | 页面壳 | 75924 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:11 条;pending 11、partial 0、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 11 条:pending 11、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/kling/README.md b/docs/model-sources/providers/kling/README.md index ecc624a..ae3bb62 100644 --- a/docs/model-sources/providers/kling/README.md +++ b/docs/model-sources/providers/kling/README.md @@ -1,6 +1,6 @@ # 可灵:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 6 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/kwai/AUDIT.md b/docs/model-sources/providers/kwai/AUDIT.md new file mode 100644 index 0000000..3d86e25 --- /dev/null +++ b/docs/model-sources/providers/kwai/AUDIT.md @@ -0,0 +1,27 @@ +# kwai:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +可读取的是 StreamLake 国际 Coding Plan,与国内 wanqing 别名并非同一合同。 + +补国内 endpoint/modelName 映射及人民币价格,或单独建国际接入;国际价格不能覆盖国内现值。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [kwai-current](https://www.streamlake.ai/document/DOC/mg6k6nlp8j6qxicx4c9) | 正文已读取 | 217736 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:1 条;pending 1、partial 0、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 1 条:pending 1、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/kwai/README.md b/docs/model-sources/providers/kwai/README.md index 41f398f..094f013 100644 --- a/docs/model-sources/providers/kwai/README.md +++ b/docs/model-sources/providers/kwai/README.md @@ -1,6 +1,6 @@ # 快手 StreamLake Coding:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 1 个单模型文件、1 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/minimax/AUDIT.md b/docs/model-sources/providers/minimax/AUDIT.md new file mode 100644 index 0000000..b819949 --- /dev/null +++ b/docs/model-sources/providers/minimax/AUDIT.md @@ -0,0 +1,23 @@ +# MiniMax:2026-10-03 数据核验与后续计划 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +## 本轮完成 + +读取国内官网目录、Anthropic SDK和视频V2 API。SDK表明确M3上下文1000000,修正共享规格原1048576;M2.7/2.5/2.1及highspeed为204800,补对应原厂规格记录。SDK明确M2.x仅文本/工具块,移除API/套餐中M2.7误列vision。音乐生命周期同步到原厂Provider/shared spec描述和单模型记录:2026-08-20起付费API仅历史付费用户可继续用,免费音乐接口停止;不删除用户已有付费型号。 + +## 待完成与验收标准 + +| 事项 | 当前边界 | 下一步与完成条件 | +| --- | --- | --- | +| H3/H3Max接入 | 只共享规格,原生/v2/video_generation异步任务,与Messages不同 | 客户端适配content多模态数组、任务轮询、响应文件及version门控,再实际请求 | +| M3输出限制 | shared spec512000、API/套餐131072尚未取得本轮统一明文证据 | 分原厂/套餐请求合同查明上限,不能因窗口一致而宣称输出一致 | +| M3.1预览 | 仅MPlan/Code开放,adaptive mandatory | 保留套餐边界;按接入面核权限、effort与输出,不上普通API | +| 音乐资格 | 付费老账号与新账号服务不同 | 聚焦有授权的存量账号,确认2.6/cover及旧2.5型号;免费退役不能误当全部音乐付费停服 | +| 定价/速度 | 开放目录没有完整价和SLA | 分原厂价格页、套餐配额、地域记录;不由highspeed命名推断实际速度 | + +文档核验未使用账号调用,套餐窗口/输出/权限继续独立核查。 + +## 本轮最终记录统计 + +本仓记录 67 条:pending 12、partial 55、historical 0;partial 中仅 ID 证明 39 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/minimax/README.md b/docs/model-sources/providers/minimax/README.md index 5c8397f..c3dacd6 100644 --- a/docs/model-sources/providers/minimax/README.md +++ b/docs/model-sources/providers/minimax/README.md @@ -1,6 +1,6 @@ # MiniMax:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 30 个单模型文件、3 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/minimax/SOURCES.md b/docs/model-sources/providers/minimax/SOURCES.md index 39ab618..b97fa76 100644 --- a/docs/model-sources/providers/minimax/SOURCES.md +++ b/docs/model-sources/providers/minimax/SOURCES.md @@ -40,7 +40,7 @@ M3.1 Flash Preview 仅在 M Plan/Code 开放,需 adaptive thinking,none/disa "id": "minimax-models", "url": "https://platform.minimax.cn/docs/guides/models-intro.md", "kind": "official-doc", - "scope": "MiniMax 国内原生多模态目录;不混用国际套餐", + "scope": "本轮读取 minimax 官方 minimax-models 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "79aec16c3b99d3871ab75de58087b3d1baa40dd79a33b639ef3bc1c079859a46", @@ -50,7 +50,7 @@ M3.1 Flash Preview 仅在 M Plan/Code 开放,需 adaptive thinking,none/disa "id": "minimax-anthropic", "url": "https://platform.minimax.cn/docs/api-reference/text-anthropic-api.md", "kind": "official-doc", - "scope": "MiniMax 国内 Anthropic 兼容;M Plan 与按量模型开放范围区分", + "scope": "本轮读取 minimax 官方 minimax-anthropic 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "6daf89aa6798bc504662acdeb6ed2a269fae35f94f1fa14559335c87c4ce7142", @@ -60,7 +60,7 @@ M3.1 Flash Preview 仅在 M Plan/Code 开放,需 adaptive thinking,none/disa "id": "minimax-video", "url": "https://platform.minimax.cn/docs/api-reference/video-generation-v2-create.md", "kind": "official-doc", - "scope": "MiniMax 国内原生视频 V2 任务 API", + "scope": "本轮读取 minimax 官方 minimax-video 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "4dbb502b654cc136930a55285108aa18fec0702db40397431f7058deccb793a5", @@ -70,7 +70,7 @@ M3.1 Flash Preview 仅在 M Plan/Code 开放,需 adaptive thinking,none/disa "id": "minimax-hailuo", "url": "https://platform.minimax.cn/docs/api-reference/video-generation-t2v.md", "kind": "official-doc", - "scope": "minimax 官方入口;具体地域与接入面待该页面逐字段确认", + "scope": "本轮读取 minimax 官方 minimax-hailuo 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "cf0a461b04259a227db2ea3ca31ec62086775736afce5cb6e8d0d42c5c8b74fa", diff --git a/docs/model-sources/providers/minimax/models/minimax-m2.1-highspeed.md b/docs/model-sources/providers/minimax/models/minimax-m2.1-highspeed.md index 4ba5cc3..4badab8 100644 --- a/docs/model-sources/providers/minimax/models/minimax-m2.1-highspeed.md +++ b/docs/model-sources/providers/minimax/models/minimax-m2.1-highspeed.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`MiniMax-M2.1-highspeed`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -47,7 +47,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.1-highspeed` | 204800 / 131072 | CNY:4.2 / 16.8 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `34210e815ca9cc74d27b61ac99f0dc7a3eeccea06b951677f41efee497cac50f` | +| `MiniMax-M2.1-highspeed` | 204800 / 131072 | CNY:4.2 / 16.8 | `modelName`→[minimax-models](../SOURCES.md#minimax-models);`contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `34210e815ca9cc74d27b61ac99f0dc7a3eeccea06b951677f41efee497cac50f` | ### compute/model-specs/minimax.json @@ -79,7 +79,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.1-highspeed` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `d1a9cc4120ae5ff821cc753e1e7bf50402c3c0f6390c1e3d7f4da4b49afff45f` | +| `MiniMax-M2.1-highspeed` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models);`spec.contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `d1a9cc4120ae5ff821cc753e1e7bf50402c3c0f6390c1e3d7f4da4b49afff45f` | + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 ## 下次更新核查 diff --git a/docs/model-sources/providers/minimax/models/minimax-m2.1.md b/docs/model-sources/providers/minimax/models/minimax-m2.1.md index 20f777c..ea61fa0 100644 --- a/docs/model-sources/providers/minimax/models/minimax-m2.1.md +++ b/docs/model-sources/providers/minimax/models/minimax-m2.1.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`MiniMax-M2.1`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -46,7 +46,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.1` | 204800 / 131072 | CNY:2.1 / 8.4 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `25962a63327c36c091f1845d7718e16f6255273163f958011af0aff4210fab5a` | +| `MiniMax-M2.1` | 204800 / 131072 | CNY:2.1 / 8.4 | `modelName`→[minimax-models](../SOURCES.md#minimax-models);`contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `25962a63327c36c091f1845d7718e16f6255273163f958011af0aff4210fab5a` | ### compute/model-specs/minimax.json @@ -77,7 +77,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.1` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `781c8a7a5af2a9902efd5507d2f50186af6a5e2bfdf46e66daff5b53307317c7` | +| `MiniMax-M2.1` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models);`spec.contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `781c8a7a5af2a9902efd5507d2f50186af6a5e2bfdf46e66daff5b53307317c7` | + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 ## 下次更新核查 diff --git a/docs/model-sources/providers/minimax/models/minimax-m2.5-highspeed.md b/docs/model-sources/providers/minimax/models/minimax-m2.5-highspeed.md index c9d14d4..b8f7664 100644 --- a/docs/model-sources/providers/minimax/models/minimax-m2.5-highspeed.md +++ b/docs/model-sources/providers/minimax/models/minimax-m2.5-highspeed.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`MiniMax-M2.5-highspeed`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -47,7 +47,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.5-highspeed` | 204800 / 131072 | CNY:4.2 / 16.8 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `ec2193bc5976b056493f99f09f3145d3edb02d871c9f6e5d3470753a193aa00d` | +| `MiniMax-M2.5-highspeed` | 204800 / 131072 | CNY:4.2 / 16.8 | `modelName`→[minimax-models](../SOURCES.md#minimax-models);`contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `ec2193bc5976b056493f99f09f3145d3edb02d871c9f6e5d3470753a193aa00d` | ### compute/model-specs/minimax.json @@ -79,7 +79,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.5-highspeed` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `ac2025b4e33145d35d353e869d9273eccd92b20b4775a7295a5283fe8818ef66` | +| `MiniMax-M2.5-highspeed` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models);`spec.contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `ac2025b4e33145d35d353e869d9273eccd92b20b4775a7295a5283fe8818ef66` | + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 ## 下次更新核查 diff --git a/docs/model-sources/providers/minimax/models/minimax-m2.5.md b/docs/model-sources/providers/minimax/models/minimax-m2.5.md index 7186481..fe7e4a4 100644 --- a/docs/model-sources/providers/minimax/models/minimax-m2.5.md +++ b/docs/model-sources/providers/minimax/models/minimax-m2.5.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`MiniMax-M2.5`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -48,7 +48,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.5` | 204800 / 131072 | CNY:2.1 / 8.4 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `b9a8560a8a36de43974f12b92517b4e008b8859423969839e8f4d30e3f4e048c` | +| `MiniMax-M2.5` | 204800 / 131072 | CNY:2.1 / 8.4 | `modelName`→[minimax-models](../SOURCES.md#minimax-models);`contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `b9a8560a8a36de43974f12b92517b4e008b8859423969839e8f4d30e3f4e048c` | ### compute/model-specs/minimax.json @@ -82,7 +82,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.5` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `af99f444afa3dec4bec7e5b18e600bd5bb6324e5f778429fa7d61bea677fc873` | +| `MiniMax-M2.5` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models);`spec.contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `af99f444afa3dec4bec7e5b18e600bd5bb6324e5f778429fa7d61bea677fc873` | + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 ## 下次更新核查 diff --git a/docs/model-sources/providers/minimax/models/minimax-m2.7-highspeed.md b/docs/model-sources/providers/minimax/models/minimax-m2.7-highspeed.md index 9de88b8..0d88dfd 100644 --- a/docs/model-sources/providers/minimax/models/minimax-m2.7-highspeed.md +++ b/docs/model-sources/providers/minimax/models/minimax-m2.7-highspeed.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`MiniMax-M2.7-highspeed`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -34,8 +34,7 @@ "reasoning", "code", "tool_use", - "fast", - "vision" + "fast" ], "defaultTemperature": 1, "defaultTopP": 0.95, @@ -49,7 +48,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.7-highspeed` | 204800 / 131072 | CNY:4.2 / 16.8 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `860f3218d418ff71d1e23c749a49befb8182e83f37c6ac15961aabfcc071b803` | +| `MiniMax-M2.7-highspeed` | 204800 / 131072 | CNY:4.2 / 16.8 | `modelName`→[minimax-models](../SOURCES.md#minimax-models);`contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `bfdaa5b51506952de485070d9246dc9443e0320ae0e443e4ffcb147b6f1db507` | ### compute/coding-plans/minimax-coding.json @@ -70,7 +69,6 @@ "reasoning", "code", "tool_use", - "vision", "fast" ] } @@ -81,7 +79,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.7-highspeed` | 204800 / 131072 | 套餐:未声明 / 未声明 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `d8c859c1abac6ee87cbf95d5dc39e1eac497368f4597c0a0551cddfc1e891040` | +| `MiniMax-M2.7-highspeed` | 204800 / 131072 | 套餐:未声明 / 未声明 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `a065dfa7d3287e8b9fbefc0f85f3e28587119807f7038804da8cbc9e5e95e9e5` | ### compute/model-specs/minimax.json @@ -102,8 +100,7 @@ "reasoning", "code", "tool_use", - "fast", - "vision" + "fast" ], "spec.defaultTemperature": 1 } @@ -114,7 +111,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.7-highspeed` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `2fc7956fcfa436a76559587007b751d12c1df843156e5ff53d44660545ea65ed` | +| `MiniMax-M2.7-highspeed` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models);`spec.contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `510ebe4c0b5e6451a57158dc1bcd48d704dc92520971c2f5d4e2b341c866b2dc` | + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 ## 下次更新核查 diff --git a/docs/model-sources/providers/minimax/models/minimax-m2.7.md b/docs/model-sources/providers/minimax/models/minimax-m2.7.md index 93d40b4..71410ac 100644 --- a/docs/model-sources/providers/minimax/models/minimax-m2.7.md +++ b/docs/model-sources/providers/minimax/models/minimax-m2.7.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`MiniMax-M2.7`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -34,8 +34,7 @@ "chat", "reasoning", "code", - "tool_use", - "vision" + "tool_use" ], "defaultTemperature": 1, "defaultTopP": 0.95, @@ -49,7 +48,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.7` | 204800 / 131072 | CNY:2.1 / 8.4 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `1b735417a021d9fa70298ce981f02452db9b7892393ee7dfd7ad6e7cf5379ab2` | +| `MiniMax-M2.7` | 204800 / 131072 | CNY:2.1 / 8.4 | `modelName`→[minimax-models](../SOURCES.md#minimax-models);`contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `b9700df4e1624bec6513944a1cdc570e7ed8dfb62224d210206c516980b5ea3c` | ### compute/coding-plans/minimax-coding.json @@ -70,8 +69,7 @@ "chat", "reasoning", "code", - "tool_use", - "vision" + "tool_use" ] } ``` @@ -81,7 +79,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.7` | 204800 / 131072 | 套餐:未声明 / 未声明 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `30c8ad1e18f8d58e6fd2acebf2d7f91eefc20c0e9d04416324709fef403060c0` | +| `MiniMax-M2.7` | 204800 / 131072 | 套餐:未声明 / 未声明 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `3cae6396e60ce0de40c47509168d516cf464820996ffdaa96776976598aa6111` | ### compute/model-specs/minimax.json @@ -102,8 +100,7 @@ "chat", "reasoning", "code", - "tool_use", - "vision" + "tool_use" ], "spec.supportsReasoning": true, "spec.defaultTemperature": 1 @@ -115,7 +112,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M2.7` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `b43bd21eb81cb37efc361377c399a6a89a670b34d3df04c2e8ee9d139f4dad8b` | +| `MiniMax-M2.7` | 204800 / 131072 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models);`spec.contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `b634190fb5f5efc5803b40a3f13e755601e829d347dc0d036ef789602374a11b` | + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 ## 下次更新核查 diff --git a/docs/model-sources/providers/minimax/models/minimax-m3.md b/docs/model-sources/providers/minimax/models/minimax-m3.md index 282eb2b..e120e4d 100644 --- a/docs/model-sources/providers/minimax/models/minimax-m3.md +++ b/docs/model-sources/providers/minimax/models/minimax-m3.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`MiniMax-M3`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量复核仅覆盖明确列出的字段,其余接入面和参数保持各自状态。 ## 适用接入面 @@ -67,7 +67,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M3` | 1000000 / 131072 | CNY:2.1 / 8.4 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `3d69bfddacd9274c5ff25807ae276e83226841074ded1abcf8a8aab476d083b4` | +| `MiniMax-M3` | 1000000 / 131072 | CNY:2.1 / 8.4 | `modelName`→[minimax-models](../SOURCES.md#minimax-models);`contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `3d69bfddacd9274c5ff25807ae276e83226841074ded1abcf8a8aab476d083b4` | ### compute/coding-plans/minimax-coding.json @@ -112,7 +112,7 @@ ```json { - "spec.contextWindow": 1048576, + "spec.contextWindow": 1000000, "spec.maxOutputTokens": 512000, "spec.serviceType": [ "chat" @@ -151,7 +151,15 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `MiniMax-M3` | 1048576 / 512000 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `3d4e178769d146dfd89122bf684ed199052fee140ce3b3af094f8844540e266b` | +| `MiniMax-M3` | 1000000 / 512000 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models);`spec.contextWindow`→[minimax-anthropic](../SOURCES.md#minimax-anthropic) |[minimax-models](../SOURCES.md#minimax-models);[minimax-anthropic](../SOURCES.md#minimax-anthropic) | partial | `bf94606e9d791d6d27a626bde458ebed9330fe08085a9bde1d513667e837ffbc` | + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 + +## 本轮补充核验 + +本轮读取官方Anthropic SDK型号表明文上下文:M3为1000000,M2.7/2.5/2.1及highspeed为204800。M2.x仅文本和工具相关块,不支持图片/视频;清理API/套餐/sharedspec中误列的vision能力。输出上限、价格、套餐账号可用性不因窗口核验提高状态。 ## 下次更新核查 diff --git a/docs/model-sources/providers/minimax/models/music-2.5--da64d60f.md b/docs/model-sources/providers/minimax/models/music-2.5--da64d60f.md index 94f3464..b6ed6d9 100644 --- a/docs/model-sources/providers/minimax/models/music-2.5--da64d60f.md +++ b/docs/model-sources/providers/minimax/models/music-2.5--da64d60f.md @@ -40,7 +40,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `music-2.5+` | 未声明 / 未声明 | CNY:未声明 / 未声明 | 待核实 | [minimax-models](../SOURCES.md#minimax-models) | pending | `3ebd24a88f998a1443c5d2a2bb862b0da94231481e67bceff52c3332de262539` | +| `music-2.5+` | 未声明 / 未声明 | CNY:未声明 / 未声明 | 待核实 | [minimax-models](../SOURCES.md#minimax-models) | pending | `371610be5d9573032307c17f798c9b39d00f92d1014d031ae6c239b004288b03` | ### compute/model-specs/minimax.json @@ -68,7 +68,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `music-2.5+` | 未声明 / 未声明 | 非计价主数据 | 待核实 | [minimax-models](../SOURCES.md#minimax-models) | pending | `54dd9ac6c5650713a4ea847f533ae28e4d7c4ad7a1670a7bfa0a9ada2a557a68` | +| `music-2.5+` | 未声明 / 未声明 | 非计价主数据 | 待核实 | [minimax-models](../SOURCES.md#minimax-models) | pending | `146ace8a0f5cfe8e8a887d3c9762a20b95919dd97c26a770834a385bdec8b316` | ## 下次更新核查 @@ -88,3 +88,7 @@ } ``` + +## 音乐 API 生命周期边界 + +[官网目录](../SOURCES.md#minimax-models)自2026-08-20起不向新用户开放付费音乐/歌词生成,历史付费用户可继续调用;免费Music3.0/2.6/cover停止服务。旧2.5型号是否在特定存量账号仍开放需另核,未删用户历史付费配置。 diff --git a/docs/model-sources/providers/minimax/models/music-2.5.md b/docs/model-sources/providers/minimax/models/music-2.5.md index bdd0279..2b2e72e 100644 --- a/docs/model-sources/providers/minimax/models/music-2.5.md +++ b/docs/model-sources/providers/minimax/models/music-2.5.md @@ -40,7 +40,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `music-2.5` | 未声明 / 未声明 | CNY:未声明 / 未声明 | 待核实 | [minimax-models](../SOURCES.md#minimax-models) | pending | `dcfdc6773cb2651b747ee1d7439508faf8d0a2ddb658063f82b59535462898c8` | +| `music-2.5` | 未声明 / 未声明 | CNY:未声明 / 未声明 | 待核实 | [minimax-models](../SOURCES.md#minimax-models) | pending | `f18974b844a76c4a0dc30112a323d717d624d5a0e6b213d3dc49e0a6e6c3b822` | ### compute/model-specs/minimax.json @@ -68,7 +68,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `music-2.5` | 未声明 / 未声明 | 非计价主数据 | 待核实 | [minimax-models](../SOURCES.md#minimax-models) | pending | `b655915659c7ed630e289f2a82eebc2986f2ff2df8e811a572e63d9dd5311378` | +| `music-2.5` | 未声明 / 未声明 | 非计价主数据 | 待核实 | [minimax-models](../SOURCES.md#minimax-models) | pending | `a9f239a10625695efe56c9d634711db41ee983d8e98a676329bd6be930f4227f` | ## 下次更新核查 @@ -88,3 +88,7 @@ } ``` + +## 音乐 API 生命周期边界 + +[官方模型目录](../SOURCES.md#minimax-models)公告:自2026-08-20起,付费音乐生成/歌词生成不向新用户开放,历史付费用户可继续使用;Music-3.0-free、Music-2.6-free、music-cover-free 停止服务。本记录保留历史付费型号,不以目录公告推断旧2.5系列仍适用于任何新账号;下次核查账号资格与型号可用性。 diff --git a/docs/model-sources/providers/minimax/models/music-2.6.md b/docs/model-sources/providers/minimax/models/music-2.6.md index d2025ae..79a5ad1 100644 --- a/docs/model-sources/providers/minimax/models/music-2.6.md +++ b/docs/model-sources/providers/minimax/models/music-2.6.md @@ -41,7 +41,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `music-2.6` | 未声明 / 未声明 | CNY:未声明 / 未声明 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `1233a724344182a4ec6d2f4eff93f9688b2efca5809171440ea0dd14460fccbe` | +| `music-2.6` | 未声明 / 未声明 | CNY:未声明 / 未声明 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `ab3b3e0464825912b40e2096896abe71fdf080abef3b8de5682de57df7ab8401` | ### compute/coding-plans/minimax-coding.json @@ -96,7 +96,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `music-2.6` | 未声明 / 未声明 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `ad60546c353e79623ed8f0d386b79bdf1aa4ba6048a4615c0f0c81a3277c6056` | +| `music-2.6` | 未声明 / 未声明 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `35e96dfb6d660d5789f0c24fec304a6db7e80433abfd07a756ffea1efa83b6ea` | ## 下次更新核查 @@ -116,3 +116,7 @@ } ``` + +## 音乐 API 生命周期边界 + +[官方模型目录](../SOURCES.md#minimax-models)公告:自2026-08-20起,付费音乐生成/歌词生成不向新用户开放,历史付费用户可继续使用;Music-3.0-free、Music-2.6-free、music-cover-free 停止服务。本记录保留历史付费型号,不以目录公告推断旧2.5系列仍适用于任何新账号;下次核查账号资格与型号可用性。 diff --git a/docs/model-sources/providers/minimax/models/music-cover.md b/docs/model-sources/providers/minimax/models/music-cover.md index 0188ae4..d49e238 100644 --- a/docs/model-sources/providers/minimax/models/music-cover.md +++ b/docs/model-sources/providers/minimax/models/music-cover.md @@ -39,7 +39,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `music-cover` | 未声明 / 未声明 | CNY:未声明 / 未声明 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `48d05ec6aa5e222cc794e61fe26ddcae25b5d80ea1664e440f96a6262dde2436` | +| `music-cover` | 未声明 / 未声明 | CNY:未声明 / 未声明 | `modelName`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `8d8dce1753537e6b54fa2a57e27d01c631b394d9d2eac56e654ed166b7e369b4` | ### compute/model-specs/minimax.json @@ -66,7 +66,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `music-cover` | 未声明 / 未声明 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `3e3e893c904eb8df379f46502cd44680f5c9295ababc3ee6ce01d6b81bdf4bc6` | +| `music-cover` | 未声明 / 未声明 | 非计价主数据 | `id`→[minimax-models](../SOURCES.md#minimax-models) | [minimax-models](../SOURCES.md#minimax-models) | partial | `e44603a346bbb131fd057c84c7b2747716da5887c268811d5599856d567db1a6` | ## 下次更新核查 @@ -86,3 +86,7 @@ } ``` + +## 音乐 API 生命周期边界 + +[官方模型目录](../SOURCES.md#minimax-models)公告:自2026-08-20起,付费音乐生成/歌词生成不向新用户开放,历史付费用户可继续使用;Music-3.0-free、Music-2.6-free、music-cover-free 停止服务。本记录保留历史付费型号,不以目录公告推断旧2.5系列仍适用于任何新账号;下次核查账号资格与型号可用性。 diff --git a/docs/model-sources/providers/mistral/AUDIT.md b/docs/model-sources/providers/mistral/AUDIT.md new file mode 100644 index 0000000..0449a2c --- /dev/null +++ b/docs/model-sources/providers/mistral/AUDIT.md @@ -0,0 +1,23 @@ +# Mistral:2026-10-03 数据核验与后续计划 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +## 本轮完成 + +再次实读Medium3.5、Small4、Large3官网,保留此前已核价格,刷新实际读取的来源内容摘要。补读Codestral2508独立官网页:输入0.3、输出0.9美元/百万tokens,与现有Provider价格一致,增加该字段证明。没有凭128k/256k简写提高精确token窗口状态。 + +## 待完成与验收标准 + +| 事项 | 当前边界 | 下一步与完成条件 | +| --- | --- | --- | +| latest别名 | 官方页展示日期版本,既有Provider使用latest | 读取官方Models API或明确alias表确认当前解析,不凭最新发布日期推断alias | +| 精确窗口 | 当前有256000/262144不同换算 | 取得明文整数或API元数据并同步Provider/shared spec;不把简写当精确值 | +| 输出限制 | Codestral旧32768及其他型号未完整核 | 逐模型取得输出限额,未知维持待核 | +| 推理/采样 | hybrid支持不等于每种网关接受同一effort | 核具体API的reasoning、temperature及工具行为;不只迁移键名 | +| 生命周期 | 旧版本与新latest不能混成一个family | 保持精确匹配,读取官方退役公告后再删除、tombstone | + +本轮未做账号请求;仅确认标注字段。 + +## 本轮最终记录统计 + +本仓记录 9 条:pending 4、partial 5、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/mistral/README.md b/docs/model-sources/providers/mistral/README.md index 915010d..0087c63 100644 --- a/docs/model-sources/providers/mistral/README.md +++ b/docs/model-sources/providers/mistral/README.md @@ -1,6 +1,6 @@ # Mistral:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 6 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/mistral/SOURCES.md b/docs/model-sources/providers/mistral/SOURCES.md index 2bb8d13..401a218 100644 --- a/docs/model-sources/providers/mistral/SOURCES.md +++ b/docs/model-sources/providers/mistral/SOURCES.md @@ -23,6 +23,11 @@ - 入口:[mistral-large](https://docs.mistral.ai/models/mistral-large-3-25-12) - 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Mistral 原厂 Large 3;USD 原价,窗口 256k 是简写`。 +### codestral2508 + +- 入口:[codestral2508](https://docs.mistral.ai/models/codestral-25-08) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Mistral Codestral2508原厂页;USD每百万token标准价,128k简写。 + ## 已知边界与核验说明 官网确认 Medium 3.5、Small 4、Large 3 的名称、版本和价格;256k 是官网简写,262144 的精确换算仍列为未逐字段证明。匹配 family 已收窄,避免旧型号继承新规格;无法确认的 maxOutputTokens 不填。 @@ -40,7 +45,7 @@ "id": "mistral-models", "url": "https://docs.mistral.ai/models", "kind": "official-doc", - "scope": "mistral 官方入口;具体地域与接入面待该页面逐字段确认", + "scope": "本轮读取 mistral 官方 mistral-models 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "df08b65bf8c3f26c8c1de0c194b0c82e77b7aa58af7428779fdbe8db33534deb", @@ -50,7 +55,7 @@ "id": "mistral-medium", "url": "https://docs.mistral.ai/models/mistral-medium-3-5-26-04", "kind": "official-doc", - "scope": "Mistral 原厂 Medium 3.5;USD 原价,窗口 256k 是简写", + "scope": "本轮读取 mistral 官方 mistral-medium 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "e9ecf8fd0ceb99e755e164bed57be8b91cea7a544504b0f62bfeea0b1f41df07", @@ -60,7 +65,7 @@ "id": "mistral-small", "url": "https://docs.mistral.ai/models/mistral-small-4-0-26-03", "kind": "official-doc", - "scope": "Mistral 原厂 Small 4;USD 原价,窗口 256k 是简写", + "scope": "本轮读取 mistral 官方 mistral-small 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "63ae9e27aaeab6923ef30f53daa7d623c97d6d903a90f028e26fe00cd7f83112", @@ -70,11 +75,21 @@ "id": "mistral-large", "url": "https://docs.mistral.ai/models/mistral-large-3-25-12", "kind": "official-doc", - "scope": "Mistral 原厂 Large 3;USD 原价,窗口 256k 是简写", + "scope": "本轮读取 mistral 官方 mistral-large 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "34293e7a12d40b4f1c8e31d7c9bd8cbb4f59c4b0db978728d332f1c1749b09e3", "resolvedUrl": "https://docs.mistral.ai/models/mistral-large-3-25-12" + }, + { + "id": "codestral2508", + "url": "https://docs.mistral.ai/models/codestral-25-08", + "kind": "official-doc", + "scope": "Mistral Codestral2508原厂页;USD每百万token标准价,128k简写", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "3248f36c4eca93679cc8507daf04d24e07aa9d51a06c10f2feec9415a62687d5", + "resolvedUrl": "https://docs.mistral.ai/models/codestral-25-08" } ] } diff --git a/docs/model-sources/providers/mistral/models/codestral-latest.md b/docs/model-sources/providers/mistral/models/codestral-latest.md index 573834e..fa4302e 100644 --- a/docs/model-sources/providers/mistral/models/codestral-latest.md +++ b/docs/model-sources/providers/mistral/models/codestral-latest.md @@ -44,7 +44,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `codestral-latest` | 128000 / 32768 | USD:0.3 / 0.9 | 待核实 | [mistral-models](../SOURCES.md#mistral-models) | pending | `397855b8de5225ea00ee1e7d78c003525a1be8c8116893637342c7a819ed3f69` | +| `codestral-latest` | 128000 / 32768 | USD:0.3 / 0.9 | `inputPrice`→[codestral2508](../SOURCES.md#codestral2508);`outputPrice`→[codestral2508](../SOURCES.md#codestral2508) |[mistral-models](../SOURCES.md#mistral-models);[codestral2508](../SOURCES.md#codestral2508) | partial | `397855b8de5225ea00ee1e7d78c003525a1be8c8116893637342c7a819ed3f69` | ### compute/model-specs/mistral.json @@ -75,6 +75,10 @@ | --- | --- | --- | --- | --- | --- | --- | | `codestral-latest` | 128000 / 32768 | 非计价主数据 | 待核实 | [mistral-models](../SOURCES.md#mistral-models) | pending | `87bf44866d236d56f4982f922c0825c3a0c7e179e2ee90daf2d008c3b0c74af1` | +## 本轮补充核验 + +官方Codestral2508页面标准输入0.3美元/百万tokens,输出0.9美元/百万tokens,与latest配置相符;current alias解析及128k精确整数、32768输出尚未取得明文证据。 + ## 下次更新核查 - 对照官网核查精确 ID/别名、是否仍列出、上下文/输入/输出限制及单位。 diff --git a/docs/model-sources/providers/moonshot/AUDIT.md b/docs/model-sources/providers/moonshot/AUDIT.md new file mode 100644 index 0000000..e015bff --- /dev/null +++ b/docs/model-sources/providers/moonshot/AUDIT.md @@ -0,0 +1,31 @@ +# moonshot:2026-10-03 字段复核与剩余过程 + +[官网证据](SOURCES.md) · [模型与接入导航](README.md) + +本轮重读国内定价明文并补读K2.6/K2.7 Code指南。K3国内输入20/输出100/cache2 CNY/M已补Provider,纠正“未返回国内单价”旧说明;缓存写入TTL5min20、TTL1h40另记边界,不新增未验证客户端字段。当前K2.7Code 6.5/27/cache1.3,高速13/54/cache2.6,K2.6 6.5/27/cache1.1均经国内表核验。 + +K2.6与K2.7指南max_tokens=32768是默认值,不是输出上限证明;因此未机械替换共享规格的16384,原有最大输出仍待核。K2.6能关思考且温度固定思考1/非思考0.6;K2.7不能关思考且温度1。K3已有推理合同保持,实际输出上限需扣除占用窗口。图片仅base64,不支持URL,需要客户端单独验收。 + +下一步取得K2确切最大输出、top_p/工具强制模式与回放限制;核K2.5和Moonshot V1是否当前可用及旧价,国内目录缺席不等于退役。订阅/聚合平台不可继承这些原厂价格。 + +## 待核实队列 + +本轮收尾快照:21条接入面记录,14 pending,0条partial只核ID;同一模型可占多条,非独立型号数。partial是已列字段证明,不是全部通过。 + +### 尚无字段证明 + +- `compute/coding-plans/moonshot-coding.json`:`kimi-for-coding`。 +- `compute/model-specs/moonshot.json`:`kimi-k2-thinking`、`kimi-k2.5`、`kimi-k2`、`moonshot-v1-128k`、`moonshot-v1-32k`、`moonshot-v1-8k`。 +- `compute/providers/moonshot.json`:`kimi-k2.5`、`moonshot-v1-128k-vision-preview`、`moonshot-v1-128k`、`moonshot-v1-32k-vision-preview`、`moonshot-v1-32k`、`moonshot-v1-8k-vision-preview`、`moonshot-v1-8k`。 + +### 仅ID有证明 + +无。 + +## 完成标准 + +逐条打开对应官网正文/官方API,按原厂、套餐、地域分别登记精确参数和单位;有差异才改canonical JSON,同步该模型详情、字段引用和指纹。保留未证实字段。运行来源/结构测试;协议改动需客户端和实际调用验收。没有账号授权,本轮未执行收费模型调用。 + +## 本轮最终记录统计 + +本仓记录 21 条:pending 14、partial 7、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/moonshot/README.md b/docs/model-sources/providers/moonshot/README.md index d04fee2..f210399 100644 --- a/docs/model-sources/providers/moonshot/README.md +++ b/docs/model-sources/providers/moonshot/README.md @@ -1,6 +1,6 @@ # 月之暗面 Kimi:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 14 个单模型文件、3 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/moonshot/SOURCES.md b/docs/model-sources/providers/moonshot/SOURCES.md index 0e18cc1..589ded8 100644 --- a/docs/model-sources/providers/moonshot/SOURCES.md +++ b/docs/model-sources/providers/moonshot/SOURCES.md @@ -13,14 +13,36 @@ ### kimi-pricing - 入口:[kimi-pricing](https://platform.kimi.com/docs/pricing/chat.md) -- 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Kimi 国内人民币计价;本次页面未返回模型单价`。 +- 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`Kimi 国内人民币每百万token计价;本轮正文已返回K3与K2单价`。 + +### kimi-k26 + +- 入口:[kimi-k26](https://platform.kimi.com/docs/guide/kimi-k2-6-quickstart.md) +- 本轮实际读取正文;Kimi 国内原生 Chat Completions。 + +### kimi-k27 + +- 入口:[kimi-k27](https://platform.kimi.com/docs/guide/kimi-k2-7-code-quickstart.md) +- 本轮实际读取正文;Kimi 国内原生 Chat Completions。 ## 已知边界与核验说明 -K3 国内端点和 low/high/max(默认 max)、始终思考、固定采样参数已核对。max_completion_tokens 的默认值 131072 与允许设置上限 1048576 分开记录;实际输出受剩余窗口约束。国内价格表未返回单价,因此未填零或换算国际美元价。 +K3 国内端点和 low/high/max(默认 max)、始终思考、固定采样参数已核对。max_completion_tokens 的默认值 131072 与允许设置上限 1048576 分开记录;实际输出受剩余窗口约束。早期读取未返回国内单价;本轮重读已返回K3与当前K2单价,已按国内CNY表补齐,未换算国际美元价。 状态 `partial` 仅表示列出的字段已核实;不能推断整条配置、价格、账号权限或真实模型调用都已验收。`pending` 没有已核字段;`historical` 只作历史兼容参考。路由 tier/priority、产品标签和默认选择属于本仓策略,不伪装成官网数据。 +## 2026-10-03 字段复核:kimi-pricing + +本轮正文已明确返回国内单价,纠正之前“未返回单价”的读取结论。K3 输入20、输出100、缓存命中2 CNY/M;缓存写入5分钟20、1小时40 CNY/M仅在文档说明,不新增客户端未验证字段。K2.7 Code 6.5/27/1.3、高速13/54/2.6、K2.6 6.5/27/1.1。各表窗口为1048576或262144。 + +## 2026-10-03 字段复核:kimi-k26 + +已核思考开关和固定temperature;max_tokens=32768 是默认值,不由此认定为最大输出。不得以该默认值替换共享规格输出上限。图片仅支持base64、视频支持声明格式;未实测客户端。 + +## 2026-10-03 字段复核:kimi-k27 + +已核思考开关和固定temperature;max_tokens=32768 是默认值,不由此认定为最大输出。不得以该默认值替换共享规格输出上限。图片仅支持base64、视频支持声明格式;未实测客户端。 + ```json { @@ -42,11 +64,31 @@ K3 国内端点和 low/high/max(默认 max)、始终思考、固定采样参 "id": "kimi-pricing", "url": "https://platform.kimi.com/docs/pricing/chat.md", "kind": "official-doc", - "scope": "Kimi 国内人民币计价;本次页面未返回模型单价", + "scope": "Kimi 国内 CNY/百万token,K3及当前K2系列", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "fe0dad2bcf7ac9c6de011eb6d18f8e33b01b67e1aef7a9154664acc1b7225262", "resolvedUrl": "https://platform.kimi.com/docs/pricing/chat.md" + }, + { + "id": "kimi-k26", + "url": "https://platform.kimi.com/docs/guide/kimi-k2-6-quickstart.md", + "kind": "official-doc", + "scope": "Kimi 国内原生 Chat Completions", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "5722f9999083ebac1347b1ccca13141f88ed32ae021361cce5084416cc8472b0", + "resolvedUrl": "https://platform.kimi.com/docs/guide/kimi-k2-6-quickstart.md" + }, + { + "id": "kimi-k27", + "url": "https://platform.kimi.com/docs/guide/kimi-k2-7-code-quickstart.md", + "kind": "official-doc", + "scope": "Kimi 国内原生 Chat Completions", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "60221158b8350411da7a768eb773023ac865d783ebb8d3ebcb403ab202ebd397", + "resolvedUrl": "https://platform.kimi.com/docs/guide/kimi-k2-7-code-quickstart.md" } ] } diff --git a/docs/model-sources/providers/moonshot/models/kimi-k2.6.md b/docs/model-sources/providers/moonshot/models/kimi-k2.6.md index dee3f5e..01295dc 100644 --- a/docs/model-sources/providers/moonshot/models/kimi-k2.6.md +++ b/docs/model-sources/providers/moonshot/models/kimi-k2.6.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`kimi-k2.6`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -45,7 +45,9 @@ "defaultTopP": 0.95, "inputPrice": 6.5, "outputPrice": 27, - "extra.cacheHitPrice": 1.1 + "extra.cacheHitPrice": 1.1, + "extra.thinking.default": "enabled", + "extra.thinking.disabledTemperature": 0.6 } ``` @@ -54,7 +56,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `kimi-k2.6` | 262144 / 32768 | CNY:6.5 / 27 | `modelName`→[kimi-pricing](../SOURCES.md#kimi-pricing) | [kimi-pricing](../SOURCES.md#kimi-pricing) | partial | `c743a56354ad090d4160f8ac824003f17b6e3fca1f33dd905821432b996208e2` | +| `kimi-k2.6` | 262144 / 32768 | CNY:6.5 / 27 | `modelName`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`contextWindow`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`inputPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`outputPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`extra.cacheHitPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`defaultTemperature`→[kimi-k26](../SOURCES.md#kimi-k26)、`extra.thinking.default`→[kimi-k26](../SOURCES.md#kimi-k26)、`extra.thinking.disabledTemperature`→[kimi-k26](../SOURCES.md#kimi-k26) | [kimi-pricing](../SOURCES.md#kimi-pricing)、[kimi-k26](../SOURCES.md#kimi-k26) | partial | `c743a56354ad090d4160f8ac824003f17b6e3fca1f33dd905821432b996208e2` | ### compute/model-specs/moonshot.json @@ -104,7 +106,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `kimi-k2.6` | 262144 / 16384 | 非计价主数据 | `id`→[kimi-pricing](../SOURCES.md#kimi-pricing) | [kimi-pricing](../SOURCES.md#kimi-pricing) | partial | `543f66245dc007438be71326e0afa13e8a5db5177b199857db69ea33f5ebda40` | +| `kimi-k2.6` | 262144 / 16384 | 非计价主数据 | `id`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`spec.contextWindow`→[kimi-pricing](../SOURCES.md#kimi-pricing) | [kimi-pricing](../SOURCES.md#kimi-pricing) | partial | `543f66245dc007438be71326e0afa13e8a5db5177b199857db69ea33f5ebda40` | ## 下次更新核查 diff --git a/docs/model-sources/providers/moonshot/models/kimi-k2.7-code-highspeed.md b/docs/model-sources/providers/moonshot/models/kimi-k2.7-code-highspeed.md index 6e04484..ee04346 100644 --- a/docs/model-sources/providers/moonshot/models/kimi-k2.7-code-highspeed.md +++ b/docs/model-sources/providers/moonshot/models/kimi-k2.7-code-highspeed.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`kimi-k2.7-code-highspeed`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -45,7 +45,9 @@ "defaultTopP": 0.95, "inputPrice": 13, "outputPrice": 54, - "extra.cacheHitPrice": 2.6 + "extra.cacheHitPrice": 2.6, + "extra.thinking.default": "enabled", + "extra.thinking.disableSupported": false } ``` @@ -54,7 +56,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `kimi-k2.7-code-highspeed` | 262144 / 32768 | CNY:13 / 54 | `modelName`→[kimi-pricing](../SOURCES.md#kimi-pricing) | [kimi-pricing](../SOURCES.md#kimi-pricing) | partial | `adf6aae9b54df64dafc6759cbdba6638823b605aa0a983cd212c479872fe4cab` | +| `kimi-k2.7-code-highspeed` | 262144 / 32768 | CNY:13 / 54 | `modelName`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`contextWindow`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`inputPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`outputPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`extra.cacheHitPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`defaultTemperature`→[kimi-k27](../SOURCES.md#kimi-k27)、`extra.thinking.default`→[kimi-k27](../SOURCES.md#kimi-k27)、`extra.thinking.disableSupported`→[kimi-k27](../SOURCES.md#kimi-k27) | [kimi-pricing](../SOURCES.md#kimi-pricing)、[kimi-k27](../SOURCES.md#kimi-k27) | partial | `adf6aae9b54df64dafc6759cbdba6638823b605aa0a983cd212c479872fe4cab` | ## 下次更新核查 diff --git a/docs/model-sources/providers/moonshot/models/kimi-k2.7-code.md b/docs/model-sources/providers/moonshot/models/kimi-k2.7-code.md index c375bea..6e73ff9 100644 --- a/docs/model-sources/providers/moonshot/models/kimi-k2.7-code.md +++ b/docs/model-sources/providers/moonshot/models/kimi-k2.7-code.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`kimi-k2.7-code`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -45,7 +45,9 @@ "defaultTopP": 0.95, "inputPrice": 6.5, "outputPrice": 27, - "extra.cacheHitPrice": 1.3 + "extra.cacheHitPrice": 1.3, + "extra.thinking.default": "enabled", + "extra.thinking.disableSupported": false } ``` @@ -54,7 +56,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `kimi-k2.7-code` | 262144 / 32768 | CNY:6.5 / 27 | `modelName`→[kimi-pricing](../SOURCES.md#kimi-pricing) | [kimi-pricing](../SOURCES.md#kimi-pricing) | partial | `937bb4f3796dea8a1a02f846c7670452dcfbe5d9db0ed0fc1364763cde449aca` | +| `kimi-k2.7-code` | 262144 / 32768 | CNY:6.5 / 27 | `modelName`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`contextWindow`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`inputPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`outputPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`extra.cacheHitPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`defaultTemperature`→[kimi-k27](../SOURCES.md#kimi-k27)、`extra.thinking.default`→[kimi-k27](../SOURCES.md#kimi-k27)、`extra.thinking.disableSupported`→[kimi-k27](../SOURCES.md#kimi-k27) | [kimi-pricing](../SOURCES.md#kimi-pricing)、[kimi-k27](../SOURCES.md#kimi-k27) | partial | `937bb4f3796dea8a1a02f846c7670452dcfbe5d9db0ed0fc1364763cde449aca` | ### compute/model-specs/moonshot.json @@ -95,7 +97,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `kimi-k2.7-code` | 262144 / 16384 | 非计价主数据 | `id`→[kimi-pricing](../SOURCES.md#kimi-pricing) | [kimi-pricing](../SOURCES.md#kimi-pricing) | partial | `57b9ed712930abed6b6db23453a3869f8e2e815f2fd79b4a9cb2e91ebaed78e1` | +| `kimi-k2.7-code` | 262144 / 16384 | 非计价主数据 | `id`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`spec.contextWindow`→[kimi-pricing](../SOURCES.md#kimi-pricing) | [kimi-pricing](../SOURCES.md#kimi-pricing) | partial | `57b9ed712930abed6b6db23453a3869f8e2e815f2fd79b4a9cb2e91ebaed78e1` | ## 下次更新核查 diff --git a/docs/model-sources/providers/moonshot/models/kimi-k3.md b/docs/model-sources/providers/moonshot/models/kimi-k3.md index 9af0eb3..cc68408 100644 --- a/docs/model-sources/providers/moonshot/models/kimi-k3.md +++ b/docs/model-sources/providers/moonshot/models/kimi-k3.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`kimi-k3`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -48,7 +48,10 @@ }, "extra.thinkingOnly": true, "extra.samplingParametersDeprecated": true, - "extra.pricingNotes": "国内官方价格表当前未返回模型单价;不将国际美元价格换算为国内人民币价格。" + "extra.pricingNotes": "CNY per 1M tokens: input 20, output 100, cache hit 2. Cache writes: TTL 5min 20, TTL 1h 40; recorded separately from cache-hit billing.", + "inputPrice": 20, + "outputPrice": 100, + "extra.cacheHitPrice": 2 } ``` @@ -57,7 +60,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `kimi-k3` | 1048576 / 1048576 | CNY:未声明 / 未声明 | `contextWindow`→[kimi-k3](../SOURCES.md#kimi-k3), `extra.reasoning.defaultEffort`→[kimi-k3](../SOURCES.md#kimi-k3), `extra.reasoning.supportedEfforts`→[kimi-k3](../SOURCES.md#kimi-k3), `extra.samplingParametersDeprecated`→[kimi-k3](../SOURCES.md#kimi-k3), `extra.thinkingOnly`→[kimi-k3](../SOURCES.md#kimi-k3), `maxOutputTokens`→[kimi-k3](../SOURCES.md#kimi-k3), `modelName`→[kimi-k3](../SOURCES.md#kimi-k3) | [kimi-k3](../SOURCES.md#kimi-k3) | partial | `60a2de0a63989f2ad0c4e3f7b54dcc1166f8a36157a221935df7e9cf78fd385f` | +| `kimi-k3` | 1048576 / 1048576 | CNY:20 / 100 | `contextWindow`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`extra.reasoning.defaultEffort`→[kimi-k3](../SOURCES.md#kimi-k3)、`extra.reasoning.supportedEfforts`→[kimi-k3](../SOURCES.md#kimi-k3)、`extra.samplingParametersDeprecated`→[kimi-k3](../SOURCES.md#kimi-k3)、`extra.thinkingOnly`→[kimi-k3](../SOURCES.md#kimi-k3)、`maxOutputTokens`→[kimi-k3](../SOURCES.md#kimi-k3)、`modelName`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`inputPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`outputPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`extra.cacheHitPrice`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`extra.pricingNotes`→[kimi-pricing](../SOURCES.md#kimi-pricing) | [kimi-pricing](../SOURCES.md#kimi-pricing)、[kimi-k3](../SOURCES.md#kimi-k3) | partial | `ff0ea59f00b5873742ebb33938a6669b58ebd88b81677772c1be55f577ed315c` | ### compute/model-specs/moonshot.json @@ -106,7 +109,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `kimi-k3` | 1048576 / 1048576 | 非计价主数据 | `id`→[kimi-k3](../SOURCES.md#kimi-k3), `spec.contextWindow`→[kimi-k3](../SOURCES.md#kimi-k3), `spec.extra.samplingParametersDeprecated`→[kimi-k3](../SOURCES.md#kimi-k3), `spec.extra.thinkingOnly`→[kimi-k3](../SOURCES.md#kimi-k3), `spec.maxOutputTokens`→[kimi-k3](../SOURCES.md#kimi-k3) | [kimi-k3](../SOURCES.md#kimi-k3) | partial | `f947390f30eaeb54eeb5e3c20ca0f89cc2e0b11840cb3d9ab38de088fcae91fb` | +| `kimi-k3` | 1048576 / 1048576 | 非计价主数据 | `id`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`spec.contextWindow`→[kimi-pricing](../SOURCES.md#kimi-pricing)、`spec.extra.samplingParametersDeprecated`→[kimi-k3](../SOURCES.md#kimi-k3)、`spec.extra.thinkingOnly`→[kimi-k3](../SOURCES.md#kimi-k3)、`spec.maxOutputTokens`→[kimi-k3](../SOURCES.md#kimi-k3) | [kimi-pricing](../SOURCES.md#kimi-pricing)、[kimi-k3](../SOURCES.md#kimi-k3) | partial | `f947390f30eaeb54eeb5e3c20ca0f89cc2e0b11840cb3d9ab38de088fcae91fb` | ## 下次更新核查 diff --git a/docs/model-sources/providers/moorethread/AUDIT.md b/docs/model-sources/providers/moorethread/AUDIT.md new file mode 100644 index 0000000..c4356a7 --- /dev/null +++ b/docs/model-sources/providers/moorethread/AUDIT.md @@ -0,0 +1,27 @@ +# moorethread:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +官方入口清洗后只有 Coding Plan 标题,不能支持字段级参数。 + +补官方套餐模型/API 文档和真实授权目录;不将页面 200 当作规格证明。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [moorethread](https://code.mthreads.com/) | 页面壳 | 518 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:1 条;pending 1、partial 0、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 1 条:pending 1、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/moorethread/README.md b/docs/model-sources/providers/moorethread/README.md index 4cc9508..6f6c425 100644 --- a/docs/model-sources/providers/moorethread/README.md +++ b/docs/model-sources/providers/moorethread/README.md @@ -1,6 +1,6 @@ # 摩尔线程:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 1 个单模型文件、1 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/ollama/AUDIT.md b/docs/model-sources/providers/ollama/AUDIT.md new file mode 100644 index 0000000..81a3700 --- /dev/null +++ b/docs/model-sources/providers/ollama/AUDIT.md @@ -0,0 +1,27 @@ +# ollama:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +官网博客可读;本地实际模型集合由用户安装和运行时发现决定。 + +本地模板无需随官网发布逐条补全。若更新默认型号,须核验官方 library 标签、安装可用性及资源要求。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [ollama](https://ollama.com/blog) | 正文已读取 | 45494 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:1 条;pending 1、partial 0、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 1 条:pending 1、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/ollama/README.md b/docs/model-sources/providers/ollama/README.md index e8e3c11..2311f70 100644 --- a/docs/model-sources/providers/ollama/README.md +++ b/docs/model-sources/providers/ollama/README.md @@ -1,6 +1,6 @@ # Ollama:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 1 个单模型文件、1 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/openai/AUDIT.md b/docs/model-sources/providers/openai/AUDIT.md new file mode 100644 index 0000000..61fd4c1 --- /dev/null +++ b/docs/model-sources/providers/openai/AUDIT.md @@ -0,0 +1,23 @@ +# OpenAI:2026-10-03 数据核验与后续计划 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +## 本轮完成 + +实际读取六个GPT5.4/5.5原厂模型规格页,核窗口、输出、价格、缓存与effort。旧ignored键迁移extra.reasoning;5.4/mini/nano补官方xhigh档。GPT5.4Pro默认从high修正medium,5.5Pro保持high;Pro保持Responses约束。GPTReserve仍保留手动配置,但未经正式规格核验前eligibleForAgent=false,限制自动选择;没有擅自删除用户要求的临时模型。 + +## 待完成与验收标准 + +| 事项 | 当前边界 | 下一步与完成条件 | +| --- | --- | --- | +| Reserve正式规格 | 官方模型页未取得可读参数;共享/订阅窗口为历史假定 | 取得明确官方精确ID、窗口、输出、协议与订阅可用性,分别核验后再开放自动选型 | +| Codex订阅接入 | 原厂API不等于订阅,不能拿API价格/窗口填订阅 | 从官方订阅说明/模型目录读取合同,核身份、窗口、effort及客户端版本 | +| Mini/Nano输入上限 | input272000而总window400000,独立限制尚未声明schema字段 | 查客户端消费与frozen schema后再实现独立输入预算,避免盲目发送400K输入 | +| 老型号与媒体API | 语音/图像、旧GPT大部分未本轮逐参数复核 | 分独立端点、按tokens/秒/图像单位读官网,不由ID存在推断价格与输出正确 | +| none默认映射 | API5.4默认none但Provider defaultEffort枚举不接受none | 维持既有产品默认策略,记录与原厂默认区别;客户端契约变更另做版本门控 | + +本轮不使用账号调用,来源字段证明不能代表账户权限与实际请求验收。 + +## 本轮最终记录统计 + +本仓记录 93 条:pending 71、partial 22、historical 0;partial 中仅 ID 证明 10 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/openai/README.md b/docs/model-sources/providers/openai/README.md index f60a91f..0c93420 100644 --- a/docs/model-sources/providers/openai/README.md +++ b/docs/model-sources/providers/openai/README.md @@ -1,6 +1,6 @@ # OpenAI:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 50 个单模型文件、4 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/openai/SOURCES.md b/docs/model-sources/providers/openai/SOURCES.md index 7a13598..ca4ff91 100644 --- a/docs/model-sources/providers/openai/SOURCES.md +++ b/docs/model-sources/providers/openai/SOURCES.md @@ -19,6 +19,36 @@ - 入口:[whisper](https://github.com/openai/whisper) - 类型:`official-repository`;当前读取状态:`fetched`;地域/接入面:`OpenAI 官方开源仓库;本地模型安装与实际服务另核`。 +### gpt-5-5-api + +- 入口:[gpt-5-5-api](https://developers.openai.com/api/docs/models/gpt-5.5.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性。 + +### gpt-5-5-pro-api + +- 入口:[gpt-5-5-pro-api](https://developers.openai.com/api/docs/models/gpt-5.5-pro.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性。 + +### gpt-5-4-api + +- 入口:[gpt-5-4-api](https://developers.openai.com/api/docs/models/gpt-5.4.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性。 + +### gpt-5-4-pro-api + +- 入口:[gpt-5-4-pro-api](https://developers.openai.com/api/docs/models/gpt-5.4-pro.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性。 + +### gpt-5-4-mini-api + +- 入口:[gpt-5-4-mini-api](https://developers.openai.com/api/docs/models/gpt-5.4-mini.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性。 + +### gpt-5-4-nano-api + +- 入口:[gpt-5-4-nano-api](https://developers.openai.com/api/docs/models/gpt-5.4-nano.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性。 + ## 已知边界与核验说明 GPT-6.1 Sol 的窗口、输出、推理档位与直连计价已再次核对。API 参数不能自动套用到订阅后端;订阅的档位限制保留接入面记录。其他旧型号尚未在本次逐字段复核。 @@ -63,8 +93,74 @@ GPT-6.1 Sol 的窗口、输出、推理档位与直连计价已再次核对。AP "checkedAt": "2026-10-03", "contentSha256": "00141f69ddad540f79bf3c2e89420f204a3350a940848574d6c26879a261a925", "resolvedUrl": "https://github.com/openai/whisper" + }, + { + "id": "gpt-5-5-api", + "url": "https://developers.openai.com/api/docs/models/gpt-5.5.md", + "kind": "official-doc", + "scope": "OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "fdb0fc8fe9ea7f276716c2a5b49b902e7e676ff262bb8adfdf2d5b8911bad3ba", + "resolvedUrl": "https://developers.openai.com/api/docs/models/gpt-5.5.md" + }, + { + "id": "gpt-5-5-pro-api", + "url": "https://developers.openai.com/api/docs/models/gpt-5.5-pro.md", + "kind": "official-doc", + "scope": "OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "a61a55e1d58cfbbf56fa075936c77fbfd59e41df4463f41056f9c6a7461f1b57", + "resolvedUrl": "https://developers.openai.com/api/docs/models/gpt-5.5-pro.md" + }, + { + "id": "gpt-5-4-api", + "url": "https://developers.openai.com/api/docs/models/gpt-5.4.md", + "kind": "official-doc", + "scope": "OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "c30e86b38bc6ceacb3d6db269aa6ba4a09c3c5e1322bfaf90f924fddce4013a5", + "resolvedUrl": "https://developers.openai.com/api/docs/models/gpt-5.4.md" + }, + { + "id": "gpt-5-4-pro-api", + "url": "https://developers.openai.com/api/docs/models/gpt-5.4-pro.md", + "kind": "official-doc", + "scope": "OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "7d4e6f56440cf9cebd56c7384118be317d30d3d2f0c33e1254c4b906fb972e22", + "resolvedUrl": "https://developers.openai.com/api/docs/models/gpt-5.4-pro.md" + }, + { + "id": "gpt-5-4-mini-api", + "url": "https://developers.openai.com/api/docs/models/gpt-5.4-mini.md", + "kind": "official-doc", + "scope": "OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "97dbda29af4009ed275112e92037a5b46f313caf0d1232ff9b54b899b4fb65a7", + "resolvedUrl": "https://developers.openai.com/api/docs/models/gpt-5.4-mini.md" + }, + { + "id": "gpt-5-4-nano-api", + "url": "https://developers.openai.com/api/docs/models/gpt-5.4-nano.md", + "kind": "official-doc", + "scope": "OpenAI 直连 API;USD 每百万 token,不能证明 Codex 订阅窗口或可用性", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "3dd20e2c95f09f3efb19c6255387a4e07d4d7c213367cca0a015e162a8f5b4e0", + "resolvedUrl": "https://developers.openai.com/api/docs/models/gpt-5.4-nano.md" } ] } ``` + +## 本轮增量核验与临时模型边界 + +2026-10-03 逐一读取 GPT-5.5、5.5 Pro、5.4、5.4 Pro、5.4 Mini/Nano 明文规格页。已核字段见各单模型记录;这不能证明 Codex 订阅的参数或可用性。Mini/Nano 的总窗口 400000 与最大输入 272000 是两个不同限制,当前 schema 未声明独立最大输入字段,先记录此边界,不把 400000 宣称为可发送的输入上限。 + +GPT-Reserve 的官方模型页本次无法读取,官方模型搜索没有取得参数证据。保留既有手动配置和假定参数供明确选择,不删除用户先前要求的模型;共享规格将 eligibleForAgent 设为 false,正式规格取得前不参与 Agent 自动选型。1050000 共享假定窗口与 Codex 272000 接入限制仍分别待核,不能互相作为证据。 diff --git a/docs/model-sources/providers/openai/models/gpt-5.4-mini.md b/docs/model-sources/providers/openai/models/gpt-5.4-mini.md index 540a56e..e3467ff 100644 --- a/docs/model-sources/providers/openai/models/gpt-5.4-mini.md +++ b/docs/model-sources/providers/openai/models/gpt-5.4-mini.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gpt-5.4-mini`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量核验下列字段;未列字段及其他接入面的状态保持独立。 ## 适用接入面 @@ -75,7 +75,16 @@ ], "inputPrice": 0.75, "outputPrice": 4.5, - "extra.cachedInputPrice": 0.075 + "extra.cachedInputPrice": 0.075, + "extra.reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } } ``` @@ -84,7 +93,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-5.4-mini` | 400000 / 128000 | USD:0.75 / 4.5 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `b14b746d46d9a0e03d4998ebdb31644d3620121d265bd657e3b9447fc0349dde` | +| `gpt-5.4-mini` | 400000 / 128000 | USD:0.75 / 4.5 | `modelName`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api);`contextWindow`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api);`maxOutputTokens`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api);`inputPrice`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api);`outputPrice`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api);`extra.reasoning.supportedEfforts`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api);`extra.cachedInputPrice`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api) | [gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api) | partial | `c7a1b65adcb143f3980e74c7c506c828863cad4b381f3273c8436b9c8cf79ca3` | ### compute/model-specs/openai.json @@ -132,7 +141,11 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-5.4-mini` | 400000 / 128000 | 非计价主数据 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `fea5519f807fe1a18b9ee8f79d556da357f78b8c00f2898b6ea5cf1b7fcc72d5` | +| `gpt-5.4-mini` | 400000 / 128000 | 非计价主数据 | `id`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api);`spec.contextWindow`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api);`spec.maxOutputTokens`→[gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api) | [gpt-5-4-mini-api](../SOURCES.md#gpt-5-4-mini-api) | partial | `fea5519f807fe1a18b9ee8f79d556da357f78b8c00f2898b6ea5cf1b7fcc72d5` | + +本轮读取该模型官方明文规格页,确认原厂直连窗口、输出、标准价格与推理合同。Pro 仅限 Responses;GPT-5.4 Pro 官方默认 medium,修正旧 high。none 在产品层映射 off,schema 不接受将 none 写成 defaultEffort,故未伪造其他显式默认档。 + +共享规格只复核内在窗口和输出;Provider 推理矩阵不复制到共享规格。 ## 下次更新核查 diff --git a/docs/model-sources/providers/openai/models/gpt-5.4-nano.md b/docs/model-sources/providers/openai/models/gpt-5.4-nano.md index a55fcba..e22e525 100644 --- a/docs/model-sources/providers/openai/models/gpt-5.4-nano.md +++ b/docs/model-sources/providers/openai/models/gpt-5.4-nano.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gpt-5.4-nano`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量核验下列字段;未列字段及其他接入面的状态保持独立。 ## 适用接入面 @@ -37,7 +37,16 @@ ], "inputPrice": 0.2, "outputPrice": 1.25, - "extra.cachedInputPrice": 0.02 + "extra.cachedInputPrice": 0.02, + "extra.reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } } ``` @@ -46,7 +55,11 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-5.4-nano` | 400000 / 128000 | USD:0.2 / 1.25 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `bde978b68ce6cabc702357129947f2d078feefe42a0dc84537a3897d6dbf4d70` | +| `gpt-5.4-nano` | 400000 / 128000 | USD:0.2 / 1.25 | `modelName`→[gpt-5-4-nano-api](../SOURCES.md#gpt-5-4-nano-api);`contextWindow`→[gpt-5-4-nano-api](../SOURCES.md#gpt-5-4-nano-api);`maxOutputTokens`→[gpt-5-4-nano-api](../SOURCES.md#gpt-5-4-nano-api);`inputPrice`→[gpt-5-4-nano-api](../SOURCES.md#gpt-5-4-nano-api);`outputPrice`→[gpt-5-4-nano-api](../SOURCES.md#gpt-5-4-nano-api);`extra.reasoning.supportedEfforts`→[gpt-5-4-nano-api](../SOURCES.md#gpt-5-4-nano-api);`extra.cachedInputPrice`→[gpt-5-4-nano-api](../SOURCES.md#gpt-5-4-nano-api) | [gpt-5-4-nano-api](../SOURCES.md#gpt-5-4-nano-api) | partial | `c9177352926f2671a78517659b30654fe41a14a2ebfcf435ba7854ee030bac0e` | + +本轮读取该模型官方明文规格页,确认原厂直连窗口、输出、标准价格与推理合同。Pro 仅限 Responses;GPT-5.4 Pro 官方默认 medium,修正旧 high。none 在产品层映射 off,schema 不接受将 none 写成 defaultEffort,故未伪造其他显式默认档。 + +共享规格只复核内在窗口和输出;Provider 推理矩阵不复制到共享规格。 ## 下次更新核查 diff --git a/docs/model-sources/providers/openai/models/gpt-5.4-pro.md b/docs/model-sources/providers/openai/models/gpt-5.4-pro.md index ec927af..5659e8c 100644 --- a/docs/model-sources/providers/openai/models/gpt-5.4-pro.md +++ b/docs/model-sources/providers/openai/models/gpt-5.4-pro.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gpt-5.4-pro`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量核验下列字段;未列字段及其他接入面的状态保持独立。 ## 适用接入面 @@ -37,7 +37,15 @@ ], "inputPrice": 30, "outputPrice": 180, - "extra.responsesOnly": true + "extra.responsesOnly": true, + "extra.reasoning": { + "supportedEfforts": [ + "medium", + "high", + "xhigh" + ], + "defaultEffort": "medium" + } } ``` @@ -46,7 +54,11 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-5.4-pro` | 1050000 / 128000 | USD:30 / 180 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `206f598a6646bf7f0c3b4643385adb70ffaa798f06b56a32ce46e090fd4a51f6` | +| `gpt-5.4-pro` | 1050000 / 128000 | USD:30 / 180 | `modelName`→[gpt-5-4-pro-api](../SOURCES.md#gpt-5-4-pro-api);`contextWindow`→[gpt-5-4-pro-api](../SOURCES.md#gpt-5-4-pro-api);`maxOutputTokens`→[gpt-5-4-pro-api](../SOURCES.md#gpt-5-4-pro-api);`inputPrice`→[gpt-5-4-pro-api](../SOURCES.md#gpt-5-4-pro-api);`outputPrice`→[gpt-5-4-pro-api](../SOURCES.md#gpt-5-4-pro-api);`extra.reasoning.supportedEfforts`→[gpt-5-4-pro-api](../SOURCES.md#gpt-5-4-pro-api);`extra.responsesOnly`→[gpt-5-4-pro-api](../SOURCES.md#gpt-5-4-pro-api);`extra.reasoning.defaultEffort`→[gpt-5-4-pro-api](../SOURCES.md#gpt-5-4-pro-api) | [gpt-5-4-pro-api](../SOURCES.md#gpt-5-4-pro-api) | partial | `9b707d58e00d30b2ce339f1969d684e4e2cad69d26af571f38cc1a499ea47882` | + +本轮读取该模型官方明文规格页,确认原厂直连窗口、输出、标准价格与推理合同。Pro 仅限 Responses;GPT-5.4 Pro 官方默认 medium,修正旧 high。none 在产品层映射 off,schema 不接受将 none 写成 defaultEffort,故未伪造其他显式默认档。 + +共享规格只复核内在窗口和输出;Provider 推理矩阵不复制到共享规格。 ## 下次更新核查 diff --git a/docs/model-sources/providers/openai/models/gpt-5.4.md b/docs/model-sources/providers/openai/models/gpt-5.4.md index 4c0e342..3596da3 100644 --- a/docs/model-sources/providers/openai/models/gpt-5.4.md +++ b/docs/model-sources/providers/openai/models/gpt-5.4.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gpt-5.4`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量核验下列字段;未列字段及其他接入面的状态保持独立。 ## 适用接入面 @@ -74,7 +74,16 @@ "inputPrice": 2.5, "outputPrice": 15, "extra.cachedInputPrice": 0.25, - "extra.pricingNotes": "Prices are per 1M tokens; long-context requests may use higher-tier pricing per OpenAI pricing page." + "extra.pricingNotes": "Prices are per 1M tokens; long-context requests may use higher-tier pricing per OpenAI pricing page.", + "extra.reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high", + "xhigh" + ] + } } ``` @@ -83,7 +92,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-5.4` | 1050000 / 128000 | USD:2.5 / 15 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `3b7dfb8901c12eae785d26e34e091bf06928b5523962b34ef07ad8b5ecd99048` | +| `gpt-5.4` | 1050000 / 128000 | USD:2.5 / 15 | `modelName`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api);`contextWindow`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api);`maxOutputTokens`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api);`inputPrice`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api);`outputPrice`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api);`extra.reasoning.supportedEfforts`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api);`extra.cachedInputPrice`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api) | [gpt-5-4-api](../SOURCES.md#gpt-5-4-api) | partial | `1e81f5a324608c153767fb8665b13e3773dc24dc23fa45554e111ad4e45d8510` | ### compute/model-specs/openai.json @@ -131,7 +140,11 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-5.4` | 1050000 / 128000 | 非计价主数据 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `0d0981e9f7c721fe920d732cd24fb349a81e9ef4ffec5d1c809c9bf315e09fa5` | +| `gpt-5.4` | 1050000 / 128000 | 非计价主数据 | `id`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api);`spec.contextWindow`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api);`spec.maxOutputTokens`→[gpt-5-4-api](../SOURCES.md#gpt-5-4-api) | [gpt-5-4-api](../SOURCES.md#gpt-5-4-api) | partial | `0d0981e9f7c721fe920d732cd24fb349a81e9ef4ffec5d1c809c9bf315e09fa5` | + +本轮读取该模型官方明文规格页,确认原厂直连窗口、输出、标准价格与推理合同。Pro 仅限 Responses;GPT-5.4 Pro 官方默认 medium,修正旧 high。none 在产品层映射 off,schema 不接受将 none 写成 defaultEffort,故未伪造其他显式默认档。 + +共享规格只复核内在窗口和输出;Provider 推理矩阵不复制到共享规格。 ## 下次更新核查 diff --git a/docs/model-sources/providers/openai/models/gpt-5.5-pro.md b/docs/model-sources/providers/openai/models/gpt-5.5-pro.md index 3b5cdb0..f5262d7 100644 --- a/docs/model-sources/providers/openai/models/gpt-5.5-pro.md +++ b/docs/model-sources/providers/openai/models/gpt-5.5-pro.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gpt-5.5-pro`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量核验下列字段;未列字段及其他接入面的状态保持独立。 ## 适用接入面 @@ -39,7 +39,15 @@ "inputPrice": 30, "outputPrice": 180, "extra.responsesOnly": true, - "extra.pricingNotes": "No cached-input discount is listed for GPT-5.5 Pro on the official pricing page." + "extra.pricingNotes": "No cached-input discount is listed for GPT-5.5 Pro on the official pricing page.", + "extra.reasoning": { + "supportedEfforts": [ + "medium", + "high", + "xhigh" + ], + "defaultEffort": "high" + } } ``` @@ -48,7 +56,11 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-5.5-pro` | 1050000 / 128000 | USD:30 / 180 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `48f5f5800e7d35f7b74e1937521fa1fd9c8fcc50cab7f62a9407a6a95932d298` | +| `gpt-5.5-pro` | 1050000 / 128000 | USD:30 / 180 | `modelName`→[gpt-5-5-pro-api](../SOURCES.md#gpt-5-5-pro-api);`contextWindow`→[gpt-5-5-pro-api](../SOURCES.md#gpt-5-5-pro-api);`maxOutputTokens`→[gpt-5-5-pro-api](../SOURCES.md#gpt-5-5-pro-api);`inputPrice`→[gpt-5-5-pro-api](../SOURCES.md#gpt-5-5-pro-api);`outputPrice`→[gpt-5-5-pro-api](../SOURCES.md#gpt-5-5-pro-api);`extra.reasoning.supportedEfforts`→[gpt-5-5-pro-api](../SOURCES.md#gpt-5-5-pro-api);`extra.responsesOnly`→[gpt-5-5-pro-api](../SOURCES.md#gpt-5-5-pro-api);`extra.reasoning.defaultEffort`→[gpt-5-5-pro-api](../SOURCES.md#gpt-5-5-pro-api) | [gpt-5-5-pro-api](../SOURCES.md#gpt-5-5-pro-api) | partial | `d375a491a9db715c7a6d18c3da85395098beb4276cd0b998f7893926c4798ab3` | + +本轮读取该模型官方明文规格页,确认原厂直连窗口、输出、标准价格与推理合同。Pro 仅限 Responses;GPT-5.4 Pro 官方默认 medium,修正旧 high。none 在产品层映射 off,schema 不接受将 none 写成 defaultEffort,故未伪造其他显式默认档。 + +共享规格只复核内在窗口和输出;Provider 推理矩阵不复制到共享规格。 ## 下次更新核查 diff --git a/docs/model-sources/providers/openai/models/gpt-5.5.md b/docs/model-sources/providers/openai/models/gpt-5.5.md index 591b8a6..2b1a38c 100644 --- a/docs/model-sources/providers/openai/models/gpt-5.5.md +++ b/docs/model-sources/providers/openai/models/gpt-5.5.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`gpt-5.5`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量核验下列字段;未列字段及其他接入面的状态保持独立。 ## 适用接入面 @@ -75,7 +75,17 @@ "inputPrice": 5, "outputPrice": 30, "extra.cachedInputPrice": 0.5, - "extra.pricingNotes": "Prices are per 1M tokens; long-context requests may use higher-tier pricing per OpenAI pricing page." + "extra.pricingNotes": "Prices are per 1M tokens; long-context requests may use higher-tier pricing per OpenAI pricing page.", + "extra.reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high", + "xhigh" + ], + "defaultEffort": "medium" + } } ``` @@ -84,7 +94,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-5.5` | 1050000 / 128000 | USD:5 / 30 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `e6abbb49560a8c28c600008835b498d054520ce7e1de109ea30f57360aba4eb8` | +| `gpt-5.5` | 1050000 / 128000 | USD:5 / 30 | `modelName`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api);`contextWindow`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api);`maxOutputTokens`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api);`inputPrice`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api);`outputPrice`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api);`extra.reasoning.supportedEfforts`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api);`extra.reasoning.defaultEffort`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api);`extra.cachedInputPrice`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api) | [gpt-5-5-api](../SOURCES.md#gpt-5-5-api) | partial | `d81d0f737806bf9f659256f032d8158f6c5fbf91327945f04136f57773964370` | ### compute/model-specs/openai.json @@ -132,7 +142,11 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-5.5` | 1050000 / 128000 | 非计价主数据 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `20f9386334e9504466ab789409aa6769b8d381ee306a97c42b92e9a2743370ec` | +| `gpt-5.5` | 1050000 / 128000 | 非计价主数据 | `id`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api);`spec.contextWindow`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api);`spec.maxOutputTokens`→[gpt-5-5-api](../SOURCES.md#gpt-5-5-api) | [gpt-5-5-api](../SOURCES.md#gpt-5-5-api) | partial | `20f9386334e9504466ab789409aa6769b8d381ee306a97c42b92e9a2743370ec` | + +本轮读取该模型官方明文规格页,确认原厂直连窗口、输出、标准价格与推理合同。Pro 仅限 Responses;GPT-5.4 Pro 官方默认 medium,修正旧 high。none 在产品层映射 off,schema 不接受将 none 写成 defaultEffort,故未伪造其他显式默认档。 + +共享规格只复核内在窗口和输出;Provider 推理矩阵不复制到共享规格。 ## 下次更新核查 diff --git a/docs/model-sources/providers/openai/models/gpt-reserve.md b/docs/model-sources/providers/openai/models/gpt-reserve.md index 03a77d6..eeb0c31 100644 --- a/docs/model-sources/providers/openai/models/gpt-reserve.md +++ b/docs/model-sources/providers/openai/models/gpt-reserve.md @@ -83,7 +83,7 @@ "spec.supportsReasoning": true, "routing.tier": "lightweight", "routing.routingPriority": 10, - "routing.eligibleForAgent": true, + "routing.eligibleForAgent": false, "routing.reasoning": { "supportedModes": [ "auto", @@ -104,7 +104,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `gpt-reserve` | 1050000 / 128000 | 非计价主数据 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `b07665e638e562cf09ec384af9299b4fe3389a1cecea833b1f01e7806797078e` | +| `gpt-reserve` | 1050000 / 128000 | 非计价主数据 | 待核实 | [openai-models](../SOURCES.md#openai-models) | pending | `5798fa677d14df133dc99ed0d8624da2f1e750125e0358ed6d004767d0f4c065` | ## 下次更新核查 @@ -124,3 +124,7 @@ } ``` + +## 临时规格的路由边界 + +官方模型页与检索未取得 GPT-Reserve 规格证据。沿用先前显式要求的手动配置,不删除模型;shared spec 的 eligibleForAgent 改为 false,限制自动选型。上下文与能力仍是既有假定值,状态维持 pending;需要原厂正式规格与订阅合同分别核实后才能解开门控。 diff --git a/docs/model-sources/providers/openrouter/AUDIT.md b/docs/model-sources/providers/openrouter/AUDIT.md new file mode 100644 index 0000000..a7e03d6 --- /dev/null +++ b/docs/model-sources/providers/openrouter/AUDIT.md @@ -0,0 +1,27 @@ +# openrouter:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +公共 Models API 中现有 15 个精确 ID 均列出;14 个固定模型的窗口、输出、USD/token 换算单价与本仓一致。auto 的 -1 保持动态计价。 + +auto 无固定输出上限证据,本仓 16384 属保守预设,不能宣称路由目标最大输出;账号权限/实际路由供应商需调用验证,不扩大本轮已核范围。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [openrouter-api](https://openrouter.ai/api/v1/models) | 正文已读取 | 764719 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:15 条;pending 0、partial 15、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 15 条:pending 0、partial 15、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/openrouter/README.md b/docs/model-sources/providers/openrouter/README.md index d5801ca..a50ec9d 100644 --- a/docs/model-sources/providers/openrouter/README.md +++ b/docs/model-sources/providers/openrouter/README.md @@ -1,6 +1,6 @@ # OpenRouter:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 15 个单模型文件、1 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/openrouter/SOURCES.md b/docs/model-sources/providers/openrouter/SOURCES.md index 1f515e6..242ecd0 100644 --- a/docs/model-sources/providers/openrouter/SOURCES.md +++ b/docs/model-sources/providers/openrouter/SOURCES.md @@ -31,7 +31,7 @@ "scope": "OpenRouter 公共 Models API 快照;USD/token 换算为 USD/百万 token", "retrieval": "fetched", "checkedAt": "2026-10-03", - "contentSha256": "38864160760c394d4d81864581a33adbced3c582fdd8732809f90ec7e911f032", + "contentSha256": "17f5cbde8c7bbac639e17cabd2f90dcb82499e9b6bbff38d234ca0c7129b96c2", "resolvedUrl": "https://openrouter.ai/api/v1/models" } ] diff --git a/docs/model-sources/providers/perplexity/AUDIT.md b/docs/model-sources/providers/perplexity/AUDIT.md new file mode 100644 index 0000000..3101e82 --- /dev/null +++ b/docs/model-sources/providers/perplexity/AUDIT.md @@ -0,0 +1,27 @@ +# perplexity:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +官网迁移页说明 Sonar 同步/流式请求由平台逐步重写为 Agent API,旧异步模式不再支持;Agent API 用 input/output 和 preset。 + +保留现有同步兼容型号,不将其直接改成 Agent 型号。需客户端支持 /v1/agent、typed output、search_results、背景任务、工具事件和 preset 语义后再登记独立 Provider。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [perplexity](https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/overview) | 正文已读取 | 10483 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:6 条;pending 4、partial 2、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 6 条:pending 4、partial 2、historical 0;partial 中仅 ID 证明 2 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/perplexity/README.md b/docs/model-sources/providers/perplexity/README.md index 1ad174f..a7596f2 100644 --- a/docs/model-sources/providers/perplexity/README.md +++ b/docs/model-sources/providers/perplexity/README.md @@ -1,6 +1,6 @@ # Perplexity:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 3 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/perplexity/SOURCES.md b/docs/model-sources/providers/perplexity/SOURCES.md index 43dd2cf..437d288 100644 --- a/docs/model-sources/providers/perplexity/SOURCES.md +++ b/docs/model-sources/providers/perplexity/SOURCES.md @@ -31,7 +31,7 @@ "scope": "perplexity 官方入口;具体地域与接入面待该页面逐字段确认", "retrieval": "fetched", "checkedAt": "2026-10-03", - "contentSha256": "1b0fcd7be3f09329357b1d99b50f41833d0614f57fccdf0aa367552018923cb8", + "contentSha256": "ec4e1d1fcf5c9bb7f4f18450e05be0c9f2fdec218b348da140f10b03d37bc1a6", "resolvedUrl": "https://docs.perplexity.ai/docs/agent-api/migrate-from-sonar/overview" } ] diff --git a/docs/model-sources/providers/siliconflow/AUDIT.md b/docs/model-sources/providers/siliconflow/AUDIT.md new file mode 100644 index 0000000..e89ccef --- /dev/null +++ b/docs/model-sources/providers/siliconflow/AUDIT.md @@ -0,0 +1,27 @@ +# siliconflow:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +国内官网目录可读,但不足以确认现有全部精确 ID、计价币种和逐模型限制。 + +用国内官方模型详情/API 目录补证;国际美元价或原厂窗口不直接覆盖国内人民币 Provider。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [siliconflow](https://www.siliconflow.cn/models) | 正文已读取 | 528065 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:3 条;pending 3、partial 0、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 3 条:pending 3、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/siliconflow/README.md b/docs/model-sources/providers/siliconflow/README.md index d076965..6527db6 100644 --- a/docs/model-sources/providers/siliconflow/README.md +++ b/docs/model-sources/providers/siliconflow/README.md @@ -1,6 +1,6 @@ # 硅基流动:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 3 个单模型文件、1 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/stability/AUDIT.md b/docs/model-sources/providers/stability/AUDIT.md new file mode 100644 index 0000000..f3b9084 --- /dev/null +++ b/docs/model-sources/providers/stability/AUDIT.md @@ -0,0 +1,23 @@ +# Stability:2026-10-03 数据核验与后续计划 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +## 本轮完成 + +实读官方News与SD3.5独立发布公告,登记正确跳转到news-updates的证据。发布公告确认SD3.5 Large是图像模型及其定位,不能证明当前API接受哪种model字符串、风格与固定分辨率,因此没有借发布公告提高这些配置字段状态。 + +## 待完成与验收标准 + +| 事项 | 当前边界 | 下一步与完成条件 | +| --- | --- | --- | +| SD3.5 Platform接口 | 发布公告与可请求API是两类证据 | 读取Platform API实际请求schema,核model ID、aspect_ratio/输出格式、端点和返回值 | +| 固定尺寸/风格 | Provider已有supportedImageSizes/Styles,未取得本轮端点证明 | 若是客户端策略,注明策略;若声明原厂参数,逐项核对接口支持后修正 | +| StableAudio3.0 | 仅shared spec,音乐接口不同于图像API | 完成原生音频请求/轮询或文件响应适配、版本门控及聚焦调用,再上Provider | +| 价格 | 图像/音频按credits或请求等单位,不能猜token价 | 分服务读取官方pricing;单位和账单合同一致后登记 | +| 具体型号映射 | StableAudio3.0是原厂模型系列名称 | 核准确API ID及相应开放版本,不能把新闻里的系列名直接等同于API字符串 | + +本轮尝试的StableAudio独立旧路径返回404,News正文可读;没有把404当退役证据或造参数。 + +## 本轮最终记录统计 + +本仓记录 3 条:pending 3、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/stability/README.md b/docs/model-sources/providers/stability/README.md index 1f99005..a39983e 100644 --- a/docs/model-sources/providers/stability/README.md +++ b/docs/model-sources/providers/stability/README.md @@ -1,6 +1,6 @@ # Stability AI:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 2 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/stability/SOURCES.md b/docs/model-sources/providers/stability/SOURCES.md index 4a987b0..eca8149 100644 --- a/docs/model-sources/providers/stability/SOURCES.md +++ b/docs/model-sources/providers/stability/SOURCES.md @@ -11,6 +11,11 @@ - 入口:[stability](https://stability.ai/news-updates) - 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`stability 官方入口;具体地域与接入面待该页面逐字段确认`。 +### sd35-release + +- 入口:[sd35-release](https://stability.ai/news-updates/introducing-stable-diffusion-3-5) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Stability原厂SD3.5发布公告;本地权重与PlatformAPI端点可用性分开核。 + ## 已知边界与核验说明 已登记官方入口并尝试读取。表中仅标为已核字段的部分有此次核对记录;其余存量参数待逐字段复核。 @@ -28,11 +33,21 @@ "id": "stability", "url": "https://stability.ai/news-updates", "kind": "official-doc", - "scope": "stability 官方入口;具体地域与接入面待该页面逐字段确认", + "scope": "本轮读取 stability 官方 stability 页面;按单模型记录限定字段与接入面", "retrieval": "fetched", "checkedAt": "2026-10-03", "contentSha256": "89d63195c184b398f48647563610a8918eefff9b65b999ace04d543f152d2cfa", "resolvedUrl": "https://stability.ai/news-updates" + }, + { + "id": "sd35-release", + "url": "https://stability.ai/news-updates/introducing-stable-diffusion-3-5", + "kind": "official-doc", + "scope": "Stability原厂SD3.5发布公告;本地权重与PlatformAPI端点可用性分开核", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "87614737504ac9cf47baf41287092121031b02c759e12c4d5a824bd4b86a07c6", + "resolvedUrl": "https://stability.ai/news-updates/introducing-stable-diffusion-3-5" } ] } diff --git a/docs/model-sources/providers/stealth/AUDIT.md b/docs/model-sources/providers/stealth/AUDIT.md new file mode 100644 index 0000000..87a5f8c --- /dev/null +++ b/docs/model-sources/providers/stealth/AUDIT.md @@ -0,0 +1,15 @@ +# Stealth:2026-10-03 历史身份审计 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +本轮移除未取得原厂揭示正文证据的OxAlpha→GLM5.3Flash modelOrigin映射;展示名恢复OxAlpha Historical。保留旧exact身份和参数作历史兼容,Provider已经下架并tombstone。历史规格不证明当前目录可调用。 + +| 待完成 | 验收标准 | +| --- | --- | +| 身份揭示证据 | 原厂明确公告或官方目录映射,记录正文日期/摘要后才恢复modelOrigin | +| 旧别名保留期限 | 检查历史客户配置与云端引用,明确保留用途与再审时间,不能凭目录缺失全删 | +| 历史参数核验状态 | 不因合并/迁移刷新日期或提高historical状态;如重上架,应按新接入合同重新核验 | + +## 本轮最终记录统计 + +本仓记录 1 条:pending 0、partial 0、historical 1;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/stealth/README.md b/docs/model-sources/providers/stealth/README.md index 623f24e..6dbcc39 100644 --- a/docs/model-sources/providers/stealth/README.md +++ b/docs/model-sources/providers/stealth/README.md @@ -1,6 +1,6 @@ # 匿名模型历史兼容:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 1 个单模型文件、1 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/stealth/SOURCES.md b/docs/model-sources/providers/stealth/SOURCES.md index 80c7cc6..a87e153 100644 --- a/docs/model-sources/providers/stealth/SOURCES.md +++ b/docs/model-sources/providers/stealth/SOURCES.md @@ -52,3 +52,7 @@ } ``` + +## 历史身份收尾 + +本轮不再向运行时下发 Ox Alpha → GLM-5.3-Flash 的未证实 modelOrigin 身份映射,展示名恢复为 Ox Alpha (Historical)。保留 exact 别名与既有历史规格,以兼容旧配置;它们不代表当前供应商目录仍可调用,也不是新核验的正式规格。需取得原厂身份揭示正文后才能恢复映射。 diff --git a/docs/model-sources/providers/stealth/models/ox-alpha.md b/docs/model-sources/providers/stealth/models/ox-alpha.md index d823090..af21a74 100644 --- a/docs/model-sources/providers/stealth/models/ox-alpha.md +++ b/docs/model-sources/providers/stealth/models/ox-alpha.md @@ -54,7 +54,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `ox-alpha` | 1048576 / 131072 | 非计价主数据 | 待核实 | [openrouter-api](../SOURCES.md#openrouter-api) | historical | `1d20e9cc8d59f956ab8fe266f8aaaf5eedf6297c3487c6fd6f85e03e7bb7b560` | +| `ox-alpha` | 1048576 / 131072 | 非计价主数据 | 待核实 | [openrouter-api](../SOURCES.md#openrouter-api) | historical | `cc076eea8258b8eea4572086dea9e4d07b41cdc63fcbc729ceeb324dc7c6f32a` | ## 下次更新核查 @@ -74,3 +74,7 @@ } ``` + +## 历史身份边界 + +移除未取得本轮原厂正文证据的 modelOrigin 映射,展示名改为 Ox Alpha (Historical)。历史 exact 匹配与旧规格继续保留,状态仍为 historical;未声明当前可用性或将它自动等同于 GLM-5.3-Flash。 diff --git a/docs/model-sources/providers/tencent/AUDIT.md b/docs/model-sources/providers/tencent/AUDIT.md new file mode 100644 index 0000000..29fd1f7 --- /dev/null +++ b/docs/model-sources/providers/tencent/AUDIT.md @@ -0,0 +1,29 @@ +# tencent:2026-10-03 字段复核与剩余过程 + +[官网证据](SOURCES.md) · [模型与接入导航](README.md) + +本轮实际读取腾讯2026-08-28官方Hy4 Preview公告,已将spec.releasedAt补为字段证据。公告只说上下文超过1M,不足以精确认证现有1048576;该整数继续待核。新闻列USD输入0.834/输出2.501/缓存0.042,不能复制成既有国内混元Provider的CNY定价。新闻提到TokenHub/OpenRouter,不证明hunyuan.tencentcloudapi.com旧端点兼容该新模型。 + +下一步核TokenHub独立endpoint/认证/模型ID/价格币种、精确输入输出和思考合同;支持后再接客户端和新增Provider。hy3及Hunyuan存量日期型号需各自原生合同,不由Hy4新闻提高状态。 + +## 待核实队列 + +本轮收尾快照:25条接入面记录,23 pending,1条partial只核ID;同一模型可占多条,非独立型号数。partial是已列字段证明,不是全部通过。 + +### 尚无字段证明 + +- `compute/coding-plans/tencent-token.json`:`glm-5.1`、`glm-5`、`hunyuan-2.0-instruct`、`hunyuan-2.0-thinking`、`hunyuan-t1`、`hunyuan-turbos`、`kimi-k2.5`、`minimax-m2.5`、`minimax-m2.7`、`tc-code-latest`。 +- `compute/providers/tencent.json`:`hunyuan-2.0-instruct-20251111`、`hunyuan-2.0-thinking-20251109`、`hunyuan-t1-latest`、`hunyuan-t1-vision`、`hunyuan-turbos-latest`、`hunyuan-turbos-vision`。 +- `compute/model-specs/tencent.json`:`hunyuan-2.0-instruct-20251111`、`hunyuan-2.0-thinking-20251109`、`hunyuan-t1-latest`、`hunyuan-t1-vision`、`hunyuan-turbos-latest`、`hunyuan-turbos-vision`、`hy3-preview`。 + +### 仅ID有证明 + +- `compute/model-specs/tencent.json`:`hy3`。 + +## 完成标准 + +逐条打开对应官网正文/官方API,按原厂、套餐、地域分别登记精确参数和单位;有差异才改canonical JSON,同步该模型详情、字段引用和指纹。保留未证实字段。运行来源/结构测试;协议改动需客户端和实际调用验收。没有账号授权,本轮未执行收费模型调用。 + +## 本轮最终记录统计 + +本仓记录 25 条:pending 23、partial 2、historical 0;partial 中仅 ID 证明 1 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/tencent/README.md b/docs/model-sources/providers/tencent/README.md index 2f3dbd0..579d333 100644 --- a/docs/model-sources/providers/tencent/README.md +++ b/docs/model-sources/providers/tencent/README.md @@ -1,6 +1,6 @@ # 腾讯混元:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 19 个单模型文件、3 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/tencent/models/hy4-preview.md b/docs/model-sources/providers/tencent/models/hy4-preview.md index a18a39e..934ac30 100644 --- a/docs/model-sources/providers/tencent/models/hy4-preview.md +++ b/docs/model-sources/providers/tencent/models/hy4-preview.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`hy4-preview`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -43,7 +43,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `hy4-preview` | 1048576 / 未声明 | 非计价主数据 | 待核实 | [tencent](../SOURCES.md#tencent) | pending | `7c6a182d9b613f6a53db2c3c5a3832f9da4506e933e67f92dcbf5a2c813a2d5d` | +| `hy4-preview` | 1048576 / 未声明 | 非计价主数据 | `spec.releasedAt`→[tencent](../SOURCES.md#tencent) | [tencent](../SOURCES.md#tencent) | partial | `7c6a182d9b613f6a53db2c3c5a3832f9da4506e933e67f92dcbf5a2c813a2d5d` | ## 下次更新核查 diff --git a/docs/model-sources/providers/volcengine/AUDIT.md b/docs/model-sources/providers/volcengine/AUDIT.md new file mode 100644 index 0000000..999f553 --- /dev/null +++ b/docs/model-sources/providers/volcengine/AUDIT.md @@ -0,0 +1,29 @@ +# volcengine:2026-10-03 字段复核与剩余过程 + +[官网证据](SOURCES.md) · [模型与接入导航](README.md) + +本轮实际读取 model-list、coding-plan 和 Seed入口的清洗正文,三者均只返回“需要启用JavaScript”的页面壳,11914字节HTML不含模型合同;latest入口另有TLS握手超时。Seed入口最终跳到latest页面,不能当作旧Seed详情。 + +所有66条记录继续pending,不使用第三方补参数。下一步用官方文档可读正文/官方仓库或有授权的控制台,首先查Seed2.1 Pro/Turbo、Doubao精确日期版本的上下文、输入和输出独立限制,再查媒体任务轮询/端点、国内价格以及套餐清单。取得正文前不调整数值,不把200或跳转成功视为核实。 + +## 待核实队列 + +本轮收尾快照:66条接入面记录,66 pending,0条partial只核ID;同一模型可占多条,非独立型号数。partial是已列字段证明,不是全部通过。 + +### 尚无字段证明 + +- `compute/coding-plans/volcengine-coding.json`:`ark-code-latest`、`deepseek-v3.2`、`doubao-seed-2.0-code`、`doubao-seed-2.0-lite`、`doubao-seed-2.0-pro`、`doubao-seed-2.1-pro`、`doubao-seed-2.1-turbo`、`doubao-seed-code`、`glm-4.7`、`glm-5.1`、`kimi-k2.5`、`kimi-k2.6`、`minimax-m2.5`、`minimax-m2.7`。 +- `compute/providers/volcengine.json`:`deepseek-r1`、`deepseek-v3.2`、`doubao-embedding-large`、`doubao-embedding`、`doubao-seed-1.6-flash`、`doubao-seed-1.6-lite`、`doubao-seed-1.6-thinking`、`doubao-seed-1.6-vision`、`doubao-seed-1.6`、`doubao-seed-1.8`、`doubao-seed-2.0-code`、`doubao-seed-2.0-lite`、`doubao-seed-2.0-mini`、`doubao-seed-2.0-pro`、`doubao-seed-2.1-pro`、`doubao-seed-2.1-turbo`、`doubao-seed-code`、`doubao-seed-evolving`、`doubao-seedance-2-0-260128`、`doubao-seedream-4-0-250828`、`volc-mega-tts-clone`、`volc-realtime-voice`、`volc-simultaneous`、`volc-translation`。 +- `compute/model-specs/volcengine.json`:`deepseek-r1`、`deepseek-v3.2`、`doubao-embedding-large`、`doubao-embedding`、`doubao-seed-1.6-flash`、`doubao-seed-1.6-lite`、`doubao-seed-1.6-thinking`、`doubao-seed-1.6-vision`、`doubao-seed-1.6`、`doubao-seed-1.8`、`doubao-seed-2.0-code`、`doubao-seed-2.0-lite`、`doubao-seed-2.0-mini`、`doubao-seed-2.0-pro`、`doubao-seed-2.1-pro`、`doubao-seed-2.1-turbo`、`doubao-seed-code`、`doubao-seed-evolving`、`doubao-seedance-1.0-pro-fast`、`doubao-seedance-1.0-pro`、`doubao-seedance-1.5-pro`、`doubao-seedance-2.0-fast`、`doubao-seedance-2.0-mini`、`doubao-seedance-2.0`、`volc-mega-tts-clone`、`volc-realtime-voice`、`volc-simultaneous`、`volc-translation`。 + +### 仅ID有证明 + +无。 + +## 完成标准 + +逐条打开对应官网正文/官方API,按原厂、套餐、地域分别登记精确参数和单位;有差异才改canonical JSON,同步该模型详情、字段引用和指纹。保留未证实字段。运行来源/结构测试;协议改动需客户端和实际调用验收。没有账号授权,本轮未执行收费模型调用。 + +## 本轮最终记录统计 + +本仓记录 66 条:pending 66、partial 0、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/volcengine/README.md b/docs/model-sources/providers/volcengine/README.md index 9ab5d73..386e418 100644 --- a/docs/model-sources/providers/volcengine/README.md +++ b/docs/model-sources/providers/volcengine/README.md @@ -1,6 +1,6 @@ # 火山引擎:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 37 个单模型文件、3 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/xai/AUDIT.md b/docs/model-sources/providers/xai/AUDIT.md new file mode 100644 index 0000000..6e3af4e --- /dev/null +++ b/docs/model-sources/providers/xai/AUDIT.md @@ -0,0 +1,18 @@ +# xAI:2026-10-03 数据核验与后续计划 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +本轮读取Grok4.3独立官方页,核1000000窗口、标准输入1.25/输出2.5/cache0.2美元每百万tokens。迁移旧reasoningEffort至客户端读取字段,默认low有明确证据;同页Capabilities只有四档,Details额外xhigh,暂不扩大档位。 + +| 待完成 | 验收标准 | +| --- | --- | +| Grok4.3 xhigh口径差异 | 官方API元数据或授权调用确认真实接受值后开放;不只采信同页冲突表 | +| 其他旧型号与媒体生成参数 | 单型号原厂接口明确输入输出、价格单位、生命周期,不只ID目录 | +| latest别名与退休重定向 | 核官方migration表和实际alias映射,区分旧模型能力与重定向后计费 | +| 200K以上阶梯及区域 | 官方pricing逐cluster/上下文档核价,当前标准价不能概括高上下文价格 | + +未做账号调用;文档与schema通过不代表运行时请求通过。 + +## 本轮最终记录统计 + +本仓记录 9 条:pending 5、partial 4、historical 0;partial 中仅 ID 证明 3 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/xai/README.md b/docs/model-sources/providers/xai/README.md index 7e225ff..5d53c80 100644 --- a/docs/model-sources/providers/xai/README.md +++ b/docs/model-sources/providers/xai/README.md @@ -1,6 +1,6 @@ # xAI:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 7 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/xai/SOURCES.md b/docs/model-sources/providers/xai/SOURCES.md index 9b3b472..d1ae47f 100644 --- a/docs/model-sources/providers/xai/SOURCES.md +++ b/docs/model-sources/providers/xai/SOURCES.md @@ -11,6 +11,11 @@ - 入口:[xai](https://docs.x.ai/developers/release-notes) - 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`xai 官方入口;具体地域与接入面待该页面逐字段确认`。 +### grok43-model + +- 入口:[grok43-model](https://docs.x.ai/developers/models/grok-4.3) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:xAI Grok4.3 直连 API;USD 标准价格。 + ## 已知边界与核验说明 已登记官方入口并尝试读取。表中仅标为已核字段的部分有此次核对记录;其余存量参数待逐字段复核。 @@ -33,8 +38,22 @@ "checkedAt": "2026-10-03", "contentSha256": "15620ca6445ab3d08a0bfb7e42ea5ade12bac808ef11df763a99cd865ae6c7ae", "resolvedUrl": "https://docs.x.ai/developers/release-notes" + }, + { + "id": "grok43-model", + "url": "https://docs.x.ai/developers/models/grok-4.3", + "kind": "official-doc", + "scope": "xAI Grok4.3 直连 API;USD 标准价格", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "bd44aac101032c9eb9cc2896d86c19f2f3233301ac86a32c2efa0249239bbf32", + "resolvedUrl": "https://docs.x.ai/developers/models/grok-4.3" } ] } ``` + +## Grok 4.3 档位差异 + +本轮模型页 Capabilities 明确 none/low/medium/high;Details 表另列 xhigh,存在同页差异。仅采用四个一致档位,默认 low 有明确记录。xhigh 需取得稳定 API 规格或授权请求证据后再开放;未做账号调用验收。 diff --git a/docs/model-sources/providers/xai/models/grok-4.3.md b/docs/model-sources/providers/xai/models/grok-4.3.md index 9c10ad2..467e04f 100644 --- a/docs/model-sources/providers/xai/models/grok-4.3.md +++ b/docs/model-sources/providers/xai/models/grok-4.3.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`grok-4.3`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量核验下列字段;未列字段及其他接入面的状态保持独立。 ## 适用接入面 @@ -39,7 +39,16 @@ "defaultTopP": 1, "inputPrice": 1.25, "outputPrice": 2.5, - "extra.cachedInputPrice": 0.2 + "extra.cachedInputPrice": 0.2, + "extra.reasoning": { + "supportedEfforts": [ + "none", + "low", + "medium", + "high" + ], + "defaultEffort": "low" + } } ``` @@ -48,7 +57,9 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `grok-4.3` | 1000000 / 未声明 | USD:1.25 / 2.5 | 待核实 | [xai](../SOURCES.md#xai) | pending | `bd07b22c70b23607ba3a86737f6ae7b54ea1ca53949ddbb693724bfad1d627d9` | +| `grok-4.3` | 1000000 / 未声明 | USD:1.25 / 2.5 | `modelName`→[grok43-model](../SOURCES.md#grok43-model);`contextWindow`→[grok43-model](../SOURCES.md#grok43-model);`inputPrice`→[grok43-model](../SOURCES.md#grok43-model);`outputPrice`→[grok43-model](../SOURCES.md#grok43-model);`extra.cachedInputPrice`→[grok43-model](../SOURCES.md#grok43-model);`extra.reasoning.supportedEfforts`→[grok43-model](../SOURCES.md#grok43-model);`extra.reasoning.defaultEffort`→[grok43-model](../SOURCES.md#grok43-model) | [grok43-model](../SOURCES.md#grok43-model) | partial | `cd5e64db1ae28c111960f2e47fe82fdefceb06079261396a214ad89578a02ee1` | + +官方同页 Capabilities 列 none/low/medium/high,Details 额外列 xhigh,存在口径差异;保留四个无争议档位,默认 low。不能据此扩张 xhigh。 ## 下次更新核查 diff --git a/docs/model-sources/providers/xiaomi/AUDIT.md b/docs/model-sources/providers/xiaomi/AUDIT.md new file mode 100644 index 0000000..2490a4c --- /dev/null +++ b/docs/model-sources/providers/xiaomi/AUDIT.md @@ -0,0 +1,31 @@ +# xiaomi:2026-10-03 字段复核与剩余过程 + +[官网证据](SOURCES.md) · [模型与接入导航](README.md) + +本轮补读官方模型列表、国内/海外分表定价、Token Plan和发布文章。普通API已核当前文本模型窗口与输出短写、国内输入/输出/缓存价,补MiMo-V2.5-Pro缺失3/6/cache0.025 CNY/M;ASR目录8K/2K已核。1M按1000000、128K按131072、8K按8192、2K按2048是本仓明确换算约定,短写不声称官网已给精确整数。TTS目录列8K/8K,未把该限制新加入客户端媒体协议。 + +V2.5和V2.5-Pro退役时间为2026-10-21北京时间10:00,保留到期前可用记录。ASR按输入小时、TTS限时免费、Batch半价、联网调用计次不可写成token价。UltraSpeed需定制配额,不进普通Token Plan。MiMo-X预览不在当前公开目录,缺席不构成退役证明。 + +下一步核实thinking/default/可关闭、采样、具体音频格式与端点、API对K/M的精确整数;到期按实际状态同步Provider tombstones和默认云端summary选择。 + +## 待核实队列 + +本轮收尾快照:25条接入面记录,8 pending,7条partial只核ID;同一模型可占多条,非独立型号数。partial是已列字段证明,不是全部通过。 + +### 尚无字段证明 + +- `compute/model-specs/xiaomi.json`:`mimo-v2-flash`、`mimo-v2-omni`、`mimo-v2-pro`、`mimo-v2-tts`、`mimo-x-flash-preview`、`mimo-x-pro-preview`。 +- `compute/providers/xiaomi.json`:`mimo-x-flash-preview`、`mimo-x-pro-preview`。 + +### 仅ID有证明 + +- `compute/providers/xiaomi.json`:`mimo-v2.5-tts-voiceclone`、`mimo-v2.5-tts-voicedesign`、`mimo-v2.5-tts`。 +- `compute/model-specs/xiaomi.json`:`mimo-v2.5-tts-voiceclone`、`mimo-v2.5-tts-voicedesign`、`mimo-v2.5-tts`、`mimo-v2.5`。 + +## 完成标准 + +逐条打开对应官网正文/官方API,按原厂、套餐、地域分别登记精确参数和单位;有差异才改canonical JSON,同步该模型详情、字段引用和指纹。保留未证实字段。运行来源/结构测试;协议改动需客户端和实际调用验收。没有账号授权,本轮未执行收费模型调用。 + +## 本轮最终记录统计 + +本仓记录 25 条:pending 8、partial 17、historical 0;partial 中仅 ID 证明 7 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/xiaomi/README.md b/docs/model-sources/providers/xiaomi/README.md index 152f7f4..c1bb383 100644 --- a/docs/model-sources/providers/xiaomi/README.md +++ b/docs/model-sources/providers/xiaomi/README.md @@ -1,6 +1,6 @@ # 小米 MiMo:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 15 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/xiaomi/SOURCES.md b/docs/model-sources/providers/xiaomi/SOURCES.md index 2c48d43..5e300fc 100644 --- a/docs/model-sources/providers/xiaomi/SOURCES.md +++ b/docs/model-sources/providers/xiaomi/SOURCES.md @@ -11,12 +11,39 @@ - 入口:[xiaomi](https://mimo.mi.com/docs/en-US/news/latest/v2-6) - 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`xiaomi 官方入口;具体地域与接入面待该页面逐字段确认`。 +### xiaomi-models + +- 入口:[xiaomi-models](https://mimo.mi.com/docs/en-US/quick-start/summary/model) +- 本轮实际读取正文;MiMo API 模型目录;窗口/输出K换算取现有二进制K,1M按百万。 + +### xiaomi-price + +- 入口:[xiaomi-price](https://mimo.mi.com/docs/en-US/price/pay-as-you-go) +- 本轮实际读取正文;国内实时API CNY/M 与海外USD/M 分表;不是Token Plan额度。 + +### xiaomi-plan + +- 入口:[xiaomi-plan](https://mimo.mi.com/docs/en-US/tokenplan/Token%20Plan/subscription) +- 本轮实际读取正文;MiMo Token Plan独立Credit额度和编程工具限制。 + ## 已知边界与核验说明 已登记官方入口并尝试读取。表中仅标为已核字段的部分有此次核对记录;其余存量参数待逐字段复核。 状态 `partial` 仅表示列出的字段已核实;不能推断整条配置、价格、账号权限或真实模型调用都已验收。`pending` 没有已核字段;`historical` 只作历史兼容参考。路由 tier/priority、产品标签和默认选择属于本仓策略,不伪装成官网数据。 +## 2026-10-03 字段复核:xiaomi-models + +目录明示当前文本型号1M上下文、128K输出,ASR 8K/2K,TTS 8K/8K。1M采用1000000,128K采用131072、8K8192、2K2048;短写换算是明确的本仓约定,精确整数与API响应仍需进一步核实。V2.5两型号北京时间2026-10-21 10:00退役;未到期不删除历史模型。 + +## 2026-10-03 字段复核:xiaomi-price + +实际读取国内实时单价:Pro 3/6/cache0.025,Flash1/2/cache0.02,UltraSpeed30/60/cache0.25;V2.5-Pro沿用Pro单价。ASR按小时、TTS限时免费、Batch价格不同,不能套入每百万token字段。 + +## 2026-10-03 字段复核:xiaomi-plan + +明确列8个模型,套餐与普通API余额不互通;没有UltraSpeed。仅提升实际列出的套餐modelName证明,不把API价格/窗口直接作为套餐合同。 + ```json { @@ -33,6 +60,36 @@ "checkedAt": "2026-10-03", "contentSha256": "101d0e7233e16966073506c525bc95ae192b906eb7d2e31659598e04b22a94b0", "resolvedUrl": "https://mimo.mi.com/docs/en-US/news/latest/v2-6" + }, + { + "id": "xiaomi-models", + "url": "https://mimo.mi.com/docs/en-US/quick-start/summary/model", + "kind": "official-doc", + "scope": "MiMo API 模型目录;窗口/输出K换算取现有二进制K,1M按百万", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "b1237c793e11793d5b0dfc7451af0c0efe8319bdca6b8be2720ace532dfe93be", + "resolvedUrl": "https://mimo.mi.com/docs/en-US/quick-start/summary/model" + }, + { + "id": "xiaomi-price", + "url": "https://mimo.mi.com/docs/en-US/price/pay-as-you-go", + "kind": "official-doc", + "scope": "国内实时API CNY/M 与海外USD/M 分表;不是Token Plan额度", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "d0292517cfd66072dc8d11bda632aa0bb9f21e9f295b6e5a9129b404a4b62319", + "resolvedUrl": "https://mimo.mi.com/docs/en-US/price/pay-as-you-go" + }, + { + "id": "xiaomi-plan", + "url": "https://mimo.mi.com/docs/en-US/tokenplan/Token%20Plan/subscription", + "kind": "official-doc", + "scope": "MiMo Token Plan独立Credit额度和编程工具限制", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "757af8dfd5c3ec8ab8576349e072489fc2bcf2ab436ed9f427e21ca8a44a335c", + "resolvedUrl": "https://mimo.mi.com/docs/en-US/tokenplan/Token%20Plan/subscription" } ] } diff --git a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-asr.md b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-asr.md index b8e90b6..191e7ec 100644 --- a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-asr.md +++ b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-asr.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`mimo-v2.5-asr`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -40,7 +40,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-asr` | 8192 / 2048 | CNY:未声明 / 未声明 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `b2a80d502df4232d134d9bd8a61027e2d7117ccf80f04fd3efd90a67f4d1da44` | +| `mimo-v2.5-asr` | 8192 / 2048 | CNY:未声明 / 未声明 | `modelName`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `b2a80d502df4232d134d9bd8a61027e2d7117ccf80f04fd3efd90a67f4d1da44` | ### compute/model-specs/xiaomi.json @@ -78,7 +78,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-asr` | 8192 / 2048 | 非计价主数据 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `4cfb4519523407bc8baaa97d1c980885d79d65841eaec46937cacb4bdc1c0716` | +| `mimo-v2.5-asr` | 8192 / 2048 | 非计价主数据 | `id`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `4cfb4519523407bc8baaa97d1c980885d79d65841eaec46937cacb4bdc1c0716` | ## 下次更新核查 diff --git a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-pro.md b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-pro.md index 81c87ca..4519871 100644 --- a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-pro.md +++ b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-pro.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`mimo-v2.5-pro`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -34,7 +34,10 @@ "reasoning", "tool_use", "code" - ] + ], + "inputPrice": 3, + "outputPrice": 6, + "extra.cachedInputPrice": 0.025 } ``` @@ -43,7 +46,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-pro` | 1000000 / 131072 | CNY:未声明 / 未声明 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `11c971d0c899bcb5b3609f995a72ae10eb26d76a56889f2a9abcc49c4801f229` | +| `mimo-v2.5-pro` | 1000000 / 131072 | CNY:3 / 6 | `modelName`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`inputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price)、`outputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price)、`extra.cachedInputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price) | [xiaomi-models](../SOURCES.md#xiaomi-models)、[xiaomi-price](../SOURCES.md#xiaomi-price) | partial | `56861350c43847292f445e449d97394b68bd31cf44ee15882887154cb53907d4` | ### compute/model-specs/xiaomi.json @@ -91,7 +94,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-pro` | 1000000 / 131072 | 非计价主数据 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `b7fb772af4eb3e1490c6525fb34555491e7d5537708d1f52458290f9b365a287` | +| `mimo-v2.5-pro` | 1000000 / 131072 | 非计价主数据 | `id`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `b7fb772af4eb3e1490c6525fb34555491e7d5537708d1f52458290f9b365a287` | ## 下次更新核查 diff --git a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts-voiceclone.md b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts-voiceclone.md index 657a44b..b1e33d4 100644 --- a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts-voiceclone.md +++ b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts-voiceclone.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`mimo-v2.5-tts-voiceclone`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -38,7 +38,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-tts-voiceclone` | 未声明 / 未声明 | CNY:未声明 / 未声明 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `c74f3bea61daecb30e58eeac591f6e5b718a8b3d39f8fa71d86a0c63b7e0908c` | +| `mimo-v2.5-tts-voiceclone` | 未声明 / 未声明 | CNY:未声明 / 未声明 | `modelName`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `c74f3bea61daecb30e58eeac591f6e5b718a8b3d39f8fa71d86a0c63b7e0908c` | ### compute/model-specs/xiaomi.json @@ -67,7 +67,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-tts-voiceclone` | 8192 / 未声明 | 非计价主数据 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `3e1297c767007f00807327f0d408af302b090ab1def64c6dbffda534d1952d79` | +| `mimo-v2.5-tts-voiceclone` | 8192 / 未声明 | 非计价主数据 | `id`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `3e1297c767007f00807327f0d408af302b090ab1def64c6dbffda534d1952d79` | ## 下次更新核查 diff --git a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts-voicedesign.md b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts-voicedesign.md index 242bfea..fca2bf8 100644 --- a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts-voicedesign.md +++ b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts-voicedesign.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`mimo-v2.5-tts-voicedesign`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -38,7 +38,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-tts-voicedesign` | 未声明 / 未声明 | CNY:未声明 / 未声明 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `e32315265f593c73fcd7704fa0a650e6c9bbc007337f4f69d98ddff014fea637` | +| `mimo-v2.5-tts-voicedesign` | 未声明 / 未声明 | CNY:未声明 / 未声明 | `modelName`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `e32315265f593c73fcd7704fa0a650e6c9bbc007337f4f69d98ddff014fea637` | ### compute/model-specs/xiaomi.json @@ -66,7 +66,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-tts-voicedesign` | 8192 / 未声明 | 非计价主数据 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `fb40eb73c466a68996ce72297a8f213ec0a002fedab07c48c8511fcc49c02f4b` | +| `mimo-v2.5-tts-voicedesign` | 8192 / 未声明 | 非计价主数据 | `id`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `fb40eb73c466a68996ce72297a8f213ec0a002fedab07c48c8511fcc49c02f4b` | ## 下次更新核查 diff --git a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts.md b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts.md index 77252c9..cf3569b 100644 --- a/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts.md +++ b/docs/model-sources/providers/xiaomi/models/mimo-v2.5-tts.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`mimo-v2.5-tts`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -39,7 +39,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-tts` | 未声明 / 未声明 | CNY:未声明 / 未声明 | `modelName`→[xiaomi](../SOURCES.md#xiaomi) | [xiaomi](../SOURCES.md#xiaomi) | partial | `b38f14db2811805b4ec890be98cacf9db1a0f3f8b12d9a0ea13b4d6c8beba0f5` | +| `mimo-v2.5-tts` | 未声明 / 未声明 | CNY:未声明 / 未声明 | `modelName`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `b38f14db2811805b4ec890be98cacf9db1a0f3f8b12d9a0ea13b4d6c8beba0f5` | ### compute/model-specs/xiaomi.json @@ -78,7 +78,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.5-tts` | 8192 / 8192 | 非计价主数据 | `id`→[xiaomi](../SOURCES.md#xiaomi) | [xiaomi](../SOURCES.md#xiaomi) | partial | `c2ce69e79eb2776dfded19ff81e8ae33f6c6df85f5fc0ad43ea09f96bd9213cf` | +| `mimo-v2.5-tts` | 8192 / 8192 | 非计价主数据 | `id`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `c2ce69e79eb2776dfded19ff81e8ae33f6c6df85f5fc0ad43ea09f96bd9213cf` | ## 下次更新核查 diff --git a/docs/model-sources/providers/xiaomi/models/mimo-v2.6-flash.md b/docs/model-sources/providers/xiaomi/models/mimo-v2.6-flash.md index fcc6ca5..8f0916f 100644 --- a/docs/model-sources/providers/xiaomi/models/mimo-v2.6-flash.md +++ b/docs/model-sources/providers/xiaomi/models/mimo-v2.6-flash.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`mimo-v2.6-flash`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -54,7 +54,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.6-flash` | 1000000 / 131072 | CNY:1 / 2 | `modelName`→[xiaomi](../SOURCES.md#xiaomi) | [xiaomi](../SOURCES.md#xiaomi) | partial | `971c522ca5f9646fd31131cb2ed69ff93baf966fe29004cb8d6c10bdb5c131e4` | +| `mimo-v2.6-flash` | 1000000 / 131072 | CNY:1 / 2 | `modelName`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`inputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price)、`outputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price)、`extra.cachedInputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price) | [xiaomi-models](../SOURCES.md#xiaomi-models)、[xiaomi-price](../SOURCES.md#xiaomi-price) | partial | `971c522ca5f9646fd31131cb2ed69ff93baf966fe29004cb8d6c10bdb5c131e4` | ### compute/model-specs/xiaomi.json @@ -104,7 +104,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.6-flash` | 1000000 / 131072 | 非计价主数据 | `id`→[xiaomi](../SOURCES.md#xiaomi) | [xiaomi](../SOURCES.md#xiaomi) | partial | `679d23a03cbd0864aa1c2710007d78994379949cfea4bb8adbd92077a4770b97` | +| `mimo-v2.6-flash` | 1000000 / 131072 | 非计价主数据 | `id`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `679d23a03cbd0864aa1c2710007d78994379949cfea4bb8adbd92077a4770b97` | ## 下次更新核查 diff --git a/docs/model-sources/providers/xiaomi/models/mimo-v2.6-pro-ultraspeed.md b/docs/model-sources/providers/xiaomi/models/mimo-v2.6-pro-ultraspeed.md index 7c70192..ad71183 100644 --- a/docs/model-sources/providers/xiaomi/models/mimo-v2.6-pro-ultraspeed.md +++ b/docs/model-sources/providers/xiaomi/models/mimo-v2.6-pro-ultraspeed.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`mimo-v2.6-pro-ultraspeed`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -54,7 +54,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.6-pro-ultraspeed` | 1000000 / 131072 | CNY:30 / 60 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `e4c200a382c4a42d5b7a8619875205fc0e9f9e21cffa5f99b9252ea5a94dbeff` | +| `mimo-v2.6-pro-ultraspeed` | 1000000 / 131072 | CNY:30 / 60 | `modelName`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`inputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price)、`outputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price)、`extra.cachedInputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price) | [xiaomi-models](../SOURCES.md#xiaomi-models)、[xiaomi-price](../SOURCES.md#xiaomi-price) | partial | `e4c200a382c4a42d5b7a8619875205fc0e9f9e21cffa5f99b9252ea5a94dbeff` | ### compute/model-specs/xiaomi.json @@ -94,7 +94,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.6-pro-ultraspeed` | 1000000 / 131072 | 非计价主数据 | 待核实 | [xiaomi](../SOURCES.md#xiaomi) | pending | `a3d199cf35bff0b84fd9e9d31d1302c4a3cf6969c0aa5b6853c3fba0b82a4ae1` | +| `mimo-v2.6-pro-ultraspeed` | 1000000 / 131072 | 非计价主数据 | `id`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `a3d199cf35bff0b84fd9e9d31d1302c4a3cf6969c0aa5b6853c3fba0b82a4ae1` | ## 下次更新核查 diff --git a/docs/model-sources/providers/xiaomi/models/mimo-v2.6-pro.md b/docs/model-sources/providers/xiaomi/models/mimo-v2.6-pro.md index a725ffd..c3e6055 100644 --- a/docs/model-sources/providers/xiaomi/models/mimo-v2.6-pro.md +++ b/docs/model-sources/providers/xiaomi/models/mimo-v2.6-pro.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`mimo-v2.6-pro`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮重新读取官网,逐接入面只确认下表列出的字段;其余仍待核实。 ## 适用接入面 @@ -53,7 +53,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.6-pro` | 1000000 / 131072 | CNY:3 / 6 | `modelName`→[xiaomi](../SOURCES.md#xiaomi) | [xiaomi](../SOURCES.md#xiaomi) | partial | `05d1434b13674852e66f3ad25540f97f099e8f5b6822b6d6008a2b4e1cc993f3` | +| `mimo-v2.6-pro` | 1000000 / 131072 | CNY:3 / 6 | `modelName`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`inputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price)、`outputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price)、`extra.cachedInputPrice`→[xiaomi-price](../SOURCES.md#xiaomi-price) | [xiaomi-models](../SOURCES.md#xiaomi-models)、[xiaomi-price](../SOURCES.md#xiaomi-price) | partial | `05d1434b13674852e66f3ad25540f97f099e8f5b6822b6d6008a2b4e1cc993f3` | ### compute/model-specs/xiaomi.json @@ -102,7 +102,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `mimo-v2.6-pro` | 1000000 / 131072 | 非计价主数据 | `id`→[xiaomi](../SOURCES.md#xiaomi) | [xiaomi](../SOURCES.md#xiaomi) | partial | `54ee471dea50ce6c6f2b7996356d40e363e76601c087255e01063cf3c67d325d` | +| `mimo-v2.6-pro` | 1000000 / 131072 | 非计价主数据 | `id`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.contextWindow`→[xiaomi-models](../SOURCES.md#xiaomi-models)、`spec.maxOutputTokens`→[xiaomi-models](../SOURCES.md#xiaomi-models) | [xiaomi-models](../SOURCES.md#xiaomi-models) | partial | `54ee471dea50ce6c6f2b7996356d40e363e76601c087255e01063cf3c67d325d` | ## 下次更新核查 diff --git a/docs/model-sources/providers/xunfei/AUDIT.md b/docs/model-sources/providers/xunfei/AUDIT.md new file mode 100644 index 0000000..12de8de --- /dev/null +++ b/docs/model-sources/providers/xunfei/AUDIT.md @@ -0,0 +1,29 @@ +# xunfei:数据闭环核查 + +[供应商索引](README.md) · [官网证据](SOURCES.md) · [总体计划](../../../data-maintenance/PLAN.md) + +核查日期:2026-10-03。本记录是维护任务清单,不替代单模型字段证明。 + +## 本轮结论 + +X2 官方 HTTP 文档明确 /x2/chat/completions、spark-x、65536 输入、131072 输出和采样默认值。旧 /v1 与 X2 不能混用。 + +新增独立 X2 接入,旧 Provider 保留 Ultra 并 tombstone 错放的 spark-x;修正共享规格和展示名。实际账号调用、动态 thinking 请求转译仍需客户端验收;不声称旧 Ultra 参数已核。 + +## 官方入口读取 + +| 来源 | 本次结果 | 读取说明 | +| --- | --- | --- | +| [xunfei](https://www.xfyun.cn/doc/spark/X1http.html) | 正文已读取 | 121939 字节;摘要与 SOURCES.md 同步 | + +## 完成边界 + +当前单接入面记录:4 条;pending 2、partial 2、historical 0。partial 只证明已列字段。 + +下一步按各 models 文件逐字段核实;有收费账号授权后做聚焦请求、流式、工具和费用验收。官网读取失败、页面壳与平台差异均不得自动提升为已核实。 + +## 本轮最终记录统计 + +本仓记录 4 条:pending 2、partial 2、historical 0;partial 中仅 ID 证明 0 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 + +总窗口未公开:现有 contextWindow=65536 是保守输入预算,不是官网总窗口证明;字段级引用已移除该证明。独立 maxInput 表达需客户端支持后再声明。 diff --git a/docs/model-sources/providers/xunfei/README.md b/docs/model-sources/providers/xunfei/README.md index 48650d4..2ec05f4 100644 --- a/docs/model-sources/providers/xunfei/README.md +++ b/docs/model-sources/providers/xunfei/README.md @@ -1,12 +1,13 @@ # 讯飞星火:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) -本目录包含 2 个单模型文件、2 个单接入面文件。核验日期与状态来自迁移前记录。 +本目录包含 2 个单模型文件、3 个单接入面文件。核验日期与状态来自迁移前记录。 ## 接入面 - [compute/providers/xunfei.json](access/providers--xunfei.md) +- [compute/providers/xunfei-x2.json](access/providers--xunfei-x2.md) - [compute/model-specs/xunfei.json](access/model-specs--xunfei.md) ## 模型 diff --git a/docs/model-sources/providers/xunfei/SOURCES.md b/docs/model-sources/providers/xunfei/SOURCES.md index 090482d..c488450 100644 --- a/docs/model-sources/providers/xunfei/SOURCES.md +++ b/docs/model-sources/providers/xunfei/SOURCES.md @@ -13,6 +13,8 @@ ## 已知边界与核验说明 +X2 的 65536 是最大输入,不是已公开的总窗口;本仓 contextWindow 保留为现有客户端的保守预算,未登记为已核字段。输出上限有明文整数 131072。独立最大输入预算须按客户端/schema 兼容规范另行完成。 + 已登记官方入口并尝试读取。表中仅标为已核字段的部分有此次核对记录;其余存量参数待逐字段复核。 状态 `partial` 仅表示列出的字段已核实;不能推断整条配置、价格、账号权限或真实模型调用都已验收。`pending` 没有已核字段;`historical` 只作历史兼容参考。路由 tier/priority、产品标签和默认选择属于本仓策略,不伪装成官网数据。 diff --git a/docs/model-sources/providers/xunfei/access/providers--xunfei-x2.md b/docs/model-sources/providers/xunfei/access/providers--xunfei-x2.md new file mode 100644 index 0000000..a1d37c3 --- /dev/null +++ b/docs/model-sources/providers/xunfei/access/providers--xunfei-x2.md @@ -0,0 +1,42 @@ +# 讯飞星火:xunfei-x2 接入面 + +[供应商索引](../README.md) · [官网证据](../SOURCES.md) + +- 配置文件:[compute/providers/xunfei-x2.json](../../../../../compute/providers/xunfei-x2.json) +- 核验日期:2026-10-03。 +- 接入类别:`providers`。 + +## 平台配置快照 + +- API 协议:`openai-completions`。 +- 端点:`https://spark-api-open.xf-yun.com/x2`。 +- 计价币种:`CNY`。 +- 访问模式:`普通 API`。 + +官方 HTTP 文档明确 X2 使用 `/x2/chat/completions`,输入 65536、输出上限 131072,通用 Bearer 认证与 OpenAI Chat/SSE 形状。未执行账号调用;不与旧 `/v1` 的 Ultra 模型混用端点。 + +以上是配置快照,不能据此宣布该端点或账号已实际验收。核查地域、套餐支持、凭据来源及协议时,对照官网证据目录并记录结论。 + + + + +## 关联模型 + +- [`spark-x`](../models/spark-x.md) + +## 更新前检查 + +- 核对端点和地域、API 格式、凭据来源、版本要求及套餐实际支持名单。 +- 修改平台字段后复核本文件;修改模型字段后更新对应单模型文件。 +- 未取得官网参数或账号实测证据时,保留 pending / 未实测说明,不以表格快照代替证据。 + + +```json +{ + "formatVersion": 1, + "supplier": "xunfei", + "checkedAt": "2026-10-03", + "sourceCatalog": "../SOURCES.md" +} +``` + diff --git a/docs/model-sources/providers/xunfei/access/providers--xunfei.md b/docs/model-sources/providers/xunfei/access/providers--xunfei.md index 2ea6a68..1333ec4 100644 --- a/docs/model-sources/providers/xunfei/access/providers--xunfei.md +++ b/docs/model-sources/providers/xunfei/access/providers--xunfei.md @@ -16,11 +16,10 @@ 以上是配置快照,不能据此宣布该端点或账号已实际验收。核查地域、套餐支持、凭据来源及协议时,对照官网证据目录并记录结论。 - + ## 关联模型 -- [`spark-x`](../models/spark-x.md) - [`4.0Ultra`](../models/4.0ultra.md) ## 更新前检查 diff --git a/docs/model-sources/providers/xunfei/models/spark-x.md b/docs/model-sources/providers/xunfei/models/spark-x.md index ca11b17..5bee8b2 100644 --- a/docs/model-sources/providers/xunfei/models/spark-x.md +++ b/docs/model-sources/providers/xunfei/models/spark-x.md @@ -3,28 +3,28 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`spark-x`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮复核仅限下表已核字段,其余仍待核实。 ## 适用接入面 -- [compute/providers/xunfei.json](../access/providers--xunfei.md) +- [compute/providers/xunfei-x2.json](../access/providers--xunfei-x2.md) - [compute/model-specs/xunfei.json](../access/model-specs--xunfei.md) ## 字段级来源记录 各接入面分开记录;价格为 inputPrice/outputPrice 快照,具体单位和限制看配置及引用官网。partial 只确认已列字段,不代表全部参数、平台可用性或账号调用已验收。 -### compute/providers/xunfei.json +### compute/providers/xunfei-x2.json -[查看配置](../../../../../compute/providers/xunfei.json) · [接入面说明](../access/providers--xunfei.md) +[查看配置](../../../../../compute/providers/xunfei-x2.json) · [接入面说明](../access/providers--xunfei-x2.md) 当前配置详情(不是全部官网确认值;routing 是本仓策略): - + ```json { "contextWindow": 65536, - "maxOutputTokens": 128000, + "maxOutputTokens": 131072, "serviceType": [ "reasoning" ], @@ -33,19 +33,21 @@ "reasoning", "deep_thinking", "math", - "code" + "code", + "tool_use" ], "defaultTemperature": 1.2, - "defaultTopP": 0.95 + "defaultTopP": 0.95, + "modelName": "spark-x" } ``` - + | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `spark-x` | 65536 / 128000 | CNY:未声明 / 未声明 | `modelName`→[xunfei](../SOURCES.md#xunfei) | [xunfei](../SOURCES.md#xunfei) | partial | `e86e73c51d95392d5a755647f74010d21d4b40ab7928853deecbbd39c27a5432` | +| `spark-x` | 65536 / 131072 | CNY:未声明 / 未声明 | `modelName`→[xunfei](../SOURCES.md#xunfei), `maxOutputTokens`→[xunfei](../SOURCES.md#xunfei), `defaultTemperature`→[xunfei](../SOURCES.md#xunfei), `defaultTopP`→[xunfei](../SOURCES.md#xunfei) | [xunfei](../SOURCES.md#xunfei) | partial | `3915d411151bb2d2a39e4c79ae8ced199358eda45ad3df7de9237ff713012c84` | ### compute/model-specs/xunfei.json @@ -57,7 +59,7 @@ ```json { "spec.contextWindow": 65536, - "spec.maxOutputTokens": 128000, + "spec.maxOutputTokens": 131072, "spec.serviceType": [ "reasoning" ], @@ -66,10 +68,12 @@ "reasoning", "deep_thinking", "math", - "code" + "code", + "tool_use" ], "spec.supportsReasoning": true, - "spec.defaultTemperature": 1.2 + "spec.defaultTemperature": 1.2, + "id": "spark-x" } ``` @@ -78,7 +82,11 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `spark-x` | 65536 / 128000 | 非计价主数据 | `id`→[xunfei](../SOURCES.md#xunfei) | [xunfei](../SOURCES.md#xunfei) | partial | `12a6e5633db6604800f759bf1a6323ccc745fd574af632d937f67b6efb08754a` | +| `spark-x` | 65536 / 131072 | 非计价主数据 | `id`→[xunfei](../SOURCES.md#xunfei), `spec.maxOutputTokens`→[xunfei](../SOURCES.md#xunfei), `spec.defaultTemperature`→[xunfei](../SOURCES.md#xunfei) | [xunfei](../SOURCES.md#xunfei) | partial | `8706b7fa604391f173d6adaa415343ca0b846618c7ecd4e0630dd20bbc957e17` | + +## 输入与总窗口边界 + +官方说明的是输入 65536、输出 131072 两个独立限制,没有声明总上下文窗口。当前 contextWindow=65536 沿用为客户端保守输入预算,不将它登记为已核总窗口;需客户端独立最大输入字段后再正确表达此合同。 ## 下次更新核查 diff --git a/docs/model-sources/providers/zhipu/AUDIT.md b/docs/model-sources/providers/zhipu/AUDIT.md new file mode 100644 index 0000000..74152da --- /dev/null +++ b/docs/model-sources/providers/zhipu/AUDIT.md @@ -0,0 +1,18 @@ +# 智谱:2026-10-03 数据核验与后续计划 + +[官网证据](SOURCES.md) · [供应商模型索引](README.md) + +本轮实际读取国内/国际ChatAPI参考,确认GLM5.2接受七个兼容effort,默认max;none/minimal不思考,low/medium映射high,xhigh映射max。API/国际套餐旧字段迁移extra.reasoning,来源参数合同分开记录。 + +| 待完成 | 验收标准 | +| --- | --- | +| 国际套餐与1m别名权限 | 本轮通用API参考不证明套餐账户能用该alias,需官方套餐列表和授权聚焦调用 | +| GLM5.3/Flash精确窗口 | 官网1M/128K简写尚不足以证明本仓具体整数,取得明文限制后统一 | +| 存量Embedding/多模态接口 | 按独立接口读取向量维度、服务单位、端点和兼容格式;不由Chat参数迁移 | +| 国内价与国际价 | 分币种/地域与峰谷/缓存,不能相互覆盖;逐型号补字段来源 | + +未进行账号调用,不宣称国际套餐已实测。 + +## 本轮最终记录统计 + +本仓记录 31 条:pending 3、partial 28、historical 0;partial 中仅 ID 证明 18 条。此统计反映字段证明覆盖,不是账号调用或整条参数通过数量。 diff --git a/docs/model-sources/providers/zhipu/README.md b/docs/model-sources/providers/zhipu/README.md index 21c3377..9888d95 100644 --- a/docs/model-sources/providers/zhipu/README.md +++ b/docs/model-sources/providers/zhipu/README.md @@ -1,6 +1,6 @@ # 智谱:来源导航 -[总索引](../../README.md) · [官网证据与边界](SOURCES.md) +[总索引](../../README.md) · [官网证据与边界](SOURCES.md) · [数据闭环核查](AUDIT.md) 本目录包含 14 个单模型文件、4 个单接入面文件。核验日期与状态来自迁移前记录。 diff --git a/docs/model-sources/providers/zhipu/SOURCES.md b/docs/model-sources/providers/zhipu/SOURCES.md index 2401972..f26164d 100644 --- a/docs/model-sources/providers/zhipu/SOURCES.md +++ b/docs/model-sources/providers/zhipu/SOURCES.md @@ -23,6 +23,16 @@ - 入口:[glm-plan](https://docs.bigmodel.cn/cn/coding-plan/latest-model.md) - 类型:`official-doc`;当前读取状态:`fetched`;地域/接入面:`中国区 GLM Coding Plan 文档;国际 api.z.ai 可用性另核`。 +### glm52-cn-api + +- 入口:[glm52-cn-api](https://docs.bigmodel.cn/api-reference/%E6%A8%A1%E5%9E%8B-api/%E5%AF%B9%E8%AF%9D%E8%A1%A5%E5%85%A8.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:智谱中国原厂通用 Chat API;GLM5.2 的 effort 参数合同,不能证明国际套餐权限。 + +### glm52-intl-api + +- 入口:[glm52-intl-api](https://docs.z.ai/api-reference/llm/chat-completion.md) +- 类型:`official-doc`;读取状态:`fetched`;适用范围:Z.AI 国际原厂 Chat API 的 GLM5.2 effort 合同;套餐实际账号权限另核。 + ## 已知边界与核验说明 国内官方价格页确认 5.3/Flash/FlashX 为 8/28、0.8/2.8、2/7 元/百万 tokens。官网给出的窗口简写 1M/128K 未直接作为跨接入面字节级精确值证明;本次不改已有换算。低/高/max、默认 max 和始终思考已核对。Coding Plan 提供 5.3 与 Flash,不提供 FlashX;国际套餐端点的账号实际可用性仍需验证。 @@ -75,8 +85,32 @@ "checkedAt": "2026-10-03", "contentSha256": "d5c5eb7ef0ddf5a89128018fffb1d96a7e4a6745c8c16dc53c5c4453e59891fc", "resolvedUrl": "https://docs.bigmodel.cn/cn/coding-plan/latest-model.md" + }, + { + "id": "glm52-cn-api", + "url": "https://docs.bigmodel.cn/api-reference/%E6%A8%A1%E5%9E%8B-api/%E5%AF%B9%E8%AF%9D%E8%A1%A5%E5%85%A8.md", + "kind": "official-doc", + "scope": "智谱中国原厂通用 Chat API;GLM5.2 的 effort 参数合同,不能证明国际套餐权限", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "9844803948f2c1fd80562d9c617b7cb9bc0ddbac66e97db7a3d65279c9753a8a", + "resolvedUrl": "https://docs.bigmodel.cn/api-reference/%E6%A8%A1%E5%9E%8B-api/%E5%AF%B9%E8%AF%9D%E8%A1%A5%E5%85%A8.md" + }, + { + "id": "glm52-intl-api", + "url": "https://docs.z.ai/api-reference/llm/chat-completion.md", + "kind": "official-doc", + "scope": "Z.AI 国际原厂 Chat API 的 GLM5.2 effort 合同;套餐实际账号权限另核", + "retrieval": "fetched", + "checkedAt": "2026-10-03", + "contentSha256": "b05ada5d25382772edafd1b12dd2ead1da430a8817b5b748f2fb8dee2d7a6c10", + "resolvedUrl": "https://docs.z.ai/api-reference/llm/chat-completion.md" } ] } ``` + +## GLM-5.2 推理合同 + +本轮分别读取中国与国际 Chat API 明文参考,双方均明确七个接受值与默认 max;none/minimal 跳过思考,low/medium 映射 high,xhigh 映射 max。已把旧 ignored 字段迁移为 Provider 可读取的 extra.reasoning。国际通用接口参考只能证明参数合同,不能代替 Coding Plan 账号权限或长上下文别名的调用验收。 diff --git a/docs/model-sources/providers/zhipu/models/glm-5.2.md b/docs/model-sources/providers/zhipu/models/glm-5.2.md index 16b35ff..0b45719 100644 --- a/docs/model-sources/providers/zhipu/models/glm-5.2.md +++ b/docs/model-sources/providers/zhipu/models/glm-5.2.md @@ -3,7 +3,7 @@ [供应商索引](../README.md) · [官网证据目录](../SOURCES.md) - 精确模型 ID:`glm-5.2`。 -- 核验日期:2026-10-03;本次只迁移记录,没有重新核验或提高状态。 +- 核验日期:2026-10-03;本轮增量核验下列字段;未列字段及其他接入面的状态保持独立。 ## 适用接入面 @@ -45,7 +45,19 @@ "defaultTopP": 0.95, "inputPrice": 8, "outputPrice": 28, - "extra.cacheHitPrice": 2 + "extra.cacheHitPrice": 2, + "extra.reasoning": { + "supportedEfforts": [ + "max", + "xhigh", + "high", + "medium", + "low", + "minimal", + "none" + ], + "defaultEffort": "max" + } } ``` @@ -54,7 +66,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `glm-5.2` | 1000000 / 131072 | CNY:8 / 28 | `modelName`→[glm53](../SOURCES.md#glm53) | [glm53](../SOURCES.md#glm53) | partial | `0b8a1fd762b821b3c9a26e0cc9a7dcbd7bfef8e3899999782b17e262a99fb6ca` | +| `glm-5.2` | 1000000 / 131072 | CNY:8 / 28 | `extra.reasoning.supportedEfforts`→[glm52-cn-api](../SOURCES.md#glm52-cn-api);`extra.reasoning.defaultEffort`→[glm52-cn-api](../SOURCES.md#glm52-cn-api) | [glm52-cn-api](../SOURCES.md#glm52-cn-api) | partial | `df3a00f4ea03862ccff3599a8011e40243b3ffb1aff74884b71d672e8b057c0a` | ### compute/coding-plans/zhipu-coding.json @@ -81,7 +93,19 @@ "agent", "math", "multilingual" - ] + ], + "extra.reasoning": { + "supportedEfforts": [ + "max", + "xhigh", + "high", + "medium", + "low", + "minimal", + "none" + ], + "defaultEffort": "max" + } } ``` @@ -90,7 +114,7 @@ | 模型 ID | 上下文 / 输出 | 计价 | 已核字段→来源 | 来源入口 | 状态 | 数据指纹 | | --- | --- | --- | --- | --- | --- | --- | -| `glm-5.2` | 1000000 / 131072 | 套餐:未声明 / 未声明 | `modelName`→[glm53](../SOURCES.md#glm53) | [glm53](../SOURCES.md#glm53) | partial | `e47c693d232b87b074df1aef74935bab47099d5397abfec032c003ac3b230a82` | +| `glm-5.2` | 1000000 / 131072 | 套餐:未声明 / 未声明 | `extra.reasoning.supportedEfforts`→[glm52-intl-api](../SOURCES.md#glm52-intl-api);`extra.reasoning.defaultEffort`→[glm52-intl-api](../SOURCES.md#glm52-intl-api) | [glm52-intl-api](../SOURCES.md#glm52-intl-api) | partial | `bae8a97306a4ccbf5961c877d671cccd391e0bdba93c64f20dd4fb7c73696239` | ### compute/model-specs/zhipu.json @@ -140,6 +164,10 @@ | --- | --- | --- | --- | --- | --- | --- | | `glm-5.2` | 1048576 / 32768 | 非计价主数据 | `id`→[glm53](../SOURCES.md#glm53) | [glm53](../SOURCES.md#glm53) | partial | `0ec480a9cc2984161ac129d087c28b3c9a561d55b7b595c16d9b0ffb4a5cadf5` | +官方明确默认 max:none/minimal 跳过思考,low/medium 映射 high,xhigh 映射 max。仅迁移客户端不读取的旧字段到已支持的 extra.reasoning。 + +国际官方 API 与国内明确同一 GLM5.2 effort 映射;登记参数合同依据,套餐真实账号权限及 1m 路由仍待聚焦调用。 + ## 下次更新核查 - 对照官网核查精确 ID/别名、是否仍列出、上下文/输入/输出限制及单位。 diff --git a/docs/runtime-sources/README.md b/docs/runtime-sources/README.md new file mode 100644 index 0000000..7a1ace0 --- /dev/null +++ b/docs/runtime-sources/README.md @@ -0,0 +1,23 @@ +# 运行时数据来源 + +这里记录运行时官方目录、推荐归档校验和客户端安装契约。数据文件仍在 `runtimes/`;模型来源另见 [模型来源目录](../model-sources/README.md)。 + +| 范围 | 来源及边界 | +| --- | --- | +| 推荐 Node | [版本、六平台官方校验和](node-recommended.md) | +| 推荐 Python | [Standalone 六平台官方资产摘要](python-recommended.md) | +| Node 离线列表 | [官方目录快照](node-snapshot.md) | +| Python 离线列表 | [内置 Hatch 精确版本映射](python-fallback.md) | +| npm | [官方发布快照](package-managers/npm-snapshot.md) | +| pnpm | [官方发布快照](package-managers/pnpm-snapshot.md) | +| Yarn | [官方 CLI 发布快照](package-managers/yarn-snapshot.md) | + +## 更新流程 + +1. 先核查 DesireCore 最新远端 `origin/main` 的 `runtime-manager.ts`、静态打包脚本、运行时 schema 及客户端版本门槛。Python 离线列表来自**内置 Hatch 的 pin 表**,不能拿 Standalone 最新版本替代。 +2. `node scripts/update-runtime-catalog.mjs` 只读取固定官网/API、验证推荐归档摘要并显示候选数量;`--write` 才更新 Node/包管理器离线列表及对应细分快照记录。任何来源读取失败、结构错误、推荐发布日期缺失/晚于核验时间或推荐摘要不一致都中止写入。 +3. 更新推荐运行时时,先同步客户端安装器/打包器契约,再逐平台核对官方档名及摘要。当前脚本不会自动修改推荐版本、Python 离线映射或客户端门槛,也不会推算未知 SHA-256。 +4. Node 每个大版本最多三条(从 16 开始),包括历史版本;包管理器读取各仓最近 100 个 releases,再筛选最多 30 个正式 CLI 版本。目录可安装性和操作系统支持仍需按目标平台测试,不能把目录存在视为安装验收。 +5. 执行 `node scripts/validate-runtime-sources.mjs`、`npm run validate`、`npm test`、`git diff --check`。离线门禁检查 Node/包管理器快照条目指纹、日期、数量、首版、固定官方入口,以及 Python pin 表、推荐版本/LTS/tag、六平台档名与摘要表。它只证明本仓数据与来源记录一致;不能替代 updater 重新读取官网,也不证明安装成功。更新推荐参数时重新记录本文档的官方证据和读取日期。历史快照由 Git 保留。 + +`generatedAt` 表示本轮完整读取目录的时间,不表示推荐策略被重新选择。Python pin 因客户端安装契约保持不变,见单独来源记录;不为了让版本号“看起来同步”而改动该映射。 diff --git a/docs/runtime-sources/node-recommended.md b/docs/runtime-sources/node-recommended.md new file mode 100644 index 0000000..f5f45b0 --- /dev/null +++ b/docs/runtime-sources/node-recommended.md @@ -0,0 +1,17 @@ +# 推荐 node 官方归档核验 + +- 实际读取:2026-10-03(UTC)。 +- 数据:`runtimes/recommended.json#node`,版本 `24.21.0`。 +- 官方来源:[官方摘要清单](https://nodejs.org/dist/v24.21.0/SHASUMS256.txt)。 +- 官方目录:[Node dist index](https://nodejs.org/dist/index.json) 记录 v24.21.0 于 2026-09-07 发布,LTS 名 Krypton;本轮与推荐值完全一致。 + +| 平台 | 精确归档路径 | 官方 SHA-256(与本仓一致) | +| --- | --- | --- | +| darwin-arm64 | `v24.21.0/node-v24.21.0-darwin-arm64.tar.gz` | `bed7eea5325e1108f32ce5228ddd6a5f0f08a499ee42aa7442aea583702f6057` | +| darwin-x64 | `v24.21.0/node-v24.21.0-darwin-x64.tar.gz` | `1462cb3b3046b815cf8ea436d3da450ec1a9f11dac7e5a46b0ada5305d7e8097` | +| win32-x64 | `v24.21.0/node-v24.21.0-win-x64.zip` | `158f7685b44de51f6c0df1d153526cbcd3e1bc739a8dfc607721cef75de9e541` | +| win32-arm64 | `v24.21.0/node-v24.21.0-win-arm64.zip` | `8779b1bde1d39f8d420e3b57aa657b39891af434d3de44a919044cec06785921` | +| linux-x64 | `v24.21.0/node-v24.21.0-linux-x64.tar.gz` | `6e1db87ef58b8819e5d5402eff1536491b18edd8eb7bee5ef7897876e88dc5ff` | +| linux-arm64 | `v24.21.0/node-v24.21.0-linux-arm64.tar.gz` | `724282c3b43aec998aa9527380465b45d229e021b58035f5f4f63095eabfe5d5` | + +本轮仅核对官方发布目录/摘要,没有下载六个平台的整个归档,也没有在六个平台运行安装;不将此核验声明为下载字节复算、解压或客户端验收。推荐版本与 `minClientVersion` 保留原值。 diff --git a/docs/runtime-sources/node-snapshot.md b/docs/runtime-sources/node-snapshot.md new file mode 100644 index 0000000..0e6f7df --- /dev/null +++ b/docs/runtime-sources/node-snapshot.md @@ -0,0 +1,11 @@ +# node 离线目录快照 + +- 实际读取:2026-10-03T10:24:20.059Z +- 官方来源:[官方目录](https://nodejs.org/dist/index.json) +- 数据位置:`runtimes/versions-fallback.json#node` +- 目录条数:33 +- 首条版本:v26.10.0 +- 本仓条目指纹(JSON.stringify、SHA-256):`d32502b95539459aec2d389de79f72fc1f4eee0645db5a411dab44c2ab716ff8` +- 本轮读取的官方正文 SHA-256:`700401a06eb352ec19100649afbf767f76db33f194b22a9b903b3ff48e3bc482` + +筛选规则:Node 16 及以上,每个大版本最多三条正式发布;保留上游顺序。不表示所有大版本仍受支持。 diff --git a/docs/runtime-sources/package-managers/npm-snapshot.md b/docs/runtime-sources/package-managers/npm-snapshot.md new file mode 100644 index 0000000..9eb8ad7 --- /dev/null +++ b/docs/runtime-sources/package-managers/npm-snapshot.md @@ -0,0 +1,11 @@ +# npm 离线目录快照 + +- 实际读取:2026-10-03T10:24:20.059Z +- 官方来源:[官方目录](https://api.github.com/repos/npm/cli/releases?per_page=100) +- 数据位置:`runtimes/versions-fallback.json#pkgManagers.npm` +- 目录条数:13 +- 首条版本:v12.2.0 +- 本仓条目指纹(JSON.stringify、SHA-256):`27056f323070f8656d383f78af6cb087214fec8a64f6219577c1c4ed5732de87` +- 本轮读取的官方正文 SHA-256:`962e64b30f02983acbd621d3dedb48ee9aa7826e441c9d928efcb9f494ba077a` + +筛选规则:读取官方仓库最近 100 个 releases,排除 draft、prerelease、非正式版本标签及未来发布日期,最多 30 条;Yarn 只接受 @yarnpkg/cli 正式标签。created_at 字段保持客户端结构,值取 published_at。目录不代表当前平台安装测试已通过。 diff --git a/docs/runtime-sources/package-managers/pnpm-snapshot.md b/docs/runtime-sources/package-managers/pnpm-snapshot.md new file mode 100644 index 0000000..20b955e --- /dev/null +++ b/docs/runtime-sources/package-managers/pnpm-snapshot.md @@ -0,0 +1,11 @@ +# pnpm 离线目录快照 + +- 实际读取:2026-10-03T10:24:20.059Z +- 官方来源:[官方目录](https://api.github.com/repos/pnpm/pnpm/releases?per_page=100) +- 数据位置:`runtimes/versions-fallback.json#pkgManagers.pnpm` +- 目录条数:30 +- 首条版本:v12.9.0 +- 本仓条目指纹(JSON.stringify、SHA-256):`96af5818605de45cf9c929e30d51c74c012ac978dac7e77a305c3f636829909a` +- 本轮读取的官方正文 SHA-256:`35dac278b3f9725d02522fb3389a01bd5f5d25c9a6b2c3bc2c3bd9d322891b73` + +筛选规则:读取官方仓库最近 100 个 releases,排除 draft、prerelease、非正式版本标签及未来发布日期,最多 30 条;Yarn 只接受 @yarnpkg/cli 正式标签。created_at 字段保持客户端结构,值取 published_at。目录不代表当前平台安装测试已通过。 diff --git a/docs/runtime-sources/package-managers/yarn-snapshot.md b/docs/runtime-sources/package-managers/yarn-snapshot.md new file mode 100644 index 0000000..4c1143d --- /dev/null +++ b/docs/runtime-sources/package-managers/yarn-snapshot.md @@ -0,0 +1,11 @@ +# yarn 离线目录快照 + +- 实际读取:2026-10-03T10:24:20.059Z +- 官方来源:[官方目录](https://api.github.com/repos/yarnpkg/berry/releases?per_page=100) +- 数据位置:`runtimes/versions-fallback.json#pkgManagers.yarn` +- 目录条数:30 +- 首条版本:v4.18.1 +- 本仓条目指纹(JSON.stringify、SHA-256):`e8e15f9f1eb9d5eedd89fe7dc56b0b3ea0a187debabfafaeaded50bec837cd27` +- 本轮读取的官方正文 SHA-256:`2df4d47de5ac9080ab062a5f3c2f62cad5de3f4f2abd4d72b696a4fbe622570a` + +筛选规则:读取官方仓库最近 100 个 releases,排除 draft、prerelease、非正式版本标签及未来发布日期,最多 30 条;Yarn 只接受 @yarnpkg/cli 正式标签。created_at 字段保持客户端结构,值取 published_at。目录不代表当前平台安装测试已通过。 diff --git a/docs/runtime-sources/python-fallback.md b/docs/runtime-sources/python-fallback.md new file mode 100644 index 0000000..4fa3e3f --- /dev/null +++ b/docs/runtime-sources/python-fallback.md @@ -0,0 +1,25 @@ +# Python 离线版本列表 + +- 核查日期:2026-10-03(UTC)。 +- 数据:`runtimes/versions-fallback.json#python`,12 条映射,本轮保留原值。 +- 官方来源:[Hatch 1.16.5 distribution 表](https://github.com/pypa/hatch/blob/b998d2b755bc0dca20054f96da8981532444fc2a/src/hatch/python/distributions.py)。`hatch-v1.16.5` 官方 tag 指向该 commit;本轮实际读取 raw 正文,全部 12 条版本均在该表中。 +- 客户端依据:[DesireCore runtime-manager.ts](https://github.com/desirecore/desirecore/blob/412e05b043656d1f3ba2b56307ef5ceabbf8a77a/packages/agent-service/src/session/runtime-manager.ts) 与 [静态打包脚本](https://github.com/desirecore/desirecore/blob/412e05b043656d1f3ba2b56307ef5ceabbf8a77a/scripts/prepare-static.ts)。本轮 fetch 后 `origin/main` SHA 为 `412e05b043656d1f3ba2b56307ef5ceabbf8a77a`,两处 `HATCH_VERSION = '1.16.5'`。 + +`listAvailablePythonVersions` 使用 `hatch python show`,该命令读取内置映射,不向 Python 官网实时查询;二进制缺失或命令失败时才返回本文件。`name` 是安装实参,`version` 是该 Hatch 版本对该 name 的发行版映射。 + +因此 `3.14 → 3.14.0` 与推荐归档 `3.14.8` 不同,**并不能单凭最新 Standalone 目录将 fallback 改成 3.14.8**。安装器升级或可靠自定义源策略完成前,必须保留真实 pin 语义。待完成:确认推荐 3.14.8 的首启导入、后续 Hatch 安装/更新幂等判断及受门控客户端版本是否已支持;本轮不将官方归档存在等同于客户端安装验收。 + +| 名称 | 内置 pin | +| --- | --- | +| 3.7 | 3.7.9 | +| 3.8 | 3.8.20 | +| 3.9 | 3.9.24 | +| 3.10 | 3.10.19 | +| 3.11 | 3.11.14 | +| 3.12 | 3.12.12 | +| 3.13 | 3.13.9 | +| 3.14 | 3.14.0 | +| pypy2.7 | 7.3.20 | +| pypy3.9 | 7.3.16 | +| pypy3.10 | 7.3.19 | +| pypy3.11 | 7.3.20 | diff --git a/docs/runtime-sources/python-recommended.md b/docs/runtime-sources/python-recommended.md new file mode 100644 index 0000000..dea1ded --- /dev/null +++ b/docs/runtime-sources/python-recommended.md @@ -0,0 +1,19 @@ +# 推荐 python 官方归档核验 + +- 实际读取:2026-10-03(UTC)。 +- 数据:`runtimes/recommended.json#python`,版本 `3.14.8`。 +- 官方来源:[官方摘要清单](https://api.github.com/repos/astral-sh/python-build-standalone/releases/tags/20261001)。 +- 官方 release:tag `20261001`,published_at `2026-10-01T22:37:31Z`;非 draft/prerelease。逐平台精确资产名称、uploaded 状态和 API `digest` 均与推荐值一致。 + +| 平台 | 精确归档路径 | 官方 SHA-256(与本仓一致) | +| --- | --- | --- | +| darwin-arm64 | `20261001/cpython-3.14.8+20261001-aarch64-apple-darwin-install_only_stripped.tar.gz` | `69e48cd7f54261df5b6abbd374f69fe6e496fa781d271592aeef49cd5ffbea6c` | +| darwin-x64 | `20261001/cpython-3.14.8+20261001-x86_64-apple-darwin-install_only_stripped.tar.gz` | `d613a1cb9e31dd512298c73fd300975e689938cc39d1486250cf47918963061c` | +| win32-x64 | `20261001/cpython-3.14.8+20261001-x86_64-pc-windows-msvc-install_only_stripped.tar.gz` | `b7ff8b700995379e425b39abce9b087d84a45aa265ea465c0069c2747ea5b2ea` | +| win32-arm64 | `20261001/cpython-3.14.8+20261001-aarch64-pc-windows-msvc-install_only_stripped.tar.gz` | `607b19be2bfcdbd0ba51dd4d225a6eeaa9b0c32c85d5b0521ced135033af5ecf` | +| linux-x64 | `20261001/cpython-3.14.8+20261001-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz` | `b373a4a4e4e70fc05f368c9b53d7738bf37637682b650d96c742805d2da26c32` | +| linux-arm64 | `20261001/cpython-3.14.8+20261001-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz` | `4395ae16388f9d3409cba7e20161753ed3359b13d959345415029f874f675162` | + +本轮仅核对官方发布目录/摘要,没有下载六个平台的整个归档,也没有在六个平台运行安装;不将此核验声明为下载字节复算、解压或客户端验收。推荐版本与 `minClientVersion` 保留原值。 + +安装契约尚需闭环:当前核查的 DesireCore 远端 main 仍内置 Hatch 1.16.5,其 3.14 pin 是 3.14.0。推荐归档虽有真实官网依据,但不能据此证明旧安装器后续更新判断兼容;详见 [Python fallback 来源](python-fallback.md)。在客户端升级/定制源策略与实测前,不提高核验状态为账号或安装实测通过。 diff --git a/manifest.json b/manifest.json index e0e9ea0..25d2ec2 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "presetDataVersion": 125, + "presetDataVersion": 126, "updatedAt": "2026-10-03", "description": "DesireCore 官方配置中心" } diff --git a/package.json b/package.json index de63b0f..4bca374 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,13 @@ "node": ">=20" }, "scripts": { - "validate": "node scripts/validate.mjs && node scripts/validate-sources.mjs", + "validate": "node scripts/validate.mjs && node scripts/validate-sources.mjs && node scripts/validate-data-sources.mjs && node scripts/validate-runtime-sources.mjs", "test": "node --test __tests__/*.test.mjs", - "validate:sources": "node scripts/validate-sources.mjs" + "validate:sources": "node scripts/validate-sources.mjs", + "validate:data-sources": "node scripts/validate-data-sources.mjs", + "runtimes:check": "node scripts/update-runtime-catalog.mjs", + "runtimes:update": "node scripts/update-runtime-catalog.mjs --write", + "validate:runtimes": "node scripts/validate-runtime-sources.mjs" }, "dependencies": { "ajv": "^8.17.1", diff --git a/runtimes/versions-fallback.json b/runtimes/versions-fallback.json index fb0b575..4cdfdc0 100644 --- a/runtimes/versions-fallback.json +++ b/runtimes/versions-fallback.json @@ -1,9 +1,9 @@ { - "generatedAt": "2026-07-07T07:53:33.780Z", + "generatedAt": "2026-10-03T10:24:20.059Z", "node": [ { - "version": "v26.4.0", - "date": "2026-06-24", + "version": "v26.10.0", + "date": "2026-09-21", "files": [ "aix-ppc64", "headers", @@ -11,6 +11,7 @@ "linux-ppc64le", "linux-s390x", "linux-x64", + "linux-x64-musl", "osx-arm64-tar", "osx-x64-pkg", "osx-x64-tar", @@ -22,18 +23,18 @@ "win-x64-msi", "win-x64-zip" ], - "npm": "11.17.0", + "npm": "11.19.1", "v8": "14.6.202.34", "uv": "1.52.1", "zlib": "1.3.2.1-motley", - "openssl": "3.5.7", + "openssl": "3.5.8", "modules": "147", "lts": false, "security": false }, { - "version": "v26.3.1", - "date": "2026-06-17", + "version": "v26.9.0", + "date": "2026-09-16", "files": [ "aix-ppc64", "headers", @@ -41,6 +42,7 @@ "linux-ppc64le", "linux-s390x", "linux-x64", + "linux-x64-musl", "osx-arm64-tar", "osx-x64-pkg", "osx-x64-tar", @@ -52,18 +54,18 @@ "win-x64-msi", "win-x64-zip" ], - "npm": "11.16.0", + "npm": "11.19.1", "v8": "14.6.202.34", "uv": "1.52.1", - "zlib": "1.3.1", - "openssl": "3.5.7", + "zlib": "1.3.2.1-motley", + "openssl": "3.5.8", "modules": "147", "lts": false, - "security": true + "security": false }, { - "version": "v26.3.0", - "date": "2026-06-01", + "version": "v26.8.2", + "date": "2026-09-09", "files": [ "aix-ppc64", "headers", @@ -71,6 +73,7 @@ "linux-ppc64le", "linux-s390x", "linux-x64", + "linux-x64-musl", "osx-arm64-tar", "osx-x64-pkg", "osx-x64-tar", @@ -82,11 +85,11 @@ "win-x64-msi", "win-x64-zip" ], - "npm": "11.16.0", + "npm": "11.19.1", "v8": "14.6.202.34", "uv": "1.52.1", - "zlib": "1.3.1", - "openssl": "3.5.6", + "zlib": "1.3.2.1-motley", + "openssl": "3.5.8", "modules": "147", "lts": false, "security": false @@ -182,8 +185,8 @@ "security": false }, { - "version": "v24.18.0", - "date": "2026-06-23", + "version": "v24.21.0", + "date": "2026-09-07", "files": [ "aix-ppc64", "headers", @@ -191,6 +194,7 @@ "linux-ppc64le", "linux-s390x", "linux-x64", + "linux-x64-musl", "osx-arm64-tar", "osx-x64-pkg", "osx-x64-tar", @@ -202,18 +206,49 @@ "win-x64-msi", "win-x64-zip" ], - "npm": "11.16.0", + "npm": "11.19.0", "v8": "13.6.233.17", "uv": "1.52.1", - "zlib": "1.3.1", + "zlib": "1.3.2.1-motley", + "openssl": "3.5.8", + "modules": "137", + "lts": "Krypton", + "security": false + }, + { + "version": "v24.20.0", + "date": "2026-08-26", + "files": [ + "aix-ppc64", + "headers", + "linux-arm64", + "linux-ppc64le", + "linux-s390x", + "linux-x64", + "linux-x64-musl", + "osx-arm64-tar", + "osx-x64-pkg", + "osx-x64-tar", + "src", + "win-arm64-7z", + "win-arm64-zip", + "win-x64-7z", + "win-x64-exe", + "win-x64-msi", + "win-x64-zip" + ], + "npm": "11.19.0", + "v8": "13.6.233.17", + "uv": "1.52.1", + "zlib": "1.3.2.1-motley", "openssl": "3.5.7", "modules": "137", "lts": "Krypton", "security": false }, { - "version": "v24.17.0", - "date": "2026-06-17", + "version": "v24.19.0", + "date": "2026-08-03", "files": [ "aix-ppc64", "headers", @@ -232,43 +267,13 @@ "win-x64-msi", "win-x64-zip" ], - "npm": "11.13.0", + "npm": "11.17.0", "v8": "13.6.233.17", "uv": "1.52.1", - "zlib": "1.3.1", + "zlib": "1.3.2.1-motley", "openssl": "3.5.7", "modules": "137", "lts": "Krypton", - "security": true - }, - { - "version": "v24.16.0", - "date": "2026-05-21", - "files": [ - "aix-ppc64", - "headers", - "linux-arm64", - "linux-ppc64le", - "linux-s390x", - "linux-x64", - "osx-arm64-tar", - "osx-x64-pkg", - "osx-x64-tar", - "src", - "win-arm64-7z", - "win-arm64-zip", - "win-x64-7z", - "win-x64-exe", - "win-x64-msi", - "win-x64-zip" - ], - "npm": "11.13.0", - "v8": "13.6.233.17", - "uv": "1.52.1", - "zlib": "1.3.1", - "openssl": "3.5.6", - "modules": "137", - "lts": "Krypton", "security": false }, { @@ -365,8 +370,8 @@ "security": false }, { - "version": "v22.23.1", - "date": "2026-06-22", + "version": "v22.23.3", + "date": "2026-09-23", "files": [ "aix-ppc64", "headers", @@ -375,6 +380,7 @@ "linux-ppc64le", "linux-s390x", "linux-x64", + "linux-x64-musl", "osx-arm64-tar", "osx-x64-pkg", "osx-x64-tar", @@ -390,18 +396,18 @@ "win-x86-msi", "win-x86-zip" ], - "npm": "10.9.8", + "npm": "10.9.9", "v8": "12.4.254.21", "uv": "1.51.0", "zlib": "1.3.1", - "openssl": "3.5.7", + "openssl": "3.5.8", "modules": "127", "lts": "Jod", "security": false }, { - "version": "v22.23.0", - "date": "2026-06-17", + "version": "v22.23.2", + "date": "2026-07-28", "files": [ "aix-ppc64", "headers", @@ -435,8 +441,8 @@ "security": true }, { - "version": "v22.22.3", - "date": "2026-05-13", + "version": "v22.23.1", + "date": "2026-06-22", "files": [ "aix-ppc64", "headers", @@ -464,7 +470,7 @@ "v8": "12.4.254.21", "uv": "1.51.0", "zlib": "1.3.1", - "openssl": "3.5.6", + "openssl": "3.5.7", "modules": "127", "lts": "Jod", "security": false @@ -1130,413 +1136,301 @@ ], "pkgManagers": { "npm": [ + { + "tag_name": "v12.2.0", + "created_at": "2026-09-30T16:47:29Z" + }, + { + "tag_name": "v12.1.0", + "created_at": "2026-09-22T20:21:08Z" + }, + { + "tag_name": "v11.20.0", + "created_at": "2026-09-22T21:34:44Z" + }, + { + "tag_name": "v11.19.1", + "created_at": "2026-08-26T21:48:47Z" + }, + { + "tag_name": "v12.0.2", + "created_at": "2026-07-29T21:11:46Z" + }, + { + "tag_name": "v11.19.0", + "created_at": "2026-07-29T20:57:30Z" + }, + { + "tag_name": "v10.9.9", + "created_at": "2026-07-29T18:02:54Z" + }, + { + "tag_name": "v12.0.1", + "created_at": "2026-07-10T17:18:50Z" + }, + { + "tag_name": "v12.0.0", + "created_at": "2026-07-08T21:21:30Z" + }, { "tag_name": "v11.18.0", - "created_at": "2026-06-29T16:43:36Z" + "created_at": "2026-06-29T16:48:15Z" }, { "tag_name": "v11.17.0", - "created_at": "2026-06-11T18:44:17Z" + "created_at": "2026-06-11T18:48:56Z" }, { "tag_name": "v11.16.0", - "created_at": "2026-05-27T20:46:57Z" + "created_at": "2026-05-27T20:52:19Z" }, { "tag_name": "v11.15.0", - "created_at": "2026-05-20T20:38:33Z" - }, - { - "tag_name": "v11.14.1", - "created_at": "2026-05-08T17:52:30Z" - }, - { - "tag_name": "v11.14.0", - "created_at": "2026-05-06T19:11:31Z" - }, - { - "tag_name": "v11.13.0", - "created_at": "2026-04-22T20:45:16Z" - }, - { - "tag_name": "v10.9.8", - "created_at": "2026-03-27T16:05:42Z" - }, - { - "tag_name": "v11.12.1", - "created_at": "2026-03-26T18:45:12Z" - }, - { - "tag_name": "v11.12.0", - "created_at": "2026-03-18T21:22:09Z" - }, - { - "tag_name": "v10.9.7", - "created_at": "2026-03-18T21:51:11Z" - }, - { - "tag_name": "v11.11.1", - "created_at": "2026-03-11T19:30:21Z" - }, - { - "tag_name": "v10.9.6", - "created_at": "2026-03-11T19:17:28Z" - }, - { - "tag_name": "v10.9.5", - "created_at": "2026-03-04T22:49:06Z" - }, - { - "tag_name": "v11.11.0", - "created_at": "2026-02-25T22:56:46Z" - }, - { - "tag_name": "v11.10.1", - "created_at": "2026-02-19T22:03:28Z" - }, - { - "tag_name": "v11.10.0", - "created_at": "2026-02-11T21:06:25Z" - }, - { - "tag_name": "v11.9.0", - "created_at": "2026-02-04T18:28:00Z" - }, - { - "tag_name": "v11.8.0", - "created_at": "2026-01-21T23:16:19Z" - }, - { - "tag_name": "v11.7.0", - "created_at": "2025-12-09T19:48:29Z" - }, - { - "tag_name": "v11.6.4", - "created_at": "2025-11-25T20:33:39Z" - }, - { - "tag_name": "v11.6.3", - "created_at": "2025-11-19T20:54:12Z" - }, - { - "tag_name": "v11.6.2", - "created_at": "2025-10-08T20:10:36Z" - }, - { - "tag_name": "v10.9.4", - "created_at": "2025-09-30T18:55:47Z" - }, - { - "tag_name": "v11.6.1", - "created_at": "2025-09-24T19:01:54Z" - }, - { - "tag_name": "v11.6.0", - "created_at": "2025-09-03T19:48:47Z" - }, - { - "tag_name": "v11.5.2", - "created_at": "2025-07-30T20:13:32Z" - }, - { - "tag_name": "v11.5.1", - "created_at": "2025-07-24T18:33:05Z" - }, - { - "tag_name": "v11.5.0", - "created_at": "2025-07-24T16:54:25Z" - }, - { - "tag_name": "v10.9.3", - "created_at": "2025-06-25T20:25:03Z" - }, - { - "tag_name": "v11.4.2", - "created_at": "2025-06-12T15:08:06Z" - }, - { - "tag_name": "v11.4.1", - "created_at": "2025-05-21T22:26:47Z" - }, - { - "tag_name": "v11.4.0", - "created_at": "2025-05-15T17:05:31Z" - }, - { - "tag_name": "v11.3.0", - "created_at": "2025-04-08T18:20:16Z" - }, - { - "tag_name": "v11.2.0", - "created_at": "2025-03-05T20:39:31Z" - }, - { - "tag_name": "v11.1.0", - "created_at": "2025-01-29T21:19:57Z" - }, - { - "tag_name": "v11.0.0", - "created_at": "2024-12-16T17:31:46Z" - }, - { - "tag_name": "v10.9.2", - "created_at": "2024-12-04T23:34:22Z" - }, - { - "tag_name": "v10.9.1", - "created_at": "2024-11-21T21:52:40Z" - }, - { - "tag_name": "v9.9.4", - "created_at": "2024-11-21T21:59:57Z" - }, - { - "tag_name": "v10.9.0", - "created_at": "2024-10-03T17:56:36Z" + "created_at": "2026-05-20T20:41:46Z" } ], "pnpm": [ { - "tag_name": "v11.10.0", - "created_at": "2026-07-04T19:42:48Z" + "tag_name": "v12.9.0", + "created_at": "2026-10-02T22:28:05Z" }, { - "tag_name": "v11.9.0", - "created_at": "2026-06-23T15:29:10Z" + "tag_name": "v12.8.2", + "created_at": "2026-09-30T01:08:47Z" }, { - "tag_name": "v11.8.0", - "created_at": "2026-06-18T10:18:21Z" + "tag_name": "v11.28.3", + "created_at": "2026-09-30T15:28:07Z" }, { - "tag_name": "v10.34.4", - "created_at": "2026-06-18T22:16:23Z" + "tag_name": "v12.8.1", + "created_at": "2026-09-28T17:40:12Z" }, { - "tag_name": "v11.7.0", - "created_at": "2026-06-15T06:37:39Z" + "tag_name": "v12.8.0", + "created_at": "2026-09-28T07:35:50Z" }, { - "tag_name": "v11.6.0", - "created_at": "2026-06-11T22:54:17Z" + "tag_name": "v11.28.2", + "created_at": "2026-09-28T17:40:47Z" }, { - "tag_name": "v10.34.3", - "created_at": "2026-06-11T16:45:46Z" + "tag_name": "v11.28.1", + "created_at": "2026-09-28T07:31:11Z" }, { - "tag_name": "v11.5.3", - "created_at": "2026-06-10T10:45:18Z" + "tag_name": "v10.34.6", + "created_at": "2026-09-29T15:44:40Z" }, { - "tag_name": "v10.34.2", - "created_at": "2026-06-10T13:41:05Z" + "tag_name": "v12.7.0", + "created_at": "2026-09-25T10:39:37Z" }, { - "tag_name": "v11.5.2", - "created_at": "2026-06-05T06:28:03Z" + "tag_name": "v11.28.0", + "created_at": "2026-09-25T10:39:54Z" }, { - "tag_name": "v11.5.1", - "created_at": "2026-06-02T08:33:05Z" + "tag_name": "v12.6.0", + "created_at": "2026-09-22T17:08:42Z" }, { - "tag_name": "v11.5.0", - "created_at": "2026-05-29T15:26:35Z" + "tag_name": "v11.27.1", + "created_at": "2026-09-20T21:38:41Z" }, { - "tag_name": "v11.4.0", - "created_at": "2026-05-27T13:15:22Z" + "tag_name": "v12.5.1", + "created_at": "2026-09-18T21:48:32Z" }, { - "tag_name": "v10.34.1", - "created_at": "2026-05-27T22:51:41Z" + "tag_name": "v12.5.0", + "created_at": "2026-09-18T17:02:57Z" }, { - "tag_name": "v10.34.0", - "created_at": "2026-05-27T14:54:06Z" + "tag_name": "v12.4.2", + "created_at": "2026-09-15T10:49:15Z" }, { - "tag_name": "v11.3.0", - "created_at": "2026-05-24T08:36:25Z" + "tag_name": "v11.27.0", + "created_at": "2026-09-12T21:22:42Z" }, { - "tag_name": "v11.2.2", - "created_at": "2026-05-21T13:45:37Z" + "tag_name": "v12.4.1", + "created_at": "2026-09-10T17:00:15Z" }, { - "tag_name": "v11.2.1", - "created_at": "2026-05-20T14:51:29Z" + "tag_name": "v12.4.0", + "created_at": "2026-09-08T11:27:26Z" }, { - "tag_name": "v11.2.0", - "created_at": "2026-05-20T10:41:33Z" + "tag_name": "v11.26.0", + "created_at": "2026-09-06T23:50:11Z" }, { - "tag_name": "v11.1.3", - "created_at": "2026-05-18T13:42:54Z" + "tag_name": "v12.3.4", + "created_at": "2026-09-04T14:23:18Z" }, { - "tag_name": "v11.1.2", - "created_at": "2026-05-14T11:32:06Z" + "tag_name": "v12.3.3", + "created_at": "2026-09-04T14:23:32Z" }, { - "tag_name": "v11.1.1", - "created_at": "2026-05-12T10:56:43Z" + "tag_name": "v12.3.2", + "created_at": "2026-09-04T02:07:17Z" }, { - "tag_name": "v11.1.0", - "created_at": "2026-05-11T17:56:23Z" + "tag_name": "v12.3.1", + "created_at": "2026-09-03T00:40:37Z" }, { - "tag_name": "v11.0.9", - "created_at": "2026-05-08T23:53:49Z" + "tag_name": "v12.3.0", + "created_at": "2026-09-02T16:28:57Z" }, { - "tag_name": "v11.0.8", - "created_at": "2026-05-07T06:23:33Z" + "tag_name": "v12.2.1", + "created_at": "2026-09-01T00:57:45Z" }, { - "tag_name": "v11.0.7", - "created_at": "2026-05-06T22:17:50Z" + "tag_name": "v12.2.0", + "created_at": "2026-09-01T00:01:41Z" }, { - "tag_name": "v10.33.4", - "created_at": "2026-05-06T13:00:28Z" + "tag_name": "v12.1.0", + "created_at": "2026-08-29T14:19:52Z" }, { - "tag_name": "v11.0.6", - "created_at": "2026-05-05T17:50:43Z" + "tag_name": "v11.25.0", + "created_at": "2026-08-29T14:20:10Z" }, { - "tag_name": "v11.0.5", - "created_at": "2026-05-04T20:14:36Z" + "tag_name": "v12.0.0", + "created_at": "2026-08-26T15:13:51Z" }, { - "tag_name": "v10.33.3", - "created_at": "2026-05-04T21:08:08Z" + "tag_name": "v11.24.0", + "created_at": "2026-08-24T19:10:25Z" } ], "yarn": [ + { + "tag_name": "v4.18.1", + "created_at": "2026-09-24T20:40:35Z" + }, + { + "tag_name": "v4.18.0", + "created_at": "2026-07-29T07:56:33Z" + }, + { + "tag_name": "v4.17.1", + "created_at": "2026-07-08T16:48:56Z" + }, { "tag_name": "v4.17.0", - "created_at": "2026-06-15T08:28:44Z" + "created_at": "2026-06-15T08:28:48Z" }, { "tag_name": "v4.16.0", - "created_at": "2026-06-02T07:11:27Z" + "created_at": "2026-06-02T07:11:32Z" }, { "tag_name": "v4.15.0", - "created_at": "2026-05-19T22:20:40Z" + "created_at": "2026-05-19T22:20:46Z" }, { "tag_name": "v4.14.1", - "created_at": "2026-04-17T06:00:06Z" + "created_at": "2026-04-17T06:00:10Z" }, { "tag_name": "v4.14.0", - "created_at": "2026-04-16T15:45:36Z" + "created_at": "2026-04-16T15:45:42Z" }, { "tag_name": "v4.13.0", - "created_at": "2026-03-03T02:12:52Z" + "created_at": "2026-03-03T02:12:57Z" }, { "tag_name": "v4.12.0", - "created_at": "2025-11-23T11:08:59Z" + "created_at": "2025-11-23T11:09:03Z" }, { "tag_name": "v4.11.0", - "created_at": "2025-11-07T13:52:39Z" + "created_at": "2025-11-07T13:52:43Z" }, { "tag_name": "v4.10.3", - "created_at": "2025-09-23T09:41:56Z" + "created_at": "2025-09-23T09:42:00Z" }, { "tag_name": "v4.10.2", - "created_at": "2025-09-18T17:57:01Z" + "created_at": "2025-09-18T17:57:07Z" }, { "tag_name": "v4.10.1", - "created_at": "2025-09-18T12:53:02Z" + "created_at": "2025-09-18T12:53:06Z" }, { "tag_name": "v4.10.0", - "created_at": "2025-09-18T09:18:19Z" + "created_at": "2025-09-18T09:18:24Z" }, { "tag_name": "v4.9.4", - "created_at": "2025-08-26T07:12:24Z" + "created_at": "2025-08-26T07:12:31Z" }, { "tag_name": "v4.9.3", - "created_at": "2025-08-20T12:15:48Z" + "created_at": "2025-08-20T12:15:54Z" }, { "tag_name": "v4.9.2", - "created_at": "2025-06-03T20:25:22Z" + "created_at": "2025-06-03T20:25:28Z" }, { "tag_name": "v4.9.1", - "created_at": "2025-04-11T09:04:18Z" + "created_at": "2025-04-11T09:04:22Z" }, { "tag_name": "v4.9.0", - "created_at": "2025-04-09T14:12:08Z" + "created_at": "2025-04-09T14:12:16Z" }, { "tag_name": "v4.8.1", - "created_at": "2025-03-30T08:45:23Z" + "created_at": "2025-03-30T08:45:27Z" }, { "tag_name": "v4.8.0", - "created_at": "2025-03-28T10:35:47Z" + "created_at": "2025-03-28T10:35:51Z" }, { "tag_name": "v4.7.0", - "created_at": "2025-03-01T15:19:26Z" + "created_at": "2025-03-01T15:19:32Z" }, { "tag_name": "v4.6.0", - "created_at": "2024-12-29T12:34:26Z" + "created_at": "2024-12-29T12:34:29Z" }, { "tag_name": "v3.8.7", - "created_at": "2024-12-04T00:54:19Z" + "created_at": "2024-12-04T00:54:22Z" }, { "tag_name": "v4.5.3", - "created_at": "2024-11-25T13:51:16Z" + "created_at": "2024-11-25T13:51:20Z" }, { "tag_name": "v4.5.2", - "created_at": "2024-11-22T00:33:06Z" + "created_at": "2024-11-22T00:33:09Z" }, { "tag_name": "v4.5.1", - "created_at": "2024-10-18T16:19:14Z" + "created_at": "2024-10-18T16:19:19Z" }, { "tag_name": "v3.8.6", - "created_at": "2024-10-18T17:10:31Z" + "created_at": "2024-10-18T17:10:37Z" }, { "tag_name": "v4.5.0", - "created_at": "2024-09-14T12:52:46Z" - }, - { - "tag_name": "v4.4.1", - "created_at": "2024-08-24T12:57:51Z" - }, - { - "tag_name": "v3.8.5", - "created_at": "2024-08-24T14:50:22Z" - }, - { - "tag_name": "v3.8.4", - "created_at": "2024-08-05T15:27:54Z" + "created_at": "2024-09-14T12:52:51Z" } ] } diff --git a/scripts/update-runtime-catalog.mjs b/scripts/update-runtime-catalog.mjs new file mode 100644 index 0000000..d695aa0 --- /dev/null +++ b/scripts/update-runtime-catalog.mjs @@ -0,0 +1,128 @@ +import { readFile, writeFile } from 'node:fs/promises' +import { createHash } from 'node:crypto' +import { fileURLToPath } from 'node:url' +import { resolve, dirname } from 'node:path' + +const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..') +export const SOURCES = Object.freeze({ + node: 'https://nodejs.org/dist/index.json', + npm: 'https://api.github.com/repos/npm/cli/releases?per_page=100', + pnpm: 'https://api.github.com/repos/pnpm/pnpm/releases?per_page=100', + yarn: 'https://api.github.com/repos/yarnpkg/berry/releases?per_page=100', + hatch: 'https://raw.githubusercontent.com/pypa/hatch/b998d2b755bc0dca20054f96da8981532444fc2a/src/hatch/python/distributions.py', +}) +const hash = value => createHash('sha256').update(JSON.stringify(value)).digest('hex') +const stableVersion = /^v\d+\.\d+\.\d+$/ + +export function selectNodeVersions(rows, now) { + if (!Array.isArray(rows)) throw new Error('Invalid official Node index') + const counts = new Map() + const selected = rows.filter(row => { + if (!stableVersion.test(row.version) || !/^\d{4}-\d{2}-\d{2}$/.test(row.date)) return false + if (row.date > now.slice(0, 10)) return false + const major = Number(row.version.split('.')[0].slice(1)) + if (major < 16 || (counts.get(major) ?? 0) >= 3) return false + counts.set(major, (counts.get(major) ?? 0) + 1) + return true + }) + if (!selected.length) throw new Error('No stable Node releases') + return selected +} + +export function selectPackageReleases(rows, name, now) { + if (!Array.isArray(rows)) throw new Error(`Invalid ${name} releases`) + const seen = new Set() + return rows.flatMap(row => { + if (row.draft || row.prerelease) return [] + let tag = row.tag_name + if (name === 'yarn') { + const match = /^@yarnpkg\/cli\/(\d+\.\d+\.\d+)$/.exec(tag) + if (!match) return [] + tag = `v${match[1]}` + } + if (!stableVersion.test(tag) || seen.has(tag)) return [] + if (!row.published_at || !Number.isFinite(Date.parse(row.published_at)) || Date.parse(row.published_at) > Date.parse(now)) return [] + seen.add(tag) + // Client-compatible field name; value is publication time, not commit creation time. + return [{ tag_name: tag, created_at: row.published_at }] + }).slice(0, 30) +} + +export function verifyRecommended(recommended, nodeRows, sums, pythonRelease, now = new Date().toISOString()) { + const nowMs = Date.parse(now) + if (!Number.isFinite(nowMs)) throw new Error('Invalid verification time') + const publishedMs = Date.parse(pythonRelease.published_at) + if (!Number.isFinite(publishedMs) || publishedMs > nowMs) throw new Error('Python release unpublished or future publication date') + const node = nodeRows.find(row => row.version === `v${recommended.node.version}`) + if (!node || node.lts !== recommended.node.ltsCodename) throw new Error('Recommended Node release/LTS mismatch') + if (!/^\d{4}-\d{2}-\d{2}$/.test(node.date) || node.date > now.slice(0, 10)) throw new Error('Node release missing or future publication date') + if (pythonRelease.tag_name !== recommended.python.distTag || pythonRelease.draft || pythonRelease.prerelease) throw new Error('Python release tag/status mismatch') + const lines = new Map(sums.split('\n').flatMap(line => { + const match = /^([a-f0-9]{64})\s+\*?(\S+)$/.exec(line.trim()) + return match ? [[match[2], match[1]]] : [] + })) + const nodeSuffixes = { 'darwin-arm64': 'darwin-arm64.tar.gz', 'darwin-x64': 'darwin-x64.tar.gz', 'win32-x64': 'win-x64.zip', 'win32-arm64': 'win-arm64.zip', 'linux-x64': 'linux-x64.tar.gz', 'linux-arm64': 'linux-arm64.tar.gz' } + const pythonTriples = { 'darwin-arm64': 'aarch64-apple-darwin', 'darwin-x64': 'x86_64-apple-darwin', 'win32-x64': 'x86_64-pc-windows-msvc', 'win32-arm64': 'aarch64-pc-windows-msvc', 'linux-x64': 'x86_64-unknown-linux-gnu', 'linux-arm64': 'aarch64-unknown-linux-gnu' } + for (const platform of Object.keys(nodeSuffixes)) { + const path = recommended.node.archives[platform] + if (path !== `v${recommended.node.version}/node-v${recommended.node.version}-${nodeSuffixes[platform]}`) throw new Error('Unsafe Node archive path') + if (lines.get(path.split('/').at(-1)) !== recommended.node.sha256[platform]) throw new Error(`Node digest mismatch: ${platform}`) + } + for (const platform of Object.keys(pythonTriples)) { + const path = recommended.python.archives[platform] + if (path !== `${recommended.python.distTag}/cpython-${recommended.python.version}+${recommended.python.distTag}-${pythonTriples[platform]}-install_only_stripped.tar.gz`) throw new Error('Unsafe Python archive path') + const asset = pythonRelease.assets.find(row => row.name === path.split('/').at(-1)) + if (!asset || asset.state !== 'uploaded' || asset.digest !== `sha256:${recommended.python.sha256[platform]}`) throw new Error(`Python digest mismatch: ${platform}`) + } +} + +async function officialText(url) { + const allowed = new Set([...Object.values(SOURCES)]) + const recommended = JSON.parse(await readFile(resolve(ROOT, 'runtimes/recommended.json'), 'utf8')) + allowed.add(`https://nodejs.org/dist/v${recommended.node.version}/SHASUMS256.txt`) + allowed.add(`https://api.github.com/repos/astral-sh/python-build-standalone/releases/tags/${recommended.python.distTag}`) + if (!allowed.has(url)) throw new Error(`Unapproved source: ${url}`) + const response = await fetch(url, { redirect: 'error', signal: AbortSignal.timeout(30000), headers: { 'User-Agent': 'config-center-runtime-audit' } }) + if (!response.ok) throw new Error(`${url}: HTTP ${response.status}`) + return response.text() +} + +async function main() { + const write = process.argv.includes('--write') + if (process.argv.slice(2).some(arg => arg !== '--write')) throw new Error('Usage: node scripts/update-runtime-catalog.mjs [--write]') + const recommended = JSON.parse(await readFile(resolve(ROOT, 'runtimes/recommended.json'), 'utf8')) + const old = JSON.parse(await readFile(resolve(ROOT, 'runtimes/versions-fallback.json'), 'utf8')) + const sumsUrl = `https://nodejs.org/dist/v${recommended.node.version}/SHASUMS256.txt` + const pythonUrl = `https://api.github.com/repos/astral-sh/python-build-standalone/releases/tags/${recommended.python.distTag}` + const urls = [...Object.values(SOURCES), sumsUrl, pythonUrl] + const texts = await Promise.all(urls.map(officialText)) + const source = Object.fromEntries(urls.map((url, i) => [url, texts[i]])) + const nodes = JSON.parse(source[SOURCES.node]) + const pythonRelease = JSON.parse(source[pythonUrl]) + const now = new Date().toISOString() + verifyRecommended(recommended, nodes, source[sumsUrl], pythonRelease, now) + // The fallback mirrors bundled Hatch 1.16.5, not standalone's latest release. + // Fail closed if its existing rows no longer match that official distribution map. + for (const row of old.python) { + const expected = row.name.startsWith('pypy') ? `${row.name}-v${row.version}-` : `cpython-${row.version}` + const escapedName = row.name.replaceAll('.', '\\.') + const section = new RegExp(`^ ['\"]${escapedName}['\"]: \\{([\\s\\S]*?)(?=^ ['\"]|^\\})`, 'm').exec(source[SOURCES.hatch]) + if (!section || !section[1].includes(expected)) throw new Error(`Hatch pin mismatch: ${row.name}`) + } + const next = { ...old, generatedAt: now, node: selectNodeVersions(nodes, now), pkgManagers: {} } + for (const name of ['npm', 'pnpm', 'yarn']) { + next.pkgManagers[name] = selectPackageReleases(JSON.parse(source[SOURCES[name]]), name, now) + if (!next.pkgManagers[name].length) throw new Error(`No stable ${name} releases`) + } + if (!next.node.some(row => row.version === `v${recommended.node.version}`)) throw new Error('Recommended Node absent from snapshot') + if (write) { + await writeFile(resolve(ROOT, 'runtimes/versions-fallback.json'), `${JSON.stringify(next, null, 2)}\n`) + for (const name of ['node', 'npm', 'pnpm', 'yarn']) { + const rows = name === 'node' ? next.node : next.pkgManagers[name] + const path = name === 'node' ? 'node-snapshot.md' : `package-managers/${name}-snapshot.md` + await writeFile(resolve(ROOT, 'docs/runtime-sources', path), `# ${name} 离线目录快照\n\n- 实际读取:${now}\n- 官方来源:[官方目录](${SOURCES[name]})\n- 数据位置:\`runtimes/versions-fallback.json#${name === 'node' ? 'node' : `pkgManagers.${name}`}\`\n- 目录条数:${rows.length}\n- 首条版本:${rows[0].version ?? rows[0].tag_name}\n- 本仓条目指纹(JSON.stringify、SHA-256):\`${hash(rows)}\`\n- 本轮读取的官方正文 SHA-256:\`${createHash('sha256').update(source[SOURCES[name]]).digest('hex')}\`\n\n筛选规则:${name === 'node' ? 'Node 16 及以上,每个大版本最多三条正式发布;保留上游顺序。不表示所有大版本仍受支持。' : '读取官方仓库最近 100 个 releases,排除 draft、prerelease、非正式版本标签及未来发布日期,最多 30 条;Yarn 只接受 @yarnpkg/cli 正式标签。created_at 字段保持客户端结构,值取 published_at。目录不代表当前平台安装测试已通过。'}\n`) + } + } + console.log(JSON.stringify({ write, generatedAt: now, node: next.node.length, packageManagers: Object.fromEntries(Object.entries(next.pkgManagers).map(([key, value]) => [key, value.length])), python: 'preserved: bundled Hatch 1.16.5 pin; recommended archive hashes verified against official manifests' })) +} +if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) main().catch(error => { console.error(error.message); process.exitCode = 1 }) diff --git a/scripts/validate-data-sources.mjs b/scripts/validate-data-sources.mjs new file mode 100644 index 0000000..2c17fb2 --- /dev/null +++ b/scripts/validate-data-sources.mjs @@ -0,0 +1,91 @@ +import { readFileSync, readdirSync } from 'node:fs' +import { resolve, relative, join } from 'node:path' +import { fileURLToPath } from 'node:url' +import { isDeepStrictEqual } from 'node:util' + +const ROOT = fileURLToPath(new URL('../', import.meta.url)) +const OFFICIAL_HOSTS = { + tavily: ['docs.tavily.com'], brave: ['api.search.brave.com', 'brave.com'], + serper: ['serper.dev'], 'doubao-search-global': ['www.volcengine.com', 'docs.volcengine.com'], + 'configured-vision-openai': ['developers.openai.com', 'platform.openai.com'], + 'configured-vision-anthropic': ['platform.claude.com', 'docs.anthropic.com'], +} +function files(root, directory, extension) { + const dir = join(root, directory) + return readdirSync(dir, { withFileTypes: true }).flatMap(entry => { + const path = join(directory, entry.name) + return entry.isDirectory() ? files(root, path, extension) : entry.name.endsWith(extension) ? [path] : [] + }) +} +export function validateDataSources(root = ROOT) { + const errors = [], records = new Map() + const read = path => JSON.parse(readFileSync(join(root, path), 'utf8')) + for (const page of files(root, 'docs/data-sources', '.md')) { + const text = readFileSync(join(root, page), 'utf8') + if (!text.includes('')) continue + try { + const match = text.match(/\s*```json\s*([\s\S]*?)```\s*/) + if (!match) throw new Error('invalid metadata block') + const record = JSON.parse(match[1]) + const target = resolve(root, record.config) + if (relative(root, target).startsWith('..')) throw new Error('config escapes repository') + if (records.has(record.config)) throw new Error('duplicate config record') + if (!/^\d{4}-\d{2}-\d{2}$/.test(record.checkedAt)) throw new Error('missing checkedAt') + const config = read(record.config) + records.set(record.config, record) + if (record.kind === 'routing-policy') { + if (record.status !== 'policy' || record.config !== 'compute/service-map.json') throw new Error('invalid routing policy') + if (!isDeepStrictEqual(config, record.claims)) errors.push(`${page}: routing policy drift: update the documented default selection`) + const providers = files(root, 'compute/providers', '.json').filter(p => !p.endsWith('/_index.json')).map(read) + const external = new Set((record.externalProviders ?? []).map(item => { + if (!item.id || !item.reason?.trim()) throw new Error('external provider needs reason') + return item.id + })) + for (const [service, route] of Object.entries(config)) { + const provider = providers.find(item => item.id === route.providerId) + if (external.has(route.providerId)) continue + if (!provider || !provider.models?.some(model => model.modelName === route.modelName)) throw new Error(`unresolved route ${service}: ${route.providerId}/${route.modelName}`) + } + } else if (record.kind === 'policy' || record.kind === 'api-contract') { + if (!record.claims || !Object.keys(record.claims).length) throw new Error('missing claims') + for (const [key, value] of Object.entries(record.claims)) { + if (!isDeepStrictEqual(config[key], value)) throw new Error(`contract drift: ${key}`) + } + if (record.kind === 'policy') { + if (record.status !== 'policy' || record.config !== 'compute/pricing.json') throw new Error('invalid pricing policy') + if (!isDeepStrictEqual(config, record.claims)) throw new Error('unrecorded pricing field') + } else { + if (!['partial', 'pending'].includes(record.status)) throw new Error('invalid verification status') + if (!Array.isArray(record.verifiedFields) || record.verifiedFields.some(key => typeof key !== 'string' || key.split('.').reduce((value, segment) => value?.[segment], record.claims) === undefined)) throw new Error('invalid verified fields') + if (record.status === 'pending' && record.verifiedFields.length) throw new Error('pending cannot assert verified fields') + if (record.status === 'partial' && !record.verifiedFields.length) throw new Error('partial needs verified fields') + if (!record.sources?.length) throw new Error('missing official source') + for (const source of record.sources) { + const url = new URL(source.url) + if (url.protocol !== 'https:' || url.username || url.password || url.search || !OFFICIAL_HOSTS[config.id]?.includes(url.hostname)) throw new Error('unapproved source URL') + if (!['fetched', 'shell', 'failed'].includes(source.retrieval)) throw new Error('invalid retrieval') + if (!/^\d{4}-\d{2}-\d{2}$/.test(source.checkedAt ?? '') || Number.isNaN(Date.parse(source.checkedAt)) || new Date(source.checkedAt).toISOString().slice(0, 10) !== source.checkedAt) throw new Error('invalid source checkedAt') + if (source.resolvedUrl) { + const resolved = new URL(source.resolvedUrl) + if (resolved.protocol !== 'https:' || resolved.username || resolved.password || resolved.searchParams.has('token') || !OFFICIAL_HOSTS[config.id]?.includes(resolved.hostname)) throw new Error('unapproved resolved source URL') + } + if (source.contentSha256 != null && !/^[a-f0-9]{64}$/.test(source.contentSha256)) throw new Error('invalid source digest') + if (source.retrieval !== 'failed' && (!source.resolvedUrl || !source.contentSha256)) throw new Error('read source needs resolved URL and digest') + } + if (record.verifiedFields.length && !record.sources.some(source => source.retrieval === 'fetched')) throw new Error('verified field without fetched source') + for (const key of ['endpoint', 'method', 'auth', 'request', 'response']) if (!(key in record.claims)) throw new Error(`missing contract field ${key}`) + } + } else throw new Error('unknown record kind') + } catch (error) { errors.push(`${page}: ${error.message}`) } + } + const required = ['compute/pricing.json', 'compute/service-map.json', ...files(root, 'api-providers', '.json').filter(path => !path.endsWith('/_index.json'))] + for (const path of required) if (!records.has(path)) errors.push(`missing source record: ${path}`) + for (const path of records.keys()) if (!required.includes(path)) errors.push(`out of scope source record: ${path}`) + return { errors, records: records.size } +} +if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + const result = validateDataSources() + for (const error of result.errors) console.error(error) + console.log(`Data sources: ${result.records} policy/API records; ${result.errors.length} failed (not account-call verification)`) + process.exitCode = result.errors.length ? 1 : 0 +} diff --git a/scripts/validate-runtime-sources.mjs b/scripts/validate-runtime-sources.mjs new file mode 100644 index 0000000..15998da --- /dev/null +++ b/scripts/validate-runtime-sources.mjs @@ -0,0 +1,62 @@ +import { readFileSync } from 'node:fs' +import { createHash } from 'node:crypto' +import { fileURLToPath } from 'node:url' +import { resolve, join } from 'node:path' +import { SOURCES } from './update-runtime-catalog.mjs' + +const ROOT = fileURLToPath(new URL('../', import.meta.url)) +const hash = value => createHash('sha256').update(JSON.stringify(value)).digest('hex') +function tableRows(text, columns) { + return text.split('\n').filter(line => line.startsWith('|')).map(line => line.split('|').slice(1, -1).map(cell => cell.trim().replace(/^`|`$/g, ''))).filter(cells => cells.length === columns && !cells.every(cell => /^[- :]+$/.test(cell))) +} +export function validateRuntimeSources(root = ROOT, now = new Date().toISOString()) { + const errors = [] + const read = path => readFileSync(join(root, path), 'utf8') + try { + const fallback = JSON.parse(read('runtimes/versions-fallback.json')) + const recommended = JSON.parse(read('runtimes/recommended.json')) + if (!Number.isFinite(Date.parse(fallback.generatedAt)) || Date.parse(fallback.generatedAt) > Date.parse(now)) errors.push('fallback: invalid/future generatedAt') + for (const name of ['node', 'npm', 'pnpm', 'yarn']) { + const rows = name === 'node' ? fallback.node : fallback.pkgManagers[name] + const path = name === 'node' ? 'node-snapshot.md' : `package-managers/${name}-snapshot.md` + const page = read(`docs/runtime-sources/${path}`) + if (!rows.length) errors.push(`${name}: empty snapshot`) + if (!page.includes(`- 官方来源:[官方目录](${SOURCES[name]})\n`)) errors.push(`${name}: official source URL drift`) + const seen = new Set() + for (const row of rows) { + const version = row.version ?? row.tag_name + const date = row.date ?? row.created_at + if (!/^v\d+\.\d+\.\d+$/.test(version) || seen.has(version)) errors.push(`${name}: invalid/duplicate stable version`) + seen.add(version) + if (!Number.isFinite(Date.parse(date)) || Date.parse(date) > Date.parse(fallback.generatedAt)) errors.push(`${name}: invalid/future row publication date`) + } + const expectedVersion = rows[0]?.version ?? rows[0]?.tag_name + if (!page.includes(`- 实际读取:${fallback.generatedAt}\n`)) errors.push(`${name}: snapshot date drift`) + if (!page.includes(`- 目录条数:${rows.length}\n`)) errors.push(`${name}: snapshot count drift`) + if (!page.includes(`- 首条版本:${expectedVersion}\n`)) errors.push(`${name}: first version drift`) + if (!page.includes(`- 本仓条目指纹(JSON.stringify、SHA-256):\`${hash(rows)}\`\n`)) errors.push(`${name}: snapshot fingerprint drift`) + if (!/- 本轮读取的官方正文 SHA-256:`[a-f0-9]{64}`\n/.test(page)) errors.push(`${name}: missing official body digest record`) + } + const pythonRows = tableRows(read('docs/runtime-sources/python-fallback.md'), 2).filter(cells => cells[0] !== '名称') + if (JSON.stringify(pythonRows) !== JSON.stringify(fallback.python.map(row => [row.name, row.version]))) errors.push('python: Hatch pin table drift') + for (const name of ['node', 'python']) { + const page = read(`docs/runtime-sources/${name}-recommended.md`) + const expected = recommended[name] + const sourceUrl = name === 'node' ? `https://nodejs.org/dist/v${expected.version}/SHASUMS256.txt` : `https://api.github.com/repos/astral-sh/python-build-standalone/releases/tags/${expected.distTag}` + if (!page.includes(`- 官方来源:[官方摘要清单](${sourceUrl})。\n`)) errors.push(`${name}: recommended official source URL drift`) + if (!page.includes(`- 数据:\`runtimes/recommended.json#${name}\`,版本 \`${expected.version}\`。\n`)) errors.push(`${name}: recommended version drift`) + if (name === 'node' && !page.includes(`LTS 名 ${expected.ltsCodename};`)) errors.push('node: recommended LTS drift') + if (name === 'python' && !page.includes(`tag \`${expected.distTag}\``)) errors.push('python: recommended distTag drift') + const rows = tableRows(page, 3).filter(cells => cells[0] !== '平台') + const values = Object.entries(expected.archives).map(([platform, path]) => [platform, path, expected.sha256[platform]]) + if (JSON.stringify(rows) !== JSON.stringify(values)) errors.push(`${name}: recommended archive/hash table drift`) + } + } catch (error) { errors.push(`runtime source read: ${error.message}`) } + return { errors } +} +if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + const result = validateRuntimeSources() + for (const error of result.errors) console.error(error) + console.log(`Runtime sources: snapshot and recommended tables; ${result.errors.length} failed (offline consistency, not official re-fetch or installation verification)`) + process.exitCode = result.errors.length ? 1 : 0 +} diff --git a/scripts/validate-sources.mjs b/scripts/validate-sources.mjs index 6e1e804..b8be0d9 100644 --- a/scripts/validate-sources.mjs +++ b/scripts/validate-sources.mjs @@ -57,7 +57,7 @@ const get = (row, path) => path.split('.').reduce((value, key) => value?.[key], const dateValid = (value) => /^\d{4}-\d{2}-\d{2}$/.test(value ?? '') && !Number.isNaN(Date.parse(value)) && new Date(value).toISOString().slice(0, 10) === value const configSupplier = (config) => { const name = config.split('/').at(-1).replace(/\.json$/, '') - const aliases = { 'openai-codex': 'openai', 'local-whisper': 'openai', 'anthropic-claude': 'anthropic', dashscope: 'alibaba', qwen: 'alibaba', wan: 'alibaba', happyhorse: 'alibaba', 'dashscope-coding': 'alibaba', 'dashscope-token-plan': 'alibaba', 'zhipu-embedding': 'zhipu', 'tencent-token': 'tencent', 'moorethread-coding': 'moorethread' } + const aliases = { 'openai-codex': 'openai', 'local-whisper': 'openai', 'anthropic-claude': 'anthropic', dashscope: 'alibaba', qwen: 'alibaba', wan: 'alibaba', happyhorse: 'alibaba', 'dashscope-coding': 'alibaba', 'dashscope-token-plan': 'alibaba', 'zhipu-embedding': 'zhipu', 'tencent-token': 'tencent', 'xunfei-x2': 'xunfei', 'moorethread-coding': 'moorethread' } return aliases[name] ?? name.replace(/-coding$/, '') } diff --git a/scripts/validate.mjs b/scripts/validate.mjs index 9dc6250..783e42b 100644 --- a/scripts/validate.mjs +++ b/scripts/validate.mjs @@ -121,6 +121,7 @@ const SUSPICIOUS_EXTRA_KEYS = { provider: { reasoningEffort: '客户端只读嵌套的 extra.reasoning.supportedEfforts,扁平写法永不生效', defaultReasoningEffort: '同上,应并入 extra.reasoning.defaultEffort', + defaultEffort: '扁平默认值不被客户端读取,应并入 extra.reasoning.defaultEffort 并核查接入面默认', }, spec: { reasoningEffort: 'reasoning effort 是接入面能力,只能声明在 provider model 的 extra.reasoning 中', diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 0000000..9d91130 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,7 @@ +# 历史审计工具 + +四个旧 ZenMux 入口已停用,执行时失败且不读取或写入配置。原始代码保存在 `archive/*.mjs.txt`,仅作历史追溯;其中硬编码路径、固定日期、归一化/相似匹配、第三方价格自动覆写均不再是维护流程。不要改名恢复执行。 + +后续工具必须以仓库根目录参数或脚本相对路径定位,输出目录显式指定;候选差异只读、不自动 apply。第三方目录可作为寻找官方证据的线索,不能作为原厂模型参数与定价的事实来源。记录官网字段证据后人工做精确 ID 差异,同步分接入面来源、manifest、测试,再走 AGENTS.md 的发布检查。 + +当前可用检查:`npm run validate`、`npm run validate:data-sources`。这些命令不请求供应商 API、不产生候选参数、不更新预设。 diff --git a/tools/apply_all_updates_and_build_diff_report.mjs b/tools/apply_all_updates_and_build_diff_report.mjs index dc6fe54..4b6ab83 100644 --- a/tools/apply_all_updates_and_build_diff_report.mjs +++ b/tools/apply_all_updates_and_build_diff_report.mjs @@ -1,237 +1,3 @@ -import fs from "node:fs/promises"; -import path from "node:path"; - -const ROOT = "/Users/xieyuanxiang/config-center"; -const ZENMUX_FILE = "/tmp/zenmux-models.json"; -const OUT_DIR = path.join(ROOT, "字段取值表"); -const DATE_TAG = "2026-04-23"; - -const TARGET_DIRS = [ - path.join(ROOT, "compute", "providers"), - path.join(ROOT, "compute", "coding-plans"), -]; - -const PROVIDER_OWNED_BY = { - openai: ["openai"], - anthropic: ["anthropic"], - deepseek: ["deepseek"], - google: ["google"], - moonshot: ["moonshotai"], - zhipu: ["z-ai"], - "zhipu-embedding": ["z-ai"], - dashscope: ["qwen"], - minimax: ["minimax"], - baidu: ["baidu"], - tencent: ["tencent"], - volcengine: ["bytedance", "volcengine"], - xai: ["x-ai"], - mistral: ["mistralai"], - kwai: ["kuaishou"], - siliconflow: ["qwen", "baai"], - cohere: ["cohere"], - perplexity: ["perplexity"], -}; - -function normalize(s) { - return String(s || "") - .toLowerCase() - .replace(/[._/]/g, "-") - .replace(/[^a-z0-9-]/g, "") - .replace(/-+/g, "-") - .replace(/^-|-$/g, ""); -} - -function stripTail(s) { - return s - .replace(/-(latest|preview|exp|experimental|stable)$/g, "") - .replace(/-\d{8}$/g, "") - .replace(/-\d{6}$/g, "") - .replace(/-\d{4}-\d{2}-\d{2}$/g, ""); -} - -function parseZen(m) { - const [vendor, ...rest] = String(m.id).split("/"); - const model = rest.join("/"); - const norm = normalize(model); - return { - id: m.id, - vendor, - model, - norm, - stripped: stripTail(norm), - context: m.context_length, - prompt: m.pricings?.prompt?.[0], - completion: m.pricings?.completion?.[0], - }; -} - -function jaccard(a, b) { - const A = new Set(a.split("-").filter(Boolean)); - const B = new Set(b.split("-").filter(Boolean)); - let inter = 0; - for (const x of A) if (B.has(x)) inter += 1; - return inter / (new Set([...A, ...B]).size || 1); -} - -function match(provider, modelName, zenList) { - const aliases = PROVIDER_OWNED_BY[provider] || [provider]; - const pool = zenList.filter((z) => aliases.includes(z.vendor)); - const localNorm = normalize(modelName); - const localStripped = stripTail(localNorm); - - const exact = pool.filter((z) => z.model === modelName); - if (exact.length === 1) return { tier: "exact", z: exact[0] }; - - const norm = pool.filter((z) => z.norm === localNorm); - if (norm.length === 1) return { tier: "normalized", z: norm[0] }; - - const stripped = pool.filter((z) => z.stripped === localStripped); - if (stripped.length === 1) return { tier: "stripped", z: stripped[0] }; - - const ranked = pool - .map((z) => ({ z, score: jaccard(localNorm, z.norm) })) - .filter((x) => x.score >= 0.35) - .sort((a, b) => b.score - a.score); - if (ranked.length === 1) return { tier: "similar", z: ranked[0].z }; - return { tier: "none", z: null }; -} - -function isUsdPerM(x) { - return x && x.unit === "perMTokens" && x.currency === "USD" && typeof x.value === "number"; -} - -function shouldUpdateContext(local, remote) { - if (typeof remote !== "number") return false; - if (typeof local !== "number") return true; - if (local === remote) return false; - const ratio = Math.abs(local - remote) / Math.max(local, remote); - return ratio > 0.03; -} - -async function listFiles() { - const out = []; - for (const dir of TARGET_DIRS) { - for (const f of await fs.readdir(dir)) { - if (!f.endsWith(".json") || f === "_index.json") continue; - out.push(path.join(dir, f)); - } - } - return out.sort(); -} - -async function main() { - const raw = JSON.parse(await fs.readFile(ZENMUX_FILE, "utf8")); - const zen = (raw.data || []).map(parseZen); - const files = await listFiles(); - - const changes = []; - - for (const abs of files) { - const rel = path.relative(ROOT, abs); - const doc = JSON.parse(await fs.readFile(abs, "utf8")); - const provider = doc.provider || path.basename(abs, ".json"); - const currency = doc.priceCurrency || "USD"; - const models = Array.isArray(doc.models) ? doc.models : []; - - let touched = false; - - for (const m of models) { - const mm = match(provider, m.modelName, zen); - if (!mm.z) continue; - - const modelChanges = []; - const z = mm.z; - - if (shouldUpdateContext(m.contextWindow, z.context)) { - modelChanges.push({ - field: "contextWindow", - from: m.contextWindow, - to: z.context, - }); - m.contextWindow = z.context; - } - - const allowPrice = currency === "USD" && ["exact", "normalized", "stripped", "similar"].includes(mm.tier); - if (allowPrice && isUsdPerM(z.prompt) && m.inputPrice !== z.prompt.value) { - modelChanges.push({ - field: "inputPrice", - from: m.inputPrice, - to: z.prompt.value, - }); - m.inputPrice = z.prompt.value; - } - if (allowPrice && isUsdPerM(z.completion) && m.outputPrice !== z.completion.value) { - modelChanges.push({ - field: "outputPrice", - from: m.outputPrice, - to: z.completion.value, - }); - m.outputPrice = z.completion.value; - } - - if (modelChanges.length) { - touched = true; - changes.push({ - file: rel, - provider, - modelName: m.modelName, - zenmux: z.id, - matchTier: mm.tier, - currency, - changes: modelChanges, - }); - } - } - - if (touched) { - await fs.writeFile(abs, `${JSON.stringify(doc, null, 2)}\n`, "utf8"); - } - } - - await fs.mkdir(OUT_DIR, { recursive: true }); - const jsonOut = path.join(OUT_DIR, `修改后差异总报告-${DATE_TAG}.json`); - const mdOut = path.join(OUT_DIR, `修改后差异总报告-${DATE_TAG}.md`); - - const summary = { - generatedAt: new Date().toISOString(), - totalChangedModels: changes.length, - totalChangedFields: changes.reduce((n, c) => n + c.changes.length, 0), - changedFiles: [...new Set(changes.map((c) => c.file))].length, - }; - - await fs.writeFile(jsonOut, `${JSON.stringify({ summary, changes }, null, 2)}\n`, "utf8"); - - const lines = []; - lines.push(`# 修改后差异总报告(${DATE_TAG})`); - lines.push(""); - lines.push(`- generatedAt: \`${summary.generatedAt}\``); - lines.push(`- changedFiles: **${summary.changedFiles}**`); - lines.push(`- changedModels: **${summary.totalChangedModels}**`); - lines.push(`- changedFields: **${summary.totalChangedFields}**`); - lines.push(""); - lines.push("## 明细"); - lines.push(""); - if (!changes.length) { - lines.push("- (none)"); - } else { - for (const c of changes) { - lines.push(`- ${c.file} :: ${c.modelName}`); - lines.push(` - zenmux: ${c.zenmux} [${c.matchTier}], currency=${c.currency}`); - for (const d of c.changes) { - lines.push(` - ${d.field}: ${JSON.stringify(d.from)} -> ${JSON.stringify(d.to)}`); - } - } - } - lines.push(""); - lines.push("## 数据来源"); - lines.push(""); - lines.push("- https://zenmux.ai/models"); - lines.push("- https://zenmux.ai/api/v1/models"); - lines.push("- 各 provider 官方模型/价格文档(见各子目录详细字段取值表)"); - lines.push(""); - - await fs.writeFile(mdOut, `${lines.join("\n")}\n`, "utf8"); - console.log(JSON.stringify({ summary, jsonOut, mdOut }, null, 2)); -} - -await main(); +// Retired: third-party snapshots must never update authoritative presets. +console.error('This legacy ZenMux tool is retired. See tools/README.md and docs/model-sources/MAINTENANCE.md. No files were read or written.'); +process.exitCode = 1; diff --git a/tools/archive/apply_all_updates_and_build_diff_report.mjs.txt b/tools/archive/apply_all_updates_and_build_diff_report.mjs.txt new file mode 100644 index 0000000..dc6fe54 --- /dev/null +++ b/tools/archive/apply_all_updates_and_build_diff_report.mjs.txt @@ -0,0 +1,237 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +const ROOT = "/Users/xieyuanxiang/config-center"; +const ZENMUX_FILE = "/tmp/zenmux-models.json"; +const OUT_DIR = path.join(ROOT, "字段取值表"); +const DATE_TAG = "2026-04-23"; + +const TARGET_DIRS = [ + path.join(ROOT, "compute", "providers"), + path.join(ROOT, "compute", "coding-plans"), +]; + +const PROVIDER_OWNED_BY = { + openai: ["openai"], + anthropic: ["anthropic"], + deepseek: ["deepseek"], + google: ["google"], + moonshot: ["moonshotai"], + zhipu: ["z-ai"], + "zhipu-embedding": ["z-ai"], + dashscope: ["qwen"], + minimax: ["minimax"], + baidu: ["baidu"], + tencent: ["tencent"], + volcengine: ["bytedance", "volcengine"], + xai: ["x-ai"], + mistral: ["mistralai"], + kwai: ["kuaishou"], + siliconflow: ["qwen", "baai"], + cohere: ["cohere"], + perplexity: ["perplexity"], +}; + +function normalize(s) { + return String(s || "") + .toLowerCase() + .replace(/[._/]/g, "-") + .replace(/[^a-z0-9-]/g, "") + .replace(/-+/g, "-") + .replace(/^-|-$/g, ""); +} + +function stripTail(s) { + return s + .replace(/-(latest|preview|exp|experimental|stable)$/g, "") + .replace(/-\d{8}$/g, "") + .replace(/-\d{6}$/g, "") + .replace(/-\d{4}-\d{2}-\d{2}$/g, ""); +} + +function parseZen(m) { + const [vendor, ...rest] = String(m.id).split("/"); + const model = rest.join("/"); + const norm = normalize(model); + return { + id: m.id, + vendor, + model, + norm, + stripped: stripTail(norm), + context: m.context_length, + prompt: m.pricings?.prompt?.[0], + completion: m.pricings?.completion?.[0], + }; +} + +function jaccard(a, b) { + const A = new Set(a.split("-").filter(Boolean)); + const B = new Set(b.split("-").filter(Boolean)); + let inter = 0; + for (const x of A) if (B.has(x)) inter += 1; + return inter / (new Set([...A, ...B]).size || 1); +} + +function match(provider, modelName, zenList) { + const aliases = PROVIDER_OWNED_BY[provider] || [provider]; + const pool = zenList.filter((z) => aliases.includes(z.vendor)); + const localNorm = normalize(modelName); + const localStripped = stripTail(localNorm); + + const exact = pool.filter((z) => z.model === modelName); + if (exact.length === 1) return { tier: "exact", z: exact[0] }; + + const norm = pool.filter((z) => z.norm === localNorm); + if (norm.length === 1) return { tier: "normalized", z: norm[0] }; + + const stripped = pool.filter((z) => z.stripped === localStripped); + if (stripped.length === 1) return { tier: "stripped", z: stripped[0] }; + + const ranked = pool + .map((z) => ({ z, score: jaccard(localNorm, z.norm) })) + .filter((x) => x.score >= 0.35) + .sort((a, b) => b.score - a.score); + if (ranked.length === 1) return { tier: "similar", z: ranked[0].z }; + return { tier: "none", z: null }; +} + +function isUsdPerM(x) { + return x && x.unit === "perMTokens" && x.currency === "USD" && typeof x.value === "number"; +} + +function shouldUpdateContext(local, remote) { + if (typeof remote !== "number") return false; + if (typeof local !== "number") return true; + if (local === remote) return false; + const ratio = Math.abs(local - remote) / Math.max(local, remote); + return ratio > 0.03; +} + +async function listFiles() { + const out = []; + for (const dir of TARGET_DIRS) { + for (const f of await fs.readdir(dir)) { + if (!f.endsWith(".json") || f === "_index.json") continue; + out.push(path.join(dir, f)); + } + } + return out.sort(); +} + +async function main() { + const raw = JSON.parse(await fs.readFile(ZENMUX_FILE, "utf8")); + const zen = (raw.data || []).map(parseZen); + const files = await listFiles(); + + const changes = []; + + for (const abs of files) { + const rel = path.relative(ROOT, abs); + const doc = JSON.parse(await fs.readFile(abs, "utf8")); + const provider = doc.provider || path.basename(abs, ".json"); + const currency = doc.priceCurrency || "USD"; + const models = Array.isArray(doc.models) ? doc.models : []; + + let touched = false; + + for (const m of models) { + const mm = match(provider, m.modelName, zen); + if (!mm.z) continue; + + const modelChanges = []; + const z = mm.z; + + if (shouldUpdateContext(m.contextWindow, z.context)) { + modelChanges.push({ + field: "contextWindow", + from: m.contextWindow, + to: z.context, + }); + m.contextWindow = z.context; + } + + const allowPrice = currency === "USD" && ["exact", "normalized", "stripped", "similar"].includes(mm.tier); + if (allowPrice && isUsdPerM(z.prompt) && m.inputPrice !== z.prompt.value) { + modelChanges.push({ + field: "inputPrice", + from: m.inputPrice, + to: z.prompt.value, + }); + m.inputPrice = z.prompt.value; + } + if (allowPrice && isUsdPerM(z.completion) && m.outputPrice !== z.completion.value) { + modelChanges.push({ + field: "outputPrice", + from: m.outputPrice, + to: z.completion.value, + }); + m.outputPrice = z.completion.value; + } + + if (modelChanges.length) { + touched = true; + changes.push({ + file: rel, + provider, + modelName: m.modelName, + zenmux: z.id, + matchTier: mm.tier, + currency, + changes: modelChanges, + }); + } + } + + if (touched) { + await fs.writeFile(abs, `${JSON.stringify(doc, null, 2)}\n`, "utf8"); + } + } + + await fs.mkdir(OUT_DIR, { recursive: true }); + const jsonOut = path.join(OUT_DIR, `修改后差异总报告-${DATE_TAG}.json`); + const mdOut = path.join(OUT_DIR, `修改后差异总报告-${DATE_TAG}.md`); + + const summary = { + generatedAt: new Date().toISOString(), + totalChangedModels: changes.length, + totalChangedFields: changes.reduce((n, c) => n + c.changes.length, 0), + changedFiles: [...new Set(changes.map((c) => c.file))].length, + }; + + await fs.writeFile(jsonOut, `${JSON.stringify({ summary, changes }, null, 2)}\n`, "utf8"); + + const lines = []; + lines.push(`# 修改后差异总报告(${DATE_TAG})`); + lines.push(""); + lines.push(`- generatedAt: \`${summary.generatedAt}\``); + lines.push(`- changedFiles: **${summary.changedFiles}**`); + lines.push(`- changedModels: **${summary.totalChangedModels}**`); + lines.push(`- changedFields: **${summary.totalChangedFields}**`); + lines.push(""); + lines.push("## 明细"); + lines.push(""); + if (!changes.length) { + lines.push("- (none)"); + } else { + for (const c of changes) { + lines.push(`- ${c.file} :: ${c.modelName}`); + lines.push(` - zenmux: ${c.zenmux} [${c.matchTier}], currency=${c.currency}`); + for (const d of c.changes) { + lines.push(` - ${d.field}: ${JSON.stringify(d.from)} -> ${JSON.stringify(d.to)}`); + } + } + } + lines.push(""); + lines.push("## 数据来源"); + lines.push(""); + lines.push("- https://zenmux.ai/models"); + lines.push("- https://zenmux.ai/api/v1/models"); + lines.push("- 各 provider 官方模型/价格文档(见各子目录详细字段取值表)"); + lines.push(""); + + await fs.writeFile(mdOut, `${lines.join("\n")}\n`, "utf8"); + console.log(JSON.stringify({ summary, jsonOut, mdOut }, null, 2)); +} + +await main(); diff --git a/tools/archive/batch_update_model_jsons.mjs.txt b/tools/archive/batch_update_model_jsons.mjs.txt new file mode 100644 index 0000000..0c449ba --- /dev/null +++ b/tools/archive/batch_update_model_jsons.mjs.txt @@ -0,0 +1,277 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +const ROOT = "/Users/xieyuanxiang/config-center"; +const ZENMUX_FILE = "/tmp/zenmux-models.json"; +const REPORT_DIR = path.join(ROOT, "字段取值表"); + +const TARGET_DIRS = [ + path.join(ROOT, "compute", "providers"), + path.join(ROOT, "compute", "coding-plans"), +]; + +const PROVIDER_OWNED_BY = { + openai: ["openai"], + anthropic: ["anthropic"], + deepseek: ["deepseek"], + google: ["google"], + moonshot: ["moonshotai"], + zhipu: ["z-ai"], + "zhipu-embedding": ["z-ai"], + dashscope: ["qwen"], + minimax: ["minimax"], + baidu: ["baidu"], + tencent: ["tencent"], + volcengine: ["bytedance", "volcengine"], + xai: ["x-ai"], + mistral: ["mistralai"], + kwai: ["kuaishou"], + siliconflow: ["qwen", "baai"], + cohere: ["cohere"], + perplexity: ["perplexity"], +}; + +const OFFICIAL_DOCS = { + openai: ["https://platform.openai.com/docs/models", "https://platform.openai.com/docs/pricing"], + anthropic: ["https://docs.anthropic.com/en/docs/about-claude/models/all-models", "https://docs.anthropic.com/en/docs/about-claude/pricing"], + deepseek: ["https://api-docs.deepseek.com/quick_start/pricing"], + google: ["https://ai.google.dev/gemini-api/docs/models", "https://ai.google.dev/pricing"], + moonshot: ["https://platform.moonshot.cn/docs/pricing/chat"], + zhipu: ["https://docs.bigmodel.cn/cn/guide/models/text/", "https://www.bigmodel.cn/pricing"], + dashscope: ["https://help.aliyun.com/zh/model-studio/getting-started/models", "https://help.aliyun.com/zh/model-studio/pricing"], + minimax: ["https://platform.minimax.io/docs/guides/pricing-paygo"], + baidu: ["https://cloud.baidu.com/doc/qianfan/"], + tencent: ["https://cloud.tencent.com/document/product/1729"], + volcengine: ["https://www.volcengine.com/docs/82379"], + xai: ["https://docs.x.ai/docs/models"], + mistral: ["https://docs.mistral.ai/getting-started/models", "https://mistral.ai/pricing"], + cohere: ["https://docs.cohere.com/docs/models", "https://cohere.com/pricing"], + siliconflow: ["https://www.siliconflow.com/models", "https://siliconflow.cn/pricing"], + perplexity: ["https://docs.perplexity.ai"], +}; + +function normalize(s) { + return String(s || "") + .toLowerCase() + .replace(/[._/]/g, "-") + .replace(/[^a-z0-9-]/g, "") + .replace(/-+/g, "-") + .replace(/^-|-$/g, ""); +} + +function stripTail(s) { + return s + .replace(/-(latest|preview|exp|experimental|stable)$/g, "") + .replace(/-\d{8}$/g, "") + .replace(/-\d{6}$/g, "") + .replace(/-\d{4}-\d{2}-\d{2}$/g, ""); +} + +function parseZenModel(m) { + const [vendor, ...rest] = String(m.id).split("/"); + const model = rest.join("/"); + const norm = normalize(model); + return { + id: m.id, + vendor, + model, + norm, + stripped: stripTail(norm), + context: m.context_length, + reasoning: m.capabilities?.reasoning, + prompt: m.pricings?.prompt?.[0], + completion: m.pricings?.completion?.[0], + }; +} + +function matchModel(provider, modelName, zenModels) { + const aliases = PROVIDER_OWNED_BY[provider] || [provider]; + const pool = zenModels.filter((m) => aliases.includes(m.vendor)); + + const localNorm = normalize(modelName); + const localStripped = stripTail(localNorm); + + const exact = pool.filter((m) => m.model === modelName); + if (exact.length === 1) return { tier: "exact", model: exact[0] }; + + const norm = pool.filter((m) => m.norm === localNorm); + if (norm.length === 1) return { tier: "normalized", model: norm[0] }; + + const stripped = pool.filter((m) => m.stripped === localStripped); + if (stripped.length === 1) return { tier: "stripped", model: stripped[0] }; + + const ranked = pool + .map((m) => { + const tokensA = new Set(localNorm.split("-").filter(Boolean)); + const tokensB = new Set(m.norm.split("-").filter(Boolean)); + let inter = 0; + for (const t of tokensA) if (tokensB.has(t)) inter += 1; + const union = new Set([...tokensA, ...tokensB]).size || 1; + return { m, score: inter / union }; + }) + .filter((x) => x.score >= 0.35) + .sort((a, b) => b.score - a.score) + .slice(0, 3); + + if (ranked.length === 1) return { tier: "similar", model: ranked[0].m }; + if (ranked.length > 1) return { tier: "ambiguous", candidates: ranked.map((x) => x.m.id) }; + return { tier: "none" }; +} + +function isPriceUsable(entry) { + return entry && entry.unit === "perMTokens" && entry.currency === "USD" && typeof entry.value === "number"; +} + +function contextShouldUpdate(local, remote) { + if (typeof remote !== "number") return false; + if (typeof local !== "number") return true; + if (local === remote) return false; + const ratio = Math.abs(local - remote) / Math.max(local, remote); + return ratio > 0.03; +} + +async function listJsonFiles() { + const files = []; + for (const dir of TARGET_DIRS) { + for (const f of await fs.readdir(dir)) { + if (!f.endsWith(".json") || f === "_index.json") continue; + files.push(path.join(dir, f)); + } + } + return files.sort(); +} + +function reportNameFromPath(rel) { + return rel.replaceAll("/", "__").replaceAll(".json", ""); +} + +async function main() { + const raw = JSON.parse(await fs.readFile(ZENMUX_FILE, "utf8")); + const zenModels = (raw.data || []).map(parseZenModel); + const files = await listJsonFiles(); + await fs.mkdir(REPORT_DIR, { recursive: true }); + + const summary = []; + + for (const abs of files) { + const rel = path.relative(ROOT, abs); + const doc = JSON.parse(await fs.readFile(abs, "utf8")); + const provider = doc.provider || path.basename(abs, ".json"); + const priceCurrency = doc.priceCurrency || "USD"; + const models = Array.isArray(doc.models) ? doc.models : []; + + const changed = []; + const unresolved = []; + let fileChanged = false; + + for (const model of models) { + const mm = matchModel(provider, model.modelName, zenModels); + if (!mm.model) { + unresolved.push({ + modelName: model.modelName, + reason: mm.tier === "ambiguous" ? `ambiguous:${(mm.candidates || []).join(",")}` : "no-zenmux-match", + }); + continue; + } + const z = mm.model; + const fieldsChanged = []; + + if (contextShouldUpdate(model.contextWindow, z.context)) { + const before = model.contextWindow; + model.contextWindow = z.context; + fieldsChanged.push(`contextWindow:${before}->${z.context}`); + } + + const allowPrice = priceCurrency === "USD" && (mm.tier === "exact" || mm.tier === "normalized"); + if (allowPrice && isPriceUsable(z.prompt) && model.inputPrice !== z.prompt.value) { + const before = model.inputPrice; + model.inputPrice = z.prompt.value; + fieldsChanged.push(`inputPrice:${before}->${z.prompt.value}`); + } else if (!allowPrice && model.inputPrice !== undefined) { + unresolved.push({ + modelName: model.modelName, + reason: `price-not-updated(currency=${priceCurrency},match=${mm.tier})`, + }); + } + + if (allowPrice && isPriceUsable(z.completion) && model.outputPrice !== z.completion.value) { + const before = model.outputPrice; + model.outputPrice = z.completion.value; + fieldsChanged.push(`outputPrice:${before}->${z.completion.value}`); + } + + if (fieldsChanged.length) { + fileChanged = true; + changed.push({ + modelName: model.modelName, + zenmux: z.id, + matchTier: mm.tier, + fieldsChanged, + }); + } else { + unresolved.push({ + modelName: model.modelName, + reason: `matched-no-change(${z.id},${mm.tier})`, + }); + } + } + + if (fileChanged) { + await fs.writeFile(abs, `${JSON.stringify(doc, null, 2)}\n`, "utf8"); + } + + const reportFile = path.join(REPORT_DIR, `${reportNameFromPath(rel)}-未确认字段报告.md`); + const lines = []; + lines.push(`# 未确认字段报告 - ${rel}`); + lines.push(""); + lines.push(`- provider: \`${provider}\``); + lines.push(`- priceCurrency: \`${priceCurrency}\``); + lines.push(`- changedModels: **${changed.length}**`); + lines.push(`- unresolvedItems: **${unresolved.length}**`); + lines.push(""); + lines.push("## 官方来源"); + lines.push(""); + const docs = OFFICIAL_DOCS[provider] || []; + if (docs.length) { + for (const d of docs) lines.push(`- ${d}`); + } else { + lines.push("- (待补充该 provider 官方文档)"); + } + lines.push("- https://zenmux.ai/models"); + lines.push("- https://zenmux.ai/api/v1/models"); + lines.push(""); + lines.push("## 已修改"); + lines.push(""); + if (!changed.length) { + lines.push("- (none)"); + } else { + for (const c of changed) { + lines.push(`- \`${c.modelName}\` <= \`${c.zenmux}\` [${c.matchTier}]`); + for (const f of c.fieldsChanged) lines.push(` - ${f}`); + } + } + lines.push(""); + lines.push("## 未确认/未修改"); + lines.push(""); + if (!unresolved.length) { + lines.push("- (none)"); + } else { + for (const u of unresolved) lines.push(`- \`${u.modelName}\`: ${u.reason}`); + } + lines.push(""); + await fs.writeFile(reportFile, `${lines.join("\n")}\n`, "utf8"); + + summary.push({ + file: rel, + changedModels: changed.length, + unresolvedItems: unresolved.length, + report: path.relative(ROOT, reportFile), + }); + } + + const summaryFile = path.join(REPORT_DIR, "全量处理汇总-2026-04-23.json"); + await fs.writeFile(summaryFile, `${JSON.stringify(summary, null, 2)}\n`, "utf8"); + console.log(JSON.stringify({ processedFiles: summary.length, summaryFile }, null, 2)); +} + +await main(); diff --git a/tools/archive/generate_current_audit_artifacts.mjs.txt b/tools/archive/generate_current_audit_artifacts.mjs.txt new file mode 100644 index 0000000..ce18aa9 --- /dev/null +++ b/tools/archive/generate_current_audit_artifacts.mjs.txt @@ -0,0 +1,531 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +const ROOT = process.env.CONFIG_CENTER_ROOT || process.cwd(); +const ZENMUX_FILE = process.env.ZENMUX_FILE || "/tmp/zenmux-models.json"; +const FIELD_TABLE_DIR = path.join(ROOT, "字段取值表"); +const OUTPUT_DIR = path.join(ROOT, "outputs", "field-audit"); + +const TARGET_DIRS = [ + path.join(ROOT, "compute", "providers"), + path.join(ROOT, "compute", "coding-plans"), +]; + +const PROVIDER_OWNED_BY = { + openai: ["openai"], + anthropic: ["anthropic"], + deepseek: ["deepseek"], + google: ["google"], + moonshot: ["moonshotai"], + zhipu: ["z-ai"], + "zhipu-embedding": ["z-ai"], + dashscope: ["qwen"], + minimax: ["minimax"], + baidu: ["baidu"], + tencent: ["tencent"], + volcengine: ["bytedance", "volcengine"], + xai: ["x-ai"], + mistral: ["mistralai"], + kwai: ["kuaishou"], + siliconflow: ["qwen", "baai"], + cohere: ["cohere"], + perplexity: ["perplexity"], +}; + +const OFFICIAL_DOCS = { + openai: ["https://platform.openai.com/docs/models", "https://platform.openai.com/docs/pricing"], + anthropic: ["https://docs.anthropic.com/en/docs/about-claude/models/all-models", "https://docs.anthropic.com/en/docs/about-claude/pricing"], + deepseek: ["https://api-docs.deepseek.com/quick_start/pricing"], + google: ["https://ai.google.dev/gemini-api/docs/models", "https://ai.google.dev/pricing"], + moonshot: ["https://platform.moonshot.cn/docs/guide/overview", "https://platform.moonshot.cn/docs/pricing/chat"], + zhipu: ["https://docs.bigmodel.cn/cn/guide/models/text/", "https://www.bigmodel.cn/pricing"], + "zhipu-embedding": ["https://docs.bigmodel.cn/cn/guide/models/embedding"], + dashscope: ["https://help.aliyun.com/zh/model-studio/getting-started/models", "https://help.aliyun.com/zh/model-studio/pricing"], + minimax: ["https://platform.minimax.io/docs/api-reference/api-overview", "https://platform.minimax.io/docs/guides/pricing-paygo"], + baichuan: ["https://platform.baichuan-ai.com/docs"], + baidu: ["https://cloud.baidu.com/doc/qianfan/"], + tencent: ["https://cloud.tencent.com/document/product/1729"], + volcengine: ["https://www.volcengine.com/docs/82379"], + xai: ["https://docs.x.ai/docs/models"], + mistral: ["https://docs.mistral.ai/getting-started/models", "https://mistral.ai/pricing"], + cohere: ["https://docs.cohere.com/docs/models", "https://cohere.com/pricing"], + siliconflow: ["https://www.siliconflow.com/models", "https://siliconflow.cn/pricing"], + perplexity: ["https://docs.perplexity.ai"], + openrouter: ["https://openrouter.ai/models"], + xunfei: ["https://www.xfyun.cn/doc/"], +}; + +function normalize(value) { + return String(value || "") + .toLowerCase() + .replace(/[._/]/g, "-") + .replace(/[^a-z0-9-]/g, "") + .replace(/-+/g, "-") + .replace(/^-|-$/g, ""); +} + +function stripTail(value) { + return value + .replace(/-(latest|preview|exp|experimental|stable)$/g, "") + .replace(/-\d{8}$/g, "") + .replace(/-\d{6}$/g, "") + .replace(/-\d{4}-\d{2}-\d{2}$/g, ""); +} + +function parseZenMuxModel(model) { + const [vendor, ...rest] = String(model.id || "").split("/"); + const name = rest.join("/"); + const norm = normalize(name); + return { + id: model.id, + vendor, + modelName: name, + norm, + stripped: stripTail(norm), + contextWindow: model.context_length, + reasoning: model.capabilities?.reasoning, + prompt: model.pricings?.prompt?.[0], + completion: model.pricings?.completion?.[0], + }; +} + +function jaccard(left, right) { + const a = new Set(left.split("-").filter(Boolean)); + const b = new Set(right.split("-").filter(Boolean)); + let overlap = 0; + for (const item of a) if (b.has(item)) overlap += 1; + return overlap / (new Set([...a, ...b]).size || 1); +} + +function matchModel(provider, modelName, zenModels) { + const owners = PROVIDER_OWNED_BY[provider] || [provider]; + const pool = zenModels.filter((model) => owners.includes(model.vendor)); + const localNorm = normalize(modelName); + const localStripped = stripTail(localNorm); + + const exact = pool.filter((model) => model.modelName === modelName); + if (exact.length === 1) return { tier: "exact", matched: exact[0], candidates: exact }; + + const normalized = pool.filter((model) => model.norm === localNorm); + if (normalized.length === 1) return { tier: "normalized", matched: normalized[0], candidates: normalized }; + + const stripped = pool.filter((model) => model.stripped === localStripped); + if (stripped.length === 1) return { tier: "stripped", matched: stripped[0], candidates: stripped }; + + const candidates = pool + .map((model) => ({ model, score: jaccard(localNorm, model.norm) })) + .filter((item) => item.score >= 0.35) + .sort((a, b) => b.score - a.score) + .slice(0, 5) + .map((item) => item.model); + + if (candidates.length === 1) return { tier: "similar", matched: candidates[0], candidates }; + return { tier: candidates.length ? "ambiguous" : "none", matched: null, candidates }; +} + +function formatValue(value) { + if (value === undefined) return "(缺省)"; + return `\`${JSON.stringify(value)}\``; +} + +function formatList(values) { + if (!values?.length) return "(none)"; + return values.map((value) => `\`${value}\``).join("、"); +} + +function reportFolderName(relativePath) { + return relativePath + .replace(/^compute\//, "") + .replaceAll("/", "__") + .replace(/\.json$/, ""); +} + +async function listJsonFiles() { + const files = []; + for (const dir of TARGET_DIRS) { + for (const fileName of await fs.readdir(dir)) { + if (!fileName.endsWith(".json") || fileName.startsWith("_")) continue; + files.push(path.join(dir, fileName)); + } + } + return files.sort(); +} + +async function readZenMuxModels() { + try { + const raw = JSON.parse(await fs.readFile(ZENMUX_FILE, "utf8")); + return (raw.data || []).map(parseZenMuxModel); + } catch { + return []; + } +} + +function buildFieldRows(doc, model, match) { + const z = match.matched; + return [ + { + field: "modelName", + current: model.modelName, + suggested: z ? z.modelName : model.modelName, + decision: z && ["exact", "normalized"].includes(match.tier) ? "保持" : "待确认", + reason: z ? `ZenMux匹配(${match.tier}): ${z.id}` : "ZenMux无稳定匹配,需官方文档确认", + }, + { + field: "displayName", + current: model.displayName, + suggested: model.displayName, + decision: "保持", + reason: "展示字段,以本项目产品命名策略为准", + }, + { + field: "serviceType", + current: model.serviceType, + suggested: model.serviceType, + decision: "保持", + reason: "服务路由字段,以本项目分类约定为准", + }, + { + field: "contextWindow", + current: model.contextWindow, + suggested: z?.contextWindow ?? model.contextWindow, + decision: typeof z?.contextWindow === "number" ? "待确认" : "待确认", + reason: typeof z?.contextWindow === "number" + ? `ZenMux给出context_length=${z.contextWindow},最终以官方模型规格页确认` + : "ZenMux无context可用,需官方规格页确认", + }, + { + field: "maxOutputTokens", + current: model.maxOutputTokens, + suggested: model.maxOutputTokens, + decision: "待确认", + reason: "ZenMux列表未提供统一max output字段,需官方模型详情页确认", + }, + { + field: "inputPrice", + current: model.inputPrice, + suggested: model.inputPrice, + decision: "待确认", + reason: `当前文件币种为${doc.priceCurrency || "USD"},价格需官方价格页确认`, + }, + { + field: "outputPrice", + current: model.outputPrice, + suggested: model.outputPrice, + decision: "待确认", + reason: `当前文件币种为${doc.priceCurrency || "USD"},价格需官方价格页确认`, + }, + { + field: "capabilities", + current: model.capabilities, + suggested: model.capabilities, + decision: "保持", + reason: "能力标签是本项目语义字段,不直接由第三方列表覆盖", + }, + { + field: "defaultTemperature", + current: model.defaultTemperature, + suggested: model.defaultTemperature, + decision: model.defaultTemperature === null ? "建议修改" : "保持", + reason: model.defaultTemperature === null + ? "schema拒绝null;不支持采样参数时应省略字段" + : "当前值与schema兼容;是否采用默认采样值需官方文档确认", + }, + { + field: "defaultTopP", + current: model.defaultTopP, + suggested: model.defaultTopP, + decision: model.defaultTopP === null ? "建议修改" : "保持", + reason: model.defaultTopP === null + ? "schema拒绝null;不支持采样参数时应省略字段" + : "当前值与schema兼容;是否采用默认采样值需官方文档确认", + }, + { + field: "extra", + current: model.extra, + suggested: model.extra, + decision: "待确认", + reason: "扩展字段为本项目schema,需按业务含义和官方补充信息复核", + }, + ]; +} + +async function main() { + const generatedAt = new Date().toISOString(); + const zenModels = await readZenMuxModels(); + const files = await listJsonFiles(); + await fs.mkdir(FIELD_TABLE_DIR, { recursive: true }); + await fs.mkdir(OUTPUT_DIR, { recursive: true }); + + const allModels = []; + const skipped = []; + const pendingByProvider = new Map(); + const fieldIndex = []; + const nullSampling = []; + + for (const absolutePath of files) { + const relativePath = path.relative(ROOT, absolutePath); + const doc = JSON.parse(await fs.readFile(absolutePath, "utf8")); + const provider = doc.provider || path.basename(absolutePath, ".json"); + const outDir = path.join(FIELD_TABLE_DIR, reportFolderName(relativePath)); + await fs.mkdir(outDir, { recursive: true }); + + const detailed = [ + `# 详细字段取值表 - ${relativePath}`, + "", + `- provider: \`${provider}\``, + `- priceCurrency: \`${doc.priceCurrency || "USD"}\``, + `- generatedAt: \`${generatedAt}\``, + "", + "## 来源", + "", + ...(OFFICIAL_DOCS[provider] || ["(待补充provider官方文档)"]).map((item) => `- ${item}`), + "- https://zenmux.ai/models", + "- https://zenmux.ai/api/v1/models", + "", + ]; + const unresolved = [ + `# 未确认字段报告 - ${relativePath}`, + "", + `- provider: \`${provider}\``, + `- generatedAt: \`${generatedAt}\``, + "", + ]; + + const models = Array.isArray(doc.models) ? doc.models : []; + for (const model of models) { + const match = matchModel(provider, model.modelName, zenModels); + const rows = buildFieldRows(doc, model, match); + const status = match.matched + ? `matched-${match.tier}` + : match.tier === "ambiguous" ? "ambiguous" : "no-match"; + + allModels.push({ + file: relativePath, + provider, + modelName: model.modelName, + displayName: model.displayName, + serviceType: model.serviceType, + capabilities: model.capabilities, + contextWindow: model.contextWindow, + maxOutputTokens: model.maxOutputTokens, + inputPrice: model.inputPrice, + outputPrice: model.outputPrice, + defaultTemperature: model.defaultTemperature, + defaultTopP: model.defaultTopP, + matchTier: match.tier, + zenmux: match.matched?.id ?? null, + }); + + if (model.defaultTemperature === null) nullSampling.push(`${relativePath}::${model.modelName}::defaultTemperature`); + if (model.defaultTopP === null) nullSampling.push(`${relativePath}::${model.modelName}::defaultTopP`); + + skipped.push({ + file: relativePath, + provider, + modelName: model.modelName, + reason: status, + zenmux: match.matched?.id ?? null, + candidates: match.candidates.map((item) => item.id), + }); + + if (!match.matched || match.tier === "ambiguous") { + const bucket = pendingByProvider.get(provider) || []; + bucket.push({ + file: relativePath, + modelName: model.modelName, + reason: match.tier === "ambiguous" + ? `ambiguous match candidates: ${match.candidates.map((item) => item.id).join(",")}` + : "no ZenMux match", + }); + pendingByProvider.set(provider, bucket); + } + + detailed.push(`## ${model.modelName}`); + detailed.push(""); + detailed.push(`- ZenMux匹配级别: \`${match.tier}\``); + if (match.matched) detailed.push(`- ZenMux命中: \`${match.matched.id}\``); + detailed.push(`- ZenMux候选: ${formatList(match.candidates.map((item) => item.id))}`); + detailed.push(""); + detailed.push("| 字段 | 当前值 | 建议值 | 结论 | 依据/说明 |"); + detailed.push("|---|---|---|---|---|"); + for (const row of rows) { + detailed.push(`| \`${row.field}\` | ${formatValue(row.current)} | ${formatValue(row.suggested)} | ${row.decision} | ${row.reason} |`); + } + detailed.push(""); + + const pendingRows = rows.filter((row) => row.decision === "待确认" || row.decision === "建议修改"); + if (pendingRows.length) { + unresolved.push(`## ${model.modelName}`); + unresolved.push(""); + for (const row of pendingRows) unresolved.push(`- \`${row.field}\`: ${row.reason}`); + unresolved.push(""); + } + } + + if (unresolved.length === 4) { + unresolved.push("- (none)"); + unresolved.push(""); + } + + const detailedFile = path.join(outDir, "详细字段取值表.md"); + const unresolvedFile = path.join(outDir, "未确认字段报告.md"); + await fs.writeFile(detailedFile, `${detailed.join("\n")}\n`, "utf8"); + await fs.writeFile(unresolvedFile, `${unresolved.join("\n")}\n`, "utf8"); + fieldIndex.push({ + file: relativePath, + provider, + modelCount: models.length, + folder: path.relative(ROOT, outDir), + detailed: path.relative(ROOT, detailedFile), + unresolved: path.relative(ROOT, unresolvedFile), + }); + } + + const matchedModels = allModels.filter((item) => item.zenmux).length; + const summary = { + actualModels: allModels.length, + sourceModels: zenModels.length, + matchedModels, + unmatchedModels: allModels.filter((item) => item.matchTier === "none").length, + ambiguousModels: allModels.filter((item) => item.matchTier === "ambiguous").length, + nullSamplingFields: nullSampling.length, + updatedModels: 0, + updatedFiles: 0, + skippedModels: allModels.length, + }; + + await fs.writeFile( + path.join(FIELD_TABLE_DIR, "目录索引.json"), + `${JSON.stringify(fieldIndex, null, 2)}\n`, + "utf8", + ); + + const reportJson = { + source: ZENMUX_FILE, + generatedAt, + summary, + updated: [], + skipped, + models: allModels, + nullSampling, + }; + await fs.writeFile( + path.join(OUTPUT_DIR, "zenmux-sync-report.json"), + `${JSON.stringify(reportJson, null, 2)}\n`, + "utf8", + ); + + const reportLines = [ + "# ZenMux Sync Report", + "", + `- source: \`${ZENMUX_FILE}\``, + `- generatedAt: \`${generatedAt}\``, + `- actualModels: **${summary.actualModels}**`, + `- sourceModels: **${summary.sourceModels}**`, + `- matchedModels: **${summary.matchedModels}**`, + `- unmatchedModels: **${summary.unmatchedModels}**`, + `- ambiguousModels: **${summary.ambiguousModels}**`, + `- nullSamplingFields: **${summary.nullSamplingFields}**`, + `- updatedModels: **${summary.updatedModels}**`, + `- updatedFiles: **${summary.updatedFiles}**`, + "", + "## Field Coverage", + "", + "- synced: none; this audit run is read-only and does not mutate JSON config.", + "- reviewed from JSON: `modelName`, `displayName`, `serviceType`, `contextWindow`, `maxOutputTokens`, `inputPrice`, `outputPrice`, `capabilities`, `defaultTemperature`, `defaultTopP`, `extra`.", + "- guardrail: `defaultTemperature` and `defaultTopP` must be omitted or numbers; `null` is invalid.", + "", + "## Updated Models", + "", + "- (none)", + "", + "## Skipped / Reviewed Models", + "", + ...skipped.map((item) => { + const detail = item.zenmux + ? `${item.reason}:${item.zenmux}` + : item.candidates.length ? `${item.reason}:${item.candidates.join(",")}` : item.reason; + return `- ${item.file} :: ${item.modelName} -> ${detail}`; + }), + "", + ]; + await fs.writeFile(path.join(OUTPUT_DIR, "zenmux-sync-report.md"), `${reportLines.join("\n")}\n`, "utf8"); + + const checklist = [ + "# Official Review Checklist", + "", + `GeneratedAt: ${generatedAt}`, + `Source: ${path.join(OUTPUT_DIR, "zenmux-sync-report.json")}`, + "", + "Purpose: verify unresolved models with official vendor docs before write-back.", + "", + "## Summary", + "", + `- actual models: **${summary.actualModels}**`, + `- unresolved models: **${summary.unmatchedModels + summary.ambiguousModels}**`, + `- providers involved: **${pendingByProvider.size}**`, + `- null sampling fields: **${summary.nullSamplingFields}**`, + "", + ]; + for (const [provider, items] of [...pendingByProvider.entries()].sort(([a], [b]) => a.localeCompare(b))) { + checklist.push(`## Provider: ${provider}`); + checklist.push("- official docs:"); + for (const doc of OFFICIAL_DOCS[provider] || ["(add link manually)"]) checklist.push(` - ${doc}`); + checklist.push("- pending models:"); + for (const item of items) checklist.push(` - \`${item.modelName}\` (${item.file}) -> ${item.reason}`); + checklist.push(""); + } + checklist.push("## Field-by-Field Verification Rule"); + checklist.push(""); + checklist.push("- `modelName`: must exactly match provider API model ID or official alias rule."); + checklist.push("- `contextWindow`: use official model spec limit."); + checklist.push("- `maxOutputTokens`: use official output cap; do not infer from context."); + checklist.push("- `inputPrice`/`outputPrice`: use official published API pricing and the provider currency."); + checklist.push("- `capabilities`: project taxonomy field; keep local semantics unless official docs clearly contradict the capability."); + checklist.push("- `defaultTemperature`/`defaultTopP`: only fill with numeric values when provider docs define a safe default; omit unsupported fields instead of using `null`."); + await fs.writeFile(path.join(OUTPUT_DIR, "official-review-checklist.md"), `${checklist.join("\n")}\n`, "utf8"); + + const riskLines = [ + "# ZenMux Risk Audit", + "", + `GeneratedAt: ${generatedAt}`, + `Source: ${path.join(OUTPUT_DIR, "zenmux-sync-report.json")}`, + "", + `- HIGH: ${summary.nullSamplingFields > 0 ? 1 : 0}`, + `- MEDIUM: ${summary.ambiguousModels}`, + `- LOW: ${summary.unmatchedModels}`, + "", + "## Notes", + "", + "- HIGH covers schema-breaking sampling defaults such as `null`.", + "- MEDIUM covers ambiguous third-party model matches.", + "- LOW covers models without a ZenMux match; these require official-doc review but do not by themselves indicate JSON invalidity.", + ]; + await fs.writeFile(path.join(OUTPUT_DIR, "zenmux-risk-audit.md"), `${riskLines.join("\n")}\n`, "utf8"); + + const detailedLines = [ + "# ZenMux Sync Detailed Report", + "", + `GeneratedAt: ${generatedAt}`, + "", + "## Summary", + "", + `- actualModels: ${summary.actualModels}`, + `- sourceModels: ${summary.sourceModels}`, + `- matchedModels: ${summary.matchedModels}`, + `- unmatchedModels: ${summary.unmatchedModels}`, + `- ambiguousModels: ${summary.ambiguousModels}`, + `- nullSamplingFields: ${summary.nullSamplingFields}`, + "", + "## Current Model Inventory", + "", + "| File | Provider | Model | Match | ZenMux |", + "|---|---|---|---|---|", + ...allModels.map((item) => `| ${item.file} | ${item.provider} | \`${item.modelName}\` | ${item.matchTier} | ${item.zenmux ? `\`${item.zenmux}\`` : ""} |`), + ]; + await fs.writeFile(path.join(OUTPUT_DIR, "zenmux-sync-detailed.md"), `${detailedLines.join("\n")}\n`, "utf8"); + + console.log(JSON.stringify({ generatedAt, summary, fieldTableFiles: fieldIndex.length }, null, 2)); +} + +await main(); diff --git a/tools/archive/generate_field_tables_per_json.mjs.txt b/tools/archive/generate_field_tables_per_json.mjs.txt new file mode 100644 index 0000000..cafaf88 --- /dev/null +++ b/tools/archive/generate_field_tables_per_json.mjs.txt @@ -0,0 +1,371 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +const ROOT = "/Users/xieyuanxiang/config-center"; +const OUT_ROOT = path.join(ROOT, "字段取值表"); +const ZENMUX_FILE = "/tmp/zenmux-models.json"; + +const TARGET_DIRS = [ + path.join(ROOT, "compute", "providers"), + path.join(ROOT, "compute", "coding-plans"), +]; + +const PROVIDER_OWNED_BY = { + openai: ["openai"], + anthropic: ["anthropic"], + deepseek: ["deepseek"], + google: ["google"], + moonshot: ["moonshotai"], + zhipu: ["z-ai"], + "zhipu-embedding": ["z-ai"], + dashscope: ["qwen"], + minimax: ["minimax"], + baidu: ["baidu"], + tencent: ["tencent"], + volcengine: ["bytedance", "volcengine"], + xai: ["x-ai"], + mistral: ["mistralai"], + kwai: ["kuaishou"], + siliconflow: ["qwen", "baai"], + cohere: ["cohere"], + perplexity: ["perplexity"], +}; + +const OFFICIAL_DOCS = { + openai: ["https://platform.openai.com/docs/models", "https://platform.openai.com/docs/pricing"], + anthropic: ["https://docs.anthropic.com/en/docs/about-claude/models/all-models", "https://docs.anthropic.com/en/docs/about-claude/pricing"], + deepseek: ["https://api-docs.deepseek.com/quick_start/pricing"], + google: ["https://ai.google.dev/gemini-api/docs/models", "https://ai.google.dev/pricing"], + moonshot: ["https://platform.moonshot.cn/docs/pricing/chat"], + zhipu: ["https://docs.bigmodel.cn/cn/guide/models/text/", "https://www.bigmodel.cn/pricing"], + dashscope: ["https://help.aliyun.com/zh/model-studio/getting-started/models", "https://help.aliyun.com/zh/model-studio/pricing"], + minimax: ["https://platform.minimax.io/docs/guides/pricing-paygo"], + baidu: ["https://cloud.baidu.com/doc/qianfan/"], + tencent: ["https://cloud.tencent.com/document/product/1729"], + volcengine: ["https://www.volcengine.com/docs/82379"], + xai: ["https://docs.x.ai/docs/models"], + mistral: ["https://docs.mistral.ai/getting-started/models", "https://mistral.ai/pricing"], + cohere: ["https://docs.cohere.com/docs/models", "https://cohere.com/pricing"], + siliconflow: ["https://www.siliconflow.com/models", "https://siliconflow.cn/pricing"], + perplexity: ["https://docs.perplexity.ai"], +}; + +function normalize(s) { + return String(s || "") + .toLowerCase() + .replace(/[._/]/g, "-") + .replace(/[^a-z0-9-]/g, "") + .replace(/-+/g, "-") + .replace(/^-|-$/g, ""); +} + +function stripTail(s) { + return s + .replace(/-(latest|preview|exp|experimental|stable)$/g, "") + .replace(/-\d{8}$/g, "") + .replace(/-\d{6}$/g, "") + .replace(/-\d{4}-\d{2}-\d{2}$/g, ""); +} + +function parseZen(m) { + const [vendor, ...rest] = String(m.id).split("/"); + const model = rest.join("/"); + const norm = normalize(model); + return { + id: m.id, + vendor, + model, + norm, + stripped: stripTail(norm), + context: m.context_length, + reasoning: m.capabilities?.reasoning, + prompt: m.pricings?.prompt?.[0], + completion: m.pricings?.completion?.[0], + }; +} + +function jaccard(a, b) { + const A = new Set(a.split("-").filter(Boolean)); + const B = new Set(b.split("-").filter(Boolean)); + let inter = 0; + for (const x of A) if (B.has(x)) inter += 1; + return inter / (new Set([...A, ...B]).size || 1); +} + +function matchWithCandidates(provider, modelName, zenModels) { + const aliases = PROVIDER_OWNED_BY[provider] || [provider]; + const pool = zenModels.filter((z) => aliases.includes(z.vendor)); + const localNorm = normalize(modelName); + const localStripped = stripTail(localNorm); + + const exact = pool.filter((z) => z.model === modelName); + if (exact.length === 1) return { matched: exact[0], tier: "exact", candidates: exact }; + + const norm = pool.filter((z) => z.norm === localNorm); + if (norm.length === 1) return { matched: norm[0], tier: "normalized", candidates: norm }; + + const stripped = pool.filter((z) => z.stripped === localStripped); + if (stripped.length === 1) return { matched: stripped[0], tier: "stripped", candidates: stripped }; + + const ranked = pool + .map((z) => ({ z, score: jaccard(localNorm, z.norm) })) + .filter((x) => x.score >= 0.25) + .sort((a, b) => b.score - a.score) + .slice(0, 5) + .map((x) => x.z); + + if (ranked.length === 1) return { matched: ranked[0], tier: "similar", candidates: ranked }; + return { matched: null, tier: ranked.length ? "ambiguous" : "none", candidates: ranked }; +} + +function fmt(v) { + if (v === undefined) return "(缺省)"; + return `\`${JSON.stringify(v)}\``; +} + +function quoteCsv(arr) { + if (!arr.length) return "(none)"; + return arr.map((x) => `\`${x}\``).join("、"); +} + +function buildRows(doc, model, match) { + const rows = []; + const z = match.matched; + const currency = doc.priceCurrency || "USD"; + + rows.push({ + field: "modelName", + current: model.modelName, + suggested: z ? z.model : model.modelName, + decision: z && match.tier === "exact" ? "保持" : "待确认", + reason: z ? `ZenMux匹配(${match.tier}): ${z.id}` : "ZenMux无稳定匹配", + }); + + rows.push({ + field: "displayName", + current: model.displayName, + suggested: model.displayName, + decision: "保持", + reason: "展示字段,需按产品命名策略", + }); + + rows.push({ + field: "serviceType", + current: model.serviceType, + suggested: model.serviceType, + decision: "保持", + reason: "服务路由字段,优先本项目约定", + }); + + const trustedContextMatch = ["exact", "normalized", "stripped"].includes(match.tier); + if (z && typeof z.context === "number" && trustedContextMatch) { + const ratio = typeof model.contextWindow === "number" ? Math.abs(model.contextWindow - z.context) / Math.max(model.contextWindow, z.context) : 1; + const sameScale = ratio <= 0.03; + rows.push({ + field: "contextWindow", + current: model.contextWindow, + suggested: sameScale ? model.contextWindow : z.context, + decision: sameScale ? "保持" : "建议修改", + reason: sameScale ? `ZenMux(${z.id})口径近似(≤3%)` : `ZenMux(${z.id})提供明确context_length=${z.context}`, + }); + } else { + rows.push({ + field: "contextWindow", + current: model.contextWindow, + suggested: model.contextWindow, + decision: "待确认", + reason: z && typeof z.context === "number" + ? `ZenMux命中(${match.tier})但匹配置信不足,不直接覆盖context` + : "ZenMux无context可用,需官方规格页确认", + }); + } + + rows.push({ + field: "maxOutputTokens", + current: model.maxOutputTokens, + suggested: model.maxOutputTokens, + decision: "待确认", + reason: "ZenMux列表未提供统一max output字段,需官方模型详情页", + }); + + const canPriceFromZen = z && z.prompt && z.completion && z.prompt.unit === "perMTokens" && z.prompt.currency === "USD" && z.completion.unit === "perMTokens" && z.completion.currency === "USD"; + if (canPriceFromZen && currency === "USD" && (match.tier === "exact" || match.tier === "normalized")) { + rows.push({ + field: "inputPrice", + current: model.inputPrice, + suggested: z.prompt.value, + decision: model.inputPrice === z.prompt.value ? "保持" : "建议修改", + reason: `ZenMux(${z.id}) prompt=${z.prompt.value} USD/MTokens`, + }); + rows.push({ + field: "outputPrice", + current: model.outputPrice, + suggested: z.completion.value, + decision: model.outputPrice === z.completion.value ? "保持" : "建议修改", + reason: `ZenMux(${z.id}) completion=${z.completion.value} USD/MTokens`, + }); + } else { + rows.push({ + field: "inputPrice", + current: model.inputPrice, + suggested: model.inputPrice, + decision: "待确认", + reason: canPriceFromZen + ? `本文件币种为${currency},ZenMux价格为USD,需官方价格页复核` + : "ZenMux无稳定价格可用,需官方价格页复核", + }); + rows.push({ + field: "outputPrice", + current: model.outputPrice, + suggested: model.outputPrice, + decision: "待确认", + reason: canPriceFromZen + ? `本文件币种为${currency},ZenMux价格为USD,需官方价格页复核` + : "ZenMux无稳定价格可用,需官方价格页复核", + }); + } + + rows.push({ + field: "capabilities", + current: model.capabilities, + suggested: model.capabilities, + decision: typeof z?.reasoning === "boolean" ? "待确认" : "保持", + reason: typeof z?.reasoning === "boolean" + ? `ZenMux给出reasoning=${z.reasoning},但capabilities是项目语义字段,需官方能力说明复核` + : "ZenMux无明确能力映射差异", + }); + + rows.push({ + field: "defaultTemperature", + current: model.defaultTemperature, + suggested: model.defaultTemperature, + decision: "待确认", + reason: "官方通常不提供默认采样参数", + }); + + rows.push({ + field: "defaultTopP", + current: model.defaultTopP, + suggested: model.defaultTopP, + decision: "待确认", + reason: "官方通常不提供默认采样参数", + }); + + rows.push({ + field: "extra", + current: model.extra, + suggested: model.extra, + decision: "待确认", + reason: "扩展字段为本地schema,需业务侧定义", + }); + + return rows; +} + +async function listFiles() { + const out = []; + for (const dir of TARGET_DIRS) { + for (const f of await fs.readdir(dir)) { + if (!f.endsWith(".json") || f === "_index.json") continue; + out.push(path.join(dir, f)); + } + } + return out.sort(); +} + +function folderByJson(relPath) { + const base = path.basename(relPath, ".json"); + return path.join(OUT_ROOT, base); +} + +async function main() { + const zraw = JSON.parse(await fs.readFile(ZENMUX_FILE, "utf8")); + const zen = (zraw.data || []).map(parseZen); + const files = await listFiles(); + const generatedAt = new Date().toISOString(); + await fs.mkdir(OUT_ROOT, { recursive: true }); + + const global = []; + + for (const abs of files) { + const rel = path.relative(ROOT, abs); + const doc = JSON.parse(await fs.readFile(abs, "utf8")); + const provider = doc.provider || path.basename(abs, ".json"); + const models = Array.isArray(doc.models) ? doc.models : []; + const outDir = folderByJson(rel); + await fs.mkdir(outDir, { recursive: true }); + + const detailed = []; + const unresolved = []; + detailed.push(`# 详细字段取值表 - ${rel}`); + detailed.push(""); + detailed.push(`- provider: \`${provider}\``); + detailed.push(`- priceCurrency: \`${doc.priceCurrency || "USD"}\``); + detailed.push(`- generatedAt: \`${generatedAt}\``); + detailed.push(""); + detailed.push("## 来源"); + detailed.push(""); + for (const d of OFFICIAL_DOCS[provider] || ["(待补充provider官方文档)"]) detailed.push(`- ${d}`); + detailed.push("- https://zenmux.ai/models"); + detailed.push("- https://zenmux.ai/api/v1/models"); + detailed.push(""); + + unresolved.push(`# 未确认字段报告 - ${rel}`); + unresolved.push(""); + unresolved.push(`- provider: \`${provider}\``); + unresolved.push(`- generatedAt: \`${generatedAt}\``); + unresolved.push(""); + + for (const m of models) { + const match = matchWithCandidates(provider, m.modelName, zen); + const rows = buildRows(doc, m, match); + detailed.push(`## ${m.modelName}`); + detailed.push(""); + detailed.push(`- ZenMux匹配级别: \`${match.tier}\``); + if (match.matched) detailed.push(`- ZenMux命中: \`${match.matched.id}\``); + detailed.push(`- ZenMux候选: ${quoteCsv((match.candidates || []).map((x) => x.id))}`); + detailed.push(""); + detailed.push("| 字段 | 当前值 | 建议值 | 结论 | 依据/说明 |"); + detailed.push("|---|---|---|---|---|"); + for (const r of rows) { + detailed.push(`| \`${r.field}\` | ${fmt(r.current)} | ${fmt(r.suggested)} | ${r.decision} | ${r.reason} |`); + } + detailed.push(""); + + const pending = rows.filter((r) => r.decision === "待确认"); + if (pending.length) { + unresolved.push(`## ${m.modelName}`); + unresolved.push(""); + for (const p of pending) unresolved.push(`- \`${p.field}\`: ${p.reason}`); + unresolved.push(""); + } + } + + if (unresolved.length === 3) { + unresolved.push("- (none)"); + unresolved.push(""); + } + + const detailedFile = path.join(outDir, "详细字段取值表.md"); + const unresolvedFile = path.join(outDir, "未确认字段报告.md"); + await fs.writeFile(detailedFile, `${detailed.join("\n")}\n`, "utf8"); + await fs.writeFile(unresolvedFile, `${unresolved.join("\n")}\n`, "utf8"); + + global.push({ + file: rel, + folder: path.relative(ROOT, outDir), + detailed: path.relative(ROOT, detailedFile), + unresolved: path.relative(ROOT, unresolvedFile), + modelCount: models.length, + }); + } + + await fs.writeFile( + path.join(OUT_ROOT, "目录索引.json"), + `${JSON.stringify(global, null, 2)}\n`, + "utf8" + ); + console.log(JSON.stringify({ files: global.length, out: OUT_ROOT }, null, 2)); +} + +await main(); diff --git a/tools/batch_update_model_jsons.mjs b/tools/batch_update_model_jsons.mjs index 0c449ba..4b6ab83 100644 --- a/tools/batch_update_model_jsons.mjs +++ b/tools/batch_update_model_jsons.mjs @@ -1,277 +1,3 @@ -import fs from "node:fs/promises"; -import path from "node:path"; - -const ROOT = "/Users/xieyuanxiang/config-center"; -const ZENMUX_FILE = "/tmp/zenmux-models.json"; -const REPORT_DIR = path.join(ROOT, "字段取值表"); - -const TARGET_DIRS = [ - path.join(ROOT, "compute", "providers"), - path.join(ROOT, "compute", "coding-plans"), -]; - -const PROVIDER_OWNED_BY = { - openai: ["openai"], - anthropic: ["anthropic"], - deepseek: ["deepseek"], - google: ["google"], - moonshot: ["moonshotai"], - zhipu: ["z-ai"], - "zhipu-embedding": ["z-ai"], - dashscope: ["qwen"], - minimax: ["minimax"], - baidu: ["baidu"], - tencent: ["tencent"], - volcengine: ["bytedance", "volcengine"], - xai: ["x-ai"], - mistral: ["mistralai"], - kwai: ["kuaishou"], - siliconflow: ["qwen", "baai"], - cohere: ["cohere"], - perplexity: ["perplexity"], -}; - -const OFFICIAL_DOCS = { - openai: ["https://platform.openai.com/docs/models", "https://platform.openai.com/docs/pricing"], - anthropic: ["https://docs.anthropic.com/en/docs/about-claude/models/all-models", "https://docs.anthropic.com/en/docs/about-claude/pricing"], - deepseek: ["https://api-docs.deepseek.com/quick_start/pricing"], - google: ["https://ai.google.dev/gemini-api/docs/models", "https://ai.google.dev/pricing"], - moonshot: ["https://platform.moonshot.cn/docs/pricing/chat"], - zhipu: ["https://docs.bigmodel.cn/cn/guide/models/text/", "https://www.bigmodel.cn/pricing"], - dashscope: ["https://help.aliyun.com/zh/model-studio/getting-started/models", "https://help.aliyun.com/zh/model-studio/pricing"], - minimax: ["https://platform.minimax.io/docs/guides/pricing-paygo"], - baidu: ["https://cloud.baidu.com/doc/qianfan/"], - tencent: ["https://cloud.tencent.com/document/product/1729"], - volcengine: ["https://www.volcengine.com/docs/82379"], - xai: ["https://docs.x.ai/docs/models"], - mistral: ["https://docs.mistral.ai/getting-started/models", "https://mistral.ai/pricing"], - cohere: ["https://docs.cohere.com/docs/models", "https://cohere.com/pricing"], - siliconflow: ["https://www.siliconflow.com/models", "https://siliconflow.cn/pricing"], - perplexity: ["https://docs.perplexity.ai"], -}; - -function normalize(s) { - return String(s || "") - .toLowerCase() - .replace(/[._/]/g, "-") - .replace(/[^a-z0-9-]/g, "") - .replace(/-+/g, "-") - .replace(/^-|-$/g, ""); -} - -function stripTail(s) { - return s - .replace(/-(latest|preview|exp|experimental|stable)$/g, "") - .replace(/-\d{8}$/g, "") - .replace(/-\d{6}$/g, "") - .replace(/-\d{4}-\d{2}-\d{2}$/g, ""); -} - -function parseZenModel(m) { - const [vendor, ...rest] = String(m.id).split("/"); - const model = rest.join("/"); - const norm = normalize(model); - return { - id: m.id, - vendor, - model, - norm, - stripped: stripTail(norm), - context: m.context_length, - reasoning: m.capabilities?.reasoning, - prompt: m.pricings?.prompt?.[0], - completion: m.pricings?.completion?.[0], - }; -} - -function matchModel(provider, modelName, zenModels) { - const aliases = PROVIDER_OWNED_BY[provider] || [provider]; - const pool = zenModels.filter((m) => aliases.includes(m.vendor)); - - const localNorm = normalize(modelName); - const localStripped = stripTail(localNorm); - - const exact = pool.filter((m) => m.model === modelName); - if (exact.length === 1) return { tier: "exact", model: exact[0] }; - - const norm = pool.filter((m) => m.norm === localNorm); - if (norm.length === 1) return { tier: "normalized", model: norm[0] }; - - const stripped = pool.filter((m) => m.stripped === localStripped); - if (stripped.length === 1) return { tier: "stripped", model: stripped[0] }; - - const ranked = pool - .map((m) => { - const tokensA = new Set(localNorm.split("-").filter(Boolean)); - const tokensB = new Set(m.norm.split("-").filter(Boolean)); - let inter = 0; - for (const t of tokensA) if (tokensB.has(t)) inter += 1; - const union = new Set([...tokensA, ...tokensB]).size || 1; - return { m, score: inter / union }; - }) - .filter((x) => x.score >= 0.35) - .sort((a, b) => b.score - a.score) - .slice(0, 3); - - if (ranked.length === 1) return { tier: "similar", model: ranked[0].m }; - if (ranked.length > 1) return { tier: "ambiguous", candidates: ranked.map((x) => x.m.id) }; - return { tier: "none" }; -} - -function isPriceUsable(entry) { - return entry && entry.unit === "perMTokens" && entry.currency === "USD" && typeof entry.value === "number"; -} - -function contextShouldUpdate(local, remote) { - if (typeof remote !== "number") return false; - if (typeof local !== "number") return true; - if (local === remote) return false; - const ratio = Math.abs(local - remote) / Math.max(local, remote); - return ratio > 0.03; -} - -async function listJsonFiles() { - const files = []; - for (const dir of TARGET_DIRS) { - for (const f of await fs.readdir(dir)) { - if (!f.endsWith(".json") || f === "_index.json") continue; - files.push(path.join(dir, f)); - } - } - return files.sort(); -} - -function reportNameFromPath(rel) { - return rel.replaceAll("/", "__").replaceAll(".json", ""); -} - -async function main() { - const raw = JSON.parse(await fs.readFile(ZENMUX_FILE, "utf8")); - const zenModels = (raw.data || []).map(parseZenModel); - const files = await listJsonFiles(); - await fs.mkdir(REPORT_DIR, { recursive: true }); - - const summary = []; - - for (const abs of files) { - const rel = path.relative(ROOT, abs); - const doc = JSON.parse(await fs.readFile(abs, "utf8")); - const provider = doc.provider || path.basename(abs, ".json"); - const priceCurrency = doc.priceCurrency || "USD"; - const models = Array.isArray(doc.models) ? doc.models : []; - - const changed = []; - const unresolved = []; - let fileChanged = false; - - for (const model of models) { - const mm = matchModel(provider, model.modelName, zenModels); - if (!mm.model) { - unresolved.push({ - modelName: model.modelName, - reason: mm.tier === "ambiguous" ? `ambiguous:${(mm.candidates || []).join(",")}` : "no-zenmux-match", - }); - continue; - } - const z = mm.model; - const fieldsChanged = []; - - if (contextShouldUpdate(model.contextWindow, z.context)) { - const before = model.contextWindow; - model.contextWindow = z.context; - fieldsChanged.push(`contextWindow:${before}->${z.context}`); - } - - const allowPrice = priceCurrency === "USD" && (mm.tier === "exact" || mm.tier === "normalized"); - if (allowPrice && isPriceUsable(z.prompt) && model.inputPrice !== z.prompt.value) { - const before = model.inputPrice; - model.inputPrice = z.prompt.value; - fieldsChanged.push(`inputPrice:${before}->${z.prompt.value}`); - } else if (!allowPrice && model.inputPrice !== undefined) { - unresolved.push({ - modelName: model.modelName, - reason: `price-not-updated(currency=${priceCurrency},match=${mm.tier})`, - }); - } - - if (allowPrice && isPriceUsable(z.completion) && model.outputPrice !== z.completion.value) { - const before = model.outputPrice; - model.outputPrice = z.completion.value; - fieldsChanged.push(`outputPrice:${before}->${z.completion.value}`); - } - - if (fieldsChanged.length) { - fileChanged = true; - changed.push({ - modelName: model.modelName, - zenmux: z.id, - matchTier: mm.tier, - fieldsChanged, - }); - } else { - unresolved.push({ - modelName: model.modelName, - reason: `matched-no-change(${z.id},${mm.tier})`, - }); - } - } - - if (fileChanged) { - await fs.writeFile(abs, `${JSON.stringify(doc, null, 2)}\n`, "utf8"); - } - - const reportFile = path.join(REPORT_DIR, `${reportNameFromPath(rel)}-未确认字段报告.md`); - const lines = []; - lines.push(`# 未确认字段报告 - ${rel}`); - lines.push(""); - lines.push(`- provider: \`${provider}\``); - lines.push(`- priceCurrency: \`${priceCurrency}\``); - lines.push(`- changedModels: **${changed.length}**`); - lines.push(`- unresolvedItems: **${unresolved.length}**`); - lines.push(""); - lines.push("## 官方来源"); - lines.push(""); - const docs = OFFICIAL_DOCS[provider] || []; - if (docs.length) { - for (const d of docs) lines.push(`- ${d}`); - } else { - lines.push("- (待补充该 provider 官方文档)"); - } - lines.push("- https://zenmux.ai/models"); - lines.push("- https://zenmux.ai/api/v1/models"); - lines.push(""); - lines.push("## 已修改"); - lines.push(""); - if (!changed.length) { - lines.push("- (none)"); - } else { - for (const c of changed) { - lines.push(`- \`${c.modelName}\` <= \`${c.zenmux}\` [${c.matchTier}]`); - for (const f of c.fieldsChanged) lines.push(` - ${f}`); - } - } - lines.push(""); - lines.push("## 未确认/未修改"); - lines.push(""); - if (!unresolved.length) { - lines.push("- (none)"); - } else { - for (const u of unresolved) lines.push(`- \`${u.modelName}\`: ${u.reason}`); - } - lines.push(""); - await fs.writeFile(reportFile, `${lines.join("\n")}\n`, "utf8"); - - summary.push({ - file: rel, - changedModels: changed.length, - unresolvedItems: unresolved.length, - report: path.relative(ROOT, reportFile), - }); - } - - const summaryFile = path.join(REPORT_DIR, "全量处理汇总-2026-04-23.json"); - await fs.writeFile(summaryFile, `${JSON.stringify(summary, null, 2)}\n`, "utf8"); - console.log(JSON.stringify({ processedFiles: summary.length, summaryFile }, null, 2)); -} - -await main(); +// Retired: third-party snapshots must never update authoritative presets. +console.error('This legacy ZenMux tool is retired. See tools/README.md and docs/model-sources/MAINTENANCE.md. No files were read or written.'); +process.exitCode = 1; diff --git a/tools/generate_current_audit_artifacts.mjs b/tools/generate_current_audit_artifacts.mjs index ce18aa9..4b6ab83 100644 --- a/tools/generate_current_audit_artifacts.mjs +++ b/tools/generate_current_audit_artifacts.mjs @@ -1,531 +1,3 @@ -import fs from "node:fs/promises"; -import path from "node:path"; - -const ROOT = process.env.CONFIG_CENTER_ROOT || process.cwd(); -const ZENMUX_FILE = process.env.ZENMUX_FILE || "/tmp/zenmux-models.json"; -const FIELD_TABLE_DIR = path.join(ROOT, "字段取值表"); -const OUTPUT_DIR = path.join(ROOT, "outputs", "field-audit"); - -const TARGET_DIRS = [ - path.join(ROOT, "compute", "providers"), - path.join(ROOT, "compute", "coding-plans"), -]; - -const PROVIDER_OWNED_BY = { - openai: ["openai"], - anthropic: ["anthropic"], - deepseek: ["deepseek"], - google: ["google"], - moonshot: ["moonshotai"], - zhipu: ["z-ai"], - "zhipu-embedding": ["z-ai"], - dashscope: ["qwen"], - minimax: ["minimax"], - baidu: ["baidu"], - tencent: ["tencent"], - volcengine: ["bytedance", "volcengine"], - xai: ["x-ai"], - mistral: ["mistralai"], - kwai: ["kuaishou"], - siliconflow: ["qwen", "baai"], - cohere: ["cohere"], - perplexity: ["perplexity"], -}; - -const OFFICIAL_DOCS = { - openai: ["https://platform.openai.com/docs/models", "https://platform.openai.com/docs/pricing"], - anthropic: ["https://docs.anthropic.com/en/docs/about-claude/models/all-models", "https://docs.anthropic.com/en/docs/about-claude/pricing"], - deepseek: ["https://api-docs.deepseek.com/quick_start/pricing"], - google: ["https://ai.google.dev/gemini-api/docs/models", "https://ai.google.dev/pricing"], - moonshot: ["https://platform.moonshot.cn/docs/guide/overview", "https://platform.moonshot.cn/docs/pricing/chat"], - zhipu: ["https://docs.bigmodel.cn/cn/guide/models/text/", "https://www.bigmodel.cn/pricing"], - "zhipu-embedding": ["https://docs.bigmodel.cn/cn/guide/models/embedding"], - dashscope: ["https://help.aliyun.com/zh/model-studio/getting-started/models", "https://help.aliyun.com/zh/model-studio/pricing"], - minimax: ["https://platform.minimax.io/docs/api-reference/api-overview", "https://platform.minimax.io/docs/guides/pricing-paygo"], - baichuan: ["https://platform.baichuan-ai.com/docs"], - baidu: ["https://cloud.baidu.com/doc/qianfan/"], - tencent: ["https://cloud.tencent.com/document/product/1729"], - volcengine: ["https://www.volcengine.com/docs/82379"], - xai: ["https://docs.x.ai/docs/models"], - mistral: ["https://docs.mistral.ai/getting-started/models", "https://mistral.ai/pricing"], - cohere: ["https://docs.cohere.com/docs/models", "https://cohere.com/pricing"], - siliconflow: ["https://www.siliconflow.com/models", "https://siliconflow.cn/pricing"], - perplexity: ["https://docs.perplexity.ai"], - openrouter: ["https://openrouter.ai/models"], - xunfei: ["https://www.xfyun.cn/doc/"], -}; - -function normalize(value) { - return String(value || "") - .toLowerCase() - .replace(/[._/]/g, "-") - .replace(/[^a-z0-9-]/g, "") - .replace(/-+/g, "-") - .replace(/^-|-$/g, ""); -} - -function stripTail(value) { - return value - .replace(/-(latest|preview|exp|experimental|stable)$/g, "") - .replace(/-\d{8}$/g, "") - .replace(/-\d{6}$/g, "") - .replace(/-\d{4}-\d{2}-\d{2}$/g, ""); -} - -function parseZenMuxModel(model) { - const [vendor, ...rest] = String(model.id || "").split("/"); - const name = rest.join("/"); - const norm = normalize(name); - return { - id: model.id, - vendor, - modelName: name, - norm, - stripped: stripTail(norm), - contextWindow: model.context_length, - reasoning: model.capabilities?.reasoning, - prompt: model.pricings?.prompt?.[0], - completion: model.pricings?.completion?.[0], - }; -} - -function jaccard(left, right) { - const a = new Set(left.split("-").filter(Boolean)); - const b = new Set(right.split("-").filter(Boolean)); - let overlap = 0; - for (const item of a) if (b.has(item)) overlap += 1; - return overlap / (new Set([...a, ...b]).size || 1); -} - -function matchModel(provider, modelName, zenModels) { - const owners = PROVIDER_OWNED_BY[provider] || [provider]; - const pool = zenModels.filter((model) => owners.includes(model.vendor)); - const localNorm = normalize(modelName); - const localStripped = stripTail(localNorm); - - const exact = pool.filter((model) => model.modelName === modelName); - if (exact.length === 1) return { tier: "exact", matched: exact[0], candidates: exact }; - - const normalized = pool.filter((model) => model.norm === localNorm); - if (normalized.length === 1) return { tier: "normalized", matched: normalized[0], candidates: normalized }; - - const stripped = pool.filter((model) => model.stripped === localStripped); - if (stripped.length === 1) return { tier: "stripped", matched: stripped[0], candidates: stripped }; - - const candidates = pool - .map((model) => ({ model, score: jaccard(localNorm, model.norm) })) - .filter((item) => item.score >= 0.35) - .sort((a, b) => b.score - a.score) - .slice(0, 5) - .map((item) => item.model); - - if (candidates.length === 1) return { tier: "similar", matched: candidates[0], candidates }; - return { tier: candidates.length ? "ambiguous" : "none", matched: null, candidates }; -} - -function formatValue(value) { - if (value === undefined) return "(缺省)"; - return `\`${JSON.stringify(value)}\``; -} - -function formatList(values) { - if (!values?.length) return "(none)"; - return values.map((value) => `\`${value}\``).join("、"); -} - -function reportFolderName(relativePath) { - return relativePath - .replace(/^compute\//, "") - .replaceAll("/", "__") - .replace(/\.json$/, ""); -} - -async function listJsonFiles() { - const files = []; - for (const dir of TARGET_DIRS) { - for (const fileName of await fs.readdir(dir)) { - if (!fileName.endsWith(".json") || fileName.startsWith("_")) continue; - files.push(path.join(dir, fileName)); - } - } - return files.sort(); -} - -async function readZenMuxModels() { - try { - const raw = JSON.parse(await fs.readFile(ZENMUX_FILE, "utf8")); - return (raw.data || []).map(parseZenMuxModel); - } catch { - return []; - } -} - -function buildFieldRows(doc, model, match) { - const z = match.matched; - return [ - { - field: "modelName", - current: model.modelName, - suggested: z ? z.modelName : model.modelName, - decision: z && ["exact", "normalized"].includes(match.tier) ? "保持" : "待确认", - reason: z ? `ZenMux匹配(${match.tier}): ${z.id}` : "ZenMux无稳定匹配,需官方文档确认", - }, - { - field: "displayName", - current: model.displayName, - suggested: model.displayName, - decision: "保持", - reason: "展示字段,以本项目产品命名策略为准", - }, - { - field: "serviceType", - current: model.serviceType, - suggested: model.serviceType, - decision: "保持", - reason: "服务路由字段,以本项目分类约定为准", - }, - { - field: "contextWindow", - current: model.contextWindow, - suggested: z?.contextWindow ?? model.contextWindow, - decision: typeof z?.contextWindow === "number" ? "待确认" : "待确认", - reason: typeof z?.contextWindow === "number" - ? `ZenMux给出context_length=${z.contextWindow},最终以官方模型规格页确认` - : "ZenMux无context可用,需官方规格页确认", - }, - { - field: "maxOutputTokens", - current: model.maxOutputTokens, - suggested: model.maxOutputTokens, - decision: "待确认", - reason: "ZenMux列表未提供统一max output字段,需官方模型详情页确认", - }, - { - field: "inputPrice", - current: model.inputPrice, - suggested: model.inputPrice, - decision: "待确认", - reason: `当前文件币种为${doc.priceCurrency || "USD"},价格需官方价格页确认`, - }, - { - field: "outputPrice", - current: model.outputPrice, - suggested: model.outputPrice, - decision: "待确认", - reason: `当前文件币种为${doc.priceCurrency || "USD"},价格需官方价格页确认`, - }, - { - field: "capabilities", - current: model.capabilities, - suggested: model.capabilities, - decision: "保持", - reason: "能力标签是本项目语义字段,不直接由第三方列表覆盖", - }, - { - field: "defaultTemperature", - current: model.defaultTemperature, - suggested: model.defaultTemperature, - decision: model.defaultTemperature === null ? "建议修改" : "保持", - reason: model.defaultTemperature === null - ? "schema拒绝null;不支持采样参数时应省略字段" - : "当前值与schema兼容;是否采用默认采样值需官方文档确认", - }, - { - field: "defaultTopP", - current: model.defaultTopP, - suggested: model.defaultTopP, - decision: model.defaultTopP === null ? "建议修改" : "保持", - reason: model.defaultTopP === null - ? "schema拒绝null;不支持采样参数时应省略字段" - : "当前值与schema兼容;是否采用默认采样值需官方文档确认", - }, - { - field: "extra", - current: model.extra, - suggested: model.extra, - decision: "待确认", - reason: "扩展字段为本项目schema,需按业务含义和官方补充信息复核", - }, - ]; -} - -async function main() { - const generatedAt = new Date().toISOString(); - const zenModels = await readZenMuxModels(); - const files = await listJsonFiles(); - await fs.mkdir(FIELD_TABLE_DIR, { recursive: true }); - await fs.mkdir(OUTPUT_DIR, { recursive: true }); - - const allModels = []; - const skipped = []; - const pendingByProvider = new Map(); - const fieldIndex = []; - const nullSampling = []; - - for (const absolutePath of files) { - const relativePath = path.relative(ROOT, absolutePath); - const doc = JSON.parse(await fs.readFile(absolutePath, "utf8")); - const provider = doc.provider || path.basename(absolutePath, ".json"); - const outDir = path.join(FIELD_TABLE_DIR, reportFolderName(relativePath)); - await fs.mkdir(outDir, { recursive: true }); - - const detailed = [ - `# 详细字段取值表 - ${relativePath}`, - "", - `- provider: \`${provider}\``, - `- priceCurrency: \`${doc.priceCurrency || "USD"}\``, - `- generatedAt: \`${generatedAt}\``, - "", - "## 来源", - "", - ...(OFFICIAL_DOCS[provider] || ["(待补充provider官方文档)"]).map((item) => `- ${item}`), - "- https://zenmux.ai/models", - "- https://zenmux.ai/api/v1/models", - "", - ]; - const unresolved = [ - `# 未确认字段报告 - ${relativePath}`, - "", - `- provider: \`${provider}\``, - `- generatedAt: \`${generatedAt}\``, - "", - ]; - - const models = Array.isArray(doc.models) ? doc.models : []; - for (const model of models) { - const match = matchModel(provider, model.modelName, zenModels); - const rows = buildFieldRows(doc, model, match); - const status = match.matched - ? `matched-${match.tier}` - : match.tier === "ambiguous" ? "ambiguous" : "no-match"; - - allModels.push({ - file: relativePath, - provider, - modelName: model.modelName, - displayName: model.displayName, - serviceType: model.serviceType, - capabilities: model.capabilities, - contextWindow: model.contextWindow, - maxOutputTokens: model.maxOutputTokens, - inputPrice: model.inputPrice, - outputPrice: model.outputPrice, - defaultTemperature: model.defaultTemperature, - defaultTopP: model.defaultTopP, - matchTier: match.tier, - zenmux: match.matched?.id ?? null, - }); - - if (model.defaultTemperature === null) nullSampling.push(`${relativePath}::${model.modelName}::defaultTemperature`); - if (model.defaultTopP === null) nullSampling.push(`${relativePath}::${model.modelName}::defaultTopP`); - - skipped.push({ - file: relativePath, - provider, - modelName: model.modelName, - reason: status, - zenmux: match.matched?.id ?? null, - candidates: match.candidates.map((item) => item.id), - }); - - if (!match.matched || match.tier === "ambiguous") { - const bucket = pendingByProvider.get(provider) || []; - bucket.push({ - file: relativePath, - modelName: model.modelName, - reason: match.tier === "ambiguous" - ? `ambiguous match candidates: ${match.candidates.map((item) => item.id).join(",")}` - : "no ZenMux match", - }); - pendingByProvider.set(provider, bucket); - } - - detailed.push(`## ${model.modelName}`); - detailed.push(""); - detailed.push(`- ZenMux匹配级别: \`${match.tier}\``); - if (match.matched) detailed.push(`- ZenMux命中: \`${match.matched.id}\``); - detailed.push(`- ZenMux候选: ${formatList(match.candidates.map((item) => item.id))}`); - detailed.push(""); - detailed.push("| 字段 | 当前值 | 建议值 | 结论 | 依据/说明 |"); - detailed.push("|---|---|---|---|---|"); - for (const row of rows) { - detailed.push(`| \`${row.field}\` | ${formatValue(row.current)} | ${formatValue(row.suggested)} | ${row.decision} | ${row.reason} |`); - } - detailed.push(""); - - const pendingRows = rows.filter((row) => row.decision === "待确认" || row.decision === "建议修改"); - if (pendingRows.length) { - unresolved.push(`## ${model.modelName}`); - unresolved.push(""); - for (const row of pendingRows) unresolved.push(`- \`${row.field}\`: ${row.reason}`); - unresolved.push(""); - } - } - - if (unresolved.length === 4) { - unresolved.push("- (none)"); - unresolved.push(""); - } - - const detailedFile = path.join(outDir, "详细字段取值表.md"); - const unresolvedFile = path.join(outDir, "未确认字段报告.md"); - await fs.writeFile(detailedFile, `${detailed.join("\n")}\n`, "utf8"); - await fs.writeFile(unresolvedFile, `${unresolved.join("\n")}\n`, "utf8"); - fieldIndex.push({ - file: relativePath, - provider, - modelCount: models.length, - folder: path.relative(ROOT, outDir), - detailed: path.relative(ROOT, detailedFile), - unresolved: path.relative(ROOT, unresolvedFile), - }); - } - - const matchedModels = allModels.filter((item) => item.zenmux).length; - const summary = { - actualModels: allModels.length, - sourceModels: zenModels.length, - matchedModels, - unmatchedModels: allModels.filter((item) => item.matchTier === "none").length, - ambiguousModels: allModels.filter((item) => item.matchTier === "ambiguous").length, - nullSamplingFields: nullSampling.length, - updatedModels: 0, - updatedFiles: 0, - skippedModels: allModels.length, - }; - - await fs.writeFile( - path.join(FIELD_TABLE_DIR, "目录索引.json"), - `${JSON.stringify(fieldIndex, null, 2)}\n`, - "utf8", - ); - - const reportJson = { - source: ZENMUX_FILE, - generatedAt, - summary, - updated: [], - skipped, - models: allModels, - nullSampling, - }; - await fs.writeFile( - path.join(OUTPUT_DIR, "zenmux-sync-report.json"), - `${JSON.stringify(reportJson, null, 2)}\n`, - "utf8", - ); - - const reportLines = [ - "# ZenMux Sync Report", - "", - `- source: \`${ZENMUX_FILE}\``, - `- generatedAt: \`${generatedAt}\``, - `- actualModels: **${summary.actualModels}**`, - `- sourceModels: **${summary.sourceModels}**`, - `- matchedModels: **${summary.matchedModels}**`, - `- unmatchedModels: **${summary.unmatchedModels}**`, - `- ambiguousModels: **${summary.ambiguousModels}**`, - `- nullSamplingFields: **${summary.nullSamplingFields}**`, - `- updatedModels: **${summary.updatedModels}**`, - `- updatedFiles: **${summary.updatedFiles}**`, - "", - "## Field Coverage", - "", - "- synced: none; this audit run is read-only and does not mutate JSON config.", - "- reviewed from JSON: `modelName`, `displayName`, `serviceType`, `contextWindow`, `maxOutputTokens`, `inputPrice`, `outputPrice`, `capabilities`, `defaultTemperature`, `defaultTopP`, `extra`.", - "- guardrail: `defaultTemperature` and `defaultTopP` must be omitted or numbers; `null` is invalid.", - "", - "## Updated Models", - "", - "- (none)", - "", - "## Skipped / Reviewed Models", - "", - ...skipped.map((item) => { - const detail = item.zenmux - ? `${item.reason}:${item.zenmux}` - : item.candidates.length ? `${item.reason}:${item.candidates.join(",")}` : item.reason; - return `- ${item.file} :: ${item.modelName} -> ${detail}`; - }), - "", - ]; - await fs.writeFile(path.join(OUTPUT_DIR, "zenmux-sync-report.md"), `${reportLines.join("\n")}\n`, "utf8"); - - const checklist = [ - "# Official Review Checklist", - "", - `GeneratedAt: ${generatedAt}`, - `Source: ${path.join(OUTPUT_DIR, "zenmux-sync-report.json")}`, - "", - "Purpose: verify unresolved models with official vendor docs before write-back.", - "", - "## Summary", - "", - `- actual models: **${summary.actualModels}**`, - `- unresolved models: **${summary.unmatchedModels + summary.ambiguousModels}**`, - `- providers involved: **${pendingByProvider.size}**`, - `- null sampling fields: **${summary.nullSamplingFields}**`, - "", - ]; - for (const [provider, items] of [...pendingByProvider.entries()].sort(([a], [b]) => a.localeCompare(b))) { - checklist.push(`## Provider: ${provider}`); - checklist.push("- official docs:"); - for (const doc of OFFICIAL_DOCS[provider] || ["(add link manually)"]) checklist.push(` - ${doc}`); - checklist.push("- pending models:"); - for (const item of items) checklist.push(` - \`${item.modelName}\` (${item.file}) -> ${item.reason}`); - checklist.push(""); - } - checklist.push("## Field-by-Field Verification Rule"); - checklist.push(""); - checklist.push("- `modelName`: must exactly match provider API model ID or official alias rule."); - checklist.push("- `contextWindow`: use official model spec limit."); - checklist.push("- `maxOutputTokens`: use official output cap; do not infer from context."); - checklist.push("- `inputPrice`/`outputPrice`: use official published API pricing and the provider currency."); - checklist.push("- `capabilities`: project taxonomy field; keep local semantics unless official docs clearly contradict the capability."); - checklist.push("- `defaultTemperature`/`defaultTopP`: only fill with numeric values when provider docs define a safe default; omit unsupported fields instead of using `null`."); - await fs.writeFile(path.join(OUTPUT_DIR, "official-review-checklist.md"), `${checklist.join("\n")}\n`, "utf8"); - - const riskLines = [ - "# ZenMux Risk Audit", - "", - `GeneratedAt: ${generatedAt}`, - `Source: ${path.join(OUTPUT_DIR, "zenmux-sync-report.json")}`, - "", - `- HIGH: ${summary.nullSamplingFields > 0 ? 1 : 0}`, - `- MEDIUM: ${summary.ambiguousModels}`, - `- LOW: ${summary.unmatchedModels}`, - "", - "## Notes", - "", - "- HIGH covers schema-breaking sampling defaults such as `null`.", - "- MEDIUM covers ambiguous third-party model matches.", - "- LOW covers models without a ZenMux match; these require official-doc review but do not by themselves indicate JSON invalidity.", - ]; - await fs.writeFile(path.join(OUTPUT_DIR, "zenmux-risk-audit.md"), `${riskLines.join("\n")}\n`, "utf8"); - - const detailedLines = [ - "# ZenMux Sync Detailed Report", - "", - `GeneratedAt: ${generatedAt}`, - "", - "## Summary", - "", - `- actualModels: ${summary.actualModels}`, - `- sourceModels: ${summary.sourceModels}`, - `- matchedModels: ${summary.matchedModels}`, - `- unmatchedModels: ${summary.unmatchedModels}`, - `- ambiguousModels: ${summary.ambiguousModels}`, - `- nullSamplingFields: ${summary.nullSamplingFields}`, - "", - "## Current Model Inventory", - "", - "| File | Provider | Model | Match | ZenMux |", - "|---|---|---|---|---|", - ...allModels.map((item) => `| ${item.file} | ${item.provider} | \`${item.modelName}\` | ${item.matchTier} | ${item.zenmux ? `\`${item.zenmux}\`` : ""} |`), - ]; - await fs.writeFile(path.join(OUTPUT_DIR, "zenmux-sync-detailed.md"), `${detailedLines.join("\n")}\n`, "utf8"); - - console.log(JSON.stringify({ generatedAt, summary, fieldTableFiles: fieldIndex.length }, null, 2)); -} - -await main(); +// Retired: third-party snapshots must never update authoritative presets. +console.error('This legacy ZenMux tool is retired. See tools/README.md and docs/model-sources/MAINTENANCE.md. No files were read or written.'); +process.exitCode = 1; diff --git a/tools/generate_field_tables_per_json.mjs b/tools/generate_field_tables_per_json.mjs index cafaf88..4b6ab83 100644 --- a/tools/generate_field_tables_per_json.mjs +++ b/tools/generate_field_tables_per_json.mjs @@ -1,371 +1,3 @@ -import fs from "node:fs/promises"; -import path from "node:path"; - -const ROOT = "/Users/xieyuanxiang/config-center"; -const OUT_ROOT = path.join(ROOT, "字段取值表"); -const ZENMUX_FILE = "/tmp/zenmux-models.json"; - -const TARGET_DIRS = [ - path.join(ROOT, "compute", "providers"), - path.join(ROOT, "compute", "coding-plans"), -]; - -const PROVIDER_OWNED_BY = { - openai: ["openai"], - anthropic: ["anthropic"], - deepseek: ["deepseek"], - google: ["google"], - moonshot: ["moonshotai"], - zhipu: ["z-ai"], - "zhipu-embedding": ["z-ai"], - dashscope: ["qwen"], - minimax: ["minimax"], - baidu: ["baidu"], - tencent: ["tencent"], - volcengine: ["bytedance", "volcengine"], - xai: ["x-ai"], - mistral: ["mistralai"], - kwai: ["kuaishou"], - siliconflow: ["qwen", "baai"], - cohere: ["cohere"], - perplexity: ["perplexity"], -}; - -const OFFICIAL_DOCS = { - openai: ["https://platform.openai.com/docs/models", "https://platform.openai.com/docs/pricing"], - anthropic: ["https://docs.anthropic.com/en/docs/about-claude/models/all-models", "https://docs.anthropic.com/en/docs/about-claude/pricing"], - deepseek: ["https://api-docs.deepseek.com/quick_start/pricing"], - google: ["https://ai.google.dev/gemini-api/docs/models", "https://ai.google.dev/pricing"], - moonshot: ["https://platform.moonshot.cn/docs/pricing/chat"], - zhipu: ["https://docs.bigmodel.cn/cn/guide/models/text/", "https://www.bigmodel.cn/pricing"], - dashscope: ["https://help.aliyun.com/zh/model-studio/getting-started/models", "https://help.aliyun.com/zh/model-studio/pricing"], - minimax: ["https://platform.minimax.io/docs/guides/pricing-paygo"], - baidu: ["https://cloud.baidu.com/doc/qianfan/"], - tencent: ["https://cloud.tencent.com/document/product/1729"], - volcengine: ["https://www.volcengine.com/docs/82379"], - xai: ["https://docs.x.ai/docs/models"], - mistral: ["https://docs.mistral.ai/getting-started/models", "https://mistral.ai/pricing"], - cohere: ["https://docs.cohere.com/docs/models", "https://cohere.com/pricing"], - siliconflow: ["https://www.siliconflow.com/models", "https://siliconflow.cn/pricing"], - perplexity: ["https://docs.perplexity.ai"], -}; - -function normalize(s) { - return String(s || "") - .toLowerCase() - .replace(/[._/]/g, "-") - .replace(/[^a-z0-9-]/g, "") - .replace(/-+/g, "-") - .replace(/^-|-$/g, ""); -} - -function stripTail(s) { - return s - .replace(/-(latest|preview|exp|experimental|stable)$/g, "") - .replace(/-\d{8}$/g, "") - .replace(/-\d{6}$/g, "") - .replace(/-\d{4}-\d{2}-\d{2}$/g, ""); -} - -function parseZen(m) { - const [vendor, ...rest] = String(m.id).split("/"); - const model = rest.join("/"); - const norm = normalize(model); - return { - id: m.id, - vendor, - model, - norm, - stripped: stripTail(norm), - context: m.context_length, - reasoning: m.capabilities?.reasoning, - prompt: m.pricings?.prompt?.[0], - completion: m.pricings?.completion?.[0], - }; -} - -function jaccard(a, b) { - const A = new Set(a.split("-").filter(Boolean)); - const B = new Set(b.split("-").filter(Boolean)); - let inter = 0; - for (const x of A) if (B.has(x)) inter += 1; - return inter / (new Set([...A, ...B]).size || 1); -} - -function matchWithCandidates(provider, modelName, zenModels) { - const aliases = PROVIDER_OWNED_BY[provider] || [provider]; - const pool = zenModels.filter((z) => aliases.includes(z.vendor)); - const localNorm = normalize(modelName); - const localStripped = stripTail(localNorm); - - const exact = pool.filter((z) => z.model === modelName); - if (exact.length === 1) return { matched: exact[0], tier: "exact", candidates: exact }; - - const norm = pool.filter((z) => z.norm === localNorm); - if (norm.length === 1) return { matched: norm[0], tier: "normalized", candidates: norm }; - - const stripped = pool.filter((z) => z.stripped === localStripped); - if (stripped.length === 1) return { matched: stripped[0], tier: "stripped", candidates: stripped }; - - const ranked = pool - .map((z) => ({ z, score: jaccard(localNorm, z.norm) })) - .filter((x) => x.score >= 0.25) - .sort((a, b) => b.score - a.score) - .slice(0, 5) - .map((x) => x.z); - - if (ranked.length === 1) return { matched: ranked[0], tier: "similar", candidates: ranked }; - return { matched: null, tier: ranked.length ? "ambiguous" : "none", candidates: ranked }; -} - -function fmt(v) { - if (v === undefined) return "(缺省)"; - return `\`${JSON.stringify(v)}\``; -} - -function quoteCsv(arr) { - if (!arr.length) return "(none)"; - return arr.map((x) => `\`${x}\``).join("、"); -} - -function buildRows(doc, model, match) { - const rows = []; - const z = match.matched; - const currency = doc.priceCurrency || "USD"; - - rows.push({ - field: "modelName", - current: model.modelName, - suggested: z ? z.model : model.modelName, - decision: z && match.tier === "exact" ? "保持" : "待确认", - reason: z ? `ZenMux匹配(${match.tier}): ${z.id}` : "ZenMux无稳定匹配", - }); - - rows.push({ - field: "displayName", - current: model.displayName, - suggested: model.displayName, - decision: "保持", - reason: "展示字段,需按产品命名策略", - }); - - rows.push({ - field: "serviceType", - current: model.serviceType, - suggested: model.serviceType, - decision: "保持", - reason: "服务路由字段,优先本项目约定", - }); - - const trustedContextMatch = ["exact", "normalized", "stripped"].includes(match.tier); - if (z && typeof z.context === "number" && trustedContextMatch) { - const ratio = typeof model.contextWindow === "number" ? Math.abs(model.contextWindow - z.context) / Math.max(model.contextWindow, z.context) : 1; - const sameScale = ratio <= 0.03; - rows.push({ - field: "contextWindow", - current: model.contextWindow, - suggested: sameScale ? model.contextWindow : z.context, - decision: sameScale ? "保持" : "建议修改", - reason: sameScale ? `ZenMux(${z.id})口径近似(≤3%)` : `ZenMux(${z.id})提供明确context_length=${z.context}`, - }); - } else { - rows.push({ - field: "contextWindow", - current: model.contextWindow, - suggested: model.contextWindow, - decision: "待确认", - reason: z && typeof z.context === "number" - ? `ZenMux命中(${match.tier})但匹配置信不足,不直接覆盖context` - : "ZenMux无context可用,需官方规格页确认", - }); - } - - rows.push({ - field: "maxOutputTokens", - current: model.maxOutputTokens, - suggested: model.maxOutputTokens, - decision: "待确认", - reason: "ZenMux列表未提供统一max output字段,需官方模型详情页", - }); - - const canPriceFromZen = z && z.prompt && z.completion && z.prompt.unit === "perMTokens" && z.prompt.currency === "USD" && z.completion.unit === "perMTokens" && z.completion.currency === "USD"; - if (canPriceFromZen && currency === "USD" && (match.tier === "exact" || match.tier === "normalized")) { - rows.push({ - field: "inputPrice", - current: model.inputPrice, - suggested: z.prompt.value, - decision: model.inputPrice === z.prompt.value ? "保持" : "建议修改", - reason: `ZenMux(${z.id}) prompt=${z.prompt.value} USD/MTokens`, - }); - rows.push({ - field: "outputPrice", - current: model.outputPrice, - suggested: z.completion.value, - decision: model.outputPrice === z.completion.value ? "保持" : "建议修改", - reason: `ZenMux(${z.id}) completion=${z.completion.value} USD/MTokens`, - }); - } else { - rows.push({ - field: "inputPrice", - current: model.inputPrice, - suggested: model.inputPrice, - decision: "待确认", - reason: canPriceFromZen - ? `本文件币种为${currency},ZenMux价格为USD,需官方价格页复核` - : "ZenMux无稳定价格可用,需官方价格页复核", - }); - rows.push({ - field: "outputPrice", - current: model.outputPrice, - suggested: model.outputPrice, - decision: "待确认", - reason: canPriceFromZen - ? `本文件币种为${currency},ZenMux价格为USD,需官方价格页复核` - : "ZenMux无稳定价格可用,需官方价格页复核", - }); - } - - rows.push({ - field: "capabilities", - current: model.capabilities, - suggested: model.capabilities, - decision: typeof z?.reasoning === "boolean" ? "待确认" : "保持", - reason: typeof z?.reasoning === "boolean" - ? `ZenMux给出reasoning=${z.reasoning},但capabilities是项目语义字段,需官方能力说明复核` - : "ZenMux无明确能力映射差异", - }); - - rows.push({ - field: "defaultTemperature", - current: model.defaultTemperature, - suggested: model.defaultTemperature, - decision: "待确认", - reason: "官方通常不提供默认采样参数", - }); - - rows.push({ - field: "defaultTopP", - current: model.defaultTopP, - suggested: model.defaultTopP, - decision: "待确认", - reason: "官方通常不提供默认采样参数", - }); - - rows.push({ - field: "extra", - current: model.extra, - suggested: model.extra, - decision: "待确认", - reason: "扩展字段为本地schema,需业务侧定义", - }); - - return rows; -} - -async function listFiles() { - const out = []; - for (const dir of TARGET_DIRS) { - for (const f of await fs.readdir(dir)) { - if (!f.endsWith(".json") || f === "_index.json") continue; - out.push(path.join(dir, f)); - } - } - return out.sort(); -} - -function folderByJson(relPath) { - const base = path.basename(relPath, ".json"); - return path.join(OUT_ROOT, base); -} - -async function main() { - const zraw = JSON.parse(await fs.readFile(ZENMUX_FILE, "utf8")); - const zen = (zraw.data || []).map(parseZen); - const files = await listFiles(); - const generatedAt = new Date().toISOString(); - await fs.mkdir(OUT_ROOT, { recursive: true }); - - const global = []; - - for (const abs of files) { - const rel = path.relative(ROOT, abs); - const doc = JSON.parse(await fs.readFile(abs, "utf8")); - const provider = doc.provider || path.basename(abs, ".json"); - const models = Array.isArray(doc.models) ? doc.models : []; - const outDir = folderByJson(rel); - await fs.mkdir(outDir, { recursive: true }); - - const detailed = []; - const unresolved = []; - detailed.push(`# 详细字段取值表 - ${rel}`); - detailed.push(""); - detailed.push(`- provider: \`${provider}\``); - detailed.push(`- priceCurrency: \`${doc.priceCurrency || "USD"}\``); - detailed.push(`- generatedAt: \`${generatedAt}\``); - detailed.push(""); - detailed.push("## 来源"); - detailed.push(""); - for (const d of OFFICIAL_DOCS[provider] || ["(待补充provider官方文档)"]) detailed.push(`- ${d}`); - detailed.push("- https://zenmux.ai/models"); - detailed.push("- https://zenmux.ai/api/v1/models"); - detailed.push(""); - - unresolved.push(`# 未确认字段报告 - ${rel}`); - unresolved.push(""); - unresolved.push(`- provider: \`${provider}\``); - unresolved.push(`- generatedAt: \`${generatedAt}\``); - unresolved.push(""); - - for (const m of models) { - const match = matchWithCandidates(provider, m.modelName, zen); - const rows = buildRows(doc, m, match); - detailed.push(`## ${m.modelName}`); - detailed.push(""); - detailed.push(`- ZenMux匹配级别: \`${match.tier}\``); - if (match.matched) detailed.push(`- ZenMux命中: \`${match.matched.id}\``); - detailed.push(`- ZenMux候选: ${quoteCsv((match.candidates || []).map((x) => x.id))}`); - detailed.push(""); - detailed.push("| 字段 | 当前值 | 建议值 | 结论 | 依据/说明 |"); - detailed.push("|---|---|---|---|---|"); - for (const r of rows) { - detailed.push(`| \`${r.field}\` | ${fmt(r.current)} | ${fmt(r.suggested)} | ${r.decision} | ${r.reason} |`); - } - detailed.push(""); - - const pending = rows.filter((r) => r.decision === "待确认"); - if (pending.length) { - unresolved.push(`## ${m.modelName}`); - unresolved.push(""); - for (const p of pending) unresolved.push(`- \`${p.field}\`: ${p.reason}`); - unresolved.push(""); - } - } - - if (unresolved.length === 3) { - unresolved.push("- (none)"); - unresolved.push(""); - } - - const detailedFile = path.join(outDir, "详细字段取值表.md"); - const unresolvedFile = path.join(outDir, "未确认字段报告.md"); - await fs.writeFile(detailedFile, `${detailed.join("\n")}\n`, "utf8"); - await fs.writeFile(unresolvedFile, `${unresolved.join("\n")}\n`, "utf8"); - - global.push({ - file: rel, - folder: path.relative(ROOT, outDir), - detailed: path.relative(ROOT, detailedFile), - unresolved: path.relative(ROOT, unresolvedFile), - modelCount: models.length, - }); - } - - await fs.writeFile( - path.join(OUT_ROOT, "目录索引.json"), - `${JSON.stringify(global, null, 2)}\n`, - "utf8" - ); - console.log(JSON.stringify({ files: global.length, out: OUT_ROOT }, null, 2)); -} - -await main(); +// Retired: third-party snapshots must never update authoritative presets. +console.error('This legacy ZenMux tool is retired. See tools/README.md and docs/model-sources/MAINTENANCE.md. No files were read or written.'); +process.exitCode = 1;