Files
config-center/schemas/provider.schema.json
Johnson-LYS d8e458c3ca feat(compute): 新增 ChatGPT 订阅 (Codex) Provider 预设 (#33)
自动检测客户端本地 Codex CLI 的 ChatGPT 订阅授权(~/.codex/auth.json),
以用户订阅额度调用 gpt-5.x/codex 模型,无需 API Key。

- compute/providers/openai-codex.json:accessMode=coding-plan +
  credentialSource=codex-cli + apiFormat=openai-codex-responses,5 个模型,
  enabled=false(由客户端检测器按本地凭证自动启用)
- schemas/provider.schema.json:frozen baseline 新增 credentialSource 字段
- manifest.json:presetDataVersion 59 → 60

⚠️ 发布顺序:本数据引入老客户端不识别的 credentialSource 字段。必须先发布带
compute.json 韧性(容忍未知字段)的客户端并等自动更新铺开,再合并本 PR——
否则更早的客户端合并时会因严格 schema 校验失败而停收所有预设更新。
2026-06-29 16:17:40 +08:00

267 lines
10 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://desirecore.net/schemas/config-center/provider.schema.json",
"title": "Provider",
"description": "frozen baseline schema 镜像 desirecore d185299fix #471 之前)的 computeProviderSchema/providerModelSchema作为已发布客户端兼容契约。任何写入 compute/providers/*.json 或 compute/coding-plans/*.json 的数据都必须通过此校验,否则会破坏老客户端(已发布版本的 schema 无法理解超出此契约的字段或类型)。\n\n关键约束\n- defaultTemperature / defaultTopP 必须是 number不接受 null—— 历史教训:曾因 null 写入导致老客户端校验失败死锁\n- 顶层与 model 内 additionalProperties 均为 false —— 新增字段必须先升级老客户端 schema 再推送数据",
"type": "object",
"required": [
"id",
"provider",
"label",
"baseUrl",
"apiKeyRef",
"apiKeyVerified",
"enabled",
"status",
"services",
"models"
],
"properties": {
"id": {
"type": "string",
"description": "提供商唯一标识符(如 provider-openai-001",
"minLength": 1
},
"provider": {
"type": "string",
"description": "提供商标识openai、anthropic、deepseek、dashscope阿里云等",
"minLength": 1
},
"label": {
"type": "string",
"description": "提供商显示名称(如 OpenAI、Anthropic、阿里云 DashScope",
"minLength": 1
},
"baseUrl": {
"type": "string",
"description": "API 基础 URL如 https://api.openai.com/v1",
"minLength": 1
},
"apiFormat": {
"type": "string",
"description": "API 协议格式openai-completions、anthropic-messages、openai-responses、google-generative-ai 等"
},
"mediaBaseUrl": {
"type": "string",
"description": "媒体 API 基础 URL。当 provider 使用 Anthropic 格式baseUrl 指向 /anthropic 端点)但其媒体 API图片/语音/视频/音乐)仍走 OpenAI /v1 端点时使用"
},
"apiKeyRef": {
"type": "string",
"description": "密钥引用名,对应 secrets.json 中的 key空字符串表示未配置密钥"
},
"apiKeyVerified": {
"type": "boolean",
"description": "API Key 是否已通过验证"
},
"enabled": {
"type": "boolean",
"description": "是否启用此提供商"
},
"status": {
"type": "string",
"enum": ["configured", "unconfigured", "error"],
"description": "提供商状态"
},
"services": {
"type": "array",
"description": "支持的服务类型列表(如 chat、reasoning、vision、embedding",
"items": { "type": "string" }
},
"priceCurrency": {
"type": "string",
"enum": ["USD", "CNY"],
"description": "价格货币单位。models 中的 inputPrice/outputPrice 均以此货币计价"
},
"accessMode": {
"type": "string",
"enum": ["api", "coding-plan", "token-plan"],
"description": "接入模式api按量付费、coding-plan编程订阅套餐或 token-planToken 团队版订阅)"
},
"brandGroup": {
"type": "string",
"description": "品牌分组标识UI 按此字段排序"
},
"credentialSource": {
"type": "string",
"enum": ["codex-cli"],
"description": "凭证托管来源。codex-cli密钥由客户端本地 Codex CLI 凭证检测器托管(读取 ~/.codex/auth.json 自动刷新写回fresh token 同步 secrets.json。需 requiredClientVersion ≥ 引入此字段的客户端版本——老客户端不识别本字段,必须先发版铺开 compute.json 韧性(容忍未知字段)再推送本数据"
},
"codingPlan": {
"type": "object",
"description": "Coding Plan / Token Plan 专属配置(仅当 accessMode = coding-plan 或 token-plan 时有效)",
"properties": {
"planTier": { "type": "string" },
"planLabel": { "type": "string" },
"quotas": {
"type": "object",
"properties": {
"per5h": { "type": "number", "minimum": 0 },
"perWeek": { "type": "number", "minimum": 0 },
"perMonth": { "type": "number", "minimum": 0 },
"per7d": { "type": "number", "minimum": 0 }
},
"additionalProperties": false
},
"usageTracking": {
"type": "object",
"properties": {
"method": {
"type": "string",
"enum": ["rest-api", "response-header", "manual", "credits", "none"]
},
"endpoint": { "type": "string" },
"headerKeys": {
"type": "object",
"properties": {
"remaining": { "type": "string" },
"limit": { "type": "string" },
"reset": { "type": "string" }
},
"additionalProperties": false
},
"consoleUrl": { "type": "string" }
},
"additionalProperties": false
},
"modelIdOverride": { "type": "string" },
"maxConcurrent": { "type": "number", "minimum": 1 },
"expiresAt": { "type": "string", "format": "date-time" }
},
"additionalProperties": false
},
"tokenPlan": {
"type": "object",
"description": "Token Plan 团队版专属配置(仅当 accessMode = token-plan 时有效)",
"properties": {
"planTier": { "type": "string" },
"planLabel": { "type": "string" },
"quotas": {
"type": "object",
"properties": {
"per5h": { "type": "number", "minimum": 0 },
"perWeek": { "type": "number", "minimum": 0 },
"perMonth": { "type": "number", "minimum": 0 },
"per7d": { "type": "number", "minimum": 0 }
},
"additionalProperties": false
},
"usageTracking": {
"type": "object",
"properties": {
"method": {
"type": "string",
"enum": ["rest-api", "response-header", "manual", "credits", "none"]
},
"endpoint": { "type": "string" },
"headerKeys": {
"type": "object",
"properties": {
"remaining": { "type": "string" },
"limit": { "type": "string" },
"reset": { "type": "string" }
},
"additionalProperties": false
},
"consoleUrl": { "type": "string" }
},
"additionalProperties": false
},
"modelIdOverride": { "type": "string" },
"maxConcurrent": { "type": "number", "minimum": 1 },
"expiresAt": { "type": "string", "format": "date-time" }
},
"additionalProperties": false
},
"models": {
"type": "array",
"description": "此提供商下的可用模型列表",
"items": { "$ref": "#/definitions/model" }
},
"tombstones": {
"type": "array",
"description": "预置显式删除的模型 modelName 白名单",
"items": { "type": "string" }
}
},
"additionalProperties": false,
"definitions": {
"model": {
"type": "object",
"required": ["modelName", "displayName", "serviceType", "capabilities"],
"properties": {
"modelName": {
"type": "string",
"description": "模型 ID用于 API 调用(如 gpt-5-mini、claude-sonnet-4",
"minLength": 1
},
"displayName": {
"type": "string",
"description": "模型显示名称(如 GPT-5 Mini、Claude Sonnet 4",
"minLength": 1
},
"serviceType": {
"type": ["string", "array"],
"items": { "type": "string" },
"description": "服务类型支持单个字符串或数组chat、reasoning、fast、responses、translation、tts、asr、voice_clone、realtime_voice、simultaneous_interpret、vision、ocr、image_gen、video_gen、embedding、rerank、omni、computer_use 等"
},
"description": {
"type": "string",
"description": "模型简要描述"
},
"contextWindow": {
"type": "number",
"description": "上下文窗口大小token 数)",
"minimum": 0
},
"maxOutputTokens": {
"type": "number",
"description": "单次请求最大输出 token 数",
"minimum": 0
},
"capabilities": {
"type": "array",
"description": "模型能力标签chat、vision、tool_use、code、reasoning 等",
"items": { "type": "string" }
},
"inputPrice": {
"type": "number",
"description": "输入价格(每百万 token货币由 Provider.priceCurrency 决定",
"minimum": 0
},
"outputPrice": {
"type": "number",
"description": "输出价格(每百万 token货币由 Provider.priceCurrency 决定",
"minimum": 0
},
"defaultTemperature": {
"type": "number",
"description": "默认温度参数0-2。【重要】必须是 number禁止写为 null 或字符串。reasoning 等不支持温度的模型应完全省略此字段。null 会破坏 fix #471 之前发布的客户端schema 严格 number导致 readComputeConfig 死锁。",
"minimum": 0,
"maximum": 2
},
"defaultTopP": {
"type": "number",
"description": "默认 Top-P 参数0-1。【重要】必须是 number禁止写为 null 或字符串。reasoning 等不支持 Top-P 的模型应完全省略此字段。null 会破坏 fix #471 之前发布的客户端,导致死锁。",
"minimum": 0,
"maximum": 1
},
"extra": {
"type": "object",
"description": "模型特定配置:如 TTS 模型音色列表、ASR 支持格式等",
"additionalProperties": true
},
"apiModelId": {
"type": "string",
"description": "实际传给上游 API 的 model 参数。当 modelName 与 API 期望名称不同时使用"
},
"source": {
"type": "string",
"enum": ["preset", "synced", "user-added", "ollama-discovery"],
"description": "模型来源。config-center 数据应统一为 preset"
}
},
"additionalProperties": false
}
}
}