mirror of
https://github.com/farcasclaudiu/Flowise.git
synced 2026-06-28 23:01:09 +03:00
Merge branch 'main' into FEATURE/Vision
# Conflicts: # packages/server/src/index.ts
This commit is contained in:
@@ -8,7 +8,7 @@ class RedisCacheApi implements INodeCredential {
|
|||||||
inputs: INodeParams[]
|
inputs: INodeParams[]
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.label = 'Redis Cache API'
|
this.label = 'Redis API'
|
||||||
this.name = 'redisCacheApi'
|
this.name = 'redisCacheApi'
|
||||||
this.version = 1.0
|
this.version = 1.0
|
||||||
this.inputs = [
|
this.inputs = [
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class RedisCacheUrlApi implements INodeCredential {
|
|||||||
inputs: INodeParams[]
|
inputs: INodeParams[]
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.label = 'Redis Cache URL'
|
this.label = 'Redis URL'
|
||||||
this.name = 'redisCacheUrlApi'
|
this.name = 'redisCacheUrlApi'
|
||||||
this.version = 1.0
|
this.version = 1.0
|
||||||
this.inputs = [
|
this.inputs = [
|
||||||
@@ -16,7 +16,7 @@ class RedisCacheUrlApi implements INodeCredential {
|
|||||||
label: 'Redis URL',
|
label: 'Redis URL',
|
||||||
name: 'redisUrl',
|
name: 'redisUrl',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
default: '127.0.0.1'
|
default: 'redis://localhost:6379'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { initializeAgentExecutorWithOptions, AgentExecutor, InitializeAgentExecu
|
|||||||
import { Tool } from 'langchain/tools'
|
import { Tool } from 'langchain/tools'
|
||||||
import { BaseChatMemory } from 'langchain/memory'
|
import { BaseChatMemory } from 'langchain/memory'
|
||||||
import { getBaseClasses, mapChatHistory } from '../../../src/utils'
|
import { getBaseClasses, mapChatHistory } from '../../../src/utils'
|
||||||
import { BaseLanguageModel } from 'langchain/base_language'
|
import { BaseChatModel } from 'langchain/chat_models/base'
|
||||||
import { flatten } from 'lodash'
|
import { flatten } from 'lodash'
|
||||||
import { additionalCallbacks } from '../../../src/handler'
|
import { additionalCallbacks } from '../../../src/handler'
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ class ConversationalAgent_Agents implements INode {
|
|||||||
constructor() {
|
constructor() {
|
||||||
this.label = 'Conversational Agent'
|
this.label = 'Conversational Agent'
|
||||||
this.name = 'conversationalAgent'
|
this.name = 'conversationalAgent'
|
||||||
this.version = 1.0
|
this.version = 2.0
|
||||||
this.type = 'AgentExecutor'
|
this.type = 'AgentExecutor'
|
||||||
this.category = 'Agents'
|
this.category = 'Agents'
|
||||||
this.icon = 'agent.svg'
|
this.icon = 'agent.svg'
|
||||||
@@ -45,7 +45,7 @@ class ConversationalAgent_Agents implements INode {
|
|||||||
{
|
{
|
||||||
label: 'Language Model',
|
label: 'Language Model',
|
||||||
name: 'model',
|
name: 'model',
|
||||||
type: 'BaseLanguageModel'
|
type: 'BaseChatModel'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Memory',
|
label: 'Memory',
|
||||||
@@ -65,7 +65,7 @@ class ConversationalAgent_Agents implements INode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async init(nodeData: INodeData): Promise<any> {
|
async init(nodeData: INodeData): Promise<any> {
|
||||||
const model = nodeData.inputs?.model as BaseLanguageModel
|
const model = nodeData.inputs?.model as BaseChatModel
|
||||||
let tools = nodeData.inputs?.tools as Tool[]
|
let tools = nodeData.inputs?.tools as Tool[]
|
||||||
tools = flatten(tools)
|
tools = flatten(tools)
|
||||||
const memory = nodeData.inputs?.memory as BaseChatMemory
|
const memory = nodeData.inputs?.memory as BaseChatMemory
|
||||||
@@ -92,8 +92,6 @@ class ConversationalAgent_Agents implements INode {
|
|||||||
const executor = nodeData.instance as AgentExecutor
|
const executor = nodeData.instance as AgentExecutor
|
||||||
const memory = nodeData.inputs?.memory as BaseChatMemory
|
const memory = nodeData.inputs?.memory as BaseChatMemory
|
||||||
|
|
||||||
const callbacks = await additionalCallbacks(nodeData, options)
|
|
||||||
|
|
||||||
if (options && options.chatHistory) {
|
if (options && options.chatHistory) {
|
||||||
const chatHistoryClassName = memory.chatHistory.constructor.name
|
const chatHistoryClassName = memory.chatHistory.constructor.name
|
||||||
// Only replace when its In-Memory
|
// Only replace when its In-Memory
|
||||||
@@ -103,6 +101,10 @@ class ConversationalAgent_Agents implements INode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
;(executor.memory as any).returnMessages = true // Return true for BaseChatModel
|
||||||
|
|
||||||
|
const callbacks = await additionalCallbacks(nodeData, options)
|
||||||
|
|
||||||
const result = await executor.call({ input }, [...callbacks])
|
const result = await executor.call({ input }, [...callbacks])
|
||||||
return result?.output
|
return result?.output
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-2
@@ -21,7 +21,7 @@ class ConversationalRetrievalAgent_Agents implements INode {
|
|||||||
constructor() {
|
constructor() {
|
||||||
this.label = 'Conversational Retrieval Agent'
|
this.label = 'Conversational Retrieval Agent'
|
||||||
this.name = 'conversationalRetrievalAgent'
|
this.name = 'conversationalRetrievalAgent'
|
||||||
this.version = 2.0
|
this.version = 3.0
|
||||||
this.type = 'AgentExecutor'
|
this.type = 'AgentExecutor'
|
||||||
this.category = 'Agents'
|
this.category = 'Agents'
|
||||||
this.icon = 'agent.svg'
|
this.icon = 'agent.svg'
|
||||||
@@ -42,7 +42,7 @@ class ConversationalRetrievalAgent_Agents implements INode {
|
|||||||
{
|
{
|
||||||
label: 'OpenAI/Azure Chat Model',
|
label: 'OpenAI/Azure Chat Model',
|
||||||
name: 'model',
|
name: 'model',
|
||||||
type: 'ChatOpenAI | AzureChatOpenAI'
|
type: 'BaseChatModel'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'System Message',
|
label: 'System Message',
|
||||||
@@ -82,6 +82,8 @@ class ConversationalRetrievalAgent_Agents implements INode {
|
|||||||
if (executor.memory) {
|
if (executor.memory) {
|
||||||
;(executor.memory as any).memoryKey = 'chat_history'
|
;(executor.memory as any).memoryKey = 'chat_history'
|
||||||
;(executor.memory as any).outputKey = 'output'
|
;(executor.memory as any).outputKey = 'output'
|
||||||
|
;(executor.memory as any).returnMessages = true
|
||||||
|
|
||||||
const chatHistoryClassName = (executor.memory as any).chatHistory.constructor.name
|
const chatHistoryClassName = (executor.memory as any).chatHistory.constructor.name
|
||||||
// Only replace when its In-Memory
|
// Only replace when its In-Memory
|
||||||
if (chatHistoryClassName && chatHistoryClassName === 'ChatMessageHistory') {
|
if (chatHistoryClassName && chatHistoryClassName === 'ChatMessageHistory') {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class OpenAIAssistant_Agents implements INode {
|
|||||||
constructor() {
|
constructor() {
|
||||||
this.label = 'OpenAI Assistant'
|
this.label = 'OpenAI Assistant'
|
||||||
this.name = 'openAIAssistant'
|
this.name = 'openAIAssistant'
|
||||||
this.version = 1.0
|
this.version = 2.0
|
||||||
this.type = 'OpenAIAssistant'
|
this.type = 'OpenAIAssistant'
|
||||||
this.category = 'Agents'
|
this.category = 'Agents'
|
||||||
this.icon = 'openai.png'
|
this.icon = 'openai.png'
|
||||||
@@ -41,6 +41,15 @@ class OpenAIAssistant_Agents implements INode {
|
|||||||
name: 'tools',
|
name: 'tools',
|
||||||
type: 'Tool',
|
type: 'Tool',
|
||||||
list: true
|
list: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Disable File Download',
|
||||||
|
name: 'disableFileDownload',
|
||||||
|
type: 'boolean',
|
||||||
|
description:
|
||||||
|
'Messages can contain text, images, or files. In some cases, you may want to prevent others from downloading the files. Learn more from OpenAI File Annotation <a target="_blank" href="https://platform.openai.com/docs/assistants/how-it-works/managing-threads-and-messages">docs</a>',
|
||||||
|
optional: true,
|
||||||
|
additionalParams: true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -76,49 +85,54 @@ class OpenAIAssistant_Agents implements INode {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
//@ts-ignore
|
||||||
const selectedAssistantId = nodeData.inputs?.selectedAssistant as string
|
memoryMethods = {
|
||||||
const appDataSource = options.appDataSource as DataSource
|
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
||||||
const databaseEntities = options.databaseEntities as IDatabaseEntity
|
const selectedAssistantId = nodeData.inputs?.selectedAssistant as string
|
||||||
let sessionId = nodeData.inputs?.sessionId as string
|
const appDataSource = options.appDataSource as DataSource
|
||||||
|
const databaseEntities = options.databaseEntities as IDatabaseEntity
|
||||||
|
let sessionId = nodeData.inputs?.sessionId as string
|
||||||
|
|
||||||
const assistant = await appDataSource.getRepository(databaseEntities['Assistant']).findOneBy({
|
const assistant = await appDataSource.getRepository(databaseEntities['Assistant']).findOneBy({
|
||||||
id: selectedAssistantId
|
id: selectedAssistantId
|
||||||
})
|
|
||||||
|
|
||||||
if (!assistant) {
|
|
||||||
options.logger.error(`Assistant ${selectedAssistantId} not found`)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sessionId && options.chatId) {
|
|
||||||
const chatmsg = await appDataSource.getRepository(databaseEntities['ChatMessage']).findOneBy({
|
|
||||||
chatId: options.chatId
|
|
||||||
})
|
})
|
||||||
if (!chatmsg) {
|
|
||||||
options.logger.error(`Chat Message with Chat Id: ${options.chatId} not found`)
|
if (!assistant) {
|
||||||
|
options.logger.error(`Assistant ${selectedAssistantId} not found`)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
sessionId = chatmsg.sessionId
|
|
||||||
}
|
|
||||||
|
|
||||||
const credentialData = await getCredentialData(assistant.credential ?? '', options)
|
if (!sessionId && options.chatId) {
|
||||||
const openAIApiKey = getCredentialParam('openAIApiKey', credentialData, nodeData)
|
const chatmsg = await appDataSource.getRepository(databaseEntities['ChatMessage']).findOneBy({
|
||||||
if (!openAIApiKey) {
|
chatId: options.chatId
|
||||||
options.logger.error(`OpenAI ApiKey not found`)
|
})
|
||||||
return
|
if (!chatmsg) {
|
||||||
}
|
options.logger.error(`Chat Message with Chat Id: ${options.chatId} not found`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sessionId = chatmsg.sessionId
|
||||||
|
}
|
||||||
|
|
||||||
const openai = new OpenAI({ apiKey: openAIApiKey })
|
const credentialData = await getCredentialData(assistant.credential ?? '', options)
|
||||||
options.logger.info(`Clearing OpenAI Thread ${sessionId}`)
|
const openAIApiKey = getCredentialParam('openAIApiKey', credentialData, nodeData)
|
||||||
if (sessionId) await openai.beta.threads.del(sessionId)
|
if (!openAIApiKey) {
|
||||||
options.logger.info(`Successfully cleared OpenAI Thread ${sessionId}`)
|
options.logger.error(`OpenAI ApiKey not found`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const openai = new OpenAI({ apiKey: openAIApiKey })
|
||||||
|
options.logger.info(`Clearing OpenAI Thread ${sessionId}`)
|
||||||
|
if (sessionId) await openai.beta.threads.del(sessionId)
|
||||||
|
options.logger.info(`Successfully cleared OpenAI Thread ${sessionId}`)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async run(nodeData: INodeData, input: string, options: ICommonObject): Promise<string | object> {
|
async run(nodeData: INodeData, input: string, options: ICommonObject): Promise<string | object> {
|
||||||
const selectedAssistantId = nodeData.inputs?.selectedAssistant as string
|
const selectedAssistantId = nodeData.inputs?.selectedAssistant as string
|
||||||
const appDataSource = options.appDataSource as DataSource
|
const appDataSource = options.appDataSource as DataSource
|
||||||
const databaseEntities = options.databaseEntities as IDatabaseEntity
|
const databaseEntities = options.databaseEntities as IDatabaseEntity
|
||||||
|
const disableFileDownload = nodeData.inputs?.disableFileDownload as boolean
|
||||||
|
|
||||||
let tools = nodeData.inputs?.tools
|
let tools = nodeData.inputs?.tools
|
||||||
tools = flatten(tools)
|
tools = flatten(tools)
|
||||||
const formattedTools = tools?.map((tool: any) => formatToOpenAIAssistantTool(tool)) ?? []
|
const formattedTools = tools?.map((tool: any) => formatToOpenAIAssistantTool(tool)) ?? []
|
||||||
@@ -310,7 +324,7 @@ class OpenAIAssistant_Agents implements INode {
|
|||||||
|
|
||||||
const dirPath = path.join(getUserHome(), '.flowise', 'openai-assistant')
|
const dirPath = path.join(getUserHome(), '.flowise', 'openai-assistant')
|
||||||
|
|
||||||
// Iterate over the annotations and add footnotes
|
// Iterate over the annotations
|
||||||
for (let index = 0; index < annotations.length; index++) {
|
for (let index = 0; index < annotations.length; index++) {
|
||||||
const annotation = annotations[index]
|
const annotation = annotations[index]
|
||||||
let filePath = ''
|
let filePath = ''
|
||||||
@@ -323,11 +337,13 @@ class OpenAIAssistant_Agents implements INode {
|
|||||||
// eslint-disable-next-line no-useless-escape
|
// eslint-disable-next-line no-useless-escape
|
||||||
const fileName = cited_file.filename.split(/[\/\\]/).pop() ?? cited_file.filename
|
const fileName = cited_file.filename.split(/[\/\\]/).pop() ?? cited_file.filename
|
||||||
filePath = path.join(getUserHome(), '.flowise', 'openai-assistant', fileName)
|
filePath = path.join(getUserHome(), '.flowise', 'openai-assistant', fileName)
|
||||||
await downloadFile(cited_file, filePath, dirPath, openAIApiKey)
|
if (!disableFileDownload) {
|
||||||
fileAnnotations.push({
|
await downloadFile(cited_file, filePath, dirPath, openAIApiKey)
|
||||||
filePath,
|
fileAnnotations.push({
|
||||||
fileName
|
filePath,
|
||||||
})
|
fileName
|
||||||
|
})
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const file_path = (annotation as OpenAI.Beta.Threads.Messages.MessageContentText.Text.FilePath).file_path
|
const file_path = (annotation as OpenAI.Beta.Threads.Messages.MessageContentText.Text.FilePath).file_path
|
||||||
if (file_path) {
|
if (file_path) {
|
||||||
@@ -335,22 +351,30 @@ class OpenAIAssistant_Agents implements INode {
|
|||||||
// eslint-disable-next-line no-useless-escape
|
// eslint-disable-next-line no-useless-escape
|
||||||
const fileName = cited_file.filename.split(/[\/\\]/).pop() ?? cited_file.filename
|
const fileName = cited_file.filename.split(/[\/\\]/).pop() ?? cited_file.filename
|
||||||
filePath = path.join(getUserHome(), '.flowise', 'openai-assistant', fileName)
|
filePath = path.join(getUserHome(), '.flowise', 'openai-assistant', fileName)
|
||||||
await downloadFile(cited_file, filePath, dirPath, openAIApiKey)
|
if (!disableFileDownload) {
|
||||||
fileAnnotations.push({
|
await downloadFile(cited_file, filePath, dirPath, openAIApiKey)
|
||||||
filePath,
|
fileAnnotations.push({
|
||||||
fileName
|
filePath,
|
||||||
})
|
fileName
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replace the text with a footnote
|
// Replace the text with a footnote
|
||||||
message_content.value = message_content.value.replace(`${annotation.text}`, `${filePath}`)
|
message_content.value = message_content.value.replace(
|
||||||
|
`${annotation.text}`,
|
||||||
|
`${disableFileDownload ? '' : filePath}`
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
returnVal += message_content.value
|
returnVal += message_content.value
|
||||||
} else {
|
} else {
|
||||||
returnVal += content.text.value
|
returnVal += content.text.value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const lenticularBracketRegex = /【[^】]*】/g
|
||||||
|
returnVal = returnVal.replace(lenticularBracketRegex, '')
|
||||||
} else {
|
} else {
|
||||||
const content = assistantMessages[0].content[i] as MessageContentImageFile
|
const content = assistantMessages[0].content[i] as MessageContentImageFile
|
||||||
const fileId = content.image_file.file_id
|
const fileId = content.image_file.file_id
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class OpenAIFunctionAgent_Agents implements INode {
|
|||||||
constructor() {
|
constructor() {
|
||||||
this.label = 'OpenAI Function Agent'
|
this.label = 'OpenAI Function Agent'
|
||||||
this.name = 'openAIFunctionAgent'
|
this.name = 'openAIFunctionAgent'
|
||||||
this.version = 2.0
|
this.version = 3.0
|
||||||
this.type = 'AgentExecutor'
|
this.type = 'AgentExecutor'
|
||||||
this.category = 'Agents'
|
this.category = 'Agents'
|
||||||
this.icon = 'openai.png'
|
this.icon = 'openai.png'
|
||||||
@@ -41,7 +41,7 @@ class OpenAIFunctionAgent_Agents implements INode {
|
|||||||
{
|
{
|
||||||
label: 'OpenAI/Azure Chat Model',
|
label: 'OpenAI/Azure Chat Model',
|
||||||
name: 'model',
|
name: 'model',
|
||||||
type: 'ChatOpenAI | AzureChatOpenAI'
|
type: 'BaseChatModel'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'System Message',
|
label: 'System Message',
|
||||||
@@ -87,6 +87,8 @@ class OpenAIFunctionAgent_Agents implements INode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
;(executor.memory as any).returnMessages = true // Return true for BaseChatModel
|
||||||
|
|
||||||
const loggerHandler = new ConsoleCallbackHandler(options.logger)
|
const loggerHandler = new ConsoleCallbackHandler(options.logger)
|
||||||
const callbacks = await additionalCallbacks(nodeData, options)
|
const callbacks = await additionalCallbacks(nodeData, options)
|
||||||
|
|
||||||
|
|||||||
@@ -106,16 +106,18 @@ class ConversationChain_Chains implements INode {
|
|||||||
async run(nodeData: INodeData, input: string, options: ICommonObject): Promise<string> {
|
async run(nodeData: INodeData, input: string, options: ICommonObject): Promise<string> {
|
||||||
const chain = nodeData.instance as ConversationChain
|
const chain = nodeData.instance as ConversationChain
|
||||||
const memory = nodeData.inputs?.memory as BufferMemory
|
const memory = nodeData.inputs?.memory as BufferMemory
|
||||||
|
memory.returnMessages = true // Return true for BaseChatModel
|
||||||
|
|
||||||
if (options && options.chatHistory) {
|
if (options && options.chatHistory) {
|
||||||
const chatHistoryClassName = memory.chatHistory.constructor.name
|
const chatHistoryClassName = memory.chatHistory.constructor.name
|
||||||
// Only replace when its In-Memory
|
// Only replace when its In-Memory
|
||||||
if (chatHistoryClassName && chatHistoryClassName === 'ChatMessageHistory') {
|
if (chatHistoryClassName && chatHistoryClassName === 'ChatMessageHistory') {
|
||||||
memory.chatHistory = mapChatHistory(options)
|
memory.chatHistory = mapChatHistory(options)
|
||||||
chain.memory = memory
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chain.memory = memory
|
||||||
|
|
||||||
const loggerHandler = new ConsoleCallbackHandler(options.logger)
|
const loggerHandler = new ConsoleCallbackHandler(options.logger)
|
||||||
const callbacks = await additionalCallbacks(nodeData, options)
|
const callbacks = await additionalCallbacks(nodeData, options)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
import { ICommonObject, INode, INodeData, INodeParams, getBaseClasses, getCredentialData, getCredentialParam } from '../../../src'
|
import {
|
||||||
|
ICommonObject,
|
||||||
|
INode,
|
||||||
|
INodeData,
|
||||||
|
INodeParams,
|
||||||
|
getBaseClasses,
|
||||||
|
getCredentialData,
|
||||||
|
getCredentialParam,
|
||||||
|
serializeChatHistory
|
||||||
|
} from '../../../src'
|
||||||
import { DynamoDBChatMessageHistory } from 'langchain/stores/message/dynamodb'
|
import { DynamoDBChatMessageHistory } from 'langchain/stores/message/dynamodb'
|
||||||
import { BufferMemory, BufferMemoryInput } from 'langchain/memory'
|
import { BufferMemory, BufferMemoryInput } from 'langchain/memory'
|
||||||
|
|
||||||
@@ -70,13 +79,23 @@ class DynamoDb_Memory implements INode {
|
|||||||
return initalizeDynamoDB(nodeData, options)
|
return initalizeDynamoDB(nodeData, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
//@ts-ignore
|
||||||
const dynamodbMemory = await initalizeDynamoDB(nodeData, options)
|
memoryMethods = {
|
||||||
const sessionId = nodeData.inputs?.sessionId as string
|
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
||||||
const chatId = options?.chatId as string
|
const dynamodbMemory = await initalizeDynamoDB(nodeData, options)
|
||||||
options.logger.info(`Clearing DynamoDb memory session ${sessionId ? sessionId : chatId}`)
|
const sessionId = nodeData.inputs?.sessionId as string
|
||||||
await dynamodbMemory.clear()
|
const chatId = options?.chatId as string
|
||||||
options.logger.info(`Successfully cleared DynamoDb memory session ${sessionId ? sessionId : chatId}`)
|
options.logger.info(`Clearing DynamoDb memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
await dynamodbMemory.clear()
|
||||||
|
options.logger.info(`Successfully cleared DynamoDb memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
},
|
||||||
|
async getChatMessages(nodeData: INodeData, options: ICommonObject): Promise<string> {
|
||||||
|
const memoryKey = nodeData.inputs?.memoryKey as string
|
||||||
|
const dynamodbMemory = await initalizeDynamoDB(nodeData, options)
|
||||||
|
const key = memoryKey ?? 'chat_history'
|
||||||
|
const memoryResult = await dynamodbMemory.loadMemoryVariables({})
|
||||||
|
return serializeChatHistory(memoryResult[key])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,9 +128,8 @@ const initalizeDynamoDB = async (nodeData: INodeData, options: ICommonObject): P
|
|||||||
})
|
})
|
||||||
|
|
||||||
const memory = new BufferMemoryExtended({
|
const memory = new BufferMemoryExtended({
|
||||||
memoryKey,
|
memoryKey: memoryKey ?? 'chat_history',
|
||||||
chatHistory: dynamoDb,
|
chatHistory: dynamoDb,
|
||||||
returnMessages: true,
|
|
||||||
isSessionIdUsingChatMessageId
|
isSessionIdUsingChatMessageId
|
||||||
})
|
})
|
||||||
return memory
|
return memory
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
import { getBaseClasses, getCredentialData, getCredentialParam, ICommonObject, INode, INodeData, INodeParams } from '../../../src'
|
import {
|
||||||
|
getBaseClasses,
|
||||||
|
getCredentialData,
|
||||||
|
getCredentialParam,
|
||||||
|
ICommonObject,
|
||||||
|
INode,
|
||||||
|
INodeData,
|
||||||
|
INodeParams,
|
||||||
|
serializeChatHistory
|
||||||
|
} from '../../../src'
|
||||||
import { MongoDBChatMessageHistory } from 'langchain/stores/message/mongodb'
|
import { MongoDBChatMessageHistory } from 'langchain/stores/message/mongodb'
|
||||||
import { BufferMemory, BufferMemoryInput } from 'langchain/memory'
|
import { BufferMemory, BufferMemoryInput } from 'langchain/memory'
|
||||||
import { BaseMessage, mapStoredMessageToChatMessage } from 'langchain/schema'
|
import { BaseMessage, mapStoredMessageToChatMessage } from 'langchain/schema'
|
||||||
@@ -67,13 +76,23 @@ class MongoDB_Memory implements INode {
|
|||||||
return initializeMongoDB(nodeData, options)
|
return initializeMongoDB(nodeData, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
//@ts-ignore
|
||||||
const mongodbMemory = await initializeMongoDB(nodeData, options)
|
memoryMethods = {
|
||||||
const sessionId = nodeData.inputs?.sessionId as string
|
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
||||||
const chatId = options?.chatId as string
|
const mongodbMemory = await initializeMongoDB(nodeData, options)
|
||||||
options.logger.info(`Clearing MongoDB memory session ${sessionId ? sessionId : chatId}`)
|
const sessionId = nodeData.inputs?.sessionId as string
|
||||||
await mongodbMemory.clear()
|
const chatId = options?.chatId as string
|
||||||
options.logger.info(`Successfully cleared MongoDB memory session ${sessionId ? sessionId : chatId}`)
|
options.logger.info(`Clearing MongoDB memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
await mongodbMemory.clear()
|
||||||
|
options.logger.info(`Successfully cleared MongoDB memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
},
|
||||||
|
async getChatMessages(nodeData: INodeData, options: ICommonObject): Promise<string> {
|
||||||
|
const memoryKey = nodeData.inputs?.memoryKey as string
|
||||||
|
const mongodbMemory = await initializeMongoDB(nodeData, options)
|
||||||
|
const key = memoryKey ?? 'chat_history'
|
||||||
|
const memoryResult = await mongodbMemory.loadMemoryVariables({})
|
||||||
|
return serializeChatHistory(memoryResult[key])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,9 +142,8 @@ const initializeMongoDB = async (nodeData: INodeData, options: ICommonObject): P
|
|||||||
}
|
}
|
||||||
|
|
||||||
return new BufferMemoryExtended({
|
return new BufferMemoryExtended({
|
||||||
memoryKey,
|
memoryKey: memoryKey ?? 'chat_history',
|
||||||
chatHistory: mongoDBChatMessageHistory,
|
chatHistory: mongoDBChatMessageHistory,
|
||||||
returnMessages: true,
|
|
||||||
isSessionIdUsingChatMessageId
|
isSessionIdUsingChatMessageId
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../
|
|||||||
import { ICommonObject } from '../../../src'
|
import { ICommonObject } from '../../../src'
|
||||||
import { MotorheadMemory, MotorheadMemoryInput } from 'langchain/memory'
|
import { MotorheadMemory, MotorheadMemoryInput } from 'langchain/memory'
|
||||||
import fetch from 'node-fetch'
|
import fetch from 'node-fetch'
|
||||||
|
import { getBufferString } from 'langchain/memory'
|
||||||
|
|
||||||
class MotorMemory_Memory implements INode {
|
class MotorMemory_Memory implements INode {
|
||||||
label: string
|
label: string
|
||||||
@@ -64,13 +65,23 @@ class MotorMemory_Memory implements INode {
|
|||||||
return initalizeMotorhead(nodeData, options)
|
return initalizeMotorhead(nodeData, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
//@ts-ignore
|
||||||
const motorhead = await initalizeMotorhead(nodeData, options)
|
memoryMethods = {
|
||||||
const sessionId = nodeData.inputs?.sessionId as string
|
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
||||||
const chatId = options?.chatId as string
|
const motorhead = await initalizeMotorhead(nodeData, options)
|
||||||
options.logger.info(`Clearing Motorhead memory session ${sessionId ? sessionId : chatId}`)
|
const sessionId = nodeData.inputs?.sessionId as string
|
||||||
await motorhead.clear()
|
const chatId = options?.chatId as string
|
||||||
options.logger.info(`Successfully cleared Motorhead memory session ${sessionId ? sessionId : chatId}`)
|
options.logger.info(`Clearing Motorhead memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
await motorhead.clear()
|
||||||
|
options.logger.info(`Successfully cleared Motorhead memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
},
|
||||||
|
async getChatMessages(nodeData: INodeData, options: ICommonObject): Promise<string> {
|
||||||
|
const memoryKey = nodeData.inputs?.memoryKey as string
|
||||||
|
const motorhead = await initalizeMotorhead(nodeData, options)
|
||||||
|
const key = memoryKey ?? 'chat_history'
|
||||||
|
const memoryResult = await motorhead.loadMemoryVariables({})
|
||||||
|
return getBufferString(memoryResult[key])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { INode, INodeData, INodeParams, ICommonObject } from '../../../src/Interface'
|
import { INode, INodeData, INodeParams, ICommonObject } from '../../../src/Interface'
|
||||||
import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils'
|
import { getBaseClasses, getCredentialData, getCredentialParam, serializeChatHistory } from '../../../src/utils'
|
||||||
import { BufferMemory, BufferMemoryInput } from 'langchain/memory'
|
import { BufferMemory, BufferMemoryInput } from 'langchain/memory'
|
||||||
import { RedisChatMessageHistory, RedisChatMessageHistoryInput } from 'langchain/stores/message/ioredis'
|
import { RedisChatMessageHistory, RedisChatMessageHistoryInput } from 'langchain/stores/message/ioredis'
|
||||||
import { mapStoredMessageToChatMessage, BaseMessage } from 'langchain/schema'
|
import { mapStoredMessageToChatMessage, BaseMessage } from 'langchain/schema'
|
||||||
@@ -65,13 +65,23 @@ class RedisBackedChatMemory_Memory implements INode {
|
|||||||
return await initalizeRedis(nodeData, options)
|
return await initalizeRedis(nodeData, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
//@ts-ignore
|
||||||
const redis = await initalizeRedis(nodeData, options)
|
memoryMethods = {
|
||||||
const sessionId = nodeData.inputs?.sessionId as string
|
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
||||||
const chatId = options?.chatId as string
|
const redis = await initalizeRedis(nodeData, options)
|
||||||
options.logger.info(`Clearing Redis memory session ${sessionId ? sessionId : chatId}`)
|
const sessionId = nodeData.inputs?.sessionId as string
|
||||||
await redis.clear()
|
const chatId = options?.chatId as string
|
||||||
options.logger.info(`Successfully cleared Redis memory session ${sessionId ? sessionId : chatId}`)
|
options.logger.info(`Clearing Redis memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
await redis.clear()
|
||||||
|
options.logger.info(`Successfully cleared Redis memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
},
|
||||||
|
async getChatMessages(nodeData: INodeData, options: ICommonObject): Promise<string> {
|
||||||
|
const memoryKey = nodeData.inputs?.memoryKey as string
|
||||||
|
const redis = await initalizeRedis(nodeData, options)
|
||||||
|
const key = memoryKey ?? 'chat_history'
|
||||||
|
const memoryResult = await redis.loadMemoryVariables({})
|
||||||
|
return serializeChatHistory(memoryResult[key])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,7 +147,7 @@ const initalizeRedis = async (nodeData: INodeData, options: ICommonObject): Prom
|
|||||||
}
|
}
|
||||||
|
|
||||||
const memory = new BufferMemoryExtended({
|
const memory = new BufferMemoryExtended({
|
||||||
memoryKey,
|
memoryKey: memoryKey ?? 'chat_history',
|
||||||
chatHistory: redisChatMessageHistory,
|
chatHistory: redisChatMessageHistory,
|
||||||
isSessionIdUsingChatMessageId
|
isSessionIdUsingChatMessageId
|
||||||
})
|
})
|
||||||
|
|||||||
+18
-8
@@ -1,5 +1,5 @@
|
|||||||
import { INode, INodeData, INodeParams } from '../../../src/Interface'
|
import { INode, INodeData, INodeParams } from '../../../src/Interface'
|
||||||
import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils'
|
import { getBaseClasses, getCredentialData, getCredentialParam, serializeChatHistory } from '../../../src/utils'
|
||||||
import { ICommonObject } from '../../../src'
|
import { ICommonObject } from '../../../src'
|
||||||
import { BufferMemory, BufferMemoryInput } from 'langchain/memory'
|
import { BufferMemory, BufferMemoryInput } from 'langchain/memory'
|
||||||
import { UpstashRedisChatMessageHistory } from 'langchain/stores/message/upstash_redis'
|
import { UpstashRedisChatMessageHistory } from 'langchain/stores/message/upstash_redis'
|
||||||
@@ -63,13 +63,22 @@ class UpstashRedisBackedChatMemory_Memory implements INode {
|
|||||||
return initalizeUpstashRedis(nodeData, options)
|
return initalizeUpstashRedis(nodeData, options)
|
||||||
}
|
}
|
||||||
|
|
||||||
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
//@ts-ignore
|
||||||
const redis = await initalizeUpstashRedis(nodeData, options)
|
memoryMethods = {
|
||||||
const sessionId = nodeData.inputs?.sessionId as string
|
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
||||||
const chatId = options?.chatId as string
|
const redis = await initalizeUpstashRedis(nodeData, options)
|
||||||
options.logger.info(`Clearing Upstash Redis memory session ${sessionId ? sessionId : chatId}`)
|
const sessionId = nodeData.inputs?.sessionId as string
|
||||||
await redis.clear()
|
const chatId = options?.chatId as string
|
||||||
options.logger.info(`Successfully cleared Upstash Redis memory session ${sessionId ? sessionId : chatId}`)
|
options.logger.info(`Clearing Upstash Redis memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
await redis.clear()
|
||||||
|
options.logger.info(`Successfully cleared Upstash Redis memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
},
|
||||||
|
async getChatMessages(nodeData: INodeData, options: ICommonObject): Promise<string> {
|
||||||
|
const redis = await initalizeUpstashRedis(nodeData, options)
|
||||||
|
const key = 'chat_history'
|
||||||
|
const memoryResult = await redis.loadMemoryVariables({})
|
||||||
|
return serializeChatHistory(memoryResult[key])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,6 +104,7 @@ const initalizeUpstashRedis = async (nodeData: INodeData, options: ICommonObject
|
|||||||
})
|
})
|
||||||
|
|
||||||
const memory = new BufferMemoryExtended({
|
const memory = new BufferMemoryExtended({
|
||||||
|
memoryKey: 'chat_history',
|
||||||
chatHistory: redisChatMessageHistory,
|
chatHistory: redisChatMessageHistory,
|
||||||
isSessionIdUsingChatMessageId
|
isSessionIdUsingChatMessageId
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { SystemMessage } from 'langchain/schema'
|
import { ZepMemory, ZepMemoryInput } from 'langchain/memory/zep'
|
||||||
|
import { getBufferString, InputValues, MemoryVariables, OutputValues } from 'langchain/memory'
|
||||||
import { INode, INodeData, INodeParams } from '../../../src/Interface'
|
import { INode, INodeData, INodeParams } from '../../../src/Interface'
|
||||||
import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils'
|
import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils'
|
||||||
import { ZepMemory, ZepMemoryInput } from 'langchain/memory/zep'
|
|
||||||
import { ICommonObject } from '../../../src'
|
import { ICommonObject } from '../../../src'
|
||||||
|
|
||||||
class ZepMemory_Memory implements INode {
|
class ZepMemory_Memory implements INode {
|
||||||
@@ -19,7 +19,7 @@ class ZepMemory_Memory implements INode {
|
|||||||
constructor() {
|
constructor() {
|
||||||
this.label = 'Zep Memory'
|
this.label = 'Zep Memory'
|
||||||
this.name = 'ZepMemory'
|
this.name = 'ZepMemory'
|
||||||
this.version = 1.0
|
this.version = 2.0
|
||||||
this.type = 'ZepMemory'
|
this.type = 'ZepMemory'
|
||||||
this.icon = 'zep.png'
|
this.icon = 'zep.png'
|
||||||
this.category = 'Memory'
|
this.category = 'Memory'
|
||||||
@@ -40,17 +40,12 @@ class ZepMemory_Memory implements INode {
|
|||||||
type: 'string',
|
type: 'string',
|
||||||
default: 'http://127.0.0.1:8000'
|
default: 'http://127.0.0.1:8000'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: 'Auto Summary',
|
|
||||||
name: 'autoSummary',
|
|
||||||
type: 'boolean',
|
|
||||||
default: true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: 'Session Id',
|
label: 'Session Id',
|
||||||
name: 'sessionId',
|
name: 'sessionId',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description: 'If not specified, the first CHAT_MESSAGE_ID will be used as sessionId',
|
description:
|
||||||
|
'If not specified, a random id will be used. Learn <a target="_blank" href="https://docs.flowiseai.com/memory/long-term-memory#ui-and-embedded-chat">more</a>',
|
||||||
default: '',
|
default: '',
|
||||||
additionalParams: true,
|
additionalParams: true,
|
||||||
optional: true
|
optional: true
|
||||||
@@ -59,15 +54,10 @@ class ZepMemory_Memory implements INode {
|
|||||||
label: 'Size',
|
label: 'Size',
|
||||||
name: 'k',
|
name: 'k',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
default: '10',
|
placeholder: '10',
|
||||||
description: 'Window of size k to surface the last k back-and-forth to use as memory.'
|
description: 'Window of size k to surface the last k back-and-forth to use as memory.',
|
||||||
},
|
additionalParams: true,
|
||||||
{
|
optional: true
|
||||||
label: 'Auto Summary Template',
|
|
||||||
name: 'autoSummaryTemplate',
|
|
||||||
type: 'string',
|
|
||||||
default: 'This is the summary of the following conversation:\n{summary}',
|
|
||||||
additionalParams: true
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'AI Prefix',
|
label: 'AI Prefix',
|
||||||
@@ -108,45 +98,28 @@ class ZepMemory_Memory implements INode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async init(nodeData: INodeData, _: string, options: ICommonObject): Promise<any> {
|
async init(nodeData: INodeData, _: string, options: ICommonObject): Promise<any> {
|
||||||
const autoSummaryTemplate = nodeData.inputs?.autoSummaryTemplate as string
|
return await initalizeZep(nodeData, options)
|
||||||
const autoSummary = nodeData.inputs?.autoSummary as boolean
|
|
||||||
|
|
||||||
const k = nodeData.inputs?.k as string
|
|
||||||
|
|
||||||
let zep = await initalizeZep(nodeData, options)
|
|
||||||
|
|
||||||
// hack to support summary
|
|
||||||
let tmpFunc = zep.loadMemoryVariables
|
|
||||||
zep.loadMemoryVariables = async (values) => {
|
|
||||||
let data = await tmpFunc.bind(zep, values)()
|
|
||||||
if (autoSummary && zep.returnMessages && data[zep.memoryKey] && data[zep.memoryKey].length) {
|
|
||||||
const zepClient = await zep.zepClientPromise
|
|
||||||
const memory = await zepClient.memory.getMemory(zep.sessionId, parseInt(k, 10) ?? 10)
|
|
||||||
if (memory?.summary) {
|
|
||||||
let summary = autoSummaryTemplate.replace(/{summary}/g, memory.summary.content)
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log('[ZepMemory] auto summary:', summary)
|
|
||||||
data[zep.memoryKey].unshift(new SystemMessage(summary))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// for langchain zep memory compatibility, or we will get "Missing value for input variable chat_history"
|
|
||||||
if (data instanceof Array) {
|
|
||||||
data = {
|
|
||||||
[zep.memoryKey]: data
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
return zep
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
//@ts-ignore
|
||||||
const zep = await initalizeZep(nodeData, options)
|
memoryMethods = {
|
||||||
const sessionId = nodeData.inputs?.sessionId as string
|
async clearSessionMemory(nodeData: INodeData, options: ICommonObject): Promise<void> {
|
||||||
const chatId = options?.chatId as string
|
const zep = await initalizeZep(nodeData, options)
|
||||||
options.logger.info(`Clearing Zep memory session ${sessionId ? sessionId : chatId}`)
|
const sessionId = nodeData.inputs?.sessionId as string
|
||||||
await zep.clear()
|
const chatId = options?.chatId as string
|
||||||
options.logger.info(`Successfully cleared Zep memory session ${sessionId ? sessionId : chatId}`)
|
options.logger.info(`Clearing Zep memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
await zep.clear()
|
||||||
|
options.logger.info(`Successfully cleared Zep memory session ${sessionId ? sessionId : chatId}`)
|
||||||
|
},
|
||||||
|
async getChatMessages(nodeData: INodeData, options: ICommonObject): Promise<string> {
|
||||||
|
const memoryKey = nodeData.inputs?.memoryKey as string
|
||||||
|
const aiPrefix = nodeData.inputs?.aiPrefix as string
|
||||||
|
const humanPrefix = nodeData.inputs?.humanPrefix as string
|
||||||
|
const zep = await initalizeZep(nodeData, options)
|
||||||
|
const key = memoryKey ?? 'chat_history'
|
||||||
|
const memoryResult = await zep.loadMemoryVariables({})
|
||||||
|
return getBufferString(memoryResult[key], humanPrefix, aiPrefix)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,40 +129,72 @@ const initalizeZep = async (nodeData: INodeData, options: ICommonObject): Promis
|
|||||||
const humanPrefix = nodeData.inputs?.humanPrefix as string
|
const humanPrefix = nodeData.inputs?.humanPrefix as string
|
||||||
const memoryKey = nodeData.inputs?.memoryKey as string
|
const memoryKey = nodeData.inputs?.memoryKey as string
|
||||||
const inputKey = nodeData.inputs?.inputKey as string
|
const inputKey = nodeData.inputs?.inputKey as string
|
||||||
const sessionId = nodeData.inputs?.sessionId as string
|
const k = nodeData.inputs?.k as string
|
||||||
const chatId = options?.chatId as string
|
const chatId = options?.chatId as string
|
||||||
|
|
||||||
let isSessionIdUsingChatMessageId = false
|
let isSessionIdUsingChatMessageId = false
|
||||||
if (!sessionId && chatId) isSessionIdUsingChatMessageId = true
|
let sessionId = ''
|
||||||
|
|
||||||
|
if (!nodeData.inputs?.sessionId && chatId) {
|
||||||
|
isSessionIdUsingChatMessageId = true
|
||||||
|
sessionId = chatId
|
||||||
|
} else {
|
||||||
|
sessionId = nodeData.inputs?.sessionId
|
||||||
|
}
|
||||||
|
|
||||||
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
|
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
|
||||||
const apiKey = getCredentialParam('apiKey', credentialData, nodeData)
|
const apiKey = getCredentialParam('apiKey', credentialData, nodeData)
|
||||||
|
|
||||||
const obj: ZepMemoryInput & Partial<ZepMemoryExtendedInput> = {
|
const obj: ZepMemoryInput & ZepMemoryExtendedInput = {
|
||||||
baseURL,
|
baseURL,
|
||||||
sessionId: sessionId ? sessionId : chatId,
|
sessionId: sessionId ? sessionId : chatId,
|
||||||
aiPrefix,
|
aiPrefix,
|
||||||
humanPrefix,
|
humanPrefix,
|
||||||
returnMessages: true,
|
returnMessages: true,
|
||||||
memoryKey,
|
memoryKey,
|
||||||
inputKey
|
inputKey,
|
||||||
|
isSessionIdUsingChatMessageId,
|
||||||
|
k: k ? parseInt(k, 10) : undefined
|
||||||
}
|
}
|
||||||
if (apiKey) obj.apiKey = apiKey
|
if (apiKey) obj.apiKey = apiKey
|
||||||
if (isSessionIdUsingChatMessageId) obj.isSessionIdUsingChatMessageId = true
|
|
||||||
|
|
||||||
return new ZepMemoryExtended(obj)
|
return new ZepMemoryExtended(obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ZepMemoryExtendedInput {
|
interface ZepMemoryExtendedInput {
|
||||||
isSessionIdUsingChatMessageId: boolean
|
isSessionIdUsingChatMessageId: boolean
|
||||||
|
k?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
class ZepMemoryExtended extends ZepMemory {
|
class ZepMemoryExtended extends ZepMemory {
|
||||||
isSessionIdUsingChatMessageId? = false
|
isSessionIdUsingChatMessageId? = false
|
||||||
|
lastN?: number
|
||||||
|
|
||||||
constructor(fields: ZepMemoryInput & Partial<ZepMemoryExtendedInput>) {
|
constructor(fields: ZepMemoryInput & ZepMemoryExtendedInput) {
|
||||||
super(fields)
|
super(fields)
|
||||||
this.isSessionIdUsingChatMessageId = fields.isSessionIdUsingChatMessageId
|
this.isSessionIdUsingChatMessageId = fields.isSessionIdUsingChatMessageId
|
||||||
|
this.lastN = fields.k
|
||||||
|
}
|
||||||
|
|
||||||
|
async loadMemoryVariables(values: InputValues, overrideSessionId = ''): Promise<MemoryVariables> {
|
||||||
|
if (overrideSessionId) {
|
||||||
|
super.sessionId = overrideSessionId
|
||||||
|
}
|
||||||
|
return super.loadMemoryVariables({ ...values, lastN: this.lastN })
|
||||||
|
}
|
||||||
|
|
||||||
|
async saveContext(inputValues: InputValues, outputValues: OutputValues, overrideSessionId = ''): Promise<void> {
|
||||||
|
if (overrideSessionId) {
|
||||||
|
super.sessionId = overrideSessionId
|
||||||
|
}
|
||||||
|
return super.saveContext(inputValues, outputValues)
|
||||||
|
}
|
||||||
|
|
||||||
|
async clear(overrideSessionId = ''): Promise<void> {
|
||||||
|
if (overrideSessionId) {
|
||||||
|
super.sessionId = overrideSessionId
|
||||||
|
}
|
||||||
|
return super.clear()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ class OpenAIModeration implements INode {
|
|||||||
this.name = 'inputModerationOpenAI'
|
this.name = 'inputModerationOpenAI'
|
||||||
this.version = 1.0
|
this.version = 1.0
|
||||||
this.type = 'Moderation'
|
this.type = 'Moderation'
|
||||||
this.icon = 'openai-moderation.png'
|
this.icon = 'openai.png'
|
||||||
this.category = 'Moderation'
|
this.category = 'Moderation'
|
||||||
this.description = 'Check whether content complies with OpenAI usage policies.'
|
this.description = 'Check whether content complies with OpenAI usage policies.'
|
||||||
this.baseClasses = [this.type, ...getBaseClasses(Moderation)]
|
this.baseClasses = [this.type, ...getBaseClasses(Moderation)]
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 47 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.9 KiB |
+1
-1
@@ -14,7 +14,7 @@ export class SimplePromptModerationRunner implements Moderation {
|
|||||||
|
|
||||||
async checkForViolations(input: string): Promise<string> {
|
async checkForViolations(input: string): Promise<string> {
|
||||||
this.denyList.split('\n').forEach((denyListItem) => {
|
this.denyList.split('\n').forEach((denyListItem) => {
|
||||||
if (denyListItem && denyListItem !== '' && input.includes(denyListItem)) {
|
if (denyListItem && denyListItem !== '' && input.toLowerCase().includes(denyListItem.toLowerCase())) {
|
||||||
throw Error(this.moderationErrorMessage)
|
throw Error(this.moderationErrorMessage)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { DynamicTool, DynamicToolInput } from 'langchain/tools'
|
import { DynamicTool, DynamicToolInput } from 'langchain/tools'
|
||||||
import { BaseChain } from 'langchain/chains'
|
import { BaseChain } from 'langchain/chains'
|
||||||
|
import { handleEscapeCharacters } from '../../../src/utils'
|
||||||
|
|
||||||
export interface ChainToolInput extends Omit<DynamicToolInput, 'func'> {
|
export interface ChainToolInput extends Omit<DynamicToolInput, 'func'> {
|
||||||
chain: BaseChain
|
chain: BaseChain
|
||||||
@@ -14,7 +15,8 @@ export class ChainTool extends DynamicTool {
|
|||||||
func: async (input, runManager) => {
|
func: async (input, runManager) => {
|
||||||
// To enable LLM Chain which has promptValues
|
// To enable LLM Chain which has promptValues
|
||||||
if ((chain as any).prompt && (chain as any).prompt.promptValues) {
|
if ((chain as any).prompt && (chain as any).prompt.promptValues) {
|
||||||
const values = await chain.call((chain as any).prompt.promptValues, runManager?.getChild())
|
const promptValues = handleEscapeCharacters((chain as any).prompt.promptValues, true)
|
||||||
|
const values = await chain.call(promptValues, runManager?.getChild())
|
||||||
return values?.text
|
return values?.text
|
||||||
}
|
}
|
||||||
return chain.run(input, runManager?.getChild())
|
return chain.run(input, runManager?.getChild())
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
import { ZapierNLAWrapper, ZapierNLAWrapperParams } from 'langchain/tools'
|
|
||||||
import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface'
|
|
||||||
import { ZapierToolKit } from 'langchain/agents'
|
|
||||||
import { getCredentialData, getCredentialParam } from '../../../src'
|
|
||||||
|
|
||||||
class ZapierNLA_Tools implements INode {
|
|
||||||
label: string
|
|
||||||
name: string
|
|
||||||
version: number
|
|
||||||
description: string
|
|
||||||
type: string
|
|
||||||
icon: string
|
|
||||||
category: string
|
|
||||||
badge: string
|
|
||||||
baseClasses: string[]
|
|
||||||
inputs: INodeParams[]
|
|
||||||
credential: INodeParams
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this.label = 'Zapier NLA'
|
|
||||||
this.name = 'zapierNLA'
|
|
||||||
this.version = 1.0
|
|
||||||
this.type = 'ZapierNLA'
|
|
||||||
this.icon = 'zapier.svg'
|
|
||||||
this.category = 'Tools'
|
|
||||||
this.description = "Access to apps and actions on Zapier's platform through a natural language API interface"
|
|
||||||
this.badge = 'DEPRECATING'
|
|
||||||
this.inputs = []
|
|
||||||
this.credential = {
|
|
||||||
label: 'Connect Credential',
|
|
||||||
name: 'credential',
|
|
||||||
type: 'credential',
|
|
||||||
credentialNames: ['zapierNLAApi']
|
|
||||||
}
|
|
||||||
this.baseClasses = [this.type, 'Tool']
|
|
||||||
}
|
|
||||||
|
|
||||||
async init(nodeData: INodeData, _: string, options: ICommonObject): Promise<any> {
|
|
||||||
const credentialData = await getCredentialData(nodeData.credential ?? '', options)
|
|
||||||
const zapierNLAApiKey = getCredentialParam('zapierNLAApiKey', credentialData, nodeData)
|
|
||||||
|
|
||||||
const obj: Partial<ZapierNLAWrapperParams> = {
|
|
||||||
apiKey: zapierNLAApiKey
|
|
||||||
}
|
|
||||||
const zapier = new ZapierNLAWrapper(obj)
|
|
||||||
const toolkit = await ZapierToolKit.fromZapierNLAWrapper(zapier)
|
|
||||||
|
|
||||||
return toolkit.tools
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { nodeClass: ZapierNLA_Tools }
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg width="800px" height="800px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<g>
|
|
||||||
<path d="M128.080089,-0.000183105 C135.311053,0.0131003068 142.422517,0.624138494 149.335663,1.77979593 L149.335663,1.77979593 L149.335663,76.2997796 L202.166953,23.6044907 C208.002065,27.7488446 213.460883,32.3582023 218.507811,37.3926715 C223.557281,42.4271407 228.192318,47.8867213 232.346817,53.7047992 L232.346817,53.7047992 L179.512985,106.400063 L254.227854,106.400063 C255.387249,113.29414 256,120.36111 256,127.587243 L256,127.587243 L256,127.759881 C256,134.986013 255.387249,142.066204 254.227854,148.960282 L254.227854,148.960282 L179.500273,148.960282 L232.346817,201.642324 C228.192318,207.460402 223.557281,212.919983 218.523066,217.954452 L218.523066,217.954452 L218.507811,217.954452 C213.460883,222.988921 208.002065,227.6115 202.182208,231.742607 L202.182208,231.742607 L149.335663,179.04709 L149.335663,253.5672 C142.435229,254.723036 135.323765,255.333244 128.092802,255.348499 L128.092802,255.348499 L127.907197,255.348499 C120.673691,255.333244 113.590195,254.723036 106.677048,253.5672 L106.677048,253.5672 L106.677048,179.04709 L53.8457596,231.742607 C42.1780766,223.466917 31.977435,213.278734 23.6658953,201.642324 L23.6658953,201.642324 L76.4997269,148.960282 L1.78485803,148.960282 C0.612750404,142.052729 0,134.946095 0,127.719963 L0,127.719963 L0,127.349037 C0.0121454869,125.473817 0.134939797,123.182933 0.311311815,120.812834 L0.36577283,120.099764 C0.887996182,113.428547 1.78485803,106.400063 1.78485803,106.400063 L1.78485803,106.400063 L76.4997269,106.400063 L23.6658953,53.7047992 C27.8076812,47.8867213 32.4300059,42.4403618 37.4769335,37.4193681 L37.4769335,37.4193681 L37.5023588,37.3926715 C42.5391163,32.3582023 48.0106469,27.7488446 53.8457596,23.6044907 L53.8457596,23.6044907 L106.677048,76.2997796 L106.677048,1.77979593 C113.590195,0.624138494 120.688946,0.0131003068 127.932622,-0.000183105 L127.932622,-0.000183105 L128.080089,-0.000183105 Z M128.067377,95.7600714 L127.945335,95.7600714 C118.436262,95.7600714 109.32891,97.5001809 100.910584,100.661566 C97.7553011,109.043534 96.0085811,118.129275 95.9958684,127.613685 L95.9958684,127.733184 C96.0085811,137.217594 97.7553011,146.303589 100.923296,154.685303 C109.32891,157.846943 118.436262,159.587052 127.945335,159.587052 L128.067377,159.587052 C137.576449,159.587052 146.683802,157.846943 155.089415,154.685303 C158.257411,146.290368 160.004131,137.217594 160.004131,127.733184 L160.004131,127.613685 C160.004131,118.129275 158.257411,109.043534 155.089415,100.661566 C146.683802,97.5001809 137.576449,95.7600714 128.067377,95.7600714 Z" fill="#FF4A00" fill-rule="nonzero">
|
|
||||||
|
|
||||||
</path>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.7 KiB |
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "flowise-components",
|
"name": "flowise-components",
|
||||||
"version": "1.4.3",
|
"version": "1.4.5",
|
||||||
"description": "Flowiseai Components",
|
"description": "Flowiseai Components",
|
||||||
"main": "dist/src/index",
|
"main": "dist/src/index",
|
||||||
"types": "dist/src/index.d.ts",
|
"types": "dist/src/index.d.ts",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
"@aws-sdk/client-s3": "^3.427.0",
|
"@aws-sdk/client-s3": "^3.427.0",
|
||||||
"@dqbd/tiktoken": "^1.0.7",
|
"@dqbd/tiktoken": "^1.0.7",
|
||||||
"@elastic/elasticsearch": "^8.9.0",
|
"@elastic/elasticsearch": "^8.9.0",
|
||||||
"@getzep/zep-js": "^0.6.3",
|
"@getzep/zep-js": "^0.9.0",
|
||||||
"@gomomento/sdk": "^1.51.1",
|
"@gomomento/sdk": "^1.51.1",
|
||||||
"@gomomento/sdk-core": "^1.51.1",
|
"@gomomento/sdk-core": "^1.51.1",
|
||||||
"@google-ai/generativelanguage": "^0.2.1",
|
"@google-ai/generativelanguage": "^0.2.1",
|
||||||
|
|||||||
@@ -107,9 +107,12 @@ export interface INode extends INodeProperties {
|
|||||||
search: (nodeData: INodeData, options?: ICommonObject) => Promise<any>
|
search: (nodeData: INodeData, options?: ICommonObject) => Promise<any>
|
||||||
delete: (nodeData: INodeData, options?: ICommonObject) => Promise<void>
|
delete: (nodeData: INodeData, options?: ICommonObject) => Promise<void>
|
||||||
}
|
}
|
||||||
|
memoryMethods?: {
|
||||||
|
clearSessionMemory: (nodeData: INodeData, options?: ICommonObject) => Promise<void>
|
||||||
|
getChatMessages: (nodeData: INodeData, options?: ICommonObject) => Promise<string>
|
||||||
|
}
|
||||||
init?(nodeData: INodeData, input: string, options?: ICommonObject): Promise<any>
|
init?(nodeData: INodeData, input: string, options?: ICommonObject): Promise<any>
|
||||||
run?(nodeData: INodeData, input: string, options?: ICommonObject): Promise<string | ICommonObject>
|
run?(nodeData: INodeData, input: string, options?: ICommonObject): Promise<string | ICommonObject>
|
||||||
clearSessionMemory?(nodeData: INodeData, options?: ICommonObject): Promise<void>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface INodeData extends INodeProperties {
|
export interface INodeData extends INodeProperties {
|
||||||
|
|||||||
@@ -549,6 +549,18 @@ export const convertChatHistoryToText = (chatHistory: IMessage[] = []): string =
|
|||||||
.join('\n')
|
.join('\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialize array chat history to string
|
||||||
|
* @param {IMessage[]} chatHistory
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export const serializeChatHistory = (chatHistory: string | Array<string>) => {
|
||||||
|
if (Array.isArray(chatHistory)) {
|
||||||
|
return chatHistory.join('\n')
|
||||||
|
}
|
||||||
|
return chatHistory
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert schema to zod schema
|
* Convert schema to zod schema
|
||||||
* @param {string | object} schema
|
* @param {string | object} schema
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 510,
|
"height": 491,
|
||||||
"id": "openApiChain_1",
|
"id": "openApiChain_1",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 1203.1825726424859,
|
"x": 1203.1825726424859,
|
||||||
@@ -13,8 +13,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "openApiChain_1",
|
"id": "openApiChain_1",
|
||||||
"label": "OpenAPI Chain",
|
"label": "OpenAPI Chain",
|
||||||
"name": "openApiChain",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "openApiChain",
|
||||||
"type": "OpenAPIChain",
|
"type": "OpenAPIChain",
|
||||||
"baseClasses": ["OpenAPIChain", "BaseChain"],
|
"baseClasses": ["OpenAPIChain", "BaseChain"],
|
||||||
"category": "Chains",
|
"category": "Chains",
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 523,
|
"height": 574,
|
||||||
"id": "chatOpenAI_1",
|
"id": "chatOpenAI_1",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 792.3201947594027,
|
"x": 792.3201947594027,
|
||||||
@@ -88,8 +88,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chatOpenAI_1",
|
"id": "chatOpenAI_1",
|
||||||
"label": "ChatOpenAI",
|
"label": "ChatOpenAI",
|
||||||
"name": "chatOpenAI",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
|
"name": "chatOpenAI",
|
||||||
"type": "ChatOpenAI",
|
"type": "ChatOpenAI",
|
||||||
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
||||||
"category": "Chat Models",
|
"category": "Chat Models",
|
||||||
@@ -259,8 +259,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chainTool_0",
|
"id": "chainTool_0",
|
||||||
"label": "Chain Tool",
|
"label": "Chain Tool",
|
||||||
"name": "chainTool",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "chainTool",
|
||||||
"type": "ChainTool",
|
"type": "ChainTool",
|
||||||
"baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool"],
|
"baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool"],
|
||||||
"category": "Tools",
|
"category": "Tools",
|
||||||
@@ -334,7 +334,7 @@
|
|||||||
"id": "openAIFunctionAgent_0",
|
"id": "openAIFunctionAgent_0",
|
||||||
"label": "OpenAI Function Agent",
|
"label": "OpenAI Function Agent",
|
||||||
"name": "openAIFunctionAgent",
|
"name": "openAIFunctionAgent",
|
||||||
"version": 2,
|
"version": 3,
|
||||||
"type": "AgentExecutor",
|
"type": "AgentExecutor",
|
||||||
"baseClasses": ["AgentExecutor", "BaseChain"],
|
"baseClasses": ["AgentExecutor", "BaseChain"],
|
||||||
"category": "Agents",
|
"category": "Agents",
|
||||||
@@ -367,8 +367,8 @@
|
|||||||
{
|
{
|
||||||
"label": "OpenAI/Azure Chat Model",
|
"label": "OpenAI/Azure Chat Model",
|
||||||
"name": "model",
|
"name": "model",
|
||||||
"type": "ChatOpenAI | AzureChatOpenAI",
|
"type": "BaseChatModel",
|
||||||
"id": "openAIFunctionAgent_0-input-model-ChatOpenAI | AzureChatOpenAI"
|
"id": "openAIFunctionAgent_0-input-model-BaseChatModel"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"inputs": {
|
"inputs": {
|
||||||
@@ -397,7 +397,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 523,
|
"height": 574,
|
||||||
"id": "chatOpenAI_2",
|
"id": "chatOpenAI_2",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 1645.450699499575,
|
"x": 1645.450699499575,
|
||||||
@@ -407,8 +407,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chatOpenAI_2",
|
"id": "chatOpenAI_2",
|
||||||
"label": "ChatOpenAI",
|
"label": "ChatOpenAI",
|
||||||
"name": "chatOpenAI",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
|
"name": "chatOpenAI",
|
||||||
"type": "ChatOpenAI",
|
"type": "ChatOpenAI",
|
||||||
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
||||||
"category": "Chat Models",
|
"category": "Chat Models",
|
||||||
@@ -578,8 +578,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "bufferMemory_0",
|
"id": "bufferMemory_0",
|
||||||
"label": "Buffer Memory",
|
"label": "Buffer Memory",
|
||||||
"name": "bufferMemory",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "bufferMemory",
|
||||||
"type": "BufferMemory",
|
"type": "BufferMemory",
|
||||||
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
||||||
"category": "Memory",
|
"category": "Memory",
|
||||||
@@ -657,17 +657,6 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"source": "chatOpenAI_2",
|
|
||||||
"sourceHandle": "chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
|
||||||
"target": "openAIFunctionAgent_0",
|
|
||||||
"targetHandle": "openAIFunctionAgent_0-input-model-BaseChatModel",
|
|
||||||
"type": "buttonedge",
|
|
||||||
"id": "chatOpenAI_2-chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-openAIFunctionAgent_0-openAIFunctionAgent_0-input-model-BaseChatModel",
|
|
||||||
"data": {
|
|
||||||
"label": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"source": "bufferMemory_0",
|
"source": "bufferMemory_0",
|
||||||
"sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory",
|
"sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory",
|
||||||
@@ -678,6 +667,17 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "chatOpenAI_2",
|
||||||
|
"sourceHandle": "chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
||||||
|
"target": "openAIFunctionAgent_0",
|
||||||
|
"targetHandle": "openAIFunctionAgent_0-input-model-BaseChatModel",
|
||||||
|
"type": "buttonedge",
|
||||||
|
"id": "chatOpenAI_2-chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-openAIFunctionAgent_0-openAIFunctionAgent_0-input-model-BaseChatModel",
|
||||||
|
"data": {
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "getApiChain_0",
|
"id": "getApiChain_0",
|
||||||
"label": "GET API Chain",
|
"label": "GET API Chain",
|
||||||
"name": "getApiChain",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "getApiChain",
|
||||||
"type": "GETApiChain",
|
"type": "GETApiChain",
|
||||||
"baseClasses": ["GETApiChain", "BaseChain", "BaseLangChain"],
|
"baseClasses": ["GETApiChain", "BaseChain", "BaseLangChain"],
|
||||||
"category": "Chains",
|
"category": "Chains",
|
||||||
@@ -102,8 +102,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chainTool_0",
|
"id": "chainTool_0",
|
||||||
"label": "Chain Tool",
|
"label": "Chain Tool",
|
||||||
"name": "chainTool",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "chainTool",
|
||||||
"type": "ChainTool",
|
"type": "ChainTool",
|
||||||
"baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"],
|
"baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"],
|
||||||
"category": "Tools",
|
"category": "Tools",
|
||||||
@@ -176,8 +176,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "bufferMemory_0",
|
"id": "bufferMemory_0",
|
||||||
"label": "Buffer Memory",
|
"label": "Buffer Memory",
|
||||||
"name": "bufferMemory",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "bufferMemory",
|
||||||
"type": "BufferMemory",
|
"type": "BufferMemory",
|
||||||
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
||||||
"category": "Memory",
|
"category": "Memory",
|
||||||
@@ -233,8 +233,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chainTool_1",
|
"id": "chainTool_1",
|
||||||
"label": "Chain Tool",
|
"label": "Chain Tool",
|
||||||
"name": "chainTool",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "chainTool",
|
||||||
"type": "ChainTool",
|
"type": "ChainTool",
|
||||||
"baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"],
|
"baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"],
|
||||||
"category": "Tools",
|
"category": "Tools",
|
||||||
@@ -307,8 +307,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "postApiChain_0",
|
"id": "postApiChain_0",
|
||||||
"label": "POST API Chain",
|
"label": "POST API Chain",
|
||||||
"name": "postApiChain",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "postApiChain",
|
||||||
"type": "POSTApiChain",
|
"type": "POSTApiChain",
|
||||||
"baseClasses": ["POSTApiChain", "BaseChain", "BaseLangChain"],
|
"baseClasses": ["POSTApiChain", "BaseChain", "BaseLangChain"],
|
||||||
"category": "Chains",
|
"category": "Chains",
|
||||||
@@ -386,7 +386,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 523,
|
"height": 574,
|
||||||
"id": "chatOpenAI_2",
|
"id": "chatOpenAI_2",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 572.8941615312035,
|
"x": 572.8941615312035,
|
||||||
@@ -396,8 +396,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chatOpenAI_2",
|
"id": "chatOpenAI_2",
|
||||||
"label": "ChatOpenAI",
|
"label": "ChatOpenAI",
|
||||||
"name": "chatOpenAI",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
|
"name": "chatOpenAI",
|
||||||
"type": "ChatOpenAI",
|
"type": "ChatOpenAI",
|
||||||
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
||||||
"category": "Chat Models",
|
"category": "Chat Models",
|
||||||
@@ -557,7 +557,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 523,
|
"height": 574,
|
||||||
"id": "chatOpenAI_1",
|
"id": "chatOpenAI_1",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 828.7788305309582,
|
"x": 828.7788305309582,
|
||||||
@@ -567,8 +567,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chatOpenAI_1",
|
"id": "chatOpenAI_1",
|
||||||
"label": "ChatOpenAI",
|
"label": "ChatOpenAI",
|
||||||
"name": "chatOpenAI",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
|
"name": "chatOpenAI",
|
||||||
"type": "ChatOpenAI",
|
"type": "ChatOpenAI",
|
||||||
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
||||||
"category": "Chat Models",
|
"category": "Chat Models",
|
||||||
@@ -728,7 +728,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 523,
|
"height": 574,
|
||||||
"id": "chatOpenAI_3",
|
"id": "chatOpenAI_3",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 1148.338912314111,
|
"x": 1148.338912314111,
|
||||||
@@ -738,8 +738,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chatOpenAI_3",
|
"id": "chatOpenAI_3",
|
||||||
"label": "ChatOpenAI",
|
"label": "ChatOpenAI",
|
||||||
"name": "chatOpenAI",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
|
"name": "chatOpenAI",
|
||||||
"type": "ChatOpenAI",
|
"type": "ChatOpenAI",
|
||||||
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
||||||
"category": "Chat Models",
|
"category": "Chat Models",
|
||||||
@@ -869,7 +869,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"modelName": "gpt-3.5-turbo",
|
"modelName": "gpt-3.5-turbo-16k",
|
||||||
"temperature": 0.9,
|
"temperature": 0.9,
|
||||||
"maxTokens": "",
|
"maxTokens": "",
|
||||||
"topP": "",
|
"topP": "",
|
||||||
@@ -902,17 +902,17 @@
|
|||||||
"height": 383,
|
"height": 383,
|
||||||
"id": "conversationalAgent_0",
|
"id": "conversationalAgent_0",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 2114.071431691489,
|
"x": 2090.570467632979,
|
||||||
"y": 941.7926368551367
|
"y": 969.5131357270544
|
||||||
},
|
},
|
||||||
"type": "customNode",
|
"type": "customNode",
|
||||||
"data": {
|
"data": {
|
||||||
"id": "conversationalAgent_0",
|
"id": "conversationalAgent_0",
|
||||||
"label": "Conversational Agent",
|
"label": "Conversational Agent",
|
||||||
|
"version": 2,
|
||||||
"name": "conversationalAgent",
|
"name": "conversationalAgent",
|
||||||
"version": 1,
|
|
||||||
"type": "AgentExecutor",
|
"type": "AgentExecutor",
|
||||||
"baseClasses": ["AgentExecutor", "BaseChain"],
|
"baseClasses": ["AgentExecutor", "BaseChain", "Runnable"],
|
||||||
"category": "Agents",
|
"category": "Agents",
|
||||||
"description": "Conversational agent for a chat model. It will utilize chat specific prompts",
|
"description": "Conversational agent for a chat model. It will utilize chat specific prompts",
|
||||||
"inputParams": [
|
"inputParams": [
|
||||||
@@ -938,8 +938,8 @@
|
|||||||
{
|
{
|
||||||
"label": "Language Model",
|
"label": "Language Model",
|
||||||
"name": "model",
|
"name": "model",
|
||||||
"type": "BaseLanguageModel",
|
"type": "BaseChatModel",
|
||||||
"id": "conversationalAgent_0-input-model-BaseLanguageModel"
|
"id": "conversationalAgent_0-input-model-BaseChatModel"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Memory",
|
"label": "Memory",
|
||||||
@@ -956,21 +956,21 @@
|
|||||||
},
|
},
|
||||||
"outputAnchors": [
|
"outputAnchors": [
|
||||||
{
|
{
|
||||||
"id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain",
|
"id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain|Runnable",
|
||||||
"name": "conversationalAgent",
|
"name": "conversationalAgent",
|
||||||
"label": "AgentExecutor",
|
"label": "AgentExecutor",
|
||||||
"type": "AgentExecutor | BaseChain"
|
"type": "AgentExecutor | BaseChain | Runnable"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"outputs": {},
|
"outputs": {},
|
||||||
"selected": false
|
"selected": false
|
||||||
},
|
},
|
||||||
"selected": false,
|
"selected": false,
|
||||||
"dragging": false,
|
|
||||||
"positionAbsolute": {
|
"positionAbsolute": {
|
||||||
"x": 2114.071431691489,
|
"x": 2090.570467632979,
|
||||||
"y": 941.7926368551367
|
"y": 969.5131357270544
|
||||||
}
|
},
|
||||||
|
"dragging": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"edges": [
|
"edges": [
|
||||||
@@ -1044,9 +1044,9 @@
|
|||||||
"source": "chatOpenAI_3",
|
"source": "chatOpenAI_3",
|
||||||
"sourceHandle": "chatOpenAI_3-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
"sourceHandle": "chatOpenAI_3-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
||||||
"target": "conversationalAgent_0",
|
"target": "conversationalAgent_0",
|
||||||
"targetHandle": "conversationalAgent_0-input-model-BaseLanguageModel",
|
"targetHandle": "conversationalAgent_0-input-model-BaseChatModel",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "chatOpenAI_3-chatOpenAI_3-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseLanguageModel",
|
"id": "chatOpenAI_3-chatOpenAI_3-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseChatModel",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "calculator_1",
|
"id": "calculator_1",
|
||||||
"label": "Calculator",
|
"label": "Calculator",
|
||||||
"name": "calculator",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "calculator",
|
||||||
"type": "Calculator",
|
"type": "Calculator",
|
||||||
"baseClasses": ["Calculator", "Tool", "StructuredTool", "BaseLangChain"],
|
"baseClasses": ["Calculator", "Tool", "StructuredTool", "BaseLangChain"],
|
||||||
"category": "Tools",
|
"category": "Tools",
|
||||||
@@ -52,8 +52,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "bufferMemory_1",
|
"id": "bufferMemory_1",
|
||||||
"label": "Buffer Memory",
|
"label": "Buffer Memory",
|
||||||
"name": "bufferMemory",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "bufferMemory",
|
||||||
"type": "BufferMemory",
|
"type": "BufferMemory",
|
||||||
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
||||||
"category": "Memory",
|
"category": "Memory",
|
||||||
@@ -109,8 +109,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "serpAPI_0",
|
"id": "serpAPI_0",
|
||||||
"label": "Serp API",
|
"label": "Serp API",
|
||||||
"name": "serpAPI",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "serpAPI",
|
||||||
"type": "SerpAPI",
|
"type": "SerpAPI",
|
||||||
"baseClasses": ["SerpAPI", "Tool", "StructuredTool"],
|
"baseClasses": ["SerpAPI", "Tool", "StructuredTool"],
|
||||||
"category": "Tools",
|
"category": "Tools",
|
||||||
@@ -146,7 +146,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 523,
|
"height": 574,
|
||||||
"id": "chatOpenAI_0",
|
"id": "chatOpenAI_0",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 97.01321406237057,
|
"x": 97.01321406237057,
|
||||||
@@ -156,8 +156,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chatOpenAI_0",
|
"id": "chatOpenAI_0",
|
||||||
"label": "ChatOpenAI",
|
"label": "ChatOpenAI",
|
||||||
"name": "chatOpenAI",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
|
"name": "chatOpenAI",
|
||||||
"type": "ChatOpenAI",
|
"type": "ChatOpenAI",
|
||||||
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
||||||
"category": "Chat Models",
|
"category": "Chat Models",
|
||||||
@@ -287,7 +287,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"modelName": "gpt-3.5-turbo",
|
"modelName": "gpt-3.5-turbo-16k",
|
||||||
"temperature": 0.9,
|
"temperature": 0.9,
|
||||||
"maxTokens": "",
|
"maxTokens": "",
|
||||||
"topP": "",
|
"topP": "",
|
||||||
@@ -320,17 +320,17 @@
|
|||||||
"height": 383,
|
"height": 383,
|
||||||
"id": "conversationalAgent_0",
|
"id": "conversationalAgent_0",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 1164.4550359451973,
|
"x": 1191.1524476753796,
|
||||||
"y": 283.40041124403075
|
"y": 324.2479396683294
|
||||||
},
|
},
|
||||||
"type": "customNode",
|
"type": "customNode",
|
||||||
"data": {
|
"data": {
|
||||||
"id": "conversationalAgent_0",
|
"id": "conversationalAgent_0",
|
||||||
"label": "Conversational Agent",
|
"label": "Conversational Agent",
|
||||||
|
"version": 2,
|
||||||
"name": "conversationalAgent",
|
"name": "conversationalAgent",
|
||||||
"version": 1,
|
|
||||||
"type": "AgentExecutor",
|
"type": "AgentExecutor",
|
||||||
"baseClasses": ["AgentExecutor", "BaseChain"],
|
"baseClasses": ["AgentExecutor", "BaseChain", "Runnable"],
|
||||||
"category": "Agents",
|
"category": "Agents",
|
||||||
"description": "Conversational agent for a chat model. It will utilize chat specific prompts",
|
"description": "Conversational agent for a chat model. It will utilize chat specific prompts",
|
||||||
"inputParams": [
|
"inputParams": [
|
||||||
@@ -356,8 +356,8 @@
|
|||||||
{
|
{
|
||||||
"label": "Language Model",
|
"label": "Language Model",
|
||||||
"name": "model",
|
"name": "model",
|
||||||
"type": "BaseLanguageModel",
|
"type": "BaseChatModel",
|
||||||
"id": "conversationalAgent_0-input-model-BaseLanguageModel"
|
"id": "conversationalAgent_0-input-model-BaseChatModel"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Memory",
|
"label": "Memory",
|
||||||
@@ -374,10 +374,10 @@
|
|||||||
},
|
},
|
||||||
"outputAnchors": [
|
"outputAnchors": [
|
||||||
{
|
{
|
||||||
"id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain",
|
"id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain|Runnable",
|
||||||
"name": "conversationalAgent",
|
"name": "conversationalAgent",
|
||||||
"label": "AgentExecutor",
|
"label": "AgentExecutor",
|
||||||
"type": "AgentExecutor | BaseChain"
|
"type": "AgentExecutor | BaseChain | Runnable"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"outputs": {},
|
"outputs": {},
|
||||||
@@ -385,8 +385,8 @@
|
|||||||
},
|
},
|
||||||
"selected": false,
|
"selected": false,
|
||||||
"positionAbsolute": {
|
"positionAbsolute": {
|
||||||
"x": 1164.4550359451973,
|
"x": 1191.1524476753796,
|
||||||
"y": 283.40041124403075
|
"y": 324.2479396683294
|
||||||
},
|
},
|
||||||
"dragging": false
|
"dragging": false
|
||||||
}
|
}
|
||||||
@@ -418,9 +418,9 @@
|
|||||||
"source": "chatOpenAI_0",
|
"source": "chatOpenAI_0",
|
||||||
"sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
"sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
||||||
"target": "conversationalAgent_0",
|
"target": "conversationalAgent_0",
|
||||||
"targetHandle": "conversationalAgent_0-input-model-BaseLanguageModel",
|
"targetHandle": "conversationalAgent_0-input-model-BaseChatModel",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseLanguageModel",
|
"id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseChatModel",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "conversationalRetrievalAgent_0",
|
"id": "conversationalRetrievalAgent_0",
|
||||||
"label": "Conversational Retrieval Agent",
|
"label": "Conversational Retrieval Agent",
|
||||||
"version": 2,
|
"version": 3,
|
||||||
"name": "conversationalRetrievalAgent",
|
"name": "conversationalRetrievalAgent",
|
||||||
"type": "AgentExecutor",
|
"type": "AgentExecutor",
|
||||||
"baseClasses": ["AgentExecutor", "BaseChain", "Runnable"],
|
"baseClasses": ["AgentExecutor", "BaseChain", "Runnable"],
|
||||||
@@ -132,8 +132,8 @@
|
|||||||
{
|
{
|
||||||
"label": "OpenAI/Azure Chat Model",
|
"label": "OpenAI/Azure Chat Model",
|
||||||
"name": "model",
|
"name": "model",
|
||||||
"type": "ChatOpenAI | AzureChatOpenAI",
|
"type": "BaseChatModel",
|
||||||
"id": "conversationalRetrievalAgent_0-input-model-ChatOpenAI | AzureChatOpenAI"
|
"id": "conversationalRetrievalAgent_0-input-model-BaseChatModel"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"inputs": {
|
"inputs": {
|
||||||
@@ -642,9 +642,9 @@
|
|||||||
"source": "chatOpenAI_0",
|
"source": "chatOpenAI_0",
|
||||||
"sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable",
|
"sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable",
|
||||||
"target": "conversationalRetrievalAgent_0",
|
"target": "conversationalRetrievalAgent_0",
|
||||||
"targetHandle": "conversationalRetrievalAgent_0-input-model-ChatOpenAI",
|
"targetHandle": "conversationalRetrievalAgent_0-input-model-BaseChatModel",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable-conversationalRetrievalAgent_0-conversationalRetrievalAgent_0-input-model-ChatOpenAI",
|
"id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable-conversationalRetrievalAgent_0-conversationalRetrievalAgent_0-input-model-BaseChatModel",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -205,7 +205,7 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "ZepMemory_0",
|
"id": "ZepMemory_0",
|
||||||
"label": "Zep Memory",
|
"label": "Zep Memory",
|
||||||
"version": 1,
|
"version": 2,
|
||||||
"name": "ZepMemory",
|
"name": "ZepMemory",
|
||||||
"type": "ZepMemory",
|
"type": "ZepMemory",
|
||||||
"baseClasses": ["ZepMemory", "BaseChatMemory", "BaseMemory"],
|
"baseClasses": ["ZepMemory", "BaseChatMemory", "BaseMemory"],
|
||||||
@@ -228,13 +228,6 @@
|
|||||||
"default": "http://127.0.0.1:8000",
|
"default": "http://127.0.0.1:8000",
|
||||||
"id": "ZepMemory_0-input-baseURL-string"
|
"id": "ZepMemory_0-input-baseURL-string"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"label": "Auto Summary",
|
|
||||||
"name": "autoSummary",
|
|
||||||
"type": "boolean",
|
|
||||||
"default": true,
|
|
||||||
"id": "ZepMemory_0-input-autoSummary-boolean"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "Session Id",
|
"label": "Session Id",
|
||||||
"name": "sessionId",
|
"name": "sessionId",
|
||||||
@@ -251,17 +244,10 @@
|
|||||||
"type": "number",
|
"type": "number",
|
||||||
"default": "10",
|
"default": "10",
|
||||||
"step": 1,
|
"step": 1,
|
||||||
|
"additionalParams": true,
|
||||||
"description": "Window of size k to surface the last k back-and-forths to use as memory.",
|
"description": "Window of size k to surface the last k back-and-forths to use as memory.",
|
||||||
"id": "ZepMemory_0-input-k-number"
|
"id": "ZepMemory_0-input-k-number"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"label": "Auto Summary Template",
|
|
||||||
"name": "autoSummaryTemplate",
|
|
||||||
"type": "string",
|
|
||||||
"default": "This is the summary of the following conversation:\n{summary}",
|
|
||||||
"additionalParams": true,
|
|
||||||
"id": "ZepMemory_0-input-autoSummaryTemplate-string"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "AI Prefix",
|
"label": "AI Prefix",
|
||||||
"name": "aiPrefix",
|
"name": "aiPrefix",
|
||||||
@@ -306,10 +292,8 @@
|
|||||||
"inputAnchors": [],
|
"inputAnchors": [],
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"baseURL": "http://127.0.0.1:8000",
|
"baseURL": "http://127.0.0.1:8000",
|
||||||
"autoSummary": true,
|
|
||||||
"sessionId": "",
|
"sessionId": "",
|
||||||
"k": "10",
|
"k": "10",
|
||||||
"autoSummaryTemplate": "This is the summary of the following conversation:\n{summary}",
|
|
||||||
"aiPrefix": "ai",
|
"aiPrefix": "ai",
|
||||||
"humanPrefix": "human",
|
"humanPrefix": "human",
|
||||||
"memoryKey": "chat_history",
|
"memoryKey": "chat_history",
|
||||||
|
|||||||
@@ -1127,81 +1127,6 @@
|
|||||||
},
|
},
|
||||||
"dragging": false
|
"dragging": false
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"width": 300,
|
|
||||||
"height": 383,
|
|
||||||
"id": "conversationalAgent_0",
|
|
||||||
"position": {
|
|
||||||
"x": 2506.011817109287,
|
|
||||||
"y": -241.58006840004734
|
|
||||||
},
|
|
||||||
"type": "customNode",
|
|
||||||
"data": {
|
|
||||||
"id": "conversationalAgent_0",
|
|
||||||
"label": "Conversational Agent",
|
|
||||||
"version": 1,
|
|
||||||
"name": "conversationalAgent",
|
|
||||||
"type": "AgentExecutor",
|
|
||||||
"baseClasses": ["AgentExecutor", "BaseChain", "Runnable"],
|
|
||||||
"category": "Agents",
|
|
||||||
"description": "Conversational agent for a chat model. It will utilize chat specific prompts",
|
|
||||||
"inputParams": [
|
|
||||||
{
|
|
||||||
"label": "System Message",
|
|
||||||
"name": "systemMessage",
|
|
||||||
"type": "string",
|
|
||||||
"rows": 4,
|
|
||||||
"default": "Assistant is a large language model trained by OpenAI.\n\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\n\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\n\nOverall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist.",
|
|
||||||
"optional": true,
|
|
||||||
"additionalParams": true,
|
|
||||||
"id": "conversationalAgent_0-input-systemMessage-string"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"inputAnchors": [
|
|
||||||
{
|
|
||||||
"label": "Allowed Tools",
|
|
||||||
"name": "tools",
|
|
||||||
"type": "Tool",
|
|
||||||
"list": true,
|
|
||||||
"id": "conversationalAgent_0-input-tools-Tool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Language Model",
|
|
||||||
"name": "model",
|
|
||||||
"type": "BaseLanguageModel",
|
|
||||||
"id": "conversationalAgent_0-input-model-BaseLanguageModel"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Memory",
|
|
||||||
"name": "memory",
|
|
||||||
"type": "BaseChatMemory",
|
|
||||||
"id": "conversationalAgent_0-input-memory-BaseChatMemory"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"inputs": {
|
|
||||||
"tools": ["{{chainTool_2.data.instance}}", "{{chainTool_3.data.instance}}"],
|
|
||||||
"model": "{{chatOpenAI_2.data.instance}}",
|
|
||||||
"memory": "{{bufferMemory_0.data.instance}}",
|
|
||||||
"systemMessage": "Assistant is a large language model trained by OpenAI.\n\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\n\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\n\nOverall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist."
|
|
||||||
},
|
|
||||||
"outputAnchors": [
|
|
||||||
{
|
|
||||||
"id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain|Runnable",
|
|
||||||
"name": "conversationalAgent",
|
|
||||||
"label": "AgentExecutor",
|
|
||||||
"type": "AgentExecutor | BaseChain | Runnable"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": {},
|
|
||||||
"selected": false
|
|
||||||
},
|
|
||||||
"selected": false,
|
|
||||||
"positionAbsolute": {
|
|
||||||
"x": 2506.011817109287,
|
|
||||||
"y": -241.58006840004734
|
|
||||||
},
|
|
||||||
"dragging": false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 574,
|
"height": 574,
|
||||||
@@ -1602,6 +1527,81 @@
|
|||||||
"y": 75.96855802341503
|
"y": 75.96855802341503
|
||||||
},
|
},
|
||||||
"dragging": false
|
"dragging": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"width": 300,
|
||||||
|
"height": 383,
|
||||||
|
"id": "conversationalAgent_0",
|
||||||
|
"position": {
|
||||||
|
"x": 2432.125364763489,
|
||||||
|
"y": -105.27942167533908
|
||||||
|
},
|
||||||
|
"type": "customNode",
|
||||||
|
"data": {
|
||||||
|
"id": "conversationalAgent_0",
|
||||||
|
"label": "Conversational Agent",
|
||||||
|
"version": 2,
|
||||||
|
"name": "conversationalAgent",
|
||||||
|
"type": "AgentExecutor",
|
||||||
|
"baseClasses": ["AgentExecutor", "BaseChain", "Runnable"],
|
||||||
|
"category": "Agents",
|
||||||
|
"description": "Conversational agent for a chat model. It will utilize chat specific prompts",
|
||||||
|
"inputParams": [
|
||||||
|
{
|
||||||
|
"label": "System Message",
|
||||||
|
"name": "systemMessage",
|
||||||
|
"type": "string",
|
||||||
|
"rows": 4,
|
||||||
|
"default": "Assistant is a large language model trained by OpenAI.\n\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\n\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\n\nOverall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist.",
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "conversationalAgent_0-input-systemMessage-string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputAnchors": [
|
||||||
|
{
|
||||||
|
"label": "Allowed Tools",
|
||||||
|
"name": "tools",
|
||||||
|
"type": "Tool",
|
||||||
|
"list": true,
|
||||||
|
"id": "conversationalAgent_0-input-tools-Tool"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Language Model",
|
||||||
|
"name": "model",
|
||||||
|
"type": "BaseChatModel",
|
||||||
|
"id": "conversationalAgent_0-input-model-BaseChatModel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Memory",
|
||||||
|
"name": "memory",
|
||||||
|
"type": "BaseChatMemory",
|
||||||
|
"id": "conversationalAgent_0-input-memory-BaseChatMemory"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputs": {
|
||||||
|
"tools": ["{{chainTool_2.data.instance}}", "{{chainTool_3.data.instance}}"],
|
||||||
|
"model": "{{chatOpenAI_2.data.instance}}",
|
||||||
|
"memory": "{{bufferMemory_0.data.instance}}",
|
||||||
|
"systemMessage": "Assistant is a large language model trained by OpenAI.\n\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\n\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\n\nOverall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist."
|
||||||
|
},
|
||||||
|
"outputAnchors": [
|
||||||
|
{
|
||||||
|
"id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain|Runnable",
|
||||||
|
"name": "conversationalAgent",
|
||||||
|
"label": "AgentExecutor",
|
||||||
|
"type": "AgentExecutor | BaseChain | Runnable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": {},
|
||||||
|
"selected": false
|
||||||
|
},
|
||||||
|
"selected": false,
|
||||||
|
"positionAbsolute": {
|
||||||
|
"x": 2432.125364763489,
|
||||||
|
"y": -105.27942167533908
|
||||||
|
},
|
||||||
|
"dragging": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"edges": [
|
"edges": [
|
||||||
@@ -1704,6 +1704,28 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"source": "plainText_1",
|
||||||
|
"sourceHandle": "plainText_1-output-document-Document",
|
||||||
|
"target": "faiss_0",
|
||||||
|
"targetHandle": "faiss_0-input-document-Document",
|
||||||
|
"type": "buttonedge",
|
||||||
|
"id": "plainText_1-plainText_1-output-document-Document-faiss_0-faiss_0-input-document-Document",
|
||||||
|
"data": {
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "recursiveCharacterTextSplitter_0",
|
||||||
|
"sourceHandle": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable",
|
||||||
|
"target": "plainText_1",
|
||||||
|
"targetHandle": "plainText_1-input-textSplitter-TextSplitter",
|
||||||
|
"type": "buttonedge",
|
||||||
|
"id": "recursiveCharacterTextSplitter_0-recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable-plainText_1-plainText_1-input-textSplitter-TextSplitter",
|
||||||
|
"data": {
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"source": "chainTool_2",
|
"source": "chainTool_2",
|
||||||
"sourceHandle": "chainTool_2-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool|BaseLangChain",
|
"sourceHandle": "chainTool_2-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool|BaseLangChain",
|
||||||
@@ -1730,9 +1752,9 @@
|
|||||||
"source": "chatOpenAI_2",
|
"source": "chatOpenAI_2",
|
||||||
"sourceHandle": "chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable",
|
"sourceHandle": "chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable",
|
||||||
"target": "conversationalAgent_0",
|
"target": "conversationalAgent_0",
|
||||||
"targetHandle": "conversationalAgent_0-input-model-BaseLanguageModel",
|
"targetHandle": "conversationalAgent_0-input-model-BaseChatModel",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "chatOpenAI_2-chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable-conversationalAgent_0-conversationalAgent_0-input-model-BaseLanguageModel",
|
"id": "chatOpenAI_2-chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable-conversationalAgent_0-conversationalAgent_0-input-model-BaseChatModel",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
@@ -1747,28 +1769,6 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"source": "plainText_1",
|
|
||||||
"sourceHandle": "plainText_1-output-document-Document",
|
|
||||||
"target": "faiss_0",
|
|
||||||
"targetHandle": "faiss_0-input-document-Document",
|
|
||||||
"type": "buttonedge",
|
|
||||||
"id": "plainText_1-plainText_1-output-document-Document-faiss_0-faiss_0-input-document-Document",
|
|
||||||
"data": {
|
|
||||||
"label": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"source": "recursiveCharacterTextSplitter_0",
|
|
||||||
"sourceHandle": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable",
|
|
||||||
"target": "plainText_1",
|
|
||||||
"targetHandle": "plainText_1-input-textSplitter-TextSplitter",
|
|
||||||
"type": "buttonedge",
|
|
||||||
"id": "recursiveCharacterTextSplitter_0-recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable-plainText_1-plainText_1-input-textSplitter-TextSplitter",
|
|
||||||
"data": {
|
|
||||||
"label": ""
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "calculator_0",
|
"id": "calculator_0",
|
||||||
"label": "Calculator",
|
"label": "Calculator",
|
||||||
"name": "calculator",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "calculator",
|
||||||
"type": "Calculator",
|
"type": "Calculator",
|
||||||
"baseClasses": ["Calculator", "Tool", "StructuredTool", "BaseLangChain", "Serializable"],
|
"baseClasses": ["Calculator", "Tool", "StructuredTool", "BaseLangChain", "Serializable"],
|
||||||
"category": "Tools",
|
"category": "Tools",
|
||||||
@@ -52,8 +52,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "bufferMemory_0",
|
"id": "bufferMemory_0",
|
||||||
"label": "Buffer Memory",
|
"label": "Buffer Memory",
|
||||||
"name": "bufferMemory",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "bufferMemory",
|
||||||
"type": "BufferMemory",
|
"type": "BufferMemory",
|
||||||
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
||||||
"category": "Memory",
|
"category": "Memory",
|
||||||
@@ -109,8 +109,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "customTool_0",
|
"id": "customTool_0",
|
||||||
"label": "Custom Tool",
|
"label": "Custom Tool",
|
||||||
"name": "customTool",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "customTool",
|
||||||
"type": "CustomTool",
|
"type": "CustomTool",
|
||||||
"baseClasses": ["CustomTool", "Tool", "StructuredTool"],
|
"baseClasses": ["CustomTool", "Tool", "StructuredTool"],
|
||||||
"category": "Tools",
|
"category": "Tools",
|
||||||
@@ -158,8 +158,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "serper_0",
|
"id": "serper_0",
|
||||||
"label": "Serper",
|
"label": "Serper",
|
||||||
"name": "serper",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "serper",
|
||||||
"type": "Serper",
|
"type": "Serper",
|
||||||
"baseClasses": ["Serper", "Tool", "StructuredTool"],
|
"baseClasses": ["Serper", "Tool", "StructuredTool"],
|
||||||
"category": "Tools",
|
"category": "Tools",
|
||||||
@@ -206,7 +206,7 @@
|
|||||||
"id": "openAIFunctionAgent_0",
|
"id": "openAIFunctionAgent_0",
|
||||||
"label": "OpenAI Function Agent",
|
"label": "OpenAI Function Agent",
|
||||||
"name": "openAIFunctionAgent",
|
"name": "openAIFunctionAgent",
|
||||||
"version": 2,
|
"version": 3,
|
||||||
"type": "AgentExecutor",
|
"type": "AgentExecutor",
|
||||||
"baseClasses": ["AgentExecutor", "BaseChain"],
|
"baseClasses": ["AgentExecutor", "BaseChain"],
|
||||||
"category": "Agents",
|
"category": "Agents",
|
||||||
@@ -239,8 +239,8 @@
|
|||||||
{
|
{
|
||||||
"label": "OpenAI/Azure Chat Model",
|
"label": "OpenAI/Azure Chat Model",
|
||||||
"name": "model",
|
"name": "model",
|
||||||
"type": "ChatOpenAI | AzureChatOpenAI",
|
"type": "BaseChatModel",
|
||||||
"id": "openAIFunctionAgent_0-input-model-ChatOpenAI | AzureChatOpenAI"
|
"id": "openAIFunctionAgent_0-input-model-BaseChatModel"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"inputs": {
|
"inputs": {
|
||||||
@@ -269,7 +269,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 523,
|
"height": 574,
|
||||||
"id": "chatOpenAI_0",
|
"id": "chatOpenAI_0",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 817.8210275868742,
|
"x": 817.8210275868742,
|
||||||
@@ -279,8 +279,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chatOpenAI_0",
|
"id": "chatOpenAI_0",
|
||||||
"label": "ChatOpenAI",
|
"label": "ChatOpenAI",
|
||||||
"name": "chatOpenAI",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
|
"name": "chatOpenAI",
|
||||||
"type": "ChatOpenAI",
|
"type": "ChatOpenAI",
|
||||||
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
||||||
"category": "Chat Models",
|
"category": "Chat Models",
|
||||||
@@ -473,17 +473,6 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"source": "chatOpenAI_0",
|
|
||||||
"sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
|
||||||
"target": "openAIFunctionAgent_0",
|
|
||||||
"targetHandle": "openAIFunctionAgent_0-input-model-BaseChatModel",
|
|
||||||
"type": "buttonedge",
|
|
||||||
"id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-openAIFunctionAgent_0-openAIFunctionAgent_0-input-model-BaseChatModel",
|
|
||||||
"data": {
|
|
||||||
"label": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"source": "bufferMemory_0",
|
"source": "bufferMemory_0",
|
||||||
"sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory",
|
"sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory",
|
||||||
@@ -494,6 +483,17 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "chatOpenAI_0",
|
||||||
|
"sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
||||||
|
"target": "openAIFunctionAgent_0",
|
||||||
|
"targetHandle": "openAIFunctionAgent_0-input-model-BaseChatModel",
|
||||||
|
"type": "buttonedge",
|
||||||
|
"id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-openAIFunctionAgent_0-openAIFunctionAgent_0-input-model-BaseChatModel",
|
||||||
|
"data": {
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "openAIAssistant_0",
|
"id": "openAIAssistant_0",
|
||||||
"label": "OpenAI Assistant",
|
"label": "OpenAI Assistant",
|
||||||
"version": 1,
|
"version": 2,
|
||||||
"name": "openAIAssistant",
|
"name": "openAIAssistant",
|
||||||
"type": "OpenAIAssistant",
|
"type": "OpenAIAssistant",
|
||||||
"baseClasses": ["OpenAIAssistant"],
|
"baseClasses": ["OpenAIAssistant"],
|
||||||
@@ -27,6 +27,15 @@
|
|||||||
"type": "asyncOptions",
|
"type": "asyncOptions",
|
||||||
"loadMethod": "listAssistants",
|
"loadMethod": "listAssistants",
|
||||||
"id": "openAIAssistant_0-input-selectedAssistant-asyncOptions"
|
"id": "openAIAssistant_0-input-selectedAssistant-asyncOptions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Disable File Download",
|
||||||
|
"name": "disableFileDownload",
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Messages can contain text, images, or files. In some cases, you may want to prevent others from downloading the files. Learn more from OpenAI File Annotation <a target=\"_blank\" href=\"https://platform.openai.com/docs/assistants/how-it-works/managing-threads-and-messages\">docs</a>",
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "openAIAssistant_0-input-disableFileDownload-boolean"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"inputAnchors": [
|
"inputAnchors": [
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "bufferMemory_0",
|
"id": "bufferMemory_0",
|
||||||
"label": "Buffer Memory",
|
"label": "Buffer Memory",
|
||||||
"name": "bufferMemory",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "bufferMemory",
|
||||||
"type": "BufferMemory",
|
"type": "BufferMemory",
|
||||||
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
|
||||||
"category": "Memory",
|
"category": "Memory",
|
||||||
@@ -70,8 +70,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "webBrowser_0",
|
"id": "webBrowser_0",
|
||||||
"label": "Web Browser",
|
"label": "Web Browser",
|
||||||
"name": "webBrowser",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "webBrowser",
|
||||||
"type": "WebBrowser",
|
"type": "WebBrowser",
|
||||||
"baseClasses": ["WebBrowser", "Tool", "StructuredTool", "BaseLangChain"],
|
"baseClasses": ["WebBrowser", "Tool", "StructuredTool", "BaseLangChain"],
|
||||||
"category": "Tools",
|
"category": "Tools",
|
||||||
@@ -115,82 +115,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 383,
|
"height": 574,
|
||||||
"id": "conversationalAgent_0",
|
|
||||||
"position": {
|
|
||||||
"x": 1464.513303631911,
|
|
||||||
"y": 155.73036805253955
|
|
||||||
},
|
|
||||||
"type": "customNode",
|
|
||||||
"data": {
|
|
||||||
"id": "conversationalAgent_0",
|
|
||||||
"label": "Conversational Agent",
|
|
||||||
"name": "conversationalAgent",
|
|
||||||
"version": 1,
|
|
||||||
"type": "AgentExecutor",
|
|
||||||
"baseClasses": ["AgentExecutor", "BaseChain"],
|
|
||||||
"category": "Agents",
|
|
||||||
"description": "Conversational agent for a chat model. It will utilize chat specific prompts",
|
|
||||||
"inputParams": [
|
|
||||||
{
|
|
||||||
"label": "System Message",
|
|
||||||
"name": "systemMessage",
|
|
||||||
"type": "string",
|
|
||||||
"rows": 4,
|
|
||||||
"default": "Assistant is a large language model trained by OpenAI.\n\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\n\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\n\nOverall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist.",
|
|
||||||
"optional": true,
|
|
||||||
"additionalParams": true,
|
|
||||||
"id": "conversationalAgent_0-input-systemMessage-string"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"inputAnchors": [
|
|
||||||
{
|
|
||||||
"label": "Allowed Tools",
|
|
||||||
"name": "tools",
|
|
||||||
"type": "Tool",
|
|
||||||
"list": true,
|
|
||||||
"id": "conversationalAgent_0-input-tools-Tool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Language Model",
|
|
||||||
"name": "model",
|
|
||||||
"type": "BaseLanguageModel",
|
|
||||||
"id": "conversationalAgent_0-input-model-BaseLanguageModel"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Memory",
|
|
||||||
"name": "memory",
|
|
||||||
"type": "BaseChatMemory",
|
|
||||||
"id": "conversationalAgent_0-input-memory-BaseChatMemory"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"inputs": {
|
|
||||||
"tools": ["{{webBrowser_0.data.instance}}"],
|
|
||||||
"model": "{{chatOpenAI_1.data.instance}}",
|
|
||||||
"memory": "{{bufferMemory_0.data.instance}}",
|
|
||||||
"systemMessage": "Assistant is a large language model trained by OpenAI.\n\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\n\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\n\nOverall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist."
|
|
||||||
},
|
|
||||||
"outputAnchors": [
|
|
||||||
{
|
|
||||||
"id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain",
|
|
||||||
"name": "conversationalAgent",
|
|
||||||
"label": "AgentExecutor",
|
|
||||||
"type": "AgentExecutor | BaseChain"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"outputs": {},
|
|
||||||
"selected": false
|
|
||||||
},
|
|
||||||
"selected": false,
|
|
||||||
"positionAbsolute": {
|
|
||||||
"x": 1464.513303631911,
|
|
||||||
"y": 155.73036805253955
|
|
||||||
},
|
|
||||||
"dragging": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"width": 300,
|
|
||||||
"height": 523,
|
|
||||||
"id": "chatOpenAI_0",
|
"id": "chatOpenAI_0",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 734.7477982032904,
|
"x": 734.7477982032904,
|
||||||
@@ -200,8 +125,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chatOpenAI_0",
|
"id": "chatOpenAI_0",
|
||||||
"label": "ChatOpenAI",
|
"label": "ChatOpenAI",
|
||||||
"name": "chatOpenAI",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
|
"name": "chatOpenAI",
|
||||||
"type": "ChatOpenAI",
|
"type": "ChatOpenAI",
|
||||||
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
||||||
"category": "Chat Models",
|
"category": "Chat Models",
|
||||||
@@ -371,8 +296,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "openAIEmbeddings_0",
|
"id": "openAIEmbeddings_0",
|
||||||
"label": "OpenAI Embeddings",
|
"label": "OpenAI Embeddings",
|
||||||
"name": "openAIEmbeddings",
|
|
||||||
"version": 1,
|
"version": 1,
|
||||||
|
"name": "openAIEmbeddings",
|
||||||
"type": "OpenAIEmbeddings",
|
"type": "OpenAIEmbeddings",
|
||||||
"baseClasses": ["OpenAIEmbeddings", "Embeddings"],
|
"baseClasses": ["OpenAIEmbeddings", "Embeddings"],
|
||||||
"category": "Embeddings",
|
"category": "Embeddings",
|
||||||
@@ -445,7 +370,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
"height": 523,
|
"height": 574,
|
||||||
"id": "chatOpenAI_1",
|
"id": "chatOpenAI_1",
|
||||||
"position": {
|
"position": {
|
||||||
"x": 68.312124033115,
|
"x": 68.312124033115,
|
||||||
@@ -455,8 +380,8 @@
|
|||||||
"data": {
|
"data": {
|
||||||
"id": "chatOpenAI_1",
|
"id": "chatOpenAI_1",
|
||||||
"label": "ChatOpenAI",
|
"label": "ChatOpenAI",
|
||||||
"name": "chatOpenAI",
|
|
||||||
"version": 2,
|
"version": 2,
|
||||||
|
"name": "chatOpenAI",
|
||||||
"type": "ChatOpenAI",
|
"type": "ChatOpenAI",
|
||||||
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"],
|
||||||
"category": "Chat Models",
|
"category": "Chat Models",
|
||||||
@@ -586,7 +511,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"modelName": "gpt-3.5-turbo",
|
"modelName": "gpt-3.5-turbo-16k",
|
||||||
"temperature": 0.9,
|
"temperature": 0.9,
|
||||||
"maxTokens": "",
|
"maxTokens": "",
|
||||||
"topP": "",
|
"topP": "",
|
||||||
@@ -613,6 +538,81 @@
|
|||||||
"y": -239.65476709991256
|
"y": -239.65476709991256
|
||||||
},
|
},
|
||||||
"dragging": false
|
"dragging": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"width": 300,
|
||||||
|
"height": 383,
|
||||||
|
"id": "conversationalAgent_0",
|
||||||
|
"position": {
|
||||||
|
"x": 1518.944765840293,
|
||||||
|
"y": 212.2513364217197
|
||||||
|
},
|
||||||
|
"type": "customNode",
|
||||||
|
"data": {
|
||||||
|
"id": "conversationalAgent_0",
|
||||||
|
"label": "Conversational Agent",
|
||||||
|
"version": 2,
|
||||||
|
"name": "conversationalAgent",
|
||||||
|
"type": "AgentExecutor",
|
||||||
|
"baseClasses": ["AgentExecutor", "BaseChain", "Runnable"],
|
||||||
|
"category": "Agents",
|
||||||
|
"description": "Conversational agent for a chat model. It will utilize chat specific prompts",
|
||||||
|
"inputParams": [
|
||||||
|
{
|
||||||
|
"label": "System Message",
|
||||||
|
"name": "systemMessage",
|
||||||
|
"type": "string",
|
||||||
|
"rows": 4,
|
||||||
|
"default": "Assistant is a large language model trained by OpenAI.\n\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\n\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\n\nOverall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist.",
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "conversationalAgent_0-input-systemMessage-string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputAnchors": [
|
||||||
|
{
|
||||||
|
"label": "Allowed Tools",
|
||||||
|
"name": "tools",
|
||||||
|
"type": "Tool",
|
||||||
|
"list": true,
|
||||||
|
"id": "conversationalAgent_0-input-tools-Tool"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Language Model",
|
||||||
|
"name": "model",
|
||||||
|
"type": "BaseChatModel",
|
||||||
|
"id": "conversationalAgent_0-input-model-BaseChatModel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Memory",
|
||||||
|
"name": "memory",
|
||||||
|
"type": "BaseChatMemory",
|
||||||
|
"id": "conversationalAgent_0-input-memory-BaseChatMemory"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputs": {
|
||||||
|
"tools": ["{{webBrowser_0.data.instance}}"],
|
||||||
|
"model": "{{chatOpenAI_1.data.instance}}",
|
||||||
|
"memory": "{{bufferMemory_0.data.instance}}",
|
||||||
|
"systemMessage": "Assistant is a large language model trained by OpenAI.\n\nAssistant is designed to be able to assist with a wide range of tasks, from answering simple questions to providing in-depth explanations and discussions on a wide range of topics. As a language model, Assistant is able to generate human-like text based on the input it receives, allowing it to engage in natural-sounding conversations and provide responses that are coherent and relevant to the topic at hand.\n\nAssistant is constantly learning and improving, and its capabilities are constantly evolving. It is able to process and understand large amounts of text, and can use this knowledge to provide accurate and informative responses to a wide range of questions. Additionally, Assistant is able to generate its own text based on the input it receives, allowing it to engage in discussions and provide explanations and descriptions on a wide range of topics.\n\nOverall, Assistant is a powerful system that can help with a wide range of tasks and provide valuable insights and information on a wide range of topics. Whether you need help with a specific question or just want to have a conversation about a particular topic, Assistant is here to assist."
|
||||||
|
},
|
||||||
|
"outputAnchors": [
|
||||||
|
{
|
||||||
|
"id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain|Runnable",
|
||||||
|
"name": "conversationalAgent",
|
||||||
|
"label": "AgentExecutor",
|
||||||
|
"type": "AgentExecutor | BaseChain | Runnable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": {},
|
||||||
|
"selected": false
|
||||||
|
},
|
||||||
|
"selected": false,
|
||||||
|
"positionAbsolute": {
|
||||||
|
"x": 1518.944765840293,
|
||||||
|
"y": 212.2513364217197
|
||||||
|
},
|
||||||
|
"dragging": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"edges": [
|
"edges": [
|
||||||
@@ -638,17 +638,6 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"source": "chatOpenAI_1",
|
|
||||||
"sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
|
||||||
"target": "conversationalAgent_0",
|
|
||||||
"targetHandle": "conversationalAgent_0-input-model-BaseLanguageModel",
|
|
||||||
"type": "buttonedge",
|
|
||||||
"id": "chatOpenAI_1-chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseLanguageModel",
|
|
||||||
"data": {
|
|
||||||
"label": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"source": "webBrowser_0",
|
"source": "webBrowser_0",
|
||||||
"sourceHandle": "webBrowser_0-output-webBrowser-WebBrowser|Tool|StructuredTool|BaseLangChain",
|
"sourceHandle": "webBrowser_0-output-webBrowser-WebBrowser|Tool|StructuredTool|BaseLangChain",
|
||||||
@@ -660,6 +649,17 @@
|
|||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"source": "chatOpenAI_1",
|
||||||
|
"sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel",
|
||||||
|
"target": "conversationalAgent_0",
|
||||||
|
"targetHandle": "conversationalAgent_0-input-model-BaseChatModel",
|
||||||
|
"type": "buttonedge",
|
||||||
|
"id": "chatOpenAI_1-chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseChatModel",
|
||||||
|
"data": {
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"source": "bufferMemory_0",
|
"source": "bufferMemory_0",
|
||||||
"sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory",
|
"sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory",
|
||||||
|
|||||||
@@ -192,12 +192,6 @@ export interface IOverrideConfig {
|
|||||||
type: string
|
type: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IDatabaseExport {
|
|
||||||
chatmessages: IChatMessage[]
|
|
||||||
chatflows: IChatFlow[]
|
|
||||||
apikeys: ICommonObject[]
|
|
||||||
}
|
|
||||||
|
|
||||||
export type ICredentialDataDecrypted = ICommonObject
|
export type ICredentialDataDecrypted = ICommonObject
|
||||||
|
|
||||||
// Plain credential object sent to server
|
// Plain credential object sent to server
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import {
|
|||||||
IReactFlowNode,
|
IReactFlowNode,
|
||||||
IReactFlowObject,
|
IReactFlowObject,
|
||||||
INodeData,
|
INodeData,
|
||||||
IDatabaseExport,
|
|
||||||
ICredentialReturnResponse,
|
ICredentialReturnResponse,
|
||||||
chatType,
|
chatType,
|
||||||
IChatMessage,
|
IChatMessage,
|
||||||
@@ -31,18 +30,11 @@ import {
|
|||||||
constructGraphs,
|
constructGraphs,
|
||||||
resolveVariables,
|
resolveVariables,
|
||||||
isStartNodeDependOnInput,
|
isStartNodeDependOnInput,
|
||||||
getAPIKeys,
|
|
||||||
addAPIKey,
|
|
||||||
updateAPIKey,
|
|
||||||
deleteAPIKey,
|
|
||||||
compareKeys,
|
|
||||||
mapMimeTypeToInputField,
|
mapMimeTypeToInputField,
|
||||||
findAvailableConfigs,
|
findAvailableConfigs,
|
||||||
isSameOverrideConfig,
|
isSameOverrideConfig,
|
||||||
replaceAllAPIKeys,
|
|
||||||
isFlowValidForStream,
|
isFlowValidForStream,
|
||||||
databaseEntities,
|
databaseEntities,
|
||||||
getApiKey,
|
|
||||||
transformToCredentialEntity,
|
transformToCredentialEntity,
|
||||||
decryptCredentialData,
|
decryptCredentialData,
|
||||||
clearAllSessionMemory,
|
clearAllSessionMemory,
|
||||||
@@ -50,7 +42,8 @@ import {
|
|||||||
getEncryptionKey,
|
getEncryptionKey,
|
||||||
checkMemorySessionId,
|
checkMemorySessionId,
|
||||||
clearSessionMemoryFromViewMessageDialog,
|
clearSessionMemoryFromViewMessageDialog,
|
||||||
getUserHome
|
getUserHome,
|
||||||
|
replaceChatHistory
|
||||||
} from './utils'
|
} from './utils'
|
||||||
import { cloneDeep, omit, uniqWith, isEqual } from 'lodash'
|
import { cloneDeep, omit, uniqWith, isEqual } from 'lodash'
|
||||||
import { getDataSource } from './DataSource'
|
import { getDataSource } from './DataSource'
|
||||||
@@ -62,8 +55,9 @@ import { Tool } from './database/entities/Tool'
|
|||||||
import { Assistant } from './database/entities/Assistant'
|
import { Assistant } from './database/entities/Assistant'
|
||||||
import { ChatflowPool } from './ChatflowPool'
|
import { ChatflowPool } from './ChatflowPool'
|
||||||
import { CachePool } from './CachePool'
|
import { CachePool } from './CachePool'
|
||||||
import { ICommonObject, INodeOptionsValue } from 'flowise-components'
|
import { ICommonObject, IMessage, INodeOptionsValue } from 'flowise-components'
|
||||||
import { createRateLimiter, getRateLimiter, initializeRateLimiter } from './utils/rateLimit'
|
import { createRateLimiter, getRateLimiter, initializeRateLimiter } from './utils/rateLimit'
|
||||||
|
import { addAPIKey, compareKeys, deleteAPIKey, getApiKey, getAPIKeys, updateAPIKey } from './utils/apiKey'
|
||||||
|
|
||||||
export class App {
|
export class App {
|
||||||
app: express.Application
|
app: express.Application
|
||||||
@@ -1036,57 +1030,6 @@ export class App {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// ----------------------------------------
|
|
||||||
// Export Load Chatflow & ChatMessage & Apikeys
|
|
||||||
// ----------------------------------------
|
|
||||||
|
|
||||||
this.app.get('/api/v1/database/export', async (req: Request, res: Response) => {
|
|
||||||
const chatmessages = await this.AppDataSource.getRepository(ChatMessage).find()
|
|
||||||
const chatflows = await this.AppDataSource.getRepository(ChatFlow).find()
|
|
||||||
const apikeys = await getAPIKeys()
|
|
||||||
const result: IDatabaseExport = {
|
|
||||||
chatmessages,
|
|
||||||
chatflows,
|
|
||||||
apikeys
|
|
||||||
}
|
|
||||||
return res.json(result)
|
|
||||||
})
|
|
||||||
|
|
||||||
this.app.post('/api/v1/database/load', async (req: Request, res: Response) => {
|
|
||||||
const databaseItems: IDatabaseExport = req.body
|
|
||||||
|
|
||||||
await this.AppDataSource.getRepository(ChatFlow).delete({})
|
|
||||||
await this.AppDataSource.getRepository(ChatMessage).delete({})
|
|
||||||
|
|
||||||
let error = ''
|
|
||||||
|
|
||||||
// Get a new query runner instance
|
|
||||||
const queryRunner = this.AppDataSource.createQueryRunner()
|
|
||||||
|
|
||||||
// Start a new transaction
|
|
||||||
await queryRunner.startTransaction()
|
|
||||||
|
|
||||||
try {
|
|
||||||
const chatflows: ChatFlow[] = databaseItems.chatflows
|
|
||||||
const chatmessages: ChatMessage[] = databaseItems.chatmessages
|
|
||||||
|
|
||||||
await queryRunner.manager.insert(ChatFlow, chatflows)
|
|
||||||
await queryRunner.manager.insert(ChatMessage, chatmessages)
|
|
||||||
|
|
||||||
await queryRunner.commitTransaction()
|
|
||||||
} catch (err: any) {
|
|
||||||
error = err?.message ?? 'Error loading database'
|
|
||||||
await queryRunner.rollbackTransaction()
|
|
||||||
} finally {
|
|
||||||
await queryRunner.release()
|
|
||||||
}
|
|
||||||
|
|
||||||
await replaceAllAPIKeys(databaseItems.apikeys)
|
|
||||||
|
|
||||||
if (error) return res.status(500).send(error)
|
|
||||||
return res.status(201).send('OK')
|
|
||||||
})
|
|
||||||
|
|
||||||
// ----------------------------------------
|
// ----------------------------------------
|
||||||
// Upsert
|
// Upsert
|
||||||
// ----------------------------------------
|
// ----------------------------------------
|
||||||
@@ -1363,14 +1306,14 @@ export class App {
|
|||||||
* @param {IReactFlowEdge[]} edges
|
* @param {IReactFlowEdge[]} edges
|
||||||
* @returns {string | undefined}
|
* @returns {string | undefined}
|
||||||
*/
|
*/
|
||||||
findMemoryLabel(nodes: IReactFlowNode[], edges: IReactFlowEdge[]): string | undefined {
|
findMemoryLabel(nodes: IReactFlowNode[], edges: IReactFlowEdge[]): IReactFlowNode | undefined {
|
||||||
const memoryNodes = nodes.filter((node) => node.data.category === 'Memory')
|
const memoryNodes = nodes.filter((node) => node.data.category === 'Memory')
|
||||||
const memoryNodeIds = memoryNodes.map((mem) => mem.data.id)
|
const memoryNodeIds = memoryNodes.map((mem) => mem.data.id)
|
||||||
|
|
||||||
for (const edge of edges) {
|
for (const edge of edges) {
|
||||||
if (memoryNodeIds.includes(edge.source)) {
|
if (memoryNodeIds.includes(edge.source)) {
|
||||||
const memoryNode = nodes.find((node) => node.data.id === edge.source)
|
const memoryNode = nodes.find((node) => node.data.id === edge.source)
|
||||||
return memoryNode ? memoryNode.data.label : undefined
|
return memoryNode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return undefined
|
return undefined
|
||||||
@@ -1508,6 +1451,19 @@ export class App {
|
|||||||
|
|
||||||
isStreamValid = isFlowValidForStream(nodes, endingNodeData)
|
isStreamValid = isFlowValidForStream(nodes, endingNodeData)
|
||||||
|
|
||||||
|
let chatHistory: IMessage[] | string = incomingInput.history
|
||||||
|
if (
|
||||||
|
endingNodeData.inputs?.memory &&
|
||||||
|
!incomingInput.history &&
|
||||||
|
(incomingInput.chatId || incomingInput.overrideConfig?.sessionId)
|
||||||
|
) {
|
||||||
|
const memoryNodeId = endingNodeData.inputs?.memory.split('.')[0].replace('{{', '')
|
||||||
|
const memoryNode = nodes.find((node) => node.data.id === memoryNodeId)
|
||||||
|
if (memoryNode) {
|
||||||
|
chatHistory = await replaceChatHistory(memoryNode, incomingInput, this.AppDataSource, databaseEntities, logger)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*** Get Starting Nodes with Non-Directed Graph ***/
|
/*** Get Starting Nodes with Non-Directed Graph ***/
|
||||||
const constructedObj = constructGraphs(nodes, edges, true)
|
const constructedObj = constructGraphs(nodes, edges, true)
|
||||||
const nonDirectedGraph = constructedObj.graph
|
const nonDirectedGraph = constructedObj.graph
|
||||||
@@ -1522,7 +1478,7 @@ export class App {
|
|||||||
depthQueue,
|
depthQueue,
|
||||||
this.nodesPool.componentNodes,
|
this.nodesPool.componentNodes,
|
||||||
incomingInput.question,
|
incomingInput.question,
|
||||||
incomingInput.history,
|
chatHistory,
|
||||||
chatId,
|
chatId,
|
||||||
chatflowid,
|
chatflowid,
|
||||||
this.AppDataSource,
|
this.AppDataSource,
|
||||||
@@ -1542,7 +1498,7 @@ export class App {
|
|||||||
nodeToExecute.data,
|
nodeToExecute.data,
|
||||||
reactFlowNodes,
|
reactFlowNodes,
|
||||||
incomingInput.question,
|
incomingInput.question,
|
||||||
incomingInput.history
|
chatHistory
|
||||||
)
|
)
|
||||||
nodeToExecuteData = reactFlowNodeData
|
nodeToExecuteData = reactFlowNodeData
|
||||||
|
|
||||||
@@ -1559,12 +1515,18 @@ export class App {
|
|||||||
let sessionId = undefined
|
let sessionId = undefined
|
||||||
if (nodeToExecuteData.instance) sessionId = checkMemorySessionId(nodeToExecuteData.instance, chatId)
|
if (nodeToExecuteData.instance) sessionId = checkMemorySessionId(nodeToExecuteData.instance, chatId)
|
||||||
|
|
||||||
const memoryType = this.findMemoryLabel(nodes, edges)
|
const memoryNode = this.findMemoryLabel(nodes, edges)
|
||||||
|
const memoryType = memoryNode?.data.label
|
||||||
|
|
||||||
|
let chatHistory: IMessage[] | string = incomingInput.history
|
||||||
|
if (memoryNode && !incomingInput.history && (incomingInput.chatId || incomingInput.overrideConfig?.sessionId)) {
|
||||||
|
chatHistory = await replaceChatHistory(memoryNode, incomingInput, this.AppDataSource, databaseEntities, logger)
|
||||||
|
}
|
||||||
|
|
||||||
let result = isStreamValid
|
let result = isStreamValid
|
||||||
? await nodeInstance.run(nodeToExecuteData, incomingInput.question, {
|
? await nodeInstance.run(nodeToExecuteData, incomingInput.question, {
|
||||||
uploads: incomingInput.uploads,
|
uploads: incomingInput.uploads,
|
||||||
chatHistory: incomingInput.history,
|
chatHistory,
|
||||||
socketIO,
|
socketIO,
|
||||||
socketIOClientId: incomingInput.socketIOClientId,
|
socketIOClientId: incomingInput.socketIOClientId,
|
||||||
logger,
|
logger,
|
||||||
@@ -1575,7 +1537,7 @@ export class App {
|
|||||||
})
|
})
|
||||||
: await nodeInstance.run(nodeToExecuteData, incomingInput.question, {
|
: await nodeInstance.run(nodeToExecuteData, incomingInput.question, {
|
||||||
uploads: incomingInput.uploads,
|
uploads: incomingInput.uploads,
|
||||||
chatHistory: incomingInput.history,
|
chatHistory,
|
||||||
logger,
|
logger,
|
||||||
appDataSource: this.AppDataSource,
|
appDataSource: this.AppDataSource,
|
||||||
databaseEntities,
|
databaseEntities,
|
||||||
|
|||||||
@@ -0,0 +1,147 @@
|
|||||||
|
import { randomBytes, scryptSync, timingSafeEqual } from 'crypto'
|
||||||
|
import { ICommonObject } from 'flowise-components'
|
||||||
|
import moment from 'moment'
|
||||||
|
import fs from 'fs'
|
||||||
|
import path from 'path'
|
||||||
|
import logger from './logger'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the api key path
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export const getAPIKeyPath = (): string => {
|
||||||
|
return process.env.APIKEY_PATH ? path.join(process.env.APIKEY_PATH, 'api.json') : path.join(__dirname, '..', '..', 'api.json')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate the api key
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export const generateAPIKey = (): string => {
|
||||||
|
const buffer = randomBytes(32)
|
||||||
|
return buffer.toString('base64')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate the secret key
|
||||||
|
* @param {string} apiKey
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export const generateSecretHash = (apiKey: string): string => {
|
||||||
|
const salt = randomBytes(8).toString('hex')
|
||||||
|
const buffer = scryptSync(apiKey, salt, 64) as Buffer
|
||||||
|
return `${buffer.toString('hex')}.${salt}`
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify valid keys
|
||||||
|
* @param {string} storedKey
|
||||||
|
* @param {string} suppliedKey
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
export const compareKeys = (storedKey: string, suppliedKey: string): boolean => {
|
||||||
|
const [hashedPassword, salt] = storedKey.split('.')
|
||||||
|
const buffer = scryptSync(suppliedKey, salt, 64) as Buffer
|
||||||
|
return timingSafeEqual(Buffer.from(hashedPassword, 'hex'), buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get API keys
|
||||||
|
* @returns {Promise<ICommonObject[]>}
|
||||||
|
*/
|
||||||
|
export const getAPIKeys = async (): Promise<ICommonObject[]> => {
|
||||||
|
try {
|
||||||
|
const content = await fs.promises.readFile(getAPIKeyPath(), 'utf8')
|
||||||
|
return JSON.parse(content)
|
||||||
|
} catch (error) {
|
||||||
|
const keyName = 'DefaultKey'
|
||||||
|
const apiKey = generateAPIKey()
|
||||||
|
const apiSecret = generateSecretHash(apiKey)
|
||||||
|
const content = [
|
||||||
|
{
|
||||||
|
keyName,
|
||||||
|
apiKey,
|
||||||
|
apiSecret,
|
||||||
|
createdAt: moment().format('DD-MMM-YY'),
|
||||||
|
id: randomBytes(16).toString('hex')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(content), 'utf8')
|
||||||
|
return content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new API key
|
||||||
|
* @param {string} keyName
|
||||||
|
* @returns {Promise<ICommonObject[]>}
|
||||||
|
*/
|
||||||
|
export const addAPIKey = async (keyName: string): Promise<ICommonObject[]> => {
|
||||||
|
const existingAPIKeys = await getAPIKeys()
|
||||||
|
const apiKey = generateAPIKey()
|
||||||
|
const apiSecret = generateSecretHash(apiKey)
|
||||||
|
const content = [
|
||||||
|
...existingAPIKeys,
|
||||||
|
{
|
||||||
|
keyName,
|
||||||
|
apiKey,
|
||||||
|
apiSecret,
|
||||||
|
createdAt: moment().format('DD-MMM-YY'),
|
||||||
|
id: randomBytes(16).toString('hex')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(content), 'utf8')
|
||||||
|
return content
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get API Key details
|
||||||
|
* @param {string} apiKey
|
||||||
|
* @returns {Promise<ICommonObject[]>}
|
||||||
|
*/
|
||||||
|
export const getApiKey = async (apiKey: string) => {
|
||||||
|
const existingAPIKeys = await getAPIKeys()
|
||||||
|
const keyIndex = existingAPIKeys.findIndex((key) => key.apiKey === apiKey)
|
||||||
|
if (keyIndex < 0) return undefined
|
||||||
|
return existingAPIKeys[keyIndex]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update existing API key
|
||||||
|
* @param {string} keyIdToUpdate
|
||||||
|
* @param {string} newKeyName
|
||||||
|
* @returns {Promise<ICommonObject[]>}
|
||||||
|
*/
|
||||||
|
export const updateAPIKey = async (keyIdToUpdate: string, newKeyName: string): Promise<ICommonObject[]> => {
|
||||||
|
const existingAPIKeys = await getAPIKeys()
|
||||||
|
const keyIndex = existingAPIKeys.findIndex((key) => key.id === keyIdToUpdate)
|
||||||
|
if (keyIndex < 0) return []
|
||||||
|
existingAPIKeys[keyIndex].keyName = newKeyName
|
||||||
|
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(existingAPIKeys), 'utf8')
|
||||||
|
return existingAPIKeys
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete API key
|
||||||
|
* @param {string} keyIdToDelete
|
||||||
|
* @returns {Promise<ICommonObject[]>}
|
||||||
|
*/
|
||||||
|
export const deleteAPIKey = async (keyIdToDelete: string): Promise<ICommonObject[]> => {
|
||||||
|
const existingAPIKeys = await getAPIKeys()
|
||||||
|
const result = existingAPIKeys.filter((key) => key.id !== keyIdToDelete)
|
||||||
|
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(result), 'utf8')
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace all api keys
|
||||||
|
* @param {ICommonObject[]} content
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
export const replaceAllAPIKeys = async (content: ICommonObject[]): Promise<void> => {
|
||||||
|
try {
|
||||||
|
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(content), 'utf8')
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,33 +1,33 @@
|
|||||||
import path from 'path'
|
import path from 'path'
|
||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import moment from 'moment'
|
|
||||||
import logger from './logger'
|
import logger from './logger'
|
||||||
import {
|
import {
|
||||||
|
IComponentCredentials,
|
||||||
IComponentNodes,
|
IComponentNodes,
|
||||||
|
ICredentialDataDecrypted,
|
||||||
|
ICredentialReqBody,
|
||||||
IDepthQueue,
|
IDepthQueue,
|
||||||
IExploredNode,
|
IExploredNode,
|
||||||
|
INodeData,
|
||||||
INodeDependencies,
|
INodeDependencies,
|
||||||
INodeDirectedGraph,
|
INodeDirectedGraph,
|
||||||
INodeQueue,
|
INodeQueue,
|
||||||
|
IOverrideConfig,
|
||||||
IReactFlowEdge,
|
IReactFlowEdge,
|
||||||
IReactFlowNode,
|
IReactFlowNode,
|
||||||
IVariableDict,
|
IVariableDict,
|
||||||
INodeData,
|
IncomingInput
|
||||||
IOverrideConfig,
|
|
||||||
ICredentialDataDecrypted,
|
|
||||||
IComponentCredentials,
|
|
||||||
ICredentialReqBody
|
|
||||||
} from '../Interface'
|
} from '../Interface'
|
||||||
import { cloneDeep, get, isEqual } from 'lodash'
|
import { cloneDeep, get, isEqual } from 'lodash'
|
||||||
import {
|
import {
|
||||||
ICommonObject,
|
convertChatHistoryToText,
|
||||||
getInputVariables,
|
getInputVariables,
|
||||||
IDatabaseEntity,
|
|
||||||
handleEscapeCharacters,
|
handleEscapeCharacters,
|
||||||
IMessage,
|
ICommonObject,
|
||||||
convertChatHistoryToText
|
IDatabaseEntity,
|
||||||
|
IMessage
|
||||||
} from 'flowise-components'
|
} from 'flowise-components'
|
||||||
import { scryptSync, randomBytes, timingSafeEqual } from 'crypto'
|
import { randomBytes } from 'crypto'
|
||||||
import { AES, enc } from 'crypto-js'
|
import { AES, enc } from 'crypto-js'
|
||||||
|
|
||||||
import { ChatFlow } from '../database/entities/ChatFlow'
|
import { ChatFlow } from '../database/entities/ChatFlow'
|
||||||
@@ -217,7 +217,7 @@ export const buildLangchain = async (
|
|||||||
depthQueue: IDepthQueue,
|
depthQueue: IDepthQueue,
|
||||||
componentNodes: IComponentNodes,
|
componentNodes: IComponentNodes,
|
||||||
question: string,
|
question: string,
|
||||||
chatHistory: IMessage[],
|
chatHistory: IMessage[] | string,
|
||||||
chatId: string,
|
chatId: string,
|
||||||
chatflowid: string,
|
chatflowid: string,
|
||||||
appDataSource: DataSource,
|
appDataSource: DataSource,
|
||||||
@@ -348,8 +348,8 @@ export const clearAllSessionMemory = async (
|
|||||||
node.data.inputs.sessionId = sessionId
|
node.data.inputs.sessionId = sessionId
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newNodeInstance.clearSessionMemory) {
|
if (newNodeInstance.memoryMethods && newNodeInstance.memoryMethods.clearSessionMemory) {
|
||||||
await newNodeInstance?.clearSessionMemory(node.data, { chatId, appDataSource, databaseEntities, logger })
|
await newNodeInstance.memoryMethods.clearSessionMemory(node.data, { chatId, appDataSource, databaseEntities, logger })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -381,8 +381,8 @@ export const clearSessionMemoryFromViewMessageDialog = async (
|
|||||||
|
|
||||||
if (sessionId && node.data.inputs) node.data.inputs.sessionId = sessionId
|
if (sessionId && node.data.inputs) node.data.inputs.sessionId = sessionId
|
||||||
|
|
||||||
if (newNodeInstance.clearSessionMemory) {
|
if (newNodeInstance.memoryMethods && newNodeInstance.memoryMethods.clearSessionMemory) {
|
||||||
await newNodeInstance?.clearSessionMemory(node.data, { chatId, appDataSource, databaseEntities, logger })
|
await newNodeInstance.memoryMethods.clearSessionMemory(node.data, { chatId, appDataSource, databaseEntities, logger })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -400,7 +400,7 @@ export const getVariableValue = (
|
|||||||
paramValue: string,
|
paramValue: string,
|
||||||
reactFlowNodes: IReactFlowNode[],
|
reactFlowNodes: IReactFlowNode[],
|
||||||
question: string,
|
question: string,
|
||||||
chatHistory: IMessage[],
|
chatHistory: IMessage[] | string,
|
||||||
isAcceptVariable = false
|
isAcceptVariable = false
|
||||||
) => {
|
) => {
|
||||||
let returnVal = paramValue
|
let returnVal = paramValue
|
||||||
@@ -433,7 +433,10 @@ export const getVariableValue = (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isAcceptVariable && variableFullPath === CHAT_HISTORY_VAR_PREFIX) {
|
if (isAcceptVariable && variableFullPath === CHAT_HISTORY_VAR_PREFIX) {
|
||||||
variableDict[`{{${variableFullPath}}}`] = handleEscapeCharacters(convertChatHistoryToText(chatHistory), false)
|
variableDict[`{{${variableFullPath}}}`] = handleEscapeCharacters(
|
||||||
|
typeof chatHistory === 'string' ? chatHistory : convertChatHistoryToText(chatHistory),
|
||||||
|
false
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Split by first occurrence of '.' to get just nodeId
|
// Split by first occurrence of '.' to get just nodeId
|
||||||
@@ -476,7 +479,7 @@ export const resolveVariables = (
|
|||||||
reactFlowNodeData: INodeData,
|
reactFlowNodeData: INodeData,
|
||||||
reactFlowNodes: IReactFlowNode[],
|
reactFlowNodes: IReactFlowNode[],
|
||||||
question: string,
|
question: string,
|
||||||
chatHistory: IMessage[]
|
chatHistory: IMessage[] | string
|
||||||
): INodeData => {
|
): INodeData => {
|
||||||
let flowNodeData = cloneDeep(reactFlowNodeData)
|
let flowNodeData = cloneDeep(reactFlowNodeData)
|
||||||
const types = 'inputs'
|
const types = 'inputs'
|
||||||
@@ -555,9 +558,20 @@ export const isStartNodeDependOnInput = (startingNodes: IReactFlowNode[], nodes:
|
|||||||
if (inputVariables.length > 0) return true
|
if (inputVariables.length > 0) return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const whitelistNodeNames = ['vectorStoreToDocument', 'autoGPT']
|
const whitelistNodeNames = ['vectorStoreToDocument', 'autoGPT', 'chatPromptTemplate', 'promptTemplate'] //If these nodes are found, chatflow cannot be reused
|
||||||
for (const node of nodes) {
|
for (const node of nodes) {
|
||||||
if (whitelistNodeNames.includes(node.data.name)) return true
|
if (node.data.name === 'chatPromptTemplate' || node.data.name === 'promptTemplate') {
|
||||||
|
let promptValues: ICommonObject = {}
|
||||||
|
const promptValuesRaw = node.data.inputs?.promptValues
|
||||||
|
if (promptValuesRaw) {
|
||||||
|
try {
|
||||||
|
promptValues = typeof promptValuesRaw === 'object' ? promptValuesRaw : JSON.parse(promptValuesRaw)
|
||||||
|
} catch (exception) {
|
||||||
|
console.error(exception)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (getAllValuesFromJson(promptValues).includes(`{{${QUESTION_VAR_PREFIX}}}`)) return true
|
||||||
|
} else if (whitelistNodeNames.includes(node.data.name)) return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -593,147 +607,6 @@ export const isSameOverrideConfig = (
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the api key path
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export const getAPIKeyPath = (): string => {
|
|
||||||
return process.env.APIKEY_PATH ? path.join(process.env.APIKEY_PATH, 'api.json') : path.join(__dirname, '..', '..', 'api.json')
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate the api key
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export const generateAPIKey = (): string => {
|
|
||||||
const buffer = randomBytes(32)
|
|
||||||
return buffer.toString('base64')
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate the secret key
|
|
||||||
* @param {string} apiKey
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
export const generateSecretHash = (apiKey: string): string => {
|
|
||||||
const salt = randomBytes(8).toString('hex')
|
|
||||||
const buffer = scryptSync(apiKey, salt, 64) as Buffer
|
|
||||||
return `${buffer.toString('hex')}.${salt}`
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Verify valid keys
|
|
||||||
* @param {string} storedKey
|
|
||||||
* @param {string} suppliedKey
|
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
|
||||||
export const compareKeys = (storedKey: string, suppliedKey: string): boolean => {
|
|
||||||
const [hashedPassword, salt] = storedKey.split('.')
|
|
||||||
const buffer = scryptSync(suppliedKey, salt, 64) as Buffer
|
|
||||||
return timingSafeEqual(Buffer.from(hashedPassword, 'hex'), buffer)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get API keys
|
|
||||||
* @returns {Promise<ICommonObject[]>}
|
|
||||||
*/
|
|
||||||
export const getAPIKeys = async (): Promise<ICommonObject[]> => {
|
|
||||||
try {
|
|
||||||
const content = await fs.promises.readFile(getAPIKeyPath(), 'utf8')
|
|
||||||
return JSON.parse(content)
|
|
||||||
} catch (error) {
|
|
||||||
const keyName = 'DefaultKey'
|
|
||||||
const apiKey = generateAPIKey()
|
|
||||||
const apiSecret = generateSecretHash(apiKey)
|
|
||||||
const content = [
|
|
||||||
{
|
|
||||||
keyName,
|
|
||||||
apiKey,
|
|
||||||
apiSecret,
|
|
||||||
createdAt: moment().format('DD-MMM-YY'),
|
|
||||||
id: randomBytes(16).toString('hex')
|
|
||||||
}
|
|
||||||
]
|
|
||||||
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(content), 'utf8')
|
|
||||||
return content
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add new API key
|
|
||||||
* @param {string} keyName
|
|
||||||
* @returns {Promise<ICommonObject[]>}
|
|
||||||
*/
|
|
||||||
export const addAPIKey = async (keyName: string): Promise<ICommonObject[]> => {
|
|
||||||
const existingAPIKeys = await getAPIKeys()
|
|
||||||
const apiKey = generateAPIKey()
|
|
||||||
const apiSecret = generateSecretHash(apiKey)
|
|
||||||
const content = [
|
|
||||||
...existingAPIKeys,
|
|
||||||
{
|
|
||||||
keyName,
|
|
||||||
apiKey,
|
|
||||||
apiSecret,
|
|
||||||
createdAt: moment().format('DD-MMM-YY'),
|
|
||||||
id: randomBytes(16).toString('hex')
|
|
||||||
}
|
|
||||||
]
|
|
||||||
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(content), 'utf8')
|
|
||||||
return content
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get API Key details
|
|
||||||
* @param {string} apiKey
|
|
||||||
* @returns {Promise<ICommonObject[]>}
|
|
||||||
*/
|
|
||||||
export const getApiKey = async (apiKey: string) => {
|
|
||||||
const existingAPIKeys = await getAPIKeys()
|
|
||||||
const keyIndex = existingAPIKeys.findIndex((key) => key.apiKey === apiKey)
|
|
||||||
if (keyIndex < 0) return undefined
|
|
||||||
return existingAPIKeys[keyIndex]
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update existing API key
|
|
||||||
* @param {string} keyIdToUpdate
|
|
||||||
* @param {string} newKeyName
|
|
||||||
* @returns {Promise<ICommonObject[]>}
|
|
||||||
*/
|
|
||||||
export const updateAPIKey = async (keyIdToUpdate: string, newKeyName: string): Promise<ICommonObject[]> => {
|
|
||||||
const existingAPIKeys = await getAPIKeys()
|
|
||||||
const keyIndex = existingAPIKeys.findIndex((key) => key.id === keyIdToUpdate)
|
|
||||||
if (keyIndex < 0) return []
|
|
||||||
existingAPIKeys[keyIndex].keyName = newKeyName
|
|
||||||
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(existingAPIKeys), 'utf8')
|
|
||||||
return existingAPIKeys
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete API key
|
|
||||||
* @param {string} keyIdToDelete
|
|
||||||
* @returns {Promise<ICommonObject[]>}
|
|
||||||
*/
|
|
||||||
export const deleteAPIKey = async (keyIdToDelete: string): Promise<ICommonObject[]> => {
|
|
||||||
const existingAPIKeys = await getAPIKeys()
|
|
||||||
const result = existingAPIKeys.filter((key) => key.id !== keyIdToDelete)
|
|
||||||
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(result), 'utf8')
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Replace all api keys
|
|
||||||
* @param {ICommonObject[]} content
|
|
||||||
* @returns {Promise<void>}
|
|
||||||
*/
|
|
||||||
export const replaceAllAPIKeys = async (content: ICommonObject[]): Promise<void> => {
|
|
||||||
try {
|
|
||||||
await fs.promises.writeFile(getAPIKeyPath(), JSON.stringify(content), 'utf8')
|
|
||||||
} catch (error) {
|
|
||||||
logger.error(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map MimeType to InputField
|
* Map MimeType to InputField
|
||||||
* @param {string} mimeType
|
* @param {string} mimeType
|
||||||
@@ -1015,3 +888,67 @@ export const checkMemorySessionId = (instance: any, chatId: string): string | un
|
|||||||
return instance.memory.chatHistory.sessionId
|
return instance.memory.chatHistory.sessionId
|
||||||
return undefined
|
return undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace chatHistory if incomingInput.history is empty and sessionId/chatId is provided
|
||||||
|
* @param {IReactFlowNode} memoryNode
|
||||||
|
* @param {IncomingInput} incomingInput
|
||||||
|
* @param {DataSource} appDataSource
|
||||||
|
* @param {IDatabaseEntity} databaseEntities
|
||||||
|
* @param {any} logger
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
export const replaceChatHistory = async (
|
||||||
|
memoryNode: IReactFlowNode,
|
||||||
|
incomingInput: IncomingInput,
|
||||||
|
appDataSource: DataSource,
|
||||||
|
databaseEntities: IDatabaseEntity,
|
||||||
|
logger: any
|
||||||
|
): Promise<string> => {
|
||||||
|
const nodeInstanceFilePath = memoryNode.data.filePath as string
|
||||||
|
const nodeModule = await import(nodeInstanceFilePath)
|
||||||
|
const newNodeInstance = new nodeModule.nodeClass()
|
||||||
|
|
||||||
|
if (incomingInput.overrideConfig?.sessionId && memoryNode.data.inputs) {
|
||||||
|
memoryNode.data.inputs.sessionId = incomingInput.overrideConfig.sessionId
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newNodeInstance.memoryMethods && newNodeInstance.memoryMethods.getChatMessages) {
|
||||||
|
return await newNodeInstance.memoryMethods.getChatMessages(memoryNode.data, {
|
||||||
|
chatId: incomingInput.chatId,
|
||||||
|
appDataSource,
|
||||||
|
databaseEntities,
|
||||||
|
logger
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all values from a JSON object
|
||||||
|
* @param {any} obj
|
||||||
|
* @returns {any[]}
|
||||||
|
*/
|
||||||
|
export const getAllValuesFromJson = (obj: any): any[] => {
|
||||||
|
const values: any[] = []
|
||||||
|
|
||||||
|
function extractValues(data: any) {
|
||||||
|
if (typeof data === 'object' && data !== null) {
|
||||||
|
if (Array.isArray(data)) {
|
||||||
|
for (const item of data) {
|
||||||
|
extractValues(item)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (const key in data) {
|
||||||
|
extractValues(data[key])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
values.push(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extractValues(obj)
|
||||||
|
return values
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
import client from './client'
|
|
||||||
|
|
||||||
const getExportDatabase = () => client.get('/database/export')
|
|
||||||
const createLoadDatabase = (body) => client.post('/database/load', body)
|
|
||||||
|
|
||||||
export default {
|
|
||||||
getExportDatabase,
|
|
||||||
createLoadDatabase
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
import { useState, useRef, useEffect } from 'react'
|
import { useState, useRef, useEffect } from 'react'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
import { useSelector, useDispatch } from 'react-redux'
|
import { useSelector } from 'react-redux'
|
||||||
import { useNavigate } from 'react-router-dom'
|
|
||||||
|
|
||||||
// material-ui
|
// material-ui
|
||||||
import { useTheme } from '@mui/material/styles'
|
import { useTheme } from '@mui/material/styles'
|
||||||
@@ -26,16 +25,10 @@ import PerfectScrollbar from 'react-perfect-scrollbar'
|
|||||||
// project imports
|
// project imports
|
||||||
import MainCard from 'ui-component/cards/MainCard'
|
import MainCard from 'ui-component/cards/MainCard'
|
||||||
import Transitions from 'ui-component/extended/Transitions'
|
import Transitions from 'ui-component/extended/Transitions'
|
||||||
import { BackdropLoader } from 'ui-component/loading/BackdropLoader'
|
|
||||||
import AboutDialog from 'ui-component/dialog/AboutDialog'
|
import AboutDialog from 'ui-component/dialog/AboutDialog'
|
||||||
|
|
||||||
// assets
|
// assets
|
||||||
import { IconLogout, IconSettings, IconFileExport, IconFileDownload, IconInfoCircle } from '@tabler/icons'
|
import { IconLogout, IconSettings, IconInfoCircle } from '@tabler/icons'
|
||||||
|
|
||||||
// API
|
|
||||||
import databaseApi from 'api/database'
|
|
||||||
|
|
||||||
import { SET_MENU } from 'store/actions'
|
|
||||||
|
|
||||||
import './index.css'
|
import './index.css'
|
||||||
|
|
||||||
@@ -43,17 +36,13 @@ import './index.css'
|
|||||||
|
|
||||||
const ProfileSection = ({ username, handleLogout }) => {
|
const ProfileSection = ({ username, handleLogout }) => {
|
||||||
const theme = useTheme()
|
const theme = useTheme()
|
||||||
const dispatch = useDispatch()
|
|
||||||
const navigate = useNavigate()
|
|
||||||
|
|
||||||
const customization = useSelector((state) => state.customization)
|
const customization = useSelector((state) => state.customization)
|
||||||
|
|
||||||
const [open, setOpen] = useState(false)
|
const [open, setOpen] = useState(false)
|
||||||
const [loading, setLoading] = useState(false)
|
|
||||||
const [aboutDialogOpen, setAboutDialogOpen] = useState(false)
|
const [aboutDialogOpen, setAboutDialogOpen] = useState(false)
|
||||||
|
|
||||||
const anchorRef = useRef(null)
|
const anchorRef = useRef(null)
|
||||||
const uploadRef = useRef(null)
|
|
||||||
|
|
||||||
const handleClose = (event) => {
|
const handleClose = (event) => {
|
||||||
if (anchorRef.current && anchorRef.current.contains(event.target)) {
|
if (anchorRef.current && anchorRef.current.contains(event.target)) {
|
||||||
@@ -66,56 +55,6 @@ const ProfileSection = ({ username, handleLogout }) => {
|
|||||||
setOpen((prevOpen) => !prevOpen)
|
setOpen((prevOpen) => !prevOpen)
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleExportDB = async () => {
|
|
||||||
setOpen(false)
|
|
||||||
try {
|
|
||||||
const response = await databaseApi.getExportDatabase()
|
|
||||||
const exportItems = response.data
|
|
||||||
let dataStr = JSON.stringify(exportItems, null, 2)
|
|
||||||
let dataUri = 'data:application/json;charset=utf-8,' + encodeURIComponent(dataStr)
|
|
||||||
|
|
||||||
let exportFileDefaultName = `DB.json`
|
|
||||||
|
|
||||||
let linkElement = document.createElement('a')
|
|
||||||
linkElement.setAttribute('href', dataUri)
|
|
||||||
linkElement.setAttribute('download', exportFileDefaultName)
|
|
||||||
linkElement.click()
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleFileUpload = (e) => {
|
|
||||||
if (!e.target.files) return
|
|
||||||
|
|
||||||
const file = e.target.files[0]
|
|
||||||
const reader = new FileReader()
|
|
||||||
reader.onload = async (evt) => {
|
|
||||||
if (!evt?.target?.result) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const { result } = evt.target
|
|
||||||
|
|
||||||
if (result.includes(`"chatmessages":[`) && result.includes(`"chatflows":[`) && result.includes(`"apikeys":[`)) {
|
|
||||||
dispatch({ type: SET_MENU, opened: false })
|
|
||||||
setLoading(true)
|
|
||||||
|
|
||||||
try {
|
|
||||||
await databaseApi.createLoadDatabase(JSON.parse(result))
|
|
||||||
setLoading(false)
|
|
||||||
navigate('/', { replace: true })
|
|
||||||
navigate(0)
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e)
|
|
||||||
setLoading(false)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
alert('Incorrect Flowise Database Format')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
reader.readAsText(file)
|
|
||||||
}
|
|
||||||
|
|
||||||
const prevOpen = useRef(open)
|
const prevOpen = useRef(open)
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (prevOpen.current === true && open === false) {
|
if (prevOpen.current === true && open === false) {
|
||||||
@@ -196,27 +135,6 @@ const ProfileSection = ({ username, handleLogout }) => {
|
|||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ListItemButton
|
|
||||||
sx={{ borderRadius: `${customization.borderRadius}px` }}
|
|
||||||
onClick={() => {
|
|
||||||
setOpen(false)
|
|
||||||
uploadRef.current.click()
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<ListItemIcon>
|
|
||||||
<IconFileDownload stroke={1.5} size='1.3rem' />
|
|
||||||
</ListItemIcon>
|
|
||||||
<ListItemText primary={<Typography variant='body2'>Load Database</Typography>} />
|
|
||||||
</ListItemButton>
|
|
||||||
<ListItemButton
|
|
||||||
sx={{ borderRadius: `${customization.borderRadius}px` }}
|
|
||||||
onClick={handleExportDB}
|
|
||||||
>
|
|
||||||
<ListItemIcon>
|
|
||||||
<IconFileExport stroke={1.5} size='1.3rem' />
|
|
||||||
</ListItemIcon>
|
|
||||||
<ListItemText primary={<Typography variant='body2'>Export Database</Typography>} />
|
|
||||||
</ListItemButton>
|
|
||||||
<ListItemButton
|
<ListItemButton
|
||||||
sx={{ borderRadius: `${customization.borderRadius}px` }}
|
sx={{ borderRadius: `${customization.borderRadius}px` }}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
@@ -249,8 +167,6 @@ const ProfileSection = ({ username, handleLogout }) => {
|
|||||||
</Transitions>
|
</Transitions>
|
||||||
)}
|
)}
|
||||||
</Popper>
|
</Popper>
|
||||||
<input ref={uploadRef} type='file' hidden accept='.json' onChange={(e) => handleFileUpload(e)} />
|
|
||||||
<BackdropLoader open={loading} />
|
|
||||||
<AboutDialog show={aboutDialogOpen} onCancel={() => setAboutDialogOpen(false)} />
|
<AboutDialog show={aboutDialogOpen} onCancel={() => setAboutDialogOpen(false)} />
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import useConfirm from 'hooks/useConfirm'
|
|||||||
import { uiBaseURL } from '../../store/constant'
|
import { uiBaseURL } from '../../store/constant'
|
||||||
import { closeSnackbar as closeSnackbarAction, enqueueSnackbar as enqueueSnackbarAction } from '../../store/actions'
|
import { closeSnackbar as closeSnackbarAction, enqueueSnackbar as enqueueSnackbarAction } from '../../store/actions'
|
||||||
|
|
||||||
import ConfirmDialog from '../dialog/ConfirmDialog'
|
|
||||||
import SaveChatflowDialog from '../dialog/SaveChatflowDialog'
|
import SaveChatflowDialog from '../dialog/SaveChatflowDialog'
|
||||||
import TagDialog from '../dialog/TagDialog'
|
import TagDialog from '../dialog/TagDialog'
|
||||||
|
|
||||||
@@ -264,7 +263,6 @@ export default function FlowListMenu({ chatflow, updateFlowsApi }) {
|
|||||||
Delete
|
Delete
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
</StyledMenu>
|
</StyledMenu>
|
||||||
<ConfirmDialog />
|
|
||||||
<SaveChatflowDialog
|
<SaveChatflowDialog
|
||||||
show={flowDialogOpen}
|
show={flowDialogOpen}
|
||||||
dialogProps={{
|
dialogProps={{
|
||||||
|
|||||||
@@ -69,7 +69,9 @@ export const FlowListTable = ({ data, images, filterFunction, updateFlowsApi })
|
|||||||
<Typography
|
<Typography
|
||||||
sx={{ fontSize: '1.2rem', fontWeight: 500, overflowWrap: 'break-word', whiteSpace: 'pre-line' }}
|
sx={{ fontSize: '1.2rem', fontWeight: 500, overflowWrap: 'break-word', whiteSpace: 'pre-line' }}
|
||||||
>
|
>
|
||||||
<Button onClick={() => goToCanvas(row)}>{row.templateName || row.name}</Button>
|
<Button onClick={() => goToCanvas(row)} sx={{ textAlign: 'left' }}>
|
||||||
|
{row.templateName || row.name}
|
||||||
|
</Button>
|
||||||
</Typography>
|
</Typography>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
<TableCell key='1'>
|
<TableCell key='1'>
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ const Canvas = () => {
|
|||||||
try {
|
try {
|
||||||
await chatflowsApi.deleteChatflow(chatflow.id)
|
await chatflowsApi.deleteChatflow(chatflow.id)
|
||||||
localStorage.removeItem(`${chatflow.id}_INTERNAL`)
|
localStorage.removeItem(`${chatflow.id}_INTERNAL`)
|
||||||
navigate(-1)
|
navigate('/')
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errorData = error.response.data || `${error.response.status}: ${error.response.statusText}`
|
const errorData = error.response.data || `${error.response.status}: ${error.response.statusText}`
|
||||||
enqueueSnackbar({
|
enqueueSnackbar({
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import ItemCard from 'ui-component/cards/ItemCard'
|
|||||||
import { gridSpacing } from 'store/constant'
|
import { gridSpacing } from 'store/constant'
|
||||||
import WorkflowEmptySVG from 'assets/images/workflow_empty.svg'
|
import WorkflowEmptySVG from 'assets/images/workflow_empty.svg'
|
||||||
import LoginDialog from 'ui-component/dialog/LoginDialog'
|
import LoginDialog from 'ui-component/dialog/LoginDialog'
|
||||||
|
import ConfirmDialog from 'ui-component/dialog/ConfirmDialog'
|
||||||
|
|
||||||
// API
|
// API
|
||||||
import chatflowsApi from 'api/chatflows'
|
import chatflowsApi from 'api/chatflows'
|
||||||
@@ -212,6 +213,7 @@ const Chatflows = () => {
|
|||||||
</Stack>
|
</Stack>
|
||||||
)}
|
)}
|
||||||
<LoginDialog show={loginDialogOpen} dialogProps={loginDialogProps} onConfirm={onLoginClick} />
|
<LoginDialog show={loginDialogOpen} dialogProps={loginDialogProps} onConfirm={onLoginClick} />
|
||||||
|
<ConfirmDialog />
|
||||||
</MainCard>
|
</MainCard>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user