knight-agent 1.1.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/Host.d.ts +23 -0
- package/Host.d.ts.map +1 -0
- package/Host.js +23 -0
- package/Host.js.map +1 -0
- package/base/AbstractAgent.d.ts +100 -0
- package/base/AbstractAgent.d.ts.map +1 -0
- package/base/AbstractAgent.js +23 -0
- package/base/AbstractAgent.js.map +1 -0
- package/base/AbstractDialog.d.ts +54 -0
- package/base/AbstractDialog.d.ts.map +1 -0
- package/base/AbstractDialog.js +86 -0
- package/base/AbstractDialog.js.map +1 -0
- package/base/AbstractModule.d.ts +7 -0
- package/base/AbstractModule.d.ts.map +1 -0
- package/base/AbstractModule.js +13 -0
- package/base/AbstractModule.js.map +1 -0
- package/base/AbstractObject.d.ts +18 -0
- package/base/AbstractObject.d.ts.map +1 -0
- package/base/AbstractObject.js +25 -0
- package/base/AbstractObject.js.map +1 -0
- package/base/AbstractReason.d.ts +44 -0
- package/base/AbstractReason.d.ts.map +1 -0
- package/base/AbstractReason.js +23 -0
- package/base/AbstractReason.js.map +1 -0
- package/base/AbstractSkill.d.ts +25 -0
- package/base/AbstractSkill.d.ts.map +1 -0
- package/base/AbstractSkill.js +3 -0
- package/base/AbstractSkill.js.map +1 -0
- package/base/AbstractTool.d.ts +34 -0
- package/base/AbstractTool.d.ts.map +1 -0
- package/base/AbstractTool.js +3 -0
- package/base/AbstractTool.js.map +1 -0
- package/base/index.d.ts +8 -0
- package/base/index.d.ts.map +1 -0
- package/base/index.js +24 -0
- package/base/index.js.map +1 -0
- package/docs/ARCHITECTURE.md +601 -0
- package/docs/README.md +562 -0
- package/index.d.ts +4 -0
- package/index.d.ts.map +1 -0
- package/index.js +25 -0
- package/index.js.map +1 -0
- package/module/AgentModule/Agent.d.ts +55 -0
- package/module/AgentModule/Agent.d.ts.map +1 -0
- package/module/AgentModule/Agent.js +210 -0
- package/module/AgentModule/Agent.js.map +1 -0
- package/module/AgentModule/AgentModule.d.ts +26 -0
- package/module/AgentModule/AgentModule.d.ts.map +1 -0
- package/module/AgentModule/AgentModule.js +66 -0
- package/module/AgentModule/AgentModule.js.map +1 -0
- package/module/AgentModule/Memory.d.ts +55 -0
- package/module/AgentModule/Memory.d.ts.map +1 -0
- package/module/AgentModule/Memory.js +288 -0
- package/module/AgentModule/Memory.js.map +1 -0
- package/module/AgentModule/index.d.ts +2 -0
- package/module/AgentModule/index.d.ts.map +1 -0
- package/module/AgentModule/index.js +18 -0
- package/module/AgentModule/index.js.map +1 -0
- package/module/DialogModule/Dialog.d.ts +14 -0
- package/module/DialogModule/Dialog.d.ts.map +1 -0
- package/module/DialogModule/Dialog.js +27 -0
- package/module/DialogModule/Dialog.js.map +1 -0
- package/module/DialogModule/DialogModule.d.ts +39 -0
- package/module/DialogModule/DialogModule.d.ts.map +1 -0
- package/module/DialogModule/DialogModule.js +118 -0
- package/module/DialogModule/DialogModule.js.map +1 -0
- package/module/DialogModule/index.d.ts +3 -0
- package/module/DialogModule/index.d.ts.map +1 -0
- package/module/DialogModule/index.js +19 -0
- package/module/DialogModule/index.js.map +1 -0
- package/module/ReasonModule/ChainReason.d.ts +11 -0
- package/module/ReasonModule/ChainReason.d.ts.map +1 -0
- package/module/ReasonModule/ChainReason.js +34 -0
- package/module/ReasonModule/ChainReason.js.map +1 -0
- package/module/ReasonModule/CommanderReason.d.ts +15 -0
- package/module/ReasonModule/CommanderReason.d.ts.map +1 -0
- package/module/ReasonModule/CommanderReason.js +151 -0
- package/module/ReasonModule/CommanderReason.js.map +1 -0
- package/module/ReasonModule/CompetitiveReason.d.ts +13 -0
- package/module/ReasonModule/CompetitiveReason.d.ts.map +1 -0
- package/module/ReasonModule/CompetitiveReason.js +133 -0
- package/module/ReasonModule/CompetitiveReason.js.map +1 -0
- package/module/ReasonModule/PlanReason.d.ts +25 -0
- package/module/ReasonModule/PlanReason.d.ts.map +1 -0
- package/module/ReasonModule/PlanReason.js +133 -0
- package/module/ReasonModule/PlanReason.js.map +1 -0
- package/module/ReasonModule/ReasonModule.d.ts +41 -0
- package/module/ReasonModule/ReasonModule.d.ts.map +1 -0
- package/module/ReasonModule/ReasonModule.js +83 -0
- package/module/ReasonModule/ReasonModule.js.map +1 -0
- package/module/ReasonModule/ReflectReason.d.ts +15 -0
- package/module/ReasonModule/ReflectReason.d.ts.map +1 -0
- package/module/ReasonModule/ReflectReason.js +86 -0
- package/module/ReasonModule/ReflectReason.js.map +1 -0
- package/module/ReasonModule/TreeReason.d.ts +16 -0
- package/module/ReasonModule/TreeReason.d.ts.map +1 -0
- package/module/ReasonModule/TreeReason.js +139 -0
- package/module/ReasonModule/TreeReason.js.map +1 -0
- package/module/ReasonModule/index.d.ts +8 -0
- package/module/ReasonModule/index.d.ts.map +1 -0
- package/module/ReasonModule/index.js +24 -0
- package/module/ReasonModule/index.js.map +1 -0
- package/module/SkillModule/SkillModule.d.ts +42 -0
- package/module/SkillModule/SkillModule.d.ts.map +1 -0
- package/module/SkillModule/SkillModule.js +134 -0
- package/module/SkillModule/SkillModule.js.map +1 -0
- package/module/SkillModule/index.d.ts +2 -0
- package/module/SkillModule/index.d.ts.map +1 -0
- package/module/SkillModule/index.js +18 -0
- package/module/SkillModule/index.js.map +1 -0
- package/module/ToolModule/ToolModule.d.ts +57 -0
- package/module/ToolModule/ToolModule.d.ts.map +1 -0
- package/module/ToolModule/ToolModule.js +220 -0
- package/module/ToolModule/ToolModule.js.map +1 -0
- package/module/ToolModule/ToolRAG.d.ts +38 -0
- package/module/ToolModule/ToolRAG.d.ts.map +1 -0
- package/module/ToolModule/ToolRAG.js +124 -0
- package/module/ToolModule/ToolRAG.js.map +1 -0
- package/module/ToolModule/index.d.ts +3 -0
- package/module/ToolModule/index.d.ts.map +1 -0
- package/module/ToolModule/index.js +19 -0
- package/module/ToolModule/index.js.map +1 -0
- package/module/index.d.ts +6 -0
- package/module/index.d.ts.map +1 -0
- package/module/index.js +22 -0
- package/module/index.js.map +1 -0
- package/package.json +19 -0
- package/utility/InterfaceUtility.d.ts +14 -0
- package/utility/InterfaceUtility.d.ts.map +1 -0
- package/utility/InterfaceUtility.js +3 -0
- package/utility/InterfaceUtility.js.map +1 -0
- package/utility/LogUtility.d.ts +41 -0
- package/utility/LogUtility.d.ts.map +1 -0
- package/utility/LogUtility.js +70 -0
- package/utility/LogUtility.js.map +1 -0
- package/utility/NetworkUtility.d.ts +91 -0
- package/utility/NetworkUtility.d.ts.map +1 -0
- package/utility/NetworkUtility.js +104 -0
- package/utility/NetworkUtility.js.map +1 -0
- package/utility/ObjectUtility.d.ts +134 -0
- package/utility/ObjectUtility.d.ts.map +1 -0
- package/utility/ObjectUtility.js +313 -0
- package/utility/ObjectUtility.js.map +1 -0
- package/utility/OpenAIUtility.d.ts +333 -0
- package/utility/OpenAIUtility.d.ts.map +1 -0
- package/utility/OpenAIUtility.js +95 -0
- package/utility/OpenAIUtility.js.map +1 -0
- package/utility/PromiseUtility.d.ts +9 -0
- package/utility/PromiseUtility.d.ts.map +1 -0
- package/utility/PromiseUtility.js +16 -0
- package/utility/PromiseUtility.js.map +1 -0
- package/utility/StringUtility.d.ts +10 -0
- package/utility/StringUtility.d.ts.map +1 -0
- package/utility/StringUtility.js +42 -0
- package/utility/StringUtility.js.map +1 -0
- package/utility/TimeUtility.d.ts +10 -0
- package/utility/TimeUtility.d.ts.map +1 -0
- package/utility/TimeUtility.js +24 -0
- package/utility/TimeUtility.js.map +1 -0
- package/utility/index.d.ts +9 -0
- package/utility/index.d.ts.map +1 -0
- package/utility/index.js +25 -0
- package/utility/index.js.map +1 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Agent = void 0;
|
|
4
|
+
const base_1 = require("../../base");
|
|
5
|
+
const utility_1 = require("../../utility");
|
|
6
|
+
const Memory_1 = require("./Memory");
|
|
7
|
+
/** 智能体类 */
|
|
8
|
+
class Agent extends base_1.AbstractAgent {
|
|
9
|
+
/** 构造函数 */
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super();
|
|
12
|
+
/** 运行状态 */
|
|
13
|
+
this._state = base_1.AgentState.Idle;
|
|
14
|
+
/** 对话轮次 */
|
|
15
|
+
this._turnCount = 0;
|
|
16
|
+
this.config = config;
|
|
17
|
+
this.memory = new Memory_1.Memory(this, config.maxTokens);
|
|
18
|
+
}
|
|
19
|
+
/** 当前状态 */
|
|
20
|
+
get state() { return this._state; }
|
|
21
|
+
/** 对话轮次 */
|
|
22
|
+
get turnCount() { return this._turnCount; }
|
|
23
|
+
/** 思考模式是否开启 */
|
|
24
|
+
get thinkingEnabled() { return this.config.enableThinking ?? true; }
|
|
25
|
+
// #region 大模型消息请求及响应
|
|
26
|
+
/** @internal 发送用户消息(缓存→发送→缓存回复) */
|
|
27
|
+
async sendUserMessage(content) {
|
|
28
|
+
return this.OnSend(content);
|
|
29
|
+
}
|
|
30
|
+
/** @internal 发送当前消息缓存 */
|
|
31
|
+
async sendRequest() {
|
|
32
|
+
return this.OnSendRequest();
|
|
33
|
+
}
|
|
34
|
+
/** 发送消息缓存中的消息到LLM */
|
|
35
|
+
async OnSendRequest(overrides) {
|
|
36
|
+
// 上下文窗口优化: 按压力级别分级压缩
|
|
37
|
+
const pressure = this.memory.checkPressure();
|
|
38
|
+
if (pressure > Memory_1.MemoryPressure.None) {
|
|
39
|
+
await this.memory.optimize(pressure);
|
|
40
|
+
}
|
|
41
|
+
const msgs = this.memory.messages.GetAll();
|
|
42
|
+
if (0 >= msgs.length) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
this._state = base_1.AgentState.Thinking;
|
|
46
|
+
const chatRequest = {
|
|
47
|
+
model: this.config.model,
|
|
48
|
+
messages: msgs,
|
|
49
|
+
thinking: { type: this.thinkingEnabled ? 'enabled' : 'disabled' },
|
|
50
|
+
reasoning_effort: this.config.reasoningEffort,
|
|
51
|
+
stream: false,
|
|
52
|
+
temperature: this.config.temperature,
|
|
53
|
+
max_tokens: this.config.maxTokens,
|
|
54
|
+
tools: this.host.toolModule.ToAPITools(this._runOptions?.toolNames, true),
|
|
55
|
+
tool_choice: overrides?.tool_choice ?? (this.host.toolModule.count > 0 ? "auto" : undefined),
|
|
56
|
+
...overrides,
|
|
57
|
+
};
|
|
58
|
+
const response = await this.OnBaseRequest(this.config.apiKey, chatRequest);
|
|
59
|
+
this._state = base_1.AgentState.Running;
|
|
60
|
+
// 检查 API 错误响应
|
|
61
|
+
if (response?.data?.error) {
|
|
62
|
+
const err = response.data.error;
|
|
63
|
+
console.error(`[LLM Error] ${err.code ?? ""} ${err.type ?? ""}: ${err.message ?? JSON.stringify(err)}`);
|
|
64
|
+
}
|
|
65
|
+
return response;
|
|
66
|
+
}
|
|
67
|
+
/** 发送用户消息(自动缓存用户消息和助手回复) */
|
|
68
|
+
async OnSend(content) {
|
|
69
|
+
this.memory.messages.AddUser(content);
|
|
70
|
+
this._turnCount++;
|
|
71
|
+
const response = await this.OnSendRequest();
|
|
72
|
+
if (response?.data?.choices?.[0]?.message) {
|
|
73
|
+
const msg = response.data.choices[0].message;
|
|
74
|
+
this.memory.messages.AddAssistant(msg.content ?? "", msg.name, msg.thinking, msg.tool_calls);
|
|
75
|
+
}
|
|
76
|
+
return response;
|
|
77
|
+
}
|
|
78
|
+
/** 模型基础请求(HTTP POST) */
|
|
79
|
+
async OnBaseRequest(apiKey, chatRequest) {
|
|
80
|
+
if (utility_1.StringUtility.empty(apiKey) || !chatRequest?.model || !chatRequest?.messages?.length) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const options = {
|
|
84
|
+
method: utility_1.NetworkUtility.E_ProtocalType.Post,
|
|
85
|
+
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}` },
|
|
86
|
+
data: chatRequest,
|
|
87
|
+
timeout: 60000,
|
|
88
|
+
validateStatus: () => true,
|
|
89
|
+
};
|
|
90
|
+
return await utility_1.NetworkUtility.HTTP.OnRequest(this.config.address, options);
|
|
91
|
+
}
|
|
92
|
+
// #endregion
|
|
93
|
+
// #region 智能体上下文
|
|
94
|
+
/** @internal 执行工具调用(含缓存+重试) */
|
|
95
|
+
async executeTool(toolCall) {
|
|
96
|
+
const ctx = this._runOptions?.toolContext ?? { agentId: this.id, turnCount: this._turnCount };
|
|
97
|
+
return this.host.toolModule.Execute(toolCall, ctx);
|
|
98
|
+
}
|
|
99
|
+
/** @internal 添加工具结果到消息缓存和记忆 */
|
|
100
|
+
addToolResult(result, toolCallId) {
|
|
101
|
+
this.memory.messages.AddTool(result, toolCallId);
|
|
102
|
+
this.memory.toolResults.set(toolCallId, result);
|
|
103
|
+
}
|
|
104
|
+
/** @internal 添加助手消息到缓存(含 tool_calls) */
|
|
105
|
+
addAssistantMessage(content, toolCalls) {
|
|
106
|
+
this.memory.messages.AddAssistant(content, undefined, undefined, toolCalls);
|
|
107
|
+
}
|
|
108
|
+
/** @internal 设置运行状态 */
|
|
109
|
+
setState(state) {
|
|
110
|
+
this._state = state;
|
|
111
|
+
}
|
|
112
|
+
// #endregion
|
|
113
|
+
// #region 智能体上下文
|
|
114
|
+
/**
|
|
115
|
+
* 运行 Agent 主循环
|
|
116
|
+
* 1. 发送用户消息
|
|
117
|
+
* 2. 检查响应
|
|
118
|
+
* 3. 如果模型要求工具调用 → 执行工具 → 继续发送
|
|
119
|
+
* 4. 返回最终结果
|
|
120
|
+
*/
|
|
121
|
+
async run(input, options) {
|
|
122
|
+
this._runOptions = options;
|
|
123
|
+
// 1. 发送用户消息
|
|
124
|
+
let response = await this.sendUserMessage(input);
|
|
125
|
+
if (!response?.data) {
|
|
126
|
+
this.setState(base_1.AgentState.Error);
|
|
127
|
+
return { success: false, content: "" };
|
|
128
|
+
}
|
|
129
|
+
let choice = response.data.choices?.[0];
|
|
130
|
+
if (!choice) {
|
|
131
|
+
this.setState(base_1.AgentState.Done);
|
|
132
|
+
return { success: true, content: "", usage: response.data.usage };
|
|
133
|
+
}
|
|
134
|
+
// 2. 工具调用循环
|
|
135
|
+
while (choice.finish_reason === "tool_calls" && choice.message.tool_calls) {
|
|
136
|
+
this.setState(base_1.AgentState.WaitingTool);
|
|
137
|
+
for (const tc of choice.message.tool_calls) {
|
|
138
|
+
const result = await this.executeTool(tc);
|
|
139
|
+
this.addToolResult(result, tc.id);
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
response = await this.sendRequest();
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
this.setState(base_1.AgentState.Error);
|
|
146
|
+
return {
|
|
147
|
+
success: false,
|
|
148
|
+
content: `工具结果提交失败: ${e}`,
|
|
149
|
+
finishReason: "error",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (!response?.data) {
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
choice = response.data.choices?.[0];
|
|
156
|
+
if (!choice) {
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
// 将助手响应(含 tool_calls)缓存到消息历史,否则下一轮 tool 消息
|
|
160
|
+
// 会缺少对应的 assistant tool_calls 前缀,API 会返回 400 错误
|
|
161
|
+
if (choice.message) {
|
|
162
|
+
this.addAssistantMessage(choice.message.content ?? "", choice.message.tool_calls);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// 3. 返回结果
|
|
166
|
+
this.setState(base_1.AgentState.Idle);
|
|
167
|
+
return {
|
|
168
|
+
success: true,
|
|
169
|
+
content: choice?.message?.content ?? "",
|
|
170
|
+
thinking: choice?.message?.thinking,
|
|
171
|
+
toolCalls: choice?.message?.tool_calls,
|
|
172
|
+
usage: response?.data?.usage,
|
|
173
|
+
finishReason: choice?.finish_reason,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// #endregion
|
|
177
|
+
// #region 持久化
|
|
178
|
+
/** 导出当前状态为可序列化快照 */
|
|
179
|
+
snapshot() {
|
|
180
|
+
const msgs = this.memory.messages.GetAll();
|
|
181
|
+
return {
|
|
182
|
+
version: 1,
|
|
183
|
+
createdAt: Date.now(),
|
|
184
|
+
agentId: this.id,
|
|
185
|
+
turnCount: this._turnCount,
|
|
186
|
+
messages: msgs,
|
|
187
|
+
scratchpad: this.memory.scratchpad,
|
|
188
|
+
toolResults: [...this.memory.toolResults.entries()],
|
|
189
|
+
config: {
|
|
190
|
+
model: this.config.model,
|
|
191
|
+
systemPrompt: this.config.systemPrompt,
|
|
192
|
+
temperature: this.config.temperature,
|
|
193
|
+
maxTokens: this.config.maxTokens,
|
|
194
|
+
enableThinking: this.config.enableThinking,
|
|
195
|
+
reasoningEffort: this.config.reasoningEffort,
|
|
196
|
+
maxTurns: this.config.maxTurns,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/** 从快照恢复状态(需先构造 Agent 再调用此方法) */
|
|
201
|
+
restore(snapshot) {
|
|
202
|
+
this._turnCount = snapshot.turnCount;
|
|
203
|
+
this.memory.scratchpad = snapshot.scratchpad;
|
|
204
|
+
this.memory.toolResults = new Map(snapshot.toolResults);
|
|
205
|
+
this.memory.messages.Clear();
|
|
206
|
+
this.memory.messages.AddRange(snapshot.messages);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.Agent = Agent;
|
|
210
|
+
//# sourceMappingURL=Agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Agent.js","sourceRoot":"","sources":["../../../src/module/AgentModule/Agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AbstractModule, AgentConfig } from "../../base";
|
|
2
|
+
import { Agent } from "./Agent";
|
|
3
|
+
/** 智能体管理模块 — 负责 Agent 的创建、销毁、查询 */
|
|
4
|
+
export declare class AgentModule extends AbstractModule {
|
|
5
|
+
/** 智能体池 */
|
|
6
|
+
private readonly agents;
|
|
7
|
+
/** 构造函数 */
|
|
8
|
+
constructor();
|
|
9
|
+
/** 智能体数量 */
|
|
10
|
+
get agentCount(): number;
|
|
11
|
+
/**
|
|
12
|
+
* 创建 Agent 并注入系统提示词
|
|
13
|
+
* @param config 智能体配置
|
|
14
|
+
* @returns 就绪的 Agent 实例
|
|
15
|
+
*/
|
|
16
|
+
createAgent(config: AgentConfig): Agent | null;
|
|
17
|
+
/** 销毁指定 Agent */
|
|
18
|
+
destroyAgent(id: string): boolean;
|
|
19
|
+
/** 销毁所有 Agent */
|
|
20
|
+
destroyAll(): number;
|
|
21
|
+
/** 根据 ID 获取 Agent */
|
|
22
|
+
getAgent(id: string): Agent | undefined;
|
|
23
|
+
/** 获取全部 Agent */
|
|
24
|
+
getAllAgents(): Array<Agent>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=AgentModule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentModule.d.ts","sourceRoot":"","sources":["../../../src/module/AgentModule/AgentModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,mCAAmC;AACnC,qBAAa,WAAY,SAAQ,cAAc;IAE3C,WAAW;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IAEtD,WAAW;;IAMX,YAAY;IACZ,IAAW,UAAU,IAAI,MAAM,CAA8B;IAI7D;;;;OAIG;IACI,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,GAAG,IAAI;IAgBrD,iBAAiB;IACV,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAUxC,iBAAiB;IACV,UAAU,IAAI,MAAM;IAW3B,qBAAqB;IACd,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAK9C,iBAAiB;IACV,YAAY,IAAI,KAAK,CAAC,KAAK,CAAC;CAItC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AgentModule = void 0;
|
|
4
|
+
const base_1 = require("../../base");
|
|
5
|
+
const utility_1 = require("../../utility");
|
|
6
|
+
const Agent_1 = require("./Agent");
|
|
7
|
+
/** 智能体管理模块 — 负责 Agent 的创建、销毁、查询 */
|
|
8
|
+
class AgentModule extends base_1.AbstractModule {
|
|
9
|
+
/** 构造函数 */
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
this.agents = new utility_1.ObjectUtility.MapPool();
|
|
13
|
+
}
|
|
14
|
+
/** 智能体数量 */
|
|
15
|
+
get agentCount() { return this.agents.Count; }
|
|
16
|
+
// ======================== 生命周期 ========================
|
|
17
|
+
/**
|
|
18
|
+
* 创建 Agent 并注入系统提示词
|
|
19
|
+
* @param config 智能体配置
|
|
20
|
+
* @returns 就绪的 Agent 实例
|
|
21
|
+
*/
|
|
22
|
+
createAgent(config) {
|
|
23
|
+
const agent = new Agent_1.Agent(config);
|
|
24
|
+
if (config.systemPrompt) {
|
|
25
|
+
agent.memory.messages.AddSystem(config.systemPrompt);
|
|
26
|
+
}
|
|
27
|
+
if (!this.agents.Add(agent.id, agent)) {
|
|
28
|
+
utility_1.LogUtility.LogError(`[AgentModule] Agent ID 重复: ${agent.id}`);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
utility_1.LogUtility.LogInfo(`[AgentModule] 创建 Agent "${agent.key}" (${agent.id})`);
|
|
32
|
+
return agent;
|
|
33
|
+
}
|
|
34
|
+
/** 销毁指定 Agent */
|
|
35
|
+
destroyAgent(id) {
|
|
36
|
+
const agent = this.agents.Get(id);
|
|
37
|
+
if (!agent) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
agent.memory.clear();
|
|
41
|
+
this.agents.Remove(id);
|
|
42
|
+
utility_1.LogUtility.LogInfo(`[AgentModule] 销毁 Agent (${id})`);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
/** 销毁所有 Agent */
|
|
46
|
+
destroyAll() {
|
|
47
|
+
const all = this.agents.ValuesToArray();
|
|
48
|
+
for (const agent of all) {
|
|
49
|
+
agent.memory.clear();
|
|
50
|
+
}
|
|
51
|
+
this.agents.RemoveAll();
|
|
52
|
+
utility_1.LogUtility.LogInfo(`[AgentModule] 已销毁全部 Agent (${all.length}个)`);
|
|
53
|
+
return all.length;
|
|
54
|
+
}
|
|
55
|
+
// ======================== 查询 ========================
|
|
56
|
+
/** 根据 ID 获取 Agent */
|
|
57
|
+
getAgent(id) {
|
|
58
|
+
return this.agents.Get(id);
|
|
59
|
+
}
|
|
60
|
+
/** 获取全部 Agent */
|
|
61
|
+
getAllAgents() {
|
|
62
|
+
return this.agents.ValuesToArray();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.AgentModule = AgentModule;
|
|
66
|
+
//# sourceMappingURL=AgentModule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentModule.js","sourceRoot":"","sources":["../../../src/module/AgentModule/AgentModule.ts"],"names":[],"mappings":";;;AAAA,qCAAyD;AACzD,2CAA0D;AAC1D,mCAAgC;AAEhC,mCAAmC;AACnC,MAAa,WAAY,SAAQ,qBAAc;IAK3C,WAAW;IACX;QAEI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,uBAAa,CAAC,OAAO,EAAS,CAAC;IACrD,CAAC;IACD,YAAY;IACZ,IAAW,UAAU,KAAa,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7D,yDAAyD;IAEzD;;;;OAIG;IACI,WAAW,CAAC,MAAmB;QAElC,MAAM,KAAK,GAAG,IAAI,aAAK,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,YAAY,EACvB,CAAC;YACG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EACrC,CAAC;YACG,oBAAU,CAAC,QAAQ,CAAC,8BAA8B,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,oBAAU,CAAC,OAAO,CAAC,2BAA2B,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,iBAAiB;IACV,YAAY,CAAC,EAAU;QAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;QAC7B,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvB,oBAAU,CAAC,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,iBAAiB;IACV,UAAU;QAEb,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACxC,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACxB,oBAAU,CAAC,OAAO,CAAC,8BAA8B,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;QACjE,OAAO,GAAG,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,uDAAuD;IAEvD,qBAAqB;IACd,QAAQ,CAAC,EAAU;QAEtB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,iBAAiB;IACV,YAAY;QAEf,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;IACvC,CAAC;CACJ;AAvED,kCAuEC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { OpenAIUtility } from "../../utility";
|
|
2
|
+
import type { Agent } from "./Agent";
|
|
3
|
+
/** 内存压力级别 */
|
|
4
|
+
export declare enum MemoryPressure {
|
|
5
|
+
/** 无压力 (< 70%) */
|
|
6
|
+
None = 0,
|
|
7
|
+
/** 轻度 (70-85%):压缩远期轮次 */
|
|
8
|
+
Mild = 1,
|
|
9
|
+
/** 中度 (85-95%):压缩远期 + 摘要中间轮次 */
|
|
10
|
+
Moderate = 2,
|
|
11
|
+
/** 重度 (> 95%):激进裁剪,仅保留最近 N 轮 + 摘要 */
|
|
12
|
+
Critical = 3
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 记忆管理器
|
|
16
|
+
* 组合 消息缓存 + 草稿区 + 工具结果 + 上下文窗口优化
|
|
17
|
+
*/
|
|
18
|
+
export declare class Memory {
|
|
19
|
+
/** 智能体实例 */
|
|
20
|
+
private agent;
|
|
21
|
+
/** 消息缓存(底层对话记录) */
|
|
22
|
+
readonly messages: OpenAIUtility.Message;
|
|
23
|
+
/** 思考草稿区(CoT 中间推理结果) */
|
|
24
|
+
scratchpad: string;
|
|
25
|
+
/** 最近工具调用结果缓存(key=tool_call_id) */
|
|
26
|
+
toolResults: Map<string, string>;
|
|
27
|
+
/** 上下文窗口上限(token数) */
|
|
28
|
+
private _maxTokens;
|
|
29
|
+
/** 预留给输出的空间 */
|
|
30
|
+
private _reserveTokens;
|
|
31
|
+
constructor(agent: Agent, maxTokens?: number, reserveTokens?: number);
|
|
32
|
+
/** tiktoken 编码器(懒加载,cl100k_base 兼容 DeepSeek/OpenAI) */
|
|
33
|
+
private static _enc;
|
|
34
|
+
private _encoder;
|
|
35
|
+
/** 精确估算当前消息缓存的 token 数 */
|
|
36
|
+
estimateTokens(): number;
|
|
37
|
+
/** 检查内存压力级别 */
|
|
38
|
+
checkPressure(): MemoryPressure;
|
|
39
|
+
/** @deprecated 兼容旧调用,使用 checkPressure() */
|
|
40
|
+
hasOverflow(): boolean;
|
|
41
|
+
/** 按压力级别执行压缩 */
|
|
42
|
+
optimize(level: MemoryPressure): Promise<void>;
|
|
43
|
+
/** Mild: 压缩远期轮次(前 30%)为摘要,1 次 LLM 调用 */
|
|
44
|
+
private _optimizeMild;
|
|
45
|
+
/** Moderate: 同原 5 层裁剪,压缩远期 + 摘要中间轮次,1-2 次 LLM 调用 */
|
|
46
|
+
private _optimizeModerate;
|
|
47
|
+
/** Critical: 激进裁剪 — 系统消息 + 摘要 + 最近 N 轮,0-1 次 LLM 调用 */
|
|
48
|
+
private _optimizeCritical;
|
|
49
|
+
private summarizeFn;
|
|
50
|
+
summarize(messages: Array<OpenAIUtility.OpenAI.LLMMessage>): Promise<string>;
|
|
51
|
+
extractEntities(messages: Array<OpenAIUtility.OpenAI.LLMMessage>): Promise<Record<string, string>>;
|
|
52
|
+
/** 清空所有记忆 */
|
|
53
|
+
clear(): void;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=Memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Memory.d.ts","sourceRoot":"","sources":["../../../src/module/AgentModule/Memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,aAAa;AACb,oBAAY,cAAc;IAEtB,kBAAkB;IAClB,IAAI,IAAI;IACR,yBAAyB;IACzB,IAAI,IAAI;IACR,gCAAgC;IAChC,QAAQ,IAAI;IACZ,qCAAqC;IACrC,QAAQ,IAAI;CACf;AAED;;;GAGG;AACH,qBAAa,MAAM;IAEf,YAAY;IACZ,OAAO,CAAC,KAAK,CAAQ;IACrB,mBAAmB;IACnB,SAAgB,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC;IAChD,wBAAwB;IACjB,UAAU,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,sBAAsB;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,eAAe;IACf,OAAO,CAAC,cAAc,CAAS;gBAEZ,KAAK,EAAE,KAAK,EAAE,SAAS,GAAE,MAAe,EAAE,aAAa,GAAE,MAAc;IAY1F,uDAAuD;IACvD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAW;IAE9B,OAAO,CAAC,QAAQ;IAMhB,0BAA0B;IACnB,cAAc,IAAI,MAAM;IAgB/B,eAAe;IACR,aAAa,IAAI,cAAc;IAStC,2CAA2C;IACpC,WAAW,IAAI,OAAO;IAS7B,gBAAgB;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB3D,wCAAwC;YAC1B,aAAa;IA+B3B,oDAAoD;YACtC,iBAAiB;IA8E/B,uDAAuD;IACvD,OAAO,CAAC,iBAAiB;YA0DX,WAAW;IAYZ,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAU5E,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAkB/G,aAAa;IACN,KAAK,IAAI,IAAI;CAMvB"}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Memory = exports.MemoryPressure = void 0;
|
|
4
|
+
const tiktoken_1 = require("tiktoken");
|
|
5
|
+
const utility_1 = require("../../utility");
|
|
6
|
+
/** 内存压力级别 */
|
|
7
|
+
var MemoryPressure;
|
|
8
|
+
(function (MemoryPressure) {
|
|
9
|
+
/** 无压力 (< 70%) */
|
|
10
|
+
MemoryPressure[MemoryPressure["None"] = 0] = "None";
|
|
11
|
+
/** 轻度 (70-85%):压缩远期轮次 */
|
|
12
|
+
MemoryPressure[MemoryPressure["Mild"] = 1] = "Mild";
|
|
13
|
+
/** 中度 (85-95%):压缩远期 + 摘要中间轮次 */
|
|
14
|
+
MemoryPressure[MemoryPressure["Moderate"] = 2] = "Moderate";
|
|
15
|
+
/** 重度 (> 95%):激进裁剪,仅保留最近 N 轮 + 摘要 */
|
|
16
|
+
MemoryPressure[MemoryPressure["Critical"] = 3] = "Critical";
|
|
17
|
+
})(MemoryPressure || (exports.MemoryPressure = MemoryPressure = {}));
|
|
18
|
+
/**
|
|
19
|
+
* 记忆管理器
|
|
20
|
+
* 组合 消息缓存 + 草稿区 + 工具结果 + 上下文窗口优化
|
|
21
|
+
*/
|
|
22
|
+
class Memory {
|
|
23
|
+
constructor(agent, maxTokens = 128000, reserveTokens = 16000) {
|
|
24
|
+
this.agent = agent;
|
|
25
|
+
this.messages = new utility_1.OpenAIUtility.Message();
|
|
26
|
+
this.scratchpad = "";
|
|
27
|
+
this.toolResults = new Map();
|
|
28
|
+
this._maxTokens = maxTokens;
|
|
29
|
+
this._reserveTokens = reserveTokens;
|
|
30
|
+
}
|
|
31
|
+
_encoder() {
|
|
32
|
+
if (!Memory._enc) {
|
|
33
|
+
Memory._enc = (0, tiktoken_1.get_encoding)("cl100k_base");
|
|
34
|
+
}
|
|
35
|
+
return Memory._enc;
|
|
36
|
+
}
|
|
37
|
+
/** 精确估算当前消息缓存的 token 数 */
|
|
38
|
+
estimateTokens() {
|
|
39
|
+
const enc = this._encoder();
|
|
40
|
+
let total = 0;
|
|
41
|
+
const msgs = this.messages.GetAll();
|
|
42
|
+
for (const msg of msgs) {
|
|
43
|
+
total += 4; // 角色标记开销
|
|
44
|
+
if (msg.content) {
|
|
45
|
+
total += enc.encode(msg.content).length;
|
|
46
|
+
}
|
|
47
|
+
const am = msg;
|
|
48
|
+
if (am.thinking) {
|
|
49
|
+
total += enc.encode(am.thinking).length;
|
|
50
|
+
}
|
|
51
|
+
if (am.tool_calls) {
|
|
52
|
+
total += enc.encode(JSON.stringify(am.tool_calls)).length;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return total;
|
|
56
|
+
}
|
|
57
|
+
/** 检查内存压力级别 */
|
|
58
|
+
checkPressure() {
|
|
59
|
+
const ratio = this.estimateTokens() / (this._maxTokens - this._reserveTokens);
|
|
60
|
+
if (ratio > 0.95) {
|
|
61
|
+
return MemoryPressure.Critical;
|
|
62
|
+
}
|
|
63
|
+
if (ratio > 0.85) {
|
|
64
|
+
return MemoryPressure.Moderate;
|
|
65
|
+
}
|
|
66
|
+
if (ratio > 0.70) {
|
|
67
|
+
return MemoryPressure.Mild;
|
|
68
|
+
}
|
|
69
|
+
return MemoryPressure.None;
|
|
70
|
+
}
|
|
71
|
+
/** @deprecated 兼容旧调用,使用 checkPressure() */
|
|
72
|
+
hasOverflow() {
|
|
73
|
+
return this.checkPressure() >= MemoryPressure.Mild;
|
|
74
|
+
}
|
|
75
|
+
// #endregion
|
|
76
|
+
// #region 上下文窗口优化
|
|
77
|
+
/** 按压力级别执行压缩 */
|
|
78
|
+
async optimize(level) {
|
|
79
|
+
switch (level) {
|
|
80
|
+
case MemoryPressure.Mild:
|
|
81
|
+
await this._optimizeMild();
|
|
82
|
+
break;
|
|
83
|
+
case MemoryPressure.Moderate:
|
|
84
|
+
await this._optimizeModerate();
|
|
85
|
+
break;
|
|
86
|
+
case MemoryPressure.Critical:
|
|
87
|
+
this._optimizeCritical(3);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Mild: 压缩远期轮次(前 30%)为摘要,1 次 LLM 调用 */
|
|
92
|
+
async _optimizeMild() {
|
|
93
|
+
const all = this.messages.GetAll();
|
|
94
|
+
const cutoff = Math.floor(all.length * 0.3);
|
|
95
|
+
const distant = [];
|
|
96
|
+
// 收集系统消息之后的早期消息
|
|
97
|
+
let firstNonSystem = 0;
|
|
98
|
+
while (firstNonSystem < all.length && all[firstNonSystem].role === "system") {
|
|
99
|
+
firstNonSystem++;
|
|
100
|
+
}
|
|
101
|
+
for (let i = firstNonSystem; i < cutoff; i++) {
|
|
102
|
+
const msg = all[i];
|
|
103
|
+
if (msg.role !== "tool") {
|
|
104
|
+
distant.push(msg);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (distant.length === 0) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const summary = await this.summarize(distant);
|
|
111
|
+
if (!summary) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// 重建:系统消息 + 摘要 + 剩余消息
|
|
115
|
+
const systemMsgs = all.filter(m => m.role === "system");
|
|
116
|
+
const remaining = all.slice(cutoff);
|
|
117
|
+
this.messages.Clear();
|
|
118
|
+
for (const sm of systemMsgs) {
|
|
119
|
+
this.messages.Add(sm);
|
|
120
|
+
}
|
|
121
|
+
this.messages.AddSystem(`[早期对话摘要]: ${summary}`);
|
|
122
|
+
for (const rm of remaining) {
|
|
123
|
+
this.messages.Add(rm);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Moderate: 同原 5 层裁剪,压缩远期 + 摘要中间轮次,1-2 次 LLM 调用 */
|
|
127
|
+
async _optimizeModerate() {
|
|
128
|
+
const all = this.messages.GetAll();
|
|
129
|
+
// 层1: 系统消息
|
|
130
|
+
const systemMsgs = all.filter(m => m.role === "system");
|
|
131
|
+
// 层2+3: 最近 N 轮 + 工具调用对
|
|
132
|
+
const preserved = new Set();
|
|
133
|
+
let turnCount = 0;
|
|
134
|
+
const recentTurns = 6;
|
|
135
|
+
for (let i = all.length - 1; i >= 0; i--) {
|
|
136
|
+
const msg = all[i];
|
|
137
|
+
if (msg.role === "tool") {
|
|
138
|
+
preserved.add(i);
|
|
139
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
140
|
+
if (all[j].role === "assistant" && all[j].tool_calls) {
|
|
141
|
+
preserved.add(j);
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (msg.role === "user" && turnCount < recentTurns) {
|
|
148
|
+
turnCount++;
|
|
149
|
+
preserved.add(i);
|
|
150
|
+
if (i + 1 < all.length && all[i + 1].role === "assistant") {
|
|
151
|
+
preserved.add(i + 1);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const middle = [];
|
|
156
|
+
const distant = [];
|
|
157
|
+
for (let i = 0; i < all.length; i++) {
|
|
158
|
+
if (preserved.has(i) || all[i].role === "system") {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (i < all.length / 3) {
|
|
162
|
+
distant.push(all[i]);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
middle.push(all[i]);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// 摘要压缩中间轮次 + 提取远期实体
|
|
169
|
+
const [compressedSummary, entityText] = await Promise.all([
|
|
170
|
+
middle.length > 0 ? this.summarize(middle) : Promise.resolve(""),
|
|
171
|
+
distant.length > 0 ? this.extractEntities(distant).then(e => {
|
|
172
|
+
const entries = Object.entries(e);
|
|
173
|
+
return entries.length > 0
|
|
174
|
+
? `[历史实体]: ${entries.map(([k, v]) => `${k}=${v}`).join(", ")}`
|
|
175
|
+
: "";
|
|
176
|
+
}) : Promise.resolve(""),
|
|
177
|
+
]);
|
|
178
|
+
this.messages.Clear();
|
|
179
|
+
for (const sm of systemMsgs) {
|
|
180
|
+
this.messages.Add(sm);
|
|
181
|
+
}
|
|
182
|
+
if (entityText) {
|
|
183
|
+
this.messages.AddSystem(`${(systemMsgs[0]?.content ?? "")}\n${entityText}`);
|
|
184
|
+
}
|
|
185
|
+
if (compressedSummary) {
|
|
186
|
+
const existingContent = this.messages.GetLast()?.content ?? "";
|
|
187
|
+
this.messages.RemoveLast();
|
|
188
|
+
this.messages.AddSystem(`${existingContent}\n[对话历史摘要]: ${compressedSummary}`);
|
|
189
|
+
}
|
|
190
|
+
for (let i = 0; i < all.length; i++) {
|
|
191
|
+
if (preserved.has(i)) {
|
|
192
|
+
this.messages.Add(all[i]);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** Critical: 激进裁剪 — 系统消息 + 摘要 + 最近 N 轮,0-1 次 LLM 调用 */
|
|
197
|
+
_optimizeCritical(recentTurns = 3) {
|
|
198
|
+
const all = this.messages.GetAll();
|
|
199
|
+
const systemMsgs = all.filter(m => m.role === "system");
|
|
200
|
+
// 从后往前收集最近 N 轮
|
|
201
|
+
const preserved = new Set();
|
|
202
|
+
let turnCount = 0;
|
|
203
|
+
for (let i = all.length - 1; i >= 0; i--) {
|
|
204
|
+
const msg = all[i];
|
|
205
|
+
if (msg.role === "tool") {
|
|
206
|
+
preserved.add(i);
|
|
207
|
+
for (let j = i - 1; j >= 0; j--) {
|
|
208
|
+
if (all[j].role === "assistant" && all[j].tool_calls) {
|
|
209
|
+
preserved.add(j);
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
if (msg.role === "user" && turnCount < recentTurns) {
|
|
216
|
+
turnCount++;
|
|
217
|
+
preserved.add(i);
|
|
218
|
+
if (i + 1 < all.length && all[i + 1].role === "assistant") {
|
|
219
|
+
preserved.add(i + 1);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// 被裁剪的消息拼接为纯文本摘要
|
|
224
|
+
const trimmed = all.filter((_, i) => !preserved.has(i) && all[i].role !== "system");
|
|
225
|
+
const snippet = trimmed
|
|
226
|
+
.map(m => `[${m.role}]: ${(m.content ?? "").substring(0, 200)}`)
|
|
227
|
+
.join("\n")
|
|
228
|
+
.substring(0, 3000);
|
|
229
|
+
this.messages.Clear();
|
|
230
|
+
for (const sm of systemMsgs) {
|
|
231
|
+
this.messages.Add(sm);
|
|
232
|
+
}
|
|
233
|
+
if (snippet) {
|
|
234
|
+
this.messages.AddSystem(`[裁剪历史摘要,最近${recentTurns}轮完整保留]:\n${snippet}`);
|
|
235
|
+
}
|
|
236
|
+
for (let i = 0; i < all.length; i++) {
|
|
237
|
+
if (preserved.has(i)) {
|
|
238
|
+
this.messages.Add(all[i]);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// #endregion
|
|
243
|
+
// #region 摘要工具
|
|
244
|
+
async summarizeFn(systemPrompt, msgs) {
|
|
245
|
+
const request = {
|
|
246
|
+
model: this.agent.config.model,
|
|
247
|
+
messages: [{ role: "system", content: systemPrompt }, ...msgs,],
|
|
248
|
+
thinking: { type: "disabled" },
|
|
249
|
+
stream: false,
|
|
250
|
+
};
|
|
251
|
+
const response = await this.agent.OnBaseRequest(this.agent.config.apiKey, request);
|
|
252
|
+
return response?.data?.choices?.[0]?.message?.content ?? "";
|
|
253
|
+
}
|
|
254
|
+
async summarize(messages) {
|
|
255
|
+
if (0 >= messages.length) {
|
|
256
|
+
return "";
|
|
257
|
+
}
|
|
258
|
+
const SUMMARY_SYSTEM_PROMPT = `你是一个对话摘要助手。请将以下对话轮次压缩为简洁摘要(不超过200字):
|
|
259
|
+
1. 保留关键决策、重要信息、用户偏好
|
|
260
|
+
2. 省略闲聊和重复内容
|
|
261
|
+
3. 使用第三人称描述`;
|
|
262
|
+
return await this.summarizeFn(SUMMARY_SYSTEM_PROMPT, messages);
|
|
263
|
+
}
|
|
264
|
+
async extractEntities(messages) {
|
|
265
|
+
if (0 >= messages.length) {
|
|
266
|
+
return {};
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
const ENTITY_SYSTEM_PROMPT = `你是一个信息提取助手。请从对话中提取关键实体和它们的值,格式为 JSON:
|
|
270
|
+
{ "entity_name": "value", ... }
|
|
271
|
+
只输出 JSON,不要其他内容。`;
|
|
272
|
+
const result = await this.summarizeFn(ENTITY_SYSTEM_PROMPT, messages);
|
|
273
|
+
return JSON.parse(result);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
return {};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// #endregion
|
|
280
|
+
/** 清空所有记忆 */
|
|
281
|
+
clear() {
|
|
282
|
+
this.messages.Clear();
|
|
283
|
+
this.scratchpad = "";
|
|
284
|
+
this.toolResults.clear();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
exports.Memory = Memory;
|
|
288
|
+
//# sourceMappingURL=Memory.js.map
|