@my-life-buddies/buddy-runtime 0.3.0 → 0.3.1
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 +1 -1
- package/dist/conversation/agentMessageLLMMessageConverter.d.ts +3 -2
- package/dist/conversation/agentMessageLLMMessageConverter.d.ts.map +1 -1
- package/dist/conversation/agentMessageLLMMessageConverter.js +5 -14
- package/dist/conversation/agentMessageLLMMessageConverter.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -343,7 +343,7 @@ MLBMessage[] → AgentMessage[] → convertToLlm() → LLMMessage[] → LLM
|
|
|
343
343
|
```
|
|
344
344
|
|
|
345
345
|
1. 平台上的 `MLBMessage` 换成 pi 的 `AgentMessage`,追加进会话历史。一条消息只换一次:会话起来时换一遍平台上已有的全部消息,之后来一条换一条。图片、引用和聊天记录卡怎么换,见 3.3.5。
|
|
346
|
-
2. `convertToLlm()
|
|
346
|
+
2. `convertToLlm()`:运行时实现,开发者不能替换。每次请求模型都拿完整的会话历史来换:user、工具结果和运行时补的提醒(note)正文开头拼上它的时间,统一用 GMT、精确到秒,如「[2026-09-10 14:00:30 GMT] 」;搭子自己说的话(assistant)不拼,否则模型会照着在回复开头也写上时间;note 换成 user,其余原样,按原来的先后一条对一条,相邻的 user 不合并。换之前,运行时先在历史末尾接一条提醒,开头的时间就是现在,正文是「现在的时间(平台附注,不是谁说的话)」;这条只进这一次请求,不进会话历史。这些时间怎么读、用户所在时区去哪看,写在平台的系统提示里。换出来的 `LLMMessage`(即 pi-ai 的 `Message`)连同 `systemPrompt` 与 `tools` 发给模型。
|
|
347
347
|
3. 模型的回复,以及它调用工具得到的结果,直接追加进会话历史,不经过 (1)。
|
|
348
348
|
4. 经 (3) 追加进历史的消息,运行时再换成 `MLBMessage` 写回平台;经 (1) 从平台来的不会写回。用户在聊天里看到的回复就是这一步写上去的。用过授权数据的那一轮,写回前先脱敏,见 3.3.2。搭子重启后,这些消息经 (1) 取回。
|
|
349
349
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
2
|
import type { Message } from "@earendil-works/pi-ai";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* user、toolResult、note 的正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;搭子自己说的(assistant)原样不拼,
|
|
5
|
+
* 拼了模型会照着历史里自己的样子,在回复开头也写上方括号时间。note 变 user;一条对一条、按原来的先后,相邻的 user 不合并。
|
|
5
6
|
* 时间统一用 GMT、只看消息自己的 timestamp,同一条消息每次拼出来一字不差,前缀缓存照样命中。
|
|
6
|
-
*
|
|
7
|
+
* 返回的是新数组,不改传进来的消息。
|
|
7
8
|
*/
|
|
8
9
|
export declare const agentMessagesToLLMMessages: (messages: AgentMessage[]) => Message[];
|
|
9
10
|
/** 拼在正文开头的时间「[2026-09-10 14:00:30 GMT] 」:timestamp 换成 GMT,精确到秒 */
|
|
@@ -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,
|
|
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;AAkBJ,kEAAkE;AAClE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
// AgentMessage → LLMMessage 的换算:交给 pi 的 convertToLlm,每次请求模型前把整段 Agent 历史换成模型收的消息(pi-ai 的 Message)。
|
|
2
2
|
// MLBMessage 与 AgentMessage 之间的换算不在这里,在 mlbMessageAgentMessageConverter.ts;图片块在那一步就定好了,这里原样交出去。
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* user、toolResult、note 的正文开头拼上它的时间「[2026-09-10 14:00:30 GMT] 」;搭子自己说的(assistant)原样不拼,
|
|
5
|
+
* 拼了模型会照着历史里自己的样子,在回复开头也写上方括号时间。note 变 user;一条对一条、按原来的先后,相邻的 user 不合并。
|
|
5
6
|
* 时间统一用 GMT、只看消息自己的 timestamp,同一条消息每次拼出来一字不差,前缀缓存照样命中。
|
|
6
|
-
*
|
|
7
|
+
* 返回的是新数组,不改传进来的消息。
|
|
7
8
|
*/
|
|
8
9
|
export const agentMessagesToLLMMessages = (messages) => messages.flatMap((m) => {
|
|
9
10
|
const next = agentMessageToLLMMessage(m);
|
|
10
11
|
return next === undefined ? [] : [next];
|
|
11
12
|
});
|
|
12
|
-
/** 一条 AgentMessage 到模型那边是什么:note 变 user;pi harness 自己并进来的那几种 role(bashExecution / custom / …)这个运行时不产生,照 pi 默认 convertToLlm 的做法不给模型 */
|
|
13
|
+
/** 一条 AgentMessage 到模型那边是什么:note 变 user;assistant 原样;pi harness 自己并进来的那几种 role(bashExecution / custom / …)这个运行时不产生,照 pi 默认 convertToLlm 的做法不给模型 */
|
|
13
14
|
function agentMessageToLLMMessage(m) {
|
|
14
15
|
switch (m.role) {
|
|
15
16
|
case "note":
|
|
@@ -19,7 +20,7 @@ function agentMessageToLLMMessage(m) {
|
|
|
19
20
|
case "toolResult":
|
|
20
21
|
return { ...m, content: withTimeMark(m.content, m.timestamp) };
|
|
21
22
|
case "assistant":
|
|
22
|
-
return
|
|
23
|
+
return m;
|
|
23
24
|
default:
|
|
24
25
|
return undefined;
|
|
25
26
|
}
|
|
@@ -35,14 +36,4 @@ function withTimeMark(content, timestamp) {
|
|
|
35
36
|
return [{ ...first, text: timeMark(timestamp) + first.text }, ...rest];
|
|
36
37
|
return [{ type: "text", text: timeMark(timestamp).trimEnd() }, ...content];
|
|
37
38
|
}
|
|
38
|
-
/** assistant 拼在第一块文字开头;只调工具、没说话的,在 thinking 之后、工具调用之前插一块只写时间的文字 */
|
|
39
|
-
function assistantWithTimeMark(content, timestamp) {
|
|
40
|
-
const textAt = content.findIndex((block) => block.type === "text");
|
|
41
|
-
if (textAt !== -1) {
|
|
42
|
-
return content.map((block, i) => (i === textAt && block.type === "text" ? { ...block, text: timeMark(timestamp) + block.text } : block));
|
|
43
|
-
}
|
|
44
|
-
const mark = { type: "text", text: timeMark(timestamp).trimEnd() };
|
|
45
|
-
const at = content.findIndex((block) => block.type !== "thinking");
|
|
46
|
-
return at === -1 ? [...content, mark] : [...content.slice(0, at), mark, ...content.slice(at)];
|
|
47
|
-
}
|
|
48
39
|
//# sourceMappingURL=agentMessageLLMMessageConverter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentMessageLLMMessageConverter.js","sourceRoot":"","sources":["../../src/conversation/agentMessageLLMMessageConverter.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,gGAAgG;AAKhG
|
|
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,mJAAmJ;AACnJ,SAAS,wBAAwB,CAAC,CAAe;IAChD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,MAAM;YACV,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;QACpH,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"}
|