@eddyskywalker/dsh-chatgpt-subscription 0.17.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +103 -1
  3. package/lib/client.js +1543 -269
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +9112 -2459
  6. package/lib/types/client/glm-coding-plan/GlmCodingPlanComposerQuota.d.ts +27 -0
  7. package/lib/types/client/glm-coding-plan/GlmCodingPlanComposerQuota.d.ts.map +1 -0
  8. package/lib/types/client/glm-coding-plan/GlmCodingPlanSection.d.ts +22 -0
  9. package/lib/types/client/glm-coding-plan/GlmCodingPlanSection.d.ts.map +1 -0
  10. package/lib/types/client/glm-coding-plan/api.d.ts +4 -0
  11. package/lib/types/client/glm-coding-plan/api.d.ts.map +1 -0
  12. package/lib/types/client/glm-coding-plan/locales.d.ts +412 -0
  13. package/lib/types/client/glm-coding-plan/locales.d.ts.map +1 -0
  14. package/lib/types/client/glm-coding-plan/styles.d.ts +15 -0
  15. package/lib/types/client/glm-coding-plan/styles.d.ts.map +1 -0
  16. package/lib/types/client/glm-coding-plan/useGlmCodingPlanSection.d.ts +65 -0
  17. package/lib/types/client/glm-coding-plan/useGlmCodingPlanSection.d.ts.map +1 -0
  18. package/lib/types/client/hub/brand-icons.d.ts +7 -5
  19. package/lib/types/client/hub/brand-icons.d.ts.map +1 -1
  20. package/lib/types/client/hub/providers.d.ts.map +1 -1
  21. package/lib/types/client/index.d.ts +2 -0
  22. package/lib/types/client/index.d.ts.map +1 -1
  23. package/lib/types/client/kimi-code/locales.d.ts +2 -2
  24. package/lib/types/client/minimax-code/locales.d.ts +2 -2
  25. package/lib/types/host/antigravity/oauth.d.ts +11 -1
  26. package/lib/types/host/antigravity/oauth.d.ts.map +1 -1
  27. package/lib/types/host/common/model-request-control.d.ts +1 -1
  28. package/lib/types/host/common/model-request-control.d.ts.map +1 -1
  29. package/lib/types/host/common/request-diagnostics.d.ts +1 -1
  30. package/lib/types/host/common/request-diagnostics.d.ts.map +1 -1
  31. package/lib/types/host/glm-coding-plan/account-pool.d.ts +152 -0
  32. package/lib/types/host/glm-coding-plan/account-pool.d.ts.map +1 -0
  33. package/lib/types/host/glm-coding-plan/adapter.d.ts +169 -0
  34. package/lib/types/host/glm-coding-plan/adapter.d.ts.map +1 -0
  35. package/lib/types/host/glm-coding-plan/adopt.d.ts +354 -0
  36. package/lib/types/host/glm-coding-plan/adopt.d.ts.map +1 -0
  37. package/lib/types/host/glm-coding-plan/biz-token-cache.d.ts +99 -0
  38. package/lib/types/host/glm-coding-plan/biz-token-cache.d.ts.map +1 -0
  39. package/lib/types/host/glm-coding-plan/client.d.ts +218 -0
  40. package/lib/types/host/glm-coding-plan/client.d.ts.map +1 -0
  41. package/lib/types/host/glm-coding-plan/exchange.d.ts +223 -0
  42. package/lib/types/host/glm-coding-plan/exchange.d.ts.map +1 -0
  43. package/lib/types/host/glm-coding-plan/mapper-anthropic.d.ts +308 -0
  44. package/lib/types/host/glm-coding-plan/mapper-anthropic.d.ts.map +1 -0
  45. package/lib/types/host/glm-coding-plan/mapper-openai.d.ts +213 -0
  46. package/lib/types/host/glm-coding-plan/mapper-openai.d.ts.map +1 -0
  47. package/lib/types/host/glm-coding-plan/model-catalog.d.ts +232 -0
  48. package/lib/types/host/glm-coding-plan/model-catalog.d.ts.map +1 -0
  49. package/lib/types/host/glm-coding-plan/oauth.d.ts +211 -0
  50. package/lib/types/host/glm-coding-plan/oauth.d.ts.map +1 -0
  51. package/lib/types/host/glm-coding-plan/routes.d.ts +93 -0
  52. package/lib/types/host/glm-coding-plan/routes.d.ts.map +1 -0
  53. package/lib/types/host/glm-coding-plan/signing.d.ts +323 -0
  54. package/lib/types/host/glm-coding-plan/signing.d.ts.map +1 -0
  55. package/lib/types/host/glm-coding-plan/token-store.d.ts +202 -0
  56. package/lib/types/host/glm-coding-plan/token-store.d.ts.map +1 -0
  57. package/lib/types/host/glm-coding-plan/types.d.ts +413 -0
  58. package/lib/types/host/glm-coding-plan/types.d.ts.map +1 -0
  59. package/lib/types/host/kimi-code/routes.d.ts +10 -0
  60. package/lib/types/host/kimi-code/routes.d.ts.map +1 -1
  61. package/lib/types/host/minimax-code/adapter.d.ts +11 -0
  62. package/lib/types/host/minimax-code/adapter.d.ts.map +1 -1
  63. package/lib/types/host/minimax-code/client.d.ts.map +1 -1
  64. package/lib/types/index.d.ts +9 -0
  65. package/lib/types/index.d.ts.map +1 -1
  66. package/lib/types/shared/glm-coding-plan-contracts.d.ts +315 -0
  67. package/lib/types/shared/glm-coding-plan-contracts.d.ts.map +1 -0
  68. package/package.json +1 -1
@@ -0,0 +1,308 @@
1
+ /**
2
+ * GLM(ZCode 账号)线路的 **Anthropic Messages 面**映射。
3
+ *
4
+ * 端点形状(证据等级 A):请求打 `{apiBaseForRegion(region)}{CHAT_PATH_ANTHROPIC}/v1/messages`,
5
+ * 例如国际区 `https://api.z.ai/api/anthropic/v1/messages`,国区 `https://open.bigmodel.cn/api/anthropic/v1/messages`。
6
+ * 两者逐字来自计划 `3.3 的模型面表(`zcode.z.ai/en/docs/qa` 第 6 条)与 `./types.ts` 的
7
+ * `CHAT_PATH_ANTHROPIC`。
8
+ *
9
+ * 一、认证是**双头**,这是本文件第一个必须做对的事
10
+ *
11
+ * 官方源码注释逐字写着「Anthropic 兼容网关会同时读取 x-api-key 和 Bearer Authorization」
12
+ * (`apps/zcode-cli/packages/adapters/src/model/model-execution.ts:425-437`,计划 `3.3)。
13
+ * 同值各发一份,见 {@link glmAnthropicHeaders}。少发任何一个都会得到 401,而错误正文
14
+ * 说的是「凭据没出现在头部里」(`ERROR_CODE.AUTH_MISSING` = 1001),排查方向会被带偏。
15
+ *
16
+ * 注意这与配额面**正好相反**:`/api/monitor/usage/quota/limit` 要的是裸 Key、
17
+ * **不可**加 Bearer 前缀(`./types.ts` 的 `QUOTA_PATH` 注释)。两处不能互相抄。
18
+ *
19
+ * 二、思考档位必须**跨两套词汇表**收敛
20
+ *
21
+ * DSH 的档位词汇比上游宽(`minimal` / `medium` / `xhigh` 在别的线路上都存在),
22
+ * 而 GLM-5.x 在 Coding Plan 上只接受 `low` / `high` / `max`,其余取值上游直接报错。
23
+ * 因此每个值都要先落到**模型真实梯子**上,见 {@link glmEffortForLadder} 与
24
+ * `./types.ts` 的 `convergeGlmEffort()`。
25
+ *
26
+ * 只排上游那三档会踩本仓库记录过的 bug:`minimal` 属于「未识别」,未识别一律落在中档,
27
+ * 于是 `minimal` 被发成 `high`——模型想得比用户要求的长得多,**更慢而且多计费**。
28
+ *
29
+ * 三、本文件**不伪造模型名**
30
+ *
31
+ * `GenerateOptions.model` 是调用方(模型目录)给的 id,逐字下发。本线路两区模型 id
32
+ * 不一致(计划 R8),任何按前缀猜测或「顺手换成官方名」的改写都会把请求打到上游
33
+ * 不认识的 id 上(`ERROR_CODE.UNKNOWN_MODEL` = 1211)。
34
+ *
35
+ * 四、分块语义照兄弟线路的 Anthropic 面,不另发明
36
+ *
37
+ * 思考 / 文本 / 工具调用是三个独立的 DSH 块:思考文本走 `reasoning-delta`,正文走
38
+ * `text-delta`,工具参数逐字拼接后交给 `tool-call` 块的 `arguments` 字符串
39
+ * (DSH 协议义务:参数保持模型产出的原始 JSON 串)。
40
+ * 参考实现是 `../minimax-code/mapper.ts`(同为 Anthropic 面)与 `../claude/mapper.ts`。
41
+ *
42
+ * 五、思考块的**回放**本文件不做
43
+ *
44
+ * Claude / minimax 两条线会把签名的 thinking 块原样存进 replayState 再回传。本线路
45
+ * 没有这个需求的证据:GLM 的 Anthropic 兼容面是否要求回放签名块,没有任何实测样本。
46
+ * 历史同族实现 `7e40fce` 的 `src/host/zhipu/mapper.ts` 选择「reasoning 块从不回放」。
47
+ * 本文件沿用那一条并在 {@link anthropicAssistantContent} 注明;**未验证**:改成
48
+ * 「回放」是否会被本面接受(需要一条真实多轮会话样本)。
49
+ *
50
+ * 未验证清单(本文件内逐条标注):
51
+ *
52
+ * 1. `reasoning_effort` 出现在 Anthropic 面上。等级 A 的证据只覆盖 OpenAI 面的
53
+ * `/api/coding/paas/v4`;本面是同一平台的兼容网关,但它是否读顶层
54
+ * `reasoning_effort` 没有实测样本。用 `buildGlmAnthropicRequest` 的
55
+ * `sendReasoningEffort` 开关可整段关掉。
56
+ * 2. `anthropic-version` 头网关是否强制要求。缺一条缺头的 4xx 样本。
57
+ * 3. 网关在 Anthropic 面上发思考增量的词汇。本文件同时认 `thinking_delta` 与
58
+ * `reasoning_content`,两种都收。
59
+ * 4. 历史里 reasoning 块不回放是否被本面接受(见第五节)。
60
+ */
61
+ import { LlmError, type ContentBlock, type GenerateOptions, type OutboundContentBlock, type StreamChunk } from '../common/llm-compat.ts';
62
+ import { type ResolvedRequestImages } from '../common/request-images.ts';
63
+ import type { GlmReasoningEffort, GlmRegion } from '../../shared/glm-coding-plan-contracts.ts';
64
+ /**
65
+ * Anthropic Messages 协议版本头。
66
+ *
67
+ * 取值来自 Anthropic 公开协议常量,兄弟线路同值(`../kimi-code/client.ts:129` 的
68
+ * `'anthropic-version': '2023-06-01'`)。本线路网关是否**强制**要求这个头没有任何实测
69
+ * 样本(**未验证**,缺一条缺头的 4xx 样本),但发一个正确版本号的成本是零,所以照发。
70
+ */
71
+ export declare const GLM_ANTHROPIC_VERSION = "2023-06-01";
72
+ /**
73
+ * 本线路「这个选项在 Anthropic 面上送不出去」的稳定错误码。
74
+ *
75
+ * 语义与 harness 的 `HarnessError.code` 一致:稳定的机器可路由码,不要去解析 message。
76
+ * 存在的理由是**不许静默忽略**——一个送不出去的选项如果被悄悄丢掉,用户看到的是一个
77
+ * 「按默认设置跑」的回合,而不是一次能指认到具体选项的失败。
78
+ * 这条码不在任何线路的重试集合里(各线路 `retryableCodes` 只含 RATE_LIMIT / SERVER /
79
+ * TIMEOUT / TRANSPORT 等),所以抛出后不会被重试策略放大。
80
+ */
81
+ export declare const UNSUPPORTED_OPTION_CODE = "UNSUPPORTED_OPTION";
82
+ /**
83
+ * Anthropic 面的完整 URL:`{模型面 base}{CHAT_PATH_ANTHROPIC}/v1/messages`。
84
+ *
85
+ * base 取 `./types.ts` 的 `apiBaseForRegion`(国际区 `https://api.z.ai`、
86
+ * 国区 `https://open.bigmodel.cn`,都受 `DSH_GLM_*_API_HOST` 覆盖),路径前缀取同文件
87
+ * 的 `CHAT_PATH_ANTHROPIC`。区域是**凭据的属性**(计划 `1、`3.3),所以调用方必须把
88
+ * 账号的区域传进来,而不是让这里去猜——猜错的代价是拿另一区的主机去验一把本区 Key,
89
+ * 得到的是明确鉴权失败。
90
+ *
91
+ * @param region - 账号所属部署。
92
+ * @param env - 环境变量表,默认 `process.env`(覆盖值在调用时读取,便于测试注入)。
93
+ */
94
+ export declare function glmAnthropicUrl(region: GlmRegion, env?: NodeJS.ProcessEnv): string;
95
+ /**
96
+ * Anthropic 面请求头,认证是**双头**且同值。
97
+ *
98
+ * `x-api-key` 与 `Authorization: Bearer <key>` 各发一份:官方源码逐字写明这个兼容网关
99
+ * 同时读取两者(`model/model-execution.ts:425-437`,计划 `3.3)。只发一个的后果是
100
+ * 401 `AUTH_MISSING`(1001),而那一条正文说的是「凭据没出现在头部里」,会把排查引向
101
+ * 凭据存储而不是认证头。
102
+ *
103
+ * `extra` 覆盖不了认证三件套(两个认证头 + 协议版本头):它们不是「调用方想改就改」的
104
+ * 普通头,而是本面必须成对出现的协议事实,让一个 `extra` 把双头拆成不同值或只留一个,
105
+ * 造出来的故障比不带 extra 更难查。
106
+ *
107
+ * @param apiKey - Coding Plan Key(兑换链拼出的 `{apiKey}.{secretKey}`)。空白即抛 AUTH。
108
+ * @param extra - 追加请求头(调试、代理)。不能改写认证三件套。
109
+ */
110
+ export declare function glmAnthropicHeaders(apiKey: string, extra?: Record<string, string>): Record<string, string>;
111
+ /**
112
+ * 把 DSH 的档位收敛到该模型真实接受的梯子上。
113
+ *
114
+ * 跨两套词汇表排名(`none`/`minimal`/`low`/`medium`/`high`/`xhigh`/`max` 与上游的三档
115
+ * 一起排)之后取最近一档,平手向上取——与本仓库其余各线路的收敛一致,宁可多想一点,
116
+ * 也不要少想。排名表在 `./types.ts` 的 `convergeGlmEffort()` 内,本文件不复制一份。
117
+ *
118
+ * 三个返回值含义不同,都不是「猜」:
119
+ *
120
+ * - `ladder` 为空 → `null`:该模型不接受思考档位,调用方据此**不发**任何档位字段,
121
+ * 而不是发一个模型不认的值。
122
+ * - 调用方没指定档位 → `null`:模型的服务端默认生效,映射层不代它选。
123
+ * - 其余 → 模型梯子上真实存在的那一档。
124
+ *
125
+ * @param ladder - 模型目录为该模型声明的真实梯子(`GlmModelOption.reasoningEfforts`)。
126
+ * @param requested - 调用方给的档位(DSH 的 `ReasoningEffortId`,可为空)。
127
+ */
128
+ export declare function glmEffortForLadder(ladder: readonly string[], requested: string | undefined | null): GlmReasoningEffort | null;
129
+ /** 一次请求的思考控制。 */
130
+ export interface GlmThinkingControl {
131
+ /** 要写进请求体的字段;为空表示这条请求不带任何思考控制。 */
132
+ fields: Record<string, unknown>;
133
+ /** 模型这次会不会思考。用于判断与思考互斥的选项(例如 temperature)。 */
134
+ thinking: boolean;
135
+ }
136
+ /**
137
+ * 请求体里的思考控制字段。
138
+ *
139
+ * `thinking: { type: 'enabled' }` 是**恒常发出**的一半:历史同族实现逐字记过
140
+ * 「`thinking` 的默认是 enabled,GLM-5.3 / GLM-5.3-FLASH / GLM-4.7 把
141
+ * `thinking.type: "disabled"` 当错误拒绝」(`7e40fce` 的 `src/host/zhipu/mapper.ts`
142
+ * 头注释),所以本线路任何模型都不发关闭值。
143
+ *
144
+ * `reasoning_effort` 是选深度的一半,取 {@link glmEffortForLadder} 的收敛结果。
145
+ *
146
+ * **未验证**:`reasoning_effort` 落在 Anthropic 面上。等级 A 的证据(计划 `3.3、
147
+ * `9ad8a53` 的 `CODING_EFFORTS`)只覆盖 OpenAI 面 `/api/coding/paas/v4`;本面是同一个
148
+ * 平台的兼容网关,但它是否读顶层 `reasoning_effort` 没有实测样本,缺一次真实请求。
149
+ * 之所以仍然默认发:另一个候选(Anthropic 原生的 `thinking.budget_tokens`)表达不了
150
+ * 三档梯子,而 `sendReasoningEffort: false` 是一个出口而不是修复。
151
+ *
152
+ * @param ladder - 模型真实梯子。
153
+ * @param requested - 调用方给的档位。
154
+ * @param sendReasoningEffort - 是否把收敛后的档位发成顶层字段,默认 true。
155
+ */
156
+ export declare function glmThinkingControl(ladder: readonly string[], requested: string | undefined | null, sendReasoningEffort?: boolean): GlmThinkingControl;
157
+ /** 本面这一次请求的构建选项。 */
158
+ export interface GlmAnthropicRequestOptions {
159
+ /** 模型目录为该模型声明的真实思考梯子。空数组 = 该模型不接受思考档位。 */
160
+ ladder?: readonly string[];
161
+ /** 这次请求读到的图片(`resolveRequestImages` 的产物)。 */
162
+ images?: ResolvedRequestImages;
163
+ /** 是否把收敛后的档位发成顶层 `reasoning_effort`,默认 true。见 {@link glmThinkingControl}。 */
164
+ sendReasoningEffort?: boolean;
165
+ /** 调用方不指定输出上限时用的值,默认 `./types.ts` 的 `DEFAULT_MAX_TOKENS`。 */
166
+ defaultMaxTokens?: number;
167
+ }
168
+ /**
169
+ * 构造一个 Anthropic Messages 请求体。
170
+ *
171
+ * 字段顺序对服务端无意义,只是读起来顺。
172
+ *
173
+ * @param options - harness 归一化后的会话(`normalizeGenerateOptions` 的产物)。
174
+ * @param request - 该模型的档位梯子与已读图片。
175
+ */
176
+ export declare function buildGlmAnthropicRequest(options: GenerateOptions, request?: GlmAnthropicRequestOptions): Record<string, unknown>;
177
+ /** 一个跨多个 content-block 增量累积的工具调用。 */
178
+ interface PendingToolCall {
179
+ /** 这个调用占的 DSH 块下标。 */
180
+ index: number;
181
+ id: string;
182
+ name: string;
183
+ /** 逐字拼接的 partial_json 片段。 */
184
+ arguments: string;
185
+ }
186
+ /** 一个正在接收增量的思考块。 */
187
+ interface PendingThinking {
188
+ index: number;
189
+ kind: 'thinking' | 'redacted_thinking';
190
+ text: string;
191
+ signature: string;
192
+ data: string;
193
+ }
194
+ /** 一个 Messages 响应的累积状态。 */
195
+ export interface GlmAnthropicStreamState {
196
+ /** 按 DSH 下标排列的已发块;块一开就占位。 */
197
+ blocks: OutboundContentBlock[];
198
+ /** wire content index -> 正在接收文本的那个块。 */
199
+ openText: Map<number, {
200
+ index: number;
201
+ text: string;
202
+ }>;
203
+ /** wire content index -> 累积中的工具调用。 */
204
+ toolCalls: Map<number, PendingToolCall>;
205
+ /** wire content index -> 打开着的思考块。 */
206
+ pending: Map<number, PendingThinking>;
207
+ hasContent: boolean;
208
+ hasToolCall: boolean;
209
+ /** wire 的 `stop_reason`,逐字保留。 */
210
+ finishReason: string | null;
211
+ /** 带内 `error` 事件的原始对象,记下来供适配层判断此刻还能不能安全重试。 */
212
+ streamError?: Record<string, unknown>;
213
+ sawMessageStart: boolean;
214
+ sawMessageStop: boolean;
215
+ inputTokens: number;
216
+ outputTokens: number;
217
+ cacheReadTokens: number;
218
+ cacheWriteTokens: number;
219
+ /** 结束之前是否真的见过 usage;没见过就不发 usage 块(零值 usage 是谎报)。 */
220
+ sawUsage: boolean;
221
+ finished: boolean;
222
+ }
223
+ /** 新的一次响应的流状态。 */
224
+ export declare function createGlmAnthropicStreamState(): GlmAnthropicStreamState;
225
+ /**
226
+ * 冲掉所有打开的块,然后发 usage,最后发终止的 finish。
227
+ *
228
+ * 顺序是协议义务:**usage 必须在 finish 之前,finish 之后不得再有任何块**
229
+ * (DSH 的 `StreamChunk` 文档逐字这么写)。所以本函数把 usage 排在 finish 前一行,
230
+ * 而 {@link processGlmAnthropicStreamLine} 一旦 `finished` 为真就返回空数组——
231
+ * 迟到的增量不会变成 finish 之后的块。
232
+ *
233
+ * 幂等:`message_stop` 已经关过流,适配层在响应体结束后再调一次是空操作而不是第二个 finish。
234
+ * 本函数**不**判断流是否完整,那是 {@link assertGlmStreamComplete} 的事。
235
+ */
236
+ export declare function closeGlmAnthropicStream(state: GlmAnthropicStreamState): StreamChunk[];
237
+ /**
238
+ * 流没有走到终止事件 = 被截断的回复,不是完整答案。
239
+ *
240
+ * 已经发出的内容只是模型没说完那句话的前缀,把它冲成一个干净 stop 就是把一次截断
241
+ * 报成一次成功——这正是这条检查存在的理由。
242
+ */
243
+ export declare function assertGlmStreamComplete(state: GlmAnthropicStreamState): void;
244
+ /** 这一路流有没有带出任何内容。 */
245
+ export declare function glmStreamHasContent(state: GlmAnthropicStreamState): boolean;
246
+ /**
247
+ * 把一条 Messages SSE 行喂进状态,返回这一行该发出的 DSH 块。
248
+ *
249
+ * 忽略不携带内容的行:SSE 注释(心跳)、`event:` 名字行(载荷自带的 `type` 才是权威)、
250
+ * 空行与本构建不认识的事件类型。`error` 事件**抛错**:回复已经结束,
251
+ * 继续把它冲成一个干净 stop 等于把错误答案报成成功答案。
252
+ *
253
+ * @param line - 一行 SSE 文本(不要求带换行)。
254
+ * @param state - 本次响应的累积状态。
255
+ */
256
+ export declare function processGlmAnthropicStreamLine(line: string, state: GlmAnthropicStreamState): StreamChunk[];
257
+ /** 一次上游失败的机器可读判读结果。 */
258
+ export interface GlmUpstreamErrorVerdict {
259
+ /** 该转成哪一个 `LlmError.code`(重试策略按它判读)。 */
260
+ llmCode: string;
261
+ /**
262
+ * 这一类失败值不值得重试。
263
+ *
264
+ * 判据来自 `./types.ts` 的 `ERROR_CODE` 注释:可重试的只有 `RATE_LIMITED`(退避后重试,
265
+ * 号池可换账号)与 `OVERLOADED`(瞬时过载);其余全部不可重试——重试一次确定的失败
266
+ * 只会把它拖成多次,并在额度类错误上多烧一次额度。
267
+ * `USAGE_LIMIT` / `PLAN_LIMIT` 带重置时刻,正确处置是等窗口重置而不是立刻重试。
268
+ */
269
+ retryable: boolean;
270
+ /** 正文给出的业务码;没有则是 null。 */
271
+ businessCode: number | null;
272
+ /** HTTP 状态;调用方没给则是 null。 */
273
+ status: number | null;
274
+ /** 面向人的处置说明。 */
275
+ disposition: string;
276
+ }
277
+ /**
278
+ * 把一次上游失败判读成机器可路由的结论。
279
+ *
280
+ * 分类**不能停在状态行**:多个真实条件共用同一个 HTTP 状态(表里 429 有六条,
281
+ * 401 有三条),所以正文里的业务码才是判据,状态行只在本面没给出业务码时兜底。
282
+ *
283
+ * 两个兜底方向都是有意选的:
284
+ *
285
+ * - 未知 5xx → 可重试(传输面故障,语义上与 OVERLOADED 同族)。
286
+ * - 未知 429 → **不可重试**。本表里六条 429 里有五条是额度类,立即重试只会继续失败,
287
+ * 还会多烧一次额度;宁可让调用方等一下也不要把它变成重试风暴。
288
+ *
289
+ * @param input - HTTP 状态(可选)与上游正文(可选)。
290
+ */
291
+ export declare function classifyGlmUpstreamError(input: {
292
+ status?: number | undefined;
293
+ body?: unknown;
294
+ }): GlmUpstreamErrorVerdict;
295
+ /**
296
+ * 构造一次上游失败(不抛,交给调用方决定抛点)。
297
+ *
298
+ * 让调用方(适配层)既拿到 `LlmError` 的稳定 code,又拿到「这次到底该不该重试」的
299
+ * 判读结果——两者不是一回事:code 决定路由,retryable 决定重试策略。
300
+ *
301
+ * @param input - HTTP 状态(可选)与上游正文(可选)。
302
+ */
303
+ export declare function glmUpstreamError(input: {
304
+ status?: number | undefined;
305
+ body?: unknown;
306
+ }): LlmError;
307
+ export type { ContentBlock };
308
+ //# sourceMappingURL=mapper-anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper-anthropic.d.ts","sourceRoot":"","sources":["../../../../src/host/glm-coding-plan/mapper-anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * GLM(ZCode 账号)线路的 **OpenAI 兼容面**(协议 B)线映射。
3
+ *
4
+ * 上游面是 Coding Plan 专用的 OpenAI Chat Completions 形状,地址为
5
+ * `{apiBaseForRegion(region)}` + `CHAT_PATH_OPENAI`(= `/api/coding/paas/v4`),
6
+ * 实际调用 `/api/coding/paas/v4/chat/completions` 与 `/api/coding/paas/v4/models`。
7
+ *
8
+ * **刻意不是 `/api/paas/v4`**:那是通用开放平台面,官方文档的 Common mistakes 段写明
9
+ * 走那个面套餐额度不会正确生效(计划 §3.3,证据等级 A)。也就是说发错前缀不会报错,
10
+ * 用户只会看到「明明买了套餐却在扣余额」,所以前缀由 `./types.ts` 的常量固定,不在此处拼。
11
+ *
12
+ * 本文件吸收的四处与 OpenAI 默认形状不同的地方,每一处都有来源:
13
+ *
14
+ * 1. **思考在 `delta.reasoning_content`**,不是 OpenAI 的 `reasoning_summary`,
15
+ * 落到 DSH 的 reasoning block。逐字来源:本仓库历史提交 `9ad8a53` 的
16
+ * `src/host/zhipu/mapper.ts` 实测转录。
17
+ * 2. **`reasoning_effort` 只接受模型自己的梯子**(GLM-5.x 为 `low`/`high`/`max`),
18
+ * 别的取值上游直接报错(业务码 1214 INVALID_PARAM,见 `ERROR_CODE` 表)。
19
+ * DSH 的档位词汇更宽(`minimal`/`medium`/`xhigh` 在别的线路上都存在),
20
+ * 因此每个取值先经 `convergeGlmEffort()` 落到梯子上再发。该函数跨两套词汇表排名,
21
+ * `none`/`minimal` 也有位置可落——只排三档会把 `minimal` 误升成 `high`,
22
+ * 那正是本仓库历史记录过的 bug(见 `./types.ts` 的 `convergeGlmEffort` 注释)。
23
+ * 3. **不发 `thinking.type`**。`thinking` 的默认是 enabled,而 GLM-5.3 /
24
+ * GLM-5.3-FLASH / GLM-4.7 把 `thinking.type: "disabled"` 当**错误**,
25
+ * 所以本线路任何模型都不发关闭值,直接省略该字段(同上,历史 mapper 注释)。
26
+ * 4. **不发 `stream_options`**。上游的流式文档里 usage 对象是随末帧到的,
27
+ * 该字段也不在文档化的请求 schema 里;给这个 API 发一个未文档化的字段,
28
+ * 代价可能只是一个毫无收益的 400(同上,历史 mapper 注释)。
29
+ *
30
+ * **未验证**:以上第 1-4 条全部来自 `9ad8a53` 的历史实测转录,本轮**没有实机账号**
31
+ * (计划 D9、R1),因此没有一次 live 复核。缺的是一份真实 SSE 帧样本与一份真实 400 响应样本。
32
+ * 结构性的部分(字段名、认证头形状)证据等级 A;行为性的部分(哪些取值会被拒)
33
+ * 只到「历史实测记录」这一层。
34
+ */
35
+ import { LlmError, type GenerateOptions, type OutboundContentBlock, type StreamChunk } from '../common/llm-compat.ts';
36
+ import type { GlmRegion } from '../../shared/glm-coding-plan-contracts.ts';
37
+ import type { AttachmentStore } from '@deepseek-ai/dsh-attachment';
38
+ /**
39
+ * 本文件自己用的失败码:调用方要求了一件这个面做不到的事。
40
+ *
41
+ * 与上游那张业务码表不是一回事——`ERROR_CODE` 说的是上游说了什么,
42
+ * 这一个说的是本线路在发请求之前就知道做不到。处置因此不同:后者不该重试,
43
+ * 也不该让用户以为「上游出问题了」,而是换模型或换调用方式。
44
+ *
45
+ * 取值是 harness 的**通用码** `UNSUPPORTED_OPTION`,不是本线路自造的:harness 自己的
46
+ * provider 就在用同一个串(`packages/llm/llm-pi-ai/src/adapter.ts:335` 抛的是
47
+ * `new LlmError('llm-pi-ai does not support GenerateOptions.stop', 'UNSUPPORTED_OPTION')`),
48
+ * 本线路的 Anthropic 面(`mapper-anthropic.ts`)也用同一个串。
49
+ *
50
+ * 所以两个面共用一个码:装配层要判断「这个面做不到这件事」时,只有一个词要认,
51
+ * 而不是先问是哪个面。自造一个带线路前缀的码会让调用方多学一个词,
52
+ * 也会让同一个线路的两面出现两个说法。
53
+ */
54
+ export declare const UNSUPPORTED_OPTION_CODE = "UNSUPPORTED_OPTION";
55
+ /** 上游 Chat Completions 路径,接在 `CHAT_PATH_OPENAI` 之后。 */
56
+ export declare const CHAT_COMPLETIONS_SEGMENT = "/chat/completions";
57
+ /** 上游模型清单路径,接在同一个 `CHAT_PATH_OPENAI` 之后。 */
58
+ export declare const MODELS_SEGMENT = "/models";
59
+ /** 本面一个完整请求的 URL:`{apiBase}{CHAT_PATH_OPENAI}/chat/completions`。 */
60
+ export declare function chatCompletionsUrl(region: GlmRegion, env?: NodeJS.ProcessEnv): string;
61
+ /** 本面模型清单的 URL:`{apiBase}{CHAT_PATH_OPENAI}/models`。 */
62
+ export declare function modelsUrl(region: GlmRegion, env?: NodeJS.ProcessEnv): string;
63
+ /**
64
+ * OpenAI 兼容面的请求头。
65
+ *
66
+ * 认证是 `Authorization: Bearer {credential}`,credential 是兑换链换出来的
67
+ * `{id}.{secret}` Coding Plan Key(计划 §3.2、§3.3)。
68
+ *
69
+ * **刻意不发 `x-api-key`**:双头是 **Anthropic 兼容面**的性质,官方源码注释逐字写着
70
+ * 「Anthropic 兼容网关会同时读取 x-api-key 和 Bearer Authorization」
71
+ * (`model/model-execution.ts:425-437`,计划 §3.3)。本面只读 Bearer,
72
+ * 多发一个头不会更好,只会让日后复审误以为两面共用一套认证。
73
+ *
74
+ * 配额接口则**反过来**用裸 Key、不加 Bearer(见 `./types.ts` 的 `QUOTA_PATH` 注释),
75
+ * 那是另一条路,不归本文件管。
76
+ */
77
+ export declare function glmOpenAiHeaders(credential: string, extra?: Record<string, string>): Record<string, string>;
78
+ /**
79
+ * 调用方(适配器)交给本映射的**逐模型**能力声明。
80
+ *
81
+ * 存在的原因是一条硬规则:**能力不得从模型名推断**(计划 §1、§7)——
82
+ * 历史草案记录过 `glm-5.3-flash` 收图而 `glm-5.3` 不收、`glm-5.2` 两个档位而
83
+ * `glm-5.3` 三个。所以本文件只读声明,绝不看 `options.model` 里的字符串。
84
+ */
85
+ export interface GlmOpenAiModelRoute {
86
+ /**
87
+ * 该模型真实接受的思考档位梯子(目录逐行给出)。
88
+ *
89
+ * 空数组表示它不接受 `reasoning_effort`,此时本文件**不发**该字段:
90
+ * `convergeGlmEffort` 对空梯子返回 null,调用方据此不发,而不是发一个模型不认的值。
91
+ */
92
+ readonly reasoningEfforts: readonly string[];
93
+ /** 是否接受 image 输入。 */
94
+ readonly supportsImages: boolean;
95
+ /**
96
+ * 调用方未给 `maxTokens` 时本线路请求的输出上限。
97
+ *
98
+ * 缺省取 `DEFAULT_MAX_TOKENS`,那个常量在 `./types.ts` 里已标注**未验证**
99
+ * (它不是任何 GLM-5.x 模型的官方上限,只是历史兜底值)。
100
+ */
101
+ readonly defaultMaxTokens?: number;
102
+ }
103
+ /**
104
+ * 目录尚未落地时使用的保守声明。
105
+ *
106
+ * 两项都取「什么都不发」的一侧:梯子为空 → 不发 `reasoning_effort`(让上游用自己的默认),
107
+ * 不认图 → 请求里的图片按「读不出来」明说,而不是发一个上游会拒的 `image_url`。
108
+ * 这不是对能力的判断,是「没有声明就不主张」。
109
+ */
110
+ export declare const UNDECLARED_MODEL_ROUTE: GlmOpenAiModelRoute;
111
+ /** 本面需要的附件接缝:一个持久图片的已验证字节。 */
112
+ export type AttachmentImageReader = Pick<AttachmentStore, 'readImage'>;
113
+ /** 一个请求内已解析的持久图片,或「已证明读不出来」。 */
114
+ export type ResolvedRequestImage = {
115
+ readonly kind: 'inline';
116
+ readonly mediaType: string;
117
+ readonly data: string;
118
+ } | {
119
+ readonly kind: 'unavailable';
120
+ };
121
+ /** 按持久附件 id 索引的图片;由一次请求构建消费。 */
122
+ export type ResolvedRequestImages = ReadonlyMap<string, ResolvedRequestImage>;
123
+ /**
124
+ * 一次请求允许携带的 base64 图片上限:12 MB。
125
+ *
126
+ * 取本仓库其余 OpenAI 形状线路的同一个值(`workbuddy` / `zhipu` 的同名常量),
127
+ * 理由是让图文与工具 schema 留在同一个 body 里。
128
+ *
129
+ * **未验证**:GLM Coding Plan 这个面对单请求图片字节的真实上限没有实测样本,
130
+ * 缺一份超限请求的真实响应。W5 的客户端一旦拿到真实 413/1214 响应即可调整此值。
131
+ */
132
+ export declare const MAX_REQUEST_IMAGE_BYTES: number;
133
+ /**
134
+ * 一次请求的图片字节超出 {@link MAX_REQUEST_IMAGE_BYTES} 时,把最老的内联图片换成占位文本。
135
+ *
136
+ * 持久历史不动,只改即将发出的那一份请求。
137
+ */
138
+ export declare function offloadOldestRequestImages(options: GenerateOptions): GenerateOptions;
139
+ /**
140
+ * 读出一次请求携带的每一个 `{ type: 'image', attachment }` 块。
141
+ *
142
+ * 读不出来的图片解析成 `unavailable` 而不是凭空消失,这样模型被明确告知图没了,
143
+ * 而不是对着空白作答。
144
+ */
145
+ export declare function resolveRequestImages(options: GenerateOptions, attachments: AttachmentImageReader | undefined, signal?: AbortSignal): Promise<ResolvedRequestImages>;
146
+ /** 去掉上游网关会拒或会忽略的 JSON-Schema 元关键字。 */
147
+ export declare function stripMetaSchema(schema: unknown): Record<string, unknown>;
148
+ /**
149
+ * 构造一份 `/api/coding/paas/v4/chat/completions` 的 body。
150
+ *
151
+ * `reasoning_effort` 先经 `convergeGlmEffort()` 收敛到目录声明的梯子上:
152
+ * DSH 的词汇比上游宽,而上游收到不认识的档位会直接报 1214。
153
+ * 梯子为空时**不发**该字段,而不是发一个模型不认的值。
154
+ *
155
+ * `thinking` 与 `stream_options` 一律**不发**,理由见文件头第 3、4 条。
156
+ */
157
+ export declare function buildChatRequest(options: GenerateOptions, images?: ResolvedRequestImages, route?: GlmOpenAiModelRoute): Record<string, unknown>;
158
+ /**
159
+ * 从一份响应正文里读出平台自己的数字业务码。
160
+ *
161
+ * 分类**不能停在状态行**:同一个 429 覆盖了已用尽的窗口、失效的套餐和
162
+ * 单模型授权缺口(见 `./types.ts` 的 `ERROR_CODE` 表注释),它们要不同的处置。
163
+ */
164
+ export declare function readGlmErrorCode(detail: string): number | null;
165
+ export declare function classifyGlmOpenAiFailure(status: number, detail: string, headers?: Headers): LlmError;
166
+ interface PendingToolCall {
167
+ blockIndex: number;
168
+ id: string;
169
+ name: string;
170
+ arguments: string;
171
+ started: boolean;
172
+ }
173
+ /** 一次流式响应的累积状态。 */
174
+ export interface GlmOpenAiStreamState {
175
+ blocks: OutboundContentBlock[];
176
+ current: {
177
+ index: number;
178
+ type: 'text' | 'reasoning';
179
+ text: string;
180
+ } | null;
181
+ /** 线上工具下标 -> 累积中的调用。 */
182
+ toolCalls: Map<number, PendingToolCall>;
183
+ hasContent: boolean;
184
+ hasToolCall: boolean;
185
+ finishReason: string | null;
186
+ /** `[DONE]` 哨兵到了。 */
187
+ done: boolean;
188
+ /** 终止块已经发出过。 */
189
+ finished: boolean;
190
+ inputTokens: number;
191
+ outputTokens: number;
192
+ cacheReadTokens: number;
193
+ reasoningTokens: number;
194
+ sawUsage: boolean;
195
+ }
196
+ export declare function createStreamState(): GlmOpenAiStreamState;
197
+ /** 喂进来一条 `/chat/completions` 的 SSE 行。 */
198
+ export declare function processStreamLine(line: string, state: GlmOpenAiStreamState): StreamChunk[];
199
+ /**
200
+ * 冲掉所有打开的块,然后**先发 usage、再发 finish**。
201
+ *
202
+ * 顺序是硬要求:DSH 的执行器按 finish 结算一次调用,usage 排在它后面就来不及入账。
203
+ */
204
+ export declare function closeStream(state: GlmOpenAiStreamState): StreamChunk[];
205
+ /**
206
+ * 一条流在没有终局事件的情况下结束,那是**被截断**,不是答完了。
207
+ *
208
+ * 这个端点总是以 `finish_reason` 或 `[DONE]` 收尾,所以两者都没有意味着
209
+ * 连接在答案中途断了,半截文本不能当成完成的回复呈现。
210
+ */
211
+ export declare function assertStreamComplete(state: GlmOpenAiStreamState): void;
212
+ export {};
213
+ //# sourceMappingURL=mapper-openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapper-openai.d.ts","sourceRoot":"","sources":["../../../../src/host/glm-coding-plan/mapper-openai.ts"],"names":[],"mappings":"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"}