@fllf/agent-sdk 0.1.2 → 0.1.3

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 (266) hide show
  1. package/CHANGELOG.md +169 -0
  2. package/README.md +824 -198
  3. package/dist/agent/Agent.d.ts +16 -5
  4. package/dist/agent/Agent.d.ts.map +1 -1
  5. package/dist/agent/Agent.js +283 -2
  6. package/dist/agent/Agent.js.map +1 -1
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.d.ts.map +1 -1
  9. package/dist/agent/types.d.ts +27 -3
  10. package/dist/agent/types.d.ts.map +1 -1
  11. package/dist/config/config.d.ts +22 -3
  12. package/dist/config/config.d.ts.map +1 -1
  13. package/dist/config/config.js +194 -47
  14. package/dist/config/config.js.map +1 -1
  15. package/dist/config/index.d.ts +1 -1
  16. package/dist/config/index.d.ts.map +1 -1
  17. package/dist/errors.d.ts +74 -0
  18. package/dist/errors.d.ts.map +1 -0
  19. package/dist/errors.js +186 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/executors/base-executor.d.ts +14 -0
  22. package/dist/executors/base-executor.d.ts.map +1 -0
  23. package/dist/executors/base-executor.js +31 -0
  24. package/dist/executors/base-executor.js.map +1 -0
  25. package/dist/executors/base.d.ts +36 -5
  26. package/dist/executors/base.d.ts.map +1 -1
  27. package/dist/executors/chat-request-builder.d.ts +10 -0
  28. package/dist/executors/chat-request-builder.d.ts.map +1 -0
  29. package/dist/executors/chat-request-builder.js +96 -0
  30. package/dist/executors/chat-request-builder.js.map +1 -0
  31. package/dist/executors/index.d.ts +4 -1
  32. package/dist/executors/index.d.ts.map +1 -1
  33. package/dist/executors/index.js +6 -1
  34. package/dist/executors/index.js.map +1 -1
  35. package/dist/executors/rag-executor.js +1 -1
  36. package/dist/executors/rag-executor.js.map +1 -1
  37. package/dist/executors/simple-chat-executor.d.ts +4 -2
  38. package/dist/executors/simple-chat-executor.d.ts.map +1 -1
  39. package/dist/executors/simple-chat-executor.js +59 -57
  40. package/dist/executors/simple-chat-executor.js.map +1 -1
  41. package/dist/executors/tool-calling-executor.d.ts +20 -2
  42. package/dist/executors/tool-calling-executor.d.ts.map +1 -1
  43. package/dist/executors/tool-calling-executor.js +189 -91
  44. package/dist/executors/tool-calling-executor.js.map +1 -1
  45. package/dist/history/base.d.ts +55 -2
  46. package/dist/history/base.d.ts.map +1 -1
  47. package/dist/history/base.js +49 -0
  48. package/dist/history/base.js.map +1 -1
  49. package/dist/history/compression.d.ts +49 -0
  50. package/dist/history/compression.d.ts.map +1 -0
  51. package/dist/history/compression.js +53 -0
  52. package/dist/history/compression.js.map +1 -0
  53. package/dist/history/context-window.d.ts +33 -0
  54. package/dist/history/context-window.d.ts.map +1 -0
  55. package/dist/history/context-window.js +68 -0
  56. package/dist/history/context-window.js.map +1 -0
  57. package/dist/history/in-memory.d.ts +6 -4
  58. package/dist/history/in-memory.d.ts.map +1 -1
  59. package/dist/history/in-memory.js +25 -39
  60. package/dist/history/in-memory.js.map +1 -1
  61. package/dist/history/index.d.ts +9 -2
  62. package/dist/history/index.d.ts.map +1 -1
  63. package/dist/history/index.js +18 -1
  64. package/dist/history/index.js.map +1 -1
  65. package/dist/history/postgres/index.d.ts +4 -0
  66. package/dist/history/postgres/index.d.ts.map +1 -0
  67. package/dist/history/postgres/index.js +20 -0
  68. package/dist/history/postgres/index.js.map +1 -0
  69. package/dist/history/postgres/postgres-message-history-store.d.ts +35 -0
  70. package/dist/history/postgres/postgres-message-history-store.d.ts.map +1 -0
  71. package/dist/history/postgres/postgres-message-history-store.js +195 -0
  72. package/dist/history/postgres/postgres-message-history-store.js.map +1 -0
  73. package/dist/history/postgres/schema.d.ts +18 -0
  74. package/dist/history/postgres/schema.d.ts.map +1 -0
  75. package/dist/history/postgres/schema.js +46 -0
  76. package/dist/history/postgres/schema.js.map +1 -0
  77. package/dist/history/postgres/sql.d.ts +29 -0
  78. package/dist/history/postgres/sql.d.ts.map +1 -0
  79. package/dist/history/postgres/sql.js +102 -0
  80. package/dist/history/postgres/sql.js.map +1 -0
  81. package/dist/history/postgres/types.d.ts +20 -0
  82. package/dist/history/postgres/types.d.ts.map +1 -0
  83. package/dist/history/postgres/types.js +3 -0
  84. package/dist/history/postgres/types.js.map +1 -0
  85. package/dist/history/tool-pairing.d.ts +11 -0
  86. package/dist/history/tool-pairing.d.ts.map +1 -0
  87. package/dist/history/tool-pairing.js +52 -0
  88. package/dist/history/tool-pairing.js.map +1 -0
  89. package/dist/index.d.ts +2 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +2 -0
  92. package/dist/index.js.map +1 -1
  93. package/dist/llm/LLM.d.ts +1 -0
  94. package/dist/llm/LLM.d.ts.map +1 -1
  95. package/dist/llm/LLM.js +136 -26
  96. package/dist/llm/LLM.js.map +1 -1
  97. package/dist/llm/errors.d.ts +11 -1
  98. package/dist/llm/errors.d.ts.map +1 -1
  99. package/dist/llm/errors.js +50 -1
  100. package/dist/llm/errors.js.map +1 -1
  101. package/dist/llm/factory.d.ts +14 -2
  102. package/dist/llm/factory.d.ts.map +1 -1
  103. package/dist/llm/factory.js +48 -9
  104. package/dist/llm/factory.js.map +1 -1
  105. package/dist/llm/index.d.ts +8 -3
  106. package/dist/llm/index.d.ts.map +1 -1
  107. package/dist/llm/index.js +10 -1
  108. package/dist/llm/index.js.map +1 -1
  109. package/dist/llm/providers/anthropic.d.ts +14 -0
  110. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  111. package/dist/llm/providers/anthropic.js +336 -0
  112. package/dist/llm/providers/anthropic.js.map +1 -0
  113. package/dist/llm/providers/openai-compatible.d.ts +7 -0
  114. package/dist/llm/providers/openai-compatible.d.ts.map +1 -1
  115. package/dist/llm/providers/openai-compatible.js +151 -47
  116. package/dist/llm/providers/openai-compatible.js.map +1 -1
  117. package/dist/llm/stream-accumulator.d.ts +17 -0
  118. package/dist/llm/stream-accumulator.d.ts.map +1 -0
  119. package/dist/llm/stream-accumulator.js +83 -0
  120. package/dist/llm/stream-accumulator.js.map +1 -0
  121. package/dist/llm/tool-arguments.d.ts +6 -0
  122. package/dist/llm/tool-arguments.d.ts.map +1 -0
  123. package/dist/llm/tool-arguments.js +20 -0
  124. package/dist/llm/tool-arguments.js.map +1 -0
  125. package/dist/llm/types.d.ts +76 -4
  126. package/dist/llm/types.d.ts.map +1 -1
  127. package/dist/messages/content.d.ts +36 -0
  128. package/dist/messages/content.d.ts.map +1 -0
  129. package/dist/messages/content.js +70 -0
  130. package/dist/messages/content.js.map +1 -0
  131. package/dist/messages/index.d.ts +4 -2
  132. package/dist/messages/index.d.ts.map +1 -1
  133. package/dist/messages/index.js +10 -1
  134. package/dist/messages/index.js.map +1 -1
  135. package/dist/messages/message.d.ts +11 -9
  136. package/dist/messages/message.d.ts.map +1 -1
  137. package/dist/messages/message.js +69 -4
  138. package/dist/messages/message.js.map +1 -1
  139. package/dist/messages/types.d.ts +12 -0
  140. package/dist/messages/types.d.ts.map +1 -1
  141. package/dist/observability/collecting-observer.d.ts +8 -0
  142. package/dist/observability/collecting-observer.d.ts.map +1 -0
  143. package/dist/observability/collecting-observer.js +15 -0
  144. package/dist/observability/collecting-observer.js.map +1 -0
  145. package/dist/observability/index.d.ts +1 -0
  146. package/dist/observability/index.d.ts.map +1 -1
  147. package/dist/observability/index.js +3 -1
  148. package/dist/observability/index.js.map +1 -1
  149. package/dist/observability/observer.d.ts.map +1 -1
  150. package/dist/observability/observer.js +14 -1
  151. package/dist/observability/observer.js.map +1 -1
  152. package/dist/observability/types.d.ts +16 -1
  153. package/dist/observability/types.d.ts.map +1 -1
  154. package/dist/rag/chunking/auto-chunker.d.ts +7 -0
  155. package/dist/rag/chunking/auto-chunker.d.ts.map +1 -1
  156. package/dist/rag/chunking/auto-chunker.js +13 -0
  157. package/dist/rag/chunking/auto-chunker.js.map +1 -1
  158. package/dist/rag/chunking/chunker.d.ts.map +1 -1
  159. package/dist/rag/chunking/chunker.js +29 -5
  160. package/dist/rag/chunking/chunker.js.map +1 -1
  161. package/dist/rag/chunking/index.d.ts +2 -0
  162. package/dist/rag/chunking/index.d.ts.map +1 -1
  163. package/dist/rag/chunking/index.js +2 -0
  164. package/dist/rag/chunking/index.js.map +1 -1
  165. package/dist/rag/chunking/markdown-chunker.d.ts.map +1 -1
  166. package/dist/rag/chunking/markdown-chunker.js.map +1 -1
  167. package/dist/rag/chunking/qa-pair-chunker.d.ts +23 -0
  168. package/dist/rag/chunking/qa-pair-chunker.d.ts.map +1 -0
  169. package/dist/rag/chunking/qa-pair-chunker.js +162 -0
  170. package/dist/rag/chunking/qa-pair-chunker.js.map +1 -0
  171. package/dist/rag/chunking/semantic-chunker.d.ts +19 -0
  172. package/dist/rag/chunking/semantic-chunker.d.ts.map +1 -0
  173. package/dist/rag/chunking/semantic-chunker.js +291 -0
  174. package/dist/rag/chunking/semantic-chunker.js.map +1 -0
  175. package/dist/rag/embeddings/embedder.d.ts.map +1 -1
  176. package/dist/rag/embeddings/embedder.js +6 -0
  177. package/dist/rag/embeddings/embedder.js.map +1 -1
  178. package/dist/rag/generation/context-builder.d.ts +7 -0
  179. package/dist/rag/generation/context-builder.d.ts.map +1 -1
  180. package/dist/rag/generation/context-builder.js +4 -1
  181. package/dist/rag/generation/context-builder.js.map +1 -1
  182. package/dist/rag/ingestion/metadata.d.ts +6 -1
  183. package/dist/rag/ingestion/metadata.d.ts.map +1 -1
  184. package/dist/rag/ingestion/metadata.js +6 -2
  185. package/dist/rag/ingestion/metadata.js.map +1 -1
  186. package/dist/rag/pipeline.d.ts.map +1 -1
  187. package/dist/rag/pipeline.js +34 -11
  188. package/dist/rag/pipeline.js.map +1 -1
  189. package/dist/rag/retrieval/index.d.ts +1 -0
  190. package/dist/rag/retrieval/index.d.ts.map +1 -1
  191. package/dist/rag/retrieval/index.js +1 -0
  192. package/dist/rag/retrieval/index.js.map +1 -1
  193. package/dist/rag/retrieval/parent-child-expanding-retriever.d.ts +31 -0
  194. package/dist/rag/retrieval/parent-child-expanding-retriever.d.ts.map +1 -0
  195. package/dist/rag/retrieval/parent-child-expanding-retriever.js +194 -0
  196. package/dist/rag/retrieval/parent-child-expanding-retriever.js.map +1 -0
  197. package/dist/rag/stores/in-memory-keyword-store.d.ts.map +1 -1
  198. package/dist/rag/stores/in-memory-keyword-store.js +3 -8
  199. package/dist/rag/stores/in-memory-keyword-store.js.map +1 -1
  200. package/dist/rag/stores/keyword-tokenizer.d.ts +4 -0
  201. package/dist/rag/stores/keyword-tokenizer.d.ts.map +1 -0
  202. package/dist/rag/stores/keyword-tokenizer.js +113 -0
  203. package/dist/rag/stores/keyword-tokenizer.js.map +1 -0
  204. package/dist/rag/stores/postgres/pg-vector-store.d.ts.map +1 -1
  205. package/dist/rag/stores/postgres/pg-vector-store.js +21 -8
  206. package/dist/rag/stores/postgres/pg-vector-store.js.map +1 -1
  207. package/dist/rag/stores/postgres/postgres-document-store.d.ts.map +1 -1
  208. package/dist/rag/stores/postgres/postgres-document-store.js +26 -13
  209. package/dist/rag/stores/postgres/postgres-document-store.js.map +1 -1
  210. package/dist/rag/stores/postgres/postgres-keyword-store.d.ts.map +1 -1
  211. package/dist/rag/stores/postgres/postgres-keyword-store.js +43 -43
  212. package/dist/rag/stores/postgres/postgres-keyword-store.js.map +1 -1
  213. package/dist/rag/stores/postgres/sql.d.ts +22 -0
  214. package/dist/rag/stores/postgres/sql.d.ts.map +1 -1
  215. package/dist/rag/stores/postgres/sql.js +42 -0
  216. package/dist/rag/stores/postgres/sql.js.map +1 -1
  217. package/dist/rag/stores/types.d.ts +5 -0
  218. package/dist/rag/stores/types.d.ts.map +1 -1
  219. package/dist/rag/types.d.ts +6 -0
  220. package/dist/rag/types.d.ts.map +1 -1
  221. package/dist/testing/agent.d.ts +11 -0
  222. package/dist/testing/agent.d.ts.map +1 -0
  223. package/dist/testing/agent.js +45 -0
  224. package/dist/testing/agent.js.map +1 -0
  225. package/dist/testing/history-contract.d.ts +12 -0
  226. package/dist/testing/history-contract.d.ts.map +1 -0
  227. package/dist/testing/history-contract.js +111 -0
  228. package/dist/testing/history-contract.js.map +1 -0
  229. package/dist/testing/index.d.ts +11 -0
  230. package/dist/testing/index.d.ts.map +1 -0
  231. package/dist/testing/index.js +16 -0
  232. package/dist/testing/index.js.map +1 -0
  233. package/dist/testing/models.d.ts +34 -0
  234. package/dist/testing/models.d.ts.map +1 -0
  235. package/dist/testing/models.js +74 -0
  236. package/dist/testing/models.js.map +1 -0
  237. package/dist/testing/tool-schema.d.ts +6 -0
  238. package/dist/testing/tool-schema.d.ts.map +1 -0
  239. package/dist/testing/tool-schema.js +29 -0
  240. package/dist/testing/tool-schema.js.map +1 -0
  241. package/dist/testing/tools.d.ts +21 -0
  242. package/dist/testing/tools.d.ts.map +1 -0
  243. package/dist/testing/tools.js +43 -0
  244. package/dist/testing/tools.js.map +1 -0
  245. package/dist/tools/base.d.ts +38 -7
  246. package/dist/tools/base.d.ts.map +1 -1
  247. package/dist/tools/base.js +238 -11
  248. package/dist/tools/base.js.map +1 -1
  249. package/dist/tools/builtin/advancedSearchTool.d.ts.map +1 -1
  250. package/dist/tools/builtin/advancedSearchTool.js +30 -4
  251. package/dist/tools/builtin/advancedSearchTool.js.map +1 -1
  252. package/dist/tools/builtin/ragSearchTool.d.ts +6 -3
  253. package/dist/tools/builtin/ragSearchTool.d.ts.map +1 -1
  254. package/dist/tools/builtin/ragSearchTool.js +8 -6
  255. package/dist/tools/builtin/ragSearchTool.js.map +1 -1
  256. package/dist/tools/executor.d.ts +30 -2
  257. package/dist/tools/executor.d.ts.map +1 -1
  258. package/dist/tools/executor.js +83 -15
  259. package/dist/tools/executor.js.map +1 -1
  260. package/dist/tools/index.d.ts +3 -1
  261. package/dist/tools/index.d.ts.map +1 -1
  262. package/dist/tools/registry.d.ts +15 -3
  263. package/dist/tools/registry.d.ts.map +1 -1
  264. package/dist/tools/registry.js +21 -2
  265. package/dist/tools/registry.js.map +1 -1
  266. package/package.json +58 -4
@@ -1,121 +1,215 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ToolCallingExecutor = void 0;
4
+ const llm_1 = require("../llm");
5
+ const errors_1 = require("../errors");
4
6
  const messages_1 = require("../messages");
5
7
  const tools_1 = require("../tools");
8
+ const chat_request_builder_1 = require("./chat-request-builder");
6
9
  class ToolCallingExecutor {
7
10
  maxIterations;
11
+ onMaxIterations;
8
12
  constructor(options = {}) {
9
13
  this.maxIterations = options.maxIterations ?? 5;
14
+ this.onMaxIterations = options.onMaxIterations ?? 'finalize';
10
15
  }
11
16
  async run(context) {
12
- const userMessage = new messages_1.Message(context.input, 'user', context.options.metadata ? { metadata: context.options.metadata } : {});
13
- const runMessages = [userMessage];
14
- const toolExecutor = new tools_1.ToolExecutor(context.tools, {
15
- runId: context.runId,
16
- observer: context.observer,
17
- agentName: context.agentName,
18
- sessionId: context.sessionId,
19
- });
20
- const messages = await buildInitialMessages(context, userMessage);
21
- let usage;
22
- let raw;
17
+ const toolExecutor = createToolExecutor(context);
18
+ const state = await createRunState(context);
23
19
  for (let iteration = 0; iteration < this.maxIterations; iteration += 1) {
24
- const response = await context.llm.chat(buildChatRequest(context, messages));
25
- usage = mergeTokenUsage(usage, response.usage);
26
- raw = response.raw;
20
+ const response = await context.llm.chat((0, chat_request_builder_1.buildChatRequest)(context, state.chatMessages, { includeTools: true }));
21
+ mergeResponseIntoState(state, response);
27
22
  if (response.toolCalls.length === 0) {
28
- const assistantMessage = new messages_1.Message(response.content, 'assistant');
29
- runMessages.push(assistantMessage);
30
- await context.history.addMany(runMessages);
31
- const result = {
32
- output: response.content,
33
- messages: await context.history.get(),
34
- raw,
35
- };
36
- if (usage !== undefined) {
37
- result.usage = usage;
38
- }
39
- return result;
23
+ return await finishRun(context, state, response.content);
24
+ }
25
+ appendAssistantToolCallMessage(state, response);
26
+ const outcomes = await toolExecutor.executeMany(response.toolCalls);
27
+ appendToolOutcomeMessages(state, outcomes);
28
+ }
29
+ return await this.handleMaxIterations(context, state);
30
+ }
31
+ async *stream(context) {
32
+ const toolExecutor = createToolExecutor(context);
33
+ const state = await createRunState(context);
34
+ for (let iteration = 0; iteration < this.maxIterations; iteration += 1) {
35
+ const response = yield* this.streamOneTurn(context, state, { includeTools: true });
36
+ mergeResponseIntoState(state, response);
37
+ if (response.toolCalls.length === 0) {
38
+ yield await this.createEndEvent(context, state, response.content);
39
+ return;
40
40
  }
41
- const assistantMessage = new messages_1.Message(response.content, 'assistant', {
42
- metadata: { toolCalls: response.toolCalls },
43
- });
44
- runMessages.push(assistantMessage);
45
- messages.push(assistantMessage.toChatMessage());
41
+ appendAssistantToolCallMessage(state, response);
46
42
  for (const toolCall of response.toolCalls) {
47
- const result = await toolExecutor.execute(toolCall);
48
- const toolMessage = new messages_1.Message(result, 'tool', {
49
- metadata: {
50
- toolCallId: toolCall.id,
51
- toolName: toolCall.name,
52
- },
53
- });
54
- runMessages.push(toolMessage);
55
- messages.push(toolMessage.toChatMessage());
43
+ yield {
44
+ type: 'agent:tool_call',
45
+ runId: context.runId,
46
+ timestamp: new Date(),
47
+ agentName: context.agentName,
48
+ sessionId: context.sessionId,
49
+ toolCall,
50
+ };
51
+ }
52
+ const outcomes = await toolExecutor.executeMany(response.toolCalls);
53
+ appendToolOutcomeMessages(state, outcomes);
54
+ for (const outcome of outcomes) {
55
+ yield {
56
+ type: 'agent:tool_result',
57
+ runId: context.runId,
58
+ timestamp: new Date(),
59
+ agentName: context.agentName,
60
+ sessionId: context.sessionId,
61
+ toolResult: outcome,
62
+ };
63
+ }
64
+ }
65
+ if (this.onMaxIterations === 'throw') {
66
+ await context.history.addMany(state.runMessages);
67
+ throw maxIterationsError(this.maxIterations);
68
+ }
69
+ const response = yield* this.streamOneTurn(context, state, { includeTools: false });
70
+ mergeResponseIntoState(state, response);
71
+ yield await this.createEndEvent(context, state, response.content);
72
+ }
73
+ /**
74
+ * 执行一轮模型请求。模型支持流式时边流边发 text_delta 事件,
75
+ * 否则退化为一次非流式请求并整体发出。两种情况都返回聚合后的完整响应。
76
+ */
77
+ async *streamOneTurn(context, state, options) {
78
+ const request = (0, chat_request_builder_1.buildChatRequest)(context, state.chatMessages, options);
79
+ if (!context.llm.stream) {
80
+ const response = await context.llm.chat(request);
81
+ if (response.content.length > 0) {
82
+ yield this.createTextDeltaEvent(context, response.content, response.raw);
83
+ }
84
+ return response;
85
+ }
86
+ const accumulator = new llm_1.ChatStreamAccumulator();
87
+ for await (const chunk of context.llm.stream(request)) {
88
+ accumulator.add(chunk);
89
+ if (chunk.contentDelta !== undefined && chunk.contentDelta.length > 0) {
90
+ yield this.createTextDeltaEvent(context, chunk.contentDelta, chunk.raw);
56
91
  }
57
92
  }
58
- throw new Error(`Tool calling exceeded max iterations: ${this.maxIterations}`);
93
+ return accumulator.toResponse();
59
94
  }
60
- }
61
- exports.ToolCallingExecutor = ToolCallingExecutor;
62
- async function buildInitialMessages(context, userMessage) {
63
- const systemPrompt = context.options.systemPrompt ?? context.systemPrompt;
64
- const history = await context.history.get();
65
- return [
66
- ...(systemPrompt ? [new messages_1.Message(systemPrompt, 'system').toChatMessage()] : []),
67
- ...history.map((message) => message.toChatMessage()),
68
- userMessage.toChatMessage(),
69
- ];
70
- }
71
- function buildChatRequest(context, messages) {
72
- const request = {
73
- messages,
74
- trace: {
95
+ createTextDeltaEvent(context, delta, raw) {
96
+ const event = {
97
+ type: 'agent:text_delta',
75
98
  runId: context.runId,
76
- observer: context.observer,
99
+ timestamp: new Date(),
77
100
  agentName: context.agentName,
78
101
  sessionId: context.sessionId,
79
- },
80
- };
81
- const model = context.options.model ?? context.config.defaultModel;
82
- if (model) {
83
- request.model = model;
84
- }
85
- request.temperature = context.options.temperature ?? context.config.temperature;
86
- const maxTokens = context.options.maxTokens ?? context.config.maxTokens;
87
- if (maxTokens !== undefined) {
88
- request.maxTokens = maxTokens;
89
- }
90
- const tools = context.tools.toOpenAISchemas();
91
- if (tools.length > 0) {
92
- request.tools = tools;
93
- request.toolChoice = 'auto';
102
+ delta,
103
+ };
104
+ if (raw !== undefined) {
105
+ event.raw = raw;
106
+ }
107
+ return event;
108
+ }
109
+ async createEndEvent(context, state, output) {
110
+ const assistantMessage = new messages_1.Message(output, 'assistant');
111
+ state.runMessages.push(assistantMessage);
112
+ await context.history.addMany(state.runMessages);
113
+ const event = {
114
+ type: 'agent:end',
115
+ runId: context.runId,
116
+ timestamp: new Date(),
117
+ agentName: context.agentName,
118
+ sessionId: context.sessionId,
119
+ output,
120
+ message: assistantMessage,
121
+ };
122
+ if (state.usage !== undefined) {
123
+ event.usage = state.usage;
124
+ }
125
+ if (state.raw !== undefined) {
126
+ event.raw = state.raw;
127
+ }
128
+ return event;
94
129
  }
95
- if (context.options.signal) {
96
- request.signal = context.options.signal;
130
+ async handleMaxIterations(context, state) {
131
+ if (this.onMaxIterations === 'throw') {
132
+ // 即使失败也要保留轨迹,否则重试时模型看不到已经发生过什么。
133
+ await context.history.addMany(state.runMessages);
134
+ throw maxIterationsError(this.maxIterations);
135
+ }
136
+ const response = await context.llm.chat((0, chat_request_builder_1.buildChatRequest)(context, state.chatMessages, { includeTools: false }));
137
+ mergeResponseIntoState(state, response);
138
+ return await finishRun(context, state, response.content);
97
139
  }
98
- applyRuntimeOptions(context, request);
99
- return request;
100
140
  }
101
- function applyRuntimeOptions(context, request) {
102
- // 单次 run 的 options 优先级高于 Agent 的默认 config。
103
- const timeoutMs = context.options.timeoutMs ?? context.config.requestTimeoutMs;
104
- if (timeoutMs !== undefined) {
105
- request.timeoutMs = timeoutMs;
106
- }
107
- const maxRetries = context.options.maxRetries ?? context.config.maxRetries;
108
- if (maxRetries !== undefined) {
109
- request.maxRetries = maxRetries;
141
+ exports.ToolCallingExecutor = ToolCallingExecutor;
142
+ function createToolExecutor(context) {
143
+ const toolExecutorOptions = {};
144
+ if (context.options.metadata !== undefined) {
145
+ toolExecutorOptions.metadata = context.options.metadata;
146
+ }
147
+ if (context.options.signal !== undefined) {
148
+ toolExecutorOptions.signal = context.options.signal;
149
+ }
150
+ return new tools_1.ToolExecutor(context.tools, {
151
+ runId: context.runId,
152
+ observer: context.observer,
153
+ agentName: context.agentName,
154
+ sessionId: context.sessionId,
155
+ }, toolExecutorOptions);
156
+ }
157
+ async function createRunState(context) {
158
+ const userMessage = new messages_1.Message(context.input, 'user', context.options.metadata ? { metadata: context.options.metadata } : {});
159
+ const history = await context.history.get();
160
+ return {
161
+ runMessages: [userMessage],
162
+ chatMessages: await (0, chat_request_builder_1.buildChatMessages)(context, [...history, userMessage]),
163
+ usage: undefined,
164
+ raw: undefined,
165
+ };
166
+ }
167
+ function mergeResponseIntoState(state, response) {
168
+ state.usage = mergeTokenUsage(state.usage, response.usage);
169
+ if (response.raw !== undefined) {
170
+ state.raw = response.raw;
110
171
  }
111
- const retryDelayMs = context.options.retryDelayMs ?? context.config.retryDelayMs;
112
- if (retryDelayMs !== undefined) {
113
- request.retryDelayMs = retryDelayMs;
172
+ }
173
+ function appendAssistantToolCallMessage(state, response) {
174
+ const assistantMessage = new messages_1.Message(response.content, 'assistant', {
175
+ metadata: { toolCalls: response.toolCalls },
176
+ });
177
+ state.runMessages.push(assistantMessage);
178
+ state.chatMessages.push(assistantMessage.toChatMessage());
179
+ }
180
+ function appendToolOutcomeMessages(state, outcomes) {
181
+ for (const outcome of outcomes) {
182
+ const toolMessage = new messages_1.Message(outcome.content, 'tool', {
183
+ metadata: {
184
+ toolCallId: outcome.toolCallId,
185
+ toolName: outcome.toolName,
186
+ isError: outcome.isError,
187
+ },
188
+ });
189
+ state.runMessages.push(toolMessage);
190
+ state.chatMessages.push(toolMessage.toChatMessage());
114
191
  }
115
- const retryMaxDelayMs = context.options.retryMaxDelayMs ?? context.config.retryMaxDelayMs;
116
- if (retryMaxDelayMs !== undefined) {
117
- request.retryMaxDelayMs = retryMaxDelayMs;
192
+ }
193
+ async function finishRun(context, state, output) {
194
+ state.runMessages.push(new messages_1.Message(output, 'assistant'));
195
+ await context.history.addMany(state.runMessages);
196
+ const result = {
197
+ output,
198
+ messages: await context.history.get(),
199
+ raw: state.raw,
200
+ };
201
+ if (state.usage !== undefined) {
202
+ result.usage = state.usage;
118
203
  }
204
+ return result;
205
+ }
206
+ function maxIterationsError(maxIterations) {
207
+ return new errors_1.AgentExecutionError(`Tool calling exceeded max iterations: ${maxIterations}.`, {
208
+ code: 'tool_calling_max_iterations',
209
+ metadata: {
210
+ maxIterations,
211
+ },
212
+ });
119
213
  }
120
214
  function mergeTokenUsage(current, next) {
121
215
  if (next === undefined) {
@@ -128,6 +222,7 @@ function mergeTokenUsage(current, next) {
128
222
  const promptTokens = addOptionalNumbers(current.promptTokens, next.promptTokens);
129
223
  const completionTokens = addOptionalNumbers(current.completionTokens, next.completionTokens);
130
224
  const totalTokens = addOptionalNumbers(current.totalTokens, next.totalTokens);
225
+ const cachedPromptTokens = addOptionalNumbers(current.cachedPromptTokens, next.cachedPromptTokens);
131
226
  if (promptTokens !== undefined) {
132
227
  merged.promptTokens = promptTokens;
133
228
  }
@@ -137,6 +232,9 @@ function mergeTokenUsage(current, next) {
137
232
  if (totalTokens !== undefined) {
138
233
  merged.totalTokens = totalTokens;
139
234
  }
235
+ if (cachedPromptTokens !== undefined) {
236
+ merged.cachedPromptTokens = cachedPromptTokens;
237
+ }
140
238
  return merged;
141
239
  }
142
240
  function addOptionalNumbers(left, right) {
@@ -1 +1 @@
1
- {"version":3,"file":"tool-calling-executor.js","sourceRoot":"","sources":["../../src/executors/tool-calling-executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-calling-executor.js","sourceRoot":"","sources":["../../src/executors/tool-calling-executor.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,53 @@
1
1
  import type { Message } from '../messages';
2
2
  export declare const DEFAULT_SESSION_ID = "default";
3
+ export interface MessageHistoryGetOptions {
4
+ /**
5
+ * Return at most this many most-recent messages after applying other filters.
6
+ */
7
+ limit?: number;
8
+ /**
9
+ * Exclusive upper timestamp bound. Accepts an ISO timestamp string or Date.
10
+ */
11
+ before?: string | Date;
12
+ }
13
+ export interface MessageHistoryAddOptions {
14
+ /**
15
+ * 乐观并发(CAS):调用方此前读到的版本号。
16
+ * 与存储中的实际版本不一致时抛 HistoryVersionConflictError,且不写入任何消息。
17
+ * 只有实现了 getVersion 的存储才支持该选项;不支持版本的旧实现会忽略它。
18
+ */
19
+ expectedVersion?: number;
20
+ }
21
+ /**
22
+ * 并发契约(使用说明):
23
+ *
24
+ * - 进程内:Agent 的 session queue(src/agent/Agent.ts)已把同一会话的运行
25
+ * 串行化,单实例部署无需额外保护。
26
+ * - 多实例共享同一持久化后端时,进程内队列不再有效,写入方应使用
27
+ * getVersion + expectedVersion 做 CAS 重试:
28
+ *
29
+ * const version = (await history.getVersion?.()) ?? 0;
30
+ * // ...基于当前历史构造要追加的消息...
31
+ * try {
32
+ * await history.addMany(messages, { expectedVersion: version });
33
+ * } catch (error) {
34
+ * if (error instanceof HistoryVersionConflictError) {
35
+ * // 版本已过期:重新 getVersion/get 之后重试
36
+ * }
37
+ * }
38
+ *
39
+ * getVersion 与 expectedVersion 都是可选能力:只实现两参数 addMany 的旧实现
40
+ * 依旧满足本接口(方法参数是双变的),行为退化为无并发保护。
41
+ */
3
42
  export interface MessageHistory {
4
43
  add(message: Message): Promise<void>;
5
- addMany(messages: Message[]): Promise<void>;
6
- get(): Promise<Message[]>;
44
+ addMany(messages: Message[], options?: MessageHistoryAddOptions): Promise<void>;
45
+ get(options?: MessageHistoryGetOptions): Promise<Message[]>;
7
46
  clear(): Promise<void>;
47
+ /**
48
+ * 可选能力:当前会话版本号。0 表示尚无成功写入;每次成功写入 +1。
49
+ */
50
+ getVersion?(): Promise<number>;
8
51
  }
9
52
  export interface MessageHistoryStore {
10
53
  get(sessionId: string): MessageHistory;
@@ -13,4 +56,14 @@ export interface MessageHistoryStore {
13
56
  clearAll?(): Promise<void>;
14
57
  }
15
58
  export declare function normalizeSessionId(sessionId: string | undefined): string;
59
+ export declare function applyMessageHistoryWindow(messages: readonly Message[], options?: MessageHistoryGetOptions): Message[];
60
+ /**
61
+ * 校验并解析 get({ before }) 游标。
62
+ * 导出给 SQL 侧实现窗口语义的持久化存储复用,保证报错行为与内存实现一致。
63
+ */
64
+ export declare function parseMessageHistoryBefore(before: string | Date): Date;
65
+ /**
66
+ * 校验 get({ limit }) 参数,非法值抛 invalid_history_window。
67
+ */
68
+ export declare function assertValidMessageHistoryLimit(limit: number): void;
16
69
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/history/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC3B,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAChC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACvC,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGxE"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/history/base.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,MAAM,WAAW,wBAAwB;IACrC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACrC;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,cAAc;IAC3B,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,GAAG,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB;;OAEG;IACH,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAChC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACvC,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,aAAa,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGxE;AAED,wBAAgB,yBAAyB,CACrC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,OAAO,GAAE,wBAA6B,GACvC,OAAO,EAAE,CAiBX;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAarE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CASlE"}
@@ -2,9 +2,58 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_SESSION_ID = void 0;
4
4
  exports.normalizeSessionId = normalizeSessionId;
5
+ exports.applyMessageHistoryWindow = applyMessageHistoryWindow;
6
+ exports.parseMessageHistoryBefore = parseMessageHistoryBefore;
7
+ exports.assertValidMessageHistoryLimit = assertValidMessageHistoryLimit;
8
+ const errors_1 = require("../errors");
9
+ const tool_pairing_1 = require("./tool-pairing");
5
10
  exports.DEFAULT_SESSION_ID = 'default';
6
11
  function normalizeSessionId(sessionId) {
7
12
  const trimmedSessionId = sessionId?.trim();
8
13
  return trimmedSessionId ? trimmedSessionId : exports.DEFAULT_SESSION_ID;
9
14
  }
15
+ function applyMessageHistoryWindow(messages, options = {}) {
16
+ let result = [...messages];
17
+ if (options.before !== undefined) {
18
+ const beforeMs = parseMessageHistoryBefore(options.before).getTime();
19
+ result = result.filter((message) => message.timestamp.getTime() < beforeMs);
20
+ }
21
+ if (options.limit !== undefined) {
22
+ assertValidMessageHistoryLimit(options.limit);
23
+ result = options.limit === 0 ? [] : result.slice(-options.limit);
24
+ // 切片可能砍在 assistant(toolCalls)/tool 配对中间,
25
+ // 与 addMany 溢出截断保持同一不变量。
26
+ (0, tool_pairing_1.repairLeadingToolContext)(result);
27
+ }
28
+ return result;
29
+ }
30
+ /**
31
+ * 校验并解析 get({ before }) 游标。
32
+ * 导出给 SQL 侧实现窗口语义的持久化存储复用,保证报错行为与内存实现一致。
33
+ */
34
+ function parseMessageHistoryBefore(before) {
35
+ const date = before instanceof Date ? before : new Date(before);
36
+ if (Number.isNaN(date.getTime())) {
37
+ throw new errors_1.HistoryError('Message history before cursor must be a valid timestamp.', {
38
+ code: 'invalid_history_window',
39
+ metadata: {
40
+ field: 'before',
41
+ },
42
+ });
43
+ }
44
+ return date;
45
+ }
46
+ /**
47
+ * 校验 get({ limit }) 参数,非法值抛 invalid_history_window。
48
+ */
49
+ function assertValidMessageHistoryLimit(limit) {
50
+ if (!Number.isInteger(limit) || limit < 0) {
51
+ throw new errors_1.HistoryError('Message history limit must be a non-negative integer.', {
52
+ code: 'invalid_history_window',
53
+ metadata: {
54
+ field: 'limit',
55
+ },
56
+ });
57
+ }
58
+ }
10
59
  //# sourceMappingURL=base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/history/base.ts"],"names":[],"mappings":";;;AAkBA,gDAGC;AAnBY,QAAA,kBAAkB,GAAG,SAAS,CAAC;AAgB5C,SAAgB,kBAAkB,CAAC,SAA6B;IAC5D,MAAM,gBAAgB,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3C,OAAO,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,0BAAkB,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/history/base.ts"],"names":[],"mappings":";;;AAiEA,gDAGC;AAED,8DAoBC;AAMD,8DAaC;AAKD,wEASC;AA3HD,sCAAyC;AAEzC,iDAA0D;AAE7C,QAAA,kBAAkB,GAAG,SAAS,CAAC;AA6D5C,SAAgB,kBAAkB,CAAC,SAA6B;IAC5D,MAAM,gBAAgB,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;IAC3C,OAAO,gBAAgB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,0BAAkB,CAAC;AACpE,CAAC;AAED,SAAgB,yBAAyB,CACrC,QAA4B,EAC5B,UAAoC,EAAE;IAEtC,IAAI,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QACrE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,8BAA8B,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,GAAG,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjE,yCAAyC;QACzC,yBAAyB;QACzB,IAAA,uCAAwB,EAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,MAAqB;IAC3D,MAAM,IAAI,GAAG,MAAM,YAAY,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,qBAAY,CAAC,0DAA0D,EAAE;YAC/E,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE;gBACN,KAAK,EAAE,QAAQ;aAClB;SACJ,CAAC,CAAC;IACP,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,8BAA8B,CAAC,KAAa;IACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,qBAAY,CAAC,uDAAuD,EAAE;YAC5E,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE;gBACN,KAAK,EAAE,OAAO;aACjB;SACJ,CAAC,CAAC;IACP,CAAC;AACL,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { ChatModel } from '../llm/types';
2
+ import { Message } from '../messages';
3
+ export interface ContextCompressorInput {
4
+ /**
5
+ * 因超出 token 预算而被截掉的旧消息(保持原始时间正序)。
6
+ */
7
+ dropped: Message[];
8
+ /**
9
+ * 截断后保留的消息,供压缩策略参考上下文;实现不应修改它。
10
+ */
11
+ kept: Message[];
12
+ /**
13
+ * 当前 Agent 的模型。压缩直接复用它,不引入额外的模型依赖。
14
+ */
15
+ llm: ChatModel;
16
+ signal?: AbortSignal | undefined;
17
+ }
18
+ /**
19
+ * 可插拔的历史压缩策略:超预算时把被截断的旧消息换成更省 token 的
20
+ * 前缀消息(通常是一条带 metadata.compressed 标记的摘要),而不是
21
+ * 直接丢弃。返回 [] 表示放弃压缩,等价于纯截断。
22
+ * 返回的前缀不得以 tool 消息开头(调用方拼接后还会跑一次配对修复兜底)。
23
+ */
24
+ export interface ContextCompressor {
25
+ compress(input: ContextCompressorInput): Promise<Message[]>;
26
+ }
27
+ export interface SummarizingContextCompressorOptions {
28
+ /**
29
+ * 摘要请求的 maxTokens 上限。摘要本身也占用输入预算,
30
+ * 所以默认给一个明显小于常见 maxInputTokens 的值。
31
+ */
32
+ maxSummaryTokens?: number;
33
+ /**
34
+ * 摘要指令(system prompt)。不提供时使用内置中文指令。
35
+ */
36
+ prompt?: string;
37
+ }
38
+ /**
39
+ * 用 LLM 把被截断的旧消息摘要成一条 user 消息。
40
+ * 设计约束:压缩是"尽力而为"的优化,llm 调用失败时必须降级为
41
+ * 纯截断(返回 [])而不是让主请求失败。
42
+ */
43
+ export declare class SummarizingContextCompressor implements ContextCompressor {
44
+ private readonly maxSummaryTokens;
45
+ private readonly prompt;
46
+ constructor(options?: SummarizingContextCompressorOptions);
47
+ compress(input: ContextCompressorInput): Promise<Message[]>;
48
+ }
49
+ //# sourceMappingURL=compression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/history/compression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAEH,OAAO,EACV,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,sBAAsB;IACnC;;OAEG;IACH,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB;;OAEG;IACH,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB;;OAEG;IACH,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CACpC;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,mCAAmC;IAChD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD;;;;GAIG;AACH,qBAAa,4BAA6B,YAAW,iBAAiB;IAClE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,GAAE,mCAAwC;IAKvD,QAAQ,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAmCpE"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SummarizingContextCompressor = void 0;
4
+ const messages_1 = require("../messages");
5
+ const DEFAULT_SUMMARY_PROMPT = '你是对话历史压缩器。请把下面被截断的早期对话压缩成一段简洁摘要,'
6
+ + '保留关键事实、结论、用户偏好和未完成的任务,不要添加评论或建议,直接输出摘要正文。';
7
+ /**
8
+ * 用 LLM 把被截断的旧消息摘要成一条 user 消息。
9
+ * 设计约束:压缩是"尽力而为"的优化,llm 调用失败时必须降级为
10
+ * 纯截断(返回 [])而不是让主请求失败。
11
+ */
12
+ class SummarizingContextCompressor {
13
+ maxSummaryTokens;
14
+ prompt;
15
+ constructor(options = {}) {
16
+ this.maxSummaryTokens = options.maxSummaryTokens ?? 512;
17
+ this.prompt = options.prompt ?? DEFAULT_SUMMARY_PROMPT;
18
+ }
19
+ async compress(input) {
20
+ if (input.dropped.length === 0) {
21
+ return [];
22
+ }
23
+ // 摘要输入用纯文本视图并标注角色,避免把 tool 配对结构带进请求。
24
+ const transcript = input.dropped
25
+ .map((message) => `[${message.role}] ${(0, messages_1.contentToText)(message.content)}`)
26
+ .join('\n');
27
+ try {
28
+ const response = await input.llm.chat({
29
+ messages: [
30
+ new messages_1.Message(this.prompt, 'system').toChatMessage(),
31
+ new messages_1.Message(transcript, 'user').toChatMessage(),
32
+ ],
33
+ maxTokens: this.maxSummaryTokens,
34
+ ...(input.signal !== undefined ? { signal: input.signal } : {}),
35
+ });
36
+ const summary = response.content.trim();
37
+ if (summary.length === 0) {
38
+ return [];
39
+ }
40
+ return [
41
+ new messages_1.Message(summary, 'user', {
42
+ metadata: { compressed: true },
43
+ }),
44
+ ];
45
+ }
46
+ catch {
47
+ // 压缩失败不应影响主请求:降级为纯截断。
48
+ return [];
49
+ }
50
+ }
51
+ }
52
+ exports.SummarizingContextCompressor = SummarizingContextCompressor;
53
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/history/compression.ts"],"names":[],"mappings":";;;AACA,0CAGqB;AAwCrB,MAAM,sBAAsB,GAAG,kCAAkC;MAC3D,2CAA2C,CAAC;AAElD;;;;GAIG;AACH,MAAa,4BAA4B;IACpB,gBAAgB,CAAS;IACzB,MAAM,CAAS;IAEhC,YAAY,UAA+C,EAAE;QACzD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,sBAAsB,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAA6B;QACxC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACd,CAAC;QAED,qCAAqC;QACrC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO;aAC3B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAA,wBAAa,EAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aACvE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhB,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;gBAClC,QAAQ,EAAE;oBACN,IAAI,kBAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,aAAa,EAAE;oBAClD,IAAI,kBAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,aAAa,EAAE;iBAClD;gBACD,SAAS,EAAE,IAAI,CAAC,gBAAgB;gBAChC,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,CAAC;YACd,CAAC;YAED,OAAO;gBACH,IAAI,kBAAO,CAAC,OAAO,EAAE,MAAM,EAAE;oBACzB,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;iBACjC,CAAC;aACL,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACL,sBAAsB;YACtB,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;CACJ;AA5CD,oEA4CC"}