@librechat/agents 2.1.7 → 2.1.8
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/cjs/common/enum.cjs +6 -3
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +1 -13
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/messages.cjs +43 -5
- package/dist/cjs/messages.cjs.map +1 -1
- package/dist/cjs/stream.cjs +3 -3
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/esm/common/enum.mjs +6 -3
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +1 -13
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/messages.mjs +43 -5
- package/dist/esm/messages.mjs.map +1 -1
- package/dist/esm/stream.mjs +3 -3
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/types/common/enum.d.ts +6 -3
- package/dist/types/messages.d.ts +2 -1
- package/dist/types/types/stream.d.ts +10 -1
- package/package.json +2 -2
- package/src/common/enum.ts +6 -3
- package/src/graphs/Graph.ts +1 -13
- package/src/messages.ts +56 -5
- package/src/stream.ts +3 -3
- package/src/types/stream.ts +8 -1
package/dist/esm/stream.mjs
CHANGED
|
@@ -192,11 +192,11 @@ hasToolCallChunks: ${hasToolCallChunks}
|
|
|
192
192
|
content,
|
|
193
193
|
});
|
|
194
194
|
}
|
|
195
|
-
else if (content.every((c) => c.type?.startsWith(ContentTypes.THINKING))) {
|
|
195
|
+
else if (content.every((c) => c.type?.startsWith(ContentTypes.THINKING) || c.type?.startsWith(ContentTypes.REASONING_CONTENT))) {
|
|
196
196
|
graph.dispatchReasoningDelta(stepId, {
|
|
197
197
|
content: content.map((c) => ({
|
|
198
198
|
type: ContentTypes.THINK,
|
|
199
|
-
think: c.thinking,
|
|
199
|
+
think: c.thinking ?? c.reasoningText?.text ?? '',
|
|
200
200
|
}))
|
|
201
201
|
});
|
|
202
202
|
}
|
|
@@ -264,7 +264,7 @@ hasToolCallChunks: ${hasToolCallChunks}
|
|
|
264
264
|
};
|
|
265
265
|
handleReasoning(chunk, graph) {
|
|
266
266
|
let reasoning_content = chunk.additional_kwargs?.[graph.reasoningKey];
|
|
267
|
-
if (Array.isArray(chunk.content) && chunk.content[0]?.type === 'thinking') {
|
|
267
|
+
if (Array.isArray(chunk.content) && (chunk.content[0]?.type === 'thinking' || chunk.content[0]?.type === 'reasoning_content')) {
|
|
268
268
|
reasoning_content = 'valid';
|
|
269
269
|
}
|
|
270
270
|
if (reasoning_content != null && reasoning_content && (chunk.content == null || chunk.content === '' || reasoning_content === 'valid')) {
|
package/dist/esm/stream.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.mjs","sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport { nanoid } from 'nanoid';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { ToolCall, ToolCallChunk } from '@langchain/core/messages/tool';\nimport type { Graph } from '@/graphs';\nimport type * as t from '@/types';\nimport { StepTypes, ContentTypes, GraphEvents, ToolCallTypes } from '@/common';\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport const getMessageId = (stepKey: string, graph: Graph<t.BaseGraphState>, returnExistingId = false): string | undefined => {\n const messageId = graph.messageIdsByStepKey.get(stepKey);\n if (messageId != null && messageId) {\n return returnExistingId ? messageId : undefined;\n }\n\n const prelimMessageId = graph.prelimMessageIdsByStepKey.get(stepKey);\n if (prelimMessageId != null && prelimMessageId) {\n graph.prelimMessageIdsByStepKey.delete(stepKey);\n graph.messageIdsByStepKey.set(stepKey, prelimMessageId);\n return prelimMessageId;\n }\n\n const message_id = `msg_${nanoid()}`;\n graph.messageIdsByStepKey.set(stepKey, message_id);\n return message_id;\n};\n\nexport const handleToolCalls = (toolCalls?: ToolCall[], metadata?: Record<string, unknown>, graph?: Graph): void => {\n if (!graph || !metadata) {\n console.warn(`Graph or metadata not found in ${event} event`);\n return;\n }\n\n if (!toolCalls) {\n return;\n }\n\n if (toolCalls.length === 0) {\n return;\n }\n\n\n const stepKey = graph.getStepKey(metadata);\n \n for (const tool_call of toolCalls) {\n const toolCallId = tool_call.id ?? `toolu_${nanoid()}`;\n tool_call.id = toolCallId;\n if (!toolCallId || graph.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n \n let prevStepId = '';\n let prevRunStep: t.RunStep | undefined;\n try {\n prevStepId = graph.getStepIdByKey(stepKey, graph.contentData.length - 1);\n prevRunStep = graph.getRunStep(prevStepId);\n } catch (e) {\n // no previous step\n }\n\n const dispatchToolCallIds = (lastMessageStepId: string): void => {\n graph.dispatchMessageDelta(lastMessageStepId, {\n content: [{\n type: 'text',\n text: '',\n tool_call_ids: [toolCallId],\n }],\n });\n };\n /* If the previous step exists and is a message creation */\n if (prevStepId && prevRunStep && prevRunStep.type === StepTypes.MESSAGE_CREATION) {\n dispatchToolCallIds(prevStepId);\n graph.messageStepHasToolCalls.set(prevStepId, true);\n /* If the previous step doesn't exist or is not a message creation */\n } else if (!prevRunStep || prevRunStep.type !== StepTypes.MESSAGE_CREATION) {\n const messageId = getMessageId(stepKey, graph, true) ?? '';\n const stepId = graph.dispatchRunStep(stepKey, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: messageId,\n },\n });\n dispatchToolCallIds(stepId);\n graph.messageStepHasToolCalls.set(prevStepId, true);\n }\n\n graph.dispatchRunStep(stepKey, {\n type: StepTypes.TOOL_CALLS,\n tool_calls: [tool_call],\n });\n }\n};\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n handle(event: string, data: t.StreamEventData, metadata?: Record<string, unknown>, graph?: Graph): void {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n const content = (chunk.additional_kwargs?.[graph.reasoningKey] as string | undefined) ?? chunk.content;\n this.handleReasoning(chunk, graph);\n\n let hasToolCalls = false;\n if (chunk.tool_calls && chunk.tool_calls.length > 0 && chunk.tool_calls.every((tc) => tc.id)) {\n hasToolCalls = true;\n handleToolCalls(chunk.tool_calls, metadata, graph);\n }\n\n const hasToolCallChunks = (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const isEmptyContent = typeof content === 'undefined' || !content.length || typeof content === 'string' && !content;\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n const chunkId = chunk.id ?? '';\n if (isEmptyChunk && chunkId && chunkId.startsWith('msg')) {\n if (graph.messageIdsByStepKey.has(chunkId)) {\n return;\n } else if (graph.prelimMessageIdsByStepKey.has(chunkId)) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n graph.prelimMessageIdsByStepKey.set(stepKey, chunkId);\n return;\n } else if (isEmptyChunk) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n\n if (hasToolCallChunks\n && chunk.tool_call_chunks\n && chunk.tool_call_chunks.length\n && typeof chunk.tool_call_chunks[0]?.index === 'number') {\n this.handleToolCallChunks({ graph, stepKey, toolCallChunks: chunk.tool_call_chunks });\n }\n\n if (isEmptyContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n graph.dispatchRunStep(stepKey, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n }\n\n const stepId = graph.getStepIdByKey(stepKey);\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n // eslint-disable-next-line no-console\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (hasToolCallChunks && (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)) {\n return;\n } else if (typeof content === 'string') {\n if (graph.currentTokenType === ContentTypes.TEXT) {\n graph.dispatchMessageDelta(stepId, {\n content: [{\n type: ContentTypes.TEXT,\n text: content,\n }],\n });\n } else {\n graph.dispatchReasoningDelta(stepId, {\n content: [{\n type: ContentTypes.THINK,\n think: content,\n }],\n });\n }\n } else if (content.every((c) => c.type?.startsWith(ContentTypes.TEXT))) {\n graph.dispatchMessageDelta(stepId, {\n content,\n });\n } else if (content.every((c) => c.type?.startsWith(ContentTypes.THINKING))) {\n graph.dispatchReasoningDelta(stepId, {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think: (c as t.ThinkingContentText).thinking,\n }))});\n }\n }\n handleToolCallChunks = ({\n graph,\n stepKey,\n toolCallChunks,\n }: {\n graph: Graph;\n stepKey: string;\n toolCallChunks: ToolCallChunk[],\n }): void => {\n let prevStepId: string;\n let prevRunStep: t.RunStep | undefined;\n try {\n prevStepId = graph.getStepIdByKey(stepKey, graph.contentData.length - 1);\n prevRunStep = graph.getRunStep(prevStepId);\n } catch (e) {\n /** Edge Case: If no previous step exists, create a new message creation step */\n const message_id = getMessageId(stepKey, graph, true) ?? '';\n prevStepId = graph.dispatchRunStep(stepKey, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n prevRunStep = graph.getRunStep(prevStepId);\n }\n\n const _stepId = graph.getStepIdByKey(stepKey, prevRunStep?.index);\n \n /** Edge Case: Tool Call Run Step or `tool_call_ids` never dispatched */\n const tool_calls: ToolCall[] | undefined =\n prevStepId && prevRunStep && prevRunStep.type === StepTypes.MESSAGE_CREATION\n ? []\n : undefined;\n \n /** Edge Case: `id` and `name` fields cannot be empty strings */\n for (const toolCallChunk of toolCallChunks) {\n if (toolCallChunk.name === '') {\n toolCallChunk.name = undefined;\n }\n if (toolCallChunk.id === '') {\n toolCallChunk.id = undefined;\n } else if (tool_calls != null && toolCallChunk.id != null && toolCallChunk.name != null) {\n tool_calls.push({\n args: {},\n id: toolCallChunk.id,\n name: toolCallChunk.name,\n type: ToolCallTypes.TOOL_CALL,\n });\n }\n }\n\n let stepId: string = _stepId;\n const alreadyDispatched = prevRunStep?.type === StepTypes.MESSAGE_CREATION && graph.messageStepHasToolCalls.has(prevStepId);\n if (!alreadyDispatched && tool_calls?.length === toolCallChunks.length) {\n graph.dispatchMessageDelta(prevStepId, {\n content: [{\n type: ContentTypes.TEXT,\n text: '',\n tool_call_ids: tool_calls.map((tc) => tc.id ?? ''),\n }],\n });\n graph.messageStepHasToolCalls.set(prevStepId, true);\n stepId = graph.dispatchRunStep(stepKey, {\n type: StepTypes.TOOL_CALLS,\n tool_calls,\n });\n }\n graph.dispatchRunStepDelta(stepId, {\n type: StepTypes.TOOL_CALLS,\n tool_calls: toolCallChunks,\n });\n };\n handleReasoning(chunk: Partial<AIMessageChunk>, graph: Graph): void {\n let reasoning_content = chunk.additional_kwargs?.[graph.reasoningKey] as string | undefined;\n if (Array.isArray(chunk.content) && chunk.content[0]?.type === 'thinking') {\n reasoning_content = 'valid';\n }\n if (reasoning_content != null && reasoning_content && (chunk.content == null || chunk.content === '' || reasoning_content === 'valid')) {\n graph.currentTokenType = ContentTypes.THINK;\n graph.tokenTypeSwitch = 'reasoning';\n return;\n } else if (graph.tokenTypeSwitch === 'reasoning' && graph.currentTokenType !== ContentTypes.TEXT && chunk.content != null && chunk.content !== '') {\n graph.currentTokenType = ContentTypes.TEXT;\n graph.tokenTypeSwitch = 'content';\n } else if (chunk.content != null && typeof chunk.content === 'string' && chunk.content.includes('<think>')) {\n graph.currentTokenType = ContentTypes.THINK;\n graph.tokenTypeSwitch = 'content';\n } else if (graph.lastToken != null && graph.lastToken.includes('</think>')) {\n graph.currentTokenType = ContentTypes.TEXT;\n graph.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n graph.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n\n const updateContent = (\n index: number,\n contentPart: t.MessageContentComplex,\n finalUpdate = false,\n ): void => {\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index]) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (partType === ContentTypes.IMAGE_URL && 'image_url' in contentPart) {\n const currentContent = contentParts[index] as { type: 'image_url'; image_url: string };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (partType === ContentTypes.TOOL_CALL && 'tool_call' in contentPart) {\n const existingContent = contentParts[index] as Omit<t.ToolCallContent, 'tool_call'> & { tool_call?: ToolCall } | undefined;\n\n const args = finalUpdate\n ? contentPart.tool_call.args\n : (existingContent?.tool_call?.args || '') + (contentPart.tool_call.args ?? '');\n\n const id = getNonEmptyValue([contentPart.tool_call.id, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([contentPart.tool_call.name, existingContent?.tool_call?.name]) ?? '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n };\n\n const aggregateContent = ({ event, data }: {\n event: GraphEvents;\n data: t.RunStep | t.MessageDeltaEvent | t.RunStepDeltaEvent | { result: t.ToolEndEvent };\n }): void => {\n\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Store tool call IDs if present\n if (runStep.stepDetails.type === StepTypes.TOOL_CALLS && runStep.stepDetails.tool_calls) {\n runStep.stepDetails.tool_calls.forEach((toolCall) => {\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n if (messageDelta.delta.content) {\n const contentPart = Array.isArray(messageDelta.delta.content)\n ? messageDelta.delta.content[0]\n : messageDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n if (reasoningDelta.delta.content) {\n const contentPart = Array.isArray(reasoningDelta.delta.content)\n ? reasoningDelta.delta.content[0]\n : reasoningDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n const toolCallId = toolCallIdMap.get(runStepDelta.id);\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as { result: t.ToolEndEvent };\n\n const { id: stepId } = result;\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn('No run step or runId found for completed tool call event');\n return;\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: result.tool_call,\n };\n\n updateContent(runStep.index, contentPart, true);\n }\n\n };\n\n return { contentParts, aggregateContent, stepMap };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stream.mjs","sources":["../../src/stream.ts"],"sourcesContent":["// src/stream.ts\nimport { nanoid } from 'nanoid';\nimport type { AIMessageChunk } from '@langchain/core/messages';\nimport type { ToolCall, ToolCallChunk } from '@langchain/core/messages/tool';\nimport type { Graph } from '@/graphs';\nimport type * as t from '@/types';\nimport { StepTypes, ContentTypes, GraphEvents, ToolCallTypes } from '@/common';\n\nfunction getNonEmptyValue(possibleValues: string[]): string | undefined {\n for (const value of possibleValues) {\n if (value && value.trim() !== '') {\n return value;\n }\n }\n return undefined;\n}\n\nexport const getMessageId = (stepKey: string, graph: Graph<t.BaseGraphState>, returnExistingId = false): string | undefined => {\n const messageId = graph.messageIdsByStepKey.get(stepKey);\n if (messageId != null && messageId) {\n return returnExistingId ? messageId : undefined;\n }\n\n const prelimMessageId = graph.prelimMessageIdsByStepKey.get(stepKey);\n if (prelimMessageId != null && prelimMessageId) {\n graph.prelimMessageIdsByStepKey.delete(stepKey);\n graph.messageIdsByStepKey.set(stepKey, prelimMessageId);\n return prelimMessageId;\n }\n\n const message_id = `msg_${nanoid()}`;\n graph.messageIdsByStepKey.set(stepKey, message_id);\n return message_id;\n};\n\nexport const handleToolCalls = (toolCalls?: ToolCall[], metadata?: Record<string, unknown>, graph?: Graph): void => {\n if (!graph || !metadata) {\n console.warn(`Graph or metadata not found in ${event} event`);\n return;\n }\n\n if (!toolCalls) {\n return;\n }\n\n if (toolCalls.length === 0) {\n return;\n }\n\n\n const stepKey = graph.getStepKey(metadata);\n \n for (const tool_call of toolCalls) {\n const toolCallId = tool_call.id ?? `toolu_${nanoid()}`;\n tool_call.id = toolCallId;\n if (!toolCallId || graph.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n \n let prevStepId = '';\n let prevRunStep: t.RunStep | undefined;\n try {\n prevStepId = graph.getStepIdByKey(stepKey, graph.contentData.length - 1);\n prevRunStep = graph.getRunStep(prevStepId);\n } catch (e) {\n // no previous step\n }\n\n const dispatchToolCallIds = (lastMessageStepId: string): void => {\n graph.dispatchMessageDelta(lastMessageStepId, {\n content: [{\n type: 'text',\n text: '',\n tool_call_ids: [toolCallId],\n }],\n });\n };\n /* If the previous step exists and is a message creation */\n if (prevStepId && prevRunStep && prevRunStep.type === StepTypes.MESSAGE_CREATION) {\n dispatchToolCallIds(prevStepId);\n graph.messageStepHasToolCalls.set(prevStepId, true);\n /* If the previous step doesn't exist or is not a message creation */\n } else if (!prevRunStep || prevRunStep.type !== StepTypes.MESSAGE_CREATION) {\n const messageId = getMessageId(stepKey, graph, true) ?? '';\n const stepId = graph.dispatchRunStep(stepKey, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: messageId,\n },\n });\n dispatchToolCallIds(stepId);\n graph.messageStepHasToolCalls.set(prevStepId, true);\n }\n\n graph.dispatchRunStep(stepKey, {\n type: StepTypes.TOOL_CALLS,\n tool_calls: [tool_call],\n });\n }\n};\n\nexport class ChatModelStreamHandler implements t.EventHandler {\n handle(event: string, data: t.StreamEventData, metadata?: Record<string, unknown>, graph?: Graph): void {\n if (!graph) {\n throw new Error('Graph not found');\n }\n if (!graph.config) {\n throw new Error('Config not found in graph');\n }\n if (!data.chunk) {\n console.warn(`No chunk found in ${event} event`);\n return;\n }\n\n const chunk = data.chunk as Partial<AIMessageChunk>;\n const content = (chunk.additional_kwargs?.[graph.reasoningKey] as string | undefined) ?? chunk.content;\n this.handleReasoning(chunk, graph);\n\n let hasToolCalls = false;\n if (chunk.tool_calls && chunk.tool_calls.length > 0 && chunk.tool_calls.every((tc) => tc.id)) {\n hasToolCalls = true;\n handleToolCalls(chunk.tool_calls, metadata, graph);\n }\n\n const hasToolCallChunks = (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) ?? false;\n const isEmptyContent = typeof content === 'undefined' || !content.length || typeof content === 'string' && !content;\n const isEmptyChunk = isEmptyContent && !hasToolCallChunks;\n const chunkId = chunk.id ?? '';\n if (isEmptyChunk && chunkId && chunkId.startsWith('msg')) {\n if (graph.messageIdsByStepKey.has(chunkId)) {\n return;\n } else if (graph.prelimMessageIdsByStepKey.has(chunkId)) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n graph.prelimMessageIdsByStepKey.set(stepKey, chunkId);\n return;\n } else if (isEmptyChunk) {\n return;\n }\n\n const stepKey = graph.getStepKey(metadata);\n\n if (hasToolCallChunks\n && chunk.tool_call_chunks\n && chunk.tool_call_chunks.length\n && typeof chunk.tool_call_chunks[0]?.index === 'number') {\n this.handleToolCallChunks({ graph, stepKey, toolCallChunks: chunk.tool_call_chunks });\n }\n\n if (isEmptyContent) {\n return;\n }\n\n const message_id = getMessageId(stepKey, graph) ?? '';\n if (message_id) {\n graph.dispatchRunStep(stepKey, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n }\n\n const stepId = graph.getStepIdByKey(stepKey);\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n // eslint-disable-next-line no-console\n console.warn(`\\n\n==============================================================\n\n\nRun step for ${stepId} does not exist, cannot dispatch delta event.\n\nevent: ${event}\nstepId: ${stepId}\nstepKey: ${stepKey}\nmessage_id: ${message_id}\nhasToolCalls: ${hasToolCalls}\nhasToolCallChunks: ${hasToolCallChunks}\n\n==============================================================\n\\n`);\n return;\n }\n\n /* Note: tool call chunks may have non-empty content that matches the current tool chunk generation */\n if (typeof content === 'string' && runStep.type === StepTypes.TOOL_CALLS) {\n return;\n } else if (hasToolCallChunks && (chunk.tool_call_chunks?.some((tc) => tc.args === content) ?? false)) {\n return;\n } else if (typeof content === 'string') {\n if (graph.currentTokenType === ContentTypes.TEXT) {\n graph.dispatchMessageDelta(stepId, {\n content: [{\n type: ContentTypes.TEXT,\n text: content,\n }],\n });\n } else {\n graph.dispatchReasoningDelta(stepId, {\n content: [{\n type: ContentTypes.THINK,\n think: content,\n }],\n });\n }\n } else if (content.every((c) => c.type?.startsWith(ContentTypes.TEXT))) {\n graph.dispatchMessageDelta(stepId, {\n content,\n });\n } else if (content.every((c) => c.type?.startsWith(ContentTypes.THINKING) || c.type?.startsWith(ContentTypes.REASONING_CONTENT))) {\n graph.dispatchReasoningDelta(stepId, {\n content: content.map((c) => ({\n type: ContentTypes.THINK,\n think: (c as t.ThinkingContentText).thinking ?? (c as t.BedrockReasoningContentText).reasoningText?.text ?? '',\n }))});\n }\n }\n handleToolCallChunks = ({\n graph,\n stepKey,\n toolCallChunks,\n }: {\n graph: Graph;\n stepKey: string;\n toolCallChunks: ToolCallChunk[],\n }): void => {\n let prevStepId: string;\n let prevRunStep: t.RunStep | undefined;\n try {\n prevStepId = graph.getStepIdByKey(stepKey, graph.contentData.length - 1);\n prevRunStep = graph.getRunStep(prevStepId);\n } catch (e) {\n /** Edge Case: If no previous step exists, create a new message creation step */\n const message_id = getMessageId(stepKey, graph, true) ?? '';\n prevStepId = graph.dispatchRunStep(stepKey, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n prevRunStep = graph.getRunStep(prevStepId);\n }\n\n const _stepId = graph.getStepIdByKey(stepKey, prevRunStep?.index);\n \n /** Edge Case: Tool Call Run Step or `tool_call_ids` never dispatched */\n const tool_calls: ToolCall[] | undefined =\n prevStepId && prevRunStep && prevRunStep.type === StepTypes.MESSAGE_CREATION\n ? []\n : undefined;\n \n /** Edge Case: `id` and `name` fields cannot be empty strings */\n for (const toolCallChunk of toolCallChunks) {\n if (toolCallChunk.name === '') {\n toolCallChunk.name = undefined;\n }\n if (toolCallChunk.id === '') {\n toolCallChunk.id = undefined;\n } else if (tool_calls != null && toolCallChunk.id != null && toolCallChunk.name != null) {\n tool_calls.push({\n args: {},\n id: toolCallChunk.id,\n name: toolCallChunk.name,\n type: ToolCallTypes.TOOL_CALL,\n });\n }\n }\n\n let stepId: string = _stepId;\n const alreadyDispatched = prevRunStep?.type === StepTypes.MESSAGE_CREATION && graph.messageStepHasToolCalls.has(prevStepId);\n if (!alreadyDispatched && tool_calls?.length === toolCallChunks.length) {\n graph.dispatchMessageDelta(prevStepId, {\n content: [{\n type: ContentTypes.TEXT,\n text: '',\n tool_call_ids: tool_calls.map((tc) => tc.id ?? ''),\n }],\n });\n graph.messageStepHasToolCalls.set(prevStepId, true);\n stepId = graph.dispatchRunStep(stepKey, {\n type: StepTypes.TOOL_CALLS,\n tool_calls,\n });\n }\n graph.dispatchRunStepDelta(stepId, {\n type: StepTypes.TOOL_CALLS,\n tool_calls: toolCallChunks,\n });\n };\n handleReasoning(chunk: Partial<AIMessageChunk>, graph: Graph): void {\n let reasoning_content = chunk.additional_kwargs?.[graph.reasoningKey] as string | undefined;\n if (Array.isArray(chunk.content) && (chunk.content[0]?.type === 'thinking' || chunk.content[0]?.type === 'reasoning_content')) {\n reasoning_content = 'valid';\n }\n if (reasoning_content != null && reasoning_content && (chunk.content == null || chunk.content === '' || reasoning_content === 'valid')) {\n graph.currentTokenType = ContentTypes.THINK;\n graph.tokenTypeSwitch = 'reasoning';\n return;\n } else if (graph.tokenTypeSwitch === 'reasoning' && graph.currentTokenType !== ContentTypes.TEXT && chunk.content != null && chunk.content !== '') {\n graph.currentTokenType = ContentTypes.TEXT;\n graph.tokenTypeSwitch = 'content';\n } else if (chunk.content != null && typeof chunk.content === 'string' && chunk.content.includes('<think>')) {\n graph.currentTokenType = ContentTypes.THINK;\n graph.tokenTypeSwitch = 'content';\n } else if (graph.lastToken != null && graph.lastToken.includes('</think>')) {\n graph.currentTokenType = ContentTypes.TEXT;\n graph.tokenTypeSwitch = 'content';\n }\n if (typeof chunk.content !== 'string') {\n return;\n }\n graph.lastToken = chunk.content;\n }\n}\n\nexport function createContentAggregator(): t.ContentAggregatorResult {\n const contentParts: Array<t.MessageContentComplex | undefined> = [];\n const stepMap = new Map<string, t.RunStep>();\n const toolCallIdMap = new Map<string, string>();\n\n const updateContent = (\n index: number,\n contentPart: t.MessageContentComplex,\n finalUpdate = false,\n ): void => {\n const partType = contentPart.type ?? '';\n if (!partType) {\n console.warn('No content type found in content part');\n return;\n }\n\n if (!contentParts[index]) {\n contentParts[index] = { type: partType };\n }\n\n if (!partType.startsWith(contentParts[index]?.type ?? '')) {\n console.warn('Content type mismatch');\n return;\n }\n\n if (\n partType.startsWith(ContentTypes.TEXT) &&\n ContentTypes.TEXT in contentPart &&\n typeof contentPart.text === 'string'\n ) {\n // TODO: update this!!\n const currentContent = contentParts[index] as t.MessageDeltaUpdate;\n const update: t.MessageDeltaUpdate = {\n type: ContentTypes.TEXT,\n text: (currentContent.text || '') + contentPart.text,\n };\n\n if (contentPart.tool_call_ids) {\n update.tool_call_ids = contentPart.tool_call_ids;\n }\n contentParts[index] = update;\n } else if (\n partType.startsWith(ContentTypes.THINK) &&\n ContentTypes.THINK in contentPart &&\n typeof contentPart.think === 'string'\n ) {\n const currentContent = contentParts[index] as t.ReasoningDeltaUpdate;\n const update: t.ReasoningDeltaUpdate = {\n type: ContentTypes.THINK,\n think: (currentContent.think || '') + contentPart.think,\n };\n contentParts[index] = update;\n } else if (partType === ContentTypes.IMAGE_URL && 'image_url' in contentPart) {\n const currentContent = contentParts[index] as { type: 'image_url'; image_url: string };\n contentParts[index] = {\n ...currentContent,\n };\n } else if (partType === ContentTypes.TOOL_CALL && 'tool_call' in contentPart) {\n const existingContent = contentParts[index] as Omit<t.ToolCallContent, 'tool_call'> & { tool_call?: ToolCall } | undefined;\n\n const args = finalUpdate\n ? contentPart.tool_call.args\n : (existingContent?.tool_call?.args || '') + (contentPart.tool_call.args ?? '');\n\n const id = getNonEmptyValue([contentPart.tool_call.id, existingContent?.tool_call?.id]) ?? '';\n const name =\n getNonEmptyValue([contentPart.tool_call.name, existingContent?.tool_call?.name]) ?? '';\n\n const newToolCall: ToolCall & t.PartMetadata = {\n id,\n name,\n args,\n type: ToolCallTypes.TOOL_CALL,\n };\n\n if (finalUpdate) {\n newToolCall.progress = 1;\n newToolCall.output = contentPart.tool_call.output;\n }\n\n contentParts[index] = {\n type: ContentTypes.TOOL_CALL,\n tool_call: newToolCall,\n };\n }\n };\n\n const aggregateContent = ({ event, data }: {\n event: GraphEvents;\n data: t.RunStep | t.MessageDeltaEvent | t.RunStepDeltaEvent | { result: t.ToolEndEvent };\n }): void => {\n\n if (event === GraphEvents.ON_RUN_STEP) {\n const runStep = data as t.RunStep;\n stepMap.set(runStep.id, runStep);\n\n // Store tool call IDs if present\n if (runStep.stepDetails.type === StepTypes.TOOL_CALLS && runStep.stepDetails.tool_calls) {\n runStep.stepDetails.tool_calls.forEach((toolCall) => {\n const toolCallId = toolCall.id ?? '';\n if ('id' in toolCall && toolCallId) {\n toolCallIdMap.set(runStep.id, toolCallId);\n }\n });\n }\n } else if (event === GraphEvents.ON_MESSAGE_DELTA) {\n const messageDelta = data as t.MessageDeltaEvent;\n const runStep = stepMap.get(messageDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for message delta event');\n return;\n }\n\n if (messageDelta.delta.content) {\n const contentPart = Array.isArray(messageDelta.delta.content)\n ? messageDelta.delta.content[0]\n : messageDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_REASONING_DELTA) {\n const reasoningDelta = data as t.ReasoningDeltaEvent;\n const runStep = stepMap.get(reasoningDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for reasoning delta event');\n return;\n }\n\n if (reasoningDelta.delta.content) {\n const contentPart = Array.isArray(reasoningDelta.delta.content)\n ? reasoningDelta.delta.content[0]\n : reasoningDelta.delta.content;\n\n updateContent(runStep.index, contentPart);\n }\n } else if (event === GraphEvents.ON_RUN_STEP_DELTA) {\n const runStepDelta = data as t.RunStepDeltaEvent;\n const runStep = stepMap.get(runStepDelta.id);\n if (!runStep) {\n console.warn('No run step or runId found for run step delta event');\n return;\n }\n\n if (\n runStepDelta.delta.type === StepTypes.TOOL_CALLS &&\n runStepDelta.delta.tool_calls\n ) {\n\n runStepDelta.delta.tool_calls.forEach((toolCallDelta) => {\n const toolCallId = toolCallIdMap.get(runStepDelta.id);\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: {\n args: toolCallDelta.args ?? '',\n name: toolCallDelta.name,\n id: toolCallId,\n },\n };\n\n updateContent(runStep.index, contentPart);\n });\n }\n } else if (event === GraphEvents.ON_RUN_STEP_COMPLETED) {\n const { result } = data as unknown as { result: t.ToolEndEvent };\n\n const { id: stepId } = result;\n\n const runStep = stepMap.get(stepId);\n if (!runStep) {\n console.warn('No run step or runId found for completed tool call event');\n return;\n }\n\n const contentPart: t.MessageContentComplex = {\n type: ContentTypes.TOOL_CALL,\n tool_call: result.tool_call,\n };\n\n updateContent(runStep.index, contentPart, true);\n }\n\n };\n\n return { contentParts, aggregateContent, stepMap };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -81,12 +81,15 @@ export declare enum StepTypes {
|
|
|
81
81
|
}
|
|
82
82
|
export declare enum ContentTypes {
|
|
83
83
|
TEXT = "text",
|
|
84
|
+
ERROR = "error",
|
|
84
85
|
THINK = "think",
|
|
85
|
-
THINKING = "thinking",
|
|
86
86
|
TOOL_CALL = "tool_call",
|
|
87
|
-
IMAGE_FILE = "image_file",
|
|
88
87
|
IMAGE_URL = "image_url",
|
|
89
|
-
|
|
88
|
+
IMAGE_FILE = "image_file",
|
|
89
|
+
/** Anthropic */
|
|
90
|
+
THINKING = "thinking",
|
|
91
|
+
/** Bedrock */
|
|
92
|
+
REASONING_CONTENT = "reasoning_content"
|
|
90
93
|
}
|
|
91
94
|
export declare enum ToolCallTypes {
|
|
92
95
|
FUNCTION = "function",
|
package/dist/types/messages.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { AIMessageChunk, HumanMessage, ToolMessage, AIMessage, BaseMessage } from '@langchain/core/messages';
|
|
2
2
|
import type * as t from '@/types';
|
|
3
|
+
import { Providers } from '@/common';
|
|
3
4
|
export declare function getConverseOverrideMessage({ userMessage, lastMessageX, lastMessageY }: {
|
|
4
5
|
userMessage: string[];
|
|
5
6
|
lastMessageX: AIMessageChunk | null;
|
|
6
7
|
lastMessageY: ToolMessage;
|
|
7
8
|
}): HumanMessage;
|
|
8
|
-
export declare function modifyDeltaProperties(obj?: AIMessageChunk): AIMessageChunk | undefined;
|
|
9
|
+
export declare function modifyDeltaProperties(provider: Providers, obj?: AIMessageChunk): AIMessageChunk | undefined;
|
|
9
10
|
export declare function formatAnthropicMessage(message: AIMessageChunk): AIMessage;
|
|
10
11
|
export declare function convertMessagesToContent(messages: BaseMessage[]): t.MessageContentComplex[];
|
|
11
12
|
export declare function formatAnthropicArtifactContent(messages: BaseMessage[]): void;
|
|
@@ -183,7 +183,16 @@ export type ThinkingContentText = {
|
|
|
183
183
|
type: ContentTypes.THINKING;
|
|
184
184
|
index?: number;
|
|
185
185
|
signature?: string;
|
|
186
|
-
thinking
|
|
186
|
+
thinking?: string;
|
|
187
|
+
};
|
|
188
|
+
/** Bedrock's Reasoning Content Block Format */
|
|
189
|
+
export type BedrockReasoningContentText = {
|
|
190
|
+
type: ContentTypes.REASONING_CONTENT;
|
|
191
|
+
index?: number;
|
|
192
|
+
reasoningText: {
|
|
193
|
+
text?: string;
|
|
194
|
+
signature?: string;
|
|
195
|
+
};
|
|
187
196
|
};
|
|
188
197
|
export type MessageContentComplex = (ThinkingContentText | ReasoningContentText | MessageContentText | MessageContentImageUrl | (Record<string, any> & {
|
|
189
198
|
type?: 'text' | 'image_url' | 'think' | 'thinking' | string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@librechat/agents",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.8",
|
|
4
4
|
"main": "./dist/cjs/main.cjs",
|
|
5
5
|
"module": "./dist/esm/main.mjs",
|
|
6
6
|
"types": "./dist/types/index.d.ts",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"@aws-sdk/credential-provider-node": "^3.613.0",
|
|
74
74
|
"@aws-sdk/types": "^3.609.0",
|
|
75
75
|
"@langchain/anthropic": "^0.3.14",
|
|
76
|
-
"@langchain/aws": "^0.1.
|
|
76
|
+
"@langchain/aws": "^0.1.6",
|
|
77
77
|
"@langchain/community": "^0.3.27",
|
|
78
78
|
"@langchain/core": "^0.3.40",
|
|
79
79
|
"@langchain/deepseek": "^0.0.1",
|
package/src/common/enum.ts
CHANGED
|
@@ -106,12 +106,15 @@ export enum StepTypes {
|
|
|
106
106
|
|
|
107
107
|
export enum ContentTypes {
|
|
108
108
|
TEXT = 'text',
|
|
109
|
+
ERROR = 'error',
|
|
109
110
|
THINK = 'think',
|
|
110
|
-
THINKING = 'thinking',
|
|
111
111
|
TOOL_CALL = 'tool_call',
|
|
112
|
-
IMAGE_FILE = 'image_file',
|
|
113
112
|
IMAGE_URL = 'image_url',
|
|
114
|
-
|
|
113
|
+
IMAGE_FILE = 'image_file',
|
|
114
|
+
/** Anthropic */
|
|
115
|
+
THINKING = 'thinking',
|
|
116
|
+
/** Bedrock */
|
|
117
|
+
REASONING_CONTENT = 'reasoning_content',
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
export enum ToolCallTypes {
|
package/src/graphs/Graph.ts
CHANGED
|
@@ -384,19 +384,7 @@ export class StandardGraph extends Graph<
|
|
|
384
384
|
}
|
|
385
385
|
}
|
|
386
386
|
|
|
387
|
-
finalChunk = modifyDeltaProperties(finalChunk);
|
|
388
|
-
if (this.provider === Providers.ANTHROPIC && Array.isArray(finalChunk?.content)) {
|
|
389
|
-
finalChunk.content = finalChunk.content.map((block) => {
|
|
390
|
-
if ((block as t.ThinkingContentText | undefined)?.['thinking'] && block.type !== ContentTypes.THINKING) {
|
|
391
|
-
return {
|
|
392
|
-
...block,
|
|
393
|
-
type: ContentTypes.THINKING,
|
|
394
|
-
thinking: (block as t.ThinkingContentText).thinking ?? '',
|
|
395
|
-
} as t.ThinkingContentText;
|
|
396
|
-
}
|
|
397
|
-
return block;
|
|
398
|
-
})
|
|
399
|
-
}
|
|
387
|
+
finalChunk = modifyDeltaProperties(this.provider, finalChunk);
|
|
400
388
|
return { messages: [finalChunk as AIMessageChunk] };
|
|
401
389
|
}
|
|
402
390
|
|
package/src/messages.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { AIMessageChunk, HumanMessage, ToolMessage, AIMessage, BaseMessage } from '@langchain/core/messages';
|
|
3
3
|
import type { ToolCall } from '@langchain/core/messages/tool';
|
|
4
4
|
import type * as t from '@/types';
|
|
5
|
+
import { Providers } from '@/common';
|
|
5
6
|
|
|
6
7
|
export function getConverseOverrideMessage({
|
|
7
8
|
userMessage,
|
|
@@ -31,14 +32,28 @@ User: ${userMessage[1]}
|
|
|
31
32
|
return new HumanMessage(content);
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
const
|
|
35
|
+
const _allowedTypes = ['image_url', 'text', 'tool_use', 'tool_result'];
|
|
36
|
+
const allowedTypesByProvider: Record<string, string[]> = {
|
|
37
|
+
default: _allowedTypes,
|
|
38
|
+
[Providers.ANTHROPIC]: [..._allowedTypes, 'thinking'],
|
|
39
|
+
[Providers.BEDROCK]: [..._allowedTypes, 'reasoning_content'],
|
|
40
|
+
[Providers.OPENAI]: _allowedTypes,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const modifyContent = ({
|
|
44
|
+
provider,
|
|
45
|
+
messageType,
|
|
46
|
+
content
|
|
47
|
+
}: {
|
|
48
|
+
provider: Providers, messageType: string, content: t.ExtendedMessageContent[]
|
|
49
|
+
}): t.ExtendedMessageContent[] => {
|
|
50
|
+
const allowedTypes = allowedTypesByProvider[provider] ?? allowedTypesByProvider.default;
|
|
35
51
|
return content.map(item => {
|
|
36
52
|
if (item && typeof item === 'object' && 'type' in item && item.type != null && item.type) {
|
|
37
53
|
let newType = item.type;
|
|
38
54
|
if (newType.endsWith('_delta')) {
|
|
39
55
|
newType = newType.replace('_delta', '');
|
|
40
56
|
}
|
|
41
|
-
const allowedTypes = ['image_url', 'text', 'tool_use', 'tool_result'];
|
|
42
57
|
if (!allowedTypes.includes(newType)) {
|
|
43
58
|
newType = 'text';
|
|
44
59
|
}
|
|
@@ -54,16 +69,52 @@ const modifyContent = (messageType: string, content: t.ExtendedMessageContent[])
|
|
|
54
69
|
});
|
|
55
70
|
};
|
|
56
71
|
|
|
57
|
-
|
|
72
|
+
type ContentBlock = t.BedrockReasoningContentText | t.MessageDeltaUpdate;
|
|
73
|
+
|
|
74
|
+
function reduceBlocks(blocks: ContentBlock[]): ContentBlock[] {
|
|
75
|
+
const reduced: ContentBlock[] = [];
|
|
76
|
+
|
|
77
|
+
for (const block of blocks) {
|
|
78
|
+
const lastBlock = reduced[reduced.length - 1];
|
|
79
|
+
|
|
80
|
+
// Merge consecutive 'reasoning_content'
|
|
81
|
+
if (block.type === 'reasoning_content' && lastBlock?.type === 'reasoning_content') {
|
|
82
|
+
// append text if exists
|
|
83
|
+
if (block.reasoningText?.text) {
|
|
84
|
+
lastBlock.reasoningText.text = (lastBlock.reasoningText.text || '') + block.reasoningText.text;
|
|
85
|
+
}
|
|
86
|
+
// preserve the signature if exists
|
|
87
|
+
if (block.reasoningText?.signature) {
|
|
88
|
+
lastBlock.reasoningText.signature = block.reasoningText.signature;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Merge consecutive 'text'
|
|
92
|
+
else if (block.type === 'text' && lastBlock?.type === 'text') {
|
|
93
|
+
lastBlock.text += block.text;
|
|
94
|
+
}
|
|
95
|
+
// add a new block as it's a different type or first element
|
|
96
|
+
else {
|
|
97
|
+
// deep copy to avoid mutation of original
|
|
98
|
+
reduced.push(JSON.parse(JSON.stringify(block)));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return reduced;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function modifyDeltaProperties(provider: Providers, obj?: AIMessageChunk): AIMessageChunk | undefined {
|
|
58
106
|
if (!obj || typeof obj !== 'object') return obj;
|
|
59
107
|
|
|
60
108
|
const messageType = obj._getType ? obj._getType() : '';
|
|
61
109
|
|
|
110
|
+
if (provider === Providers.BEDROCK && Array.isArray(obj.content)) {
|
|
111
|
+
obj.content = reduceBlocks(obj.content as ContentBlock[]);
|
|
112
|
+
}
|
|
62
113
|
if (Array.isArray(obj.content)) {
|
|
63
|
-
obj.content = modifyContent(messageType, obj.content);
|
|
114
|
+
obj.content = modifyContent({ provider, messageType, content: obj.content });
|
|
64
115
|
}
|
|
65
116
|
if (obj.lc_kwargs && Array.isArray(obj.lc_kwargs.content)) {
|
|
66
|
-
obj.lc_kwargs.content = modifyContent(messageType, obj.lc_kwargs.content);
|
|
117
|
+
obj.lc_kwargs.content = modifyContent({ provider, messageType, content: obj.lc_kwargs.content });
|
|
67
118
|
}
|
|
68
119
|
return obj;
|
|
69
120
|
}
|
package/src/stream.ts
CHANGED
|
@@ -210,11 +210,11 @@ hasToolCallChunks: ${hasToolCallChunks}
|
|
|
210
210
|
graph.dispatchMessageDelta(stepId, {
|
|
211
211
|
content,
|
|
212
212
|
});
|
|
213
|
-
} else if (content.every((c) => c.type?.startsWith(ContentTypes.THINKING))) {
|
|
213
|
+
} else if (content.every((c) => c.type?.startsWith(ContentTypes.THINKING) || c.type?.startsWith(ContentTypes.REASONING_CONTENT))) {
|
|
214
214
|
graph.dispatchReasoningDelta(stepId, {
|
|
215
215
|
content: content.map((c) => ({
|
|
216
216
|
type: ContentTypes.THINK,
|
|
217
|
-
think: (c as t.ThinkingContentText).thinking,
|
|
217
|
+
think: (c as t.ThinkingContentText).thinking ?? (c as t.BedrockReasoningContentText).reasoningText?.text ?? '',
|
|
218
218
|
}))});
|
|
219
219
|
}
|
|
220
220
|
}
|
|
@@ -292,7 +292,7 @@ hasToolCallChunks: ${hasToolCallChunks}
|
|
|
292
292
|
};
|
|
293
293
|
handleReasoning(chunk: Partial<AIMessageChunk>, graph: Graph): void {
|
|
294
294
|
let reasoning_content = chunk.additional_kwargs?.[graph.reasoningKey] as string | undefined;
|
|
295
|
-
if (Array.isArray(chunk.content) && chunk.content[0]?.type === 'thinking') {
|
|
295
|
+
if (Array.isArray(chunk.content) && (chunk.content[0]?.type === 'thinking' || chunk.content[0]?.type === 'reasoning_content')) {
|
|
296
296
|
reasoning_content = 'valid';
|
|
297
297
|
}
|
|
298
298
|
if (reasoning_content != null && reasoning_content && (chunk.content == null || chunk.content === '' || reasoning_content === 'valid')) {
|
package/src/types/stream.ts
CHANGED
|
@@ -221,7 +221,14 @@ export type ThinkingContentText = {
|
|
|
221
221
|
type: ContentTypes.THINKING;
|
|
222
222
|
index?: number;
|
|
223
223
|
signature?: string;
|
|
224
|
-
thinking
|
|
224
|
+
thinking?: string;
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
/** Bedrock's Reasoning Content Block Format */
|
|
228
|
+
export type BedrockReasoningContentText = {
|
|
229
|
+
type: ContentTypes.REASONING_CONTENT;
|
|
230
|
+
index?: number;
|
|
231
|
+
reasoningText: { text?: string; signature?: string; }
|
|
225
232
|
};
|
|
226
233
|
|
|
227
234
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|