@dvina/agents 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  LangchainModelResolver,
3
3
  convertToLangchainMessages
4
- } from "./chunk-WXK2K5IZ.mjs";
4
+ } from "./chunk-KCENDSNH.mjs";
5
5
 
6
6
  // src/runtime/langchain/factory.ts
7
7
  import { PostgresSaver } from "@langchain/langgraph-checkpoint-postgres";
@@ -13,10 +13,7 @@ import { llmToolSelectorMiddleware, summarizationMiddleware, tool } from "langch
13
13
  import { ToolMessage } from "@langchain/core/messages";
14
14
  import { Command } from "@langchain/langgraph";
15
15
  import { createDeepAgent } from "deepagents";
16
- import {
17
- AIMessageChunk,
18
- createMiddleware
19
- } from "langchain";
16
+ import { AIMessageChunk, createMiddleware } from "langchain";
20
17
  var ENABLE_STREAM_DEBUG_LOGS = false;
21
18
  function debugLogStream(type, text) {
22
19
  if (!ENABLE_STREAM_DEBUG_LOGS) return;
@@ -97,13 +94,15 @@ var LangchainAgent = class {
97
94
  input_tokens: 0,
98
95
  output_tokens: 0,
99
96
  total_tokens: 0,
100
- cache_read: 0
97
+ cache_read: 0,
98
+ reasoning_tokens: 0
101
99
  };
102
100
  messagesWithUsage.forEach((m) => {
103
101
  usage.input_tokens += m.usage_metadata.input_tokens || 0;
104
102
  usage.output_tokens += m.usage_metadata.output_tokens || 0;
105
103
  usage.total_tokens += m.usage_metadata.total_tokens || 0;
106
104
  usage.cache_read += m.usage_metadata.input_token_details?.cache_read || 0;
105
+ usage.reasoning_tokens += m.usage_metadata.output_token_details?.reasoning || 0;
107
106
  });
108
107
  const contentBlocks = [];
109
108
  const toolCallInputs = {};
@@ -115,11 +114,14 @@ var LangchainAgent = class {
115
114
  toolCallInputs[tc.id] = tc.args;
116
115
  }
117
116
  }
118
- if (m.content && m.content.toString().trim().length > 0) {
119
- contentBlocks.push({
120
- type: "text",
121
- output: m.content.toString()
122
- });
117
+ if (m.content) {
118
+ const textOutput = this.extractTextContent(m.content);
119
+ if (textOutput.trim().length > 0) {
120
+ contentBlocks.push({
121
+ type: "text",
122
+ output: textOutput
123
+ });
124
+ }
123
125
  }
124
126
  } else if (m.type === "tool") {
125
127
  contentBlocks.push({
@@ -140,7 +142,8 @@ var LangchainAgent = class {
140
142
  promptTokens: usage.input_tokens,
141
143
  completionTokens: usage.output_tokens,
142
144
  totalTokens: usage.total_tokens,
143
- cachedPromptTokens: usage.cache_read
145
+ cachedPromptTokens: usage.cache_read,
146
+ reasoningTokens: usage.reasoning_tokens
144
147
  }
145
148
  };
146
149
  }
@@ -152,7 +155,8 @@ var LangchainAgent = class {
152
155
  promptTokens: 0,
153
156
  completionTokens: 0,
154
157
  totalTokens: 0,
155
- cachedPromptTokens: 0
158
+ cachedPromptTokens: 0,
159
+ reasoningTokens: 0
156
160
  };
157
161
  const messages = convertToLangchainMessages(input.messages);
158
162
  debugLogStream("message_start", "");
@@ -211,6 +215,28 @@ var LangchainAgent = class {
211
215
  };
212
216
  }
213
217
  }
218
+ } else if (this.isReasoningMessage(message)) {
219
+ const contentArray = message.content;
220
+ for (const block of contentArray) {
221
+ if (block.type === "reasoning" && block.reasoning) {
222
+ debugLogStream("reasoning_delta", block.reasoning);
223
+ yield {
224
+ type: "reasoning_delta",
225
+ delta: block.reasoning
226
+ };
227
+ }
228
+ }
229
+ } else if (this.isArrayTextMessage(message)) {
230
+ const contentArray = message.content;
231
+ for (const block of contentArray) {
232
+ if (block.type === "text" && block.text) {
233
+ debugLogStream("text_delta", block.text);
234
+ yield {
235
+ type: "text_delta",
236
+ delta: block.text
237
+ };
238
+ }
239
+ }
214
240
  } else if (message?.content && typeof message.content === "string") {
215
241
  const content = message.content;
216
242
  if (content.length === 0) continue;
@@ -257,6 +283,7 @@ var LangchainAgent = class {
257
283
  usageMetadata.completionTokens += um.output_tokens || 0;
258
284
  usageMetadata.totalTokens += um.total_tokens || 0;
259
285
  usageMetadata.cachedPromptTokens += um.input_token_details?.cache_read || 0;
286
+ usageMetadata.reasoningTokens = (usageMetadata.reasoningTokens || 0) + (um.output_token_details?.reasoning || 0);
260
287
  }
261
288
  if (aiChunk.tool_calls && aiChunk.tool_calls.length > 0) {
262
289
  for (let tc of aiChunk.tool_calls)
@@ -264,11 +291,14 @@ var LangchainAgent = class {
264
291
  name: tc.name,
265
292
  args: tc.args
266
293
  };
267
- } else if (aiChunk.content && aiChunk.content.toString().trim().length > 0)
268
- contentBlocks.push({
269
- type: "text",
270
- output: aiChunk.content.toString()
271
- });
294
+ } else if (aiChunk.content) {
295
+ const textOutput = this.extractTextContent(aiChunk.content);
296
+ if (textOutput.trim().length > 0)
297
+ contentBlocks.push({
298
+ type: "text",
299
+ output: textOutput
300
+ });
301
+ }
272
302
  }
273
303
  }
274
304
  if (update.tools?.messages) {
@@ -341,6 +371,25 @@ var LangchainAgent = class {
341
371
  if (!shouldStream && ENABLE_STREAM_DEBUG_LOGS) console.warn("SUPPRESSING TOOL EVENT: " + toolName);
342
372
  return shouldStream;
343
373
  }
374
+ isReasoningMessage(message) {
375
+ if (!Array.isArray(message.content)) return false;
376
+ return message.content.some((block) => block.type === "reasoning" && block.reasoning);
377
+ }
378
+ isArrayTextMessage(message) {
379
+ if (!Array.isArray(message.content)) return false;
380
+ return message.content.some((block) => block.type === "text" && block.text);
381
+ }
382
+ /**
383
+ * Extracts text from message content that may be a string
384
+ * or an array of content blocks (as returned by reasoning models).
385
+ */
386
+ extractTextContent(content) {
387
+ if (typeof content === "string") return content;
388
+ if (Array.isArray(content)) {
389
+ return content.filter((block) => block.type === "text" && block.text).map((block) => block.text).join("");
390
+ }
391
+ return content.toString();
392
+ }
344
393
  };
345
394
 
346
395
  // src/runtime/langchain/factory.ts
@@ -380,7 +429,7 @@ var LangchainAgentFactory = class {
380
429
  }
381
430
  async createAgent(options) {
382
431
  let deepAgentOptions = {
383
- model: this.modelResolver.resolve(options.model)
432
+ model: this.modelResolver.resolve(options.model, [], options.reasoning)
384
433
  };
385
434
  let middlewares = [];
386
435
  let systemPrompt = options.instructions ?? "";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/langchain/factory.ts","../src/runtime/langchain/agent.ts","../src/core/tools/tool-registry.ts","../src/core/tools/tool-cache.ts"],"sourcesContent":["import { AgentFactory, CreateAgentOptions } from '@core/agent.factory';\nimport { Agent } from '@core/agent.interface';\nimport { PostgresSaver } from '@langchain/langgraph-checkpoint-postgres';\n// @ts-ignore -_-\nimport { PostgresStore } from '@langchain/langgraph-checkpoint-postgres/store';\nimport { CompositeBackend, StateBackend, StoreBackend } from 'deepagents';\nimport { AgentMiddleware, llmToolSelectorMiddleware, summarizationMiddleware, tool } from 'langchain';\nimport { CreateOptions, LangchainAgent } from './agent';\nimport { LangchainModelConfig, LangchainModelResolver } from './model-resolver';\n\nexport interface PostgresSaverConfig {\n\tconnString: string;\n\tschema: string;\n}\n\nexport interface PostgresStoreConfig {\n\tconnString: string;\n\tschema: string;\n}\n\nexport class LangchainAgentFactory implements AgentFactory {\n\tprivate modelResolver: LangchainModelResolver;\n\n\tconstructor(\n\t\tprivate modelConfig: LangchainModelConfig,\n\t\tprivate saverConfig: PostgresSaverConfig,\n\t\tprivate storeConfig: PostgresStoreConfig,\n\t) {\n\t\tthis.modelResolver = new LangchainModelResolver(this.modelConfig);\n\t}\n\n\tprivate buildMemorySystemPrompt(slots: { name: string; usedFor: string }[]): string {\n\t\tconst lines = [\n\t\t\t'Long-term memory is enabled.',\n\t\t\t'Persist memories using the filesystem tools under these path prefixes:',\n\t\t\t...slots.map((slot) => {\n\t\t\t\tconst prefix = this.normalizeStoreRoutePrefix(slot.name);\n\t\t\t\treturn `- ${prefix}: ${slot.usedFor}`;\n\t\t\t}),\n\t\t];\n\n\t\treturn lines.join('\\n');\n\t}\n\n\tprivate buildHandoffsSystemPrompt(handoffs: { name: string; description: string }[]): string {\n\t\tconst lines = [\n\t\t\t'You can delegate tasks to the following subagents:',\n\t\t\t...handoffs.map((handoff) => `- ${handoff.name}: ${handoff.description}`),\n\t\t];\n\n\t\treturn lines.join('\\n');\n\t}\n\n\tprivate normalizeStoreRoutePrefix(prefix: string): string {\n\t\tconst trimmedPrefix = prefix.trim();\n\t\tif (trimmedPrefix.length === 0) {\n\t\t\tthrow new Error('Memory slot name cannot be empty');\n\t\t}\n\n\t\tconst withLeadingSlash = trimmedPrefix.startsWith('/') ? trimmedPrefix : `/${trimmedPrefix}`;\n\t\treturn withLeadingSlash.endsWith('/') ? withLeadingSlash : `${withLeadingSlash}/`;\n\t}\n\n\tasync createAgent(options: CreateAgentOptions): Promise<Agent> {\n\t\tlet deepAgentOptions: CreateOptions = {\n\t\t\tmodel: this.modelResolver.resolve(options.model),\n\t\t};\n\n\t\tlet middlewares: AgentMiddleware[] = [];\n\t\tlet systemPrompt = options.instructions ?? '';\n\t\tlet disableStreamingForTools: string[] = [\n\t\t\t'write_todos',\n\t\t\t'ls',\n\t\t\t'read_file',\n\t\t\t'write_file',\n\t\t\t'edit_file',\n\t\t\t'glob',\n\t\t\t'grep',\n\t\t\t'task',\n\t\t];\n\t\tlet disableReportingForTools: string[] = disableStreamingForTools;\n\t\tlet disableModelStreamingFor: string[] = [];\n\n\t\tif (options.history) {\n\t\t\tconst checkpointer = PostgresSaver.fromConnString(this.saverConfig.connString, {\n\t\t\t\tschema: this.saverConfig.schema,\n\t\t\t});\n\n\t\t\tawait checkpointer.setup();\n\n\t\t\tdeepAgentOptions.checkpointer = checkpointer;\n\t\t}\n\n\t\tif (options.memory) {\n\t\t\tconst memorySystemPrompt = this.buildMemorySystemPrompt(options.memory.slots);\n\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${memorySystemPrompt}` : memorySystemPrompt;\n\n\t\t\tdeepAgentOptions.store = new PostgresStore({\n\t\t\t\tconnectionOptions: this.storeConfig.connString,\n\t\t\t\tschema: this.storeConfig.schema,\n\t\t\t\tensureTables: true,\n\t\t\t});\n\t\t\t/**\n\t\t\t * StateBackend for ephemeral storage\n\t\t\t * StoreBackend for persistent storage\n\t\t\t */\n\t\t\tdeepAgentOptions.backend = (config) => {\n\t\t\t\tconst configWithAssistantId = { ...config, assistantId: options.memory?.assistantId };\n\t\t\t\tconst storeBackend = new StoreBackend(configWithAssistantId);\n\t\t\t\tconst routes = Object.fromEntries(\n\t\t\t\t\t(options.memory?.slots ?? []).map((slot) => {\n\t\t\t\t\t\tconst routePrefix = this.normalizeStoreRoutePrefix(slot.name);\n\t\t\t\t\t\treturn [routePrefix, storeBackend];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn new CompositeBackend(new StateBackend(configWithAssistantId), {\n\t\t\t\t\t...routes,\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tif (options.tools) {\n\t\t\tdeepAgentOptions.tools = options.tools.tools.map((t) =>\n\t\t\t\ttool(\n\t\t\t\t\tasync (input, options) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst res = await t.exec(input);\n\n\t\t\t\t\t\t\tif (typeof res === 'string') return res;\n\n\t\t\t\t\t\t\treturn JSON.stringify(res);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error('Error executing tool:', e);\n\t\t\t\t\t\t\treturn 'Something went wrong while executing the tool.';\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: t.name,\n\t\t\t\t\t\tdescription: t.description,\n\t\t\t\t\t\tschema: t.inputSchema,\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\ttoolKit: t.toolKit,\n\t\t\t\t\t\t\ttoolKitIconUrl: t.toolKitIconUrl,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\t\t\tmiddlewares.push(\n\t\t\t\tllmToolSelectorMiddleware({\n\t\t\t\t\tmodel: this.modelResolver.resolve(options.tools.model, ['tool-selector']),\n\t\t\t\t\tmaxTools: 128,\n\t\t\t\t\talwaysInclude: options.tools.alwaysIncludeTools ?? undefined,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tdisableModelStreamingFor.push('tool-selector');\n\t\t}\n\n\t\tif (options.summarization)\n\t\t\tmiddlewares.push(\n\t\t\t\tsummarizationMiddleware({\n\t\t\t\t\tmodel: this.modelResolver.resolve(options.summarization.model),\n\t\t\t\t\ttrigger: {\n\t\t\t\t\t\ttokens: options.summarization.triggerAtTokens,\n\t\t\t\t\t},\n\t\t\t\t\tkeep: {\n\t\t\t\t\t\tmessages: options.summarization.keepMessages,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\n\t\tif (options.handoffs) {\n\t\t\toptions.handoffs.every((h) => {\n\t\t\t\tif (!(h.agent instanceof LangchainAgent)) {\n\t\t\t\t\tthrow new Error('Handoff agent must be an instance of LangchainAgent');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst handoffsSystemPrompt = this.buildHandoffsSystemPrompt(options.handoffs);\n\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${handoffsSystemPrompt}` : handoffsSystemPrompt;\n\n\t\t\tdeepAgentOptions.subagents = options.handoffs.map((h) => {\n\t\t\t\treturn {\n\t\t\t\t\tname: h.name,\n\t\t\t\t\tdescription: h.description,\n\t\t\t\t\trunnable: (h.agent as LangchainAgent).getLangchainAgent(),\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\n\t\tif (middlewares.length > 0) deepAgentOptions.middleware = middlewares;\n\n\t\tif (systemPrompt) deepAgentOptions.systemPrompt = systemPrompt;\n\n\t\tdeepAgentOptions.disableModelStreamingFor = disableModelStreamingFor;\n\t\tdeepAgentOptions.disableToolReportingFor = disableReportingForTools;\n\t\tdeepAgentOptions.disableToolStreamingFor = disableStreamingForTools;\n\n\t\treturn new LangchainAgent(deepAgentOptions);\n\t}\n}\n","import {\n\tAgent,\n\tAgentResult,\n\tAgentRunInput,\n\tContentBlock,\n\tMessage,\n\tStreamEvent,\n\tToolCall,\n\tUsageMeta,\n} from '@core/agent.interface';\nimport { AIMessage, ToolCallChunk, ToolMessage } from '@langchain/core/messages';\nimport { Command } from '@langchain/langgraph';\nimport { createDeepAgent, CreateDeepAgentParams } from 'deepagents';\nimport {\n\tAgentMiddleware,\n\tAIMessageChunk,\n\tBaseMessage,\n\tcreateMiddleware,\n\tHumanMessage,\n\tReactAgent,\n\tStructuredTool,\n} from 'langchain';\nimport { convertToLangchainMessages } from './utils';\n\nconst ENABLE_STREAM_DEBUG_LOGS = false;\n\nfunction debugLogStream(type: StreamEvent['type'], text: string) {\n\tif (!ENABLE_STREAM_DEBUG_LOGS) return;\n\n\tconsole.warn(`${type}: ${text}`);\n}\n\nexport interface CreateOptions extends CreateDeepAgentParams {\n\t/**\n\t * Tool names to disable streaming for\n\t */\n\tdisableToolStreamingFor?: string[];\n\n\t/**\n\t * Tool names to disable streaming for\n\t */\n\tdisableToolReportingFor?: string[];\n\n\t/**\n\t * Model tags to disable streaming for\n\t */\n\tdisableModelStreamingFor?: string[];\n}\n\nexport class LangchainAgent implements Agent {\n\tprivate deepAgent: ReactAgent;\n\tprivate toolCalls: ToolCall[] = [];\n\tprivate tools?: StructuredTool[];\n\n\tconstructor(private params: CreateOptions) {\n\t\tthis.tools = params.tools;\n\n\t\tif (!params.disableModelStreamingFor) params.disableModelStreamingFor = [];\n\t\tif (!params.disableToolReportingFor) params.disableToolReportingFor = [];\n\t\tif (!params.disableToolStreamingFor) params.disableToolStreamingFor = [];\n\n\t\tlet middlewares: AgentMiddleware[] = [\n\t\t\tcreateMiddleware({\n\t\t\t\tname: 'toolCallsReporter',\n\t\t\t\twrapToolCall: async (request, handler) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst res = await handler(request);\n\n\t\t\t\t\t\tif (this.params.disableToolReportingFor?.includes(request.tool?.name as string)) return res;\n\n\t\t\t\t\t\tthis.toolCalls.push({\n\t\t\t\t\t\t\tid: request.toolCall.id as string,\n\t\t\t\t\t\t\tname: (request.tool?.name as string) || '',\n\t\t\t\t\t\t\tinput: request.toolCall.args,\n\t\t\t\t\t\t\toutput: res.toJSON(),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Wrapped tool may sometimes return Command objects\n\t\t\t\t\t\t * which should actually trigger the \"updates\" mode\n\t\t\t\t\t\t * of stream. But we don't want that to happen. We\n\t\t\t\t\t\t * want to emit tool_result events from a single place.\n\t\t\t\t\t\t * So we extract the tool message from the update and\n\t\t\t\t\t\t * command.update.messages and return that. That way\n\t\t\t\t\t\t * 'messages' stream mode is triggered\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * Hopefully this won't cause any issues.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (res instanceof Command) {\n\t\t\t\t\t\t\tconst resCast: {\n\t\t\t\t\t\t\t\tupdate?: {\n\t\t\t\t\t\t\t\t\tmessages?: BaseMessage[];\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} = res as any;\n\n\t\t\t\t\t\t\tif (!resCast.update?.messages || resCast.update.messages.length == 0) return res;\n\n\t\t\t\t\t\t\tconst toolMessage = resCast.update.messages.find((m: BaseMessage) => m.type == 'tool');\n\n\t\t\t\t\t\t\tif (!toolMessage) return res;\n\n\t\t\t\t\t\t\treturn toolMessage as ToolMessage;\n\t\t\t\t\t\t} else return res;\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\treturn new ToolMessage({\n\t\t\t\t\t\t\tname: request.toolCall.name,\n\t\t\t\t\t\t\tcontent: 'Something went wrong: ' + e.message,\n\t\t\t\t\t\t\ttool_call_id: request.toolCall.id || 'TOOL_CALL_ERROR',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}),\n\t\t];\n\n\t\tif (params.middleware) middlewares = [...middlewares, ...params.middleware];\n\n\t\tparams.middleware = middlewares;\n\n\t\tthis.deepAgent = createDeepAgent(params);\n\t}\n\n\tasync run(input: AgentRunInput): Promise<AgentResult> {\n\t\tthis.toolCalls = []; // Reset tool calls for each run\n\n\t\t// Get current state to know how many messages existed before this turn\n\t\t// If no checkpointer is set, assume this is a fresh conversation\n\t\tlet messageCountBefore = 0;\n\t\ttry {\n\t\t\tconst stateBefore = await this.deepAgent.getState({\n\t\t\t\tconfigurable: {\n\t\t\t\t\tthreadId: input.threadId,\n\t\t\t\t\tthread_id: input.threadId,\n\t\t\t\t},\n\t\t\t});\n\t\t\tmessageCountBefore = (stateBefore as any)?.values?.messages?.length || 0;\n\t\t} catch {\n\t\t\t// No checkpointer set - this is fine, we'll count from 0\n\t\t}\n\n\t\tconst messages = convertToLangchainMessages(input.messages);\n\n\t\tconst result = await this.deepAgent.invoke(\n\t\t\t{\n\t\t\t\tmessages: messages,\n\t\t\t},\n\t\t\t{\n\t\t\t\tconfigurable: {\n\t\t\t\t\tthreadId: input.threadId,\n\t\t\t\t\tthread_id: input.threadId,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\t// Only sum usage from messages added in this turn\n\t\tconst newMessages = result.messages.slice(messageCountBefore);\n\t\tconst messagesWithUsage = newMessages.filter((m: any) => m.usage_metadata != null);\n\n\t\tlet usage = {\n\t\t\tinput_tokens: 0,\n\t\t\toutput_tokens: 0,\n\t\t\ttotal_tokens: 0,\n\t\t\tcache_read: 0,\n\t\t};\n\n\t\tmessagesWithUsage.forEach((m: any) => {\n\t\t\tusage.input_tokens += m.usage_metadata.input_tokens || 0;\n\t\t\tusage.output_tokens += m.usage_metadata.output_tokens || 0;\n\t\t\tusage.total_tokens += m.usage_metadata.total_tokens || 0;\n\t\t\tusage.cache_read += m.usage_metadata.input_token_details?.cache_read || 0;\n\t\t});\n\n\t\t// Build content blocks from new messages\n\t\tconst contentBlocks: ContentBlock[] = [];\n\t\tconst toolCallInputs: { [toolCallId: string]: any } = {};\n\n\t\tfor (const msg of newMessages) {\n\t\t\tconst m = msg as any;\n\t\t\tif (m.type === 'ai') {\n\t\t\t\t// Store tool call inputs for later pairing\n\t\t\t\tif (m.tool_calls && m.tool_calls.length > 0) {\n\t\t\t\t\tfor (const tc of m.tool_calls) {\n\t\t\t\t\t\ttoolCallInputs[tc.id] = tc.args;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Add text content if present\n\t\t\t\tif (m.content && m.content.toString().trim().length > 0) {\n\t\t\t\t\tcontentBlocks.push({\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\toutput: m.content.toString(),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (m.type === 'tool') {\n\t\t\t\tcontentBlocks.push({\n\t\t\t\t\ttype: 'tool_call',\n\t\t\t\t\tname: m.name,\n\t\t\t\t\ttoolKit: this.getToolKitMeta(m.name).toolKit,\n\t\t\t\t\ttoolKitIconUrl: this.getToolKitMeta(m.name).toolKitIconUrl,\n\t\t\t\t\tinput: JSON.stringify(toolCallInputs[m.tool_call_id] || {}),\n\t\t\t\t\toutput: m.content.toString(),\n\t\t\t\t\ttoolCallId: m.tool_call_id,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tcontent: contentBlocks,\n\t\t\ttoolCalls: this.toolCalls,\n\t\t\tusage: {\n\t\t\t\tpromptTokens: usage.input_tokens,\n\t\t\t\tcompletionTokens: usage.output_tokens,\n\t\t\t\ttotalTokens: usage.total_tokens,\n\t\t\t\tcachedPromptTokens: usage.cache_read,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync *stream(input: AgentRunInput): AsyncGenerator<StreamEvent> {\n\t\tthis.toolCalls = []; // Reset tool calls for each stream\n\t\tconst contentBlocks: ContentBlock[] = []; // this will be our final return value\n\t\tlet finalValue;\n\n\t\t// Initialize usage metadata - accumulated from updates mode (current turn only)\n\t\tlet usageMetadata: UsageMeta = {\n\t\t\tpromptTokens: 0,\n\t\t\tcompletionTokens: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcachedPromptTokens: 0,\n\t\t};\n\n\t\tconst messages = convertToLangchainMessages(input.messages);\n\n\t\tdebugLogStream('message_start', '');\n\n\t\t// Emit message start\n\t\tyield { type: 'message_start' };\n\n\t\tconst stream = await this.deepAgent.stream(\n\t\t\t{ messages },\n\t\t\t{\n\t\t\t\tconfigurable: {\n\t\t\t\t\tthreadId: input.threadId,\n\t\t\t\t\tthread_id: input.threadId,\n\t\t\t\t},\n\t\t\t\tstreamMode: ['messages', 'updates', 'values'],\n\t\t\t},\n\t\t);\n\n\t\tlet toolCalls: {\n\t\t\t[index: number]: {\n\t\t\t\ttoolCallId: string;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t} = {};\n\t\tconst toolCallUpdates: {\n\t\t\t[toolCallId: string]: {\n\t\t\t\tname: string;\n\t\t\t\targs: any;\n\t\t\t};\n\t\t} = {};\n\n\t\t/**\n\t\t * Process chunks produced by the LLM\n\t\t */\n\t\tfor await (const chunk of stream) {\n\t\t\tconst [mode, data] = chunk;\n\n\t\t\tif (mode === 'messages') {\n\t\t\t\tconst [message, metadata] = data;\n\n\t\t\t\t/**\n\t\t\t\t * Some messages carry no meaningful information\n\t\t\t\t */\n\t\t\t\tif (this.shouldIgnoreMessage(message, metadata)) continue;\n\n\t\t\t\t/**\n\t\t\t\t * LLMs also stream the tool input tokens. If we see\n\t\t\t\t * tool_call_chunks inside the message, we know it's\n\t\t\t\t * a token stream for a tool call.\n\t\t\t\t */\n\t\t\t\tif (this.isToolCallMessage(message)) {\n\t\t\t\t\tconst aiMessage = message as AIMessageChunk;\n\t\t\t\t\tconst toolCallChunks = aiMessage.tool_call_chunks as ToolCallChunk[];\n\n\t\t\t\t\tfor (const toolChunk of toolCallChunks) {\n\t\t\t\t\t\tconst toolCallIndex = toolChunk.index as number;\n\n\t\t\t\t\t\tconst getToolCallInfo = () => {\n\t\t\t\t\t\t\treturn toolCalls[toolCallIndex];\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * On the first chunk, we get the tool name in\n\t\t\t\t\t\t * chunk.id. On sequential chunks this property\n\t\t\t\t\t\t * is set to defined. So if there is id in the\n\t\t\t\t\t\t * chunk; this is a tool_start event.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * Also different tool calls are separated using\n\t\t\t\t\t\t * the \"index\" property. This exists in all tool\n\t\t\t\t\t\t * chunk messages.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (toolChunk.id) {\n\t\t\t\t\t\t\ttoolCalls[toolChunk.index as number] = {\n\t\t\t\t\t\t\t\ttoolCallId: toolChunk.id,\n\t\t\t\t\t\t\t\tname: toolChunk.name as string,\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tif (!this.shouldStreamToolEvent(getToolCallInfo().name)) continue;\n\n\t\t\t\t\t\t\tconst toolKitMeta = this.getToolKitMeta(getToolCallInfo().name);\n\n\t\t\t\t\t\t\tdebugLogStream('tool_start', `[${getToolCallInfo().toolCallId}] ${getToolCallInfo().name}`);\n\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: 'tool_start',\n\t\t\t\t\t\t\t\tname: getToolCallInfo().name,\n\t\t\t\t\t\t\t\ttoolKit: toolKitMeta.toolKit,\n\t\t\t\t\t\t\t\ttoolKitIconUrl: toolKitMeta.toolKitIconUrl,\n\t\t\t\t\t\t\t\tindex: toolCallIndex,\n\t\t\t\t\t\t\t\ttoolCallId: getToolCallInfo().toolCallId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (toolChunk.args && toolChunk.args.length > 0) {\n\t\t\t\t\t\t\tif (!this.shouldStreamToolEvent(getToolCallInfo().name)) continue;\n\n\t\t\t\t\t\t\tdebugLogStream('tool_input_delta', `[${getToolCallInfo().toolCallId}] ${toolChunk.args}`);\n\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: 'tool_input_delta',\n\t\t\t\t\t\t\t\tname: getToolCallInfo().name,\n\t\t\t\t\t\t\t\targs: toolChunk.args || '',\n\t\t\t\t\t\t\t\tindex: toolCallIndex,\n\t\t\t\t\t\t\t\ttoolCallId: getToolCallInfo().toolCallId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (message?.content && typeof message.content === 'string') {\n\t\t\t\t\tconst content = message.content;\n\n\t\t\t\t\tif (content.length === 0) continue;\n\n\t\t\t\t\tif (message.type == 'tool') {\n\t\t\t\t\t\t// I know it's odd but ToolMessage.name seems to corelate to the tool name\n\t\t\t\t\t\tconst toolName = message.name as string;\n\t\t\t\t\t\tconst toolKitMeta = this.getToolKitMeta(toolName);\n\n\t\t\t\t\t\tconst toolCall = Object.entries(toolCalls).find(\n\t\t\t\t\t\t\t([_, value]) => value.toolCallId == (message as ToolMessage).tool_call_id,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!this.shouldStreamToolEvent(toolName)) continue;\n\n\t\t\t\t\t\tdebugLogStream('tool_result', `[${toolCall?.[1].toolCallId}] ${message.content}`);\n\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: 'tool_result',\n\t\t\t\t\t\t\tname: toolName,\n\t\t\t\t\t\t\tinput:\n\t\t\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t\t\tthis.toolCalls.find((tc) => tc.id == (toolCall as any)[1].toolCallId)?.input,\n\t\t\t\t\t\t\t\t) || '',\n\t\t\t\t\t\t\toutput: message.content,\n\t\t\t\t\t\t\ttoolKit: toolKitMeta.toolKit,\n\t\t\t\t\t\t\ttoolKitIconUrl: toolKitMeta.toolKitIconUrl,\n\t\t\t\t\t\t\tindex: toolCall?.[0] ? parseInt(toolCall[0]) : 99999,\n\t\t\t\t\t\t\ttoolCallId: toolCall?.[1] ? toolCall[1].toolCallId : 'NO_ID_FOUND',\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdebugLogStream('text_delta', content);\n\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: 'text_delta',\n\t\t\t\t\t\t\tdelta: content,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Unexpected messages stream chunk', chunk);\n\t\t\t\t}\n\t\t\t} else if (mode == 'updates') {\n\t\t\t\tconst update = data;\n\n\t\t\t\t/**\n\t\t\t\t * This is how we get the tool INPUTS and llm\n\t\t\t\t * tokens that'll be used in returned content\n\t\t\t\t * blocks\n\t\t\t\t */\n\t\t\t\tif (update.model_request?.messages) {\n\t\t\t\t\tconst aiMessageChunks: AIMessageChunk[] = update.model_request.messages.filter(\n\t\t\t\t\t\t(m) => m.type == 'ai',\n\t\t\t\t\t) as AIMessageChunk[];\n\n\t\t\t\t\tfor (let aiChunk of aiMessageChunks) {\n\t\t\t\t\t\t// Accumulate usage metadata from current turn's AI messages\n\t\t\t\t\t\tconst um = (aiChunk as any).usage_metadata;\n\t\t\t\t\t\tif (um) {\n\t\t\t\t\t\t\tusageMetadata.promptTokens += um.input_tokens || 0;\n\t\t\t\t\t\t\tusageMetadata.completionTokens += um.output_tokens || 0;\n\t\t\t\t\t\t\tusageMetadata.totalTokens += um.total_tokens || 0;\n\t\t\t\t\t\t\tusageMetadata.cachedPromptTokens += um.input_token_details?.cache_read || 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (aiChunk.tool_calls && aiChunk.tool_calls.length > 0) {\n\t\t\t\t\t\t\tfor (let tc of aiChunk.tool_calls)\n\t\t\t\t\t\t\t\ttoolCallUpdates[tc.id as string] = {\n\t\t\t\t\t\t\t\t\tname: tc.name,\n\t\t\t\t\t\t\t\t\targs: tc.args,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (aiChunk.content && aiChunk.content.toString().trim().length > 0)\n\t\t\t\t\t\t\tcontentBlocks.push({\n\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\toutput: aiChunk.content.toString(),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * This is how we get the tool OUTPUTS that'll be\n\t\t\t\t * used in returned content blocks\n\t\t\t\t */\n\t\t\t\tif (update.tools?.messages) {\n\t\t\t\t\tconst toolMessages: ToolMessage[] = update.tools.messages.filter(\n\t\t\t\t\t\t(m) => m.type == 'tool',\n\t\t\t\t\t) as ToolMessage[];\n\n\t\t\t\t\tfor (let tm of toolMessages) {\n\t\t\t\t\t\tconst input = JSON.stringify(toolCallUpdates[tm.tool_call_id].args);\n\t\t\t\t\t\tconst toolCall = this.toolCalls.find((tc) => tc.id == tm.tool_call_id);\n\n\t\t\t\t\t\tif (this.shouldStreamToolEvent(tm.name as string))\n\t\t\t\t\t\t\tcontentBlocks.push({\n\t\t\t\t\t\t\t\ttype: 'tool_call',\n\t\t\t\t\t\t\t\tname: tm.name as string,\n\t\t\t\t\t\t\t\ttoolKit: this.getToolKitMeta(tm.name as string).toolKit,\n\t\t\t\t\t\t\t\ttoolKitIconUrl: this.getToolKitMeta(tm.name as string).toolKitIconUrl,\n\t\t\t\t\t\t\t\tinput: toolCall ? JSON.stringify(toolCall.input) : null,\n\t\t\t\t\t\t\t\toutput: tm.content.toString(),\n\t\t\t\t\t\t\t\ttoolCallId: tm.tool_call_id,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// console.error('\\n----------');\n\t\t\t\t// console.error('UPDATE');\n\t\t\t\t// console.error(JSON.stringify(data, null, 2));\n\t\t\t\t// console.error('----------\\n');\n\t\t\t} else if (mode == 'values') finalValue = data;\n\t\t}\n\n\t\tdebugLogStream('message_end', '\\n');\n\n\t\tyield { type: 'final_content', content: contentBlocks, usage: usageMetadata };\n\n\t\tyield { type: 'message_end' };\n\t}\n\n\tgetLangchainAgent(): ReactAgent {\n\t\treturn this.deepAgent;\n\t}\n\n\t/**\n\t * Tools have metadata fields that we can use\n\t * to get which toolKit this tool belongs to\n\t * and what's the toolKit's icon url.\n\t *\n\t * So we first find the tool using the tool's\n\t * name, then we extract the toolkit metadata\n\t * from that tool's metadata.\n\t */\n\tprivate getToolKitMeta(toolName: string): {\n\t\ttoolKit: string;\n\t\ttoolKitIconUrl: string;\n\t} {\n\t\tif (!this.tools)\n\t\t\treturn {\n\t\t\t\ttoolKit: '',\n\t\t\t\ttoolKitIconUrl: '',\n\t\t\t};\n\n\t\tconst tool = this.tools.find((t) => t.name === toolName);\n\n\t\tif (!tool) return { toolKit: '', toolKitIconUrl: '' };\n\n\t\treturn {\n\t\t\ttoolKit: tool.metadata?.toolKit as string,\n\t\t\ttoolKitIconUrl: tool.metadata?.toolKitIconUrl as string,\n\t\t};\n\t}\n\n\tprivate isToolCallMessage(message: BaseMessage): boolean {\n\t\tif (!(message instanceof AIMessageChunk)) return false;\n\n\t\tconst toolCallChunks = message.tool_call_chunks;\n\n\t\tif (!toolCallChunks) return false;\n\n\t\tif (toolCallChunks.length == 0) return false;\n\n\t\treturn true;\n\t}\n\n\tprivate shouldIgnoreMessage = (message: BaseMessage, metadata: any) => {\n\t\tif (message.id == '__remove_all__') return true;\n\n\t\t/**\n\t\t * For some reason there are AIMessageChunk messages\n\t\t * with empty content + no tool_call_chunks\n\t\t */\n\t\tif (!this.isToolCallMessage(message) && (!message.content || message.content.length == 0)) return true;\n\n\t\t/**\n\t\t * This is the tool selector middleware\n\t\t */\n\t\tif (metadata?.langgraph_node?.includes('patchToolCallsMiddleware')) return true;\n\n\t\tfor (const disabled of this.params.disableModelStreamingFor || [])\n\t\t\tif (metadata?.tags.includes(disabled)) return true;\n\n\t\treturn false;\n\t};\n\n\tprivate shouldStreamToolEvent(toolName: string): boolean {\n\t\tconst shouldStream = !this.params.disableToolStreamingFor?.includes(toolName);\n\n\t\tif (!shouldStream && ENABLE_STREAM_DEBUG_LOGS) console.warn('SUPPRESSING TOOL EVENT: ' + toolName);\n\n\t\treturn shouldStream;\n\t}\n}\n","import { ToolDefinition, ToolSpec } from '@core/agent.interface';\nimport { ToolProvider } from './tool-provider';\nimport { ToolCache } from '@core/tools/tool-cache';\n\ntype ProviderEntry<TContext> = {\n\ttype: 'provider';\n\tprovider: ToolProvider<TContext>;\n};\n\ntype StaticEntry = {\n\ttype: 'static';\n\ttools: ToolDefinition[];\n};\n\ntype Entry<TContext> = ProviderEntry<TContext> | StaticEntry;\n\nexport interface ToolRegistryOptions {\n\t/**\n\t * Shared cache for tool specs (e.g. Redis). Values are stored as JSON strings.\n\t */\n\ttoolSpecCache?: ToolCache;\n}\n\nexport class ToolRegistry<TContext> {\n\tprivate entries = new Map<string, Entry<TContext>>();\n\tprivate toolSpecCache?: ToolCache;\n\n\tconstructor(options: ToolRegistryOptions = {}) {\n\t\tthis.toolSpecCache = options.toolSpecCache;\n\t}\n\n\tregisterProvider(toolKit: string, provider: ToolProvider<TContext>): void {\n\t\tthis.entries.set(toolKit, { type: 'provider', provider });\n\t}\n\n\tregisterTools(toolKit: string, tools: ToolDefinition[]): void {\n\t\tthis.entries.set(toolKit, { type: 'static', tools });\n\t}\n\n\tasync getTools(toolKits: string[], context: TContext): Promise<ToolDefinition[]> {\n\t\tconst results: ToolDefinition[] = [];\n\n\t\tfor (const kit of toolKits) {\n\t\t\tconst entry = this.entries.get(kit);\n\t\t\tif (!entry) {\n\t\t\t\tthrow new Error(`No tools or provider registered for tool kit: ${kit}`);\n\t\t\t}\n\n\t\t\tif (entry.type === 'static') {\n\t\t\t\tresults.push(...entry.tools);\n\t\t\t} else {\n\t\t\t\tconst provider = entry.provider;\n\t\t\t\tconst specs = await this.getToolKitSpecs(kit, provider, context);\n\t\t\t\tconst tools = await provider.bindTools(specs, context);\n\t\t\t\tresults.push(...tools);\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tinvalidate(toolKit: string): void {\n\t\tconst entry = this.entries.get(toolKit);\n\n\t\tif (entry && entry.type === 'provider') this.toolSpecCache?.del(toolKit);\n\t}\n\n\tprivate async getToolKitSpecs(\n\t\ttoolKit: string,\n\t\tprovider: ToolProvider<TContext>,\n\t\tcontext: TContext,\n\t): Promise<ToolSpec[]> {\n\t\tconst cache = this.toolSpecCache;\n\n\t\tif (cache) {\n\t\t\ttry {\n\t\t\t\tconst cached = await cache.get(toolKit);\n\n\t\t\t\tif (cached) return cached;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('Something went wrong when hitting the cache', e);\n\t\t\t}\n\t\t}\n\n\t\tconst specs = (await provider.listToolKitSpecs(toolKit, context)) ?? [];\n\n\t\tif (cache) {\n\t\t\ttry {\n\t\t\t\tawait cache.set(toolKit, specs);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('Something went wrong when setting the cache', e);\n\t\t\t}\n\t\t}\n\n\t\treturn specs;\n\t}\n}\n","import { ToolSpec } from '@core/agent.interface';\nimport Redis from 'ioredis';\nimport { z } from 'zod';\n\nexport interface ToolCache {\n\tget(toolKit: string): Promise<ToolSpec[] | null> | ToolSpec[] | null;\n\n\tset(toolKit: string, specs: ToolSpec[]): Promise<void>;\n\n\tdel(toolKit: string): Promise<void>;\n}\n\nexport class RedisToolCache implements ToolCache {\n\tprivate redis: Redis;\n\n\tconstructor(connectionString: string) {\n\t\tthis.redis = new Redis(connectionString);\n\t}\n\n\tasync get(toolKit: string): Promise<ToolSpec[] | null> {\n\t\tconst data = await this.redis.get(`tool-cache:${toolKit}`);\n\n\t\tif (!data) return null;\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(data);\n\n\t\t\tif (!Array.isArray(parsed)) return null;\n\n\t\t\treturn parsed.map((spec: any) => ({\n\t\t\t\t...spec,\n\t\t\t\tinputSchema: z.fromJSONSchema(spec.inputSchema),\n\t\t\t}));\n\t\t} catch (e) {\n\t\t\tconsole.error('Failed to parse cached tools', e);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync set(toolKit: string, specs: ToolSpec[]): Promise<void> {\n\t\tconst serialized = specs.map((spec) => ({\n\t\t\t...spec,\n\t\t\tinputSchema: spec.inputSchema.toJSONSchema(),\n\t\t}));\n\t\tawait this.redis.set(`tool-cache:${toolKit}`, JSON.stringify(serialized));\n\t}\n\n\tasync del(toolKit: string): Promise<void> {\n\t\tawait this.redis.del(`tool-cache:${toolKit}`);\n\t}\n}\n\nexport class InMemoryToolCache implements ToolCache {\n\tprivate cache = new Map<string, ToolSpec[]>();\n\n\tget(toolKit: string): ToolSpec[] | null {\n\t\treturn this.cache.get(`tool-cache:${toolKit}`) ?? null;\n\t}\n\n\tasync set(toolKit: string, specs: ToolSpec[]): Promise<void> {\n\t\tthis.cache.set(`tool-cache:${toolKit}`, specs);\n\t}\n\n\tasync del(toolKit: string): Promise<void> {\n\t\tthis.cache.delete(`tool-cache:${toolKit}`);\n\t}\n}\n"],"mappings":"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","names":["input","tool","options"]}
1
+ {"version":3,"sources":["../src/runtime/langchain/factory.ts","../src/runtime/langchain/agent.ts","../src/core/tools/tool-registry.ts","../src/core/tools/tool-cache.ts"],"sourcesContent":["import { AgentFactory, CreateAgentOptions } from '@core/agent.factory';\nimport { Agent } from '@core/agent.interface';\nimport { PostgresSaver } from '@langchain/langgraph-checkpoint-postgres';\n// @ts-ignore -_-\nimport { PostgresStore } from '@langchain/langgraph-checkpoint-postgres/store';\nimport { CompositeBackend, StateBackend, StoreBackend } from 'deepagents';\nimport { AgentMiddleware, llmToolSelectorMiddleware, summarizationMiddleware, tool } from 'langchain';\nimport { CreateOptions, LangchainAgent } from './agent';\nimport { LangchainModelConfig, LangchainModelResolver } from './model-resolver';\n\nexport interface PostgresSaverConfig {\n\tconnString: string;\n\tschema: string;\n}\n\nexport interface PostgresStoreConfig {\n\tconnString: string;\n\tschema: string;\n}\n\nexport class LangchainAgentFactory implements AgentFactory {\n\tprivate modelResolver: LangchainModelResolver;\n\n\tconstructor(\n\t\tprivate modelConfig: LangchainModelConfig,\n\t\tprivate saverConfig: PostgresSaverConfig,\n\t\tprivate storeConfig: PostgresStoreConfig,\n\t) {\n\t\tthis.modelResolver = new LangchainModelResolver(this.modelConfig);\n\t}\n\n\tprivate buildMemorySystemPrompt(slots: { name: string; usedFor: string }[]): string {\n\t\tconst lines = [\n\t\t\t'Long-term memory is enabled.',\n\t\t\t'Persist memories using the filesystem tools under these path prefixes:',\n\t\t\t...slots.map((slot) => {\n\t\t\t\tconst prefix = this.normalizeStoreRoutePrefix(slot.name);\n\t\t\t\treturn `- ${prefix}: ${slot.usedFor}`;\n\t\t\t}),\n\t\t];\n\n\t\treturn lines.join('\\n');\n\t}\n\n\tprivate buildHandoffsSystemPrompt(handoffs: { name: string; description: string }[]): string {\n\t\tconst lines = [\n\t\t\t'You can delegate tasks to the following subagents:',\n\t\t\t...handoffs.map((handoff) => `- ${handoff.name}: ${handoff.description}`),\n\t\t];\n\n\t\treturn lines.join('\\n');\n\t}\n\n\tprivate normalizeStoreRoutePrefix(prefix: string): string {\n\t\tconst trimmedPrefix = prefix.trim();\n\t\tif (trimmedPrefix.length === 0) {\n\t\t\tthrow new Error('Memory slot name cannot be empty');\n\t\t}\n\n\t\tconst withLeadingSlash = trimmedPrefix.startsWith('/') ? trimmedPrefix : `/${trimmedPrefix}`;\n\t\treturn withLeadingSlash.endsWith('/') ? withLeadingSlash : `${withLeadingSlash}/`;\n\t}\n\n\tasync createAgent(options: CreateAgentOptions): Promise<Agent> {\n\t\tlet deepAgentOptions: CreateOptions = {\n\t\t\tmodel: this.modelResolver.resolve(options.model, [], options.reasoning),\n\t\t};\n\n\t\tlet middlewares: AgentMiddleware[] = [];\n\t\tlet systemPrompt = options.instructions ?? '';\n\t\tlet disableStreamingForTools: string[] = [\n\t\t\t'write_todos',\n\t\t\t'ls',\n\t\t\t'read_file',\n\t\t\t'write_file',\n\t\t\t'edit_file',\n\t\t\t'glob',\n\t\t\t'grep',\n\t\t\t'task',\n\t\t];\n\t\tlet disableReportingForTools: string[] = disableStreamingForTools;\n\t\tlet disableModelStreamingFor: string[] = [];\n\n\t\tif (options.history) {\n\t\t\tconst checkpointer = PostgresSaver.fromConnString(this.saverConfig.connString, {\n\t\t\t\tschema: this.saverConfig.schema,\n\t\t\t});\n\n\t\t\tawait checkpointer.setup();\n\n\t\t\tdeepAgentOptions.checkpointer = checkpointer;\n\t\t}\n\n\t\tif (options.memory) {\n\t\t\tconst memorySystemPrompt = this.buildMemorySystemPrompt(options.memory.slots);\n\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${memorySystemPrompt}` : memorySystemPrompt;\n\n\t\t\tdeepAgentOptions.store = new PostgresStore({\n\t\t\t\tconnectionOptions: this.storeConfig.connString,\n\t\t\t\tschema: this.storeConfig.schema,\n\t\t\t\tensureTables: true,\n\t\t\t});\n\t\t\t/**\n\t\t\t * StateBackend for ephemeral storage\n\t\t\t * StoreBackend for persistent storage\n\t\t\t */\n\t\t\tdeepAgentOptions.backend = (config) => {\n\t\t\t\tconst configWithAssistantId = { ...config, assistantId: options.memory?.assistantId };\n\t\t\t\tconst storeBackend = new StoreBackend(configWithAssistantId);\n\t\t\t\tconst routes = Object.fromEntries(\n\t\t\t\t\t(options.memory?.slots ?? []).map((slot) => {\n\t\t\t\t\t\tconst routePrefix = this.normalizeStoreRoutePrefix(slot.name);\n\t\t\t\t\t\treturn [routePrefix, storeBackend];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\treturn new CompositeBackend(new StateBackend(configWithAssistantId), {\n\t\t\t\t\t...routes,\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tif (options.tools) {\n\t\t\tdeepAgentOptions.tools = options.tools.tools.map((t) =>\n\t\t\t\ttool(\n\t\t\t\t\tasync (input, options) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst res = await t.exec(input);\n\n\t\t\t\t\t\t\tif (typeof res === 'string') return res;\n\n\t\t\t\t\t\t\treturn JSON.stringify(res);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error('Error executing tool:', e);\n\t\t\t\t\t\t\treturn 'Something went wrong while executing the tool.';\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tname: t.name,\n\t\t\t\t\t\tdescription: t.description,\n\t\t\t\t\t\tschema: t.inputSchema,\n\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\ttoolKit: t.toolKit,\n\t\t\t\t\t\t\ttoolKitIconUrl: t.toolKitIconUrl,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\t\t\tmiddlewares.push(\n\t\t\t\tllmToolSelectorMiddleware({\n\t\t\t\t\tmodel: this.modelResolver.resolve(options.tools.model, ['tool-selector']),\n\t\t\t\t\tmaxTools: 128,\n\t\t\t\t\talwaysInclude: options.tools.alwaysIncludeTools ?? undefined,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tdisableModelStreamingFor.push('tool-selector');\n\t\t}\n\n\t\tif (options.summarization)\n\t\t\tmiddlewares.push(\n\t\t\t\tsummarizationMiddleware({\n\t\t\t\t\tmodel: this.modelResolver.resolve(options.summarization.model),\n\t\t\t\t\ttrigger: {\n\t\t\t\t\t\ttokens: options.summarization.triggerAtTokens,\n\t\t\t\t\t},\n\t\t\t\t\tkeep: {\n\t\t\t\t\t\tmessages: options.summarization.keepMessages,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t);\n\n\t\tif (options.handoffs) {\n\t\t\toptions.handoffs.every((h) => {\n\t\t\t\tif (!(h.agent instanceof LangchainAgent)) {\n\t\t\t\t\tthrow new Error('Handoff agent must be an instance of LangchainAgent');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst handoffsSystemPrompt = this.buildHandoffsSystemPrompt(options.handoffs);\n\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${handoffsSystemPrompt}` : handoffsSystemPrompt;\n\n\t\t\tdeepAgentOptions.subagents = options.handoffs.map((h) => {\n\t\t\t\treturn {\n\t\t\t\t\tname: h.name,\n\t\t\t\t\tdescription: h.description,\n\t\t\t\t\trunnable: (h.agent as LangchainAgent).getLangchainAgent(),\n\t\t\t\t};\n\t\t\t});\n\t\t}\n\n\t\tif (middlewares.length > 0) deepAgentOptions.middleware = middlewares;\n\n\t\tif (systemPrompt) deepAgentOptions.systemPrompt = systemPrompt;\n\n\t\tdeepAgentOptions.disableModelStreamingFor = disableModelStreamingFor;\n\t\tdeepAgentOptions.disableToolReportingFor = disableReportingForTools;\n\t\tdeepAgentOptions.disableToolStreamingFor = disableStreamingForTools;\n\n\t\treturn new LangchainAgent(deepAgentOptions);\n\t}\n}\n","import {\n\tAgent,\n\tAgentResult,\n\tAgentRunInput,\n\tContentBlock,\n\tStreamEvent,\n\tToolCall,\n\tUsageMeta,\n} from '@core/agent.interface';\nimport { ToolCallChunk, ToolMessage } from '@langchain/core/messages';\nimport { Command } from '@langchain/langgraph';\nimport { createDeepAgent, CreateDeepAgentParams } from 'deepagents';\nimport { AgentMiddleware, AIMessageChunk, BaseMessage, createMiddleware, ReactAgent, StructuredTool } from 'langchain';\nimport { convertToLangchainMessages } from './utils';\n\nconst ENABLE_STREAM_DEBUG_LOGS = false;\n\nfunction debugLogStream(type: StreamEvent['type'], text: string) {\n\tif (!ENABLE_STREAM_DEBUG_LOGS) return;\n\n\tconsole.warn(`${type}: ${text}`);\n}\n\nexport interface CreateOptions extends CreateDeepAgentParams {\n\t/**\n\t * Tool names to disable streaming for\n\t */\n\tdisableToolStreamingFor?: string[];\n\n\t/**\n\t * Tool names to disable streaming for\n\t */\n\tdisableToolReportingFor?: string[];\n\n\t/**\n\t * Model tags to disable streaming for\n\t */\n\tdisableModelStreamingFor?: string[];\n}\n\nexport class LangchainAgent implements Agent {\n\tprivate deepAgent: ReactAgent;\n\tprivate toolCalls: ToolCall[] = [];\n\tprivate tools?: StructuredTool[];\n\n\tconstructor(private params: CreateOptions) {\n\t\tthis.tools = params.tools;\n\n\t\tif (!params.disableModelStreamingFor) params.disableModelStreamingFor = [];\n\t\tif (!params.disableToolReportingFor) params.disableToolReportingFor = [];\n\t\tif (!params.disableToolStreamingFor) params.disableToolStreamingFor = [];\n\n\t\tlet middlewares: AgentMiddleware[] = [\n\t\t\tcreateMiddleware({\n\t\t\t\tname: 'toolCallsReporter',\n\t\t\t\twrapToolCall: async (request, handler) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst res = await handler(request);\n\n\t\t\t\t\t\tif (this.params.disableToolReportingFor?.includes(request.tool?.name as string)) return res;\n\n\t\t\t\t\t\tthis.toolCalls.push({\n\t\t\t\t\t\t\tid: request.toolCall.id as string,\n\t\t\t\t\t\t\tname: (request.tool?.name as string) || '',\n\t\t\t\t\t\t\tinput: request.toolCall.args,\n\t\t\t\t\t\t\toutput: res.toJSON(),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Wrapped tool may sometimes return Command objects\n\t\t\t\t\t\t * which should actually trigger the \"updates\" mode\n\t\t\t\t\t\t * of stream. But we don't want that to happen. We\n\t\t\t\t\t\t * want to emit tool_result events from a single place.\n\t\t\t\t\t\t * So we extract the tool message from the update and\n\t\t\t\t\t\t * command.update.messages and return that. That way\n\t\t\t\t\t\t * 'messages' stream mode is triggered\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * Hopefully this won't cause any issues.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (res instanceof Command) {\n\t\t\t\t\t\t\tconst resCast: {\n\t\t\t\t\t\t\t\tupdate?: {\n\t\t\t\t\t\t\t\t\tmessages?: BaseMessage[];\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t} = res as any;\n\n\t\t\t\t\t\t\tif (!resCast.update?.messages || resCast.update.messages.length == 0) return res;\n\n\t\t\t\t\t\t\tconst toolMessage = resCast.update.messages.find((m: BaseMessage) => m.type == 'tool');\n\n\t\t\t\t\t\t\tif (!toolMessage) return res;\n\n\t\t\t\t\t\t\treturn toolMessage as ToolMessage;\n\t\t\t\t\t\t} else return res;\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\treturn new ToolMessage({\n\t\t\t\t\t\t\tname: request.toolCall.name,\n\t\t\t\t\t\t\tcontent: 'Something went wrong: ' + e.message,\n\t\t\t\t\t\t\ttool_call_id: request.toolCall.id || 'TOOL_CALL_ERROR',\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t}),\n\t\t];\n\n\t\tif (params.middleware) middlewares = [...middlewares, ...params.middleware];\n\n\t\tparams.middleware = middlewares;\n\n\t\tthis.deepAgent = createDeepAgent(params);\n\t}\n\n\tasync run(input: AgentRunInput): Promise<AgentResult> {\n\t\tthis.toolCalls = []; // Reset tool calls for each run\n\n\t\t// Get current state to know how many messages existed before this turn\n\t\t// If no checkpointer is set, assume this is a fresh conversation\n\t\tlet messageCountBefore = 0;\n\t\ttry {\n\t\t\tconst stateBefore = await this.deepAgent.getState({\n\t\t\t\tconfigurable: {\n\t\t\t\t\tthreadId: input.threadId,\n\t\t\t\t\tthread_id: input.threadId,\n\t\t\t\t},\n\t\t\t});\n\t\t\tmessageCountBefore = (stateBefore as any)?.values?.messages?.length || 0;\n\t\t} catch {\n\t\t\t// No checkpointer set - this is fine, we'll count from 0\n\t\t}\n\n\t\tconst messages = convertToLangchainMessages(input.messages);\n\n\t\tconst result = await this.deepAgent.invoke(\n\t\t\t{\n\t\t\t\tmessages: messages,\n\t\t\t},\n\t\t\t{\n\t\t\t\tconfigurable: {\n\t\t\t\t\tthreadId: input.threadId,\n\t\t\t\t\tthread_id: input.threadId,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\t// Only sum usage from messages added in this turn\n\t\tconst newMessages = result.messages.slice(messageCountBefore);\n\t\tconst messagesWithUsage = newMessages.filter((m: any) => m.usage_metadata != null);\n\n\t\tlet usage = {\n\t\t\tinput_tokens: 0,\n\t\t\toutput_tokens: 0,\n\t\t\ttotal_tokens: 0,\n\t\t\tcache_read: 0,\n\t\t\treasoning_tokens: 0,\n\t\t};\n\n\t\tmessagesWithUsage.forEach((m: any) => {\n\t\t\tusage.input_tokens += m.usage_metadata.input_tokens || 0;\n\t\t\tusage.output_tokens += m.usage_metadata.output_tokens || 0;\n\t\t\tusage.total_tokens += m.usage_metadata.total_tokens || 0;\n\t\t\tusage.cache_read += m.usage_metadata.input_token_details?.cache_read || 0;\n\t\t\tusage.reasoning_tokens += m.usage_metadata.output_token_details?.reasoning || 0;\n\t\t});\n\n\t\t// Build content blocks from new messages\n\t\tconst contentBlocks: ContentBlock[] = [];\n\t\tconst toolCallInputs: { [toolCallId: string]: any } = {};\n\n\t\tfor (const msg of newMessages) {\n\t\t\tconst m = msg as any;\n\t\t\tif (m.type === 'ai') {\n\t\t\t\t// Store tool call inputs for later pairing\n\t\t\t\tif (m.tool_calls && m.tool_calls.length > 0) {\n\t\t\t\t\tfor (const tc of m.tool_calls) {\n\t\t\t\t\t\ttoolCallInputs[tc.id] = tc.args;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Add text content if present\n\t\t\t\tif (m.content) {\n\t\t\t\t\tconst textOutput = this.extractTextContent(m.content);\n\t\t\t\t\tif (textOutput.trim().length > 0) {\n\t\t\t\t\t\tcontentBlocks.push({\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\toutput: textOutput,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (m.type === 'tool') {\n\t\t\t\tcontentBlocks.push({\n\t\t\t\t\ttype: 'tool_call',\n\t\t\t\t\tname: m.name,\n\t\t\t\t\ttoolKit: this.getToolKitMeta(m.name).toolKit,\n\t\t\t\t\ttoolKitIconUrl: this.getToolKitMeta(m.name).toolKitIconUrl,\n\t\t\t\t\tinput: JSON.stringify(toolCallInputs[m.tool_call_id] || {}),\n\t\t\t\t\toutput: m.content.toString(),\n\t\t\t\t\ttoolCallId: m.tool_call_id,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tcontent: contentBlocks,\n\t\t\ttoolCalls: this.toolCalls,\n\t\t\tusage: {\n\t\t\t\tpromptTokens: usage.input_tokens,\n\t\t\t\tcompletionTokens: usage.output_tokens,\n\t\t\t\ttotalTokens: usage.total_tokens,\n\t\t\t\tcachedPromptTokens: usage.cache_read,\n\t\t\t\treasoningTokens: usage.reasoning_tokens,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync *stream(input: AgentRunInput): AsyncGenerator<StreamEvent> {\n\t\tthis.toolCalls = []; // Reset tool calls for each stream\n\t\tconst contentBlocks: ContentBlock[] = []; // this will be our final return value\n\t\tlet finalValue;\n\n\t\t// Initialize usage metadata - accumulated from updates mode (current turn only)\n\t\tlet usageMetadata: UsageMeta = {\n\t\t\tpromptTokens: 0,\n\t\t\tcompletionTokens: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcachedPromptTokens: 0,\n\t\t\treasoningTokens: 0,\n\t\t};\n\n\t\tconst messages = convertToLangchainMessages(input.messages);\n\n\t\tdebugLogStream('message_start', '');\n\n\t\t// Emit message start\n\t\tyield { type: 'message_start' };\n\n\t\tconst stream = await this.deepAgent.stream(\n\t\t\t{ messages },\n\t\t\t{\n\t\t\t\tconfigurable: {\n\t\t\t\t\tthreadId: input.threadId,\n\t\t\t\t\tthread_id: input.threadId,\n\t\t\t\t},\n\t\t\t\tstreamMode: ['messages', 'updates', 'values'],\n\t\t\t},\n\t\t);\n\n\t\tlet toolCalls: {\n\t\t\t[index: number]: {\n\t\t\t\ttoolCallId: string;\n\t\t\t\tname: string;\n\t\t\t};\n\t\t} = {};\n\t\tconst toolCallUpdates: {\n\t\t\t[toolCallId: string]: {\n\t\t\t\tname: string;\n\t\t\t\targs: any;\n\t\t\t};\n\t\t} = {};\n\n\t\t/**\n\t\t * Process chunks produced by the LLM\n\t\t */\n\t\tfor await (const chunk of stream) {\n\t\t\tconst [mode, data] = chunk;\n\n\t\t\tif (mode === 'messages') {\n\t\t\t\tconst [message, metadata] = data;\n\n\t\t\t\t/**\n\t\t\t\t * Some messages carry no meaningful information\n\t\t\t\t */\n\t\t\t\tif (this.shouldIgnoreMessage(message, metadata)) continue;\n\n\t\t\t\t/**\n\t\t\t\t * LLMs also stream the tool input tokens. If we see\n\t\t\t\t * tool_call_chunks inside the message, we know it's\n\t\t\t\t * a token stream for a tool call.\n\t\t\t\t */\n\t\t\t\tif (this.isToolCallMessage(message)) {\n\t\t\t\t\tconst aiMessage = message as AIMessageChunk;\n\t\t\t\t\tconst toolCallChunks = aiMessage.tool_call_chunks as ToolCallChunk[];\n\n\t\t\t\t\tfor (const toolChunk of toolCallChunks) {\n\t\t\t\t\t\tconst toolCallIndex = toolChunk.index as number;\n\n\t\t\t\t\t\tconst getToolCallInfo = () => {\n\t\t\t\t\t\t\treturn toolCalls[toolCallIndex];\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * On the first chunk, we get the tool name in\n\t\t\t\t\t\t * chunk.id. On sequential chunks this property\n\t\t\t\t\t\t * is set to defined. So if there is id in the\n\t\t\t\t\t\t * chunk; this is a tool_start event.\n\t\t\t\t\t\t *\n\t\t\t\t\t\t * Also different tool calls are separated using\n\t\t\t\t\t\t * the \"index\" property. This exists in all tool\n\t\t\t\t\t\t * chunk messages.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (toolChunk.id) {\n\t\t\t\t\t\t\ttoolCalls[toolChunk.index as number] = {\n\t\t\t\t\t\t\t\ttoolCallId: toolChunk.id,\n\t\t\t\t\t\t\t\tname: toolChunk.name as string,\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tif (!this.shouldStreamToolEvent(getToolCallInfo().name)) continue;\n\n\t\t\t\t\t\t\tconst toolKitMeta = this.getToolKitMeta(getToolCallInfo().name);\n\n\t\t\t\t\t\t\tdebugLogStream('tool_start', `[${getToolCallInfo().toolCallId}] ${getToolCallInfo().name}`);\n\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: 'tool_start',\n\t\t\t\t\t\t\t\tname: getToolCallInfo().name,\n\t\t\t\t\t\t\t\ttoolKit: toolKitMeta.toolKit,\n\t\t\t\t\t\t\t\ttoolKitIconUrl: toolKitMeta.toolKitIconUrl,\n\t\t\t\t\t\t\t\tindex: toolCallIndex,\n\t\t\t\t\t\t\t\ttoolCallId: getToolCallInfo().toolCallId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (toolChunk.args && toolChunk.args.length > 0) {\n\t\t\t\t\t\t\tif (!this.shouldStreamToolEvent(getToolCallInfo().name)) continue;\n\n\t\t\t\t\t\t\tdebugLogStream('tool_input_delta', `[${getToolCallInfo().toolCallId}] ${toolChunk.args}`);\n\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: 'tool_input_delta',\n\t\t\t\t\t\t\t\tname: getToolCallInfo().name,\n\t\t\t\t\t\t\t\targs: toolChunk.args || '',\n\t\t\t\t\t\t\t\tindex: toolCallIndex,\n\t\t\t\t\t\t\t\ttoolCallId: getToolCallInfo().toolCallId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (this.isReasoningMessage(message)) {\n\t\t\t\t\tconst contentArray = message.content as any[];\n\t\t\t\t\tfor (const block of contentArray) {\n\t\t\t\t\t\tif (block.type === 'reasoning' && block.reasoning) {\n\t\t\t\t\t\t\tdebugLogStream('reasoning_delta', block.reasoning);\n\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: 'reasoning_delta',\n\t\t\t\t\t\t\t\tdelta: block.reasoning,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (this.isArrayTextMessage(message)) {\n\t\t\t\t\tconst contentArray = message.content as any[];\n\t\t\t\t\tfor (const block of contentArray) {\n\t\t\t\t\t\tif (block.type === 'text' && block.text) {\n\t\t\t\t\t\t\tdebugLogStream('text_delta', block.text);\n\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: 'text_delta',\n\t\t\t\t\t\t\t\tdelta: block.text,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (message?.content && typeof message.content === 'string') {\n\t\t\t\t\tconst content = message.content;\n\n\t\t\t\t\tif (content.length === 0) continue;\n\n\t\t\t\t\tif (message.type == 'tool') {\n\t\t\t\t\t\t// I know it's odd but ToolMessage.name seems to corelate to the tool name\n\t\t\t\t\t\tconst toolName = message.name as string;\n\t\t\t\t\t\tconst toolKitMeta = this.getToolKitMeta(toolName);\n\n\t\t\t\t\t\tconst toolCall = Object.entries(toolCalls).find(\n\t\t\t\t\t\t\t([_, value]) => value.toolCallId == (message as ToolMessage).tool_call_id,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (!this.shouldStreamToolEvent(toolName)) continue;\n\n\t\t\t\t\t\tdebugLogStream('tool_result', `[${toolCall?.[1].toolCallId}] ${message.content}`);\n\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: 'tool_result',\n\t\t\t\t\t\t\tname: toolName,\n\t\t\t\t\t\t\tinput:\n\t\t\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\t\t\tthis.toolCalls.find((tc) => tc.id == (toolCall as any)[1].toolCallId)?.input,\n\t\t\t\t\t\t\t\t) || '',\n\t\t\t\t\t\t\toutput: message.content,\n\t\t\t\t\t\t\ttoolKit: toolKitMeta.toolKit,\n\t\t\t\t\t\t\ttoolKitIconUrl: toolKitMeta.toolKitIconUrl,\n\t\t\t\t\t\t\tindex: toolCall?.[0] ? parseInt(toolCall[0]) : 99999,\n\t\t\t\t\t\t\ttoolCallId: toolCall?.[1] ? toolCall[1].toolCallId : 'NO_ID_FOUND',\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdebugLogStream('text_delta', content);\n\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: 'text_delta',\n\t\t\t\t\t\t\tdelta: content,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn('Unexpected messages stream chunk', chunk);\n\t\t\t\t}\n\t\t\t} else if (mode == 'updates') {\n\t\t\t\tconst update = data;\n\n\t\t\t\t/**\n\t\t\t\t * This is how we get the tool INPUTS and llm\n\t\t\t\t * tokens that'll be used in returned content\n\t\t\t\t * blocks\n\t\t\t\t */\n\t\t\t\tif (update.model_request?.messages) {\n\t\t\t\t\tconst aiMessageChunks: AIMessageChunk[] = update.model_request.messages.filter(\n\t\t\t\t\t\t(m) => m.type == 'ai',\n\t\t\t\t\t) as AIMessageChunk[];\n\n\t\t\t\t\tfor (let aiChunk of aiMessageChunks) {\n\t\t\t\t\t\t// Accumulate usage metadata from current turn's AI messages\n\t\t\t\t\t\tconst um = (aiChunk as any).usage_metadata;\n\t\t\t\t\t\tif (um) {\n\t\t\t\t\t\t\tusageMetadata.promptTokens += um.input_tokens || 0;\n\t\t\t\t\t\t\tusageMetadata.completionTokens += um.output_tokens || 0;\n\t\t\t\t\t\t\tusageMetadata.totalTokens += um.total_tokens || 0;\n\t\t\t\t\t\t\tusageMetadata.cachedPromptTokens += um.input_token_details?.cache_read || 0;\n\t\t\t\t\t\t\tusageMetadata.reasoningTokens =\n\t\t\t\t\t\t\t\t(usageMetadata.reasoningTokens || 0) + (um.output_token_details?.reasoning || 0);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (aiChunk.tool_calls && aiChunk.tool_calls.length > 0) {\n\t\t\t\t\t\t\tfor (let tc of aiChunk.tool_calls)\n\t\t\t\t\t\t\t\ttoolCallUpdates[tc.id as string] = {\n\t\t\t\t\t\t\t\t\tname: tc.name,\n\t\t\t\t\t\t\t\t\targs: tc.args,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (aiChunk.content) {\n\t\t\t\t\t\t\tconst textOutput = this.extractTextContent(aiChunk.content);\n\t\t\t\t\t\t\tif (textOutput.trim().length > 0)\n\t\t\t\t\t\t\t\tcontentBlocks.push({\n\t\t\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\t\t\toutput: textOutput,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * This is how we get the tool OUTPUTS that'll be\n\t\t\t\t * used in returned content blocks\n\t\t\t\t */\n\t\t\t\tif (update.tools?.messages) {\n\t\t\t\t\tconst toolMessages: ToolMessage[] = update.tools.messages.filter(\n\t\t\t\t\t\t(m) => m.type == 'tool',\n\t\t\t\t\t) as ToolMessage[];\n\n\t\t\t\t\tfor (let tm of toolMessages) {\n\t\t\t\t\t\tconst input = JSON.stringify(toolCallUpdates[tm.tool_call_id].args);\n\t\t\t\t\t\tconst toolCall = this.toolCalls.find((tc) => tc.id == tm.tool_call_id);\n\n\t\t\t\t\t\tif (this.shouldStreamToolEvent(tm.name as string))\n\t\t\t\t\t\t\tcontentBlocks.push({\n\t\t\t\t\t\t\t\ttype: 'tool_call',\n\t\t\t\t\t\t\t\tname: tm.name as string,\n\t\t\t\t\t\t\t\ttoolKit: this.getToolKitMeta(tm.name as string).toolKit,\n\t\t\t\t\t\t\t\ttoolKitIconUrl: this.getToolKitMeta(tm.name as string).toolKitIconUrl,\n\t\t\t\t\t\t\t\tinput: toolCall ? JSON.stringify(toolCall.input) : null,\n\t\t\t\t\t\t\t\toutput: tm.content.toString(),\n\t\t\t\t\t\t\t\ttoolCallId: tm.tool_call_id,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// console.error('\\n----------');\n\t\t\t\t// console.error('UPDATE');\n\t\t\t\t// console.error(JSON.stringify(data, null, 2));\n\t\t\t\t// console.error('----------\\n');\n\t\t\t} else if (mode == 'values') finalValue = data;\n\t\t}\n\n\t\tdebugLogStream('message_end', '\\n');\n\n\t\tyield { type: 'final_content', content: contentBlocks, usage: usageMetadata };\n\n\t\tyield { type: 'message_end' };\n\t}\n\n\tgetLangchainAgent(): ReactAgent {\n\t\treturn this.deepAgent;\n\t}\n\n\t/**\n\t * Tools have metadata fields that we can use\n\t * to get which toolKit this tool belongs to\n\t * and what's the toolKit's icon url.\n\t *\n\t * So we first find the tool using the tool's\n\t * name, then we extract the toolkit metadata\n\t * from that tool's metadata.\n\t */\n\tprivate getToolKitMeta(toolName: string): {\n\t\ttoolKit: string;\n\t\ttoolKitIconUrl: string;\n\t} {\n\t\tif (!this.tools)\n\t\t\treturn {\n\t\t\t\ttoolKit: '',\n\t\t\t\ttoolKitIconUrl: '',\n\t\t\t};\n\n\t\tconst tool = this.tools.find((t) => t.name === toolName);\n\n\t\tif (!tool) return { toolKit: '', toolKitIconUrl: '' };\n\n\t\treturn {\n\t\t\ttoolKit: tool.metadata?.toolKit as string,\n\t\t\ttoolKitIconUrl: tool.metadata?.toolKitIconUrl as string,\n\t\t};\n\t}\n\n\tprivate isToolCallMessage(message: BaseMessage): boolean {\n\t\tif (!(message instanceof AIMessageChunk)) return false;\n\n\t\tconst toolCallChunks = message.tool_call_chunks;\n\n\t\tif (!toolCallChunks) return false;\n\n\t\tif (toolCallChunks.length == 0) return false;\n\n\t\treturn true;\n\t}\n\n\tprivate shouldIgnoreMessage = (message: BaseMessage, metadata: any) => {\n\t\tif (message.id == '__remove_all__') return true;\n\n\t\t/**\n\t\t * For some reason there are AIMessageChunk messages\n\t\t * with empty content + no tool_call_chunks\n\t\t */\n\t\tif (!this.isToolCallMessage(message) && (!message.content || message.content.length == 0)) return true;\n\n\t\t/**\n\t\t * This is the tool selector middleware\n\t\t */\n\t\tif (metadata?.langgraph_node?.includes('patchToolCallsMiddleware')) return true;\n\n\t\tfor (const disabled of this.params.disableModelStreamingFor || [])\n\t\t\tif (metadata?.tags.includes(disabled)) return true;\n\n\t\treturn false;\n\t};\n\n\tprivate shouldStreamToolEvent(toolName: string): boolean {\n\t\tconst shouldStream = !this.params.disableToolStreamingFor?.includes(toolName);\n\n\t\tif (!shouldStream && ENABLE_STREAM_DEBUG_LOGS) console.warn('SUPPRESSING TOOL EVENT: ' + toolName);\n\n\t\treturn shouldStream;\n\t}\n\n\tprivate isReasoningMessage(message: BaseMessage): boolean {\n\t\tif (!Array.isArray(message.content)) return false;\n\t\treturn (message.content as any[]).some((block) => block.type === 'reasoning' && block.reasoning);\n\t}\n\n\tprivate isArrayTextMessage(message: BaseMessage): boolean {\n\t\tif (!Array.isArray(message.content)) return false;\n\t\treturn (message.content as any[]).some((block) => block.type === 'text' && block.text);\n\t}\n\n\t/**\n\t * Extracts text from message content that may be a string\n\t * or an array of content blocks (as returned by reasoning models).\n\t */\n\tprivate extractTextContent(content: any): string {\n\t\tif (typeof content === 'string') return content;\n\n\t\tif (Array.isArray(content)) {\n\t\t\treturn content\n\t\t\t\t.filter((block) => block.type === 'text' && block.text)\n\t\t\t\t.map((block) => block.text)\n\t\t\t\t.join('');\n\t\t}\n\n\t\treturn content.toString();\n\t}\n}\n","import { ToolDefinition, ToolSpec } from '@core/agent.interface';\nimport { ToolProvider } from './tool-provider';\nimport { ToolCache } from '@core/tools/tool-cache';\n\ntype ProviderEntry<TContext> = {\n\ttype: 'provider';\n\tprovider: ToolProvider<TContext>;\n};\n\ntype StaticEntry = {\n\ttype: 'static';\n\ttools: ToolDefinition[];\n};\n\ntype Entry<TContext> = ProviderEntry<TContext> | StaticEntry;\n\nexport interface ToolRegistryOptions {\n\t/**\n\t * Shared cache for tool specs (e.g. Redis). Values are stored as JSON strings.\n\t */\n\ttoolSpecCache?: ToolCache;\n}\n\nexport class ToolRegistry<TContext> {\n\tprivate entries = new Map<string, Entry<TContext>>();\n\tprivate toolSpecCache?: ToolCache;\n\n\tconstructor(options: ToolRegistryOptions = {}) {\n\t\tthis.toolSpecCache = options.toolSpecCache;\n\t}\n\n\tregisterProvider(toolKit: string, provider: ToolProvider<TContext>): void {\n\t\tthis.entries.set(toolKit, { type: 'provider', provider });\n\t}\n\n\tregisterTools(toolKit: string, tools: ToolDefinition[]): void {\n\t\tthis.entries.set(toolKit, { type: 'static', tools });\n\t}\n\n\tasync getTools(toolKits: string[], context: TContext): Promise<ToolDefinition[]> {\n\t\tconst results: ToolDefinition[] = [];\n\n\t\tfor (const kit of toolKits) {\n\t\t\tconst entry = this.entries.get(kit);\n\t\t\tif (!entry) {\n\t\t\t\tthrow new Error(`No tools or provider registered for tool kit: ${kit}`);\n\t\t\t}\n\n\t\t\tif (entry.type === 'static') {\n\t\t\t\tresults.push(...entry.tools);\n\t\t\t} else {\n\t\t\t\tconst provider = entry.provider;\n\t\t\t\tconst specs = await this.getToolKitSpecs(kit, provider, context);\n\t\t\t\tconst tools = await provider.bindTools(specs, context);\n\t\t\t\tresults.push(...tools);\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tinvalidate(toolKit: string): void {\n\t\tconst entry = this.entries.get(toolKit);\n\n\t\tif (entry && entry.type === 'provider') this.toolSpecCache?.del(toolKit);\n\t}\n\n\tprivate async getToolKitSpecs(\n\t\ttoolKit: string,\n\t\tprovider: ToolProvider<TContext>,\n\t\tcontext: TContext,\n\t): Promise<ToolSpec[]> {\n\t\tconst cache = this.toolSpecCache;\n\n\t\tif (cache) {\n\t\t\ttry {\n\t\t\t\tconst cached = await cache.get(toolKit);\n\n\t\t\t\tif (cached) return cached;\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('Something went wrong when hitting the cache', e);\n\t\t\t}\n\t\t}\n\n\t\tconst specs = (await provider.listToolKitSpecs(toolKit, context)) ?? [];\n\n\t\tif (cache) {\n\t\t\ttry {\n\t\t\t\tawait cache.set(toolKit, specs);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error('Something went wrong when setting the cache', e);\n\t\t\t}\n\t\t}\n\n\t\treturn specs;\n\t}\n}\n","import { ToolSpec } from '@core/agent.interface';\nimport Redis from 'ioredis';\nimport { z } from 'zod';\n\nexport interface ToolCache {\n\tget(toolKit: string): Promise<ToolSpec[] | null> | ToolSpec[] | null;\n\n\tset(toolKit: string, specs: ToolSpec[]): Promise<void>;\n\n\tdel(toolKit: string): Promise<void>;\n}\n\nexport class RedisToolCache implements ToolCache {\n\tprivate redis: Redis;\n\n\tconstructor(connectionString: string) {\n\t\tthis.redis = new Redis(connectionString);\n\t}\n\n\tasync get(toolKit: string): Promise<ToolSpec[] | null> {\n\t\tconst data = await this.redis.get(`tool-cache:${toolKit}`);\n\n\t\tif (!data) return null;\n\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(data);\n\n\t\t\tif (!Array.isArray(parsed)) return null;\n\n\t\t\treturn parsed.map((spec: any) => ({\n\t\t\t\t...spec,\n\t\t\t\tinputSchema: z.fromJSONSchema(spec.inputSchema),\n\t\t\t}));\n\t\t} catch (e) {\n\t\t\tconsole.error('Failed to parse cached tools', e);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync set(toolKit: string, specs: ToolSpec[]): Promise<void> {\n\t\tconst serialized = specs.map((spec) => ({\n\t\t\t...spec,\n\t\t\tinputSchema: spec.inputSchema.toJSONSchema(),\n\t\t}));\n\t\tawait this.redis.set(`tool-cache:${toolKit}`, JSON.stringify(serialized));\n\t}\n\n\tasync del(toolKit: string): Promise<void> {\n\t\tawait this.redis.del(`tool-cache:${toolKit}`);\n\t}\n}\n\nexport class InMemoryToolCache implements ToolCache {\n\tprivate cache = new Map<string, ToolSpec[]>();\n\n\tget(toolKit: string): ToolSpec[] | null {\n\t\treturn this.cache.get(`tool-cache:${toolKit}`) ?? null;\n\t}\n\n\tasync set(toolKit: string, specs: ToolSpec[]): Promise<void> {\n\t\tthis.cache.set(`tool-cache:${toolKit}`, specs);\n\t}\n\n\tasync del(toolKit: string): Promise<void> {\n\t\tthis.cache.delete(`tool-cache:${toolKit}`);\n\t}\n}\n"],"mappings":"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","names":["input","tool","options"]}
@@ -56,7 +56,7 @@ interface ToolResultEvent extends BaseStreamEvent {
56
56
  toolCallId: string;
57
57
  }
58
58
  interface ReasoningEvent extends BaseStreamEvent {
59
- type: 'reasoning';
59
+ type: 'reasoning_delta';
60
60
  delta: string;
61
61
  }
62
62
  interface FinalContentEvent extends BaseStreamEvent {
@@ -110,6 +110,7 @@ interface UsageMeta {
110
110
  completionTokens: number;
111
111
  totalTokens: number;
112
112
  cachedPromptTokens?: number;
113
+ reasoningTokens?: number;
113
114
  }
114
115
  type Message = HumanMessage | AiMessage | ToolMessage;
115
116
  interface HumanMessage {
@@ -56,7 +56,7 @@ interface ToolResultEvent extends BaseStreamEvent {
56
56
  toolCallId: string;
57
57
  }
58
58
  interface ReasoningEvent extends BaseStreamEvent {
59
- type: 'reasoning';
59
+ type: 'reasoning_delta';
60
60
  delta: string;
61
61
  }
62
62
  interface FinalContentEvent extends BaseStreamEvent {
@@ -110,6 +110,7 @@ interface UsageMeta {
110
110
  completionTokens: number;
111
111
  totalTokens: number;
112
112
  cachedPromptTokens?: number;
113
+ reasoningTokens?: number;
113
114
  }
114
115
  type Message = HumanMessage | AiMessage | ToolMessage;
115
116
  interface HumanMessage {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dvina/agents",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "Standalone, provider-agnostic AI agent library",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {
@@ -45,10 +45,10 @@
45
45
  "author": "",
46
46
  "license": "MIT",
47
47
  "peerDependencies": {
48
- "zod": "^4.3.6",
49
48
  "agentevals": ">=0.0.6",
50
49
  "langsmith": ">=0.4.0",
51
- "vitest": ">=4.0.0"
50
+ "vitest": ">=4.0.0",
51
+ "zod": "^4.3.6"
52
52
  },
53
53
  "peerDependenciesMeta": {
54
54
  "agentevals": {
@@ -69,7 +69,8 @@
69
69
  "@langchain/openai": "^1.2.3",
70
70
  "deepagents": "^1.6.0",
71
71
  "ioredis": "^5.9.2",
72
- "langchain": "^1.2.14"
72
+ "langchain": "^1.2.14",
73
+ "openai": "^6.22.0"
73
74
  },
74
75
  "overrides": {
75
76
  "agentevals": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/langchain/model-resolver.ts","../src/runtime/langchain/utils.ts"],"sourcesContent":["import { BaseLanguageModel } from '@langchain/core/language_models/base';\nimport { AzureChatOpenAI, ChatOpenAI } from '@langchain/openai';\n\nexport type LangchainOpenAIConfig = {\n\tapiKey: string;\n};\n\nexport type LangchainAzureResourceConfig = {\n\tapiKey: string;\n\tendpoint: string;\n\tmodels: {\n\t\tmodel: string;\n\t\tapiVersion: string;\n\t\tdeploymentName: string;\n\t}[];\n};\n\nexport type ResourceName = string;\n\nexport type LangchainModelConfig = {\n\topenai?: Record<string, LangchainOpenAIConfig>;\n\tazure?: Record<ResourceName, LangchainAzureResourceConfig>;\n};\n\nexport class LangchainModelResolver {\n\tconstructor(private config: LangchainModelConfig) {}\n\n\tresolve(modelString: string, tags?: string[]): BaseLanguageModel {\n\t\tconst parts = modelString.split(':');\n\n\t\tif (parts.length === 2) {\n\t\t\tconst [provider, modelName] = parts;\n\t\t\treturn this.resolveByProvider(provider, 'default', modelName, tags);\n\t\t}\n\n\t\tif (parts.length === 3) {\n\t\t\tconst [provider, configName, modelName] = parts;\n\t\t\treturn this.resolveByProvider(provider, configName, modelName, tags);\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t'Model string must follow format \"provider:modelName\" (uses \"default\" config) or \"provider:configName:modelName\"',\n\t\t);\n\t}\n\n\tprivate resolveByProvider(\n\t\tprovider: string,\n\t\tconfigName: string,\n\t\tmodelName: string,\n\t\ttags?: string[],\n\t): BaseLanguageModel {\n\t\tswitch (provider) {\n\t\t\tcase 'openai':\n\t\t\t\treturn this.resolveOpenAI(configName, modelName, tags);\n\t\t\tcase 'azure':\n\t\t\t\treturn this.resolveAzure(configName, modelName, tags);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported model provider: ${provider}`);\n\t\t}\n\t}\n\n\tprivate resolveOpenAI(configName: string, modelName: string, tags?: string[]): ChatOpenAI {\n\t\tconst providerConfig = this.config.openai?.[configName];\n\t\tif (!providerConfig) {\n\t\t\tthrow new Error(`Configuration \"${configName}\" for provider \"openai\" is missing`);\n\t\t}\n\n\t\treturn new ChatOpenAI({\n\t\t\tapiKey: providerConfig.apiKey,\n\t\t\tmodelName: modelName,\n\t\t\ttags: tags,\n\t\t});\n\t}\n\n\tprivate resolveAzure(resourceName: string, modelName: string, tags?: string[]): AzureChatOpenAI {\n\t\tconst resource = this.config.azure?.[resourceName];\n\t\tif (!resource) {\n\t\t\tthrow new Error(`Resource \"${resourceName}\" for provider \"azure\" is missing`);\n\t\t}\n\n\t\tconst modelEntry = resource.models.find((m) => m.model === modelName);\n\t\tif (!modelEntry) {\n\t\t\tthrow new Error(`Model \"${modelName}\" not found in Azure resource \"${resourceName}\"`);\n\t\t}\n\n\t\treturn new AzureChatOpenAI({\n\t\t\tmodel: modelEntry.model,\n\t\t\tazureOpenAIApiKey: resource.apiKey,\n\t\t\tazureOpenAIApiInstanceName: this.extractInstanceName(resource.endpoint),\n\t\t\tazureOpenAIApiDeploymentName: modelEntry.deploymentName,\n\t\t\tazureOpenAIApiVersion: modelEntry.apiVersion,\n\t\t\ttags: tags,\n\t\t});\n\t}\n\n\tprivate extractInstanceName(endpoint: string): string {\n\t\ttry {\n\t\t\tconst url = new URL(endpoint);\n\t\t\treturn url.hostname.split('.')[0];\n\t\t} catch (e) {\n\t\t\treturn endpoint;\n\t\t}\n\t}\n}\n","import { Message } from '@core/agent.interface';\nimport { AIMessage, BaseMessage, HumanMessage, ToolMessage } from 'langchain';\n\nexport function convertToLangchainMessages(messages: Message[]): BaseMessage[] {\n\tconst result: BaseMessage[] = [];\n\tlet tcIdx = 0;\n\tlet pendingToolCallIds: string[] = [];\n\n\tfor (const msg of messages) {\n\t\tif (msg.role === 'human') {\n\t\t\tresult.push(\n\t\t\t\tnew HumanMessage({\n\t\t\t\t\tcontent: msg.content.map((c) => {\n\t\t\t\t\t\tif (c.type === 'image') {\n\t\t\t\t\t\t\treturn { type: 'image_url', image_url: { url: c.url } };\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn c;\n\t\t\t\t\t}) as any,\n\t\t\t\t}),\n\t\t\t);\n\t\t} else if (msg.role === 'ai') {\n\t\t\tif (msg.toolCalls && msg.toolCalls.length > 0) {\n\t\t\t\tpendingToolCallIds = msg.toolCalls.map(() => `tc_${++tcIdx}`);\n\t\t\t\tresult.push(\n\t\t\t\t\tnew AIMessage({\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t\ttool_calls: msg.toolCalls.map((tc, i) => ({\n\t\t\t\t\t\t\tid: pendingToolCallIds[i],\n\t\t\t\t\t\t\tname: tc.name,\n\t\t\t\t\t\t\targs: tc.input ? JSON.parse(tc.input) : {},\n\t\t\t\t\t\t})),\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tresult.push(new AIMessage(msg.content));\n\t\t\t}\n\t\t} else if (msg.role === 'tool') {\n\t\t\tconst toolCallId = pendingToolCallIds.shift();\n\t\t\tif (!toolCallId)\n\t\t\t\tthrow new Error(`ToolMessage for \"${msg.name}\" without a preceding AiMessage with toolCalls`);\n\t\t\tresult.push(\n\t\t\t\tnew ToolMessage({\n\t\t\t\t\tcontent: msg.output,\n\t\t\t\t\ttool_call_id: toolCallId,\n\t\t\t\t\tname: msg.name,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\n\treturn result;\n}\n"],"mappings":"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","names":[]}