@kanyun-ai-infra/agenthub 1.27.0 → 1.28.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 +88 -0
- package/README.md +45 -5
- package/dist/index.cjs +3345 -2999
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +172 -2
- package/dist/index.d.ts +172 -2
- package/dist/index.js +4743 -4400
- package/dist/index.js.map +1 -1
- package/package.json +19 -14
- package/skills/agenthub-sdk/SKILL.md +110 -6
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,94 @@
|
|
|
2
2
|
|
|
3
3
|
本文件从 1.12.0 开始记录;更早的版本见 git 历史中的 `chore(agenthub-sdk): release X.Y.Z` 提交。
|
|
4
4
|
|
|
5
|
+
## 1.28.0
|
|
6
|
+
|
|
7
|
+
本版带上 1.27.1 之后合入 main 的公开面变化:`sessions.sendTurn` 的单回合预算 `maxCostUsd`
|
|
8
|
+
(#5946)、`sessions.terminate`、版本与槽位读面报告模型服务名、回合 `usage.durationMs` 的口径说明、
|
|
9
|
+
幂等键 24 小时窗口,以及 `turns.abort` 对已终止会话的 409 说明(#5942)。除下面「行为变化」一条外
|
|
10
|
+
均为新增或文档。
|
|
11
|
+
|
|
12
|
+
### 新增(主入口)
|
|
13
|
+
|
|
14
|
+
- `sessions.terminate(sessionId, { reason?, deadlineAt?, requireNoActiveWork? })`:显式终止会话,
|
|
15
|
+
scope **`sessions:terminate`**(任何预设都不含它,自定义 token 上显式勾选)。
|
|
16
|
+
- 202 返回生命周期迁移结果 `{ ok, sessionId, from, to, transitionId }`;沙箱由平台异步销毁,
|
|
17
|
+
`deadlineAt`(ISO 8601)是等待干净停止的上限,省略用服务端默认。
|
|
18
|
+
- `requireNoActiveWork` 默认 `true`:有回合在跑时**拒绝本次调用**,应答
|
|
19
|
+
422 `INVALID_TRANSITION`(等回合结束重试,或传 `false` 中途终止)。
|
|
20
|
+
- 404 `SESSION_NOT_FOUND`(不存在与不在你的项目范围是同一个 404)。**422 是所有生命周期拒绝的
|
|
21
|
+
状态码,具体看里面的 `code`**:`INVALID_TRANSITION` = active-work 拒绝(有回合在跑)或已
|
|
22
|
+
`terminating` / `reviving`(这两者同码,按自己的意图处理);`ALREADY_TERMINAL` = 行已
|
|
23
|
+
`terminated`(重试时可当已达成、调用未改任何状态)。409 `SESSION_NOT_READY` 是另一件事:
|
|
24
|
+
会话行本身不是 `status = ready`。
|
|
25
|
+
- 终止不是删除:会话行保留,之后 `sendTurn` 会把它复活到新沙箱(202 `revival_in_progress`);
|
|
26
|
+
在 `terminating` 期间发回合也会启动复活,终止 runner 会放弃销毁。
|
|
27
|
+
- `agents.getRevision` / `getRevisionById` / `getVersion`(以及 `agents.get` 内嵌的
|
|
28
|
+
`defaultRevision`)新增可选 **`modelServiceId` / `modelServiceName`**:这个版本会冻结到的模型服务
|
|
29
|
+
(`llmp_*` public id 与显示名;legacy 版本回落到 workload 的 manifest 默认)。版本没声明模型服务
|
|
30
|
+
时两个键都缺省;服务行被硬删时 `modelServiceName` 为 `null`(归档后仍返回名字)。
|
|
31
|
+
- `agents.stages.list` 在**信封层**新增 `stageModelServices`:
|
|
32
|
+
`[{ stage, modelServiceId, modelServiceName }]`,只含声明了模型服务的槽位。返回类型因此变为
|
|
33
|
+
`ListStagesResult`(= `ListStagesResponse & { stageModelServices? }`,原有字段一字不变);旧服务端
|
|
34
|
+
不返回这个键——缺省表示「没报告」,不是「没有模型服务」。放在信封层而不是槽位对象里,是因为
|
|
35
|
+
`StageSlotViewSchema` 是 `.strict()` 且内联在已发布客户端里,槽位对象多键会让旧客户端解析失败。
|
|
36
|
+
- `sessions.sendTurn` 接受 `maxCostUsd`(美元,> 0 且 ≤ 50)与 `requireAuthoritativePrice`
|
|
37
|
+
(#5946):服务端按回合判停。无价目返回 400 `BUDGET_UNPRICED`,会话/镜像不支持预算返回
|
|
38
|
+
409 `BUDGET_UNSUPPORTED_RUNTIME`——两种都是重发时去掉 `maxCostUsd`。
|
|
39
|
+
|
|
40
|
+
### 行为变化(唯一一条,影响面写全)
|
|
41
|
+
|
|
42
|
+
- **嵌套错误信封的码被提升**:`pilotPlatformErrorFromResponse` 是**本 SDK 发出的请求**所有 HTTP
|
|
43
|
+
错误的唯一入口,它现在在顶层没有 `code` / `message` 时读 `body.error.code` /
|
|
44
|
+
`body.error.message`。生效范围是所有**经本 SDK 发送**、且平台回该信封的端点:
|
|
45
|
+
- `sessions.createVoiceTicket` —— 实测例:平台停用实时语音时 `err.code` 从 `REQUEST_FAILED` 变成
|
|
46
|
+
`REALTIME_DISABLED`;
|
|
47
|
+
- `sessions.terminate`(本版新增的面,回 `{ success: false, error: { code, message? } }`);
|
|
48
|
+
- 任何未来经本 SDK 调用、且平台回这个信封形状的路由,自动跟上。
|
|
49
|
+
顶层 `code` / `message` 始终优先(两种形状同时出现时行为不变),`err.body` 里仍是原始 body,
|
|
50
|
+
`err.body.error.code` 照旧可读。**按旧兜底码(`NOT_FOUND` / `REQUEST_FAILED` / `SERVER_ERROR`)
|
|
51
|
+
分支这两类调用的调用方需要改成按真实码分支**;只按 `err.status` 分支的不受影响。
|
|
52
|
+
**不在射程内**:SDK 没有 `sessions.acquire` 方法(`/api/sessions/acquire` 是平台内部路由,SDK 不调用);
|
|
53
|
+
浏览器实时语音入口(`createRealtimeVoiceClient`)走 WebSocket 与自己的错误类型,不抛
|
|
54
|
+
`PilotPlatformApiError`;服务端内部写口与语音合成 handler 不属于本 SDK 的调用面。
|
|
55
|
+
|
|
56
|
+
### 随包文档
|
|
57
|
+
|
|
58
|
+
- `SKILL.md`:`sessions.terminate` 用法与 scope;版本 / 槽位读面的模型服务字段;幂等键的
|
|
59
|
+
**24 小时**回放窗口(窗口内同键同体重放、同键不同体 409;过期后同一个键会再执行一次并新建
|
|
60
|
+
资源,不能当永久去重);`usage.durationMs` / `usage.timeToFirstTokenMs` 的口径(provider 流时长,
|
|
61
|
+
**不是**回合墙钟;墙钟用 `dispatchedAt` → `completedAt`)。随包 skill 版本 0.36.1 → 0.37.0。
|
|
62
|
+
- `README.md`:同上四块的对应小节。
|
|
63
|
+
- `turns.abort` 的 JSDoc 与 SKILL 已由 #5942 写明:对 `terminated` 会话的 409 `SESSION_TERMINATED`
|
|
64
|
+
不可重试,该会话仍可由新的 `sendTurn` 复活。
|
|
65
|
+
|
|
66
|
+
### 导出面核对
|
|
67
|
+
|
|
68
|
+
把 `npm pack @kanyun-ai-infra/agenthub@1.27.1` 解包后的 `dist/index.d.ts` 与本分支构建产物对比,
|
|
69
|
+
去掉注释后的差异:
|
|
70
|
+
- `PlatformRevisionSchema` 与两处内嵌(workload 读面的 `defaultRevision`、`GetPlatformRevisionResponse`)
|
|
71
|
+
新增 `modelServiceId?` / `modelServiceName?`;
|
|
72
|
+
- 新增 `ListStagesResult`、`SessionTerminateLifecyclePhase`、`SessionTerminateRequest`、
|
|
73
|
+
`SessionTerminateRequestInput`、`SessionTerminateResponse`、`SessionTerminateRequestSchema`、
|
|
74
|
+
`SessionTerminateResponseSchema`、`StageSlotModelServiceView`、`StageSlotModelServiceViewSchema`;
|
|
75
|
+
- `SessionsResource` 新增 `terminate`;`WorkloadStagesResource.list` 的返回类型换成
|
|
76
|
+
`ListStagesResult`;
|
|
77
|
+
- `SendTurnInput` 新增 `maxCostUsd?` / `requireAuthoritativePrice?`。
|
|
78
|
+
|
|
79
|
+
没有删除。`dist/realtime.d.ts` 无非注释差异。
|
|
80
|
+
|
|
81
|
+
### 迁移说明
|
|
82
|
+
|
|
83
|
+
除「行为变化」那条错误码提升外没有破坏性变化;不用新方法、新入参时行为与 1.27.1 相同。
|
|
84
|
+
|
|
85
|
+
## 1.27.1
|
|
86
|
+
|
|
87
|
+
只改文档,没有行为变化。
|
|
88
|
+
|
|
89
|
+
- `sessions.listEvents` 的 `cursorReset` 补了处理范式(JSDoc 与 SKILL.md):收到 `cursorReset: true` 时,丢掉由旧游标得到的结果,用 `turns.list` 的快照重建,再用 `page.streamCursor ?? undefined` 接 `streamEvents`。
|
|
90
|
+
- 平台计划把流式片段(`pilot_coder.chunk`)的保留期从 30 天缩短到 1 天(当前仍是 30 天);缩短后 `afterEventId` 指向已删事件的情况会更常见;`cursorReset` 的语义不变,`listEvents` 的返回形状不变。
|
|
91
|
+
- `waitForTurn` 与 `streamEvents` 不使用事件 id 游标,不受影响。
|
|
92
|
+
|
|
5
93
|
## 1.27.0
|
|
6
94
|
|
|
7
95
|
本版带上 1.26.0(83d138380,#5880,11-06)之后合入 main 的公开面变化:凭据创建可带幂等键、凭据新增只读的 list / get(#5894),以及 `listArtifacts` 透出超限文件 `oversizedFiles`(#5893)。均为新增,不用新入参时行为与 1.26.0 相同。
|
package/README.md
CHANGED
|
@@ -156,6 +156,43 @@ Agents 和 runtime templates 都是 **project-scoped**。Version 必须在同一
|
|
|
156
156
|
> 未声明的字段时会被忽略,不会报错;服务端新增字段不需要客户端升级。1.16.0 起
|
|
157
157
|
> `PlatformRevision` 接受可选的 `sequence`(每个 Agent 内从 1 递增的版本序号,号可
|
|
158
158
|
> 不连续);服务端读面返回它之前,该字段为 `undefined`。
|
|
159
|
+
>
|
|
160
|
+
> 1.28.0 起版本读面还带 **`modelServiceId` / `modelServiceName`**:这个版本会冻结到
|
|
161
|
+
> 的模型服务(`llmp_*` id 及显示名,legacy 版本回落到 workload 的 manifest 默认)。
|
|
162
|
+
> 版本没声明模型服务时两个键都缺省;服务行被硬删时 `modelServiceName` 为 `null`
|
|
163
|
+
> (归档后仍显示名字)。`agents.stages.list` 在**信封层**(不在 `stages` 元素内)多给
|
|
164
|
+
> 一个 `stageModelServices: [{ stage, modelServiceId, modelServiceName }]`,只含声明了
|
|
165
|
+
> 模型服务的槽位;旧服务端不给这个键——缺省表示"没报告",不是"没有模型服务"。
|
|
166
|
+
|
|
167
|
+
## 终止会话与自动复活
|
|
168
|
+
|
|
169
|
+
```ts
|
|
170
|
+
// 显式终止:只翻生命周期到 terminating,沙箱由平台异步销毁(deadlineAt 兜底)。
|
|
171
|
+
const t = await agenthub.sessions.terminate(sessionId, {
|
|
172
|
+
reason: "user_request", // 1–50 字符,默认 "api"
|
|
173
|
+
requireNoActiveWork: true, // 默认 true:有回合在跑时 422 INVALID_TRANSITION(拒绝本次调用)
|
|
174
|
+
});
|
|
175
|
+
// t => { sessionId, from, to: "terminating", transitionId }
|
|
176
|
+
|
|
177
|
+
// 终止不是删除:之后对同一会话 sendTurn 会自动复活到新沙箱。
|
|
178
|
+
const sent = await agenthub.sessions.sendTurn(sessionId, { text: "继续" });
|
|
179
|
+
// sent.kind === "revival_in_progress"(HTTP 202,别重发);用 waitForTurn 等那一轮
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- 需要 scope **`sessions:terminate`**(任何预设都不含它,自定义 token 里显式勾选)。
|
|
183
|
+
- 404 同时表示"不存在"与"不在你的项目范围"。
|
|
184
|
+
- **422 是所有生命周期拒绝的状态码,具体看里面的 `code`**:`INVALID_TRANSITION` 是 active-work
|
|
185
|
+
拒绝(等回合结束重试,或显式传 `false` 中途终止),或会话已在 `terminating` / `reviving`
|
|
186
|
+
——这两者同码,按自己的意图处理;`ALREADY_TERMINAL` 是会话已经 `terminated`(重试时可当已达成,
|
|
187
|
+
本次调用没改任何状态)。409 `SESSION_NOT_READY` 是另一件事:会话行本身不是 `status = ready`。
|
|
188
|
+
- 在 `terminating` 期间 `sendTurn` 会启动 Agent Recovery,终止 runner 发现
|
|
189
|
+
transition id 变了会放弃销毁——**想留在终止态就别在这时发回合**。
|
|
190
|
+
- 带 `idempotencyKey` 的创建方法(`projects.create` / `secrets.create` /
|
|
191
|
+
`modelServices.create` / `managedMcps.create` / `schedules.create` /
|
|
192
|
+
`vaults.credentials.create`)**回放窗口是 24 小时**:窗口内同键同体重放原响应,
|
|
193
|
+
同键不同体 409;窗口过后同一个键会再执行一次并新建资源,幂等键不能当永久去重,
|
|
194
|
+
创建出来的 id 要自己存。
|
|
195
|
+
|
|
159
196
|
|
|
160
197
|
## 记忆(agenthub.memories)
|
|
161
198
|
|
|
@@ -214,7 +251,7 @@ App 里点的"对";`purge(projectId, { subjectKind, subjectId })` 按主体清
|
|
|
214
251
|
|
|
215
252
|
| 字段 | 含义 |
|
|
216
253
|
| --- | --- |
|
|
217
|
-
| `usage` | 模型用量(`inputTokens` / `outputTokens` / `totalTokens` 等)。其中 `costUsd` 是 Claude Code CLI **自报的列表价估算**(`costSource === "claude_code_cli"`),不是账单实付;`failed` / `aborted` 轮次没有 `usage`(T-INV-13)。`completed` 轮次也可能缺省——用量数据没通过校验时字段不落,并在该轮 `anomalies` 里记 `usage_parse_failed
|
|
254
|
+
| `usage` | 模型用量(`inputTokens` / `outputTokens` / `totalTokens` 等)。其中 `costUsd` 是 Claude Code CLI **自报的列表价估算**(`costSource === "claude_code_cli"`),不是账单实付;`failed` / `aborted` 轮次没有 `usage`(T-INV-13)。`completed` 轮次也可能缺省——用量数据没通过校验时字段不落,并在该轮 `anomalies` 里记 `usage_parse_failed`。`usage.durationMs` 是**模型 provider 流**的时长(首字节到最后一个 chunk),不含技能安装、交付、快照采集,**不是回合墙钟**;回合计时用 `dispatchedAt` → `completedAt`。`usage.timeToFirstTokenMs` 是同一时钟上到首个正文 chunk 的时间。 |
|
|
218
255
|
| `traceId` | 这一轮的分布式 trace id(`string \| null`),可拼 Octopus trace-explorer 深链定位整条链路(agenthub → control-worker → agent-worker)。 |
|
|
219
256
|
| `memoryRecall.state` | **只在会话首轮出现**——设计如此,不是版本或故障问题:读服务只给首轮投影这个字段(`session-turns-read-service.ts` 的 `core.turnId === enrichment.firstTurnId` 判据),第 2 轮起 `memoryRecall` 恒为 `undefined`,即便服务端是最新版。值是这一轮的**记忆召回状态**枚举,不是召回内容:`selected`(召回并注入了条目)/ `empty`(功能开着、也查了,本轮无可注入记忆)/ `recall_failed`(召回过程失败)/ `unavailable`(回读时没能解出召回快照)/ `legacy`(会话早于记忆机制,无快照)。目前只对外暴露状态,不含召回内容。 |
|
|
220
257
|
|
|
@@ -307,7 +344,9 @@ await agenthub.sessions.create({
|
|
|
307
344
|
|
|
308
345
|
## 错误
|
|
309
346
|
|
|
310
|
-
API 请求失败都会抛出类型化错误,错误对象带 `status`、`code` 和 `requestId`——但请求被 `AbortSignal` 取消是例外,那条路径抛的是原生 `AbortError
|
|
347
|
+
API 请求失败都会抛出类型化错误,错误对象带 `status`、`code` 和 `requestId`——但请求被 `AbortSignal` 取消是例外,那条路径抛的是原生 `AbortError`,没有这些字段,需要单独判断。
|
|
348
|
+
|
|
349
|
+
`code` 的取法:先看响应顶层的 `code`,没有就读嵌套信封 `{ success: false, error: { code, message? } }` 里的 `body.error.code`(1.28.0 起;更早的版本只读顶层,嵌套信封的端点会给你按状态码兜底的 `NOT_FOUND` / `REQUEST_FAILED` / `SERVER_ERROR`)。原始 body 始终留在 `err.body`。
|
|
311
350
|
|
|
312
351
|
| Class | HTTP |
|
|
313
352
|
| --- | --- |
|
|
@@ -417,7 +456,7 @@ SDK 1.13.0 起提供此行为。旧版 1.11.0 / 1.12.0 / 1.12.1 忽略 `call_end
|
|
|
417
456
|
|
|
418
457
|
通话可能在两处被拒:接入方后端取票时,和浏览器握手时。
|
|
419
458
|
|
|
420
|
-
**取票被拒。** 发票接口的错误体是 `{ success: false, error: { code, message?, scope? } }`。SDK
|
|
459
|
+
**取票被拒。** 发票接口的错误体是 `{ success: false, error: { code, message?, scope? } }`。1.28.0 起 SDK 把**嵌套信封的** `error.code` / `error.message` 提升到 `err.code` / `err.message`(顶层键优先),所以这里 `err.code` 直接就是下表里的码(如 409 `REALTIME_DISABLED`),可读原因在 `err.message`;原始 body 仍整块留在 `err.body`(`err.body.error.code` 同样可读)。1.27.1 及更早只取顶层,`err.code` 是按 HTTP 状态给的通用值(409 `REQUEST_FAILED`、503 `SERVER_ERROR`)——按旧版本写的 `err.body.error.code` 分支在新版本上照样成立。下表注明哪些码带 `message`。
|
|
421
460
|
|
|
422
461
|
```ts
|
|
423
462
|
import { PilotPlatformApiError } from "@kanyun-ai-infra/agenthub";
|
|
@@ -426,8 +465,9 @@ try {
|
|
|
426
465
|
return await client.sessions.createVoiceTicket(sessionId);
|
|
427
466
|
} catch (err) {
|
|
428
467
|
if (err instanceof PilotPlatformApiError) {
|
|
429
|
-
|
|
430
|
-
//
|
|
468
|
+
// err.code 例如 "REALTIME_UPSTREAM_NOT_CONFIGURED"(1.28.0 起;更早版本读 err.body.error.code)
|
|
469
|
+
// err.message 可以直接展示给用户
|
|
470
|
+
// REALTIME_CAPACITY_EXCEEDED 还要看 scope:err.body.error.scope 为 "project" / "global"(见下表)
|
|
431
471
|
}
|
|
432
472
|
throw err;
|
|
433
473
|
}
|