From 1111101cff0f8e1f914b7a5d5101d8750461e47d Mon Sep 17 00:00:00 2001 From: Henry Heng Date: Fri, 3 Jan 2025 22:47:46 +0000 Subject: [PATCH] Bugfix/Anthropic messages in agentflow (#3801) fix anthropic messages in agentflow --- .../nodes/agents/ToolAgent/ToolAgent.ts | 9 ++------- .../nodes/sequentialagents/Agent/Agent.ts | 10 +++++++++- .../nodes/sequentialagents/LLMNode/LLMNode.ts | 6 +++++- packages/components/src/utils.ts | 15 +++++++++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts index 07c6ba3f..ddd71dbd 100644 --- a/packages/components/nodes/agents/ToolAgent/ToolAgent.ts +++ b/packages/components/nodes/agents/ToolAgent/ToolAgent.ts @@ -7,7 +7,7 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models' import { ChatPromptTemplate, MessagesPlaceholder, HumanMessagePromptTemplate, PromptTemplate } from '@langchain/core/prompts' import { formatToOpenAIToolMessages } from 'langchain/agents/format_scratchpad/openai_tools' import { type ToolsAgentStep } from 'langchain/agents/openai/output_parser' -import { getBaseClasses, handleEscapeCharacters, removeInvalidImageMarkdown } from '../../../src/utils' +import { extractOutputFromArray, getBaseClasses, handleEscapeCharacters, removeInvalidImageMarkdown } from '../../../src/utils' import { FlowiseMemory, ICommonObject, @@ -181,12 +181,7 @@ class ToolAgent_Agents implements INode { } let output = res?.output - if (Array.isArray(output)) { - output = output[0]?.text || '' - } else if (typeof output === 'object') { - output = output?.text || '' - } - + output = extractOutputFromArray(res?.output) output = removeInvalidImageMarkdown(output) // Claude 3 Opus tends to spit out .. as well, discard that in final output diff --git a/packages/components/nodes/sequentialagents/Agent/Agent.ts b/packages/components/nodes/sequentialagents/Agent/Agent.ts index 1e57824e..2235552b 100644 --- a/packages/components/nodes/sequentialagents/Agent/Agent.ts +++ b/packages/components/nodes/sequentialagents/Agent/Agent.ts @@ -23,7 +23,14 @@ import { ConversationHistorySelection } from '../../../src/Interface' import { ToolCallingAgentOutputParser, AgentExecutor, SOURCE_DOCUMENTS_PREFIX, ARTIFACTS_PREFIX } from '../../../src/agents' -import { getInputVariables, getVars, handleEscapeCharacters, prepareSandboxVars, removeInvalidImageMarkdown } from '../../../src/utils' +import { + extractOutputFromArray, + getInputVariables, + getVars, + handleEscapeCharacters, + prepareSandboxVars, + removeInvalidImageMarkdown +} from '../../../src/utils' import { customGet, getVM, @@ -827,6 +834,7 @@ async function agentNode( } let outputContent = typeof result === 'string' ? result : result.content || result.output + outputContent = extractOutputFromArray(outputContent) outputContent = removeInvalidImageMarkdown(outputContent) if (nodeData.inputs?.updateStateMemoryUI || nodeData.inputs?.updateStateMemoryCode) { diff --git a/packages/components/nodes/sequentialagents/LLMNode/LLMNode.ts b/packages/components/nodes/sequentialagents/LLMNode/LLMNode.ts index cfe17632..8b138022 100644 --- a/packages/components/nodes/sequentialagents/LLMNode/LLMNode.ts +++ b/packages/components/nodes/sequentialagents/LLMNode/LLMNode.ts @@ -18,7 +18,7 @@ import { ConversationHistorySelection } from '../../../src/Interface' import { AgentExecutor } from '../../../src/agents' -import { getInputVariables, getVars, handleEscapeCharacters, prepareSandboxVars } from '../../../src/utils' +import { extractOutputFromArray, getInputVariables, getVars, handleEscapeCharacters, prepareSandboxVars } from '../../../src/utils' import { ExtractTool, convertStructuredSchemaToZod, @@ -607,6 +607,8 @@ async function agentNode( } else { result.name = name result.additional_kwargs = { ...result.additional_kwargs, nodeId: nodeData.id } + let outputContent = typeof result === 'string' ? result : result.content + result.content = extractOutputFromArray(outputContent) return { ...returnedOutput, messages: [result] @@ -627,6 +629,8 @@ async function agentNode( } else { result.name = name result.additional_kwargs = { ...result.additional_kwargs, nodeId: nodeData.id } + let outputContent = typeof result === 'string' ? result : result.content + result.content = extractOutputFromArray(outputContent) return { messages: [result] } diff --git a/packages/components/src/utils.ts b/packages/components/src/utils.ts index 97d9dcfb..028b5698 100644 --- a/packages/components/src/utils.ts +++ b/packages/components/src/utils.ts @@ -1001,6 +1001,21 @@ export const removeInvalidImageMarkdown = (output: string): string => { return typeof output === 'string' ? output.replace(/!\[.*?\]\((?!https?:\/\/).*?\)/g, '') : output } +/** + * Extract output from array + * @param {any} output + * @returns {string} + */ +export const extractOutputFromArray = (output: any): string => { + if (Array.isArray(output)) { + return output.map((o) => o.text).join('\n') + } else if (typeof output === 'object') { + if (output.text) return output.text + else return JSON.stringify(output) + } + return output +} + /** * Loop through the object and replace the key with the value * @param {any} obj