@acosmi/sdk-ts 2.19.4 → 2.19.5
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.
- package/CHANGELOG.md +8 -0
- package/README.md +27 -2
- package/dist/browser/index.mjs +110 -23
- package/dist/browser/index.mjs.map +1 -1
- package/dist/index.mjs +110 -23
- package/dist/index.mjs.map +1 -1
- package/dist/node/adapters/anthropic.cjs.map +1 -1
- package/dist/node/adapters/anthropic.mjs.map +1 -1
- package/dist/node/adapters/openai.cjs.map +1 -1
- package/dist/node/adapters/openai.mjs.map +1 -1
- package/dist/node/index.cjs +110 -22
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +80 -8
- package/dist/node/index.d.ts +80 -8
- package/dist/node/index.mjs +110 -23
- package/dist/node/index.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## 2.19.5
|
|
2
|
+
|
|
3
|
+
- `StreamError` 新增 `serverRetryable?: boolean` 与 `retryAfterSecs?: number`(追加字段,解析点仍只有 `parseStreamError` 一个,`/chat` 线 `event: failed` 与 `/anthropic` 线 `event: error` 同表)。`serverRetryable` 是帧上 `retryable` 的**原值**,不与 `requestDisposition` 合取:既有的 `retryable` 是两者的合取,而流内错误帧并不总下发 `requestDisposition`,于是「服务端明说可以重试」会被合取成 `false` —— 两端各自正确,合起来恒否,消费方分不出「服务端明说不可重试」(一票否决)与「服务端没说」(该回落到本地分类表)。`retryAfterSecs` 只收**有限非负数**,`null` / 负数 / NaN / Infinity / 非数字一律 `undefined`:宁可不给,绝不编造等待时间。两个字段缺席即 `undefined`,绝不补默认值;`retryable` 的合取语义一字未动。
|
|
4
|
+
- 新增导出 `isStreamError(err): err is StreamError` —— `name === 'StreamError'` ∧ `errorCode` 是字符串的**结构**判据。消费方在 worker / `vm` 上下文里,或 SDK 被打进第二份 bundle 时,`instanceof StreamError` 会静默为 `false`,症状与「这段分类代码压根没写」逐字相同。`HTTPError` 也带可选 `errorCode`,靠 `name` 分开。
|
|
5
|
+
- 新增 `ChatStreamOptions`,作为 `chatStream` / `chatMessagesStream` 的**末位**可选实参。`requestTimeoutMs` 声明这一次流的总时长安全网(从开始迭代算起,与调用方 `signal` 先到者生效,`break` 提前退出也会释放计时器);`onResponseHeaders` 在拿到响应之后、判断 `resp.ok` **之前**交出整份响应头,用于读网关随头下发的流控提示(如 `X-Acosmi-Stream-Keepalive`,秒)—— 那个数只在头里,等流内事件时已经晚了,而最需要它的恰恰是一个事件都不来的流。与既有两个流式回调同构:旁路信号,回调抛错被吞掉且不中断流;401 刷新重试后由真正开始流的那次响应触发。
|
|
6
|
+
- `FileTokenStore.withLock` 不再把 Windows 的 delete-pending 当成致命错误。NT 在 `unlink` 之后、最后一个句柄关闭之前把文件置为 `STATUS_DELETE_PENDING`,这期间 `open(lockPath, 'wx')` 抛的是 `EPERM`(实测原文 `EPERM: operation not permitted, open '...tokens.json.lock'`;`EBUSY` 是同机理的第二种表现)而**不是** `EEXIST`;判据只认 `EEXIST`,于是同一把锁上的一次正常交接被 `throw e` 报成永久失败 —— 同进程 5 个并发 `withLock` 就能稳定复现,受害者是 refresh token rotation 那段临界区。现在「锁被占」的判据是 `EEXIST` ∪(`win32` 且 code ∈ {`EPERM`, `EBUSY`}),命中后者时**跳过 stale 检测**直接退避重试(delete-pending 的文件 `stat` 要么失败要么给出前一持有者的旧 mtime,两种都会把「正在消失的锁」误判成「崩溃残留」,而 `stat` 失败那条腿是 `continue`、不过 `acquireTimeoutMs` 检查,会退化成不退出的忙循环),重试仍受 `acquireTimeoutMs` 上界约束。`EACCES` **不在**这个集合里:它在 Windows 上更常见的产地是锁目录只读 / 被策略拒绝这类真配置错误,收进来等于把「立刻报 `EACCES`」拖成「30 秒后报 acquire timeout」。**非 Windows 平台控制流逐字节不变** —— POSIX 的 `EPERM` 同样是真权限错误,一律不收。
|
|
7
|
+
- **零破坏性变更**:前三项全部是追加式(新可选字段 / 新导出 / 末位新可选实参),2.19.4 的调用方式一字不改仍然成立。`requestTimeoutMs` 缺席或非有限正数时**不武装任何计时器**,与 2.19.4 逐字一致 —— 流式链路历来只受调用方 `signal` 约束(`CHAT_REQUEST_TIMEOUT_MS` 的注释此前误把两个流式方法也算了进去,本版同步勘误:那两条路径从来没有武装过它)。给历来无上限的流凭空补一道默认墙钟,第一个被杀的就是健康的长任务。
|
|
8
|
+
|
|
1
9
|
## 2.19.4
|
|
2
10
|
|
|
3
11
|
- Stop dropping the OpenAI-line streaming usage tail frame. With `stream_options.include_usage: true` the upstream sends content frames, then the `finish_reason` frame, then `{"choices":[],"usage":{...}}`, then `data: [DONE]`. The stream converter discarded every frame without `choices`, and it had already emitted `message_delta` (without usage) and `message_stop` on the `finish_reason` frame, so no OpenAI-line turn streamed through `chatMessagesStream` ever carried usage and consumers counted it as zero. The converter now records the usage object of any frame, with or without `choices` (later frames override earlier ones), and puts it in the `message_delta` that immediately precedes the single `message_stop`.
|
package/README.md
CHANGED
|
@@ -358,6 +358,30 @@ const stream = client.chatMessagesStream(
|
|
|
358
358
|
|
|
359
359
|
网关没下发(旧版本 / 非托管路径)时回调**一次都不触发**,SDK 绝不合成占位值;流照常出。浏览器端消费方还需网关 CORS `Access-Control-Expose-Headers` 放行该头(网关 v2026-09-01 起已放行)。
|
|
360
360
|
|
|
361
|
+
### 流式可选项 `ChatStreamOptions`(v2.19.5+)
|
|
362
|
+
|
|
363
|
+
`chatStream` / `chatMessagesStream` 的**末位**可选实参。两项都是追加语义,不传时行为与既往逐字一致。
|
|
364
|
+
|
|
365
|
+
```ts
|
|
366
|
+
const stream = client.chatMessagesStream(
|
|
367
|
+
modelId,
|
|
368
|
+
{ messages, max_tokens: 4096 },
|
|
369
|
+
abortSignal,
|
|
370
|
+
onUpstreamActivity,
|
|
371
|
+
onGatewayRequestID,
|
|
372
|
+
{
|
|
373
|
+
requestTimeoutMs: 60 * 60 * 1000, // ← 安全网,不是主判据
|
|
374
|
+
onResponseHeaders: h => {
|
|
375
|
+
const keepalive = h.get('X-Acosmi-Stream-Keepalive'); // 秒;缺失为 null
|
|
376
|
+
if (keepalive) armIdleWatchdog(Number(keepalive));
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
);
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
- **`requestTimeoutMs`** —— 这一次流的**总时长**预算,从开始迭代算到流结束;与 `signal` 先到者生效,调用方 `break` 提前退出也会释放计时器。**缺席或非有限正数 = 不武装任何计时器**(流式链路历来只受调用方 `signal` 约束;`CHAT_REQUEST_TIMEOUT_MS` 只作用于非流式的 `chat` / `chatMessages`)。杀一条流的判据应当是**失去活性证据**(见上面的 `onUpstreamActivity`)而不是「活得太久」—— 这一条的职责只是给「看门狗本身坏掉」兜底,因此应当显著长于活性预算。
|
|
383
|
+
- **`onResponseHeaders`** —— 在拿到响应之后、判断 `resp.ok` **之前**触发,因此 HTTP 错误响应上同样触发;401 刷新重试后由真正开始流的那次响应触发。网关的流控提示只存在于响应头里,等流内事件已经晚了,而最需要它的恰恰是一个事件都不来的流。与其它两个流式回调同构:旁路信号,回调抛错被吞掉且不中断流。
|
|
384
|
+
|
|
361
385
|
### Sources SSE 四态分类(v2.15+)
|
|
362
386
|
|
|
363
387
|
`sources: []` 是检索成功但没有可展示引用的合法零结果,不是传输损坏。需要精确区分状态的新 consumer 使用加性接口 `classifySourcesEvent()`:
|
|
@@ -878,7 +902,7 @@ const view = await client.getBugReport(result.feedback_id);
|
|
|
878
902
|
| -------------------- | ---------------------------------------------------------------------- |
|
|
879
903
|
| `HTTPError` | 4xx/5xx,含 `statusCode` / `body` / `type` / `retryAfter` |
|
|
880
904
|
| `NetworkError` | TCP/DNS/TLS 失败;含 `isTimeout()` / `isEOF()` 便捷判定 |
|
|
881
|
-
| `StreamError` | gateway `managed_model_stream_failed` 事件解析(含 `code` / `stage` / `retryable`) |
|
|
905
|
+
| `StreamError` | gateway `managed_model_stream_failed` 事件解析(含 `code` / `stage` / `retryable`;v2.19.5 起另带 `serverRetryable` = 帧上 `retryable` 原值、`retryAfterSecs` = 建议等待秒数,缺席均为 `undefined`。跨 realm 用 `isStreamError()` 判,别用 `instanceof`) |
|
|
882
906
|
| `AgentRunStreamError` | Agent Runs 流返回 `error` 事件(默认抛出;可设 `throwOnError:false` 自行消费) |
|
|
883
907
|
| `BusinessError` | 网关返回 `code !== 0`,含 `code` (number) / `message` (字符串) |
|
|
884
908
|
| `RateLimitError` | 429(含 `retryAfter`) |
|
|
@@ -1170,7 +1194,8 @@ npm run docs # 经 TypeDoc 生成 API 参考到 docs/api/
|
|
|
1170
1194
|
|
|
1171
1195
|
| 版本 | 状态 | 概要 |
|
|
1172
1196
|
| --- | --- | --- |
|
|
1173
|
-
| 2.19.
|
|
1197
|
+
| 2.19.5 | **当前版本** | **流内重试提示透出 + 流式可选项(2026-09-19)**。`StreamError` 加性新增 `serverRetryable`(帧上 `retryable` **原值**,不与 `requestDisposition` 合取 —— 合取会把「服务端明说可重试」与「服务端没说」压成同一个 `false`)与 `retryAfterSecs`(只收有限非负数,非法值一律 `undefined`);加性导出结构判据 `isStreamError()`(worker / `vm` / 二次打包下 `instanceof` 静默为假);`chatStream` / `chatMessagesStream` 新增**末位**可选实参 `ChatStreamOptions`(`requestTimeoutMs` 总时长安全网、`onResponseHeaders` 在 `resp.ok` 判断前交出响应头,用于读 `X-Acosmi-Stream-Keepalive` 等流控提示)。全部追加式;不传 `requestTimeoutMs` 时**不武装任何计时器**,流式链路行为与 2.19.4 逐字一致。 |
|
|
1198
|
+
| 2.19.0 | 稳定版 | **网关消费请求 ID 透出(2026-09-01)**。网关把 `consumeRequestID`(即 `managed_model_usage_logs.request_id`)放进 `X-Acosmi-Request-Id` 响应头;加性导出 `GATEWAY_REQUEST_ID_HEADER` 与 `GatewayRequestIDCallback`,`chatMessagesStream` / `chatStream` 新增第 5 个可选实参、`chatMessages` / `chat` 新增第 4 个可选实参。响应头在首字节之前到达,因此覆盖流中段中断 / 零事件 / HTTP 错误全部形态。旧网关下回调零触发、绝不合成占位值,流照常出。不传回调时行为逐字节不变。 |
|
|
1174
1199
|
| 2.18.0 | 稳定版 | **`ManagedModel.thinking_levels` 类型面对齐(2026-08-29)**。加性新增可选字段 `thinking_levels?: string[]`:网关下发的升序思考档位 id 列表(`'off'`/`'high'`/`'max'` 的子集,按「admin 声明 ∩ wire 层真投递」派生)。`listModels` 原样透传,无归一化、无新方法、公开签名零变化。`[]` = 该模型无思考档;`undefined` = 旧网关未播报,调用方按"未知"处理,严禁按模型名推档。 |
|
|
1175
1200
|
| 2.17.0 | 稳定版 | **桌面 loopback OAuth state 全路径闸 + 端口确定性关闭(2026-08-15)**。`/callback` 一切形态(成功 / OAuth error / 畸形)先验 `state` 且必须恰好一个并严格等值;缺失 / 重复(含重复的正确值)/ 错值一律 `state_mismatch` 拒绝且不再被误结算为 `auth_denied`;错误信息只描述形态,不回显 code / state / token / 完整 callback query。`finally` 补 `closeIdleConnections()`(Node 18 上 `close()` 不关残留 idle keep-alive)。用户真拒绝(OAuth error + 正确 state)语义保留为 `auth_denied`。公开 API 签名零变化。 |
|
|
1176
1201
|
| 2.16.0 | 稳定版 | **chat 超时预算真正下传 + 流式活性回调(2026-08-06)**。`chat` / `chatMessagesAnthropic` / `chatMessagesOpenAI` / `generateVideo` 此前漏传 `doJSONFullRaw` 的第 5 实参,内层 **30 秒**默认值恒先于外层 11 分钟预算触发 —— v1.6.0 那次"调整为 11min"一天都没生效过(生产实证:单日 29 条 latency≈30 000 ms 的 499,横跨 4 厂商 5 模型,受害最重的是默认主循环模型)。加性导出 `CHAT_REQUEST_TIMEOUT_MS`;`chatStream` / `chatMessagesStream` 新增第 4 个可选实参 `onUpstreamActivity`,让被 `isSSECommentLine` 吞掉的保活注释行(以及 OpenAI 格式下零事件的 data 行)能抵达消费方的空闲看门狗。不传回调时行为逐字节不变。 |
|
package/dist/browser/index.mjs
CHANGED
|
@@ -148,6 +148,14 @@ var init_types = __esm({
|
|
|
148
148
|
});
|
|
149
149
|
|
|
150
150
|
// src/shared/errors.ts
|
|
151
|
+
function finiteNonNegative(value) {
|
|
152
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : void 0;
|
|
153
|
+
}
|
|
154
|
+
function isStreamError(err) {
|
|
155
|
+
if (err == null || typeof err !== "object") return false;
|
|
156
|
+
const e = err;
|
|
157
|
+
return e.name === "StreamError" && typeof e.errorCode === "string";
|
|
158
|
+
}
|
|
151
159
|
function nullableID(value) {
|
|
152
160
|
return value === null || typeof value === "string";
|
|
153
161
|
}
|
|
@@ -357,8 +365,23 @@ var init_errors = __esm({
|
|
|
357
365
|
userMessage;
|
|
358
366
|
/** gateway 原始 error 字符串 */
|
|
359
367
|
rawError;
|
|
360
|
-
/** 客户端是否值得重试 */
|
|
368
|
+
/** 客户端是否值得重试 (= 服务端 `retryable` **且** `requestDisposition === 'not_accepted'`) */
|
|
361
369
|
retryable;
|
|
370
|
+
/**
|
|
371
|
+
* 服务端在帧上声明的 `retryable` **原值** (2.19.5 起) —— 不与 requestDisposition 合取,
|
|
372
|
+
* 缺席即 undefined。
|
|
373
|
+
*
|
|
374
|
+
* 为什么要并列存一份: 上面的 `retryable` 是两个判据的合取, 网关的流内错误帧并不总是
|
|
375
|
+
* 下发 `requestDisposition`, 于是"服务端明说可重试"会被合取成 false —— 两端各自正确,
|
|
376
|
+
* 合起来恒否。消费方要区分**「服务端明说不可重试」**(false, 一票否决) 与**「服务端没说」**
|
|
377
|
+
* (undefined, 回落到自己的本地分类表) 时, 只能读这个原值; 读 `retryable` 两种情形不可分。
|
|
378
|
+
*/
|
|
379
|
+
serverRetryable;
|
|
380
|
+
/**
|
|
381
|
+
* 服务端建议的等待秒数 (2.19.5 起)。**有限非负数**才收, 其余 (null / 负数 /
|
|
382
|
+
* NaN / Infinity / 非数字) 一律 undefined —— 宁可不给, 绝不编造等待时间。
|
|
383
|
+
*/
|
|
384
|
+
retryAfterSecs;
|
|
362
385
|
errorContractVersion;
|
|
363
386
|
faultDomain;
|
|
364
387
|
requestDisposition;
|
|
@@ -381,6 +404,8 @@ var init_errors = __esm({
|
|
|
381
404
|
this.userMessage = userMessage;
|
|
382
405
|
this.rawError = rawError;
|
|
383
406
|
this.retryable = retryable;
|
|
407
|
+
this.serverRetryable = opts.retryable;
|
|
408
|
+
this.retryAfterSecs = finiteNonNegative(opts.retryAfterSecs);
|
|
384
409
|
this.errorContractVersion = opts.errorContractVersion;
|
|
385
410
|
this.faultDomain = opts.faultDomain;
|
|
386
411
|
this.requestDisposition = opts.requestDisposition;
|
|
@@ -2195,7 +2220,10 @@ var FileTokenStore = class {
|
|
|
2195
2220
|
/**
|
|
2196
2221
|
* 跨进程临界区. 用 sidecar `<path>.lock` 文件 + O_EXCL 创建语义实现互斥:
|
|
2197
2222
|
* - 创建成功 = 持有锁; 写入 pid+timestamp 便于诊断
|
|
2198
|
-
* - 创建失败 (EEXIST) = 别的进程持锁, backoff 重试
|
|
2223
|
+
* - 创建失败 (EEXIST) = 别的进程持锁, stale 检测后 backoff 重试
|
|
2224
|
+
* - 创建失败 (Windows 的 EPERM / EBUSY) = 前一持有者的 unlink 处于 delete-pending,
|
|
2225
|
+
* 同属争用; 跳过 stale 检测直接 backoff 重试 (见 catch 内注释)。EACCES 不在其中 —
|
|
2226
|
+
* 它是真权限错误, 立即抛
|
|
2199
2227
|
* - 锁文件 mtime > staleMs = 进程崩溃残留, unlink 后重试
|
|
2200
2228
|
* - acquireTimeoutMs 超时 = 抛错 (caller 应作为 transient error 处理, 上层 retry)
|
|
2201
2229
|
*
|
|
@@ -2229,20 +2257,22 @@ ${Date.now()}
|
|
|
2229
2257
|
};
|
|
2230
2258
|
break;
|
|
2231
2259
|
} catch (e) {
|
|
2232
|
-
if (!
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
const st = await fs.stat(lockPath);
|
|
2236
|
-
if (Date.now() - st.mtimeMs > fileLockDefaults.staleMs) stale = true;
|
|
2237
|
-
} catch {
|
|
2238
|
-
continue;
|
|
2239
|
-
}
|
|
2240
|
-
if (stale) {
|
|
2260
|
+
if (!isLockContendedError(e)) throw e;
|
|
2261
|
+
if (!isWindowsLockBusyError(e)) {
|
|
2262
|
+
let stale = false;
|
|
2241
2263
|
try {
|
|
2242
|
-
await fs.
|
|
2264
|
+
const st = await fs.stat(lockPath);
|
|
2265
|
+
if (Date.now() - st.mtimeMs > fileLockDefaults.staleMs) stale = true;
|
|
2243
2266
|
} catch {
|
|
2267
|
+
continue;
|
|
2268
|
+
}
|
|
2269
|
+
if (stale) {
|
|
2270
|
+
try {
|
|
2271
|
+
await fs.unlink(lockPath);
|
|
2272
|
+
} catch {
|
|
2273
|
+
}
|
|
2274
|
+
continue;
|
|
2244
2275
|
}
|
|
2245
|
-
continue;
|
|
2246
2276
|
}
|
|
2247
2277
|
if (Date.now() - startMs > fileLockDefaults.acquireTimeoutMs) {
|
|
2248
2278
|
throw new Error(
|
|
@@ -2348,6 +2378,15 @@ function isNotExistError(e) {
|
|
|
2348
2378
|
}
|
|
2349
2379
|
return false;
|
|
2350
2380
|
}
|
|
2381
|
+
function isWindowsLockBusyError(e) {
|
|
2382
|
+
if (typeof process === "undefined" || process.platform !== "win32") return false;
|
|
2383
|
+
if (typeof e !== "object" || e === null || !("code" in e)) return false;
|
|
2384
|
+
const code = e.code;
|
|
2385
|
+
return code === "EPERM" || code === "EBUSY";
|
|
2386
|
+
}
|
|
2387
|
+
function isLockContendedError(e) {
|
|
2388
|
+
return isAlreadyExistsError(e) || isWindowsLockBusyError(e);
|
|
2389
|
+
}
|
|
2351
2390
|
function isAlreadyExistsError(e) {
|
|
2352
2391
|
if (typeof e === "object" && e !== null && "code" in e) {
|
|
2353
2392
|
return e.code === "EEXIST";
|
|
@@ -2941,7 +2980,7 @@ function parseStreamError(data) {
|
|
|
2941
2980
|
let code = payload.errorCode ?? "";
|
|
2942
2981
|
const stage = payload.stage ?? "";
|
|
2943
2982
|
let message = payload.message ?? "";
|
|
2944
|
-
const retryable = payload.retryable
|
|
2983
|
+
const retryable = payload.retryable;
|
|
2945
2984
|
let rawError = "";
|
|
2946
2985
|
if (payload.error != null) {
|
|
2947
2986
|
if (typeof payload.error === "string") {
|
|
@@ -2959,6 +2998,7 @@ function parseStreamError(data) {
|
|
|
2959
2998
|
message,
|
|
2960
2999
|
rawError,
|
|
2961
3000
|
retryable,
|
|
3001
|
+
retryAfterSecs: payload.retryAfterSecs,
|
|
2962
3002
|
errorContractVersion: payload.errorContractVersion,
|
|
2963
3003
|
faultDomain: payload.faultDomain,
|
|
2964
3004
|
requestDisposition: payload.requestDisposition,
|
|
@@ -3169,6 +3209,25 @@ function notifyGatewayRequestID(cb, headers) {
|
|
|
3169
3209
|
} catch {
|
|
3170
3210
|
}
|
|
3171
3211
|
}
|
|
3212
|
+
function notifyResponseHeaders(cb, headers) {
|
|
3213
|
+
if (!cb) return;
|
|
3214
|
+
try {
|
|
3215
|
+
cb(headers);
|
|
3216
|
+
} catch {
|
|
3217
|
+
}
|
|
3218
|
+
}
|
|
3219
|
+
function armStreamRequestTimeout(opts, parent) {
|
|
3220
|
+
const ms = opts?.requestTimeoutMs;
|
|
3221
|
+
if (typeof ms !== "number" || !Number.isFinite(ms) || ms <= 0) return void 0;
|
|
3222
|
+
return withRequestTimeout(ms, parent);
|
|
3223
|
+
}
|
|
3224
|
+
async function* disposeTimeoutWhenSettled(inner, ctl) {
|
|
3225
|
+
try {
|
|
3226
|
+
yield* inner;
|
|
3227
|
+
} finally {
|
|
3228
|
+
ctl.dispose();
|
|
3229
|
+
}
|
|
3230
|
+
}
|
|
3172
3231
|
var DEFAULT_API_TIMEOUT_MS = 6e4;
|
|
3173
3232
|
function newDeferred() {
|
|
3174
3233
|
let resolve;
|
|
@@ -4302,10 +4361,23 @@ var Client = class _Client {
|
|
|
4302
4361
|
*
|
|
4303
4362
|
* @param onUpstreamActivity 见 {@link UpstreamActivityCallback}
|
|
4304
4363
|
* @param onGatewayRequestID 见 {@link GatewayRequestIDCallback}
|
|
4364
|
+
* @param opts 见 {@link ChatStreamOptions} (2.19.5 起)
|
|
4305
4365
|
*/
|
|
4306
|
-
chatStream(modelID, req, signal, onUpstreamActivity, onGatewayRequestID) {
|
|
4366
|
+
chatStream(modelID, req, signal, onUpstreamActivity, onGatewayRequestID, opts) {
|
|
4307
4367
|
return {
|
|
4308
|
-
[Symbol.asyncIterator]: () =>
|
|
4368
|
+
[Symbol.asyncIterator]: () => {
|
|
4369
|
+
const ctl = armStreamRequestTimeout(opts, signal);
|
|
4370
|
+
const inner = this.chatStreamGen(
|
|
4371
|
+
modelID,
|
|
4372
|
+
req,
|
|
4373
|
+
ctl?.signal ?? signal,
|
|
4374
|
+
false,
|
|
4375
|
+
onUpstreamActivity,
|
|
4376
|
+
onGatewayRequestID,
|
|
4377
|
+
opts?.onResponseHeaders
|
|
4378
|
+
);
|
|
4379
|
+
return ctl ? disposeTimeoutWhenSettled(inner, ctl) : inner;
|
|
4380
|
+
}
|
|
4309
4381
|
};
|
|
4310
4382
|
}
|
|
4311
4383
|
/**
|
|
@@ -4315,13 +4387,26 @@ var Client = class _Client {
|
|
|
4315
4387
|
*
|
|
4316
4388
|
* @param onUpstreamActivity 见 {@link UpstreamActivityCallback}
|
|
4317
4389
|
* @param onGatewayRequestID 见 {@link GatewayRequestIDCallback}
|
|
4390
|
+
* @param opts 见 {@link ChatStreamOptions} (2.19.5 起)
|
|
4318
4391
|
*/
|
|
4319
|
-
chatMessagesStream(modelID, req, signal, onUpstreamActivity, onGatewayRequestID) {
|
|
4392
|
+
chatMessagesStream(modelID, req, signal, onUpstreamActivity, onGatewayRequestID, opts) {
|
|
4320
4393
|
return {
|
|
4321
|
-
[Symbol.asyncIterator]: () =>
|
|
4394
|
+
[Symbol.asyncIterator]: () => {
|
|
4395
|
+
const ctl = armStreamRequestTimeout(opts, signal);
|
|
4396
|
+
const inner = this.chatMessagesStreamGen(
|
|
4397
|
+
modelID,
|
|
4398
|
+
req,
|
|
4399
|
+
ctl?.signal ?? signal,
|
|
4400
|
+
false,
|
|
4401
|
+
onUpstreamActivity,
|
|
4402
|
+
onGatewayRequestID,
|
|
4403
|
+
opts?.onResponseHeaders
|
|
4404
|
+
);
|
|
4405
|
+
return ctl ? disposeTimeoutWhenSettled(inner, ctl) : inner;
|
|
4406
|
+
}
|
|
4322
4407
|
};
|
|
4323
4408
|
}
|
|
4324
|
-
async *chatStreamGen(modelID, req, signal, retried, onUpstreamActivity, onGatewayRequestID) {
|
|
4409
|
+
async *chatStreamGen(modelID, req, signal, retried, onUpstreamActivity, onGatewayRequestID, onResponseHeaders) {
|
|
4325
4410
|
const r = { ...req, stream: true };
|
|
4326
4411
|
const { body, adapter } = await this.buildChatRequest(modelID, r, signal);
|
|
4327
4412
|
const token = await this.ensureToken(signal);
|
|
@@ -4353,10 +4438,11 @@ var Client = class _Client {
|
|
|
4353
4438
|
`stream: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`
|
|
4354
4439
|
);
|
|
4355
4440
|
}
|
|
4356
|
-
yield* this.chatStreamGen(modelID, req, signal, true, onUpstreamActivity, onGatewayRequestID);
|
|
4441
|
+
yield* this.chatStreamGen(modelID, req, signal, true, onUpstreamActivity, onGatewayRequestID, onResponseHeaders);
|
|
4357
4442
|
return;
|
|
4358
4443
|
}
|
|
4359
4444
|
notifyGatewayRequestID(onGatewayRequestID, resp.headers);
|
|
4445
|
+
notifyResponseHeaders(onResponseHeaders, resp.headers);
|
|
4360
4446
|
if (!resp.ok) {
|
|
4361
4447
|
const bodyBytes = await readLimited(resp.body, maxErrorBodySize);
|
|
4362
4448
|
throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);
|
|
@@ -4391,7 +4477,7 @@ var Client = class _Client {
|
|
|
4391
4477
|
}
|
|
4392
4478
|
}
|
|
4393
4479
|
}
|
|
4394
|
-
async *chatMessagesStreamGen(modelID, req, signal, retried, onUpstreamActivity, onGatewayRequestID) {
|
|
4480
|
+
async *chatMessagesStreamGen(modelID, req, signal, retried, onUpstreamActivity, onGatewayRequestID, onResponseHeaders) {
|
|
4395
4481
|
const r = { ...req, stream: true };
|
|
4396
4482
|
const { body, adapter } = await this.buildChatRequest(modelID, r, signal);
|
|
4397
4483
|
const token = await this.ensureToken(signal);
|
|
@@ -4423,10 +4509,11 @@ var Client = class _Client {
|
|
|
4423
4509
|
`messages stream: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`
|
|
4424
4510
|
);
|
|
4425
4511
|
}
|
|
4426
|
-
yield* this.chatMessagesStreamGen(modelID, req, signal, true, onUpstreamActivity, onGatewayRequestID);
|
|
4512
|
+
yield* this.chatMessagesStreamGen(modelID, req, signal, true, onUpstreamActivity, onGatewayRequestID, onResponseHeaders);
|
|
4427
4513
|
return;
|
|
4428
4514
|
}
|
|
4429
4515
|
notifyGatewayRequestID(onGatewayRequestID, resp.headers);
|
|
4516
|
+
notifyResponseHeaders(onResponseHeaders, resp.headers);
|
|
4430
4517
|
if (!resp.ok) {
|
|
4431
4518
|
const bodyBytes = await readLimited(resp.body, maxErrorBodySize);
|
|
4432
4519
|
throw parseHTTPErrorWithHeader(resp.status, bodyBytes, resp.headers);
|
|
@@ -8962,6 +9049,6 @@ function brandCredential(c) {
|
|
|
8962
9049
|
return c;
|
|
8963
9050
|
}
|
|
8964
9051
|
|
|
8965
|
-
export { AGENT_RUN_META_TITLE, AGENT_RUN_META_WORKSPACE, ALL_INTEGRATION_STATUS, ALL_PLATFORMS, ALL_REGIONS, AgentRunStreamError, AgentRunsClient, AnthropicAdapter, AudienceEnum, BillingModeEnum, BucketClassCommercial, BucketClassGeneric, BusinessError, CHAT_REQUEST_TIMEOUT_MS, ChatBridgeClient, Client, ComplianceClient, CompliancePollError, CrabCodeByokClient, DEFAULT_API_TIMEOUT_MS, DEFAULT_GATEWAY_BASE_URL, LocalStorageTokenStore as DefaultBrowserTokenStore, DefaultRetryPolicy, ErrAuthDenied, ErrBillingCallbackCannotCommit, ErrBillingCommitRequiresLocalVerify, ErrBillingS2sForbidden, ErrBrowserOpen, ErrComplianceStepUpRequired, ErrDiscovery, ErrEnvelopeGateClosed, ErrOAuthCORSBlocked, ErrProviderNotConfigured, ErrProviderUnknownNoRetry, ErrRefreshProxyFailed, ErrRegistration, ErrSSLProxy, ErrSealApprovalContractHashMismatch, ErrSealApprovalExpired, ErrSealApprovalLocationMismatch, ErrSealApprovalNonceUsed, ErrSealApprovalNotApproved, ErrSealApprovalSealMismatch, ErrSealApprovalTransactorMismatch, ErrSealUseAlreadyConsumed, ErrStateMismatch, ErrTimeout, ErrTokenExchange, ErrTokenExpired, EventAuthURL, EventComplete, EventError, FileTokenStore, FilterStatusAdminBypass, FilterStatusDisabledByFlag, FilterStatusFallbackMissingUser, FilterStatusFallbackNoBuckets, FilterStatusFallbackTkdistError, FilterStatusFallbackTkdistSkew, FilterStatusInternalBypass, FilterStatusOK, FilterStatusUnknown, GATEWAY_REQUEST_ID_HEADER, HTTPError, IdempotencyKeyHeader, InMemoryTokenStore, LocalStorageTokenStore, ModelNotFoundError, NetworkError, OAuthTokenEndpointError, OpenAIAdapter, OrderTerminalError, ProductFamilyEnum, ProviderFormat, RETRY_ADVICE_REASONS, RateLimitError, RegionScopeEnum, ScopeAI, ScopeAccount, ScopeAgentAccessManage, ScopeChatBridge, ScopeChatBridgeRead, ScopeChatBridgeRotate, ScopeChatBridgeWrite, ScopeComplianceContractSigningRead, ScopeComplianceContractSigningWrite, ScopeComplianceContractTemplateRead, ScopeComplianceContractTemplateWrite, ScopeComplianceEvidenceRead, ScopeComplianceEvidenceWrite, ScopeComplianceReportsPublish, ScopeComplianceReportsRead, ScopeComplianceReportsWrite, ScopeComplianceSealApprovalApprove, ScopeComplianceSealApprovalRequest, ScopeComplianceSealManage, ScopeComplianceSealUseExecute, ScopeComplianceTimestampIssue, ScopeComplianceTimestampVerify, ScopeEntitlements, ScopeModels, ScopeModelsChat, ScopeProfile, ScopeRemoteControl, ScopeRemoteControlAgentRun, ScopeRemoteControlPermissionResponse, ScopeRemoteControlSessionControl, ScopeSkillStore, ScopeSkills, ScopeTokenPackages, ScopeTools, ScopeToolsExecute, ScopeWallet, ScopeWalletReadonly, ServerToolTypeWebSearch, StreamError, ThinkingHigh, ThinkingHighMinMaxTokens, ThinkingLow, ThinkingMax, ThinkingMaxFallbackMaxTokens, ThinkingOff, agentAccessScopes, allScopes, anthropicResponseTextContent, anthropicResponseThinkingContent, anthropicResponseToolUseBlocks, apiResponseBusinessError, apiResponseGetMessage, asCredentialRef, authorize, bucketInfoIsCommercial, bucketRowIsCommercial, buildBetas, chatBridgeScopes, classifyComplianceError, classifySourcesEvent, commerceScopes, completeWebAuthorizationRequest, complianceErrorToRetryAdvice, complianceScopes, computeBackoff, createWebAuthorizationRequest, defaultRetryable, defaultSafeToRetry, discover, discoverWebOAuthMetadata, discoverWithProfile, effectivePolicy, exchangeCode, extractAnthropicBlockMeta, fileLockDefaults, findDesktopVisualUnderstandingModel, findFirstModelByInputModality, generateState, getAdapter, getAdapterForModel, getWindowLimitStreamDetails, isBillingConfirmable, isChannelInboundEvent, isComplianceBusinessError, isComplianceTerminalError, isContinuableWindowLimitError, isIntegrationStatus, isInvalidGrantError, isPlatform, isRegion, isSSECommentLine, isSSLError, isTerminalRemoteEvent, isUserAccessTokenRejected, isValidTokenSet, isWindowLimitError, isWindowLimitStreamError, maxEndUserIdLength, modelScopes, modelSupportsImageInput, modelSupportsInputModality, newFileTokenStore, newThinkingConfig, newTokenSet, newWebSearchTool, normalizeGatewayBaseURL, normalizeOverrideBaseURL, parseNotificationEvent, parseRemoteControlEvent, parseSettlement, parseSourcesEvent, readGatewayErrorContract, refreshToken, register, registerWebOAuthClient, remoteControlScopes, retryReasonForComplianceKey, retryReasonForOAuthError, revokeToken, sanitize_exports as sanitize, skillScopes, tokenSetIsExpired, uniqueMerge, validateEndUserId };
|
|
9052
|
+
export { AGENT_RUN_META_TITLE, AGENT_RUN_META_WORKSPACE, ALL_INTEGRATION_STATUS, ALL_PLATFORMS, ALL_REGIONS, AgentRunStreamError, AgentRunsClient, AnthropicAdapter, AudienceEnum, BillingModeEnum, BucketClassCommercial, BucketClassGeneric, BusinessError, CHAT_REQUEST_TIMEOUT_MS, ChatBridgeClient, Client, ComplianceClient, CompliancePollError, CrabCodeByokClient, DEFAULT_API_TIMEOUT_MS, DEFAULT_GATEWAY_BASE_URL, LocalStorageTokenStore as DefaultBrowserTokenStore, DefaultRetryPolicy, ErrAuthDenied, ErrBillingCallbackCannotCommit, ErrBillingCommitRequiresLocalVerify, ErrBillingS2sForbidden, ErrBrowserOpen, ErrComplianceStepUpRequired, ErrDiscovery, ErrEnvelopeGateClosed, ErrOAuthCORSBlocked, ErrProviderNotConfigured, ErrProviderUnknownNoRetry, ErrRefreshProxyFailed, ErrRegistration, ErrSSLProxy, ErrSealApprovalContractHashMismatch, ErrSealApprovalExpired, ErrSealApprovalLocationMismatch, ErrSealApprovalNonceUsed, ErrSealApprovalNotApproved, ErrSealApprovalSealMismatch, ErrSealApprovalTransactorMismatch, ErrSealUseAlreadyConsumed, ErrStateMismatch, ErrTimeout, ErrTokenExchange, ErrTokenExpired, EventAuthURL, EventComplete, EventError, FileTokenStore, FilterStatusAdminBypass, FilterStatusDisabledByFlag, FilterStatusFallbackMissingUser, FilterStatusFallbackNoBuckets, FilterStatusFallbackTkdistError, FilterStatusFallbackTkdistSkew, FilterStatusInternalBypass, FilterStatusOK, FilterStatusUnknown, GATEWAY_REQUEST_ID_HEADER, HTTPError, IdempotencyKeyHeader, InMemoryTokenStore, LocalStorageTokenStore, ModelNotFoundError, NetworkError, OAuthTokenEndpointError, OpenAIAdapter, OrderTerminalError, ProductFamilyEnum, ProviderFormat, RETRY_ADVICE_REASONS, RateLimitError, RegionScopeEnum, ScopeAI, ScopeAccount, ScopeAgentAccessManage, ScopeChatBridge, ScopeChatBridgeRead, ScopeChatBridgeRotate, ScopeChatBridgeWrite, ScopeComplianceContractSigningRead, ScopeComplianceContractSigningWrite, ScopeComplianceContractTemplateRead, ScopeComplianceContractTemplateWrite, ScopeComplianceEvidenceRead, ScopeComplianceEvidenceWrite, ScopeComplianceReportsPublish, ScopeComplianceReportsRead, ScopeComplianceReportsWrite, ScopeComplianceSealApprovalApprove, ScopeComplianceSealApprovalRequest, ScopeComplianceSealManage, ScopeComplianceSealUseExecute, ScopeComplianceTimestampIssue, ScopeComplianceTimestampVerify, ScopeEntitlements, ScopeModels, ScopeModelsChat, ScopeProfile, ScopeRemoteControl, ScopeRemoteControlAgentRun, ScopeRemoteControlPermissionResponse, ScopeRemoteControlSessionControl, ScopeSkillStore, ScopeSkills, ScopeTokenPackages, ScopeTools, ScopeToolsExecute, ScopeWallet, ScopeWalletReadonly, ServerToolTypeWebSearch, StreamError, ThinkingHigh, ThinkingHighMinMaxTokens, ThinkingLow, ThinkingMax, ThinkingMaxFallbackMaxTokens, ThinkingOff, agentAccessScopes, allScopes, anthropicResponseTextContent, anthropicResponseThinkingContent, anthropicResponseToolUseBlocks, apiResponseBusinessError, apiResponseGetMessage, asCredentialRef, authorize, bucketInfoIsCommercial, bucketRowIsCommercial, buildBetas, chatBridgeScopes, classifyComplianceError, classifySourcesEvent, commerceScopes, completeWebAuthorizationRequest, complianceErrorToRetryAdvice, complianceScopes, computeBackoff, createWebAuthorizationRequest, defaultRetryable, defaultSafeToRetry, discover, discoverWebOAuthMetadata, discoverWithProfile, effectivePolicy, exchangeCode, extractAnthropicBlockMeta, fileLockDefaults, findDesktopVisualUnderstandingModel, findFirstModelByInputModality, generateState, getAdapter, getAdapterForModel, getWindowLimitStreamDetails, isBillingConfirmable, isChannelInboundEvent, isComplianceBusinessError, isComplianceTerminalError, isContinuableWindowLimitError, isIntegrationStatus, isInvalidGrantError, isPlatform, isRegion, isSSECommentLine, isSSLError, isStreamError, isTerminalRemoteEvent, isUserAccessTokenRejected, isValidTokenSet, isWindowLimitError, isWindowLimitStreamError, maxEndUserIdLength, modelScopes, modelSupportsImageInput, modelSupportsInputModality, newFileTokenStore, newThinkingConfig, newTokenSet, newWebSearchTool, normalizeGatewayBaseURL, normalizeOverrideBaseURL, parseNotificationEvent, parseRemoteControlEvent, parseSettlement, parseSourcesEvent, readGatewayErrorContract, refreshToken, register, registerWebOAuthClient, remoteControlScopes, retryReasonForComplianceKey, retryReasonForOAuthError, revokeToken, sanitize_exports as sanitize, skillScopes, tokenSetIsExpired, uniqueMerge, validateEndUserId };
|
|
8966
9053
|
//# sourceMappingURL=index.mjs.map
|
|
8967
9054
|
//# sourceMappingURL=index.mjs.map
|