diff --git a/packages/server/src/utils/index.ts b/packages/server/src/utils/index.ts index 2903d426..d4639978 100644 --- a/packages/server/src/utils/index.ts +++ b/packages/server/src/utils/index.ts @@ -528,11 +528,40 @@ export const getVariableValue = ( variableDict[`{{${variableFullPath}}}`] = handleEscapeCharacters(convertChatHistoryToText(chatHistory), false) } - // Split by first occurrence of '.' to get just nodeId - const [variableNodeId, _] = variableFullPath.split('.') + // Resolve values with following case. + // 1: .data.instance + // 2: .data.instance.pathtokey + const variableFullPathParts = variableFullPath.split('.') + const variableNodeId = variableFullPathParts[0] const executedNode = reactFlowNodes.find((nd) => nd.id === variableNodeId) if (executedNode) { - const variableValue = get(executedNode.data, 'instance') + let variableValue = get(executedNode.data, 'instance') + + // Handle path such as `.data.instance.key` + if (variableFullPathParts.length > 3) { + let variableObj = null + switch (typeof variableValue) { + case 'string': + const unEscapedVariableValue = handleEscapeCharacters(variableValue, true) + if (unEscapedVariableValue.startsWith('{') && unEscapedVariableValue.endsWith('}')) { + try { + variableObj = JSON.parse(unEscapedVariableValue) + } catch (e) { + // ignore + } + } + break + case 'object': + variableObj = variableValue + break + default: + break + } + if (variableObj) { + variableObj = get(variableObj, variableFullPathParts.slice(3)) + variableValue = handleEscapeCharacters(JSON.stringify(variableObj), false) + } + } if (isAcceptVariable) { variableDict[`{{${variableFullPath}}}`] = variableValue } else {