illuma-agents 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +25 -21
- package/dist/cjs/agents/AgentContext.cjs +222 -0
- package/dist/cjs/agents/AgentContext.cjs.map +1 -0
- package/dist/cjs/common/enum.cjs +7 -6
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/events.cjs +7 -5
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +328 -207
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +507 -0
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/ollama/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +35 -0
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +3 -1
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs +0 -2
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +12 -1
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +123 -0
- package/dist/cjs/messages/cache.cjs.map +1 -0
- package/dist/cjs/messages/content.cjs +53 -0
- package/dist/cjs/messages/content.cjs.map +1 -0
- package/dist/cjs/messages/format.cjs +17 -29
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/run.cjs +119 -74
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/stream.cjs +77 -73
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/Calculator.cjs +45 -0
- package/dist/cjs/tools/Calculator.cjs.map +1 -0
- package/dist/cjs/tools/CodeExecutor.cjs +22 -22
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +5 -3
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +20 -20
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/utils/events.cjs +31 -0
- package/dist/cjs/utils/events.cjs.map +1 -0
- package/dist/cjs/utils/handlers.cjs +70 -0
- package/dist/cjs/utils/handlers.cjs.map +1 -0
- package/dist/cjs/utils/tokens.cjs +54 -7
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +220 -0
- package/dist/esm/agents/AgentContext.mjs.map +1 -0
- package/dist/esm/common/enum.mjs +7 -6
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/events.mjs +7 -5
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +330 -209
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +505 -0
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -0
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/ollama/index.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +35 -0
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +3 -1
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs +0 -2
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +7 -2
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +120 -0
- package/dist/esm/messages/cache.mjs.map +1 -0
- package/dist/esm/messages/content.mjs +51 -0
- package/dist/esm/messages/content.mjs.map +1 -0
- package/dist/esm/messages/format.mjs +18 -29
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/run.mjs +119 -74
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/stream.mjs +77 -73
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/Calculator.mjs +24 -0
- package/dist/esm/tools/Calculator.mjs.map +1 -0
- package/dist/esm/tools/CodeExecutor.mjs +22 -22
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +5 -3
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +20 -20
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/utils/events.mjs +29 -0
- package/dist/esm/utils/events.mjs.map +1 -0
- package/dist/esm/utils/handlers.mjs +68 -0
- package/dist/esm/utils/handlers.mjs.map +1 -0
- package/dist/esm/utils/tokens.mjs +54 -8
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +94 -0
- package/dist/types/common/enum.d.ts +9 -7
- package/dist/types/events.d.ts +3 -3
- package/dist/types/graphs/Graph.d.ts +60 -66
- package/dist/types/graphs/MultiAgentGraph.d.ts +47 -0
- package/dist/types/graphs/index.d.ts +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/llm/openai/index.d.ts +10 -0
- package/dist/types/messages/cache.d.ts +20 -0
- package/dist/types/messages/content.d.ts +7 -0
- package/dist/types/messages/format.d.ts +1 -7
- package/dist/types/messages/index.d.ts +2 -0
- package/dist/types/messages/reducer.d.ts +9 -0
- package/dist/types/run.d.ts +16 -10
- package/dist/types/stream.d.ts +4 -3
- package/dist/types/tools/Calculator.d.ts +8 -0
- package/dist/types/tools/ToolNode.d.ts +1 -1
- package/dist/types/tools/handlers.d.ts +9 -7
- package/dist/types/tools/search/tool.d.ts +4 -4
- package/dist/types/types/graph.d.ts +124 -11
- package/dist/types/types/llm.d.ts +13 -9
- package/dist/types/types/messages.d.ts +4 -0
- package/dist/types/types/run.d.ts +46 -8
- package/dist/types/types/stream.d.ts +3 -2
- package/dist/types/utils/events.d.ts +6 -0
- package/dist/types/utils/handlers.d.ts +34 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/tokens.d.ts +24 -0
- package/package.json +162 -145
- package/src/agents/AgentContext.ts +323 -0
- package/src/common/enum.ts +177 -176
- package/src/events.ts +197 -191
- package/src/graphs/Graph.ts +1058 -846
- package/src/graphs/MultiAgentGraph.ts +598 -0
- package/src/graphs/index.ts +2 -1
- package/src/index.ts +25 -24
- package/src/llm/anthropic/index.ts +413 -413
- package/src/llm/google/index.ts +222 -222
- package/src/llm/google/utils/zod_to_genai_parameters.ts +86 -88
- package/src/llm/ollama/index.ts +92 -92
- package/src/llm/openai/index.ts +894 -853
- package/src/llm/openai/utils/index.ts +920 -918
- package/src/llm/openrouter/index.ts +60 -60
- package/src/llm/providers.ts +55 -57
- package/src/llm/vertexai/index.ts +360 -360
- package/src/messages/cache.test.ts +461 -0
- package/src/messages/cache.ts +151 -0
- package/src/messages/content.test.ts +362 -0
- package/src/messages/content.ts +63 -0
- package/src/messages/format.ts +611 -625
- package/src/messages/formatAgentMessages.test.ts +1144 -917
- package/src/messages/index.ts +6 -4
- package/src/messages/reducer.ts +80 -0
- package/src/run.ts +447 -381
- package/src/scripts/abort.ts +157 -138
- package/src/scripts/ant_web_search.ts +158 -158
- package/src/scripts/cli.ts +172 -167
- package/src/scripts/cli2.ts +133 -125
- package/src/scripts/cli3.ts +184 -178
- package/src/scripts/cli4.ts +191 -184
- package/src/scripts/cli5.ts +191 -184
- package/src/scripts/code_exec.ts +213 -214
- package/src/scripts/code_exec_simple.ts +147 -129
- package/src/scripts/content.ts +138 -120
- package/src/scripts/handoff-test.ts +135 -0
- package/src/scripts/multi-agent-chain.ts +278 -0
- package/src/scripts/multi-agent-conditional.ts +220 -0
- package/src/scripts/multi-agent-document-review-chain.ts +197 -0
- package/src/scripts/multi-agent-hybrid-flow.ts +310 -0
- package/src/scripts/multi-agent-parallel.ts +343 -0
- package/src/scripts/multi-agent-sequence.ts +212 -0
- package/src/scripts/multi-agent-supervisor.ts +364 -0
- package/src/scripts/multi-agent-test.ts +186 -0
- package/src/scripts/search.ts +146 -150
- package/src/scripts/simple.ts +225 -225
- package/src/scripts/stream.ts +140 -122
- package/src/scripts/test-custom-prompt-key.ts +145 -0
- package/src/scripts/test-handoff-input.ts +170 -0
- package/src/scripts/test-multi-agent-list-handoff.ts +261 -0
- package/src/scripts/test-tools-before-handoff.ts +222 -0
- package/src/scripts/tools.ts +153 -155
- package/src/specs/agent-handoffs.test.ts +889 -0
- package/src/specs/anthropic.simple.test.ts +320 -317
- package/src/specs/azure.simple.test.ts +325 -316
- package/src/specs/openai.simple.test.ts +311 -316
- package/src/specs/openrouter.simple.test.ts +107 -0
- package/src/specs/prune.test.ts +758 -763
- package/src/specs/reasoning.test.ts +201 -165
- package/src/specs/thinking-prune.test.ts +769 -703
- package/src/specs/token-memoization.test.ts +39 -0
- package/src/stream.ts +664 -651
- package/src/tools/Calculator.test.ts +278 -0
- package/src/tools/Calculator.ts +25 -0
- package/src/tools/CodeExecutor.ts +220 -220
- package/src/tools/ToolNode.ts +170 -170
- package/src/tools/handlers.ts +341 -336
- package/src/types/graph.ts +372 -185
- package/src/types/llm.ts +141 -140
- package/src/types/messages.ts +4 -0
- package/src/types/run.ts +128 -89
- package/src/types/stream.ts +401 -400
- package/src/utils/events.ts +32 -0
- package/src/utils/handlers.ts +107 -0
- package/src/utils/index.ts +6 -5
- package/src/utils/llmConfig.ts +183 -183
- package/src/utils/tokens.ts +129 -70
- package/dist/types/scripts/abort.d.ts +0 -1
- package/dist/types/scripts/ant_web_search.d.ts +0 -1
- package/dist/types/scripts/args.d.ts +0 -7
- package/dist/types/scripts/caching.d.ts +0 -1
- package/dist/types/scripts/cli.d.ts +0 -1
- package/dist/types/scripts/cli2.d.ts +0 -1
- package/dist/types/scripts/cli3.d.ts +0 -1
- package/dist/types/scripts/cli4.d.ts +0 -1
- package/dist/types/scripts/cli5.d.ts +0 -1
- package/dist/types/scripts/code_exec.d.ts +0 -1
- package/dist/types/scripts/code_exec_files.d.ts +0 -1
- package/dist/types/scripts/code_exec_simple.d.ts +0 -1
- package/dist/types/scripts/content.d.ts +0 -1
- package/dist/types/scripts/empty_input.d.ts +0 -1
- package/dist/types/scripts/image.d.ts +0 -1
- package/dist/types/scripts/memory.d.ts +0 -1
- package/dist/types/scripts/search.d.ts +0 -1
- package/dist/types/scripts/simple.d.ts +0 -1
- package/dist/types/scripts/stream.d.ts +0 -1
- package/dist/types/scripts/thinking.d.ts +0 -1
- package/dist/types/scripts/tools.d.ts +0 -1
- package/dist/types/specs/spec.utils.d.ts +0 -1
- package/dist/types/tools/example.d.ts +0 -78
- package/src/tools/example.ts +0 -129
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.cjs","sources":["../../../src/messages/content.ts"],"sourcesContent":["import { ContentTypes } from '@/common';\nimport type { BaseMessage } from '@langchain/core/messages';\n\n/**\n * Formats an array of messages for LangChain, making sure all content fields are strings\n * @param {Array<HumanMessage | AIMessage | SystemMessage | ToolMessage>} payload - The array of messages to format.\n * @returns {Array<HumanMessage | AIMessage | SystemMessage | ToolMessage>} - The array of formatted LangChain messages, including ToolMessages for tool calls.\n */\nexport const formatContentStrings = (\n payload: Array<BaseMessage>\n): Array<BaseMessage> => {\n // Create a new array to store the processed messages\n const result: Array<BaseMessage> = [];\n\n for (const message of payload) {\n const messageType = message.getType();\n const isValidMessage =\n messageType === 'human' ||\n messageType === 'ai' ||\n messageType === 'system';\n\n if (!isValidMessage) {\n result.push(message);\n continue;\n }\n\n // If content is already a string, add as-is\n if (typeof message.content === 'string') {\n result.push(message);\n continue;\n }\n\n // If content is not an array, add as-is\n if (!Array.isArray(message.content)) {\n result.push(message);\n continue;\n }\n\n // Check if all content blocks are text type\n const allTextBlocks = message.content.every(\n (block) => block.type === ContentTypes.TEXT\n );\n\n // Only convert to string if all blocks are text type\n if (!allTextBlocks) {\n result.push(message);\n continue;\n }\n\n // Reduce text types to a single string\n const content = message.content.reduce((acc, curr) => {\n if (curr.type === ContentTypes.TEXT) {\n return `${acc}${curr[ContentTypes.TEXT] || ''}\\n`;\n }\n return acc;\n }, '');\n\n message.content = content.trim();\n result.push(message);\n }\n\n return result;\n};\n"],"names":["ContentTypes"],"mappings":";;;;AAGA;;;;AAIG;AACU,MAAA,oBAAoB,GAAG,CAClC,OAA2B,KACL;;IAEtB,MAAM,MAAM,GAAuB,EAAE;AAErC,IAAA,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE;AAC7B,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE;AACrC,QAAA,MAAM,cAAc,GAClB,WAAW,KAAK,OAAO;AACvB,YAAA,WAAW,KAAK,IAAI;YACpB,WAAW,KAAK,QAAQ;QAE1B,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpB;;;AAIF,QAAA,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE;AACvC,YAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpB;;;QAIF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACnC,YAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpB;;;QAIF,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CACzC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAKA,kBAAY,CAAC,IAAI,CAC5C;;QAGD,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpB;;;AAIF,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAI;YACnD,IAAI,IAAI,CAAC,IAAI,KAAKA,kBAAY,CAAC,IAAI,EAAE;AACnC,gBAAA,OAAO,CAAG,EAAA,GAAG,CAAG,EAAA,IAAI,CAACA,kBAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA,EAAA,CAAI;;AAEnD,YAAA,OAAO,GAAG;SACX,EAAE,EAAE,CAAC;AAEN,QAAA,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE;AAChC,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;;AAGtB,IAAA,OAAO,MAAM;AACf;;;;"}
|
|
@@ -187,13 +187,21 @@ function formatAssistantMessage(message) {
|
|
|
187
187
|
formattedMessages.push(lastAIMessage);
|
|
188
188
|
}
|
|
189
189
|
else if (part.type === _enum.ContentTypes.TOOL_CALL) {
|
|
190
|
+
// Skip malformed tool call entries without tool_call property
|
|
191
|
+
if (!part.tool_call) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
// Note: `tool_calls` list is defined when constructed by `AIMessage` class, and outputs should be excluded from it
|
|
195
|
+
const { output, args: _args, ..._tool_call } = part.tool_call;
|
|
196
|
+
// Skip invalid tool calls that have no name AND no output
|
|
197
|
+
if (!_tool_call.name && (output == null || output === '')) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
190
200
|
if (!lastAIMessage) {
|
|
191
201
|
// "Heal" the payload by creating an AIMessage to precede the tool call
|
|
192
202
|
lastAIMessage = new messages.AIMessage({ content: '' });
|
|
193
203
|
formattedMessages.push(lastAIMessage);
|
|
194
204
|
}
|
|
195
|
-
// Note: `tool_calls` list is defined when constructed by `AIMessage` class, and outputs should be excluded from it
|
|
196
|
-
const { output, args: _args, ..._tool_call } = part.tool_call;
|
|
197
205
|
const tool_call = _tool_call;
|
|
198
206
|
// TODO: investigate; args as dictionary may need to be providers-or-tool-specific
|
|
199
207
|
let args = _args;
|
|
@@ -298,6 +306,13 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
298
306
|
hasInvalidTool = true;
|
|
299
307
|
break;
|
|
300
308
|
}
|
|
309
|
+
// Protect against malformed tool call entries
|
|
310
|
+
if (!part.tool_call ||
|
|
311
|
+
part.tool_call.name == null ||
|
|
312
|
+
part.tool_call.name === '') {
|
|
313
|
+
hasInvalidTool = true;
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
301
316
|
const toolName = part.tool_call.name;
|
|
302
317
|
if (!tools.has(toolName)) {
|
|
303
318
|
hasInvalidTool = true;
|
|
@@ -399,32 +414,6 @@ const formatAgentMessages = (payload, indexTokenCountMap, tools) => {
|
|
|
399
414
|
: undefined,
|
|
400
415
|
};
|
|
401
416
|
};
|
|
402
|
-
/**
|
|
403
|
-
* Formats an array of messages for LangChain, making sure all content fields are strings
|
|
404
|
-
* @param payload - The array of messages to format.
|
|
405
|
-
* @returns - The array of formatted LangChain messages, including ToolMessages for tool calls.
|
|
406
|
-
*/
|
|
407
|
-
const formatContentStrings = (payload) => {
|
|
408
|
-
// Create a copy of the payload to avoid modifying the original
|
|
409
|
-
const result = [...payload];
|
|
410
|
-
for (const message of result) {
|
|
411
|
-
if (typeof message.content === 'string') {
|
|
412
|
-
continue;
|
|
413
|
-
}
|
|
414
|
-
if (!Array.isArray(message.content)) {
|
|
415
|
-
continue;
|
|
416
|
-
}
|
|
417
|
-
// Reduce text types to a single string, ignore all other types
|
|
418
|
-
const content = message.content.reduce((acc, curr) => {
|
|
419
|
-
if (curr.type === _enum.ContentTypes.TEXT) {
|
|
420
|
-
return `${acc}${curr[_enum.ContentTypes.TEXT] || ''}\n`;
|
|
421
|
-
}
|
|
422
|
-
return acc;
|
|
423
|
-
}, '');
|
|
424
|
-
message.content = content.trim();
|
|
425
|
-
}
|
|
426
|
-
return result;
|
|
427
|
-
};
|
|
428
417
|
/**
|
|
429
418
|
* Adds a value at key 0 for system messages and shifts all key indices by one in an indexTokenCountMap.
|
|
430
419
|
* This is useful when adding a system message at the beginning of a conversation.
|
|
@@ -446,7 +435,6 @@ function shiftIndexTokenCountMap(indexTokenCountMap, instructionsTokenCount) {
|
|
|
446
435
|
}
|
|
447
436
|
|
|
448
437
|
exports.formatAgentMessages = formatAgentMessages;
|
|
449
|
-
exports.formatContentStrings = formatContentStrings;
|
|
450
438
|
exports.formatFromLangChain = formatFromLangChain;
|
|
451
439
|
exports.formatLangChainMessages = formatLangChainMessages;
|
|
452
440
|
exports.formatMediaMessage = formatMediaMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.cjs","sources":["../../../src/messages/format.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n AIMessage,\r\n ToolMessage,\r\n BaseMessage,\r\n HumanMessage,\r\n SystemMessage,\r\n getBufferString,\r\n} from '@langchain/core/messages';\r\nimport type { MessageContentImageUrl } from '@langchain/core/messages';\r\nimport type { ToolCall } from '@langchain/core/messages/tool';\r\nimport type {\r\n MessageContentComplex,\r\n ToolCallPart,\r\n TPayload,\r\n TMessage,\r\n} from '@/types';\r\nimport { Providers, ContentTypes } from '@/common';\r\n\r\ninterface MediaMessageParams {\r\n message: {\r\n role: string;\r\n content: string;\r\n name?: string;\r\n [key: string]: any;\r\n };\r\n mediaParts: MessageContentComplex[];\r\n endpoint?: Providers;\r\n}\r\n\r\n/**\r\n * Formats a message with media content (images, documents, videos, audios) to API payload format.\r\n *\r\n * @param params - The parameters for formatting.\r\n * @returns - The formatted message.\r\n */\r\nexport const formatMediaMessage = ({\r\n message,\r\n endpoint,\r\n mediaParts,\r\n}: MediaMessageParams): {\r\n role: string;\r\n content: MessageContentComplex[];\r\n name?: string;\r\n [key: string]: any;\r\n} => {\r\n // Create a new object to avoid mutating the input\r\n const result: {\r\n role: string;\r\n content: MessageContentComplex[];\r\n name?: string;\r\n [key: string]: any;\r\n } = {\r\n ...message,\r\n content: [] as MessageContentComplex[],\r\n };\r\n\r\n if (endpoint === Providers.ANTHROPIC) {\r\n result.content = [\r\n ...mediaParts,\r\n { type: ContentTypes.TEXT, text: message.content },\r\n ] as MessageContentComplex[];\r\n return result;\r\n }\r\n\r\n result.content = [\r\n { type: ContentTypes.TEXT, text: message.content },\r\n ...mediaParts,\r\n ] as MessageContentComplex[];\r\n\r\n return result;\r\n};\r\n\r\ninterface MessageInput {\r\n role?: string;\r\n _name?: string;\r\n sender?: string;\r\n text?: string;\r\n content?: string | MessageContentComplex[];\r\n image_urls?: MessageContentImageUrl[];\r\n documents?: MessageContentComplex[];\r\n videos?: MessageContentComplex[];\r\n audios?: MessageContentComplex[];\r\n lc_id?: string[];\r\n [key: string]: any;\r\n}\r\n\r\ninterface FormatMessageParams {\r\n message: MessageInput;\r\n userName?: string;\r\n assistantName?: string;\r\n endpoint?: Providers;\r\n langChain?: boolean;\r\n}\r\n\r\ninterface FormattedMessage {\r\n role: string;\r\n content: string | MessageContentComplex[];\r\n name?: string;\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Formats a message to OpenAI payload format based on the provided options.\r\n *\r\n * @param params - The parameters for formatting.\r\n * @returns - The formatted message.\r\n */\r\nexport const formatMessage = ({\r\n message,\r\n userName,\r\n endpoint,\r\n assistantName,\r\n langChain = false,\r\n}: FormatMessageParams):\r\n | FormattedMessage\r\n | HumanMessage\r\n | AIMessage\r\n | SystemMessage => {\r\n // eslint-disable-next-line prefer-const\r\n let { role: _role, _name, sender, text, content: _content, lc_id } = message;\r\n if (lc_id && lc_id[2] && !langChain) {\r\n const roleMapping: Record<string, string> = {\r\n SystemMessage: 'system',\r\n HumanMessage: 'user',\r\n AIMessage: 'assistant',\r\n };\r\n _role = roleMapping[lc_id[2]] || _role;\r\n }\r\n const role =\r\n _role ??\r\n (sender != null && sender && sender.toLowerCase() === 'user'\r\n ? 'user'\r\n : 'assistant');\r\n const content = _content ?? text ?? '';\r\n const formattedMessage: FormattedMessage = {\r\n role,\r\n content,\r\n };\r\n\r\n // Set name fields first\r\n if (_name != null && _name) {\r\n formattedMessage.name = _name;\r\n }\r\n\r\n if (userName != null && userName && formattedMessage.role === 'user') {\r\n formattedMessage.name = userName;\r\n }\r\n\r\n if (\r\n assistantName != null &&\r\n assistantName &&\r\n formattedMessage.role === 'assistant'\r\n ) {\r\n formattedMessage.name = assistantName;\r\n }\r\n\r\n if (formattedMessage.name != null && formattedMessage.name) {\r\n // Conform to API regex: ^[a-zA-Z0-9_-]{1,64}$\r\n // https://community.openai.com/t/the-format-of-the-name-field-in-the-documentation-is-incorrect/175684/2\r\n formattedMessage.name = formattedMessage.name.replace(\r\n /[^a-zA-Z0-9_-]/g,\r\n '_'\r\n );\r\n\r\n if (formattedMessage.name.length > 64) {\r\n formattedMessage.name = formattedMessage.name.substring(0, 64);\r\n }\r\n }\r\n\r\n const { image_urls, documents, videos, audios } = message;\r\n const mediaParts: MessageContentComplex[] = [];\r\n\r\n if (Array.isArray(documents) && documents.length > 0) {\r\n mediaParts.push(...documents);\r\n }\r\n\r\n if (Array.isArray(videos) && videos.length > 0) {\r\n mediaParts.push(...videos);\r\n }\r\n\r\n if (Array.isArray(audios) && audios.length > 0) {\r\n mediaParts.push(...audios);\r\n }\r\n\r\n if (Array.isArray(image_urls) && image_urls.length > 0) {\r\n mediaParts.push(...image_urls);\r\n }\r\n\r\n if (mediaParts.length > 0 && role === 'user') {\r\n const mediaMessage = formatMediaMessage({\r\n message: {\r\n ...formattedMessage,\r\n content:\r\n typeof formattedMessage.content === 'string'\r\n ? formattedMessage.content\r\n : '',\r\n },\r\n mediaParts,\r\n endpoint,\r\n });\r\n\r\n if (!langChain) {\r\n return mediaMessage;\r\n }\r\n\r\n return new HumanMessage(mediaMessage);\r\n }\r\n\r\n if (!langChain) {\r\n return formattedMessage;\r\n }\r\n\r\n if (role === 'user') {\r\n return new HumanMessage(formattedMessage);\r\n } else if (role === 'assistant') {\r\n return new AIMessage(formattedMessage);\r\n } else {\r\n return new SystemMessage(formattedMessage);\r\n }\r\n};\r\n\r\n/**\r\n * Formats an array of messages for LangChain.\r\n *\r\n * @param messages - The array of messages to format.\r\n * @param formatOptions - The options for formatting each message.\r\n * @returns - The array of formatted LangChain messages.\r\n */\r\nexport const formatLangChainMessages = (\r\n messages: Array<MessageInput>,\r\n formatOptions: Omit<FormatMessageParams, 'message' | 'langChain'>\r\n): Array<HumanMessage | AIMessage | SystemMessage> => {\r\n return messages.map((msg) => {\r\n const formatted = formatMessage({\r\n ...formatOptions,\r\n message: msg,\r\n langChain: true,\r\n });\r\n return formatted as HumanMessage | AIMessage | SystemMessage;\r\n });\r\n};\r\n\r\ninterface LangChainMessage {\r\n lc_kwargs?: {\r\n additional_kwargs?: Record<string, any>;\r\n [key: string]: any;\r\n };\r\n kwargs?: {\r\n additional_kwargs?: Record<string, any>;\r\n [key: string]: any;\r\n };\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Formats a LangChain message object by merging properties from `lc_kwargs` or `kwargs` and `additional_kwargs`.\r\n *\r\n * @param message - The message object to format.\r\n * @returns - The formatted LangChain message.\r\n */\r\nexport const formatFromLangChain = (\r\n message: LangChainMessage\r\n): Record<string, any> => {\r\n const kwargs = message.lc_kwargs ?? message.kwargs ?? {};\r\n const { additional_kwargs = {}, ...message_kwargs } = kwargs;\r\n return {\r\n ...message_kwargs,\r\n ...additional_kwargs,\r\n };\r\n};\r\n\r\n/**\r\n * Helper function to format an assistant message\r\n * @param message The message to format\r\n * @returns Array of formatted messages\r\n */\r\nfunction formatAssistantMessage(\r\n message: Partial<TMessage>\r\n): Array<AIMessage | ToolMessage> {\r\n const formattedMessages: Array<AIMessage | ToolMessage> = [];\r\n let currentContent: MessageContentComplex[] = [];\r\n let lastAIMessage: AIMessage | null = null;\r\n let hasReasoning = false;\r\n\r\n if (Array.isArray(message.content)) {\r\n for (const part of message.content) {\r\n if (part.type === ContentTypes.TEXT && part.tool_call_ids) {\r\n /*\r\n If there's pending content, it needs to be aggregated as a single string to prepare for tool calls.\r\n For Anthropic models, the \"tool_calls\" field on a message is only respected if content is a string.\r\n */\r\n if (currentContent.length > 0) {\r\n let content = currentContent.reduce((acc, curr) => {\r\n if (curr.type === ContentTypes.TEXT) {\r\n return `${acc}${curr[ContentTypes.TEXT] || ''}\\n`;\r\n }\r\n return acc;\r\n }, '');\r\n content =\r\n `${content}\\n${part[ContentTypes.TEXT] ?? part.text ?? ''}`.trim();\r\n lastAIMessage = new AIMessage({ content });\r\n formattedMessages.push(lastAIMessage);\r\n currentContent = [];\r\n continue;\r\n }\r\n // Create a new AIMessage with this text and prepare for tool calls\r\n lastAIMessage = new AIMessage({\r\n content: part.text || '',\r\n });\r\n formattedMessages.push(lastAIMessage);\r\n } else if (part.type === ContentTypes.TOOL_CALL) {\r\n if (!lastAIMessage) {\r\n // \"Heal\" the payload by creating an AIMessage to precede the tool call\r\n lastAIMessage = new AIMessage({ content: '' });\r\n formattedMessages.push(lastAIMessage);\r\n }\r\n\r\n // Note: `tool_calls` list is defined when constructed by `AIMessage` class, and outputs should be excluded from it\r\n const {\r\n output,\r\n args: _args,\r\n ..._tool_call\r\n } = part.tool_call as ToolCallPart;\r\n const tool_call: ToolCallPart = _tool_call;\r\n // TODO: investigate; args as dictionary may need to be providers-or-tool-specific\r\n let args: any = _args;\r\n try {\r\n if (typeof _args === 'string') {\r\n args = JSON.parse(_args);\r\n }\r\n } catch {\r\n if (typeof _args === 'string') {\r\n args = { input: _args };\r\n }\r\n }\r\n\r\n tool_call.args = args;\r\n if (!lastAIMessage.tool_calls) {\r\n lastAIMessage.tool_calls = [];\r\n }\r\n lastAIMessage.tool_calls.push(tool_call as ToolCall);\r\n\r\n formattedMessages.push(\r\n new ToolMessage({\r\n tool_call_id: tool_call.id ?? '',\r\n name: tool_call.name,\r\n content: output || '',\r\n })\r\n );\r\n } else if (part.type === ContentTypes.THINK) {\r\n hasReasoning = true;\r\n continue;\r\n } else if (\r\n part.type === ContentTypes.ERROR ||\r\n part.type === ContentTypes.AGENT_UPDATE\r\n ) {\r\n continue;\r\n } else {\r\n currentContent.push(part);\r\n }\r\n }\r\n }\r\n\r\n if (hasReasoning && currentContent.length > 0) {\r\n const content = currentContent\r\n .reduce((acc, curr) => {\r\n if (curr.type === ContentTypes.TEXT) {\r\n return `${acc}${curr[ContentTypes.TEXT] || ''}\\n`;\r\n }\r\n return acc;\r\n }, '')\r\n .trim();\r\n\r\n if (content) {\r\n formattedMessages.push(new AIMessage({ content }));\r\n }\r\n } else if (currentContent.length > 0) {\r\n formattedMessages.push(new AIMessage({ content: currentContent }));\r\n }\r\n\r\n return formattedMessages;\r\n}\r\n\r\n/**\r\n * Formats an array of messages for LangChain, handling tool calls and creating ToolMessage instances.\r\n *\r\n * @param payload - The array of messages to format.\r\n * @param indexTokenCountMap - Optional map of message indices to token counts.\r\n * @param tools - Optional set of tool names that are allowed in the request.\r\n * @returns - Object containing formatted messages and updated indexTokenCountMap if provided.\r\n */\r\nexport const formatAgentMessages = (\r\n payload: TPayload,\r\n indexTokenCountMap?: Record<number, number>,\r\n tools?: Set<string>\r\n): {\r\n messages: Array<HumanMessage | AIMessage | SystemMessage | ToolMessage>;\r\n indexTokenCountMap?: Record<number, number>;\r\n} => {\r\n const messages: Array<\r\n HumanMessage | AIMessage | SystemMessage | ToolMessage\r\n > = [];\r\n // If indexTokenCountMap is provided, create a new map to track the updated indices\r\n const updatedIndexTokenCountMap: Record<number, number> = {};\r\n // Keep track of the mapping from original payload indices to result indices\r\n const indexMapping: Record<number, number[]> = {};\r\n\r\n // Process messages with tool conversion if tools set is provided\r\n for (let i = 0; i < payload.length; i++) {\r\n const message = payload[i];\r\n // Q: Store the current length of messages to track where this payload message starts in the result?\r\n // const startIndex = messages.length;\r\n if (typeof message.content === 'string') {\r\n message.content = [\r\n { type: ContentTypes.TEXT, [ContentTypes.TEXT]: message.content },\r\n ];\r\n }\r\n if (message.role !== 'assistant') {\r\n messages.push(\r\n formatMessage({\r\n message: message as MessageInput,\r\n langChain: true,\r\n }) as HumanMessage | AIMessage | SystemMessage\r\n );\r\n\r\n // Update the index mapping for this message\r\n indexMapping[i] = [messages.length - 1];\r\n continue;\r\n }\r\n\r\n // For assistant messages, track the starting index before processing\r\n const startMessageIndex = messages.length;\r\n\r\n // If tools set is provided, we need to check if we need to convert tool messages to a string\r\n if (tools) {\r\n // First, check if this message contains tool calls\r\n let hasToolCalls = false;\r\n let hasInvalidTool = false;\r\n const toolNames: string[] = [];\r\n\r\n const content = message.content;\r\n if (content && Array.isArray(content)) {\r\n for (const part of content) {\r\n if (part.type === ContentTypes.TOOL_CALL) {\r\n hasToolCalls = true;\r\n if (tools.size === 0) {\r\n hasInvalidTool = true;\r\n break;\r\n }\r\n const toolName = part.tool_call.name;\r\n toolNames.push(toolName);\r\n if (!tools.has(toolName)) {\r\n hasInvalidTool = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // If this message has tool calls and at least one is invalid, we need to convert it\r\n if (hasToolCalls && hasInvalidTool) {\r\n // We need to collect all related messages (this message and any subsequent tool messages)\r\n const toolSequence: BaseMessage[] = [];\r\n let sequenceEndIndex = i;\r\n\r\n // Process the current assistant message to get the AIMessage with tool calls\r\n const formattedMessages = formatAssistantMessage(message);\r\n toolSequence.push(...formattedMessages);\r\n\r\n // Look ahead for any subsequent assistant messages that might be part of this tool sequence\r\n let j = i + 1;\r\n while (j < payload.length && payload[j].role === 'assistant') {\r\n // Check if this is a continuation of the tool sequence\r\n let isToolResponse = false;\r\n const content = payload[j].content;\r\n if (content && Array.isArray(content)) {\r\n for (const part of content) {\r\n if (part.type === ContentTypes.TOOL_CALL) {\r\n isToolResponse = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (isToolResponse) {\r\n // This is part of the tool sequence, add it\r\n const nextMessages = formatAssistantMessage(payload[j]);\r\n toolSequence.push(...nextMessages);\r\n sequenceEndIndex = j;\r\n j++;\r\n } else {\r\n // This is not part of the tool sequence, stop looking\r\n break;\r\n }\r\n }\r\n\r\n // Convert the sequence to a string\r\n const bufferString = getBufferString(toolSequence);\r\n messages.push(new AIMessage({ content: bufferString }));\r\n\r\n // Skip the messages we've already processed\r\n i = sequenceEndIndex;\r\n\r\n // Update the index mapping for this sequence\r\n const resultIndices = [messages.length - 1];\r\n for (let k = i; k >= i && k <= sequenceEndIndex; k++) {\r\n indexMapping[k] = resultIndices;\r\n }\r\n\r\n continue;\r\n }\r\n }\r\n\r\n // Process the assistant message using the helper function\r\n const formattedMessages = formatAssistantMessage(message);\r\n messages.push(...formattedMessages);\r\n\r\n // Update the index mapping for this assistant message\r\n // Store all indices that were created from this original message\r\n const endMessageIndex = messages.length;\r\n const resultIndices = [];\r\n for (let j = startMessageIndex; j < endMessageIndex; j++) {\r\n resultIndices.push(j);\r\n }\r\n indexMapping[i] = resultIndices;\r\n }\r\n\r\n // Update the token count map if it was provided\r\n if (indexTokenCountMap) {\r\n for (\r\n let originalIndex = 0;\r\n originalIndex < payload.length;\r\n originalIndex++\r\n ) {\r\n const resultIndices = indexMapping[originalIndex] || [];\r\n const tokenCount = indexTokenCountMap[originalIndex];\r\n\r\n if (tokenCount !== undefined) {\r\n if (resultIndices.length === 1) {\r\n // Simple 1:1 mapping\r\n updatedIndexTokenCountMap[resultIndices[0]] = tokenCount;\r\n } else if (resultIndices.length > 1) {\r\n // If one message was split into multiple, distribute the token count\r\n // This is a simplification - in reality, you might want a more sophisticated distribution\r\n const countPerMessage = Math.floor(tokenCount / resultIndices.length);\r\n resultIndices.forEach((resultIndex, idx) => {\r\n if (idx === resultIndices.length - 1) {\r\n // Give any remainder to the last message\r\n updatedIndexTokenCountMap[resultIndex] =\r\n tokenCount - countPerMessage * (resultIndices.length - 1);\r\n } else {\r\n updatedIndexTokenCountMap[resultIndex] = countPerMessage;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n messages,\r\n indexTokenCountMap: indexTokenCountMap\r\n ? updatedIndexTokenCountMap\r\n : undefined,\r\n };\r\n};\r\n\r\n/**\r\n * Formats an array of messages for LangChain, making sure all content fields are strings\r\n * @param payload - The array of messages to format.\r\n * @returns - The array of formatted LangChain messages, including ToolMessages for tool calls.\r\n */\r\nexport const formatContentStrings = (\r\n payload: Array<BaseMessage>\r\n): Array<BaseMessage> => {\r\n // Create a copy of the payload to avoid modifying the original\r\n const result = [...payload];\r\n\r\n for (const message of result) {\r\n if (typeof message.content === 'string') {\r\n continue;\r\n }\r\n\r\n if (!Array.isArray(message.content)) {\r\n continue;\r\n }\r\n\r\n // Reduce text types to a single string, ignore all other types\r\n const content = message.content.reduce((acc, curr) => {\r\n if (curr.type === ContentTypes.TEXT) {\r\n return `${acc}${curr[ContentTypes.TEXT] || ''}\\n`;\r\n }\r\n return acc;\r\n }, '');\r\n\r\n message.content = content.trim();\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Adds a value at key 0 for system messages and shifts all key indices by one in an indexTokenCountMap.\r\n * This is useful when adding a system message at the beginning of a conversation.\r\n *\r\n * @param indexTokenCountMap - The original map of message indices to token counts\r\n * @param instructionsTokenCount - The token count for the system message to add at index 0\r\n * @returns A new map with the system message at index 0 and all other indices shifted by 1\r\n */\r\nexport function shiftIndexTokenCountMap(\r\n indexTokenCountMap: Record<number, number>,\r\n instructionsTokenCount: number\r\n): Record<number, number> {\r\n // Create a new map to avoid modifying the original\r\n const shiftedMap: Record<number, number> = {};\r\n shiftedMap[0] = instructionsTokenCount;\r\n\r\n // Shift all existing indices by 1\r\n for (const [indexStr, tokenCount] of Object.entries(indexTokenCountMap)) {\r\n const index = Number(indexStr);\r\n shiftedMap[index + 1] = tokenCount;\r\n }\r\n\r\n return shiftedMap;\r\n}\r\n"],"names":["Providers","ContentTypes","HumanMessage","AIMessage","SystemMessage","ToolMessage","messages","getBufferString"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format.cjs","sources":["../../../src/messages/format.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n AIMessage,\n ToolMessage,\n BaseMessage,\n HumanMessage,\n SystemMessage,\n getBufferString,\n} from '@langchain/core/messages';\nimport type { MessageContentImageUrl } from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type {\n MessageContentComplex,\n ToolCallPart,\n TPayload,\n TMessage,\n} from '@/types';\nimport { Providers, ContentTypes } from '@/common';\n\ninterface MediaMessageParams {\n message: {\n role: string;\n content: string;\n name?: string;\n [key: string]: any;\n };\n mediaParts: MessageContentComplex[];\n endpoint?: Providers;\n}\n\n/**\n * Formats a message with media content (images, documents, videos, audios) to API payload format.\n *\n * @param params - The parameters for formatting.\n * @returns - The formatted message.\n */\nexport const formatMediaMessage = ({\n message,\n endpoint,\n mediaParts,\n}: MediaMessageParams): {\n role: string;\n content: MessageContentComplex[];\n name?: string;\n [key: string]: any;\n} => {\n // Create a new object to avoid mutating the input\n const result: {\n role: string;\n content: MessageContentComplex[];\n name?: string;\n [key: string]: any;\n } = {\n ...message,\n content: [] as MessageContentComplex[],\n };\n\n if (endpoint === Providers.ANTHROPIC) {\n result.content = [\n ...mediaParts,\n { type: ContentTypes.TEXT, text: message.content },\n ] as MessageContentComplex[];\n return result;\n }\n\n result.content = [\n { type: ContentTypes.TEXT, text: message.content },\n ...mediaParts,\n ] as MessageContentComplex[];\n\n return result;\n};\n\ninterface MessageInput {\n role?: string;\n _name?: string;\n sender?: string;\n text?: string;\n content?: string | MessageContentComplex[];\n image_urls?: MessageContentImageUrl[];\n documents?: MessageContentComplex[];\n videos?: MessageContentComplex[];\n audios?: MessageContentComplex[];\n lc_id?: string[];\n [key: string]: any;\n}\n\ninterface FormatMessageParams {\n message: MessageInput;\n userName?: string;\n assistantName?: string;\n endpoint?: Providers;\n langChain?: boolean;\n}\n\ninterface FormattedMessage {\n role: string;\n content: string | MessageContentComplex[];\n name?: string;\n [key: string]: any;\n}\n\n/**\n * Formats a message to OpenAI payload format based on the provided options.\n *\n * @param params - The parameters for formatting.\n * @returns - The formatted message.\n */\nexport const formatMessage = ({\n message,\n userName,\n endpoint,\n assistantName,\n langChain = false,\n}: FormatMessageParams):\n | FormattedMessage\n | HumanMessage\n | AIMessage\n | SystemMessage => {\n // eslint-disable-next-line prefer-const\n let { role: _role, _name, sender, text, content: _content, lc_id } = message;\n if (lc_id && lc_id[2] && !langChain) {\n const roleMapping: Record<string, string> = {\n SystemMessage: 'system',\n HumanMessage: 'user',\n AIMessage: 'assistant',\n };\n _role = roleMapping[lc_id[2]] || _role;\n }\n const role =\n _role ??\n (sender != null && sender && sender.toLowerCase() === 'user'\n ? 'user'\n : 'assistant');\n const content = _content ?? text ?? '';\n const formattedMessage: FormattedMessage = {\n role,\n content,\n };\n\n // Set name fields first\n if (_name != null && _name) {\n formattedMessage.name = _name;\n }\n\n if (userName != null && userName && formattedMessage.role === 'user') {\n formattedMessage.name = userName;\n }\n\n if (\n assistantName != null &&\n assistantName &&\n formattedMessage.role === 'assistant'\n ) {\n formattedMessage.name = assistantName;\n }\n\n if (formattedMessage.name != null && formattedMessage.name) {\n // Conform to API regex: ^[a-zA-Z0-9_-]{1,64}$\n // https://community.openai.com/t/the-format-of-the-name-field-in-the-documentation-is-incorrect/175684/2\n formattedMessage.name = formattedMessage.name.replace(\n /[^a-zA-Z0-9_-]/g,\n '_'\n );\n\n if (formattedMessage.name.length > 64) {\n formattedMessage.name = formattedMessage.name.substring(0, 64);\n }\n }\n\n const { image_urls, documents, videos, audios } = message;\n const mediaParts: MessageContentComplex[] = [];\n\n if (Array.isArray(documents) && documents.length > 0) {\n mediaParts.push(...documents);\n }\n\n if (Array.isArray(videos) && videos.length > 0) {\n mediaParts.push(...videos);\n }\n\n if (Array.isArray(audios) && audios.length > 0) {\n mediaParts.push(...audios);\n }\n\n if (Array.isArray(image_urls) && image_urls.length > 0) {\n mediaParts.push(...image_urls);\n }\n\n if (mediaParts.length > 0 && role === 'user') {\n const mediaMessage = formatMediaMessage({\n message: {\n ...formattedMessage,\n content:\n typeof formattedMessage.content === 'string'\n ? formattedMessage.content\n : '',\n },\n mediaParts,\n endpoint,\n });\n\n if (!langChain) {\n return mediaMessage;\n }\n\n return new HumanMessage(mediaMessage);\n }\n\n if (!langChain) {\n return formattedMessage;\n }\n\n if (role === 'user') {\n return new HumanMessage(formattedMessage);\n } else if (role === 'assistant') {\n return new AIMessage(formattedMessage);\n } else {\n return new SystemMessage(formattedMessage);\n }\n};\n\n/**\n * Formats an array of messages for LangChain.\n *\n * @param messages - The array of messages to format.\n * @param formatOptions - The options for formatting each message.\n * @returns - The array of formatted LangChain messages.\n */\nexport const formatLangChainMessages = (\n messages: Array<MessageInput>,\n formatOptions: Omit<FormatMessageParams, 'message' | 'langChain'>\n): Array<HumanMessage | AIMessage | SystemMessage> => {\n return messages.map((msg) => {\n const formatted = formatMessage({\n ...formatOptions,\n message: msg,\n langChain: true,\n });\n return formatted as HumanMessage | AIMessage | SystemMessage;\n });\n};\n\ninterface LangChainMessage {\n lc_kwargs?: {\n additional_kwargs?: Record<string, any>;\n [key: string]: any;\n };\n kwargs?: {\n additional_kwargs?: Record<string, any>;\n [key: string]: any;\n };\n [key: string]: any;\n}\n\n/**\n * Formats a LangChain message object by merging properties from `lc_kwargs` or `kwargs` and `additional_kwargs`.\n *\n * @param message - The message object to format.\n * @returns - The formatted LangChain message.\n */\nexport const formatFromLangChain = (\n message: LangChainMessage\n): Record<string, any> => {\n const kwargs = message.lc_kwargs ?? message.kwargs ?? {};\n const { additional_kwargs = {}, ...message_kwargs } = kwargs;\n return {\n ...message_kwargs,\n ...additional_kwargs,\n };\n};\n\n/**\n * Helper function to format an assistant message\n * @param message The message to format\n * @returns Array of formatted messages\n */\nfunction formatAssistantMessage(\n message: Partial<TMessage>\n): Array<AIMessage | ToolMessage> {\n const formattedMessages: Array<AIMessage | ToolMessage> = [];\n let currentContent: MessageContentComplex[] = [];\n let lastAIMessage: AIMessage | null = null;\n let hasReasoning = false;\n\n if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === ContentTypes.TEXT && part.tool_call_ids) {\n /*\n If there's pending content, it needs to be aggregated as a single string to prepare for tool calls.\n For Anthropic models, the \"tool_calls\" field on a message is only respected if content is a string.\n */\n if (currentContent.length > 0) {\n let content = currentContent.reduce((acc, curr) => {\n if (curr.type === ContentTypes.TEXT) {\n return `${acc}${curr[ContentTypes.TEXT] || ''}\\n`;\n }\n return acc;\n }, '');\n content =\n `${content}\\n${part[ContentTypes.TEXT] ?? part.text ?? ''}`.trim();\n lastAIMessage = new AIMessage({ content });\n formattedMessages.push(lastAIMessage);\n currentContent = [];\n continue;\n }\n // Create a new AIMessage with this text and prepare for tool calls\n lastAIMessage = new AIMessage({\n content: part.text || '',\n });\n formattedMessages.push(lastAIMessage);\n } else if (part.type === ContentTypes.TOOL_CALL) {\n // Skip malformed tool call entries without tool_call property\n if (!part.tool_call) {\n continue;\n }\n\n // Note: `tool_calls` list is defined when constructed by `AIMessage` class, and outputs should be excluded from it\n const {\n output,\n args: _args,\n ..._tool_call\n } = part.tool_call as ToolCallPart;\n\n // Skip invalid tool calls that have no name AND no output\n if (!_tool_call.name && (output == null || output === '')) {\n continue;\n }\n\n if (!lastAIMessage) {\n // \"Heal\" the payload by creating an AIMessage to precede the tool call\n lastAIMessage = new AIMessage({ content: '' });\n formattedMessages.push(lastAIMessage);\n }\n\n const tool_call: ToolCallPart = _tool_call;\n // TODO: investigate; args as dictionary may need to be providers-or-tool-specific\n let args: any = _args;\n try {\n if (typeof _args === 'string') {\n args = JSON.parse(_args);\n }\n } catch {\n if (typeof _args === 'string') {\n args = { input: _args };\n }\n }\n\n tool_call.args = args;\n if (!lastAIMessage.tool_calls) {\n lastAIMessage.tool_calls = [];\n }\n lastAIMessage.tool_calls.push(tool_call as ToolCall);\n\n formattedMessages.push(\n new ToolMessage({\n tool_call_id: tool_call.id ?? '',\n name: tool_call.name,\n content: output || '',\n })\n );\n } else if (part.type === ContentTypes.THINK) {\n hasReasoning = true;\n continue;\n } else if (\n part.type === ContentTypes.ERROR ||\n part.type === ContentTypes.AGENT_UPDATE\n ) {\n continue;\n } else {\n currentContent.push(part);\n }\n }\n }\n\n if (hasReasoning && currentContent.length > 0) {\n const content = currentContent\n .reduce((acc, curr) => {\n if (curr.type === ContentTypes.TEXT) {\n return `${acc}${curr[ContentTypes.TEXT] || ''}\\n`;\n }\n return acc;\n }, '')\n .trim();\n\n if (content) {\n formattedMessages.push(new AIMessage({ content }));\n }\n } else if (currentContent.length > 0) {\n formattedMessages.push(new AIMessage({ content: currentContent }));\n }\n\n return formattedMessages;\n}\n\n/**\n * Formats an array of messages for LangChain, handling tool calls and creating ToolMessage instances.\n *\n * @param payload - The array of messages to format.\n * @param indexTokenCountMap - Optional map of message indices to token counts.\n * @param tools - Optional set of tool names that are allowed in the request.\n * @returns - Object containing formatted messages and updated indexTokenCountMap if provided.\n */\nexport const formatAgentMessages = (\n payload: TPayload,\n indexTokenCountMap?: Record<number, number>,\n tools?: Set<string>\n): {\n messages: Array<HumanMessage | AIMessage | SystemMessage | ToolMessage>;\n indexTokenCountMap?: Record<number, number>;\n} => {\n const messages: Array<\n HumanMessage | AIMessage | SystemMessage | ToolMessage\n > = [];\n // If indexTokenCountMap is provided, create a new map to track the updated indices\n const updatedIndexTokenCountMap: Record<number, number> = {};\n // Keep track of the mapping from original payload indices to result indices\n const indexMapping: Record<number, number[]> = {};\n\n // Process messages with tool conversion if tools set is provided\n for (let i = 0; i < payload.length; i++) {\n const message = payload[i];\n // Q: Store the current length of messages to track where this payload message starts in the result?\n // const startIndex = messages.length;\n if (typeof message.content === 'string') {\n message.content = [\n { type: ContentTypes.TEXT, [ContentTypes.TEXT]: message.content },\n ];\n }\n if (message.role !== 'assistant') {\n messages.push(\n formatMessage({\n message: message as MessageInput,\n langChain: true,\n }) as HumanMessage | AIMessage | SystemMessage\n );\n\n // Update the index mapping for this message\n indexMapping[i] = [messages.length - 1];\n continue;\n }\n\n // For assistant messages, track the starting index before processing\n const startMessageIndex = messages.length;\n\n // If tools set is provided, we need to check if we need to convert tool messages to a string\n if (tools) {\n // First, check if this message contains tool calls\n let hasToolCalls = false;\n let hasInvalidTool = false;\n const toolNames: string[] = [];\n\n const content = message.content;\n if (content && Array.isArray(content)) {\n for (const part of content) {\n if (part.type === ContentTypes.TOOL_CALL) {\n hasToolCalls = true;\n if (tools.size === 0) {\n hasInvalidTool = true;\n break;\n }\n // Protect against malformed tool call entries\n if (\n !part.tool_call ||\n part.tool_call.name == null ||\n part.tool_call.name === ''\n ) {\n hasInvalidTool = true;\n continue;\n }\n const toolName = part.tool_call.name;\n toolNames.push(toolName);\n if (!tools.has(toolName)) {\n hasInvalidTool = true;\n }\n }\n }\n }\n\n // If this message has tool calls and at least one is invalid, we need to convert it\n if (hasToolCalls && hasInvalidTool) {\n // We need to collect all related messages (this message and any subsequent tool messages)\n const toolSequence: BaseMessage[] = [];\n let sequenceEndIndex = i;\n\n // Process the current assistant message to get the AIMessage with tool calls\n const formattedMessages = formatAssistantMessage(message);\n toolSequence.push(...formattedMessages);\n\n // Look ahead for any subsequent assistant messages that might be part of this tool sequence\n let j = i + 1;\n while (j < payload.length && payload[j].role === 'assistant') {\n // Check if this is a continuation of the tool sequence\n let isToolResponse = false;\n const content = payload[j].content;\n if (content && Array.isArray(content)) {\n for (const part of content) {\n if (part.type === ContentTypes.TOOL_CALL) {\n isToolResponse = true;\n break;\n }\n }\n }\n\n if (isToolResponse) {\n // This is part of the tool sequence, add it\n const nextMessages = formatAssistantMessage(payload[j]);\n toolSequence.push(...nextMessages);\n sequenceEndIndex = j;\n j++;\n } else {\n // This is not part of the tool sequence, stop looking\n break;\n }\n }\n\n // Convert the sequence to a string\n const bufferString = getBufferString(toolSequence);\n messages.push(new AIMessage({ content: bufferString }));\n\n // Skip the messages we've already processed\n i = sequenceEndIndex;\n\n // Update the index mapping for this sequence\n const resultIndices = [messages.length - 1];\n for (let k = i; k >= i && k <= sequenceEndIndex; k++) {\n indexMapping[k] = resultIndices;\n }\n\n continue;\n }\n }\n\n // Process the assistant message using the helper function\n const formattedMessages = formatAssistantMessage(message);\n messages.push(...formattedMessages);\n\n // Update the index mapping for this assistant message\n // Store all indices that were created from this original message\n const endMessageIndex = messages.length;\n const resultIndices = [];\n for (let j = startMessageIndex; j < endMessageIndex; j++) {\n resultIndices.push(j);\n }\n indexMapping[i] = resultIndices;\n }\n\n // Update the token count map if it was provided\n if (indexTokenCountMap) {\n for (\n let originalIndex = 0;\n originalIndex < payload.length;\n originalIndex++\n ) {\n const resultIndices = indexMapping[originalIndex] || [];\n const tokenCount = indexTokenCountMap[originalIndex];\n\n if (tokenCount !== undefined) {\n if (resultIndices.length === 1) {\n // Simple 1:1 mapping\n updatedIndexTokenCountMap[resultIndices[0]] = tokenCount;\n } else if (resultIndices.length > 1) {\n // If one message was split into multiple, distribute the token count\n // This is a simplification - in reality, you might want a more sophisticated distribution\n const countPerMessage = Math.floor(tokenCount / resultIndices.length);\n resultIndices.forEach((resultIndex, idx) => {\n if (idx === resultIndices.length - 1) {\n // Give any remainder to the last message\n updatedIndexTokenCountMap[resultIndex] =\n tokenCount - countPerMessage * (resultIndices.length - 1);\n } else {\n updatedIndexTokenCountMap[resultIndex] = countPerMessage;\n }\n });\n }\n }\n }\n }\n\n return {\n messages,\n indexTokenCountMap: indexTokenCountMap\n ? updatedIndexTokenCountMap\n : undefined,\n };\n};\n\n/**\n * Adds a value at key 0 for system messages and shifts all key indices by one in an indexTokenCountMap.\n * This is useful when adding a system message at the beginning of a conversation.\n *\n * @param indexTokenCountMap - The original map of message indices to token counts\n * @param instructionsTokenCount - The token count for the system message to add at index 0\n * @returns A new map with the system message at index 0 and all other indices shifted by 1\n */\nexport function shiftIndexTokenCountMap(\n indexTokenCountMap: Record<number, number>,\n instructionsTokenCount: number\n): Record<number, number> {\n // Create a new map to avoid modifying the original\n const shiftedMap: Record<number, number> = {};\n shiftedMap[0] = instructionsTokenCount;\n\n // Shift all existing indices by 1\n for (const [indexStr, tokenCount] of Object.entries(indexTokenCountMap)) {\n const index = Number(indexStr);\n shiftedMap[index + 1] = tokenCount;\n }\n\n return shiftedMap;\n}\n"],"names":["Providers","ContentTypes","HumanMessage","AIMessage","SystemMessage","ToolMessage","messages","getBufferString"],"mappings":"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"}
|
package/dist/cjs/run.cjs
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
require('./instrumentation.cjs');
|
|
4
|
-
var zodToJsonSchema = require('zod-to-json-schema');
|
|
5
4
|
var langchain = require('@langfuse/langchain');
|
|
6
5
|
var prompts = require('@langchain/core/prompts');
|
|
7
|
-
var messages = require('@langchain/core/messages');
|
|
8
6
|
var runnables = require('@langchain/core/runnables');
|
|
9
7
|
var openai = require('@langchain/openai');
|
|
10
|
-
var _enum = require('./common/enum.cjs');
|
|
11
|
-
var providers = require('./llm/providers.cjs');
|
|
12
|
-
var format = require('./messages/format.cjs');
|
|
13
8
|
var title = require('./utils/title.cjs');
|
|
9
|
+
var _enum = require('./common/enum.cjs');
|
|
10
|
+
var MultiAgentGraph = require('./graphs/MultiAgentGraph.cjs');
|
|
14
11
|
var tokens = require('./utils/tokens.cjs');
|
|
15
12
|
var Graph = require('./graphs/Graph.cjs');
|
|
16
13
|
var events = require('./events.cjs');
|
|
@@ -31,13 +28,12 @@ const defaultOmitOptions = new Set([
|
|
|
31
28
|
'additionalModelRequestFields',
|
|
32
29
|
]);
|
|
33
30
|
class Run {
|
|
34
|
-
graphRunnable;
|
|
35
|
-
// private collab!: CollabGraph;
|
|
36
|
-
// private taskManager!: TaskManager;
|
|
37
|
-
handlerRegistry;
|
|
38
31
|
id;
|
|
32
|
+
tokenCounter;
|
|
33
|
+
handlerRegistry;
|
|
34
|
+
indexTokenCountMap;
|
|
35
|
+
graphRunnable;
|
|
39
36
|
Graph;
|
|
40
|
-
provider;
|
|
41
37
|
returnContent = false;
|
|
42
38
|
constructor(config) {
|
|
43
39
|
const runId = config.runId ?? '';
|
|
@@ -45,6 +41,8 @@ class Run {
|
|
|
45
41
|
throw new Error('Run ID not provided');
|
|
46
42
|
}
|
|
47
43
|
this.id = runId;
|
|
44
|
+
this.tokenCounter = config.tokenCounter;
|
|
45
|
+
this.indexTokenCountMap = config.indexTokenCountMap;
|
|
48
46
|
const handlerRegistry = new events.HandlerRegistry();
|
|
49
47
|
if (config.customHandlers) {
|
|
50
48
|
for (const [eventType, handler] of Object.entries(config.customHandlers)) {
|
|
@@ -55,29 +53,80 @@ class Run {
|
|
|
55
53
|
if (!config.graphConfig) {
|
|
56
54
|
throw new Error('Graph config not provided');
|
|
57
55
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
this.graphRunnable = this.
|
|
56
|
+
/** Handle different graph types */
|
|
57
|
+
if (config.graphConfig.type === 'multi-agent') {
|
|
58
|
+
this.graphRunnable = this.createMultiAgentGraph(config.graphConfig);
|
|
59
|
+
if (this.Graph) {
|
|
60
|
+
this.Graph.handlerRegistry = handlerRegistry;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
/** Default to legacy graph for 'standard' or undefined type */
|
|
65
|
+
this.graphRunnable = this.createLegacyGraph(config.graphConfig);
|
|
61
66
|
if (this.Graph) {
|
|
67
|
+
this.Graph.compileOptions =
|
|
68
|
+
config.graphConfig.compileOptions ?? this.Graph.compileOptions;
|
|
62
69
|
this.Graph.handlerRegistry = handlerRegistry;
|
|
63
70
|
}
|
|
64
71
|
}
|
|
65
72
|
this.returnContent = config.returnContent ?? false;
|
|
66
73
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
74
|
+
createLegacyGraph(config) {
|
|
75
|
+
let agentConfig;
|
|
76
|
+
let signal;
|
|
77
|
+
/** Check if this is a multi-agent style config (has agents array) */
|
|
78
|
+
if ('agents' in config && Array.isArray(config.agents)) {
|
|
79
|
+
if (config.agents.length === 0) {
|
|
80
|
+
throw new Error('At least one agent must be provided');
|
|
81
|
+
}
|
|
82
|
+
agentConfig = config.agents[0];
|
|
83
|
+
signal = config.signal;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
/** Legacy path: build agent config from llmConfig */
|
|
87
|
+
const { type: _type, llmConfig, signal: legacySignal, tools = [], ...agentInputs } = config;
|
|
88
|
+
const { provider, ...clientOptions } = llmConfig;
|
|
89
|
+
agentConfig = {
|
|
90
|
+
...agentInputs,
|
|
91
|
+
tools,
|
|
92
|
+
provider,
|
|
93
|
+
clientOptions,
|
|
94
|
+
agentId: 'default',
|
|
95
|
+
};
|
|
96
|
+
signal = legacySignal;
|
|
97
|
+
}
|
|
70
98
|
const standardGraph = new Graph.StandardGraph({
|
|
71
|
-
|
|
72
|
-
provider,
|
|
73
|
-
clientOptions,
|
|
74
|
-
...graphInput,
|
|
99
|
+
signal,
|
|
75
100
|
runId: this.id,
|
|
101
|
+
agents: [agentConfig],
|
|
102
|
+
tokenCounter: this.tokenCounter,
|
|
103
|
+
indexTokenCountMap: this.indexTokenCountMap,
|
|
76
104
|
});
|
|
105
|
+
/** Propagate compile options from graph config */
|
|
106
|
+
standardGraph.compileOptions = config.compileOptions;
|
|
77
107
|
this.Graph = standardGraph;
|
|
78
108
|
return standardGraph.createWorkflow();
|
|
79
109
|
}
|
|
110
|
+
createMultiAgentGraph(config) {
|
|
111
|
+
const { agents, edges, compileOptions } = config;
|
|
112
|
+
const multiAgentGraph = new MultiAgentGraph.MultiAgentGraph({
|
|
113
|
+
runId: this.id,
|
|
114
|
+
agents,
|
|
115
|
+
edges,
|
|
116
|
+
tokenCounter: this.tokenCounter,
|
|
117
|
+
indexTokenCountMap: this.indexTokenCountMap,
|
|
118
|
+
});
|
|
119
|
+
if (compileOptions != null) {
|
|
120
|
+
multiAgentGraph.compileOptions = compileOptions;
|
|
121
|
+
}
|
|
122
|
+
this.Graph = multiAgentGraph;
|
|
123
|
+
return multiAgentGraph.createWorkflow();
|
|
124
|
+
}
|
|
80
125
|
static async create(config) {
|
|
126
|
+
/** Create tokenCounter if indexTokenCountMap is provided but tokenCounter is not */
|
|
127
|
+
if (config.indexTokenCountMap && !config.tokenCounter) {
|
|
128
|
+
config.tokenCounter = await tokens.createTokenCounter();
|
|
129
|
+
}
|
|
81
130
|
return new Run(config);
|
|
82
131
|
}
|
|
83
132
|
getRunMessages() {
|
|
@@ -86,21 +135,39 @@ class Run {
|
|
|
86
135
|
}
|
|
87
136
|
return this.Graph.getRunMessages();
|
|
88
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Creates a custom event callback handler that intercepts custom events
|
|
140
|
+
* and processes them through our handler registry instead of EventStreamCallbackHandler
|
|
141
|
+
*/
|
|
142
|
+
createCustomEventCallback() {
|
|
143
|
+
return async (eventName, data, runId, tags, metadata) => {
|
|
144
|
+
if (data['emitted'] === true &&
|
|
145
|
+
eventName === _enum.GraphEvents.CHAT_MODEL_STREAM) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const handler = this.handlerRegistry?.getHandler(eventName);
|
|
149
|
+
if (handler && this.Graph) {
|
|
150
|
+
await handler.handle(eventName, data, metadata, this.Graph);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
}
|
|
89
154
|
async processStream(inputs, config, streamOptions) {
|
|
90
|
-
if (
|
|
155
|
+
if (this.graphRunnable == null) {
|
|
91
156
|
throw new Error('Run not initialized. Make sure to use Run.create() to instantiate the Run.');
|
|
92
157
|
}
|
|
93
158
|
if (!this.Graph) {
|
|
94
159
|
throw new Error('Graph not initialized. Make sure to use Run.create() to instantiate the Run.');
|
|
95
160
|
}
|
|
96
161
|
this.Graph.resetValues(streamOptions?.keepContent);
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
162
|
+
/** Custom event callback to intercept and handle custom events */
|
|
163
|
+
const customEventCallback = this.createCustomEventCallback();
|
|
164
|
+
const baseCallbacks = config.callbacks ?? [];
|
|
165
|
+
const streamCallbacks = streamOptions?.callbacks
|
|
166
|
+
? this.getCallbacks(streamOptions.callbacks)
|
|
167
|
+
: [];
|
|
168
|
+
config.callbacks = baseCallbacks.concat(streamCallbacks).concat({
|
|
169
|
+
[_enum.Callback.CUSTOM_EVENT]: customEventCallback,
|
|
170
|
+
});
|
|
104
171
|
if (misc.isPresent(process.env.LANGFUSE_SECRET_KEY) &&
|
|
105
172
|
misc.isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
|
|
106
173
|
misc.isPresent(process.env.LANGFUSE_BASE_URL)) {
|
|
@@ -120,60 +187,23 @@ class Run {
|
|
|
120
187
|
if (!this.id) {
|
|
121
188
|
throw new Error('Run ID not provided');
|
|
122
189
|
}
|
|
123
|
-
const tokenCounter = streamOptions?.tokenCounter ??
|
|
124
|
-
(streamOptions?.indexTokenCountMap
|
|
125
|
-
? await tokens.createTokenCounter()
|
|
126
|
-
: undefined);
|
|
127
|
-
const tools = this.Graph.tools;
|
|
128
|
-
const toolTokens = tokenCounter
|
|
129
|
-
? (tools?.reduce((acc, tool) => {
|
|
130
|
-
if (!tool.schema) {
|
|
131
|
-
return acc;
|
|
132
|
-
}
|
|
133
|
-
const jsonSchema = zodToJsonSchema.zodToJsonSchema((tool?.schema).describe(tool?.description ?? ''), tool?.name ?? '');
|
|
134
|
-
return (acc + tokenCounter(new messages.SystemMessage(JSON.stringify(jsonSchema))));
|
|
135
|
-
}, 0) ?? 0)
|
|
136
|
-
: 0;
|
|
137
|
-
let instructionTokens = toolTokens;
|
|
138
|
-
if (this.Graph.systemMessage && tokenCounter) {
|
|
139
|
-
instructionTokens += tokenCounter(this.Graph.systemMessage);
|
|
140
|
-
}
|
|
141
|
-
const tokenMap = streamOptions?.indexTokenCountMap ?? {};
|
|
142
|
-
if (this.Graph.systemMessage && instructionTokens > 0) {
|
|
143
|
-
this.Graph.indexTokenCountMap = format.shiftIndexTokenCountMap(tokenMap, instructionTokens);
|
|
144
|
-
}
|
|
145
|
-
else if (instructionTokens > 0) {
|
|
146
|
-
tokenMap[0] = tokenMap[0] + instructionTokens;
|
|
147
|
-
this.Graph.indexTokenCountMap = tokenMap;
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
this.Graph.indexTokenCountMap = tokenMap;
|
|
151
|
-
}
|
|
152
|
-
this.Graph.maxContextTokens = streamOptions?.maxContextTokens;
|
|
153
|
-
this.Graph.tokenCounter = tokenCounter;
|
|
154
190
|
config.run_id = this.id;
|
|
155
191
|
config.configurable = Object.assign(config.configurable ?? {}, {
|
|
156
192
|
run_id: this.id,
|
|
157
|
-
provider: this.provider,
|
|
158
193
|
});
|
|
159
194
|
const stream = this.graphRunnable.streamEvents(inputs, config, {
|
|
160
195
|
raiseError: true,
|
|
161
196
|
});
|
|
162
197
|
for await (const event of stream) {
|
|
163
|
-
const { data,
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
eventName === _enum.GraphEvents.CHAT_MODEL_STREAM) {
|
|
168
|
-
/* Skipping CHAT_MODEL_STREAM event due to double-call edge case */
|
|
198
|
+
const { data, metadata, ...info } = event;
|
|
199
|
+
const eventName = info.event;
|
|
200
|
+
/** Skip custom events as they're handled by our callback */
|
|
201
|
+
if (eventName === _enum.GraphEvents.ON_CUSTOM_EVENT) {
|
|
169
202
|
continue;
|
|
170
203
|
}
|
|
171
|
-
|
|
172
|
-
eventName = name;
|
|
173
|
-
}
|
|
174
|
-
const handler = this.handlerRegistry.getHandler(eventName);
|
|
204
|
+
const handler = this.handlerRegistry?.getHandler(eventName);
|
|
175
205
|
if (handler) {
|
|
176
|
-
handler.handle(eventName, data, metadata, this.Graph);
|
|
206
|
+
await handler.handle(eventName, data, metadata, this.Graph);
|
|
177
207
|
}
|
|
178
208
|
}
|
|
179
209
|
if (this.returnContent) {
|
|
@@ -195,7 +225,7 @@ class Run {
|
|
|
195
225
|
[_enum.Callback.TOOL_END]: this.createSystemCallback(clientCallbacks, _enum.Callback.TOOL_END),
|
|
196
226
|
};
|
|
197
227
|
}
|
|
198
|
-
async generateTitle({ provider, inputText, contentParts, titlePrompt, clientOptions, chainOptions, skipLanguage,
|
|
228
|
+
async generateTitle({ provider, inputText, contentParts, titlePrompt, clientOptions, chainOptions, skipLanguage, titleMethod = _enum.TitleMethod.COMPLETION, titlePromptTemplate, }) {
|
|
199
229
|
if (chainOptions != null &&
|
|
200
230
|
misc.isPresent(process.env.LANGFUSE_SECRET_KEY) &&
|
|
201
231
|
misc.isPresent(process.env.LANGFUSE_PUBLIC_KEY) &&
|
|
@@ -222,7 +252,6 @@ class Run {
|
|
|
222
252
|
.join('\n');
|
|
223
253
|
const model = this.Graph?.getNewModel({
|
|
224
254
|
provider,
|
|
225
|
-
omitOptions,
|
|
226
255
|
clientOptions,
|
|
227
256
|
});
|
|
228
257
|
if (!model) {
|
|
@@ -255,7 +284,23 @@ class Run {
|
|
|
255
284
|
.pipe(convoToTitleInput)
|
|
256
285
|
.pipe(titleChain)
|
|
257
286
|
.withConfig({ runName: 'TitleChain' });
|
|
258
|
-
|
|
287
|
+
const invokeConfig = Object.assign({}, chainOptions, {
|
|
288
|
+
run_id: this.id,
|
|
289
|
+
runId: this.id,
|
|
290
|
+
});
|
|
291
|
+
try {
|
|
292
|
+
return await fullChain.invoke({ input: inputText, output: response }, invokeConfig);
|
|
293
|
+
}
|
|
294
|
+
catch (_e) {
|
|
295
|
+
// Fallback: strip callbacks to avoid EventStream tracer errors in certain environments
|
|
296
|
+
// But preserve langfuse handler if it exists
|
|
297
|
+
const langfuseHandler = invokeConfig.callbacks?.find((cb) => cb instanceof langchain.CallbackHandler);
|
|
298
|
+
const { callbacks: _cb, ...rest } = invokeConfig;
|
|
299
|
+
const safeConfig = Object.assign({}, rest, {
|
|
300
|
+
callbacks: langfuseHandler ? [langfuseHandler] : [],
|
|
301
|
+
});
|
|
302
|
+
return await fullChain.invoke({ input: inputText, output: response }, safeConfig);
|
|
303
|
+
}
|
|
259
304
|
}
|
|
260
305
|
}
|
|
261
306
|
|