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.
Files changed (163) hide show
  1. package/Host.d.ts +23 -0
  2. package/Host.d.ts.map +1 -0
  3. package/Host.js +23 -0
  4. package/Host.js.map +1 -0
  5. package/base/AbstractAgent.d.ts +100 -0
  6. package/base/AbstractAgent.d.ts.map +1 -0
  7. package/base/AbstractAgent.js +23 -0
  8. package/base/AbstractAgent.js.map +1 -0
  9. package/base/AbstractDialog.d.ts +54 -0
  10. package/base/AbstractDialog.d.ts.map +1 -0
  11. package/base/AbstractDialog.js +86 -0
  12. package/base/AbstractDialog.js.map +1 -0
  13. package/base/AbstractModule.d.ts +7 -0
  14. package/base/AbstractModule.d.ts.map +1 -0
  15. package/base/AbstractModule.js +13 -0
  16. package/base/AbstractModule.js.map +1 -0
  17. package/base/AbstractObject.d.ts +18 -0
  18. package/base/AbstractObject.d.ts.map +1 -0
  19. package/base/AbstractObject.js +25 -0
  20. package/base/AbstractObject.js.map +1 -0
  21. package/base/AbstractReason.d.ts +44 -0
  22. package/base/AbstractReason.d.ts.map +1 -0
  23. package/base/AbstractReason.js +23 -0
  24. package/base/AbstractReason.js.map +1 -0
  25. package/base/AbstractSkill.d.ts +25 -0
  26. package/base/AbstractSkill.d.ts.map +1 -0
  27. package/base/AbstractSkill.js +3 -0
  28. package/base/AbstractSkill.js.map +1 -0
  29. package/base/AbstractTool.d.ts +34 -0
  30. package/base/AbstractTool.d.ts.map +1 -0
  31. package/base/AbstractTool.js +3 -0
  32. package/base/AbstractTool.js.map +1 -0
  33. package/base/index.d.ts +8 -0
  34. package/base/index.d.ts.map +1 -0
  35. package/base/index.js +24 -0
  36. package/base/index.js.map +1 -0
  37. package/docs/ARCHITECTURE.md +601 -0
  38. package/docs/README.md +562 -0
  39. package/index.d.ts +4 -0
  40. package/index.d.ts.map +1 -0
  41. package/index.js +25 -0
  42. package/index.js.map +1 -0
  43. package/module/AgentModule/Agent.d.ts +55 -0
  44. package/module/AgentModule/Agent.d.ts.map +1 -0
  45. package/module/AgentModule/Agent.js +210 -0
  46. package/module/AgentModule/Agent.js.map +1 -0
  47. package/module/AgentModule/AgentModule.d.ts +26 -0
  48. package/module/AgentModule/AgentModule.d.ts.map +1 -0
  49. package/module/AgentModule/AgentModule.js +66 -0
  50. package/module/AgentModule/AgentModule.js.map +1 -0
  51. package/module/AgentModule/Memory.d.ts +55 -0
  52. package/module/AgentModule/Memory.d.ts.map +1 -0
  53. package/module/AgentModule/Memory.js +288 -0
  54. package/module/AgentModule/Memory.js.map +1 -0
  55. package/module/AgentModule/index.d.ts +2 -0
  56. package/module/AgentModule/index.d.ts.map +1 -0
  57. package/module/AgentModule/index.js +18 -0
  58. package/module/AgentModule/index.js.map +1 -0
  59. package/module/DialogModule/Dialog.d.ts +14 -0
  60. package/module/DialogModule/Dialog.d.ts.map +1 -0
  61. package/module/DialogModule/Dialog.js +27 -0
  62. package/module/DialogModule/Dialog.js.map +1 -0
  63. package/module/DialogModule/DialogModule.d.ts +39 -0
  64. package/module/DialogModule/DialogModule.d.ts.map +1 -0
  65. package/module/DialogModule/DialogModule.js +118 -0
  66. package/module/DialogModule/DialogModule.js.map +1 -0
  67. package/module/DialogModule/index.d.ts +3 -0
  68. package/module/DialogModule/index.d.ts.map +1 -0
  69. package/module/DialogModule/index.js +19 -0
  70. package/module/DialogModule/index.js.map +1 -0
  71. package/module/ReasonModule/ChainReason.d.ts +11 -0
  72. package/module/ReasonModule/ChainReason.d.ts.map +1 -0
  73. package/module/ReasonModule/ChainReason.js +34 -0
  74. package/module/ReasonModule/ChainReason.js.map +1 -0
  75. package/module/ReasonModule/CommanderReason.d.ts +15 -0
  76. package/module/ReasonModule/CommanderReason.d.ts.map +1 -0
  77. package/module/ReasonModule/CommanderReason.js +151 -0
  78. package/module/ReasonModule/CommanderReason.js.map +1 -0
  79. package/module/ReasonModule/CompetitiveReason.d.ts +13 -0
  80. package/module/ReasonModule/CompetitiveReason.d.ts.map +1 -0
  81. package/module/ReasonModule/CompetitiveReason.js +133 -0
  82. package/module/ReasonModule/CompetitiveReason.js.map +1 -0
  83. package/module/ReasonModule/PlanReason.d.ts +25 -0
  84. package/module/ReasonModule/PlanReason.d.ts.map +1 -0
  85. package/module/ReasonModule/PlanReason.js +133 -0
  86. package/module/ReasonModule/PlanReason.js.map +1 -0
  87. package/module/ReasonModule/ReasonModule.d.ts +41 -0
  88. package/module/ReasonModule/ReasonModule.d.ts.map +1 -0
  89. package/module/ReasonModule/ReasonModule.js +83 -0
  90. package/module/ReasonModule/ReasonModule.js.map +1 -0
  91. package/module/ReasonModule/ReflectReason.d.ts +15 -0
  92. package/module/ReasonModule/ReflectReason.d.ts.map +1 -0
  93. package/module/ReasonModule/ReflectReason.js +86 -0
  94. package/module/ReasonModule/ReflectReason.js.map +1 -0
  95. package/module/ReasonModule/TreeReason.d.ts +16 -0
  96. package/module/ReasonModule/TreeReason.d.ts.map +1 -0
  97. package/module/ReasonModule/TreeReason.js +139 -0
  98. package/module/ReasonModule/TreeReason.js.map +1 -0
  99. package/module/ReasonModule/index.d.ts +8 -0
  100. package/module/ReasonModule/index.d.ts.map +1 -0
  101. package/module/ReasonModule/index.js +24 -0
  102. package/module/ReasonModule/index.js.map +1 -0
  103. package/module/SkillModule/SkillModule.d.ts +42 -0
  104. package/module/SkillModule/SkillModule.d.ts.map +1 -0
  105. package/module/SkillModule/SkillModule.js +134 -0
  106. package/module/SkillModule/SkillModule.js.map +1 -0
  107. package/module/SkillModule/index.d.ts +2 -0
  108. package/module/SkillModule/index.d.ts.map +1 -0
  109. package/module/SkillModule/index.js +18 -0
  110. package/module/SkillModule/index.js.map +1 -0
  111. package/module/ToolModule/ToolModule.d.ts +57 -0
  112. package/module/ToolModule/ToolModule.d.ts.map +1 -0
  113. package/module/ToolModule/ToolModule.js +220 -0
  114. package/module/ToolModule/ToolModule.js.map +1 -0
  115. package/module/ToolModule/ToolRAG.d.ts +38 -0
  116. package/module/ToolModule/ToolRAG.d.ts.map +1 -0
  117. package/module/ToolModule/ToolRAG.js +124 -0
  118. package/module/ToolModule/ToolRAG.js.map +1 -0
  119. package/module/ToolModule/index.d.ts +3 -0
  120. package/module/ToolModule/index.d.ts.map +1 -0
  121. package/module/ToolModule/index.js +19 -0
  122. package/module/ToolModule/index.js.map +1 -0
  123. package/module/index.d.ts +6 -0
  124. package/module/index.d.ts.map +1 -0
  125. package/module/index.js +22 -0
  126. package/module/index.js.map +1 -0
  127. package/package.json +19 -0
  128. package/utility/InterfaceUtility.d.ts +14 -0
  129. package/utility/InterfaceUtility.d.ts.map +1 -0
  130. package/utility/InterfaceUtility.js +3 -0
  131. package/utility/InterfaceUtility.js.map +1 -0
  132. package/utility/LogUtility.d.ts +41 -0
  133. package/utility/LogUtility.d.ts.map +1 -0
  134. package/utility/LogUtility.js +70 -0
  135. package/utility/LogUtility.js.map +1 -0
  136. package/utility/NetworkUtility.d.ts +91 -0
  137. package/utility/NetworkUtility.d.ts.map +1 -0
  138. package/utility/NetworkUtility.js +104 -0
  139. package/utility/NetworkUtility.js.map +1 -0
  140. package/utility/ObjectUtility.d.ts +134 -0
  141. package/utility/ObjectUtility.d.ts.map +1 -0
  142. package/utility/ObjectUtility.js +313 -0
  143. package/utility/ObjectUtility.js.map +1 -0
  144. package/utility/OpenAIUtility.d.ts +333 -0
  145. package/utility/OpenAIUtility.d.ts.map +1 -0
  146. package/utility/OpenAIUtility.js +95 -0
  147. package/utility/OpenAIUtility.js.map +1 -0
  148. package/utility/PromiseUtility.d.ts +9 -0
  149. package/utility/PromiseUtility.d.ts.map +1 -0
  150. package/utility/PromiseUtility.js +16 -0
  151. package/utility/PromiseUtility.js.map +1 -0
  152. package/utility/StringUtility.d.ts +10 -0
  153. package/utility/StringUtility.d.ts.map +1 -0
  154. package/utility/StringUtility.js +42 -0
  155. package/utility/StringUtility.js.map +1 -0
  156. package/utility/TimeUtility.d.ts +10 -0
  157. package/utility/TimeUtility.d.ts.map +1 -0
  158. package/utility/TimeUtility.js +24 -0
  159. package/utility/TimeUtility.js.map +1 -0
  160. package/utility/index.d.ts +9 -0
  161. package/utility/index.d.ts.map +1 -0
  162. package/utility/index.js +25 -0
  163. 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":";;;AAAA,qCAAoH;AACpH,2CAA6E;AAC7E,qCAAkD;AAElD,WAAW;AACX,MAAa,KAAM,SAAQ,oBAAa;IAapC,WAAW;IACX,YAAmB,MAAmB;QAElC,KAAK,EAAE,CAAC;QAVZ,WAAW;QACH,WAAM,GAAe,iBAAU,CAAC,IAAI,CAAC;QAC7C,WAAW;QACH,eAAU,GAAW,CAAC,CAAC;QAQ3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IACD,WAAW;IACX,IAAW,KAAK,KAAiB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,WAAW;IACX,IAAW,SAAS,KAAa,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,eAAe;IACf,IAAW,eAAe,KAAc,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC;IAEpF,qBAAqB;IAErB,mCAAmC;IAC5B,KAAK,CAAC,eAAe,CAAC,OAAe;QAExC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,yBAAyB;IAClB,KAAK,CAAC,WAAW;QAEpB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IACD,qBAAqB;IACX,KAAK,CAAC,aAAa,CAAC,SAAqD;QAE/E,qBAAqB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,QAAQ,GAAG,uBAAc,CAAC,IAAI,EAClC,CAAC;YACG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,GAAG,iBAAU,CAAC,QAAQ,CAAC;QAElC,MAAM,WAAW,GAAqC;YAClD,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE;YACjE,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;YAC7C,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YACjC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC;YACzE,WAAW,EAAE,SAAS,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5F,GAAG,SAAS;SACf,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,GAAG,iBAAU,CAAC,OAAO,CAAC;QAEjC,cAAc;QACd,IAAI,QAAQ,EAAE,IAAI,EAAE,KAAK,EACzB,CAAC;YACG,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,KAAK,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5G,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,4BAA4B;IAClB,KAAK,CAAC,MAAM,CAAC,OAAe;QAElC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EACzC,CAAC;YACG,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,wBAAwB;IACjB,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,WAA6C;QAEpF,IAAI,uBAAa,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAC1G,MAAM,OAAO,GACb;YACI,MAAM,EAAE,wBAAc,CAAC,cAAc,CAAC,IAAI;YAC1C,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,MAAM,EAAE,EAAE;YACpF,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,KAAK;YACd,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;SAC7B,CAAC;QACF,OAAO,MAAM,wBAAc,CAAC,IAAI,CAAC,SAAS,CAAoC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChH,CAAC;IACD,aAAa;IAEb,iBAAiB;IAEjB,+BAA+B;IACxB,KAAK,CAAC,WAAW,CAAC,QAA2C;QAEhE,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9F,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IACD,+BAA+B;IACxB,aAAa,CAAC,MAAc,EAAE,UAAkB;QAEnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,wCAAwC;IACjC,mBAAmB,CAAC,OAAe,EAAE,SAAoD;QAE5F,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAChF,CAAC;IAED,uBAAuB;IAChB,QAAQ,CAAC,KAAiB;QAE7B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,aAAa;IAEb,iBAAiB;IAEjB;;;;;;OAMG;IACI,KAAK,CAAC,GAAG,CAAC,KAAa,EAAE,OAAyB;QAErD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAE3B,YAAY;QACZ,IAAI,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,EAAE,IAAI,EACnB,CAAC;YACG,IAAI,CAAC,QAAQ,CAAC,iBAAU,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAC3C,CAAC;QAED,IAAI,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EACX,CAAC;YACG,IAAI,CAAC,QAAQ,CAAC,iBAAU,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACtE,CAAC;QAED,YAAY;QACZ,OAAO,MAAM,CAAC,aAAa,KAAK,YAAY,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,EACzE,CAAC;YACG,IAAI,CAAC,QAAQ,CAAC,iBAAU,CAAC,WAAW,CAAC,CAAC;YACtC,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,EAC1C,CAAC;gBACG,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC1C,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC;YAED,IACA,CAAC;gBACG,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,CAAC;YACD,OAAO,CAAC,EACR,CAAC;gBACG,IAAI,CAAC,QAAQ,CAAC,iBAAU,CAAC,KAAK,CAAC,CAAC;gBAChC,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,aAAa,CAAC,EAAE;oBACzB,YAAY,EAAE,OAAO;iBACxB,CAAC;YACN,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YAC/B,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,MAAM;YAAC,CAAC;YAEvB,2CAA2C;YAC3C,gDAAgD;YAChD,IAAI,MAAM,CAAC,OAAO,EAClB,CAAC;gBACG,IAAI,CAAC,mBAAmB,CACpB,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAC5B,MAAM,CAAC,OAAO,CAAC,UAAU,CAC5B,CAAC;YACN,CAAC;QACL,CAAC;QAED,UAAU;QACV,IAAI,CAAC,QAAQ,CAAC,iBAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO;YACH,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;YACvC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ;YACnC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU;YACtC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK;YAC5B,YAAY,EAAE,MAAM,EAAE,aAAa;SACtC,CAAC;IACN,CAAC;IAED,aAAa;IAEb,cAAc;IAEd,oBAAoB;IACb,QAAQ;QAEX,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3C,OAAO;YACH,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,IAAI,CAAC,EAAE;YAChB,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACnD,MAAM,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;gBACxB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACtC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBACpC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;gBAC1C,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;gBAC5C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;aACjC;SACJ,CAAC;IACN,CAAC;IAED,iCAAiC;IAC1B,OAAO,CAAC,QAAuB;QAElC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;CAGJ;AA/PD,sBA+PC"}
@@ -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