{ "$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 d185299(fix #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 等" }, "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"], "description": "接入模式:api(按量付费)或 coding-plan(编程订阅套餐)" }, "brandGroup": { "type": "string", "description": "品牌分组标识,UI 按此字段排序" }, "codingPlan": { "type": "object", "description": "Coding Plan 专属配置(仅当 accessMode = coding-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", "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 } } }