langchain 1.0.0-alpha.3 → 1.0.0-alpha.5

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 (201) hide show
  1. package/dist/agents/ReactAgent.cjs +1 -1
  2. package/dist/agents/ReactAgent.cjs.map +1 -1
  3. package/dist/agents/ReactAgent.d.cts +3 -3
  4. package/dist/agents/ReactAgent.d.cts.map +1 -1
  5. package/dist/agents/ReactAgent.d.ts +3 -3
  6. package/dist/agents/ReactAgent.d.ts.map +1 -1
  7. package/dist/agents/ReactAgent.js +2 -2
  8. package/dist/agents/ReactAgent.js.map +1 -1
  9. package/dist/agents/RunnableCallable.cjs +5 -0
  10. package/dist/agents/RunnableCallable.cjs.map +1 -1
  11. package/dist/agents/RunnableCallable.d.cts +2 -0
  12. package/dist/agents/RunnableCallable.d.cts.map +1 -1
  13. package/dist/agents/RunnableCallable.d.ts +2 -0
  14. package/dist/agents/RunnableCallable.d.ts.map +1 -1
  15. package/dist/agents/RunnableCallable.js +5 -0
  16. package/dist/agents/RunnableCallable.js.map +1 -1
  17. package/dist/agents/annotation.cjs +2 -2
  18. package/dist/agents/annotation.cjs.map +1 -1
  19. package/dist/agents/annotation.d.cts +4 -4
  20. package/dist/agents/annotation.d.cts.map +1 -1
  21. package/dist/agents/annotation.d.ts +3 -3
  22. package/dist/agents/annotation.d.ts.map +1 -1
  23. package/dist/agents/annotation.js +2 -2
  24. package/dist/agents/annotation.js.map +1 -1
  25. package/dist/agents/createAgent.cjs +10 -0
  26. package/dist/agents/createAgent.cjs.map +1 -0
  27. package/dist/agents/createAgent.js +10 -0
  28. package/dist/agents/createAgent.js.map +1 -0
  29. package/dist/agents/errors.cjs +1 -1
  30. package/dist/agents/errors.cjs.map +1 -1
  31. package/dist/agents/errors.js +1 -1
  32. package/dist/agents/errors.js.map +1 -1
  33. package/dist/agents/index.cjs +23 -4
  34. package/dist/agents/index.cjs.map +1 -1
  35. package/dist/agents/index.d.cts +96 -33
  36. package/dist/agents/index.d.cts.map +1 -1
  37. package/dist/agents/index.d.ts +96 -33
  38. package/dist/agents/index.d.ts.map +1 -1
  39. package/dist/agents/index.js +23 -4
  40. package/dist/agents/index.js.map +1 -1
  41. package/dist/agents/middlewareAgent/ReactAgent.cjs +255 -0
  42. package/dist/agents/middlewareAgent/ReactAgent.cjs.map +1 -0
  43. package/dist/agents/middlewareAgent/ReactAgent.d.cts +68 -0
  44. package/dist/agents/middlewareAgent/ReactAgent.d.cts.map +1 -0
  45. package/dist/agents/middlewareAgent/ReactAgent.d.ts +68 -0
  46. package/dist/agents/middlewareAgent/ReactAgent.d.ts.map +1 -0
  47. package/dist/agents/middlewareAgent/ReactAgent.js +254 -0
  48. package/dist/agents/middlewareAgent/ReactAgent.js.map +1 -0
  49. package/dist/agents/middlewareAgent/annotation.cjs +39 -0
  50. package/dist/agents/middlewareAgent/annotation.cjs.map +1 -0
  51. package/dist/agents/middlewareAgent/annotation.js +38 -0
  52. package/dist/agents/middlewareAgent/annotation.js.map +1 -0
  53. package/dist/agents/middlewareAgent/index.cjs +11 -0
  54. package/dist/agents/middlewareAgent/index.cjs.map +1 -0
  55. package/dist/agents/middlewareAgent/index.js +11 -0
  56. package/dist/agents/middlewareAgent/index.js.map +1 -0
  57. package/dist/agents/middlewareAgent/middleware.cjs +47 -0
  58. package/dist/agents/middlewareAgent/middleware.cjs.map +1 -0
  59. package/dist/agents/middlewareAgent/middleware.d.cts +46 -0
  60. package/dist/agents/middlewareAgent/middleware.d.cts.map +1 -0
  61. package/dist/agents/middlewareAgent/middleware.d.ts +46 -0
  62. package/dist/agents/middlewareAgent/middleware.d.ts.map +1 -0
  63. package/dist/agents/middlewareAgent/middleware.js +46 -0
  64. package/dist/agents/middlewareAgent/middleware.js.map +1 -0
  65. package/dist/agents/middlewareAgent/middlewares/hitl.cjs +235 -0
  66. package/dist/agents/middlewareAgent/middlewares/hitl.cjs.map +1 -0
  67. package/dist/agents/middlewareAgent/middlewares/hitl.d.cts +199 -0
  68. package/dist/agents/middlewareAgent/middlewares/hitl.d.cts.map +1 -0
  69. package/dist/agents/middlewareAgent/middlewares/hitl.d.ts +199 -0
  70. package/dist/agents/middlewareAgent/middlewares/hitl.d.ts.map +1 -0
  71. package/dist/agents/middlewareAgent/middlewares/hitl.js +234 -0
  72. package/dist/agents/middlewareAgent/middlewares/hitl.js.map +1 -0
  73. package/dist/agents/middlewareAgent/middlewares/index.cjs +8 -0
  74. package/dist/agents/middlewareAgent/middlewares/index.d.cts +4 -0
  75. package/dist/agents/middlewareAgent/middlewares/index.d.ts +4 -0
  76. package/dist/agents/middlewareAgent/middlewares/index.js +5 -0
  77. package/dist/agents/middlewareAgent/middlewares/promptCaching.cjs +153 -0
  78. package/dist/agents/middlewareAgent/middlewares/promptCaching.cjs.map +1 -0
  79. package/dist/agents/middlewareAgent/middlewares/promptCaching.d.cts +152 -0
  80. package/dist/agents/middlewareAgent/middlewares/promptCaching.d.cts.map +1 -0
  81. package/dist/agents/middlewareAgent/middlewares/promptCaching.d.ts +152 -0
  82. package/dist/agents/middlewareAgent/middlewares/promptCaching.d.ts.map +1 -0
  83. package/dist/agents/middlewareAgent/middlewares/promptCaching.js +152 -0
  84. package/dist/agents/middlewareAgent/middlewares/promptCaching.js.map +1 -0
  85. package/dist/agents/middlewareAgent/middlewares/summarization.cjs +262 -0
  86. package/dist/agents/middlewareAgent/middlewares/summarization.cjs.map +1 -0
  87. package/dist/agents/middlewareAgent/middlewares/summarization.d.cts +89 -0
  88. package/dist/agents/middlewareAgent/middlewares/summarization.d.cts.map +1 -0
  89. package/dist/agents/middlewareAgent/middlewares/summarization.d.ts +89 -0
  90. package/dist/agents/middlewareAgent/middlewares/summarization.d.ts.map +1 -0
  91. package/dist/agents/middlewareAgent/middlewares/summarization.js +260 -0
  92. package/dist/agents/middlewareAgent/middlewares/summarization.js.map +1 -0
  93. package/dist/agents/middlewareAgent/nodes/AfterModalNode.cjs +29 -0
  94. package/dist/agents/middlewareAgent/nodes/AfterModalNode.cjs.map +1 -0
  95. package/dist/agents/middlewareAgent/nodes/AfterModalNode.js +29 -0
  96. package/dist/agents/middlewareAgent/nodes/AfterModalNode.js.map +1 -0
  97. package/dist/agents/middlewareAgent/nodes/AgentNode.cjs +332 -0
  98. package/dist/agents/middlewareAgent/nodes/AgentNode.cjs.map +1 -0
  99. package/dist/agents/middlewareAgent/nodes/AgentNode.js +331 -0
  100. package/dist/agents/middlewareAgent/nodes/AgentNode.js.map +1 -0
  101. package/dist/agents/middlewareAgent/nodes/BeforeModalNode.cjs +27 -0
  102. package/dist/agents/middlewareAgent/nodes/BeforeModalNode.cjs.map +1 -0
  103. package/dist/agents/middlewareAgent/nodes/BeforeModalNode.js +27 -0
  104. package/dist/agents/middlewareAgent/nodes/BeforeModalNode.js.map +1 -0
  105. package/dist/agents/middlewareAgent/nodes/middleware.cjs +73 -0
  106. package/dist/agents/middlewareAgent/nodes/middleware.cjs.map +1 -0
  107. package/dist/agents/middlewareAgent/nodes/middleware.js +73 -0
  108. package/dist/agents/middlewareAgent/nodes/middleware.js.map +1 -0
  109. package/dist/agents/middlewareAgent/nodes/utils.cjs +74 -0
  110. package/dist/agents/middlewareAgent/nodes/utils.cjs.map +1 -0
  111. package/dist/agents/middlewareAgent/nodes/utils.js +70 -0
  112. package/dist/agents/middlewareAgent/nodes/utils.js.map +1 -0
  113. package/dist/agents/middlewareAgent/types.d.cts +393 -0
  114. package/dist/agents/middlewareAgent/types.d.cts.map +1 -0
  115. package/dist/agents/middlewareAgent/types.d.ts +393 -0
  116. package/dist/agents/middlewareAgent/types.d.ts.map +1 -0
  117. package/dist/agents/nodes/AgentNode.cjs.map +1 -1
  118. package/dist/agents/nodes/AgentNode.js.map +1 -1
  119. package/dist/agents/nodes/ToolNode.cjs +1 -1
  120. package/dist/agents/nodes/ToolNode.cjs.map +1 -1
  121. package/dist/agents/nodes/ToolNode.d.cts +4 -4
  122. package/dist/agents/nodes/ToolNode.d.cts.map +1 -1
  123. package/dist/agents/nodes/ToolNode.d.ts +1 -1
  124. package/dist/agents/nodes/ToolNode.d.ts.map +1 -1
  125. package/dist/agents/nodes/ToolNode.js +1 -1
  126. package/dist/agents/nodes/ToolNode.js.map +1 -1
  127. package/dist/agents/responses.cjs +1 -1
  128. package/dist/agents/responses.cjs.map +1 -1
  129. package/dist/agents/responses.d.cts +1 -1
  130. package/dist/agents/responses.d.cts.map +1 -1
  131. package/dist/agents/responses.d.ts +1 -1
  132. package/dist/agents/responses.d.ts.map +1 -1
  133. package/dist/agents/responses.js +1 -1
  134. package/dist/agents/responses.js.map +1 -1
  135. package/dist/agents/types.d.cts +12 -12
  136. package/dist/agents/types.d.cts.map +1 -1
  137. package/dist/agents/types.d.ts +8 -8
  138. package/dist/agents/types.d.ts.map +1 -1
  139. package/dist/agents/utils.cjs +1 -1
  140. package/dist/agents/utils.cjs.map +1 -1
  141. package/dist/agents/utils.js +1 -1
  142. package/dist/agents/utils.js.map +1 -1
  143. package/dist/agents/withAgentName.cjs +1 -1
  144. package/dist/agents/withAgentName.cjs.map +1 -1
  145. package/dist/agents/withAgentName.js +1 -1
  146. package/dist/agents/withAgentName.js.map +1 -1
  147. package/dist/chains/api/api_chain.d.cts +1 -1
  148. package/dist/chains/base.d.cts +1 -1
  149. package/dist/chains/combine_docs_chain.d.cts +1 -1
  150. package/dist/chains/combine_documents/stuff.d.cts +1 -1
  151. package/dist/chains/conversational_retrieval_chain.d.cts +1 -1
  152. package/dist/chains/graph_qa/cypher.d.cts +1 -1
  153. package/dist/chains/history_aware_retriever.d.cts +2 -2
  154. package/dist/chains/llm_chain.d.cts +3 -3
  155. package/dist/chains/openai_functions/base.d.cts +3 -3
  156. package/dist/chains/openai_functions/openapi.d.cts +1 -1
  157. package/dist/chains/openai_functions/structured_output.d.cts +3 -3
  158. package/dist/chains/openai_functions/tagging.d.cts +1 -1
  159. package/dist/chains/query_constructor/index.cjs +1 -1
  160. package/dist/chains/query_constructor/index.d.cts +2 -2
  161. package/dist/chains/query_constructor/index.d.ts +1 -1
  162. package/dist/chains/query_constructor/index.js +1 -1
  163. package/dist/chains/question_answering/load.d.ts +2 -2
  164. package/dist/chains/question_answering/load.d.ts.map +1 -1
  165. package/dist/chains/retrieval.d.cts +1 -1
  166. package/dist/chains/router/llm_router.d.cts +1 -1
  167. package/dist/chains/router/multi_prompt.cjs +1 -1
  168. package/dist/chains/router/multi_prompt.js +1 -1
  169. package/dist/chains/router/multi_retrieval_qa.cjs +1 -1
  170. package/dist/chains/router/multi_retrieval_qa.js +1 -1
  171. package/dist/chains/sql_db/sql_db_chain.d.cts +2 -2
  172. package/dist/chains/summarization/load.d.ts +2 -2
  173. package/dist/chains/summarization/load.d.ts.map +1 -1
  174. package/dist/chat_models/universal.d.cts +3 -3
  175. package/dist/evaluation/agents/trajectory.d.cts +3 -3
  176. package/dist/evaluation/agents/trajectory.d.ts.map +1 -1
  177. package/dist/evaluation/comparison/pairwise.d.cts +1 -1
  178. package/dist/evaluation/comparison/pairwise.d.ts.map +1 -1
  179. package/dist/evaluation/criteria/criteria.d.cts +1 -1
  180. package/dist/evaluation/qa/eval_chain.d.cts +1 -1
  181. package/dist/index.cjs +5 -2
  182. package/dist/index.cjs.map +1 -1
  183. package/dist/index.d.cts +6 -5
  184. package/dist/index.d.ts +4 -3
  185. package/dist/index.js +5 -3
  186. package/dist/index.js.map +1 -1
  187. package/dist/load/import_map.cjs +1 -1
  188. package/dist/load/import_map.js +1 -1
  189. package/dist/memory/summary.d.cts +1 -1
  190. package/dist/output_parsers/fix.d.cts +1 -1
  191. package/dist/output_parsers/http_response.d.cts +1 -1
  192. package/dist/output_parsers/structured.cjs +1 -1
  193. package/dist/output_parsers/structured.d.cts +2 -2
  194. package/dist/output_parsers/structured.d.ts +1 -1
  195. package/dist/output_parsers/structured.js +1 -1
  196. package/dist/tools/fs.d.cts +1 -1
  197. package/dist/tools/json.d.cts +1 -1
  198. package/dist/tools/retriever.d.cts +1 -1
  199. package/dist/tools/vectorstore.d.cts +1 -1
  200. package/dist/tools/webbrowser.d.cts +1 -1
  201. package/package.json +14 -3
@@ -0,0 +1,260 @@
1
+ import { createMiddleware } from "../middleware.js";
2
+ import { RemoveMessage, SystemMessage, isAIMessage, isSystemMessage, isToolMessage, trimMessages } from "@langchain/core/messages";
3
+ import { REMOVE_ALL_MESSAGES } from "@langchain/langgraph";
4
+ import { z } from "zod";
5
+ import { v4 } from "uuid";
6
+
7
+ //#region src/agents/middlewareAgent/middlewares/summarization.ts
8
+ const DEFAULT_SUMMARY_PROMPT = `<role>
9
+ Context Extraction Assistant
10
+ </role>
11
+
12
+ <primary_objective>
13
+ Your sole objective in this task is to extract the highest quality/most relevant context from the conversation history below.
14
+ </primary_objective>
15
+
16
+ <objective_information>
17
+ You're nearing the total number of input tokens you can accept, so you must extract the highest quality/most relevant pieces of information from your conversation history.
18
+ This context will then overwrite the conversation history presented below. Because of this, ensure the context you extract is only the most important information to your overall goal.
19
+ </objective_information>
20
+
21
+ <instructions>
22
+ The conversation history below will be replaced with the context you extract in this step. Because of this, you must do your very best to extract and record all of the most important context from the conversation history.
23
+ You want to ensure that you don't repeat any actions you've already completed, so the context you extract from the conversation history should be focused on the most important information to your overall goal.
24
+ </instructions>
25
+
26
+ The user will message you with the full message history you'll be extracting context from, to then replace. Carefully read over it all, and think deeply about what information is most important to your overall goal that should be saved:
27
+
28
+ With all of this in mind, please carefully read over the entire conversation history, and extract the most important and relevant context to replace it so that you can free up space in the conversation history.
29
+ Respond ONLY with the extracted context. Do not include any additional information, or text before or after the extracted context.
30
+
31
+ <messages>
32
+ Messages to summarize:
33
+ {messages}
34
+ </messages>`;
35
+ const SUMMARY_PREFIX = "## Previous conversation summary:";
36
+ const DEFAULT_MESSAGES_TO_KEEP = 20;
37
+ const DEFAULT_TRIM_TOKEN_LIMIT = 4e3;
38
+ const DEFAULT_FALLBACK_MESSAGE_COUNT = 15;
39
+ const SEARCH_RANGE_FOR_TOOL_PAIRS = 5;
40
+ const contextSchema = z.object({
41
+ model: z.custom(),
42
+ maxTokensBeforeSummary: z.number().optional(),
43
+ messagesToKeep: z.number().default(DEFAULT_MESSAGES_TO_KEEP),
44
+ tokenCounter: z.function().args(z.array(z.any())).returns(z.union([z.number(), z.promise(z.number())])).optional(),
45
+ summaryPrompt: z.string().default(DEFAULT_SUMMARY_PROMPT),
46
+ summaryPrefix: z.string().default(SUMMARY_PREFIX)
47
+ });
48
+ /**
49
+ * Default token counter that approximates based on character count
50
+ * @param messages Messages to count tokens for
51
+ * @returns Approximate token count
52
+ */
53
+ function countTokensApproximately(messages) {
54
+ let totalChars = 0;
55
+ for (const msg of messages) {
56
+ let textContent;
57
+ if (typeof msg.content === "string") textContent = msg.content;
58
+ else if (Array.isArray(msg.content)) textContent = msg.content.map((item) => {
59
+ if (typeof item === "string") return item;
60
+ if (item.type === "text" && "text" in item) return item.text;
61
+ return "";
62
+ }).join("");
63
+ else textContent = "";
64
+ totalChars += textContent.length;
65
+ }
66
+ return Math.ceil(totalChars / 4);
67
+ }
68
+ /**
69
+ * Summarization middleware that automatically summarizes conversation history when token limits are approached.
70
+ *
71
+ * This middleware monitors message token counts and automatically summarizes older
72
+ * messages when a threshold is reached, preserving recent messages and maintaining
73
+ * context continuity by ensuring AI/Tool message pairs remain together.
74
+ *
75
+ * @param options Configuration options for the summarization middleware
76
+ * @returns A middleware instance
77
+ *
78
+ * @example
79
+ * ```ts
80
+ * import { summarizationMiddleware } from "langchain/middleware";
81
+ * import { createAgent } from "langchain";
82
+ *
83
+ * const agent = createAgent({
84
+ * llm: model,
85
+ * tools: [getWeather],
86
+ * middlewares: [
87
+ * summarizationMiddleware({
88
+ * model: new ChatOpenAI({ model: "gpt-4o" }),
89
+ * maxTokensBeforeSummary: 4000,
90
+ * messagesToKeep: 20,
91
+ * })
92
+ * ],
93
+ * });
94
+ *
95
+ * ```
96
+ */
97
+ function summarizationMiddleware(options) {
98
+ return createMiddleware({
99
+ name: "SummarizationMiddleware",
100
+ contextSchema,
101
+ beforeModel: async (state, runtime) => {
102
+ const config = {
103
+ ...contextSchema.parse(options),
104
+ ...runtime.context
105
+ };
106
+ const { messages } = state;
107
+ ensureMessageIds(messages);
108
+ const tokenCounter = config.tokenCounter || countTokensApproximately;
109
+ const totalTokens = await tokenCounter(messages);
110
+ if (config.maxTokensBeforeSummary == null || totalTokens < config.maxTokensBeforeSummary) return;
111
+ const { systemMessage, conversationMessages } = splitSystemMessage(messages);
112
+ const cutoffIndex = findSafeCutoff(conversationMessages, config.messagesToKeep);
113
+ if (cutoffIndex <= 0) return;
114
+ const { messagesToSummarize, preservedMessages } = partitionMessages(systemMessage, conversationMessages, cutoffIndex);
115
+ const summary = await createSummary(messagesToSummarize, config.model, config.summaryPrompt, tokenCounter);
116
+ const updatedSystemMessage = buildUpdatedSystemMessage(systemMessage, summary, config.summaryPrefix);
117
+ return { messages: [
118
+ new RemoveMessage({ id: REMOVE_ALL_MESSAGES }),
119
+ updatedSystemMessage,
120
+ ...preservedMessages
121
+ ] };
122
+ }
123
+ });
124
+ }
125
+ /**
126
+ * Ensure all messages have unique IDs
127
+ */
128
+ function ensureMessageIds(messages) {
129
+ for (const msg of messages) if (!msg.id) msg.id = v4();
130
+ }
131
+ /**
132
+ * Separate system message from conversation messages
133
+ */
134
+ function splitSystemMessage(messages) {
135
+ if (messages.length > 0 && isSystemMessage(messages[0])) return {
136
+ systemMessage: messages[0],
137
+ conversationMessages: messages.slice(1)
138
+ };
139
+ return {
140
+ systemMessage: null,
141
+ conversationMessages: messages
142
+ };
143
+ }
144
+ /**
145
+ * Partition messages into those to summarize and those to preserve
146
+ */
147
+ function partitionMessages(systemMessage, conversationMessages, cutoffIndex) {
148
+ const messagesToSummarize = conversationMessages.slice(0, cutoffIndex);
149
+ const preservedMessages = conversationMessages.slice(cutoffIndex);
150
+ if (systemMessage) messagesToSummarize.unshift(systemMessage);
151
+ return {
152
+ messagesToSummarize,
153
+ preservedMessages
154
+ };
155
+ }
156
+ /**
157
+ * Build updated system message incorporating the summary
158
+ */
159
+ function buildUpdatedSystemMessage(originalSystemMessage, summary, summaryPrefix) {
160
+ let originalContent = "";
161
+ if (originalSystemMessage) {
162
+ const { content: content$1 } = originalSystemMessage;
163
+ if (typeof content$1 === "string") originalContent = content$1.split(summaryPrefix)[0].trim();
164
+ }
165
+ const content = originalContent ? `${originalContent}\n${summaryPrefix}\n${summary}` : `${summaryPrefix}\n${summary}`;
166
+ return new SystemMessage({
167
+ content,
168
+ id: originalSystemMessage?.id || v4()
169
+ });
170
+ }
171
+ /**
172
+ * Find safe cutoff point that preserves AI/Tool message pairs
173
+ */
174
+ function findSafeCutoff(messages, messagesToKeep) {
175
+ if (messages.length <= messagesToKeep) return 0;
176
+ const targetCutoff = messages.length - messagesToKeep;
177
+ for (let i = targetCutoff; i >= 0; i--) if (isSafeCutoffPoint(messages, i)) return i;
178
+ return 0;
179
+ }
180
+ /**
181
+ * Check if cutting at index would separate AI/Tool message pairs
182
+ */
183
+ function isSafeCutoffPoint(messages, cutoffIndex) {
184
+ if (cutoffIndex >= messages.length) return true;
185
+ const searchStart = Math.max(0, cutoffIndex - SEARCH_RANGE_FOR_TOOL_PAIRS);
186
+ const searchEnd = Math.min(messages.length, cutoffIndex + SEARCH_RANGE_FOR_TOOL_PAIRS);
187
+ for (let i = searchStart; i < searchEnd; i++) {
188
+ if (!hasToolCalls(messages[i])) continue;
189
+ const toolCallIds = extractToolCallIds(messages[i]);
190
+ if (cutoffSeparatesToolPair(messages, i, cutoffIndex, toolCallIds)) return false;
191
+ }
192
+ return true;
193
+ }
194
+ /**
195
+ * Check if message is an AI message with tool calls
196
+ */
197
+ function hasToolCalls(message) {
198
+ return isAIMessage(message) && "tool_calls" in message && Array.isArray(message.tool_calls) && message.tool_calls.length > 0;
199
+ }
200
+ /**
201
+ * Extract tool call IDs from an AI message
202
+ */
203
+ function extractToolCallIds(aiMessage) {
204
+ const toolCallIds = /* @__PURE__ */ new Set();
205
+ if (aiMessage.tool_calls) for (const toolCall of aiMessage.tool_calls) {
206
+ const id = typeof toolCall === "object" && "id" in toolCall ? toolCall.id : null;
207
+ if (id) toolCallIds.add(id);
208
+ }
209
+ return toolCallIds;
210
+ }
211
+ /**
212
+ * Check if cutoff separates an AI message from its corresponding tool messages
213
+ */
214
+ function cutoffSeparatesToolPair(messages, aiMessageIndex, cutoffIndex, toolCallIds) {
215
+ for (let j = aiMessageIndex + 1; j < messages.length; j++) {
216
+ const message = messages[j];
217
+ if (isToolMessage(message) && toolCallIds.has(message.tool_call_id)) {
218
+ const aiBeforeCutoff = aiMessageIndex < cutoffIndex;
219
+ const toolBeforeCutoff = j < cutoffIndex;
220
+ if (aiBeforeCutoff !== toolBeforeCutoff) return true;
221
+ }
222
+ }
223
+ return false;
224
+ }
225
+ /**
226
+ * Generate summary for the given messages
227
+ */
228
+ async function createSummary(messagesToSummarize, model, summaryPrompt, tokenCounter) {
229
+ if (!messagesToSummarize.length) return "No previous conversation history.";
230
+ const trimmedMessages = await trimMessagesForSummary(messagesToSummarize, tokenCounter);
231
+ if (!trimmedMessages.length) return "Previous conversation was too long to summarize.";
232
+ try {
233
+ const formattedPrompt = summaryPrompt.replace("{messages}", JSON.stringify(trimmedMessages, null, 2));
234
+ const response = await model.invoke(formattedPrompt);
235
+ const { content } = response;
236
+ return typeof content === "string" ? content.trim() : "Error generating summary: Invalid response format";
237
+ } catch (e) {
238
+ return `Error generating summary: ${e}`;
239
+ }
240
+ }
241
+ /**
242
+ * Trim messages to fit within summary generation limits
243
+ */
244
+ async function trimMessagesForSummary(messages, tokenCounter) {
245
+ try {
246
+ return await trimMessages(messages, {
247
+ maxTokens: DEFAULT_TRIM_TOKEN_LIMIT,
248
+ tokenCounter: async (msgs) => Promise.resolve(tokenCounter(msgs)),
249
+ strategy: "last",
250
+ allowPartial: true,
251
+ includeSystem: true
252
+ });
253
+ } catch (e) {
254
+ return messages.slice(-DEFAULT_FALLBACK_MESSAGE_COUNT);
255
+ }
256
+ }
257
+
258
+ //#endregion
259
+ export { countTokensApproximately, summarizationMiddleware };
260
+ //# sourceMappingURL=summarization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarization.js","names":["messages: BaseMessage[]","textContent: string","options: z.input<typeof contextSchema>","uuid","systemMessage: SystemMessage | null","conversationMessages: BaseMessage[]","cutoffIndex: number","originalSystemMessage: SystemMessage | null","summary: string","summaryPrefix: string","content","messagesToKeep: number","message: BaseMessage","aiMessage: AIMessage","aiMessageIndex: number","toolCallIds: Set<string>","messagesToSummarize: BaseMessage[]","model: BaseLanguageModel","summaryPrompt: string","tokenCounter: TokenCounter"],"sources":["../../../../src/agents/middlewareAgent/middlewares/summarization.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { v4 as uuid } from \"uuid\";\nimport {\n BaseMessage,\n AIMessage,\n SystemMessage,\n isToolMessage,\n RemoveMessage,\n trimMessages,\n isSystemMessage,\n isAIMessage,\n} from \"@langchain/core/messages\";\nimport { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport { REMOVE_ALL_MESSAGES } from \"@langchain/langgraph\";\nimport { createMiddleware } from \"../middleware.js\";\n\nconst DEFAULT_SUMMARY_PROMPT = `<role>\nContext Extraction Assistant\n</role>\n\n<primary_objective>\nYour sole objective in this task is to extract the highest quality/most relevant context from the conversation history below.\n</primary_objective>\n\n<objective_information>\nYou're nearing the total number of input tokens you can accept, so you must extract the highest quality/most relevant pieces of information from your conversation history.\nThis context will then overwrite the conversation history presented below. Because of this, ensure the context you extract is only the most important information to your overall goal.\n</objective_information>\n\n<instructions>\nThe conversation history below will be replaced with the context you extract in this step. Because of this, you must do your very best to extract and record all of the most important context from the conversation history.\nYou want to ensure that you don't repeat any actions you've already completed, so the context you extract from the conversation history should be focused on the most important information to your overall goal.\n</instructions>\n\nThe user will message you with the full message history you'll be extracting context from, to then replace. Carefully read over it all, and think deeply about what information is most important to your overall goal that should be saved:\n\nWith all of this in mind, please carefully read over the entire conversation history, and extract the most important and relevant context to replace it so that you can free up space in the conversation history.\nRespond ONLY with the extracted context. Do not include any additional information, or text before or after the extracted context.\n\n<messages>\nMessages to summarize:\n{messages}\n</messages>`;\n\nconst SUMMARY_PREFIX = \"## Previous conversation summary:\";\n\nconst DEFAULT_MESSAGES_TO_KEEP = 20;\nconst DEFAULT_TRIM_TOKEN_LIMIT = 4000;\nconst DEFAULT_FALLBACK_MESSAGE_COUNT = 15;\nconst SEARCH_RANGE_FOR_TOOL_PAIRS = 5;\n\ntype TokenCounter = (messages: BaseMessage[]) => number | Promise<number>;\n\nconst contextSchema = z.object({\n model: z.custom<BaseLanguageModel>(),\n maxTokensBeforeSummary: z.number().optional(),\n messagesToKeep: z.number().default(DEFAULT_MESSAGES_TO_KEEP),\n tokenCounter: z\n .function()\n .args(z.array(z.any()))\n .returns(z.union([z.number(), z.promise(z.number())]))\n .optional(),\n summaryPrompt: z.string().default(DEFAULT_SUMMARY_PROMPT),\n summaryPrefix: z.string().default(SUMMARY_PREFIX),\n});\n\n/**\n * Default token counter that approximates based on character count\n * @param messages Messages to count tokens for\n * @returns Approximate token count\n */\nexport function countTokensApproximately(messages: BaseMessage[]): number {\n let totalChars = 0;\n for (const msg of messages) {\n let textContent: string;\n if (typeof msg.content === \"string\") {\n textContent = msg.content;\n } else if (Array.isArray(msg.content)) {\n textContent = msg.content\n .map((item) => {\n if (typeof item === \"string\") return item;\n if (item.type === \"text\" && \"text\" in item) return item.text;\n return \"\";\n })\n .join(\"\");\n } else {\n textContent = \"\";\n }\n totalChars += textContent.length;\n }\n // Approximate 1 token = 4 characters\n return Math.ceil(totalChars / 4);\n}\n\n/**\n * Summarization middleware that automatically summarizes conversation history when token limits are approached.\n *\n * This middleware monitors message token counts and automatically summarizes older\n * messages when a threshold is reached, preserving recent messages and maintaining\n * context continuity by ensuring AI/Tool message pairs remain together.\n *\n * @param options Configuration options for the summarization middleware\n * @returns A middleware instance\n *\n * @example\n * ```ts\n * import { summarizationMiddleware } from \"langchain/middleware\";\n * import { createAgent } from \"langchain\";\n *\n * const agent = createAgent({\n * llm: model,\n * tools: [getWeather],\n * middlewares: [\n * summarizationMiddleware({\n * model: new ChatOpenAI({ model: \"gpt-4o\" }),\n * maxTokensBeforeSummary: 4000,\n * messagesToKeep: 20,\n * })\n * ],\n * });\n *\n * ```\n */\nexport function summarizationMiddleware(\n options: z.input<typeof contextSchema>\n) {\n return createMiddleware({\n name: \"SummarizationMiddleware\",\n contextSchema,\n beforeModel: async (state, runtime) => {\n const config = { ...contextSchema.parse(options), ...runtime.context };\n const { messages } = state;\n\n // Ensure all messages have IDs\n ensureMessageIds(messages);\n\n const tokenCounter = config.tokenCounter || countTokensApproximately;\n const totalTokens = await tokenCounter(messages);\n\n if (\n config.maxTokensBeforeSummary == null ||\n totalTokens < config.maxTokensBeforeSummary\n ) {\n return;\n }\n\n const { systemMessage, conversationMessages } =\n splitSystemMessage(messages);\n const cutoffIndex = findSafeCutoff(\n conversationMessages,\n config.messagesToKeep\n );\n\n if (cutoffIndex <= 0) {\n return;\n }\n\n const { messagesToSummarize, preservedMessages } = partitionMessages(\n systemMessage,\n conversationMessages,\n cutoffIndex\n );\n\n const summary = await createSummary(\n messagesToSummarize,\n config.model,\n config.summaryPrompt,\n tokenCounter\n );\n\n const updatedSystemMessage = buildUpdatedSystemMessage(\n systemMessage,\n summary,\n config.summaryPrefix\n );\n\n return {\n messages: [\n new RemoveMessage({ id: REMOVE_ALL_MESSAGES }),\n updatedSystemMessage,\n ...preservedMessages,\n ],\n };\n },\n });\n}\n\n/**\n * Ensure all messages have unique IDs\n */\nfunction ensureMessageIds(messages: BaseMessage[]): void {\n for (const msg of messages) {\n if (!msg.id) {\n msg.id = uuid();\n }\n }\n}\n\n/**\n * Separate system message from conversation messages\n */\nfunction splitSystemMessage(messages: BaseMessage[]): {\n systemMessage: SystemMessage | null;\n conversationMessages: BaseMessage[];\n} {\n if (messages.length > 0 && isSystemMessage(messages[0])) {\n return {\n systemMessage: messages[0] as SystemMessage,\n conversationMessages: messages.slice(1),\n };\n }\n return {\n systemMessage: null,\n conversationMessages: messages,\n };\n}\n\n/**\n * Partition messages into those to summarize and those to preserve\n */\nfunction partitionMessages(\n systemMessage: SystemMessage | null,\n conversationMessages: BaseMessage[],\n cutoffIndex: number\n): { messagesToSummarize: BaseMessage[]; preservedMessages: BaseMessage[] } {\n const messagesToSummarize = conversationMessages.slice(0, cutoffIndex);\n const preservedMessages = conversationMessages.slice(cutoffIndex);\n\n // Include system message in messages to summarize to capture previous summaries\n if (systemMessage) {\n messagesToSummarize.unshift(systemMessage);\n }\n\n return { messagesToSummarize, preservedMessages };\n}\n\n/**\n * Build updated system message incorporating the summary\n */\nfunction buildUpdatedSystemMessage(\n originalSystemMessage: SystemMessage | null,\n summary: string,\n summaryPrefix: string\n): SystemMessage {\n let originalContent = \"\";\n if (originalSystemMessage) {\n const { content } = originalSystemMessage;\n if (typeof content === \"string\") {\n originalContent = content.split(summaryPrefix)[0].trim();\n }\n }\n\n const content = originalContent\n ? `${originalContent}\\n${summaryPrefix}\\n${summary}`\n : `${summaryPrefix}\\n${summary}`;\n\n return new SystemMessage({\n content,\n id: originalSystemMessage?.id || uuid(),\n });\n}\n\n/**\n * Find safe cutoff point that preserves AI/Tool message pairs\n */\nfunction findSafeCutoff(\n messages: BaseMessage[],\n messagesToKeep: number\n): number {\n if (messages.length <= messagesToKeep) {\n return 0;\n }\n\n const targetCutoff = messages.length - messagesToKeep;\n\n for (let i = targetCutoff; i >= 0; i--) {\n if (isSafeCutoffPoint(messages, i)) {\n return i;\n }\n }\n\n return 0;\n}\n\n/**\n * Check if cutting at index would separate AI/Tool message pairs\n */\nfunction isSafeCutoffPoint(\n messages: BaseMessage[],\n cutoffIndex: number\n): boolean {\n if (cutoffIndex >= messages.length) {\n return true;\n }\n\n const searchStart = Math.max(0, cutoffIndex - SEARCH_RANGE_FOR_TOOL_PAIRS);\n const searchEnd = Math.min(\n messages.length,\n cutoffIndex + SEARCH_RANGE_FOR_TOOL_PAIRS\n );\n\n for (let i = searchStart; i < searchEnd; i++) {\n if (!hasToolCalls(messages[i])) {\n continue;\n }\n\n const toolCallIds = extractToolCallIds(messages[i] as AIMessage);\n if (cutoffSeparatesToolPair(messages, i, cutoffIndex, toolCallIds)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if message is an AI message with tool calls\n */\nfunction hasToolCalls(message: BaseMessage): boolean {\n return (\n isAIMessage(message) &&\n \"tool_calls\" in message &&\n Array.isArray(message.tool_calls) &&\n message.tool_calls.length > 0\n );\n}\n\n/**\n * Extract tool call IDs from an AI message\n */\nfunction extractToolCallIds(aiMessage: AIMessage): Set<string> {\n const toolCallIds = new Set<string>();\n if (aiMessage.tool_calls) {\n for (const toolCall of aiMessage.tool_calls) {\n const id =\n typeof toolCall === \"object\" && \"id\" in toolCall ? toolCall.id : null;\n if (id) {\n toolCallIds.add(id);\n }\n }\n }\n return toolCallIds;\n}\n\n/**\n * Check if cutoff separates an AI message from its corresponding tool messages\n */\nfunction cutoffSeparatesToolPair(\n messages: BaseMessage[],\n aiMessageIndex: number,\n cutoffIndex: number,\n toolCallIds: Set<string>\n): boolean {\n for (let j = aiMessageIndex + 1; j < messages.length; j++) {\n const message = messages[j];\n if (isToolMessage(message) && toolCallIds.has(message.tool_call_id)) {\n const aiBeforeCutoff = aiMessageIndex < cutoffIndex;\n const toolBeforeCutoff = j < cutoffIndex;\n if (aiBeforeCutoff !== toolBeforeCutoff) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Generate summary for the given messages\n */\nasync function createSummary(\n messagesToSummarize: BaseMessage[],\n model: BaseLanguageModel,\n summaryPrompt: string,\n tokenCounter: TokenCounter\n): Promise<string> {\n if (!messagesToSummarize.length) {\n return \"No previous conversation history.\";\n }\n\n const trimmedMessages = await trimMessagesForSummary(\n messagesToSummarize,\n tokenCounter\n );\n\n if (!trimmedMessages.length) {\n return \"Previous conversation was too long to summarize.\";\n }\n\n try {\n const formattedPrompt = summaryPrompt.replace(\n \"{messages}\",\n JSON.stringify(trimmedMessages, null, 2)\n );\n const response = await model.invoke(formattedPrompt);\n const { content } = response;\n return typeof content === \"string\"\n ? content.trim()\n : \"Error generating summary: Invalid response format\";\n } catch (e) {\n return `Error generating summary: ${e}`;\n }\n}\n\n/**\n * Trim messages to fit within summary generation limits\n */\nasync function trimMessagesForSummary(\n messages: BaseMessage[],\n tokenCounter: TokenCounter\n): Promise<BaseMessage[]> {\n try {\n return await trimMessages(messages, {\n maxTokens: DEFAULT_TRIM_TOKEN_LIMIT,\n tokenCounter: async (msgs) => Promise.resolve(tokenCounter(msgs)),\n strategy: \"last\",\n allowPartial: true,\n includeSystem: true,\n });\n } catch (e) {\n // Fallback to last N messages if trimming fails\n return messages.slice(-DEFAULT_FALLBACK_MESSAGE_COUNT);\n }\n}\n"],"mappings":";;;;;;;AAgBA,MAAM,yBAAyB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;WA0BrB,CAAC;AAEZ,MAAM,iBAAiB;AAEvB,MAAM,2BAA2B;AACjC,MAAM,2BAA2B;AACjC,MAAM,iCAAiC;AACvC,MAAM,8BAA8B;AAIpC,MAAM,gBAAgB,EAAE,OAAO;CAC7B,OAAO,EAAE,QAA2B;CACpC,wBAAwB,EAAE,QAAQ,CAAC,UAAU;CAC7C,gBAAgB,EAAE,QAAQ,CAAC,QAAQ,yBAAyB;CAC5D,cAAc,EACX,UAAU,CACV,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CACtB,QAAQ,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,AAAC,EAAC,CAAC,CACrD,UAAU;CACb,eAAe,EAAE,QAAQ,CAAC,QAAQ,uBAAuB;CACzD,eAAe,EAAE,QAAQ,CAAC,QAAQ,eAAe;AAClD,EAAC;;;;;;AAOF,SAAgB,yBAAyBA,UAAiC;CACxE,IAAI,aAAa;AACjB,MAAK,MAAM,OAAO,UAAU;EAC1B,IAAIC;AACJ,MAAI,OAAO,IAAI,YAAY,UACzB,cAAc,IAAI;WACT,MAAM,QAAQ,IAAI,QAAQ,EACnC,cAAc,IAAI,QACf,IAAI,CAAC,SAAS;AACb,OAAI,OAAO,SAAS,SAAU,QAAO;AACrC,OAAI,KAAK,SAAS,UAAU,UAAU,KAAM,QAAO,KAAK;AACxD,UAAO;EACR,EAAC,CACD,KAAK,GAAG;OAEX,cAAc;EAEhB,cAAc,YAAY;CAC3B;AAED,QAAO,KAAK,KAAK,aAAa,EAAE;AACjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BD,SAAgB,wBACdC,SACA;AACA,QAAO,iBAAiB;EACtB,MAAM;EACN;EACA,aAAa,OAAO,OAAO,YAAY;GACrC,MAAM,SAAS;IAAE,GAAG,cAAc,MAAM,QAAQ;IAAE,GAAG,QAAQ;GAAS;GACtE,MAAM,EAAE,UAAU,GAAG;GAGrB,iBAAiB,SAAS;GAE1B,MAAM,eAAe,OAAO,gBAAgB;GAC5C,MAAM,cAAc,MAAM,aAAa,SAAS;AAEhD,OACE,OAAO,0BAA0B,QACjC,cAAc,OAAO,uBAErB;GAGF,MAAM,EAAE,eAAe,sBAAsB,GAC3C,mBAAmB,SAAS;GAC9B,MAAM,cAAc,eAClB,sBACA,OAAO,eACR;AAED,OAAI,eAAe,EACjB;GAGF,MAAM,EAAE,qBAAqB,mBAAmB,GAAG,kBACjD,eACA,sBACA,YACD;GAED,MAAM,UAAU,MAAM,cACpB,qBACA,OAAO,OACP,OAAO,eACP,aACD;GAED,MAAM,uBAAuB,0BAC3B,eACA,SACA,OAAO,cACR;AAED,UAAO,EACL,UAAU;IACR,IAAI,cAAc,EAAE,IAAI,oBAAqB;IAC7C;IACA,GAAG;GACJ,EACF;EACF;CACF,EAAC;AACH;;;;AAKD,SAAS,iBAAiBF,UAA+B;AACvD,MAAK,MAAM,OAAO,SAChB,KAAI,CAAC,IAAI,IACP,IAAI,KAAKG,IAAM;AAGpB;;;;AAKD,SAAS,mBAAmBH,UAG1B;AACA,KAAI,SAAS,SAAS,KAAK,gBAAgB,SAAS,GAAG,CACrD,QAAO;EACL,eAAe,SAAS;EACxB,sBAAsB,SAAS,MAAM,EAAE;CACxC;AAEH,QAAO;EACL,eAAe;EACf,sBAAsB;CACvB;AACF;;;;AAKD,SAAS,kBACPI,eACAC,sBACAC,aAC0E;CAC1E,MAAM,sBAAsB,qBAAqB,MAAM,GAAG,YAAY;CACtE,MAAM,oBAAoB,qBAAqB,MAAM,YAAY;AAGjE,KAAI,eACF,oBAAoB,QAAQ,cAAc;AAG5C,QAAO;EAAE;EAAqB;CAAmB;AAClD;;;;AAKD,SAAS,0BACPC,uBACAC,SACAC,eACe;CACf,IAAI,kBAAkB;AACtB,KAAI,uBAAuB;EACzB,MAAM,EAAE,oBAAS,GAAG;AACpB,MAAI,OAAOC,cAAY,UACrB,kBAAkBA,UAAQ,MAAM,cAAc,CAAC,GAAG,MAAM;CAE3D;CAED,MAAM,UAAU,kBACZ,GAAG,gBAAgB,EAAE,EAAE,cAAc,EAAE,EAAE,SAAS,GAClD,GAAG,cAAc,EAAE,EAAE,SAAS;AAElC,QAAO,IAAI,cAAc;EACvB;EACA,IAAI,uBAAuB,MAAMP,IAAM;CACxC;AACF;;;;AAKD,SAAS,eACPH,UACAW,gBACQ;AACR,KAAI,SAAS,UAAU,eACrB,QAAO;CAGT,MAAM,eAAe,SAAS,SAAS;AAEvC,MAAK,IAAI,IAAI,cAAc,KAAK,GAAG,IACjC,KAAI,kBAAkB,UAAU,EAAE,CAChC,QAAO;AAIX,QAAO;AACR;;;;AAKD,SAAS,kBACPX,UACAM,aACS;AACT,KAAI,eAAe,SAAS,OAC1B,QAAO;CAGT,MAAM,cAAc,KAAK,IAAI,GAAG,cAAc,4BAA4B;CAC1E,MAAM,YAAY,KAAK,IACrB,SAAS,QACT,cAAc,4BACf;AAED,MAAK,IAAI,IAAI,aAAa,IAAI,WAAW,KAAK;AAC5C,MAAI,CAAC,aAAa,SAAS,GAAG,CAC5B;EAGF,MAAM,cAAc,mBAAmB,SAAS,GAAgB;AAChE,MAAI,wBAAwB,UAAU,GAAG,aAAa,YAAY,CAChE,QAAO;CAEV;AAED,QAAO;AACR;;;;AAKD,SAAS,aAAaM,SAA+B;AACnD,QACE,YAAY,QAAQ,IACpB,gBAAgB,WAChB,MAAM,QAAQ,QAAQ,WAAW,IACjC,QAAQ,WAAW,SAAS;AAE/B;;;;AAKD,SAAS,mBAAmBC,WAAmC;CAC7D,MAAM,8BAAc,IAAI;AACxB,KAAI,UAAU,WACZ,MAAK,MAAM,YAAY,UAAU,YAAY;EAC3C,MAAM,KACJ,OAAO,aAAa,YAAY,QAAQ,WAAW,SAAS,KAAK;AACnE,MAAI,IACF,YAAY,IAAI,GAAG;CAEtB;AAEH,QAAO;AACR;;;;AAKD,SAAS,wBACPb,UACAc,gBACAR,aACAS,aACS;AACT,MAAK,IAAI,IAAI,iBAAiB,GAAG,IAAI,SAAS,QAAQ,KAAK;EACzD,MAAM,UAAU,SAAS;AACzB,MAAI,cAAc,QAAQ,IAAI,YAAY,IAAI,QAAQ,aAAa,EAAE;GACnE,MAAM,iBAAiB,iBAAiB;GACxC,MAAM,mBAAmB,IAAI;AAC7B,OAAI,mBAAmB,iBACrB,QAAO;EAEV;CACF;AACD,QAAO;AACR;;;;AAKD,eAAe,cACbC,qBACAC,OACAC,eACAC,cACiB;AACjB,KAAI,CAAC,oBAAoB,OACvB,QAAO;CAGT,MAAM,kBAAkB,MAAM,uBAC5B,qBACA,aACD;AAED,KAAI,CAAC,gBAAgB,OACnB,QAAO;AAGT,KAAI;EACF,MAAM,kBAAkB,cAAc,QACpC,cACA,KAAK,UAAU,iBAAiB,MAAM,EAAE,CACzC;EACD,MAAM,WAAW,MAAM,MAAM,OAAO,gBAAgB;EACpD,MAAM,EAAE,SAAS,GAAG;AACpB,SAAO,OAAO,YAAY,WACtB,QAAQ,MAAM,GACd;CACL,SAAQ,GAAG;AACV,SAAO,CAAC,0BAA0B,EAAE,GAAG;CACxC;AACF;;;;AAKD,eAAe,uBACbnB,UACAmB,cACwB;AACxB,KAAI;AACF,SAAO,MAAM,aAAa,UAAU;GAClC,WAAW;GACX,cAAc,OAAO,SAAS,QAAQ,QAAQ,aAAa,KAAK,CAAC;GACjE,UAAU;GACV,cAAc;GACd,eAAe;EAChB,EAAC;CACH,SAAQ,GAAG;AAEV,SAAO,SAAS,MAAM,CAAC,+BAA+B;CACvD;AACF"}
@@ -0,0 +1,29 @@
1
+ const require_middleware = require('./middleware.cjs');
2
+
3
+ //#region src/agents/middlewareAgent/nodes/AfterModalNode.ts
4
+ /**
5
+ * Node for executing a single middleware's afterModel hook.
6
+ */
7
+ var AfterModelNode = class extends require_middleware.MiddlewareNode {
8
+ lc_namespace = [
9
+ "langchain",
10
+ "agents",
11
+ "afterModalNodes"
12
+ ];
13
+ name;
14
+ constructor(middleware) {
15
+ super({
16
+ name: `AfterModelNode_${middleware.name}`,
17
+ func: async (state, config) => this.invokeMiddleware(state, config)
18
+ });
19
+ this.middleware = middleware;
20
+ this.name = `AfterModelNode_${middleware.name}`;
21
+ }
22
+ runHook(state, runtime, controls) {
23
+ return this.middleware.afterModel(state, runtime, controls);
24
+ }
25
+ };
26
+
27
+ //#endregion
28
+ exports.AfterModelNode = AfterModelNode;
29
+ //# sourceMappingURL=AfterModalNode.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AfterModalNode.cjs","names":["MiddlewareNode","middleware: AgentMiddleware<any, any, any>","state: TStateSchema","config?: LangGraphRunnableConfig","runtime: Runtime<TContextSchema>","controls: Controls<TStateSchema>"],"sources":["../../../../src/agents/middlewareAgent/nodes/AfterModalNode.ts"],"sourcesContent":["import { LangGraphRunnableConfig } from \"@langchain/langgraph\";\nimport { MiddlewareNode } from \"./middleware.js\";\nimport type {\n Controls,\n AgentMiddleware,\n MiddlewareResult,\n Runtime,\n} from \"../types.js\";\n\n/**\n * Node for executing a single middleware's afterModel hook.\n */\nexport class AfterModelNode<\n TStateSchema extends Record<string, any> = Record<string, any>,\n TContextSchema extends Record<string, any> = Record<string, any>\n> extends MiddlewareNode<TStateSchema, TContextSchema> {\n lc_namespace = [\"langchain\", \"agents\", \"afterModalNodes\"];\n\n name: string;\n\n constructor(public middleware: AgentMiddleware<any, any, any>) {\n super({\n name: `AfterModelNode_${middleware.name}`,\n func: async (state: TStateSchema, config?: LangGraphRunnableConfig) =>\n this.invokeMiddleware(state, config),\n });\n this.name = `AfterModelNode_${middleware.name}`;\n }\n\n runHook(\n state: TStateSchema,\n runtime: Runtime<TContextSchema>,\n controls: Controls<TStateSchema>\n ) {\n return this.middleware.afterModel!(state, runtime, controls) as Promise<\n MiddlewareResult<TStateSchema>\n >;\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,iBAAb,cAGUA,kCAA6C;CACrD,eAAe;EAAC;EAAa;EAAU;CAAkB;CAEzD;CAEA,YAAmBC,YAA4C;EAC7D,MAAM;GACJ,MAAM,CAAC,eAAe,EAAE,WAAW,MAAM;GACzC,MAAM,OAAOC,OAAqBC,WAChC,KAAK,iBAAiB,OAAO,OAAO;EACvC,EAAC;EALe;EAMjB,KAAK,OAAO,CAAC,eAAe,EAAE,WAAW,MAAM;CAChD;CAED,QACED,OACAE,SACAC,UACA;AACA,SAAO,KAAK,WAAW,WAAY,OAAO,SAAS,SAAS;CAG7D;AACF"}
@@ -0,0 +1,29 @@
1
+ import { MiddlewareNode } from "./middleware.js";
2
+
3
+ //#region src/agents/middlewareAgent/nodes/AfterModalNode.ts
4
+ /**
5
+ * Node for executing a single middleware's afterModel hook.
6
+ */
7
+ var AfterModelNode = class extends MiddlewareNode {
8
+ lc_namespace = [
9
+ "langchain",
10
+ "agents",
11
+ "afterModalNodes"
12
+ ];
13
+ name;
14
+ constructor(middleware) {
15
+ super({
16
+ name: `AfterModelNode_${middleware.name}`,
17
+ func: async (state, config) => this.invokeMiddleware(state, config)
18
+ });
19
+ this.middleware = middleware;
20
+ this.name = `AfterModelNode_${middleware.name}`;
21
+ }
22
+ runHook(state, runtime, controls) {
23
+ return this.middleware.afterModel(state, runtime, controls);
24
+ }
25
+ };
26
+
27
+ //#endregion
28
+ export { AfterModelNode };
29
+ //# sourceMappingURL=AfterModalNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AfterModalNode.js","names":["middleware: AgentMiddleware<any, any, any>","state: TStateSchema","config?: LangGraphRunnableConfig","runtime: Runtime<TContextSchema>","controls: Controls<TStateSchema>"],"sources":["../../../../src/agents/middlewareAgent/nodes/AfterModalNode.ts"],"sourcesContent":["import { LangGraphRunnableConfig } from \"@langchain/langgraph\";\nimport { MiddlewareNode } from \"./middleware.js\";\nimport type {\n Controls,\n AgentMiddleware,\n MiddlewareResult,\n Runtime,\n} from \"../types.js\";\n\n/**\n * Node for executing a single middleware's afterModel hook.\n */\nexport class AfterModelNode<\n TStateSchema extends Record<string, any> = Record<string, any>,\n TContextSchema extends Record<string, any> = Record<string, any>\n> extends MiddlewareNode<TStateSchema, TContextSchema> {\n lc_namespace = [\"langchain\", \"agents\", \"afterModalNodes\"];\n\n name: string;\n\n constructor(public middleware: AgentMiddleware<any, any, any>) {\n super({\n name: `AfterModelNode_${middleware.name}`,\n func: async (state: TStateSchema, config?: LangGraphRunnableConfig) =>\n this.invokeMiddleware(state, config),\n });\n this.name = `AfterModelNode_${middleware.name}`;\n }\n\n runHook(\n state: TStateSchema,\n runtime: Runtime<TContextSchema>,\n controls: Controls<TStateSchema>\n ) {\n return this.middleware.afterModel!(state, runtime, controls) as Promise<\n MiddlewareResult<TStateSchema>\n >;\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,iBAAb,cAGU,eAA6C;CACrD,eAAe;EAAC;EAAa;EAAU;CAAkB;CAEzD;CAEA,YAAmBA,YAA4C;EAC7D,MAAM;GACJ,MAAM,CAAC,eAAe,EAAE,WAAW,MAAM;GACzC,MAAM,OAAOC,OAAqBC,WAChC,KAAK,iBAAiB,OAAO,OAAO;EACvC,EAAC;EALe;EAMjB,KAAK,OAAO,CAAC,eAAe,EAAE,WAAW,MAAM;CAChD;CAED,QACED,OACAE,SACAC,UACA;AACA,SAAO,KAAK,WAAW,WAAY,OAAO,SAAS,SAAS;CAG7D;AACF"}