@acosmi/sdk-ts 2.9.0 → 2.11.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.
- package/CHANGELOG.md +29 -0
- package/README.md +22 -0
- package/dist/browser/index.mjs +50 -6
- package/dist/browser/index.mjs.map +1 -1
- package/dist/index.mjs +50 -6
- package/dist/index.mjs.map +1 -1
- package/dist/node/adapters/anthropic.cjs.map +1 -1
- package/dist/node/adapters/anthropic.d.cts +1 -1
- package/dist/node/adapters/anthropic.d.ts +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.d.cts +2 -2
- package/dist/node/adapters/openai.d.ts +2 -2
- package/dist/node/adapters/openai.mjs.map +1 -1
- package/dist/node/{index-B5ixqnVB.d.cts → index-RoHp_9g8.d.cts} +53 -8
- package/dist/node/{index-B5ixqnVB.d.ts → index-RoHp_9g8.d.ts} +53 -8
- package/dist/node/index.cjs +51 -5
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +49 -8
- package/dist/node/index.d.ts +49 -8
- package/dist/node/index.mjs +50 -6
- package/dist/node/index.mjs.map +1 -1
- package/dist/node/{openai-Br-G1fCG.d.ts → openai-DnFW4Ryl.d.ts} +1 -1
- package/dist/node/{openai-C3gVV388.d.cts → openai-Dpl3GSEJ.d.cts} +1 -1
- package/package.json +1 -1
package/dist/node/index.cjs
CHANGED
|
@@ -93,7 +93,21 @@ var init_types = __esm({
|
|
|
93
93
|
});
|
|
94
94
|
|
|
95
95
|
// src/shared/errors.ts
|
|
96
|
-
|
|
96
|
+
function isWindowLimitError(err) {
|
|
97
|
+
if (!(err instanceof exports.HTTPError)) return false;
|
|
98
|
+
if (err.errorCode === windowLimitErrorCode) return true;
|
|
99
|
+
return err.message.includes(windowLimitErrorCode) || err.body.includes(windowLimitErrorCode);
|
|
100
|
+
}
|
|
101
|
+
function isWindowLimitStreamError(err) {
|
|
102
|
+
if (err == null || typeof err !== "object") return false;
|
|
103
|
+
const e = err;
|
|
104
|
+
if (e.code === windowLimitStreamCode) return true;
|
|
105
|
+
for (const field of [e.message, e.userMessage, e.rawError]) {
|
|
106
|
+
if (typeof field === "string" && field.includes(windowLimitErrorCode)) return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
exports.RateLimitError = void 0; exports.BusinessError = void 0; exports.OrderTerminalError = void 0; exports.ModelNotFoundError = void 0; exports.HTTPError = void 0; exports.NetworkError = void 0; exports.StreamError = void 0; var windowLimitErrorCode, windowLimitStreamCode;
|
|
97
111
|
var init_errors = __esm({
|
|
98
112
|
"src/shared/errors.ts"() {
|
|
99
113
|
exports.RateLimitError = class extends Error {
|
|
@@ -140,6 +154,12 @@ var init_errors = __esm({
|
|
|
140
154
|
retryAfter;
|
|
141
155
|
/** 原始响应体 (截断到 maxErrorBodySize) */
|
|
142
156
|
body;
|
|
157
|
+
/** 后端业务机器码 (响应体顶层 errorCode, e.g. "WINDOW_LIMIT_EXCEEDED"); 缺失为 undefined */
|
|
158
|
+
errorCode;
|
|
159
|
+
/** 窗口限额场景: 触发的滚动窗口档位 (FIVE_HOUR = 5 小时 / WEEKLY = 7 天); 缺失为 undefined */
|
|
160
|
+
windowKind;
|
|
161
|
+
/** 窗口限额场景: 预计恢复时间 (ISO-8601 UTC); 缺失为 undefined */
|
|
162
|
+
windowResetAt;
|
|
143
163
|
constructor(statusCode, opts = {}) {
|
|
144
164
|
let msg;
|
|
145
165
|
if (opts.type) {
|
|
@@ -157,6 +177,9 @@ var init_errors = __esm({
|
|
|
157
177
|
this.type = opts.type ?? "";
|
|
158
178
|
this.retryAfter = opts.retryAfter ?? 0;
|
|
159
179
|
this.body = opts.body ?? "";
|
|
180
|
+
this.errorCode = opts.errorCode;
|
|
181
|
+
this.windowKind = opts.windowKind;
|
|
182
|
+
this.windowResetAt = opts.windowResetAt;
|
|
160
183
|
}
|
|
161
184
|
};
|
|
162
185
|
exports.NetworkError = class extends Error {
|
|
@@ -212,6 +235,8 @@ var init_errors = __esm({
|
|
|
212
235
|
this.retryable = retryable;
|
|
213
236
|
}
|
|
214
237
|
};
|
|
238
|
+
windowLimitErrorCode = "WINDOW_LIMIT_EXCEEDED";
|
|
239
|
+
windowLimitStreamCode = "window_limit_exceeded";
|
|
215
240
|
}
|
|
216
241
|
});
|
|
217
242
|
|
|
@@ -1932,19 +1957,28 @@ function parseHTTPErrorWithHeader(statusCode, body, header) {
|
|
|
1932
1957
|
}
|
|
1933
1958
|
let type = "";
|
|
1934
1959
|
let message = "";
|
|
1960
|
+
let errorCode;
|
|
1961
|
+
let windowKind;
|
|
1962
|
+
let windowResetAt;
|
|
1935
1963
|
try {
|
|
1936
1964
|
const obj = JSON.parse(bodyStr);
|
|
1937
1965
|
if (obj && typeof obj === "object") {
|
|
1938
|
-
const
|
|
1966
|
+
const top = obj;
|
|
1967
|
+
const errObj = top.error;
|
|
1939
1968
|
if (errObj && typeof errObj === "object") {
|
|
1940
1969
|
const e = errObj;
|
|
1941
1970
|
if (typeof e.message === "string") message = e.message;
|
|
1942
1971
|
if (typeof e.type === "string") type = e.type;
|
|
1972
|
+
} else if (typeof top.message === "string") {
|
|
1973
|
+
message = top.message;
|
|
1943
1974
|
}
|
|
1975
|
+
if (typeof top.errorCode === "string") errorCode = top.errorCode;
|
|
1976
|
+
if (top.windowKind === "FIVE_HOUR" || top.windowKind === "WEEKLY") windowKind = top.windowKind;
|
|
1977
|
+
if (typeof top.windowResetAt === "string") windowResetAt = top.windowResetAt;
|
|
1944
1978
|
}
|
|
1945
1979
|
} catch {
|
|
1946
1980
|
}
|
|
1947
|
-
return new exports.HTTPError(statusCode, { type, message, retryAfter, body: bodyStr });
|
|
1981
|
+
return new exports.HTTPError(statusCode, { type, message, retryAfter, body: bodyStr, errorCode, windowKind, windowResetAt });
|
|
1948
1982
|
}
|
|
1949
1983
|
function classifyTransport(op, urlStr, err) {
|
|
1950
1984
|
const ne = new exports.NetworkError(op, urlStr, err);
|
|
@@ -2208,9 +2242,16 @@ var Client = class _Client {
|
|
|
2208
2242
|
fetchImpl;
|
|
2209
2243
|
/** 互斥锁 (TS 用 Promise chain 替代 sync.Mutex) */
|
|
2210
2244
|
mu = Promise.resolve();
|
|
2211
|
-
/**
|
|
2245
|
+
/**
|
|
2246
|
+
* WebSocket 状态 (实际方法由 ws.ts mixin 维护)。
|
|
2247
|
+
* @internal — 实现细节: 跨模块 (ws.ts mixin) 需可见故为 public, 但非消费者 API,
|
|
2248
|
+
* 消费者用 connect/subscribe 等高层方法; 引用的 WSState 不进公开文档。
|
|
2249
|
+
*/
|
|
2212
2250
|
ws = null;
|
|
2213
|
-
/**
|
|
2251
|
+
/**
|
|
2252
|
+
* v0.15.1: token 就绪等待机制 — login 成功后 resolve, 等待方解除阻塞。
|
|
2253
|
+
* @internal — 内部同步原语 (Deferred), 非消费者 API。
|
|
2254
|
+
*/
|
|
2214
2255
|
tokenReady = newDeferred();
|
|
2215
2256
|
/** Login 进行中 — 等待方需等而非 fail-fast */
|
|
2216
2257
|
loginInFlight = false;
|
|
@@ -5631,6 +5672,9 @@ function normalizeError(value) {
|
|
|
5631
5672
|
message: stringField(value, "message", "error") || "agent run failed",
|
|
5632
5673
|
stage: optionalStringField(value, "stage"),
|
|
5633
5674
|
retryable: typeof value.retryable === "boolean" ? value.retryable : void 0,
|
|
5675
|
+
// 窗口限额扩展 (code="window_limit_exceeded"): 契约 wire 为 camelCase, 蛇形兼容兜底。
|
|
5676
|
+
windowKind: optionalStringField(value, "windowKind", "window_kind"),
|
|
5677
|
+
windowResetAt: optionalStringField(value, "windowResetAt", "window_reset_at"),
|
|
5634
5678
|
raw: value
|
|
5635
5679
|
};
|
|
5636
5680
|
}
|
|
@@ -7692,6 +7736,8 @@ exports.isSSECommentLine = isSSECommentLine;
|
|
|
7692
7736
|
exports.isSSLError = isSSLError;
|
|
7693
7737
|
exports.isTerminalRemoteEvent = isTerminalRemoteEvent;
|
|
7694
7738
|
exports.isValidTokenSet = isValidTokenSet;
|
|
7739
|
+
exports.isWindowLimitError = isWindowLimitError;
|
|
7740
|
+
exports.isWindowLimitStreamError = isWindowLimitStreamError;
|
|
7695
7741
|
exports.maxEndUserIdLength = maxEndUserIdLength;
|
|
7696
7742
|
exports.modelScopes = modelScopes;
|
|
7697
7743
|
exports.modelSupportsImageInput = modelSupportsImageInput;
|