mirror of
https://github.com/farcasclaudiu/Flowise.git
synced 2026-06-28 21:00:58 +03:00
Merge pull request #1350 from FlowiseAI/bugfix/Upsert-API-doesnt-reload-vector-store
Bugfix/Upsert Vector API
This commit is contained in:
@@ -16,7 +16,7 @@ export class ChatflowPool {
|
|||||||
* @param {IReactFlowNode[]} startingNodes
|
* @param {IReactFlowNode[]} startingNodes
|
||||||
* @param {ICommonObject} overrideConfig
|
* @param {ICommonObject} overrideConfig
|
||||||
*/
|
*/
|
||||||
add(chatflowid: string, endingNodeData: INodeData, startingNodes: IReactFlowNode[], overrideConfig?: ICommonObject) {
|
add(chatflowid: string, endingNodeData: INodeData | undefined, startingNodes: IReactFlowNode[], overrideConfig?: ICommonObject) {
|
||||||
this.activeChatflows[chatflowid] = {
|
this.activeChatflows[chatflowid] = {
|
||||||
startingNodes,
|
startingNodes,
|
||||||
endingNodeData,
|
endingNodeData,
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ export interface IncomingInput {
|
|||||||
export interface IActiveChatflows {
|
export interface IActiveChatflows {
|
||||||
[key: string]: {
|
[key: string]: {
|
||||||
startingNodes: IReactFlowNode[]
|
startingNodes: IReactFlowNode[]
|
||||||
endingNodeData: INodeData
|
endingNodeData?: INodeData
|
||||||
inSync: boolean
|
inSync: boolean
|
||||||
overrideConfig?: ICommonObject
|
overrideConfig?: ICommonObject
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1394,16 +1394,19 @@ export class App {
|
|||||||
const nodes = parsedFlowData.nodes
|
const nodes = parsedFlowData.nodes
|
||||||
const edges = parsedFlowData.edges
|
const edges = parsedFlowData.edges
|
||||||
|
|
||||||
/* Reuse the flow without having to rebuild (to avoid duplicated upsert, recomputation) when all these conditions met:
|
/* Reuse the flow without having to rebuild (to avoid duplicated upsert, recomputation, reinitialization of memory) when all these conditions met:
|
||||||
* - Node Data already exists in pool
|
* - Node Data already exists in pool
|
||||||
* - Still in sync (i.e the flow has not been modified since)
|
* - Still in sync (i.e the flow has not been modified since)
|
||||||
* - Existing overrideConfig and new overrideConfig are the same
|
* - Existing overrideConfig and new overrideConfig are the same
|
||||||
* - Flow doesn't start with/contain nodes that depend on incomingInput.question
|
* - Flow doesn't start with/contain nodes that depend on incomingInput.question
|
||||||
|
* - Its not an Upsert request
|
||||||
|
* TODO: convert overrideConfig to hash when we no longer store base64 string but filepath
|
||||||
***/
|
***/
|
||||||
const isFlowReusable = () => {
|
const isFlowReusable = () => {
|
||||||
return (
|
return (
|
||||||
Object.prototype.hasOwnProperty.call(this.chatflowPool.activeChatflows, chatflowid) &&
|
Object.prototype.hasOwnProperty.call(this.chatflowPool.activeChatflows, chatflowid) &&
|
||||||
this.chatflowPool.activeChatflows[chatflowid].inSync &&
|
this.chatflowPool.activeChatflows[chatflowid].inSync &&
|
||||||
|
this.chatflowPool.activeChatflows[chatflowid].endingNodeData &&
|
||||||
isSameOverrideConfig(
|
isSameOverrideConfig(
|
||||||
isInternal,
|
isInternal,
|
||||||
this.chatflowPool.activeChatflows[chatflowid].overrideConfig,
|
this.chatflowPool.activeChatflows[chatflowid].overrideConfig,
|
||||||
@@ -1415,7 +1418,7 @@ export class App {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isFlowReusable()) {
|
if (isFlowReusable()) {
|
||||||
nodeToExecuteData = this.chatflowPool.activeChatflows[chatflowid].endingNodeData
|
nodeToExecuteData = this.chatflowPool.activeChatflows[chatflowid].endingNodeData as INodeData
|
||||||
isStreamValid = isFlowValidForStream(nodes, nodeToExecuteData)
|
isStreamValid = isFlowValidForStream(nodes, nodeToExecuteData)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
`[server]: Reuse existing chatflow ${chatflowid} with ending node ${nodeToExecuteData.label} (${nodeToExecuteData.id})`
|
`[server]: Reuse existing chatflow ${chatflowid} with ending node ${nodeToExecuteData.label} (${nodeToExecuteData.id})`
|
||||||
@@ -1466,6 +1469,7 @@ export class App {
|
|||||||
const constructedObj = constructGraphs(nodes, edges, true)
|
const constructedObj = constructGraphs(nodes, edges, true)
|
||||||
const nonDirectedGraph = constructedObj.graph
|
const nonDirectedGraph = constructedObj.graph
|
||||||
const { startingNodeIds, depthQueue } = getStartingNodes(nonDirectedGraph, endingNodeId)
|
const { startingNodeIds, depthQueue } = getStartingNodes(nonDirectedGraph, endingNodeId)
|
||||||
|
const startingNodes = nodes.filter((nd) => startingNodeIds.includes(nd.id))
|
||||||
|
|
||||||
logger.debug(`[server]: Start building chatflow ${chatflowid}`)
|
logger.debug(`[server]: Start building chatflow ${chatflowid}`)
|
||||||
/*** BFS to traverse from Starting Nodes to Ending Node ***/
|
/*** BFS to traverse from Starting Nodes to Ending Node ***/
|
||||||
@@ -1485,13 +1489,18 @@ export class App {
|
|||||||
isUpsert,
|
isUpsert,
|
||||||
incomingInput.stopNodeId
|
incomingInput.stopNodeId
|
||||||
)
|
)
|
||||||
if (isUpsert) return res.status(201).send('Successfully Upserted')
|
if (isUpsert) {
|
||||||
|
this.chatflowPool.add(chatflowid, undefined, startingNodes, incomingInput?.overrideConfig)
|
||||||
|
return res.status(201).send('Successfully Upserted')
|
||||||
|
}
|
||||||
|
|
||||||
const nodeToExecute = reactFlowNodes.find((node: IReactFlowNode) => node.id === endingNodeId)
|
const nodeToExecute = reactFlowNodes.find((node: IReactFlowNode) => node.id === endingNodeId)
|
||||||
if (!nodeToExecute) return res.status(404).send(`Node ${endingNodeId} not found`)
|
if (!nodeToExecute) return res.status(404).send(`Node ${endingNodeId} not found`)
|
||||||
|
|
||||||
if (incomingInput.overrideConfig)
|
if (incomingInput.overrideConfig) {
|
||||||
nodeToExecute.data = replaceInputsWithConfig(nodeToExecute.data, incomingInput.overrideConfig)
|
nodeToExecute.data = replaceInputsWithConfig(nodeToExecute.data, incomingInput.overrideConfig)
|
||||||
|
}
|
||||||
|
|
||||||
const reactFlowNodeData: INodeData = resolveVariables(
|
const reactFlowNodeData: INodeData = resolveVariables(
|
||||||
nodeToExecute.data,
|
nodeToExecute.data,
|
||||||
reactFlowNodes,
|
reactFlowNodes,
|
||||||
@@ -1500,7 +1509,6 @@ export class App {
|
|||||||
)
|
)
|
||||||
nodeToExecuteData = reactFlowNodeData
|
nodeToExecuteData = reactFlowNodeData
|
||||||
|
|
||||||
const startingNodes = nodes.filter((nd) => startingNodeIds.includes(nd.id))
|
|
||||||
this.chatflowPool.add(chatflowid, nodeToExecuteData, startingNodes, incomingInput?.overrideConfig)
|
this.chatflowPool.add(chatflowid, nodeToExecuteData, startingNodes, incomingInput?.overrideConfig)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user