@aalis/plugin-agent 0.15.2 → 0.17.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/dist/helpers.d.ts +59 -26
- package/dist/helpers.d.ts.map +1 -1
- package/dist/helpers.js +150 -78
- package/dist/helpers.js.map +1 -1
- package/dist/index.d.ts +18 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1317 -1350
- package/dist/index.js.map +1 -1
- package/dist/locales/en.d.ts +58 -0
- package/dist/locales/en.d.ts.map +1 -0
- package/dist/locales/en.js +58 -0
- package/dist/locales/en.js.map +1 -0
- package/dist/prompt-assembly.d.ts +6 -6
- package/dist/prompt-assembly.d.ts.map +1 -1
- package/dist/prompt-assembly.js +36 -21
- package/dist/prompt-assembly.js.map +1 -1
- package/dist/session-queue.d.ts +86 -0
- package/dist/session-queue.d.ts.map +1 -0
- package/dist/session-queue.js +194 -0
- package/dist/session-queue.js.map +1 -0
- package/dist/texts.d.ts +115 -0
- package/dist/texts.d.ts.map +1 -0
- package/dist/texts.js +62 -0
- package/dist/texts.js.map +1 -0
- package/package.json +28 -21
package/dist/helpers.d.ts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* 这些函数**不碰能力、也不碰 this**,可独立测试与替换。
|
|
5
|
-
* 拆分目的:
|
|
6
|
-
* - 让 index.ts 主类聚焦在编排/状态管理,而不是 token 估算细节
|
|
7
|
-
* - 让纯函数可被 vitest 单独覆盖(无需搭出一次激活)
|
|
8
|
-
*/
|
|
9
|
-
import type { PersonaSessionOptions } from '@aalis/api-persona';
|
|
10
|
-
import type { SessionConfig } from '@aalis/api-session-manager';
|
|
11
|
-
import type { IncomingMessage, Message } from '@aalis/schema-message';
|
|
1
|
+
import type { MemoryService } from '@aalis/api-memory';
|
|
2
|
+
import type { TextRef } from '@aalis/schema-i18n';
|
|
3
|
+
import type { IncomingMessage, Message, ToolCall } from '@aalis/schema-message';
|
|
12
4
|
/**
|
|
13
5
|
* 将时间戳格式化为可读的时间标签:同年 `M/D HH:mm`,跨年 `YYYY/M/D HH:mm`。
|
|
14
6
|
*
|
|
@@ -29,29 +21,63 @@ export declare function formatTimeLabel(ts: number, now: number): string;
|
|
|
29
21
|
*/
|
|
30
22
|
export declare const INPUT_CONVENTIONS: string;
|
|
31
23
|
/**
|
|
32
|
-
* 群聊焦点指引 ——
|
|
24
|
+
* 群聊焦点指引 —— 多方房间里这一轮有被点名的输入时注入,紧贴在这一轮的输入之前,按时间与发送者账号逐条列出被点名的那几条;
|
|
25
|
+
* 插进被点名的输入时在它们之前另加一块,不改前面那块。
|
|
33
26
|
*
|
|
34
27
|
* 背景痛点:群里多人陈述某事件 E,A 突然 @bot「你怎么看 E」。bot 看到的 messages 是
|
|
35
28
|
* 「B 长篇陈述 → C 长篇陈述 → D 长篇陈述 → A 简短@」,注意力容易被最显眼的陈述吸走,
|
|
36
29
|
* 把陈述者本人当成评价主体,而不是被陈述的事件 E 本身。
|
|
37
30
|
*
|
|
38
|
-
*
|
|
31
|
+
* 解决:插一条焦点指引,明确哪几条是焦点(按时间与发送者标注认,正文里不另加标记:之后它们进历史时正文不变),并指引 LLM 区分
|
|
39
32
|
* - 评价对象(被引用 / 被讨论的事件 E)
|
|
40
33
|
* - 引用者(发言者本人)
|
|
41
34
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
35
|
+
* focus 是被点名的各条的「(时间) 发送者账号」;没有被点名的(interval/idle/proactive 没有清晰诉求主体,强加焦点反而会误导)
|
|
36
|
+
* 返回 null
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildFocusGuidance(focus: readonly string[]): Message | null;
|
|
39
|
+
/**
|
|
40
|
+
* 由排着的真人消息开的一轮的说明:它们是上一轮进行期间到的。quiet 为真时(多方房间里这一批全是没点名她的插话)另说没有
|
|
41
|
+
* 需要接的可以不说话;私聊、工作会话与批里有点名的照常回
|
|
44
42
|
*/
|
|
45
|
-
export declare function
|
|
46
|
-
/**
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
export declare function queuedNote(quiet: boolean): Message;
|
|
44
|
+
/**
|
|
45
|
+
* 停下标记(schema-message 的 TurnStopped):落进会话历史,让下一轮的模型知道上面这一轮没答完就停了。who 是停下的人的称呼,
|
|
46
|
+
* 没有具体的人时不给。末句不叫她接着做,接不接看之后的消息
|
|
47
|
+
*/
|
|
48
|
+
export declare function stoppedNote(who: string | undefined, turnId: string): Message;
|
|
49
|
+
/**
|
|
50
|
+
* 本轮附件有没有描述正文:附件描述里有一项去掉不带描述的附件引用(只是指针,如关了到达识别时的 `[图片 | ref:…]`)之后
|
|
51
|
+
* 还有文字。媒体识别的描述(带引用的、没落盘的、视频与音频)与文件说明都算
|
|
52
|
+
*/
|
|
53
|
+
export declare function hasAttachmentDescriptions(incoming: Pick<IncomingMessage, '_attachmentDescriptions'>): boolean;
|
|
49
54
|
/** 估算一组消息的总 token 数 */
|
|
50
55
|
export declare function estimateTokens(messages: Message[]): number;
|
|
56
|
+
/** 估算一组消息里历史与工具结果(system 以外的消息)的 token 数,与用量拆分的 history、toolResults 两项同一口径 */
|
|
57
|
+
export declare function estimateHistoryTokens(messages: Message[]): number;
|
|
58
|
+
/**
|
|
59
|
+
* 发给模型的会话历史丢掉活跃历史里最早的几条对话消息:条数线为 0、或对话消息不超过它时为 0;超过时按半条线成段前移。
|
|
60
|
+
* 只由对话消息的条数与条数线决定,两次前移之间不变:发出的开头逐字不变,服务商的前缀缓存才命中
|
|
61
|
+
*/
|
|
62
|
+
export declare function historyStart(count: number, limit: number): number;
|
|
63
|
+
/**
|
|
64
|
+
* 读发给模型的会话历史:活跃历史丢掉最早的 historyStart 条对话消息,余下的到末尾;count 是活跃历史里对话消息的条数(条数只数
|
|
65
|
+
* 对话消息,与 api-memory 的 countHistory 同一口径;真实回合与 token:request 的快照共用)。后端有 countHistory 时先数再按条数
|
|
66
|
+
* 只读起点之后的那一段(没超线时读最近条数线那么多条:数完到读之间进来的消息不会挤掉最早那条),没有时读全部再切,两条路是同一段
|
|
67
|
+
*/
|
|
68
|
+
export declare function readHistory(memory: Pick<MemoryService, 'getHistory' | 'countHistory'>, sessionId: string, limit?: number): Promise<{
|
|
69
|
+
messages: Message[];
|
|
70
|
+
count: number;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* 交给模型的一条历史:她的回复带可见正文(schema-message 的 VisibleContent,落库的是结构化输出的信封时才有)时换成可见正文的
|
|
74
|
+
* 副本,免得模型照抄信封;其余原样
|
|
75
|
+
*/
|
|
76
|
+
export declare function historyForModel(m: Message): Message;
|
|
51
77
|
/** 比较两条消息是否在 role/timestamp/name/content 维度上等价(不比较 toolCalls / id) */
|
|
52
78
|
export declare function isSameMessage(a: Message, b: Message): boolean;
|
|
53
79
|
/**
|
|
54
|
-
* LLM
|
|
80
|
+
* LLM 解析失败时的可诊断说明(纯函数):给人看的文字对象,发进聊天时按会话的语言显示,写日志取 toSource。
|
|
55
81
|
*
|
|
56
82
|
* `resolveLLMModel` 拿到显式 ref 却匹配不上任何 entry 时静默返回 undefined,调用方只知道
|
|
57
83
|
* 「没拿到」。而 ref 是**包名 + 模型名**——包一改名(`plugin-deepseek` → `plugin-llm-deepseek`)、
|
|
@@ -68,15 +94,22 @@ export declare function isSameMessage(a: Message, b: Message): boolean;
|
|
|
68
94
|
export declare function describeLLMFailure(available: readonly string[], wanted?: {
|
|
69
95
|
provider?: string;
|
|
70
96
|
model?: string;
|
|
71
|
-
}, erroredProviders?: readonly string[]):
|
|
72
|
-
/**
|
|
73
|
-
* 会话解析结果 → persona 的会话选项。真实回合与 token:request 快照共用这一份构造,
|
|
74
|
-
* 快照里 persona 那一桶才会按会话实际人设与额外提示估算。无 session-manager 时给 undefined(全局默认)。
|
|
75
|
-
*/
|
|
76
|
-
export declare function toPersonaOptions(resolved: Omit<SessionConfig, 'sessionDefaults'> | undefined): PersonaSessionOptions | undefined;
|
|
97
|
+
}, erroredProviders?: readonly string[]): TextRef;
|
|
77
98
|
/**
|
|
78
99
|
* 调试日志里的工具参数。参数经 `agent:tool:before` 钩子后可能含 JSON 序列化不了的值(BigInt、循环引用),
|
|
79
100
|
* 序列化失败时回落为说明文字:日志不能让工具调用失败。
|
|
80
101
|
*/
|
|
81
102
|
export declare function formatToolArgsForLog(args: unknown): string;
|
|
103
|
+
/**
|
|
104
|
+
* 解析一次工具调用的参数。arguments 不是 JSON 对象时回 error(回给模型的错误,带截断的原文),调用里的 arguments 换成
|
|
105
|
+
* `{}`:这次调用随 assistant 消息进本回合的消息与存档,下一轮会被模型服务插件原样发回,坏 JSON 不能跟着重放。
|
|
106
|
+
* 无参工具的 arguments 常是空串(流式路径没有 argument delta 时拼出来就是 ''),按空对象算,原样保留
|
|
107
|
+
*/
|
|
108
|
+
export declare function parseToolArguments(toolCall: ToolCall): {
|
|
109
|
+
toolCall: ToolCall;
|
|
110
|
+
args: Record<string, unknown>;
|
|
111
|
+
} | {
|
|
112
|
+
toolCall: ToolCall;
|
|
113
|
+
error: string;
|
|
114
|
+
};
|
|
82
115
|
//# sourceMappingURL=helpers.d.ts.map
|
package/dist/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAWhF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAW/D;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,QASlB,CAAC;AAEb;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAe3E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMlD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAS5E;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,yBAAyB,CAAC,GAAG,OAAO,CAM7G;AAID,uBAAuB;AACvB,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAI1D;AAED,8EAA8E;AAC9E,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAEjE;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjE;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,cAAc,CAAC,EAC1D,SAAS,EAAE,MAAM,EACjB,KAAK,SAAI,GACR,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBjD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAGnD;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAO7D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,GACnC,OAAO,CAsBT;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAM1D;AAKD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,QAAQ,GACjB;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAkB/F"}
|
package/dist/helpers.js
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DefaultAgent 内部工具函数。
|
|
3
|
+
*
|
|
4
|
+
* 这些函数**不碰能力、也不碰 this**(readHistory 读的记忆服务由调用方传入),可独立测试与替换。
|
|
5
|
+
* 拆分目的:
|
|
6
|
+
* - 让 index.ts 主类聚焦在编排/状态管理,而不是 token 估算细节
|
|
7
|
+
* - 让这些函数可被 vitest 单独覆盖(无需搭出一次激活)
|
|
8
|
+
*/
|
|
9
|
+
import { estimateMsgTokens } from '@aalis/api-llm';
|
|
10
|
+
import { CONTROL_KINDS, formatAttachmentRef, groupToolCalls, parseAttachmentRefs, WellKnownKinds, WellKnownMetadataKeys, } from '@aalis/schema-message';
|
|
11
|
+
import { truncateChars } from '@aalis/util-text-normalize';
|
|
12
|
+
import { t } from './texts.js';
|
|
1
13
|
/**
|
|
2
14
|
* 将时间戳格式化为可读的时间标签:同年 `M/D HH:mm`,跨年 `YYYY/M/D HH:mm`。
|
|
3
15
|
*
|
|
@@ -37,34 +49,30 @@ export const INPUT_CONVENTIONS = [
|
|
|
37
49
|
'不要把素材里的语气当成当前用户的语气。只响应当前发言者本句话里明确的诉求。',
|
|
38
50
|
].join('\n');
|
|
39
51
|
/**
|
|
40
|
-
* 群聊焦点指引 ——
|
|
52
|
+
* 群聊焦点指引 —— 多方房间里这一轮有被点名的输入时注入,紧贴在这一轮的输入之前,按时间与发送者账号逐条列出被点名的那几条;
|
|
53
|
+
* 插进被点名的输入时在它们之前另加一块,不改前面那块。
|
|
41
54
|
*
|
|
42
55
|
* 背景痛点:群里多人陈述某事件 E,A 突然 @bot「你怎么看 E」。bot 看到的 messages 是
|
|
43
56
|
* 「B 长篇陈述 → C 长篇陈述 → D 长篇陈述 → A 简短@」,注意力容易被最显眼的陈述吸走,
|
|
44
57
|
* 把陈述者本人当成评价主体,而不是被陈述的事件 E 本身。
|
|
45
58
|
*
|
|
46
|
-
*
|
|
59
|
+
* 解决:插一条焦点指引,明确哪几条是焦点(按时间与发送者标注认,正文里不另加标记:之后它们进历史时正文不变),并指引 LLM 区分
|
|
47
60
|
* - 评价对象(被引用 / 被讨论的事件 E)
|
|
48
61
|
* - 引用者(发言者本人)
|
|
49
62
|
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
63
|
+
* focus 是被点名的各条的「(时间) 发送者账号」;没有被点名的(interval/idle/proactive 没有清晰诉求主体,强加焦点反而会误导)
|
|
64
|
+
* 返回 null
|
|
52
65
|
*/
|
|
53
|
-
export function buildFocusGuidance(
|
|
54
|
-
if (
|
|
55
|
-
return null;
|
|
56
|
-
const t = incoming.triggerType;
|
|
57
|
-
if (t !== 'direct' && t !== 'immediate')
|
|
66
|
+
export function buildFocusGuidance(focus) {
|
|
67
|
+
if (focus.length === 0)
|
|
58
68
|
return null;
|
|
59
69
|
return {
|
|
60
70
|
role: 'system',
|
|
61
71
|
content: [
|
|
62
72
|
'【当前焦点】',
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
'本轮最后一条带时间与发送者标注的消息,是触发你本轮回应的"焦点消息"。',
|
|
67
|
-
'回应前请先识别它的核心诉求类型:评价某事 / 回答提问 / 吐槽附和 / 闲聊回应。',
|
|
73
|
+
'触发你本轮回应的"焦点消息"是下面这几条(按时间与发送者标注认):',
|
|
74
|
+
...focus.map(line => `- ${line}`),
|
|
75
|
+
'回应前请先识别它们的核心诉求类型:评价某事 / 回答提问 / 吐槽附和 / 闲聊回应。',
|
|
68
76
|
'若焦点消息中通过引用、转发、@他人提及、或文字指向了一个被讨论的对象(事件、作品、',
|
|
69
77
|
'行为、观点),你的回应应当针对"被指向的对象",而不是把"陈述者本人"当成评价主体。',
|
|
70
78
|
'群里前面其他成员的长篇陈述只是背景上下文,不是焦点。',
|
|
@@ -72,49 +80,44 @@ export function buildFocusGuidance(incoming) {
|
|
|
72
80
|
metadata: { injector: 'focus-guidance' },
|
|
73
81
|
};
|
|
74
82
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
let i = 0;
|
|
86
|
-
while (i < text.length) {
|
|
87
|
-
if (CJK_REGEX.test(text[i])) {
|
|
88
|
-
tokens += 1.5;
|
|
89
|
-
i++;
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
let asciiLen = 0;
|
|
93
|
-
while (i < text.length && !CJK_REGEX.test(text[i])) {
|
|
94
|
-
asciiLen++;
|
|
95
|
-
i++;
|
|
96
|
-
}
|
|
97
|
-
tokens += Math.ceil(asciiLen / 3.5);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return Math.ceil(tokens);
|
|
83
|
+
/**
|
|
84
|
+
* 由排着的真人消息开的一轮的说明:它们是上一轮进行期间到的。quiet 为真时(多方房间里这一批全是没点名她的插话)另说没有
|
|
85
|
+
* 需要接的可以不说话;私聊、工作会话与批里有点名的照常回
|
|
86
|
+
*/
|
|
87
|
+
export function queuedNote(quiet) {
|
|
88
|
+
return {
|
|
89
|
+
role: 'system',
|
|
90
|
+
content: `下面几条是你上一轮进行期间到的。${quiet ? '没有需要接的可以不说话。' : ''}`,
|
|
91
|
+
metadata: { injector: 'system-other' },
|
|
92
|
+
};
|
|
101
93
|
}
|
|
102
|
-
/**
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
94
|
+
/**
|
|
95
|
+
* 停下标记(schema-message 的 TurnStopped):落进会话历史,让下一轮的模型知道上面这一轮没答完就停了。who 是停下的人的称呼,
|
|
96
|
+
* 没有具体的人时不给。末句不叫她接着做,接不接看之后的消息
|
|
97
|
+
*/
|
|
98
|
+
export function stoppedNote(who, turnId) {
|
|
99
|
+
const stopped = who ? `你还没答完,就被 ${who} 叫停了` : '你还没答完就被停下了';
|
|
100
|
+
return {
|
|
101
|
+
role: 'system',
|
|
102
|
+
kind: WellKnownKinds.TurnStopped,
|
|
103
|
+
content: `[已停下] 上面这一轮${stopped}:没说完的话没有留下,已经执行的工具调用以上面的记录为准。要不要接着做,看之后的消息再定。`,
|
|
104
|
+
timestamp: Date.now(),
|
|
105
|
+
metadata: { [WellKnownMetadataKeys.TurnId]: turnId },
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 本轮附件有没有描述正文:附件描述里有一项去掉不带描述的附件引用(只是指针,如关了到达识别时的 `[图片 | ref:…]`)之后
|
|
110
|
+
* 还有文字。媒体识别的描述(带引用的、没落盘的、视频与音频)与文件说明都算
|
|
111
|
+
*/
|
|
112
|
+
export function hasAttachmentDescriptions(incoming) {
|
|
113
|
+
return (incoming._attachmentDescriptions ?? []).some(desc => {
|
|
114
|
+
if (!desc)
|
|
115
|
+
return false;
|
|
116
|
+
const pointers = parseAttachmentRefs(desc).filter(ref => !ref.desc);
|
|
117
|
+
return pointers.reduce((rest, ref) => rest.replace(formatAttachmentRef(ref), ''), desc).trim() !== '';
|
|
118
|
+
});
|
|
117
119
|
}
|
|
120
|
+
// ----- Token 估算 -----
|
|
118
121
|
/** 估算一组消息的总 token 数 */
|
|
119
122
|
export function estimateTokens(messages) {
|
|
120
123
|
let total = 0;
|
|
@@ -122,6 +125,62 @@ export function estimateTokens(messages) {
|
|
|
122
125
|
total += estimateMsgTokens(msg);
|
|
123
126
|
return total;
|
|
124
127
|
}
|
|
128
|
+
/** 估算一组消息里历史与工具结果(system 以外的消息)的 token 数,与用量拆分的 history、toolResults 两项同一口径 */
|
|
129
|
+
export function estimateHistoryTokens(messages) {
|
|
130
|
+
return estimateTokens(messages.filter(m => m.role !== 'system'));
|
|
131
|
+
}
|
|
132
|
+
// ----- 发给模型的会话历史 -----
|
|
133
|
+
/**
|
|
134
|
+
* 发给模型的会话历史丢掉活跃历史里最早的几条对话消息:条数线为 0、或对话消息不超过它时为 0;超过时按半条线成段前移。
|
|
135
|
+
* 只由对话消息的条数与条数线决定,两次前移之间不变:发出的开头逐字不变,服务商的前缀缓存才命中
|
|
136
|
+
*/
|
|
137
|
+
export function historyStart(count, limit) {
|
|
138
|
+
if (!limit || count <= limit)
|
|
139
|
+
return 0;
|
|
140
|
+
const step = Math.ceil(limit / 2);
|
|
141
|
+
return Math.ceil((count - limit) / step) * step;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 读发给模型的会话历史:活跃历史丢掉最早的 historyStart 条对话消息,余下的到末尾;count 是活跃历史里对话消息的条数(条数只数
|
|
145
|
+
* 对话消息,与 api-memory 的 countHistory 同一口径;真实回合与 token:request 的快照共用)。后端有 countHistory 时先数再按条数
|
|
146
|
+
* 只读起点之后的那一段(没超线时读最近条数线那么多条:数完到读之间进来的消息不会挤掉最早那条),没有时读全部再切,两条路是同一段
|
|
147
|
+
*/
|
|
148
|
+
export async function readHistory(memory, sessionId, limit = 0) {
|
|
149
|
+
let messages;
|
|
150
|
+
let count;
|
|
151
|
+
let start;
|
|
152
|
+
if (limit && memory.countHistory) {
|
|
153
|
+
count = await memory.countHistory(sessionId);
|
|
154
|
+
start = historyStart(count, limit);
|
|
155
|
+
messages = await memory.getHistory(sessionId, start ? count - start : limit);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const all = await memory.getHistory(sessionId, Infinity);
|
|
159
|
+
const said = all.flatMap((m, i) => (CONTROL_KINDS.includes(m.kind ?? '') ? [] : [i]));
|
|
160
|
+
count = said.length;
|
|
161
|
+
start = historyStart(count, limit);
|
|
162
|
+
// 同按条数读:从丢掉的最后一条对话消息之后切,夹在它与下一条对话消息之间的标记留下
|
|
163
|
+
messages = start ? all.slice(said[start - 1] + 1) : all;
|
|
164
|
+
}
|
|
165
|
+
// 起点落在工具调用组中间:组首在起点之前已经丢掉,这一组留下的结果(第一组之前组外的结果)随它一起丢,夹在其间的别的消息照留。
|
|
166
|
+
// 之后组外的结果不是起点切出来的,与起点在不在 0 无关,照旧交给读的一方(真实回合的清洗跳过并告警)
|
|
167
|
+
const leftover = new Set();
|
|
168
|
+
for (const { at, shape } of start > 0 ? groupToolCalls(messages) : []) {
|
|
169
|
+
if (shape === 'complete' || shape === 'partial')
|
|
170
|
+
break;
|
|
171
|
+
if (shape === 'loose')
|
|
172
|
+
leftover.add(at[0]);
|
|
173
|
+
}
|
|
174
|
+
return { messages: messages.filter((_, i) => !leftover.has(i)), count };
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 交给模型的一条历史:她的回复带可见正文(schema-message 的 VisibleContent,落库的是结构化输出的信封时才有)时换成可见正文的
|
|
178
|
+
* 副本,免得模型照抄信封;其余原样
|
|
179
|
+
*/
|
|
180
|
+
export function historyForModel(m) {
|
|
181
|
+
const visible = m.metadata?.[WellKnownMetadataKeys.VisibleContent];
|
|
182
|
+
return m.role === 'assistant' && typeof visible === 'string' ? { ...m, content: visible } : m;
|
|
183
|
+
}
|
|
125
184
|
/** 比较两条消息是否在 role/timestamp/name/content 维度上等价(不比较 toolCalls / id) */
|
|
126
185
|
export function isSameMessage(a, b) {
|
|
127
186
|
return (a.role === b.role &&
|
|
@@ -130,7 +189,7 @@ export function isSameMessage(a, b) {
|
|
|
130
189
|
(a.content ?? '') === (b.content ?? ''));
|
|
131
190
|
}
|
|
132
191
|
/**
|
|
133
|
-
* LLM
|
|
192
|
+
* LLM 解析失败时的可诊断说明(纯函数):给人看的文字对象,发进聊天时按会话的语言显示,写日志取 toSource。
|
|
134
193
|
*
|
|
135
194
|
* `resolveLLMModel` 拿到显式 ref 却匹配不上任何 entry 时静默返回 undefined,调用方只知道
|
|
136
195
|
* 「没拿到」。而 ref 是**包名 + 模型名**——包一改名(`plugin-deepseek` → `plugin-llm-deepseek`)、
|
|
@@ -148,38 +207,25 @@ export function describeLLMFailure(available, wanted, erroredProviders) {
|
|
|
148
207
|
if (available.length === 0) {
|
|
149
208
|
// 最常见的成因是 LLM 插件装了也启用了、只是缺 apiKey 而激活失败。能点名就点名,省掉用户一轮空转;
|
|
150
209
|
// 这条文案会**发进聊天**,只点名实例,原因指向 /doctor。/doctor 是受限指令,收到提示的人不一定能用,故注明要权限。
|
|
151
|
-
if (erroredProviders && erroredProviders.length > 0)
|
|
152
|
-
return
|
|
153
|
-
|
|
154
|
-
return '未找到任何具备 chat 能力的 LLM —— 请确认已安装并启用至少一个 LLM 提供者插件(如 @aalis/plugin-llm-deepseek)。';
|
|
210
|
+
if (erroredProviders && erroredProviders.length > 0)
|
|
211
|
+
return t('llmNoneErrored', { plugins: erroredProviders });
|
|
212
|
+
return t('llmNone');
|
|
155
213
|
}
|
|
156
214
|
if (wanted?.provider && wanted?.model) {
|
|
157
215
|
// 只列前 LIST_MAX 个:这条文案会**发进聊天**,而 ollama 是自动发现本机全部模型逐个注册
|
|
158
216
|
// entry 的——实测 40 个模型拼出 1874 字符,且每条消息都发一次。截断后给出总数,
|
|
159
217
|
// 想看全的去 `/model`。
|
|
160
218
|
const LIST_MAX = 5;
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
219
|
+
return t('llmNotFound', {
|
|
220
|
+
wanted: `${wanted.provider}/${wanted.model}`,
|
|
221
|
+
models: available.slice(0, LIST_MAX),
|
|
222
|
+
more: available.length > LIST_MAX ? t('llmMore', { count: available.length }) : '',
|
|
223
|
+
});
|
|
164
224
|
}
|
|
165
225
|
// ref 不全时 resolveLLM 传的是 undefined,resolveLLMModel 此时取 all[0]——只要有 entry
|
|
166
226
|
// 就必命中。所以走到这里意味着取数与解析看到的不是同一份快照(例如两次调用之间服务被
|
|
167
227
|
// 注销),**不是**「没有可用 entry」。文案要说这个,别谎称都不可用。
|
|
168
|
-
return
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* 会话解析结果 → persona 的会话选项。真实回合与 token:request 快照共用这一份构造,
|
|
172
|
-
* 快照里 persona 那一桶才会按会话实际人设与额外提示估算。无 session-manager 时给 undefined(全局默认)。
|
|
173
|
-
*/
|
|
174
|
-
export function toPersonaOptions(resolved) {
|
|
175
|
-
if (!resolved)
|
|
176
|
-
return undefined;
|
|
177
|
-
return {
|
|
178
|
-
persona: resolved.persona,
|
|
179
|
-
disableOutputFormat: resolved.disableOutputFormat,
|
|
180
|
-
clientSideJsonRendering: resolved.clientSideJsonRendering,
|
|
181
|
-
systemPromptExtra: resolved.systemPromptExtra,
|
|
182
|
-
};
|
|
228
|
+
return t('llmUnresolved', { count: available.length });
|
|
183
229
|
}
|
|
184
230
|
/**
|
|
185
231
|
* 调试日志里的工具参数。参数经 `agent:tool:before` 钩子后可能含 JSON 序列化不了的值(BigInt、循环引用),
|
|
@@ -193,4 +239,30 @@ export function formatToolArgsForLog(args) {
|
|
|
193
239
|
return `(无法序列化:${err instanceof Error ? err.message : '未知原因'})`;
|
|
194
240
|
}
|
|
195
241
|
}
|
|
242
|
+
/** 坏工具参数回给模型时附带的原文最多多少字 */
|
|
243
|
+
const RAW_ARGUMENTS_MAX = 200;
|
|
244
|
+
/**
|
|
245
|
+
* 解析一次工具调用的参数。arguments 不是 JSON 对象时回 error(回给模型的错误,带截断的原文),调用里的 arguments 换成
|
|
246
|
+
* `{}`:这次调用随 assistant 消息进本回合的消息与存档,下一轮会被模型服务插件原样发回,坏 JSON 不能跟着重放。
|
|
247
|
+
* 无参工具的 arguments 常是空串(流式路径没有 argument delta 时拼出来就是 ''),按空对象算,原样保留
|
|
248
|
+
*/
|
|
249
|
+
export function parseToolArguments(toolCall) {
|
|
250
|
+
const raw = toolCall.function.arguments?.trim() ?? '';
|
|
251
|
+
try {
|
|
252
|
+
const parsed = raw ? JSON.parse(raw) : {};
|
|
253
|
+
// 工具按参数名取值:顶层是 null、数组或原始值的同坏 JSON 一样处理
|
|
254
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
255
|
+
throw new TypeError(`顶层是 ${parsed === null ? 'null' : Array.isArray(parsed) ? '数组' : typeof parsed}`);
|
|
256
|
+
}
|
|
257
|
+
return { toolCall, args: parsed };
|
|
258
|
+
}
|
|
259
|
+
catch (err) {
|
|
260
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
261
|
+
return {
|
|
262
|
+
toolCall: { ...toolCall, function: { ...toolCall.function, arguments: '{}' } },
|
|
263
|
+
error: `工具参数不是合法 JSON 对象:${reason};原文(前 ${RAW_ARGUMENTS_MAX} 字):` +
|
|
264
|
+
`${truncateChars(raw, RAW_ARGUMENTS_MAX)};请重新生成 arguments`,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
196
268
|
//# sourceMappingURL=helpers.js.map
|
package/dist/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,19 +8,26 @@ declare const _default: import("@aalis/core").PluginDefinition<{
|
|
|
8
8
|
contributions: import("@aalis/core").ServiceDescriptor<import("@aalis/api-contributions").ContributionRegistry, import("@aalis/api-contributions").Contributions>;
|
|
9
9
|
lifecycle: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").LifecycleCap, import("@aalis/core").LifecycleCap>;
|
|
10
10
|
provide: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Provide, import("@aalis/core").Provide>;
|
|
11
|
-
services: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Services, import("@aalis/core").Services>;
|
|
12
11
|
commands: import("@aalis/core").OptionalUse<import("@aalis/api-commands").CommandService, import("@aalis/api-commands").BoundCommands>;
|
|
13
12
|
tools: import("@aalis/core").OptionalUse<import("@aalis/api-tools").ToolService, import("@aalis/api-tools").BoundTools>;
|
|
14
|
-
llm: import("@aalis/core").OptionalUse<LLMModel,
|
|
15
|
-
memory: import("@aalis/core").OptionalUse<import("@aalis/api-memory").MemoryService, import("@aalis/
|
|
16
|
-
persona: import("@aalis/core").OptionalUse<import("@aalis/api-persona").PersonaService, import("@aalis/
|
|
17
|
-
messageArchive: import("@aalis/core").OptionalUse<import("@aalis/api-message-archive").MessageArchiveService, import("@aalis/
|
|
18
|
-
sessionManager: import("@aalis/core").OptionalUse<import("@aalis/api-session-manager").SessionManagerService, import("@aalis/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
llm: import("@aalis/core").OptionalUse<LLMModel, LLMModel>;
|
|
14
|
+
memory: import("@aalis/core").OptionalUse<import("@aalis/api-memory").MemoryService, import("@aalis/api-memory").MemoryService>;
|
|
15
|
+
persona: import("@aalis/core").OptionalUse<import("@aalis/api-persona").PersonaService, import("@aalis/api-persona").PersonaService>;
|
|
16
|
+
messageArchive: import("@aalis/core").OptionalUse<import("@aalis/api-message-archive").MessageArchiveService, import("@aalis/api-message-archive").MessageArchiveService>;
|
|
17
|
+
sessionManager: import("@aalis/core").OptionalUse<import("@aalis/api-session-manager").SessionManagerService, import("@aalis/api-session-manager").SessionManagerService>;
|
|
18
|
+
/** 判谁是 owner:参与者里合一 owner 的各个身份、存档不在时当轮正文的发送者前缀(与存档同一规则,speakerOf)、/stop */
|
|
19
|
+
authority: import("@aalis/core").OptionalUse<import("@aalis/api-authority").AuthorityService, import("@aalis/api-authority").AuthorityService>;
|
|
20
|
+
/** 按会话读本插件的四项(模型、深度思考、最大工具迭代、历史条数上限);缺席时只取插件配置里的值 */
|
|
21
|
+
sessionFields: import("@aalis/core").OptionalUse<import("@aalis/api-session-settings").SessionSettingsService, import("@aalis/api-session-settings").SessionFields>;
|
|
22
|
+
/** 按会话字段的全局层:宿主配置文档里本实例的那一段 */
|
|
23
|
+
document: import("@aalis/core").OptionalUse<import("@aalis/api-host-config").HostConfig, import("@aalis/api-host-config").OwnHostConfig>;
|
|
24
|
+
platform: import("@aalis/core").OptionalUse<import("@aalis/api-platform").PlatformAdapter, import("@aalis/api-platform").PlatformAdapter>;
|
|
25
|
+
media: import("@aalis/core").OptionalUse<import("@aalis/api-media").MediaService, import("@aalis/api-media").MediaService>;
|
|
26
|
+
storage: import("@aalis/core").OptionalUse<import("@aalis/api-storage").StorageService, import("@aalis/api-storage").BoundStorage>;
|
|
27
|
+
gateway: import("@aalis/core").OptionalUse<import("@aalis/api-gateway").GatewayService, import("@aalis/api-gateway").GatewayService>;
|
|
28
|
+
plugins: import("@aalis/core").OptionalUse<import("@aalis/core").PluginManagerService, import("@aalis/core").PluginManagerService>;
|
|
29
|
+
/** 会话没设模型时比对本插件该生效的 llm 偏好与实际用的模型 */
|
|
30
|
+
services: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Services, import("@aalis/core").Services>;
|
|
24
31
|
}>;
|
|
25
32
|
export default _default;
|
|
26
33
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAkC,QAAQ,EAAY,MAAM,gBAAgB,CAAC;AAwBzF,OAAO,EAKL,KAAK,MAAM,EAQZ,MAAM,aAAa,CAAC;;;;;;;;;;;;;;;;IAgEnB,4EAA4E;;IAE5E,qDAAqD;;IAErD,+BAA+B;;;;;;;IAO/B,qCAAqC;;;AAorEvC,wBAQG"}
|