@my-life-buddies/buddy-runtime 0.0.3 → 0.2.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/README.md +209 -45
- package/dist/conversation/agent.d.ts +6 -1
- package/dist/conversation/agent.d.ts.map +1 -1
- package/dist/conversation/agent.js +60 -53
- package/dist/conversation/agent.js.map +1 -1
- package/dist/conversation/agentMessageLLMMessageConverter.d.ts +8 -0
- package/dist/conversation/agentMessageLLMMessageConverter.d.ts.map +1 -0
- package/dist/conversation/agentMessageLLMMessageConverter.js +24 -0
- package/dist/conversation/agentMessageLLMMessageConverter.js.map +1 -0
- package/dist/conversation/history.d.ts +0 -7
- package/dist/conversation/history.d.ts.map +1 -1
- package/dist/conversation/history.js +3 -16
- package/dist/conversation/history.js.map +1 -1
- package/dist/conversation/index.d.ts +25 -22
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js +141 -116
- package/dist/conversation/index.js.map +1 -1
- package/dist/conversation/mlbMessageAgentMessageConverter.d.ts +39 -0
- package/dist/conversation/mlbMessageAgentMessageConverter.d.ts.map +1 -0
- package/dist/conversation/{convert.js → mlbMessageAgentMessageConverter.js} +95 -113
- package/dist/conversation/mlbMessageAgentMessageConverter.js.map +1 -0
- package/dist/conversation/readMLBMessages.d.ts +31 -0
- package/dist/conversation/readMLBMessages.d.ts.map +1 -0
- package/dist/conversation/readMLBMessages.js +90 -0
- package/dist/conversation/readMLBMessages.js.map +1 -0
- package/dist/conversation/writeMLBMessage.d.ts +64 -0
- package/dist/conversation/writeMLBMessage.d.ts.map +1 -0
- package/dist/conversation/writeMLBMessage.js +214 -0
- package/dist/conversation/writeMLBMessage.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mlbClient.d.ts +1 -126
- package/dist/mlbClient.d.ts.map +1 -1
- package/dist/mlbClient.js +2 -364
- package/dist/mlbClient.js.map +1 -1
- package/dist/platform/client.d.ts +29 -0
- package/dist/platform/client.d.ts.map +1 -0
- package/dist/platform/client.js +22 -0
- package/dist/platform/client.js.map +1 -0
- package/dist/platform/mlbClient.d.ts +133 -0
- package/dist/platform/mlbClient.d.ts.map +1 -0
- package/dist/platform/mlbClient.js +420 -0
- package/dist/platform/mlbClient.js.map +1 -0
- package/dist/platform/widgets.d.ts +74 -0
- package/dist/platform/widgets.d.ts.map +1 -0
- package/dist/platform/widgets.js +85 -0
- package/dist/platform/widgets.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +8 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/dataAccess.d.ts +8 -3
- package/dist/tools/dataAccess.d.ts.map +1 -1
- package/dist/tools/dataAccess.js +33 -5
- package/dist/tools/dataAccess.js.map +1 -1
- package/dist/tools/registry.d.ts +6 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +23 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/widgets.d.ts +3 -2
- package/dist/tools/widgets.d.ts.map +1 -1
- package/dist/tools/widgets.js +22 -53
- package/dist/tools/widgets.js.map +1 -1
- package/dist/types.d.ts +41 -13
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -3
- package/dist/types.js.map +1 -1
- package/package.json +4 -3
- package/dist/conversation/convert.d.ts +0 -46
- package/dist/conversation/convert.d.ts.map +0 -1
- package/dist/conversation/convert.js.map +0 -1
- package/dist/conversation/presence.d.ts +0 -24
- package/dist/conversation/presence.d.ts.map +0 -1
- package/dist/conversation/presence.js +0 -56
- package/dist/conversation/presence.js.map +0 -1
- package/dist/conversation/writeBack.d.ts +0 -36
- package/dist/conversation/writeBack.d.ts.map +0 -1
- package/dist/conversation/writeBack.js +0 -114
- package/dist/conversation/writeBack.js.map +0 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
1
|
+
// MLBMessage 与 AgentMessage 之间的换算,正反两个方向。只管形状换算,不碰网络、不碰 Agent、不管游标和幂等键。
|
|
2
|
+
// MLBMessage → AgentMessage:GET /internal/v1/messages 拉回来的记录换成 Agent 历史(重建历史、交给回合都用它)。
|
|
3
|
+
// 图片在这一步定下来:平台拉取时带着图片内容,换成图片块留在历史里,之后每次请求模型原样带上
|
|
4
|
+
// (REDoc《【技术设计】搭子消息流里的图片》)。
|
|
5
|
+
// AgentMessage → MLBMessage:pi 跑出来的 assistant / toolResult / note 换成 POST /internal/v1/messages 的每条 body。
|
|
6
|
+
// 每次请求模型前 AgentMessage → LLMMessage 那一步在 agentMessageLLMMessageConverter.ts。
|
|
5
7
|
import { DATA_ACCESS_TOOL_NAME, SENSITIVE_RUN_TOOL_SUMMARY, dataAccessSummary, isDataAccessDetails } from "../tools/dataAccess.js";
|
|
6
8
|
/** 工具结果没回来(回合被中断)时,写给模型和平台的占位文本 */
|
|
7
9
|
const MISSING_TOOL_RESULT = "(工具结果未返回:回合被中断)";
|
|
@@ -10,6 +12,12 @@ const SYSTEM_EVENT_PREFIX = "(群里发生了一件事)";
|
|
|
10
12
|
/** 转发卡最多展开几层,再深的一层写成一句省略 */
|
|
11
13
|
const CARD_MAX_DEPTH = 3;
|
|
12
14
|
const CARD_TOO_DEEP = "(更深的转发略)";
|
|
15
|
+
/** 图片消息没配文字时,平台写的正文 */
|
|
16
|
+
const IMAGE_TEXT = "[图片]";
|
|
17
|
+
/** 平台没给图片内容(图片已经不存在)时,图片块换成的固定文字 */
|
|
18
|
+
const IMAGE_UNREADABLE = "[图片无法读取]";
|
|
19
|
+
/** 模型不收图片时,图片块换成的固定文字 */
|
|
20
|
+
const IMAGE_UNSUPPORTED = "[图片:当前模型不支持看图]";
|
|
13
21
|
/** 重建出来的 thinking 块用的签名:pi 的 openai-completions 回放时按它把推理原文写回 reasoning_content 字段 */
|
|
14
22
|
const THINKING_SIGNATURE = "reasoning_content";
|
|
15
23
|
/** 重建的 assistant 消息没有真实用量,全零;形状照 pi-agent-core 的 EMPTY_USAGE */
|
|
@@ -23,44 +31,53 @@ function emptyUsage() {
|
|
|
23
31
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
24
32
|
};
|
|
25
33
|
}
|
|
26
|
-
// ——
|
|
34
|
+
// —— MLBMessage → AgentMessage
|
|
27
35
|
/**
|
|
28
36
|
* 把一批平台记录换成 pi 的历史。跳过的:interrupted 的半截话、question / widget、空正文又没工具调用的搭子记录。
|
|
29
|
-
* 对方的 message 变 user
|
|
37
|
+
* 对方的 message 变 user(群里带成员前缀);image 变 user,正文前标「[图片 #消息 id]」,后面跟图片块;
|
|
38
|
+
* 带引用的,正文开头加一行「[引用 发言人:原话]」,引用的是图片写「[引用 发言人的图片 #被引消息 id]」;
|
|
39
|
+
* system 变 user(带「群里发生了一件事」)、messagesCard 按条目顺序展开成 user(卡里的图跟在那条正文后面)、
|
|
30
40
|
* 平台的场合交代 context 原样变 user(开头自带「平台交代给你的情况」那句用法,不套前缀);
|
|
31
41
|
* 搭子的 message / checkin 变 assistant,tool 变 assistant + 每个调用一条 toolResult,note 变 note。
|
|
42
|
+
* imageInput:模型收不收图片。不收时图片块换成固定文字;平台没给图片内容的也换成固定文字。
|
|
32
43
|
*/
|
|
33
|
-
export function
|
|
44
|
+
export function mlbMessagesToAgentMessages(records, identity, imageInput) {
|
|
34
45
|
const out = [];
|
|
35
46
|
for (const record of records) {
|
|
36
47
|
if (record.interrupted)
|
|
37
48
|
continue;
|
|
38
49
|
const text = record.text ?? "";
|
|
39
50
|
switch (record.type) {
|
|
51
|
+
case "image":
|
|
52
|
+
if (record.author === "user") {
|
|
53
|
+
const head = memberPrefix(record) + quoteLine(record) + imageLabel(record.id, text);
|
|
54
|
+
out.push(buildUserMessage(withImage([head], record.image, imageInput), record.timestamp));
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
40
57
|
case "system":
|
|
41
|
-
out.push(
|
|
58
|
+
out.push(buildUserMessage([{ type: "text", text: SYSTEM_EVENT_PREFIX + text }], record.timestamp));
|
|
42
59
|
break;
|
|
43
60
|
case "context":
|
|
44
61
|
if (text)
|
|
45
|
-
out.push(
|
|
62
|
+
out.push(buildUserMessage([{ type: "text", text }], record.timestamp));
|
|
46
63
|
break;
|
|
47
64
|
case "messagesCard":
|
|
48
65
|
if (record.messagesCard)
|
|
49
|
-
out.push(
|
|
66
|
+
out.push(buildUserMessage(cardContent(record.messagesCard, imageInput), record.timestamp));
|
|
50
67
|
break;
|
|
51
68
|
case "message":
|
|
52
69
|
case "checkin":
|
|
53
70
|
if (record.author === "buddy") {
|
|
54
71
|
if (text)
|
|
55
|
-
out.push(
|
|
72
|
+
out.push(buildAssistantMessage(record, [...thinkingBlocks(record.thinking), { type: "text", text }], "stop", identity));
|
|
56
73
|
}
|
|
57
74
|
else if (record.type === "message" && text) {
|
|
58
|
-
out.push(
|
|
75
|
+
out.push(buildUserMessage([{ type: "text", text: memberPrefix(record) + quoteLine(record) + text }], record.timestamp));
|
|
59
76
|
}
|
|
60
77
|
break;
|
|
61
78
|
case "tool":
|
|
62
79
|
if (record.author === "buddy")
|
|
63
|
-
out.push(...
|
|
80
|
+
out.push(...toolMLBMessageToAgentMessages(record, text, identity));
|
|
64
81
|
break;
|
|
65
82
|
case "note":
|
|
66
83
|
if (record.author === "buddy" && text)
|
|
@@ -74,7 +91,7 @@ export function toAgentMessages(records, identity) {
|
|
|
74
91
|
return out;
|
|
75
92
|
}
|
|
76
93
|
/** 搭子的 tool 记录:一条带 toolCall 块的 assistant,后面每个调用跟一条 toolResult */
|
|
77
|
-
function
|
|
94
|
+
function toolMLBMessageToAgentMessages(record, text, identity) {
|
|
78
95
|
const calls = record.toolCalls ?? [];
|
|
79
96
|
if (!text && calls.length === 0)
|
|
80
97
|
return [];
|
|
@@ -83,7 +100,7 @@ function toolTurn(record, text, identity) {
|
|
|
83
100
|
content.push({ type: "text", text });
|
|
84
101
|
for (const call of calls)
|
|
85
102
|
content.push({ type: "toolCall", id: call.callId, name: call.name, arguments: argumentsOf(call) });
|
|
86
|
-
const assistant =
|
|
103
|
+
const assistant = buildAssistantMessage(record, content, calls.length > 0 ? "toolUse" : "stop", identity);
|
|
87
104
|
const results = calls.map((call) => ({
|
|
88
105
|
role: "toolResult",
|
|
89
106
|
toolCallId: call.callId,
|
|
@@ -94,7 +111,7 @@ function toolTurn(record, text, identity) {
|
|
|
94
111
|
}));
|
|
95
112
|
return [assistant, ...results];
|
|
96
113
|
}
|
|
97
|
-
function
|
|
114
|
+
function buildAssistantMessage(record, content, stopReason, identity) {
|
|
98
115
|
return {
|
|
99
116
|
role: "assistant",
|
|
100
117
|
content,
|
|
@@ -106,8 +123,8 @@ function assistantMessage(record, content, stopReason, identity) {
|
|
|
106
123
|
timestamp: record.timestamp,
|
|
107
124
|
};
|
|
108
125
|
}
|
|
109
|
-
function
|
|
110
|
-
return { role: "user", content
|
|
126
|
+
function buildUserMessage(content, timestamp) {
|
|
127
|
+
return { role: "user", content, timestamp };
|
|
111
128
|
}
|
|
112
129
|
/** 有推理原文才放 thinking 块,没有就一个不放 */
|
|
113
130
|
function thinkingBlocks(thinking) {
|
|
@@ -130,28 +147,66 @@ function memberPrefix(record) {
|
|
|
130
147
|
return `[#${memberId}] `;
|
|
131
148
|
return "";
|
|
132
149
|
}
|
|
133
|
-
/**
|
|
134
|
-
function
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
150
|
+
/** 图片的标记:「[图片 #消息 id]」,配了文字接在后面。引用图片时写的是同一个 id,模型靠它对上是哪一张 */
|
|
151
|
+
function imageLabel(messageId, text) {
|
|
152
|
+
return `[图片 #${messageId}]${text && text !== IMAGE_TEXT ? ` ${text}` : ""}`;
|
|
153
|
+
}
|
|
154
|
+
/** 带引用的消息开头加的那一行(含换行):引用文字写「[引用 发言人:原话]」,引用图片写「[引用 发言人的图片 #被引消息 id]」,配了文字时接「:配的文字」 */
|
|
155
|
+
function quoteLine(record) {
|
|
156
|
+
const quote = record.quote;
|
|
157
|
+
if (!quote)
|
|
158
|
+
return "";
|
|
159
|
+
const name = quote.name ?? "";
|
|
160
|
+
const text = quote.text ?? "";
|
|
161
|
+
if (quote.image)
|
|
162
|
+
return `[引用 ${name}的图片${quote.id ? ` #${quote.id}` : ""}${text && text !== IMAGE_TEXT ? `:${text}` : ""}]\n`;
|
|
163
|
+
return `[引用 ${name}:${text}]\n`;
|
|
164
|
+
}
|
|
165
|
+
/** 文字行后面跟一张图:拿得到图片内容且模型收图片时是图片块;否则换成固定文字,接在文字行里 */
|
|
166
|
+
function withImage(lines, image, imageInput) {
|
|
167
|
+
if (imageInput && image?.data) {
|
|
168
|
+
return [{ type: "text", text: lines.join("\n") }, { type: "image", data: image.data, mimeType: image.mimeType ?? "image/jpeg" }];
|
|
146
169
|
}
|
|
147
|
-
return lines;
|
|
170
|
+
return [{ type: "text", text: [...lines, imageInput ? IMAGE_UNREADABLE : IMAGE_UNSUPPORTED].join("\n") }];
|
|
171
|
+
}
|
|
172
|
+
/** 聊天记录卡按条目顺序展开:每条先一行 `【名字】`,正文原样跟一行,图片条目在正文后面跟图片;嵌套卡接着展开,超过层数上限写一句省略 */
|
|
173
|
+
function cardContent(card, imageInput) {
|
|
174
|
+
const content = [];
|
|
175
|
+
let lines = [];
|
|
176
|
+
const walk = (current, depth) => {
|
|
177
|
+
for (const item of current.items ?? []) {
|
|
178
|
+
lines.push(`【${item.name ?? ""}】`);
|
|
179
|
+
if (item.text)
|
|
180
|
+
lines.push(item.text);
|
|
181
|
+
if (item.image) {
|
|
182
|
+
const [first, ...rest] = withImage(lines, item.image, imageInput);
|
|
183
|
+
if (rest.length === 0 && first.type === "text") {
|
|
184
|
+
lines = [first.text];
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
content.push(first, ...rest);
|
|
188
|
+
lines = [];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (item.messagesCard) {
|
|
192
|
+
if (depth >= CARD_MAX_DEPTH)
|
|
193
|
+
lines.push(CARD_TOO_DEEP);
|
|
194
|
+
else
|
|
195
|
+
walk(item.messagesCard, depth + 1);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
walk(card, 1);
|
|
200
|
+
if (lines.length > 0)
|
|
201
|
+
content.push({ type: "text", text: lines.join("\n") });
|
|
202
|
+
return content;
|
|
148
203
|
}
|
|
149
|
-
// ——
|
|
204
|
+
// —— AgentMessage → MLBMessage(POST /internal/v1/messages 的每条 body)
|
|
150
205
|
/**
|
|
151
206
|
* 不带工具调用的 assistant 消息写成 message 记录。
|
|
152
207
|
* 正常收尾的照写(带 thinking);error / aborted 收尾但已经说了半截的写成 interrupted;其余不写。
|
|
153
208
|
*/
|
|
154
|
-
export function
|
|
209
|
+
export function assistantMessageToMLBMessage(m, omitThinking = false) {
|
|
155
210
|
if (m.content.some((block) => block.type === "toolCall"))
|
|
156
211
|
return null;
|
|
157
212
|
const text = textOf(m);
|
|
@@ -163,9 +218,9 @@ export function outboundFromAssistant(m, omitThinking = false) {
|
|
|
163
218
|
}
|
|
164
219
|
/**
|
|
165
220
|
* 带工具调用的 assistant 消息连同它的结果写成一条 tool 记录;每个调用的 summary 取工具的 label,没有 label 用名字。
|
|
166
|
-
* 没有工具调用的返回 null(那种走
|
|
221
|
+
* 没有工具调用的返回 null(那种走 assistantMessageToMLBMessage)。
|
|
167
222
|
*/
|
|
168
|
-
export function
|
|
223
|
+
export function toolStepToMLBMessage(m, toolResults, tools, dataAccessDetailsOf, sensitiveRun = false) {
|
|
169
224
|
const calls = m.content.filter((block) => block.type === "toolCall");
|
|
170
225
|
if (calls.length === 0)
|
|
171
226
|
return null;
|
|
@@ -179,7 +234,7 @@ export function outboundFromTurn(m, toolResults, tools, dataAccessDetailsOf, sen
|
|
|
179
234
|
arguments: sensitiveRun ? undefined : call.arguments,
|
|
180
235
|
result: result === undefined
|
|
181
236
|
? MISSING_TOOL_RESULT
|
|
182
|
-
:
|
|
237
|
+
: toolResultTextToWrite(call.name, result, dataAccessDetailsOf?.(call.id), sensitiveRun),
|
|
183
238
|
};
|
|
184
239
|
});
|
|
185
240
|
const thinking = sensitiveRun ? undefined : thinkingOf(m);
|
|
@@ -189,41 +244,14 @@ export function outboundFromTurn(m, toolResults, tools, dataAccessDetailsOf, sen
|
|
|
189
244
|
return record;
|
|
190
245
|
}
|
|
191
246
|
/** DataAccess 的真实 Tool 结果只给当前模型回合看;写平台时只留 Dataset ID 与状态。 */
|
|
192
|
-
function
|
|
247
|
+
function toolResultTextToWrite(toolName, result, trackedDetails, sensitiveRun) {
|
|
193
248
|
const details = trackedDetails ?? result.details;
|
|
194
249
|
if (toolName === DATA_ACCESS_TOOL_NAME || isDataAccessDetails(details))
|
|
195
250
|
return dataAccessSummary(details);
|
|
196
251
|
return sensitiveRun ? SENSITIVE_RUN_TOOL_SUMMARY : resultText(result);
|
|
197
252
|
}
|
|
198
|
-
/**
|
|
199
|
-
* Agent run 完成后,把内存 transcript 里的 DataAccess 原始结果换成状态摘要。
|
|
200
|
-
* run 内不能提前替换:模型在 Tool 后续一轮还需要读取真实数据。
|
|
201
|
-
*/
|
|
202
|
-
export function redactSensitiveRun(messages, runMessages, dataAccessDetailsOf) {
|
|
203
|
-
const currentRun = new Set(runMessages);
|
|
204
|
-
return messages.map((message) => {
|
|
205
|
-
if (message.role === "assistant" && currentRun.has(message)) {
|
|
206
|
-
const hasToolCall = message.content.some((block) => block.type === "toolCall");
|
|
207
|
-
return {
|
|
208
|
-
...message,
|
|
209
|
-
content: message.content
|
|
210
|
-
.filter((block) => block.type !== "thinking" && (!hasToolCall || block.type === "toolCall"))
|
|
211
|
-
.map((block) => (block.type === "toolCall" ? { ...block, arguments: {} } : block)),
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
if (message.role !== "toolResult" || !currentRun.has(message))
|
|
215
|
-
return message;
|
|
216
|
-
const trackedDetails = dataAccessDetailsOf?.(message.toolCallId);
|
|
217
|
-
const details = isDataAccessDetails(trackedDetails) ? trackedDetails : isDataAccessDetails(message.details) ? message.details : undefined;
|
|
218
|
-
return {
|
|
219
|
-
...message,
|
|
220
|
-
content: [{ type: "text", text: details === undefined ? SENSITIVE_RUN_TOOL_SUMMARY : dataAccessSummary(details) }],
|
|
221
|
-
details,
|
|
222
|
-
};
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
253
|
/** note 消息写成 note 记录 */
|
|
226
|
-
export function
|
|
254
|
+
export function noteMessageToMLBMessage(n) {
|
|
227
255
|
return { type: "note", text: n.text };
|
|
228
256
|
}
|
|
229
257
|
/** assistant 消息里所有 thinking 块的推理原文拼起来;一个字都没有返回 undefined */
|
|
@@ -248,50 +276,4 @@ function resultText(result) {
|
|
|
248
276
|
.map((block) => block.text)
|
|
249
277
|
.join("\n");
|
|
250
278
|
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* 交给 pi 的 convertToLlm:note 变 user;相邻两条 user 合并成一条(正文中间隔一个换行);user / assistant / toolResult 原样。
|
|
254
|
-
* 返回的是新数组,合并出来的也是新对象,不改传进来的消息。
|
|
255
|
-
*/
|
|
256
|
-
export const convertToLlm = (messages) => {
|
|
257
|
-
const out = [];
|
|
258
|
-
for (const m of messages) {
|
|
259
|
-
const next = toLlmMessage(m);
|
|
260
|
-
if (next === undefined)
|
|
261
|
-
continue;
|
|
262
|
-
const prev = out[out.length - 1];
|
|
263
|
-
if (next.role === "user" && prev !== undefined && prev.role === "user") {
|
|
264
|
-
out[out.length - 1] = mergeUsers(prev, next);
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
out.push(next);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
return out;
|
|
271
|
-
};
|
|
272
|
-
/** 一条 AgentMessage 到模型那边是什么:note 变 user;pi harness 自己并进来的那几种 role(bashExecution / custom / …)这个运行时不产生,照 pi 默认 convertToLlm 的做法不给模型 */
|
|
273
|
-
function toLlmMessage(m) {
|
|
274
|
-
switch (m.role) {
|
|
275
|
-
case "note":
|
|
276
|
-
return userMessage(m.text, m.timestamp);
|
|
277
|
-
case "user":
|
|
278
|
-
case "assistant":
|
|
279
|
-
case "toolResult":
|
|
280
|
-
return m;
|
|
281
|
-
default:
|
|
282
|
-
return undefined;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
function mergeUsers(a, b) {
|
|
286
|
-
const blocks = [...userBlocks(a), ...userBlocks(b)];
|
|
287
|
-
const text = blocks
|
|
288
|
-
.filter((block) => block.type === "text")
|
|
289
|
-
.map((block) => block.text)
|
|
290
|
-
.join("\n");
|
|
291
|
-
const images = blocks.filter((block) => block.type === "image");
|
|
292
|
-
return { role: "user", content: [{ type: "text", text }, ...images], timestamp: a.timestamp };
|
|
293
|
-
}
|
|
294
|
-
function userBlocks(m) {
|
|
295
|
-
return typeof m.content === "string" ? [{ type: "text", text: m.content }] : m.content;
|
|
296
|
-
}
|
|
297
|
-
//# sourceMappingURL=convert.js.map
|
|
279
|
+
//# sourceMappingURL=mlbMessageAgentMessageConverter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mlbMessageAgentMessageConverter.js","sourceRoot":"","sources":["../../src/conversation/mlbMessageAgentMessageConverter.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,uFAAuF;AACvF,kDAAkD;AAClD,8BAA8B;AAC9B,0GAA0G;AAC1G,6EAA6E;AAK7E,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AASnI,mCAAmC;AACnC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAE9C,mCAAmC;AACnC,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAEzC,4BAA4B;AAC5B,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,aAAa,GAAG,UAAU,CAAC;AAEjC,uBAAuB;AACvB,MAAM,UAAU,GAAG,MAAM,CAAC;AAC1B,oCAAoC;AACpC,MAAM,gBAAgB,GAAG,UAAU,CAAC;AACpC,yBAAyB;AACzB,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAE3C,qFAAqF;AACrF,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AAE/C,gEAAgE;AAChE,SAAS,UAAU;IAClB,OAAO;QACN,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,CAAC;QACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KACpE,CAAC;AACH,CAAC;AAED,+BAA+B;AAE/B;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAqB,EAAE,QAAuB,EAAE,UAAmB;IAC7G,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,WAAW;YAAE,SAAS;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,OAAO;gBACX,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBACpF,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC3F,CAAC;gBACD,MAAM;YACP,KAAK,QAAQ;gBACZ,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBACnG,MAAM;YACP,KAAK,SAAS;gBACb,IAAI,IAAI;oBAAE,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBACjF,MAAM;YACP,KAAK,cAAc;gBAClB,IAAI,MAAM,CAAC,YAAY;oBAAE,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpH,MAAM;YACP,KAAK,SAAS,CAAC;YACf,KAAK,SAAS;gBACb,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAC/B,IAAI,IAAI;wBAAE,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACnI,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC;oBAC9C,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBACzH,CAAC;gBACD,MAAM;YACP,KAAK,MAAM;gBACV,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;oBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,6BAA6B,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;gBAClG,MAAM;YACP,KAAK,MAAM;gBACV,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI;oBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACrG,MAAM;YACP;gBACC,gCAAgC;gBAChC,MAAM;QACR,CAAC;IACF,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,iEAAiE;AACjE,SAAS,6BAA6B,CAAC,MAAkB,EAAE,IAAY,EAAE,QAAuB;IAC/F,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAgC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClF,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7H,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1G,MAAM,OAAO,GAAwB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,IAAI,CAAC,MAAM;QACvB,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACrE,OAAO,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS;QAClC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC3B,CAAC,CAAC,CAAC;IACJ,OAAO,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,qBAAqB,CAC7B,MAAkB,EAClB,OAAoC,EACpC,UAA0C,EAC1C,QAAuB;IAEvB,OAAO;QACN,IAAI,EAAE,WAAW;QACjB,OAAO;QACP,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,KAAK,EAAE,UAAU,EAAE;QACnB,UAAU;QACV,SAAS,EAAE,MAAM,CAAC,SAAS;KAC3B,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAuC,EAAE,SAAiB;IACnF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAC7C,CAAC;AAED,iCAAiC;AACjC,SAAS,cAAc,CAAC,QAA4B;IACnD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChG,CAAC;AAED,mDAAmD;AACnD,SAAS,WAAW,CAAC,IAAiB;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;IAC7B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;AACvH,CAAC;AAED,6DAA6D;AAC7D,SAAS,YAAY,CAAC,MAAkB;IACvC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,IAAI,IAAI,QAAQ;QAAE,OAAO,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC;IACvD,IAAI,IAAI;QAAE,OAAO,IAAI,IAAI,IAAI,CAAC;IAC9B,IAAI,QAAQ;QAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;IACvC,OAAO,EAAE,CAAC;AACX,CAAC;AAED,6DAA6D;AAC7D,SAAS,UAAU,CAAC,SAAiB,EAAE,IAAY;IAClD,OAAO,QAAQ,SAAS,IAAI,IAAI,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC7E,CAAC;AAED,sFAAsF;AACtF,SAAS,SAAS,CAAC,MAAkB;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,OAAO,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IAC9H,OAAO,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC;AACjC,CAAC;AAED,mDAAmD;AACnD,SAAS,SAAS,CAAC,KAAe,EAAE,KAA2B,EAAE,UAAmB;IACnF,IAAI,UAAU,IAAI,KAAK,EAAE,IAAI,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,YAAY,EAAE,CAAC,CAAC;IAClI,CAAC;IACD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3G,CAAC;AAED,yEAAyE;AACzE,SAAS,WAAW,CAAC,IAAkB,EAAE,UAAmB;IAC3D,MAAM,OAAO,GAAmC,EAAE,CAAC;IACnD,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,CAAC,OAAqB,EAAE,KAAa,EAAQ,EAAE;QAC3D,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAClE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAChD,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;qBAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;oBAC7B,KAAK,GAAG,EAAE,CAAC;gBACZ,CAAC;YACF,CAAC;YACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,KAAK,IAAI,cAAc;oBAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;oBAClD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACzC,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACd,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,oEAAoE;AAEpE;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,CAAmB,EAAE,YAAY,GAAG,KAAK;IACrF,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACjG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CACnC,CAAmB,EACnB,WAAgC,EAChC,KAAwC,EACxC,mBAAqD,EACrD,YAAY,GAAG,KAAK;IAEpB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAqB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IACxF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,SAAS,GAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACnD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;QAC7D,OAAO;YACN,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI;YAC3B,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;YACpD,MAAM,EACL,MAAM,KAAK,SAAS;gBACnB,CAAC,CAAC,mBAAmB;gBACrB,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;SAC1F,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAsB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;IACnG,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACvD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,6DAA6D;AAC7D,SAAS,qBAAqB,CAAC,QAAgB,EAAE,MAAyB,EAAE,cAAuB,EAAE,YAAqB;IACzH,MAAM,OAAO,GAAG,cAAc,IAAI,MAAM,CAAC,OAAO,CAAC;IACjD,IAAI,QAAQ,KAAK,qBAAqB,IAAI,mBAAmB,CAAC,OAAO,CAAC;QAAE,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC1G,OAAO,YAAY,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACvE,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,uBAAuB,CAAC,CAAc;IACrD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,UAAU,CAAC,CAAmB;IAC7C,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO;SACxB,MAAM,CAAC,CAAC,KAAK,EAA4B,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;SACtE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;SAC9B,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/C,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,MAAM,CAAC,CAAmB;IACzC,OAAO,CAAC,CAAC,OAAO;SACd,MAAM,CAAC,CAAC,KAAK,EAAwB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SAC9D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC;AAED,+DAA+D;AAC/D,SAAS,UAAU,CAAC,MAAyB;IAC5C,OAAO,MAAM,CAAC,OAAO;SACnB,MAAM,CAAC,CAAC,KAAK,EAAwB,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;SAC9D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { MLBClient } from "../mlbClient.ts";
|
|
2
|
+
import type { BuddyLogger, MLBMessage } from "../types.ts";
|
|
3
|
+
export interface ReadMLBMessagesDeps {
|
|
4
|
+
client: MLBClient;
|
|
5
|
+
key: string;
|
|
6
|
+
log: BuddyLogger;
|
|
7
|
+
/** 一次拉取拉到的消息,按消息时间升序:第一次是这场会话的全部,之后只有比上一批晚的,可能是空批 */
|
|
8
|
+
onMessages: (messages: MLBMessage[]) => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare class ReadMLBMessages {
|
|
11
|
+
private readonly deps;
|
|
12
|
+
/** 拉取串行链:notify 只往链尾排,绝不并发拉 */
|
|
13
|
+
private chain;
|
|
14
|
+
private retry;
|
|
15
|
+
private retryDelay;
|
|
16
|
+
/** 读方向游标:已经拉到的最晚一条的消息时间。别人的消息按到达平台的时刻记、只会越来越晚,拿它往后拉不会漏 */
|
|
17
|
+
private pulledTimestamp;
|
|
18
|
+
private closed;
|
|
19
|
+
constructor(deps: ReadMLBMessagesDeps);
|
|
20
|
+
/** 有新消息了:把一次拉取排进串行链,取消正在等的重试。退役后忽略 */
|
|
21
|
+
notify(): void;
|
|
22
|
+
/** Rebuild after replay, without mixing old and new cursor semantics. */
|
|
23
|
+
resetCursor(): void;
|
|
24
|
+
/** 退役:取消重试,之后不再拉,已经在拉的拉完也不交出去 */
|
|
25
|
+
close(): void;
|
|
26
|
+
/** 一次拉取:从游标往后一页页拉到 hasMore 为 false,整批里比游标晚的交给 onMessages。网络错误排一次重试就返回,这批不交 */
|
|
27
|
+
private read;
|
|
28
|
+
private scheduleRetry;
|
|
29
|
+
private cancelRetry;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=readMLBMessages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readMLBMessages.d.ts","sourceRoot":"","sources":["../../src/conversation/readMLBMessages.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAC;AAOzE,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,WAAW,CAAC;IACjB,qDAAqD;IACrD,UAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;IAC3C,+BAA+B;IAC/B,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,UAAU,CAAqB;IACvC,0DAA0D;IAC1D,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,mBAAmB;IAIrC,sCAAsC;IACtC,MAAM,IAAI,IAAI;IAQd,yEAAyE;IACzE,WAAW,IAAI,IAAI;IAEnB,iCAAiC;IACjC,KAAK,IAAI,IAAI;IAKb,8EAA8E;YAChE,IAAI;IA0BlB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,WAAW;CAKnB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// 一场会话从平台拉消息:同会话串行地拉、从哪拉起、拉失败了怎么办。
|
|
2
|
+
// 管:拉取串行链(notify 只往链尾排,绝不并发拉);读方向游标(已经拉到的最晚一条的消息时间);
|
|
3
|
+
// GET /internal/v1/messages 从游标往后一页页拉,响应的 hasMore 为 true 就从这页最后一条的时间接着拉,
|
|
4
|
+
// 整批里比游标晚的交给 onMessages,游标推到这批里最晚的消息时间;
|
|
5
|
+
// 网络错误主动退避重试(1 秒起步、翻倍、封顶 30 秒),新的 notify 取消等待立即重拉;退役后不再拉。
|
|
6
|
+
// 不管:拉到的消息怎么处理(index.ts:第一批重建历史,之后的交给回合)、HTTP 请求本身(mlbClient.ts)。
|
|
7
|
+
import { errorText } from "../log.js";
|
|
8
|
+
/** 每页最多拉多少条:平台钳在 1..200。一页还受图片内容总字节的限制,可能不满就结束,拉没拉完看响应的 hasMore */
|
|
9
|
+
const PULL_LIMIT = 200;
|
|
10
|
+
const PULL_RETRY_MIN_MS = 1_000;
|
|
11
|
+
const PULL_RETRY_MAX_MS = 30_000;
|
|
12
|
+
export class ReadMLBMessages {
|
|
13
|
+
deps;
|
|
14
|
+
/** 拉取串行链:notify 只往链尾排,绝不并发拉 */
|
|
15
|
+
chain = Promise.resolve();
|
|
16
|
+
retry;
|
|
17
|
+
retryDelay = PULL_RETRY_MIN_MS;
|
|
18
|
+
/** 读方向游标:已经拉到的最晚一条的消息时间。别人的消息按到达平台的时刻记、只会越来越晚,拿它往后拉不会漏 */
|
|
19
|
+
pulledTimestamp = 0;
|
|
20
|
+
closed = false;
|
|
21
|
+
constructor(deps) {
|
|
22
|
+
this.deps = deps;
|
|
23
|
+
}
|
|
24
|
+
/** 有新消息了:把一次拉取排进串行链,取消正在等的重试。退役后忽略 */
|
|
25
|
+
notify() {
|
|
26
|
+
if (this.closed)
|
|
27
|
+
return;
|
|
28
|
+
this.cancelRetry();
|
|
29
|
+
this.chain = this.chain
|
|
30
|
+
.then(() => this.read())
|
|
31
|
+
.catch((e) => this.deps.log.warn("处理拉取结果出错", { convoKey: this.deps.key, error: errorText(e) }));
|
|
32
|
+
}
|
|
33
|
+
/** Rebuild after replay, without mixing old and new cursor semantics. */
|
|
34
|
+
resetCursor() { this.pulledTimestamp = 0; }
|
|
35
|
+
/** 退役:取消重试,之后不再拉,已经在拉的拉完也不交出去 */
|
|
36
|
+
close() {
|
|
37
|
+
this.closed = true;
|
|
38
|
+
this.cancelRetry();
|
|
39
|
+
}
|
|
40
|
+
/** 一次拉取:从游标往后一页页拉到 hasMore 为 false,整批里比游标晚的交给 onMessages。网络错误排一次重试就返回,这批不交 */
|
|
41
|
+
async read() {
|
|
42
|
+
if (this.closed)
|
|
43
|
+
return;
|
|
44
|
+
const batch = [];
|
|
45
|
+
let after = this.pulledTimestamp;
|
|
46
|
+
for (;;) {
|
|
47
|
+
let page;
|
|
48
|
+
try {
|
|
49
|
+
page = await this.deps.client.pullMessages(this.deps.key, after, PULL_LIMIT);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
this.deps.log.warn("拉消息失败,稍后主动重试", { convoKey: this.deps.key, after, delayMs: this.retryDelay, error: errorText(e) });
|
|
53
|
+
this.scheduleRetry();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.cancelRetry();
|
|
57
|
+
if (this.closed)
|
|
58
|
+
return;
|
|
59
|
+
batch.push(...page.messages);
|
|
60
|
+
const last = page.messages.at(-1);
|
|
61
|
+
if (!page.hasMore || last === undefined)
|
|
62
|
+
break;
|
|
63
|
+
after = last.timestamp;
|
|
64
|
+
}
|
|
65
|
+
this.retryDelay = PULL_RETRY_MIN_MS;
|
|
66
|
+
const fresh = batch.filter((m) => m.timestamp > this.pulledTimestamp);
|
|
67
|
+
for (const m of fresh)
|
|
68
|
+
if (m.timestamp > this.pulledTimestamp)
|
|
69
|
+
this.pulledTimestamp = m.timestamp;
|
|
70
|
+
await this.deps.onMessages(fresh);
|
|
71
|
+
}
|
|
72
|
+
scheduleRetry() {
|
|
73
|
+
if (this.closed || this.retry !== undefined)
|
|
74
|
+
return;
|
|
75
|
+
const delay = this.retryDelay;
|
|
76
|
+
this.retryDelay = Math.min(delay * 2, PULL_RETRY_MAX_MS);
|
|
77
|
+
this.retry = setTimeout(() => {
|
|
78
|
+
this.retry = undefined;
|
|
79
|
+
this.notify();
|
|
80
|
+
}, delay);
|
|
81
|
+
this.retry.unref();
|
|
82
|
+
}
|
|
83
|
+
cancelRetry() {
|
|
84
|
+
if (this.retry === undefined)
|
|
85
|
+
return;
|
|
86
|
+
clearTimeout(this.retry);
|
|
87
|
+
this.retry = undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=readMLBMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readMLBMessages.js","sourceRoot":"","sources":["../../src/conversation/readMLBMessages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { AssistantMessage, ToolResultMessage } from "@earendil-works/pi-ai";
|
|
3
|
+
import type { MLBClient } from "../mlbClient.ts";
|
|
4
|
+
import type { BuddyLogger, MLBMessageToWrite, NoteMessage } from "../types.ts";
|
|
5
|
+
export interface WriteMLBMessageDeps {
|
|
6
|
+
client: MLBClient;
|
|
7
|
+
key: string;
|
|
8
|
+
buddyId: string;
|
|
9
|
+
/** 本进程里这场会话的一次生命周期标识,进幂等键;重启后换一个,旧键不会撞新键 */
|
|
10
|
+
runId: string;
|
|
11
|
+
log: BuddyLogger;
|
|
12
|
+
}
|
|
13
|
+
export declare class WriteMLBMessage {
|
|
14
|
+
private readonly deps;
|
|
15
|
+
private queue;
|
|
16
|
+
/** 串行链正在跑:它在跑时队头那项正在发 */
|
|
17
|
+
private sending;
|
|
18
|
+
/** 幂等键里的自增号 */
|
|
19
|
+
private sent;
|
|
20
|
+
private retryDelay;
|
|
21
|
+
/** close 时打断重发等待 */
|
|
22
|
+
private readonly abort;
|
|
23
|
+
/** 等队列清空的人 */
|
|
24
|
+
private waiters;
|
|
25
|
+
private deltaBuffer;
|
|
26
|
+
private deltaTimer;
|
|
27
|
+
private closed;
|
|
28
|
+
constructor(deps: WriteMLBMessageDeps);
|
|
29
|
+
/** 业务消息与 delta、模型写回共用同一队列。 */
|
|
30
|
+
enqueueMessage(message: MLBMessageToWrite): void;
|
|
31
|
+
/** 回合开始 on、收尾 off;工具跑起来时带 status 更新状态行。退役后照收 */
|
|
32
|
+
replying(data: {
|
|
33
|
+
on: boolean;
|
|
34
|
+
status?: string;
|
|
35
|
+
}): void;
|
|
36
|
+
/** 正文碎片先攒着,120 毫秒内攒到的一起发 */
|
|
37
|
+
delta(text: string): void;
|
|
38
|
+
/** 不带工具调用的 assistant 消息写成 message 记录(mlbMessageAgentMessageConverter.ts 判定不写的不写) */
|
|
39
|
+
assistant(m: AssistantMessage, omitThinking?: boolean): void;
|
|
40
|
+
/** 带工具调用的一步连同工具结果写成一条 tool 记录;平台回的时间写在这一步的 assistant 消息上,工具结果跟着它排 */
|
|
41
|
+
toolStep(m: AssistantMessage, toolResults: ToolResultMessage[], tools: {
|
|
42
|
+
name: string;
|
|
43
|
+
label: string;
|
|
44
|
+
}[], dataAccessDetailsOf: (toolCallId: string) => unknown, sensitiveRun?: boolean): void;
|
|
45
|
+
/** 运行时补给模型的 note 写成 note 记录 */
|
|
46
|
+
note(n: NoteMessage): void;
|
|
47
|
+
/** DataAccess 脱敏把这一轮的消息换成了副本(old → new):还没写完的,平台回的时间改写到副本上 */
|
|
48
|
+
retarget(replaced: Map<AgentMessage, AgentMessage>): void;
|
|
49
|
+
/** 攒着的字发出去,等队列清空(退役后只剩开关要发) */
|
|
50
|
+
flush(): Promise<void>;
|
|
51
|
+
/** 退役:攒着的字扔掉,正在退避等重发的立刻醒来;队列里没发的字与写回在串行链上丢掉,开关照发 */
|
|
52
|
+
close(): void;
|
|
53
|
+
/** 入队即分配幂等键;先把攒着的字发掉,字排在写回前面。退役后不收 */
|
|
54
|
+
private write;
|
|
55
|
+
/** 攒下的碎片立刻排进队列;队尾正好是一帧还没发的 delta 就并进去(写回在重发时,后面的字攒成一帧) */
|
|
56
|
+
private flushDelta;
|
|
57
|
+
private enqueue;
|
|
58
|
+
/** 串行链:一次发队头一项,发完(或退役丢掉)才出队;写回遇到网络错误留在队头,退避后带同一个键重发 */
|
|
59
|
+
private drain;
|
|
60
|
+
/** 写一条:delivered → 平台回的时间写进内存那条消息;rejected(4xx)→ warn;都算发完回 true。throw(网络 / 5xx)→ 退避后回 false,留队重发 */
|
|
61
|
+
private send;
|
|
62
|
+
private clearTimer;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=writeMLBMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeMLBMessage.d.ts","sourceRoot":"","sources":["../../src/conversation/writeMLBMessage.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS/E,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,WAAW,CAAC;CACjB;AAQD,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;IAC3C,OAAO,CAAC,KAAK,CAAc;IAC3B,yBAAyB;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,eAAe;IACf,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,UAAU,CAAsB;IACxC,oBAAoB;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,cAAc;IACd,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,mBAAmB;IAIrC,8BAA8B;IAC9B,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAEhD,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKtD,4BAA4B;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAWzB,oFAAoF;IACpF,SAAS,CAAC,CAAC,EAAE,gBAAgB,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI;IAK5D,qEAAqE;IACrE,QAAQ,CACP,CAAC,EAAE,gBAAgB,EACnB,WAAW,EAAE,iBAAiB,EAAE,EAChC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,EACxC,mBAAmB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,EACpD,YAAY,CAAC,EAAE,OAAO,GACpB,IAAI;IAKP,+BAA+B;IAC/B,IAAI,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI;IAI1B,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,IAAI;IASzD,+BAA+B;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,oDAAoD;IACpD,KAAK,IAAI,IAAI;IAOb,sCAAsC;IACtC,OAAO,CAAC,KAAK;IAQb,0DAA0D;IAC1D,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,OAAO;IAKf,uDAAuD;YACzC,KAAK;IAyBnB,qGAAqG;YACvF,IAAI;IAiClB,OAAO,CAAC,UAAU;CAKlB"}
|