Просмотр исходного кода

feat(core): 新增讯飞 Astron CodingPlan + 修正 spark / volcengineCodingPlan

讯飞(iFLYTEK)补完:
- 新增 astronCodingPlan endpoint(讯飞星辰 MaaS 针对编程场景的订阅服务)
  baseUrl: https://maas-coding-api.cn-huabei-1.xf-yun.com/anthropic
  走 Anthropic 兼容协议,统一 model id 是 astron-code-latest
- spark.ts 按官方 HTTP API 文档重写模型清单:
  · 删除 bank 私造的 spark-x / x1(官方文档无此 id)
  · 修正各模型的 context/output 边界(4.0Ultra 32K/32K,pro-128k 128K/32K 等)

火山 Coding Plan:
- baseUrl 修正为 /api/coding(旧的 /api/v3/anthropic 是通用 Anthropic 接入,
  和 CodingPlan 订阅计量不通,会导致 401 / 配额扣错)
- 补齐 Doubao-Seed-2.0 (code/pro/lite) 全家桶
- 规范化第三方模型 id 大小写(MiniMax-M2.5 → minimax-m2.5,和火山实际接受值一致)
- 删除无效的 deploymentName(火山 CodingPlan 的 id 即请求体 model 字段,
  无需 alias 映射)

providers-schema.test 随总 endpoint 数 42 → 43 更新

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fanghanjun 6 месяцев назад
Родитель
Сommit
03bbb230d9

+ 5 - 3
packages/core/src/__tests__/providers-schema.test.ts

@@ -105,24 +105,26 @@ describe("providers structural integrity", () => {
     expect(nonCoding.length).toBe(36);
     expect(nonCoding.length).toBe(36);
   });
   });
 
 
-  it("B6:CodingPlan 6 个 provider 全部收录", () => {
+  it("B6:CodingPlan 7 个 provider 全部收录", () => {
     const ids = getAllEndpoints().map((p) => p.id);
     const ids = getAllEndpoints().map((p) => p.id);
     for (const id of [
     for (const id of [
       "kimiCodingPlan", "minimaxCodingPlan", "bailianCodingPlan",
       "kimiCodingPlan", "minimaxCodingPlan", "bailianCodingPlan",
       "glmCodingPlan", "volcengineCodingPlan", "opencodeCodingPlan",
       "glmCodingPlan", "volcengineCodingPlan", "opencodeCodingPlan",
+      "astronCodingPlan",
     ]) {
     ]) {
       expect(ids).toContain(id);
       expect(ids).toContain(id);
     }
     }
   });
   });
 
 
-  it("B6:总 provider 数 = 42 (36 base + 6 CodingPlan)", () => {
-    expect(getAllEndpoints().length).toBe(42);
+  it("B6:总 provider 数 = 43 (36 base + 7 CodingPlan)", () => {
+    expect(getAllEndpoints().length).toBe(43);
   });
   });
 
 
   it("B6:CodingPlan provider 都走 anthropic-messages", () => {
   it("B6:CodingPlan provider 都走 anthropic-messages", () => {
     for (const id of [
     for (const id of [
       "kimiCodingPlan", "minimaxCodingPlan", "bailianCodingPlan",
       "kimiCodingPlan", "minimaxCodingPlan", "bailianCodingPlan",
       "glmCodingPlan", "volcengineCodingPlan", "opencodeCodingPlan",
       "glmCodingPlan", "volcengineCodingPlan", "opencodeCodingPlan",
+      "astronCodingPlan",
     ]) {
     ]) {
       expect(getEndpoint(id)?.api).toBe("anthropic-messages");
       expect(getEndpoint(id)?.api).toBe("anthropic-messages");
     }
     }

+ 29 - 0
packages/core/src/llm/providers/endpoints/astronCodingPlan.ts

@@ -0,0 +1,29 @@
+/**
+ * 讯飞星辰 Astron Coding Plan
+ *
+ * - 官网:https://training.xfyun.cn/maas
+ * - 控制台 / 订阅入口:https://training.xfyun.cn/maas/coding
+ * - API 文档:https://www.xfyun.cn/doc/spark/CodingPlan.html
+ * - OpenAI 协议 baseUrl:https://maas-coding-api.cn-huabei-1.xf-yun.com/v2
+ * - Anthropic 协议 baseUrl:https://maas-coding-api.cn-huabei-1.xf-yun.com/anthropic
+ *
+ * 讯飞星辰 MaaS 针对编程场景的订阅套餐。订阅包里的底层模型由用户在控制台切换,
+ * 对外统一 id 是 astron-code-latest(无需根据底层模型改配置)。
+ * inkos 走 Anthropic 协议接入(和 Claude Code 一致),agent 场景工具调用更稳。
+ */
+import type { InkosEndpoint } from "../types.js";
+
+export const ASTRON_CODING_PLAN: InkosEndpoint = {
+  id: "astronCodingPlan",
+  label: "讯飞星辰 Astron Coding Plan",
+  api: "anthropic-messages",
+  baseUrl: "https://maas-coding-api.cn-huabei-1.xf-yun.com/anthropic",
+  modelsBaseUrl: "https://maas-coding-api.cn-huabei-1.xf-yun.com/v2",
+  checkModel: "astron-code-latest",
+  temperatureRange: [0, 1],
+  defaultTemperature: 0.7,
+  writingTemperature: 1,
+  models: [
+    { id: "astron-code-latest", maxOutput: 32768, contextWindowTokens: 131072, enabled: true },
+  ],
+};

+ 14 - 11
packages/core/src/llm/providers/endpoints/spark.ts

@@ -1,9 +1,13 @@
 /**
 /**
- * 讯飞星火 (Spark)
+ * 讯飞星火 (iFLYTEK Spark)
  *
  *
  * - 官网:https://xinghuo.xfyun.cn/
  * - 官网:https://xinghuo.xfyun.cn/
  * - 控制台 / API key:https://console.xfyun.cn/services/cbm
  * - 控制台 / API key:https://console.xfyun.cn/services/cbm
- * - API 文档:https://www.xfyun.cn/doc/spark/Web.html
+ * - HTTP API 文档:https://www.xfyun.cn/doc/spark/HTTP%E8%B0%83%E7%94%A8%E6%96%87%E6%A1%A3.html
+ * - OpenAI 兼容接入:https://spark-api-open.xf-yun.com/v1
+ *
+ * 模型 id 命名历史遗留——用的是内部 domain 字段(generalv3 = Spark Pro,
+ * generalv3.5 = Spark Max,4.0Ultra = 当前旗舰)。bank 按官方文档清单维护。
  */
  */
 import type { InkosEndpoint } from "../types.js";
 import type { InkosEndpoint } from "../types.js";
 
 
@@ -12,18 +16,17 @@ export const SPARK: InkosEndpoint = {
   label: "讯飞星火",
   label: "讯飞星火",
   api: "openai-completions",
   api: "openai-completions",
   baseUrl: "https://spark-api-open.xf-yun.com/v1",
   baseUrl: "https://spark-api-open.xf-yun.com/v1",
-  checkModel: "general",
+  checkModel: "lite",
   temperatureRange: [0, 1],
   temperatureRange: [0, 1],
   defaultTemperature: 0.5,
   defaultTemperature: 0.5,
   writingTemperature: 0.95,
   writingTemperature: 0.95,
   models: [
   models: [
-    { id: "spark-x", maxOutput: 131072, contextWindowTokens: 131072, enabled: true },
-    { id: "x1", maxOutput: 65535, contextWindowTokens: 65535 },
-    { id: "lite", maxOutput: 4096, contextWindowTokens: 12288, enabled: true },
-    { id: "generalv3", maxOutput: 8192, contextWindowTokens: 16384 },
-    { id: "pro-128k", maxOutput: 131072, contextWindowTokens: 131072 },
-    { id: "generalv3.5", maxOutput: 8192, contextWindowTokens: 16384 },
-    { id: "max-32k", maxOutput: 32768, contextWindowTokens: 65536 },
-    { id: "4.0Ultra", maxOutput: 32768, contextWindowTokens: 65536 },
+    // id 即官方文档 model 字段。对应产品名写在行尾注释
+    { id: "4.0Ultra", maxOutput: 32768, contextWindowTokens: 32768, enabled: true }, // Spark 4.0 Ultra
+    { id: "pro-128k", maxOutput: 32768, contextWindowTokens: 131072, enabled: true }, // Spark Pro-128K
+    { id: "max-32k", maxOutput: 8192, contextWindowTokens: 32768 }, // Spark Max-32K
+    { id: "generalv3.5", maxOutput: 8192, contextWindowTokens: 8192 }, // Spark Max (2026-03-10 后台升级到 Ultra)
+    { id: "generalv3", maxOutput: 8192, contextWindowTokens: 8192 }, // Spark Pro
+    { id: "lite", maxOutput: 4096, contextWindowTokens: 8192, enabled: true }, // Spark Lite
   ],
   ],
 };
 };

+ 25 - 12
packages/core/src/llm/providers/endpoints/volcengineCodingPlan.ts

@@ -1,8 +1,18 @@
 /**
 /**
- * 火山 CodingPlan (豆包 coding)
+ * 火山方舟 Coding Plan (豆包编程订阅)
  *
  *
  * - 官网:https://www.volcengine.com/product/ark
  * - 官网:https://www.volcengine.com/product/ark
- * - 火山方舟针对编程场景的 Doubao 模型套餐。
+ * - 订阅入口:https://www.volcengine.com/docs/82379/1925114
+ * - 快速开始:https://www.volcengine.com/docs/82379/1928261
+ * - 模型价格:https://www.volcengine.com/docs/82379/1544106
+ * - Anthropic 协议 baseUrl:https://ark.cn-beijing.volces.com/api/coding
+ *
+ * 火山方舟 Coding Plan 是火山引擎针对编程场景的订阅服务,订阅包内解锁多家
+ * 主力编程模型(豆包 / MiniMax / GLM / DeepSeek / Kimi),走 Anthropic
+ * 兼容协议,Claude Code / Cursor 等客户端可直连。
+ *
+ * 注:baseUrl 是 /api/coding(不是 /api/v3/anthropic)—— 后者是火山通用
+ * Anthropic 兼容接入,和 CodingPlan 订阅计量不通。
  */
  */
 import type { InkosEndpoint } from "../types.js";
 import type { InkosEndpoint } from "../types.js";
 
 
@@ -10,19 +20,22 @@ export const VOLCENGINE_CODING_PLAN: InkosEndpoint = {
   id: "volcengineCodingPlan",
   id: "volcengineCodingPlan",
   label: "火山 Coding Plan",
   label: "火山 Coding Plan",
   api: "anthropic-messages",
   api: "anthropic-messages",
-  baseUrl: "https://ark.cn-beijing.volces.com/api/v3/anthropic",
-  checkModel: "doubao-seed-code",
+  baseUrl: "https://ark.cn-beijing.volces.com/api/coding",
+  checkModel: "doubao-seed-2.0-code",
   temperatureRange: [0, 1],
   temperatureRange: [0, 1],
   defaultTemperature: 0.7,
   defaultTemperature: 0.7,
   writingTemperature: 1,
   writingTemperature: 1,
   models: [
   models: [
-    { id: "doubao-seed-code", maxOutput: 32000, contextWindowTokens: 256000, enabled: true, releasedAt: "2025-11-01", deploymentName: "doubao-seed-code-preview-251028" },
-    { id: "doubao-seed-2.0-code", maxOutput: 128000, contextWindowTokens: 256000, enabled: true, releasedAt: "2026-02-15", deploymentName: "doubao-seed-2-0-code-preview-260215" },
-    { id: "doubao-seed-2.0-pro", maxOutput: 128000, contextWindowTokens: 256000, enabled: true, releasedAt: "2026-02-15", deploymentName: "doubao-seed-2-0-pro-260215" },
-    { id: "doubao-seed-2.0-lite", maxOutput: 128000, contextWindowTokens: 256000, enabled: true, releasedAt: "2026-02-15", deploymentName: "doubao-seed-2-0-lite-260215" },
-    { id: "MiniMax-M2.5", maxOutput: 131072, contextWindowTokens: 204800, enabled: true, releasedAt: "2026-02-12" },
-    { id: "glm-4.7", maxOutput: 131072, contextWindowTokens: 200000, enabled: true, releasedAt: "2025-12-01" },
-    { id: "deepseek-v3.2", maxOutput: 65536, contextWindowTokens: 262144, enabled: true, releasedAt: "2025-12-01" },
-    { id: "kimi-k2.5", maxOutput: 32768, contextWindowTokens: 262144, enabled: true, releasedAt: "2026-01-27" },
+    // --- Doubao-Seed-2.0 主力(2026-02-14 发布) ---
+    { id: "doubao-seed-2.0-code", maxOutput: 128000, contextWindowTokens: 256000, enabled: true, releasedAt: "2026-02-15" },
+    { id: "doubao-seed-2.0-pro", maxOutput: 128000, contextWindowTokens: 256000, enabled: true, releasedAt: "2026-02-15" },
+    { id: "doubao-seed-2.0-lite", maxOutput: 128000, contextWindowTokens: 256000, enabled: true, releasedAt: "2026-02-15" },
+    // --- 老版 ---
+    { id: "doubao-seed-code", maxOutput: 32000, contextWindowTokens: 256000, releasedAt: "2025-11-01" },
+    // --- 订阅包里的第三方模型 ---
+    { id: "minimax-m2.5", maxOutput: 131072, contextWindowTokens: 204800, enabled: true },
+    { id: "glm-4.7", maxOutput: 131072, contextWindowTokens: 200000, enabled: true },
+    { id: "deepseek-v3.2", maxOutput: 65536, contextWindowTokens: 262144, enabled: true },
+    { id: "kimi-k2.5", maxOutput: 32768, contextWindowTokens: 262144, enabled: true },
   ],
   ],
 };
 };

+ 3 - 2
packages/core/src/llm/providers/index.ts

@@ -46,6 +46,7 @@ import { BAILIAN_CODING_PLAN } from "./endpoints/bailianCodingPlan.js";
 import { GLM_CODING_PLAN } from "./endpoints/glmCodingPlan.js";
 import { GLM_CODING_PLAN } from "./endpoints/glmCodingPlan.js";
 import { VOLCENGINE_CODING_PLAN } from "./endpoints/volcengineCodingPlan.js";
 import { VOLCENGINE_CODING_PLAN } from "./endpoints/volcengineCodingPlan.js";
 import { OPENCODE_CODING_PLAN } from "./endpoints/opencodeCodingPlan.js";
 import { OPENCODE_CODING_PLAN } from "./endpoints/opencodeCodingPlan.js";
+import { ASTRON_CODING_PLAN } from "./endpoints/astronCodingPlan.js";
 
 
 export type { InkosEndpoint, InkosModel, ApiProtocol } from "./types.js";
 export type { InkosEndpoint, InkosModel, ApiProtocol } from "./types.js";
 
 
@@ -59,8 +60,8 @@ const ALL_PROVIDERS: readonly InkosEndpoint[] = [
   SPARK, SENSENOVA, TENCENTCLOUD, XIAOMI_MIMO, LONGCAT, INTERNLM,
   SPARK, SENSENOVA, TENCENTCLOUD, XIAOMI_MIMO, LONGCAT, INTERNLM,
   MODELSCOPE, GITEEAI, QINIU, HIGRESS, INFINIAI, ZEROONE, AI360,
   MODELSCOPE, GITEEAI, QINIU, HIGRESS, INFINIAI, ZEROONE, AI360,
   OLLAMA, OPENROUTER, CUSTOM, MISTRAL, XAI, NEWAPI, GITHUB_COPILOT,
   OLLAMA, OPENROUTER, CUSTOM, MISTRAL, XAI, NEWAPI, GITHUB_COPILOT,
-  // B6 CodingPlan(6 个)
-  KIMI_CODING_PLAN, MINIMAX_CODING_PLAN, BAILIAN_CODING_PLAN, GLM_CODING_PLAN, VOLCENGINE_CODING_PLAN, OPENCODE_CODING_PLAN,
+  // B6 CodingPlan(7 个)
+  KIMI_CODING_PLAN, MINIMAX_CODING_PLAN, BAILIAN_CODING_PLAN, GLM_CODING_PLAN, VOLCENGINE_CODING_PLAN, OPENCODE_CODING_PLAN, ASTRON_CODING_PLAN,
 ];
 ];
 
 
 const PROVIDERS_BY_ID: Map<string, InkosEndpoint> = new Map(
 const PROVIDERS_BY_ID: Map<string, InkosEndpoint> = new Map(