@acosmi/sdk-ts 1.0.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/LICENSE +21 -0
- package/README.md +247 -0
- package/dist/browser/index.js +3950 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/index.js +3950 -0
- package/dist/index.js.map +1 -0
- package/dist/node/adapters/anthropic.cjs +257 -0
- package/dist/node/adapters/anthropic.cjs.map +1 -0
- package/dist/node/adapters/anthropic.d.cts +39 -0
- package/dist/node/adapters/anthropic.d.ts +39 -0
- package/dist/node/adapters/anthropic.js +254 -0
- package/dist/node/adapters/anthropic.js.map +1 -0
- package/dist/node/adapters/openai.cjs +472 -0
- package/dist/node/adapters/openai.cjs.map +1 -0
- package/dist/node/adapters/openai.d.cts +64 -0
- package/dist/node/adapters/openai.d.ts +64 -0
- package/dist/node/adapters/openai.js +465 -0
- package/dist/node/adapters/openai.js.map +1 -0
- package/dist/node/index-C3Z_84Bv.d.cts +992 -0
- package/dist/node/index-C3Z_84Bv.d.ts +992 -0
- package/dist/node/index-nvLKgCm9.d.cts +147 -0
- package/dist/node/index-nvLKgCm9.d.ts +147 -0
- package/dist/node/index.cjs +4024 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +791 -0
- package/dist/node/index.d.ts +791 -0
- package/dist/node/index.js +3950 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/sanitize/index.cjs +248 -0
- package/dist/node/sanitize/index.cjs.map +1 -0
- package/dist/node/sanitize/index.d.cts +1 -0
- package/dist/node/sanitize/index.d.ts +1 -0
- package/dist/node/sanitize/index.js +217 -0
- package/dist/node/sanitize/index.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1,791 @@
|
|
|
1
|
+
import { S as ServerMetadata, T as TokenResponse, a as TokenSet, C as ClientRegistration, M as ModelCapabilities, b as ChatRequest, c as ManagedModel, d as ModelCoefficient, Q as QuotaSummary, P as ProviderAdapter, e as ChatResponse, A as AnthropicResponse, f as StreamEvent, g as SourcesEvent, h as StreamSettlement, E as EntitlementBalance, B as BalanceDetail, i as EntitlementItem, j as ConsumeRecordPage, k as ModelByQuotaResponse, l as ModelBucket, m as TokenPackage, n as PayPayload, O as Order, o as OrderStatus, W as WalletStats, p as Transaction, q as SkillStoreQuery, r as SkillStoreItem, s as SkillBrowseResponse, t as SkillBrowseListResponse, u as SkillSummary, v as CertificationStatus, G as GenerateSkillRequest, w as GenerateSkillResult, x as OptimizeSkillRequest, y as OptimizeSkillResult, z as ToolView, N as NotificationList, D as DeviceRegistration, F as NotificationPreference, H as WSEvent } from './index-C3Z_84Bv.cjs';
|
|
2
|
+
export { I as APIResponse, J as AnthropicContentBlock, K as AnthropicUsage, L as BucketClassCommercial, R as BucketClassGeneric, U as BucketInfo, V as BucketRow, X as BusinessError, Y as ChatContentBlock, Z as ChatMessage, _ as ChatUsage, $ as ConsumeRecord, a0 as EffortConfig, a1 as GeoLoc, a2 as HTTPError, a3 as ModelNotFoundError, a4 as NetworkError, a5 as Notification, a6 as NotificationUnreadCount, a7 as OpenAIChatChoice, a8 as OpenAIChatMessage, a9 as OpenAIChatResponse, aa as OpenAIFunctionCall, ab as OpenAIStreamChoice, ac as OpenAIStreamChunk, ad as OpenAIStreamDelta, ae as OpenAIStreamToolCall, af as OpenAIToolCall, ag as OpenAIUsage, ah as OrderTerminalError, ai as OutputConfig, aj as ProviderFormat, ak as RateLimitError, al as ServerTool, am as ServerToolTypeWebSearch, an as SkillStoreListItem, ao as StreamError, ap as ThinkingConfig, aq as ThinkingHigh, ar as ThinkingHighMinMaxTokens, as as ThinkingMax, at as ThinkingMaxFallbackMaxTokens, au as ThinkingOff, av as ToolListResponse, aw as ToolProvider, ax as WebSearchConfig, ay as WebSearchSource, az as YudaoPageResult, aA as anthropicResponseTextContent, aB as anthropicResponseThinkingContent, aC as anthropicResponseToolUseBlocks, aD as apiResponseBusinessError, aE as apiResponseGetMessage, aF as bucketInfoIsCommercial, aG as bucketRowIsCommercial, aH as getAdapter, aI as getAdapterForModel, aJ as newThinkingConfig, aK as newWebSearchTool, aL as parseNotificationEvent, aM as parseSettlement, aN as parseSourcesEvent, aO as tokenSetIsExpired } from './index-C3Z_84Bv.cjs';
|
|
3
|
+
import { M as MinimalSanitizeConfig } from './index-nvLKgCm9.cjs';
|
|
4
|
+
export { i as sanitize } from './index-nvLKgCm9.cjs';
|
|
5
|
+
export { AnthropicAdapter } from './adapters/anthropic.cjs';
|
|
6
|
+
export { OpenAIAdapter } from './adapters/openai.cjs';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 从 well-known 端点获取 Desktop OAuth 服务元数据。
|
|
10
|
+
*
|
|
11
|
+
* serverURL 可能含路径 (如 "https://acosmi.ai/api/v4"),
|
|
12
|
+
* well-known 端点按 RFC 8414 必须在 origin 根路径:
|
|
13
|
+
* https://acosmi.ai/.well-known/oauth-authorization-server/desktop
|
|
14
|
+
*/
|
|
15
|
+
declare function discover(serverURL: string, signal?: AbortSignal): Promise<ServerMetadata>;
|
|
16
|
+
/** 动态注册桌面客户端,获取 client_id */
|
|
17
|
+
declare function register(meta: ServerMetadata, appName: string, signal?: AbortSignal): Promise<ClientRegistration>;
|
|
18
|
+
type LoginEventType = 'auth_url' | 'complete' | 'error';
|
|
19
|
+
declare const EventAuthURL: "auth_url";
|
|
20
|
+
declare const EventComplete: "complete";
|
|
21
|
+
declare const EventError: "error";
|
|
22
|
+
type LoginErrCode = 'discovery_failed' | 'registration_failed' | 'browser_open_failed' | 'auth_denied' | 'auth_timeout' | 'token_exchange_failed' | 'ssl_proxy_detected';
|
|
23
|
+
declare const ErrDiscovery: "discovery_failed";
|
|
24
|
+
declare const ErrRegistration: "registration_failed";
|
|
25
|
+
declare const ErrBrowserOpen: "browser_open_failed";
|
|
26
|
+
declare const ErrAuthDenied: "auth_denied";
|
|
27
|
+
declare const ErrTimeout: "auth_timeout";
|
|
28
|
+
declare const ErrTokenExchange: "token_exchange_failed";
|
|
29
|
+
declare const ErrSSLProxy: "ssl_proxy_detected";
|
|
30
|
+
/** 登录流程事件 */
|
|
31
|
+
interface LoginEvent {
|
|
32
|
+
type: LoginEventType;
|
|
33
|
+
url?: string;
|
|
34
|
+
error?: string;
|
|
35
|
+
err_code?: LoginErrCode;
|
|
36
|
+
}
|
|
37
|
+
/** 登录选项 (函数选项模式 → TS options object) */
|
|
38
|
+
interface LoginOptions {
|
|
39
|
+
/** 跳过自动打开浏览器 (由调用方控制浏览器) */
|
|
40
|
+
skipBrowser?: boolean;
|
|
41
|
+
/** SSO 场景下的 email 预填 */
|
|
42
|
+
loginHint?: string;
|
|
43
|
+
/** 如 "sso" */
|
|
44
|
+
loginMethod?: string;
|
|
45
|
+
/** 强制组织登录 */
|
|
46
|
+
orgUUID?: string;
|
|
47
|
+
/** 自定义 token 有效期 (秒) */
|
|
48
|
+
expiresIn?: number;
|
|
49
|
+
}
|
|
50
|
+
/** 检测 SSL/TLS 相关错误 (企业代理 Zscaler 等) */
|
|
51
|
+
declare function isSSLError(err: unknown): boolean;
|
|
52
|
+
interface AuthorizeResult {
|
|
53
|
+
code: string;
|
|
54
|
+
redirectURI: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 执行 OAuth 2.1 PKCE 授权流程 (Node only):
|
|
58
|
+
* 1. 启动本地 HTTP server
|
|
59
|
+
* 2. 打开浏览器让用户登录并授权
|
|
60
|
+
* 3. 接收回调拿到 authorization code
|
|
61
|
+
* 4. 返回 code 供后续 token 交换
|
|
62
|
+
*
|
|
63
|
+
* 浏览器环境会抛错 — 浏览器侧应自行实现 popup window + redirect handler。
|
|
64
|
+
*/
|
|
65
|
+
declare function authorize(meta: ServerMetadata, clientID: string, scopes: string[], opts?: LoginOptions & {
|
|
66
|
+
handler?: (e: LoginEvent) => void;
|
|
67
|
+
signal?: AbortSignal;
|
|
68
|
+
}): Promise<{
|
|
69
|
+
result: AuthorizeResult;
|
|
70
|
+
verifier: string;
|
|
71
|
+
}>;
|
|
72
|
+
declare function exchangeCode(meta: ServerMetadata, clientID: string, code: string, redirectURI: string, codeVerifier: string, signal?: AbortSignal): Promise<TokenResponse>;
|
|
73
|
+
/** 刷新 access_token */
|
|
74
|
+
declare function refreshToken(meta: ServerMetadata, clientID: string, refreshTokenValue: string, signal?: AbortSignal): Promise<TokenResponse>;
|
|
75
|
+
/** 吊销 token. 服务端不支持吊销时静默跳过. */
|
|
76
|
+
declare function revokeToken(meta: ServerMetadata, token: string, signal?: AbortSignal): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* 从 TokenResponse 构造可持久化的 TokenSet
|
|
79
|
+
*
|
|
80
|
+
* 根因修复 #14: expires_in=0 会导致 token 立即过期 → 无限刷新循环
|
|
81
|
+
* 最少保证 60 秒有效期
|
|
82
|
+
*/
|
|
83
|
+
declare function newTokenSet(resp: TokenResponse, clientID: string, serverURL: string): TokenSet;
|
|
84
|
+
|
|
85
|
+
declare const ScopeAI = "ai";
|
|
86
|
+
declare const ScopeSkills = "skills";
|
|
87
|
+
declare const ScopeAccount = "account";
|
|
88
|
+
/** @deprecated 旧细粒度 scope, 保留向后兼容, 新代码请用分组 scope */
|
|
89
|
+
declare const ScopeModels = "models";
|
|
90
|
+
/** @deprecated */
|
|
91
|
+
declare const ScopeModelsChat = "models:chat";
|
|
92
|
+
/** @deprecated */
|
|
93
|
+
declare const ScopeEntitlements = "entitlements";
|
|
94
|
+
/** @deprecated */
|
|
95
|
+
declare const ScopeTokenPackages = "token-packages";
|
|
96
|
+
/** @deprecated */
|
|
97
|
+
declare const ScopeSkillStore = "skill_store";
|
|
98
|
+
/** @deprecated */
|
|
99
|
+
declare const ScopeTools = "tools";
|
|
100
|
+
/** @deprecated */
|
|
101
|
+
declare const ScopeToolsExecute = "tools:execute";
|
|
102
|
+
/** @deprecated */
|
|
103
|
+
declare const ScopeWallet = "wallet";
|
|
104
|
+
/** @deprecated */
|
|
105
|
+
declare const ScopeWalletReadonly = "wallet:readonly";
|
|
106
|
+
/** @deprecated */
|
|
107
|
+
declare const ScopeProfile = "profile";
|
|
108
|
+
/** 全部分组 scope (推荐) */
|
|
109
|
+
declare function allScopes(): string[];
|
|
110
|
+
/** 模型服务相关 scope */
|
|
111
|
+
declare function modelScopes(): string[];
|
|
112
|
+
/** 商城/钱包 scope */
|
|
113
|
+
declare function commerceScopes(): string[];
|
|
114
|
+
/** 技能/工具 scope */
|
|
115
|
+
declare function skillScopes(): string[];
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Token 持久化接口
|
|
119
|
+
* 桌面智能体可自行实现 (如 macOS Keychain / Windows Credential Manager)
|
|
120
|
+
*
|
|
121
|
+
* 跨端约定:
|
|
122
|
+
* - Save: 写入持久化, 失败抛 Error
|
|
123
|
+
* - Load: 读取, 不存在返回 null (与 Go IsNotExist 行为一致)
|
|
124
|
+
* - Clear: 删除, 不存在不抛错 (Logout 后 Clear 不应报错, [RC-11])
|
|
125
|
+
*/
|
|
126
|
+
interface TokenStore {
|
|
127
|
+
save(tokens: TokenSet): Promise<void>;
|
|
128
|
+
load(): Promise<TokenSet | null>;
|
|
129
|
+
clear(): Promise<void>;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* 基于文件的 token 存储 (开发/测试用)
|
|
133
|
+
* 生产环境建议替换为系统钥匙串实现
|
|
134
|
+
*
|
|
135
|
+
* 默认路径: ~/.acosmi/tokens.json
|
|
136
|
+
*
|
|
137
|
+
* 浏览器环境调用 new FileTokenStore() 会抛错 — 浏览器请用 LocalStorageTokenStore 或 InMemoryTokenStore.
|
|
138
|
+
*/
|
|
139
|
+
declare class FileTokenStore implements TokenStore {
|
|
140
|
+
private path;
|
|
141
|
+
/** 简单串行化锁 (替代 Go sync.Mutex) */
|
|
142
|
+
private chain;
|
|
143
|
+
constructor(path?: string);
|
|
144
|
+
private resolvePath;
|
|
145
|
+
private withLock;
|
|
146
|
+
save(tokens: TokenSet): Promise<void>;
|
|
147
|
+
load(): Promise<TokenSet | null>;
|
|
148
|
+
clear(): Promise<void>;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* 创建文件 token 存储 (与 Go NewFileTokenStore 等价)
|
|
152
|
+
* @param path 自定义路径; 空则使用默认 ~/.acosmi/tokens.json
|
|
153
|
+
*/
|
|
154
|
+
declare function newFileTokenStore(path?: string): FileTokenStore;
|
|
155
|
+
/**
|
|
156
|
+
* 基于 LocalStorage 的 token 存储 (浏览器)
|
|
157
|
+
*
|
|
158
|
+
* 仅在浏览器环境可用 (检测 globalThis.localStorage)。
|
|
159
|
+
* 不持久化跨设备同步, 适合单机 SPA 使用。
|
|
160
|
+
*/
|
|
161
|
+
declare class LocalStorageTokenStore implements TokenStore {
|
|
162
|
+
private key;
|
|
163
|
+
constructor(key?: string);
|
|
164
|
+
save(tokens: TokenSet): Promise<void>;
|
|
165
|
+
load(): Promise<TokenSet | null>;
|
|
166
|
+
clear(): Promise<void>;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* 内存 token 存储 (不持久化, 进程重启即丢失)
|
|
170
|
+
* 适合: 测试 / Deno script / 短期 SDK 调用 / 不希望落盘的安全场景
|
|
171
|
+
*/
|
|
172
|
+
declare class InMemoryTokenStore implements TokenStore {
|
|
173
|
+
private tokens;
|
|
174
|
+
save(tokens: TokenSet): Promise<void>;
|
|
175
|
+
load(): Promise<TokenSet | null>;
|
|
176
|
+
clear(): Promise<void>;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** 表示一次 retry 评估的请求快照 — 仅供 SafeToRetry 闸门使用 */
|
|
180
|
+
interface RetryRequestInfo {
|
|
181
|
+
method: string;
|
|
182
|
+
url: string;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 配置 SDK 重试行为.
|
|
186
|
+
*
|
|
187
|
+
* undefined 字段使用 DefaultRetryPolicy 对应字段; null/undefined RetryPolicy 自身禁用重试.
|
|
188
|
+
*/
|
|
189
|
+
interface RetryPolicy {
|
|
190
|
+
/** 总尝试次数 (含首次). 1 = 不重试; 默认 2. */
|
|
191
|
+
maxAttempts?: number;
|
|
192
|
+
/** 首次重试退避时长 (毫秒). 默认 200. */
|
|
193
|
+
backoffMs?: number;
|
|
194
|
+
/** 退避最大值 (指数增长封顶, 毫秒). 默认 2000. */
|
|
195
|
+
backoffMaxMs?: number;
|
|
196
|
+
/** 指数倍数. 默认 2.0. */
|
|
197
|
+
backoffMul?: number;
|
|
198
|
+
/**
|
|
199
|
+
* 错误层闸门: 是否值得重试.
|
|
200
|
+
* 默认 defaultRetryable: HTTPError 5xx/429, NetworkError Timeout/EOF, 排除 StreamError.
|
|
201
|
+
*/
|
|
202
|
+
onRetryable?: (err: unknown) => boolean;
|
|
203
|
+
/**
|
|
204
|
+
* 请求层闸门 (计费安全核心): 当前请求是否值得重试.
|
|
205
|
+
* 默认 defaultSafeToRetry: GET/HEAD/OPTIONS true, 其他 false.
|
|
206
|
+
* chat/messages/upload POST → 默认 false 兜底, 双扣绝不发生.
|
|
207
|
+
*/
|
|
208
|
+
safeToRetry?: (req: RetryRequestInfo) => boolean;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* 安全默认值.
|
|
212
|
+
*
|
|
213
|
+
* 计费安全红线: safeToRetry 默认 POST=false → chat/messages 用户 0 行为变化.
|
|
214
|
+
* GET 类查询 (skill-store/models/balance) 自动得 2x 稳定性.
|
|
215
|
+
*/
|
|
216
|
+
declare const DefaultRetryPolicy: Required<Omit<RetryPolicy, never>>;
|
|
217
|
+
/**
|
|
218
|
+
* 计费安全闸门.
|
|
219
|
+
*
|
|
220
|
+
* 仅以下 method 视为幂等:
|
|
221
|
+
* - GET / HEAD / OPTIONS: 天然幂等
|
|
222
|
+
*
|
|
223
|
+
* POST/PUT/DELETE/PATCH 默认 false (双扣保护). 调用方需要 GET 类 POST 重试可自定义 safeToRetry.
|
|
224
|
+
*/
|
|
225
|
+
declare function defaultSafeToRetry(req: RetryRequestInfo): boolean;
|
|
226
|
+
/**
|
|
227
|
+
* 错误层闸门.
|
|
228
|
+
*
|
|
229
|
+
* 显式排除 (优先级最高):
|
|
230
|
+
* - StreamError: V2 P0 SSE 中段错误, 流已部分写出, 重试 = 双 token + 重复消息
|
|
231
|
+
* - AbortSignal aborted: 用户主动 abort, 重试无意义 (TS 中由调用方在 onRetryable 之前检查)
|
|
232
|
+
*
|
|
233
|
+
* 视为可重试:
|
|
234
|
+
* - HTTPError 5xx 或 429
|
|
235
|
+
* - NetworkError isTimeout() 或 isEOF()
|
|
236
|
+
*
|
|
237
|
+
* 其他 (如 4xx 业务错误 / DNS 失败 / BusinessError): 不重试
|
|
238
|
+
*/
|
|
239
|
+
declare function defaultRetryable(err: unknown): boolean;
|
|
240
|
+
/** 实际生效策略 (undefined → DefaultRetryPolicy 兜底; 字段缺失填默认值) */
|
|
241
|
+
declare function effectivePolicy(p: RetryPolicy | null | undefined): Required<RetryPolicy> | null;
|
|
242
|
+
/**
|
|
243
|
+
* 计算第 attempt 次重试的退避时长 (毫秒, attempt 从 0 起).
|
|
244
|
+
* 优先级: HTTPError.retryAfter (上限 60s) > 指数退避 (backoffMs * backoffMul^attempt, 封顶 backoffMaxMs)
|
|
245
|
+
*/
|
|
246
|
+
declare function computeBackoff(p: Required<RetryPolicy>, attempt: number, err: unknown): number;
|
|
247
|
+
|
|
248
|
+
/** SDK 为单个 content block 缓存的元数据 */
|
|
249
|
+
interface BlockMeta {
|
|
250
|
+
type: string;
|
|
251
|
+
ephemeral: boolean;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* 按 Anthropic SSE 事件类型解析 data, 更新 blockTypeMap, 返回 [index, type, ephemeral]。
|
|
255
|
+
*
|
|
256
|
+
* 仅当事件为 content_block_start / content_block_delta / content_block_stop
|
|
257
|
+
* 时返回非空 type; 其他事件返回空 type, 调用方据此判别是否填充 StreamEvent 元数据字段。
|
|
258
|
+
*/
|
|
259
|
+
declare function extractAnthropicBlockMeta(eventType: string, data: string, blockTypeMap: Map<number, BlockMeta>): [number, string, boolean];
|
|
260
|
+
|
|
261
|
+
/** 根据模型能力和请求参数自动组装 beta header 列表 */
|
|
262
|
+
declare function buildBetas(caps: ModelCapabilities, req: ChatRequest): string[];
|
|
263
|
+
/** 合并两个字符串数组并去重, 保留顺序 */
|
|
264
|
+
declare function uniqueMerge(base: string[], extra: string[]): string[];
|
|
265
|
+
|
|
266
|
+
type FilterStatus = 'ok' | 'admin-bypass' | 'internal-bypass' | 'disabled-by-flag' | 'fallback-tkdist-error' | 'fallback-tkdist-deployment-skew' | 'fallback-no-buckets' | 'fallback-missing-userid' | '';
|
|
267
|
+
declare const FilterStatusOK: FilterStatus;
|
|
268
|
+
declare const FilterStatusAdminBypass: FilterStatus;
|
|
269
|
+
declare const FilterStatusInternalBypass: FilterStatus;
|
|
270
|
+
declare const FilterStatusDisabledByFlag: FilterStatus;
|
|
271
|
+
declare const FilterStatusFallbackTkdistError: FilterStatus;
|
|
272
|
+
declare const FilterStatusFallbackTkdistSkew: FilterStatus;
|
|
273
|
+
declare const FilterStatusFallbackNoBuckets: FilterStatus;
|
|
274
|
+
declare const FilterStatusFallbackMissingUser: FilterStatus;
|
|
275
|
+
declare const FilterStatusUnknown: FilterStatus;
|
|
276
|
+
/** 客户端配置 */
|
|
277
|
+
interface Config {
|
|
278
|
+
/**
|
|
279
|
+
* nexus-v4 API 根地址 (默认 https://acosmi.com)。
|
|
280
|
+
* SDK 自动追加 /api/v4, 无需手动拼接。
|
|
281
|
+
*/
|
|
282
|
+
serverURL?: string;
|
|
283
|
+
/** token 持久化实现, 缺省时按平台选 (Node File / Browser LocalStorage / Memory) */
|
|
284
|
+
store?: TokenStore;
|
|
285
|
+
/** 自定义 fetch 实现 (默认 globalThis.fetch) */
|
|
286
|
+
fetchImpl?: typeof fetch;
|
|
287
|
+
/**
|
|
288
|
+
* 重试策略 (L6, v0.15)
|
|
289
|
+
*
|
|
290
|
+
* undefined = 禁用重试 (v0.14.1 行为, 老调用方 0 影响)
|
|
291
|
+
* 非 undefined = 启用 — 默认 SafeToRetry POST=false 兜底, chat/messages POST 仍 0 retry
|
|
292
|
+
* GET 类查询 (skill-store/models/balance) 自动得 2x 稳定性
|
|
293
|
+
*
|
|
294
|
+
* 计费安全: 自定义 SafeToRetry 时, 严禁让 POST chat/messages 通过, 否则双扣
|
|
295
|
+
*/
|
|
296
|
+
retryPolicy?: RetryPolicy;
|
|
297
|
+
}
|
|
298
|
+
interface Deferred<T> {
|
|
299
|
+
promise: Promise<T>;
|
|
300
|
+
resolve: (v: T) => void;
|
|
301
|
+
reject: (e: unknown) => void;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* WebSocket 状态 — 内部使用, 实际方法由 ws.ts mixin 提供
|
|
305
|
+
* 留作 forward declaration, 避免循环依赖
|
|
306
|
+
*/
|
|
307
|
+
interface WSState {
|
|
308
|
+
connected: boolean;
|
|
309
|
+
[key: string]: any;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Acosmi nexus-v4 统一 API 客户端
|
|
313
|
+
*
|
|
314
|
+
* 覆盖全域 API: 模型/权益/商城/钱包/技能/工具/WebSocket
|
|
315
|
+
* 自动处理 token 刷新, 所有 API 调用线程安全 (基于 Promise chain)
|
|
316
|
+
*/
|
|
317
|
+
declare class Client {
|
|
318
|
+
/** SDK 内部使用 — 业务方法 (mixin) 通过 this.* 访问以下字段 */
|
|
319
|
+
/** 服务器根地址 (已 trim 尾随 /) */
|
|
320
|
+
serverURL: string;
|
|
321
|
+
/** OAuth metadata (lazy loaded) */
|
|
322
|
+
meta: ServerMetadata | null;
|
|
323
|
+
/** 当前 token (内存) */
|
|
324
|
+
tokens: TokenSet | null;
|
|
325
|
+
/** token 持久化 */
|
|
326
|
+
store: TokenStore;
|
|
327
|
+
/** fetch 实现 (默认 globalThis.fetch) */
|
|
328
|
+
fetchImpl: typeof fetch;
|
|
329
|
+
/** 互斥锁 (TS 用 Promise chain 替代 sync.Mutex) */
|
|
330
|
+
private mu;
|
|
331
|
+
/** WebSocket 状态 (实际方法由 ws.ts mixin 维护) */
|
|
332
|
+
ws: WSState | null;
|
|
333
|
+
/** v0.15.1: token 就绪等待机制 — login 成功后 resolve, 等待方解除阻塞 */
|
|
334
|
+
tokenReady: Deferred<void>;
|
|
335
|
+
/** Login 进行中 — 等待方需等而非 fail-fast */
|
|
336
|
+
loginInFlight: boolean;
|
|
337
|
+
/** 防止 tokenReady 被多次 resolve (替代 Go sync.Once) */
|
|
338
|
+
private tokenReadyResolved;
|
|
339
|
+
/** 模型能力缓存 (CrabCode 扩展) */
|
|
340
|
+
modelCache: ManagedModel[];
|
|
341
|
+
modelCacheTimeMs: number;
|
|
342
|
+
/** sanitize-bridge 配置 (默认禁用) */
|
|
343
|
+
defensiveCfg: MinimalSanitizeConfig | null;
|
|
344
|
+
autoStripEphemeral: boolean;
|
|
345
|
+
/** L6 (v0.15): 重试策略. null = 禁用 (v0.14.1 行为) */
|
|
346
|
+
retryPolicy: Required<RetryPolicy> | null;
|
|
347
|
+
/** V29 系数缓存 (TTL 8s, listCoefficients 内部用) */
|
|
348
|
+
coefCacheData: ModelCoefficient[] | null;
|
|
349
|
+
coefCacheTimeMs: number;
|
|
350
|
+
/** 串行化锁 (替代 Go sync.Mutex) */
|
|
351
|
+
private coefMu;
|
|
352
|
+
constructor(cfg?: Config);
|
|
353
|
+
/**
|
|
354
|
+
* 异步初始化 (从 store 加载已有 token)
|
|
355
|
+
* 替代 Go NewClient (Go 同步 IO, TS 必须 async)
|
|
356
|
+
*/
|
|
357
|
+
static create(cfg?: Config): Promise<Client>;
|
|
358
|
+
/** 是否已授权 (有可用 token) */
|
|
359
|
+
isAuthorized(): boolean;
|
|
360
|
+
/** 当前 token 信息 (用于 CLI whoami 显示) */
|
|
361
|
+
getTokenSet(): TokenSet | null;
|
|
362
|
+
private getCachedClientID;
|
|
363
|
+
/**
|
|
364
|
+
* 完整授权流程: 发现 → 注册 → 授权 → 换 token → 持久化
|
|
365
|
+
* @param appName 桌面智能体名称 (如 "CrabClaw Desktop")
|
|
366
|
+
* @param scopes 请求的权限范围 (参考 allScopes / modelScopes / commerceScopes 等预设)
|
|
367
|
+
*/
|
|
368
|
+
login(appName: string, scopes: string[], signal?: AbortSignal): Promise<void>;
|
|
369
|
+
/**
|
|
370
|
+
* 带事件回调的登录流程 — CrabCode 使用
|
|
371
|
+
*
|
|
372
|
+
* handler 在以下时刻被调用:
|
|
373
|
+
* - EventAuthURL: 授权 URL 已就绪, 调用方可展示/打开浏览器
|
|
374
|
+
* - EventComplete: 登录成功, tokens 已持久化
|
|
375
|
+
* - EventError: 某步骤失败, 附 ErrCode 分类码
|
|
376
|
+
*
|
|
377
|
+
* 当 handler 为 null 时, 行为与 login() 完全一致。
|
|
378
|
+
*/
|
|
379
|
+
loginWithHandler(appName: string, scopes: string[], handler: ((e: LoginEvent) => void) | null, opts?: LoginOptions, signal?: AbortSignal): Promise<void>;
|
|
380
|
+
private loginInternal;
|
|
381
|
+
/** 吊销 token 并清除本地存储 */
|
|
382
|
+
logout(signal?: AbortSignal): Promise<void>;
|
|
383
|
+
/**
|
|
384
|
+
* 确保有有效的 access_token, 过期则自动刷新
|
|
385
|
+
*
|
|
386
|
+
* v0.15.1: 当 tokens==null 且 login 正在并发进行中时, 阻塞等待 token 就绪,
|
|
387
|
+
* 避免应用启动期 "login + 多个 API 调用" 并发场景下 4+ 条 "not authorized" 误报.
|
|
388
|
+
*/
|
|
389
|
+
ensureToken(signal?: AbortSignal): Promise<string>;
|
|
390
|
+
/** 强制刷新 token (用于 401 重试) */
|
|
391
|
+
forceRefresh(signal?: AbortSignal): Promise<void>;
|
|
392
|
+
/** 互斥锁 helper (替代 Go sync.Mutex) */
|
|
393
|
+
private withMu;
|
|
394
|
+
/**
|
|
395
|
+
* 获取可用的托管模型列表.
|
|
396
|
+
*
|
|
397
|
+
* V30 二轮审计 D-P1-2: 此方法不返回 entitlement-filter-status header.
|
|
398
|
+
* UI 想根据 fallback 状态显示降级提示, 请改调 listModelsWithStatus.
|
|
399
|
+
*/
|
|
400
|
+
listModels(signal?: AbortSignal): Promise<ManagedModel[]>;
|
|
401
|
+
/**
|
|
402
|
+
* 获取可用模型列表, 同时返回 X-Entitlement-Filter-Status header.
|
|
403
|
+
*
|
|
404
|
+
* V30 二轮审计 D-P1-2: 老 listModels 丢弃 header 让 SDK 用户无法识别 fail-OPEN 降级状态,
|
|
405
|
+
* 此方法暴露 status 让 UI 可:
|
|
406
|
+
* - status === 'ok' → 正常显示 BucketInfo 余量
|
|
407
|
+
* - status === 'fallback-tkdist-error' → 灰显余量 + toast "tk-dist 离线, 模型列表降级"
|
|
408
|
+
* - status === 'disabled-by-flag' → 不显示余量 (运维灰度中)
|
|
409
|
+
* - status === '' (Unknown) → 老 nexus, 按老 v0.17 行为 (不显示 BucketInfo)
|
|
410
|
+
*/
|
|
411
|
+
listModelsWithStatus(signal?: AbortSignal): Promise<{
|
|
412
|
+
models: ManagedModel[];
|
|
413
|
+
status: FilterStatus;
|
|
414
|
+
}>;
|
|
415
|
+
/** 查询当前用户账户级权益总览 (v0.19+) */
|
|
416
|
+
getQuotaSummary(signal?: AbortSignal): Promise<QuotaSummary>;
|
|
417
|
+
/**
|
|
418
|
+
* 查询单个模型的能力矩阵
|
|
419
|
+
* 优先从 listModels 缓存读取, miss 时调用 listModels 刷新
|
|
420
|
+
*/
|
|
421
|
+
getModelCapabilities(modelID: string, signal?: AbortSignal): Promise<ModelCapabilities>;
|
|
422
|
+
private getCachedCapabilities;
|
|
423
|
+
/** 从缓存中查找完整 ManagedModel (未命中返 null) */
|
|
424
|
+
private getCachedModel;
|
|
425
|
+
/** 测试辅助: 把占位 ManagedModel 塞入缓存. 仅测试用. */
|
|
426
|
+
primeModelCacheForTest(...ids: string[]): void;
|
|
427
|
+
/**
|
|
428
|
+
* 确保指定 modelID 的 ManagedModel 已在缓存中。
|
|
429
|
+
*
|
|
430
|
+
* 语义:
|
|
431
|
+
* 1. 若缓存命中 → 直接返回
|
|
432
|
+
* 2. 若未命中 → 调 listModels 刷新一次
|
|
433
|
+
* 3. 刷新后仍未命中 → 抛 ModelNotFoundError
|
|
434
|
+
*
|
|
435
|
+
* 根因修复: 消除未预热场景下 provider="anthropic" 硬编码回退,
|
|
436
|
+
* 该回退会让 DashScope/Zhipu/DeepSeek 等 non-anthropic 模型被按 Anthropic
|
|
437
|
+
* 格式编码并打到错误的 /anthropic 端点。
|
|
438
|
+
*/
|
|
439
|
+
ensureModelCached(modelID: string, signal?: AbortSignal): Promise<ManagedModel>;
|
|
440
|
+
/**
|
|
441
|
+
* 构建完整的聊天请求体 (v0.5.0 adapter 模式)
|
|
442
|
+
*
|
|
443
|
+
* 根据 provider 选择 adapter, 委托 buildRequestBody 构建格式化的请求体。
|
|
444
|
+
*
|
|
445
|
+
* v0.13.x: 前置 ensureModelCached, 消除冷缓存硬编码回退。未知 modelID 抛 ModelNotFoundError.
|
|
446
|
+
*/
|
|
447
|
+
buildChatRequest(modelID: string, req: ChatRequest, signal?: AbortSignal): Promise<{
|
|
448
|
+
body: string;
|
|
449
|
+
adapter: ProviderAdapter;
|
|
450
|
+
}>;
|
|
451
|
+
/**
|
|
452
|
+
* 同步聊天 (适合短回复)
|
|
453
|
+
* 响应的 tokenRemaining / callRemaining 字段来自服务端 Header, 反映结算后余额
|
|
454
|
+
* v0.5.0: 根据 provider 自动路由到 /anthropic 或 /chat 端点
|
|
455
|
+
*/
|
|
456
|
+
chat(modelID: string, req: ChatRequest, signal?: AbortSignal): Promise<ChatResponse>;
|
|
457
|
+
/**
|
|
458
|
+
* Anthropic 原生格式同步聊天
|
|
459
|
+
* v0.5.0: 根据 provider 自动路由
|
|
460
|
+
* Anthropic → chatMessagesAnthropic (现有路径, POST /anthropic)
|
|
461
|
+
* 其他厂商 → chatMessagesOpenAI (POST /chat, 响应转换为 AnthropicResponse)
|
|
462
|
+
*/
|
|
463
|
+
chatMessages(modelID: string, req: ChatRequest, signal?: AbortSignal): Promise<AnthropicResponse>;
|
|
464
|
+
private chatMessagesAnthropic;
|
|
465
|
+
private chatMessagesOpenAI;
|
|
466
|
+
/**
|
|
467
|
+
* 流式聊天 (SSE), 通过 async generator 返回事件
|
|
468
|
+
* v0.5.0: 根据 adapter 路由端点
|
|
469
|
+
*/
|
|
470
|
+
chatStream(modelID: string, req: ChatRequest, signal?: AbortSignal): AsyncIterable<StreamEvent>;
|
|
471
|
+
/**
|
|
472
|
+
* Anthropic 原生格式流式聊天 (SSE)
|
|
473
|
+
* 调用 POST /managed-models/:id/anthropic, SSE 事件为 Anthropic 协议格式
|
|
474
|
+
* 无 started/settled/failed 自定义事件, 无 data: [DONE], message_stop 为自然结束
|
|
475
|
+
*/
|
|
476
|
+
chatMessagesStream(modelID: string, req: ChatRequest, signal?: AbortSignal): AsyncIterable<StreamEvent>;
|
|
477
|
+
private chatStreamGen;
|
|
478
|
+
private chatMessagesStreamGen;
|
|
479
|
+
/**
|
|
480
|
+
* 流式聊天, 自动解析结算事件和搜索来源
|
|
481
|
+
*
|
|
482
|
+
* 返回单一 tagged AsyncIterable, kind 区分 4 种事件:
|
|
483
|
+
* - kind='content': 内容增量事件
|
|
484
|
+
* - kind='sources': 搜索来源
|
|
485
|
+
* - kind='settle': 结算 (token 消耗 + 剩余余额)
|
|
486
|
+
*
|
|
487
|
+
* Go 版本 4 channels (eventCh/sourcesCh/settleCh/errCh), 错误抛出取代 errCh。
|
|
488
|
+
*/
|
|
489
|
+
chatStreamWithUsage(modelID: string, req: ChatRequest, signal?: AbortSignal): AsyncGenerator<{
|
|
490
|
+
kind: 'content';
|
|
491
|
+
event: StreamEvent;
|
|
492
|
+
} | {
|
|
493
|
+
kind: 'sources';
|
|
494
|
+
event: SourcesEvent;
|
|
495
|
+
} | {
|
|
496
|
+
kind: 'settle';
|
|
497
|
+
event: StreamSettlement;
|
|
498
|
+
}, void, void>;
|
|
499
|
+
apiURL(path: string): string;
|
|
500
|
+
/** GET/POST/... 通用 JSON 调用 (返回 result 已 typed) */
|
|
501
|
+
doJSON<T>(method: string, path: string, body: unknown | null, signal?: AbortSignal): Promise<T>;
|
|
502
|
+
/** 与 doJSON 相同, 但返回响应 Headers (用于提取 X-Token-Remaining 等) */
|
|
503
|
+
doJSONFull<T>(method: string, path: string, body: unknown | null, signal?: AbortSignal): Promise<{
|
|
504
|
+
result: T;
|
|
505
|
+
headers: Headers;
|
|
506
|
+
}>;
|
|
507
|
+
private doJSONFullInternal;
|
|
508
|
+
/** doJSONFull 的 raw bytes 变体 (chat 用, 不立即 JSON.parse) */
|
|
509
|
+
doJSONFullRaw(method: string, path: string, body: unknown | null, signal?: AbortSignal): Promise<{
|
|
510
|
+
result: Uint8Array;
|
|
511
|
+
headers: Headers;
|
|
512
|
+
}>;
|
|
513
|
+
private doJSONFullRawInternal;
|
|
514
|
+
/**
|
|
515
|
+
* 公共端点请求
|
|
516
|
+
* 有 token 时自动附带 (享受认证用户待遇), 无 token 时匿名请求
|
|
517
|
+
* 不做 401 重试 (公共端点不应要求认证)
|
|
518
|
+
*/
|
|
519
|
+
doPublicJSON<T>(method: string, path: string, body: unknown | null, signal?: AbortSignal): Promise<T>;
|
|
520
|
+
/**
|
|
521
|
+
* fetch 包装 — 错误经 classifyTransport 转 NetworkError
|
|
522
|
+
* 6 处原始 fetch() 全部走此 helper
|
|
523
|
+
*/
|
|
524
|
+
doRequest(req: {
|
|
525
|
+
method: string;
|
|
526
|
+
url: string;
|
|
527
|
+
headers: Record<string, string>;
|
|
528
|
+
body?: string;
|
|
529
|
+
}, signal?: AbortSignal): Promise<Response>;
|
|
530
|
+
/**
|
|
531
|
+
* 带 RetryPolicy 的 doRequest 包装 — 仅用于同步 (非流式) 路径.
|
|
532
|
+
*
|
|
533
|
+
* 重试触发:
|
|
534
|
+
* - transport 层 err (NetworkError isTimeout/isEOF) → 重试
|
|
535
|
+
* - HTTP 5xx / 429 → 主动构造 HTTPError 喂给 onRetryable, 默认重试
|
|
536
|
+
* - 其他 (HTTP 2xx/3xx/4xx 非 429 / DNS / StreamError) → 不重试
|
|
537
|
+
*
|
|
538
|
+
* 流式路径 (chatMessagesStreamGen / chatStreamGen) **不得**调用此函数, 必须直接用 doRequest.
|
|
539
|
+
*/
|
|
540
|
+
doRequestWithRetry(req: {
|
|
541
|
+
method: string;
|
|
542
|
+
url: string;
|
|
543
|
+
headers: Record<string, string>;
|
|
544
|
+
body?: string;
|
|
545
|
+
}, signal?: AbortSignal): Promise<Response>;
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
declare module '../client' {
|
|
549
|
+
interface Client {
|
|
550
|
+
/** 查询当前用户的权益余额 (聚合) */
|
|
551
|
+
getBalance(signal?: AbortSignal): Promise<EntitlementBalance>;
|
|
552
|
+
/** 查询详细余额 (含每条权益明细) */
|
|
553
|
+
getBalanceDetail(signal?: AbortSignal): Promise<BalanceDetail>;
|
|
554
|
+
/** 查询当前用户权益列表; status: "ACTIVE" / "EXPIRED" / "" (全部) */
|
|
555
|
+
listEntitlements(status: string, signal?: AbortSignal): Promise<EntitlementItem[]>;
|
|
556
|
+
/** 查询核销记录 (分页) */
|
|
557
|
+
listConsumeRecords(page: number, pageSize: number, signal?: AbortSignal): Promise<ConsumeRecordPage>;
|
|
558
|
+
/** 领取当月免费额度 — 幂等: 已领取时返回已有权益 */
|
|
559
|
+
claimMonthlyFree(signal?: AbortSignal): Promise<EntitlementItem>;
|
|
560
|
+
/** 查询当前用户在指定模型下的剩余 token (raw + ETU) */
|
|
561
|
+
getByModel(modelID: string, signal?: AbortSignal): Promise<ModelByQuotaResponse>;
|
|
562
|
+
/** 列出当前用户的全部桶 */
|
|
563
|
+
listBuckets(signal?: AbortSignal): Promise<ModelBucket[]>;
|
|
564
|
+
/** 拉取模型系数表; SDK 自带 8s TTL 内存缓存以减小调用风暴. */
|
|
565
|
+
listCoefficients(signal?: AbortSignal): Promise<ModelCoefficient[]>;
|
|
566
|
+
/** 手动失效系数缓存 (admin 调价后建议立即调一次) */
|
|
567
|
+
invalidateCoefficientCache(): void;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
declare module '../client' {
|
|
572
|
+
interface Client {
|
|
573
|
+
/** 获取商城流量包列表 (兼容 yudao 分页和直接数组两种格式) */
|
|
574
|
+
listTokenPackages(signal?: AbortSignal): Promise<TokenPackage[]>;
|
|
575
|
+
/** 获取流量包详情 */
|
|
576
|
+
getTokenPackageDetail(packageID: string, signal?: AbortSignal): Promise<TokenPackage>;
|
|
577
|
+
/** 购买流量包 (创建订单) */
|
|
578
|
+
buyTokenPackage(packageID: string, payload: PayPayload | null, signal?: AbortSignal): Promise<Order>;
|
|
579
|
+
/** 查询订单支付状态 */
|
|
580
|
+
getOrderStatus(orderID: string, signal?: AbortSignal): Promise<OrderStatus>;
|
|
581
|
+
/** 查询我的订单列表 */
|
|
582
|
+
listMyOrders(signal?: AbortSignal): Promise<Order[]>;
|
|
583
|
+
/**
|
|
584
|
+
* 轮询订单支付状态直到终态
|
|
585
|
+
* 成功支付返回 status; 终态失败抛 OrderTerminalError
|
|
586
|
+
* pollIntervalMs <= 0 时默认 2 秒
|
|
587
|
+
*/
|
|
588
|
+
waitForPayment(orderID: string, pollIntervalMs: number, signal?: AbortSignal): Promise<OrderStatus>;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
declare module '../client' {
|
|
593
|
+
interface Client {
|
|
594
|
+
/** 获取钱包统计 (余额/月消费/月充值) */
|
|
595
|
+
getWalletStats(signal?: AbortSignal): Promise<WalletStats>;
|
|
596
|
+
/** 获取最近交易记录 */
|
|
597
|
+
getWalletTransactions(signal?: AbortSignal): Promise<Transaction[]>;
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
declare module '../client' {
|
|
602
|
+
interface Client {
|
|
603
|
+
/** 浏览技能商店 (公共端点, 无需认证) */
|
|
604
|
+
browseSkillStore(query: SkillStoreQuery, signal?: AbortSignal): Promise<SkillStoreItem[]>;
|
|
605
|
+
/** 浏览公共技能商店 (V3 分页接口) */
|
|
606
|
+
browseSkills(page: number, pageSize: number, category: string, keyword: string, tag: string, source: string, signal?: AbortSignal): Promise<SkillBrowseResponse>;
|
|
607
|
+
/** 轻量浏览公共技能商店 (fields=minimal, 响应体积缩减 90%+) */
|
|
608
|
+
browseSkillsList(page: number, pageSize: number, category: string, keyword: string, tag: string, source: string, signal?: AbortSignal): Promise<SkillBrowseListResponse>;
|
|
609
|
+
/** 获取技能商店中某个技能的详情 (公共端点) */
|
|
610
|
+
getSkillDetail(skillID: string, signal?: AbortSignal): Promise<SkillStoreItem>;
|
|
611
|
+
/** 按 key 精确查找公共技能 (公共端点) */
|
|
612
|
+
resolveSkill(key: string, signal?: AbortSignal): Promise<SkillStoreItem>;
|
|
613
|
+
/** 安装技能到当前用户的租户空间 (需 OAuth scope: skill_store) */
|
|
614
|
+
installSkill(skillID: string, signal?: AbortSignal): Promise<SkillStoreItem>;
|
|
615
|
+
/**
|
|
616
|
+
* 下载技能 ZIP 包 (公共端点, 双模式)
|
|
617
|
+
* 有 token 时自动附带 (享受无限流), 无 token 时匿名 (受限流)
|
|
618
|
+
* @returns [data, filename]; 限流时抛 RateLimitError
|
|
619
|
+
*/
|
|
620
|
+
downloadSkill(skillID: string, signal?: AbortSignal): Promise<{
|
|
621
|
+
data: Uint8Array;
|
|
622
|
+
filename: string;
|
|
623
|
+
}>;
|
|
624
|
+
/**
|
|
625
|
+
* 上传技能 ZIP 包
|
|
626
|
+
* @param scope "TENANT"
|
|
627
|
+
* @param intent "PERSONAL" (仅自己用) 或 "PUBLIC_INTENT" (走认证→公开)
|
|
628
|
+
*/
|
|
629
|
+
uploadSkill(zipData: Uint8Array, scope: string, intent: string, signal?: AbortSignal): Promise<SkillStoreItem>;
|
|
630
|
+
/** 获取技能统计概览 */
|
|
631
|
+
getSkillSummary(signal?: AbortSignal): Promise<SkillSummary>;
|
|
632
|
+
/** 触发技能认证管线 (异步) */
|
|
633
|
+
certifySkill(skillID: string, signal?: AbortSignal): Promise<void>;
|
|
634
|
+
/** 查询技能认证状态 */
|
|
635
|
+
getCertificationStatus(skillID: string, signal?: AbortSignal): Promise<CertificationStatus>;
|
|
636
|
+
/** 根据自然语言描述生成技能定义 (基于独立 LLM) */
|
|
637
|
+
generateSkill(req: GenerateSkillRequest, signal?: AbortSignal): Promise<GenerateSkillResult>;
|
|
638
|
+
/** 优化已有技能定义 */
|
|
639
|
+
optimizeSkill(req: OptimizeSkillRequest, signal?: AbortSignal): Promise<OptimizeSkillResult>;
|
|
640
|
+
/** 校验技能定义正确性 */
|
|
641
|
+
validateSkill(skillName: string, signal?: AbortSignal): Promise<void>;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
declare module '../client' {
|
|
646
|
+
interface Client {
|
|
647
|
+
/** 获取当前用户租户下的所有工具 (Skill 优先 + Plugin 兜底) */
|
|
648
|
+
listTools(signal?: AbortSignal): Promise<ToolView[]>;
|
|
649
|
+
/** 获取单个工具详情 */
|
|
650
|
+
getTool(toolID: string, signal?: AbortSignal): Promise<ToolView>;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
declare module '../client' {
|
|
655
|
+
interface Client {
|
|
656
|
+
/** 分页查询通知列表 */
|
|
657
|
+
listNotifications(page: number, pageSize: number, typeFilter: string, signal?: AbortSignal): Promise<NotificationList>;
|
|
658
|
+
/** 获取未读通知数量 */
|
|
659
|
+
getUnreadCount(signal?: AbortSignal): Promise<number>;
|
|
660
|
+
/** 标记单条通知已读 */
|
|
661
|
+
markNotificationRead(id: string, signal?: AbortSignal): Promise<void>;
|
|
662
|
+
/** 标记全部通知已读 */
|
|
663
|
+
markAllNotificationsRead(signal?: AbortSignal): Promise<void>;
|
|
664
|
+
/** 删除通知 */
|
|
665
|
+
deleteNotification(id: string, signal?: AbortSignal): Promise<void>;
|
|
666
|
+
/** 注册推送设备 token */
|
|
667
|
+
registerDevice(reg: DeviceRegistration, signal?: AbortSignal): Promise<void>;
|
|
668
|
+
/** 注销推送设备 token */
|
|
669
|
+
unregisterDevice(token: string, signal?: AbortSignal): Promise<void>;
|
|
670
|
+
/** 获取通知偏好设置 */
|
|
671
|
+
listNotificationPreferences(signal?: AbortSignal): Promise<NotificationPreference[]>;
|
|
672
|
+
/** 更新通知偏好 */
|
|
673
|
+
updateNotificationPreference(typeCode: string, pref: NotificationPreference, signal?: AbortSignal): Promise<void>;
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
declare module './client' {
|
|
678
|
+
interface Client {
|
|
679
|
+
/**
|
|
680
|
+
* 配置请求前的底线防御 (体积 / deny-list / 深度)。
|
|
681
|
+
* 传空值 {} 关闭 (所有字段为零 = 禁用)。
|
|
682
|
+
* 并发安全, 可在任意时间调用。
|
|
683
|
+
*/
|
|
684
|
+
setDefensiveSanitize(cfg: MinimalSanitizeConfig): void;
|
|
685
|
+
/**
|
|
686
|
+
* 开启后, 每次请求前 SDK 会从 rawMessages 中剥除带 acosmi_ephemeral:true 标记的 block,
|
|
687
|
+
* 并联动剥除引用已剥 tool_use 的 tool_result, 避免 provider 报 "tool_use_id 不存在".
|
|
688
|
+
*
|
|
689
|
+
* 标记来源: 网关在响应 content_block_start 中 in-band 注入; 消费者把上一轮 assistant
|
|
690
|
+
* 回复原样拼回 history 即可触发剥离。
|
|
691
|
+
*/
|
|
692
|
+
setAutoStripEphemeralHistory(on: boolean): void;
|
|
693
|
+
/**
|
|
694
|
+
* 在 buildChatRequest 开头调用, 把配置化的防御策略应用到 req。
|
|
695
|
+
* 未配置时立即返回, 零开销。
|
|
696
|
+
*
|
|
697
|
+
* 失败时抛错 — 调用方应放弃本次请求。
|
|
698
|
+
*/
|
|
699
|
+
applyRequestSanitizers(req: ChatRequest): void;
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
/** WebSocket 长连接配置 */
|
|
704
|
+
interface WSConfig {
|
|
705
|
+
/** 收到服务端事件回调 */
|
|
706
|
+
onEvent?: (ev: WSEvent) => void;
|
|
707
|
+
/** 连接建立回调 */
|
|
708
|
+
onConnect?: () => void;
|
|
709
|
+
/** 断线回调 */
|
|
710
|
+
onDisconnect?: (err: unknown) => void;
|
|
711
|
+
/** 自动订阅的主题 */
|
|
712
|
+
topics?: string[];
|
|
713
|
+
/** 最小重连间隔 (ms, 默认 2000) */
|
|
714
|
+
reconnectMinMs?: number;
|
|
715
|
+
/** 最大重连间隔 (ms, 默认 60000) */
|
|
716
|
+
reconnectMaxMs?: number;
|
|
717
|
+
/** 是否自动重连 (默认 true) */
|
|
718
|
+
autoReconnect?: boolean;
|
|
719
|
+
}
|
|
720
|
+
declare module './client' {
|
|
721
|
+
interface Client {
|
|
722
|
+
/**
|
|
723
|
+
* 建立 WebSocket 长连接 — 等待首次连接成功或 abort。
|
|
724
|
+
*/
|
|
725
|
+
connect(cfg: WSConfig, signal?: AbortSignal): Promise<void>;
|
|
726
|
+
/** 优雅断开 WebSocket 连接 */
|
|
727
|
+
disconnect(): Promise<void>;
|
|
728
|
+
/** WebSocket 是否已连接 */
|
|
729
|
+
isConnected(): boolean;
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/** POST /api/v4/crabcode_cli_feedback 返回体 */
|
|
734
|
+
interface BugReportResult {
|
|
735
|
+
/** 服务端生成的 UUID (写入 GitHub Issue body 用) */
|
|
736
|
+
feedback_id: string;
|
|
737
|
+
/** 公开页链接, 形如 https://<base>/chat/crabcode/bug/<uuid> */
|
|
738
|
+
detail_url: string;
|
|
739
|
+
}
|
|
740
|
+
/**
|
|
741
|
+
* GET /api/v4/crabcode/bug/:id 返回体 (公开 ViewModel)
|
|
742
|
+
*
|
|
743
|
+
* errors / transcript / extras 用 unknown[] / Record<string, unknown>:
|
|
744
|
+
* 客户端 reportData schema 会随版本变, SDK 不强 typed.
|
|
745
|
+
*/
|
|
746
|
+
interface BugView {
|
|
747
|
+
id: string;
|
|
748
|
+
description: string;
|
|
749
|
+
platform?: string;
|
|
750
|
+
terminal?: string;
|
|
751
|
+
version?: string;
|
|
752
|
+
messageCount: number;
|
|
753
|
+
hasErrors: boolean;
|
|
754
|
+
status: string;
|
|
755
|
+
clientDatetime?: string;
|
|
756
|
+
createdAt: string;
|
|
757
|
+
errors?: unknown[];
|
|
758
|
+
transcript?: unknown[];
|
|
759
|
+
extras?: Record<string, unknown>;
|
|
760
|
+
}
|
|
761
|
+
declare module './client' {
|
|
762
|
+
interface Client {
|
|
763
|
+
/**
|
|
764
|
+
* 上报一份 CrabCode bug 报告.
|
|
765
|
+
*
|
|
766
|
+
* reportData 是任意 JSON 可编码对象, 后端只解析为 map 做脱敏 + 字段抽取.
|
|
767
|
+
*
|
|
768
|
+
* 错误:
|
|
769
|
+
* - HTTPError 401 — token 过期 (内部已做一次 refresh + retry, 仍 401 抛出)
|
|
770
|
+
* - HTTPError 403 type="permission_error" message 含 "Custom data retention settings"
|
|
771
|
+
* — 用户所在组织 ZDR, 拒绝收集 (调用方应提示用户走外部渠道)
|
|
772
|
+
* - HTTPError 400 type="invalid_request_error" — content 不是合法 JSON 或 reportData 编码失败
|
|
773
|
+
* - HTTPError 429 — 限流 20/h/user (retryAfter 字段含建议等待秒数)
|
|
774
|
+
* - NetworkError — 传输层错误 (timeout / EOF / unreachable)
|
|
775
|
+
*/
|
|
776
|
+
submitBugReport(reportData: unknown, signal?: AbortSignal): Promise<BugReportResult>;
|
|
777
|
+
/**
|
|
778
|
+
* 取公开 ViewModel (无需 auth, 任意人凭 ID 可读).
|
|
779
|
+
*
|
|
780
|
+
* 用途: SSR 公开页后端 fetch / 维护者诊断 CLI / 集成测试.
|
|
781
|
+
*
|
|
782
|
+
* 错误:
|
|
783
|
+
* - HTTPError 404 — bug 不存在或被软删
|
|
784
|
+
* - HTTPError 429 — 限流 60/min/IP
|
|
785
|
+
* - NetworkError — 传输层错误
|
|
786
|
+
*/
|
|
787
|
+
getBugReport(bugID: string, signal?: AbortSignal): Promise<BugView>;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
export { AnthropicResponse, type AuthorizeResult, BalanceDetail, type BlockMeta, type BugReportResult, type BugView, CertificationStatus, ChatRequest, ChatResponse, Client, ClientRegistration, type Config, ConsumeRecordPage, DefaultRetryPolicy, DeviceRegistration, EntitlementBalance, EntitlementItem, ErrAuthDenied, ErrBrowserOpen, ErrDiscovery, ErrRegistration, ErrSSLProxy, ErrTimeout, ErrTokenExchange, EventAuthURL, EventComplete, EventError, FileTokenStore, type FilterStatus, FilterStatusAdminBypass, FilterStatusDisabledByFlag, FilterStatusFallbackMissingUser, FilterStatusFallbackNoBuckets, FilterStatusFallbackTkdistError, FilterStatusFallbackTkdistSkew, FilterStatusInternalBypass, FilterStatusOK, FilterStatusUnknown, GenerateSkillRequest, GenerateSkillResult, InMemoryTokenStore, LocalStorageTokenStore, type LoginErrCode, type LoginEvent, type LoginEventType, type LoginOptions, ManagedModel, ModelBucket, ModelByQuotaResponse, ModelCapabilities, ModelCoefficient, NotificationList, NotificationPreference, OptimizeSkillRequest, OptimizeSkillResult, Order, OrderStatus, PayPayload, ProviderAdapter, QuotaSummary, type RetryPolicy, type RetryRequestInfo, ScopeAI, ScopeAccount, ScopeEntitlements, ScopeModels, ScopeModelsChat, ScopeProfile, ScopeSkillStore, ScopeSkills, ScopeTokenPackages, ScopeTools, ScopeToolsExecute, ScopeWallet, ScopeWalletReadonly, ServerMetadata, SkillBrowseListResponse, SkillBrowseResponse, SkillStoreItem, SkillStoreQuery, SkillSummary, SourcesEvent, StreamEvent, StreamSettlement, TokenPackage, TokenResponse, TokenSet, type TokenStore, ToolView, Transaction, type WSConfig, WSEvent, WalletStats, allScopes, authorize, buildBetas, commerceScopes, computeBackoff, defaultRetryable, defaultSafeToRetry, discover, effectivePolicy, exchangeCode, extractAnthropicBlockMeta, isSSLError, modelScopes, newFileTokenStore, newTokenSet, refreshToken, register, revokeToken, skillScopes, uniqueMerge };
|