@eddyskywalker/dsh-chatgpt-subscription 0.21.0 → 0.22.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 (63) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +51 -1
  3. package/lib/client.js +2661 -516
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +7657 -2573
  6. package/lib/types/client/glm-coding-plan/GlmCodingPlanSection.d.ts.map +1 -1
  7. package/lib/types/client/glm-coding-plan/locales.d.ts +11 -17
  8. package/lib/types/client/glm-coding-plan/locales.d.ts.map +1 -1
  9. package/lib/types/client/glm-coding-plan/styles.d.ts +2 -2
  10. package/lib/types/client/glm-coding-plan/styles.d.ts.map +1 -1
  11. package/lib/types/client/hub/brand-icons.d.ts +2 -2
  12. package/lib/types/client/hub/brand-icons.d.ts.map +1 -1
  13. package/lib/types/client/hub/providers.d.ts.map +1 -1
  14. package/lib/types/client/index.d.ts +2 -0
  15. package/lib/types/client/index.d.ts.map +1 -1
  16. package/lib/types/client/step-code/StepCodeComposerQuota.d.ts +52 -0
  17. package/lib/types/client/step-code/StepCodeComposerQuota.d.ts.map +1 -0
  18. package/lib/types/client/step-code/StepCodeSection.d.ts +28 -0
  19. package/lib/types/client/step-code/StepCodeSection.d.ts.map +1 -0
  20. package/lib/types/client/step-code/api.d.ts +4 -0
  21. package/lib/types/client/step-code/api.d.ts.map +1 -0
  22. package/lib/types/client/step-code/locales.d.ts +648 -0
  23. package/lib/types/client/step-code/locales.d.ts.map +1 -0
  24. package/lib/types/client/step-code/styles.d.ts +28 -0
  25. package/lib/types/client/step-code/styles.d.ts.map +1 -0
  26. package/lib/types/client/step-code/useStepCodeSection.d.ts +122 -0
  27. package/lib/types/client/step-code/useStepCodeSection.d.ts.map +1 -0
  28. package/lib/types/host/antigravity/account-pool.d.ts.map +1 -1
  29. package/lib/types/host/common/account-pool.d.ts +38 -3
  30. package/lib/types/host/common/account-pool.d.ts.map +1 -1
  31. package/lib/types/host/common/model-request-control.d.ts +1 -1
  32. package/lib/types/host/common/model-request-control.d.ts.map +1 -1
  33. package/lib/types/host/common/request-diagnostics.d.ts +1 -1
  34. package/lib/types/host/common/request-diagnostics.d.ts.map +1 -1
  35. package/lib/types/host/glm-coding-plan/account-pool.d.ts.map +1 -1
  36. package/lib/types/host/step-code/account-pool.d.ts +187 -0
  37. package/lib/types/host/step-code/account-pool.d.ts.map +1 -0
  38. package/lib/types/host/step-code/adapter.d.ts +142 -0
  39. package/lib/types/host/step-code/adapter.d.ts.map +1 -0
  40. package/lib/types/host/step-code/adopt.d.ts +201 -0
  41. package/lib/types/host/step-code/adopt.d.ts.map +1 -0
  42. package/lib/types/host/step-code/cache-stats.d.ts +181 -0
  43. package/lib/types/host/step-code/cache-stats.d.ts.map +1 -0
  44. package/lib/types/host/step-code/client.d.ts +331 -0
  45. package/lib/types/host/step-code/client.d.ts.map +1 -0
  46. package/lib/types/host/step-code/mapper.d.ts +301 -0
  47. package/lib/types/host/step-code/mapper.d.ts.map +1 -0
  48. package/lib/types/host/step-code/model-catalog.d.ts +230 -0
  49. package/lib/types/host/step-code/model-catalog.d.ts.map +1 -0
  50. package/lib/types/host/step-code/oauth.d.ts +265 -0
  51. package/lib/types/host/step-code/oauth.d.ts.map +1 -0
  52. package/lib/types/host/step-code/routes.d.ts +126 -0
  53. package/lib/types/host/step-code/routes.d.ts.map +1 -0
  54. package/lib/types/host/step-code/token-store.d.ts +325 -0
  55. package/lib/types/host/step-code/token-store.d.ts.map +1 -0
  56. package/lib/types/host/step-code/types.d.ts +488 -0
  57. package/lib/types/host/step-code/types.d.ts.map +1 -0
  58. package/lib/types/host/workbuddy/adapter.d.ts.map +1 -1
  59. package/lib/types/index.d.ts +5 -0
  60. package/lib/types/index.d.ts.map +1 -1
  61. package/lib/types/shared/step-code-contracts.d.ts +438 -0
  62. package/lib/types/shared/step-code-contracts.d.ts.map +1 -0
  63. package/package.json +1 -1
@@ -0,0 +1,438 @@
1
+ /**
2
+ * Step Code(Step Plan 订阅)线路的共享契约。
3
+ *
4
+ * host 与 client 两半只依赖本文件的类型与常量,互不 import。
5
+ * 本文件由调度者冻结:类型名与常量名不得更改,可追加。
6
+ *
7
+ * 边界精神与 `account-pool-contracts.ts` 首行一致:这里的一切都是公开信息,
8
+ * **任何凭据都不越过这条边界**。Step 的四种凭据——云端轮询换到的 `credential.api_key`、
9
+ * 手动粘贴的 Platform API Key、adopt 读到的 `~/.stepcode/auth.json` 快照、开发者中心的
10
+ * `Oasis-Token`——一律不出现在下列任何类型里。手工粘贴与账号密码登录的请求体也正因如此
11
+ * **刻意不在本文件声明**:它必然带凭据,由 host 侧自行解析,不进冻结契约。
12
+ * 与之配套的是 `StepCodeQuotaCredentialStatusDto`:它只下发「有没有、从哪来」,
13
+ * 凭据本身仅存在于 host。
14
+ *
15
+ * 取值依据:`docs/step-code-line-plan.md` §1/§2/§3/§4/§5,以及只读参照
16
+ * 官方 Step-Code 源码(`packages/coding-agent/src/step/onboarding.ts`、
17
+ * `packages/providers/src/step-provider/{index,login-client,login-polling}.ts`、
18
+ * `packages/coding-agent/docs/step-integration.md:81-86`、
19
+ * `packages/providers/src/api/openai-completions.ts:799,1496-1529`)。
20
+ */
21
+ import type { AccountPoolStatusDto, PoolAccountSummaryDto } from './account-pool-contracts.ts';
22
+ /** 线路 id。与官方客户端的 `step` 不同名,也不与既有任何线路重名。 */
23
+ export declare const STEP_CODE_PROVIDER_ID = "step-code";
24
+ /** 设置卡片与 hub 卡片上显示的名字。 */
25
+ export declare const STEP_CODE_PROVIDER_NAME = "Step Code\uFF08Step Plan \u8BA2\u9605\uFF09";
26
+ /**
27
+ * 路由前缀(host 暴露、client 消费)。
28
+ *
29
+ * 与其余各订阅线路一致:每条线路把自己的设置面挂在 `/<line>/api` 下,
30
+ * 不挂到 Codex 那条线路的 `/api/dsh-chatgpt-subscription` 前缀下面。
31
+ */
32
+ export declare const STEP_CODE_ROUTE_PREFIX = "/step-code/api";
33
+ /**
34
+ * 凭据 profile:线路里唯一的「凭据种类 + 区域」联合。
35
+ *
36
+ * 取值与官方 `STEP_LOGIN_PROFILE_IDS`(`step/onboarding.ts:3`)**逐字相同**,一个不多一个不少。
37
+ * 四行各有各的模型 base 与授权 base(见 `docs/step-integration.md:81-86` 的表),
38
+ * 官方把「一条 profile 自带它的两个端点与它的环境变量覆盖」写成一条规则
39
+ * (`onboarding.ts:23-27` 的注释:so adding a region cannot silently inherit
40
+ * another region's endpoint),本线路照抄同一结构,不在调用处按区域另拼端点。
41
+ *
42
+ * - `step_plan`:国区 Step Plan 订阅,凭据来自浏览器授权,消耗订阅额度。
43
+ * - `step_plan_oversea`:国际区 Step Plan 订阅,凭据来自浏览器授权。
44
+ * - `platform_cn`:国区开放平台 API Key,按量计费。
45
+ * - `platform_oversea`:国际区开放平台 API Key,按量计费。
46
+ */
47
+ export type StepCodeProfile = 'step_plan' | 'step_plan_oversea' | 'platform_cn' | 'platform_oversea';
48
+ /**
49
+ * 全部 profile,声明顺序即设置页的默认顺序。
50
+ *
51
+ * 它是**线路认识的凭据清单**,不是模型清单,也不是凭据优先级。
52
+ */
53
+ export declare const STEP_CODE_PROFILES: readonly StepCodeProfile[];
54
+ /**
55
+ * 账号所属区域。
56
+ *
57
+ * `api.stepfun.ai` 与 `api.stepfun.com` 互不通用:国际区凭据打国区端点会被拒。
58
+ * 区域因此是**凭据的属性**而不是请求的属性,一个号池可以同时持有两区账号且互不串用
59
+ * (计划 §1、§10 风险 6)。它由 profile 唯一决定,所以本线路不给它自由输入。
60
+ */
61
+ export type StepCodeRegion = 'cn' | 'intl';
62
+ /** 一个 profile 属于哪个区域;profile 已在联合类型上,这里不做运行时校验。 */
63
+ export declare function stepCodeRegionOf(profile: StepCodeProfile): StepCodeRegion;
64
+ /** 参数是否是本线路认识的 profile(供 route 层校验自由输入)。 */
65
+ export declare function isStepCodeProfile(value: unknown): value is StepCodeProfile;
66
+ /** 参数是否是本线路认识的区域(供 route 层校验自由输入)。 */
67
+ export declare function isStepCodeRegion(value: unknown): value is StepCodeRegion;
68
+ /**
69
+ * 本线路能命名的思考档位。
70
+ *
71
+ * 取值就是 DSH 的完整档位词汇,而不是上游那一档或几档:上游不认识的档位一律被
72
+ * `convergeStepCodeEffort`(host 侧 `types.ts`)收敛到**模型真实梯子**上再发出去,
73
+ * 两份词汇表是分开的——详见 `STEP_CODE_REASONING_EFFORTS` 的注释。
74
+ */
75
+ export type StepCodeReasoningEffort = 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
76
+ /**
77
+ * 线路级档位词汇表,从低到高。
78
+ *
79
+ * 设置卡片只渲染这一份列表——它是**线路级词汇表**,不是某个模型的能力表。
80
+ * 某个模型真实接受哪些档位由 `StepCodeModelOption.reasoningEfforts` 单独给出;
81
+ * 把两者合成一份会让卡片在给一个只认两档的模型显示六档时,
82
+ * 无从判断是模型不支持还是文案没写。
83
+ *
84
+ * 它比上游宽是**故意的**:上游的 `reasoning_effort_support_list` 是逐模型声明的
85
+ * (未在列表里的档位映射为「不支持」,含关闭值),所以宽表在本地收敛即可,
86
+ * 而窄表一旦上游加了新档位就无处安放。
87
+ */
88
+ export declare const STEP_CODE_REASONING_EFFORTS: readonly StepCodeReasoningEffort[];
89
+ /** 档位参数是否是本线路词汇表里的值(供 route 层校验自由输入)。 */
90
+ export declare function isStepCodeReasoningEffort(value: unknown): value is StepCodeReasoningEffort;
91
+ /**
92
+ * 额度窗口的稳定标识。
93
+ *
94
+ * 两条取值分属**两代套餐**,上游同时在用,所以是三个而不是两个:
95
+ *
96
+ * - `five-hour`:老式 5 小时滚动窗口(载荷字段 `five_hour_usage_left_rate`)。
97
+ * - `weekly`:老式周窗口(载荷字段 `weekly_usage_left_rate`)。
98
+ * - `credit`:现行 Credit 池(`plan_credit_rate_limit.credit_buckets[]`)。
99
+ *
100
+ * 刻意是封闭联合而不是自由字符串:上游给出一个认不出的窗口时**不下发、不发明**
101
+ * (本线路按载荷形状判定两代套餐,不单信 `plan_family`),做成 `string`
102
+ * 等于把「不发明」这条规则从类型上撤掉。
103
+ */
104
+ export type StepCodeQuotaWindowKey = 'five-hour' | 'weekly' | 'credit';
105
+ /** 一个额度窗口。 */
106
+ export interface StepCodeQuotaWindow {
107
+ /** 线路自己的窗口标识,由客户端本地化成窗口名。 */
108
+ key: StepCodeQuotaWindowKey;
109
+ /** 已用百分比,0-100。上游没给出有界额度时为 null(不是 0%)。 */
110
+ usedPercent: number | null;
111
+ /** 该窗口重置的绝对时刻(Unix 毫秒);上游未给出时为 null。 */
112
+ resetsAt: number | null;
113
+ }
114
+ /**
115
+ * 一个 Credit 桶。
116
+ *
117
+ * 新式套餐(`plan_family=2`)把额度拆成若干桶(订阅额度 / 充值额度 …),
118
+ * 每个桶有自己的总额、剩余与失效时刻。它们不是「窗口」——窗口有已用百分比,
119
+ * 桶有绝对量,所以两种形状分别建模,不硬塞进同一张进度条。
120
+ */
121
+ export interface StepCodeQuotaBucket {
122
+ /** 该桶的总额度。 */
123
+ total: number;
124
+ /** 该桶的剩余额度。 */
125
+ remaining: number;
126
+ /** 该桶额度的失效时刻(Unix 毫秒);上游未给出时为 null。 */
127
+ expiresAt: number | null;
128
+ /** 该桶的重置时刻(Unix 毫秒);上游未给出时为 null。 */
129
+ resetsAt: number | null;
130
+ }
131
+ /**
132
+ * 某一时刻的整份额度快照。
133
+ *
134
+ * `kind` 如实记录读到的是哪一代套餐,而不是把两代揉成一份「看起来一样」的形状:
135
+ * 老式账号只有两个窗口,新式账号只有 Credit 桶,混在一起会让卡片画出一条
136
+ * 上游从没说过存在的进度条。
137
+ */
138
+ export interface StepCodeQuotaSnapshotDto {
139
+ /**
140
+ * 读到的是哪一代载荷。
141
+ *
142
+ * - `windowed`:老式的 5 小时 / 周窗口。
143
+ * - `credit`:新式的 Credit 月池。
144
+ * - `unknown`:两端都认不出来(上游改版、或账号根本没有 Step Plan 套餐)。
145
+ */
146
+ kind: 'windowed' | 'credit' | 'unknown';
147
+ /** 展示用套餐名;上游未给出时为 null。 */
148
+ planName: string | null;
149
+ /** `plan_family` 的机器值(新式为 2);上游未给出时为 null。 */
150
+ planFamily: number | null;
151
+ windows: StepCodeQuotaWindow[];
152
+ creditBuckets: StepCodeQuotaBucket[];
153
+ /** 套餐续费时刻(Unix 毫秒);上游未给出时为 null。 */
154
+ renewsAt: number | null;
155
+ /** 本次读取时刻(Unix 毫秒),卡片据此判断数据新旧。 */
156
+ fetchedAt: number;
157
+ /** 实际应答的端点路径,供设置卡片诊断。 */
158
+ sources: string[];
159
+ /** 这份快照是在哪个区域的开发者中心读到的。 */
160
+ region: StepCodeRegion;
161
+ }
162
+ /**
163
+ * 设置卡片渲染的一行模型(图标 + 名称 + 一句话描述 + 行尾勾)。
164
+ *
165
+ * 能力**不得从模型名推断**(计划 §3):本线路的目录完全靠运行时发现,随包表刻意为空
166
+ * (见 host 侧 `model-catalog.ts`),拿不出证据的字段一律走端点字段或兜底值。
167
+ */
168
+ export interface StepCodeModelOption {
169
+ id: string;
170
+ name: string;
171
+ /** 一句话能力描述:思考形态 / 可选档位 / 输入模态 / 上下文窗口。 */
172
+ hint: string;
173
+ /** 是否由 DSH 提供给会话模型选择器。 */
174
+ enabled: boolean;
175
+ /** 目录声明的默认上下文窗口(token)。 */
176
+ defaultContextWindow: number;
177
+ /** 生效窗口:有覆盖值时用覆盖值,否则等于 `defaultContextWindow`。 */
178
+ contextWindow: number;
179
+ /** 调用方不指定时,本线路请求的输出上限(端点不报输出上限,默认等于上下文窗口)。 */
180
+ defaultMaxTokens: number;
181
+ /**
182
+ * 该模型**真实**接受的思考档位;空数组表示它不接受 `reasoning_effort`。
183
+ *
184
+ * 这是「模型真实梯子」,与 `STEP_CODE_REASONING_EFFORTS`(线路级词汇表)是两回事。
185
+ */
186
+ reasoningEfforts: readonly StepCodeReasoningEffort[];
187
+ /** 思考能否关闭。与上一条正交:档位非空而本项为 false = 恒定开启。 */
188
+ thinkingDisableable: boolean;
189
+ /** 是否接受 image 输入。 */
190
+ supportsImages: boolean;
191
+ /** 目录报的 `max_input_tokens`;端点未报时等于 `defaultContextWindow`。 */
192
+ maxInputTokens: number;
193
+ /** 服务该模型线的 profile(同一 id 在两条 profile 上的可用性可能不同)。 */
194
+ profiles: readonly StepCodeProfile[];
195
+ /** 官方描述;目录没有时为 null。 */
196
+ description: string | null;
197
+ }
198
+ /**
199
+ * 一个池内账号的展示行。
200
+ *
201
+ * 扩展共享的 `PoolAccountSummaryDto`,因此同样只带非机密信息:
202
+ * 这里没有任何字段派生自 api_key、Oasis-Token 或账号密码,连 Key 的片段也不给。
203
+ */
204
+ export interface StepCodeAccountSummaryDto extends PoolAccountSummaryDto {
205
+ /** 该账号登录的 profile;区域属于凭据,池内可混有 cn 与 intl。 */
206
+ profile: StepCodeProfile;
207
+ region: StepCodeRegion;
208
+ /** 控制台侧的账号显示名。 */
209
+ accountName?: string;
210
+ }
211
+ /**
212
+ * 云端轮询登录流程的实时状态,卡片轮询它。
213
+ *
214
+ * 这条线路**不开本地回调端口**:流程跑在 host 上,卡片只跟随这里
215
+ * (与其余各线路的登录面同构)。用户在浏览器里人工确认,host 轮询取回凭据。
216
+ *
217
+ * `authorizeUrl` 始终下发,即使 host 同时打开过浏览器——启动失败时用户还能手动打开。
218
+ */
219
+ export interface StepCodeLoginFlowStatus {
220
+ status: 'idle' | 'pending' | 'complete' | 'error';
221
+ /** 本次流程要登录的 profile。 */
222
+ profile?: StepCodeProfile;
223
+ /** 浏览器必须打开的授权页(`{authBase}/cli-login-remote?flow_id=…`,由客户端自己拼)。 */
224
+ authorizeUrl?: string;
225
+ startedAt?: number;
226
+ completedAt?: number;
227
+ /** 上游 `expires_at` 换算出的绝对时刻(Unix 毫秒);总超时以它为上界。 */
228
+ expiresAt?: number;
229
+ /** 上游 `poll_interval_sec`(已 clamp 到 ≤60);客户端据此显示「每 N 秒查询一次」。 */
230
+ pollIntervalSec?: number;
231
+ /** pending 阶段的人类可读进度。 */
232
+ progress?: string;
233
+ /** 流程完成后拿到的账号标识(上游可选的 `uid`,已按长度与字符集过滤)。 */
234
+ uid?: string;
235
+ /** 失败原因(面向用户,不是堆栈)。 */
236
+ error?: string;
237
+ /**
238
+ * 本次失败是否值得自动回落。
239
+ *
240
+ * 重试判读(官方 `isRetryableStepCliLoginError`,`login-client.ts:100-105`):
241
+ * `protocol` 类(2xx 但形状/字段值不合协议)**永不重试**;`transport`(请求根本没拿到响应)
242
+ * 重试;`http` 仅 408 / 429 / ≥500 重试。其余一律致命。
243
+ */
244
+ retryable?: boolean;
245
+ }
246
+ /** 设置面接受的补丁。 */
247
+ export interface StepCodeSettingsUpdateDto {
248
+ enabled?: boolean;
249
+ enabledModelIds?: string[];
250
+ /** 数字表示为该模型设置覆盖值;`null` 恢复目录默认。 */
251
+ contextWindowOverrides?: Record<string, number | null>;
252
+ /** `null` 表示各模型用自己的默认档位。 */
253
+ defaultReasoningEffort?: StepCodeReasoningEffort | null;
254
+ /** 手动指定下一个请求使用的账号;`null` 交回号池调度。 */
255
+ selectedAccountId?: string | null;
256
+ /**
257
+ * 是否在请求里发送缓存参数(见本文件的缓存一节)。
258
+ *
259
+ * 默认 false,与官方一致:官方对 Step 端点**不发任何缓存参数**,
260
+ * `prompt_cache_key` 的发出条件硬绑 `baseUrl.includes('api.openai.com')`
261
+ * (`openai-completions.ts:799`)。把它做成默认关的能力位,是为了对未文档化字段零风险,
262
+ * 等真实账号实测过端点接受度再决定要不要打开。
263
+ */
264
+ cacheRequestParams?: boolean;
265
+ }
266
+ /** 显式连通性测试的结果。 */
267
+ export interface StepCodeConnectionDto {
268
+ connected: boolean;
269
+ /** 探测请求的往返耗时。 */
270
+ latencyMs: number;
271
+ /** 探测用到的账号;未登录时为 null。 */
272
+ account: StepCodeAccountSummaryDto | null;
273
+ /** 探测所用的模型。 */
274
+ model: string | null;
275
+ checkedAt: number;
276
+ /** 失败原因(面向用户)。 */
277
+ error?: string;
278
+ }
279
+ /**
280
+ * adopt(本机已登录的 stepcode 客户端登录态)的一次尝试结果。
281
+ *
282
+ * adopt 只是省一次登录的快捷路径,**失败永不阻断**:每个 `reason` 对应一种
283
+ * 「换一条路登录」的说明,卡片据此给出不同的下一步。
284
+ */
285
+ export interface StepCodeAdoptResultDto {
286
+ /** 是否真的尝试了 adopt(没找到凭据文件时为 false)。 */
287
+ attempted: boolean;
288
+ /** 是否拿到可用登录态。 */
289
+ adopted: boolean;
290
+ /**
291
+ * 失败原因。
292
+ *
293
+ * `not-a-stepcode-login` 是「文件在、也能解析,但里面不是 Step 的登录态」
294
+ * (例如同一份 auth.json 里别的 provider 条目),与 `unsupported-shape`
295
+ * (读懂了但形状不认识)分开,因为前者的下一步是换一种凭据方式,
296
+ * 后者的下一步是升级本插件。
297
+ */
298
+ reason?: 'no-credentials-file' | 'invalid-credentials' | 'unsupported-shape' | 'not-a-stepcode-login';
299
+ /** 成功时采用的 profile。 */
300
+ profile?: StepCodeProfile;
301
+ /** 成功时采用的区域。 */
302
+ region?: StepCodeRegion;
303
+ }
304
+ /**
305
+ * 开发者中心额度凭据的**状态**(不是凭据本身)。
306
+ *
307
+ * 额度面用 `Cookie: Oasis-Token=<t>; Oasis-Webid=<device_id>` 鉴权,那个 token
308
+ * 等价于一次账号登录。它只存在于 host,永远不过这条边界;这里下发的只是
309
+ * 「有没有、从哪来、大概什么时候过期、读它时出了什么问题」。
310
+ */
311
+ export interface StepCodeQuotaCredentialStatusDto {
312
+ hasCredential: boolean;
313
+ /** `auto` = 账号密码自动换来的;`manual` = 用户从浏览器开发者工具粘贴的。 */
314
+ source: 'auto' | 'manual' | null;
315
+ /** 登录用到的账号(非机密,用于卡片显示是哪一路凭据在服务)。 */
316
+ account?: string | null;
317
+ /** 过期时刻(Unix 毫秒);上游未给出时为 null。 */
318
+ expiresAt?: number | null;
319
+ /** 上次用它读取失败的原因;与「有没有」并列给出,而不是互相取代。 */
320
+ error?: string | null;
321
+ }
322
+ /**
323
+ * 请求侧缓存参数的出厂状态:关。
324
+ *
325
+ * 理由是官方行为而不是我们的保守:官方 Step-Code **对 Step 端点不发任何缓存参数**
326
+ * ——`prompt_cache_key` 的发出条件硬绑 `baseUrl.includes('api.openai.com')`
327
+ * (`openai-completions.ts:799-801`),会话亲和头由 `compat.sendSessionAffinityHeaders`
328
+ * 控制且对 Step 为 false,`cache_control` 只在 Anthropic 格式下发出。
329
+ * 「官方支持缓存参数」≠「会对 Step 发」:所以默认关,把是否发做成用户可见的能力位。
330
+ */
331
+ export declare const STEP_CODE_CACHE_REQUEST_PARAMS_DEFAULT = false;
332
+ /**
333
+ * `prompt_cache_key` 的长度上限:64 个**码点**。
334
+ *
335
+ * 按码点而不是 UTF-16 长度截断,是因为这个值会是一段会话 id 之类的短标识,
336
+ * 而代理链与日志系统都按字符数计长;按码点截断得到的字符串在任何一种计数下都不会超标。
337
+ */
338
+ export declare const STEP_CODE_PROMPT_CACHE_KEY_MAX_LENGTH = 64;
339
+ /**
340
+ * 响应侧「缓存读入量」的解析优先级,从先到后。
341
+ *
342
+ * 这条链是本线路最容易被想当然的一处,顺序有理由:
343
+ *
344
+ * 1. `prompt_tokens_details.cached_tokens` —— OpenAI 规范的字段,最优先。
345
+ * 2. `cache_read_input_tokens` —— Anthropic 规范的字段,出现在同包时说明端点混用两套词汇。
346
+ * 3. **顶层 `cached_tokens`** —— Step 官方文档只给这个字段(命中判据就是它 > 0),
347
+ * 所以它必须**在自己那条分支上被认**,而不是只当作别人的兜底。
348
+ * 4. `prompt_cache_hit_tokens` —— DeepSeek 一族的命名。
349
+ * 5. 0。
350
+ *
351
+ * 都不命中时取 0:0 表示「上游没报」,而不是「一定没命中」——
352
+ * 命中与否由用户对照 `fetchedAt` 与自己的前缀长度判断。
353
+ */
354
+ export declare const STEP_CODE_CACHE_READ_FIELD_ORDER: readonly ["prompt_tokens_details.cached_tokens", "cache_read_input_tokens", "cached_tokens", "prompt_cache_hit_tokens"];
355
+ /**
356
+ * 缓存**写**入量在本线路恒为 0,卡片据此显式声明。
357
+ *
358
+ * Step 服务端是自动前缀缓存:前缀够了就命中,客户端没有「写入」这个动作,
359
+ * 也没有对应的计费项。所以任何声称本线路写过缓存的数字都是编的。
360
+ * 该常量由波次 2B 的 mapper 填进用量对象,让卡片如实标注而不是留一个看起来像 bug 的 0。
361
+ */
362
+ export declare const STEP_CODE_CACHE_WRITE_NOTE = "always-zero-on-this-route";
363
+ /**
364
+ * 模型单价在官方表里全为 0,因此本线路的缓存用量卡片**只剩 token 维度**。
365
+ *
366
+ * 这不是「暂时没查」,而是官方 `STEP_MODEL_DEFAULTS.cost` 把四个键都写成 0
367
+ * (`step-provider/index.ts:102`)——上游没有给这张表填过单价。
368
+ * 卡片的处置因此是**只展示 token 与命中率、不展示任何金额**:
369
+ * 拿 0 当单价算出「省了 0 元」是正确但无用,拿编的费率算出「省了 N 元」是撒谎。
370
+ */
371
+ export declare const STEP_CODE_PRICING_STATUS: "undocumented-zero";
372
+ /**
373
+ * 本进程累计的缓存用量(**只读展示**,不含任何金额)。
374
+ *
375
+ * 只放 token:官方模型表把 cost 四键全写成 0({@link STEP_CODE_PRICING_STATUS}),
376
+ * 所以卡片能诚实给出的只有「读入多少、未命中多少、样本多大」这三件事。
377
+ * 命中率由客户端算(cacheRead / (cacheRead + missedInput))——**分母为 0 时是
378
+ * 「还不知道」,不是「一个都没命中」**,因此这个字段本身不带百分比,免得把一个
379
+ * 没有样本的状态固化成数字。
380
+ *
381
+ * 写侧仍然下发,但它的值在本线路上恒为 0,卡片据 {@link STEP_CODE_CACHE_WRITE_NOTE}
382
+ * 标注而不是画一条永远是 0 的进度条。
383
+ */
384
+ export interface StepCodeCacheStatsDto {
385
+ /** 缓存读入 token,字段口径见 {@link STEP_CODE_CACHE_READ_FIELD_ORDER}。 */
386
+ cacheReadTokens: number;
387
+ /** 未命中的输入 token:本轮聚合 prompt 减去缓存读入的那部分。 */
388
+ missedInputTokens: number;
389
+ /** 写侧 token;本线路恒为 0。 */
390
+ cacheWriteTokens: number;
391
+ /** 这些数字覆盖了几次请求;样本未知时为 null(卡片据此决定要不要显示样本量)。 */
392
+ requests: number | null;
393
+ }
394
+ /**
395
+ * 设置卡片与 composer 徽标渲染所需的全部状态。
396
+ *
397
+ * 继承共享的号池切片,因此每条元素只带非机密展示信息;令牌永远不过这条边界。
398
+ */
399
+ export interface StepCodeStatusDto extends Partial<AccountPoolStatusDto> {
400
+ /** 线路总开关;关闭时适配器不暴露任何模型。 */
401
+ enabled?: boolean;
402
+ authenticated: boolean;
403
+ hasCredentials: boolean;
404
+ providerId: typeof STEP_CODE_PROVIDER_ID;
405
+ /** 凭据存储位置说明(Windows DPAPI / macOS Keychain / Linux SecretService)。 */
406
+ storagePath: string;
407
+ /** 下一次登录要用的 profile;区域由它唯一决定。 */
408
+ profile: StepCodeProfile;
409
+ account: StepCodeAccountSummaryDto | null;
410
+ /** 无可用快照时为 null,UI 应优雅降级。 */
411
+ quota: StepCodeQuotaSnapshotDto | null;
412
+ lastFetchedAt: number | null;
413
+ /** 本次应答背后是否正在刷新额度。 */
414
+ quotaRefreshing?: boolean;
415
+ /** 额度读取失败的原因;与快照并列给出,而不是互相取代。 */
416
+ quotaError?: string | null;
417
+ models: StepCodeModelOption[];
418
+ contextWindowOverrides: Record<string, number>;
419
+ defaultReasoningEffort: StepCodeReasoningEffort | null;
420
+ /** 当前进行中的登录流程;无流程时为 null。 */
421
+ login?: StepCodeLoginFlowStatus | null;
422
+ /** 开发者中心额度凭据的状态(**不是**凭据本身)。 */
423
+ quotaCredential?: StepCodeQuotaCredentialStatusDto;
424
+ /** 请求侧是否发送缓存参数;false 时本线路一个缓存参数都不发(见缓存一节)。 */
425
+ cacheRequestParams: boolean;
426
+ /**
427
+ * 本进程累计的缓存用量;尚无样本时为 undefined。
428
+ *
429
+ * 客户端把「未下发」与「下发了一个 0」分开渲染(占位符 vs 真实的 0%),
430
+ * 所以这里刻意是可选的:缺失表达的是「还不知道」,不是「没有命中」。
431
+ */
432
+ cacheStats?: StepCodeCacheStatsDto;
433
+ /** 本插件是否正在服务该 Provider 路由。 */
434
+ serving: boolean;
435
+ /** 路由被别的适配器占用时的诊断文案。 */
436
+ conflict: string | null;
437
+ }
438
+ //# sourceMappingURL=step-code-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-code-contracts.d.ts","sourceRoot":"","sources":["../../../src/shared/step-code-contracts.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eddyskywalker/dsh-chatgpt-subscription",
3
- "version": "0.21.0",
3
+ "version": "0.22.0",
4
4
  "description": "DSH provider plugin for Codex access through a ChatGPT subscription.",
5
5
  "author": {
6
6
  "name": "eddyskywalker",