@my-life-buddies/buddy-runtime 0.4.0 → 0.4.2
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/README.md +124 -55
- package/dist/conversation/agent.d.ts +6 -6
- package/dist/conversation/agent.d.ts.map +1 -1
- package/dist/conversation/agent.js +38 -21
- package/dist/conversation/agent.js.map +1 -1
- package/dist/conversation/agentMessageLLMMessageConverter.d.ts +2 -2
- package/dist/conversation/agentMessageLLMMessageConverter.d.ts.map +1 -1
- package/dist/conversation/agentMessageLLMMessageConverter.js +3 -5
- package/dist/conversation/agentMessageLLMMessageConverter.js.map +1 -1
- package/dist/conversation/index.d.ts +3 -3
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js +4 -8
- package/dist/conversation/index.js.map +1 -1
- package/dist/conversation/mlbMessageAgentMessageConverter.d.ts +7 -6
- package/dist/conversation/mlbMessageAgentMessageConverter.d.ts.map +1 -1
- package/dist/conversation/mlbMessageAgentMessageConverter.js +16 -21
- package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -1
- package/dist/conversation/writeMLBMessage.d.ts +8 -6
- package/dist/conversation/writeMLBMessage.d.ts.map +1 -1
- package/dist/conversation/writeMLBMessage.js +7 -10
- package/dist/conversation/writeMLBMessage.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/platform/mlbClient.d.ts +14 -3
- package/dist/platform/mlbClient.d.ts.map +1 -1
- package/dist/platform/mlbClient.js +19 -0
- package/dist/platform/mlbClient.js.map +1 -1
- package/dist/server.js +3 -3
- package/dist/tools/dataAccess.d.ts +2 -2
- package/dist/tools/dataAccess.d.ts.map +1 -1
- package/dist/tools/dataAccess.js +3 -3
- package/dist/tools/dataAccess.js.map +1 -1
- package/dist/tools/registry.d.ts +1 -1
- package/dist/tools/registry.js +1 -1
- package/dist/tools/resource.d.ts +3 -3
- package/dist/tools/resource.js +7 -7
- package/dist/types.d.ts +83 -14
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# @my-life-buddies/buddy-runtime
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
搭子运行时,基于 [`@earendil-works/pi-agent-core`](https://www.npmjs.com/package/@earendil-works/pi-agent-core)。
|
|
4
|
+
它提供了让搭子接入平台的基本能力:接收消息、模型调用、回复消息链路,并可以快速接入平台所提供的包括资料引入、记忆系统、授权数据、主动性、付费服务等特色化能力。
|
|
5
|
+
开发者只需基于搭子的领域逻辑书写工具、人设等。
|
|
4
6
|
|
|
5
7
|
## 1. 快速开始
|
|
6
8
|
|
|
@@ -10,13 +12,11 @@ MLB 搭子运行时,基于 [`@earendil-works/pi-agent-core`](https://www.npmjs
|
|
|
10
12
|
npm install @my-life-buddies/buddy-runtime typebox
|
|
11
13
|
```
|
|
12
14
|
|
|
13
|
-
要求 Node.js ≥ 22.19。
|
|
14
|
-
|
|
15
15
|
### 1.2 注册搭子
|
|
16
16
|
|
|
17
17
|
通过平台开发者接口 `POST /cli/buddies` 注册,提交名称、头像、简介,平台分配搭子 id 与令牌;之后改档案用 `PUT /cli/buddies/:id/meta`。可选的模型 id 查 `GET /cli/models`。
|
|
18
18
|
|
|
19
|
-
### 1.3
|
|
19
|
+
### 1.3 搭子工程框架
|
|
20
20
|
|
|
21
21
|
```
|
|
22
22
|
my-buddy/
|
|
@@ -64,16 +64,14 @@ await BuddyServer.start({
|
|
|
64
64
|
|
|
65
65
|
### 1.4 启动
|
|
66
66
|
|
|
67
|
-
在 `.env` 里配好环境变量,`npm
|
|
67
|
+
在 `.env` 里配好环境变量,`npm run dev` 启动
|
|
68
68
|
|
|
69
69
|
| 变量 | 说明 |
|
|
70
70
|
|---|---|
|
|
71
71
|
| `MLB_BUDDY_ID` | 必填,搭子 id |
|
|
72
72
|
| `MLB_BUDDY_TOKEN` | 必填,搭子令牌 |
|
|
73
|
-
| `MLB_GATEWAY_URL` | 可选,平台网关地址,缺省为测试环境 `http://47.116.168.81:8788` |
|
|
74
73
|
|
|
75
74
|
- 在自己电脑上连测试网关时,平台把这个进程当作 `<id>-dev` 分身,会话与正式搭子分开。
|
|
76
|
-
- 从回环地址连网关算正式身份:连本机起的网关要用本机注册的凭据,不要拿正式搭子的令牌再起一个进程。
|
|
77
75
|
- 改完代码想自动重启,在启动命令里加 `--watch`。
|
|
78
76
|
|
|
79
77
|
完整示例:[examples/aunt-tu/](examples/aunt-tu/)(记忆、小挂件)、[examples/stacy-sims/](examples/stacy-sims/)(资料)。
|
|
@@ -91,7 +89,7 @@ await BuddyServer.start({
|
|
|
91
89
|
| `welcome` | 可选,用户打开一场还没聊过的会话时发的问候,不经过模型 |
|
|
92
90
|
| `errorReply` | 可选,模型出错或空回复时发的兜底回复 |
|
|
93
91
|
|
|
94
|
-
`buddy` 在每场会话收到第一条消息时调用一次。会话空闲 30 分钟被回收、或进程重启后,下一条消息会重新调用,所以闭包里的变量不能当长期存储,要记住的东西写进记忆(3.
|
|
92
|
+
`buddy` 在每场会话收到第一条消息时调用一次。会话空闲 30 分钟被回收、或进程重启后,下一条消息会重新调用,所以闭包里的变量不能当长期存储,要记住的东西写进记忆(3.2)。
|
|
95
93
|
|
|
96
94
|
### 2.2 `BuddyOptions`
|
|
97
95
|
|
|
@@ -133,48 +131,102 @@ type BuddyOptions = Pick<AgentOptions,
|
|
|
133
131
|
|
|
134
132
|
```ts
|
|
135
133
|
interface Conversation {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
// 会话键:私聊以 p_ 开头,群聊以 g_ 开头。开发者自己存的数据要按它隔离
|
|
135
|
+
key: string;
|
|
136
|
+
|
|
137
|
+
// 日志,每行开头带搭子 id
|
|
138
|
+
log: BuddyLogger;
|
|
139
|
+
|
|
140
|
+
// 资料,见 3.1:resources/ 里的 .md,进程启动时读好,所有会话共用
|
|
141
|
+
resources: {
|
|
142
|
+
list(): string[];
|
|
143
|
+
read(file: string): string;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// 记忆,见 3.2:这场会话的长期记忆,存在平台上
|
|
147
|
+
memory: {
|
|
139
148
|
list(): Promise<MemoryEntry[]>;
|
|
140
149
|
write(key: string, text: string): Promise<void>;
|
|
141
150
|
delete(key: string): Promise<void>;
|
|
142
151
|
};
|
|
143
|
-
|
|
152
|
+
|
|
153
|
+
// 授权数据,见 3.3:私聊不传 memberId,群聊传消息前缀里的 m_…
|
|
154
|
+
dataAccess: {
|
|
144
155
|
query(request: { datasets: string[]; memberId?: string }): Promise<DatasetAccessResult[]>;
|
|
145
156
|
};
|
|
146
|
-
|
|
157
|
+
|
|
158
|
+
// 小挂件,见 3.4
|
|
159
|
+
widgets: {
|
|
160
|
+
list(): Promise<WidgetSummary[]>;
|
|
161
|
+
create(input: { type: string; title: string; idempotencyKey?: string }): Promise<{ id: string }>;
|
|
162
|
+
read(id: string): Promise<Widget>;
|
|
163
|
+
readModule(id: string, module: string): Promise<{ records: WidgetRecord[] }>;
|
|
164
|
+
rename(id: string, title: string): Promise<void>;
|
|
165
|
+
write(
|
|
166
|
+
id: string,
|
|
167
|
+
input: { module: string; recordId: string; data: Record<string, unknown>; expectedRevision?: number },
|
|
168
|
+
): Promise<{ revision?: number }>;
|
|
169
|
+
deleteRecord(id: string, module: string, recordId: string): Promise<void>;
|
|
170
|
+
delete(id: string): Promise<void>;
|
|
171
|
+
setPresentation(id: string, input: { summary: string; imageMediaId: string }): Promise<void>;
|
|
172
|
+
send(id: string, options: { idempotencyKey: string }): void;
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
// 主动服务,见 3.5:提订阅建议,用户在 App 里确认后才生效
|
|
176
|
+
proactive: {
|
|
147
177
|
propose(request: ProactiveSubscriptionRequest): Promise<{ id: string; status: "pending" }>;
|
|
148
178
|
};
|
|
149
179
|
}
|
|
150
180
|
```
|
|
151
181
|
|
|
152
|
-
|
|
153
|
-
- `log`:日志,每行开头带搭子 id。
|
|
154
|
-
- `memory`、`dataAccess`、`proactive`:已经绑好这场会话,直接调用,不用传令牌或拼接口路径,分别见 3.1、3.2、3.5。
|
|
182
|
+
`memory`、`dataAccess`、`widgets`、`proactive` 已经绑好这场会话,直接调用,不用传令牌或拼接口路径。
|
|
155
183
|
|
|
156
184
|
## 3. 平台能力
|
|
157
185
|
|
|
158
|
-
| 能力 |
|
|
186
|
+
| 能力 | `conversation` 对象方法 | 默认注册成的模型工具 | 默认注册成模型工具的条件 |
|
|
159
187
|
|---|---|---|---|
|
|
160
|
-
|
|
|
161
|
-
|
|
|
162
|
-
|
|
|
163
|
-
|
|
|
188
|
+
| 资料 | `conversation.resources.list` / `conversation.resources.read` | `resource_read` | platformTools 声明 && `resources/` 下有 `.md` |
|
|
189
|
+
| 记忆 | `conversation.memory` | 无,默认不注册成模型工具,开发者可以根据具体场景,注册成适合场景需要的模型工具 | — |
|
|
190
|
+
| 授权数据 | `conversation.dataAccess.query` | `data_access_query` | platformTools 声明 && 声明过至少一个 Dataset |
|
|
191
|
+
| 小挂件 | `conversation.widgets.list` / `conversation.widgets.create` / `conversation.widgets.read` / `conversation.widgets.readModule` / `conversation.widgets.rename` / `conversation.widgets.write` / `conversation.widgets.deleteRecord` / `conversation.widgets.delete` / `conversation.widgets.setPresentation` / `conversation.widgets.send` | `widget_create` / `widget_write` / `widget_read` / `widget_delete` / `widget_send` | platformTools 声明 && 登记过至少一个小挂件类型 |
|
|
164
192
|
| 主动服务 | `conversation.proactive.propose` | 无 | — |
|
|
165
193
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
194
|
+
### 3.1 资料
|
|
195
|
+
|
|
196
|
+
把 `.md` 资料放进工程目录(`package.json` 所在目录)下的 `resources/`,`platformTools` 写上 `resource_read`,模型就能按需读。
|
|
197
|
+
|
|
198
|
+
- 工程目录从入口脚本往上找,与启动时的工作目录无关。
|
|
199
|
+
- 启动时递归读取 `.md`,跳过 `node_modules`、`venv`、`.venv`、`__pycache__` 与点开头的文件和目录;资料改了要重启进程。
|
|
200
|
+
- 系统提示末尾追加资料清单,模型按清单里的相对路径读。没有资料或没选 `resource_read` 时,不注册工具,也不追加清单。
|
|
201
|
+
|
|
202
|
+
```
|
|
203
|
+
my-buddy/ 工程目录
|
|
204
|
+
├─ package.json
|
|
205
|
+
├─ resources/
|
|
206
|
+
│ └─ research/
|
|
207
|
+
│ └─ 01-writings.md 清单里写作 research/01-writings.md
|
|
208
|
+
└─ src/main.ts 入口脚本
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**在自己的代码里用**
|
|
212
|
+
|
|
213
|
+
调用 `conversation.resources`,不需要写进 `platformTools`:
|
|
214
|
+
|
|
215
|
+
| 方法 | 做什么 |
|
|
216
|
+
|---|---|
|
|
217
|
+
| `list()` | 全部资料的路径,相对 `resources/`,按路径排序 |
|
|
218
|
+
| `read(file)` | 读一篇的正文,`file` 照 `list()` 给的路径原样填;没有这篇时抛异常 |
|
|
169
219
|
|
|
170
220
|
```ts
|
|
171
|
-
|
|
172
|
-
platformTools: ["data_access_query", "widget_read"],
|
|
173
|
-
initialState: { systemPrompt: PERSONA, tools: [remember] },
|
|
174
|
-
};
|
|
221
|
+
const notes = conversation.resources.read("research/01-writings.md");
|
|
175
222
|
```
|
|
176
223
|
|
|
177
|
-
|
|
224
|
+
- 两个方法都是同步的,读的是进程启动时读好的那份。
|
|
225
|
+
- 主动服务回合里也能调。
|
|
226
|
+
|
|
227
|
+
完整示例见 [examples/stacy-sims/](examples/stacy-sims/)。
|
|
228
|
+
|
|
229
|
+
### 3.2 记忆
|
|
178
230
|
|
|
179
231
|
这场会话的长期记忆,存在平台上,只在本会话内可见,会话删除时一并清除。
|
|
180
232
|
|
|
@@ -215,7 +267,7 @@ await BuddyServer.start({
|
|
|
215
267
|
});
|
|
216
268
|
```
|
|
217
269
|
|
|
218
|
-
### 3.
|
|
270
|
+
### 3.3 授权数据
|
|
219
271
|
|
|
220
272
|
用户同意后,搭子可以读用户的睡眠、运动等数据。数据按 Dataset 分项,用户逐项同意。搭子拿不到用户的真实 id。
|
|
221
273
|
|
|
@@ -276,11 +328,18 @@ if (sleep.status === "available") {
|
|
|
276
328
|
|
|
277
329
|
**数据只在当轮可见**
|
|
278
330
|
|
|
279
|
-
|
|
331
|
+
查到的数据只用于这一轮回复:平台不存原文,搭子进程里的那份也在这一轮结束时被抹掉,下一轮读不到。凡是可能把它带出去的地方——工具结果、工具参数、那一步的正文和心声——这一轮统统不写进平台。
|
|
332
|
+
|
|
333
|
+
这么设计是为了**用户撤销授权时能真的收回**:数据没有留在任何地方,不需要事后去清。代价是这一轮的记录不完整,搭子重启后读不到自己当时的推理和工具参数。
|
|
334
|
+
|
|
335
|
+
由此有两条实操结论:
|
|
280
336
|
|
|
281
|
-
|
|
337
|
+
- **想让某个结论以后还在场,就在回复里说出来**(用户也会看到)。模型对这些数据的记忆只能活在它说过的话里——下次它读到的是「查了 health.sleep,可用」,不是具体数字。
|
|
338
|
+
- **别把查到的数据写进记忆、小挂件或别的工具的参数**。那些地方不脱敏,写进去就永久留下了。
|
|
282
339
|
|
|
283
|
-
|
|
340
|
+
### 3.4 小挂件
|
|
341
|
+
|
|
342
|
+
小挂件是会话里一块给用户看的结构化面板,比如一份菜单。模型通过平台工具、开发者通过 `conversation.widgets`,都能建小挂件、写记录、读记录、删记录,并把它发进聊天。
|
|
284
343
|
|
|
285
344
|
**登记类型**
|
|
286
345
|
|
|
@@ -296,26 +355,38 @@ if (sleep.status === "available") {
|
|
|
296
355
|
- 平台请求失败时,模型只看到「平台请求失败(HTTP 409),请查询最新状态后再操作」这类提示,不带具体原因。
|
|
297
356
|
- `widget_send` 把小挂件放进发送队列就返回,不等平台确认送达。
|
|
298
357
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
### 3.4 资料
|
|
358
|
+
**在自己的代码里用**
|
|
302
359
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
- 工程目录从入口脚本往上找,与启动时的工作目录无关。
|
|
306
|
-
- 启动时递归读取 `.md`,跳过 `node_modules`、`venv`、`.venv`、`__pycache__` 与点开头的文件和目录;资料改了要重启进程。
|
|
307
|
-
- 系统提示末尾追加资料清单,模型按清单里的相对路径读。没有资料或没选 `read_resource` 时,不注册工具,也不追加清单。
|
|
360
|
+
调用 `conversation.widgets`,不需要写进 `platformTools`:
|
|
308
361
|
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
362
|
+
```ts
|
|
363
|
+
execute: async (toolCallId, params) => {
|
|
364
|
+
const { id } = await conversation.widgets.create({ type: "menu", title: "本周菜单", idempotencyKey: `menu:${toolCallId}` });
|
|
365
|
+
await conversation.widgets.write(id, { module: "菜单", recordId: "2026-09-14", data: { dishes: ["红烧肉", "清炒时蔬"] } });
|
|
366
|
+
conversation.widgets.send(id, { idempotencyKey: `menu-send:${toolCallId}` });
|
|
367
|
+
return { content: [{ type: "text", text: "菜单建好了。" }], details: undefined };
|
|
368
|
+
},
|
|
316
369
|
```
|
|
317
370
|
|
|
318
|
-
|
|
371
|
+
| 方法 | 做什么 | 平台接口 |
|
|
372
|
+
|---|---|---|
|
|
373
|
+
| `list()` | 列出这场会话里的小挂件,不带记录 | `GET /internal/v1/widgets` |
|
|
374
|
+
| `create({ type, title, idempotencyKey? })` | 新建一个,回 `{ id }`;同一个 `idempotencyKey` 重复建回同一个 id | `POST /internal/v1/widgets` |
|
|
375
|
+
| `read(id)` | 读整个小挂件,含各模块的记录 | `GET /internal/v1/widgets/:widgetId` |
|
|
376
|
+
| `readModule(id, module)` | 读一个模块,回 `{ records }` | `GET /internal/v1/widgets/:widgetId/:module` |
|
|
377
|
+
| `rename(id, title)` | 改标题,id 不变,聊天里发过的卡片跟着显示新标题 | `PUT /internal/v1/widgets/:widgetId` |
|
|
378
|
+
| `write(id, { module, recordId, data, expectedRevision? })` | 写一条记录,已存在就整条覆盖,回 `{ revision }`;带 `expectedRevision` 时版本号对不上,平台回 409 | `PUT /internal/v1/widgets/:widgetId/:module/:recordId` |
|
|
379
|
+
| `deleteRecord(id, module, recordId)` | 删一条记录 | `DELETE /internal/v1/widgets/:widgetId/:module/:recordId` |
|
|
380
|
+
| `delete(id)` | 删整个小挂件连记录;聊天里发过的卡片留着,点开显示已删除 | `DELETE /internal/v1/widgets/:widgetId` |
|
|
381
|
+
| `setPresentation(id, { summary, imageMediaId })` | 设聊天里卡片的摘要(不超过 500 字)和封面图,`imageMediaId` 传空串去掉封面 | `PUT /internal/v1/widgets/:widgetId/presentation` |
|
|
382
|
+
| `send(id, { idempotencyKey })` | 发进聊天:放进发送队列就返回,不等平台确认送达;同一个 `idempotencyKey` 重复发只落一条 | `POST /internal/v1/messages` |
|
|
383
|
+
|
|
384
|
+
- `list` 和 `read` 回的 `canEdit` 为 `false` 的,是别的会话转发来的引用,只能读;改名、写记录、删除、设卡片时平台回 403。
|
|
385
|
+
- `data` 要符合登记的 schema,不符合时平台回 400。
|
|
386
|
+
- 平台回非 2xx、网络出错、超过 30 秒或响应超过 4 MiB 时抛异常,异常的 `status` 是 HTTP 状态码,不带平台给的原因。写操作不自动重试,失败后先读一遍真实状态再决定。
|
|
387
|
+
- 主动服务回合里,除了 `list`、`read`、`readModule`,其余方法都会抛异常,见 3.5。
|
|
388
|
+
|
|
389
|
+
用法见 [examples/aunt-tu/](examples/aunt-tu/)。
|
|
319
390
|
|
|
320
391
|
### 3.5 主动服务
|
|
321
392
|
|
|
@@ -354,7 +425,7 @@ await conversation.proactive.propose({
|
|
|
354
425
|
|
|
355
426
|
- **模型能用的工具只有 `proactiveTools` 里点名的那些,默认一个都没有。** 用户不在场,所以不默认信任任何工具——名字叫 `read_xxx` 的也可能在里面发请求、写外部系统。没点名的工具模型仍然看得见,调了会被挡回一条说明,工具本身不执行。`data_access_query` 另外只能读订阅的 `allowedDataScopes`。
|
|
356
427
|
- 系统提示和普通回合一字不差,记忆不会被附上去。要让模型用记忆,自己把 `conversation.memory.list` 包成工具注册进来,再写进 `proactiveTools`。
|
|
357
|
-
- 调用 `memory.write`、`memory.delete`、`proactive.propose`
|
|
428
|
+
- 调用 `memory.write`、`memory.delete`、`proactive.propose`,以及 `widgets` 上除 `list`、`read`、`readModule` 以外的方法,会抛异常;开发者的钩子照常执行。
|
|
358
429
|
- 用户这时发来消息,主动回合中止,先回复用户;超过 4 分钟也中止。
|
|
359
430
|
- 主动回合的过程不下发给用户:平台在会话流里记两条不可见的记录(叫你判断了什么、你判断的结果),中间的工具步照常写回但也不下发。**开口的那条消息才是用户看得到的**,之后作为搭子说过的话出现在会话历史里。
|
|
360
431
|
|
|
@@ -366,24 +437,22 @@ await conversation.proactive.propose({
|
|
|
366
437
|
|
|
367
438
|
1. 平台的系统提示:对每场会话都一样的规则,比如消息开头的时间怎么读、用户所在时区去哪看。
|
|
368
439
|
2. `initialState.systemPrompt`。
|
|
369
|
-
3. 资料清单:选了 `
|
|
440
|
+
3. 资料清单:选了 `resource_read` 且有资料时才有。
|
|
370
441
|
|
|
371
442
|
**工具**:选中的平台工具在前,`initialState.tools` 在后。
|
|
372
443
|
|
|
373
444
|
**消息**:这场会话的完整历史,按时间先后排列。一轮回复里模型可能请求多次,比如调完工具接着说,每次都带上当时的完整历史。
|
|
374
445
|
|
|
375
|
-
-
|
|
446
|
+
- 用户消息、工具结果的开头带 GMT 时间,如「[2026-09-10 14:00:30 GMT] 」;搭子自己说的话不带。
|
|
376
447
|
- 历史末尾多一条「现在的时间(平台附注,不是谁说的话)」,时间是请求时刻,只在这一次请求里。
|
|
377
448
|
- 群聊里成员说的话开头标「[名字 #m_…] 」。
|
|
378
449
|
- 平台交代的情况(比如这场会话里已有哪些小挂件)是一条以「平台交代的情况:」开头的消息,情况有变化才追加新的一份。
|
|
379
450
|
- 引用了别的消息时,开头加一行「[引用 发言人:原话]」,引用图片写「[引用 发言人的图片 #被引消息 id]」。
|
|
380
451
|
- 转发的聊天记录卡按条目展开,每条先写「【名字】」再写正文。
|
|
381
|
-
- 查过授权数据的那一轮,结束后按 3.
|
|
452
|
+
- 查过授权数据的那一轮,结束后按 3.3 替换。
|
|
382
453
|
|
|
383
454
|
**图片**:用户发的图不用开发者处理。
|
|
384
455
|
|
|
385
456
|
- 平台在上传时统一处理成 JPEG,最长边不超过 2048 px、不超过 5 MiB。
|
|
386
457
|
- 图片消息是一条 user 消息:先是「[图片 #消息 id]」和用户配的文字,再跟图片本身;聊天记录卡里的图跟在所在条目的正文后面。
|
|
387
458
|
- 图片读不到时换成「[图片无法读取]」;`model` 不支持看图时换成「[图片:当前模型不支持看图]」。
|
|
388
|
-
|
|
389
|
-
在钩子里读会话历史时,除了 pi 的 `user` / `assistant` / `toolResult`,还会遇到 `role` 为 `note` 的消息:运行时补给模型的提醒,比如一轮回复没说出话时的提示,发给模型时换成 user 消息。
|
|
@@ -6,7 +6,7 @@ import { DataAccessUsageTracker } from "../tools/dataAccess.ts";
|
|
|
6
6
|
import type { Resource } from "../tools/resource.ts";
|
|
7
7
|
import type { BuddyFactory, BuddyLogger, DataRequirement, MLBMessageToWrite } from "../types.ts";
|
|
8
8
|
export interface AgentDeps {
|
|
9
|
-
/** 这场会话的发送队列:widget_send 把小挂件引用放进来 */
|
|
9
|
+
/** 这场会话的发送队列:widget_send 与 conversation.widgets.send 把小挂件引用放进来 */
|
|
10
10
|
enqueueMessage: (message: MLBMessageToWrite) => void;
|
|
11
11
|
onPolicyStop?: () => void;
|
|
12
12
|
key: string;
|
|
@@ -17,7 +17,7 @@ export interface AgentDeps {
|
|
|
17
17
|
/** 搭子令牌:经 Agent 的 getApiKey 交给模型通道,变成 Authorization: Bearer 头 */
|
|
18
18
|
token: string;
|
|
19
19
|
widgetTypes: () => Promise<WidgetType[]>;
|
|
20
|
-
/** 搭子目录下 resources/ 里的资料;空数组就不装
|
|
20
|
+
/** 搭子目录下 resources/ 里的资料;空数组就不装 resource_read、不接清单 */
|
|
21
21
|
resources: Resource[];
|
|
22
22
|
dataRequirements: () => Promise<DataRequirement[]>;
|
|
23
23
|
factory: BuddyFactory;
|
|
@@ -25,19 +25,19 @@ export interface AgentDeps {
|
|
|
25
25
|
/** Agent 事件的去处。pi 会等它返回,所以只能同步做事 */
|
|
26
26
|
onEvent: (agent: Agent, event: AgentEvent) => void;
|
|
27
27
|
}
|
|
28
|
-
/** 跑开发者工厂拿配置,叠上运行时预置,建 Agent。开发者的工具名跟运行时的工具(小挂件、
|
|
28
|
+
/** 跑开发者工厂拿配置,叠上运行时预置,建 Agent。开发者的工具名跟运行时的工具(小挂件、resource_read)重名或互相重名 → throw。 */
|
|
29
29
|
export interface CreatedAgent {
|
|
30
30
|
agent: Agent;
|
|
31
31
|
dataAccessUsage: DataAccessUsageTracker;
|
|
32
32
|
}
|
|
33
33
|
export declare function createAgent(deps: AgentDeps): Promise<CreatedAgent>;
|
|
34
34
|
/**
|
|
35
|
-
* 每次请求模型时接在历史末尾那条
|
|
35
|
+
* 每次请求模型时接在历史末尾那条 user 消息的正文;现在的时间由 convertToLlm 按这条消息的 timestamp 拼在开头。
|
|
36
36
|
* 方括号时间怎么读、回复里别写,交代在平台的 system prompt 里(my-life-buddies-server 的 src/messages/systemPrompt.ts),
|
|
37
37
|
* 那边按「现在的时间」这几个字指认这条;改这里的正文或时间格式,那边一起改。
|
|
38
38
|
*/
|
|
39
|
-
export declare const
|
|
40
|
-
/** 历史副本:末尾接一条 now
|
|
39
|
+
export declare const CURRENT_TIME_TEXT = "\u73B0\u5728\u7684\u65F6\u95F4\uFF08\u5E73\u53F0\u9644\u6CE8\uFF0C\u4E0D\u662F\u8C01\u8BF4\u7684\u8BDD\uFF09";
|
|
40
|
+
/** 历史副本:末尾接一条 now 时刻、正文是 CURRENT_TIME_TEXT 的 user 消息,传进来的数组不改 */
|
|
41
41
|
export declare function withCurrentTime(messages: AgentMessage[], now: number): AgentMessage[];
|
|
42
42
|
/** 打日志用的副本:图片块的 data、请求体里 base64 的 data URL 换成字节数,其余原样 */
|
|
43
43
|
export declare function withoutImageData(value: unknown): unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/conversation/agent.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAa,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEnG,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAkB,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAA8B,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE7H,MAAM,WAAW,SAAS;IACzB,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/conversation/agent.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAa,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEnG,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAkB,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAA8B,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE7H,MAAM,WAAW,SAAS;IACzB,kEAAkE;IAClE,cAAc,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzC,sDAAsD;IACtD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACnD,OAAO,EAAE,YAAY,CAAC;IACtB,GAAG,EAAE,WAAW,CAAC;IACjB,oCAAoC;IACpC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD;AAED,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,EAAE,sBAAsB,CAAC;CACxC;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAuIxE;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,iHAAuB,CAAC;AAEtD,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAErF;AAED,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUxD"}
|
|
@@ -1,27 +1,37 @@
|
|
|
1
1
|
// 一场会话的 Agent 怎么建:运行时先把该填的填好,开发者的配置叠上去。
|
|
2
|
-
// 管:拼好交给开发者工厂的 Conversation
|
|
2
|
+
// 管:拼好交给开发者工厂的 Conversation(会话键、日志、进程启动时读好的资料、绑好会话键的记忆、授权数据查询、主动服务订阅建议与小挂件),跑工厂拿配置;
|
|
3
3
|
// systemPrompt 按 平台的(GET /internal/v1/system-prompt,每场会话建 Agent 时拉一次)→ 开发者的 → 资料清单 拼,段间空一行;
|
|
4
|
-
// 显式选中的平台工具排在开发者工具前面并查重名;选择
|
|
4
|
+
// 显式选中的平台工具排在开发者工具前面并查重名;选择 resource_read 时才追加资料清单;
|
|
5
5
|
// 开发者显式设的 thinkingLevel 这个模型不支持时打一条 warn,写明支持哪几档、实际会怎么发;
|
|
6
6
|
// 钩子叠加——开发者的 beforeToolCall 包 try/catch 抛了按放行;其余直通;
|
|
7
|
-
// transformContext 由运行时自己装、不开放给开发者:每次请求模型在历史末尾接一条写当前时间的
|
|
8
|
-
//
|
|
7
|
+
// transformContext 由运行时自己装、不开放给开发者:每次请求模型在历史末尾接一条写当前时间的 user 消息,不进会话历史;
|
|
8
|
+
// 每回合的模型输入和请求体全量打日志,主动回合也一样,图片换成字节数。
|
|
9
9
|
// 不管:Agent 建好之后的事(回合、事件分发在 index.ts)。
|
|
10
10
|
import { Agent } from "@earendil-works/pi-agent-core";
|
|
11
11
|
import { clampThinkingLevel, getSupportedThinkingLevels } from "@earendil-works/pi-ai";
|
|
12
12
|
import { agentMessagesToLLMMessages } from "./agentMessageLLMMessageConverter.js";
|
|
13
13
|
import { errorText } from "../log.js";
|
|
14
14
|
import { dataAccessTool, DataAccessUsageTracker } from "../tools/dataAccess.js";
|
|
15
|
-
import {
|
|
15
|
+
import { resourceReadTool, resourceCatalog } from "../tools/resource.js";
|
|
16
16
|
import { validatePlatformTools, registerTools } from "../tools/registry.js";
|
|
17
17
|
import { widgetTools } from "../tools/widgets.js";
|
|
18
18
|
export async function createAgent(deps) {
|
|
19
19
|
const dataAccessUsage = new DataAccessUsageTracker();
|
|
20
20
|
const { client } = deps;
|
|
21
|
-
// 写操作前先 assertWritable
|
|
21
|
+
// 写操作前先 assertWritable:主动服务回合里(开发者的钩子在这时被调)只许读,写记忆、提订阅建议、改小挂件、发小挂件直接 throw
|
|
22
22
|
const conversation = {
|
|
23
23
|
key: deps.key,
|
|
24
24
|
log: deps.log,
|
|
25
|
+
// 进程启动时读好的那份资料,不看 platformTools 名单
|
|
26
|
+
resources: {
|
|
27
|
+
list: () => deps.resources.map((resource) => resource.file),
|
|
28
|
+
read: (file) => {
|
|
29
|
+
const found = deps.resources.find((resource) => resource.file === file);
|
|
30
|
+
if (found === undefined)
|
|
31
|
+
throw new Error(`没有这篇资料:${file}`);
|
|
32
|
+
return found.content;
|
|
33
|
+
},
|
|
34
|
+
},
|
|
25
35
|
memory: {
|
|
26
36
|
list: () => client.memoryList(deps.key),
|
|
27
37
|
write: (name, text) => { dataAccessUsage.assertWritable(); return client.memoryWrite(deps.key, name, text); },
|
|
@@ -30,6 +40,19 @@ export async function createAgent(deps) {
|
|
|
30
40
|
// 经 dataAccessUsage 查:开发者工具里查过的那一轮,写回平台和留在历史里的内容也会脱敏;主动服务回合里改走执行令牌
|
|
31
41
|
dataAccess: { query: ({ datasets, memberId }) => dataAccessUsage.query(client, deps.key, datasets, memberId) },
|
|
32
42
|
proactive: { propose: (request) => { dataAccessUsage.assertWritable(); return client.proposeProactiveSubscription(deps.key, request); } },
|
|
43
|
+
widgets: {
|
|
44
|
+
list: () => client.widgetList(deps.key),
|
|
45
|
+
create: (input) => { dataAccessUsage.assertWritable(); return client.widgetCreate(deps.key, input); },
|
|
46
|
+
read: (id) => client.widgetRead(deps.key, id),
|
|
47
|
+
readModule: (id, module) => client.widgetReadModule(deps.key, id, module),
|
|
48
|
+
rename: (id, title) => { dataAccessUsage.assertWritable(); return client.widgetRename(deps.key, id, title); },
|
|
49
|
+
write: (id, input) => { dataAccessUsage.assertWritable(); return client.widgetWrite(deps.key, id, input); },
|
|
50
|
+
deleteRecord: (id, module, recordId) => { dataAccessUsage.assertWritable(); return client.widgetDeleteRecord(deps.key, id, module, recordId); },
|
|
51
|
+
delete: (id) => { dataAccessUsage.assertWritable(); return client.widgetDelete(deps.key, id); },
|
|
52
|
+
setPresentation: (id, input) => { dataAccessUsage.assertWritable(); return client.widgetSetPresentation(deps.key, id, input); },
|
|
53
|
+
// 跟 widget_send 进同一条发送队列,不另开发送通道
|
|
54
|
+
send: (id, { idempotencyKey }) => { dataAccessUsage.assertWritable(); deps.enqueueMessage({ type: "widget", widget: { id }, idempotencyKey }); },
|
|
55
|
+
},
|
|
33
56
|
};
|
|
34
57
|
const options = await deps.factory(conversation);
|
|
35
58
|
const selected = validatePlatformTools(options.platformTools);
|
|
@@ -39,10 +62,10 @@ export async function createAgent(deps) {
|
|
|
39
62
|
[...selected].some(name => name.startsWith("widget_")) ? deps.widgetTypes() : [],
|
|
40
63
|
selected.has("data_access_query") ? deps.dataRequirements() : [],
|
|
41
64
|
]);
|
|
42
|
-
const resources = selected.has("
|
|
65
|
+
const resources = selected.has("resource_read") ? deps.resources : [];
|
|
43
66
|
const readTools = [
|
|
44
67
|
...(requirements.length ? [dataAccessTool(client, deps.key, dataAccessUsage, requirements)] : []),
|
|
45
|
-
...(resources.length ? [
|
|
68
|
+
...(resources.length ? [resourceReadTool(resources)] : []),
|
|
46
69
|
];
|
|
47
70
|
const available = [...readTools, ...(types.length ? widgetTools(client, deps.key, types, deps.enqueueMessage) : [])];
|
|
48
71
|
const tools = registerTools(selected, available, options.initialState.tools ?? []).map(tool => dataAccessUsage.track(tool));
|
|
@@ -84,23 +107,17 @@ export async function createAgent(deps) {
|
|
|
84
107
|
},
|
|
85
108
|
steeringMode: "all",
|
|
86
109
|
followUpMode: "all",
|
|
87
|
-
// 下面三个钩子按 pi 每次请求模型时的调用顺序排:transformContext → convertToLlm → onPayload
|
|
110
|
+
// 下面三个钩子按 pi 每次请求模型时的调用顺序排:transformContext → convertToLlm → onPayload;出参和请求体每回合全量打日志,主动回合也一样。
|
|
88
111
|
// transformContext 的返回值只交给这一次请求,不写回会话历史;场合交代和图片本来就是历史里的记录,不在这里加
|
|
89
112
|
transformContext: async (messages) => withCurrentTime(messages, Date.now()),
|
|
90
113
|
convertToLlm: (messages) => {
|
|
91
114
|
const llmMessages = agentMessagesToLLMMessages(messages);
|
|
92
|
-
|
|
93
|
-
log.info("Proactive 模型输入已构建", { convoKey: key, messageCount: llmMessages.length });
|
|
94
|
-
else
|
|
95
|
-
log.info("convertToLlm 出参", { convoKey: key, messages: withoutImageData(llmMessages) });
|
|
115
|
+
log.info("convertToLlm 出参", { convoKey: key, messages: withoutImageData(llmMessages) });
|
|
96
116
|
return llmMessages;
|
|
97
117
|
},
|
|
98
118
|
// 只打日志、返回 undefined:返回别的值 pi-ai 会拿它顶替请求体发出去
|
|
99
119
|
onPayload: (payload) => {
|
|
100
|
-
|
|
101
|
-
log.info("Proactive 模型请求已构建", { convoKey: key });
|
|
102
|
-
else
|
|
103
|
-
log.info("模型请求体", { convoKey: key, payload: withoutImageData(payload) });
|
|
120
|
+
log.info("模型请求体", { convoKey: key, payload: withoutImageData(payload) });
|
|
104
121
|
return undefined;
|
|
105
122
|
},
|
|
106
123
|
// 运行时的拦截包在开发者钩子外面:先判这一轮能不能用这个工具,再交给开发者。
|
|
@@ -139,14 +156,14 @@ export async function createAgent(deps) {
|
|
|
139
156
|
return { agent, dataAccessUsage };
|
|
140
157
|
}
|
|
141
158
|
/**
|
|
142
|
-
* 每次请求模型时接在历史末尾那条
|
|
159
|
+
* 每次请求模型时接在历史末尾那条 user 消息的正文;现在的时间由 convertToLlm 按这条消息的 timestamp 拼在开头。
|
|
143
160
|
* 方括号时间怎么读、回复里别写,交代在平台的 system prompt 里(my-life-buddies-server 的 src/messages/systemPrompt.ts),
|
|
144
161
|
* 那边按「现在的时间」这几个字指认这条;改这里的正文或时间格式,那边一起改。
|
|
145
162
|
*/
|
|
146
|
-
export const
|
|
147
|
-
/** 历史副本:末尾接一条 now
|
|
163
|
+
export const CURRENT_TIME_TEXT = "现在的时间(平台附注,不是谁说的话)";
|
|
164
|
+
/** 历史副本:末尾接一条 now 时刻、正文是 CURRENT_TIME_TEXT 的 user 消息,传进来的数组不改 */
|
|
148
165
|
export function withCurrentTime(messages, now) {
|
|
149
|
-
return [...messages, { role: "
|
|
166
|
+
return [...messages, { role: "user", content: [{ type: "text", text: CURRENT_TIME_TEXT }], timestamp: now }];
|
|
150
167
|
}
|
|
151
168
|
/** 打日志用的副本:图片块的 data、请求体里 base64 的 data URL 换成字节数,其余原样 */
|
|
152
169
|
export function withoutImageData(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/conversation/agent.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/conversation/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
2
|
import type { Message } from "@earendil-works/pi-ai";
|
|
3
3
|
/**
|
|
4
|
-
* user、toolResult
|
|
5
|
-
*
|
|
4
|
+
* user、toolResult 的正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;搭子自己说的(assistant)原样不拼,
|
|
5
|
+
* 拼了模型会照着历史里自己的样子,在回复开头也写上方括号时间。一条对一条、按原来的先后,相邻的 user 不合并。
|
|
6
6
|
* 时间统一用 GMT、只看消息自己的 timestamp,同一条消息每次拼出来一字不差,前缀缓存照样命中。
|
|
7
7
|
* 返回的是新数组,不改传进来的消息。
|
|
8
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentMessageLLMMessageConverter.d.ts","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAgB,OAAO,EAAe,MAAM,uBAAuB,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,YAAY,EAAE,KAAG,OAAO,EAI1E,CAAC;
|
|
1
|
+
{"version":3,"file":"agentMessageLLMMessageConverter.d.ts","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAgB,OAAO,EAAe,MAAM,uBAAuB,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,YAAY,EAAE,KAAG,OAAO,EAI1E,CAAC;AAgBJ,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// AgentMessage → LLMMessage 的换算:交给 pi 的 convertToLlm,每次请求模型前把整段 Agent 历史换成模型收的消息(pi-ai 的 Message)。
|
|
2
2
|
// MLBMessage 与 AgentMessage 之间的换算不在这里,在 mlbMessageAgentMessageConverter.ts;图片块在那一步就定好了,这里原样交出去。
|
|
3
3
|
/**
|
|
4
|
-
* user、toolResult
|
|
5
|
-
*
|
|
4
|
+
* user、toolResult 的正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;搭子自己说的(assistant)原样不拼,
|
|
5
|
+
* 拼了模型会照着历史里自己的样子,在回复开头也写上方括号时间。一条对一条、按原来的先后,相邻的 user 不合并。
|
|
6
6
|
* 时间统一用 GMT、只看消息自己的 timestamp,同一条消息每次拼出来一字不差,前缀缓存照样命中。
|
|
7
7
|
* 返回的是新数组,不改传进来的消息。
|
|
8
8
|
*/
|
|
@@ -10,11 +10,9 @@ export const agentMessagesToLLMMessages = (messages) => messages.flatMap((m) =>
|
|
|
10
10
|
const next = agentMessageToLLMMessage(m);
|
|
11
11
|
return next === undefined ? [] : [next];
|
|
12
12
|
});
|
|
13
|
-
/** 一条 AgentMessage 到模型那边是什么:
|
|
13
|
+
/** 一条 AgentMessage 到模型那边是什么:assistant 原样;pi harness 自己并进来的那几种 role(bashExecution / custom / …)这个运行时不产生,照 pi 默认 convertToLlm 的做法不给模型 */
|
|
14
14
|
function agentMessageToLLMMessage(m) {
|
|
15
15
|
switch (m.role) {
|
|
16
|
-
case "note":
|
|
17
|
-
return { role: "user", content: [{ type: "text", text: timeMark(m.timestamp) + m.text }], timestamp: m.timestamp };
|
|
18
16
|
case "user":
|
|
19
17
|
return { ...m, content: typeof m.content === "string" ? timeMark(m.timestamp) + m.content : withTimeMark(m.content, m.timestamp) };
|
|
20
18
|
case "toolResult":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentMessageLLMMessageConverter.js","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,gGAAgG;AAKhG;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAa,EAAE,CACjF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;IACtB,MAAM,IAAI,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEJ,
|
|
1
|
+
{"version":3,"file":"agentMessageLLMMessageConverter.js","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,gGAAgG;AAKhG;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAwB,EAAa,EAAE,CACjF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;IACtB,MAAM,IAAI,GAAG,wBAAwB,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEJ,uIAAuI;AACvI,SAAS,wBAAwB,CAAC,CAAe;IAChD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,MAAM;YACV,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QACpI,KAAK,YAAY;YAChB,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QAChE,KAAK,WAAW;YACf,OAAO,CAAC,CAAC;QACV;YACC,OAAO,SAAS,CAAC;IACnB,CAAC;AACF,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,QAAQ,CAAC,SAAiB;IACzC,OAAO,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC;AACrF,CAAC;AAED,+CAA+C;AAC/C,SAAS,YAAY,CAAC,OAAuC,EAAE,SAAiB;IAC/E,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;IACjC,IAAI,KAAK,EAAE,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACnG,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -16,7 +16,7 @@ export interface ConversationHandleDeps {
|
|
|
16
16
|
token: string;
|
|
17
17
|
/** 小挂件类型目录,server 懒拉一次后一直给同一个 promise */
|
|
18
18
|
widgetTypes: () => Promise<WidgetType[]>;
|
|
19
|
-
/** 搭子目录下 resources/ 里的资料,server 启动时读一次;空数组就不装
|
|
19
|
+
/** 搭子目录下 resources/ 里的资料,server 启动时读一次;空数组就不装 resource_read */
|
|
20
20
|
resources: Resource[];
|
|
21
21
|
/** 搭子已声明的用户数据需求,进程级懒加载并复用 */
|
|
22
22
|
dataRequirements: () => Promise<DataRequirement[]>;
|
|
@@ -48,7 +48,7 @@ export declare class ConversationHandle {
|
|
|
48
48
|
private turn;
|
|
49
49
|
/** 本回合有没有一条 assistant 消息带非空正文且正常收尾 */
|
|
50
50
|
private spoke;
|
|
51
|
-
/** 本回合有没有一条 assistant 消息是出错 /
|
|
51
|
+
/** 本回合有没有一条 assistant 消息是出错 / 被掐断收尾的:普通回合收尾时按它发 errorReply 兜底,主动回合按它判失败 */
|
|
52
52
|
private failed;
|
|
53
53
|
private _busy;
|
|
54
54
|
private _closed;
|
|
@@ -96,7 +96,7 @@ export declare class ConversationHandle {
|
|
|
96
96
|
private admit;
|
|
97
97
|
/**
|
|
98
98
|
* 跑一个回合。messages 有值就 prompt 它们;没值(收尾时发现队列里还有消息)就直接 continue。
|
|
99
|
-
* prompt 完把回合中 steer
|
|
99
|
+
* prompt 完把回合中 steer 进来的消化完;出错或一句话没说,收尾时发一条 errorReply 兜底(没配 errorReply 就不发)。
|
|
100
100
|
* 收尾:replying 关掉、等发平台的队列清空(每条写回的消息都拿到了平台定的时间)、heard 进历史、
|
|
101
101
|
* 这一轮进历史的消息按时间排好,才算不忙——排完的顺序跟手机上、跟重建出来的一样。
|
|
102
102
|
* 收尾期间又有人 steer(busy 还是 true,走不了 prompt),就接着再跑一个回合把它消化掉。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAqB,YAAY,EAAa,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC1G,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAIxD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation/index.ts"],"names":[],"mappings":"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"}
|