From 413d654493df40924332666e6dd8a55587beb17c Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 15 Jul 2023 14:25:52 +0100 Subject: [PATCH 01/19] add credentials --- .../AzureChatOpenAI/AzureChatOpenAI.ts | 48 +-- .../AzureOpenAIApi.credential.ts | 45 +++ .../ChatAnthropic/AnthropicApi.credential.ts | 21 ++ .../chatmodels/ChatAnthropic/ChatAnthropic.ts | 22 +- .../nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts | 22 +- .../ChatOpenAI/OpenAIApi.credential.ts | 21 ++ .../components/nodes/llms/OpenAI/OpenAI.ts | 22 +- .../memory/MotorheadMemory/MotorheadMemory.ts | 33 +-- .../MotorheadMemoryApi.credential.ts | 29 ++ .../nodes/memory/ZepMemory/ZepMemory.ts | 23 +- .../ZepMemory/ZepMemoryApi.credential.ts | 24 ++ packages/components/src/Interface.ts | 10 + packages/components/src/utils.ts | 86 ++++++ packages/server/package.json | 2 + packages/server/src/ChildProcess.ts | 3 +- packages/server/src/DataSource.ts | 3 +- packages/server/src/Interface.ts | 27 ++ packages/server/src/NodesPool.ts | 48 ++- packages/server/src/entity/Credential.ts | 24 ++ packages/server/src/index.ts | 155 +++++++++- packages/server/src/utils/index.ts | 156 +++++++++- packages/server/src/utils/logger.ts | 3 +- packages/ui/src/api/credentials.js | 28 ++ .../ui/src/assets/images/credential_empty.svg | 1 + packages/ui/src/menu-items/dashboard.js | 12 +- packages/ui/src/routes/MainRoutes.js | 9 +- packages/ui/src/store/constant.js | 1 + .../ui-component/dropdown/AsyncDropdown.js | 35 ++- packages/ui/src/ui-component/input/Input.js | 2 +- packages/ui/src/utils/genericHelper.js | 19 +- .../views/canvas/CredentialInputHandler.js | 149 ++++++++++ .../ui/src/views/canvas/NodeInputHandler.js | 16 + packages/ui/src/views/canvas/index.js | 26 +- .../credentials/AddEditCredentialDialog.js | 276 ++++++++++++++++++ .../credentials/CredentialInputHandler.js | 137 +++++++++ .../views/credentials/CredentialListDialog.js | 172 +++++++++++ packages/ui/src/views/credentials/index.js | 274 +++++++++++++++++ 37 files changed, 1858 insertions(+), 126 deletions(-) create mode 100644 packages/components/nodes/chatmodels/AzureChatOpenAI/AzureOpenAIApi.credential.ts create mode 100644 packages/components/nodes/chatmodels/ChatAnthropic/AnthropicApi.credential.ts create mode 100644 packages/components/nodes/chatmodels/ChatOpenAI/OpenAIApi.credential.ts create mode 100644 packages/components/nodes/memory/MotorheadMemory/MotorheadMemoryApi.credential.ts create mode 100644 packages/components/nodes/memory/ZepMemory/ZepMemoryApi.credential.ts create mode 100644 packages/server/src/entity/Credential.ts create mode 100644 packages/ui/src/api/credentials.js create mode 100644 packages/ui/src/assets/images/credential_empty.svg create mode 100644 packages/ui/src/views/canvas/CredentialInputHandler.js create mode 100644 packages/ui/src/views/credentials/AddEditCredentialDialog.js create mode 100644 packages/ui/src/views/credentials/CredentialInputHandler.js create mode 100644 packages/ui/src/views/credentials/CredentialListDialog.js create mode 100644 packages/ui/src/views/credentials/index.js diff --git a/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts b/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts index 2cdb505d..0bff883f 100644 --- a/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts @@ -1,6 +1,6 @@ import { OpenAIBaseInput } from 'langchain/dist/types/openai-types' -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { AzureOpenAIInput, ChatOpenAI } from 'langchain/chat_models/openai' class AzureChatOpenAI_ChatModels implements INode { @@ -11,6 +11,7 @@ class AzureChatOpenAI_ChatModels implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -21,12 +22,13 @@ class AzureChatOpenAI_ChatModels implements INode { this.category = 'Chat Models' this.description = 'Wrapper around Azure OpenAI large language models that use the Chat endpoint' this.baseClasses = [this.type, ...getBaseClasses(ChatOpenAI)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['azureOpenAIApi'] + } this.inputs = [ - { - label: 'Azure OpenAI Api Key', - name: 'azureOpenAIApiKey', - type: 'password' - }, { label: 'Model Name', name: 'modelName', @@ -59,26 +61,6 @@ class AzureChatOpenAI_ChatModels implements INode { default: 0.9, optional: true }, - { - label: 'Azure OpenAI Api Instance Name', - name: 'azureOpenAIApiInstanceName', - type: 'string', - placeholder: 'YOUR-INSTANCE-NAME' - }, - { - label: 'Azure OpenAI Api Deployment Name', - name: 'azureOpenAIApiDeploymentName', - type: 'string', - placeholder: 'YOUR-DEPLOYMENT-NAME' - }, - { - label: 'Azure OpenAI Api Version', - name: 'azureOpenAIApiVersion', - type: 'string', - placeholder: '2023-06-01-preview', - description: - 'Description of Supported API Versions. Please refer examples' - }, { label: 'Max Tokens', name: 'maxTokens', @@ -110,19 +92,21 @@ class AzureChatOpenAI_ChatModels implements INode { ] } - async init(nodeData: INodeData): Promise { - const azureOpenAIApiKey = nodeData.inputs?.azureOpenAIApiKey as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const modelName = nodeData.inputs?.modelName as string const temperature = nodeData.inputs?.temperature as string - const azureOpenAIApiInstanceName = nodeData.inputs?.azureOpenAIApiInstanceName as string - const azureOpenAIApiDeploymentName = nodeData.inputs?.azureOpenAIApiDeploymentName as string - const azureOpenAIApiVersion = nodeData.inputs?.azureOpenAIApiVersion as string const maxTokens = nodeData.inputs?.maxTokens as string const frequencyPenalty = nodeData.inputs?.frequencyPenalty as string const presencePenalty = nodeData.inputs?.presencePenalty as string const timeout = nodeData.inputs?.timeout as string const streaming = nodeData.inputs?.streaming as boolean + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const azureOpenAIApiKey = getCredentialParam('azureOpenAIApiKey', credentialData, nodeData) + const azureOpenAIApiInstanceName = getCredentialParam('azureOpenAIApiInstanceName', credentialData, nodeData) + const azureOpenAIApiDeploymentName = getCredentialParam('azureOpenAIApiDeploymentName', credentialData, nodeData) + const azureOpenAIApiVersion = getCredentialParam('azureOpenAIApiVersion', credentialData, nodeData) + const obj: Partial & Partial = { temperature: parseFloat(temperature), modelName, diff --git a/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureOpenAIApi.credential.ts b/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureOpenAIApi.credential.ts new file mode 100644 index 00000000..d48e0c88 --- /dev/null +++ b/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureOpenAIApi.credential.ts @@ -0,0 +1,45 @@ +import { INodeParams, INodeCredential } from '../../../src/Interface' + +class AzureOpenAIApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Azure OpenAI API' + this.name = 'azureOpenAIApi' + this.description = + 'Refer to official guide of how to use Azure OpenAI service' + this.inputs = [ + { + label: 'Azure OpenAI Api Key', + name: 'azureOpenAIApiKey', + type: 'password', + description: `Refer to official guide on how to create API key on Azure OpenAI` + }, + { + label: 'Azure OpenAI Api Instance Name', + name: 'azureOpenAIApiInstanceName', + type: 'string', + placeholder: 'YOUR-INSTANCE-NAME' + }, + { + label: 'Azure OpenAI Api Deployment Name', + name: 'azureOpenAIApiDeploymentName', + type: 'string', + placeholder: 'YOUR-DEPLOYMENT-NAME' + }, + { + label: 'Azure OpenAI Api Version', + name: 'azureOpenAIApiVersion', + type: 'string', + placeholder: '2023-06-01-preview', + description: + 'Description of Supported API Versions. Please refer examples' + } + ] + } +} + +module.exports = { credClass: AzureOpenAIApi } diff --git a/packages/components/nodes/chatmodels/ChatAnthropic/AnthropicApi.credential.ts b/packages/components/nodes/chatmodels/ChatAnthropic/AnthropicApi.credential.ts new file mode 100644 index 00000000..607fa625 --- /dev/null +++ b/packages/components/nodes/chatmodels/ChatAnthropic/AnthropicApi.credential.ts @@ -0,0 +1,21 @@ +import { INodeParams, INodeCredential } from '../../../src/Interface' + +class AnthropicApi implements INodeCredential { + label: string + name: string + inputs: INodeParams[] + + constructor() { + this.label = 'Anthropic API' + this.name = 'anthropicApi' + this.inputs = [ + { + label: 'Anthropic Api Key', + name: 'anthropicApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: AnthropicApi } diff --git a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts index 3d861d24..6581475e 100644 --- a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts +++ b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { AnthropicInput, ChatAnthropic } from 'langchain/chat_models/anthropic' class ChatAnthropic_ChatModels implements INode { @@ -10,6 +10,7 @@ class ChatAnthropic_ChatModels implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,12 +21,13 @@ class ChatAnthropic_ChatModels implements INode { this.category = 'Chat Models' this.description = 'Wrapper around ChatAnthropic large language models that use the Chat endpoint' this.baseClasses = [this.type, ...getBaseClasses(ChatAnthropic)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['anthropicApi'] + } this.inputs = [ - { - label: 'ChatAnthropic Api Key', - name: 'anthropicApiKey', - type: 'password' - }, { label: 'Model Name', name: 'modelName', @@ -110,15 +112,17 @@ class ChatAnthropic_ChatModels implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const temperature = nodeData.inputs?.temperature as string const modelName = nodeData.inputs?.modelName as string - const anthropicApiKey = nodeData.inputs?.anthropicApiKey as string const maxTokensToSample = nodeData.inputs?.maxTokensToSample as string const topP = nodeData.inputs?.topP as string const topK = nodeData.inputs?.topK as string const streaming = nodeData.inputs?.streaming as boolean + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const anthropicApiKey = getCredentialParam('anthropicApiKey', credentialData, nodeData) + const obj: Partial & { anthropicApiKey?: string } = { temperature: parseFloat(temperature), modelName, diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts index 955563ff..1339d1fe 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { ChatOpenAI, OpenAIChatInput } from 'langchain/chat_models/openai' class ChatOpenAI_ChatModels implements INode { @@ -10,6 +10,7 @@ class ChatOpenAI_ChatModels implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,12 +21,13 @@ class ChatOpenAI_ChatModels implements INode { this.category = 'Chat Models' this.description = 'Wrapper around OpenAI large language models that use the Chat endpoint' this.baseClasses = [this.type, ...getBaseClasses(ChatOpenAI)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['openAIApi'] + } this.inputs = [ - { - label: 'OpenAI Api Key', - name: 'openAIApiKey', - type: 'password' - }, { label: 'Model Name', name: 'modelName', @@ -119,10 +121,9 @@ class ChatOpenAI_ChatModels implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const temperature = nodeData.inputs?.temperature as string const modelName = nodeData.inputs?.modelName as string - const openAIApiKey = nodeData.inputs?.openAIApiKey as string const maxTokens = nodeData.inputs?.maxTokens as string const topP = nodeData.inputs?.topP as string const frequencyPenalty = nodeData.inputs?.frequencyPenalty as string @@ -131,6 +132,9 @@ class ChatOpenAI_ChatModels implements INode { const streaming = nodeData.inputs?.streaming as boolean const basePath = nodeData.inputs?.basepath as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const openAIApiKey = getCredentialParam('openAIApiKey', credentialData, nodeData) + const obj: Partial & { openAIApiKey?: string } = { temperature: parseFloat(temperature), modelName, diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/OpenAIApi.credential.ts b/packages/components/nodes/chatmodels/ChatOpenAI/OpenAIApi.credential.ts new file mode 100644 index 00000000..96209a35 --- /dev/null +++ b/packages/components/nodes/chatmodels/ChatOpenAI/OpenAIApi.credential.ts @@ -0,0 +1,21 @@ +import { INodeParams, INodeCredential } from '../../../src/Interface' + +class OpenAIApi implements INodeCredential { + label: string + name: string + inputs: INodeParams[] + + constructor() { + this.label = 'OpenAI API' + this.name = 'openAIApi' + this.inputs = [ + { + label: 'OpenAI Api Key', + name: 'openAIApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: OpenAIApi } diff --git a/packages/components/nodes/llms/OpenAI/OpenAI.ts b/packages/components/nodes/llms/OpenAI/OpenAI.ts index b0af867d..50aa1c60 100644 --- a/packages/components/nodes/llms/OpenAI/OpenAI.ts +++ b/packages/components/nodes/llms/OpenAI/OpenAI.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { OpenAI, OpenAIInput } from 'langchain/llms/openai' class OpenAI_LLMs implements INode { @@ -10,6 +10,7 @@ class OpenAI_LLMs implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,12 +21,13 @@ class OpenAI_LLMs implements INode { this.category = 'LLMs' this.description = 'Wrapper around OpenAI large language models' this.baseClasses = [this.type, ...getBaseClasses(OpenAI)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['openAIApi'] + } this.inputs = [ - { - label: 'OpenAI Api Key', - name: 'openAIApiKey', - type: 'password' - }, { label: 'Model Name', name: 'modelName', @@ -117,10 +119,9 @@ class OpenAI_LLMs implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const temperature = nodeData.inputs?.temperature as string const modelName = nodeData.inputs?.modelName as string - const openAIApiKey = nodeData.inputs?.openAIApiKey as string const maxTokens = nodeData.inputs?.maxTokens as string const topP = nodeData.inputs?.topP as string const frequencyPenalty = nodeData.inputs?.frequencyPenalty as string @@ -131,6 +132,9 @@ class OpenAI_LLMs implements INode { const streaming = nodeData.inputs?.streaming as boolean const basePath = nodeData.inputs?.basepath as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const openAIApiKey = getCredentialParam('openAIApiKey', credentialData, nodeData) + const obj: Partial & { openAIApiKey?: string } = { temperature: parseFloat(temperature), modelName, diff --git a/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts b/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts index 8a160223..9caf604c 100644 --- a/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts +++ b/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts @@ -1,5 +1,5 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { ICommonObject } from '../../../src' import { MotorheadMemory, MotorheadMemoryInput } from 'langchain/memory' @@ -11,6 +11,7 @@ class MotorMemory_Memory implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -21,6 +22,14 @@ class MotorMemory_Memory implements INode { this.category = 'Memory' this.description = 'Remembers previous conversational back and forths directly' this.baseClasses = [this.type, ...getBaseClasses(MotorheadMemory)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + optional: true, + description: 'Only needed when using hosted solution - https://getmetal.io', + credentialNames: ['motorheadMemoryApi'] + } this.inputs = [ { label: 'Base URL', @@ -43,22 +52,6 @@ class MotorMemory_Memory implements INode { default: '', additionalParams: true, optional: true - }, - { - label: 'API Key', - name: 'apiKey', - type: 'password', - description: 'Only needed when using hosted solution - https://getmetal.io', - additionalParams: true, - optional: true - }, - { - label: 'Client ID', - name: 'clientId', - type: 'string', - description: 'Only needed when using hosted solution - https://getmetal.io', - additionalParams: true, - optional: true } ] } @@ -67,11 +60,13 @@ class MotorMemory_Memory implements INode { const memoryKey = nodeData.inputs?.memoryKey as string const baseURL = nodeData.inputs?.baseURL as string const sessionId = nodeData.inputs?.sessionId as string - const apiKey = nodeData.inputs?.apiKey as string - const clientId = nodeData.inputs?.clientId as string const chatId = options?.chatId as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const apiKey = getCredentialParam('apiKey', credentialData, nodeData) + const clientId = getCredentialParam('clientId', credentialData, nodeData) + let obj: MotorheadMemoryInput = { returnMessages: true, sessionId: sessionId ? sessionId : chatId, diff --git a/packages/components/nodes/memory/MotorheadMemory/MotorheadMemoryApi.credential.ts b/packages/components/nodes/memory/MotorheadMemory/MotorheadMemoryApi.credential.ts new file mode 100644 index 00000000..4563cda2 --- /dev/null +++ b/packages/components/nodes/memory/MotorheadMemory/MotorheadMemoryApi.credential.ts @@ -0,0 +1,29 @@ +import { INodeParams, INodeCredential } from '../../../src/Interface' + +class MotorheadMemoryApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Motorhead Memory API' + this.name = 'motorheadMemoryApi' + this.description = + 'Refer to official guide on how to create API key and Client ID on Motorhead Memory' + this.inputs = [ + { + label: 'Client ID', + name: 'clientId', + type: 'string' + }, + { + label: 'API Key', + name: 'apiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: MotorheadMemoryApi } diff --git a/packages/components/nodes/memory/ZepMemory/ZepMemory.ts b/packages/components/nodes/memory/ZepMemory/ZepMemory.ts index 5ca1310d..211f60be 100644 --- a/packages/components/nodes/memory/ZepMemory/ZepMemory.ts +++ b/packages/components/nodes/memory/ZepMemory/ZepMemory.ts @@ -1,6 +1,6 @@ import { SystemMessage } from 'langchain/schema' import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { ZepMemory, ZepMemoryInput } from 'langchain/memory/zep' import { ICommonObject } from '../../../src' @@ -12,6 +12,7 @@ class ZepMemory_Memory implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -22,6 +23,14 @@ class ZepMemory_Memory implements INode { this.category = 'Memory' this.description = 'Summarizes the conversation and stores the memory in zep server' this.baseClasses = [this.type, ...getBaseClasses(ZepMemory)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + optional: true, + description: 'Configure JWT authentication on your Zep instance (Optional)', + credentialNames: ['zepMemoryApi'] + } this.inputs = [ { label: 'Base URL', @@ -44,18 +53,12 @@ class ZepMemory_Memory implements INode { additionalParams: true, optional: true }, - { - label: 'API Key', - name: 'apiKey', - type: 'password', - additionalParams: true, - optional: true - }, { label: 'Size', name: 'k', type: 'number', default: '10', + step: 1, description: 'Window of size k to surface the last k back-and-forths to use as memory.' }, { @@ -112,11 +115,13 @@ class ZepMemory_Memory implements INode { const autoSummaryTemplate = nodeData.inputs?.autoSummaryTemplate as string const autoSummary = nodeData.inputs?.autoSummary as boolean const sessionId = nodeData.inputs?.sessionId as string - const apiKey = nodeData.inputs?.apiKey as string const k = nodeData.inputs?.k as string const chatId = options?.chatId as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const apiKey = getCredentialParam('apiKey', credentialData, nodeData) + const obj: ZepMemoryInput = { baseURL, sessionId: sessionId ? sessionId : chatId, diff --git a/packages/components/nodes/memory/ZepMemory/ZepMemoryApi.credential.ts b/packages/components/nodes/memory/ZepMemory/ZepMemoryApi.credential.ts new file mode 100644 index 00000000..5e92ef5d --- /dev/null +++ b/packages/components/nodes/memory/ZepMemory/ZepMemoryApi.credential.ts @@ -0,0 +1,24 @@ +import { INodeParams, INodeCredential } from '../../../src/Interface' + +class ZepMemoryApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Zep Memory Api' + this.name = 'zepMemoryApi' + this.description = + 'Refer to official guide on how to create API key on Zep' + this.inputs = [ + { + label: 'API Key', + name: 'apiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: ZepMemoryApi } diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index d9233e49..4a69a9a0 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -59,7 +59,9 @@ export interface INodeParams { description?: string warning?: string options?: Array + credentialNames?: Array optional?: boolean | INodeDisplay + step?: number rows?: number list?: boolean acceptVariable?: boolean @@ -102,10 +104,18 @@ export interface INodeData extends INodeProperties { id: string inputs?: ICommonObject outputs?: ICommonObject + credential?: string instance?: any loadMethod?: string // method to load async options } +export interface INodeCredential { + label: string + name: string + description?: string + inputs?: INodeParams[] +} + export interface IMessage { message: string type: MessageType diff --git a/packages/components/src/utils.ts b/packages/components/src/utils.ts index e1399404..3244422f 100644 --- a/packages/components/src/utils.ts +++ b/packages/components/src/utils.ts @@ -6,6 +6,9 @@ import { JSDOM } from 'jsdom' import { BaseCallbackHandler } from 'langchain/callbacks' import { Server } from 'socket.io' import { ChainValues } from 'langchain/dist/schema' +import { DataSource } from 'typeorm' +import { ICommonObject, IDatabaseEntity, INodeData } from './Interface' +import { AES, enc } from 'crypto-js' export const numberOrExpressionRegex = '^(\\d+\\.?\\d*|{{.*}})$' //return true if string consists only numbers OR expression {{}} export const notEmptyRegex = '(.|\\s)*\\S(.|\\s)*' //return true if string is not empty or blank @@ -350,6 +353,89 @@ export const getEnvironmentVariable = (name: string): string | undefined => { } } +/** + * Returns the path of encryption key + * @returns {string} + */ +const getEncryptionKeyFilePath = (): string => { + const checkPaths = [ + path.join(__dirname, '..', '..', 'server', 'encryption.key'), + path.join(__dirname, '..', '..', '..', 'server', 'encryption.key'), + path.join(__dirname, '..', '..', '..', '..', 'server', 'encryption.key'), + path.join(__dirname, '..', '..', '..', '..', '..', 'server', 'encryption.key') + ] + for (const checkPath of checkPaths) { + if (fs.existsSync(checkPath)) { + return checkPath + } + } + return '' +} + +const getEncryptionKeyPath = (): string => { + return process.env.SECRETKEY_PATH ? path.join(process.env.SECRETKEY_PATH, 'encryption.key') : getEncryptionKeyFilePath() +} + +/** + * Returns the encryption key + * @returns {Promise} + */ +const getEncryptionKey = async (): Promise => { + try { + return await fs.promises.readFile(getEncryptionKeyPath(), 'utf8') + } catch (error) { + throw new Error(error) + } +} + +/** + * Decrypt credential data + * @param {string} encryptedData + * @param {string} componentCredentialName + * @param {IComponentCredentials} componentCredentials + * @returns {Promise} + */ +const decryptCredentialData = async (encryptedData: string): Promise => { + const encryptKey = await getEncryptionKey() + const decryptedData = AES.decrypt(encryptedData, encryptKey) + try { + return JSON.parse(decryptedData.toString(enc.Utf8)) + } catch (e) { + console.error(e) + throw new Error('Credentials could not be decrypted.') + } +} + +/** + * Get credential data + * @param {string} selectedCredentialId + * @param {ICommonObject} options + * @returns {Promise} + */ +export const getCredentialData = async (selectedCredentialId: string, options: ICommonObject): Promise => { + const appDataSource = options.appDataSource as DataSource + const databaseEntities = options.databaseEntities as IDatabaseEntity + + try { + const credential = await appDataSource.getRepository(databaseEntities['Credential']).findOneBy({ + id: selectedCredentialId + }) + + if (!credential) throw new Error(`Credential ${selectedCredentialId} not found`) + + // Decrpyt credentialData + const decryptedCredentialData = await decryptCredentialData(credential.encryptedData) + + return decryptedCredentialData + } catch (e) { + throw new Error(e) + } +} + +export const getCredentialParam = (paramName: string, credentialData: ICommonObject, nodeData: INodeData): any => { + return (nodeData.inputs as ICommonObject)[paramName] ?? credentialData[paramName] +} + /** * Custom chain handler class */ diff --git a/packages/server/package.json b/packages/server/package.json index 44b7e991..d04bcab2 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -48,6 +48,7 @@ "@oclif/core": "^1.13.10", "axios": "^0.27.2", "cors": "^2.8.5", + "crypto-js": "^4.1.1", "dotenv": "^16.0.0", "express": "^4.17.3", "express-basic-auth": "^1.2.1", @@ -63,6 +64,7 @@ }, "devDependencies": { "@types/cors": "^2.8.12", + "@types/crypto-js": "^4.1.1", "@types/multer": "^1.4.7", "concurrently": "^7.1.0", "nodemon": "^2.0.15", diff --git a/packages/server/src/ChildProcess.ts b/packages/server/src/ChildProcess.ts index e8aeaff2..1ac80557 100644 --- a/packages/server/src/ChildProcess.ts +++ b/packages/server/src/ChildProcess.ts @@ -5,6 +5,7 @@ import { DataSource } from 'typeorm' import { ChatFlow } from './entity/ChatFlow' import { ChatMessage } from './entity/ChatMessage' import { Tool } from './entity/Tool' +import { Credential } from './entity/Credential' export class ChildProcess { /** @@ -133,7 +134,7 @@ async function initDB() { type: 'sqlite', database: path.resolve(homePath, 'database.sqlite'), synchronize: true, - entities: [ChatFlow, ChatMessage, Tool], + entities: [ChatFlow, ChatMessage, Tool, Credential], migrations: [] }) return await childAppDataSource.initialize() diff --git a/packages/server/src/DataSource.ts b/packages/server/src/DataSource.ts index 03b9d5ce..fdf0c924 100644 --- a/packages/server/src/DataSource.ts +++ b/packages/server/src/DataSource.ts @@ -3,6 +3,7 @@ import path from 'path' import { DataSource } from 'typeorm' import { ChatFlow } from './entity/ChatFlow' import { ChatMessage } from './entity/ChatMessage' +import { Credential } from './entity/Credential' import { Tool } from './entity/Tool' import { getUserHome } from './utils' @@ -15,7 +16,7 @@ export const init = async (): Promise => { type: 'sqlite', database: path.resolve(homePath, 'database.sqlite'), synchronize: true, - entities: [ChatFlow, ChatMessage, Tool], + entities: [ChatFlow, ChatMessage, Tool, Credential], migrations: [] }) } diff --git a/packages/server/src/Interface.ts b/packages/server/src/Interface.ts index 0c630490..49d61036 100644 --- a/packages/server/src/Interface.ts +++ b/packages/server/src/Interface.ts @@ -38,10 +38,23 @@ export interface ITool { createdDate: Date } +export interface ICredential { + id: string + name: string + credentialName: string + encryptedData: string + updatedDate: Date + createdDate: Date +} + export interface IComponentNodes { [key: string]: INode } +export interface IComponentCredentials { + [key: string]: INode +} + export interface IVariableDict { [key: string]: string } @@ -167,3 +180,17 @@ export interface IChildProcessMessage { key: string value?: any } + +export type ICredentialDataDecrypted = ICommonObject + +// Plain credential object sent to server +export interface ICredentialReqBody { + name: string + credentialName: string + plainDataObj: ICredentialDataDecrypted +} + +// Decrypted credential object sent back to client +export interface ICredentialReturnResponse extends ICredential { + plainDataObj: ICredentialDataDecrypted +} diff --git a/packages/server/src/NodesPool.ts b/packages/server/src/NodesPool.ts index 1ee506ea..e339f592 100644 --- a/packages/server/src/NodesPool.ts +++ b/packages/server/src/NodesPool.ts @@ -1,23 +1,33 @@ -import { IComponentNodes } from './Interface' - +import { IComponentNodes, IComponentCredentials } from './Interface' import path from 'path' import { Dirent } from 'fs' import { getNodeModulesPackagePath } from './utils' import { promises } from 'fs' +import { ICommonObject } from 'flowise-components' export class NodesPool { componentNodes: IComponentNodes = {} + componentCredentials: IComponentCredentials = {} + private credentialIconPath: ICommonObject = {} /** - * Initialize to get all nodes + * Initialize to get all nodes & credentials */ async initialize() { + await this.initializeNodes() + await this.initializeCrdentials() + } + + /** + * Initialize nodes + */ + private async initializeNodes() { const packagePath = getNodeModulesPackagePath('flowise-components') const nodesPath = path.join(packagePath, 'dist', 'nodes') const nodeFiles = await this.getFiles(nodesPath) return Promise.all( nodeFiles.map(async (file) => { - if (file.endsWith('.js')) { + if (file.endsWith('.js') && !file.endsWith('.credential.js')) { const nodeModule = await require(file) if (nodeModule.nodeClass) { @@ -37,6 +47,13 @@ export class NodesPool { filePath.pop() const nodeIconAbsolutePath = `${filePath.join('/')}/${newNodeInstance.icon}` this.componentNodes[newNodeInstance.name].icon = nodeIconAbsolutePath + + // Store icon path for componentCredentials + if (newNodeInstance.credential) { + for (const credName of newNodeInstance.credential.credentialNames) { + this.credentialIconPath[credName] = nodeIconAbsolutePath + } + } } } } @@ -44,12 +61,33 @@ export class NodesPool { ) } + /** + * Initialize credentials + */ + private async initializeCrdentials() { + const packagePath = getNodeModulesPackagePath('flowise-components') + const nodesPath = path.join(packagePath, 'dist', 'nodes') + const nodeFiles = await this.getFiles(nodesPath) + return Promise.all( + nodeFiles.map(async (file) => { + if (file.endsWith('.credential.js')) { + const credentialModule = await require(file) + if (credentialModule.credClass) { + const newCredInstance = new credentialModule.credClass() + newCredInstance.icon = this.credentialIconPath[newCredInstance.name] ?? '' + this.componentCredentials[newCredInstance.name] = newCredInstance + } + } + }) + ) + } + /** * Recursive function to get node files * @param {string} dir * @returns {string[]} */ - async getFiles(dir: string): Promise { + private async getFiles(dir: string): Promise { const dirents = await promises.readdir(dir, { withFileTypes: true }) const files = await Promise.all( dirents.map((dirent: Dirent) => { diff --git a/packages/server/src/entity/Credential.ts b/packages/server/src/entity/Credential.ts new file mode 100644 index 00000000..b724eed6 --- /dev/null +++ b/packages/server/src/entity/Credential.ts @@ -0,0 +1,24 @@ +/* eslint-disable */ +import { Entity, Column, PrimaryGeneratedColumn, Index, CreateDateColumn, UpdateDateColumn } from 'typeorm' +import { ICredential } from '../Interface' + +@Entity() +export class Credential implements ICredential { + @PrimaryGeneratedColumn('uuid') + id: string + + @Column() + name: string + + @Column() + credentialName: string + + @Column() + encryptedData: string + + @CreateDateColumn() + createdDate: Date + + @UpdateDateColumn() + updatedDate: Date +} diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 0f87aeba..b4316b69 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -17,7 +17,8 @@ import { INodeData, IDatabaseExport, IRunChatflowMessageValue, - IChildProcessMessage + IChildProcessMessage, + ICredentialReturnResponse } from './Interface' import { getNodeModulesPackagePath, @@ -39,17 +40,20 @@ import { isFlowValidForStream, isVectorStoreFaiss, databaseEntities, - getApiKey + getApiKey, + transformToCredentialEntity, + decryptCredentialData } from './utils' -import { cloneDeep } from 'lodash' +import { cloneDeep, omit } from 'lodash' import { getDataSource } from './DataSource' import { NodesPool } from './NodesPool' import { ChatFlow } from './entity/ChatFlow' import { ChatMessage } from './entity/ChatMessage' +import { Credential } from './entity/Credential' +import { Tool } from './entity/Tool' import { ChatflowPool } from './ChatflowPool' import { ICommonObject, INodeOptionsValue } from 'flowise-components' import { fork } from 'child_process' -import { Tool } from './entity/Tool' export class App { app: express.Application @@ -70,10 +74,11 @@ export class App { .then(async () => { logger.info('📦 [server]: Data Source has been initialized!') - // Initialize pools + // Initialize nodes pool this.nodesPool = new NodesPool() await this.nodesPool.initialize() + // Initialize chatflow pool this.chatflowPool = new ChatflowPool() // Initialize API keys @@ -104,6 +109,7 @@ export class App { '/api/v1/public-chatflows', '/api/v1/prediction/', '/api/v1/node-icon/', + '/api/v1/components-credentials-icon/', '/api/v1/chatflows-streaming' ] this.app.use((req, res, next) => { @@ -116,7 +122,7 @@ export class App { const upload = multer({ dest: `${path.join(__dirname, '..', 'uploads')}/` }) // ---------------------------------------- - // Nodes + // Components // ---------------------------------------- // Get all component nodes @@ -129,6 +135,16 @@ export class App { return res.json(returnData) }) + // Get all component credentials + this.app.get('/api/v1/components-credentials', async (req: Request, res: Response) => { + const returnData = [] + for (const credName in this.nodesPool.componentCredentials) { + const clonedCred = cloneDeep(this.nodesPool.componentCredentials[credName]) + returnData.push(clonedCred) + } + return res.json(returnData) + }) + // Get specific component node via name this.app.get('/api/v1/nodes/:name', (req: Request, res: Response) => { if (Object.prototype.hasOwnProperty.call(this.nodesPool.componentNodes, req.params.name)) { @@ -138,6 +154,27 @@ export class App { } }) + // Get component credential via name + this.app.get('/api/v1/components-credentials/:name', (req: Request, res: Response) => { + if (!req.params.name.includes('&')) { + if (Object.prototype.hasOwnProperty.call(this.nodesPool.componentCredentials, req.params.name)) { + return res.json(this.nodesPool.componentCredentials[req.params.name]) + } else { + throw new Error(`Credential ${req.params.name} not found`) + } + } else { + const returnResponse = [] + for (const name of req.params.name.split('&')) { + if (Object.prototype.hasOwnProperty.call(this.nodesPool.componentCredentials, name)) { + returnResponse.push(this.nodesPool.componentCredentials[name]) + } else { + throw new Error(`Credential ${name} not found`) + } + } + return res.json(returnResponse) + } + }) + // Returns specific component node icon via name this.app.get('/api/v1/node-icon/:name', (req: Request, res: Response) => { if (Object.prototype.hasOwnProperty.call(this.nodesPool.componentNodes, req.params.name)) { @@ -157,6 +194,25 @@ export class App { } }) + // Returns specific component credential icon via name + this.app.get('/api/v1/components-credentials-icon/:name', (req: Request, res: Response) => { + if (Object.prototype.hasOwnProperty.call(this.nodesPool.componentCredentials, req.params.name)) { + const credInstance = this.nodesPool.componentCredentials[req.params.name] + if (credInstance.icon === undefined) { + throw new Error(`Credential ${req.params.name} icon not found`) + } + + if (credInstance.icon.endsWith('.svg') || credInstance.icon.endsWith('.png') || credInstance.icon.endsWith('.jpg')) { + const filepath = credInstance.icon + res.sendFile(filepath) + } else { + throw new Error(`Credential ${req.params.name} icon is missing icon`) + } + } else { + throw new Error(`Credential ${req.params.name} not found`) + } + }) + // load async options this.app.post('/api/v1/node-load-method/:name', async (req: Request, res: Response) => { const nodeData: INodeData = req.body @@ -324,6 +380,91 @@ export class App { return res.json(results) }) + // ---------------------------------------- + // Credentials + // ---------------------------------------- + + // Create new credential + this.app.post('/api/v1/credentials', async (req: Request, res: Response) => { + const body = req.body + const newCredential = await transformToCredentialEntity(body) + const credential = this.AppDataSource.getRepository(Credential).create(newCredential) + const results = await this.AppDataSource.getRepository(Credential).save(credential) + return res.json(results) + }) + + // Get all credentials + this.app.get('/api/v1/credentials', async (req: Request, res: Response) => { + if (req.query.credentialName) { + let returnCredentials = [] + if (Array.isArray(req.query.credentialName)) { + for (let i = 0; i < req.query.credentialName.length; i += 1) { + const name = req.query.credentialName[i] as string + const credentials = await this.AppDataSource.getRepository(Credential).findBy({ + credentialName: name + }) + returnCredentials.push(...credentials) + } + } else { + const credentials = await this.AppDataSource.getRepository(Credential).findBy({ + credentialName: req.query.credentialName as string + }) + returnCredentials = [...credentials] + } + return res.json(returnCredentials) + } else { + const credentials = await this.AppDataSource.getRepository(Credential).find() + const returnCredentials = [] + for (const credential of credentials) { + returnCredentials.push(omit(credential, ['encryptedData'])) + } + return res.json(returnCredentials) + } + }) + + // Get specific credential + this.app.get('/api/v1/credentials/:id', async (req: Request, res: Response) => { + const credential = await this.AppDataSource.getRepository(Credential).findOneBy({ + id: req.params.id + }) + + if (!credential) return res.status(404).send(`Credential ${req.params.id} not found`) + + // Decrpyt credentialData + const decryptedCredentialData = await decryptCredentialData( + credential.encryptedData, + credential.credentialName, + this.nodesPool.componentCredentials + ) + const returnCredential: ICredentialReturnResponse = { + ...credential, + plainDataObj: decryptedCredentialData + } + return res.json(omit(returnCredential, ['encryptedData'])) + }) + + // Update credential + this.app.put('/api/v1/credentials/:id', async (req: Request, res: Response) => { + const credential = await this.AppDataSource.getRepository(Credential).findOneBy({ + id: req.params.id + }) + + if (!credential) return res.status(404).send(`Credential ${req.params.id} not found`) + + const body = req.body + const updateCredential = await transformToCredentialEntity(body) + this.AppDataSource.getRepository(Credential).merge(credential, updateCredential) + const result = await this.AppDataSource.getRepository(Credential).save(credential) + + return res.json(result) + }) + + // Delete all chatmessages from chatflowid + this.app.delete('/api/v1/credentials/:id', async (req: Request, res: Response) => { + const results = await this.AppDataSource.getRepository(Credential).delete({ id: req.params.id }) + return res.json(results) + }) + // ---------------------------------------- // Tools // ---------------------------------------- @@ -393,7 +534,7 @@ export class App { const flowData = chatflow.flowData const parsedFlowData: IReactFlowObject = JSON.parse(flowData) const nodes = parsedFlowData.nodes - const availableConfigs = findAvailableConfigs(nodes) + const availableConfigs = findAvailableConfigs(nodes, this.nodesPool.componentCredentials) return res.json(availableConfigs) }) diff --git a/packages/server/src/utils/index.ts b/packages/server/src/utils/index.ts index 3ee7a25b..77b047cc 100644 --- a/packages/server/src/utils/index.ts +++ b/packages/server/src/utils/index.ts @@ -13,18 +13,26 @@ import { IReactFlowNode, IVariableDict, INodeData, - IOverrideConfig + IOverrideConfig, + ICredentialDataDecrypted, + IComponentCredentials, + ICredentialReqBody } from '../Interface' import { cloneDeep, get, omit, merge } from 'lodash' import { ICommonObject, getInputVariables, IDatabaseEntity } from 'flowise-components' import { scryptSync, randomBytes, timingSafeEqual } from 'crypto' +import { lib, PBKDF2, AES, enc } from 'crypto-js' + import { ChatFlow } from '../entity/ChatFlow' import { ChatMessage } from '../entity/ChatMessage' +import { Credential } from '../entity/Credential' import { Tool } from '../entity/Tool' import { DataSource } from 'typeorm' const QUESTION_VAR_PREFIX = 'question' -export const databaseEntities: IDatabaseEntity = { ChatFlow: ChatFlow, ChatMessage: ChatMessage, Tool: Tool } +const REDACTED_CREDENTIAL_VALUE = '_FLOWISE_BLANK_07167752-1a71-43b1-bf8f-4f32252165db' + +export const databaseEntities: IDatabaseEntity = { ChatFlow: ChatFlow, ChatMessage: ChatMessage, Tool: Tool, Credential: Credential } /** * Returns the home folder path of the user if @@ -399,9 +407,8 @@ export const replaceInputsWithConfig = (flowNodeData: INodeData, overrideConfig: const types = 'inputs' const getParamValues = (paramsObj: ICommonObject) => { - for (const key in paramsObj) { - const paramValue: string = paramsObj[key] - paramsObj[key] = overrideConfig[key] ?? paramValue + for (const config in overrideConfig) { + paramsObj[config] = overrideConfig[config] } } @@ -623,11 +630,12 @@ export const mapMimeTypeToInputField = (mimeType: string) => { } /** - * Find all available inpur params config + * Find all available input params config * @param {IReactFlowNode[]} reactFlowNodes - * @returns {Promise} + * @param {IComponentCredentials} componentCredentials + * @returns {IOverrideConfig[]} */ -export const findAvailableConfigs = (reactFlowNodes: IReactFlowNode[]) => { +export const findAvailableConfigs = (reactFlowNodes: IReactFlowNode[], componentCredentials: IComponentCredentials) => { const configs: IOverrideConfig[] = [] for (const flowNode of reactFlowNodes) { @@ -653,6 +661,23 @@ export const findAvailableConfigs = (reactFlowNodes: IReactFlowNode[]) => { .join(', ') : 'string' } + } else if (inputParam.type === 'credential') { + // get component credential inputs + for (const name of inputParam.credentialNames ?? []) { + if (Object.prototype.hasOwnProperty.call(componentCredentials, name)) { + const inputs = componentCredentials[name]?.inputs ?? [] + for (const input of inputs) { + obj = { + node: flowNode.data.label, + label: input.label, + name: input.name, + type: input.type === 'password' ? 'string' : input.type + } + configs.push(obj) + } + } + } + continue } else { obj = { node: flowNode.data.label, @@ -705,3 +730,118 @@ export const isFlowValidForStream = (reactFlowNodes: IReactFlowNode[], endingNod return isChatOrLLMsExist && isValidChainOrAgent && !isVectorStoreFaiss(endingNodeData) && process.env.EXECUTION_MODE !== 'child' } + +/** + * Returns the path of encryption key + * @returns {string} + */ +export const getEncryptionKeyPath = (): string => { + return process.env.SECRETKEY_PATH + ? path.join(process.env.SECRETKEY_PATH, 'encryption.key') + : path.join(__dirname, '..', '..', 'encryption.key') +} + +/** + * Generate an encryption key + * @returns {string} + */ +export const generateEncryptKey = (): string => { + const salt = lib.WordArray.random(128 / 8) + const key256Bits = PBKDF2(process.env.PASSPHRASE || 'MYPASSPHRASE', salt, { + keySize: 256 / 32, + iterations: 1000 + }) + return key256Bits.toString() +} + +/** + * Returns the encryption key + * @returns {Promise} + */ +export const getEncryptionKey = async (): Promise => { + try { + return await fs.promises.readFile(getEncryptionKeyPath(), 'utf8') + } catch (error) { + const encryptKey = generateEncryptKey() + await fs.promises.writeFile(getEncryptionKeyPath(), encryptKey) + return encryptKey + } +} + +/** + * Encrypt credential data + * @param {ICredentialDataDecrypted} plainDataObj + * @returns {Promise} + */ +export const encryptCredentialData = async (plainDataObj: ICredentialDataDecrypted): Promise => { + const encryptKey = await getEncryptionKey() + return AES.encrypt(JSON.stringify(plainDataObj), encryptKey).toString() +} + +/** + * Decrypt credential data + * @param {string} encryptedData + * @param {string} componentCredentialName + * @param {IComponentCredentials} componentCredentials + * @returns {Promise} + */ +export const decryptCredentialData = async ( + encryptedData: string, + componentCredentialName?: string, + componentCredentials?: IComponentCredentials +): Promise => { + const encryptKey = await getEncryptionKey() + const decryptedData = AES.decrypt(encryptedData, encryptKey) + try { + if (componentCredentialName && componentCredentials) { + const plainDataObj = JSON.parse(decryptedData.toString(enc.Utf8)) + return redactCredentialWithPasswordType(componentCredentialName, plainDataObj, componentCredentials) + } + return JSON.parse(decryptedData.toString(enc.Utf8)) + } catch (e) { + console.error(e) + throw new Error('Credentials could not be decrypted.') + } +} + +/** + * Transform ICredentialBody from req to Credential entity + * @param {ICredentialReqBody} body + * @returns {Credential} + */ +export const transformToCredentialEntity = async (body: ICredentialReqBody): Promise => { + const encryptedData = await encryptCredentialData(body.plainDataObj) + + const credentialBody = { + name: body.name, + credentialName: body.credentialName, + encryptedData + } + + const newCredential = new Credential() + Object.assign(newCredential, credentialBody) + + return newCredential +} + +/** + * Redact values that are of password type to avoid sending back to client + * @param {string} componentCredentialName + * @param {ICredentialDataDecrypted} decryptedCredentialObj + * @param {IComponentCredentials} componentCredentials + * @returns {ICredentialDataDecrypted} + */ +export const redactCredentialWithPasswordType = ( + componentCredentialName: string, + decryptedCredentialObj: ICredentialDataDecrypted, + componentCredentials: IComponentCredentials +): ICredentialDataDecrypted => { + const plainDataObj = cloneDeep(decryptedCredentialObj) + for (const cred in plainDataObj) { + const inputParam = componentCredentials[componentCredentialName].inputs?.find((inp) => inp.type === 'password' && inp.name === cred) + if (inputParam) { + plainDataObj[cred] = REDACTED_CREDENTIAL_VALUE + } + } + return plainDataObj +} diff --git a/packages/server/src/utils/logger.ts b/packages/server/src/utils/logger.ts index 1c28b173..c5ff26b0 100644 --- a/packages/server/src/utils/logger.ts +++ b/packages/server/src/utils/logger.ts @@ -81,7 +81,8 @@ export function expressRequestLogger(req: Request, res: Response, next: NextFunc GET: '⬇️', POST: '⬆️', PUT: '🖊', - DELETE: '❌' + DELETE: '❌', + OPTION: '🔗' } return requetsEmojis[method] || '?' diff --git a/packages/ui/src/api/credentials.js b/packages/ui/src/api/credentials.js new file mode 100644 index 00000000..9dbdcf7a --- /dev/null +++ b/packages/ui/src/api/credentials.js @@ -0,0 +1,28 @@ +import client from './client' + +const getAllCredentials = () => client.get('/credentials') + +const getCredentialsByName = (componentCredentialName) => client.get(`/credentials?credentialName=${componentCredentialName}`) + +const getAllComponentsCredentials = () => client.get('/components-credentials') + +const getSpecificCredential = (id) => client.get(`/credentials/${id}`) + +const getSpecificComponentCredential = (name) => client.get(`/components-credentials/${name}`) + +const createCredential = (body) => client.post(`/credentials`, body) + +const updateCredential = (id, body) => client.put(`/credentials/${id}`, body) + +const deleteCredential = (id) => client.delete(`/credentials/${id}`) + +export default { + getAllCredentials, + getCredentialsByName, + getAllComponentsCredentials, + getSpecificCredential, + getSpecificComponentCredential, + createCredential, + updateCredential, + deleteCredential +} diff --git a/packages/ui/src/assets/images/credential_empty.svg b/packages/ui/src/assets/images/credential_empty.svg new file mode 100644 index 00000000..0951ee07 --- /dev/null +++ b/packages/ui/src/assets/images/credential_empty.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/ui/src/menu-items/dashboard.js b/packages/ui/src/menu-items/dashboard.js index 948b4e4a..87ef88f9 100644 --- a/packages/ui/src/menu-items/dashboard.js +++ b/packages/ui/src/menu-items/dashboard.js @@ -1,8 +1,8 @@ // assets -import { IconHierarchy, IconBuildingStore, IconKey, IconTool } from '@tabler/icons' +import { IconHierarchy, IconBuildingStore, IconKey, IconTool, IconLock } from '@tabler/icons' // constant -const icons = { IconHierarchy, IconBuildingStore, IconKey, IconTool } +const icons = { IconHierarchy, IconBuildingStore, IconKey, IconTool, IconLock } // ==============================|| DASHBOARD MENU ITEMS ||============================== // @@ -35,6 +35,14 @@ const dashboard = { icon: icons.IconTool, breadcrumbs: true }, + { + id: 'credentials', + title: 'Credentials', + type: 'item', + url: '/credentials', + icon: icons.IconLock, + breadcrumbs: true + }, { id: 'apikey', title: 'API Keys', diff --git a/packages/ui/src/routes/MainRoutes.js b/packages/ui/src/routes/MainRoutes.js index 28e60287..9a1c29af 100644 --- a/packages/ui/src/routes/MainRoutes.js +++ b/packages/ui/src/routes/MainRoutes.js @@ -13,9 +13,12 @@ const Marketplaces = Loadable(lazy(() => import('views/marketplaces'))) // apikey routing const APIKey = Loadable(lazy(() => import('views/apikey'))) -// apikey routing +// tools routing const Tools = Loadable(lazy(() => import('views/tools'))) +// credentials routing +const Credentials = Loadable(lazy(() => import('views/credentials'))) + // ==============================|| MAIN ROUTING ||============================== // const MainRoutes = { @@ -41,6 +44,10 @@ const MainRoutes = { { path: '/tools', element: + }, + { + path: '/credentials', + element: } ] } diff --git a/packages/ui/src/store/constant.js b/packages/ui/src/store/constant.js index c3138257..c0fce49d 100644 --- a/packages/ui/src/store/constant.js +++ b/packages/ui/src/store/constant.js @@ -5,3 +5,4 @@ export const appDrawerWidth = 320 export const maxScroll = 100000 export const baseURL = process.env.NODE_ENV === 'production' ? window.location.origin : window.location.origin.replace(':8080', ':3000') export const uiBaseURL = window.location.origin +export const FLOWISE_CREDENTIAL_ID = 'FLOWISE_CREDENTIAL_ID' diff --git a/packages/ui/src/ui-component/dropdown/AsyncDropdown.js b/packages/ui/src/ui-component/dropdown/AsyncDropdown.js index 8dfd782d..b24fa02b 100644 --- a/packages/ui/src/ui-component/dropdown/AsyncDropdown.js +++ b/packages/ui/src/ui-component/dropdown/AsyncDropdown.js @@ -1,13 +1,17 @@ import { useState, useEffect, Fragment } from 'react' import { useSelector } from 'react-redux' - import PropTypes from 'prop-types' import axios from 'axios' +// Material import Autocomplete, { autocompleteClasses } from '@mui/material/Autocomplete' import { Popper, CircularProgress, TextField, Box, Typography } from '@mui/material' import { styled } from '@mui/material/styles' +// API +import credentialsApi from 'api/credentials' + +// const import { baseURL } from 'store/constant' const StyledPopper = styled(Popper)({ @@ -49,6 +53,7 @@ export const AsyncDropdown = ({ onSelect, isCreateNewOption, onCreateNew, + credentialNames = [], disabled = false, disableClearable = false }) => { @@ -62,11 +67,36 @@ export const AsyncDropdown = ({ const addNewOption = [{ label: '- Create New -', name: '-create-' }] let [internalValue, setInternalValue] = useState(value ?? 'choose an option') + const fetchCredentialList = async () => { + try { + let names = '' + if (credentialNames.length > 1) { + names = credentialNames.join('&credentialName=') + } else { + names = credentialNames[0] + } + const resp = await credentialsApi.getCredentialsByName(names) + if (resp.data) { + const returnList = [] + for (let i = 0; i < resp.data.length; i += 1) { + const data = { + label: resp.data[i].name, + name: resp.data[i].id + } + returnList.push(data) + } + return returnList + } + } catch (error) { + console.error(error) + } + } + useEffect(() => { setLoading(true) ;(async () => { const fetchData = async () => { - let response = await fetchList({ name, nodeData }) + let response = credentialNames.length ? await fetchCredentialList() : await fetchList({ name, nodeData }) if (isCreateNewOption) setOptions([...response, ...addNewOption]) else setOptions([...response]) setLoading(false) @@ -142,6 +172,7 @@ AsyncDropdown.propTypes = { onSelect: PropTypes.func, onCreateNew: PropTypes.func, disabled: PropTypes.bool, + credentialNames: PropTypes.array, disableClearable: PropTypes.bool, isCreateNewOption: PropTypes.bool } diff --git a/packages/ui/src/ui-component/input/Input.js b/packages/ui/src/ui-component/input/Input.js index e7744764..8f2d55e0 100644 --- a/packages/ui/src/ui-component/input/Input.js +++ b/packages/ui/src/ui-component/input/Input.js @@ -37,7 +37,7 @@ export const Input = ({ inputParam, value, onChange, disabled = false, showDialo onChange(e.target.value) }} inputProps={{ - step: 0.1, + step: inputParam.step ?? 0.1, style: { height: inputParam.rows ? '90px' : 'inherit' } diff --git a/packages/ui/src/utils/genericHelper.js b/packages/ui/src/utils/genericHelper.js index 305326f7..eb3b08bc 100644 --- a/packages/ui/src/utils/genericHelper.js +++ b/packages/ui/src/utils/genericHelper.js @@ -41,6 +41,7 @@ export const initNode = (nodeData, newNodeId) => { const whitelistTypes = ['asyncOptions', 'options', 'string', 'number', 'boolean', 'password', 'json', 'code', 'date', 'file', 'folder'] + // Inputs for (let i = 0; i < incoming; i += 1) { const newInput = { ...nodeData.inputs[i], @@ -53,6 +54,16 @@ export const initNode = (nodeData, newNodeId) => { } } + // Credential + if (nodeData.credential) { + const newInput = { + ...nodeData.credential, + id: `${newNodeId}-input-${nodeData.credential.name}-${nodeData.credential.type}` + } + inputParams.unshift(newInput) + } + + // Outputs const outputAnchors = [] for (let i = 0; i < outgoing; i += 1) { if (nodeData.outputs && nodeData.outputs.length) { @@ -129,6 +140,8 @@ export const initNode = (nodeData, newNodeId) => { } ] */ + + // Inputs if (nodeData.inputs) { nodeData.inputAnchors = inputAnchors nodeData.inputParams = inputParams @@ -139,13 +152,17 @@ export const initNode = (nodeData, newNodeId) => { nodeData.inputs = {} } + // Outputs if (nodeData.outputs) { nodeData.outputs = initializeDefaultNodeData(outputAnchors) } else { nodeData.outputs = {} } - nodeData.outputAnchors = outputAnchors + + // Credential + if (nodeData.credential) nodeData.credential = '' + nodeData.id = newNodeId return nodeData diff --git a/packages/ui/src/views/canvas/CredentialInputHandler.js b/packages/ui/src/views/canvas/CredentialInputHandler.js new file mode 100644 index 00000000..4f874719 --- /dev/null +++ b/packages/ui/src/views/canvas/CredentialInputHandler.js @@ -0,0 +1,149 @@ +import PropTypes from 'prop-types' +import { useRef, useState } from 'react' + +// material-ui +import { IconButton } from '@mui/material' +import { IconEdit } from '@tabler/icons' + +// project import +import { AsyncDropdown } from 'ui-component/dropdown/AsyncDropdown' +import AddEditCredentialDialog from 'views/credentials/AddEditCredentialDialog' +import CredentialListDialog from 'views/credentials/CredentialListDialog' + +// API +import credentialsApi from 'api/credentials' + +// ===========================|| CredentialInputHandler ||=========================== // + +const CredentialInputHandler = ({ inputParam, data, onSelect, disabled = false }) => { + const ref = useRef(null) + const [credentialId, setCredentialId] = useState(data?.credential ?? '') + const [showCredentialListDialog, setShowCredentialListDialog] = useState(false) + const [credentialListDialogProps, setCredentialListDialogProps] = useState({}) + const [showSpecificCredentialDialog, setShowSpecificCredentialDialog] = useState(false) + const [specificCredentialDialogProps, setSpecificCredentialDialogProps] = useState({}) + const [reloadTimestamp, setReloadTimestamp] = useState(Date.now().toString()) + + const editCredential = (credentialId) => { + const dialogProp = { + type: 'EDIT', + cancelButtonName: 'Cancel', + confirmButtonName: 'Save', + credentialId + } + setSpecificCredentialDialogProps(dialogProp) + setShowSpecificCredentialDialog(true) + } + + const addAsyncOption = async () => { + try { + let names = '' + if (inputParam.credentialNames.length > 1) { + names = inputParam.credentialNames.join('&') + } else { + names = inputParam.credentialNames[0] + } + const componentCredentialsResp = await credentialsApi.getSpecificComponentCredential(names) + if (componentCredentialsResp.data) { + if (Array.isArray(componentCredentialsResp.data)) { + const dialogProp = { + title: 'Add New Credential', + componentsCredentials: componentCredentialsResp.data + } + setCredentialListDialogProps(dialogProp) + setShowCredentialListDialog(true) + } else { + const dialogProp = { + type: 'ADD', + cancelButtonName: 'Cancel', + confirmButtonName: 'Add', + credentialComponent: componentCredentialsResp.data + } + setSpecificCredentialDialogProps(dialogProp) + setShowSpecificCredentialDialog(true) + } + } + } catch (error) { + console.error(error) + } + } + + const onConfirmAsyncOption = (selectedCredentialId = '') => { + setCredentialId(selectedCredentialId) + setReloadTimestamp(Date.now().toString()) + setSpecificCredentialDialogProps({}) + setShowSpecificCredentialDialog(false) + onSelect(selectedCredentialId) + } + + const onCredentialSelected = (credentialComponent) => { + setShowCredentialListDialog(false) + const dialogProp = { + type: 'ADD', + cancelButtonName: 'Cancel', + confirmButtonName: 'Add', + credentialComponent + } + setSpecificCredentialDialogProps(dialogProp) + setShowSpecificCredentialDialog(true) + } + + return ( +
+ {inputParam && ( + <> + {inputParam.type === 'credential' && ( + <> +
+
+ { + setCredentialId(newValue) + onSelect(newValue) + }} + onCreateNew={() => addAsyncOption(inputParam.name)} + /> + {credentialId && ( + editCredential(credentialId)}> + + + )} +
+ + )} + + )} + {showSpecificCredentialDialog && ( + setShowSpecificCredentialDialog(false)} + onConfirm={onConfirmAsyncOption} + > + )} + {showCredentialListDialog && ( + setShowCredentialListDialog(false)} + onCredentialSelected={onCredentialSelected} + > + )} +
+ ) +} + +CredentialInputHandler.propTypes = { + inputParam: PropTypes.object, + data: PropTypes.object, + onSelect: PropTypes.func, + disabled: PropTypes.bool +} + +export default CredentialInputHandler diff --git a/packages/ui/src/views/canvas/NodeInputHandler.js b/packages/ui/src/views/canvas/NodeInputHandler.js index ba72a4ce..176df52f 100644 --- a/packages/ui/src/views/canvas/NodeInputHandler.js +++ b/packages/ui/src/views/canvas/NodeInputHandler.js @@ -21,9 +21,14 @@ import { JsonEditorInput } from 'ui-component/json/JsonEditor' import { TooltipWithParser } from 'ui-component/tooltip/TooltipWithParser' import ToolDialog from 'views/tools/ToolDialog' import FormatPromptValuesDialog from 'ui-component/dialog/FormatPromptValuesDialog' +import CredentialInputHandler from './CredentialInputHandler' +// utils import { getInputVariables } from 'utils/genericHelper' +// const +import { FLOWISE_CREDENTIAL_ID } from 'store/constant' + const EDITABLE_TOOLS = ['selectedTool'] const CustomWidthTooltip = styled(({ className, ...props }) => )({ @@ -226,6 +231,17 @@ const NodeInputHandler = ({ inputAnchor, inputParam, data, disabled = false, isA {inputParam.warning}
)} + {inputParam.type === 'credential' && ( + { + data.credential = newValue + data.inputs[FLOWISE_CREDENTIAL_ID] = newValue // in case data.credential is not updated + }} + /> + )} {inputParam.type === 'file' && ( { const handleSaveFlow = (chatflowName) => { if (reactFlowInstance) { - setNodes((nds) => - nds.map((node) => { - node.data = { - ...node.data, - selected: false - } - return node - }) - ) + const nodes = reactFlowInstance.getNodes().map((node) => { + const nodeData = cloneDeep(node.data) + if (Object.prototype.hasOwnProperty.call(nodeData.inputs, FLOWISE_CREDENTIAL_ID)) { + nodeData.credential = nodeData.inputs[FLOWISE_CREDENTIAL_ID] + nodeData.inputs = omit(nodeData.inputs, [FLOWISE_CREDENTIAL_ID]) + } + node.data = { + ...nodeData, + selected: false + } + return node + }) const rfInstanceObject = reactFlowInstance.toObject() + rfInstanceObject.nodes = nodes const flowData = JSON.stringify(rfInstanceObject) if (!chatflow.id) { diff --git a/packages/ui/src/views/credentials/AddEditCredentialDialog.js b/packages/ui/src/views/credentials/AddEditCredentialDialog.js new file mode 100644 index 00000000..6a5c9568 --- /dev/null +++ b/packages/ui/src/views/credentials/AddEditCredentialDialog.js @@ -0,0 +1,276 @@ +import { createPortal } from 'react-dom' +import PropTypes from 'prop-types' +import { useState, useEffect } from 'react' +import { useDispatch } from 'react-redux' +import { enqueueSnackbar as enqueueSnackbarAction, closeSnackbar as closeSnackbarAction } from 'store/actions' +import parser from 'html-react-parser' + +// Material +import { Button, Dialog, DialogActions, DialogContent, DialogTitle, Box, Stack, OutlinedInput, Typography } from '@mui/material' + +// Project imports +import { StyledButton } from 'ui-component/button/StyledButton' +import ConfirmDialog from 'ui-component/dialog/ConfirmDialog' +import CredentialInputHandler from './CredentialInputHandler' + +// Icons +import { IconX } from '@tabler/icons' + +// API +import credentialsApi from 'api/credentials' + +// Hooks +import useApi from 'hooks/useApi' + +// utils +import useNotifier from 'utils/useNotifier' + +// const +import { baseURL } from 'store/constant' + +const AddEditCredentialDialog = ({ show, dialogProps, onCancel, onConfirm }) => { + const portalElement = document.getElementById('portal') + + const dispatch = useDispatch() + + // ==============================|| Snackbar ||============================== // + + useNotifier() + + const enqueueSnackbar = (...args) => dispatch(enqueueSnackbarAction(...args)) + const closeSnackbar = (...args) => dispatch(closeSnackbarAction(...args)) + + const getSpecificCredentialApi = useApi(credentialsApi.getSpecificCredential) + const getSpecificComponentCredentialApi = useApi(credentialsApi.getSpecificComponentCredential) + + const [credential, setCredential] = useState({}) + const [name, setName] = useState('') + const [credentialData, setCredentialData] = useState({}) + const [componentCredential, setComponentCredential] = useState({}) + + useEffect(() => { + if (getSpecificCredentialApi.data) { + setCredential(getSpecificCredentialApi.data) + if (getSpecificCredentialApi.data.name) { + setName(getSpecificCredentialApi.data.name) + } + if (getSpecificCredentialApi.data.plainDataObj) { + setCredentialData(getSpecificCredentialApi.data.plainDataObj) + } + getSpecificComponentCredentialApi.request(getSpecificCredentialApi.data.credentialName) + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [getSpecificCredentialApi.data]) + + useEffect(() => { + if (getSpecificComponentCredentialApi.data) { + setComponentCredential(getSpecificComponentCredentialApi.data) + } + }, [getSpecificComponentCredentialApi.data]) + + useEffect(() => { + if (dialogProps.type === 'EDIT' && dialogProps.data) { + // When credential dialog is opened from Credentials dashboard + getSpecificCredentialApi.request(dialogProps.data.id) + } else if (dialogProps.type === 'EDIT' && dialogProps.credentialId) { + // When credential dialog is opened from node in canvas + getSpecificCredentialApi.request(dialogProps.credentialId) + } else if (dialogProps.type === 'ADD' && dialogProps.credentialComponent) { + // When credential dialog is to add a new credential + setName('') + setCredential({}) + setCredentialData({}) + setComponentCredential(dialogProps.credentialComponent) + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [dialogProps]) + + const addNewCredential = async () => { + try { + const obj = { + name, + credentialName: componentCredential.name, + plainDataObj: credentialData + } + const createResp = await credentialsApi.createCredential(obj) + if (createResp.data) { + enqueueSnackbar({ + message: 'New Credential added', + options: { + key: new Date().getTime() + Math.random(), + variant: 'success', + action: (key) => ( + + ) + } + }) + onConfirm(createResp.data.id) + } + } catch (error) { + const errorData = error.response.data || `${error.response.status}: ${error.response.statusText}` + enqueueSnackbar({ + message: `Failed to add new Credential: ${errorData}`, + options: { + key: new Date().getTime() + Math.random(), + variant: 'error', + persist: true, + action: (key) => ( + + ) + } + }) + onCancel() + } + } + + const saveCredential = async () => { + try { + const saveResp = await credentialsApi.updateCredential(credential.id, { + name, + credentialName: componentCredential.name, + plainDataObj: credentialData + }) + if (saveResp.data) { + enqueueSnackbar({ + message: 'Credential saved', + options: { + key: new Date().getTime() + Math.random(), + variant: 'success', + action: (key) => ( + + ) + } + }) + onConfirm(saveResp.data.id) + } + } catch (error) { + const errorData = error.response.data || `${error.response.status}: ${error.response.statusText}` + enqueueSnackbar({ + message: `Failed to save Credential: ${errorData}`, + options: { + key: new Date().getTime() + Math.random(), + variant: 'error', + persist: true, + action: (key) => ( + + ) + } + }) + onCancel() + } + } + + const component = show ? ( + + + {componentCredential && componentCredential.label && ( +
+
+ {componentCredential.name} +
+ {componentCredential.label} +
+ )} +
+ + {componentCredential && componentCredential.description && ( + +
+ {parser(componentCredential.description)} +
+
+ )} + {componentCredential && componentCredential.label && ( + + + + Credential Name +  * + + + setName(e.target.value)} + /> + + )} + {componentCredential && + componentCredential.inputs && + componentCredential.inputs.map((inputParam, index) => ( + + ))} +
+ + (dialogProps.type === 'ADD' ? addNewCredential() : saveCredential())} + > + {dialogProps.confirmButtonName} + + + +
+ ) : null + + return createPortal(component, portalElement) +} + +AddEditCredentialDialog.propTypes = { + show: PropTypes.bool, + dialogProps: PropTypes.object, + onCancel: PropTypes.func, + onConfirm: PropTypes.func +} + +export default AddEditCredentialDialog diff --git a/packages/ui/src/views/credentials/CredentialInputHandler.js b/packages/ui/src/views/credentials/CredentialInputHandler.js new file mode 100644 index 00000000..30cc5746 --- /dev/null +++ b/packages/ui/src/views/credentials/CredentialInputHandler.js @@ -0,0 +1,137 @@ +import PropTypes from 'prop-types' +import { useRef, useState } from 'react' +import { useSelector } from 'react-redux' + +// material-ui +import { Box, Typography, IconButton } from '@mui/material' +import { IconArrowsMaximize, IconAlertTriangle } from '@tabler/icons' + +// project import +import { Dropdown } from 'ui-component/dropdown/Dropdown' +import { Input } from 'ui-component/input/Input' +import { SwitchInput } from 'ui-component/switch/Switch' +import { JsonEditorInput } from 'ui-component/json/JsonEditor' +import { TooltipWithParser } from 'ui-component/tooltip/TooltipWithParser' + +// ===========================|| NodeInputHandler ||=========================== // + +const CredentialInputHandler = ({ inputParam, data, disabled = false }) => { + const customization = useSelector((state) => state.customization) + const ref = useRef(null) + + const [showExpandDialog, setShowExpandDialog] = useState(false) + const [expandDialogProps, setExpandDialogProps] = useState({}) + + const onExpandDialogClicked = (value, inputParam) => { + const dialogProp = { + value, + inputParam, + disabled, + confirmButtonName: 'Save', + cancelButtonName: 'Cancel' + } + setExpandDialogProps(dialogProp) + setShowExpandDialog(true) + } + + const onExpandDialogSave = (newValue, inputParamName) => { + setShowExpandDialog(false) + data[inputParamName] = newValue + } + + return ( +
+ {inputParam && ( + <> + +
+ + {inputParam.label} + {!inputParam.optional &&  *} + {inputParam.description && } + +
+ {inputParam.type === 'string' && inputParam.rows && ( + onExpandDialogClicked(data[inputParam.name] ?? inputParam.default ?? '', inputParam)} + > + + + )} +
+ {inputParam.warning && ( +
+ + {inputParam.warning} +
+ )} + + {inputParam.type === 'boolean' && ( + (data[inputParam.name] = newValue)} + value={data[inputParam.name] ?? inputParam.default ?? false} + /> + )} + {(inputParam.type === 'string' || inputParam.type === 'password' || inputParam.type === 'number') && ( + (data[inputParam.name] = newValue)} + value={data[inputParam.name] ?? inputParam.default ?? ''} + showDialog={showExpandDialog} + dialogProps={expandDialogProps} + onDialogCancel={() => setShowExpandDialog(false)} + onDialogConfirm={(newValue, inputParamName) => onExpandDialogSave(newValue, inputParamName)} + /> + )} + {inputParam.type === 'json' && ( + (data[inputParam.name] = newValue)} + value={data[inputParam.name] ?? inputParam.default ?? ''} + isDarkMode={customization.isDarkMode} + /> + )} + {inputParam.type === 'options' && ( + (data[inputParam.name] = newValue)} + value={data[inputParam.name] ?? inputParam.default ?? 'choose an option'} + /> + )} +
+ + )} +
+ ) +} + +CredentialInputHandler.propTypes = { + inputAnchor: PropTypes.object, + inputParam: PropTypes.object, + data: PropTypes.object, + disabled: PropTypes.bool +} + +export default CredentialInputHandler diff --git a/packages/ui/src/views/credentials/CredentialListDialog.js b/packages/ui/src/views/credentials/CredentialListDialog.js new file mode 100644 index 00000000..9333db67 --- /dev/null +++ b/packages/ui/src/views/credentials/CredentialListDialog.js @@ -0,0 +1,172 @@ +import { useState, useEffect } from 'react' +import { createPortal } from 'react-dom' +import { useSelector } from 'react-redux' +import PropTypes from 'prop-types' +import { + List, + ListItemButton, + ListItem, + ListItemAvatar, + ListItemText, + Dialog, + DialogContent, + DialogTitle, + Box, + OutlinedInput, + InputAdornment +} from '@mui/material' +import { useTheme } from '@mui/material/styles' +import { IconSearch, IconX } from '@tabler/icons' + +// const +import { baseURL } from 'store/constant' + +const CredentialListDialog = ({ show, dialogProps, onCancel, onCredentialSelected }) => { + const portalElement = document.getElementById('portal') + const customization = useSelector((state) => state.customization) + + const theme = useTheme() + const [searchValue, setSearchValue] = useState('') + const [componentsCredentials, setComponentsCredentials] = useState([]) + + const filterSearch = (value) => { + setSearchValue(value) + setTimeout(() => { + if (value) { + const searchData = dialogProps.componentsCredentials.filter((crd) => crd.name.toLowerCase().includes(value.toLowerCase())) + setComponentsCredentials(searchData) + } else if (value === '') { + setComponentsCredentials(dialogProps.componentsCredentials) + } + // scrollTop() + }, 500) + } + + useEffect(() => { + if (show && dialogProps.componentsCredentials) { + setComponentsCredentials(dialogProps.componentsCredentials) + } + }, [show, dialogProps]) + + const component = show ? ( + + + {dialogProps.title} + + filterSearch(e.target.value)} + placeholder='Search credential' + startAdornment={ + + + + } + endAdornment={ + + filterSearch('')} + style={{ + cursor: 'pointer' + }} + /> + + } + aria-describedby='search-helper-text' + inputProps={{ + 'aria-label': 'weight' + }} + /> + + + + + {[...componentsCredentials].map((componentCredential) => ( +
+ onCredentialSelected(componentCredential)} + sx={{ p: 0, borderRadius: `${customization.borderRadius}px` }} + > + + +
+ {componentCredential.name} +
+
+ +
+
+
+ ))} +
+
+
+ ) : null + + return createPortal(component, portalElement) +} + +CredentialListDialog.propTypes = { + show: PropTypes.bool, + dialogProps: PropTypes.object, + onCancel: PropTypes.func, + onCredentialSelected: PropTypes.func +} + +export default CredentialListDialog diff --git a/packages/ui/src/views/credentials/index.js b/packages/ui/src/views/credentials/index.js new file mode 100644 index 00000000..bcd641ed --- /dev/null +++ b/packages/ui/src/views/credentials/index.js @@ -0,0 +1,274 @@ +import { useEffect, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { enqueueSnackbar as enqueueSnackbarAction, closeSnackbar as closeSnackbarAction } from 'store/actions' +import moment from 'moment' + +// material-ui +import { Button, Box, Stack, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, IconButton } from '@mui/material' +import { useTheme } from '@mui/material/styles' + +// project imports +import MainCard from 'ui-component/cards/MainCard' +import { StyledButton } from 'ui-component/button/StyledButton' +import CredentialListDialog from './CredentialListDialog' +import ConfirmDialog from 'ui-component/dialog/ConfirmDialog' +import AddEditCredentialDialog from './AddEditCredentialDialog' + +// API +import credentialsApi from 'api/credentials' + +// Hooks +import useApi from 'hooks/useApi' +import useConfirm from 'hooks/useConfirm' + +// utils +import useNotifier from 'utils/useNotifier' + +// Icons +import { IconTrash, IconEdit, IconX, IconPlus } from '@tabler/icons' +import CredentialEmptySVG from 'assets/images/credential_empty.svg' + +// const +import { baseURL } from 'store/constant' + +// ==============================|| Credentials ||============================== // + +const Credentials = () => { + const theme = useTheme() + const customization = useSelector((state) => state.customization) + + const dispatch = useDispatch() + useNotifier() + + const enqueueSnackbar = (...args) => dispatch(enqueueSnackbarAction(...args)) + const closeSnackbar = (...args) => dispatch(closeSnackbarAction(...args)) + + const [showCredentialListDialog, setShowCredentialListDialog] = useState(false) + const [credentialListDialogProps, setCredentialListDialogProps] = useState({}) + const [showSpecificCredentialDialog, setShowSpecificCredentialDialog] = useState(false) + const [specificCredentialDialogProps, setSpecificCredentialDialogProps] = useState({}) + const [credentials, setCredentials] = useState([]) + const [componentsCredentials, setComponentsCredentials] = useState([]) + + const { confirm } = useConfirm() + + const getAllCredentialsApi = useApi(credentialsApi.getAllCredentials) + const getAllComponentsCredentialsApi = useApi(credentialsApi.getAllComponentsCredentials) + + const listCredential = () => { + const dialogProp = { + title: 'Add New Credential', + componentsCredentials + } + setCredentialListDialogProps(dialogProp) + setShowCredentialListDialog(true) + } + + const addNew = (credentialComponent) => { + const dialogProp = { + type: 'ADD', + cancelButtonName: 'Cancel', + confirmButtonName: 'Add', + credentialComponent + } + setSpecificCredentialDialogProps(dialogProp) + setShowSpecificCredentialDialog(true) + } + + const edit = (credential) => { + const dialogProp = { + type: 'EDIT', + cancelButtonName: 'Cancel', + confirmButtonName: 'Save', + data: credential + } + setSpecificCredentialDialogProps(dialogProp) + setShowSpecificCredentialDialog(true) + } + + const deleteCredential = async (credential) => { + const confirmPayload = { + title: `Delete`, + description: `Delete credential ${credential.name}?`, + confirmButtonName: 'Delete', + cancelButtonName: 'Cancel' + } + const isConfirmed = await confirm(confirmPayload) + + if (isConfirmed) { + try { + const deleteResp = await credentialsApi.deleteCredential(credential.id) + if (deleteResp.data) { + enqueueSnackbar({ + message: 'Credential deleted', + options: { + key: new Date().getTime() + Math.random(), + variant: 'success', + action: (key) => ( + + ) + } + }) + onConfirm() + } + } catch (error) { + const errorData = error.response.data || `${error.response.status}: ${error.response.statusText}` + enqueueSnackbar({ + message: `Failed to delete Credential: ${errorData}`, + options: { + key: new Date().getTime() + Math.random(), + variant: 'error', + persist: true, + action: (key) => ( + + ) + } + }) + onCancel() + } + } + } + + const onCredentialSelected = (credentialComponent) => { + setShowCredentialListDialog(false) + addNew(credentialComponent) + } + + const onConfirm = () => { + setShowCredentialListDialog(false) + setShowSpecificCredentialDialog(false) + getAllCredentialsApi.request() + } + + useEffect(() => { + getAllCredentialsApi.request() + getAllComponentsCredentialsApi.request() + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + + useEffect(() => { + if (getAllCredentialsApi.data) { + setCredentials(getAllCredentialsApi.data) + } + }, [getAllCredentialsApi.data]) + + useEffect(() => { + if (getAllComponentsCredentialsApi.data) { + setComponentsCredentials(getAllComponentsCredentialsApi.data) + } + }, [getAllComponentsCredentialsApi.data]) + + return ( + <> + + +

Credentials 

+ + + } + > + Add Credential + +
+ {credentials.length <= 0 && ( + + + CredentialEmptySVG + +
No Credentials Yet
+
+ )} + {credentials.length > 0 && ( + + + + + Name + Last Updated + Created + + + + + + {credentials.map((credential, index) => ( + + +
+
+ {credential.credentialName} +
+ {credential.name} +
+
+ {moment(credential.updatedDate).format('DD-MMM-YY')} + {moment(credential.createdDate).format('DD-MMM-YY')} + + edit(credential)}> + + + + + deleteCredential(credential)}> + + + +
+ ))} +
+
+
+ )} +
+ setShowCredentialListDialog(false)} + onCredentialSelected={onCredentialSelected} + > + setShowSpecificCredentialDialog(false)} + onConfirm={onConfirm} + > + + + ) +} + +export default Credentials From ff755c3d1b3b58d58b87de2cbd6bab84473737c5 Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 15 Jul 2023 19:43:09 +0100 Subject: [PATCH 02/19] update credentials --- .../AnthropicApi.credential.ts | 2 +- .../AzureOpenAIApi.credential.ts | 2 +- .../credentials/CohereApi.credential.ts | 21 ++++ .../credentials/ConfluenceApi.credential.ts | 31 ++++++ .../DynamodbMemoryApi.credential.ts | 27 +++++ .../credentials/FigmaApi.credential.ts | 25 +++++ .../credentials/GithubApi.credential.ts | 25 +++++ .../credentials/HuggingFaceApi.credential.ts | 21 ++++ .../MotorheadMemoryApi.credential.ts | 2 +- .../credentials/NotionApi.credential.ts | 24 +++++ .../OpenAIApi.credential.ts | 2 +- .../credentials/OpenAPIAuth.credential.ts | 23 ++++ .../credentials/PineconeApi.credential.ts | 27 +++++ .../credentials/QdrantApi.credential.ts | 22 ++++ .../credentials/SerpApi.credential.ts | 22 ++++ .../credentials/SerperApi.credential.ts | 22 ++++ .../credentials/SupabaseApi.credential.ts | 22 ++++ .../credentials/WeaviateApi.credential.ts | 22 ++++ .../credentials/ZapierNLAApi.credential.ts | 22 ++++ .../ZepMemoryApi.credential.ts | 4 +- .../OpenAIFunctionAgent.ts | 2 +- .../agents/OpenAIFunctionAgent/openai.png | Bin 3991 -> 0 bytes .../agents/OpenAIFunctionAgent/openai.svg | 1 + .../nodes/chains/ApiChain/OpenAPIChain.ts | 2 +- .../chatmodels/AzureChatOpenAI/Azure.svg | 6 +- .../ChatHuggingFace/ChatHuggingFace.ts | 41 ++++---- .../nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts | 2 +- .../nodes/chatmodels/ChatOpenAI/openai.png | Bin 3991 -> 0 bytes .../nodes/chatmodels/ChatOpenAI/openai.svg | 1 + .../documentloaders/Confluence/Confluence.ts | 38 +++---- .../nodes/documentloaders/Figma/Figma.ts | 38 ++++--- .../nodes/documentloaders/Figma/figma.png | Bin 176029 -> 0 bytes .../nodes/documentloaders/Figma/figma.svg | 1 + .../nodes/documentloaders/Github/Github.ts | 31 +++--- .../documentloaders/NotionDB/NotionDB.ts | 46 ++++---- .../documentloaders/NotionPage/NotionPage.ts | 99 ++++++++++++++++++ .../documentloaders/NotionPage/notion.png | Bin 0 -> 11406 bytes .../embeddings/AzureOpenAIEmbedding/Azure.svg | 6 +- .../AzureOpenAIEmbedding.ts | 48 +++------ .../CohereEmbedding/CohereEmbedding.ts | 24 +++-- .../HuggingFaceInferenceEmbedding.ts | 24 +++-- .../OpenAIEmbedding/OpenAIEmbedding.ts | 24 +++-- .../embeddings/OpenAIEmbedding/openai.png | Bin 3991 -> 0 bytes .../embeddings/OpenAIEmbedding/openai.svg | 1 + .../nodes/llms/Azure OpenAI/Azure.svg | 6 +- .../nodes/llms/Azure OpenAI/AzureOpenAI.ts | 48 +++------ .../components/nodes/llms/Cohere/Cohere.ts | 24 +++-- .../HuggingFaceInference.ts | 41 ++++---- .../components/nodes/llms/OpenAI/OpenAI.ts | 2 +- .../components/nodes/llms/OpenAI/openai.png | Bin 3991 -> 0 bytes .../components/nodes/llms/OpenAI/openai.svg | 1 + .../nodes/memory/DynamoDb/DynamoDb.ts | 42 ++++---- .../memory/MotorheadMemory/MotorheadMemory.ts | 15 +-- .../RedisBackedChatMemory.ts | 4 +- .../tools/OpenAPIToolkit/OpenAPIToolkit.ts | 29 +++-- .../components/nodes/tools/SerpAPI/SerpAPI.ts | 26 ++--- .../components/nodes/tools/Serper/Serper.ts | 26 ++--- .../nodes/tools/ZapierNLA/ZapierNLA.ts | 27 ++--- .../nodes/tools/ZapierNLA/zapier.png | Bin 502 -> 0 bytes .../nodes/tools/ZapierNLA/zapier.svg | 8 ++ .../Pinecone_Existing/Pinecone_Existing.ts | 29 +++-- .../Pinecone_Upsert/Pinecone_Upsert.ts | 29 +++-- .../Qdrant_Existing/Qdrant_Existing.ts | 28 ++--- .../vectorstores/Qdrant_Existing/qdrant.png | Bin 0 -> 11663 bytes .../Qdrant_Existing/qdrant_logo.svg | 27 ----- .../Qdrant_Upsert/Qdrant_Upsert.ts | 28 ++--- .../vectorstores/Qdrant_Upsert/qdrant.png | Bin 0 -> 11663 bytes .../Qdrant_Upsert/qdrant_logo.svg | 27 ----- .../Supabase_Existing/Supabase_Exisiting.ts | 22 ++-- .../Supabase_Upsert/Supabase_Upsert.ts | 22 ++-- .../Weaviate_Existing/Weaviate_Existing.ts | 25 +++-- .../Weaviate_Upsert/Weaviate_Upsert.ts | 25 +++-- packages/components/package.json | 2 + packages/components/tsconfig.json | 2 +- packages/server/src/NodesPool.ts | 4 +- 75 files changed, 911 insertions(+), 461 deletions(-) rename packages/components/{nodes/chatmodels/ChatAnthropic => credentials}/AnthropicApi.credential.ts (86%) rename packages/components/{nodes/chatmodels/AzureChatOpenAI => credentials}/AzureOpenAIApi.credential.ts (96%) create mode 100644 packages/components/credentials/CohereApi.credential.ts create mode 100644 packages/components/credentials/ConfluenceApi.credential.ts create mode 100644 packages/components/credentials/DynamodbMemoryApi.credential.ts create mode 100644 packages/components/credentials/FigmaApi.credential.ts create mode 100644 packages/components/credentials/GithubApi.credential.ts create mode 100644 packages/components/credentials/HuggingFaceApi.credential.ts rename packages/components/{nodes/memory/MotorheadMemory => credentials}/MotorheadMemoryApi.credential.ts (91%) create mode 100644 packages/components/credentials/NotionApi.credential.ts rename packages/components/{nodes/chatmodels/ChatOpenAI => credentials}/OpenAIApi.credential.ts (85%) create mode 100644 packages/components/credentials/OpenAPIAuth.credential.ts create mode 100644 packages/components/credentials/PineconeApi.credential.ts create mode 100644 packages/components/credentials/QdrantApi.credential.ts create mode 100644 packages/components/credentials/SerpApi.credential.ts create mode 100644 packages/components/credentials/SerperApi.credential.ts create mode 100644 packages/components/credentials/SupabaseApi.credential.ts create mode 100644 packages/components/credentials/WeaviateApi.credential.ts create mode 100644 packages/components/credentials/ZapierNLAApi.credential.ts rename packages/components/{nodes/memory/ZepMemory => credentials}/ZepMemoryApi.credential.ts (84%) delete mode 100644 packages/components/nodes/agents/OpenAIFunctionAgent/openai.png create mode 100644 packages/components/nodes/agents/OpenAIFunctionAgent/openai.svg delete mode 100644 packages/components/nodes/chatmodels/ChatOpenAI/openai.png create mode 100644 packages/components/nodes/chatmodels/ChatOpenAI/openai.svg delete mode 100644 packages/components/nodes/documentloaders/Figma/figma.png create mode 100644 packages/components/nodes/documentloaders/Figma/figma.svg create mode 100644 packages/components/nodes/documentloaders/NotionPage/NotionPage.ts create mode 100644 packages/components/nodes/documentloaders/NotionPage/notion.png delete mode 100644 packages/components/nodes/embeddings/OpenAIEmbedding/openai.png create mode 100644 packages/components/nodes/embeddings/OpenAIEmbedding/openai.svg delete mode 100644 packages/components/nodes/llms/OpenAI/openai.png create mode 100644 packages/components/nodes/llms/OpenAI/openai.svg delete mode 100644 packages/components/nodes/tools/ZapierNLA/zapier.png create mode 100644 packages/components/nodes/tools/ZapierNLA/zapier.svg create mode 100644 packages/components/nodes/vectorstores/Qdrant_Existing/qdrant.png delete mode 100644 packages/components/nodes/vectorstores/Qdrant_Existing/qdrant_logo.svg create mode 100644 packages/components/nodes/vectorstores/Qdrant_Upsert/qdrant.png delete mode 100644 packages/components/nodes/vectorstores/Qdrant_Upsert/qdrant_logo.svg diff --git a/packages/components/nodes/chatmodels/ChatAnthropic/AnthropicApi.credential.ts b/packages/components/credentials/AnthropicApi.credential.ts similarity index 86% rename from packages/components/nodes/chatmodels/ChatAnthropic/AnthropicApi.credential.ts rename to packages/components/credentials/AnthropicApi.credential.ts index 607fa625..448128f1 100644 --- a/packages/components/nodes/chatmodels/ChatAnthropic/AnthropicApi.credential.ts +++ b/packages/components/credentials/AnthropicApi.credential.ts @@ -1,4 +1,4 @@ -import { INodeParams, INodeCredential } from '../../../src/Interface' +import { INodeParams, INodeCredential } from '../src/Interface' class AnthropicApi implements INodeCredential { label: string diff --git a/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureOpenAIApi.credential.ts b/packages/components/credentials/AzureOpenAIApi.credential.ts similarity index 96% rename from packages/components/nodes/chatmodels/AzureChatOpenAI/AzureOpenAIApi.credential.ts rename to packages/components/credentials/AzureOpenAIApi.credential.ts index d48e0c88..e880c91c 100644 --- a/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureOpenAIApi.credential.ts +++ b/packages/components/credentials/AzureOpenAIApi.credential.ts @@ -1,4 +1,4 @@ -import { INodeParams, INodeCredential } from '../../../src/Interface' +import { INodeParams, INodeCredential } from '../src/Interface' class AzureOpenAIApi implements INodeCredential { label: string diff --git a/packages/components/credentials/CohereApi.credential.ts b/packages/components/credentials/CohereApi.credential.ts new file mode 100644 index 00000000..488644a2 --- /dev/null +++ b/packages/components/credentials/CohereApi.credential.ts @@ -0,0 +1,21 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class CohereApi implements INodeCredential { + label: string + name: string + inputs: INodeParams[] + + constructor() { + this.label = 'Cohere API' + this.name = 'cohereApi' + this.inputs = [ + { + label: 'Cohere Api Key', + name: 'cohereApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: CohereApi } diff --git a/packages/components/credentials/ConfluenceApi.credential.ts b/packages/components/credentials/ConfluenceApi.credential.ts new file mode 100644 index 00000000..75ea1d88 --- /dev/null +++ b/packages/components/credentials/ConfluenceApi.credential.ts @@ -0,0 +1,31 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class ConfluenceApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Confluence API' + this.name = 'confluenceApi' + this.description = + 'Refer to official guide on how to get accessToken on Confluence' + this.inputs = [ + { + label: 'Access Token', + name: 'accessToken', + type: 'password', + placeholder: '' + }, + { + label: 'Username', + name: 'username', + type: 'string', + placeholder: '' + } + ] + } +} + +module.exports = { credClass: ConfluenceApi } diff --git a/packages/components/credentials/DynamodbMemoryApi.credential.ts b/packages/components/credentials/DynamodbMemoryApi.credential.ts new file mode 100644 index 00000000..5bdfce37 --- /dev/null +++ b/packages/components/credentials/DynamodbMemoryApi.credential.ts @@ -0,0 +1,27 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class DynamodbMemoryApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'DynamodbMemory API' + this.name = 'dynamodbMemoryApi' + this.inputs = [ + { + label: 'Access Key', + name: 'accessKey', + type: 'password' + }, + { + label: 'Secret Access Key', + name: 'secretAccessKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: DynamodbMemoryApi } diff --git a/packages/components/credentials/FigmaApi.credential.ts b/packages/components/credentials/FigmaApi.credential.ts new file mode 100644 index 00000000..49638885 --- /dev/null +++ b/packages/components/credentials/FigmaApi.credential.ts @@ -0,0 +1,25 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class FigmaApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Figma API' + this.name = 'figmaApi' + this.description = + 'Refer to official guide on how to get accessToken on Figma' + this.inputs = [ + { + label: 'Access Token', + name: 'accessToken', + type: 'password', + placeholder: '' + } + ] + } +} + +module.exports = { credClass: FigmaApi } diff --git a/packages/components/credentials/GithubApi.credential.ts b/packages/components/credentials/GithubApi.credential.ts new file mode 100644 index 00000000..ffbe4739 --- /dev/null +++ b/packages/components/credentials/GithubApi.credential.ts @@ -0,0 +1,25 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class GithubApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Github API' + this.name = 'githubApi' + this.description = + 'Refer to official guide on how to get accessToken on Github' + this.inputs = [ + { + label: 'Access Token', + name: 'accessToken', + type: 'password', + placeholder: '' + } + ] + } +} + +module.exports = { credClass: GithubApi } diff --git a/packages/components/credentials/HuggingFaceApi.credential.ts b/packages/components/credentials/HuggingFaceApi.credential.ts new file mode 100644 index 00000000..2dae4319 --- /dev/null +++ b/packages/components/credentials/HuggingFaceApi.credential.ts @@ -0,0 +1,21 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class HuggingFaceApi implements INodeCredential { + label: string + name: string + inputs: INodeParams[] + + constructor() { + this.label = 'HuggingFace API' + this.name = 'huggingFaceApi' + this.inputs = [ + { + label: 'HuggingFace Api Key', + name: 'huggingFaceApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: HuggingFaceApi } diff --git a/packages/components/nodes/memory/MotorheadMemory/MotorheadMemoryApi.credential.ts b/packages/components/credentials/MotorheadMemoryApi.credential.ts similarity index 91% rename from packages/components/nodes/memory/MotorheadMemory/MotorheadMemoryApi.credential.ts rename to packages/components/credentials/MotorheadMemoryApi.credential.ts index 4563cda2..937a9402 100644 --- a/packages/components/nodes/memory/MotorheadMemory/MotorheadMemoryApi.credential.ts +++ b/packages/components/credentials/MotorheadMemoryApi.credential.ts @@ -1,4 +1,4 @@ -import { INodeParams, INodeCredential } from '../../../src/Interface' +import { INodeParams, INodeCredential } from '../src/Interface' class MotorheadMemoryApi implements INodeCredential { label: string diff --git a/packages/components/credentials/NotionApi.credential.ts b/packages/components/credentials/NotionApi.credential.ts new file mode 100644 index 00000000..47d03f3e --- /dev/null +++ b/packages/components/credentials/NotionApi.credential.ts @@ -0,0 +1,24 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class NotionApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Notion API' + this.name = 'notionApi' + this.description = + 'You can find integration token here' + this.inputs = [ + { + label: 'Notion Integration Token', + name: 'notionIntegrationToken', + type: 'password' + } + ] + } +} + +module.exports = { credClass: NotionApi } diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/OpenAIApi.credential.ts b/packages/components/credentials/OpenAIApi.credential.ts similarity index 85% rename from packages/components/nodes/chatmodels/ChatOpenAI/OpenAIApi.credential.ts rename to packages/components/credentials/OpenAIApi.credential.ts index 96209a35..9aebf049 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAI/OpenAIApi.credential.ts +++ b/packages/components/credentials/OpenAIApi.credential.ts @@ -1,4 +1,4 @@ -import { INodeParams, INodeCredential } from '../../../src/Interface' +import { INodeParams, INodeCredential } from '../src/Interface' class OpenAIApi implements INodeCredential { label: string diff --git a/packages/components/credentials/OpenAPIAuth.credential.ts b/packages/components/credentials/OpenAPIAuth.credential.ts new file mode 100644 index 00000000..7cc2d318 --- /dev/null +++ b/packages/components/credentials/OpenAPIAuth.credential.ts @@ -0,0 +1,23 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class OpenAPIAuth implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'OpenAPI Auth Token' + this.name = 'openAPIAuth' + this.inputs = [ + { + label: 'OpenAPI Token', + name: 'openAPIToken', + type: 'password', + description: 'Auth Token. For example: Bearer ' + } + ] + } +} + +module.exports = { credClass: OpenAPIAuth } diff --git a/packages/components/credentials/PineconeApi.credential.ts b/packages/components/credentials/PineconeApi.credential.ts new file mode 100644 index 00000000..393bfd46 --- /dev/null +++ b/packages/components/credentials/PineconeApi.credential.ts @@ -0,0 +1,27 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class PineconeApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Pinecone API' + this.name = 'pineconeApi' + this.inputs = [ + { + label: 'Pinecone Api Key', + name: 'pineconeApiKey', + type: 'password' + }, + { + label: 'Pinecone Environment', + name: 'pineconeEnv', + type: 'string' + } + ] + } +} + +module.exports = { credClass: PineconeApi } diff --git a/packages/components/credentials/QdrantApi.credential.ts b/packages/components/credentials/QdrantApi.credential.ts new file mode 100644 index 00000000..1738cc45 --- /dev/null +++ b/packages/components/credentials/QdrantApi.credential.ts @@ -0,0 +1,22 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class QdrantApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Qdrant API' + this.name = 'qdrantApi' + this.inputs = [ + { + label: 'Qdrant API Key', + name: 'qdrantApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: QdrantApi } diff --git a/packages/components/credentials/SerpApi.credential.ts b/packages/components/credentials/SerpApi.credential.ts new file mode 100644 index 00000000..0c18b103 --- /dev/null +++ b/packages/components/credentials/SerpApi.credential.ts @@ -0,0 +1,22 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class SerpApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Serp API' + this.name = 'serpApi' + this.inputs = [ + { + label: 'Serp Api Key', + name: 'serpApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: SerpApi } diff --git a/packages/components/credentials/SerperApi.credential.ts b/packages/components/credentials/SerperApi.credential.ts new file mode 100644 index 00000000..71e61b32 --- /dev/null +++ b/packages/components/credentials/SerperApi.credential.ts @@ -0,0 +1,22 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class SerperApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Serper API' + this.name = 'serperApi' + this.inputs = [ + { + label: 'Serper Api Key', + name: 'serperApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: SerperApi } diff --git a/packages/components/credentials/SupabaseApi.credential.ts b/packages/components/credentials/SupabaseApi.credential.ts new file mode 100644 index 00000000..d485e401 --- /dev/null +++ b/packages/components/credentials/SupabaseApi.credential.ts @@ -0,0 +1,22 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class SupabaseApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Supabase API' + this.name = 'supabaseApi' + this.inputs = [ + { + label: 'Supabase API Key', + name: 'supabaseApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: SupabaseApi } diff --git a/packages/components/credentials/WeaviateApi.credential.ts b/packages/components/credentials/WeaviateApi.credential.ts new file mode 100644 index 00000000..3d5dd5b9 --- /dev/null +++ b/packages/components/credentials/WeaviateApi.credential.ts @@ -0,0 +1,22 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class WeaviateApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Weaviate API' + this.name = 'weaviateApi' + this.inputs = [ + { + label: 'Weaviate API Key', + name: 'weaviateApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: WeaviateApi } diff --git a/packages/components/credentials/ZapierNLAApi.credential.ts b/packages/components/credentials/ZapierNLAApi.credential.ts new file mode 100644 index 00000000..03cb01b8 --- /dev/null +++ b/packages/components/credentials/ZapierNLAApi.credential.ts @@ -0,0 +1,22 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class ZapierNLAApi implements INodeCredential { + label: string + name: string + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Zapier NLA API' + this.name = 'zapierNLAApi' + this.inputs = [ + { + label: 'Zapier NLA Api Key', + name: 'zapierNLAApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: ZapierNLAApi } diff --git a/packages/components/nodes/memory/ZepMemory/ZepMemoryApi.credential.ts b/packages/components/credentials/ZepMemoryApi.credential.ts similarity index 84% rename from packages/components/nodes/memory/ZepMemory/ZepMemoryApi.credential.ts rename to packages/components/credentials/ZepMemoryApi.credential.ts index 5e92ef5d..d886328b 100644 --- a/packages/components/nodes/memory/ZepMemory/ZepMemoryApi.credential.ts +++ b/packages/components/credentials/ZepMemoryApi.credential.ts @@ -1,4 +1,4 @@ -import { INodeParams, INodeCredential } from '../../../src/Interface' +import { INodeParams, INodeCredential } from '../src/Interface' class ZepMemoryApi implements INodeCredential { label: string @@ -7,7 +7,7 @@ class ZepMemoryApi implements INodeCredential { inputs: INodeParams[] constructor() { - this.label = 'Zep Memory Api' + this.label = 'Zep Memory API' this.name = 'zepMemoryApi' this.description = 'Refer to official guide on how to create API key on Zep' diff --git a/packages/components/nodes/agents/OpenAIFunctionAgent/OpenAIFunctionAgent.ts b/packages/components/nodes/agents/OpenAIFunctionAgent/OpenAIFunctionAgent.ts index f4d065d9..9faf83dd 100644 --- a/packages/components/nodes/agents/OpenAIFunctionAgent/OpenAIFunctionAgent.ts +++ b/packages/components/nodes/agents/OpenAIFunctionAgent/OpenAIFunctionAgent.ts @@ -22,7 +22,7 @@ class OpenAIFunctionAgent_Agents implements INode { this.name = 'openAIFunctionAgent' this.type = 'AgentExecutor' this.category = 'Agents' - this.icon = 'openai.png' + this.icon = 'openai.svg' this.description = `An agent that uses OpenAI's Function Calling functionality to pick the tool and args to call` this.baseClasses = [this.type, ...getBaseClasses(AgentExecutor)] this.inputs = [ diff --git a/packages/components/nodes/agents/OpenAIFunctionAgent/openai.png b/packages/components/nodes/agents/OpenAIFunctionAgent/openai.png deleted file mode 100644 index de08a05b28979826c4cc669c4899789763a938a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3991 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 diff --git a/packages/components/nodes/agents/OpenAIFunctionAgent/openai.svg b/packages/components/nodes/agents/OpenAIFunctionAgent/openai.svg new file mode 100644 index 00000000..9d3261dd --- /dev/null +++ b/packages/components/nodes/agents/OpenAIFunctionAgent/openai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts index a231e80a..583ca1f4 100644 --- a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts +++ b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts @@ -20,7 +20,7 @@ class OpenApiChain_Chains implements INode { this.type = 'openApiChain' this.icon = 'openapi.png' this.category = 'Chains' - this.description = 'Chain to run queries against OpenAPI' + this.description = 'Chain that automatically select and call APIs based only on an OpenAPI spec' this.baseClasses = [this.type, ...getBaseClasses(APIChain)] this.inputs = [ { diff --git a/packages/components/nodes/chatmodels/AzureChatOpenAI/Azure.svg b/packages/components/nodes/chatmodels/AzureChatOpenAI/Azure.svg index 51eb6253..47ad8c44 100644 --- a/packages/components/nodes/chatmodels/AzureChatOpenAI/Azure.svg +++ b/packages/components/nodes/chatmodels/AzureChatOpenAI/Azure.svg @@ -1,5 +1 @@ - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts b/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts index d92dd1e0..f192fefd 100644 --- a/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts +++ b/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { HFInput, HuggingFaceInference } from './core' class ChatHuggingFace_ChatModels implements INode { @@ -10,6 +10,7 @@ class ChatHuggingFace_ChatModels implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,17 +21,28 @@ class ChatHuggingFace_ChatModels implements INode { this.category = 'Chat Models' this.description = 'Wrapper around HuggingFace large language models' this.baseClasses = [this.type, 'BaseChatModel', ...getBaseClasses(HuggingFaceInference)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['huggingFaceApi'] + } this.inputs = [ { label: 'Model', name: 'model', type: 'string', - placeholder: 'gpt2' + description: 'If using own inference endpoint, leave this blank', + placeholder: 'gpt2', + optional: true }, { - label: 'HuggingFace Api Key', - name: 'apiKey', - type: 'password' + label: 'Endpoint', + name: 'endpoint', + type: 'string', + placeholder: 'https://xyz.eu-west-1.aws.endpoints.huggingface.cloud/gpt2', + description: 'Using your own inference endpoint', + optional: true }, { label: 'Temperature', @@ -71,22 +83,12 @@ class ChatHuggingFace_ChatModels implements INode { description: 'Frequency Penalty parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true - }, - { - label: 'Endpoint', - name: 'endpoint', - type: 'string', - placeholder: 'https://xyz.eu-west-1.aws.endpoints.huggingface.cloud/gpt2', - description: 'Using your own inference endpoint', - optional: true, - additionalParams: true } ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const model = nodeData.inputs?.model as string - const apiKey = nodeData.inputs?.apiKey as string const temperature = nodeData.inputs?.temperature as string const maxTokens = nodeData.inputs?.maxTokens as string const topP = nodeData.inputs?.topP as string @@ -94,9 +96,12 @@ class ChatHuggingFace_ChatModels implements INode { const frequencyPenalty = nodeData.inputs?.frequencyPenalty as string const endpoint = nodeData.inputs?.endpoint as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const huggingFaceApiKey = getCredentialParam('huggingFaceApiKey', credentialData, nodeData) + const obj: Partial = { model, - apiKey + apiKey: huggingFaceApiKey } if (temperature) obj.temperature = parseFloat(temperature) diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts index 1339d1fe..13262b5f 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts @@ -17,7 +17,7 @@ class ChatOpenAI_ChatModels implements INode { this.label = 'ChatOpenAI' this.name = 'chatOpenAI' this.type = 'ChatOpenAI' - this.icon = 'openai.png' + this.icon = 'openai.svg' this.category = 'Chat Models' this.description = 'Wrapper around OpenAI large language models that use the Chat endpoint' this.baseClasses = [this.type, ...getBaseClasses(ChatOpenAI)] diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/openai.png b/packages/components/nodes/chatmodels/ChatOpenAI/openai.png deleted file mode 100644 index de08a05b28979826c4cc669c4899789763a938a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3991 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 diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/openai.svg b/packages/components/nodes/chatmodels/ChatOpenAI/openai.svg new file mode 100644 index 00000000..9d3261dd --- /dev/null +++ b/packages/components/nodes/chatmodels/ChatOpenAI/openai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/components/nodes/documentloaders/Confluence/Confluence.ts b/packages/components/nodes/documentloaders/Confluence/Confluence.ts index 9a69be14..db992310 100644 --- a/packages/components/nodes/documentloaders/Confluence/Confluence.ts +++ b/packages/components/nodes/documentloaders/Confluence/Confluence.ts @@ -1,6 +1,7 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' import { TextSplitter } from 'langchain/text_splitter' import { ConfluencePagesLoader, ConfluencePagesLoaderParams } from 'langchain/document_loaders/web/confluence' +import { getCredentialData, getCredentialParam } from '../../../src' class Confluence_DocumentLoaders implements INode { label: string @@ -10,6 +11,7 @@ class Confluence_DocumentLoaders implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,6 +22,12 @@ class Confluence_DocumentLoaders implements INode { this.category = 'Document Loaders' this.description = `Load data from a Confluence Document` this.baseClasses = [this.type] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['confluenceApi'] + } this.inputs = [ { label: 'Text Splitter', @@ -27,18 +35,6 @@ class Confluence_DocumentLoaders implements INode { type: 'TextSplitter', optional: true }, - { - label: 'Username', - name: 'username', - type: 'string', - placeholder: '' - }, - { - label: 'Access Token', - name: 'accessToken', - type: 'password', - placeholder: '' - }, { label: 'Base URL', name: 'baseUrl', @@ -49,7 +45,9 @@ class Confluence_DocumentLoaders implements INode { label: 'Space Key', name: 'spaceKey', type: 'string', - placeholder: '~EXAMPLE362906de5d343d49dcdbae5dEXAMPLE' + placeholder: '~EXAMPLE362906de5d343d49dcdbae5dEXAMPLE', + description: + 'Refer to official guide on how to get Confluence Space Key' }, { label: 'Limit', @@ -68,16 +66,18 @@ class Confluence_DocumentLoaders implements INode { ] } - async init(nodeData: INodeData): Promise { - const username = nodeData.inputs?.username as string - const accessToken = nodeData.inputs?.accessToken as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const spaceKey = nodeData.inputs?.spaceKey as string const baseUrl = nodeData.inputs?.baseUrl as string const limit = nodeData.inputs?.limit as number const textSplitter = nodeData.inputs?.textSplitter as TextSplitter const metadata = nodeData.inputs?.metadata - const options: ConfluencePagesLoaderParams = { + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const accessToken = getCredentialParam('accessToken', credentialData, nodeData) + const username = getCredentialParam('username', credentialData, nodeData) + + const confluenceOptions: ConfluencePagesLoaderParams = { username, accessToken, baseUrl, @@ -85,7 +85,7 @@ class Confluence_DocumentLoaders implements INode { limit } - const loader = new ConfluencePagesLoader(options) + const loader = new ConfluencePagesLoader(confluenceOptions) let docs = [] diff --git a/packages/components/nodes/documentloaders/Figma/Figma.ts b/packages/components/nodes/documentloaders/Figma/Figma.ts index 388c4ee0..e570490e 100644 --- a/packages/components/nodes/documentloaders/Figma/Figma.ts +++ b/packages/components/nodes/documentloaders/Figma/Figma.ts @@ -1,4 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { getCredentialData, getCredentialParam } from '../../../src' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' import { FigmaFileLoader, FigmaLoaderParams } from 'langchain/document_loaders/web/figma' class Figma_DocumentLoaders implements INode { @@ -9,34 +10,39 @@ class Figma_DocumentLoaders implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { this.label = 'Figma' this.name = 'figma' this.type = 'Document' - this.icon = 'figma.png' + this.icon = 'figma.svg' this.category = 'Document Loaders' this.description = 'Load data from a Figma file' this.baseClasses = [this.type] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['figmaApi'] + } this.inputs = [ - { - label: 'Access Token', - name: 'accessToken', - type: 'password', - placeholder: '' - }, { label: 'File Key', name: 'fileKey', type: 'string', - placeholder: 'key' + placeholder: 'key', + description: + 'The file key can be read from any Figma file URL: https://www.figma.com/file/:key/:title. For example, in https://www.figma.com/file/12345/Website, the file key is 12345' }, { label: 'Node IDs', name: 'nodeIds', type: 'string', - placeholder: '0, 1, 2' + placeholder: '0, 1, 2', + description: + 'A list of Node IDs, seperated by comma. Refer to official guide on how to get Node IDs' }, { label: 'Recursive', @@ -60,18 +66,20 @@ class Figma_DocumentLoaders implements INode { ] } - async init(nodeData: INodeData): Promise { - const accessToken = nodeData.inputs?.accessToken as string - const nodeIds = (nodeData.inputs?.nodeIds as string)?.split(',') || [] + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const nodeIds = (nodeData.inputs?.nodeIds as string)?.trim().split(',') || [] const fileKey = nodeData.inputs?.fileKey as string - const options: FigmaLoaderParams = { + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const accessToken = getCredentialParam('accessToken', credentialData, nodeData) + + const figmaOptions: FigmaLoaderParams = { accessToken, nodeIds, fileKey } - const loader = new FigmaFileLoader(options) + const loader = new FigmaFileLoader(figmaOptions) const docs = await loader.load() return docs diff --git a/packages/components/nodes/documentloaders/Figma/figma.png b/packages/components/nodes/documentloaders/Figma/figma.png deleted file mode 100644 index 72372ddff0e6eec27448d24b10c46c987edf317d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176029 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

?1A{3edV5r?d-vCR~^xf@Hu&y&T1 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 V5p|!MT;T}c;(o \ No newline at end of file diff --git a/packages/components/nodes/documentloaders/Github/Github.ts b/packages/components/nodes/documentloaders/Github/Github.ts index bbaad3cb..4a968403 100644 --- a/packages/components/nodes/documentloaders/Github/Github.ts +++ b/packages/components/nodes/documentloaders/Github/Github.ts @@ -1,6 +1,7 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' import { TextSplitter } from 'langchain/text_splitter' import { GithubRepoLoader, GithubRepoLoaderParams } from 'langchain/document_loaders/web/github' +import { getCredentialData, getCredentialParam } from '../../../src' class Github_DocumentLoaders implements INode { label: string @@ -10,6 +11,7 @@ class Github_DocumentLoaders implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,6 +22,14 @@ class Github_DocumentLoaders implements INode { this.category = 'Document Loaders' this.description = `Load data from a GitHub repository` this.baseClasses = [this.type] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + description: 'Only needed when accessing private repo', + optional: true, + credentialNames: ['githubApi'] + } this.inputs = [ { label: 'Repo Link', @@ -33,13 +43,6 @@ class Github_DocumentLoaders implements INode { type: 'string', default: 'main' }, - { - label: 'Access Token', - name: 'accessToken', - type: 'password', - placeholder: '', - optional: true - }, { label: 'Recursive', name: 'recursive', @@ -62,23 +65,25 @@ class Github_DocumentLoaders implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const repoLink = nodeData.inputs?.repoLink as string const branch = nodeData.inputs?.branch as string const recursive = nodeData.inputs?.recursive as boolean - const accessToken = nodeData.inputs?.accessToken as string const textSplitter = nodeData.inputs?.textSplitter as TextSplitter const metadata = nodeData.inputs?.metadata - const options: GithubRepoLoaderParams = { + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const accessToken = getCredentialParam('accessToken', credentialData, nodeData) + + const githubOptions: GithubRepoLoaderParams = { branch, recursive, unknown: 'warn' } - if (accessToken) options.accessToken = accessToken + if (accessToken) githubOptions.accessToken = accessToken - const loader = new GithubRepoLoader(repoLink, options) + const loader = new GithubRepoLoader(repoLink, githubOptions) const docs = textSplitter ? await loader.loadAndSplit(textSplitter) : await loader.load() if (metadata) { diff --git a/packages/components/nodes/documentloaders/NotionDB/NotionDB.ts b/packages/components/nodes/documentloaders/NotionDB/NotionDB.ts index 71e5e507..5fec6083 100644 --- a/packages/components/nodes/documentloaders/NotionDB/NotionDB.ts +++ b/packages/components/nodes/documentloaders/NotionDB/NotionDB.ts @@ -1,6 +1,7 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' import { TextSplitter } from 'langchain/text_splitter' -import { NotionDBLoader, NotionDBLoaderParams } from 'langchain/document_loaders/web/notiondb' +import { NotionAPILoader, NotionAPILoaderOptions } from 'langchain/document_loaders/web/notionapi' +import { getCredentialData, getCredentialParam } from '../../../src' class NotionDB_DocumentLoaders implements INode { label: string @@ -10,6 +11,7 @@ class NotionDB_DocumentLoaders implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -18,8 +20,14 @@ class NotionDB_DocumentLoaders implements INode { this.type = 'Document' this.icon = 'notion.png' this.category = 'Document Loaders' - this.description = 'Load data from Notion Database ID' + this.description = 'Load data from Notion Database (each row is a separate document with all properties as metadata)' this.baseClasses = [this.type] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['notionApi'] + } this.inputs = [ { label: 'Text Splitter', @@ -34,19 +42,6 @@ class NotionDB_DocumentLoaders implements INode { description: 'If your URL looks like - https://www.notion.so/?v=, then is the database ID' }, - { - label: 'Notion Integration Token', - name: 'notionIntegrationToken', - type: 'password', - description: - 'You can find integration token here' - }, - { - label: 'Page Size Limit', - name: 'pageSizeLimit', - type: 'number', - default: 10 - }, { label: 'Metadata', name: 'metadata', @@ -57,19 +52,22 @@ class NotionDB_DocumentLoaders implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const textSplitter = nodeData.inputs?.textSplitter as TextSplitter const databaseId = nodeData.inputs?.databaseId as string - const notionIntegrationToken = nodeData.inputs?.notionIntegrationToken as string - const pageSizeLimit = nodeData.inputs?.pageSizeLimit as string const metadata = nodeData.inputs?.metadata - const obj: NotionDBLoaderParams = { - pageSizeLimit: pageSizeLimit ? parseInt(pageSizeLimit, 10) : 10, - databaseId, - notionIntegrationToken + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const notionIntegrationToken = getCredentialParam('notionIntegrationToken', credentialData, nodeData) + + const obj: NotionAPILoaderOptions = { + clientOptions: { + auth: notionIntegrationToken + }, + id: databaseId, + type: 'database' } - const loader = new NotionDBLoader(obj) + const loader = new NotionAPILoader(obj) let docs = [] if (textSplitter) { diff --git a/packages/components/nodes/documentloaders/NotionPage/NotionPage.ts b/packages/components/nodes/documentloaders/NotionPage/NotionPage.ts new file mode 100644 index 00000000..57da8aaa --- /dev/null +++ b/packages/components/nodes/documentloaders/NotionPage/NotionPage.ts @@ -0,0 +1,99 @@ +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { TextSplitter } from 'langchain/text_splitter' +import { NotionAPILoader, NotionAPILoaderOptions } from 'langchain/document_loaders/web/notionapi' +import { getCredentialData, getCredentialParam } from '../../../src' + +class NotionPage_DocumentLoaders implements INode { + label: string + name: string + description: string + type: string + icon: string + category: string + baseClasses: string[] + credential: INodeParams + inputs: INodeParams[] + + constructor() { + this.label = 'Notion Page' + this.name = 'notionPage' + this.type = 'Document' + this.icon = 'notion.png' + this.category = 'Document Loaders' + this.description = 'Load data from Notion Page (including child pages all as separate documents)' + this.baseClasses = [this.type] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['notionApi'] + } + this.inputs = [ + { + label: 'Text Splitter', + name: 'textSplitter', + type: 'TextSplitter', + optional: true + }, + { + label: 'Notion Page Id', + name: 'pageId', + type: 'string', + description: + 'The last The 32 char hex in the url path. For example: https://www.notion.so/skarard/LangChain-Notion-API-b34ca03f219c4420a6046fc4bdfdf7b4, b34ca03f219c4420a6046fc4bdfdf7b4 is the Page ID' + }, + { + label: 'Metadata', + name: 'metadata', + type: 'json', + optional: true, + additionalParams: true + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const textSplitter = nodeData.inputs?.textSplitter as TextSplitter + const pageId = nodeData.inputs?.pageId as string + const metadata = nodeData.inputs?.metadata + + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const notionIntegrationToken = getCredentialParam('notionIntegrationToken', credentialData, nodeData) + + const obj: NotionAPILoaderOptions = { + clientOptions: { + auth: notionIntegrationToken + }, + id: pageId, + type: 'page' + } + const loader = new NotionAPILoader(obj) + + let docs = [] + if (textSplitter) { + docs = await loader.loadAndSplit(textSplitter) + } else { + docs = await loader.load() + } + + if (metadata) { + const parsedMetadata = typeof metadata === 'object' ? metadata : JSON.parse(metadata) + let finaldocs = [] + for (const doc of docs) { + const newdoc = { + ...doc, + metadata: { + ...doc.metadata, + ...parsedMetadata + } + } + finaldocs.push(newdoc) + } + return finaldocs + } + + return docs + } +} + +module.exports = { nodeClass: NotionPage_DocumentLoaders } diff --git a/packages/components/nodes/documentloaders/NotionPage/notion.png b/packages/components/nodes/documentloaders/NotionPage/notion.png new file mode 100644 index 0000000000000000000000000000000000000000..391051679c8cc33e7e52891593147283bf93dcb0 GIT binary patch literal 11406 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 - - - - \ No newline at end of file + \ No newline at end of file diff --git a/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts b/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts index 4133539e..15c9f460 100644 --- a/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts +++ b/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts @@ -1,6 +1,6 @@ import { AzureOpenAIInput } from 'langchain/chat_models/openai' -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { OpenAIEmbeddings, OpenAIEmbeddingsParams } from 'langchain/embeddings/openai' class AzureOpenAIEmbedding_Embeddings implements INode { @@ -11,6 +11,7 @@ class AzureOpenAIEmbedding_Embeddings implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -21,32 +22,13 @@ class AzureOpenAIEmbedding_Embeddings implements INode { this.category = 'Embeddings' this.description = 'Azure OpenAI API to generate embeddings for a given text' this.baseClasses = [this.type, ...getBaseClasses(OpenAIEmbeddings)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['azureOpenAIApi'] + } this.inputs = [ - { - label: 'Azure OpenAI Api Key', - name: 'azureOpenAIApiKey', - type: 'password' - }, - { - label: 'Azure OpenAI Api Instance Name', - name: 'azureOpenAIApiInstanceName', - type: 'string', - placeholder: 'YOUR-INSTANCE-NAME' - }, - { - label: 'Azure OpenAI Api Deployment Name', - name: 'azureOpenAIApiDeploymentName', - type: 'string', - placeholder: 'YOUR-DEPLOYMENT-NAME' - }, - { - label: 'Azure OpenAI Api Version', - name: 'azureOpenAIApiVersion', - type: 'string', - placeholder: '2023-03-15-preview', - description: - 'Description of Supported API Versions. Please refer examples' - }, { label: 'Batch Size', name: 'batchSize', @@ -65,14 +47,16 @@ class AzureOpenAIEmbedding_Embeddings implements INode { ] } - async init(nodeData: INodeData): Promise { - const azureOpenAIApiKey = nodeData.inputs?.azureOpenAIApiKey as string - const azureOpenAIApiInstanceName = nodeData.inputs?.azureOpenAIApiInstanceName as string - const azureOpenAIApiDeploymentName = nodeData.inputs?.azureOpenAIApiDeploymentName as string - const azureOpenAIApiVersion = nodeData.inputs?.azureOpenAIApiVersion as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const batchSize = nodeData.inputs?.batchSize as string const timeout = nodeData.inputs?.timeout as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const azureOpenAIApiKey = getCredentialParam('azureOpenAIApiKey', credentialData, nodeData) + const azureOpenAIApiInstanceName = getCredentialParam('azureOpenAIApiInstanceName', credentialData, nodeData) + const azureOpenAIApiDeploymentName = getCredentialParam('azureOpenAIApiDeploymentName', credentialData, nodeData) + const azureOpenAIApiVersion = getCredentialParam('azureOpenAIApiVersion', credentialData, nodeData) + const obj: Partial & Partial = { azureOpenAIApiKey, azureOpenAIApiInstanceName, diff --git a/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts b/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts index 344713a4..914d643d 100644 --- a/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts +++ b/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { CohereEmbeddings, CohereEmbeddingsParams } from 'langchain/embeddings/cohere' class CohereEmbedding_Embeddings implements INode { @@ -10,6 +10,7 @@ class CohereEmbedding_Embeddings implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,12 +21,13 @@ class CohereEmbedding_Embeddings implements INode { this.category = 'Embeddings' this.description = 'Cohere API to generate embeddings for a given text' this.baseClasses = [this.type, ...getBaseClasses(CohereEmbeddings)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['cohereApi'] + } this.inputs = [ - { - label: 'Cohere API Key', - name: 'cohereApiKey', - type: 'password' - }, { label: 'Model Name', name: 'modelName', @@ -50,12 +52,14 @@ class CohereEmbedding_Embeddings implements INode { ] } - async init(nodeData: INodeData): Promise { - const apiKey = nodeData.inputs?.cohereApiKey as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const modelName = nodeData.inputs?.modelName as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const cohereApiKey = getCredentialParam('cohereApiKey', credentialData, nodeData) + const obj: Partial & { apiKey?: string } = { - apiKey + apiKey: cohereApiKey } if (modelName) obj.modelName = modelName diff --git a/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts b/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts index d77d623f..bfbb93ed 100644 --- a/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts +++ b/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { HuggingFaceInferenceEmbeddings, HuggingFaceInferenceEmbeddingsParams } from './core' class HuggingFaceInferenceEmbedding_Embeddings implements INode { @@ -10,6 +10,7 @@ class HuggingFaceInferenceEmbedding_Embeddings implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,12 +21,13 @@ class HuggingFaceInferenceEmbedding_Embeddings implements INode { this.category = 'Embeddings' this.description = 'HuggingFace Inference API to generate embeddings for a given text' this.baseClasses = [this.type, ...getBaseClasses(HuggingFaceInferenceEmbeddings)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['huggingFaceApi'] + } this.inputs = [ - { - label: 'HuggingFace Api Key', - name: 'apiKey', - type: 'password' - }, { label: 'Model', name: 'modelName', @@ -43,13 +45,15 @@ class HuggingFaceInferenceEmbedding_Embeddings implements INode { ] } - async init(nodeData: INodeData): Promise { - const apiKey = nodeData.inputs?.apiKey as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const modelName = nodeData.inputs?.modelName as string const endpoint = nodeData.inputs?.endpoint as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const huggingFaceApiKey = getCredentialParam('huggingFaceApiKey', credentialData, nodeData) + const obj: Partial = { - apiKey + apiKey: huggingFaceApiKey } if (modelName) obj.model = modelName diff --git a/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts b/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts index 0fd08973..f2f5eb43 100644 --- a/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts +++ b/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { OpenAIEmbeddings, OpenAIEmbeddingsParams } from 'langchain/embeddings/openai' class OpenAIEmbedding_Embeddings implements INode { @@ -10,22 +10,24 @@ class OpenAIEmbedding_Embeddings implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { this.label = 'OpenAI Embeddings' this.name = 'openAIEmbeddings' this.type = 'OpenAIEmbeddings' - this.icon = 'openai.png' + this.icon = 'openai.svg' this.category = 'Embeddings' this.description = 'OpenAI API to generate embeddings for a given text' this.baseClasses = [this.type, ...getBaseClasses(OpenAIEmbeddings)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['openAIApi'] + } this.inputs = [ - { - label: 'OpenAI Api Key', - name: 'openAIApiKey', - type: 'password' - }, { label: 'Strip New Lines', name: 'stripNewLines', @@ -57,13 +59,15 @@ class OpenAIEmbedding_Embeddings implements INode { ] } - async init(nodeData: INodeData): Promise { - const openAIApiKey = nodeData.inputs?.openAIApiKey as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const stripNewLines = nodeData.inputs?.stripNewLines as boolean const batchSize = nodeData.inputs?.batchSize as string const timeout = nodeData.inputs?.timeout as string const basePath = nodeData.inputs?.basepath as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const openAIApiKey = getCredentialParam('openAIApiKey', credentialData, nodeData) + const obj: Partial & { openAIApiKey?: string } = { openAIApiKey } diff --git a/packages/components/nodes/embeddings/OpenAIEmbedding/openai.png b/packages/components/nodes/embeddings/OpenAIEmbedding/openai.png deleted file mode 100644 index de08a05b28979826c4cc669c4899789763a938a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3991 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 diff --git a/packages/components/nodes/embeddings/OpenAIEmbedding/openai.svg b/packages/components/nodes/embeddings/OpenAIEmbedding/openai.svg new file mode 100644 index 00000000..9d3261dd --- /dev/null +++ b/packages/components/nodes/embeddings/OpenAIEmbedding/openai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/components/nodes/llms/Azure OpenAI/Azure.svg b/packages/components/nodes/llms/Azure OpenAI/Azure.svg index 51eb6253..47ad8c44 100644 --- a/packages/components/nodes/llms/Azure OpenAI/Azure.svg +++ b/packages/components/nodes/llms/Azure OpenAI/Azure.svg @@ -1,5 +1 @@ - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts b/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts index 130eed33..9729dd41 100644 --- a/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts +++ b/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { AzureOpenAIInput, OpenAI, OpenAIInput } from 'langchain/llms/openai' class AzureOpenAI_LLMs implements INode { @@ -10,6 +10,7 @@ class AzureOpenAI_LLMs implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,12 +21,13 @@ class AzureOpenAI_LLMs implements INode { this.category = 'LLMs' this.description = 'Wrapper around Azure OpenAI large language models' this.baseClasses = [this.type, ...getBaseClasses(OpenAI)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['azureOpenAIApi'] + } this.inputs = [ - { - label: 'Azure OpenAI Api Key', - name: 'azureOpenAIApiKey', - type: 'password' - }, { label: 'Model Name', name: 'modelName', @@ -90,26 +92,6 @@ class AzureOpenAI_LLMs implements INode { default: 0.9, optional: true }, - { - label: 'Azure OpenAI Api Instance Name', - name: 'azureOpenAIApiInstanceName', - type: 'string', - placeholder: 'YOUR-INSTANCE-NAME' - }, - { - label: 'Azure OpenAI Api Deployment Name', - name: 'azureOpenAIApiDeploymentName', - type: 'string', - placeholder: 'YOUR-DEPLOYMENT-NAME' - }, - { - label: 'Azure OpenAI Api Version', - name: 'azureOpenAIApiVersion', - type: 'string', - placeholder: '2023-06-01-preview', - description: - 'Description of Supported API Versions. Please refer examples' - }, { label: 'Max Tokens', name: 'maxTokens', @@ -155,13 +137,9 @@ class AzureOpenAI_LLMs implements INode { ] } - async init(nodeData: INodeData): Promise { - const azureOpenAIApiKey = nodeData.inputs?.azureOpenAIApiKey as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const temperature = nodeData.inputs?.temperature as string const modelName = nodeData.inputs?.modelName as string - const azureOpenAIApiInstanceName = nodeData.inputs?.azureOpenAIApiInstanceName as string - const azureOpenAIApiDeploymentName = nodeData.inputs?.azureOpenAIApiDeploymentName as string - const azureOpenAIApiVersion = nodeData.inputs?.azureOpenAIApiVersion as string const maxTokens = nodeData.inputs?.maxTokens as string const topP = nodeData.inputs?.topP as string const frequencyPenalty = nodeData.inputs?.frequencyPenalty as string @@ -170,6 +148,12 @@ class AzureOpenAI_LLMs implements INode { const bestOf = nodeData.inputs?.bestOf as string const streaming = nodeData.inputs?.streaming as boolean + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const azureOpenAIApiKey = getCredentialParam('azureOpenAIApiKey', credentialData, nodeData) + const azureOpenAIApiInstanceName = getCredentialParam('azureOpenAIApiInstanceName', credentialData, nodeData) + const azureOpenAIApiDeploymentName = getCredentialParam('azureOpenAIApiDeploymentName', credentialData, nodeData) + const azureOpenAIApiVersion = getCredentialParam('azureOpenAIApiVersion', credentialData, nodeData) + const obj: Partial & Partial = { temperature: parseFloat(temperature), modelName, diff --git a/packages/components/nodes/llms/Cohere/Cohere.ts b/packages/components/nodes/llms/Cohere/Cohere.ts index 75151571..36bc077a 100644 --- a/packages/components/nodes/llms/Cohere/Cohere.ts +++ b/packages/components/nodes/llms/Cohere/Cohere.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { Cohere, CohereInput } from './core' class Cohere_LLMs implements INode { @@ -10,6 +10,7 @@ class Cohere_LLMs implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,12 +21,13 @@ class Cohere_LLMs implements INode { this.category = 'LLMs' this.description = 'Wrapper around Cohere large language models' this.baseClasses = [this.type, ...getBaseClasses(Cohere)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['cohereApi'] + } this.inputs = [ - { - label: 'Cohere Api Key', - name: 'cohereApiKey', - type: 'password' - }, { label: 'Model Name', name: 'modelName', @@ -75,14 +77,16 @@ class Cohere_LLMs implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const temperature = nodeData.inputs?.temperature as string const modelName = nodeData.inputs?.modelName as string - const apiKey = nodeData.inputs?.cohereApiKey as string const maxTokens = nodeData.inputs?.maxTokens as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const cohereApiKey = getCredentialParam('cohereApiKey', credentialData, nodeData) + const obj: CohereInput = { - apiKey + apiKey: cohereApiKey } if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) diff --git a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts index 92eb46d5..fae1525f 100644 --- a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts +++ b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { HFInput, HuggingFaceInference } from './core' class HuggingFaceInference_LLMs implements INode { @@ -10,6 +10,7 @@ class HuggingFaceInference_LLMs implements INode { category: string description: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,17 +21,28 @@ class HuggingFaceInference_LLMs implements INode { this.category = 'LLMs' this.description = 'Wrapper around HuggingFace large language models' this.baseClasses = [this.type, ...getBaseClasses(HuggingFaceInference)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['huggingFaceApi'] + } this.inputs = [ { label: 'Model', name: 'model', type: 'string', - placeholder: 'gpt2' + description: 'If using own inference endpoint, leave this blank', + placeholder: 'gpt2', + optional: true }, { - label: 'HuggingFace Api Key', - name: 'apiKey', - type: 'password' + label: 'Endpoint', + name: 'endpoint', + type: 'string', + placeholder: 'https://xyz.eu-west-1.aws.endpoints.huggingface.cloud/gpt2', + description: 'Using your own inference endpoint', + optional: true }, { label: 'Temperature', @@ -71,22 +83,12 @@ class HuggingFaceInference_LLMs implements INode { description: 'Frequency Penalty parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true - }, - { - label: 'Endpoint', - name: 'endpoint', - type: 'string', - placeholder: 'https://xyz.eu-west-1.aws.endpoints.huggingface.cloud/gpt2', - description: 'Using your own inference endpoint', - optional: true, - additionalParams: true } ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const model = nodeData.inputs?.model as string - const apiKey = nodeData.inputs?.apiKey as string const temperature = nodeData.inputs?.temperature as string const maxTokens = nodeData.inputs?.maxTokens as string const topP = nodeData.inputs?.topP as string @@ -94,9 +96,12 @@ class HuggingFaceInference_LLMs implements INode { const frequencyPenalty = nodeData.inputs?.frequencyPenalty as string const endpoint = nodeData.inputs?.endpoint as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const huggingFaceApiKey = getCredentialParam('huggingFaceApiKey', credentialData, nodeData) + const obj: Partial = { model, - apiKey + apiKey: huggingFaceApiKey } if (temperature) obj.temperature = parseFloat(temperature) diff --git a/packages/components/nodes/llms/OpenAI/OpenAI.ts b/packages/components/nodes/llms/OpenAI/OpenAI.ts index 50aa1c60..884cf63f 100644 --- a/packages/components/nodes/llms/OpenAI/OpenAI.ts +++ b/packages/components/nodes/llms/OpenAI/OpenAI.ts @@ -17,7 +17,7 @@ class OpenAI_LLMs implements INode { this.label = 'OpenAI' this.name = 'openAI' this.type = 'OpenAI' - this.icon = 'openai.png' + this.icon = 'openai.svg' this.category = 'LLMs' this.description = 'Wrapper around OpenAI large language models' this.baseClasses = [this.type, ...getBaseClasses(OpenAI)] diff --git a/packages/components/nodes/llms/OpenAI/openai.png b/packages/components/nodes/llms/OpenAI/openai.png deleted file mode 100644 index de08a05b28979826c4cc669c4899789763a938a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3991 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 diff --git a/packages/components/nodes/llms/OpenAI/openai.svg b/packages/components/nodes/llms/OpenAI/openai.svg new file mode 100644 index 00000000..9d3261dd --- /dev/null +++ b/packages/components/nodes/llms/OpenAI/openai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/components/nodes/memory/DynamoDb/DynamoDb.ts b/packages/components/nodes/memory/DynamoDb/DynamoDb.ts index 49d15cb6..d9fc75d0 100644 --- a/packages/components/nodes/memory/DynamoDb/DynamoDb.ts +++ b/packages/components/nodes/memory/DynamoDb/DynamoDb.ts @@ -1,4 +1,4 @@ -import { ICommonObject, INode, INodeData, INodeParams, getBaseClasses } from '../../../src' +import { ICommonObject, INode, INodeData, INodeParams, getBaseClasses, getCredentialData, getCredentialParam } from '../../../src' import { DynamoDBChatMessageHistory } from 'langchain/stores/message/dynamodb' import { BufferMemory } from 'langchain/memory' @@ -10,6 +10,7 @@ class DynamoDb_Memory implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -20,6 +21,12 @@ class DynamoDb_Memory implements INode { this.category = 'Memory' this.description = 'Stores the conversation in dynamo db table' this.baseClasses = [this.type, ...getBaseClasses(BufferMemory)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['dynamodbMemoryApi'] + } this.inputs = [ { label: 'Table Name', @@ -31,6 +38,13 @@ class DynamoDb_Memory implements INode { name: 'partitionKey', type: 'string' }, + { + label: 'Region', + name: 'region', + type: 'string', + description: 'The aws region in which table is located', + placeholder: 'us-east-1' + }, { label: 'Session ID', name: 'sessionId', @@ -40,28 +54,12 @@ class DynamoDb_Memory implements INode { additionalParams: true, optional: true }, - { - label: 'Region', - name: 'region', - type: 'string', - description: 'The aws region in which table is located', - placeholder: 'us-east-1' - }, - { - label: 'Access Key', - name: 'accessKey', - type: 'password' - }, - { - label: 'Secret Access Key', - name: 'secretAccessKey', - type: 'password' - }, { label: 'Memory Key', name: 'memoryKey', type: 'string', - default: 'chat_history' + default: 'chat_history', + additionalParams: true } ] } @@ -70,12 +68,14 @@ class DynamoDb_Memory implements INode { const partitionKey = nodeData.inputs?.partitionKey as string const sessionId = nodeData.inputs?.sessionId as string const region = nodeData.inputs?.region as string - const accessKey = nodeData.inputs?.accessKey as string - const secretAccessKey = nodeData.inputs?.secretAccessKey as string const memoryKey = nodeData.inputs?.memoryKey as string const chatId = options.chatId + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const accessKey = getCredentialParam('accessKey', credentialData, nodeData) + const secretAccessKey = getCredentialParam('secretAccessKey', credentialData, nodeData) + const dynamoDb = new DynamoDBChatMessageHistory({ tableName, partitionKey, diff --git a/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts b/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts index 9caf604c..904bd672 100644 --- a/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts +++ b/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts @@ -20,7 +20,7 @@ class MotorMemory_Memory implements INode { this.type = 'MotorheadMemory' this.icon = 'motorhead.png' this.category = 'Memory' - this.description = 'Remembers previous conversational back and forths directly' + this.description = 'Use Motorhead Memory to store chat conversations' this.baseClasses = [this.type, ...getBaseClasses(MotorheadMemory)] this.credential = { label: 'Connect Credential', @@ -38,12 +38,6 @@ class MotorMemory_Memory implements INode { optional: true, description: 'To use the online version, leave the URL blank. More details at https://getmetal.io.' }, - { - label: 'Memory Key', - name: 'memoryKey', - type: 'string', - default: 'chat_history' - }, { label: 'Session Id', name: 'sessionId', @@ -52,6 +46,13 @@ class MotorMemory_Memory implements INode { default: '', additionalParams: true, optional: true + }, + { + label: 'Memory Key', + name: 'memoryKey', + type: 'string', + default: 'chat_history', + additionalParams: true } ] } diff --git a/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts b/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts index 2b4e51c2..37f1cbe2 100644 --- a/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts +++ b/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts @@ -44,13 +44,15 @@ class RedisBackedChatMemory_Memory implements INode { name: 'sessionTTL', type: 'number', description: 'Omit this parameter to make sessions never expire', + additionalParams: true, optional: true }, { label: 'Memory Key', name: 'memoryKey', type: 'string', - default: 'chat_history' + default: 'chat_history', + additionalParams: true } ] } diff --git a/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts b/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts index d6168061..0de7151b 100644 --- a/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts +++ b/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts @@ -1,8 +1,9 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' import { OpenApiToolkit } from 'langchain/agents' import { JsonSpec, JsonObject } from 'langchain/tools' import { BaseLanguageModel } from 'langchain/base_language' import { load } from 'js-yaml' +import { getCredentialData, getCredentialParam } from '../../../src' class OpenAPIToolkit_Tools implements INode { label: string @@ -12,6 +13,7 @@ class OpenAPIToolkit_Tools implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -21,12 +23,15 @@ class OpenAPIToolkit_Tools implements INode { this.icon = 'openapi.png' this.category = 'Tools' this.description = 'Load OpenAPI specification' + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + description: 'Only needed if the YAML OpenAPI Spec requires authentication', + optional: true, + credentialNames: ['openAPIAuth'] + } this.inputs = [ - { - label: 'OpenAI API Key', - name: 'openAIApiKey', - type: 'password' - }, { label: 'Language Model', name: 'model', @@ -42,11 +47,13 @@ class OpenAPIToolkit_Tools implements INode { this.baseClasses = [this.type, 'Tool'] } - async init(nodeData: INodeData): Promise { - const openAIApiKey = nodeData.inputs?.openAIApiKey as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const model = nodeData.inputs?.model as BaseLanguageModel const yamlFileBase64 = nodeData.inputs?.yamlFile as string + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const openAPIToken = getCredentialParam('openAPIToken', credentialData, nodeData) + const splitDataURI = yamlFileBase64.split(',') splitDataURI.pop() const bf = Buffer.from(splitDataURI.pop() || '', 'base64') @@ -56,10 +63,10 @@ class OpenAPIToolkit_Tools implements INode { throw new Error('Failed to load OpenAPI spec') } - const headers = { - 'Content-Type': 'application/json', - Authorization: `Bearer ${openAIApiKey}` + const headers: ICommonObject = { + 'Content-Type': 'application/json' } + if (openAPIToken) headers.Authorization = `Bearer ${openAPIToken}` const toolkit = new OpenApiToolkit(new JsonSpec(data), model, headers) return toolkit.tools diff --git a/packages/components/nodes/tools/SerpAPI/SerpAPI.ts b/packages/components/nodes/tools/SerpAPI/SerpAPI.ts index 69432408..7e87e9c1 100644 --- a/packages/components/nodes/tools/SerpAPI/SerpAPI.ts +++ b/packages/components/nodes/tools/SerpAPI/SerpAPI.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { SerpAPI } from 'langchain/tools' class SerpAPI_Tools implements INode { @@ -10,6 +10,7 @@ class SerpAPI_Tools implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -19,19 +20,20 @@ class SerpAPI_Tools implements INode { this.icon = 'serp.png' this.category = 'Tools' this.description = 'Wrapper around SerpAPI - a real-time API to access Google search results' - this.inputs = [ - { - label: 'Serp Api Key', - name: 'apiKey', - type: 'password' - } - ] + this.inputs = [] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['serpApi'] + } this.baseClasses = [this.type, ...getBaseClasses(SerpAPI)] } - async init(nodeData: INodeData): Promise { - const apiKey = nodeData.inputs?.apiKey as string - return new SerpAPI(apiKey) + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const serpApiKey = getCredentialParam('serpApiKey', credentialData, nodeData) + return new SerpAPI(serpApiKey) } } diff --git a/packages/components/nodes/tools/Serper/Serper.ts b/packages/components/nodes/tools/Serper/Serper.ts index 65dff57c..495ac8af 100644 --- a/packages/components/nodes/tools/Serper/Serper.ts +++ b/packages/components/nodes/tools/Serper/Serper.ts @@ -1,5 +1,5 @@ -import { INode, INodeData, INodeParams } from '../../../src/Interface' -import { getBaseClasses } from '../../../src/utils' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { Serper } from 'langchain/tools' class Serper_Tools implements INode { @@ -10,6 +10,7 @@ class Serper_Tools implements INode { icon: string category: string baseClasses: string[] + credential: INodeParams inputs: INodeParams[] constructor() { @@ -19,19 +20,20 @@ class Serper_Tools implements INode { this.icon = 'serper.png' this.category = 'Tools' this.description = 'Wrapper around Serper.dev - Google Search API' - this.inputs = [ - { - label: 'Serper Api Key', - name: 'apiKey', - type: 'password' - } - ] + this.inputs = [] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['serperApi'] + } this.baseClasses = [this.type, ...getBaseClasses(Serper)] } - async init(nodeData: INodeData): Promise { - const apiKey = nodeData.inputs?.apiKey as string - return new Serper(apiKey) + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const serperApiKey = getCredentialParam('serperApiKey', credentialData, nodeData) + return new Serper(serperApiKey) } } diff --git a/packages/components/nodes/tools/ZapierNLA/ZapierNLA.ts b/packages/components/nodes/tools/ZapierNLA/ZapierNLA.ts index d16e32e6..06d3dc5a 100644 --- a/packages/components/nodes/tools/ZapierNLA/ZapierNLA.ts +++ b/packages/components/nodes/tools/ZapierNLA/ZapierNLA.ts @@ -1,6 +1,7 @@ import { ZapierNLAWrapper, ZapierNLAWrapperParams } from 'langchain/tools' -import { INode, INodeData, INodeParams } from '../../../src/Interface' +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 @@ -11,29 +12,31 @@ class ZapierNLA_Tools implements INode { category: string baseClasses: string[] inputs: INodeParams[] + credential: INodeParams constructor() { this.label = 'Zapier NLA' this.name = 'zapierNLA' this.type = 'ZapierNLA' - this.icon = 'zapier.png' + 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.inputs = [ - { - label: 'Zapier NLA Api Key', - name: 'apiKey', - type: 'password' - } - ] + this.inputs = [] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['zapierNLAApi'] + } this.baseClasses = [this.type, 'Tool'] } - async init(nodeData: INodeData): Promise { - const apiKey = nodeData.inputs?.apiKey as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const zapierNLAApiKey = getCredentialParam('zapierNLAApiKey', credentialData, nodeData) const obj: Partial = { - apiKey + apiKey: zapierNLAApiKey } const zapier = new ZapierNLAWrapper(obj) const toolkit = await ZapierToolKit.fromZapierNLAWrapper(zapier) diff --git a/packages/components/nodes/tools/ZapierNLA/zapier.png b/packages/components/nodes/tools/ZapierNLA/zapier.png deleted file mode 100644 index 769716faaadca77fcd3e7ac06c22ba570d37d2e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^?I6s-1SB`N-i-xPjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL7@`Yh?3y^w370~qErU=qSVy9;*9)~xKIwD z7RFpp7srr_xVIM-MVTELj$9~>2wc9vtS{`rwEm`s`Qk!ziZ33Xs + + + + + + + \ No newline at end of file diff --git a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts index e57da396..3d37d61e 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts @@ -1,8 +1,8 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { PineconeClient } from '@pinecone-database/pinecone' import { PineconeLibArgs, PineconeStore } from 'langchain/vectorstores/pinecone' import { Embeddings } from 'langchain/embeddings/base' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' class Pinecone_Existing_VectorStores implements INode { label: string @@ -13,6 +13,7 @@ class Pinecone_Existing_VectorStores implements INode { category: string baseClasses: string[] inputs: INodeParams[] + credential: INodeParams outputs: INodeOutputsValue[] constructor() { @@ -23,22 +24,18 @@ class Pinecone_Existing_VectorStores implements INode { this.category = 'Vector Stores' this.description = 'Load existing index from Pinecone (i.e: Document has been upserted)' this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['pineconeApi'] + } this.inputs = [ { label: 'Embeddings', name: 'embeddings', type: 'Embeddings' }, - { - label: 'Pinecone Api Key', - name: 'pineconeApiKey', - type: 'password' - }, - { - label: 'Pinecone Environment', - name: 'pineconeEnv', - type: 'string' - }, { label: 'Pinecone Index', name: 'pineconeIndex', @@ -83,9 +80,7 @@ class Pinecone_Existing_VectorStores implements INode { ] } - async init(nodeData: INodeData): Promise { - const pineconeApiKey = nodeData.inputs?.pineconeApiKey as string - const pineconeEnv = nodeData.inputs?.pineconeEnv as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const index = nodeData.inputs?.pineconeIndex as string const pineconeNamespace = nodeData.inputs?.pineconeNamespace as string const pineconeMetadataFilter = nodeData.inputs?.pineconeMetadataFilter @@ -94,6 +89,10 @@ class Pinecone_Existing_VectorStores implements INode { const topK = nodeData.inputs?.topK as string const k = topK ? parseInt(topK, 10) : 4 + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const pineconeApiKey = getCredentialParam('pineconeApiKey', credentialData, nodeData) + const pineconeEnv = getCredentialParam('pineconeEnv', credentialData, nodeData) + const client = new PineconeClient() await client.init({ apiKey: pineconeApiKey, diff --git a/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts b/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts index ad1767c2..a3cc9094 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts @@ -1,9 +1,9 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { PineconeClient } from '@pinecone-database/pinecone' import { PineconeLibArgs, PineconeStore } from 'langchain/vectorstores/pinecone' import { Embeddings } from 'langchain/embeddings/base' import { Document } from 'langchain/document' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { flatten } from 'lodash' class PineconeUpsert_VectorStores implements INode { @@ -15,6 +15,7 @@ class PineconeUpsert_VectorStores implements INode { category: string baseClasses: string[] inputs: INodeParams[] + credential: INodeParams outputs: INodeOutputsValue[] constructor() { @@ -25,6 +26,12 @@ class PineconeUpsert_VectorStores implements INode { this.category = 'Vector Stores' this.description = 'Upsert documents to Pinecone' this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['pineconeApi'] + } this.inputs = [ { label: 'Document', @@ -37,16 +44,6 @@ class PineconeUpsert_VectorStores implements INode { name: 'embeddings', type: 'Embeddings' }, - { - label: 'Pinecone Api Key', - name: 'pineconeApiKey', - type: 'password' - }, - { - label: 'Pinecone Environment', - name: 'pineconeEnv', - type: 'string' - }, { label: 'Pinecone Index', name: 'pineconeIndex', @@ -84,9 +81,7 @@ class PineconeUpsert_VectorStores implements INode { ] } - async init(nodeData: INodeData): Promise { - const pineconeApiKey = nodeData.inputs?.pineconeApiKey as string - const pineconeEnv = nodeData.inputs?.pineconeEnv as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const index = nodeData.inputs?.pineconeIndex as string const pineconeNamespace = nodeData.inputs?.pineconeNamespace as string const docs = nodeData.inputs?.document as Document[] @@ -95,6 +90,10 @@ class PineconeUpsert_VectorStores implements INode { const topK = nodeData.inputs?.topK as string const k = topK ? parseInt(topK, 10) : 4 + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const pineconeApiKey = getCredentialParam('pineconeApiKey', credentialData, nodeData) + const pineconeEnv = getCredentialParam('pineconeEnv', credentialData, nodeData) + const client = new PineconeClient() await client.init({ apiKey: pineconeApiKey, diff --git a/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts b/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts index f1eef8f9..bb4ac6ed 100644 --- a/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts +++ b/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts @@ -1,8 +1,8 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { QdrantClient } from '@qdrant/js-client-rest' import { QdrantVectorStore, QdrantLibArgs } from 'langchain/vectorstores/qdrant' import { Embeddings } from 'langchain/embeddings/base' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' class Qdrant_Existing_VectorStores implements INode { label: string @@ -13,16 +13,25 @@ class Qdrant_Existing_VectorStores implements INode { category: string baseClasses: string[] inputs: INodeParams[] + credential: INodeParams outputs: INodeOutputsValue[] constructor() { this.label = 'Qdrant Load Existing Index' this.name = 'qdrantExistingIndex' this.type = 'Qdrant' - this.icon = 'qdrant_logo.svg' + this.icon = 'qdrant.png' this.category = 'Vector Stores' this.description = 'Load existing index from Qdrant (i.e., documents have been upserted)' this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + description: 'Only needed when using Qdrant cloud hosted', + optional: true, + credentialNames: ['qdrantApi'] + } this.inputs = [ { label: 'Embeddings', @@ -40,12 +49,6 @@ class Qdrant_Existing_VectorStores implements INode { name: 'qdrantCollection', type: 'string' }, - { - label: 'Qdrant API Key', - name: 'qdrantApiKey', - type: 'password', - optional: true - }, { label: 'Qdrant Collection Cofiguration', name: 'qdrantCollectionCofiguration', @@ -77,17 +80,18 @@ class Qdrant_Existing_VectorStores implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const qdrantServerUrl = nodeData.inputs?.qdrantServerUrl as string const collectionName = nodeData.inputs?.qdrantCollection as string - const qdrantApiKey = nodeData.inputs?.qdrantApiKey as string let qdrantCollectionCofiguration = nodeData.inputs?.qdrantCollectionCofiguration const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string const k = topK ? parseInt(topK, 10) : 4 - // connect to Qdrant Cloud + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const qdrantApiKey = getCredentialParam('qdrantApiKey', credentialData, nodeData) + const client = new QdrantClient({ url: qdrantServerUrl, apiKey: qdrantApiKey diff --git a/packages/components/nodes/vectorstores/Qdrant_Existing/qdrant.png b/packages/components/nodes/vectorstores/Qdrant_Existing/qdrant.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb2a56d55fbaf6ccdc3640a3d8d3d6587dd701a GIT binary patch literal 11663 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 QMQa!Z8D;4*Nt2NO1;l09w*UYD literal 0 HcmV?d00001 diff --git a/packages/components/nodes/vectorstores/Qdrant_Existing/qdrant_logo.svg b/packages/components/nodes/vectorstores/Qdrant_Existing/qdrant_logo.svg deleted file mode 100644 index 82fb8b39..00000000 --- a/packages/components/nodes/vectorstores/Qdrant_Existing/qdrant_logo.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts b/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts index dae1d31d..c0a7b305 100644 --- a/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts +++ b/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts @@ -1,9 +1,9 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { QdrantClient } from '@qdrant/js-client-rest' import { QdrantVectorStore, QdrantLibArgs } from 'langchain/vectorstores/qdrant' import { Embeddings } from 'langchain/embeddings/base' import { Document } from 'langchain/document' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { flatten } from 'lodash' class QdrantUpsert_VectorStores implements INode { @@ -15,16 +15,25 @@ class QdrantUpsert_VectorStores implements INode { category: string baseClasses: string[] inputs: INodeParams[] + credential: INodeParams outputs: INodeOutputsValue[] constructor() { this.label = 'Qdrant Upsert Document' this.name = 'qdrantUpsert' this.type = 'Qdrant' - this.icon = 'qdrant_logo.svg' + this.icon = 'qdrant.png' this.category = 'Vector Stores' this.description = 'Upsert documents to Qdrant' this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + description: 'Only needed when using Qdrant cloud hosted', + optional: true, + credentialNames: ['qdrantApi'] + } this.inputs = [ { label: 'Document', @@ -48,12 +57,6 @@ class QdrantUpsert_VectorStores implements INode { name: 'qdrantCollection', type: 'string' }, - { - label: 'Qdrant API Key', - name: 'qdrantApiKey', - type: 'password', - optional: true - }, { label: 'Top K', name: 'topK', @@ -78,17 +81,18 @@ class QdrantUpsert_VectorStores implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const qdrantServerUrl = nodeData.inputs?.qdrantServerUrl as string const collectionName = nodeData.inputs?.qdrantCollection as string - const qdrantApiKey = nodeData.inputs?.qdrantApiKey as string const docs = nodeData.inputs?.document as Document[] const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string const k = topK ? parseInt(topK, 10) : 4 - // connect to Qdrant Cloud + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const qdrantApiKey = getCredentialParam('qdrantApiKey', credentialData, nodeData) + const client = new QdrantClient({ url: qdrantServerUrl, apiKey: qdrantApiKey diff --git a/packages/components/nodes/vectorstores/Qdrant_Upsert/qdrant.png b/packages/components/nodes/vectorstores/Qdrant_Upsert/qdrant.png new file mode 100644 index 0000000000000000000000000000000000000000..ecb2a56d55fbaf6ccdc3640a3d8d3d6587dd701a GIT binary patch literal 11663 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 QMQa!Z8D;4*Nt2NO1;l09w*UYD literal 0 HcmV?d00001 diff --git a/packages/components/nodes/vectorstores/Qdrant_Upsert/qdrant_logo.svg b/packages/components/nodes/vectorstores/Qdrant_Upsert/qdrant_logo.svg deleted file mode 100644 index 82fb8b39..00000000 --- a/packages/components/nodes/vectorstores/Qdrant_Upsert/qdrant_logo.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts b/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts index 173660ca..6bea7e2a 100644 --- a/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts +++ b/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts @@ -1,6 +1,6 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { Embeddings } from 'langchain/embeddings/base' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { SupabaseLibArgs, SupabaseVectorStore } from 'langchain/vectorstores/supabase' import { createClient } from '@supabase/supabase-js' @@ -13,6 +13,7 @@ class Supabase_Existing_VectorStores implements INode { category: string baseClasses: string[] inputs: INodeParams[] + credential: INodeParams outputs: INodeOutputsValue[] constructor() { @@ -23,17 +24,18 @@ class Supabase_Existing_VectorStores implements INode { this.category = 'Vector Stores' this.description = 'Load existing index from Supabase (i.e: Document has been upserted)' this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['supabaseApi'] + } this.inputs = [ { label: 'Embeddings', name: 'embeddings', type: 'Embeddings' }, - { - label: 'Supabase API Key', - name: 'supabaseApiKey', - type: 'password' - }, { label: 'Supabase Project URL', name: 'supabaseProjUrl', @@ -80,8 +82,7 @@ class Supabase_Existing_VectorStores implements INode { ] } - async init(nodeData: INodeData): Promise { - const supabaseApiKey = nodeData.inputs?.supabaseApiKey as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const supabaseProjUrl = nodeData.inputs?.supabaseProjUrl as string const tableName = nodeData.inputs?.tableName as string const queryName = nodeData.inputs?.queryName as string @@ -91,6 +92,9 @@ class Supabase_Existing_VectorStores implements INode { const topK = nodeData.inputs?.topK as string const k = topK ? parseInt(topK, 10) : 4 + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const supabaseApiKey = getCredentialParam('supabaseApiKey', credentialData, nodeData) + const client = createClient(supabaseProjUrl, supabaseApiKey) const obj: SupabaseLibArgs = { diff --git a/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts b/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts index 69997a56..40e0cc89 100644 --- a/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts +++ b/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts @@ -1,7 +1,7 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { Embeddings } from 'langchain/embeddings/base' import { Document } from 'langchain/document' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { SupabaseVectorStore } from 'langchain/vectorstores/supabase' import { createClient } from '@supabase/supabase-js' import { flatten } from 'lodash' @@ -15,6 +15,7 @@ class SupabaseUpsert_VectorStores implements INode { category: string baseClasses: string[] inputs: INodeParams[] + credential: INodeParams outputs: INodeOutputsValue[] constructor() { @@ -25,6 +26,12 @@ class SupabaseUpsert_VectorStores implements INode { this.category = 'Vector Stores' this.description = 'Upsert documents to Supabase' this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['supabaseApi'] + } this.inputs = [ { label: 'Document', @@ -37,11 +44,6 @@ class SupabaseUpsert_VectorStores implements INode { name: 'embeddings', type: 'Embeddings' }, - { - label: 'Supabase API Key', - name: 'supabaseApiKey', - type: 'password' - }, { label: 'Supabase Project URL', name: 'supabaseProjUrl', @@ -81,8 +83,7 @@ class SupabaseUpsert_VectorStores implements INode { ] } - async init(nodeData: INodeData): Promise { - const supabaseApiKey = nodeData.inputs?.supabaseApiKey as string + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const supabaseProjUrl = nodeData.inputs?.supabaseProjUrl as string const tableName = nodeData.inputs?.tableName as string const queryName = nodeData.inputs?.queryName as string @@ -92,6 +93,9 @@ class SupabaseUpsert_VectorStores implements INode { const topK = nodeData.inputs?.topK as string const k = topK ? parseInt(topK, 10) : 4 + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const supabaseApiKey = getCredentialParam('supabaseApiKey', credentialData, nodeData) + const client = createClient(supabaseProjUrl, supabaseApiKey) const flattenDocs = docs && docs.length ? flatten(docs) : [] diff --git a/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts b/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts index 595691bd..3bf27d56 100644 --- a/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts +++ b/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts @@ -1,6 +1,6 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { Embeddings } from 'langchain/embeddings/base' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import weaviate, { WeaviateClient, ApiKey } from 'weaviate-ts-client' import { WeaviateLibArgs, WeaviateStore } from 'langchain/vectorstores/weaviate' @@ -13,6 +13,7 @@ class Weaviate_Existing_VectorStores implements INode { category: string baseClasses: string[] inputs: INodeParams[] + credential: INodeParams outputs: INodeOutputsValue[] constructor() { @@ -23,6 +24,14 @@ class Weaviate_Existing_VectorStores implements INode { this.category = 'Vector Stores' this.description = 'Load existing index from Weaviate (i.e: Document has been upserted)' this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + description: 'Only needed when using Weaviate cloud hosted', + optional: true, + credentialNames: ['weaviateApi'] + } this.inputs = [ { label: 'Embeddings', @@ -57,12 +66,6 @@ class Weaviate_Existing_VectorStores implements INode { type: 'string', placeholder: 'Test' }, - { - label: 'Weaviate API Key', - name: 'weaviateApiKey', - type: 'password', - optional: true - }, { label: 'Weaviate Text Key', name: 'weaviateTextKey', @@ -104,11 +107,10 @@ class Weaviate_Existing_VectorStores implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const weaviateScheme = nodeData.inputs?.weaviateScheme as string const weaviateHost = nodeData.inputs?.weaviateHost as string const weaviateIndex = nodeData.inputs?.weaviateIndex as string - const weaviateApiKey = nodeData.inputs?.weaviateApiKey as string const weaviateTextKey = nodeData.inputs?.weaviateTextKey as string const weaviateMetadataKeys = nodeData.inputs?.weaviateMetadataKeys as string const embeddings = nodeData.inputs?.embeddings as Embeddings @@ -116,6 +118,9 @@ class Weaviate_Existing_VectorStores implements INode { const topK = nodeData.inputs?.topK as string const k = topK ? parseInt(topK, 10) : 4 + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const weaviateApiKey = getCredentialParam('weaviateApiKey', credentialData, nodeData) + const clientConfig: any = { scheme: weaviateScheme, host: weaviateHost diff --git a/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts b/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts index 06137426..07f8f2ff 100644 --- a/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts +++ b/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts @@ -1,7 +1,7 @@ -import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' +import { ICommonObject, INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' import { Embeddings } from 'langchain/embeddings/base' import { Document } from 'langchain/document' -import { getBaseClasses } from '../../../src/utils' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' import { WeaviateLibArgs, WeaviateStore } from 'langchain/vectorstores/weaviate' import weaviate, { WeaviateClient, ApiKey } from 'weaviate-ts-client' import { flatten } from 'lodash' @@ -15,6 +15,7 @@ class WeaviateUpsert_VectorStores implements INode { category: string baseClasses: string[] inputs: INodeParams[] + credential: INodeParams outputs: INodeOutputsValue[] constructor() { @@ -25,6 +26,14 @@ class WeaviateUpsert_VectorStores implements INode { this.category = 'Vector Stores' this.description = 'Upsert documents to Weaviate' this.baseClasses = [this.type, 'VectorStoreRetriever', 'BaseRetriever'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + description: 'Only needed when using Weaviate cloud hosted', + optional: true, + credentialNames: ['weaviateApi'] + } this.inputs = [ { label: 'Document', @@ -65,12 +74,6 @@ class WeaviateUpsert_VectorStores implements INode { type: 'string', placeholder: 'Test' }, - { - label: 'Weaviate API Key', - name: 'weaviateApiKey', - type: 'password', - optional: true - }, { label: 'Weaviate Text Key', name: 'weaviateTextKey', @@ -112,11 +115,10 @@ class WeaviateUpsert_VectorStores implements INode { ] } - async init(nodeData: INodeData): Promise { + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { const weaviateScheme = nodeData.inputs?.weaviateScheme as string const weaviateHost = nodeData.inputs?.weaviateHost as string const weaviateIndex = nodeData.inputs?.weaviateIndex as string - const weaviateApiKey = nodeData.inputs?.weaviateApiKey as string const weaviateTextKey = nodeData.inputs?.weaviateTextKey as string const weaviateMetadataKeys = nodeData.inputs?.weaviateMetadataKeys as string const docs = nodeData.inputs?.document as Document[] @@ -125,6 +127,9 @@ class WeaviateUpsert_VectorStores implements INode { const topK = nodeData.inputs?.topK as string const k = topK ? parseInt(topK, 10) : 4 + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const weaviateApiKey = getCredentialParam('weaviateApiKey', credentialData, nodeData) + const clientConfig: any = { scheme: weaviateScheme, host: weaviateHost diff --git a/packages/components/package.json b/packages/components/package.json index 3459a372..59013a1f 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -20,6 +20,7 @@ "@dqbd/tiktoken": "^1.0.7", "@getzep/zep-js": "^0.3.1", "@huggingface/inference": "^2.6.1", + "@notionhq/client": "^2.2.7", "@opensearch-project/opensearch": "^1.2.0", "@pinecone-database/pinecone": "^0.0.12", "@qdrant/js-client-rest": "^1.2.2", @@ -42,6 +43,7 @@ "mammoth": "^1.5.1", "moment": "^2.29.3", "node-fetch": "^2.6.11", + "notion-to-md": "^3.1.1", "pdf-parse": "^1.1.1", "pdfjs-dist": "^3.7.107", "playwright": "^1.35.0", diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json index 2002d62f..5ace3d9e 100644 --- a/packages/components/tsconfig.json +++ b/packages/components/tsconfig.json @@ -16,5 +16,5 @@ "declaration": true, "module": "commonjs" }, - "include": ["src", "nodes"] + "include": ["src", "nodes", "credentials"] } diff --git a/packages/server/src/NodesPool.ts b/packages/server/src/NodesPool.ts index e339f592..62db41ba 100644 --- a/packages/server/src/NodesPool.ts +++ b/packages/server/src/NodesPool.ts @@ -27,7 +27,7 @@ export class NodesPool { const nodeFiles = await this.getFiles(nodesPath) return Promise.all( nodeFiles.map(async (file) => { - if (file.endsWith('.js') && !file.endsWith('.credential.js')) { + if (file.endsWith('.js')) { const nodeModule = await require(file) if (nodeModule.nodeClass) { @@ -66,7 +66,7 @@ export class NodesPool { */ private async initializeCrdentials() { const packagePath = getNodeModulesPackagePath('flowise-components') - const nodesPath = path.join(packagePath, 'dist', 'nodes') + const nodesPath = path.join(packagePath, 'dist', 'credentials') const nodeFiles = await this.getFiles(nodesPath) return Promise.all( nodeFiles.map(async (file) => { From 91fe7e8e0513a167a5d1b27d7253468dee3322a5 Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 15 Jul 2023 23:44:30 +0100 Subject: [PATCH 03/19] update marketplace --- .../ConversationalAgent.ts | 21 +- .../chatmodels/ChatAnthropic/ChatAnthropic.ts | 2 +- packages/components/package.json | 2 +- .../{API Agent.json => API Agent 1.json} | 1157 ++++++----- .../marketplaces/chatflows/API Agent 2.json | 644 ++++++ .../marketplaces/chatflows/Antonym.json | 510 ++--- .../marketplaces/chatflows/AutoGPT.json | 497 ++--- .../marketplaces/chatflows/BabyAGI.json | 518 ++--- .../marketplaces/chatflows/ChatGPTPlugin.json | 164 +- .../marketplaces/chatflows/Claude LLM.json | 412 ++++ .../chatflows/Conversational Agent.json | 446 +++-- .../Conversational Retrieval QA Chain.json | 497 ++--- .../chatflows/HuggingFace LLM Chain.json | 253 +-- .../chatflows/Long Term Memory.json | 642 ++++++ .../marketplaces/chatflows/MRKLAgent.json | 413 ++-- .../chatflows/Metadata Filter Load.json | 715 ++++--- .../chatflows/Metadata Filter Upsert.json | 727 ++++--- .../chatflows/Multi Prompt Chain.json | 32 +- .../chatflows/Multi Retrieval QA Chain.json | 864 ++++---- .../chatflows/Multiple VectorDB.json | 1760 ++++++++--------- .../marketplaces/chatflows/OpenAI Agent.json | 600 +++--- .../chatflows/Prompt Chaining.json | 936 ++++----- .../marketplaces/chatflows/SQL DB Chain.json | 314 +-- .../chatflows/Simple Conversation Chain.json | 161 +- .../chatflows/Simple LLM Chain.json | 332 ++-- .../marketplaces/chatflows/Translator.json | 328 +-- .../marketplaces/chatflows/WebBrowser.json | 499 +++-- ...{Github Repo QnA.json => WebPage QnA.json} | 849 ++++---- .../marketplaces/chatflows/Zapier NLA.json | 140 +- 29 files changed, 8028 insertions(+), 6407 deletions(-) rename packages/server/marketplaces/chatflows/{API Agent.json => API Agent 1.json} (88%) create mode 100644 packages/server/marketplaces/chatflows/API Agent 2.json create mode 100644 packages/server/marketplaces/chatflows/Claude LLM.json create mode 100644 packages/server/marketplaces/chatflows/Long Term Memory.json rename packages/server/marketplaces/chatflows/{Github Repo QnA.json => WebPage QnA.json} (71%) diff --git a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts index 568ced0b..88cb8ec6 100644 --- a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts +++ b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts @@ -7,6 +7,14 @@ import { AIMessage, HumanMessage } from 'langchain/schema' import { BaseLanguageModel } from 'langchain/base_language' import { flatten } from 'lodash' +const DEFAULT_PREFIX = `Assistant is a large language model trained by OpenAI. + +Assistant 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. + +Assistant 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. + +Overall, 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.` + class ConversationalAgent_Agents implements INode { label: string name: string @@ -47,14 +55,7 @@ class ConversationalAgent_Agents implements INode { name: 'systemMessage', type: 'string', rows: 4, - optional: true, - additionalParams: true - }, - { - label: 'Human Message', - name: 'humanMessage', - type: 'string', - rows: 4, + default: DEFAULT_PREFIX, optional: true, additionalParams: true } @@ -66,7 +67,6 @@ class ConversationalAgent_Agents implements INode { let tools = nodeData.inputs?.tools as Tool[] tools = flatten(tools) const memory = nodeData.inputs?.memory as BaseChatMemory - const humanMessage = nodeData.inputs?.humanMessage as string const systemMessage = nodeData.inputs?.systemMessage as string const obj: InitializeAgentExecutorOptions = { @@ -75,9 +75,6 @@ class ConversationalAgent_Agents implements INode { } const agentArgs: any = {} - if (humanMessage) { - agentArgs.humanMessage = humanMessage - } if (systemMessage) { agentArgs.systemMessage = systemMessage } diff --git a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts index d4041163..8f98ebf6 100644 --- a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts +++ b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts @@ -88,7 +88,7 @@ class ChatAnthropic_ChatModels implements INode { name: 'claude-instant-v1.1-100k' } ], - default: 'claude-v1', + default: 'claude-2', optional: true }, { diff --git a/packages/components/package.json b/packages/components/package.json index 59013a1f..8da12534 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -38,7 +38,7 @@ "form-data": "^4.0.0", "graphql": "^16.6.0", "html-to-text": "^9.0.5", - "langchain": "^0.0.104", + "langchain": "^0.0.110", "linkifyjs": "^4.1.1", "mammoth": "^1.5.1", "moment": "^2.29.3", diff --git a/packages/server/marketplaces/chatflows/API Agent.json b/packages/server/marketplaces/chatflows/API Agent 1.json similarity index 88% rename from packages/server/marketplaces/chatflows/API Agent.json rename to packages/server/marketplaces/chatflows/API Agent 1.json index 8ca79926..c1ed60d5 100644 --- a/packages/server/marketplaces/chatflows/API Agent.json +++ b/packages/server/marketplaces/chatflows/API Agent 1.json @@ -89,89 +89,6 @@ }, "dragging": false }, - { - "width": 300, - "height": 383, - "id": "conversationalAgent_0", - "position": { - "x": 1993.8540808923876, - "y": 952.6297081192247 - }, - "type": "customNode", - "data": { - "id": "conversationalAgent_0", - "label": "Conversational Agent", - "name": "conversationalAgent", - "type": "AgentExecutor", - "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], - "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, - "optional": true, - "additionalParams": true, - "id": "conversationalAgent_0-input-systemMessage-string" - }, - { - "label": "Human Message", - "name": "humanMessage", - "type": "string", - "rows": 4, - "optional": true, - "additionalParams": true, - "id": "conversationalAgent_0-input-humanMessage-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_0.data.instance}}", "{{chainTool_1.data.instance}}"], - "model": "{{chatOpenAI_0.data.instance}}", - "memory": "{{bufferMemory_0.data.instance}}", - "systemMessage": "", - "humanMessage": "" - }, - "outputAnchors": [ - { - "id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain|BaseLangChain", - "name": "conversationalAgent", - "label": "AgentExecutor", - "type": "AgentExecutor | BaseChain | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1993.8540808923876, - "y": 952.6297081192247 - }, - "dragging": false - }, { "width": 300, "height": 602, @@ -245,157 +162,6 @@ }, "dragging": false }, - { - "width": 300, - "height": 524, - "id": "chatOpenAI_0", - "position": { - "x": 1270.7548070814019, - "y": 1565.864417576483 - }, - "type": "customNode", - "data": { - "id": "chatOpenAI_0", - "label": "ChatOpenAI", - "name": "chatOpenAI", - "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], - "category": "Chat Models", - "description": "Wrapper around OpenAI large language models that use the Chat endpoint", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_0-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "gpt-4", - "name": "gpt-4" - }, - { - "label": "gpt-4-0613", - "name": "gpt-4-0613" - }, - { - "label": "gpt-4-32k", - "name": "gpt-4-32k" - }, - { - "label": "gpt-4-32k-0613", - "name": "gpt-4-32k-0613" - }, - { - "label": "gpt-3.5-turbo", - "name": "gpt-3.5-turbo" - }, - { - "label": "gpt-3.5-turbo-0613", - "name": "gpt-3.5-turbo-0613" - }, - { - "label": "gpt-3.5-turbo-16k", - "name": "gpt-3.5-turbo-16k" - }, - { - "label": "gpt-3.5-turbo-16k-0613", - "name": "gpt-3.5-turbo-16k-0613" - } - ], - "default": "gpt-3.5-turbo", - "optional": true, - "id": "chatOpenAI_0-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.9, - "optional": true, - "id": "chatOpenAI_0-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-topP-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-presencePenalty-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "gpt-3.5-turbo", - "temperature": 0.9, - "maxTokens": "", - "topP": "", - "frequencyPenalty": "", - "presencePenalty": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "name": "chatOpenAI", - "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1270.7548070814019, - "y": 1565.864417576483 - }, - "dragging": false - }, { "width": 300, "height": 376, @@ -452,308 +218,6 @@ }, "dragging": false }, - { - "width": 300, - "height": 524, - "id": "chatOpenAI_1", - "position": { - "x": 865.4424095725009, - "y": 350.7505181391267 - }, - "type": "customNode", - "data": { - "id": "chatOpenAI_1", - "label": "ChatOpenAI", - "name": "chatOpenAI", - "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], - "category": "Chat Models", - "description": "Wrapper around OpenAI large language models that use the Chat endpoint", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "gpt-4", - "name": "gpt-4" - }, - { - "label": "gpt-4-0613", - "name": "gpt-4-0613" - }, - { - "label": "gpt-4-32k", - "name": "gpt-4-32k" - }, - { - "label": "gpt-4-32k-0613", - "name": "gpt-4-32k-0613" - }, - { - "label": "gpt-3.5-turbo", - "name": "gpt-3.5-turbo" - }, - { - "label": "gpt-3.5-turbo-0613", - "name": "gpt-3.5-turbo-0613" - }, - { - "label": "gpt-3.5-turbo-16k", - "name": "gpt-3.5-turbo-16k" - }, - { - "label": "gpt-3.5-turbo-16k-0613", - "name": "gpt-3.5-turbo-16k-0613" - } - ], - "default": "gpt-3.5-turbo", - "optional": true, - "id": "chatOpenAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.9, - "optional": true, - "id": "chatOpenAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-topP-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-presencePenalty-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "gpt-3.5-turbo", - "temperature": 0.9, - "maxTokens": "", - "topP": "", - "frequencyPenalty": "", - "presencePenalty": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "name": "chatOpenAI", - "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 865.4424095725009, - "y": 350.7505181391267 - }, - "dragging": false - }, - { - "width": 300, - "height": 524, - "id": "chatOpenAI_2", - "position": { - "x": 587.6425146349426, - "y": 917.1494176892741 - }, - "type": "customNode", - "data": { - "id": "chatOpenAI_2", - "label": "ChatOpenAI", - "name": "chatOpenAI", - "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], - "category": "Chat Models", - "description": "Wrapper around OpenAI large language models that use the Chat endpoint", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_2-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "gpt-4", - "name": "gpt-4" - }, - { - "label": "gpt-4-0613", - "name": "gpt-4-0613" - }, - { - "label": "gpt-4-32k", - "name": "gpt-4-32k" - }, - { - "label": "gpt-4-32k-0613", - "name": "gpt-4-32k-0613" - }, - { - "label": "gpt-3.5-turbo", - "name": "gpt-3.5-turbo" - }, - { - "label": "gpt-3.5-turbo-0613", - "name": "gpt-3.5-turbo-0613" - }, - { - "label": "gpt-3.5-turbo-16k", - "name": "gpt-3.5-turbo-16k" - }, - { - "label": "gpt-3.5-turbo-16k-0613", - "name": "gpt-3.5-turbo-16k-0613" - } - ], - "default": "gpt-3.5-turbo", - "optional": true, - "id": "chatOpenAI_2-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.9, - "optional": true, - "id": "chatOpenAI_2-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_2-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_2-input-topP-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_2-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_2-input-presencePenalty-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_2-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_2-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "gpt-3.5-turbo", - "temperature": 0.9, - "maxTokens": "", - "topP": "", - "frequencyPenalty": "", - "presencePenalty": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "name": "chatOpenAI", - "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 587.6425146349426, - "y": 917.1494176892741 - }, - "dragging": false - }, { "width": 300, "height": 602, @@ -914,6 +378,539 @@ "y": 974.8756002461283 }, "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_2", + "position": { + "x": 572.8941615312035, + "y": 937.8425220917356 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_2", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_2-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_2-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_2-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 572.8941615312035, + "y": 937.8425220917356 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_1", + "position": { + "x": 828.7788305309582, + "y": 302.8996144964516 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_1", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_1-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_1-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_1-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 828.7788305309582, + "y": 302.8996144964516 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_3", + "position": { + "x": 1148.338912314111, + "y": 1561.0888070167944 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_3", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_3-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_3-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_3-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_3-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_3-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_3-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_3-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_3-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_3-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_3-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1148.338912314111, + "y": 1561.0888070167944 + }, + "dragging": false + }, + { + "width": 300, + "height": 383, + "id": "conversationalAgent_0", + "position": { + "x": 2114.071431691489, + "y": 941.7926368551367 + }, + "type": "customNode", + "data": { + "id": "conversationalAgent_0", + "label": "Conversational Agent", + "name": "conversationalAgent", + "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": ["{{chainTool_0.data.instance}}", "{{chainTool_1.data.instance}}"], + "model": "{{chatOpenAI_3.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, + "dragging": false, + "positionAbsolute": { + "x": 2114.071431691489, + "y": 941.7926368551367 + } } ], "edges": [ @@ -928,50 +925,6 @@ "label": "" } }, - { - "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "target": "conversationalAgent_0", - "targetHandle": "conversationalAgent_0-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-conversationalAgent_0-conversationalAgent_0-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, - { - "source": "bufferMemory_0", - "sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", - "target": "conversationalAgent_0", - "targetHandle": "conversationalAgent_0-input-memory-BaseChatMemory", - "type": "buttonedge", - "id": "bufferMemory_0-bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory-conversationalAgent_0-conversationalAgent_0-input-memory-BaseChatMemory", - "data": { - "label": "" - } - }, - { - "source": "chatOpenAI_1", - "sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "target": "getApiChain_0", - "targetHandle": "getApiChain_0-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "chatOpenAI_1-chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-getApiChain_0-getApiChain_0-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, - { - "source": "chatOpenAI_2", - "sourceHandle": "chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "target": "postApiChain_0", - "targetHandle": "postApiChain_0-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "chatOpenAI_2-chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-postApiChain_0-postApiChain_0-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, { "source": "postApiChain_0", "sourceHandle": "postApiChain_0-output-postApiChain-POSTApiChain|BaseChain|BaseLangChain", @@ -983,6 +936,28 @@ "label": "" } }, + { + "source": "chatOpenAI_2", + "sourceHandle": "chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "postApiChain_0", + "targetHandle": "postApiChain_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "chatOpenAI_2-chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-postApiChain_0-postApiChain_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, + { + "source": "chatOpenAI_1", + "sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "getApiChain_0", + "targetHandle": "getApiChain_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "chatOpenAI_1-chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-getApiChain_0-getApiChain_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, { "source": "chainTool_0", "sourceHandle": "chainTool_0-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool|BaseLangChain", @@ -1004,6 +979,28 @@ "data": { "label": "" } + }, + { + "source": "chatOpenAI_3", + "sourceHandle": "chatOpenAI_3-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "conversationalAgent_0", + "targetHandle": "conversationalAgent_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "chatOpenAI_3-chatOpenAI_3-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, + { + "source": "bufferMemory_0", + "sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", + "target": "conversationalAgent_0", + "targetHandle": "conversationalAgent_0-input-memory-BaseChatMemory", + "type": "buttonedge", + "id": "bufferMemory_0-bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory-conversationalAgent_0-conversationalAgent_0-input-memory-BaseChatMemory", + "data": { + "label": "" + } } ] } diff --git a/packages/server/marketplaces/chatflows/API Agent 2.json b/packages/server/marketplaces/chatflows/API Agent 2.json new file mode 100644 index 00000000..cb5b3d14 --- /dev/null +++ b/packages/server/marketplaces/chatflows/API Agent 2.json @@ -0,0 +1,644 @@ +{ + "description": "Use OpenAI Function Agent to automatically decide which API to call, generating url and body request from conversation", + "nodes": [ + { + "width": 300, + "height": 510, + "id": "openApiChain_1", + "position": { + "x": 1203.1825726424859, + "y": 300.7226683414998 + }, + "type": "customNode", + "data": { + "id": "openApiChain_1", + "label": "OpenAPI Chain", + "name": "openApiChain", + "type": "openApiChain", + "baseClasses": ["openApiChain", "BaseChain"], + "category": "Chains", + "description": "Chain that automatically select and call APIs based only on an OpenAPI spec", + "inputParams": [ + { + "label": "YAML Link", + "name": "yamlLink", + "type": "string", + "placeholder": "https://api.speak.com/openapi.yaml", + "description": "If YAML link is provided, uploaded YAML File will be ignored and YAML link will be used instead", + "id": "openApiChain_1-input-yamlLink-string" + }, + { + "label": "YAML File", + "name": "yamlFile", + "type": "file", + "fileType": ".yaml", + "description": "If YAML link is provided, uploaded YAML File will be ignored and YAML link will be used instead", + "id": "openApiChain_1-input-yamlFile-file" + }, + { + "label": "Headers", + "name": "headers", + "type": "json", + "additionalParams": true, + "optional": true, + "id": "openApiChain_1-input-headers-json" + } + ], + "inputAnchors": [ + { + "label": "ChatOpenAI Model", + "name": "model", + "type": "ChatOpenAI", + "id": "openApiChain_1-input-model-ChatOpenAI" + } + ], + "inputs": { + "model": "{{chatOpenAI_1.data.instance}}", + "yamlLink": "https://gist.githubusercontent.com/roaldnefs/053e505b2b7a807290908fe9aa3e1f00/raw/0a212622ebfef501163f91e23803552411ed00e4/openapi.yaml", + "headers": "" + }, + "outputAnchors": [ + { + "id": "openApiChain_1-output-openApiChain-openApiChain|BaseChain", + "name": "openApiChain", + "label": "openApiChain", + "type": "openApiChain | BaseChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1203.1825726424859, + "y": 300.7226683414998 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_1", + "position": { + "x": 792.3201947594027, + "y": 293.61889966751846 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_1", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_1-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_1-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_1-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_1-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 792.3201947594027, + "y": 293.61889966751846 + }, + "dragging": false + }, + { + "width": 300, + "height": 602, + "id": "chainTool_0", + "position": { + "x": 1635.3466862861876, + "y": 272.3189405402944 + }, + "type": "customNode", + "data": { + "id": "chainTool_0", + "label": "Chain Tool", + "name": "chainTool", + "type": "ChainTool", + "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool"], + "category": "Tools", + "description": "Use a chain as allowed tool for agent", + "inputParams": [ + { + "label": "Chain Name", + "name": "name", + "type": "string", + "placeholder": "state-of-union-qa", + "id": "chainTool_0-input-name-string" + }, + { + "label": "Chain Description", + "name": "description", + "type": "string", + "rows": 3, + "placeholder": "State of the Union QA - useful for when you need to ask questions about the most recent state of the union address.", + "id": "chainTool_0-input-description-string" + }, + { + "label": "Return Direct", + "name": "returnDirect", + "type": "boolean", + "optional": true, + "id": "chainTool_0-input-returnDirect-boolean" + } + ], + "inputAnchors": [ + { + "label": "Base Chain", + "name": "baseChain", + "type": "BaseChain", + "id": "chainTool_0-input-baseChain-BaseChain" + } + ], + "inputs": { + "name": "comic-qa", + "description": "useful for when you need to ask question about comic", + "returnDirect": "", + "baseChain": "{{openApiChain_1.data.instance}}" + }, + "outputAnchors": [ + { + "id": "chainTool_0-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool", + "name": "chainTool", + "label": "ChainTool", + "type": "ChainTool | DynamicTool | Tool | StructuredTool" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1635.3466862861876, + "y": 272.3189405402944 + }, + "dragging": false + }, + { + "width": 300, + "height": 383, + "id": "openAIFunctionAgent_0", + "position": { + "x": 2076.1829525256576, + "y": 706.1299276365058 + }, + "type": "customNode", + "data": { + "id": "openAIFunctionAgent_0", + "label": "OpenAI Function Agent", + "name": "openAIFunctionAgent", + "type": "AgentExecutor", + "baseClasses": ["AgentExecutor", "BaseChain"], + "category": "Agents", + "description": "An agent that uses OpenAI's Function Calling functionality to pick the tool and args to call", + "inputParams": [ + { + "label": "System Message", + "name": "systemMessage", + "type": "string", + "rows": 4, + "optional": true, + "additionalParams": true, + "id": "openAIFunctionAgent_0-input-systemMessage-string" + } + ], + "inputAnchors": [ + { + "label": "Allowed Tools", + "name": "tools", + "type": "Tool", + "list": true, + "id": "openAIFunctionAgent_0-input-tools-Tool" + }, + { + "label": "Memory", + "name": "memory", + "type": "BaseChatMemory", + "id": "openAIFunctionAgent_0-input-memory-BaseChatMemory" + }, + { + "label": "OpenAI Chat Model", + "name": "model", + "description": "Only works with gpt-3.5-turbo-0613 and gpt-4-0613. Refer docs for more info", + "type": "BaseChatModel", + "id": "openAIFunctionAgent_0-input-model-BaseChatModel" + } + ], + "inputs": { + "tools": ["{{chainTool_0.data.instance}}"], + "memory": "{{bufferMemory_0.data.instance}}", + "model": "{{chatOpenAI_2.data.instance}}", + "systemMessage": "" + }, + "outputAnchors": [ + { + "id": "openAIFunctionAgent_0-output-openAIFunctionAgent-AgentExecutor|BaseChain", + "name": "openAIFunctionAgent", + "label": "AgentExecutor", + "type": "AgentExecutor | BaseChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 2076.1829525256576, + "y": 706.1299276365058 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_2", + "position": { + "x": 1645.450699499575, + "y": 992.6341744217375 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_2", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_2-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_2-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_2-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_2-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_2-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1645.450699499575, + "y": 992.6341744217375 + }, + "dragging": false + }, + { + "width": 300, + "height": 376, + "id": "bufferMemory_0", + "position": { + "x": 1148.8461056155377, + "y": 967.8215757228843 + }, + "type": "customNode", + "data": { + "id": "bufferMemory_0", + "label": "Buffer Memory", + "name": "bufferMemory", + "type": "BufferMemory", + "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], + "category": "Memory", + "description": "Remembers previous conversational back and forths directly", + "inputParams": [ + { + "label": "Memory Key", + "name": "memoryKey", + "type": "string", + "default": "chat_history", + "id": "bufferMemory_0-input-memoryKey-string" + }, + { + "label": "Input Key", + "name": "inputKey", + "type": "string", + "default": "input", + "id": "bufferMemory_0-input-inputKey-string" + } + ], + "inputAnchors": [], + "inputs": { + "memoryKey": "chat_history", + "inputKey": "input" + }, + "outputAnchors": [ + { + "id": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", + "name": "bufferMemory", + "label": "BufferMemory", + "type": "BufferMemory | BaseChatMemory | BaseMemory" + } + ], + "outputs": {}, + "selected": false + }, + "positionAbsolute": { + "x": 1148.8461056155377, + "y": 967.8215757228843 + }, + "selected": false + } + ], + "edges": [ + { + "source": "chatOpenAI_1", + "sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "openApiChain_1", + "targetHandle": "openApiChain_1-input-model-ChatOpenAI", + "type": "buttonedge", + "id": "chatOpenAI_1-chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-openApiChain_1-openApiChain_1-input-model-ChatOpenAI", + "data": { + "label": "" + } + }, + { + "source": "openApiChain_1", + "sourceHandle": "openApiChain_1-output-openApiChain-openApiChain|BaseChain", + "target": "chainTool_0", + "targetHandle": "chainTool_0-input-baseChain-BaseChain", + "type": "buttonedge", + "id": "openApiChain_1-openApiChain_1-output-openApiChain-openApiChain|BaseChain-chainTool_0-chainTool_0-input-baseChain-BaseChain", + "data": { + "label": "" + } + }, + { + "source": "chainTool_0", + "sourceHandle": "chainTool_0-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool", + "target": "openAIFunctionAgent_0", + "targetHandle": "openAIFunctionAgent_0-input-tools-Tool", + "type": "buttonedge", + "id": "chainTool_0-chainTool_0-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool-openAIFunctionAgent_0-openAIFunctionAgent_0-input-tools-Tool", + "data": { + "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", + "sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", + "target": "openAIFunctionAgent_0", + "targetHandle": "openAIFunctionAgent_0-input-memory-BaseChatMemory", + "type": "buttonedge", + "id": "bufferMemory_0-bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory-openAIFunctionAgent_0-openAIFunctionAgent_0-input-memory-BaseChatMemory", + "data": { + "label": "" + } + } + ] +} diff --git a/packages/server/marketplaces/chatflows/Antonym.json b/packages/server/marketplaces/chatflows/Antonym.json index 817e3ee9..a2801d24 100644 --- a/packages/server/marketplaces/chatflows/Antonym.json +++ b/packages/server/marketplaces/chatflows/Antonym.json @@ -102,239 +102,6 @@ }, "dragging": false }, - { - "width": 300, - "height": 524, - "id": "openAI_1", - "position": { - "x": 1224.5139327142097, - "y": -30.864315286062364 - }, - "type": "customNode", - "data": { - "id": "openAI_1", - "label": "OpenAI", - "name": "openAI", - "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], - "category": "LLMs", - "description": "Wrapper around OpenAI large language models", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "text-davinci-003", - "name": "text-davinci-003" - }, - { - "label": "text-davinci-002", - "name": "text-davinci-002" - }, - { - "label": "text-curie-001", - "name": "text-curie-001" - }, - { - "label": "text-babbage-001", - "name": "text-babbage-001" - } - ], - "default": "text-davinci-003", - "optional": true, - "id": "openAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.7, - "optional": true, - "id": "openAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-topP-number" - }, - { - "label": "Best Of", - "name": "bestOf", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-bestOf-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-presencePenalty-number" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "text-davinci-003", - "temperature": 0.7, - "maxTokens": "", - "topP": "", - "bestOf": "", - "frequencyPenalty": "", - "presencePenalty": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "name": "openAI", - "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1224.5139327142097, - "y": -30.864315286062364 - }, - "dragging": false - }, - { - "width": 300, - "height": 405, - "id": "llmChain_1", - "position": { - "x": 1635.363191180743, - "y": 450.00105475193766 - }, - "type": "customNode", - "data": { - "id": "llmChain_1", - "label": "LLM Chain", - "name": "llmChain", - "type": "LLMChain", - "baseClasses": ["LLMChain", "BaseChain", "BaseLangChain"], - "category": "Chains", - "description": "Chain to run queries against LLMs", - "inputParams": [ - { - "label": "Chain Name", - "name": "chainName", - "type": "string", - "placeholder": "Name Your Chain", - "optional": true, - "id": "llmChain_1-input-chainName-string" - } - ], - "inputAnchors": [ - { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "llmChain_1-input-model-BaseLanguageModel" - }, - { - "label": "Prompt", - "name": "prompt", - "type": "BasePromptTemplate", - "id": "llmChain_1-input-prompt-BasePromptTemplate" - } - ], - "inputs": { - "model": "{{openAI_1.data.instance}}", - "prompt": "{{fewShotPromptTemplate_1.data.instance}}", - "chainName": "" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "llmChain_1-output-llmChain-LLMChain|BaseChain|BaseLangChain", - "name": "llmChain", - "label": "LLM Chain", - "type": "LLMChain | BaseChain | BaseLangChain" - }, - { - "id": "llmChain_1-output-outputPrediction-string|json", - "name": "outputPrediction", - "label": "Output Prediction", - "type": "string | json" - } - ], - "default": "llmChain" - } - ], - "outputs": { - "output": "llmChain" - }, - "selected": false - }, - "positionAbsolute": { - "x": 1635.363191180743, - "y": 450.00105475193766 - }, - "selected": false, - "dragging": false - }, { "width": 300, "height": 475, @@ -393,31 +160,242 @@ "y": -33.31673494170347 }, "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 1226.7977900193628, + "y": 48.01100655894436 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1226.7977900193628, + "y": 48.01100655894436 + }, + "dragging": false + }, + { + "width": 300, + "height": 405, + "id": "llmChain_0", + "position": { + "x": 1573.7490072386481, + "y": 429.1905949837192 + }, + "type": "customNode", + "data": { + "id": "llmChain_0", + "label": "LLM Chain", + "name": "llmChain", + "type": "LLMChain", + "baseClasses": ["LLMChain", "BaseChain"], + "category": "Chains", + "description": "Chain to run queries against LLMs", + "inputParams": [ + { + "label": "Chain Name", + "name": "chainName", + "type": "string", + "placeholder": "Name Your Chain", + "optional": true, + "id": "llmChain_0-input-chainName-string" + } + ], + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "llmChain_0-input-model-BaseLanguageModel" + }, + { + "label": "Prompt", + "name": "prompt", + "type": "BasePromptTemplate", + "id": "llmChain_0-input-prompt-BasePromptTemplate" + } + ], + "inputs": { + "model": "{{chatOpenAI_0.data.instance}}", + "prompt": "{{fewShotPromptTemplate_1.data.instance}}", + "chainName": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "llmChain_0-output-llmChain-LLMChain|BaseChain", + "name": "llmChain", + "label": "LLM Chain", + "type": "LLMChain | BaseChain" + }, + { + "id": "llmChain_0-output-outputPrediction-string|json", + "name": "outputPrediction", + "label": "Output Prediction", + "type": "string | json" + } + ], + "default": "llmChain" + } + ], + "outputs": { + "output": "llmChain" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1573.7490072386481, + "y": 429.1905949837192 + }, + "dragging": false } ], "edges": [ - { - "source": "openAI_1", - "sourceHandle": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "target": "llmChain_1", - "targetHandle": "llmChain_1-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "openAI_1-openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-llmChain_1-llmChain_1-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, - { - "source": "fewShotPromptTemplate_1", - "sourceHandle": "fewShotPromptTemplate_1-output-fewShotPromptTemplate-FewShotPromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", - "target": "llmChain_1", - "targetHandle": "llmChain_1-input-prompt-BasePromptTemplate", - "type": "buttonedge", - "id": "fewShotPromptTemplate_1-fewShotPromptTemplate_1-output-fewShotPromptTemplate-FewShotPromptTemplate|BaseStringPromptTemplate|BasePromptTemplate-llmChain_1-llmChain_1-input-prompt-BasePromptTemplate", - "data": { - "label": "" - } - }, { "source": "promptTemplate_0", "sourceHandle": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", @@ -428,6 +406,28 @@ "data": { "label": "" } + }, + { + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "llmChain_0", + "targetHandle": "llmChain_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-llmChain_0-llmChain_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, + { + "source": "fewShotPromptTemplate_1", + "sourceHandle": "fewShotPromptTemplate_1-output-fewShotPromptTemplate-FewShotPromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", + "target": "llmChain_0", + "targetHandle": "llmChain_0-input-prompt-BasePromptTemplate", + "type": "buttonedge", + "id": "fewShotPromptTemplate_1-fewShotPromptTemplate_1-output-fewShotPromptTemplate-FewShotPromptTemplate|BaseStringPromptTemplate|BasePromptTemplate-llmChain_0-llmChain_0-input-prompt-BasePromptTemplate", + "data": { + "label": "" + } } ] } diff --git a/packages/server/marketplaces/chatflows/AutoGPT.json b/packages/server/marketplaces/chatflows/AutoGPT.json index 47926272..b9cfe330 100644 --- a/packages/server/marketplaces/chatflows/AutoGPT.json +++ b/packages/server/marketplaces/chatflows/AutoGPT.json @@ -3,7 +3,7 @@ "nodes": [ { "width": 300, - "height": 629, + "height": 627, "id": "autoGPT_0", "position": { "x": 1627.8124366169843, @@ -67,8 +67,8 @@ ], "inputs": { "tools": ["{{readFile_0.data.instance}}", "{{writeFile_1.data.instance}}", "{{serpAPI_0.data.instance}}"], - "model": "{{chatOpenAI_1.data.instance}}", - "vectorStoreRetriever": "{{pineconeExistingIndex_1.data.instance}}", + "model": "{{chatOpenAI_0.data.instance}}", + "vectorStoreRetriever": "{{pineconeExistingIndex_0.data.instance}}", "aiName": "", "aiRole": "", "maxLoop": 5 @@ -93,162 +93,11 @@ }, { "width": 300, - "height": 526, - "id": "chatOpenAI_1", - "position": { - "x": 168.57515834535457, - "y": -90.74139976987627 - }, - "type": "customNode", - "data": { - "id": "chatOpenAI_1", - "label": "ChatOpenAI", - "name": "chatOpenAI", - "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], - "category": "Chat Models", - "description": "Wrapper around OpenAI large language models that use the Chat endpoint", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "gpt-4", - "name": "gpt-4" - }, - { - "label": "gpt-4-0613", - "name": "gpt-4-0613" - }, - { - "label": "gpt-4-32k", - "name": "gpt-4-32k" - }, - { - "label": "gpt-4-32k-0613", - "name": "gpt-4-32k-0613" - }, - { - "label": "gpt-3.5-turbo", - "name": "gpt-3.5-turbo" - }, - { - "label": "gpt-3.5-turbo-0613", - "name": "gpt-3.5-turbo-0613" - }, - { - "label": "gpt-3.5-turbo-16k", - "name": "gpt-3.5-turbo-16k" - }, - { - "label": "gpt-3.5-turbo-16k-0613", - "name": "gpt-3.5-turbo-16k-0613" - } - ], - "default": "gpt-3.5-turbo", - "optional": true, - "id": "chatOpenAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.9, - "optional": true, - "id": "chatOpenAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-topP-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-presencePenalty-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "gpt-3.5-turbo", - "temperature": "0", - "maxTokens": "", - "topP": "", - "frequencyPenalty": "", - "presencePenalty": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "name": "chatOpenAI", - "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 168.57515834535457, - "y": -90.74139976987627 - }, - "dragging": false - }, - { - "width": 300, - "height": 279, + "height": 278, "id": "writeFile_1", "position": { - "x": 546.3440710182241, - "y": 55.28691941459434 + "x": 539.4976647298655, + "y": 36.45930212160803 }, "type": "customNode", "data": { @@ -285,15 +134,15 @@ "selected": false }, "positionAbsolute": { - "x": 546.3440710182241, - "y": 55.28691941459434 + "x": 539.4976647298655, + "y": 36.45930212160803 }, "selected": false, "dragging": false }, { "width": 300, - "height": 279, + "height": 278, "id": "readFile_0", "position": { "x": 881.2568465391292, @@ -342,11 +191,11 @@ }, { "width": 300, - "height": 279, + "height": 277, "id": "serpAPI_0", "position": { - "x": 1244.740380161344, - "y": -193.9135818023827 + "x": 1247.066832724479, + "y": -193.77467220135756 }, "type": "customNode", "data": { @@ -354,25 +203,26 @@ "label": "Serp API", "name": "serpAPI", "type": "SerpAPI", - "baseClasses": ["SerpAPI", "Tool", "StructuredTool", "BaseLangChain"], + "baseClasses": ["SerpAPI", "Tool", "StructuredTool"], "category": "Tools", "description": "Wrapper around SerpAPI - a real-time API to access Google search results", "inputParams": [ { - "label": "Serp Api Key", - "name": "apiKey", - "type": "password", - "id": "serpAPI_0-input-apiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["serpApi"], + "id": "serpAPI_0-input-credential-credential" } ], "inputAnchors": [], "inputs": {}, "outputAnchors": [ { - "id": "serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain", + "id": "serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool", "name": "serpAPI", "label": "SerpAPI", - "type": "SerpAPI | Tool | StructuredTool | BaseLangChain" + "type": "SerpAPI | Tool | StructuredTool" } ], "outputs": {}, @@ -380,18 +230,171 @@ }, "selected": false, "positionAbsolute": { - "x": 1244.740380161344, - "y": -193.9135818023827 + "x": 1247.066832724479, + "y": -193.77467220135756 }, "dragging": false }, { "width": 300, - "height": 331, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 176.69787776192283, + "y": -116.3808686218022 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 176.69787776192283, + "y": -116.3808686218022 + }, + "dragging": false + }, + { + "width": 300, + "height": 329, "id": "openAIEmbeddings_0", "position": { - "x": 530.4714276286077, - "y": 487.0228196121594 + "x": 606.7317612889267, + "y": 439.5269912996025 }, "type": "customNode", "data": { @@ -404,10 +407,11 @@ "description": "OpenAI API to generate embeddings for a given text", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_0-input-credential-credential" }, { "label": "Strip New Lines", @@ -446,7 +450,8 @@ "inputs": { "stripNewLines": "", "batchSize": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { @@ -459,24 +464,24 @@ "outputs": {}, "selected": false }, - "positionAbsolute": { - "x": 530.4714276286077, - "y": 487.0228196121594 - }, "selected": false, + "positionAbsolute": { + "x": 606.7317612889267, + "y": 439.5269912996025 + }, "dragging": false }, { "width": 300, - "height": 652, - "id": "pineconeExistingIndex_1", + "height": 505, + "id": "pineconeExistingIndex_0", "position": { - "x": 943.1601557586332, - "y": 404.9622062733608 + "x": 1001.3784758268554, + "y": 415.24072209485803 }, "type": "customNode", "data": { - "id": "pineconeExistingIndex_1", + "id": "pineconeExistingIndex_0", "label": "Pinecone Load Existing Index", "name": "pineconeExistingIndex", "type": "Pinecone", @@ -485,31 +490,26 @@ "description": "Load existing index from Pinecone (i.e: Document has been upserted)", "inputParams": [ { - "label": "Pinecone Api Key", - "name": "pineconeApiKey", - "type": "password", - "id": "pineconeExistingIndex_1-input-pineconeApiKey-password" - }, - { - "label": "Pinecone Environment", - "name": "pineconeEnv", - "type": "string", - "id": "pineconeExistingIndex_1-input-pineconeEnv-string" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["pineconeApi"], + "id": "pineconeExistingIndex_0-input-credential-credential" }, { "label": "Pinecone Index", "name": "pineconeIndex", "type": "string", - "id": "pineconeExistingIndex_1-input-pineconeIndex-string" + "id": "pineconeExistingIndex_0-input-pineconeIndex-string" }, { "label": "Pinecone Namespace", "name": "pineconeNamespace", "type": "string", "placeholder": "my-first-namespace", - "optional": true, "additionalParams": true, - "id": "pineconeExistingIndex_1-input-pineconeNamespace-string" + "optional": true, + "id": "pineconeExistingIndex_0-input-pineconeNamespace-string" }, { "label": "Pinecone Metadata Filter", @@ -517,7 +517,7 @@ "type": "json", "optional": true, "additionalParams": true, - "id": "pineconeExistingIndex_1-input-pineconeMetadataFilter-json" + "id": "pineconeExistingIndex_0-input-pineconeMetadataFilter-json" }, { "label": "Top K", @@ -527,7 +527,7 @@ "type": "number", "additionalParams": true, "optional": true, - "id": "pineconeExistingIndex_1-input-topK-number" + "id": "pineconeExistingIndex_0-input-topK-number" } ], "inputAnchors": [ @@ -535,14 +535,15 @@ "label": "Embeddings", "name": "embeddings", "type": "Embeddings", - "id": "pineconeExistingIndex_1-input-embeddings-Embeddings" + "id": "pineconeExistingIndex_0-input-embeddings-Embeddings" } ], "inputs": { "embeddings": "{{openAIEmbeddings_0.data.instance}}", - "pineconeEnv": "us-west4-gcp", "pineconeIndex": "", - "pineconeNamespace": "" + "pineconeNamespace": "", + "pineconeMetadataFilter": "", + "topK": "" }, "outputAnchors": [ { @@ -551,13 +552,13 @@ "type": "options", "options": [ { - "id": "pineconeExistingIndex_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "id": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", "name": "retriever", "label": "Pinecone Retriever", "type": "Pinecone | VectorStoreRetriever | BaseRetriever" }, { - "id": "pineconeExistingIndex_1-output-vectorStore-Pinecone|VectorStore", + "id": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", "name": "vectorStore", "label": "Pinecone Vector Store", "type": "Pinecone | VectorStore" @@ -572,47 +573,14 @@ "selected": false }, "selected": false, + "dragging": false, "positionAbsolute": { - "x": 943.1601557586332, - "y": 404.9622062733608 - }, - "dragging": false + "x": 1001.3784758268554, + "y": 415.24072209485803 + } } ], "edges": [ - { - "source": "pineconeExistingIndex_1", - "sourceHandle": "pineconeExistingIndex_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "target": "autoGPT_0", - "targetHandle": "autoGPT_0-input-vectorStoreRetriever-BaseRetriever", - "type": "buttonedge", - "id": "pineconeExistingIndex_1-pineconeExistingIndex_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever-autoGPT_0-autoGPT_0-input-vectorStoreRetriever-BaseRetriever", - "data": { - "label": "" - } - }, - { - "source": "openAIEmbeddings_0", - "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "target": "pineconeExistingIndex_1", - "targetHandle": "pineconeExistingIndex_1-input-embeddings-Embeddings", - "type": "buttonedge", - "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_1-pineconeExistingIndex_1-input-embeddings-Embeddings", - "data": { - "label": "" - } - }, - { - "source": "chatOpenAI_1", - "sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "target": "autoGPT_0", - "targetHandle": "autoGPT_0-input-model-BaseChatModel", - "type": "buttonedge", - "id": "chatOpenAI_1-chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-autoGPT_0-autoGPT_0-input-model-BaseChatModel", - "data": { - "label": "" - } - }, { "source": "writeFile_1", "sourceHandle": "writeFile_1-output-writeFile-WriteFile|Tool|StructuredTool|BaseLangChain", @@ -635,13 +603,46 @@ "label": "" } }, + { + "source": "pineconeExistingIndex_0", + "sourceHandle": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "target": "autoGPT_0", + "targetHandle": "autoGPT_0-input-vectorStoreRetriever-BaseRetriever", + "type": "buttonedge", + "id": "pineconeExistingIndex_0-pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever-autoGPT_0-autoGPT_0-input-vectorStoreRetriever-BaseRetriever", + "data": { + "label": "" + } + }, + { + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "pineconeExistingIndex_0", + "targetHandle": "pineconeExistingIndex_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_0-pineconeExistingIndex_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, + { + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "autoGPT_0", + "targetHandle": "autoGPT_0-input-model-BaseChatModel", + "type": "buttonedge", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-autoGPT_0-autoGPT_0-input-model-BaseChatModel", + "data": { + "label": "" + } + }, { "source": "serpAPI_0", - "sourceHandle": "serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain", + "sourceHandle": "serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool", "target": "autoGPT_0", "targetHandle": "autoGPT_0-input-tools-Tool", "type": "buttonedge", - "id": "serpAPI_0-serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain-autoGPT_0-autoGPT_0-input-tools-Tool", + "id": "serpAPI_0-serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool-autoGPT_0-autoGPT_0-input-tools-Tool", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/BabyAGI.json b/packages/server/marketplaces/chatflows/BabyAGI.json index 572d73f1..9c0f380c 100644 --- a/packages/server/marketplaces/chatflows/BabyAGI.json +++ b/packages/server/marketplaces/chatflows/BabyAGI.json @@ -3,220 +3,91 @@ "nodes": [ { "width": 300, - "height": 331, - "id": "openAIEmbeddings_1", + "height": 379, + "id": "babyAGI_1", "position": { - "x": -84.60344342694289, - "y": -189.6930708050951 + "x": 950.8042093214954, + "y": 66.00028106865324 }, "type": "customNode", "data": { - "id": "openAIEmbeddings_1", - "label": "OpenAI Embeddings", - "name": "openAIEmbeddings", - "type": "OpenAIEmbeddings", - "baseClasses": ["OpenAIEmbeddings", "Embeddings"], - "category": "Embeddings", - "description": "OpenAI API to generate embeddings for a given text", + "id": "babyAGI_1", + "label": "BabyAGI", + "name": "babyAGI", + "type": "BabyAGI", + "baseClasses": ["BabyAGI"], + "category": "Agents", + "description": "Task Driven Autonomous Agent which creates new task and reprioritizes task list based on objective", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_1-input-openAIApiKey-password" - }, - { - "label": "Strip New Lines", - "name": "stripNewLines", - "type": "boolean", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-stripNewLines-boolean" - }, - { - "label": "Batch Size", - "name": "batchSize", + "label": "Task Loop", + "name": "taskLoop", "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-basepath-string" + "default": 3, + "id": "babyAGI_1-input-taskLoop-number" + } + ], + "inputAnchors": [ + { + "label": "Chat Model", + "name": "model", + "type": "BaseChatModel", + "id": "babyAGI_1-input-model-BaseChatModel" + }, + { + "label": "Vector Store", + "name": "vectorStore", + "type": "VectorStore", + "id": "babyAGI_1-input-vectorStore-VectorStore" } ], - "inputAnchors": [], "inputs": { - "stripNewLines": "", - "batchSize": "", - "timeout": "" + "model": "{{chatOpenAI_0.data.instance}}", + "vectorStore": "{{pineconeExistingIndex_0.data.instance}}", + "taskLoop": 3 }, "outputAnchors": [ { - "id": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "name": "openAIEmbeddings", - "label": "OpenAIEmbeddings", - "type": "OpenAIEmbeddings | Embeddings" + "id": "babyAGI_1-output-babyAGI-BabyAGI", + "name": "babyAGI", + "label": "BabyAGI", + "type": "BabyAGI" } ], "outputs": {}, "selected": false }, - "positionAbsolute": { - "x": -84.60344342694289, - "y": -189.6930708050951 - }, "selected": false, - "dragging": false + "dragging": false, + "positionAbsolute": { + "x": 950.8042093214954, + "y": 66.00028106865324 + } }, { "width": 300, - "height": 652, - "id": "pineconeExistingIndex_1", + "height": 523, + "id": "chatOpenAI_0", "position": { - "x": 264.729293346415, - "y": -190.36689763560724 + "x": 587.1798180512677, + "y": -355.9845878719703 }, "type": "customNode", "data": { - "id": "pineconeExistingIndex_1", - "label": "Pinecone Load Existing Index", - "name": "pineconeExistingIndex", - "type": "Pinecone", - "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Load existing index from Pinecone (i.e: Document has been upserted)", - "inputParams": [ - { - "label": "Pinecone Api Key", - "name": "pineconeApiKey", - "type": "password", - "id": "pineconeExistingIndex_1-input-pineconeApiKey-password" - }, - { - "label": "Pinecone Environment", - "name": "pineconeEnv", - "type": "string", - "id": "pineconeExistingIndex_1-input-pineconeEnv-string" - }, - { - "label": "Pinecone Index", - "name": "pineconeIndex", - "type": "string", - "id": "pineconeExistingIndex_1-input-pineconeIndex-string" - }, - { - "label": "Pinecone Namespace", - "name": "pineconeNamespace", - "type": "string", - "placeholder": "my-first-namespace", - "optional": true, - "additionalParams": true, - "id": "pineconeExistingIndex_1-input-pineconeNamespace-string" - }, - { - "label": "Pinecone Metadata Filter", - "name": "pineconeMetadataFilter", - "type": "json", - "optional": true, - "additionalParams": true, - "id": "pineconeExistingIndex_1-input-pineconeMetadataFilter-json" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", - "additionalParams": true, - "optional": true, - "id": "pineconeExistingIndex_1-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "pineconeExistingIndex_1-input-embeddings-Embeddings" - } - ], - "inputs": { - "embeddings": "{{openAIEmbeddings_1.data.instance}}", - "pineconeEnv": "us-west4-gcp", - "pineconeIndex": "", - "pineconeNamespace": "" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "pineconeExistingIndex_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Pinecone Retriever", - "type": "Pinecone | VectorStoreRetriever | BaseRetriever" - }, - { - "id": "pineconeExistingIndex_1-output-vectorStore-Pinecone|VectorStore", - "name": "vectorStore", - "label": "Pinecone Vector Store", - "type": "Pinecone | VectorStore" - } - ], - "default": "retriever" - } - ], - "outputs": { - "output": "vectorStore" - }, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 264.729293346415, - "y": -190.36689763560724 - }, - "dragging": false - }, - { - "width": 300, - "height": 526, - "id": "chatOpenAI_1", - "position": { - "x": 590.3367401418911, - "y": -374.0329977259934 - }, - "type": "customNode", - "data": { - "id": "chatOpenAI_1", + "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_1-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" }, { "label": "Model Name", @@ -258,7 +129,7 @@ ], "default": "gpt-3.5-turbo", "optional": true, - "id": "chatOpenAI_1-input-modelName-options" + "id": "chatOpenAI_0-input-modelName-options" }, { "label": "Temperature", @@ -266,7 +137,7 @@ "type": "number", "default": 0.9, "optional": true, - "id": "chatOpenAI_1-input-temperature-number" + "id": "chatOpenAI_0-input-temperature-number" }, { "label": "Max Tokens", @@ -274,7 +145,7 @@ "type": "number", "optional": true, "additionalParams": true, - "id": "chatOpenAI_1-input-maxTokens-number" + "id": "chatOpenAI_0-input-maxTokens-number" }, { "label": "Top Probability", @@ -282,7 +153,7 @@ "type": "number", "optional": true, "additionalParams": true, - "id": "chatOpenAI_1-input-topP-number" + "id": "chatOpenAI_0-input-topP-number" }, { "label": "Frequency Penalty", @@ -290,7 +161,7 @@ "type": "number", "optional": true, "additionalParams": true, - "id": "chatOpenAI_1-input-frequencyPenalty-number" + "id": "chatOpenAI_0-input-frequencyPenalty-number" }, { "label": "Presence Penalty", @@ -298,7 +169,7 @@ "type": "number", "optional": true, "additionalParams": true, - "id": "chatOpenAI_1-input-presencePenalty-number" + "id": "chatOpenAI_0-input-presencePenalty-number" }, { "label": "Timeout", @@ -306,7 +177,7 @@ "type": "number", "optional": true, "additionalParams": true, - "id": "chatOpenAI_1-input-timeout-number" + "id": "chatOpenAI_0-input-timeout-number" }, { "label": "BasePath", @@ -314,131 +185,260 @@ "type": "string", "optional": true, "additionalParams": true, - "id": "chatOpenAI_1-input-basepath-string" + "id": "chatOpenAI_0-input-basepath-string" } ], "inputAnchors": [], "inputs": { "modelName": "gpt-3.5-turbo", - "temperature": "0", + "temperature": 0.9, "maxTokens": "", "topP": "", "frequencyPenalty": "", "presencePenalty": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "outputs": {}, "selected": false }, "selected": false, - "dragging": false, "positionAbsolute": { - "x": 590.3367401418911, - "y": -374.0329977259934 - } + "x": 587.1798180512677, + "y": -355.9845878719703 + }, + "dragging": false }, { "width": 300, - "height": 380, - "id": "babyAGI_1", + "height": 329, + "id": "openAIEmbeddings_0", "position": { - "x": 950.8042093214954, - "y": 66.00028106865324 + "x": -111.82510263637522, + "y": -224.88655030419665 }, "type": "customNode", "data": { - "id": "babyAGI_1", - "label": "BabyAGI", - "name": "babyAGI", - "type": "BabyAGI", - "baseClasses": ["BabyAGI"], - "category": "Agents", - "description": "Task Driven Autonomous Agent which creates new task and reprioritizes task list based on objective", + "id": "openAIEmbeddings_0", + "label": "OpenAI Embeddings", + "name": "openAIEmbeddings", + "type": "OpenAIEmbeddings", + "baseClasses": ["OpenAIEmbeddings", "Embeddings"], + "category": "Embeddings", + "description": "OpenAI API to generate embeddings for a given text", "inputParams": [ { - "label": "Task Loop", - "name": "taskLoop", + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_0-input-credential-credential" + }, + { + "label": "Strip New Lines", + "name": "stripNewLines", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-stripNewLines-boolean" + }, + { + "label": "Batch Size", + "name": "batchSize", "type": "number", - "default": 3, - "id": "babyAGI_1-input-taskLoop-number" + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "stripNewLines": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": -111.82510263637522, + "y": -224.88655030419665 + }, + "dragging": false + }, + { + "width": 300, + "height": 505, + "id": "pineconeExistingIndex_0", + "position": { + "x": 241.78764591331816, + "y": -38.438460915613945 + }, + "type": "customNode", + "data": { + "id": "pineconeExistingIndex_0", + "label": "Pinecone Load Existing Index", + "name": "pineconeExistingIndex", + "type": "Pinecone", + "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Pinecone (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["pineconeApi"], + "id": "pineconeExistingIndex_0-input-credential-credential" + }, + { + "label": "Pinecone Index", + "name": "pineconeIndex", + "type": "string", + "id": "pineconeExistingIndex_0-input-pineconeIndex-string" + }, + { + "label": "Pinecone Namespace", + "name": "pineconeNamespace", + "type": "string", + "placeholder": "my-first-namespace", + "additionalParams": true, + "optional": true, + "id": "pineconeExistingIndex_0-input-pineconeNamespace-string" + }, + { + "label": "Pinecone Metadata Filter", + "name": "pineconeMetadataFilter", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "pineconeExistingIndex_0-input-pineconeMetadataFilter-json" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "pineconeExistingIndex_0-input-topK-number" } ], "inputAnchors": [ { - "label": "Chat Model", - "name": "model", - "type": "BaseChatModel", - "id": "babyAGI_1-input-model-BaseChatModel" - }, - { - "label": "Vector Store", - "name": "vectorStore", - "type": "VectorStore", - "id": "babyAGI_1-input-vectorStore-VectorStore" + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "pineconeExistingIndex_0-input-embeddings-Embeddings" } ], "inputs": { - "model": "{{chatOpenAI_1.data.instance}}", - "vectorStore": "{{pineconeExistingIndex_1.data.instance}}", - "taskLoop": 3 + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "pineconeIndex": "newindex", + "pineconeNamespace": "", + "pineconeMetadataFilter": "", + "topK": "" }, "outputAnchors": [ { - "id": "babyAGI_1-output-babyAGI-BabyAGI", - "name": "babyAGI", - "label": "BabyAGI", - "type": "BabyAGI" + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Pinecone Retriever", + "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", + "name": "vectorStore", + "label": "Pinecone Vector Store", + "type": "Pinecone | VectorStore" + } + ], + "default": "retriever" } ], - "outputs": {}, + "outputs": { + "output": "vectorStore" + }, "selected": false }, "selected": false, - "dragging": false, "positionAbsolute": { - "x": 950.8042093214954, - "y": 66.00028106865324 - } + "x": 241.78764591331816, + "y": -38.438460915613945 + }, + "dragging": false } ], "edges": [ { - "source": "openAIEmbeddings_1", - "sourceHandle": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "target": "pineconeExistingIndex_1", - "targetHandle": "pineconeExistingIndex_1-input-embeddings-Embeddings", - "type": "buttonedge", - "id": "openAIEmbeddings_1-openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_1-pineconeExistingIndex_1-input-embeddings-Embeddings", - "data": { - "label": "" - } - }, - { - "source": "chatOpenAI_1", - "sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "target": "babyAGI_1", - "targetHandle": "babyAGI_1-input-model-BaseChatModel", - "type": "buttonedge", - "id": "chatOpenAI_1-chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-babyAGI_1-babyAGI_1-input-model-BaseChatModel", - "data": { - "label": "" - } - }, - { - "source": "pineconeExistingIndex_1", - "sourceHandle": "pineconeExistingIndex_1-output-vectorStore-Pinecone|VectorStore", + "source": "pineconeExistingIndex_0", + "sourceHandle": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", "target": "babyAGI_1", "targetHandle": "babyAGI_1-input-vectorStore-VectorStore", "type": "buttonedge", - "id": "pineconeExistingIndex_1-pineconeExistingIndex_1-output-vectorStore-Pinecone|VectorStore-babyAGI_1-babyAGI_1-input-vectorStore-VectorStore", + "id": "pineconeExistingIndex_0-pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore-babyAGI_1-babyAGI_1-input-vectorStore-VectorStore", + "data": { + "label": "" + } + }, + { + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "babyAGI_1", + "targetHandle": "babyAGI_1-input-model-BaseChatModel", + "type": "buttonedge", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-babyAGI_1-babyAGI_1-input-model-BaseChatModel", + "data": { + "label": "" + } + }, + { + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "pineconeExistingIndex_0", + "targetHandle": "pineconeExistingIndex_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_0-pineconeExistingIndex_0-input-embeddings-Embeddings", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/ChatGPTPlugin.json b/packages/server/marketplaces/chatflows/ChatGPTPlugin.json index 76964a09..eb05132c 100644 --- a/packages/server/marketplaces/chatflows/ChatGPTPlugin.json +++ b/packages/server/marketplaces/chatflows/ChatGPTPlugin.json @@ -201,66 +201,11 @@ }, { "width": 300, - "height": 280, - "id": "mrklAgentChat_0", - "position": { - "x": 1416.2054860029416, - "y": 451.43299014109715 - }, - "type": "customNode", - "data": { - "id": "mrklAgentChat_0", - "label": "MRKL Agent for Chat Models", - "name": "mrklAgentChat", - "type": "AgentExecutor", - "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], - "category": "Agents", - "description": "Agent that uses the ReAct Framework to decide what action to take, optimized to be used with Chat Models", - "inputParams": [], - "inputAnchors": [ - { - "label": "Allowed Tools", - "name": "tools", - "type": "Tool", - "list": true, - "id": "mrklAgentChat_0-input-tools-Tool" - }, - { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "mrklAgentChat_0-input-model-BaseLanguageModel" - } - ], - "inputs": { - "tools": ["{{requestsGet_0.data.instance}}", "{{requestsPost_0.data.instance}}", "{{aiPlugin_0.data.instance}}"], - "model": "{{chatOpenAI_0.data.instance}}" - }, - "outputAnchors": [ - { - "id": "mrklAgentChat_0-output-mrklAgentChat-AgentExecutor|BaseChain|BaseLangChain", - "name": "mrklAgentChat", - "label": "AgentExecutor", - "type": "AgentExecutor | BaseChain | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1416.2054860029416, - "y": 451.43299014109715 - }, - "dragging": false - }, - { - "width": 300, - "height": 524, + "height": 523, "id": "chatOpenAI_0", "position": { - "x": 797.0574814814245, - "y": 578.7641992971934 + "x": 802.0103755177098, + "y": 576.0760341170851 }, "type": "customNode", "data": { @@ -268,15 +213,16 @@ "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" }, { "label": "Model Name", @@ -385,14 +331,15 @@ "topP": "", "frequencyPenalty": "", "presencePenalty": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "outputs": {}, @@ -400,24 +347,68 @@ }, "selected": false, "positionAbsolute": { - "x": 797.0574814814245, - "y": 578.7641992971934 + "x": 802.0103755177098, + "y": 576.0760341170851 + }, + "dragging": false + }, + { + "width": 300, + "height": 280, + "id": "mrklAgentChat_0", + "position": { + "x": 1425.5853300862047, + "y": 441.06218012993924 + }, + "type": "customNode", + "data": { + "id": "mrklAgentChat_0", + "label": "MRKL Agent for Chat Models", + "name": "mrklAgentChat", + "type": "AgentExecutor", + "baseClasses": ["AgentExecutor", "BaseChain"], + "category": "Agents", + "description": "Agent that uses the ReAct Framework to decide what action to take, optimized to be used with Chat Models", + "inputParams": [], + "inputAnchors": [ + { + "label": "Allowed Tools", + "name": "tools", + "type": "Tool", + "list": true, + "id": "mrklAgentChat_0-input-tools-Tool" + }, + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "mrklAgentChat_0-input-model-BaseLanguageModel" + } + ], + "inputs": { + "tools": ["{{requestsGet_0.data.instance}}", "{{requestsPost_0.data.instance}}", "{{aiPlugin_0.data.instance}}"], + "model": "{{chatOpenAI_0.data.instance}}" + }, + "outputAnchors": [ + { + "id": "mrklAgentChat_0-output-mrklAgentChat-AgentExecutor|BaseChain", + "name": "mrklAgentChat", + "label": "AgentExecutor", + "type": "AgentExecutor | BaseChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1425.5853300862047, + "y": 441.06218012993924 }, "dragging": false } ], "edges": [ - { - "source": "requestsGet_0", - "sourceHandle": "requestsGet_0-output-requestsGet-RequestsGet|Tool|StructuredTool|BaseLangChain", - "target": "mrklAgentChat_0", - "targetHandle": "mrklAgentChat_0-input-tools-Tool", - "type": "buttonedge", - "id": "requestsGet_0-requestsGet_0-output-requestsGet-RequestsGet|Tool|StructuredTool|BaseLangChain-mrklAgentChat_0-mrklAgentChat_0-input-tools-Tool", - "data": { - "label": "" - } - }, { "source": "aiPlugin_0", "sourceHandle": "aiPlugin_0-output-aiPlugin-AIPlugin|Tool", @@ -429,6 +420,17 @@ "label": "" } }, + { + "source": "requestsGet_0", + "sourceHandle": "requestsGet_0-output-requestsGet-RequestsGet|Tool|StructuredTool|BaseLangChain", + "target": "mrklAgentChat_0", + "targetHandle": "mrklAgentChat_0-input-tools-Tool", + "type": "buttonedge", + "id": "requestsGet_0-requestsGet_0-output-requestsGet-RequestsGet|Tool|StructuredTool|BaseLangChain-mrklAgentChat_0-mrklAgentChat_0-input-tools-Tool", + "data": { + "label": "" + } + }, { "source": "requestsPost_0", "sourceHandle": "requestsPost_0-output-requestsPost-RequestsPost|Tool|StructuredTool|BaseLangChain", @@ -442,11 +444,11 @@ }, { "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "mrklAgentChat_0", "targetHandle": "mrklAgentChat_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-mrklAgentChat_0-mrklAgentChat_0-input-model-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-mrklAgentChat_0-mrklAgentChat_0-input-model-BaseLanguageModel", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/Claude LLM.json b/packages/server/marketplaces/chatflows/Claude LLM.json new file mode 100644 index 00000000..07304590 --- /dev/null +++ b/packages/server/marketplaces/chatflows/Claude LLM.json @@ -0,0 +1,412 @@ +{ + "description": "Use Anthropic Claude with 100k context window to ingest whole document for QnA", + "nodes": [ + { + "width": 300, + "height": 376, + "id": "bufferMemory_0", + "position": { + "x": 451.4449437285705, + "y": 118.30026803362762 + }, + "type": "customNode", + "data": { + "id": "bufferMemory_0", + "label": "Buffer Memory", + "name": "bufferMemory", + "type": "BufferMemory", + "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], + "category": "Memory", + "description": "Remembers previous conversational back and forths directly", + "inputParams": [ + { + "label": "Memory Key", + "name": "memoryKey", + "type": "string", + "default": "chat_history", + "id": "bufferMemory_0-input-memoryKey-string" + }, + { + "label": "Input Key", + "name": "inputKey", + "type": "string", + "default": "input", + "id": "bufferMemory_0-input-inputKey-string" + } + ], + "inputAnchors": [], + "inputs": { + "memoryKey": "chat_history", + "inputKey": "input" + }, + "outputAnchors": [ + { + "id": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", + "name": "bufferMemory", + "label": "BufferMemory", + "type": "BufferMemory | BaseChatMemory | BaseMemory" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 451.4449437285705, + "y": 118.30026803362762 + }, + "dragging": false + }, + { + "width": 300, + "height": 383, + "id": "conversationChain_0", + "position": { + "x": 1176.1569322079652, + "y": 303.56879146735974 + }, + "type": "customNode", + "data": { + "id": "conversationChain_0", + "label": "Conversation Chain", + "name": "conversationChain", + "type": "ConversationChain", + "baseClasses": ["ConversationChain", "LLMChain", "BaseChain"], + "category": "Chains", + "description": "Chat models specific conversational chain with memory", + "inputParams": [ + { + "label": "System Message", + "name": "systemMessagePrompt", + "type": "string", + "rows": 4, + "additionalParams": true, + "optional": true, + "placeholder": "You are a helpful assistant that write codes", + "id": "conversationChain_0-input-systemMessagePrompt-string" + } + ], + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseChatModel", + "id": "conversationChain_0-input-model-BaseChatModel" + }, + { + "label": "Memory", + "name": "memory", + "type": "BaseMemory", + "id": "conversationChain_0-input-memory-BaseMemory" + }, + { + "label": "Document", + "name": "document", + "type": "Document", + "description": "Include whole document into the context window", + "optional": true, + "list": true, + "id": "conversationChain_0-input-document-Document" + } + ], + "inputs": { + "model": "{{chatAnthropic_0.data.instance}}", + "memory": "{{bufferMemory_0.data.instance}}", + "document": ["{{pdfFile_0.data.instance}}"], + "systemMessagePrompt": "" + }, + "outputAnchors": [ + { + "id": "conversationChain_0-output-conversationChain-ConversationChain|LLMChain|BaseChain", + "name": "conversationChain", + "label": "ConversationChain", + "type": "ConversationChain | LLMChain | BaseChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1176.1569322079652, + "y": 303.56879146735974 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatAnthropic_0", + "position": { + "x": 800.5525382783799, + "y": -76.7988221837009 + }, + "type": "customNode", + "data": { + "id": "chatAnthropic_0", + "label": "ChatAnthropic", + "name": "chatAnthropic", + "type": "ChatAnthropic", + "baseClasses": ["ChatAnthropic", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around ChatAnthropic large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["anthropicApi"], + "id": "chatAnthropic_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "claude-2", + "name": "claude-2", + "description": "Claude 2 latest major version, automatically get updates to the model as they are released" + }, + { + "label": "claude-instant-1", + "name": "claude-instant-1", + "description": "Claude Instant latest major version, automatically get updates to the model as they are released" + }, + { + "label": "claude-v1", + "name": "claude-v1" + }, + { + "label": "claude-v1-100k", + "name": "claude-v1-100k" + }, + { + "label": "claude-v1.0", + "name": "claude-v1.0" + }, + { + "label": "claude-v1.2", + "name": "claude-v1.2" + }, + { + "label": "claude-v1.3", + "name": "claude-v1.3" + }, + { + "label": "claude-v1.3-100k", + "name": "claude-v1.3-100k" + }, + { + "label": "claude-instant-v1", + "name": "claude-instant-v1" + }, + { + "label": "claude-instant-v1-100k", + "name": "claude-instant-v1-100k" + }, + { + "label": "claude-instant-v1.0", + "name": "claude-instant-v1.0" + }, + { + "label": "claude-instant-v1.1", + "name": "claude-instant-v1.1" + }, + { + "label": "claude-instant-v1.1-100k", + "name": "claude-instant-v1.1-100k" + } + ], + "default": "claude-v1", + "optional": true, + "id": "chatAnthropic_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatAnthropic_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokensToSample", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatAnthropic_0-input-maxTokensToSample-number" + }, + { + "label": "Top P", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatAnthropic_0-input-topP-number" + }, + { + "label": "Top K", + "name": "topK", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatAnthropic_0-input-topK-number" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "claude-2", + "temperature": 0.9, + "maxTokensToSample": "", + "topP": "", + "topK": "" + }, + "outputAnchors": [ + { + "id": "chatAnthropic_0-output-chatAnthropic-ChatAnthropic|BaseChatModel|BaseLanguageModel", + "name": "chatAnthropic", + "label": "ChatAnthropic", + "type": "ChatAnthropic | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 800.5525382783799, + "y": -76.7988221837009 + }, + "dragging": false + }, + { + "width": 300, + "height": 507, + "id": "pdfFile_0", + "position": { + "x": 94.16886576108482, + "y": 37.12056504707391 + }, + "type": "customNode", + "data": { + "id": "pdfFile_0", + "label": "Pdf File", + "name": "pdfFile", + "type": "Document", + "baseClasses": ["Document"], + "category": "Document Loaders", + "description": "Load data from PDF files", + "inputParams": [ + { + "label": "Pdf File", + "name": "pdfFile", + "type": "file", + "fileType": ".pdf", + "id": "pdfFile_0-input-pdfFile-file" + }, + { + "label": "Usage", + "name": "usage", + "type": "options", + "options": [ + { + "label": "One document per page", + "name": "perPage" + }, + { + "label": "One document per file", + "name": "perFile" + } + ], + "default": "perPage", + "id": "pdfFile_0-input-usage-options" + }, + { + "label": "Use Legacy Build", + "name": "legacyBuild", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "pdfFile_0-input-legacyBuild-boolean" + }, + { + "label": "Metadata", + "name": "metadata", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "pdfFile_0-input-metadata-json" + } + ], + "inputAnchors": [ + { + "label": "Text Splitter", + "name": "textSplitter", + "type": "TextSplitter", + "optional": true, + "id": "pdfFile_0-input-textSplitter-TextSplitter" + } + ], + "inputs": { + "textSplitter": "", + "usage": "perPage", + "legacyBuild": "", + "metadata": "" + }, + "outputAnchors": [ + { + "id": "pdfFile_0-output-pdfFile-Document", + "name": "pdfFile", + "label": "Document", + "type": "Document" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 94.16886576108482, + "y": 37.12056504707391 + }, + "dragging": false + } + ], + "edges": [ + { + "source": "bufferMemory_0", + "sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", + "target": "conversationChain_0", + "targetHandle": "conversationChain_0-input-memory-BaseMemory", + "type": "buttonedge", + "id": "bufferMemory_0-bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory-conversationChain_0-conversationChain_0-input-memory-BaseMemory", + "data": { + "label": "" + } + }, + { + "source": "chatAnthropic_0", + "sourceHandle": "chatAnthropic_0-output-chatAnthropic-ChatAnthropic|BaseChatModel|BaseLanguageModel", + "target": "conversationChain_0", + "targetHandle": "conversationChain_0-input-model-BaseChatModel", + "type": "buttonedge", + "id": "chatAnthropic_0-chatAnthropic_0-output-chatAnthropic-ChatAnthropic|BaseChatModel|BaseLanguageModel-conversationChain_0-conversationChain_0-input-model-BaseChatModel", + "data": { + "label": "" + } + }, + { + "source": "pdfFile_0", + "sourceHandle": "pdfFile_0-output-pdfFile-Document", + "target": "conversationChain_0", + "targetHandle": "conversationChain_0-input-document-Document", + "type": "buttonedge", + "id": "pdfFile_0-pdfFile_0-output-pdfFile-Document-conversationChain_0-conversationChain_0-input-document-Document", + "data": { + "label": "" + } + } + ] +} diff --git a/packages/server/marketplaces/chatflows/Conversational Agent.json b/packages/server/marketplaces/chatflows/Conversational Agent.json index b0295fd6..59d59336 100644 --- a/packages/server/marketplaces/chatflows/Conversational Agent.json +++ b/packages/server/marketplaces/chatflows/Conversational Agent.json @@ -1,202 +1,6 @@ { "description": "A conversational agent for a chat model which utilize chat specific prompts", "nodes": [ - { - "width": 300, - "height": 524, - "id": "chatOpenAI_1", - "position": { - "x": 56.646518061018355, - "y": 71.07043412525425 - }, - "type": "customNode", - "data": { - "id": "chatOpenAI_1", - "label": "ChatOpenAI", - "name": "chatOpenAI", - "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], - "category": "Chat Models", - "description": "Wrapper around OpenAI large language models that use the Chat endpoint", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "gpt-4", - "name": "gpt-4" - }, - { - "label": "gpt-4-0613", - "name": "gpt-4-0613" - }, - { - "label": "gpt-4-32k", - "name": "gpt-4-32k" - }, - { - "label": "gpt-4-32k-0613", - "name": "gpt-4-32k-0613" - }, - { - "label": "gpt-3.5-turbo", - "name": "gpt-3.5-turbo" - }, - { - "label": "gpt-3.5-turbo-0613", - "name": "gpt-3.5-turbo-0613" - }, - { - "label": "gpt-3.5-turbo-16k", - "name": "gpt-3.5-turbo-16k" - }, - { - "label": "gpt-3.5-turbo-16k-0613", - "name": "gpt-3.5-turbo-16k-0613" - } - ], - "default": "gpt-3.5-turbo", - "optional": true, - "id": "chatOpenAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.9, - "optional": true, - "id": "chatOpenAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-topP-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-presencePenalty-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "gpt-3.5-turbo", - "temperature": "0", - "maxTokens": "", - "topP": "", - "frequencyPenalty": "", - "presencePenalty": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "name": "chatOpenAI", - "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 56.646518061018355, - "y": 71.07043412525425 - }, - "dragging": false - }, - { - "width": 300, - "height": 278, - "id": "serpAPI_1", - "position": { - "x": 436.94138168947336, - "y": 39.517825311262044 - }, - "type": "customNode", - "data": { - "id": "serpAPI_1", - "label": "Serp API", - "name": "serpAPI", - "type": "SerpAPI", - "baseClasses": ["SerpAPI", "Tool", "StructuredTool", "BaseLangChain"], - "category": "Tools", - "description": "Wrapper around SerpAPI - a real-time API to access Google search results", - "inputParams": [ - { - "label": "Serp Api Key", - "name": "apiKey", - "type": "password", - "id": "serpAPI_1-input-apiKey-password" - } - ], - "inputAnchors": [], - "inputs": {}, - "outputAnchors": [ - { - "id": "serpAPI_1-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain", - "name": "serpAPI", - "label": "SerpAPI", - "type": "SerpAPI | Tool | StructuredTool | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 436.94138168947336, - "y": 39.517825311262044 - }, - "dragging": false - }, { "width": 300, "height": 143, @@ -240,8 +44,8 @@ "height": 376, "id": "bufferMemory_1", "position": { - "x": 573.479796337051, - "y": 575.8843338367278 + "x": 607.6260576768354, + "y": 584.7920541862369 }, "type": "customNode", "data": { @@ -285,19 +89,218 @@ "selected": false }, "positionAbsolute": { - "x": 573.479796337051, - "y": 575.8843338367278 + "x": 607.6260576768354, + "y": 584.7920541862369 }, "selected": false, "dragging": false }, + { + "width": 300, + "height": 277, + "id": "serpAPI_0", + "position": { + "x": 451.83740798447855, + "y": 53.2843022150486 + }, + "type": "customNode", + "data": { + "id": "serpAPI_0", + "label": "Serp API", + "name": "serpAPI", + "type": "SerpAPI", + "baseClasses": ["SerpAPI", "Tool", "StructuredTool"], + "category": "Tools", + "description": "Wrapper around SerpAPI - a real-time API to access Google search results", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["serpApi"], + "id": "serpAPI_0-input-credential-credential" + } + ], + "inputAnchors": [], + "inputs": {}, + "outputAnchors": [ + { + "id": "serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool", + "name": "serpAPI", + "label": "SerpAPI", + "type": "SerpAPI | Tool | StructuredTool" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 451.83740798447855, + "y": 53.2843022150486 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 97.01321406237057, + "y": 63.67664262280914 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 97.01321406237057, + "y": 63.67664262280914 + }, + "dragging": false + }, { "width": 300, "height": 383, "id": "conversationalAgent_0", "position": { - "x": 1206.1996037716035, - "y": 227.39579577603587 + "x": 1164.4550359451973, + "y": 283.40041124403075 }, "type": "customNode", "data": { @@ -305,7 +308,7 @@ "label": "Conversational Agent", "name": "conversationalAgent", "type": "AgentExecutor", - "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], + "baseClasses": ["AgentExecutor", "BaseChain"], "category": "Agents", "description": "Conversational agent for a chat model. It will utilize chat specific prompts", "inputParams": [ @@ -314,18 +317,10 @@ "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" - }, - { - "label": "Human Message", - "name": "humanMessage", - "type": "string", - "rows": 4, - "optional": true, - "additionalParams": true, - "id": "conversationalAgent_0-input-humanMessage-string" } ], "inputAnchors": [ @@ -350,18 +345,17 @@ } ], "inputs": { - "tools": ["{{calculator_1.data.instance}}", "{{serpAPI_1.data.instance}}"], - "model": "{{chatOpenAI_1.data.instance}}", + "tools": ["{{calculator_1.data.instance}}", "{{serpAPI_0.data.instance}}"], + "model": "{{chatOpenAI_0.data.instance}}", "memory": "{{bufferMemory_1.data.instance}}", - "systemMessage": "", - "humanMessage": "" + "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|BaseLangChain", + "id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain", "name": "conversationalAgent", "label": "AgentExecutor", - "type": "AgentExecutor | BaseChain | BaseLangChain" + "type": "AgentExecutor | BaseChain" } ], "outputs": {}, @@ -369,8 +363,8 @@ }, "selected": false, "positionAbsolute": { - "x": 1206.1996037716035, - "y": 227.39579577603587 + "x": 1164.4550359451973, + "y": 283.40041124403075 }, "dragging": false } @@ -388,23 +382,23 @@ } }, { - "source": "serpAPI_1", - "sourceHandle": "serpAPI_1-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain", + "source": "serpAPI_0", + "sourceHandle": "serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool", "target": "conversationalAgent_0", "targetHandle": "conversationalAgent_0-input-tools-Tool", "type": "buttonedge", - "id": "serpAPI_1-serpAPI_1-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain-conversationalAgent_0-conversationalAgent_0-input-tools-Tool", + "id": "serpAPI_0-serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool-conversationalAgent_0-conversationalAgent_0-input-tools-Tool", "data": { "label": "" } }, { - "source": "chatOpenAI_1", - "sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-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|BaseLangChain-conversationalAgent_0-conversationalAgent_0-input-model-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseLanguageModel", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/Conversational Retrieval QA Chain.json b/packages/server/marketplaces/chatflows/Conversational Retrieval QA Chain.json index e420fefe..c05e56b6 100644 --- a/packages/server/marketplaces/chatflows/Conversational Retrieval QA Chain.json +++ b/packages/server/marketplaces/chatflows/Conversational Retrieval QA Chain.json @@ -63,8 +63,8 @@ "height": 392, "id": "textFile_1", "position": { - "x": 810.6456923854021, - "y": 61.45989039390216 + "x": 788.5395420616719, + "y": 126.30459801017741 }, "type": "customNode", "data": { @@ -117,211 +117,18 @@ }, "selected": false, "positionAbsolute": { - "x": 810.6456923854021, - "y": 61.45989039390216 + "x": 788.5395420616719, + "y": 126.30459801017741 }, "dragging": false }, { "width": 300, - "height": 330, - "id": "openAIEmbeddings_1", - "position": { - "x": 817.2208258595176, - "y": 586.8095386455508 - }, - "type": "customNode", - "data": { - "id": "openAIEmbeddings_1", - "label": "OpenAI Embeddings", - "name": "openAIEmbeddings", - "type": "OpenAIEmbeddings", - "baseClasses": ["OpenAIEmbeddings", "Embeddings"], - "category": "Embeddings", - "description": "OpenAI API to generate embeddings for a given text", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_1-input-openAIApiKey-password" - }, - { - "label": "Strip New Lines", - "name": "stripNewLines", - "type": "boolean", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-stripNewLines-boolean" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "stripNewLines": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "name": "openAIEmbeddings", - "label": "OpenAIEmbeddings", - "type": "OpenAIEmbeddings | Embeddings" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 817.2208258595176, - "y": 586.8095386455508 - }, - "dragging": false - }, - { - "width": 300, - "height": 702, - "id": "pineconeUpsert_1", - "position": { - "x": 1201.3427203075867, - "y": 545.1800202023215 - }, - "type": "customNode", - "data": { - "id": "pineconeUpsert_1", - "label": "Pinecone Upsert Document", - "name": "pineconeUpsert", - "type": "Pinecone", - "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Upsert documents to Pinecone", - "inputParams": [ - { - "label": "Pinecone Api Key", - "name": "pineconeApiKey", - "type": "password", - "id": "pineconeUpsert_1-input-pineconeApiKey-password" - }, - { - "label": "Pinecone Environment", - "name": "pineconeEnv", - "type": "string", - "id": "pineconeUpsert_1-input-pineconeEnv-string" - }, - { - "label": "Pinecone Index", - "name": "pineconeIndex", - "type": "string", - "id": "pineconeUpsert_1-input-pineconeIndex-string" - }, - { - "label": "Pinecone Namespace", - "name": "pineconeNamespace", - "type": "string", - "placeholder": "my-first-namespace", - "optional": true, - "additionalParams": true, - "id": "pineconeUpsert_1-input-pineconeNamespace-string" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", - "additionalParams": true, - "optional": true, - "id": "pineconeUpsert_1-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Document", - "name": "document", - "type": "Document", - "list": true, - "id": "pineconeUpsert_1-input-document-Document" - }, - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "pineconeUpsert_1-input-embeddings-Embeddings" - } - ], - "inputs": { - "document": ["{{textFile_1.data.instance}}"], - "embeddings": "{{openAIEmbeddings_1.data.instance}}", - "pineconeEnv": "us-west4-gcp", - "pineconeIndex": "myindex", - "pineconeNamespace": "mynamespace" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "pineconeUpsert_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Pinecone Retriever", - "type": "Pinecone | VectorStoreRetriever | BaseRetriever" - }, - { - "id": "pineconeUpsert_1-output-vectorStore-Pinecone|VectorStore", - "name": "vectorStore", - "label": "Pinecone Vector Store", - "type": "Pinecone | VectorStore" - } - ], - "default": "retriever" - } - ], - "outputs": { - "output": "retriever" - }, - "selected": false - }, - "selected": false, - "dragging": false, - "positionAbsolute": { - "x": 1201.3427203075867, - "y": 545.1800202023215 - } - }, - { - "width": 300, - "height": 524, + "height": 523, "id": "chatOpenAI_0", "position": { - "x": 1200.565568471151, - "y": -33.648143275380406 + "x": 1200.8283780918746, + "y": 12.591428916196605 }, "type": "customNode", "data": { @@ -329,15 +136,16 @@ "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" }, { "label": "Model Name", @@ -441,19 +249,20 @@ "inputAnchors": [], "inputs": { "modelName": "gpt-3.5-turbo", - "temperature": "0.5", + "temperature": 0.9, "maxTokens": "", "topP": "", "frequencyPenalty": "", "presencePenalty": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "outputs": {}, @@ -461,18 +270,18 @@ }, "selected": false, "positionAbsolute": { - "x": 1200.565568471151, - "y": -33.648143275380406 + "x": 1200.8283780918746, + "y": 12.591428916196605 }, "dragging": false }, { "width": 300, - "height": 280, + "height": 480, "id": "conversationalRetrievalQAChain_0", "position": { - "x": 1627.1855024401737, - "y": 394.42287890442145 + "x": 1626.7402076624098, + "y": 394.29095783927113 }, "type": "customNode", "data": { @@ -480,7 +289,7 @@ "label": "Conversational Retrieval QA Chain", "name": "conversationalRetrievalQAChain", "type": "ConversationalRetrievalQAChain", - "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain", "BaseLangChain"], + "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain"], "category": "Chains", "description": "Document QA - built on RetrievalQAChain to provide a chat history component", "inputParams": [ @@ -551,14 +360,18 @@ ], "inputs": { "model": "{{chatOpenAI_0.data.instance}}", - "vectorStoreRetriever": "{{pineconeUpsert_1.data.instance}}" + "vectorStoreRetriever": "{{pineconeUpsert_0.data.instance}}", + "memory": "", + "returnSourceDocuments": "", + "systemMessagePrompt": "", + "chainOption": "" }, "outputAnchors": [ { - "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-ConversationalRetrievalQAChain|BaseChain|BaseLangChain", + "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-ConversationalRetrievalQAChain|BaseChain", "name": "conversationalRetrievalQAChain", "label": "ConversationalRetrievalQAChain", - "type": "ConversationalRetrievalQAChain | BaseChain | BaseLangChain" + "type": "ConversationalRetrievalQAChain | BaseChain" } ], "outputs": {}, @@ -566,35 +379,203 @@ }, "selected": false, "positionAbsolute": { - "x": 1627.1855024401737, - "y": 394.42287890442145 + "x": 1626.7402076624098, + "y": 394.29095783927113 + }, + "dragging": false + }, + { + "width": 300, + "height": 329, + "id": "openAIEmbeddings_0", + "position": { + "x": 788.1802387155774, + "y": 579.9826205586049 + }, + "type": "customNode", + "data": { + "id": "openAIEmbeddings_0", + "label": "OpenAI Embeddings", + "name": "openAIEmbeddings", + "type": "OpenAIEmbeddings", + "baseClasses": ["OpenAIEmbeddings", "Embeddings"], + "category": "Embeddings", + "description": "OpenAI API to generate embeddings for a given text", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_0-input-credential-credential" + }, + { + "label": "Strip New Lines", + "name": "stripNewLines", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-stripNewLines-boolean" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "stripNewLines": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 788.1802387155774, + "y": 579.9826205586049 + }, + "dragging": false + }, + { + "width": 300, + "height": 555, + "id": "pineconeUpsert_0", + "position": { + "x": 1200.8283780918746, + "y": 588.825080688097 + }, + "type": "customNode", + "data": { + "id": "pineconeUpsert_0", + "label": "Pinecone Upsert Document", + "name": "pineconeUpsert", + "type": "Pinecone", + "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Upsert documents to Pinecone", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["pineconeApi"], + "id": "pineconeUpsert_0-input-credential-credential" + }, + { + "label": "Pinecone Index", + "name": "pineconeIndex", + "type": "string", + "id": "pineconeUpsert_0-input-pineconeIndex-string" + }, + { + "label": "Pinecone Namespace", + "name": "pineconeNamespace", + "type": "string", + "placeholder": "my-first-namespace", + "additionalParams": true, + "optional": true, + "id": "pineconeUpsert_0-input-pineconeNamespace-string" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "pineconeUpsert_0-input-topK-number" + } + ], + "inputAnchors": [ + { + "label": "Document", + "name": "document", + "type": "Document", + "list": true, + "id": "pineconeUpsert_0-input-document-Document" + }, + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "pineconeUpsert_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "document": ["{{textFile_1.data.instance}}"], + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "pineconeIndex": "", + "pineconeNamespace": "", + "topK": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "pineconeUpsert_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Pinecone Retriever", + "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "pineconeUpsert_0-output-vectorStore-Pinecone|VectorStore", + "name": "vectorStore", + "label": "Pinecone Vector Store", + "type": "Pinecone | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "retriever" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1200.8283780918746, + "y": 588.825080688097 }, "dragging": false } ], "edges": [ - { - "source": "openAIEmbeddings_1", - "sourceHandle": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "target": "pineconeUpsert_1", - "targetHandle": "pineconeUpsert_1-input-embeddings-Embeddings", - "type": "buttonedge", - "id": "openAIEmbeddings_1-openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeUpsert_1-pineconeUpsert_1-input-embeddings-Embeddings", - "data": { - "label": "" - } - }, - { - "source": "textFile_1", - "sourceHandle": "textFile_1-output-textFile-Document", - "target": "pineconeUpsert_1", - "targetHandle": "pineconeUpsert_1-input-document-Document", - "type": "buttonedge", - "id": "textFile_1-textFile_1-output-textFile-Document-pineconeUpsert_1-pineconeUpsert_1-input-document-Document", - "data": { - "label": "" - } - }, { "source": "recursiveCharacterTextSplitter_1", "sourceHandle": "recursiveCharacterTextSplitter_1-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter", @@ -608,22 +589,44 @@ }, { "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "conversationalRetrievalQAChain_0", "targetHandle": "conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", "data": { "label": "" } }, { - "source": "pineconeUpsert_1", - "sourceHandle": "pineconeUpsert_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "source": "textFile_1", + "sourceHandle": "textFile_1-output-textFile-Document", + "target": "pineconeUpsert_0", + "targetHandle": "pineconeUpsert_0-input-document-Document", + "type": "buttonedge", + "id": "textFile_1-textFile_1-output-textFile-Document-pineconeUpsert_0-pineconeUpsert_0-input-document-Document", + "data": { + "label": "" + } + }, + { + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "pineconeUpsert_0", + "targetHandle": "pineconeUpsert_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeUpsert_0-pineconeUpsert_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, + { + "source": "pineconeUpsert_0", + "sourceHandle": "pineconeUpsert_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", "target": "conversationalRetrievalQAChain_0", "targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", "type": "buttonedge", - "id": "pineconeUpsert_1-pineconeUpsert_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "id": "pineconeUpsert_0-pineconeUpsert_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/HuggingFace LLM Chain.json b/packages/server/marketplaces/chatflows/HuggingFace LLM Chain.json index 63a04b03..b786aeb9 100644 --- a/packages/server/marketplaces/chatflows/HuggingFace LLM Chain.json +++ b/packages/server/marketplaces/chatflows/HuggingFace LLM Chain.json @@ -81,120 +81,6 @@ "selected": false, "dragging": false }, - { - "width": 300, - "height": 429, - "id": "huggingFaceInference_LLMs_0", - "position": { - "x": 503.5630827259226, - "y": 50.79125094823999 - }, - "type": "customNode", - "data": { - "id": "huggingFaceInference_LLMs_0", - "label": "HuggingFace Inference", - "name": "huggingFaceInference_LLMs", - "type": "HuggingFaceInference", - "baseClasses": ["HuggingFaceInference", "LLM", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], - "category": "LLMs", - "description": "Wrapper around HuggingFace large language models", - "inputParams": [ - { - "label": "Model", - "name": "model", - "type": "string", - "placeholder": "gpt2", - "id": "huggingFaceInference_LLMs_0-input-model-string" - }, - { - "label": "HuggingFace Api Key", - "name": "apiKey", - "type": "password", - "id": "huggingFaceInference_LLMs_0-input-apiKey-password" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "description": "Temperature parameter may not apply to certain model. Please check available model parameters", - "optional": true, - "additionalParams": true, - "id": "huggingFaceInference_LLMs_0-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "description": "Max Tokens parameter may not apply to certain model. Please check available model parameters", - "optional": true, - "additionalParams": true, - "id": "huggingFaceInference_LLMs_0-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "description": "Top Probability parameter may not apply to certain model. Please check available model parameters", - "optional": true, - "additionalParams": true, - "id": "huggingFaceInference_LLMs_0-input-topP-number" - }, - { - "label": "Top K", - "name": "hfTopK", - "type": "number", - "description": "Top K parameter may not apply to certain model. Please check available model parameters", - "optional": true, - "additionalParams": true, - "id": "huggingFaceInference_LLMs_0-input-hfTopK-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "description": "Frequency Penalty parameter may not apply to certain model. Please check available model parameters", - "optional": true, - "additionalParams": true, - "id": "huggingFaceInference_LLMs_0-input-frequencyPenalty-number" - }, - { - "label": "Endpoint", - "name": "endpoint", - "type": "string", - "placeholder": "https://xyz.eu-west-1.aws.endpoints.huggingface.cloud/gpt2", - "description": "Using your own inference endpoint", - "optional": true, - "additionalParams": true, - "id": "huggingFaceInference_LLMs_0-input-endpoint-string" - } - ], - "inputAnchors": [], - "inputs": { - "model": "tiiuae/falcon-7b-instruct", - "temperature": "", - "maxTokens": "200", - "topP": "", - "hfTopK": "10", - "frequencyPenalty": "" - }, - "outputAnchors": [ - { - "id": "huggingFaceInference_LLMs_0-output-huggingFaceInference_LLMs-HuggingFaceInference|LLM|BaseLLM|BaseLanguageModel|BaseLangChain", - "name": "huggingFaceInference_LLMs", - "label": "HuggingFaceInference", - "type": "HuggingFaceInference | LLM | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 503.5630827259226, - "y": 50.79125094823999 - }, - "dragging": false - }, { "width": 300, "height": 475, @@ -253,20 +139,126 @@ "y": 504.50766458127396 }, "dragging": false + }, + { + "width": 300, + "height": 526, + "id": "huggingFaceInference_LLMs_0", + "position": { + "x": 498.8594464193537, + "y": -44.91050256311678 + }, + "type": "customNode", + "data": { + "id": "huggingFaceInference_LLMs_0", + "label": "HuggingFace Inference", + "name": "huggingFaceInference_LLMs", + "type": "HuggingFaceInference", + "baseClasses": ["HuggingFaceInference", "LLM", "BaseLLM", "BaseLanguageModel"], + "category": "LLMs", + "description": "Wrapper around HuggingFace large language models", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["huggingFaceApi"], + "id": "huggingFaceInference_LLMs_0-input-credential-credential" + }, + { + "label": "Model", + "name": "model", + "type": "string", + "description": "If using own inference endpoint, leave this blank", + "placeholder": "gpt2", + "optional": true, + "id": "huggingFaceInference_LLMs_0-input-model-string" + }, + { + "label": "Endpoint", + "name": "endpoint", + "type": "string", + "placeholder": "https://xyz.eu-west-1.aws.endpoints.huggingface.cloud/gpt2", + "description": "Using your own inference endpoint", + "optional": true, + "id": "huggingFaceInference_LLMs_0-input-endpoint-string" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "description": "Temperature parameter may not apply to certain model. Please check available model parameters", + "optional": true, + "additionalParams": true, + "id": "huggingFaceInference_LLMs_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "description": "Max Tokens parameter may not apply to certain model. Please check available model parameters", + "optional": true, + "additionalParams": true, + "id": "huggingFaceInference_LLMs_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "description": "Top Probability parameter may not apply to certain model. Please check available model parameters", + "optional": true, + "additionalParams": true, + "id": "huggingFaceInference_LLMs_0-input-topP-number" + }, + { + "label": "Top K", + "name": "hfTopK", + "type": "number", + "description": "Top K parameter may not apply to certain model. Please check available model parameters", + "optional": true, + "additionalParams": true, + "id": "huggingFaceInference_LLMs_0-input-hfTopK-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "description": "Frequency Penalty parameter may not apply to certain model. Please check available model parameters", + "optional": true, + "additionalParams": true, + "id": "huggingFaceInference_LLMs_0-input-frequencyPenalty-number" + } + ], + "inputAnchors": [], + "inputs": { + "model": "tiiuae/falcon-7b-instruct", + "endpoint": "", + "temperature": "", + "maxTokens": "", + "topP": "", + "hfTopK": "", + "frequencyPenalty": "" + }, + "outputAnchors": [ + { + "id": "huggingFaceInference_LLMs_0-output-huggingFaceInference_LLMs-HuggingFaceInference|LLM|BaseLLM|BaseLanguageModel", + "name": "huggingFaceInference_LLMs", + "label": "HuggingFaceInference", + "type": "HuggingFaceInference | LLM | BaseLLM | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 498.8594464193537, + "y": -44.91050256311678 + }, + "dragging": false } ], "edges": [ - { - "source": "huggingFaceInference_LLMs_0", - "sourceHandle": "huggingFaceInference_LLMs_0-output-huggingFaceInference_LLMs-HuggingFaceInference|LLM|BaseLLM|BaseLanguageModel|BaseLangChain", - "target": "llmChain_1", - "targetHandle": "llmChain_1-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "huggingFaceInference_LLMs_0-huggingFaceInference_LLMs_0-output-huggingFaceInference_LLMs-HuggingFaceInference|LLM|BaseLLM|BaseLanguageModel|BaseLangChain-llmChain_1-llmChain_1-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, { "source": "promptTemplate_0", "sourceHandle": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", @@ -277,6 +269,17 @@ "data": { "label": "" } + }, + { + "source": "huggingFaceInference_LLMs_0", + "sourceHandle": "huggingFaceInference_LLMs_0-output-huggingFaceInference_LLMs-HuggingFaceInference|LLM|BaseLLM|BaseLanguageModel", + "target": "llmChain_1", + "targetHandle": "llmChain_1-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "huggingFaceInference_LLMs_0-huggingFaceInference_LLMs_0-output-huggingFaceInference_LLMs-HuggingFaceInference|LLM|BaseLLM|BaseLanguageModel-llmChain_1-llmChain_1-input-model-BaseLanguageModel", + "data": { + "label": "" + } } ] } diff --git a/packages/server/marketplaces/chatflows/Long Term Memory.json b/packages/server/marketplaces/chatflows/Long Term Memory.json new file mode 100644 index 00000000..3857cff5 --- /dev/null +++ b/packages/server/marketplaces/chatflows/Long Term Memory.json @@ -0,0 +1,642 @@ +{ + "description": "Use long term memory Zep to differentiate conversations between users with sessionId", + "nodes": [ + { + "width": 300, + "height": 480, + "id": "conversationalRetrievalQAChain_0", + "position": { + "x": 1999.7302950816731, + "y": 365.33064907894243 + }, + "type": "customNode", + "data": { + "id": "conversationalRetrievalQAChain_0", + "label": "Conversational Retrieval QA Chain", + "name": "conversationalRetrievalQAChain", + "type": "ConversationalRetrievalQAChain", + "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain", "BaseLangChain"], + "category": "Chains", + "description": "Document QA - built on RetrievalQAChain to provide a chat history component", + "inputParams": [ + { + "label": "Return Source Documents", + "name": "returnSourceDocuments", + "type": "boolean", + "optional": true, + "id": "conversationalRetrievalQAChain_0-input-returnSourceDocuments-boolean" + }, + { + "label": "System Message", + "name": "systemMessagePrompt", + "type": "string", + "rows": 4, + "additionalParams": true, + "optional": true, + "placeholder": "I want you to act as a document that I am having a conversation with. Your name is \"AI Assistant\". You will provide me with answers from the given info. If the answer is not included, say exactly \"Hmm, I am not sure.\" and stop after that. Refuse to answer any question not about the info. Never break character.", + "id": "conversationalRetrievalQAChain_0-input-systemMessagePrompt-string" + }, + { + "label": "Chain Option", + "name": "chainOption", + "type": "options", + "options": [ + { + "label": "MapReduceDocumentsChain", + "name": "map_reduce", + "description": "Suitable for QA tasks over larger documents and can run the preprocessing step in parallel, reducing the running time" + }, + { + "label": "RefineDocumentsChain", + "name": "refine", + "description": "Suitable for QA tasks over a large number of documents." + }, + { + "label": "StuffDocumentsChain", + "name": "stuff", + "description": "Suitable for QA tasks over a small number of documents." + } + ], + "additionalParams": true, + "optional": true, + "id": "conversationalRetrievalQAChain_0-input-chainOption-options" + } + ], + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "conversationalRetrievalQAChain_0-input-model-BaseLanguageModel" + }, + { + "label": "Vector Store Retriever", + "name": "vectorStoreRetriever", + "type": "BaseRetriever", + "id": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever" + }, + { + "label": "Memory", + "name": "memory", + "type": "DynamoDBChatMemory | RedisBackedChatMemory | ZepMemory", + "optional": true, + "description": "If no memory connected, default BufferMemory will be used", + "id": "conversationalRetrievalQAChain_0-input-memory-DynamoDBChatMemory | RedisBackedChatMemory | ZepMemory" + } + ], + "inputs": { + "model": "{{chatOpenAI_0.data.instance}}", + "vectorStoreRetriever": "{{pineconeExistingIndex_0.data.instance}}", + "memory": "{{ZepMemory_0.data.instance}}", + "returnSourceDocuments": true + }, + "outputAnchors": [ + { + "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-ConversationalRetrievalQAChain|BaseChain|BaseLangChain", + "name": "conversationalRetrievalQAChain", + "label": "ConversationalRetrievalQAChain", + "type": "ConversationalRetrievalQAChain | BaseChain | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1999.7302950816731, + "y": 365.33064907894243 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 1554.3875781165111, + "y": -14.792508259787212 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": "0", + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1554.3875781165111, + "y": -14.792508259787212 + }, + "dragging": false + }, + { + "width": 300, + "height": 329, + "id": "openAIEmbeddings_0", + "position": { + "x": 789.6839176356616, + "y": 167.70165941305987 + }, + "type": "customNode", + "data": { + "id": "openAIEmbeddings_0", + "label": "OpenAI Embeddings", + "name": "openAIEmbeddings", + "type": "OpenAIEmbeddings", + "baseClasses": ["OpenAIEmbeddings", "Embeddings"], + "category": "Embeddings", + "description": "OpenAI API to generate embeddings for a given text", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_0-input-credential-credential" + }, + { + "label": "Strip New Lines", + "name": "stripNewLines", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-stripNewLines-boolean" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "stripNewLines": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 789.6839176356616, + "y": 167.70165941305987 + }, + "dragging": false + }, + { + "width": 300, + "height": 505, + "id": "pineconeExistingIndex_0", + "position": { + "x": 1167.128201355349, + "y": 71.89355115516406 + }, + "type": "customNode", + "data": { + "id": "pineconeExistingIndex_0", + "label": "Pinecone Load Existing Index", + "name": "pineconeExistingIndex", + "type": "Pinecone", + "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Pinecone (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["pineconeApi"], + "id": "pineconeExistingIndex_0-input-credential-credential" + }, + { + "label": "Pinecone Index", + "name": "pineconeIndex", + "type": "string", + "id": "pineconeExistingIndex_0-input-pineconeIndex-string" + }, + { + "label": "Pinecone Namespace", + "name": "pineconeNamespace", + "type": "string", + "placeholder": "my-first-namespace", + "additionalParams": true, + "optional": true, + "id": "pineconeExistingIndex_0-input-pineconeNamespace-string" + }, + { + "label": "Pinecone Metadata Filter", + "name": "pineconeMetadataFilter", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "pineconeExistingIndex_0-input-pineconeMetadataFilter-json" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "pineconeExistingIndex_0-input-topK-number" + } + ], + "inputAnchors": [ + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "pineconeExistingIndex_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "pineconeIndex": "", + "pineconeNamespace": "", + "pineconeMetadataFilter": "", + "topK": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Pinecone Retriever", + "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", + "name": "vectorStore", + "label": "Pinecone Vector Store", + "type": "Pinecone | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "retriever" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1167.128201355349, + "y": 71.89355115516406 + }, + "dragging": false + }, + { + "width": 300, + "height": 623, + "id": "ZepMemory_0", + "position": { + "x": 1552.2067611642792, + "y": 560.8352147865392 + }, + "type": "customNode", + "data": { + "id": "ZepMemory_0", + "label": "Zep Memory", + "name": "ZepMemory", + "type": "ZepMemory", + "baseClasses": ["ZepMemory", "BaseChatMemory", "BaseMemory"], + "category": "Memory", + "description": "Summarizes the conversation and stores the memory in zep server", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "optional": true, + "description": "Configure JWT authentication on your Zep instance (Optional)", + "credentialNames": ["zepMemoryApi"], + "id": "ZepMemory_0-input-credential-credential" + }, + { + "label": "Base URL", + "name": "baseURL", + "type": "string", + "default": "http://127.0.0.1:8000", + "id": "ZepMemory_0-input-baseURL-string" + }, + { + "label": "Auto Summary", + "name": "autoSummary", + "type": "boolean", + "default": true, + "id": "ZepMemory_0-input-autoSummary-boolean" + }, + { + "label": "Session Id", + "name": "sessionId", + "type": "string", + "description": "if empty, chatId will be used automatically", + "default": "", + "additionalParams": true, + "optional": true, + "id": "ZepMemory_0-input-sessionId-string" + }, + { + "label": "Size", + "name": "k", + "type": "number", + "default": "10", + "step": 1, + "description": "Window of size k to surface the last k back-and-forths to use as memory.", + "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", + "name": "aiPrefix", + "type": "string", + "default": "ai", + "additionalParams": true, + "id": "ZepMemory_0-input-aiPrefix-string" + }, + { + "label": "Human Prefix", + "name": "humanPrefix", + "type": "string", + "default": "human", + "additionalParams": true, + "id": "ZepMemory_0-input-humanPrefix-string" + }, + { + "label": "Memory Key", + "name": "memoryKey", + "type": "string", + "default": "chat_history", + "additionalParams": true, + "id": "ZepMemory_0-input-memoryKey-string" + }, + { + "label": "Input Key", + "name": "inputKey", + "type": "string", + "default": "input", + "additionalParams": true, + "id": "ZepMemory_0-input-inputKey-string" + }, + { + "label": "Output Key", + "name": "outputKey", + "type": "string", + "default": "text", + "additionalParams": true, + "id": "ZepMemory_0-input-outputKey-string" + } + ], + "inputAnchors": [], + "inputs": { + "baseURL": "http://127.0.0.1:8000", + "autoSummary": true, + "sessionId": "", + "k": "10", + "autoSummaryTemplate": "This is the summary of the following conversation:\n{summary}", + "aiPrefix": "ai", + "humanPrefix": "human", + "memoryKey": "chat_history", + "inputKey": "input", + "outputKey": "text" + }, + "outputAnchors": [ + { + "id": "ZepMemory_0-output-ZepMemory-ZepMemory|BaseChatMemory|BaseMemory", + "name": "ZepMemory", + "label": "ZepMemory", + "type": "ZepMemory | BaseChatMemory | BaseMemory" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1552.2067611642792, + "y": 560.8352147865392 + }, + "dragging": false + } + ], + "edges": [ + { + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "pineconeExistingIndex_0", + "targetHandle": "pineconeExistingIndex_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_0-pineconeExistingIndex_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, + { + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "conversationalRetrievalQAChain_0", + "targetHandle": "conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, + { + "source": "pineconeExistingIndex_0", + "sourceHandle": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "target": "conversationalRetrievalQAChain_0", + "targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "type": "buttonedge", + "id": "pineconeExistingIndex_0-pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "data": { + "label": "" + } + }, + { + "source": "ZepMemory_0", + "sourceHandle": "ZepMemory_0-output-ZepMemory-ZepMemory|BaseChatMemory|BaseMemory", + "target": "conversationalRetrievalQAChain_0", + "targetHandle": "conversationalRetrievalQAChain_0-input-memory-DynamoDBChatMemory | RedisBackedChatMemory | ZepMemory", + "type": "buttonedge", + "id": "ZepMemory_0-ZepMemory_0-output-ZepMemory-ZepMemory|BaseChatMemory|BaseMemory-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-memory-DynamoDBChatMemory | RedisBackedChatMemory | ZepMemory", + "data": { + "label": "" + } + } + ] +} diff --git a/packages/server/marketplaces/chatflows/MRKLAgent.json b/packages/server/marketplaces/chatflows/MRKLAgent.json index 257123e0..4164f886 100644 --- a/packages/server/marketplaces/chatflows/MRKLAgent.json +++ b/packages/server/marketplaces/chatflows/MRKLAgent.json @@ -1,51 +1,6 @@ { "description": "An agent that uses the React Framework to decide what action to take", "nodes": [ - { - "width": 300, - "height": 278, - "id": "serpAPI_1", - "position": { - "x": 312.0655985817535, - "y": 112.09909989842703 - }, - "type": "customNode", - "data": { - "id": "serpAPI_1", - "label": "Serp API", - "name": "serpAPI", - "type": "SerpAPI", - "baseClasses": ["SerpAPI", "Tool", "StructuredTool", "BaseLangChain"], - "category": "Tools", - "description": "Wrapper around SerpAPI - a real-time API to access Google search results", - "inputParams": [ - { - "label": "Serp Api Key", - "name": "apiKey", - "type": "password", - "id": "serpAPI_1-input-apiKey-password" - } - ], - "inputAnchors": [], - "inputs": {}, - "outputAnchors": [ - { - "id": "serpAPI_1-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain", - "name": "serpAPI", - "label": "SerpAPI", - "type": "SerpAPI | Tool | StructuredTool | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 312.0655985817535, - "y": 112.09909989842703 - }, - "dragging": false - }, { "width": 300, "height": 143, @@ -84,159 +39,6 @@ "selected": false, "dragging": false }, - { - "width": 300, - "height": 524, - "id": "openAI_1", - "position": { - "x": 663.1307301893027, - "y": 394.7618562930441 - }, - "type": "customNode", - "data": { - "id": "openAI_1", - "label": "OpenAI", - "name": "openAI", - "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], - "category": "LLMs", - "description": "Wrapper around OpenAI large language models", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "text-davinci-003", - "name": "text-davinci-003" - }, - { - "label": "text-davinci-002", - "name": "text-davinci-002" - }, - { - "label": "text-curie-001", - "name": "text-curie-001" - }, - { - "label": "text-babbage-001", - "name": "text-babbage-001" - } - ], - "default": "text-davinci-003", - "optional": true, - "id": "openAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.7, - "optional": true, - "id": "openAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-topP-number" - }, - { - "label": "Best Of", - "name": "bestOf", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-bestOf-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-presencePenalty-number" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "text-davinci-003", - "temperature": 0.7, - "maxTokens": "", - "topP": "", - "bestOf": "", - "frequencyPenalty": "", - "presencePenalty": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "name": "openAI", - "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 663.1307301893027, - "y": 394.7618562930441 - }, - "dragging": false - }, { "width": 300, "height": 280, @@ -271,8 +73,8 @@ } ], "inputs": { - "tools": ["{{calculator_1.data.instance}}", "{{serpAPI_1.data.instance}}"], - "model": "{{openAI_1.data.instance}}" + "tools": ["{{calculator_1.data.instance}}", "{{serper_0.data.instance}}"], + "model": "{{chatOpenAI_0.data.instance}}" }, "outputAnchors": [ { @@ -291,6 +93,205 @@ "y": 245.36098016819074 }, "dragging": false + }, + { + "width": 300, + "height": 277, + "id": "serper_0", + "position": { + "x": 330.964079024626, + "y": 109.83185250619351 + }, + "type": "customNode", + "data": { + "id": "serper_0", + "label": "Serper", + "name": "serper", + "type": "Serper", + "baseClasses": ["Serper", "Tool", "StructuredTool"], + "category": "Tools", + "description": "Wrapper around Serper.dev - Google Search API", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["serperApi"], + "id": "serper_0-input-credential-credential" + } + ], + "inputAnchors": [], + "inputs": {}, + "outputAnchors": [ + { + "id": "serper_0-output-serper-Serper|Tool|StructuredTool", + "name": "serper", + "label": "Serper", + "type": "Serper | Tool | StructuredTool" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 330.964079024626, + "y": 109.83185250619351 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 333.58931284721206, + "y": 416.98420974875927 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 333.58931284721206, + "y": 416.98420974875927 + }, + "dragging": false } ], "edges": [ @@ -306,23 +307,23 @@ } }, { - "source": "serpAPI_1", - "sourceHandle": "serpAPI_1-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain", + "source": "serper_0", + "sourceHandle": "serper_0-output-serper-Serper|Tool|StructuredTool", "target": "mrklAgentLLM_0", "targetHandle": "mrklAgentLLM_0-input-tools-Tool", "type": "buttonedge", - "id": "serpAPI_1-serpAPI_1-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain-mrklAgentLLM_0-mrklAgentLLM_0-input-tools-Tool", + "id": "serper_0-serper_0-output-serper-Serper|Tool|StructuredTool-mrklAgentLLM_0-mrklAgentLLM_0-input-tools-Tool", "data": { "label": "" } }, { - "source": "openAI_1", - "sourceHandle": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "mrklAgentLLM_0", "targetHandle": "mrklAgentLLM_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "openAI_1-openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-mrklAgentLLM_0-mrklAgentLLM_0-input-model-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-mrklAgentLLM_0-mrklAgentLLM_0-input-model-BaseLanguageModel", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/Metadata Filter Load.json b/packages/server/marketplaces/chatflows/Metadata Filter Load.json index 61dad1c4..59516a4e 100644 --- a/packages/server/marketplaces/chatflows/Metadata Filter Load.json +++ b/packages/server/marketplaces/chatflows/Metadata Filter Load.json @@ -3,358 +3,11 @@ "nodes": [ { "width": 300, - "height": 524, - "id": "openAI_1", - "position": { - "x": 1195.6182217299724, - "y": -12.958591115085468 - }, - "type": "customNode", - "data": { - "id": "openAI_1", - "label": "OpenAI", - "name": "openAI", - "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], - "category": "LLMs", - "description": "Wrapper around OpenAI large language models", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "text-davinci-003", - "name": "text-davinci-003" - }, - { - "label": "text-davinci-002", - "name": "text-davinci-002" - }, - { - "label": "text-curie-001", - "name": "text-curie-001" - }, - { - "label": "text-babbage-001", - "name": "text-babbage-001" - } - ], - "default": "text-davinci-003", - "optional": true, - "id": "openAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.7, - "optional": true, - "id": "openAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-topP-number" - }, - { - "label": "Best Of", - "name": "bestOf", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-bestOf-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-presencePenalty-number" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "text-davinci-003", - "temperature": "0", - "maxTokens": "", - "topP": "", - "bestOf": "", - "frequencyPenalty": "", - "presencePenalty": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "name": "openAI", - "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 1195.6182217299724, - "y": -12.958591115085468 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 330, - "id": "openAIEmbeddings_1", - "position": { - "x": 777.5098693425334, - "y": 308.4221448953297 - }, - "type": "customNode", - "data": { - "id": "openAIEmbeddings_1", - "label": "OpenAI Embeddings", - "name": "openAIEmbeddings", - "type": "OpenAIEmbeddings", - "baseClasses": ["OpenAIEmbeddings", "Embeddings"], - "category": "Embeddings", - "description": "OpenAI API to generate embeddings for a given text", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_1-input-openAIApiKey-password" - }, - { - "label": "Strip New Lines", - "name": "stripNewLines", - "type": "boolean", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-stripNewLines-boolean" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "stripNewLines": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "name": "openAIEmbeddings", - "label": "OpenAIEmbeddings", - "type": "OpenAIEmbeddings | Embeddings" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 777.5098693425334, - "y": 308.4221448953297 - }, - "dragging": false - }, - { - "width": 300, - "height": 703, - "id": "pineconeExistingIndex_0", - "position": { - "x": 1187.519066203033, - "y": 542.6635399602128 - }, - "type": "customNode", - "data": { - "id": "pineconeExistingIndex_0", - "label": "Pinecone Load Existing Index", - "name": "pineconeExistingIndex", - "type": "Pinecone", - "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Load existing index from Pinecone (i.e: Document has been upserted)", - "inputParams": [ - { - "label": "Pinecone Api Key", - "name": "pineconeApiKey", - "type": "password", - "id": "pineconeExistingIndex_0-input-pineconeApiKey-password" - }, - { - "label": "Pinecone Environment", - "name": "pineconeEnv", - "type": "string", - "id": "pineconeExistingIndex_0-input-pineconeEnv-string" - }, - { - "label": "Pinecone Index", - "name": "pineconeIndex", - "type": "string", - "id": "pineconeExistingIndex_0-input-pineconeIndex-string" - }, - { - "label": "Pinecone Namespace", - "name": "pineconeNamespace", - "type": "string", - "placeholder": "my-first-namespace", - "optional": true, - "additionalParams": true, - "id": "pineconeExistingIndex_0-input-pineconeNamespace-string" - }, - { - "label": "Pinecone Metadata Filter", - "name": "pineconeMetadataFilter", - "type": "json", - "optional": true, - "additionalParams": true, - "id": "pineconeExistingIndex_0-input-pineconeMetadataFilter-json" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", - "additionalParams": true, - "optional": true, - "id": "pineconeExistingIndex_0-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "pineconeExistingIndex_0-input-embeddings-Embeddings" - } - ], - "inputs": { - "embeddings": "{{openAIEmbeddings_1.data.instance}}", - "pineconeEnv": "northamerica-northeast1-gcp", - "pineconeIndex": "myindex", - "pineconeNamespace": "my-namespace", - "pineconeMetadataFilter": "{\"id\":\"doc1\"}" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Pinecone Retriever", - "type": "Pinecone | VectorStoreRetriever | BaseRetriever" - }, - { - "id": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", - "name": "vectorStore", - "label": "Pinecone Vector Store", - "type": "Pinecone | VectorStore" - } - ], - "default": "retriever" - } - ], - "outputs": { - "output": "retriever" - }, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1187.519066203033, - "y": 542.6635399602128 - }, - "dragging": false - }, - { - "width": 300, - "height": 280, + "height": 480, "id": "conversationalRetrievalQAChain_0", "position": { - "x": 1585.900129303412, - "y": 405.9784391258126 + "x": 1643.035168558474, + "y": 360.96295365212774 }, "type": "customNode", "data": { @@ -432,7 +85,7 @@ } ], "inputs": { - "model": "{{openAI_1.data.instance}}", + "model": "{{chatOpenAI_0.data.instance}}", "vectorStoreRetriever": "{{pineconeExistingIndex_0.data.instance}}" }, "outputAnchors": [ @@ -448,31 +101,375 @@ }, "selected": false, "positionAbsolute": { - "x": 1585.900129303412, - "y": 405.9784391258126 + "x": 1643.035168558474, + "y": 360.96295365212774 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 1197.7264239788542, + "y": -16.177600120515933 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": "0", + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1197.7264239788542, + "y": -16.177600120515933 + }, + "dragging": false + }, + { + "width": 300, + "height": 329, + "id": "openAIEmbeddings_0", + "position": { + "x": 805.2662010688601, + "y": 389.3163571296623 + }, + "type": "customNode", + "data": { + "id": "openAIEmbeddings_0", + "label": "OpenAI Embeddings", + "name": "openAIEmbeddings", + "type": "OpenAIEmbeddings", + "baseClasses": ["OpenAIEmbeddings", "Embeddings"], + "category": "Embeddings", + "description": "OpenAI API to generate embeddings for a given text", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_0-input-credential-credential" + }, + { + "label": "Strip New Lines", + "name": "stripNewLines", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-stripNewLines-boolean" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "stripNewLines": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 805.2662010688601, + "y": 389.3163571296623 + }, + "dragging": false + }, + { + "width": 300, + "height": 505, + "id": "pineconeExistingIndex_0", + "position": { + "x": 1194.8300385699242, + "y": 542.8247838029442 + }, + "type": "customNode", + "data": { + "id": "pineconeExistingIndex_0", + "label": "Pinecone Load Existing Index", + "name": "pineconeExistingIndex", + "type": "Pinecone", + "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Pinecone (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["pineconeApi"], + "id": "pineconeExistingIndex_0-input-credential-credential" + }, + { + "label": "Pinecone Index", + "name": "pineconeIndex", + "type": "string", + "id": "pineconeExistingIndex_0-input-pineconeIndex-string" + }, + { + "label": "Pinecone Namespace", + "name": "pineconeNamespace", + "type": "string", + "placeholder": "my-first-namespace", + "additionalParams": true, + "optional": true, + "id": "pineconeExistingIndex_0-input-pineconeNamespace-string" + }, + { + "label": "Pinecone Metadata Filter", + "name": "pineconeMetadataFilter", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "pineconeExistingIndex_0-input-pineconeMetadataFilter-json" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "pineconeExistingIndex_0-input-topK-number" + } + ], + "inputAnchors": [ + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "pineconeExistingIndex_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "pineconeIndex": "", + "pineconeNamespace": "", + "pineconeMetadataFilter": "", + "topK": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Pinecone Retriever", + "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", + "name": "vectorStore", + "label": "Pinecone Vector Store", + "type": "Pinecone | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "retriever" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1194.8300385699242, + "y": 542.8247838029442 }, "dragging": false } ], "edges": [ { - "source": "openAIEmbeddings_1", - "sourceHandle": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", "target": "pineconeExistingIndex_0", "targetHandle": "pineconeExistingIndex_0-input-embeddings-Embeddings", "type": "buttonedge", - "id": "openAIEmbeddings_1-openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_0-pineconeExistingIndex_0-input-embeddings-Embeddings", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_0-pineconeExistingIndex_0-input-embeddings-Embeddings", "data": { "label": "" } }, { - "source": "openAI_1", - "sourceHandle": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "conversationalRetrievalQAChain_0", "targetHandle": "conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "openAI_1-openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/Metadata Filter Upsert.json b/packages/server/marketplaces/chatflows/Metadata Filter Upsert.json index f2273825..a715f23f 100644 --- a/packages/server/marketplaces/chatflows/Metadata Filter Upsert.json +++ b/packages/server/marketplaces/chatflows/Metadata Filter Upsert.json @@ -58,240 +58,6 @@ }, "dragging": false }, - { - "width": 300, - "height": 524, - "id": "openAI_1", - "position": { - "x": 1159.184721109528, - "y": -38.76565405456694 - }, - "type": "customNode", - "data": { - "id": "openAI_1", - "label": "OpenAI", - "name": "openAI", - "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], - "category": "LLMs", - "description": "Wrapper around OpenAI large language models", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "text-davinci-003", - "name": "text-davinci-003" - }, - { - "label": "text-davinci-002", - "name": "text-davinci-002" - }, - { - "label": "text-curie-001", - "name": "text-curie-001" - }, - { - "label": "text-babbage-001", - "name": "text-babbage-001" - } - ], - "default": "text-davinci-003", - "optional": true, - "id": "openAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.7, - "optional": true, - "id": "openAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-topP-number" - }, - { - "label": "Best Of", - "name": "bestOf", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-bestOf-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-presencePenalty-number" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "text-davinci-003", - "temperature": "0", - "maxTokens": "", - "topP": "", - "bestOf": "", - "frequencyPenalty": "", - "presencePenalty": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "name": "openAI", - "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 1159.184721109528, - "y": -38.76565405456694 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 330, - "id": "openAIEmbeddings_1", - "position": { - "x": 749.4044250705479, - "y": 858.4858399327618 - }, - "type": "customNode", - "data": { - "id": "openAIEmbeddings_1", - "label": "OpenAI Embeddings", - "name": "openAIEmbeddings", - "type": "OpenAIEmbeddings", - "baseClasses": ["OpenAIEmbeddings", "Embeddings"], - "category": "Embeddings", - "description": "OpenAI API to generate embeddings for a given text", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_1-input-openAIApiKey-password" - }, - { - "label": "Strip New Lines", - "name": "stripNewLines", - "type": "boolean", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-stripNewLines-boolean" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "stripNewLines": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "name": "openAIEmbeddings", - "label": "OpenAIEmbeddings", - "type": "OpenAIEmbeddings | Embeddings" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 749.4044250705479, - "y": 858.4858399327618 - }, - "dragging": false - }, { "width": 300, "height": 392, @@ -442,119 +208,7 @@ }, { "width": 300, - "height": 702, - "id": "pineconeUpsert_0", - "position": { - "x": 1161.8813042660154, - "y": 537.0216614326227 - }, - "type": "customNode", - "data": { - "id": "pineconeUpsert_0", - "label": "Pinecone Upsert Document", - "name": "pineconeUpsert", - "type": "Pinecone", - "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Upsert documents to Pinecone", - "inputParams": [ - { - "label": "Pinecone Api Key", - "name": "pineconeApiKey", - "type": "password", - "id": "pineconeUpsert_0-input-pineconeApiKey-password" - }, - { - "label": "Pinecone Environment", - "name": "pineconeEnv", - "type": "string", - "id": "pineconeUpsert_0-input-pineconeEnv-string" - }, - { - "label": "Pinecone Index", - "name": "pineconeIndex", - "type": "string", - "id": "pineconeUpsert_0-input-pineconeIndex-string" - }, - { - "label": "Pinecone Namespace", - "name": "pineconeNamespace", - "type": "string", - "placeholder": "my-first-namespace", - "optional": true, - "additionalParams": true, - "id": "pineconeUpsert_0-input-pineconeNamespace-string" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", - "additionalParams": true, - "optional": true, - "id": "pineconeUpsert_0-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Document", - "name": "document", - "type": "Document", - "list": true, - "id": "pineconeUpsert_0-input-document-Document" - }, - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "pineconeUpsert_0-input-embeddings-Embeddings" - } - ], - "inputs": { - "document": ["{{pdfFile_0.data.instance}}", "{{textFile_0.data.instance}}"], - "embeddings": "{{openAIEmbeddings_1.data.instance}}", - "pineconeEnv": "northamerica-northeast1-gcp", - "pineconeIndex": "myindex", - "pineconeNamespace": "my-namespace" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "pineconeUpsert_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Pinecone Retriever", - "type": "Pinecone | VectorStoreRetriever | BaseRetriever" - }, - { - "id": "pineconeUpsert_0-output-vectorStore-Pinecone|VectorStore", - "name": "vectorStore", - "label": "Pinecone Vector Store", - "type": "Pinecone | VectorStore" - } - ], - "default": "retriever" - } - ], - "outputs": { - "output": "retriever" - }, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1161.8813042660154, - "y": 537.0216614326227 - }, - "dragging": false - }, - { - "width": 300, - "height": 280, + "height": 480, "id": "conversationalRetrievalQAChain_0", "position": { "x": 1570.3859788160953, @@ -636,7 +290,7 @@ } ], "inputs": { - "model": "{{openAI_1.data.instance}}", + "model": "{{chatOpenAI_0.data.instance}}", "vectorStoreRetriever": "{{pineconeUpsert_0.data.instance}}" }, "outputAnchors": [ @@ -656,6 +310,349 @@ "y": 423.6687850109136 }, "dragging": false + }, + { + "width": 300, + "height": 555, + "id": "pineconeUpsert_0", + "position": { + "x": 1161.2426252201622, + "y": 549.7917156049002 + }, + "type": "customNode", + "data": { + "id": "pineconeUpsert_0", + "label": "Pinecone Upsert Document", + "name": "pineconeUpsert", + "type": "Pinecone", + "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Upsert documents to Pinecone", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["pineconeApi"], + "id": "pineconeUpsert_0-input-credential-credential" + }, + { + "label": "Pinecone Index", + "name": "pineconeIndex", + "type": "string", + "id": "pineconeUpsert_0-input-pineconeIndex-string" + }, + { + "label": "Pinecone Namespace", + "name": "pineconeNamespace", + "type": "string", + "placeholder": "my-first-namespace", + "additionalParams": true, + "optional": true, + "id": "pineconeUpsert_0-input-pineconeNamespace-string" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "pineconeUpsert_0-input-topK-number" + } + ], + "inputAnchors": [ + { + "label": "Document", + "name": "document", + "type": "Document", + "list": true, + "id": "pineconeUpsert_0-input-document-Document" + }, + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "pineconeUpsert_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "document": ["{{textFile_0.data.instance}}", "{{pdfFile_0.data.instance}}"], + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "pineconeIndex": "", + "pineconeNamespace": "", + "topK": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "pineconeUpsert_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Pinecone Retriever", + "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "pineconeUpsert_0-output-vectorStore-Pinecone|VectorStore", + "name": "vectorStore", + "label": "Pinecone Vector Store", + "type": "Pinecone | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "retriever" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1161.2426252201622, + "y": 549.7917156049002 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 1164.9667590264419, + "y": -44.2076264967032 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1164.9667590264419, + "y": -44.2076264967032 + }, + "dragging": false + }, + { + "width": 300, + "height": 329, + "id": "openAIEmbeddings_0", + "position": { + "x": 772.0706424639393, + "y": 862.6189553323906 + }, + "type": "customNode", + "data": { + "id": "openAIEmbeddings_0", + "label": "OpenAI Embeddings", + "name": "openAIEmbeddings", + "type": "OpenAIEmbeddings", + "baseClasses": ["OpenAIEmbeddings", "Embeddings"], + "category": "Embeddings", + "description": "OpenAI API to generate embeddings for a given text", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_0-input-credential-credential" + }, + { + "label": "Strip New Lines", + "name": "stripNewLines", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-stripNewLines-boolean" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "stripNewLines": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 772.0706424639393, + "y": 862.6189553323906 + }, + "dragging": false } ], "edges": [ @@ -682,23 +679,12 @@ } }, { - "source": "openAIEmbeddings_1", - "sourceHandle": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", "target": "pineconeUpsert_0", "targetHandle": "pineconeUpsert_0-input-embeddings-Embeddings", "type": "buttonedge", - "id": "openAIEmbeddings_1-openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeUpsert_0-pineconeUpsert_0-input-embeddings-Embeddings", - "data": { - "label": "" - } - }, - { - "source": "pdfFile_0", - "sourceHandle": "pdfFile_0-output-pdfFile-Document", - "target": "pineconeUpsert_0", - "targetHandle": "pineconeUpsert_0-input-document-Document", - "type": "buttonedge", - "id": "pdfFile_0-pdfFile_0-output-pdfFile-Document-pineconeUpsert_0-pineconeUpsert_0-input-document-Document", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeUpsert_0-pineconeUpsert_0-input-embeddings-Embeddings", "data": { "label": "" } @@ -715,12 +701,23 @@ } }, { - "source": "openAI_1", - "sourceHandle": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", + "source": "pdfFile_0", + "sourceHandle": "pdfFile_0-output-pdfFile-Document", + "target": "pineconeUpsert_0", + "targetHandle": "pineconeUpsert_0-input-document-Document", + "type": "buttonedge", + "id": "pdfFile_0-pdfFile_0-output-pdfFile-Document-pineconeUpsert_0-pineconeUpsert_0-input-document-Document", + "data": { + "label": "" + } + }, + { + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "conversationalRetrievalQAChain_0", "targetHandle": "conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "openAI_1-openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/Multi Prompt Chain.json b/packages/server/marketplaces/chatflows/Multi Prompt Chain.json index 339476e7..06684ac0 100644 --- a/packages/server/marketplaces/chatflows/Multi Prompt Chain.json +++ b/packages/server/marketplaces/chatflows/Multi Prompt Chain.json @@ -263,11 +263,11 @@ }, { "width": 300, - "height": 524, + "height": 523, "id": "chatOpenAI_0", "position": { - "x": 1230.07368145571, - "y": -296.44522826934826 + "x": 1228.4059611466973, + "y": -326.46419383157513 }, "type": "customNode", "data": { @@ -275,15 +275,16 @@ "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" }, { "label": "Model Name", @@ -392,14 +393,15 @@ "topP": "", "frequencyPenalty": "", "presencePenalty": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "outputs": {}, @@ -407,8 +409,8 @@ }, "selected": false, "positionAbsolute": { - "x": 1230.07368145571, - "y": -296.44522826934826 + "x": 1228.4059611466973, + "y": -326.46419383157513 }, "dragging": false } @@ -449,11 +451,11 @@ }, { "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "multiPromptChain_0", "targetHandle": "multiPromptChain_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-multiPromptChain_0-multiPromptChain_0-input-model-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-multiPromptChain_0-multiPromptChain_0-input-model-BaseLanguageModel", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/Multi Retrieval QA Chain.json b/packages/server/marketplaces/chatflows/Multi Retrieval QA Chain.json index 04df2fee..356e26e5 100644 --- a/packages/server/marketplaces/chatflows/Multi Retrieval QA Chain.json +++ b/packages/server/marketplaces/chatflows/Multi Retrieval QA Chain.json @@ -3,7 +3,7 @@ "nodes": [ { "width": 300, - "height": 504, + "height": 505, "id": "vectorStoreRetriever_0", "position": { "x": 712.9322670298264, @@ -69,7 +69,7 @@ }, { "width": 300, - "height": 279, + "height": 377, "id": "multiRetrievalQAChain_0", "position": { "x": 1563.0150452201099, @@ -135,7 +135,7 @@ }, { "width": 300, - "height": 504, + "height": 505, "id": "vectorStoreRetriever_1", "position": { "x": 711.4902931206071, @@ -201,7 +201,7 @@ }, { "width": 300, - "height": 504, + "height": 505, "id": "vectorStoreRetriever_2", "position": { "x": 706.0716220151372, @@ -265,13 +265,406 @@ }, "dragging": false }, + { + "width": 300, + "height": 505, + "id": "pineconeExistingIndex_0", + "position": { + "x": 267.45589163840236, + "y": -300.13817634747346 + }, + "type": "customNode", + "data": { + "id": "pineconeExistingIndex_0", + "label": "Pinecone Load Existing Index", + "name": "pineconeExistingIndex", + "type": "Pinecone", + "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Pinecone (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["pineconeApi"], + "id": "pineconeExistingIndex_0-input-credential-credential" + }, + { + "label": "Pinecone Index", + "name": "pineconeIndex", + "type": "string", + "id": "pineconeExistingIndex_0-input-pineconeIndex-string" + }, + { + "label": "Pinecone Namespace", + "name": "pineconeNamespace", + "type": "string", + "placeholder": "my-first-namespace", + "additionalParams": true, + "optional": true, + "id": "pineconeExistingIndex_0-input-pineconeNamespace-string" + }, + { + "label": "Pinecone Metadata Filter", + "name": "pineconeMetadataFilter", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "pineconeExistingIndex_0-input-pineconeMetadataFilter-json" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "pineconeExistingIndex_0-input-topK-number" + } + ], + "inputAnchors": [ + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "pineconeExistingIndex_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "pineconeIndex": "", + "pineconeNamespace": "", + "pineconeMetadataFilter": "", + "topK": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Pinecone Retriever", + "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", + "name": "vectorStore", + "label": "Pinecone Vector Store", + "type": "Pinecone | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "vectorStore" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 267.45589163840236, + "y": -300.13817634747346 + }, + "dragging": false + }, + { + "width": 300, + "height": 506, + "id": "chromaExistingIndex_0", + "position": { + "x": 264.5271545331116, + "y": 246.32716342844174 + }, + "type": "customNode", + "data": { + "id": "chromaExistingIndex_0", + "label": "Chroma Load Existing Index", + "name": "chromaExistingIndex", + "type": "Chroma", + "baseClasses": ["Chroma", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Chroma (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Collection Name", + "name": "collectionName", + "type": "string", + "id": "chromaExistingIndex_0-input-collectionName-string" + }, + { + "label": "Chroma URL", + "name": "chromaURL", + "type": "string", + "optional": true, + "id": "chromaExistingIndex_0-input-chromaURL-string" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "chromaExistingIndex_0-input-topK-number" + } + ], + "inputAnchors": [ + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "chromaExistingIndex_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "collectionName": "", + "chromaURL": "", + "topK": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "chromaExistingIndex_0-output-retriever-Chroma|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Chroma Retriever", + "type": "Chroma | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "chromaExistingIndex_0-output-vectorStore-Chroma|VectorStore", + "name": "vectorStore", + "label": "Chroma Vector Store", + "type": "Chroma | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "vectorStore" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 264.5271545331116, + "y": 246.32716342844174 + }, + "dragging": false + }, + { + "width": 300, + "height": 329, + "id": "openAIEmbeddings_0", + "position": { + "x": -212.46977797044045, + "y": 252.45726960585722 + }, + "type": "customNode", + "data": { + "id": "openAIEmbeddings_0", + "label": "OpenAI Embeddings", + "name": "openAIEmbeddings", + "type": "OpenAIEmbeddings", + "baseClasses": ["OpenAIEmbeddings", "Embeddings"], + "category": "Embeddings", + "description": "OpenAI API to generate embeddings for a given text", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_0-input-credential-credential" + }, + { + "label": "Strip New Lines", + "name": "stripNewLines", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-stripNewLines-boolean" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "stripNewLines": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": -212.46977797044045, + "y": 252.45726960585722 + }, + "dragging": false + }, + { + "width": 300, + "height": 702, + "id": "supabaseExistingIndex_0", + "position": { + "x": 270.90499551102573, + "y": 783.5053782099461 + }, + "type": "customNode", + "data": { + "id": "supabaseExistingIndex_0", + "label": "Supabase Load Existing Index", + "name": "supabaseExistingIndex", + "type": "Supabase", + "baseClasses": ["Supabase", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Supabase (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["supabaseApi"], + "id": "supabaseExistingIndex_0-input-credential-credential" + }, + { + "label": "Supabase Project URL", + "name": "supabaseProjUrl", + "type": "string", + "id": "supabaseExistingIndex_0-input-supabaseProjUrl-string" + }, + { + "label": "Table Name", + "name": "tableName", + "type": "string", + "id": "supabaseExistingIndex_0-input-tableName-string" + }, + { + "label": "Query Name", + "name": "queryName", + "type": "string", + "id": "supabaseExistingIndex_0-input-queryName-string" + }, + { + "label": "Supabase Metadata Filter", + "name": "supabaseMetadataFilter", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "supabaseExistingIndex_0-input-supabaseMetadataFilter-json" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "supabaseExistingIndex_0-input-topK-number" + } + ], + "inputAnchors": [ + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "supabaseExistingIndex_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "supabaseProjUrl": "", + "tableName": "", + "queryName": "", + "supabaseMetadataFilter": "", + "topK": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "supabaseExistingIndex_0-output-retriever-Supabase|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Supabase Retriever", + "type": "Supabase | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "supabaseExistingIndex_0-output-vectorStore-Supabase|VectorStore", + "name": "vectorStore", + "label": "Supabase Vector Store", + "type": "Supabase | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "vectorStore" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 270.90499551102573, + "y": 783.5053782099461 + }, + "dragging": false + }, { "width": 300, "height": 523, "id": "chatOpenAI_0", "position": { - "x": 1206.027762600755, - "y": -212.35338654620222 + "x": 1154.0989175770958, + "y": -255.77769163789395 }, "type": "customNode", "data": { @@ -279,15 +672,16 @@ "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" }, { "label": "Model Name", @@ -396,14 +790,15 @@ "topP": "", "frequencyPenalty": "", "presencePenalty": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "outputs": {}, @@ -411,401 +806,8 @@ }, "selected": false, "positionAbsolute": { - "x": 1206.027762600755, - "y": -212.35338654620222 - }, - "dragging": false - }, - { - "width": 300, - "height": 329, - "id": "openAIEmbeddings_0", - "position": { - "x": -254.88737984323413, - "y": 279.72801937636154 - }, - "type": "customNode", - "data": { - "id": "openAIEmbeddings_0", - "label": "OpenAI Embeddings", - "name": "openAIEmbeddings", - "type": "OpenAIEmbeddings", - "baseClasses": ["OpenAIEmbeddings", "Embeddings"], - "category": "Embeddings", - "description": "OpenAI API to generate embeddings for a given text", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_0-input-openAIApiKey-password" - }, - { - "label": "Strip New Lines", - "name": "stripNewLines", - "type": "boolean", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_0-input-stripNewLines-boolean" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_0-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_0-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_0-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "stripNewLines": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "name": "openAIEmbeddings", - "label": "OpenAIEmbeddings", - "type": "OpenAIEmbeddings | Embeddings" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": -254.88737984323413, - "y": 279.72801937636154 - }, - "dragging": false - }, - { - "width": 300, - "height": 603, - "id": "pineconeExistingIndex_0", - "position": { - "x": 271.2513182410521, - "y": -410.32709109501735 - }, - "type": "customNode", - "data": { - "id": "pineconeExistingIndex_0", - "label": "Pinecone Load Existing Index", - "name": "pineconeExistingIndex", - "type": "Pinecone", - "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Load existing index from Pinecone (i.e: Document has been upserted)", - "inputParams": [ - { - "label": "Pinecone Api Key", - "name": "pineconeApiKey", - "type": "password", - "id": "pineconeExistingIndex_0-input-pineconeApiKey-password" - }, - { - "label": "Pinecone Environment", - "name": "pineconeEnv", - "type": "string", - "id": "pineconeExistingIndex_0-input-pineconeEnv-string" - }, - { - "label": "Pinecone Index", - "name": "pineconeIndex", - "type": "string", - "id": "pineconeExistingIndex_0-input-pineconeIndex-string" - }, - { - "label": "Pinecone Namespace", - "name": "pineconeNamespace", - "type": "string", - "placeholder": "my-first-namespace", - "optional": true, - "additionalParams": true, - "id": "pineconeExistingIndex_0-input-pineconeNamespace-string" - }, - { - "label": "Pinecone Metadata Filter", - "name": "pineconeMetadataFilter", - "type": "json", - "optional": true, - "additionalParams": true, - "id": "pineconeExistingIndex_0-input-pineconeMetadataFilter-json" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", - "additionalParams": true, - "optional": true, - "id": "pineconeExistingIndex_0-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "pineconeExistingIndex_0-input-embeddings-Embeddings" - } - ], - "inputs": { - "embeddings": "{{openAIEmbeddings_0.data.instance}}", - "pineconeEnv": "", - "pineconeIndex": "", - "pineconeNamespace": "", - "pineconeMetadataFilter": "" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Pinecone Retriever", - "type": "Pinecone | VectorStoreRetriever | BaseRetriever" - }, - { - "id": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", - "name": "vectorStore", - "label": "Pinecone Vector Store", - "type": "Pinecone | VectorStore" - } - ], - "default": "retriever" - } - ], - "outputs": { - "output": "vectorStore" - }, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 271.2513182410521, - "y": -410.32709109501735 - }, - "dragging": false - }, - { - "width": 300, - "height": 505, - "id": "chromaExistingIndex_0", - "position": { - "x": 269.2940530300552, - "y": 262.41814510537796 - }, - "type": "customNode", - "data": { - "id": "chromaExistingIndex_0", - "label": "Chroma Load Existing Index", - "name": "chromaExistingIndex", - "type": "Chroma", - "baseClasses": ["Chroma", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Load existing index from Chroma (i.e: Document has been upserted)", - "inputParams": [ - { - "label": "Collection Name", - "name": "collectionName", - "type": "string", - "id": "chromaExistingIndex_0-input-collectionName-string" - }, - { - "label": "Chroma URL", - "name": "chromaURL", - "type": "string", - "optional": true, - "id": "chromaExistingIndex_0-input-chromaURL-string" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", - "additionalParams": true, - "optional": true, - "id": "chromaExistingIndex_0-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "chromaExistingIndex_0-input-embeddings-Embeddings" - } - ], - "inputs": { - "embeddings": "{{openAIEmbeddings_0.data.instance}}", - "collectionName": "", - "chromaURL": "" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "chromaExistingIndex_0-output-retriever-Chroma|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Chroma Retriever", - "type": "Chroma | VectorStoreRetriever | BaseRetriever" - }, - { - "id": "chromaExistingIndex_0-output-vectorStore-Chroma|VectorStore", - "name": "vectorStore", - "label": "Chroma Vector Store", - "type": "Chroma | VectorStore" - } - ], - "default": "retriever" - } - ], - "outputs": { - "output": "vectorStore" - }, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 269.2940530300552, - "y": 262.41814510537796 - }, - "dragging": false - }, - { - "width": 300, - "height": 702, - "id": "supabaseExistingIndex_0", - "position": { - "x": 273.7097153973373, - "y": 821.872758974335 - }, - "type": "customNode", - "data": { - "id": "supabaseExistingIndex_0", - "label": "Supabase Load Existing Index", - "name": "supabaseExistingIndex", - "type": "Supabase", - "baseClasses": ["Supabase", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Load existing index from Supabase (i.e: Document has been upserted)", - "inputParams": [ - { - "label": "Supabase API Key", - "name": "supabaseApiKey", - "type": "password", - "id": "supabaseExistingIndex_0-input-supabaseApiKey-password" - }, - { - "label": "Supabase Project URL", - "name": "supabaseProjUrl", - "type": "string", - "id": "supabaseExistingIndex_0-input-supabaseProjUrl-string" - }, - { - "label": "Table Name", - "name": "tableName", - "type": "string", - "id": "supabaseExistingIndex_0-input-tableName-string" - }, - { - "label": "Query Name", - "name": "queryName", - "type": "string", - "id": "supabaseExistingIndex_0-input-queryName-string" - }, - { - "label": "Supabase Metadata Filter", - "name": "supabaseMetadataFilter", - "type": "json", - "optional": true, - "additionalParams": true, - "id": "supabaseExistingIndex_0-input-supabaseMetadataFilter-json" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", - "additionalParams": true, - "optional": true, - "id": "supabaseExistingIndex_0-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "supabaseExistingIndex_0-input-embeddings-Embeddings" - } - ], - "inputs": { - "embeddings": "{{openAIEmbeddings_0.data.instance}}", - "supabaseProjUrl": "", - "tableName": "", - "queryName": "", - "supabaseMetadataFilter": "" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "supabaseExistingIndex_0-output-retriever-Supabase|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Supabase Retriever", - "type": "Supabase | VectorStoreRetriever | BaseRetriever" - }, - { - "id": "supabaseExistingIndex_0-output-vectorStore-Supabase|VectorStore", - "name": "vectorStore", - "label": "Supabase Vector Store", - "type": "Supabase | VectorStore" - } - ], - "default": "retriever" - } - ], - "outputs": { - "output": "vectorStore" - }, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 273.7097153973373, - "y": 821.872758974335 + "x": 1154.0989175770958, + "y": -255.77769163789395 }, "dragging": false } @@ -844,17 +846,6 @@ "label": "" } }, - { - "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "target": "multiRetrievalQAChain_0", - "targetHandle": "multiRetrievalQAChain_0-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-multiRetrievalQAChain_0-multiRetrievalQAChain_0-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, { "source": "pineconeExistingIndex_0", "sourceHandle": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", @@ -866,17 +857,6 @@ "label": "" } }, - { - "source": "openAIEmbeddings_0", - "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "target": "pineconeExistingIndex_0", - "targetHandle": "pineconeExistingIndex_0-input-embeddings-Embeddings", - "type": "buttonedge", - "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_0-pineconeExistingIndex_0-input-embeddings-Embeddings", - "data": { - "label": "" - } - }, { "source": "chromaExistingIndex_0", "sourceHandle": "chromaExistingIndex_0-output-vectorStore-Chroma|VectorStore", @@ -888,6 +868,17 @@ "label": "" } }, + { + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "pineconeExistingIndex_0", + "targetHandle": "pineconeExistingIndex_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_0-pineconeExistingIndex_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, { "source": "openAIEmbeddings_0", "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", @@ -920,6 +911,17 @@ "data": { "label": "" } + }, + { + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "multiRetrievalQAChain_0", + "targetHandle": "multiRetrievalQAChain_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-multiRetrievalQAChain_0-multiRetrievalQAChain_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } } ] } diff --git a/packages/server/marketplaces/chatflows/Multiple VectorDB.json b/packages/server/marketplaces/chatflows/Multiple VectorDB.json index 05f7ca5e..3822931a 100644 --- a/packages/server/marketplaces/chatflows/Multiple VectorDB.json +++ b/packages/server/marketplaces/chatflows/Multiple VectorDB.json @@ -1,13 +1,650 @@ { "description": "Use the agent to choose between multiple different vector databases, with the ability to use other tools", "nodes": [ + { + "width": 300, + "height": 602, + "id": "chainTool_2", + "position": { + "x": 1251.240972921597, + "y": -922.9180420195128 + }, + "type": "customNode", + "data": { + "id": "chainTool_2", + "label": "Chain Tool", + "name": "chainTool", + "type": "ChainTool", + "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"], + "category": "Tools", + "description": "Use a chain as allowed tool for agent", + "inputParams": [ + { + "label": "Chain Name", + "name": "name", + "type": "string", + "placeholder": "state-of-union-qa", + "id": "chainTool_2-input-name-string" + }, + { + "label": "Chain Description", + "name": "description", + "type": "string", + "rows": 3, + "placeholder": "State of the Union QA - useful for when you need to ask questions about the most recent state of the union address.", + "id": "chainTool_2-input-description-string" + }, + { + "label": "Return Direct", + "name": "returnDirect", + "type": "boolean", + "optional": true, + "id": "chainTool_2-input-returnDirect-boolean" + } + ], + "inputAnchors": [ + { + "label": "Base Chain", + "name": "baseChain", + "type": "BaseChain", + "id": "chainTool_2-input-baseChain-BaseChain" + } + ], + "inputs": { + "name": "ai-paper-qa", + "description": "AI Paper QA - useful for when you need to ask questions about the AI-Generated Content paper.", + "returnDirect": "", + "baseChain": "{{retrievalQAChain_0.data.instance}}" + }, + "outputAnchors": [ + { + "id": "chainTool_2-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool|BaseLangChain", + "name": "chainTool", + "label": "ChainTool", + "type": "ChainTool | DynamicTool | Tool | StructuredTool | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1251.240972921597, + "y": -922.9180420195128 + }, + "dragging": false + }, + { + "width": 300, + "height": 602, + "id": "chainTool_3", + "position": { + "x": 1267.7142132085273, + "y": -85.7749282485849 + }, + "type": "customNode", + "data": { + "id": "chainTool_3", + "label": "Chain Tool", + "name": "chainTool", + "type": "ChainTool", + "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"], + "category": "Tools", + "description": "Use a chain as allowed tool for agent", + "inputParams": [ + { + "label": "Chain Name", + "name": "name", + "type": "string", + "placeholder": "state-of-union-qa", + "id": "chainTool_3-input-name-string" + }, + { + "label": "Chain Description", + "name": "description", + "type": "string", + "rows": 3, + "placeholder": "State of the Union QA - useful for when you need to ask questions about the most recent state of the union address.", + "id": "chainTool_3-input-description-string" + }, + { + "label": "Return Direct", + "name": "returnDirect", + "type": "boolean", + "optional": true, + "id": "chainTool_3-input-returnDirect-boolean" + } + ], + "inputAnchors": [ + { + "label": "Base Chain", + "name": "baseChain", + "type": "BaseChain", + "id": "chainTool_3-input-baseChain-BaseChain" + } + ], + "inputs": { + "name": "state-of-union-qa", + "description": "State of the Union QA - useful for when you need to ask questions about the most recent state of the union address.", + "returnDirect": "", + "baseChain": "{{retrievalQAChain_1.data.instance}}" + }, + "outputAnchors": [ + { + "id": "chainTool_3-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool|BaseLangChain", + "name": "chainTool", + "label": "ChainTool", + "type": "ChainTool | DynamicTool | Tool | StructuredTool | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 1267.7142132085273, + "y": -85.7749282485849 + } + }, + { + "width": 300, + "height": 280, + "id": "mrklAgentLLM_0", + "position": { + "x": 2061.891333395338, + "y": -140.0694021759809 + }, + "type": "customNode", + "data": { + "id": "mrklAgentLLM_0", + "label": "MRKL Agent for LLMs", + "name": "mrklAgentLLM", + "type": "AgentExecutor", + "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], + "category": "Agents", + "description": "Agent that uses the ReAct Framework to decide what action to take, optimized to be used with LLMs", + "inputParams": [], + "inputAnchors": [ + { + "label": "Allowed Tools", + "name": "tools", + "type": "Tool", + "list": true, + "id": "mrklAgentLLM_0-input-tools-Tool" + }, + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "mrklAgentLLM_0-input-model-BaseLanguageModel" + } + ], + "inputs": { + "tools": ["{{chainTool_2.data.instance}}", "{{chainTool_3.data.instance}}"], + "model": "{{openAI_4.data.instance}}" + }, + "outputAnchors": [ + { + "id": "mrklAgentLLM_0-output-mrklAgentLLM-AgentExecutor|BaseChain|BaseLangChain", + "name": "mrklAgentLLM", + "label": "AgentExecutor", + "type": "AgentExecutor | BaseChain | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 2061.891333395338, + "y": -140.0694021759809 + }, + "dragging": false + }, + { + "width": 300, + "height": 280, + "id": "retrievalQAChain_0", + "position": { + "x": 898.1253096948574, + "y": -859.1174013418433 + }, + "type": "customNode", + "data": { + "id": "retrievalQAChain_0", + "label": "Retrieval QA Chain", + "name": "retrievalQAChain", + "type": "RetrievalQAChain", + "baseClasses": ["RetrievalQAChain", "BaseChain", "BaseLangChain"], + "category": "Chains", + "description": "QA chain to answer a question based on the retrieved documents", + "inputParams": [], + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "retrievalQAChain_0-input-model-BaseLanguageModel" + }, + { + "label": "Vector Store Retriever", + "name": "vectorStoreRetriever", + "type": "BaseRetriever", + "id": "retrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever" + } + ], + "inputs": { + "model": "{{openAI_2.data.instance}}", + "vectorStoreRetriever": "{{chromaExistingIndex_0.data.instance}}" + }, + "outputAnchors": [ + { + "id": "retrievalQAChain_0-output-retrievalQAChain-RetrievalQAChain|BaseChain|BaseLangChain", + "name": "retrievalQAChain", + "label": "RetrievalQAChain", + "type": "RetrievalQAChain | BaseChain | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 898.1253096948574, + "y": -859.1174013418433 + }, + "dragging": false + }, + { + "width": 300, + "height": 280, + "id": "retrievalQAChain_1", + "position": { + "x": 895.4349543765911, + "y": 166.60331503487222 + }, + "type": "customNode", + "data": { + "id": "retrievalQAChain_1", + "label": "Retrieval QA Chain", + "name": "retrievalQAChain", + "type": "RetrievalQAChain", + "baseClasses": ["RetrievalQAChain", "BaseChain", "BaseLangChain"], + "category": "Chains", + "description": "QA chain to answer a question based on the retrieved documents", + "inputParams": [], + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "retrievalQAChain_1-input-model-BaseLanguageModel" + }, + { + "label": "Vector Store Retriever", + "name": "vectorStoreRetriever", + "type": "BaseRetriever", + "id": "retrievalQAChain_1-input-vectorStoreRetriever-BaseRetriever" + } + ], + "inputs": { + "model": "{{openAI_3.data.instance}}", + "vectorStoreRetriever": "{{pineconeExistingIndex_0.data.instance}}" + }, + "outputAnchors": [ + { + "id": "retrievalQAChain_1-output-retrievalQAChain-RetrievalQAChain|BaseChain|BaseLangChain", + "name": "retrievalQAChain", + "label": "RetrievalQAChain", + "type": "RetrievalQAChain | BaseChain | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 895.4349543765911, + "y": 166.60331503487222 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "openAI_2", + "position": { + "x": 520.8471510168988, + "y": -1282.1183473852964 + }, + "type": "customNode", + "data": { + "id": "openAI_2", + "label": "OpenAI", + "name": "openAI", + "type": "OpenAI", + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], + "category": "LLMs", + "description": "Wrapper around OpenAI large language models", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAI_2-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "text-davinci-003", + "name": "text-davinci-003" + }, + { + "label": "text-davinci-002", + "name": "text-davinci-002" + }, + { + "label": "text-curie-001", + "name": "text-curie-001" + }, + { + "label": "text-babbage-001", + "name": "text-babbage-001" + } + ], + "default": "text-davinci-003", + "optional": true, + "id": "openAI_2-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.7, + "optional": true, + "id": "openAI_2-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_2-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_2-input-topP-number" + }, + { + "label": "Best Of", + "name": "bestOf", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_2-input-bestOf-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_2-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_2-input-presencePenalty-number" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_2-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_2-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAI_2-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "text-davinci-003", + "temperature": 0.7, + "maxTokens": "", + "topP": "", + "bestOf": "", + "frequencyPenalty": "", + "presencePenalty": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAI_2-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "name": "openAI", + "label": "OpenAI", + "type": "OpenAI | BaseLLM | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 520.8471510168988, + "y": -1282.1183473852964 + }, + "dragging": false + }, + { + "width": 300, + "height": 329, + "id": "openAIEmbeddings_1", + "position": { + "x": 148.65789308409916, + "y": -915.1982675859331 + }, + "type": "customNode", + "data": { + "id": "openAIEmbeddings_1", + "label": "OpenAI Embeddings", + "name": "openAIEmbeddings", + "type": "OpenAIEmbeddings", + "baseClasses": ["OpenAIEmbeddings", "Embeddings"], + "category": "Embeddings", + "description": "OpenAI API to generate embeddings for a given text", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_1-input-credential-credential" + }, + { + "label": "Strip New Lines", + "name": "stripNewLines", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_1-input-stripNewLines-boolean" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_1-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_1-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_1-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "stripNewLines": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 148.65789308409916, + "y": -915.1982675859331 + }, + "dragging": false + }, + { + "width": 300, + "height": 506, + "id": "chromaExistingIndex_0", + "position": { + "x": 509.55198017578016, + "y": -732.42003311752 + }, + "type": "customNode", + "data": { + "id": "chromaExistingIndex_0", + "label": "Chroma Load Existing Index", + "name": "chromaExistingIndex", + "type": "Chroma", + "baseClasses": ["Chroma", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Chroma (i.e: Document has been upserted)", + "inputParams": [ + { + "label": "Collection Name", + "name": "collectionName", + "type": "string", + "id": "chromaExistingIndex_0-input-collectionName-string" + }, + { + "label": "Chroma URL", + "name": "chromaURL", + "type": "string", + "optional": true, + "id": "chromaExistingIndex_0-input-chromaURL-string" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "chromaExistingIndex_0-input-topK-number" + } + ], + "inputAnchors": [ + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "chromaExistingIndex_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "embeddings": "{{openAIEmbeddings_1.data.instance}}", + "collectionName": "", + "chromaURL": "", + "topK": "" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "chromaExistingIndex_0-output-retriever-Chroma|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Chroma Retriever", + "type": "Chroma | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "chromaExistingIndex_0-output-vectorStore-Chroma|VectorStore", + "name": "vectorStore", + "label": "Chroma Vector Store", + "type": "Chroma | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "retriever" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 509.55198017578016, + "y": -732.42003311752 + }, + "dragging": false + }, { "width": 300, "height": 329, "id": "openAIEmbeddings_2", "position": { - "x": 155.07832615625986, - "y": -778.383353751991 + "x": 128.85404348918783, + "y": 155.96043384682295 }, "type": "customNode", "data": { @@ -20,10 +657,11 @@ "description": "OpenAI API to generate embeddings for a given text", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_2-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_2-input-credential-credential" }, { "label": "Strip New Lines", @@ -62,7 +700,8 @@ "inputs": { "stripNewLines": "", "batchSize": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { @@ -77,106 +716,18 @@ }, "selected": false, "positionAbsolute": { - "x": 155.07832615625986, - "y": -778.383353751991 + "x": 128.85404348918783, + "y": 155.96043384682295 }, "dragging": false }, - { - "width": 300, - "height": 505, - "id": "chromaExistingIndex_1", - "position": { - "x": 522.8177328694987, - "y": -723.8834555183237 - }, - "type": "customNode", - "data": { - "id": "chromaExistingIndex_1", - "label": "Chroma Load Existing Index", - "name": "chromaExistingIndex", - "type": "Chroma", - "baseClasses": ["Chroma", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Load existing index from Chroma (i.e: Document has been upserted)", - "inputParams": [ - { - "label": "Collection Name", - "name": "collectionName", - "type": "string", - "id": "chromaExistingIndex_1-input-collectionName-string" - }, - { - "label": "Chroma URL", - "name": "chromaURL", - "type": "string", - "optional": true, - "id": "chromaExistingIndex_1-input-chromaURL-string" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", - "additionalParams": true, - "optional": true, - "id": "chromaExistingIndex_1-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "chromaExistingIndex_1-input-embeddings-Embeddings" - } - ], - "inputs": { - "embeddings": "{{openAIEmbeddings_2.data.instance}}", - "collectionName": "ai-paper" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "chromaExistingIndex_1-output-retriever-Chroma|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Chroma Retriever", - "type": "Chroma | VectorStoreRetriever | BaseRetriever" - }, - { - "id": "chromaExistingIndex_1-output-vectorStore-Chroma|VectorStore", - "name": "vectorStore", - "label": "Chroma Vector Store", - "type": "Chroma | VectorStore" - } - ], - "default": "retriever" - } - ], - "outputs": { - "output": "retriever" - }, - "selected": false - }, - "positionAbsolute": { - "x": 522.8177328694987, - "y": -723.8834555183237 - }, - "selected": false, - "dragging": false - }, { "width": 300, "height": 523, "id": "openAI_3", "position": { - "x": 527.7101375911075, - "y": -1290.6752949922043 + "x": 504.808358369027, + "y": -197.78194663790197 }, "type": "customNode", "data": { @@ -184,15 +735,16 @@ "label": "OpenAI", "name": "openAI", "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", "description": "Wrapper around OpenAI large language models", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_3-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAI_3-input-credential-credential" }, { "label": "Model Name", @@ -303,260 +855,132 @@ "frequencyPenalty": "", "presencePenalty": "", "batchSize": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "openAI_3-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", + "id": "openAI_3-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "name": "openAI", "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" + "type": "OpenAI | BaseLLM | BaseLanguageModel" } ], "outputs": {}, "selected": false }, - "positionAbsolute": { - "x": 527.7101375911075, - "y": -1290.6752949922043 - }, "selected": false, + "positionAbsolute": { + "x": 504.808358369027, + "y": -197.78194663790197 + }, "dragging": false }, { "width": 300, - "height": 601, - "id": "chainTool_2", + "height": 505, + "id": "pineconeExistingIndex_0", "position": { - "x": 1251.240972921597, - "y": -922.9180420195128 + "x": 507.5206146177215, + "y": 343.07818128024616 }, "type": "customNode", "data": { - "id": "chainTool_2", - "label": "Chain Tool", - "name": "chainTool", - "type": "ChainTool", - "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"], - "category": "Tools", - "description": "Use a chain as allowed tool for agent", + "id": "pineconeExistingIndex_0", + "label": "Pinecone Load Existing Index", + "name": "pineconeExistingIndex", + "type": "Pinecone", + "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Load existing index from Pinecone (i.e: Document has been upserted)", "inputParams": [ { - "label": "Chain Name", - "name": "name", - "type": "string", - "placeholder": "state-of-union-qa", - "id": "chainTool_2-input-name-string" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["pineconeApi"], + "id": "pineconeExistingIndex_0-input-credential-credential" }, { - "label": "Chain Description", - "name": "description", + "label": "Pinecone Index", + "name": "pineconeIndex", "type": "string", - "rows": 3, - "placeholder": "State of the Union QA - useful for when you need to ask questions about the most recent state of the union address.", - "id": "chainTool_2-input-description-string" + "id": "pineconeExistingIndex_0-input-pineconeIndex-string" }, { - "label": "Return Direct", - "name": "returnDirect", - "type": "boolean", + "label": "Pinecone Namespace", + "name": "pineconeNamespace", + "type": "string", + "placeholder": "my-first-namespace", + "additionalParams": true, "optional": true, - "id": "chainTool_2-input-returnDirect-boolean" + "id": "pineconeExistingIndex_0-input-pineconeNamespace-string" + }, + { + "label": "Pinecone Metadata Filter", + "name": "pineconeMetadataFilter", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "pineconeExistingIndex_0-input-pineconeMetadataFilter-json" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "pineconeExistingIndex_0-input-topK-number" } ], "inputAnchors": [ { - "label": "Base Chain", - "name": "baseChain", - "type": "BaseChain", - "id": "chainTool_2-input-baseChain-BaseChain" + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "pineconeExistingIndex_0-input-embeddings-Embeddings" } ], "inputs": { - "name": "ai-paper-qa", - "description": "AI Paper QA - useful for when you need to ask questions about the AI-Generated Content paper.", - "returnDirect": "", - "baseChain": "{{retrievalQAChain_0.data.instance}}" + "embeddings": "{{openAIEmbeddings_2.data.instance}}", + "pineconeIndex": "", + "pineconeNamespace": "", + "pineconeMetadataFilter": "", + "topK": "" }, "outputAnchors": [ { - "id": "chainTool_2-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool|BaseLangChain", - "name": "chainTool", - "label": "ChainTool", - "type": "ChainTool | DynamicTool | Tool | StructuredTool | BaseLangChain" + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Pinecone Retriever", + "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "pineconeExistingIndex_0-output-vectorStore-Pinecone|VectorStore", + "name": "vectorStore", + "label": "Pinecone Vector Store", + "type": "Pinecone | VectorStore" + } + ], + "default": "retriever" } ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1251.240972921597, - "y": -922.9180420195128 - }, - "dragging": false - }, - { - "width": 300, - "height": 142, - "id": "calculator_1", - "position": { - "x": 1649.5389102641816, - "y": -835.8729983638877 - }, - "type": "customNode", - "data": { - "id": "calculator_1", - "label": "Calculator", - "name": "calculator", - "type": "Calculator", - "baseClasses": ["Calculator", "Tool", "StructuredTool", "BaseLangChain"], - "category": "Tools", - "description": "Perform calculations on response", - "inputParams": [], - "inputAnchors": [], - "inputs": {}, - "outputAnchors": [ - { - "id": "calculator_1-output-calculator-Calculator|Tool|StructuredTool|BaseLangChain", - "name": "calculator", - "label": "Calculator", - "type": "Calculator | Tool | StructuredTool | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 1649.5389102641816, - "y": -835.8729983638877 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 277, - "id": "serpAPI_0", - "position": { - "x": 1654.5273488033688, - "y": -622.1607096176143 - }, - "type": "customNode", - "data": { - "id": "serpAPI_0", - "label": "Serp API", - "name": "serpAPI", - "type": "SerpAPI", - "baseClasses": ["SerpAPI", "Tool", "StructuredTool", "BaseLangChain"], - "category": "Tools", - "description": "Wrapper around SerpAPI - a real-time API to access Google search results", - "inputParams": [ - { - "label": "Serp Api Key", - "name": "apiKey", - "type": "password", - "id": "serpAPI_0-input-apiKey-password" - } - ], - "inputAnchors": [], - "inputs": {}, - "outputAnchors": [ - { - "id": "serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain", - "name": "serpAPI", - "label": "SerpAPI", - "type": "SerpAPI | Tool | StructuredTool | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1654.5273488033688, - "y": -622.1607096176143 - }, - "dragging": false - }, - { - "width": 300, - "height": 329, - "id": "openAIEmbeddings_3", - "position": { - "x": 163.902196956619, - "y": 318.66096921035574 - }, - "type": "customNode", - "data": { - "id": "openAIEmbeddings_3", - "label": "OpenAI Embeddings", - "name": "openAIEmbeddings", - "type": "OpenAIEmbeddings", - "baseClasses": ["OpenAIEmbeddings", "Embeddings"], - "category": "Embeddings", - "description": "OpenAI API to generate embeddings for a given text", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_3-input-openAIApiKey-password" - }, - { - "label": "Strip New Lines", - "name": "stripNewLines", - "type": "boolean", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_3-input-stripNewLines-boolean" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_3-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_3-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_3-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "stripNewLines": "", - "batchSize": "", - "timeout": "" + "outputs": { + "output": "retriever" }, - "outputAnchors": [ - { - "id": "openAIEmbeddings_3-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "name": "openAIEmbeddings", - "label": "OpenAIEmbeddings", - "type": "OpenAIEmbeddings | Embeddings" - } - ], - "outputs": {}, "selected": false }, "selected": false, "positionAbsolute": { - "x": 163.902196956619, - "y": 318.66096921035574 + "x": 507.5206146177215, + "y": 343.07818128024616 }, "dragging": false }, @@ -565,8 +989,8 @@ "height": 523, "id": "openAI_4", "position": { - "x": 529.8870809493459, - "y": -137.8839994127831 + "x": 1619.5346765785587, + "y": 292.29615581180684 }, "type": "customNode", "data": { @@ -574,15 +998,16 @@ "label": "OpenAI", "name": "openAI", "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", "description": "Wrapper around OpenAI large language models", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_4-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAI_4-input-credential-credential" }, { "label": "Model Name", @@ -693,412 +1118,15 @@ "frequencyPenalty": "", "presencePenalty": "", "batchSize": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "openAI_4-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", + "id": "openAI_4-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "name": "openAI", "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 529.8870809493459, - "y": -137.8839994127831 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 603, - "id": "pineconeExistingIndex_1", - "position": { - "x": 525.6644489497978, - "y": 420.1233379157454 - }, - "type": "customNode", - "data": { - "id": "pineconeExistingIndex_1", - "label": "Pinecone Load Existing Index", - "name": "pineconeExistingIndex", - "type": "Pinecone", - "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Load existing index from Pinecone (i.e: Document has been upserted)", - "inputParams": [ - { - "label": "Pinecone Api Key", - "name": "pineconeApiKey", - "type": "password", - "id": "pineconeExistingIndex_1-input-pineconeApiKey-password" - }, - { - "label": "Pinecone Environment", - "name": "pineconeEnv", - "type": "string", - "id": "pineconeExistingIndex_1-input-pineconeEnv-string" - }, - { - "label": "Pinecone Index", - "name": "pineconeIndex", - "type": "string", - "id": "pineconeExistingIndex_1-input-pineconeIndex-string" - }, - { - "label": "Pinecone Namespace", - "name": "pineconeNamespace", - "type": "string", - "placeholder": "my-first-namespace", - "optional": true, - "additionalParams": true, - "id": "pineconeExistingIndex_1-input-pineconeNamespace-string" - }, - { - "label": "Pinecone Metadata Filter", - "name": "pineconeMetadataFilter", - "type": "json", - "optional": true, - "additionalParams": true, - "id": "pineconeExistingIndex_1-input-pineconeMetadataFilter-json" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", - "additionalParams": true, - "optional": true, - "id": "pineconeExistingIndex_1-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "pineconeExistingIndex_1-input-embeddings-Embeddings" - } - ], - "inputs": { - "embeddings": "{{openAIEmbeddings_3.data.instance}}", - "pineconeEnv": "us-west4-gcp", - "pineconeIndex": "state-of-union", - "pineconeNamespace": "" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "pineconeExistingIndex_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Pinecone Retriever", - "type": "Pinecone | VectorStoreRetriever | BaseRetriever" - }, - { - "id": "pineconeExistingIndex_1-output-vectorStore-Pinecone|VectorStore", - "name": "vectorStore", - "label": "Pinecone Vector Store", - "type": "Pinecone | VectorStore" - } - ], - "default": "retriever" - } - ], - "outputs": { - "output": "retriever" - }, - "selected": false - }, - "selected": false, - "dragging": false, - "positionAbsolute": { - "x": 525.6644489497978, - "y": 420.1233379157454 - } - }, - { - "width": 300, - "height": 601, - "id": "chainTool_3", - "position": { - "x": 1267.7142132085273, - "y": -85.7749282485849 - }, - "type": "customNode", - "data": { - "id": "chainTool_3", - "label": "Chain Tool", - "name": "chainTool", - "type": "ChainTool", - "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"], - "category": "Tools", - "description": "Use a chain as allowed tool for agent", - "inputParams": [ - { - "label": "Chain Name", - "name": "name", - "type": "string", - "placeholder": "state-of-union-qa", - "id": "chainTool_3-input-name-string" - }, - { - "label": "Chain Description", - "name": "description", - "type": "string", - "rows": 3, - "placeholder": "State of the Union QA - useful for when you need to ask questions about the most recent state of the union address.", - "id": "chainTool_3-input-description-string" - }, - { - "label": "Return Direct", - "name": "returnDirect", - "type": "boolean", - "optional": true, - "id": "chainTool_3-input-returnDirect-boolean" - } - ], - "inputAnchors": [ - { - "label": "Base Chain", - "name": "baseChain", - "type": "BaseChain", - "id": "chainTool_3-input-baseChain-BaseChain" - } - ], - "inputs": { - "name": "state-of-union-qa", - "description": "State of the Union QA - useful for when you need to ask questions about the most recent state of the union address.", - "returnDirect": "", - "baseChain": "{{retrievalQAChain_1.data.instance}}" - }, - "outputAnchors": [ - { - "id": "chainTool_3-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool|BaseLangChain", - "name": "chainTool", - "label": "ChainTool", - "type": "ChainTool | DynamicTool | Tool | StructuredTool | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "dragging": false, - "positionAbsolute": { - "x": 1267.7142132085273, - "y": -85.7749282485849 - } - }, - { - "width": 300, - "height": 523, - "id": "openAI_5", - "position": { - "x": 1683.95439713088, - "y": 329.0556949149878 - }, - "type": "customNode", - "data": { - "id": "openAI_5", - "label": "OpenAI", - "name": "openAI", - "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], - "category": "LLMs", - "description": "Wrapper around OpenAI large language models", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_5-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "text-davinci-003", - "name": "text-davinci-003" - }, - { - "label": "text-davinci-002", - "name": "text-davinci-002" - }, - { - "label": "text-curie-001", - "name": "text-curie-001" - }, - { - "label": "text-babbage-001", - "name": "text-babbage-001" - } - ], - "default": "text-davinci-003", - "optional": true, - "id": "openAI_5-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.7, - "optional": true, - "id": "openAI_5-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_5-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_5-input-topP-number" - }, - { - "label": "Best Of", - "name": "bestOf", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_5-input-bestOf-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_5-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_5-input-presencePenalty-number" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_5-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_5-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAI_5-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "text-davinci-003", - "temperature": "0", - "maxTokens": "", - "topP": "", - "bestOf": "", - "frequencyPenalty": "", - "presencePenalty": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAI_5-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "name": "openAI", - "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 1683.95439713088, - "y": 329.0556949149878 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 279, - "id": "mrklAgentLLM_0", - "position": { - "x": 2061.891333395338, - "y": -140.0694021759809 - }, - "type": "customNode", - "data": { - "id": "mrklAgentLLM_0", - "label": "MRKL Agent for LLMs", - "name": "mrklAgentLLM", - "type": "AgentExecutor", - "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], - "category": "Agents", - "description": "Agent that uses the ReAct Framework to decide what action to take, optimized to be used with LLMs", - "inputParams": [], - "inputAnchors": [ - { - "label": "Allowed Tools", - "name": "tools", - "type": "Tool", - "list": true, - "id": "mrklAgentLLM_0-input-tools-Tool" - }, - { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "mrklAgentLLM_0-input-model-BaseLanguageModel" - } - ], - "inputs": { - "tools": [ - "{{serpAPI_0.data.instance}}", - "{{calculator_1.data.instance}}", - "{{chainTool_2.data.instance}}", - "{{chainTool_3.data.instance}}" - ], - "model": "{{openAI_5.data.instance}}" - }, - "outputAnchors": [ - { - "id": "mrklAgentLLM_0-output-mrklAgentLLM-AgentExecutor|BaseChain|BaseLangChain", - "name": "mrklAgentLLM", - "label": "AgentExecutor", - "type": "AgentExecutor | BaseChain | BaseLangChain" + "type": "OpenAI | BaseLLM | BaseLanguageModel" } ], "outputs": {}, @@ -1106,165 +1134,13 @@ }, "selected": false, "positionAbsolute": { - "x": 2061.891333395338, - "y": -140.0694021759809 - }, - "dragging": false - }, - { - "width": 300, - "height": 279, - "id": "retrievalQAChain_0", - "position": { - "x": 898.1253096948574, - "y": -859.1174013418433 - }, - "type": "customNode", - "data": { - "id": "retrievalQAChain_0", - "label": "Retrieval QA Chain", - "name": "retrievalQAChain", - "type": "RetrievalQAChain", - "baseClasses": ["RetrievalQAChain", "BaseChain", "BaseLangChain"], - "category": "Chains", - "description": "QA chain to answer a question based on the retrieved documents", - "inputParams": [], - "inputAnchors": [ - { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "retrievalQAChain_0-input-model-BaseLanguageModel" - }, - { - "label": "Vector Store Retriever", - "name": "vectorStoreRetriever", - "type": "BaseRetriever", - "id": "retrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever" - } - ], - "inputs": { - "model": "{{openAI_3.data.instance}}", - "vectorStoreRetriever": "{{chromaExistingIndex_1.data.instance}}" - }, - "outputAnchors": [ - { - "id": "retrievalQAChain_0-output-retrievalQAChain-RetrievalQAChain|BaseChain|BaseLangChain", - "name": "retrievalQAChain", - "label": "RetrievalQAChain", - "type": "RetrievalQAChain | BaseChain | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 898.1253096948574, - "y": -859.1174013418433 - }, - "dragging": false - }, - { - "width": 300, - "height": 279, - "id": "retrievalQAChain_1", - "position": { - "x": 895.4349543765911, - "y": 166.60331503487222 - }, - "type": "customNode", - "data": { - "id": "retrievalQAChain_1", - "label": "Retrieval QA Chain", - "name": "retrievalQAChain", - "type": "RetrievalQAChain", - "baseClasses": ["RetrievalQAChain", "BaseChain", "BaseLangChain"], - "category": "Chains", - "description": "QA chain to answer a question based on the retrieved documents", - "inputParams": [], - "inputAnchors": [ - { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "retrievalQAChain_1-input-model-BaseLanguageModel" - }, - { - "label": "Vector Store Retriever", - "name": "vectorStoreRetriever", - "type": "BaseRetriever", - "id": "retrievalQAChain_1-input-vectorStoreRetriever-BaseRetriever" - } - ], - "inputs": { - "model": "{{openAI_4.data.instance}}", - "vectorStoreRetriever": "{{pineconeExistingIndex_1.data.instance}}" - }, - "outputAnchors": [ - { - "id": "retrievalQAChain_1-output-retrievalQAChain-RetrievalQAChain|BaseChain|BaseLangChain", - "name": "retrievalQAChain", - "label": "RetrievalQAChain", - "type": "RetrievalQAChain | BaseChain | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 895.4349543765911, - "y": 166.60331503487222 + "x": 1619.5346765785587, + "y": 292.29615581180684 }, "dragging": false } ], "edges": [ - { - "source": "openAIEmbeddings_2", - "sourceHandle": "openAIEmbeddings_2-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "target": "chromaExistingIndex_1", - "targetHandle": "chromaExistingIndex_1-input-embeddings-Embeddings", - "type": "buttonedge", - "id": "openAIEmbeddings_2-openAIEmbeddings_2-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-chromaExistingIndex_1-chromaExistingIndex_1-input-embeddings-Embeddings", - "data": { - "label": "" - } - }, - { - "source": "openAIEmbeddings_3", - "sourceHandle": "openAIEmbeddings_3-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "target": "pineconeExistingIndex_1", - "targetHandle": "pineconeExistingIndex_1-input-embeddings-Embeddings", - "type": "buttonedge", - "id": "openAIEmbeddings_3-openAIEmbeddings_3-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_1-pineconeExistingIndex_1-input-embeddings-Embeddings", - "data": { - "label": "" - } - }, - { - "source": "serpAPI_0", - "sourceHandle": "serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain", - "target": "mrklAgentLLM_0", - "targetHandle": "mrklAgentLLM_0-input-tools-Tool", - "type": "buttonedge", - "id": "serpAPI_0-serpAPI_0-output-serpAPI-SerpAPI|Tool|StructuredTool|BaseLangChain-mrklAgentLLM_0-mrklAgentLLM_0-input-tools-Tool", - "data": { - "label": "" - } - }, - { - "source": "calculator_1", - "sourceHandle": "calculator_1-output-calculator-Calculator|Tool|StructuredTool|BaseLangChain", - "target": "mrklAgentLLM_0", - "targetHandle": "mrklAgentLLM_0-input-tools-Tool", - "type": "buttonedge", - "id": "calculator_1-calculator_1-output-calculator-Calculator|Tool|StructuredTool|BaseLangChain-mrklAgentLLM_0-mrklAgentLLM_0-input-tools-Tool", - "data": { - "label": "" - } - }, { "source": "chainTool_2", "sourceHandle": "chainTool_2-output-chainTool-ChainTool|DynamicTool|Tool|StructuredTool|BaseLangChain", @@ -1287,39 +1163,6 @@ "label": "" } }, - { - "source": "openAI_5", - "sourceHandle": "openAI_5-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "target": "mrklAgentLLM_0", - "targetHandle": "mrklAgentLLM_0-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "openAI_5-openAI_5-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-mrklAgentLLM_0-mrklAgentLLM_0-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, - { - "source": "openAI_3", - "sourceHandle": "openAI_3-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "target": "retrievalQAChain_0", - "targetHandle": "retrievalQAChain_0-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "openAI_3-openAI_3-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-retrievalQAChain_0-retrievalQAChain_0-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, - { - "source": "chromaExistingIndex_1", - "sourceHandle": "chromaExistingIndex_1-output-retriever-Chroma|VectorStoreRetriever|BaseRetriever", - "target": "retrievalQAChain_0", - "targetHandle": "retrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", - "type": "buttonedge", - "id": "chromaExistingIndex_1-chromaExistingIndex_1-output-retriever-Chroma|VectorStoreRetriever|BaseRetriever-retrievalQAChain_0-retrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", - "data": { - "label": "" - } - }, { "source": "retrievalQAChain_0", "sourceHandle": "retrievalQAChain_0-output-retrievalQAChain-RetrievalQAChain|BaseChain|BaseLangChain", @@ -1331,28 +1174,6 @@ "label": "" } }, - { - "source": "openAI_4", - "sourceHandle": "openAI_4-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "target": "retrievalQAChain_1", - "targetHandle": "retrievalQAChain_1-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "openAI_4-openAI_4-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-retrievalQAChain_1-retrievalQAChain_1-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, - { - "source": "pineconeExistingIndex_1", - "sourceHandle": "pineconeExistingIndex_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "target": "retrievalQAChain_1", - "targetHandle": "retrievalQAChain_1-input-vectorStoreRetriever-BaseRetriever", - "type": "buttonedge", - "id": "pineconeExistingIndex_1-pineconeExistingIndex_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever-retrievalQAChain_1-retrievalQAChain_1-input-vectorStoreRetriever-BaseRetriever", - "data": { - "label": "" - } - }, { "source": "retrievalQAChain_1", "sourceHandle": "retrievalQAChain_1-output-retrievalQAChain-RetrievalQAChain|BaseChain|BaseLangChain", @@ -1363,6 +1184,83 @@ "data": { "label": "" } + }, + { + "source": "openAI_2", + "sourceHandle": "openAI_2-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "target": "retrievalQAChain_0", + "targetHandle": "retrievalQAChain_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "openAI_2-openAI_2-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-retrievalQAChain_0-retrievalQAChain_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, + { + "source": "openAIEmbeddings_1", + "sourceHandle": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "chromaExistingIndex_0", + "targetHandle": "chromaExistingIndex_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_1-openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-chromaExistingIndex_0-chromaExistingIndex_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, + { + "source": "chromaExistingIndex_0", + "sourceHandle": "chromaExistingIndex_0-output-retriever-Chroma|VectorStoreRetriever|BaseRetriever", + "target": "retrievalQAChain_0", + "targetHandle": "retrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "type": "buttonedge", + "id": "chromaExistingIndex_0-chromaExistingIndex_0-output-retriever-Chroma|VectorStoreRetriever|BaseRetriever-retrievalQAChain_0-retrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "data": { + "label": "" + } + }, + { + "source": "openAIEmbeddings_2", + "sourceHandle": "openAIEmbeddings_2-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "pineconeExistingIndex_0", + "targetHandle": "pineconeExistingIndex_0-input-embeddings-Embeddings", + "type": "buttonedge", + "id": "openAIEmbeddings_2-openAIEmbeddings_2-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeExistingIndex_0-pineconeExistingIndex_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, + { + "source": "openAI_3", + "sourceHandle": "openAI_3-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "target": "retrievalQAChain_1", + "targetHandle": "retrievalQAChain_1-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "openAI_3-openAI_3-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-retrievalQAChain_1-retrievalQAChain_1-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, + { + "source": "pineconeExistingIndex_0", + "sourceHandle": "pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "target": "retrievalQAChain_1", + "targetHandle": "retrievalQAChain_1-input-vectorStoreRetriever-BaseRetriever", + "type": "buttonedge", + "id": "pineconeExistingIndex_0-pineconeExistingIndex_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever-retrievalQAChain_1-retrievalQAChain_1-input-vectorStoreRetriever-BaseRetriever", + "data": { + "label": "" + } + }, + { + "source": "openAI_4", + "sourceHandle": "openAI_4-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "target": "mrklAgentLLM_0", + "targetHandle": "mrklAgentLLM_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "openAI_4-openAI_4-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-mrklAgentLLM_0-mrklAgentLLM_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } } ] } diff --git a/packages/server/marketplaces/chatflows/OpenAI Agent.json b/packages/server/marketplaces/chatflows/OpenAI Agent.json index 75dc1527..9db4702d 100644 --- a/packages/server/marketplaces/chatflows/OpenAI Agent.json +++ b/packages/server/marketplaces/chatflows/OpenAI Agent.json @@ -1,206 +1,13 @@ { "description": "An agent that uses OpenAI's Function Calling functionality to pick the tool and args to call", "nodes": [ - { - "width": 300, - "height": 524, - "id": "chatOpenAI_0", - "position": { - "x": 648.7470970481406, - "y": 462.3331811694268 - }, - "type": "customNode", - "data": { - "id": "chatOpenAI_0", - "label": "ChatOpenAI", - "name": "chatOpenAI", - "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain", "Serializable"], - "category": "Chat Models", - "description": "Wrapper around OpenAI large language models that use the Chat endpoint", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_0-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "gpt-4", - "name": "gpt-4" - }, - { - "label": "gpt-4-0314", - "name": "gpt-4-0314" - }, - { - "label": "gpt-4-32k-0314", - "name": "gpt-4-32k-0314" - }, - { - "label": "gpt-4-0613", - "name": "gpt-4-0613" - }, - { - "label": "gpt-3.5-turbo", - "name": "gpt-3.5-turbo" - }, - { - "label": "gpt-3.5-turbo-0301", - "name": "gpt-3.5-turbo-0301" - }, - { - "label": "gpt-3.5-turbo-0613", - "name": "gpt-3.5-turbo-0613" - } - ], - "default": "gpt-3.5-turbo", - "optional": true, - "id": "chatOpenAI_0-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.9, - "optional": true, - "id": "chatOpenAI_0-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-topP-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-presencePenalty-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_0-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "gpt-3.5-turbo-0613", - "temperature": 0.9, - "maxTokens": "", - "topP": "", - "frequencyPenalty": "", - "presencePenalty": "", - "timeout": "", - "basepath": "" - }, - "outputAnchors": [ - { - "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain|Serializable", - "name": "chatOpenAI", - "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain | Serializable" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 648.7470970481406, - "y": 462.3331811694268 - }, - "dragging": false - }, - { - "width": 300, - "height": 278, - "id": "serper_0", - "position": { - "x": 486.27248799490576, - "y": 4.465900738576664 - }, - "type": "customNode", - "data": { - "id": "serper_0", - "label": "Serper", - "name": "serper", - "type": "Serper", - "baseClasses": ["Serper", "Tool", "StructuredTool", "BaseLangChain", "Serializable"], - "category": "Tools", - "description": "Wrapper around Serper.dev - Google Search API", - "inputParams": [ - { - "label": "Serper Api Key", - "name": "apiKey", - "type": "password", - "id": "serper_0-input-apiKey-password" - } - ], - "inputAnchors": [], - "inputs": {}, - "outputAnchors": [ - { - "id": "serper_0-output-serper-Serper|Tool|StructuredTool|BaseLangChain|Serializable", - "name": "serper", - "label": "Serper", - "type": "Serper | Tool | StructuredTool | BaseLangChain | Serializable" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 486.27248799490576, - "y": 4.465900738576664 - }, - "dragging": false - }, { "width": 300, "height": 143, "id": "calculator_0", "position": { - "x": 286.4092336819905, - "y": 304.05673891709597 + "x": 288.06681362611545, + "y": 289.1385194199715 }, "type": "customNode", "data": { @@ -227,82 +34,8 @@ }, "selected": false, "positionAbsolute": { - "x": 286.4092336819905, - "y": 304.05673891709597 - }, - "dragging": false - }, - { - "width": 300, - "height": 383, - "id": "openAIFunctionAgent_0", - "position": { - "x": 1341.2259105169032, - "y": 318.35651549722945 - }, - "type": "customNode", - "data": { - "id": "openAIFunctionAgent_0", - "label": "OpenAI Function Agent", - "name": "openAIFunctionAgent", - "type": "AgentExecutor", - "baseClasses": ["AgentExecutor", "BaseChain"], - "category": "Agents", - "description": "An agent that uses OpenAI's Function Calling functionality to pick the tool and args to call", - "inputParams": [ - { - "label": "System Message", - "name": "systemMessage", - "type": "string", - "rows": 4, - "optional": true, - "additionalParams": true, - "id": "openAIFunctionAgent_0-input-systemMessage-string" - } - ], - "inputAnchors": [ - { - "label": "Allowed Tools", - "name": "tools", - "type": "Tool", - "list": true, - "id": "openAIFunctionAgent_0-input-tools-Tool" - }, - { - "label": "Memory", - "name": "memory", - "type": "BaseChatMemory", - "id": "openAIFunctionAgent_0-input-memory-BaseChatMemory" - }, - { - "label": "OpenAI Chat Model", - "name": "model", - "description": "Only works with gpt-3.5-turbo-0613 and gpt-4-0613. Refer docs for more info", - "type": "BaseChatModel", - "id": "openAIFunctionAgent_0-input-model-BaseChatModel" - } - ], - "inputs": { - "tools": ["{{serper_0.data.instance}}", "{{calculator_0.data.instance}}", "{{customTool_0.data.instance}}"], - "memory": "{{bufferMemory_0.data.instance}}", - "model": "{{chatOpenAI_0.data.instance}}", - "systemMessage": "" - }, - "outputAnchors": [ - { - "id": "openAIFunctionAgent_0-output-openAIFunctionAgent-AgentExecutor|BaseChain", - "name": "openAIFunctionAgent", - "label": "AgentExecutor", - "type": "AgentExecutor | BaseChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1341.2259105169032, - "y": 318.35651549722945 + "x": 288.06681362611545, + "y": 289.1385194199715 }, "dragging": false }, @@ -409,20 +142,282 @@ "y": -32.32503903826486 }, "dragging": false + }, + { + "width": 300, + "height": 277, + "id": "serper_0", + "position": { + "x": 504.3508341937219, + "y": -10.324432507151982 + }, + "type": "customNode", + "data": { + "id": "serper_0", + "label": "Serper", + "name": "serper", + "type": "Serper", + "baseClasses": ["Serper", "Tool", "StructuredTool"], + "category": "Tools", + "description": "Wrapper around Serper.dev - Google Search API", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["serperApi"], + "id": "serper_0-input-credential-credential" + } + ], + "inputAnchors": [], + "inputs": {}, + "outputAnchors": [ + { + "id": "serper_0-output-serper-Serper|Tool|StructuredTool", + "name": "serper", + "label": "Serper", + "type": "Serper | Tool | StructuredTool" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 504.3508341937219, + "y": -10.324432507151982 + }, + "dragging": false + }, + { + "width": 300, + "height": 383, + "id": "openAIFunctionAgent_0", + "position": { + "x": 1241.9739093293213, + "y": 359.3158950327101 + }, + "type": "customNode", + "data": { + "id": "openAIFunctionAgent_0", + "label": "OpenAI Function Agent", + "name": "openAIFunctionAgent", + "type": "AgentExecutor", + "baseClasses": ["AgentExecutor", "BaseChain"], + "category": "Agents", + "description": "An agent that uses OpenAI's Function Calling functionality to pick the tool and args to call", + "inputParams": [ + { + "label": "System Message", + "name": "systemMessage", + "type": "string", + "rows": 4, + "optional": true, + "additionalParams": true, + "id": "openAIFunctionAgent_0-input-systemMessage-string" + } + ], + "inputAnchors": [ + { + "label": "Allowed Tools", + "name": "tools", + "type": "Tool", + "list": true, + "id": "openAIFunctionAgent_0-input-tools-Tool" + }, + { + "label": "Memory", + "name": "memory", + "type": "BaseChatMemory", + "id": "openAIFunctionAgent_0-input-memory-BaseChatMemory" + }, + { + "label": "OpenAI Chat Model", + "name": "model", + "description": "Only works with gpt-3.5-turbo-0613 and gpt-4-0613. Refer docs for more info", + "type": "BaseChatModel", + "id": "openAIFunctionAgent_0-input-model-BaseChatModel" + } + ], + "inputs": { + "tools": ["{{calculator_0.data.instance}}", "{{serper_0.data.instance}}", "{{customTool_0.data.instance}}"], + "memory": "{{bufferMemory_0.data.instance}}", + "model": "{{chatOpenAI_0.data.instance}}", + "systemMessage": "" + }, + "outputAnchors": [ + { + "id": "openAIFunctionAgent_0-output-openAIFunctionAgent-AgentExecutor|BaseChain", + "name": "openAIFunctionAgent", + "label": "AgentExecutor", + "type": "AgentExecutor | BaseChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1241.9739093293213, + "y": 359.3158950327101 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 817.8210275868742, + "y": 627.7677030233751 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9, + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 817.8210275868742, + "y": 627.7677030233751 + }, + "dragging": false } ], "edges": [ - { - "source": "serper_0", - "sourceHandle": "serper_0-output-serper-Serper|Tool|StructuredTool|BaseLangChain|Serializable", - "target": "openAIFunctionAgent_0", - "targetHandle": "openAIFunctionAgent_0-input-tools-Tool", - "type": "buttonedge", - "id": "serper_0-serper_0-output-serper-Serper|Tool|StructuredTool|BaseLangChain|Serializable-openAIFunctionAgent_0-openAIFunctionAgent_0-input-tools-Tool", - "data": { - "label": "" - } - }, { "source": "calculator_0", "sourceHandle": "calculator_0-output-calculator-Calculator|Tool|StructuredTool|BaseLangChain|Serializable", @@ -435,23 +430,12 @@ } }, { - "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain|Serializable", + "source": "serper_0", + "sourceHandle": "serper_0-output-serper-Serper|Tool|StructuredTool", "target": "openAIFunctionAgent_0", - "targetHandle": "openAIFunctionAgent_0-input-model-BaseChatModel", + "targetHandle": "openAIFunctionAgent_0-input-tools-Tool", "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain|Serializable-openAIFunctionAgent_0-openAIFunctionAgent_0-input-model-BaseChatModel", - "data": { - "label": "" - } - }, - { - "source": "bufferMemory_0", - "sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", - "target": "openAIFunctionAgent_0", - "targetHandle": "openAIFunctionAgent_0-input-memory-BaseChatMemory", - "type": "buttonedge", - "id": "bufferMemory_0-bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory-openAIFunctionAgent_0-openAIFunctionAgent_0-input-memory-BaseChatMemory", + "id": "serper_0-serper_0-output-serper-Serper|Tool|StructuredTool-openAIFunctionAgent_0-openAIFunctionAgent_0-input-tools-Tool", "data": { "label": "" } @@ -466,6 +450,28 @@ "data": { "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", + "sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", + "target": "openAIFunctionAgent_0", + "targetHandle": "openAIFunctionAgent_0-input-memory-BaseChatMemory", + "type": "buttonedge", + "id": "bufferMemory_0-bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory-openAIFunctionAgent_0-openAIFunctionAgent_0-input-memory-BaseChatMemory", + "data": { + "label": "" + } } ] } diff --git a/packages/server/marketplaces/chatflows/Prompt Chaining.json b/packages/server/marketplaces/chatflows/Prompt Chaining.json index 96987660..8bc512f0 100644 --- a/packages/server/marketplaces/chatflows/Prompt Chaining.json +++ b/packages/server/marketplaces/chatflows/Prompt Chaining.json @@ -3,11 +3,444 @@ "nodes": [ { "width": 300, - "height": 524, + "height": 475, + "id": "promptTemplate_0", + "position": { + "x": 792.9464838535649, + "y": 527.1718536712464 + }, + "type": "customNode", + "data": { + "id": "promptTemplate_0", + "label": "Prompt Template", + "name": "promptTemplate", + "type": "PromptTemplate", + "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], + "category": "Prompts", + "description": "Schema to represent a basic prompt for an LLM", + "inputParams": [ + { + "label": "Template", + "name": "template", + "type": "string", + "rows": 4, + "placeholder": "What is a good name for a company that makes {product}?", + "id": "promptTemplate_0-input-template-string" + }, + { + "label": "Format Prompt Values", + "name": "promptValues", + "type": "json", + "optional": true, + "acceptVariable": true, + "list": true, + "id": "promptTemplate_0-input-promptValues-json" + } + ], + "inputAnchors": [], + "inputs": { + "template": "You are an AI who performs one task based on the following objective: {objective}.\nRespond with how you would complete this task:", + "promptValues": "{\"objective\":\"{{question}}\"}" + }, + "outputAnchors": [ + { + "id": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", + "name": "promptTemplate", + "label": "PromptTemplate", + "type": "PromptTemplate | BaseStringPromptTemplate | BasePromptTemplate" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 792.9464838535649, + "y": 527.1718536712464 + }, + "dragging": false + }, + { + "width": 300, + "height": 475, + "id": "promptTemplate_1", + "position": { + "x": 1571.0896874449775, + "y": 522.8455116403258 + }, + "type": "customNode", + "data": { + "id": "promptTemplate_1", + "label": "Prompt Template", + "name": "promptTemplate", + "type": "PromptTemplate", + "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], + "category": "Prompts", + "description": "Schema to represent a basic prompt for an LLM", + "inputParams": [ + { + "label": "Template", + "name": "template", + "type": "string", + "rows": 4, + "placeholder": "What is a good name for a company that makes {product}?", + "id": "promptTemplate_1-input-template-string" + }, + { + "label": "Format Prompt Values", + "name": "promptValues", + "type": "json", + "optional": true, + "acceptVariable": true, + "list": true, + "id": "promptTemplate_1-input-promptValues-json" + } + ], + "inputAnchors": [], + "inputs": { + "template": "You are a task creation AI that uses the result of an execution agent to create new tasks with the following objective: {objective}.\nThe last completed task has the result: {result}.\nBased on the result, create new tasks to be completed by the AI system that do not overlap with result.\nReturn the tasks as an array.", + "promptValues": "{\"objective\":\"{{question}}\",\"result\":\"{{llmChain_0.data.instance}}\"}" + }, + "outputAnchors": [ + { + "id": "promptTemplate_1-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", + "name": "promptTemplate", + "label": "PromptTemplate", + "type": "PromptTemplate | BaseStringPromptTemplate | BasePromptTemplate" + } + ], + "outputs": {}, + "selected": false + }, + "positionAbsolute": { + "x": 1571.0896874449775, + "y": 522.8455116403258 + }, + "selected": false, + "dragging": false + }, + { + "width": 300, + "height": 405, + "id": "llmChain_0", + "position": { + "x": 1192.835706086358, + "y": 367.49653955405995 + }, + "type": "customNode", + "data": { + "id": "llmChain_0", + "label": "LLM Chain", + "name": "llmChain", + "type": "LLMChain", + "baseClasses": ["LLMChain", "BaseChain"], + "category": "Chains", + "description": "Chain to run queries against LLMs", + "inputParams": [ + { + "label": "Chain Name", + "name": "chainName", + "type": "string", + "placeholder": "Name Your Chain", + "optional": true, + "id": "llmChain_0-input-chainName-string" + } + ], + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "llmChain_0-input-model-BaseLanguageModel" + }, + { + "label": "Prompt", + "name": "prompt", + "type": "BasePromptTemplate", + "id": "llmChain_0-input-prompt-BasePromptTemplate" + } + ], + "inputs": { + "model": "{{openAI_1.data.instance}}", + "prompt": "{{promptTemplate_0.data.instance}}", + "chainName": "FirstChain" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "llmChain_0-output-llmChain-LLMChain|BaseChain", + "name": "llmChain", + "label": "LLM Chain", + "type": "LLMChain | BaseChain" + }, + { + "id": "llmChain_0-output-outputPrediction-string|json", + "name": "outputPrediction", + "label": "Output Prediction", + "type": "string | json" + } + ], + "default": "llmChain" + } + ], + "outputs": { + "output": "outputPrediction" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1192.835706086358, + "y": 367.49653955405995 + }, + "dragging": false + }, + { + "width": 300, + "height": 405, + "id": "llmChain_1", + "position": { + "x": 1956.8236771865425, + "y": 359.10696865911547 + }, + "type": "customNode", + "data": { + "id": "llmChain_1", + "label": "LLM Chain", + "name": "llmChain", + "type": "LLMChain", + "baseClasses": ["LLMChain", "BaseChain"], + "category": "Chains", + "description": "Chain to run queries against LLMs", + "inputParams": [ + { + "label": "Chain Name", + "name": "chainName", + "type": "string", + "placeholder": "Name Your Chain", + "optional": true, + "id": "llmChain_1-input-chainName-string" + } + ], + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "llmChain_1-input-model-BaseLanguageModel" + }, + { + "label": "Prompt", + "name": "prompt", + "type": "BasePromptTemplate", + "id": "llmChain_1-input-prompt-BasePromptTemplate" + } + ], + "inputs": { + "model": "{{openAI_2.data.instance}}", + "prompt": "{{promptTemplate_1.data.instance}}", + "chainName": "LastChain" + }, + "outputAnchors": [ + { + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "llmChain_1-output-llmChain-LLMChain|BaseChain", + "name": "llmChain", + "label": "LLM Chain", + "type": "LLMChain | BaseChain" + }, + { + "id": "llmChain_1-output-outputPrediction-string|json", + "name": "outputPrediction", + "label": "Output Prediction", + "type": "string | json" + } + ], + "default": "llmChain" + } + ], + "outputs": { + "output": "llmChain" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1956.8236771865425, + "y": 359.10696865911547 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "openAI_1", + "position": { + "x": 791.6102007244282, + "y": -13.71386876566092 + }, + "type": "customNode", + "data": { + "id": "openAI_1", + "label": "OpenAI", + "name": "openAI", + "type": "OpenAI", + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], + "category": "LLMs", + "description": "Wrapper around OpenAI large language models", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAI_1-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "text-davinci-003", + "name": "text-davinci-003" + }, + { + "label": "text-davinci-002", + "name": "text-davinci-002" + }, + { + "label": "text-curie-001", + "name": "text-curie-001" + }, + { + "label": "text-babbage-001", + "name": "text-babbage-001" + } + ], + "default": "text-davinci-003", + "optional": true, + "id": "openAI_1-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.7, + "optional": true, + "id": "openAI_1-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_1-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_1-input-topP-number" + }, + { + "label": "Best Of", + "name": "bestOf", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_1-input-bestOf-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_1-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_1-input-presencePenalty-number" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_1-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_1-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAI_1-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "text-davinci-003", + "temperature": 0.7, + "maxTokens": "", + "topP": "", + "bestOf": "", + "frequencyPenalty": "", + "presencePenalty": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "name": "openAI", + "label": "OpenAI", + "type": "OpenAI | BaseLLM | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 791.6102007244282, + "y": -13.71386876566092 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, "id": "openAI_2", "position": { - "x": 793.6674026500068, - "y": -20.826430802683774 + "x": 1571.148617508543, + "y": -20.372437481171687 }, "type": "customNode", "data": { @@ -15,15 +448,16 @@ "label": "OpenAI", "name": "openAI", "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", "description": "Wrapper around OpenAI large language models", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_2-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAI_2-input-credential-credential" }, { "label": "Model Name", @@ -134,226 +568,15 @@ "frequencyPenalty": "", "presencePenalty": "", "batchSize": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "openAI_2-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", + "id": "openAI_2-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "name": "openAI", "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 793.6674026500068, - "y": -20.826430802683774 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 524, - "id": "openAI_3", - "position": { - "x": 1216.061423775753, - "y": -20.35195330852082 - }, - "type": "customNode", - "data": { - "id": "openAI_3", - "label": "OpenAI", - "name": "openAI", - "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], - "category": "LLMs", - "description": "Wrapper around OpenAI large language models", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_3-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "text-davinci-003", - "name": "text-davinci-003" - }, - { - "label": "text-davinci-002", - "name": "text-davinci-002" - }, - { - "label": "text-curie-001", - "name": "text-curie-001" - }, - { - "label": "text-babbage-001", - "name": "text-babbage-001" - } - ], - "default": "text-davinci-003", - "optional": true, - "id": "openAI_3-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.7, - "optional": true, - "id": "openAI_3-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_3-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_3-input-topP-number" - }, - { - "label": "Best Of", - "name": "bestOf", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_3-input-bestOf-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_3-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_3-input-presencePenalty-number" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_3-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_3-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAI_3-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "text-davinci-003", - "temperature": 0.7, - "maxTokens": "", - "topP": "", - "bestOf": "", - "frequencyPenalty": "", - "presencePenalty": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAI_3-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "name": "openAI", - "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 1216.061423775753, - "y": -20.35195330852082 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 475, - "id": "promptTemplate_0", - "position": { - "x": 792.9464838535649, - "y": 527.1718536712464 - }, - "type": "customNode", - "data": { - "id": "promptTemplate_0", - "label": "Prompt Template", - "name": "promptTemplate", - "type": "PromptTemplate", - "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], - "category": "Prompts", - "description": "Schema to represent a basic prompt for an LLM", - "inputParams": [ - { - "label": "Template", - "name": "template", - "type": "string", - "rows": 4, - "placeholder": "What is a good name for a company that makes {product}?", - "id": "promptTemplate_0-input-template-string" - }, - { - "label": "Format Prompt Values", - "name": "promptValues", - "type": "json", - "optional": true, - "acceptVariable": true, - "list": true, - "id": "promptTemplate_0-input-promptValues-json" - } - ], - "inputAnchors": [], - "inputs": { - "template": "You are an AI who performs one task based on the following objective: {objective}.\nRespond with how you would complete this task:", - "promptValues": "{\"objective\":\"{{question}}\"}" - }, - "outputAnchors": [ - { - "id": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", - "name": "promptTemplate", - "label": "PromptTemplate", - "type": "PromptTemplate | BaseStringPromptTemplate | BasePromptTemplate" + "type": "OpenAI | BaseLLM | BaseLanguageModel" } ], "outputs": {}, @@ -361,243 +584,13 @@ }, "selected": false, "positionAbsolute": { - "x": 792.9464838535649, - "y": 527.1718536712464 - }, - "dragging": false - }, - { - "width": 300, - "height": 475, - "id": "promptTemplate_1", - "position": { - "x": 1577.7482561604884, - "y": 516.186942924815 - }, - "type": "customNode", - "data": { - "id": "promptTemplate_1", - "label": "Prompt Template", - "name": "promptTemplate", - "type": "PromptTemplate", - "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], - "category": "Prompts", - "description": "Schema to represent a basic prompt for an LLM", - "inputParams": [ - { - "label": "Template", - "name": "template", - "type": "string", - "rows": 4, - "placeholder": "What is a good name for a company that makes {product}?", - "id": "promptTemplate_1-input-template-string" - }, - { - "label": "Format Prompt Values", - "name": "promptValues", - "type": "json", - "optional": true, - "acceptVariable": true, - "list": true, - "id": "promptTemplate_1-input-promptValues-json" - } - ], - "inputAnchors": [], - "inputs": { - "template": "You are a task creation AI that uses the result of an execution agent to create new tasks with the following objective: {objective}.\nThe last completed task has the result: {result}.\nBased on the result, create new tasks to be completed by the AI system that do not overlap with result.\nReturn the tasks as an array.", - "promptValues": "{\"objective\":\"{{question}}\",\"result\":\"{{llmChain_0.data.instance}}\"}" - }, - "outputAnchors": [ - { - "id": "promptTemplate_1-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", - "name": "promptTemplate", - "label": "PromptTemplate", - "type": "PromptTemplate | BaseStringPromptTemplate | BasePromptTemplate" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 1577.7482561604884, - "y": 516.186942924815 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 405, - "id": "llmChain_0", - "position": { - "x": 1221.1346231272787, - "y": 538.9546839784628 - }, - "type": "customNode", - "data": { - "id": "llmChain_0", - "label": "LLM Chain", - "name": "llmChain", - "type": "LLMChain", - "baseClasses": ["LLMChain", "BaseChain"], - "category": "Chains", - "description": "Chain to run queries against LLMs", - "inputParams": [ - { - "label": "Chain Name", - "name": "chainName", - "type": "string", - "placeholder": "Name Your Chain", - "optional": true, - "id": "llmChain_0-input-chainName-string" - } - ], - "inputAnchors": [ - { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "llmChain_0-input-model-BaseLanguageModel" - }, - { - "label": "Prompt", - "name": "prompt", - "type": "BasePromptTemplate", - "id": "llmChain_0-input-prompt-BasePromptTemplate" - } - ], - "inputs": { - "model": "{{openAI_2.data.instance}}", - "prompt": "{{promptTemplate_0.data.instance}}", - "chainName": "FirstChain" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "llmChain_0-output-llmChain-LLMChain|BaseChain", - "name": "llmChain", - "label": "LLM Chain", - "type": "LLMChain | BaseChain" - }, - { - "id": "llmChain_0-output-outputPrediction-string|json", - "name": "outputPrediction", - "label": "Output Prediction", - "type": "string | json" - } - ], - "default": "llmChain" - } - ], - "outputs": { - "output": "outputPrediction" - }, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1221.1346231272787, - "y": 538.9546839784628 - }, - "dragging": false - }, - { - "width": 300, - "height": 405, - "id": "llmChain_1", - "position": { - "x": 1971.8054567964418, - "y": 207.624530381245 - }, - "type": "customNode", - "data": { - "id": "llmChain_1", - "label": "LLM Chain", - "name": "llmChain", - "type": "LLMChain", - "baseClasses": ["LLMChain", "BaseChain"], - "category": "Chains", - "description": "Chain to run queries against LLMs", - "inputParams": [ - { - "label": "Chain Name", - "name": "chainName", - "type": "string", - "placeholder": "Name Your Chain", - "optional": true, - "id": "llmChain_1-input-chainName-string" - } - ], - "inputAnchors": [ - { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "llmChain_1-input-model-BaseLanguageModel" - }, - { - "label": "Prompt", - "name": "prompt", - "type": "BasePromptTemplate", - "id": "llmChain_1-input-prompt-BasePromptTemplate" - } - ], - "inputs": { - "model": "{{openAI_3.data.instance}}", - "prompt": "{{promptTemplate_1.data.instance}}", - "chainName": "LastChain" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", - "type": "options", - "options": [ - { - "id": "llmChain_1-output-llmChain-LLMChain|BaseChain", - "name": "llmChain", - "label": "LLM Chain", - "type": "LLMChain | BaseChain" - }, - { - "id": "llmChain_1-output-outputPrediction-string|json", - "name": "outputPrediction", - "label": "Output Prediction", - "type": "string | json" - } - ], - "default": "llmChain" - } - ], - "outputs": { - "output": "llmChain" - }, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1971.8054567964418, - "y": 207.624530381245 + "x": 1571.148617508543, + "y": -20.372437481171687 }, "dragging": false } ], "edges": [ - { - "source": "openAI_2", - "sourceHandle": "openAI_2-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "target": "llmChain_0", - "targetHandle": "llmChain_0-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "openAI_2-openAI_2-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-llmChain_0-llmChain_0-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, { "source": "promptTemplate_0", "sourceHandle": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", @@ -620,17 +613,6 @@ "label": "" } }, - { - "source": "openAI_3", - "sourceHandle": "openAI_3-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "target": "llmChain_1", - "targetHandle": "llmChain_1-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "openAI_3-openAI_3-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-llmChain_1-llmChain_1-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, { "source": "promptTemplate_1", "sourceHandle": "promptTemplate_1-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", @@ -641,6 +623,28 @@ "data": { "label": "" } + }, + { + "source": "openAI_1", + "sourceHandle": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "target": "llmChain_0", + "targetHandle": "llmChain_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "openAI_1-openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-llmChain_0-llmChain_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, + { + "source": "openAI_2", + "sourceHandle": "openAI_2-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "target": "llmChain_1", + "targetHandle": "llmChain_1-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "openAI_2-openAI_2-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-llmChain_1-llmChain_1-input-model-BaseLanguageModel", + "data": { + "label": "" + } } ] } diff --git a/packages/server/marketplaces/chatflows/SQL DB Chain.json b/packages/server/marketplaces/chatflows/SQL DB Chain.json index e7826aa2..c33a8f13 100644 --- a/packages/server/marketplaces/chatflows/SQL DB Chain.json +++ b/packages/server/marketplaces/chatflows/SQL DB Chain.json @@ -1,159 +1,6 @@ { "description": "Answer questions over a SQL database", "nodes": [ - { - "width": 300, - "height": 524, - "id": "openAI_1", - "position": { - "x": 835.4668837832456, - "y": 182.4724119898708 - }, - "type": "customNode", - "data": { - "id": "openAI_1", - "label": "OpenAI", - "name": "openAI", - "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], - "category": "LLMs", - "description": "Wrapper around OpenAI large language models", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "text-davinci-003", - "name": "text-davinci-003" - }, - { - "label": "text-davinci-002", - "name": "text-davinci-002" - }, - { - "label": "text-curie-001", - "name": "text-curie-001" - }, - { - "label": "text-babbage-001", - "name": "text-babbage-001" - } - ], - "default": "text-davinci-003", - "optional": true, - "id": "openAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.7, - "optional": true, - "id": "openAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-topP-number" - }, - { - "label": "Best Of", - "name": "bestOf", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-bestOf-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-presencePenalty-number" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "text-davinci-003", - "temperature": 0.7, - "maxTokens": "", - "topP": "", - "bestOf": "", - "frequencyPenalty": "", - "presencePenalty": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "name": "openAI", - "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 835.4668837832456, - "y": 182.4724119898708 - }, - "dragging": false - }, { "width": 300, "height": 424, @@ -202,7 +49,7 @@ } ], "inputs": { - "model": "{{openAI_1.data.instance}}", + "model": "{{chatOpenAI_0.data.instance}}", "database": "sqlite", "dbFilePath": "" }, @@ -223,16 +70,169 @@ "y": 217.507437391498 }, "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 855.0396169649254, + "y": 179.29430548099504 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": "0", + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 855.0396169649254, + "y": 179.29430548099504 + }, + "dragging": false } ], "edges": [ { - "source": "openAI_1", - "sourceHandle": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "sqlDatabaseChain_0", "targetHandle": "sqlDatabaseChain_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "openAI_1-openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-sqlDatabaseChain_0-sqlDatabaseChain_0-input-model-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-sqlDatabaseChain_0-sqlDatabaseChain_0-input-model-BaseLanguageModel", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/Simple Conversation Chain.json b/packages/server/marketplaces/chatflows/Simple Conversation Chain.json index 04009123..bdf3c871 100644 --- a/packages/server/marketplaces/chatflows/Simple Conversation Chain.json +++ b/packages/server/marketplaces/chatflows/Simple Conversation Chain.json @@ -3,11 +3,67 @@ "nodes": [ { "width": 300, - "height": 524, + "height": 376, + "id": "bufferMemory_0", + "position": { + "x": 753.4300788823234, + "y": 479.5336426526603 + }, + "type": "customNode", + "data": { + "id": "bufferMemory_0", + "label": "Buffer Memory", + "name": "bufferMemory", + "type": "BufferMemory", + "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], + "category": "Memory", + "description": "Remembers previous conversational back and forths directly", + "inputParams": [ + { + "label": "Memory Key", + "name": "memoryKey", + "type": "string", + "default": "chat_history", + "id": "bufferMemory_0-input-memoryKey-string" + }, + { + "label": "Input Key", + "name": "inputKey", + "type": "string", + "default": "input", + "id": "bufferMemory_0-input-inputKey-string" + } + ], + "inputAnchors": [], + "inputs": { + "memoryKey": "chat_history", + "inputKey": "input" + }, + "outputAnchors": [ + { + "id": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", + "name": "bufferMemory", + "label": "BufferMemory", + "type": "BufferMemory | BaseChatMemory | BaseMemory" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 753.4300788823234, + "y": 479.5336426526603 + }, + "dragging": false + }, + { + "width": 300, + "height": 523, "id": "chatOpenAI_0", "position": { - "x": 750.6529856117049, - "y": -75.72544375812092 + "x": 754.8942497823595, + "y": -70.76607584232393 }, "type": "customNode", "data": { @@ -15,15 +71,16 @@ "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" }, { "label": "Model Name", @@ -132,70 +189,15 @@ "topP": "", "frequencyPenalty": "", "presencePenalty": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 750.6529856117049, - "y": -75.72544375812092 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 376, - "id": "bufferMemory_0", - "position": { - "x": 753.4300788823234, - "y": 479.5336426526603 - }, - "type": "customNode", - "data": { - "id": "bufferMemory_0", - "label": "Buffer Memory", - "name": "bufferMemory", - "type": "BufferMemory", - "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], - "category": "Memory", - "description": "Remembers previous conversational back and forths directly", - "inputParams": [ - { - "label": "Memory Key", - "name": "memoryKey", - "type": "string", - "default": "chat_history", - "id": "bufferMemory_0-input-memoryKey-string" - }, - { - "label": "Input Key", - "name": "inputKey", - "type": "string", - "default": "input", - "id": "bufferMemory_0-input-inputKey-string" - } - ], - "inputAnchors": [], - "inputs": { - "memoryKey": "chat_history", - "inputKey": "input" - }, - "outputAnchors": [ - { - "id": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", - "name": "bufferMemory", - "label": "BufferMemory", - "type": "BufferMemory | BaseChatMemory | BaseMemory" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "outputs": {}, @@ -203,18 +205,18 @@ }, "selected": false, "positionAbsolute": { - "x": 753.4300788823234, - "y": 479.5336426526603 + "x": 754.8942497823595, + "y": -70.76607584232393 }, "dragging": false }, { "width": 300, - "height": 332, + "height": 383, "id": "conversationChain_0", "position": { - "x": 1201.6630991237407, - "y": 291.86981791303066 + "x": 1174.6496397666272, + "y": 311.1052536740497 }, "type": "customNode", "data": { @@ -222,7 +224,7 @@ "label": "Conversation Chain", "name": "conversationChain", "type": "ConversationChain", - "baseClasses": ["ConversationChain", "LLMChain", "BaseChain", "BaseLangChain"], + "baseClasses": ["ConversationChain", "LLMChain", "BaseChain"], "category": "Chains", "description": "Chat models specific conversational chain with memory", "inputParams": [ @@ -263,14 +265,15 @@ "inputs": { "model": "{{chatOpenAI_0.data.instance}}", "memory": "{{bufferMemory_0.data.instance}}", + "document": "", "systemMessagePrompt": "" }, "outputAnchors": [ { - "id": "conversationChain_0-output-conversationChain-ConversationChain|LLMChain|BaseChain|BaseLangChain", + "id": "conversationChain_0-output-conversationChain-ConversationChain|LLMChain|BaseChain", "name": "conversationChain", "label": "ConversationChain", - "type": "ConversationChain | LLMChain | BaseChain | BaseLangChain" + "type": "ConversationChain | LLMChain | BaseChain" } ], "outputs": {}, @@ -278,8 +281,8 @@ }, "selected": false, "positionAbsolute": { - "x": 1201.6630991237407, - "y": 291.86981791303066 + "x": 1174.6496397666272, + "y": 311.1052536740497 }, "dragging": false } @@ -287,11 +290,11 @@ "edges": [ { "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "conversationChain_0", "targetHandle": "conversationChain_0-input-model-BaseChatModel", "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-conversationChain_0-conversationChain_0-input-model-BaseChatModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationChain_0-conversationChain_0-input-model-BaseChatModel", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/Simple LLM Chain.json b/packages/server/marketplaces/chatflows/Simple LLM Chain.json index cc193d5c..ccc3cf95 100644 --- a/packages/server/marketplaces/chatflows/Simple LLM Chain.json +++ b/packages/server/marketplaces/chatflows/Simple LLM Chain.json @@ -1,159 +1,6 @@ { "description": "Basic example of stateless (no memory) LLM Chain with a Prompt Template and LLM Model", "nodes": [ - { - "width": 300, - "height": 524, - "id": "openAI_1", - "position": { - "x": 510.75932526856377, - "y": -44.80152395958956 - }, - "type": "customNode", - "data": { - "id": "openAI_1", - "label": "OpenAI", - "name": "openAI", - "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], - "category": "LLMs", - "description": "Wrapper around OpenAI large language models", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "text-davinci-003", - "name": "text-davinci-003" - }, - { - "label": "text-davinci-002", - "name": "text-davinci-002" - }, - { - "label": "text-curie-001", - "name": "text-curie-001" - }, - { - "label": "text-babbage-001", - "name": "text-babbage-001" - } - ], - "default": "text-davinci-003", - "optional": true, - "id": "openAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.7, - "optional": true, - "id": "openAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-topP-number" - }, - { - "label": "Best Of", - "name": "bestOf", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-bestOf-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-presencePenalty-number" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "text-davinci-003", - "temperature": 0.7, - "maxTokens": "", - "topP": "", - "bestOf": "", - "frequencyPenalty": "", - "presencePenalty": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "name": "openAI", - "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 510.75932526856377, - "y": -44.80152395958956 - }, - "dragging": false - }, { "width": 300, "height": 405, @@ -196,7 +43,7 @@ } ], "inputs": { - "model": "{{openAI_1.data.instance}}", + "model": "{{openAI_0.data.instance}}", "prompt": "{{promptTemplate_0.data.instance}}", "chainName": "" }, @@ -292,20 +139,164 @@ "y": 506.7411400888471 }, "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "openAI_0", + "position": { + "x": 513.3297923232442, + "y": -42.67554802812833 + }, + "type": "customNode", + "data": { + "id": "openAI_0", + "label": "OpenAI", + "name": "openAI", + "type": "OpenAI", + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], + "category": "LLMs", + "description": "Wrapper around OpenAI large language models", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "text-davinci-003", + "name": "text-davinci-003" + }, + { + "label": "text-davinci-002", + "name": "text-davinci-002" + }, + { + "label": "text-curie-001", + "name": "text-curie-001" + }, + { + "label": "text-babbage-001", + "name": "text-babbage-001" + } + ], + "default": "text-davinci-003", + "optional": true, + "id": "openAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.7, + "optional": true, + "id": "openAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_0-input-topP-number" + }, + { + "label": "Best Of", + "name": "bestOf", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_0-input-bestOf-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_0-input-presencePenalty-number" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_0-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "text-davinci-003", + "temperature": 0.7, + "maxTokens": "", + "topP": "", + "bestOf": "", + "frequencyPenalty": "", + "presencePenalty": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "name": "openAI", + "label": "OpenAI", + "type": "OpenAI | BaseLLM | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 513.3297923232442, + "y": -42.67554802812833 + }, + "dragging": false } ], "edges": [ - { - "source": "openAI_1", - "sourceHandle": "openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", - "target": "llmChain_1", - "targetHandle": "llmChain_1-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "openAI_1-openAI_1-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-llmChain_1-llmChain_1-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, { "source": "promptTemplate_0", "sourceHandle": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", @@ -316,6 +307,17 @@ "data": { "label": "" } + }, + { + "source": "openAI_0", + "sourceHandle": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "target": "llmChain_1", + "targetHandle": "llmChain_1-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "openAI_0-openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-llmChain_1-llmChain_1-input-model-BaseLanguageModel", + "data": { + "label": "" + } } ] } diff --git a/packages/server/marketplaces/chatflows/Translator.json b/packages/server/marketplaces/chatflows/Translator.json index 942bbecd..00e002b9 100644 --- a/packages/server/marketplaces/chatflows/Translator.json +++ b/packages/server/marketplaces/chatflows/Translator.json @@ -1,157 +1,6 @@ { "description": "Language translation using LLM Chain with a Chat Prompt Template and Chat Model", "nodes": [ - { - "width": 300, - "height": 524, - "id": "chatOpenAI_1", - "position": { - "x": 439.5219561593599, - "y": 93.61600226758335 - }, - "type": "customNode", - "data": { - "id": "chatOpenAI_1", - "label": "ChatOpenAI", - "name": "chatOpenAI", - "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], - "category": "Chat Models", - "description": "Wrapper around OpenAI large language models that use the Chat endpoint", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_1-input-openAIApiKey-password" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "gpt-4", - "name": "gpt-4" - }, - { - "label": "gpt-4-0613", - "name": "gpt-4-0613" - }, - { - "label": "gpt-4-32k", - "name": "gpt-4-32k" - }, - { - "label": "gpt-4-32k-0613", - "name": "gpt-4-32k-0613" - }, - { - "label": "gpt-3.5-turbo", - "name": "gpt-3.5-turbo" - }, - { - "label": "gpt-3.5-turbo-0613", - "name": "gpt-3.5-turbo-0613" - }, - { - "label": "gpt-3.5-turbo-16k", - "name": "gpt-3.5-turbo-16k" - }, - { - "label": "gpt-3.5-turbo-16k-0613", - "name": "gpt-3.5-turbo-16k-0613" - } - ], - "default": "gpt-3.5-turbo", - "optional": true, - "id": "chatOpenAI_1-input-modelName-options" - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.9, - "optional": true, - "id": "chatOpenAI_1-input-temperature-number" - }, - { - "label": "Max Tokens", - "name": "maxTokens", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-maxTokens-number" - }, - { - "label": "Top Probability", - "name": "topP", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-topP-number" - }, - { - "label": "Frequency Penalty", - "name": "frequencyPenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-frequencyPenalty-number" - }, - { - "label": "Presence Penalty", - "name": "presencePenalty", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-presencePenalty-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", - "type": "string", - "optional": true, - "additionalParams": true, - "id": "chatOpenAI_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "gpt-3.5-turbo", - "temperature": 0.9, - "maxTokens": "", - "topP": "", - "frequencyPenalty": "", - "presencePenalty": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "name": "chatOpenAI", - "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 439.5219561593599, - "y": 93.61600226758335 - }, - "dragging": false - }, { "width": 300, "height": 405, @@ -194,7 +43,7 @@ } ], "inputs": { - "model": "{{chatOpenAI_1.data.instance}}", + "model": "{{chatOpenAI_0.data.instance}}", "prompt": "{{chatPromptTemplate_0.data.instance}}", "chainName": "Language Translation" }, @@ -299,20 +148,162 @@ "y": 649.7619214034173 }, "dragging": false + }, + { + "width": 300, + "height": 523, + "id": "chatOpenAI_0", + "position": { + "x": 436.97058562345904, + "y": 99.96180150605153 + }, + "type": "customNode", + "data": { + "id": "chatOpenAI_0", + "label": "ChatOpenAI", + "name": "chatOpenAI", + "type": "ChatOpenAI", + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], + "category": "Chat Models", + "description": "Wrapper around OpenAI large language models that use the Chat endpoint", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" + }, + { + "label": "Model Name", + "name": "modelName", + "type": "options", + "options": [ + { + "label": "gpt-4", + "name": "gpt-4" + }, + { + "label": "gpt-4-0613", + "name": "gpt-4-0613" + }, + { + "label": "gpt-4-32k", + "name": "gpt-4-32k" + }, + { + "label": "gpt-4-32k-0613", + "name": "gpt-4-32k-0613" + }, + { + "label": "gpt-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0613", + "name": "gpt-3.5-turbo-0613" + }, + { + "label": "gpt-3.5-turbo-16k", + "name": "gpt-3.5-turbo-16k" + }, + { + "label": "gpt-3.5-turbo-16k-0613", + "name": "gpt-3.5-turbo-16k-0613" + } + ], + "default": "gpt-3.5-turbo", + "optional": true, + "id": "chatOpenAI_0-input-modelName-options" + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true, + "id": "chatOpenAI_0-input-temperature-number" + }, + { + "label": "Max Tokens", + "name": "maxTokens", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-maxTokens-number" + }, + { + "label": "Top Probability", + "name": "topP", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-topP-number" + }, + { + "label": "Frequency Penalty", + "name": "frequencyPenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-frequencyPenalty-number" + }, + { + "label": "Presence Penalty", + "name": "presencePenalty", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-presencePenalty-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "chatOpenAI_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": "0", + "maxTokens": "", + "topP": "", + "frequencyPenalty": "", + "presencePenalty": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 436.97058562345904, + "y": 99.96180150605153 + }, + "dragging": false } ], "edges": [ - { - "source": "chatOpenAI_1", - "sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "target": "llmChain_1", - "targetHandle": "llmChain_1-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "chatOpenAI_1-chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-llmChain_1-llmChain_1-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, { "source": "chatPromptTemplate_0", "sourceHandle": "chatPromptTemplate_0-output-chatPromptTemplate-ChatPromptTemplate|BaseChatPromptTemplate|BasePromptTemplate", @@ -323,6 +314,17 @@ "data": { "label": "" } + }, + { + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "llmChain_1", + "targetHandle": "llmChain_1-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-llmChain_1-llmChain_1-input-model-BaseLanguageModel", + "data": { + "label": "" + } } ] } diff --git a/packages/server/marketplaces/chatflows/WebBrowser.json b/packages/server/marketplaces/chatflows/WebBrowser.json index f87fe07e..f83454d8 100644 --- a/packages/server/marketplaces/chatflows/WebBrowser.json +++ b/packages/server/marketplaces/chatflows/WebBrowser.json @@ -3,11 +3,195 @@ "nodes": [ { "width": 300, - "height": 524, + "height": 376, + "id": "bufferMemory_0", + "position": { + "x": 457.04304716743604, + "y": 362.4048129799687 + }, + "type": "customNode", + "data": { + "id": "bufferMemory_0", + "label": "Buffer Memory", + "name": "bufferMemory", + "type": "BufferMemory", + "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], + "category": "Memory", + "description": "Remembers previous conversational back and forths directly", + "inputParams": [ + { + "label": "Memory Key", + "name": "memoryKey", + "type": "string", + "default": "chat_history", + "id": "bufferMemory_0-input-memoryKey-string" + }, + { + "label": "Input Key", + "name": "inputKey", + "type": "string", + "default": "input", + "id": "bufferMemory_0-input-inputKey-string" + } + ], + "inputAnchors": [], + "inputs": { + "memoryKey": "chat_history", + "inputKey": "input" + }, + "outputAnchors": [ + { + "id": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", + "name": "bufferMemory", + "label": "BufferMemory", + "type": "BufferMemory | BaseChatMemory | BaseMemory" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 457.04304716743604, + "y": 362.4048129799687 + }, + "dragging": false + }, + { + "width": 300, + "height": 280, + "id": "webBrowser_0", + "position": { + "x": 1091.0866823400172, + "y": -16.43806989958216 + }, + "type": "customNode", + "data": { + "id": "webBrowser_0", + "label": "Web Browser", + "name": "webBrowser", + "type": "WebBrowser", + "baseClasses": ["WebBrowser", "Tool", "StructuredTool", "BaseLangChain"], + "category": "Tools", + "description": "Gives agent the ability to visit a website and extract information", + "inputParams": [], + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "webBrowser_0-input-model-BaseLanguageModel" + }, + { + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "webBrowser_0-input-embeddings-Embeddings" + } + ], + "inputs": { + "model": "{{chatOpenAI_0.data.instance}}", + "embeddings": "{{openAIEmbeddings_0.data.instance}}" + }, + "outputAnchors": [ + { + "id": "webBrowser_0-output-webBrowser-WebBrowser|Tool|StructuredTool|BaseLangChain", + "name": "webBrowser", + "label": "WebBrowser", + "type": "WebBrowser | Tool | StructuredTool | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1091.0866823400172, + "y": -16.43806989958216 + }, + "dragging": false + }, + { + "width": 300, + "height": 383, + "id": "conversationalAgent_0", + "position": { + "x": 1464.513303631911, + "y": 155.73036805253955 + }, + "type": "customNode", + "data": { + "id": "conversationalAgent_0", + "label": "Conversational Agent", + "name": "conversationalAgent", + "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", "position": { - "x": 348.0817836845733, - "y": -86.56099395751443 + "x": 734.7477982032904, + "y": -400.9979556765114 }, "type": "customNode", "data": { @@ -15,15 +199,16 @@ "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" }, { "label": "Model Name", @@ -132,14 +317,15 @@ "topP": "", "frequencyPenalty": "", "presencePenalty": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "outputs": {}, @@ -147,74 +333,18 @@ }, "selected": false, "positionAbsolute": { - "x": 348.0817836845733, - "y": -86.56099395751443 + "x": 734.7477982032904, + "y": -400.9979556765114 }, "dragging": false }, { "width": 300, - "height": 376, - "id": "bufferMemory_0", - "position": { - "x": 15.045898260926037, - "y": 114.13407401971622 - }, - "type": "customNode", - "data": { - "id": "bufferMemory_0", - "label": "Buffer Memory", - "name": "bufferMemory", - "type": "BufferMemory", - "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], - "category": "Memory", - "description": "Remembers previous conversational back and forths directly", - "inputParams": [ - { - "label": "Memory Key", - "name": "memoryKey", - "type": "string", - "default": "chat_history", - "id": "bufferMemory_0-input-memoryKey-string" - }, - { - "label": "Input Key", - "name": "inputKey", - "type": "string", - "default": "input", - "id": "bufferMemory_0-input-inputKey-string" - } - ], - "inputAnchors": [], - "inputs": { - "memoryKey": "chat_history", - "inputKey": "input" - }, - "outputAnchors": [ - { - "id": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", - "name": "bufferMemory", - "label": "BufferMemory", - "type": "BufferMemory | BaseChatMemory | BaseMemory" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 15.045898260926037, - "y": 114.13407401971622 - }, - "dragging": false - }, - { - "width": 300, - "height": 330, + "height": 329, "id": "openAIEmbeddings_0", "position": { - "x": 693.9266260641734, - "y": 37.098856540087496 + "x": 403.72014625628697, + "y": -103.82540449681527 }, "type": "customNode", "data": { @@ -227,10 +357,11 @@ "description": "OpenAI API to generate embeddings for a given text", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_0-input-credential-credential" }, { "label": "Strip New Lines", @@ -269,7 +400,8 @@ "inputs": { "stripNewLines": "", "batchSize": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { @@ -284,18 +416,18 @@ }, "selected": false, "positionAbsolute": { - "x": 693.9266260641734, - "y": 37.098856540087496 + "x": 403.72014625628697, + "y": -103.82540449681527 }, "dragging": false }, { "width": 300, - "height": 524, + "height": 523, "id": "chatOpenAI_1", "position": { - "x": 691.5132411896494, - "y": -533.1696369549378 + "x": 68.312124033115, + "y": -169.65476709991256 }, "type": "customNode", "data": { @@ -303,15 +435,16 @@ "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_1-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_1-input-credential-credential" }, { "label": "Model Name", @@ -420,14 +553,15 @@ "topP": "", "frequencyPenalty": "", "presencePenalty": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "id": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "outputs": {}, @@ -435,161 +569,13 @@ }, "selected": false, "positionAbsolute": { - "x": 691.5132411896494, - "y": -533.1696369549378 - }, - "dragging": false - }, - { - "width": 300, - "height": 280, - "id": "webBrowser_0", - "position": { - "x": 1091.0866823400172, - "y": -16.43806989958216 - }, - "type": "customNode", - "data": { - "id": "webBrowser_0", - "label": "Web Browser", - "name": "webBrowser", - "type": "WebBrowser", - "baseClasses": ["WebBrowser", "Tool", "StructuredTool", "BaseLangChain"], - "category": "Tools", - "description": "Gives agent the ability to visit a website and extract information", - "inputParams": [], - "inputAnchors": [ - { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "webBrowser_0-input-model-BaseLanguageModel" - }, - { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "webBrowser_0-input-embeddings-Embeddings" - } - ], - "inputs": { - "model": "{{chatOpenAI_1.data.instance}}", - "embeddings": "{{openAIEmbeddings_0.data.instance}}" - }, - "outputAnchors": [ - { - "id": "webBrowser_0-output-webBrowser-WebBrowser|Tool|StructuredTool|BaseLangChain", - "name": "webBrowser", - "label": "WebBrowser", - "type": "WebBrowser | Tool | StructuredTool | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1091.0866823400172, - "y": -16.43806989958216 - }, - "dragging": false - }, - { - "width": 300, - "height": 383, - "id": "conversationalAgent_0", - "position": { - "x": 1451.6222493253506, - "y": 239.69137914100338 - }, - "type": "customNode", - "data": { - "id": "conversationalAgent_0", - "label": "Conversational Agent", - "name": "conversationalAgent", - "type": "AgentExecutor", - "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], - "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, - "optional": true, - "additionalParams": true, - "id": "conversationalAgent_0-input-systemMessage-string" - }, - { - "label": "Human Message", - "name": "humanMessage", - "type": "string", - "rows": 4, - "optional": true, - "additionalParams": true, - "id": "conversationalAgent_0-input-humanMessage-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_0.data.instance}}", - "memory": "{{bufferMemory_0.data.instance}}", - "systemMessage": "", - "humanMessage": "" - }, - "outputAnchors": [ - { - "id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain|BaseLangChain", - "name": "conversationalAgent", - "label": "AgentExecutor", - "type": "AgentExecutor | BaseChain | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1451.6222493253506, - "y": 239.69137914100338 + "x": 68.312124033115, + "y": -169.65476709991256 }, "dragging": false } ], "edges": [ - { - "source": "chatOpenAI_1", - "sourceHandle": "chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "target": "webBrowser_0", - "targetHandle": "webBrowser_0-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "chatOpenAI_1-chatOpenAI_1-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-webBrowser_0-webBrowser_0-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, { "source": "openAIEmbeddings_0", "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", @@ -601,6 +587,28 @@ "label": "" } }, + { + "source": "chatOpenAI_0", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "target": "webBrowser_0", + "targetHandle": "webBrowser_0-input-model-BaseLanguageModel", + "type": "buttonedge", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-webBrowser_0-webBrowser_0-input-model-BaseLanguageModel", + "data": { + "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", "sourceHandle": "webBrowser_0-output-webBrowser-WebBrowser|Tool|StructuredTool|BaseLangChain", @@ -612,17 +620,6 @@ "label": "" } }, - { - "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", - "target": "conversationalAgent_0", - "targetHandle": "conversationalAgent_0-input-model-BaseLanguageModel", - "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-conversationalAgent_0-conversationalAgent_0-input-model-BaseLanguageModel", - "data": { - "label": "" - } - }, { "source": "bufferMemory_0", "sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", diff --git a/packages/server/marketplaces/chatflows/Github Repo QnA.json b/packages/server/marketplaces/chatflows/WebPage QnA.json similarity index 71% rename from packages/server/marketplaces/chatflows/Github Repo QnA.json rename to packages/server/marketplaces/chatflows/WebPage QnA.json index 73fbf304..ec287ec8 100644 --- a/packages/server/marketplaces/chatflows/Github Repo QnA.json +++ b/packages/server/marketplaces/chatflows/WebPage QnA.json @@ -1,351 +1,122 @@ { - "description": "Github repo QnA using conversational retrieval QA chain", + "description": "Scrape web pages for QnA using conversational retrieval QA chain", "nodes": [ { "width": 300, - "height": 376, - "id": "recursiveCharacterTextSplitter_1", + "height": 480, + "id": "conversationalRetrievalQAChain_0", "position": { - "x": 447.1038086695898, - "y": 126.52301921543597 + "x": 1574.2192193338556, + "y": 334.4358233039927 }, "type": "customNode", "data": { - "id": "recursiveCharacterTextSplitter_1", - "label": "Recursive Character Text Splitter", - "name": "recursiveCharacterTextSplitter", - "type": "RecursiveCharacterTextSplitter", - "baseClasses": ["RecursiveCharacterTextSplitter", "TextSplitter"], - "category": "Text Splitters", - "description": "Split documents recursively by different characters - starting with \"\n\n\", then \"\n\", then \" \"", + "id": "conversationalRetrievalQAChain_0", + "label": "Conversational Retrieval QA Chain", + "name": "conversationalRetrievalQAChain", + "type": "ConversationalRetrievalQAChain", + "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain"], + "category": "Chains", + "description": "Document QA - built on RetrievalQAChain to provide a chat history component", "inputParams": [ { - "label": "Chunk Size", - "name": "chunkSize", - "type": "number", - "default": 1000, - "optional": true, - "id": "recursiveCharacterTextSplitter_1-input-chunkSize-number" - }, - { - "label": "Chunk Overlap", - "name": "chunkOverlap", - "type": "number", - "optional": true, - "id": "recursiveCharacterTextSplitter_1-input-chunkOverlap-number" - } - ], - "inputAnchors": [], - "inputs": { - "chunkSize": 1000, - "chunkOverlap": "" - }, - "outputAnchors": [ - { - "id": "recursiveCharacterTextSplitter_1-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter", - "name": "recursiveCharacterTextSplitter", - "label": "RecursiveCharacterTextSplitter", - "type": "RecursiveCharacterTextSplitter | TextSplitter" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 447.1038086695898, - "y": 126.52301921543597 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 578, - "id": "github_1", - "position": { - "x": 836.9660489009947, - "y": -44.04171088580361 - }, - "type": "customNode", - "data": { - "id": "github_1", - "label": "Github", - "name": "github", - "type": "Document", - "baseClasses": ["Document"], - "category": "Document Loaders", - "description": "Load data from a GitHub repository", - "inputParams": [ - { - "label": "Repo Link", - "name": "repoLink", - "type": "string", - "placeholder": "https://github.com/FlowiseAI/Flowise", - "id": "github_1-input-repoLink-string" - }, - { - "label": "Branch", - "name": "branch", - "type": "string", - "default": "main", - "id": "github_1-input-branch-string" - }, - { - "label": "Access Token", - "name": "accessToken", - "type": "password", - "placeholder": "", - "optional": true, - "id": "github_1-input-accessToken-password" - }, - { - "label": "Recursive", - "name": "recursive", + "label": "Return Source Documents", + "name": "returnSourceDocuments", "type": "boolean", "optional": true, - "id": "github_1-input-recursive-boolean" + "id": "conversationalRetrievalQAChain_0-input-returnSourceDocuments-boolean" }, { - "label": "Metadata", - "name": "metadata", - "type": "json", - "optional": true, - "additionalParams": true, - "id": "github_1-input-metadata-json" - } - ], - "inputAnchors": [ - { - "label": "Text Splitter", - "name": "textSplitter", - "type": "TextSplitter", - "optional": true, - "id": "github_1-input-textSplitter-TextSplitter" - } - ], - "inputs": { - "repoLink": "", - "branch": "main", - "textSplitter": "{{recursiveCharacterTextSplitter_1.data.instance}}" - }, - "outputAnchors": [ - { - "id": "github_1-output-github-Document", - "name": "github", - "label": "Document", - "type": "Document" - } - ], - "outputs": {}, - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 836.9660489009947, - "y": -44.04171088580361 - }, - "dragging": false - }, - { - "width": 300, - "height": 330, - "id": "openAIEmbeddings_1", - "position": { - "x": 833.4085562012468, - "y": 541.7875676090047 - }, - "type": "customNode", - "data": { - "id": "openAIEmbeddings_1", - "label": "OpenAI Embeddings", - "name": "openAIEmbeddings", - "type": "OpenAIEmbeddings", - "baseClasses": ["OpenAIEmbeddings", "Embeddings"], - "category": "Embeddings", - "description": "OpenAI API to generate embeddings for a given text", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAIEmbeddings_1-input-openAIApiKey-password" - }, - { - "label": "Strip New Lines", - "name": "stripNewLines", - "type": "boolean", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-stripNewLines-boolean" - }, - { - "label": "Batch Size", - "name": "batchSize", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-batchSize-number" - }, - { - "label": "Timeout", - "name": "timeout", - "type": "number", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-timeout-number" - }, - { - "label": "BasePath", - "name": "basepath", + "label": "System Message", + "name": "systemMessagePrompt", "type": "string", - "optional": true, - "additionalParams": true, - "id": "openAIEmbeddings_1-input-basepath-string" - } - ], - "inputAnchors": [], - "inputs": { - "stripNewLines": "", - "batchSize": "", - "timeout": "" - }, - "outputAnchors": [ - { - "id": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "name": "openAIEmbeddings", - "label": "OpenAIEmbeddings", - "type": "OpenAIEmbeddings | Embeddings" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 833.4085562012468, - "y": 541.7875676090047 - }, - "selected": false, - "dragging": false - }, - { - "width": 300, - "height": 702, - "id": "pineconeUpsert_1", - "position": { - "x": 1268.7946529279823, - "y": 382.77997896801634 - }, - "type": "customNode", - "data": { - "id": "pineconeUpsert_1", - "label": "Pinecone Upsert Document", - "name": "pineconeUpsert", - "type": "Pinecone", - "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], - "category": "Vector Stores", - "description": "Upsert documents to Pinecone", - "inputParams": [ - { - "label": "Pinecone Api Key", - "name": "pineconeApiKey", - "type": "password", - "id": "pineconeUpsert_1-input-pineconeApiKey-password" - }, - { - "label": "Pinecone Environment", - "name": "pineconeEnv", - "type": "string", - "id": "pineconeUpsert_1-input-pineconeEnv-string" - }, - { - "label": "Pinecone Index", - "name": "pineconeIndex", - "type": "string", - "id": "pineconeUpsert_1-input-pineconeIndex-string" - }, - { - "label": "Pinecone Namespace", - "name": "pineconeNamespace", - "type": "string", - "placeholder": "my-first-namespace", - "optional": true, - "additionalParams": true, - "id": "pineconeUpsert_1-input-pineconeNamespace-string" - }, - { - "label": "Top K", - "name": "topK", - "description": "Number of top results to fetch. Default to 4", - "placeholder": "4", - "type": "number", + "rows": 4, "additionalParams": true, "optional": true, - "id": "pineconeUpsert_1-input-topK-number" - } - ], - "inputAnchors": [ - { - "label": "Document", - "name": "document", - "type": "Document", - "list": true, - "id": "pineconeUpsert_1-input-document-Document" + "placeholder": "I want you to act as a document that I am having a conversation with. Your name is \"AI Assistant\". You will provide me with answers from the given info. If the answer is not included, say exactly \"Hmm, I am not sure.\" and stop after that. Refuse to answer any question not about the info. Never break character.", + "id": "conversationalRetrievalQAChain_0-input-systemMessagePrompt-string" }, { - "label": "Embeddings", - "name": "embeddings", - "type": "Embeddings", - "id": "pineconeUpsert_1-input-embeddings-Embeddings" - } - ], - "inputs": { - "document": ["{{github_1.data.instance}}"], - "embeddings": "{{openAIEmbeddings_1.data.instance}}", - "pineconeEnv": "us-west4-gcp", - "pineconeIndex": "myindex", - "pineconeNamespace": "mynamespace" - }, - "outputAnchors": [ - { - "name": "output", - "label": "Output", + "label": "Chain Option", + "name": "chainOption", "type": "options", "options": [ { - "id": "pineconeUpsert_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "name": "retriever", - "label": "Pinecone Retriever", - "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + "label": "MapReduceDocumentsChain", + "name": "map_reduce", + "description": "Suitable for QA tasks over larger documents and can run the preprocessing step in parallel, reducing the running time" }, { - "id": "pineconeUpsert_1-output-vectorStore-Pinecone|VectorStore", - "name": "vectorStore", - "label": "Pinecone Vector Store", - "type": "Pinecone | VectorStore" + "label": "RefineDocumentsChain", + "name": "refine", + "description": "Suitable for QA tasks over a large number of documents." + }, + { + "label": "StuffDocumentsChain", + "name": "stuff", + "description": "Suitable for QA tasks over a small number of documents." } ], - "default": "retriever" + "additionalParams": true, + "optional": true, + "id": "conversationalRetrievalQAChain_0-input-chainOption-options" } ], - "outputs": { - "output": "retriever" + "inputAnchors": [ + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "conversationalRetrievalQAChain_0-input-model-BaseLanguageModel" + }, + { + "label": "Vector Store Retriever", + "name": "vectorStoreRetriever", + "type": "BaseRetriever", + "id": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever" + }, + { + "label": "Memory", + "name": "memory", + "type": "DynamoDBChatMemory | RedisBackedChatMemory | ZepMemory", + "optional": true, + "description": "If no memory connected, default BufferMemory will be used", + "id": "conversationalRetrievalQAChain_0-input-memory-DynamoDBChatMemory | RedisBackedChatMemory | ZepMemory" + } + ], + "inputs": { + "model": "{{chatOpenAI_0.data.instance}}", + "vectorStoreRetriever": "{{pineconeUpsert_0.data.instance}}", + "memory": "", + "returnSourceDocuments": "", + "systemMessagePrompt": "", + "chainOption": "" }, + "outputAnchors": [ + { + "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-ConversationalRetrievalQAChain|BaseChain", + "name": "conversationalRetrievalQAChain", + "label": "ConversationalRetrievalQAChain", + "type": "ConversationalRetrievalQAChain | BaseChain" + } + ], + "outputs": {}, "selected": false }, - "selected": false, - "dragging": false, "positionAbsolute": { - "x": 1268.7946529279823, - "y": 382.77997896801634 - } + "x": 1574.2192193338556, + "y": 334.4358233039927 + }, + "selected": false, + "dragging": false }, { "width": 300, - "height": 524, + "height": 523, "id": "chatOpenAI_0", "position": { - "x": 1271.1300438358664, - "y": -169.75707425097968 + "x": 1184.1176114500388, + "y": -44.15535835370571 }, "type": "customNode", "data": { @@ -353,15 +124,16 @@ "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "chatOpenAI_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "chatOpenAI_0-input-credential-credential" }, { "label": "Model Name", @@ -465,19 +237,103 @@ "inputAnchors": [], "inputs": { "modelName": "gpt-3.5-turbo", - "temperature": "0.5", + "temperature": "0", "maxTokens": "", "topP": "", "frequencyPenalty": "", "presencePenalty": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | BaseLangChain" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" + } + ], + "outputs": {}, + "selected": false + }, + "positionAbsolute": { + "x": 1184.1176114500388, + "y": -44.15535835370571 + }, + "selected": false, + "dragging": false + }, + { + "width": 300, + "height": 329, + "id": "openAIEmbeddings_0", + "position": { + "x": 795.6162477805387, + "y": 603.260214150876 + }, + "type": "customNode", + "data": { + "id": "openAIEmbeddings_0", + "label": "OpenAI Embeddings", + "name": "openAIEmbeddings", + "type": "OpenAIEmbeddings", + "baseClasses": ["OpenAIEmbeddings", "Embeddings"], + "category": "Embeddings", + "description": "OpenAI API to generate embeddings for a given text", + "inputParams": [ + { + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAIEmbeddings_0-input-credential-credential" + }, + { + "label": "Strip New Lines", + "name": "stripNewLines", + "type": "boolean", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-stripNewLines-boolean" + }, + { + "label": "Batch Size", + "name": "batchSize", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-batchSize-number" + }, + { + "label": "Timeout", + "name": "timeout", + "type": "number", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-timeout-number" + }, + { + "label": "BasePath", + "name": "basepath", + "type": "string", + "optional": true, + "additionalParams": true, + "id": "openAIEmbeddings_0-input-basepath-string" + } + ], + "inputAnchors": [], + "inputs": { + "stripNewLines": "", + "batchSize": "", + "timeout": "", + "basepath": "" + }, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" } ], "outputs": {}, @@ -485,104 +341,204 @@ }, "selected": false, "positionAbsolute": { - "x": 1271.1300438358664, - "y": -169.75707425097968 + "x": 795.6162477805387, + "y": 603.260214150876 }, "dragging": false }, { "width": 300, - "height": 280, - "id": "conversationalRetrievalQAChain_0", + "height": 555, + "id": "pineconeUpsert_0", "position": { - "x": 1653.6177539108153, - "y": 266.4856653480158 + "x": 1191.1792786926865, + "y": 514.2126330994578 }, "type": "customNode", "data": { - "id": "conversationalRetrievalQAChain_0", - "label": "Conversational Retrieval QA Chain", - "name": "conversationalRetrievalQAChain", - "type": "ConversationalRetrievalQAChain", - "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain", "BaseLangChain"], - "category": "Chains", - "description": "Document QA - built on RetrievalQAChain to provide a chat history component", + "id": "pineconeUpsert_0", + "label": "Pinecone Upsert Document", + "name": "pineconeUpsert", + "type": "Pinecone", + "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], + "category": "Vector Stores", + "description": "Upsert documents to Pinecone", "inputParams": [ { - "label": "Return Source Documents", - "name": "returnSourceDocuments", - "type": "boolean", - "optional": true, - "id": "conversationalRetrievalQAChain_0-input-returnSourceDocuments-boolean" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["pineconeApi"], + "id": "pineconeUpsert_0-input-credential-credential" }, { - "label": "System Message", - "name": "systemMessagePrompt", + "label": "Pinecone Index", + "name": "pineconeIndex", "type": "string", - "rows": 4, - "additionalParams": true, - "optional": true, - "placeholder": "I want you to act as a document that I am having a conversation with. Your name is \"AI Assistant\". You will provide me with answers from the given info. If the answer is not included, say exactly \"Hmm, I am not sure.\" and stop after that. Refuse to answer any question not about the info. Never break character.", - "id": "conversationalRetrievalQAChain_0-input-systemMessagePrompt-string" + "id": "pineconeUpsert_0-input-pineconeIndex-string" }, { - "label": "Chain Option", - "name": "chainOption", - "type": "options", - "options": [ - { - "label": "MapReduceDocumentsChain", - "name": "map_reduce", - "description": "Suitable for QA tasks over larger documents and can run the preprocessing step in parallel, reducing the running time" - }, - { - "label": "RefineDocumentsChain", - "name": "refine", - "description": "Suitable for QA tasks over a large number of documents." - }, - { - "label": "StuffDocumentsChain", - "name": "stuff", - "description": "Suitable for QA tasks over a small number of documents." - } - ], + "label": "Pinecone Namespace", + "name": "pineconeNamespace", + "type": "string", + "placeholder": "my-first-namespace", "additionalParams": true, "optional": true, - "id": "conversationalRetrievalQAChain_0-input-chainOption-options" + "id": "pineconeUpsert_0-input-pineconeNamespace-string" + }, + { + "label": "Top K", + "name": "topK", + "description": "Number of top results to fetch. Default to 4", + "placeholder": "4", + "type": "number", + "additionalParams": true, + "optional": true, + "id": "pineconeUpsert_0-input-topK-number" } ], "inputAnchors": [ { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "conversationalRetrievalQAChain_0-input-model-BaseLanguageModel" + "label": "Document", + "name": "document", + "type": "Document", + "list": true, + "id": "pineconeUpsert_0-input-document-Document" }, { - "label": "Vector Store Retriever", - "name": "vectorStoreRetriever", - "type": "BaseRetriever", - "id": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever" - }, - { - "label": "Memory", - "name": "memory", - "type": "DynamoDBChatMemory | RedisBackedChatMemory | ZepMemory", - "optional": true, - "description": "If no memory connected, default BufferMemory will be used", - "id": "conversationalRetrievalQAChain_0-input-memory-DynamoDBChatMemory | RedisBackedChatMemory | ZepMemory" + "label": "Embeddings", + "name": "embeddings", + "type": "Embeddings", + "id": "pineconeUpsert_0-input-embeddings-Embeddings" } ], "inputs": { - "model": "{{chatOpenAI_0.data.instance}}", - "vectorStoreRetriever": "{{pineconeUpsert_1.data.instance}}" + "document": ["{{cheerioWebScraper_0.data.instance}}"], + "embeddings": "{{openAIEmbeddings_0.data.instance}}", + "pineconeIndex": "", + "pineconeNamespace": "", + "topK": "" }, "outputAnchors": [ { - "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-ConversationalRetrievalQAChain|BaseChain|BaseLangChain", - "name": "conversationalRetrievalQAChain", - "label": "ConversationalRetrievalQAChain", - "type": "ConversationalRetrievalQAChain | BaseChain | BaseLangChain" + "name": "output", + "label": "Output", + "type": "options", + "options": [ + { + "id": "pineconeUpsert_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "name": "retriever", + "label": "Pinecone Retriever", + "type": "Pinecone | VectorStoreRetriever | BaseRetriever" + }, + { + "id": "pineconeUpsert_0-output-vectorStore-Pinecone|VectorStore", + "name": "vectorStore", + "label": "Pinecone Vector Store", + "type": "Pinecone | VectorStore" + } + ], + "default": "retriever" + } + ], + "outputs": { + "output": "retriever" + }, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1191.1792786926865, + "y": 514.2126330994578 + }, + "dragging": false + }, + { + "width": 300, + "height": 380, + "id": "cheerioWebScraper_0", + "position": { + "x": 788.9349009610441, + "y": 180.57790622561026 + }, + "type": "customNode", + "data": { + "id": "cheerioWebScraper_0", + "label": "Cheerio Web Scraper", + "name": "cheerioWebScraper", + "type": "Document", + "baseClasses": ["Document"], + "category": "Document Loaders", + "description": "Load data from webpages", + "inputParams": [ + { + "label": "URL", + "name": "url", + "type": "string", + "id": "cheerioWebScraper_0-input-url-string" + }, + { + "label": "Get Relative Links Method", + "name": "relativeLinksMethod", + "type": "options", + "description": "Select a method to retrieve relative links", + "options": [ + { + "label": "Web Crawl", + "name": "webCrawl", + "description": "Crawl relative links from HTML URL" + }, + { + "label": "Scrape XML Sitemap", + "name": "scrapeXMLSitemap", + "description": "Scrape relative links from XML sitemap URL" + } + ], + "optional": true, + "additionalParams": true, + "id": "cheerioWebScraper_0-input-relativeLinksMethod-options" + }, + { + "label": "Get Relative Links Limit", + "name": "limit", + "type": "number", + "optional": true, + "additionalParams": true, + "description": "Only used when \"Get Relative Links Method\" is selected. Set 0 to retrieve all relative links, default limit is 10.", + "warning": "Retreiving all links might take long time, and all links will be upserted again if the flow's state changed (eg: different URL, chunk size, etc)", + "id": "cheerioWebScraper_0-input-limit-number" + }, + { + "label": "Metadata", + "name": "metadata", + "type": "json", + "optional": true, + "additionalParams": true, + "id": "cheerioWebScraper_0-input-metadata-json" + } + ], + "inputAnchors": [ + { + "label": "Text Splitter", + "name": "textSplitter", + "type": "TextSplitter", + "optional": true, + "id": "cheerioWebScraper_0-input-textSplitter-TextSplitter" + } + ], + "inputs": { + "url": "https://www.itsjane.com", + "textSplitter": "{{recursiveCharacterTextSplitter_0.data.instance}}", + "relativeLinksMethod": "webCrawl", + "limit": "0", + "metadata": "" + }, + "outputAnchors": [ + { + "id": "cheerioWebScraper_0-output-cheerioWebScraper-Document", + "name": "cheerioWebScraper", + "label": "Document", + "type": "Document" } ], "outputs": {}, @@ -590,64 +546,121 @@ }, "selected": false, "positionAbsolute": { - "x": 1653.6177539108153, - "y": 266.4856653480158 + "x": 788.9349009610441, + "y": 180.57790622561026 + }, + "dragging": false + }, + { + "width": 300, + "height": 376, + "id": "recursiveCharacterTextSplitter_0", + "position": { + "x": 406.08456707531263, + "y": 197.66460328693972 + }, + "type": "customNode", + "data": { + "id": "recursiveCharacterTextSplitter_0", + "label": "Recursive Character Text Splitter", + "name": "recursiveCharacterTextSplitter", + "type": "RecursiveCharacterTextSplitter", + "baseClasses": ["RecursiveCharacterTextSplitter", "TextSplitter"], + "category": "Text Splitters", + "description": "Split documents recursively by different characters - starting with \"\\n\\n\", then \"\\n\", then \" \"", + "inputParams": [ + { + "label": "Chunk Size", + "name": "chunkSize", + "type": "number", + "default": 1000, + "optional": true, + "id": "recursiveCharacterTextSplitter_0-input-chunkSize-number" + }, + { + "label": "Chunk Overlap", + "name": "chunkOverlap", + "type": "number", + "optional": true, + "id": "recursiveCharacterTextSplitter_0-input-chunkOverlap-number" + } + ], + "inputAnchors": [], + "inputs": { + "chunkSize": 1000, + "chunkOverlap": "" + }, + "outputAnchors": [ + { + "id": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter", + "name": "recursiveCharacterTextSplitter", + "label": "RecursiveCharacterTextSplitter", + "type": "RecursiveCharacterTextSplitter | TextSplitter" + } + ], + "outputs": {}, + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 406.08456707531263, + "y": 197.66460328693972 }, "dragging": false } ], "edges": [ { - "source": "github_1", - "sourceHandle": "github_1-output-github-Document", - "target": "pineconeUpsert_1", - "targetHandle": "pineconeUpsert_1-input-document-Document", + "source": "openAIEmbeddings_0", + "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "target": "pineconeUpsert_0", + "targetHandle": "pineconeUpsert_0-input-embeddings-Embeddings", "type": "buttonedge", - "id": "github_1-github_1-output-github-Document-pineconeUpsert_1-pineconeUpsert_1-input-document-Document", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeUpsert_0-pineconeUpsert_0-input-embeddings-Embeddings", "data": { "label": "" } }, { - "source": "openAIEmbeddings_1", - "sourceHandle": "openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", - "target": "pineconeUpsert_1", - "targetHandle": "pineconeUpsert_1-input-embeddings-Embeddings", + "source": "pineconeUpsert_0", + "sourceHandle": "pineconeUpsert_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", + "target": "conversationalRetrievalQAChain_0", + "targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", "type": "buttonedge", - "id": "openAIEmbeddings_1-openAIEmbeddings_1-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeUpsert_1-pineconeUpsert_1-input-embeddings-Embeddings", - "data": { - "label": "" - } - }, - { - "source": "recursiveCharacterTextSplitter_1", - "sourceHandle": "recursiveCharacterTextSplitter_1-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter", - "target": "github_1", - "targetHandle": "github_1-input-textSplitter-TextSplitter", - "type": "buttonedge", - "id": "recursiveCharacterTextSplitter_1-recursiveCharacterTextSplitter_1-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter-github_1-github_1-input-textSplitter-TextSplitter", + "id": "pineconeUpsert_0-pineconeUpsert_0-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", "data": { "label": "" } }, { "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "conversationalRetrievalQAChain_0", "targetHandle": "conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|BaseLangChain-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseLanguageModel", "data": { "label": "" } }, { - "source": "pineconeUpsert_1", - "sourceHandle": "pineconeUpsert_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever", - "target": "conversationalRetrievalQAChain_0", - "targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "source": "recursiveCharacterTextSplitter_0", + "sourceHandle": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter", + "target": "cheerioWebScraper_0", + "targetHandle": "cheerioWebScraper_0-input-textSplitter-TextSplitter", "type": "buttonedge", - "id": "pineconeUpsert_1-pineconeUpsert_1-output-retriever-Pinecone|VectorStoreRetriever|BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "id": "recursiveCharacterTextSplitter_0-recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter-cheerioWebScraper_0-cheerioWebScraper_0-input-textSplitter-TextSplitter", + "data": { + "label": "" + } + }, + { + "source": "cheerioWebScraper_0", + "sourceHandle": "cheerioWebScraper_0-output-cheerioWebScraper-Document", + "target": "pineconeUpsert_0", + "targetHandle": "pineconeUpsert_0-input-document-Document", + "type": "buttonedge", + "id": "cheerioWebScraper_0-cheerioWebScraper_0-output-cheerioWebScraper-Document-pineconeUpsert_0-pineconeUpsert_0-input-document-Document", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/Zapier NLA.json b/packages/server/marketplaces/chatflows/Zapier NLA.json index 19b30107..4e315165 100644 --- a/packages/server/marketplaces/chatflows/Zapier NLA.json +++ b/packages/server/marketplaces/chatflows/Zapier NLA.json @@ -48,11 +48,65 @@ }, { "width": 300, - "height": 524, + "height": 280, + "id": "mrklAgentLLM_0", + "position": { + "x": 1002.5779315680477, + "y": 329.9701389591812 + }, + "type": "customNode", + "data": { + "id": "mrklAgentLLM_0", + "label": "MRKL Agent for LLMs", + "name": "mrklAgentLLM", + "type": "AgentExecutor", + "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], + "category": "Agents", + "description": "Agent that uses the ReAct Framework to decide what action to take, optimized to be used with LLMs", + "inputParams": [], + "inputAnchors": [ + { + "label": "Allowed Tools", + "name": "tools", + "type": "Tool", + "list": true, + "id": "mrklAgentLLM_0-input-tools-Tool" + }, + { + "label": "Language Model", + "name": "model", + "type": "BaseLanguageModel", + "id": "mrklAgentLLM_0-input-model-BaseLanguageModel" + } + ], + "inputs": { + "tools": ["{{zapierNLA_0.data.instance}}"], + "model": "{{openAI_0.data.instance}}" + }, + "outputAnchors": [ + { + "id": "mrklAgentLLM_0-output-mrklAgentLLM-AgentExecutor|BaseChain|BaseLangChain", + "name": "mrklAgentLLM", + "label": "AgentExecutor", + "type": "AgentExecutor | BaseChain | BaseLangChain" + } + ], + "outputs": {}, + "selected": false + }, + "positionAbsolute": { + "x": 1002.5779315680477, + "y": 329.9701389591812 + }, + "selected": false + }, + { + "width": 300, + "height": 523, "id": "openAI_0", "position": { - "x": 547.3867724775708, - "y": 394.1919189424442 + "x": 550.5957793208096, + "y": 378.30370661617934 }, "type": "customNode", "data": { @@ -60,15 +114,16 @@ "label": "OpenAI", "name": "openAI", "type": "OpenAI", - "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", "description": "Wrapper around OpenAI large language models", "inputParams": [ { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password", - "id": "openAI_0-input-openAIApiKey-password" + "label": "Connect Credential", + "name": "credential", + "type": "credential", + "credentialNames": ["openAIApi"], + "id": "openAI_0-input-credential-credential" }, { "label": "Model Name", @@ -179,14 +234,15 @@ "frequencyPenalty": "", "presencePenalty": "", "batchSize": "", - "timeout": "" + "timeout": "", + "basepath": "" }, "outputAnchors": [ { - "id": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", + "id": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "name": "openAI", "label": "OpenAI", - "type": "OpenAI | BaseLLM | BaseLanguageModel | BaseLangChain" + "type": "OpenAI | BaseLLM | BaseLanguageModel" } ], "outputs": {}, @@ -194,64 +250,10 @@ }, "selected": false, "positionAbsolute": { - "x": 547.3867724775708, - "y": 394.1919189424442 + "x": 550.5957793208096, + "y": 378.30370661617934 }, "dragging": false - }, - { - "width": 300, - "height": 280, - "id": "mrklAgentLLM_0", - "position": { - "x": 1002.5779315680477, - "y": 329.9701389591812 - }, - "type": "customNode", - "data": { - "id": "mrklAgentLLM_0", - "label": "MRKL Agent for LLMs", - "name": "mrklAgentLLM", - "type": "AgentExecutor", - "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], - "category": "Agents", - "description": "Agent that uses the ReAct Framework to decide what action to take, optimized to be used with LLMs", - "inputParams": [], - "inputAnchors": [ - { - "label": "Allowed Tools", - "name": "tools", - "type": "Tool", - "list": true, - "id": "mrklAgentLLM_0-input-tools-Tool" - }, - { - "label": "Language Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "mrklAgentLLM_0-input-model-BaseLanguageModel" - } - ], - "inputs": { - "tools": ["{{zapierNLA_0.data.instance}}"], - "model": "{{openAI_0.data.instance}}" - }, - "outputAnchors": [ - { - "id": "mrklAgentLLM_0-output-mrklAgentLLM-AgentExecutor|BaseChain|BaseLangChain", - "name": "mrklAgentLLM", - "label": "AgentExecutor", - "type": "AgentExecutor | BaseChain | BaseLangChain" - } - ], - "outputs": {}, - "selected": false - }, - "positionAbsolute": { - "x": 1002.5779315680477, - "y": 329.9701389591812 - }, - "selected": false } ], "edges": [ @@ -268,11 +270,11 @@ }, { "source": "openAI_0", - "sourceHandle": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain", + "sourceHandle": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "target": "mrklAgentLLM_0", "targetHandle": "mrklAgentLLM_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "openAI_0-openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel|BaseLangChain-mrklAgentLLM_0-mrklAgentLLM_0-input-model-BaseLanguageModel", + "id": "openAI_0-openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-mrklAgentLLM_0-mrklAgentLLM_0-input-model-BaseLanguageModel", "data": { "label": "" } From 6d2dae1a81a3592a29a7af73bbce850f2ef64b7f Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 15 Jul 2023 23:58:04 +0100 Subject: [PATCH 04/19] update README --- README.md | 23 ++++++++++++----------- docker/.env.example | 10 ++++++---- docker/docker-compose.yml | 2 ++ packages/server/.env.example | 7 ++++--- packages/server/README.md | 23 ++++++++++++----------- packages/server/src/commands/start.ts | 2 ++ 6 files changed, 38 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 5023a1b7..d490cb32 100644 --- a/README.md +++ b/README.md @@ -130,17 +130,18 @@ FLOWISE_PASSWORD=1234 Flowise support different environment variables to configure your instance. You can specify the following variables in the `.env` file inside `packages/server` folder. -| Variable | Description | Type | Default | -| ---------------- | ---------------------------------------------------------------- | ------------------------------------------------ | ----------------------------------- | -| PORT | The HTTP port Flowise runs on | Number | 3000 | -| FLOWISE_USERNAME | Username to login | String | -| FLOWISE_PASSWORD | Password to login | String | -| DEBUG | Print logs from components | Boolean | -| LOG_PATH | Location where log files are stored | String | `your-path/Flowise/logs` | -| LOG_LEVEL | Different levels of logs | Enum String: `error`, `info`, `verbose`, `debug` | `info` | -| DATABASE_PATH | Location where database is saved | String | `your-home-dir/.flowise` | -| APIKEY_PATH | Location where api keys are saved | String | `your-path/Flowise/packages/server` | -| EXECUTION_MODE | Whether predictions run in their own process or the main process | Enum String: `child`, `main` | `main` | +| Variable | Description | Type | Default | +| ---------------- | ---------------------------------------------------------------------------- | ------------------------------------------------ | ----------------------------------- | +| PORT | The HTTP port Flowise runs on | Number | 3000 | +| FLOWISE_USERNAME | Username to login | String | +| FLOWISE_PASSWORD | Password to login | String | +| DEBUG | Print logs from components | Boolean | +| LOG_PATH | Location where log files are stored | String | `your/path/Flowise/logs` | +| LOG_LEVEL | Different levels of logs | Enum String: `error`, `info`, `verbose`, `debug` | `info` | +| DATABASE_PATH | Location where database is saved | String | `your/home/dir/.flowise` | +| APIKEY_PATH | Location where api keys are saved | String | `your/path/Flowise/packages/server` | +| SECRETKEY_PATH | Location where encryption key (used to encrypt/decrypt credentials) is saved | String | `your/path/Flowise/packages/server` | +| EXECUTION_MODE | Whether predictions run in their own process or the main process | Enum String: `child`, `main` | `main` | You can also specify the env variables when using `npx`. For example: diff --git a/docker/.env.example b/docker/.env.example index 262e08a6..8ed3ac49 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -2,7 +2,9 @@ PORT=3000 # FLOWISE_USERNAME=user # FLOWISE_PASSWORD=1234 # DEBUG=true -# DATABASE_PATH=/your_database_path/.flowise -# APIKEY_PATH=/your_api_key_path/.flowise -# LOG_PATH=/your_log_path/logs -# EXECUTION_MODE=child or main +# DATABASE_PATH=/your/database/path/.flowise +# APIKEY_PATH=/your/api/key/path +# SECRETKEY_PATH=/your/secret/key/path +# LOG_PATH=/your/log/path +# LOG_LEVEL=debug (error | warn | info | verbose | debug) +# EXECUTION_MODE=main (child | main) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 3077c43d..87b82a39 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -10,6 +10,8 @@ services: - FLOWISE_PASSWORD=${FLOWISE_PASSWORD} - DATABASE_PATH=${DATABASE_PATH} - APIKEY_PATH=${APIKEY_PATH} + - SECRETKEY_PATH=${SECRETKEY_PATH} + - LOG_LEVEL=${LOG_LEVEL} - LOG_PATH=${LOG_PATH} - EXECUTION_MODE=${EXECUTION_MODE} - DEBUG=${DEBUG} diff --git a/packages/server/.env.example b/packages/server/.env.example index d9b2da76..8ed3ac49 100644 --- a/packages/server/.env.example +++ b/packages/server/.env.example @@ -2,8 +2,9 @@ PORT=3000 # FLOWISE_USERNAME=user # FLOWISE_PASSWORD=1234 # DEBUG=true -# DATABASE_PATH=/your_database_path/.flowise -# APIKEY_PATH=/your_api_key_path/.flowise -# LOG_PATH=/your_log_path/logs +# DATABASE_PATH=/your/database/path/.flowise +# APIKEY_PATH=/your/api/key/path +# SECRETKEY_PATH=/your/secret/key/path +# LOG_PATH=/your/log/path # LOG_LEVEL=debug (error | warn | info | verbose | debug) # EXECUTION_MODE=main (child | main) diff --git a/packages/server/README.md b/packages/server/README.md index fb3a0c12..0a92e3ef 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -33,17 +33,18 @@ FLOWISE_PASSWORD=1234 Flowise support different environment variables to configure your instance. You can specify the following variables in the `.env` file inside `packages/server` folder. -| Variable | Description | Type | Default | -| ---------------- | ---------------------------------------------------------------- | ------------------------------------------------ | ----------------------------------- | -| PORT | The HTTP port Flowise runs on | Number | 3000 | -| FLOWISE_USERNAME | Username to login | String | -| FLOWISE_PASSWORD | Password to login | String | -| DEBUG | Print logs from components | Boolean | -| LOG_PATH | Location where log files are stored | String | `your-path/Flowise/logs` | -| LOG_LEVEL | Different levels of logs | Enum String: `error`, `info`, `verbose`, `debug` | `info` | -| DATABASE_PATH | Location where database is saved | String | `your-home-dir/.flowise` | -| APIKEY_PATH | Location where api keys are saved | String | `your-path/Flowise/packages/server` | -| EXECUTION_MODE | Whether predictions run in their own process or the main process | Enum String: `child`, `main` | `main` | +| Variable | Description | Type | Default | +| ---------------- | ---------------------------------------------------------------------------- | ------------------------------------------------ | ----------------------------------- | +| PORT | The HTTP port Flowise runs on | Number | 3000 | +| FLOWISE_USERNAME | Username to login | String | +| FLOWISE_PASSWORD | Password to login | String | +| DEBUG | Print logs from components | Boolean | +| LOG_PATH | Location where log files are stored | String | `your/path/Flowise/logs` | +| LOG_LEVEL | Different levels of logs | Enum String: `error`, `info`, `verbose`, `debug` | `info` | +| DATABASE_PATH | Location where database is saved | String | `your/home/dir/.flowise` | +| APIKEY_PATH | Location where api keys are saved | String | `your/path/Flowise/packages/server` | +| SECRETKEY_PATH | Location where encryption key (used to encrypt/decrypt credentials) is saved | String | `your/path/Flowise/packages/server` | +| EXECUTION_MODE | Whether predictions run in their own process or the main process | Enum String: `child`, `main` | `main` | You can also specify the env variables when using `npx`. For example: diff --git a/packages/server/src/commands/start.ts b/packages/server/src/commands/start.ts index 276a3036..0ff0b4c1 100644 --- a/packages/server/src/commands/start.ts +++ b/packages/server/src/commands/start.ts @@ -22,6 +22,7 @@ export default class Start extends Command { DEBUG: Flags.string(), DATABASE_PATH: Flags.string(), APIKEY_PATH: Flags.string(), + SECRETKEY_PATH: Flags.string(), LOG_PATH: Flags.string(), LOG_LEVEL: Flags.string(), EXECUTION_MODE: Flags.string() @@ -61,6 +62,7 @@ export default class Start extends Command { if (flags.PORT) process.env.PORT = flags.PORT if (flags.DATABASE_PATH) process.env.DATABASE_PATH = flags.DATABASE_PATH if (flags.APIKEY_PATH) process.env.APIKEY_PATH = flags.APIKEY_PATH + if (flags.SECRETKEY_PATH) process.env.SECRETKEY_PATH = flags.SECRETKEY_PATH if (flags.LOG_PATH) process.env.LOG_PATH = flags.LOG_PATH if (flags.LOG_LEVEL) process.env.LOG_LEVEL = flags.LOG_LEVEL if (flags.EXECUTION_MODE) process.env.EXECUTION_MODE = flags.EXECUTION_MODE From 0665dcef55f686802355ee28f9896bcab5eb5715 Mon Sep 17 00:00:00 2001 From: Henry Date: Sun, 16 Jul 2023 14:55:03 +0100 Subject: [PATCH 05/19] update Readme --- README.md | 1 + docker/.env.example | 1 + docker/docker-compose.yml | 1 + packages/server/.env.example | 1 + packages/server/README.md | 1 + packages/server/src/commands/start.ts | 2 ++ 6 files changed, 7 insertions(+) diff --git a/README.md b/README.md index d490cb32..6a2289fb 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,7 @@ Flowise support different environment variables to configure your instance. You | Variable | Description | Type | Default | | ---------------- | ---------------------------------------------------------------------------- | ------------------------------------------------ | ----------------------------------- | | PORT | The HTTP port Flowise runs on | Number | 3000 | +| PASSPHRASE | Passphrase used to create encryption key | String | `MYPASSPHRASE` | | FLOWISE_USERNAME | Username to login | String | | FLOWISE_PASSWORD | Password to login | String | | DEBUG | Print logs from components | Boolean | diff --git a/docker/.env.example b/docker/.env.example index 8ed3ac49..29d592fc 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,4 +1,5 @@ PORT=3000 +PASSPHRASE=MYPASSPHRASE # Passphrase used to create encryption key # FLOWISE_USERNAME=user # FLOWISE_PASSWORD=1234 # DEBUG=true diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 87b82a39..dca9696b 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -6,6 +6,7 @@ services: restart: always environment: - PORT=${PORT} + - PASSPHRASE=${PASSPHRASE} - FLOWISE_USERNAME=${FLOWISE_USERNAME} - FLOWISE_PASSWORD=${FLOWISE_PASSWORD} - DATABASE_PATH=${DATABASE_PATH} diff --git a/packages/server/.env.example b/packages/server/.env.example index 8ed3ac49..29d592fc 100644 --- a/packages/server/.env.example +++ b/packages/server/.env.example @@ -1,4 +1,5 @@ PORT=3000 +PASSPHRASE=MYPASSPHRASE # Passphrase used to create encryption key # FLOWISE_USERNAME=user # FLOWISE_PASSWORD=1234 # DEBUG=true diff --git a/packages/server/README.md b/packages/server/README.md index 0a92e3ef..377cc313 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -36,6 +36,7 @@ Flowise support different environment variables to configure your instance. You | Variable | Description | Type | Default | | ---------------- | ---------------------------------------------------------------------------- | ------------------------------------------------ | ----------------------------------- | | PORT | The HTTP port Flowise runs on | Number | 3000 | +| PASSPHRASE | Passphrase used to create encryption key | String | `MYPASSPHRASE` | | FLOWISE_USERNAME | Username to login | String | | FLOWISE_PASSWORD | Password to login | String | | DEBUG | Print logs from components | Boolean | diff --git a/packages/server/src/commands/start.ts b/packages/server/src/commands/start.ts index 0ff0b4c1..49d665ba 100644 --- a/packages/server/src/commands/start.ts +++ b/packages/server/src/commands/start.ts @@ -19,6 +19,7 @@ export default class Start extends Command { FLOWISE_USERNAME: Flags.string(), FLOWISE_PASSWORD: Flags.string(), PORT: Flags.string(), + PASSPHRASE: Flags.string(), DEBUG: Flags.string(), DATABASE_PATH: Flags.string(), APIKEY_PATH: Flags.string(), @@ -60,6 +61,7 @@ export default class Start extends Command { if (flags.FLOWISE_USERNAME) process.env.FLOWISE_USERNAME = flags.FLOWISE_USERNAME if (flags.FLOWISE_PASSWORD) process.env.FLOWISE_PASSWORD = flags.FLOWISE_PASSWORD if (flags.PORT) process.env.PORT = flags.PORT + if (flags.PASSPHRASE) process.env.PASSPHRASE = flags.PASSPHRASE if (flags.DATABASE_PATH) process.env.DATABASE_PATH = flags.DATABASE_PATH if (flags.APIKEY_PATH) process.env.APIKEY_PATH = flags.APIKEY_PATH if (flags.SECRETKEY_PATH) process.env.SECRETKEY_PATH = flags.SECRETKEY_PATH From b454083eaf37cb379ff66688eebee1cbe420b45c Mon Sep 17 00:00:00 2001 From: chungyau97 Date: Tue, 25 Jul 2023 23:53:42 +0800 Subject: [PATCH 06/19] change parseInt to parseFloat --- packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts | 2 +- packages/components/nodes/llms/OpenAI/OpenAI.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts index 955563ff..bd9080c9 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts @@ -139,7 +139,7 @@ class ChatOpenAI_ChatModels implements INode { } if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) - if (topP) obj.topP = parseInt(topP, 10) + if (topP) obj.topP = parseFloat(topP) if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) if (presencePenalty) obj.presencePenalty = parseInt(presencePenalty, 10) if (timeout) obj.timeout = parseInt(timeout, 10) diff --git a/packages/components/nodes/llms/OpenAI/OpenAI.ts b/packages/components/nodes/llms/OpenAI/OpenAI.ts index b0af867d..1bf7486e 100644 --- a/packages/components/nodes/llms/OpenAI/OpenAI.ts +++ b/packages/components/nodes/llms/OpenAI/OpenAI.ts @@ -139,7 +139,7 @@ class OpenAI_LLMs implements INode { } if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) - if (topP) obj.topP = parseInt(topP, 10) + if (topP) obj.topP = parseFloat(topP) if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) if (presencePenalty) obj.presencePenalty = parseInt(presencePenalty, 10) if (timeout) obj.timeout = parseInt(timeout, 10) From 2ad873c34fd24242bd9be9dfd72e14a71a36af4d Mon Sep 17 00:00:00 2001 From: chungyau97 Date: Wed, 26 Jul 2023 01:13:16 +0800 Subject: [PATCH 07/19] modify parse for topP and topK --- .../nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts | 4 ++-- .../nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts | 4 ++-- .../components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts | 2 +- packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts | 2 +- .../nodes/llms/HuggingFaceInference/HuggingFaceInference.ts | 4 ++-- .../nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts | 2 +- .../nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts | 2 +- .../nodes/vectorstores/Faiss_Existing/Faiss_Existing.ts | 2 +- .../nodes/vectorstores/Faiss_Upsert/Faiss_Upsert.ts | 2 +- .../nodes/vectorstores/InMemory/InMemoryVectorStore.ts | 2 +- .../vectorstores/OpenSearch_Existing/OpenSearch_existing.ts | 2 +- .../nodes/vectorstores/OpenSearch_Upsert/OpenSearch_Upsert.ts | 2 +- .../nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts | 2 +- .../nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts | 2 +- .../nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts | 2 +- .../nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts | 2 +- .../vectorstores/Singlestore_Existing/Singlestore_Existing.ts | 2 +- .../vectorstores/Singlestore_Upsert/Singlestore_Upsert.ts | 2 +- .../vectorstores/Supabase_Existing/Supabase_Exisiting.ts | 2 +- .../nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts | 2 +- .../nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts | 2 +- .../nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts | 2 +- 22 files changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts index b65c7bd8..63343450 100644 --- a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts +++ b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts @@ -137,8 +137,8 @@ class ChatAnthropic_ChatModels implements INode { } if (maxTokensToSample) obj.maxTokensToSample = parseInt(maxTokensToSample, 10) - if (topP) obj.topP = parseInt(topP, 10) - if (topK) obj.topK = parseInt(topK, 10) + if (topP) obj.topP = parseFloat(topP) + if (topK) obj.topK = parseFloat(topK) const model = new ChatAnthropic(obj) return model diff --git a/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts b/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts index d92dd1e0..943af587 100644 --- a/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts +++ b/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts @@ -101,8 +101,8 @@ class ChatHuggingFace_ChatModels implements INode { if (temperature) obj.temperature = parseFloat(temperature) if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) - if (topP) obj.topP = parseInt(topP, 10) - if (hfTopK) obj.topK = parseInt(hfTopK, 10) + if (topP) obj.topP = parseFloat(topP) + if (hfTopK) obj.topK = parseFloat(hfTopK) if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) if (endpoint) obj.endpoint = endpoint diff --git a/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts b/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts index c5860b24..ffe2e769 100644 --- a/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts +++ b/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts @@ -80,7 +80,7 @@ class ChatLocalAI_ChatModels implements INode { } if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) - if (topP) obj.topP = parseInt(topP, 10) + if (topP) obj.topP = parseFloat(topP) if (timeout) obj.timeout = parseInt(timeout, 10) const model = new OpenAIChat(obj, { basePath }) diff --git a/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts b/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts index 130eed33..263dbe33 100644 --- a/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts +++ b/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts @@ -181,7 +181,7 @@ class AzureOpenAI_LLMs implements INode { } if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) - if (topP) obj.topP = parseInt(topP, 10) + if (topP) obj.topP = parseFloat(topP) if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) if (presencePenalty) obj.presencePenalty = parseInt(presencePenalty, 10) if (timeout) obj.timeout = parseInt(timeout, 10) diff --git a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts index 92eb46d5..33eedf2f 100644 --- a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts +++ b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts @@ -101,8 +101,8 @@ class HuggingFaceInference_LLMs implements INode { if (temperature) obj.temperature = parseFloat(temperature) if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) - if (topP) obj.topP = parseInt(topP, 10) - if (hfTopK) obj.topK = parseInt(hfTopK, 10) + if (topP) obj.topP = parseFloat(topP) + if (hfTopK) obj.topK = parseFloat(hfTopK) if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) if (endpoint) obj.endpoint = endpoint diff --git a/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts b/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts index 3ce93e87..e5dfe03e 100644 --- a/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts +++ b/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts @@ -69,7 +69,7 @@ class Chroma_Existing_VectorStores implements INode { const chromaURL = nodeData.inputs?.chromaURL as string const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const obj: { collectionName: string diff --git a/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts b/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts index f32fbb67..26f3c222 100644 --- a/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts +++ b/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts @@ -78,7 +78,7 @@ class ChromaUpsert_VectorStores implements INode { const chromaURL = nodeData.inputs?.chromaURL as string const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const flattenDocs = docs && docs.length ? flatten(docs) : [] const finalDocs = [] diff --git a/packages/components/nodes/vectorstores/Faiss_Existing/Faiss_Existing.ts b/packages/components/nodes/vectorstores/Faiss_Existing/Faiss_Existing.ts index 6dd18594..f3030305 100644 --- a/packages/components/nodes/vectorstores/Faiss_Existing/Faiss_Existing.ts +++ b/packages/components/nodes/vectorstores/Faiss_Existing/Faiss_Existing.ts @@ -64,7 +64,7 @@ class Faiss_Existing_VectorStores implements INode { const basePath = nodeData.inputs?.basePath as string const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const vectorStore = await FaissStore.load(basePath, embeddings) diff --git a/packages/components/nodes/vectorstores/Faiss_Upsert/Faiss_Upsert.ts b/packages/components/nodes/vectorstores/Faiss_Upsert/Faiss_Upsert.ts index 5e5f9028..e0fd9a52 100644 --- a/packages/components/nodes/vectorstores/Faiss_Upsert/Faiss_Upsert.ts +++ b/packages/components/nodes/vectorstores/Faiss_Upsert/Faiss_Upsert.ts @@ -73,7 +73,7 @@ class FaissUpsert_VectorStores implements INode { const output = nodeData.outputs?.output as string const basePath = nodeData.inputs?.basePath as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const flattenDocs = docs && docs.length ? flatten(docs) : [] const finalDocs = [] diff --git a/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts b/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts index 32a785a5..ac6ed0b2 100644 --- a/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts +++ b/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts @@ -64,7 +64,7 @@ class InMemoryVectorStore_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const flattenDocs = docs && docs.length ? flatten(docs) : [] const finalDocs = [] diff --git a/packages/components/nodes/vectorstores/OpenSearch_Existing/OpenSearch_existing.ts b/packages/components/nodes/vectorstores/OpenSearch_Existing/OpenSearch_existing.ts index 7aeac919..e0f05aad 100644 --- a/packages/components/nodes/vectorstores/OpenSearch_Existing/OpenSearch_existing.ts +++ b/packages/components/nodes/vectorstores/OpenSearch_Existing/OpenSearch_existing.ts @@ -70,7 +70,7 @@ class OpenSearch_Existing_VectorStores implements INode { const indexName = nodeData.inputs?.indexName as string const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const client = new Client({ nodes: [opensearchURL] diff --git a/packages/components/nodes/vectorstores/OpenSearch_Upsert/OpenSearch_Upsert.ts b/packages/components/nodes/vectorstores/OpenSearch_Upsert/OpenSearch_Upsert.ts index 8d54392b..c225f74a 100644 --- a/packages/components/nodes/vectorstores/OpenSearch_Upsert/OpenSearch_Upsert.ts +++ b/packages/components/nodes/vectorstores/OpenSearch_Upsert/OpenSearch_Upsert.ts @@ -79,7 +79,7 @@ class OpenSearchUpsert_VectorStores implements INode { const indexName = nodeData.inputs?.indexName as string const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const flattenDocs = docs && docs.length ? flatten(docs) : [] const finalDocs = [] diff --git a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts index e57da396..39e9f441 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts @@ -92,7 +92,7 @@ class Pinecone_Existing_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const client = new PineconeClient() await client.init({ diff --git a/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts b/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts index ad1767c2..136ccec2 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts @@ -93,7 +93,7 @@ class PineconeUpsert_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const client = new PineconeClient() await client.init({ diff --git a/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts b/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts index f1eef8f9..2dea9725 100644 --- a/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts +++ b/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts @@ -85,7 +85,7 @@ class Qdrant_Existing_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 // connect to Qdrant Cloud const client = new QdrantClient({ diff --git a/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts b/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts index dae1d31d..4f1ce91b 100644 --- a/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts +++ b/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts @@ -86,7 +86,7 @@ class QdrantUpsert_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 // connect to Qdrant Cloud const client = new QdrantClient({ diff --git a/packages/components/nodes/vectorstores/Singlestore_Existing/Singlestore_Existing.ts b/packages/components/nodes/vectorstores/Singlestore_Existing/Singlestore_Existing.ts index 1b37a400..25be06e7 100644 --- a/packages/components/nodes/vectorstores/Singlestore_Existing/Singlestore_Existing.ts +++ b/packages/components/nodes/vectorstores/Singlestore_Existing/Singlestore_Existing.ts @@ -121,7 +121,7 @@ class SingleStoreExisting_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 let vectorStore: SingleStoreVectorStore diff --git a/packages/components/nodes/vectorstores/Singlestore_Upsert/Singlestore_Upsert.ts b/packages/components/nodes/vectorstores/Singlestore_Upsert/Singlestore_Upsert.ts index eb00381d..88475529 100644 --- a/packages/components/nodes/vectorstores/Singlestore_Upsert/Singlestore_Upsert.ts +++ b/packages/components/nodes/vectorstores/Singlestore_Upsert/Singlestore_Upsert.ts @@ -130,7 +130,7 @@ class SingleStoreUpsert_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const flattenDocs = docs && docs.length ? flatten(docs) : [] const finalDocs = [] diff --git a/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts b/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts index 173660ca..08cf7ce4 100644 --- a/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts +++ b/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts @@ -89,7 +89,7 @@ class Supabase_Existing_VectorStores implements INode { const supabaseMetadataFilter = nodeData.inputs?.supabaseMetadataFilter const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const client = createClient(supabaseProjUrl, supabaseApiKey) diff --git a/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts b/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts index 69997a56..92398476 100644 --- a/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts +++ b/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts @@ -90,7 +90,7 @@ class SupabaseUpsert_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const client = createClient(supabaseProjUrl, supabaseApiKey) diff --git a/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts b/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts index 595691bd..0fa89e49 100644 --- a/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts +++ b/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts @@ -114,7 +114,7 @@ class Weaviate_Existing_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const clientConfig: any = { scheme: weaviateScheme, diff --git a/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts b/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts index 06137426..9565d8a2 100644 --- a/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts +++ b/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts @@ -123,7 +123,7 @@ class WeaviateUpsert_VectorStores implements INode { const embeddings = nodeData.inputs?.embeddings as Embeddings const output = nodeData.outputs?.output as string const topK = nodeData.inputs?.topK as string - const k = topK ? parseInt(topK, 10) : 4 + const k = topK ? parseFloat(topK) : 4 const clientConfig: any = { scheme: weaviateScheme, From 0a49234a16144e3f2b609d4ae8199c57d1b6fe4d Mon Sep 17 00:00:00 2001 From: chungyau97 Date: Thu, 27 Jul 2023 14:08:33 +0800 Subject: [PATCH 08/19] remove curly bracket in loaded document text --- .../nodes/chains/ConversationChain/ConversationChain.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts index 7b6f002d..d5b282c7 100644 --- a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts +++ b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts @@ -77,6 +77,9 @@ class ConversationChain_Chains implements INode { finalText += finalDocs[i].pageContent } + const replaceChar: string[] = ['{', '}'] + for (const char of replaceChar) finalText = finalText.replaceAll(char, '') + if (finalText) systemMessage = `${systemMessage}\nThe AI has the following context:\n${finalText}` const obj: any = { From 89a038cbd2eba2e91a36186c5dc14703a683ab0b Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Fri, 28 Jul 2023 00:21:42 +0900 Subject: [PATCH 09/19] Fix typo in ChildProcess.ts Initalize -> Initialize --- packages/server/src/ChildProcess.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/ChildProcess.ts b/packages/server/src/ChildProcess.ts index 2228cda6..996181fe 100644 --- a/packages/server/src/ChildProcess.ts +++ b/packages/server/src/ChildProcess.ts @@ -148,7 +148,7 @@ export class ChildProcess { } /** - * Initalize DB in child process + * Initialize DB in child process * @returns {DataSource} */ async function initDB() { From 05dd23b01de141dac505c226ca440447903e829b Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 28 Jul 2023 15:56:40 +0100 Subject: [PATCH 10/19] - update marketplaces - add version to nodes and credentials - hover over node actions --- .../credentials/AirtableApi.credential.ts | 2 + .../credentials/AnthropicApi.credential.ts | 2 + .../credentials/AzureOpenAIApi.credential.ts | 2 + .../credentials/BraveSearchApi.credential.ts | 2 + .../credentials/CohereApi.credential.ts | 2 + .../credentials/ConfluenceApi.credential.ts | 2 + .../DynamodbMemoryApi.credential.ts | 2 + .../credentials/FigmaApi.credential.ts | 2 + .../credentials/GithubApi.credential.ts | 2 + .../credentials/HuggingFaceApi.credential.ts | 2 + .../MotorheadMemoryApi.credential.ts | 2 + .../credentials/NotionApi.credential.ts | 2 + .../credentials/OpenAIApi.credential.ts | 2 + .../credentials/OpenAPIAuth.credential.ts | 2 + .../credentials/PineconeApi.credential.ts | 2 + .../credentials/QdrantApi.credential.ts | 2 + .../credentials/ReplicateApi.credential.ts | 2 + .../credentials/SerpApi.credential.ts | 2 + .../credentials/SerperApi.credential.ts | 2 + .../credentials/SingleStoreApi.credential.ts | 2 + .../credentials/SupabaseApi.credential.ts | 2 + .../credentials/WeaviateApi.credential.ts | 2 + .../credentials/ZapierNLAApi.credential.ts | 2 + .../credentials/ZepMemoryApi.credential.ts | 2 + .../agents/AirtableAgent/AirtableAgent.ts | 3 +- .../nodes/agents/AutoGPT/AutoGPT.ts | 2 + .../nodes/agents/BabyAGI/BabyAGI.ts | 2 + .../nodes/agents/CSVAgent/CSVAgent.ts | 2 + .../ConversationalAgent.ts | 2 + .../agents/MRKLAgentChat/MRKLAgentChat.ts | 2 + .../nodes/agents/MRKLAgentLLM/MRKLAgentLLM.ts | 2 + .../OpenAIFunctionAgent.ts | 2 + .../nodes/chains/ApiChain/GETApiChain.ts | 2 + .../nodes/chains/ApiChain/OpenAPIChain.ts | 4 +- .../nodes/chains/ApiChain/POSTApiChain.ts | 2 + .../ConversationChain/ConversationChain.ts | 2 + .../ConversationalRetrievalQAChain.ts | 2 + .../nodes/chains/LLMChain/LLMChain.ts | 2 + .../MultiPromptChain/MultiPromptChain.ts | 2 + .../MultiRetrievalQAChain.ts | 2 + .../RetrievalQAChain/RetrievalQAChain.ts | 2 + .../SqlDatabaseChain/SqlDatabaseChain.ts | 2 + .../chains/VectorDBQAChain/VectorDBQAChain.ts | 2 + .../AzureChatOpenAI/AzureChatOpenAI.ts | 11 +- .../chatmodels/ChatAnthropic/ChatAnthropic.ts | 6 + .../ChatHuggingFace/ChatHuggingFace.ts | 9 +- .../chatmodels/ChatLocalAI/ChatLocalAI.ts | 6 + .../nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts | 12 +- .../nodes/documentloaders/API/APILoader.ts | 2 + .../documentloaders/Airtable/Airtable.ts | 3 +- .../nodes/documentloaders/Cheerio/Cheerio.ts | 2 + .../documentloaders/Confluence/Confluence.ts | 2 + .../nodes/documentloaders/Csv/Csv.ts | 2 + .../nodes/documentloaders/Docx/Docx.ts | 2 + .../nodes/documentloaders/Figma/Figma.ts | 2 + .../nodes/documentloaders/Folder/Folder.ts | 2 + .../nodes/documentloaders/Gitbook/Gitbook.ts | 2 + .../nodes/documentloaders/Github/Github.ts | 2 + .../nodes/documentloaders/Json/Json.ts | 2 + .../documentloaders/Jsonlines/Jsonlines.ts | 2 + .../nodes/documentloaders/Notion/NotionDB.ts | 2 + .../documentloaders/Notion/NotionFolder.ts | 2 + .../documentloaders/Notion/NotionPage.ts | 2 + .../nodes/documentloaders/Pdf/Pdf.ts | 2 + .../documentloaders/Playwright/Playwright.ts | 2 + .../documentloaders/Puppeteer/Puppeteer.ts | 2 + .../documentloaders/Subtitles/Subtitles.ts | 2 + .../nodes/documentloaders/Text/Text.ts | 2 + .../AzureOpenAIEmbedding.ts | 2 + .../CohereEmbedding/CohereEmbedding.ts | 2 + .../HuggingFaceInferenceEmbedding.ts | 2 + .../LocalAIEmbedding/LocalAIEmbedding.ts | 2 + .../OpenAIEmbedding/OpenAIEmbedding.ts | 2 + .../nodes/llms/Azure OpenAI/AzureOpenAI.ts | 13 +- .../components/nodes/llms/Cohere/Cohere.ts | 4 + .../HuggingFaceInference.ts | 9 +- .../components/nodes/llms/OpenAI/OpenAI.ts | 14 +- .../nodes/llms/Replicate/Replicate.ts | 6 + .../nodes/memory/BufferMemory/BufferMemory.ts | 2 + .../BufferWindowMemory/BufferWindowMemory.ts | 2 + .../ConversationSummaryMemory.ts | 2 + .../nodes/memory/DynamoDb/DynamoDb.ts | 2 + .../memory/MotorheadMemory/MotorheadMemory.ts | 2 + .../RedisBackedChatMemory.ts | 2 + .../nodes/memory/ZepMemory/ZepMemory.ts | 3 +- .../ChatPromptTemplate/ChatPromptTemplate.ts | 2 + .../FewShotPromptTemplate.ts | 2 + .../prompts/PromptTemplate/PromptTemplate.ts | 2 + .../retrievers/HydeRetriever/HydeRetriever.ts | 2 + .../PromptRetriever/PromptRetriever.ts | 2 + .../VectorStoreRetriever.ts | 2 + .../CharacterTextSplitter.ts | 2 + .../CodeTextSplitter/CodeTextSplitter.ts | 2 + .../HtmlToMarkdownTextSplitter.ts | 2 + .../MarkdownTextSplitter.ts | 2 + .../RecursiveCharacterTextSplitter.ts | 2 + .../TokenTextSplitter/TokenTextSplitter.ts | 2 + .../nodes/tools/AIPlugin/AIPlugin.ts | 2 + .../tools/BraveSearchAPI/BraveSearchAPI.ts | 2 + .../nodes/tools/Calculator/Calculator.ts | 2 + .../nodes/tools/ChainTool/ChainTool.ts | 2 + .../nodes/tools/CustomTool/CustomTool.ts | 2 + .../nodes/tools/MakeWebhook/MakeWebhook.ts | 2 + .../tools/OpenAPIToolkit/OpenAPIToolkit.ts | 2 + .../nodes/tools/ReadFile/ReadFile.ts | 2 + .../nodes/tools/RequestsGet/RequestsGet.ts | 2 + .../nodes/tools/RequestsPost/RequestsPost.ts | 2 + .../components/nodes/tools/SerpAPI/SerpAPI.ts | 2 + .../components/nodes/tools/Serper/Serper.ts | 2 + .../nodes/tools/WebBrowser/WebBrowser.ts | 2 + .../nodes/tools/WriteFile/WriteFile.ts | 2 + .../nodes/tools/ZapierNLA/ZapierNLA.ts | 2 + .../Chroma_Existing/Chroma_Existing.ts | 2 + .../Chroma_Upsert/Chroma_Upsert.ts | 2 + .../Faiss_Existing/Faiss_Existing.ts | 2 + .../vectorstores/Faiss_Upsert/Faiss_Upsert.ts | 2 + .../InMemory/InMemoryVectorStore.ts | 2 + .../OpenSearch_existing.ts | 2 + .../OpenSearch_Upsert/OpenSearch_Upsert.ts | 2 + .../Pinecone_Existing/Pinecone_Existing.ts | 2 + .../Pinecone_Upsert/Pinecone_Upsert.ts | 2 + .../Qdrant_Existing/Qdrant_Existing.ts | 2 + .../Qdrant_Upsert/Qdrant_Upsert.ts | 2 + .../Singlestore_Existing.ts | 2 + .../Singlestore_Upsert/Singlestore_Upsert.ts | 2 + .../Supabase_Existing/Supabase_Exisiting.ts | 2 + .../Supabase_Upsert/Supabase_Upsert.ts | 2 + .../Weaviate_Existing/Weaviate_Existing.ts | 2 + .../Weaviate_Upsert/Weaviate_Upsert.ts | 2 + packages/components/src/Interface.ts | 1 + .../chatflows/API Agent OpenAI.json | 20 +- .../marketplaces/chatflows/API Agent.json | 9 + .../marketplaces/chatflows/Antonym.json | 4 + .../marketplaces/chatflows/AutoGPT.json | 7 + .../marketplaces/chatflows/BabyAGI.json | 4 + .../marketplaces/chatflows/CSV Agent.json | 2 + .../marketplaces/chatflows/ChatGPTPlugin.json | 5 + .../marketplaces/chatflows/Claude LLM.json | 4 + .../chatflows/Conversational Agent.json | 5 + .../Conversational Retrieval QA Chain.json | 6 + .../chatflows/Flowise Docs QnA.json | 6 + .../chatflows/HuggingFace LLM Chain.json | 3 + .../marketplaces/chatflows/Local QnA.json | 6 + .../chatflows/Long Term Memory.json | 5 + .../marketplaces/chatflows/MRKLAgent.json | 4 + .../chatflows/Metadata Filter Load.json | 4 + .../chatflows/Metadata Filter Upsert.json | 7 + .../chatflows/Multi Prompt Chain.json | 5 + .../chatflows/Multi Retrieval QA Chain.json | 9 + .../chatflows/Multiple VectorDB.json | 12 + .../marketplaces/chatflows/OpenAI Agent.json | 6 + .../chatflows/Prompt Chaining.json | 6 + .../marketplaces/chatflows/Replicate LLM.json | 3 + .../marketplaces/chatflows/SQL DB Chain.json | 2 + .../chatflows/Simple Conversation Chain.json | 3 + .../chatflows/Simple LLM Chain.json | 3 + .../marketplaces/chatflows/Translator.json | 3 + .../marketplaces/chatflows/WebBrowser.json | 6 + .../marketplaces/chatflows/WebPage QnA.json | 7 + .../marketplaces/chatflows/Zapier NLA.json | 3 + packages/server/src/index.ts | 6 + packages/ui/src/api/config.js | 4 +- packages/ui/src/assets/images/account.png | Bin 0 -> 20187 bytes packages/ui/src/assets/images/robot.png | Bin 0 -> 16382 bytes packages/ui/src/store/actions.js | 2 + .../ui/src/store/context/ReactFlowContext.js | 6 + .../ui/src/store/reducers/canvasReducer.js | 14 +- packages/ui/src/themes/palette.js | 4 + .../dialog/AdditionalParamsDialog.js | 1 + .../ui-component/dialog/ExpandTextDialog.js | 1 + .../dialog/FormatPromptValuesDialog.js | 1 + .../src/ui-component/dialog/NodeInfoDialog.js | 141 +++++++++ packages/ui/src/ui-component/input/Input.js | 2 +- packages/ui/src/utils/genericHelper.js | 1 + packages/ui/src/views/canvas/AddNodes.js | 11 +- packages/ui/src/views/canvas/CanvasNode.js | 283 +++++++++++------- .../ui/src/views/chatmessage/ChatMessage.js | 19 +- .../credentials/AddEditCredentialDialog.js | 7 + .../views/credentials/CredentialListDialog.js | 15 +- packages/ui/src/views/credentials/index.js | 4 +- packages/ui/src/views/tools/ToolDialog.js | 7 + 181 files changed, 884 insertions(+), 148 deletions(-) create mode 100644 packages/ui/src/assets/images/account.png create mode 100644 packages/ui/src/assets/images/robot.png create mode 100644 packages/ui/src/ui-component/dialog/NodeInfoDialog.js diff --git a/packages/components/credentials/AirtableApi.credential.ts b/packages/components/credentials/AirtableApi.credential.ts index 7123c92d..323b308f 100644 --- a/packages/components/credentials/AirtableApi.credential.ts +++ b/packages/components/credentials/AirtableApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class AirtableApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Airtable API' this.name = 'airtableApi' + this.version = 1.0 this.description = 'Refer to official guide on how to get accessToken on Airtable' this.inputs = [ diff --git a/packages/components/credentials/AnthropicApi.credential.ts b/packages/components/credentials/AnthropicApi.credential.ts index 448128f1..955196c9 100644 --- a/packages/components/credentials/AnthropicApi.credential.ts +++ b/packages/components/credentials/AnthropicApi.credential.ts @@ -3,11 +3,13 @@ import { INodeParams, INodeCredential } from '../src/Interface' class AnthropicApi implements INodeCredential { label: string name: string + version: number inputs: INodeParams[] constructor() { this.label = 'Anthropic API' this.name = 'anthropicApi' + this.version = 1.0 this.inputs = [ { label: 'Anthropic Api Key', diff --git a/packages/components/credentials/AzureOpenAIApi.credential.ts b/packages/components/credentials/AzureOpenAIApi.credential.ts index e880c91c..65f63f37 100644 --- a/packages/components/credentials/AzureOpenAIApi.credential.ts +++ b/packages/components/credentials/AzureOpenAIApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class AzureOpenAIApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Azure OpenAI API' this.name = 'azureOpenAIApi' + this.version = 1.0 this.description = 'Refer to official guide of how to use Azure OpenAI service' this.inputs = [ diff --git a/packages/components/credentials/BraveSearchApi.credential.ts b/packages/components/credentials/BraveSearchApi.credential.ts index 2f713542..fdacf82c 100644 --- a/packages/components/credentials/BraveSearchApi.credential.ts +++ b/packages/components/credentials/BraveSearchApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class BraveSearchApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Brave Search API' this.name = 'braveSearchApi' + this.version = 1.0 this.inputs = [ { label: 'BraveSearch Api Key', diff --git a/packages/components/credentials/CohereApi.credential.ts b/packages/components/credentials/CohereApi.credential.ts index 488644a2..b171090e 100644 --- a/packages/components/credentials/CohereApi.credential.ts +++ b/packages/components/credentials/CohereApi.credential.ts @@ -3,11 +3,13 @@ import { INodeParams, INodeCredential } from '../src/Interface' class CohereApi implements INodeCredential { label: string name: string + version: number inputs: INodeParams[] constructor() { this.label = 'Cohere API' this.name = 'cohereApi' + this.version = 1.0 this.inputs = [ { label: 'Cohere Api Key', diff --git a/packages/components/credentials/ConfluenceApi.credential.ts b/packages/components/credentials/ConfluenceApi.credential.ts index 75ea1d88..a1d32e9c 100644 --- a/packages/components/credentials/ConfluenceApi.credential.ts +++ b/packages/components/credentials/ConfluenceApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class ConfluenceApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Confluence API' this.name = 'confluenceApi' + this.version = 1.0 this.description = 'Refer to official guide on how to get accessToken on Confluence' this.inputs = [ diff --git a/packages/components/credentials/DynamodbMemoryApi.credential.ts b/packages/components/credentials/DynamodbMemoryApi.credential.ts index 5bdfce37..2f5ffa64 100644 --- a/packages/components/credentials/DynamodbMemoryApi.credential.ts +++ b/packages/components/credentials/DynamodbMemoryApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class DynamodbMemoryApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'DynamodbMemory API' this.name = 'dynamodbMemoryApi' + this.version = 1.0 this.inputs = [ { label: 'Access Key', diff --git a/packages/components/credentials/FigmaApi.credential.ts b/packages/components/credentials/FigmaApi.credential.ts index 49638885..aed49359 100644 --- a/packages/components/credentials/FigmaApi.credential.ts +++ b/packages/components/credentials/FigmaApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class FigmaApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Figma API' this.name = 'figmaApi' + this.version = 1.0 this.description = 'Refer to official guide on how to get accessToken on Figma' this.inputs = [ diff --git a/packages/components/credentials/GithubApi.credential.ts b/packages/components/credentials/GithubApi.credential.ts index ffbe4739..34c5074e 100644 --- a/packages/components/credentials/GithubApi.credential.ts +++ b/packages/components/credentials/GithubApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class GithubApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Github API' this.name = 'githubApi' + this.version = 1.0 this.description = 'Refer to official guide on how to get accessToken on Github' this.inputs = [ diff --git a/packages/components/credentials/HuggingFaceApi.credential.ts b/packages/components/credentials/HuggingFaceApi.credential.ts index 2dae4319..1b922194 100644 --- a/packages/components/credentials/HuggingFaceApi.credential.ts +++ b/packages/components/credentials/HuggingFaceApi.credential.ts @@ -3,11 +3,13 @@ import { INodeParams, INodeCredential } from '../src/Interface' class HuggingFaceApi implements INodeCredential { label: string name: string + version: number inputs: INodeParams[] constructor() { this.label = 'HuggingFace API' this.name = 'huggingFaceApi' + this.version = 1.0 this.inputs = [ { label: 'HuggingFace Api Key', diff --git a/packages/components/credentials/MotorheadMemoryApi.credential.ts b/packages/components/credentials/MotorheadMemoryApi.credential.ts index 937a9402..68a18ec1 100644 --- a/packages/components/credentials/MotorheadMemoryApi.credential.ts +++ b/packages/components/credentials/MotorheadMemoryApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class MotorheadMemoryApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Motorhead Memory API' this.name = 'motorheadMemoryApi' + this.version = 1.0 this.description = 'Refer to official guide on how to create API key and Client ID on Motorhead Memory' this.inputs = [ diff --git a/packages/components/credentials/NotionApi.credential.ts b/packages/components/credentials/NotionApi.credential.ts index 47d03f3e..ebe4bf99 100644 --- a/packages/components/credentials/NotionApi.credential.ts +++ b/packages/components/credentials/NotionApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class NotionApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Notion API' this.name = 'notionApi' + this.version = 1.0 this.description = 'You can find integration token here' this.inputs = [ diff --git a/packages/components/credentials/OpenAIApi.credential.ts b/packages/components/credentials/OpenAIApi.credential.ts index 9aebf049..836da7e9 100644 --- a/packages/components/credentials/OpenAIApi.credential.ts +++ b/packages/components/credentials/OpenAIApi.credential.ts @@ -3,11 +3,13 @@ import { INodeParams, INodeCredential } from '../src/Interface' class OpenAIApi implements INodeCredential { label: string name: string + version: number inputs: INodeParams[] constructor() { this.label = 'OpenAI API' this.name = 'openAIApi' + this.version = 1.0 this.inputs = [ { label: 'OpenAI Api Key', diff --git a/packages/components/credentials/OpenAPIAuth.credential.ts b/packages/components/credentials/OpenAPIAuth.credential.ts index 7cc2d318..3f0ef907 100644 --- a/packages/components/credentials/OpenAPIAuth.credential.ts +++ b/packages/components/credentials/OpenAPIAuth.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class OpenAPIAuth implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'OpenAPI Auth Token' this.name = 'openAPIAuth' + this.version = 1.0 this.inputs = [ { label: 'OpenAPI Token', diff --git a/packages/components/credentials/PineconeApi.credential.ts b/packages/components/credentials/PineconeApi.credential.ts index 393bfd46..4c5f62fe 100644 --- a/packages/components/credentials/PineconeApi.credential.ts +++ b/packages/components/credentials/PineconeApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class PineconeApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Pinecone API' this.name = 'pineconeApi' + this.version = 1.0 this.inputs = [ { label: 'Pinecone Api Key', diff --git a/packages/components/credentials/QdrantApi.credential.ts b/packages/components/credentials/QdrantApi.credential.ts index 1738cc45..fffebccc 100644 --- a/packages/components/credentials/QdrantApi.credential.ts +++ b/packages/components/credentials/QdrantApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class QdrantApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Qdrant API' this.name = 'qdrantApi' + this.version = 1.0 this.inputs = [ { label: 'Qdrant API Key', diff --git a/packages/components/credentials/ReplicateApi.credential.ts b/packages/components/credentials/ReplicateApi.credential.ts index bef3e9a4..e638826b 100644 --- a/packages/components/credentials/ReplicateApi.credential.ts +++ b/packages/components/credentials/ReplicateApi.credential.ts @@ -3,11 +3,13 @@ import { INodeParams, INodeCredential } from '../src/Interface' class ReplicateApi implements INodeCredential { label: string name: string + version: number inputs: INodeParams[] constructor() { this.label = 'Replicate API' this.name = 'replicateApi' + this.version = 1.0 this.inputs = [ { label: 'Replicate Api Key', diff --git a/packages/components/credentials/SerpApi.credential.ts b/packages/components/credentials/SerpApi.credential.ts index 0c18b103..20cf6ab5 100644 --- a/packages/components/credentials/SerpApi.credential.ts +++ b/packages/components/credentials/SerpApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class SerpApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Serp API' this.name = 'serpApi' + this.version = 1.0 this.inputs = [ { label: 'Serp Api Key', diff --git a/packages/components/credentials/SerperApi.credential.ts b/packages/components/credentials/SerperApi.credential.ts index 71e61b32..9a8fee1e 100644 --- a/packages/components/credentials/SerperApi.credential.ts +++ b/packages/components/credentials/SerperApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class SerperApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Serper API' this.name = 'serperApi' + this.version = 1.0 this.inputs = [ { label: 'Serper Api Key', diff --git a/packages/components/credentials/SingleStoreApi.credential.ts b/packages/components/credentials/SingleStoreApi.credential.ts index deb73b45..fee9853b 100644 --- a/packages/components/credentials/SingleStoreApi.credential.ts +++ b/packages/components/credentials/SingleStoreApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class SingleStoreApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'SingleStore API' this.name = 'singleStoreApi' + this.version = 1.0 this.inputs = [ { label: 'User', diff --git a/packages/components/credentials/SupabaseApi.credential.ts b/packages/components/credentials/SupabaseApi.credential.ts index d485e401..beb2a422 100644 --- a/packages/components/credentials/SupabaseApi.credential.ts +++ b/packages/components/credentials/SupabaseApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class SupabaseApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Supabase API' this.name = 'supabaseApi' + this.version = 1.0 this.inputs = [ { label: 'Supabase API Key', diff --git a/packages/components/credentials/WeaviateApi.credential.ts b/packages/components/credentials/WeaviateApi.credential.ts index 3d5dd5b9..041b41ea 100644 --- a/packages/components/credentials/WeaviateApi.credential.ts +++ b/packages/components/credentials/WeaviateApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class WeaviateApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Weaviate API' this.name = 'weaviateApi' + this.version = 1.0 this.inputs = [ { label: 'Weaviate API Key', diff --git a/packages/components/credentials/ZapierNLAApi.credential.ts b/packages/components/credentials/ZapierNLAApi.credential.ts index 03cb01b8..72035660 100644 --- a/packages/components/credentials/ZapierNLAApi.credential.ts +++ b/packages/components/credentials/ZapierNLAApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class ZapierNLAApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Zapier NLA API' this.name = 'zapierNLAApi' + this.version = 1.0 this.inputs = [ { label: 'Zapier NLA Api Key', diff --git a/packages/components/credentials/ZepMemoryApi.credential.ts b/packages/components/credentials/ZepMemoryApi.credential.ts index d886328b..a78ad6d6 100644 --- a/packages/components/credentials/ZepMemoryApi.credential.ts +++ b/packages/components/credentials/ZepMemoryApi.credential.ts @@ -3,12 +3,14 @@ import { INodeParams, INodeCredential } from '../src/Interface' class ZepMemoryApi implements INodeCredential { label: string name: string + version: number description: string inputs: INodeParams[] constructor() { this.label = 'Zep Memory API' this.name = 'zepMemoryApi' + this.version = 1.0 this.description = 'Refer to official guide on how to create API key on Zep' this.inputs = [ diff --git a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts index 3dc48473..074f39c1 100644 --- a/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts +++ b/packages/components/nodes/agents/AirtableAgent/AirtableAgent.ts @@ -10,6 +10,7 @@ import axios from 'axios' class Airtable_Agents implements INode { label: string name: string + version: number description: string type: string icon: string @@ -21,6 +22,7 @@ class Airtable_Agents implements INode { constructor() { this.label = 'Airtable Agent' this.name = 'airtableAgent' + this.version = 1.0 this.type = 'AgentExecutor' this.category = 'Agents' this.icon = 'airtable.svg' @@ -67,7 +69,6 @@ class Airtable_Agents implements INode { name: 'limit', type: 'number', default: 100, - step: 1, additionalParams: true, description: 'Number of results to return' } diff --git a/packages/components/nodes/agents/AutoGPT/AutoGPT.ts b/packages/components/nodes/agents/AutoGPT/AutoGPT.ts index 044b6f7b..69e9b9ed 100644 --- a/packages/components/nodes/agents/AutoGPT/AutoGPT.ts +++ b/packages/components/nodes/agents/AutoGPT/AutoGPT.ts @@ -8,6 +8,7 @@ import { flatten } from 'lodash' class AutoGPT_Agents implements INode { label: string name: string + version: number description: string type: string icon: string @@ -18,6 +19,7 @@ class AutoGPT_Agents implements INode { constructor() { this.label = 'AutoGPT' this.name = 'autoGPT' + this.version = 1.0 this.type = 'AutoGPT' this.category = 'Agents' this.icon = 'autogpt.png' diff --git a/packages/components/nodes/agents/BabyAGI/BabyAGI.ts b/packages/components/nodes/agents/BabyAGI/BabyAGI.ts index 91af1469..303c231e 100644 --- a/packages/components/nodes/agents/BabyAGI/BabyAGI.ts +++ b/packages/components/nodes/agents/BabyAGI/BabyAGI.ts @@ -6,6 +6,7 @@ import { VectorStore } from 'langchain/vectorstores' class BabyAGI_Agents implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class BabyAGI_Agents implements INode { constructor() { this.label = 'BabyAGI' this.name = 'babyAGI' + this.version = 1.0 this.type = 'BabyAGI' this.category = 'Agents' this.icon = 'babyagi.jpg' diff --git a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts index 0fe71953..9224a4c1 100644 --- a/packages/components/nodes/agents/CSVAgent/CSVAgent.ts +++ b/packages/components/nodes/agents/CSVAgent/CSVAgent.ts @@ -9,6 +9,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class CSV_Agents implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class CSV_Agents implements INode { constructor() { this.label = 'CSV Agent' this.name = 'csvAgent' + this.version = 1.0 this.type = 'AgentExecutor' this.category = 'Agents' this.icon = 'csvagent.png' diff --git a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts index 88cb8ec6..005429d6 100644 --- a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts +++ b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts @@ -18,6 +18,7 @@ Overall, Assistant is a powerful system that can help with a wide range of tasks class ConversationalAgent_Agents implements INode { label: string name: string + version: number description: string type: string icon: string @@ -28,6 +29,7 @@ class ConversationalAgent_Agents implements INode { constructor() { this.label = 'Conversational Agent' this.name = 'conversationalAgent' + this.version = 1.0 this.type = 'AgentExecutor' this.category = 'Agents' this.icon = 'agent.svg' diff --git a/packages/components/nodes/agents/MRKLAgentChat/MRKLAgentChat.ts b/packages/components/nodes/agents/MRKLAgentChat/MRKLAgentChat.ts index d2a52d6c..0a9e744c 100644 --- a/packages/components/nodes/agents/MRKLAgentChat/MRKLAgentChat.ts +++ b/packages/components/nodes/agents/MRKLAgentChat/MRKLAgentChat.ts @@ -8,6 +8,7 @@ import { flatten } from 'lodash' class MRKLAgentChat_Agents implements INode { label: string name: string + version: number description: string type: string icon: string @@ -18,6 +19,7 @@ class MRKLAgentChat_Agents implements INode { constructor() { this.label = 'MRKL Agent for Chat Models' this.name = 'mrklAgentChat' + this.version = 1.0 this.type = 'AgentExecutor' this.category = 'Agents' this.icon = 'agent.svg' diff --git a/packages/components/nodes/agents/MRKLAgentLLM/MRKLAgentLLM.ts b/packages/components/nodes/agents/MRKLAgentLLM/MRKLAgentLLM.ts index eb685531..d7af586b 100644 --- a/packages/components/nodes/agents/MRKLAgentLLM/MRKLAgentLLM.ts +++ b/packages/components/nodes/agents/MRKLAgentLLM/MRKLAgentLLM.ts @@ -8,6 +8,7 @@ import { flatten } from 'lodash' class MRKLAgentLLM_Agents implements INode { label: string name: string + version: number description: string type: string icon: string @@ -18,6 +19,7 @@ class MRKLAgentLLM_Agents implements INode { constructor() { this.label = 'MRKL Agent for LLMs' this.name = 'mrklAgentLLM' + this.version = 1.0 this.type = 'AgentExecutor' this.category = 'Agents' this.icon = 'agent.svg' diff --git a/packages/components/nodes/agents/OpenAIFunctionAgent/OpenAIFunctionAgent.ts b/packages/components/nodes/agents/OpenAIFunctionAgent/OpenAIFunctionAgent.ts index f4d065d9..f3751f1f 100644 --- a/packages/components/nodes/agents/OpenAIFunctionAgent/OpenAIFunctionAgent.ts +++ b/packages/components/nodes/agents/OpenAIFunctionAgent/OpenAIFunctionAgent.ts @@ -10,6 +10,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class OpenAIFunctionAgent_Agents implements INode { label: string name: string + version: number description: string type: string icon: string @@ -20,6 +21,7 @@ class OpenAIFunctionAgent_Agents implements INode { constructor() { this.label = 'OpenAI Function Agent' this.name = 'openAIFunctionAgent' + this.version = 1.0 this.type = 'AgentExecutor' this.category = 'Agents' this.icon = 'openai.png' diff --git a/packages/components/nodes/chains/ApiChain/GETApiChain.ts b/packages/components/nodes/chains/ApiChain/GETApiChain.ts index 373d0462..bd4f3bc0 100644 --- a/packages/components/nodes/chains/ApiChain/GETApiChain.ts +++ b/packages/components/nodes/chains/ApiChain/GETApiChain.ts @@ -19,6 +19,7 @@ export const API_RESPONSE_RAW_PROMPT_TEMPLATE = class GETApiChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -29,6 +30,7 @@ class GETApiChain_Chains implements INode { constructor() { this.label = 'GET API Chain' this.name = 'getApiChain' + this.version = 1.0 this.type = 'GETApiChain' this.icon = 'apichain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts index 583ca1f4..9f6c79e4 100644 --- a/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts +++ b/packages/components/nodes/chains/ApiChain/OpenAPIChain.ts @@ -7,6 +7,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class OpenApiChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -17,7 +18,8 @@ class OpenApiChain_Chains implements INode { constructor() { this.label = 'OpenAPI Chain' this.name = 'openApiChain' - this.type = 'openApiChain' + this.version = 1.0 + this.type = 'OpenAPIChain' this.icon = 'openapi.png' this.category = 'Chains' this.description = 'Chain that automatically select and call APIs based only on an OpenAPI spec' diff --git a/packages/components/nodes/chains/ApiChain/POSTApiChain.ts b/packages/components/nodes/chains/ApiChain/POSTApiChain.ts index 7189f1ad..cba4a297 100644 --- a/packages/components/nodes/chains/ApiChain/POSTApiChain.ts +++ b/packages/components/nodes/chains/ApiChain/POSTApiChain.ts @@ -8,6 +8,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class POSTApiChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -18,6 +19,7 @@ class POSTApiChain_Chains implements INode { constructor() { this.label = 'POST API Chain' this.name = 'postApiChain' + this.version = 1.0 this.type = 'POSTApiChain' this.icon = 'apichain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts index d5b282c7..f08d430c 100644 --- a/packages/components/nodes/chains/ConversationChain/ConversationChain.ts +++ b/packages/components/nodes/chains/ConversationChain/ConversationChain.ts @@ -14,6 +14,7 @@ let systemMessage = `The following is a friendly conversation between a human an class ConversationChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -24,6 +25,7 @@ class ConversationChain_Chains implements INode { constructor() { this.label = 'Conversation Chain' this.name = 'conversationChain' + this.version = 1.0 this.type = 'ConversationChain' this.icon = 'chain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts index 2c86530a..e7f6e826 100644 --- a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts +++ b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts @@ -20,6 +20,7 @@ import { class ConversationalRetrievalQAChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -30,6 +31,7 @@ class ConversationalRetrievalQAChain_Chains implements INode { constructor() { this.label = 'Conversational Retrieval QA Chain' this.name = 'conversationalRetrievalQAChain' + this.version = 1.0 this.type = 'ConversationalRetrievalQAChain' this.icon = 'chain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chains/LLMChain/LLMChain.ts b/packages/components/nodes/chains/LLMChain/LLMChain.ts index eca56d31..cf9e4bc9 100644 --- a/packages/components/nodes/chains/LLMChain/LLMChain.ts +++ b/packages/components/nodes/chains/LLMChain/LLMChain.ts @@ -7,6 +7,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class LLMChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -18,6 +19,7 @@ class LLMChain_Chains implements INode { constructor() { this.label = 'LLM Chain' this.name = 'llmChain' + this.version = 1.0 this.type = 'LLMChain' this.icon = 'chain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts index e9783639..0d137714 100644 --- a/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts +++ b/packages/components/nodes/chains/MultiPromptChain/MultiPromptChain.ts @@ -7,6 +7,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class MultiPromptChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -17,6 +18,7 @@ class MultiPromptChain_Chains implements INode { constructor() { this.label = 'Multi Prompt Chain' this.name = 'multiPromptChain' + this.version = 1.0 this.type = 'MultiPromptChain' this.icon = 'chain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts index a1947faa..6d150647 100644 --- a/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts +++ b/packages/components/nodes/chains/MultiRetrievalQAChain/MultiRetrievalQAChain.ts @@ -7,6 +7,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class MultiRetrievalQAChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -17,6 +18,7 @@ class MultiRetrievalQAChain_Chains implements INode { constructor() { this.label = 'Multi Retrieval QA Chain' this.name = 'multiRetrievalQAChain' + this.version = 1.0 this.type = 'MultiRetrievalQAChain' this.icon = 'chain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts index 1571e72f..935866ca 100644 --- a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts +++ b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts @@ -8,6 +8,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class RetrievalQAChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -18,6 +19,7 @@ class RetrievalQAChain_Chains implements INode { constructor() { this.label = 'Retrieval QA Chain' this.name = 'retrievalQAChain' + this.version = 1.0 this.type = 'RetrievalQAChain' this.icon = 'chain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts index 5817264d..9416371b 100644 --- a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts +++ b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts @@ -9,6 +9,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class SqlDatabaseChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -19,6 +20,7 @@ class SqlDatabaseChain_Chains implements INode { constructor() { this.label = 'Sql Database Chain' this.name = 'sqlDatabaseChain' + this.version = 1.0 this.type = 'SqlDatabaseChain' this.icon = 'sqlchain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts index abe7aab3..03811682 100644 --- a/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts +++ b/packages/components/nodes/chains/VectorDBQAChain/VectorDBQAChain.ts @@ -8,6 +8,7 @@ import { ConsoleCallbackHandler, CustomChainHandler } from '../../../src/handler class VectorDBQAChain_Chains implements INode { label: string name: string + version: number type: string icon: string category: string @@ -18,6 +19,7 @@ class VectorDBQAChain_Chains implements INode { constructor() { this.label = 'VectorDB QA Chain' this.name = 'vectorDBQAChain' + this.version = 1.0 this.type = 'VectorDBQAChain' this.icon = 'chain.svg' this.category = 'Chains' diff --git a/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts b/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts index 0bff883f..90f430f0 100644 --- a/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/AzureChatOpenAI/AzureChatOpenAI.ts @@ -6,6 +6,7 @@ import { AzureOpenAIInput, ChatOpenAI } from 'langchain/chat_models/openai' class AzureChatOpenAI_ChatModels implements INode { label: string name: string + version: number type: string icon: string category: string @@ -17,6 +18,7 @@ class AzureChatOpenAI_ChatModels implements INode { constructor() { this.label = 'Azure ChatOpenAI' this.name = 'azureChatOpenAI' + this.version = 1.0 this.type = 'AzureChatOpenAI' this.icon = 'Azure.svg' this.category = 'Chat Models' @@ -58,6 +60,7 @@ class AzureChatOpenAI_ChatModels implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, default: 0.9, optional: true }, @@ -65,6 +68,7 @@ class AzureChatOpenAI_ChatModels implements INode { label: 'Max Tokens', name: 'maxTokens', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -72,6 +76,7 @@ class AzureChatOpenAI_ChatModels implements INode { label: 'Frequency Penalty', name: 'frequencyPenalty', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -79,6 +84,7 @@ class AzureChatOpenAI_ChatModels implements INode { label: 'Presence Penalty', name: 'presencePenalty', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -86,6 +92,7 @@ class AzureChatOpenAI_ChatModels implements INode { label: 'Timeout', name: 'timeout', type: 'number', + step: 1, optional: true, additionalParams: true } @@ -118,8 +125,8 @@ class AzureChatOpenAI_ChatModels implements INode { } if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) - if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) - if (presencePenalty) obj.presencePenalty = parseInt(presencePenalty, 10) + if (frequencyPenalty) obj.frequencyPenalty = parseFloat(frequencyPenalty) + if (presencePenalty) obj.presencePenalty = parseFloat(presencePenalty) if (timeout) obj.timeout = parseInt(timeout, 10) const model = new ChatOpenAI(obj) diff --git a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts index 84a6ac0a..12a33d99 100644 --- a/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts +++ b/packages/components/nodes/chatmodels/ChatAnthropic/ChatAnthropic.ts @@ -5,6 +5,7 @@ import { AnthropicInput, ChatAnthropic } from 'langchain/chat_models/anthropic' class ChatAnthropic_ChatModels implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class ChatAnthropic_ChatModels implements INode { constructor() { this.label = 'ChatAnthropic' this.name = 'chatAnthropic' + this.version = 1.0 this.type = 'ChatAnthropic' this.icon = 'chatAnthropic.png' this.category = 'Chat Models' @@ -95,6 +97,7 @@ class ChatAnthropic_ChatModels implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, default: 0.9, optional: true }, @@ -102,6 +105,7 @@ class ChatAnthropic_ChatModels implements INode { label: 'Max Tokens', name: 'maxTokensToSample', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -109,6 +113,7 @@ class ChatAnthropic_ChatModels implements INode { label: 'Top P', name: 'topP', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -116,6 +121,7 @@ class ChatAnthropic_ChatModels implements INode { label: 'Top K', name: 'topK', type: 'number', + step: 0.1, optional: true, additionalParams: true } diff --git a/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts b/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts index bac9b93a..ee55c7bb 100644 --- a/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts +++ b/packages/components/nodes/chatmodels/ChatHuggingFace/ChatHuggingFace.ts @@ -5,6 +5,7 @@ import { HFInput, HuggingFaceInference } from './core' class ChatHuggingFace_ChatModels implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class ChatHuggingFace_ChatModels implements INode { constructor() { this.label = 'ChatHuggingFace' this.name = 'chatHuggingFace' + this.version = 1.0 this.type = 'ChatHuggingFace' this.icon = 'huggingface.png' this.category = 'Chat Models' @@ -48,6 +50,7 @@ class ChatHuggingFace_ChatModels implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, description: 'Temperature parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -56,6 +59,7 @@ class ChatHuggingFace_ChatModels implements INode { label: 'Max Tokens', name: 'maxTokens', type: 'number', + step: 1, description: 'Max Tokens parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -64,6 +68,7 @@ class ChatHuggingFace_ChatModels implements INode { label: 'Top Probability', name: 'topP', type: 'number', + step: 0.1, description: 'Top Probability parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -72,6 +77,7 @@ class ChatHuggingFace_ChatModels implements INode { label: 'Top K', name: 'hfTopK', type: 'number', + step: 0.1, description: 'Top K parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -80,6 +86,7 @@ class ChatHuggingFace_ChatModels implements INode { label: 'Frequency Penalty', name: 'frequencyPenalty', type: 'number', + step: 0.1, description: 'Frequency Penalty parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -108,7 +115,7 @@ class ChatHuggingFace_ChatModels implements INode { if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) if (topP) obj.topP = parseFloat(topP) if (hfTopK) obj.topK = parseFloat(hfTopK) - if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) + if (frequencyPenalty) obj.frequencyPenalty = parseFloat(frequencyPenalty) if (endpoint) obj.endpoint = endpoint const huggingFace = new HuggingFaceInference(obj) diff --git a/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts b/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts index ffe2e769..a6ddfae4 100644 --- a/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts +++ b/packages/components/nodes/chatmodels/ChatLocalAI/ChatLocalAI.ts @@ -6,6 +6,7 @@ import { OpenAIChatInput } from 'langchain/chat_models/openai' class ChatLocalAI_ChatModels implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class ChatLocalAI_ChatModels implements INode { constructor() { this.label = 'ChatLocalAI' this.name = 'chatLocalAI' + this.version = 1.0 this.type = 'ChatLocalAI' this.icon = 'localai.png' this.category = 'Chat Models' @@ -38,6 +40,7 @@ class ChatLocalAI_ChatModels implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, default: 0.9, optional: true }, @@ -45,6 +48,7 @@ class ChatLocalAI_ChatModels implements INode { label: 'Max Tokens', name: 'maxTokens', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -52,6 +56,7 @@ class ChatLocalAI_ChatModels implements INode { label: 'Top Probability', name: 'topP', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -59,6 +64,7 @@ class ChatLocalAI_ChatModels implements INode { label: 'Timeout', name: 'timeout', type: 'number', + step: 1, optional: true, additionalParams: true } diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts index e85887b6..9512da66 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts @@ -5,6 +5,7 @@ import { ChatOpenAI, OpenAIChatInput } from 'langchain/chat_models/openai' class ChatOpenAI_ChatModels implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class ChatOpenAI_ChatModels implements INode { constructor() { this.label = 'ChatOpenAI' this.name = 'chatOpenAI' + this.version = 1.0 this.type = 'ChatOpenAI' this.icon = 'openai.png' this.category = 'Chat Models' @@ -73,6 +75,7 @@ class ChatOpenAI_ChatModels implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, default: 0.9, optional: true }, @@ -80,6 +83,7 @@ class ChatOpenAI_ChatModels implements INode { label: 'Max Tokens', name: 'maxTokens', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -87,6 +91,7 @@ class ChatOpenAI_ChatModels implements INode { label: 'Top Probability', name: 'topP', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -94,6 +99,7 @@ class ChatOpenAI_ChatModels implements INode { label: 'Frequency Penalty', name: 'frequencyPenalty', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -101,6 +107,7 @@ class ChatOpenAI_ChatModels implements INode { label: 'Presence Penalty', name: 'presencePenalty', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -108,6 +115,7 @@ class ChatOpenAI_ChatModels implements INode { label: 'Timeout', name: 'timeout', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -144,8 +152,8 @@ class ChatOpenAI_ChatModels implements INode { if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) if (topP) obj.topP = parseFloat(topP) - if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) - if (presencePenalty) obj.presencePenalty = parseInt(presencePenalty, 10) + if (frequencyPenalty) obj.frequencyPenalty = parseFloat(frequencyPenalty) + if (presencePenalty) obj.presencePenalty = parseFloat(presencePenalty) if (timeout) obj.timeout = parseInt(timeout, 10) const model = new ChatOpenAI(obj, { diff --git a/packages/components/nodes/documentloaders/API/APILoader.ts b/packages/components/nodes/documentloaders/API/APILoader.ts index 30fa31d7..3de6d636 100644 --- a/packages/components/nodes/documentloaders/API/APILoader.ts +++ b/packages/components/nodes/documentloaders/API/APILoader.ts @@ -7,6 +7,7 @@ import axios, { AxiosRequestConfig } from 'axios' class API_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class API_DocumentLoaders implements INode { constructor() { this.label = 'API Loader' this.name = 'apiLoader' + this.version = 1.0 this.type = 'Document' this.icon = 'api-loader.png' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Airtable/Airtable.ts b/packages/components/nodes/documentloaders/Airtable/Airtable.ts index a9b47a88..70d0c674 100644 --- a/packages/components/nodes/documentloaders/Airtable/Airtable.ts +++ b/packages/components/nodes/documentloaders/Airtable/Airtable.ts @@ -8,6 +8,7 @@ import { getCredentialData, getCredentialParam } from '../../../src/utils' class Airtable_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class Airtable_DocumentLoaders implements INode { constructor() { this.label = 'Airtable' this.name = 'airtable' + this.version = 1.0 this.type = 'Document' this.icon = 'airtable.svg' this.category = 'Document Loaders' @@ -66,7 +68,6 @@ class Airtable_DocumentLoaders implements INode { name: 'limit', type: 'number', default: 100, - step: 1, additionalParams: true, description: 'Number of results to return' }, diff --git a/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts b/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts index b93a8685..310aa9e6 100644 --- a/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts +++ b/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts @@ -7,6 +7,7 @@ import { webCrawl, xmlScrape } from '../../../src' class Cheerio_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class Cheerio_DocumentLoaders implements INode { constructor() { this.label = 'Cheerio Web Scraper' this.name = 'cheerioWebScraper' + this.version = 1.0 this.type = 'Document' this.icon = 'cheerio.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Confluence/Confluence.ts b/packages/components/nodes/documentloaders/Confluence/Confluence.ts index db992310..a17c41b9 100644 --- a/packages/components/nodes/documentloaders/Confluence/Confluence.ts +++ b/packages/components/nodes/documentloaders/Confluence/Confluence.ts @@ -6,6 +6,7 @@ import { getCredentialData, getCredentialParam } from '../../../src' class Confluence_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class Confluence_DocumentLoaders implements INode { constructor() { this.label = 'Confluence' this.name = 'confluence' + this.version = 1.0 this.type = 'Document' this.icon = 'confluence.png' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Csv/Csv.ts b/packages/components/nodes/documentloaders/Csv/Csv.ts index f4b36ad0..750490b7 100644 --- a/packages/components/nodes/documentloaders/Csv/Csv.ts +++ b/packages/components/nodes/documentloaders/Csv/Csv.ts @@ -5,6 +5,7 @@ import { CSVLoader } from 'langchain/document_loaders/fs/csv' class Csv_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class Csv_DocumentLoaders implements INode { constructor() { this.label = 'Csv File' this.name = 'csvFile' + this.version = 1.0 this.type = 'Document' this.icon = 'Csv.png' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Docx/Docx.ts b/packages/components/nodes/documentloaders/Docx/Docx.ts index e27991a5..41922775 100644 --- a/packages/components/nodes/documentloaders/Docx/Docx.ts +++ b/packages/components/nodes/documentloaders/Docx/Docx.ts @@ -5,6 +5,7 @@ import { DocxLoader } from 'langchain/document_loaders/fs/docx' class Docx_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class Docx_DocumentLoaders implements INode { constructor() { this.label = 'Docx File' this.name = 'docxFile' + this.version = 1.0 this.type = 'Document' this.icon = 'Docx.png' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Figma/Figma.ts b/packages/components/nodes/documentloaders/Figma/Figma.ts index e570490e..3d313044 100644 --- a/packages/components/nodes/documentloaders/Figma/Figma.ts +++ b/packages/components/nodes/documentloaders/Figma/Figma.ts @@ -5,6 +5,7 @@ import { FigmaFileLoader, FigmaLoaderParams } from 'langchain/document_loaders/w class Figma_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class Figma_DocumentLoaders implements INode { constructor() { this.label = 'Figma' this.name = 'figma' + this.version = 1.0 this.type = 'Document' this.icon = 'figma.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Folder/Folder.ts b/packages/components/nodes/documentloaders/Folder/Folder.ts index 2290133e..83bffd18 100644 --- a/packages/components/nodes/documentloaders/Folder/Folder.ts +++ b/packages/components/nodes/documentloaders/Folder/Folder.ts @@ -10,6 +10,7 @@ import { DocxLoader } from 'langchain/document_loaders/fs/docx' class Folder_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -20,6 +21,7 @@ class Folder_DocumentLoaders implements INode { constructor() { this.label = 'Folder with Files' this.name = 'folderFiles' + this.version = 1.0 this.type = 'Document' this.icon = 'folder.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Gitbook/Gitbook.ts b/packages/components/nodes/documentloaders/Gitbook/Gitbook.ts index 933fa9d4..181fa48d 100644 --- a/packages/components/nodes/documentloaders/Gitbook/Gitbook.ts +++ b/packages/components/nodes/documentloaders/Gitbook/Gitbook.ts @@ -5,6 +5,7 @@ import { GitbookLoader } from 'langchain/document_loaders/web/gitbook' class Gitbook_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class Gitbook_DocumentLoaders implements INode { constructor() { this.label = 'GitBook' this.name = 'gitbook' + this.version = 1.0 this.type = 'Document' this.icon = 'gitbook.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Github/Github.ts b/packages/components/nodes/documentloaders/Github/Github.ts index 4a968403..079bffb0 100644 --- a/packages/components/nodes/documentloaders/Github/Github.ts +++ b/packages/components/nodes/documentloaders/Github/Github.ts @@ -6,6 +6,7 @@ import { getCredentialData, getCredentialParam } from '../../../src' class Github_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class Github_DocumentLoaders implements INode { constructor() { this.label = 'Github' this.name = 'github' + this.version = 1.0 this.type = 'Document' this.icon = 'github.png' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Json/Json.ts b/packages/components/nodes/documentloaders/Json/Json.ts index 9177df5c..43051251 100644 --- a/packages/components/nodes/documentloaders/Json/Json.ts +++ b/packages/components/nodes/documentloaders/Json/Json.ts @@ -5,6 +5,7 @@ import { JSONLoader } from 'langchain/document_loaders/fs/json' class Json_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class Json_DocumentLoaders implements INode { constructor() { this.label = 'Json File' this.name = 'jsonFile' + this.version = 1.0 this.type = 'Document' this.icon = 'json.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Jsonlines/Jsonlines.ts b/packages/components/nodes/documentloaders/Jsonlines/Jsonlines.ts index 4af8c2ce..fcc2fae9 100644 --- a/packages/components/nodes/documentloaders/Jsonlines/Jsonlines.ts +++ b/packages/components/nodes/documentloaders/Jsonlines/Jsonlines.ts @@ -5,6 +5,7 @@ import { JSONLinesLoader } from 'langchain/document_loaders/fs/json' class Jsonlines_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class Jsonlines_DocumentLoaders implements INode { constructor() { this.label = 'Json Lines File' this.name = 'jsonlinesFile' + this.version = 1.0 this.type = 'Document' this.icon = 'jsonlines.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Notion/NotionDB.ts b/packages/components/nodes/documentloaders/Notion/NotionDB.ts index 3f0730ea..74879dd2 100644 --- a/packages/components/nodes/documentloaders/Notion/NotionDB.ts +++ b/packages/components/nodes/documentloaders/Notion/NotionDB.ts @@ -6,6 +6,7 @@ import { getCredentialData, getCredentialParam } from '../../../src' class NotionDB_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class NotionDB_DocumentLoaders implements INode { constructor() { this.label = 'Notion Database' this.name = 'notionDB' + this.version = 1.0 this.type = 'Document' this.icon = 'notion.png' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Notion/NotionFolder.ts b/packages/components/nodes/documentloaders/Notion/NotionFolder.ts index 11b8165b..8b8254a4 100644 --- a/packages/components/nodes/documentloaders/Notion/NotionFolder.ts +++ b/packages/components/nodes/documentloaders/Notion/NotionFolder.ts @@ -5,6 +5,7 @@ import { NotionLoader } from 'langchain/document_loaders/fs/notion' class NotionFolder_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class NotionFolder_DocumentLoaders implements INode { constructor() { this.label = 'Notion Folder' this.name = 'notionFolder' + this.version = 1.0 this.type = 'Document' this.icon = 'notion.png' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Notion/NotionPage.ts b/packages/components/nodes/documentloaders/Notion/NotionPage.ts index 57da8aaa..b45067ab 100644 --- a/packages/components/nodes/documentloaders/Notion/NotionPage.ts +++ b/packages/components/nodes/documentloaders/Notion/NotionPage.ts @@ -6,6 +6,7 @@ import { getCredentialData, getCredentialParam } from '../../../src' class NotionPage_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class NotionPage_DocumentLoaders implements INode { constructor() { this.label = 'Notion Page' this.name = 'notionPage' + this.version = 1.0 this.type = 'Document' this.icon = 'notion.png' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Pdf/Pdf.ts b/packages/components/nodes/documentloaders/Pdf/Pdf.ts index ddb7edb8..a9f6ab23 100644 --- a/packages/components/nodes/documentloaders/Pdf/Pdf.ts +++ b/packages/components/nodes/documentloaders/Pdf/Pdf.ts @@ -5,6 +5,7 @@ import { PDFLoader } from 'langchain/document_loaders/fs/pdf' class Pdf_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class Pdf_DocumentLoaders implements INode { constructor() { this.label = 'Pdf File' this.name = 'pdfFile' + this.version = 1.0 this.type = 'Document' this.icon = 'pdf.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Playwright/Playwright.ts b/packages/components/nodes/documentloaders/Playwright/Playwright.ts index 73a3e290..3399574d 100644 --- a/packages/components/nodes/documentloaders/Playwright/Playwright.ts +++ b/packages/components/nodes/documentloaders/Playwright/Playwright.ts @@ -7,6 +7,7 @@ import { webCrawl, xmlScrape } from '../../../src' class Playwright_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class Playwright_DocumentLoaders implements INode { constructor() { this.label = 'Playwright Web Scraper' this.name = 'playwrightWebScraper' + this.version = 1.0 this.type = 'Document' this.icon = 'playwright.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Puppeteer/Puppeteer.ts b/packages/components/nodes/documentloaders/Puppeteer/Puppeteer.ts index 014845d2..ea6280db 100644 --- a/packages/components/nodes/documentloaders/Puppeteer/Puppeteer.ts +++ b/packages/components/nodes/documentloaders/Puppeteer/Puppeteer.ts @@ -7,6 +7,7 @@ import { webCrawl, xmlScrape } from '../../../src' class Puppeteer_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class Puppeteer_DocumentLoaders implements INode { constructor() { this.label = 'Puppeteer Web Scraper' this.name = 'puppeteerWebScraper' + this.version = 1.0 this.type = 'Document' this.icon = 'puppeteer.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Subtitles/Subtitles.ts b/packages/components/nodes/documentloaders/Subtitles/Subtitles.ts index 0f60e151..f85898b3 100644 --- a/packages/components/nodes/documentloaders/Subtitles/Subtitles.ts +++ b/packages/components/nodes/documentloaders/Subtitles/Subtitles.ts @@ -5,6 +5,7 @@ import { SRTLoader } from 'langchain/document_loaders/fs/srt' class Subtitles_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class Subtitles_DocumentLoaders implements INode { constructor() { this.label = 'Subtitles File' this.name = 'subtitlesFile' + this.version = 1.0 this.type = 'Document' this.icon = 'subtitlesFile.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/documentloaders/Text/Text.ts b/packages/components/nodes/documentloaders/Text/Text.ts index 63e7e0e2..dacf087c 100644 --- a/packages/components/nodes/documentloaders/Text/Text.ts +++ b/packages/components/nodes/documentloaders/Text/Text.ts @@ -5,6 +5,7 @@ import { TextLoader } from 'langchain/document_loaders/fs/text' class Text_DocumentLoaders implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class Text_DocumentLoaders implements INode { constructor() { this.label = 'Text File' this.name = 'textFile' + this.version = 1.0 this.type = 'Document' this.icon = 'textFile.svg' this.category = 'Document Loaders' diff --git a/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts b/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts index 15c9f460..b70caa4c 100644 --- a/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts +++ b/packages/components/nodes/embeddings/AzureOpenAIEmbedding/AzureOpenAIEmbedding.ts @@ -6,6 +6,7 @@ import { OpenAIEmbeddings, OpenAIEmbeddingsParams } from 'langchain/embeddings/o class AzureOpenAIEmbedding_Embeddings implements INode { label: string name: string + version: number type: string icon: string category: string @@ -17,6 +18,7 @@ class AzureOpenAIEmbedding_Embeddings implements INode { constructor() { this.label = 'Azure OpenAI Embeddings' this.name = 'azureOpenAIEmbeddings' + this.version = 1.0 this.type = 'AzureOpenAIEmbeddings' this.icon = 'Azure.svg' this.category = 'Embeddings' diff --git a/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts b/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts index 914d643d..b42a0357 100644 --- a/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts +++ b/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts @@ -5,6 +5,7 @@ import { CohereEmbeddings, CohereEmbeddingsParams } from 'langchain/embeddings/c class CohereEmbedding_Embeddings implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class CohereEmbedding_Embeddings implements INode { constructor() { this.label = 'Cohere Embeddings' this.name = 'cohereEmbeddings' + this.version = 1.0 this.type = 'CohereEmbeddings' this.icon = 'cohere.png' this.category = 'Embeddings' diff --git a/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts b/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts index aaf13efb..6d75b955 100644 --- a/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts +++ b/packages/components/nodes/embeddings/HuggingFaceInferenceEmbedding/HuggingFaceInferenceEmbedding.ts @@ -5,6 +5,7 @@ import { HuggingFaceInferenceEmbeddings, HuggingFaceInferenceEmbeddingsParams } class HuggingFaceInferenceEmbedding_Embeddings implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class HuggingFaceInferenceEmbedding_Embeddings implements INode { constructor() { this.label = 'HuggingFace Inference Embeddings' this.name = 'huggingFaceInferenceEmbeddings' + this.version = 1.0 this.type = 'HuggingFaceInferenceEmbeddings' this.icon = 'huggingface.png' this.category = 'Embeddings' diff --git a/packages/components/nodes/embeddings/LocalAIEmbedding/LocalAIEmbedding.ts b/packages/components/nodes/embeddings/LocalAIEmbedding/LocalAIEmbedding.ts index 7fb2a798..557e35d6 100644 --- a/packages/components/nodes/embeddings/LocalAIEmbedding/LocalAIEmbedding.ts +++ b/packages/components/nodes/embeddings/LocalAIEmbedding/LocalAIEmbedding.ts @@ -4,6 +4,7 @@ import { OpenAIEmbeddings, OpenAIEmbeddingsParams } from 'langchain/embeddings/o class LocalAIEmbedding_Embeddings implements INode { label: string name: string + version: number type: string icon: string category: string @@ -14,6 +15,7 @@ class LocalAIEmbedding_Embeddings implements INode { constructor() { this.label = 'LocalAI Embeddings' this.name = 'localAIEmbeddings' + this.version = 1.0 this.type = 'LocalAI Embeddings' this.icon = 'localai.png' this.category = 'Embeddings' diff --git a/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts b/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts index 6f79dc3e..d21b6dca 100644 --- a/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts +++ b/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts @@ -5,6 +5,7 @@ import { OpenAIEmbeddings, OpenAIEmbeddingsParams } from 'langchain/embeddings/o class OpenAIEmbedding_Embeddings implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class OpenAIEmbedding_Embeddings implements INode { constructor() { this.label = 'OpenAI Embeddings' this.name = 'openAIEmbeddings' + this.version = 1.0 this.type = 'OpenAIEmbeddings' this.icon = 'openai.png' this.category = 'Embeddings' diff --git a/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts b/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts index 47077742..f48c4642 100644 --- a/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts +++ b/packages/components/nodes/llms/Azure OpenAI/AzureOpenAI.ts @@ -5,6 +5,7 @@ import { AzureOpenAIInput, OpenAI, OpenAIInput } from 'langchain/llms/openai' class AzureOpenAI_LLMs implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class AzureOpenAI_LLMs implements INode { constructor() { this.label = 'Azure OpenAI' this.name = 'azureOpenAI' + this.version = 1.0 this.type = 'AzureOpenAI' this.icon = 'Azure.svg' this.category = 'LLMs' @@ -89,6 +91,7 @@ class AzureOpenAI_LLMs implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, default: 0.9, optional: true }, @@ -96,6 +99,7 @@ class AzureOpenAI_LLMs implements INode { label: 'Max Tokens', name: 'maxTokens', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -103,6 +107,7 @@ class AzureOpenAI_LLMs implements INode { label: 'Top Probability', name: 'topP', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -110,6 +115,7 @@ class AzureOpenAI_LLMs implements INode { label: 'Best Of', name: 'bestOf', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -117,6 +123,7 @@ class AzureOpenAI_LLMs implements INode { label: 'Frequency Penalty', name: 'frequencyPenalty', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -124,6 +131,7 @@ class AzureOpenAI_LLMs implements INode { label: 'Presence Penalty', name: 'presencePenalty', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -131,6 +139,7 @@ class AzureOpenAI_LLMs implements INode { label: 'Timeout', name: 'timeout', type: 'number', + step: 1, optional: true, additionalParams: true } @@ -166,8 +175,8 @@ class AzureOpenAI_LLMs implements INode { if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) if (topP) obj.topP = parseFloat(topP) - if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) - if (presencePenalty) obj.presencePenalty = parseInt(presencePenalty, 10) + if (frequencyPenalty) obj.frequencyPenalty = parseFloat(frequencyPenalty) + if (presencePenalty) obj.presencePenalty = parseFloat(presencePenalty) if (timeout) obj.timeout = parseInt(timeout, 10) if (bestOf) obj.bestOf = parseInt(bestOf, 10) diff --git a/packages/components/nodes/llms/Cohere/Cohere.ts b/packages/components/nodes/llms/Cohere/Cohere.ts index 36bc077a..4a3a8a80 100644 --- a/packages/components/nodes/llms/Cohere/Cohere.ts +++ b/packages/components/nodes/llms/Cohere/Cohere.ts @@ -5,6 +5,7 @@ import { Cohere, CohereInput } from './core' class Cohere_LLMs implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class Cohere_LLMs implements INode { constructor() { this.label = 'Cohere' this.name = 'cohere' + this.version = 1.0 this.type = 'Cohere' this.icon = 'cohere.png' this.category = 'LLMs' @@ -65,6 +67,7 @@ class Cohere_LLMs implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, default: 0.7, optional: true }, @@ -72,6 +75,7 @@ class Cohere_LLMs implements INode { label: 'Max Tokens', name: 'maxTokens', type: 'number', + step: 1, optional: true } ] diff --git a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts index d358d1e9..c7f6a37e 100644 --- a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts +++ b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts @@ -5,6 +5,7 @@ import { HFInput, HuggingFaceInference } from './core' class HuggingFaceInference_LLMs implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class HuggingFaceInference_LLMs implements INode { constructor() { this.label = 'HuggingFace Inference' this.name = 'huggingFaceInference_LLMs' + this.version = 1.0 this.type = 'HuggingFaceInference' this.icon = 'huggingface.png' this.category = 'LLMs' @@ -48,6 +50,7 @@ class HuggingFaceInference_LLMs implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, description: 'Temperature parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -56,6 +59,7 @@ class HuggingFaceInference_LLMs implements INode { label: 'Max Tokens', name: 'maxTokens', type: 'number', + step: 1, description: 'Max Tokens parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -64,6 +68,7 @@ class HuggingFaceInference_LLMs implements INode { label: 'Top Probability', name: 'topP', type: 'number', + step: 0.1, description: 'Top Probability parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -72,6 +77,7 @@ class HuggingFaceInference_LLMs implements INode { label: 'Top K', name: 'hfTopK', type: 'number', + step: 0.1, description: 'Top K parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -80,6 +86,7 @@ class HuggingFaceInference_LLMs implements INode { label: 'Frequency Penalty', name: 'frequencyPenalty', type: 'number', + step: 0.1, description: 'Frequency Penalty parameter may not apply to certain model. Please check available model parameters', optional: true, additionalParams: true @@ -108,7 +115,7 @@ class HuggingFaceInference_LLMs implements INode { if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) if (topP) obj.topP = parseFloat(topP) if (hfTopK) obj.topK = parseFloat(hfTopK) - if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) + if (frequencyPenalty) obj.frequencyPenalty = parseFloat(frequencyPenalty) if (endpoint) obj.endpoint = endpoint const huggingFace = new HuggingFaceInference(obj) diff --git a/packages/components/nodes/llms/OpenAI/OpenAI.ts b/packages/components/nodes/llms/OpenAI/OpenAI.ts index 5418a642..4e35d659 100644 --- a/packages/components/nodes/llms/OpenAI/OpenAI.ts +++ b/packages/components/nodes/llms/OpenAI/OpenAI.ts @@ -5,6 +5,7 @@ import { OpenAI, OpenAIInput } from 'langchain/llms/openai' class OpenAI_LLMs implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class OpenAI_LLMs implements INode { constructor() { this.label = 'OpenAI' this.name = 'openAI' + this.version = 1.0 this.type = 'OpenAI' this.icon = 'openai.png' this.category = 'LLMs' @@ -57,6 +59,7 @@ class OpenAI_LLMs implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, default: 0.7, optional: true }, @@ -64,6 +67,7 @@ class OpenAI_LLMs implements INode { label: 'Max Tokens', name: 'maxTokens', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -71,6 +75,7 @@ class OpenAI_LLMs implements INode { label: 'Top Probability', name: 'topP', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -78,6 +83,7 @@ class OpenAI_LLMs implements INode { label: 'Best Of', name: 'bestOf', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -85,6 +91,7 @@ class OpenAI_LLMs implements INode { label: 'Frequency Penalty', name: 'frequencyPenalty', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -92,6 +99,7 @@ class OpenAI_LLMs implements INode { label: 'Presence Penalty', name: 'presencePenalty', type: 'number', + step: 0.1, optional: true, additionalParams: true }, @@ -99,6 +107,7 @@ class OpenAI_LLMs implements INode { label: 'Batch Size', name: 'batchSize', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -106,6 +115,7 @@ class OpenAI_LLMs implements INode { label: 'Timeout', name: 'timeout', type: 'number', + step: 1, optional: true, additionalParams: true }, @@ -144,8 +154,8 @@ class OpenAI_LLMs implements INode { if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) if (topP) obj.topP = parseFloat(topP) - if (frequencyPenalty) obj.frequencyPenalty = parseInt(frequencyPenalty, 10) - if (presencePenalty) obj.presencePenalty = parseInt(presencePenalty, 10) + if (frequencyPenalty) obj.frequencyPenalty = parseFloat(frequencyPenalty) + if (presencePenalty) obj.presencePenalty = parseFloat(presencePenalty) if (timeout) obj.timeout = parseInt(timeout, 10) if (batchSize) obj.batchSize = parseInt(batchSize, 10) if (bestOf) obj.bestOf = parseInt(bestOf, 10) diff --git a/packages/components/nodes/llms/Replicate/Replicate.ts b/packages/components/nodes/llms/Replicate/Replicate.ts index 144874d2..ca30cd97 100644 --- a/packages/components/nodes/llms/Replicate/Replicate.ts +++ b/packages/components/nodes/llms/Replicate/Replicate.ts @@ -5,6 +5,7 @@ import { Replicate, ReplicateInput } from 'langchain/llms/replicate' class Replicate_LLMs implements INode { label: string name: string + version: number type: string icon: string category: string @@ -16,6 +17,7 @@ class Replicate_LLMs implements INode { constructor() { this.label = 'Replicate' this.name = 'replicate' + this.version = 1.0 this.type = 'Replicate' this.icon = 'replicate.svg' this.category = 'LLMs' @@ -39,6 +41,7 @@ class Replicate_LLMs implements INode { label: 'Temperature', name: 'temperature', type: 'number', + step: 0.1, description: 'Adjusts randomness of outputs, greater than 1 is random and 0 is deterministic, 0.75 is a good starting value.', default: 0.7, @@ -48,6 +51,7 @@ class Replicate_LLMs implements INode { label: 'Max Tokens', name: 'maxTokens', type: 'number', + step: 1, description: 'Maximum number of tokens to generate. A word is generally 2-3 tokens', optional: true, additionalParams: true @@ -56,6 +60,7 @@ class Replicate_LLMs implements INode { label: 'Top Probability', name: 'topP', type: 'number', + step: 0.1, description: 'When decoding text, samples from the top p percentage of most likely tokens; lower to ignore less likely tokens', optional: true, @@ -65,6 +70,7 @@ class Replicate_LLMs implements INode { label: 'Repetition Penalty', name: 'repetitionPenalty', type: 'number', + step: 0.1, description: 'Penalty for repeated words in generated text; 1 is no penalty, values greater than 1 discourage repetition, less than 1 encourage it. (minimum: 0.01; maximum: 5)', optional: true, diff --git a/packages/components/nodes/memory/BufferMemory/BufferMemory.ts b/packages/components/nodes/memory/BufferMemory/BufferMemory.ts index fd635ff4..7793d96d 100644 --- a/packages/components/nodes/memory/BufferMemory/BufferMemory.ts +++ b/packages/components/nodes/memory/BufferMemory/BufferMemory.ts @@ -5,6 +5,7 @@ import { BufferMemory } from 'langchain/memory' class BufferMemory_Memory implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class BufferMemory_Memory implements INode { constructor() { this.label = 'Buffer Memory' this.name = 'bufferMemory' + this.version = 1.0 this.type = 'BufferMemory' this.icon = 'memory.svg' this.category = 'Memory' diff --git a/packages/components/nodes/memory/BufferWindowMemory/BufferWindowMemory.ts b/packages/components/nodes/memory/BufferWindowMemory/BufferWindowMemory.ts index ae783fec..cf8e7f1d 100644 --- a/packages/components/nodes/memory/BufferWindowMemory/BufferWindowMemory.ts +++ b/packages/components/nodes/memory/BufferWindowMemory/BufferWindowMemory.ts @@ -5,6 +5,7 @@ import { BufferWindowMemory, BufferWindowMemoryInput } from 'langchain/memory' class BufferWindowMemory_Memory implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class BufferWindowMemory_Memory implements INode { constructor() { this.label = 'Buffer Window Memory' this.name = 'bufferWindowMemory' + this.version = 1.0 this.type = 'BufferWindowMemory' this.icon = 'memory.svg' this.category = 'Memory' diff --git a/packages/components/nodes/memory/ConversationSummaryMemory/ConversationSummaryMemory.ts b/packages/components/nodes/memory/ConversationSummaryMemory/ConversationSummaryMemory.ts index 3c055e8e..332d73aa 100644 --- a/packages/components/nodes/memory/ConversationSummaryMemory/ConversationSummaryMemory.ts +++ b/packages/components/nodes/memory/ConversationSummaryMemory/ConversationSummaryMemory.ts @@ -6,6 +6,7 @@ import { BaseLanguageModel } from 'langchain/base_language' class ConversationSummaryMemory_Memory implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class ConversationSummaryMemory_Memory implements INode { constructor() { this.label = 'Conversation Summary Memory' this.name = 'conversationSummaryMemory' + this.version = 1.0 this.type = 'ConversationSummaryMemory' this.icon = 'memory.svg' this.category = 'Memory' diff --git a/packages/components/nodes/memory/DynamoDb/DynamoDb.ts b/packages/components/nodes/memory/DynamoDb/DynamoDb.ts index 71f8166a..a1c0fb1f 100644 --- a/packages/components/nodes/memory/DynamoDb/DynamoDb.ts +++ b/packages/components/nodes/memory/DynamoDb/DynamoDb.ts @@ -5,6 +5,7 @@ import { BufferMemory } from 'langchain/memory' class DynamoDb_Memory implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class DynamoDb_Memory implements INode { constructor() { this.label = 'DynamoDB Chat Memory' this.name = 'DynamoDBChatMemory' + this.version = 1.0 this.type = 'DynamoDBChatMemory' this.icon = 'dynamodb.svg' this.category = 'Memory' diff --git a/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts b/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts index a66045dc..790c753c 100644 --- a/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts +++ b/packages/components/nodes/memory/MotorheadMemory/MotorheadMemory.ts @@ -6,6 +6,7 @@ import { MotorheadMemory, MotorheadMemoryInput } from 'langchain/memory' class MotorMemory_Memory implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class MotorMemory_Memory implements INode { constructor() { this.label = 'Motorhead Memory' this.name = 'motorheadMemory' + this.version = 1.0 this.type = 'MotorheadMemory' this.icon = 'motorhead.png' this.category = 'Memory' diff --git a/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts b/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts index a1cf3ed5..e9c963dd 100644 --- a/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts +++ b/packages/components/nodes/memory/RedisBackedChatMemory/RedisBackedChatMemory.ts @@ -8,6 +8,7 @@ import { createClient } from 'redis' class RedisBackedChatMemory_Memory implements INode { label: string name: string + version: number description: string type: string icon: string @@ -18,6 +19,7 @@ class RedisBackedChatMemory_Memory implements INode { constructor() { this.label = 'Redis-Backed Chat Memory' this.name = 'RedisBackedChatMemory' + this.version = 1.0 this.type = 'RedisBackedChatMemory' this.icon = 'redis.svg' this.category = 'Memory' diff --git a/packages/components/nodes/memory/ZepMemory/ZepMemory.ts b/packages/components/nodes/memory/ZepMemory/ZepMemory.ts index 497f4602..e64740b8 100644 --- a/packages/components/nodes/memory/ZepMemory/ZepMemory.ts +++ b/packages/components/nodes/memory/ZepMemory/ZepMemory.ts @@ -7,6 +7,7 @@ import { ICommonObject } from '../../../src' class ZepMemory_Memory implements INode { label: string name: string + version: number description: string type: string icon: string @@ -18,6 +19,7 @@ class ZepMemory_Memory implements INode { constructor() { this.label = 'Zep Memory' this.name = 'ZepMemory' + this.version = 1.0 this.type = 'ZepMemory' this.icon = 'zep.png' this.category = 'Memory' @@ -58,7 +60,6 @@ class ZepMemory_Memory implements INode { name: 'k', type: 'number', default: '10', - step: 1, description: 'Window of size k to surface the last k back-and-forths to use as memory.' }, { diff --git a/packages/components/nodes/prompts/ChatPromptTemplate/ChatPromptTemplate.ts b/packages/components/nodes/prompts/ChatPromptTemplate/ChatPromptTemplate.ts index 88803348..c9ec751d 100644 --- a/packages/components/nodes/prompts/ChatPromptTemplate/ChatPromptTemplate.ts +++ b/packages/components/nodes/prompts/ChatPromptTemplate/ChatPromptTemplate.ts @@ -5,6 +5,7 @@ import { ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemp class ChatPromptTemplate_Prompts implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class ChatPromptTemplate_Prompts implements INode { constructor() { this.label = 'Chat Prompt Template' this.name = 'chatPromptTemplate' + this.version = 1.0 this.type = 'ChatPromptTemplate' this.icon = 'prompt.svg' this.category = 'Prompts' diff --git a/packages/components/nodes/prompts/FewShotPromptTemplate/FewShotPromptTemplate.ts b/packages/components/nodes/prompts/FewShotPromptTemplate/FewShotPromptTemplate.ts index 3bf305a4..ed1d3cb2 100644 --- a/packages/components/nodes/prompts/FewShotPromptTemplate/FewShotPromptTemplate.ts +++ b/packages/components/nodes/prompts/FewShotPromptTemplate/FewShotPromptTemplate.ts @@ -7,6 +7,7 @@ import { TemplateFormat } from 'langchain/dist/prompts/template' class FewShotPromptTemplate_Prompts implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class FewShotPromptTemplate_Prompts implements INode { constructor() { this.label = 'Few Shot Prompt Template' this.name = 'fewShotPromptTemplate' + this.version = 1.0 this.type = 'FewShotPromptTemplate' this.icon = 'prompt.svg' this.category = 'Prompts' diff --git a/packages/components/nodes/prompts/PromptTemplate/PromptTemplate.ts b/packages/components/nodes/prompts/PromptTemplate/PromptTemplate.ts index bd5740d8..a401e282 100644 --- a/packages/components/nodes/prompts/PromptTemplate/PromptTemplate.ts +++ b/packages/components/nodes/prompts/PromptTemplate/PromptTemplate.ts @@ -5,6 +5,7 @@ import { PromptTemplateInput } from 'langchain/prompts' class PromptTemplate_Prompts implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class PromptTemplate_Prompts implements INode { constructor() { this.label = 'Prompt Template' this.name = 'promptTemplate' + this.version = 1.0 this.type = 'PromptTemplate' this.icon = 'prompt.svg' this.category = 'Prompts' diff --git a/packages/components/nodes/retrievers/HydeRetriever/HydeRetriever.ts b/packages/components/nodes/retrievers/HydeRetriever/HydeRetriever.ts index a90f9870..2baf677e 100644 --- a/packages/components/nodes/retrievers/HydeRetriever/HydeRetriever.ts +++ b/packages/components/nodes/retrievers/HydeRetriever/HydeRetriever.ts @@ -7,6 +7,7 @@ import { PromptTemplate } from 'langchain/prompts' class HydeRetriever_Retrievers implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class HydeRetriever_Retrievers implements INode { constructor() { this.label = 'Hyde Retriever' this.name = 'HydeRetriever' + this.version = 1.0 this.type = 'HydeRetriever' this.icon = 'hyderetriever.svg' this.category = 'Retrievers' diff --git a/packages/components/nodes/retrievers/PromptRetriever/PromptRetriever.ts b/packages/components/nodes/retrievers/PromptRetriever/PromptRetriever.ts index e3b9a4ac..7ffaa64f 100644 --- a/packages/components/nodes/retrievers/PromptRetriever/PromptRetriever.ts +++ b/packages/components/nodes/retrievers/PromptRetriever/PromptRetriever.ts @@ -3,6 +3,7 @@ import { INode, INodeData, INodeParams, PromptRetriever, PromptRetrieverInput } class PromptRetriever_Retrievers implements INode { label: string name: string + version: number description: string type: string icon: string @@ -13,6 +14,7 @@ class PromptRetriever_Retrievers implements INode { constructor() { this.label = 'Prompt Retriever' this.name = 'promptRetriever' + this.version = 1.0 this.type = 'PromptRetriever' this.icon = 'promptretriever.svg' this.category = 'Retrievers' diff --git a/packages/components/nodes/retrievers/VectorStoreRetriever/VectorStoreRetriever.ts b/packages/components/nodes/retrievers/VectorStoreRetriever/VectorStoreRetriever.ts index 2ccfc995..41f66571 100644 --- a/packages/components/nodes/retrievers/VectorStoreRetriever/VectorStoreRetriever.ts +++ b/packages/components/nodes/retrievers/VectorStoreRetriever/VectorStoreRetriever.ts @@ -4,6 +4,7 @@ import { INode, INodeData, INodeParams, VectorStoreRetriever, VectorStoreRetriev class VectorStoreRetriever_Retrievers implements INode { label: string name: string + version: number description: string type: string icon: string @@ -14,6 +15,7 @@ class VectorStoreRetriever_Retrievers implements INode { constructor() { this.label = 'Vector Store Retriever' this.name = 'vectorStoreRetriever' + this.version = 1.0 this.type = 'VectorStoreRetriever' this.icon = 'vectorretriever.svg' this.category = 'Retrievers' diff --git a/packages/components/nodes/textsplitters/CharacterTextSplitter/CharacterTextSplitter.ts b/packages/components/nodes/textsplitters/CharacterTextSplitter/CharacterTextSplitter.ts index 90387e8b..f9427d10 100644 --- a/packages/components/nodes/textsplitters/CharacterTextSplitter/CharacterTextSplitter.ts +++ b/packages/components/nodes/textsplitters/CharacterTextSplitter/CharacterTextSplitter.ts @@ -5,6 +5,7 @@ import { CharacterTextSplitter, CharacterTextSplitterParams } from 'langchain/te class CharacterTextSplitter_TextSplitters implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class CharacterTextSplitter_TextSplitters implements INode { constructor() { this.label = 'Character Text Splitter' this.name = 'characterTextSplitter' + this.version = 1.0 this.type = 'CharacterTextSplitter' this.icon = 'textsplitter.svg' this.category = 'Text Splitters' diff --git a/packages/components/nodes/textsplitters/CodeTextSplitter/CodeTextSplitter.ts b/packages/components/nodes/textsplitters/CodeTextSplitter/CodeTextSplitter.ts index b14655b8..ed643f33 100644 --- a/packages/components/nodes/textsplitters/CodeTextSplitter/CodeTextSplitter.ts +++ b/packages/components/nodes/textsplitters/CodeTextSplitter/CodeTextSplitter.ts @@ -9,6 +9,7 @@ import { class CodeTextSplitter_TextSplitters implements INode { label: string name: string + version: number description: string type: string icon: string @@ -18,6 +19,7 @@ class CodeTextSplitter_TextSplitters implements INode { constructor() { this.label = 'Code Text Splitter' this.name = 'codeTextSplitter' + this.version = 1.0 this.type = 'CodeTextSplitter' this.icon = 'codeTextSplitter.svg' this.category = 'Text Splitters' diff --git a/packages/components/nodes/textsplitters/HtmlToMarkdownTextSplitter/HtmlToMarkdownTextSplitter.ts b/packages/components/nodes/textsplitters/HtmlToMarkdownTextSplitter/HtmlToMarkdownTextSplitter.ts index 161cb89e..699764e5 100644 --- a/packages/components/nodes/textsplitters/HtmlToMarkdownTextSplitter/HtmlToMarkdownTextSplitter.ts +++ b/packages/components/nodes/textsplitters/HtmlToMarkdownTextSplitter/HtmlToMarkdownTextSplitter.ts @@ -6,6 +6,7 @@ import { NodeHtmlMarkdown } from 'node-html-markdown' class HtmlToMarkdownTextSplitter_TextSplitters implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class HtmlToMarkdownTextSplitter_TextSplitters implements INode { constructor() { this.label = 'HtmlToMarkdown Text Splitter' this.name = 'htmlToMarkdownTextSplitter' + this.version = 1.0 this.type = 'HtmlToMarkdownTextSplitter' this.icon = 'htmlToMarkdownTextSplitter.svg' this.category = 'Text Splitters' diff --git a/packages/components/nodes/textsplitters/MarkdownTextSplitter/MarkdownTextSplitter.ts b/packages/components/nodes/textsplitters/MarkdownTextSplitter/MarkdownTextSplitter.ts index 02c37d8d..0a12845a 100644 --- a/packages/components/nodes/textsplitters/MarkdownTextSplitter/MarkdownTextSplitter.ts +++ b/packages/components/nodes/textsplitters/MarkdownTextSplitter/MarkdownTextSplitter.ts @@ -5,6 +5,7 @@ import { MarkdownTextSplitter, MarkdownTextSplitterParams } from 'langchain/text class MarkdownTextSplitter_TextSplitters implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class MarkdownTextSplitter_TextSplitters implements INode { constructor() { this.label = 'Markdown Text Splitter' this.name = 'markdownTextSplitter' + this.version = 1.0 this.type = 'MarkdownTextSplitter' this.icon = 'markdownTextSplitter.svg' this.category = 'Text Splitters' diff --git a/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts b/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts index 432b5ca9..dcca70ba 100644 --- a/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts +++ b/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts @@ -5,6 +5,7 @@ import { RecursiveCharacterTextSplitter, RecursiveCharacterTextSplitterParams } class RecursiveCharacterTextSplitter_TextSplitters implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class RecursiveCharacterTextSplitter_TextSplitters implements INode { constructor() { this.label = 'Recursive Character Text Splitter' this.name = 'recursiveCharacterTextSplitter' + this.version = 1.0 this.type = 'RecursiveCharacterTextSplitter' this.icon = 'textsplitter.svg' this.category = 'Text Splitters' diff --git a/packages/components/nodes/textsplitters/TokenTextSplitter/TokenTextSplitter.ts b/packages/components/nodes/textsplitters/TokenTextSplitter/TokenTextSplitter.ts index 8c8d6abe..0b11eebc 100644 --- a/packages/components/nodes/textsplitters/TokenTextSplitter/TokenTextSplitter.ts +++ b/packages/components/nodes/textsplitters/TokenTextSplitter/TokenTextSplitter.ts @@ -6,6 +6,7 @@ import { TiktokenEncoding } from '@dqbd/tiktoken' class TokenTextSplitter_TextSplitters implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class TokenTextSplitter_TextSplitters implements INode { constructor() { this.label = 'Token Text Splitter' this.name = 'tokenTextSplitter' + this.version = 1.0 this.type = 'TokenTextSplitter' this.icon = 'tiktoken.svg' this.category = 'Text Splitters' diff --git a/packages/components/nodes/tools/AIPlugin/AIPlugin.ts b/packages/components/nodes/tools/AIPlugin/AIPlugin.ts index ad21f8db..e9c0fa3d 100644 --- a/packages/components/nodes/tools/AIPlugin/AIPlugin.ts +++ b/packages/components/nodes/tools/AIPlugin/AIPlugin.ts @@ -5,6 +5,7 @@ import { getBaseClasses } from '../../../src/utils' class AIPlugin implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class AIPlugin implements INode { constructor() { this.label = 'AI Plugin' this.name = 'aiPlugin' + this.version = 1.0 this.type = 'AIPlugin' this.icon = 'aiplugin.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/BraveSearchAPI/BraveSearchAPI.ts b/packages/components/nodes/tools/BraveSearchAPI/BraveSearchAPI.ts index 037fd136..9e9c760d 100644 --- a/packages/components/nodes/tools/BraveSearchAPI/BraveSearchAPI.ts +++ b/packages/components/nodes/tools/BraveSearchAPI/BraveSearchAPI.ts @@ -5,6 +5,7 @@ import { BraveSearch } from 'langchain/tools' class BraveSearchAPI_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class BraveSearchAPI_Tools implements INode { constructor() { this.label = 'BraveSearch API' this.name = 'braveSearchAPI' + this.version = 1.0 this.type = 'BraveSearchAPI' this.icon = 'brave.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/Calculator/Calculator.ts b/packages/components/nodes/tools/Calculator/Calculator.ts index 85284f0f..db1e0b2b 100644 --- a/packages/components/nodes/tools/Calculator/Calculator.ts +++ b/packages/components/nodes/tools/Calculator/Calculator.ts @@ -5,6 +5,7 @@ import { Calculator } from 'langchain/tools/calculator' class Calculator_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -14,6 +15,7 @@ class Calculator_Tools implements INode { constructor() { this.label = 'Calculator' this.name = 'calculator' + this.version = 1.0 this.type = 'Calculator' this.icon = 'calculator.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/ChainTool/ChainTool.ts b/packages/components/nodes/tools/ChainTool/ChainTool.ts index 669b5947..42b5e6e1 100644 --- a/packages/components/nodes/tools/ChainTool/ChainTool.ts +++ b/packages/components/nodes/tools/ChainTool/ChainTool.ts @@ -6,6 +6,7 @@ import { ChainTool } from './core' class ChainTool_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class ChainTool_Tools implements INode { constructor() { this.label = 'Chain Tool' this.name = 'chainTool' + this.version = 1.0 this.type = 'ChainTool' this.icon = 'chaintool.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/CustomTool/CustomTool.ts b/packages/components/nodes/tools/CustomTool/CustomTool.ts index 768e9092..26b30627 100644 --- a/packages/components/nodes/tools/CustomTool/CustomTool.ts +++ b/packages/components/nodes/tools/CustomTool/CustomTool.ts @@ -7,6 +7,7 @@ import { DataSource } from 'typeorm' class CustomTool_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class CustomTool_Tools implements INode { constructor() { this.label = 'Custom Tool' this.name = 'customTool' + this.version = 1.0 this.type = 'CustomTool' this.icon = 'customtool.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/MakeWebhook/MakeWebhook.ts b/packages/components/nodes/tools/MakeWebhook/MakeWebhook.ts index 38e0cdd1..e30e3874 100644 --- a/packages/components/nodes/tools/MakeWebhook/MakeWebhook.ts +++ b/packages/components/nodes/tools/MakeWebhook/MakeWebhook.ts @@ -5,6 +5,7 @@ import { MakeWebhookTool } from './core' class MakeWebhook_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class MakeWebhook_Tools implements INode { constructor() { this.label = 'Make.com Webhook' this.name = 'makeWebhook' + this.version = 1.0 this.type = 'MakeWebhook' this.icon = 'make.png' this.category = 'Tools' diff --git a/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts b/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts index 0de7151b..d1bf3891 100644 --- a/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts +++ b/packages/components/nodes/tools/OpenAPIToolkit/OpenAPIToolkit.ts @@ -8,6 +8,7 @@ import { getCredentialData, getCredentialParam } from '../../../src' class OpenAPIToolkit_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class OpenAPIToolkit_Tools implements INode { constructor() { this.label = 'OpenAPI Toolkit' this.name = 'openAPIToolkit' + this.version = 1.0 this.type = 'OpenAPIToolkit' this.icon = 'openapi.png' this.category = 'Tools' diff --git a/packages/components/nodes/tools/ReadFile/ReadFile.ts b/packages/components/nodes/tools/ReadFile/ReadFile.ts index b6678943..2aa2c66e 100644 --- a/packages/components/nodes/tools/ReadFile/ReadFile.ts +++ b/packages/components/nodes/tools/ReadFile/ReadFile.ts @@ -6,6 +6,7 @@ import { NodeFileStore } from 'langchain/stores/file/node' class ReadFile_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class ReadFile_Tools implements INode { constructor() { this.label = 'Read File' this.name = 'readFile' + this.version = 1.0 this.type = 'ReadFile' this.icon = 'readfile.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/RequestsGet/RequestsGet.ts b/packages/components/nodes/tools/RequestsGet/RequestsGet.ts index 0b7f0ac8..91cff500 100644 --- a/packages/components/nodes/tools/RequestsGet/RequestsGet.ts +++ b/packages/components/nodes/tools/RequestsGet/RequestsGet.ts @@ -5,6 +5,7 @@ import { desc, RequestParameters, RequestsGetTool } from './core' class RequestsGet_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class RequestsGet_Tools implements INode { constructor() { this.label = 'Requests Get' this.name = 'requestsGet' + this.version = 1.0 this.type = 'RequestsGet' this.icon = 'requestsget.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/RequestsPost/RequestsPost.ts b/packages/components/nodes/tools/RequestsPost/RequestsPost.ts index 0e64556f..9ff3d142 100644 --- a/packages/components/nodes/tools/RequestsPost/RequestsPost.ts +++ b/packages/components/nodes/tools/RequestsPost/RequestsPost.ts @@ -5,6 +5,7 @@ import { RequestParameters, desc, RequestsPostTool } from './core' class RequestsPost_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -15,6 +16,7 @@ class RequestsPost_Tools implements INode { constructor() { this.label = 'Requests Post' this.name = 'requestsPost' + this.version = 1.0 this.type = 'RequestsPost' this.icon = 'requestspost.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/SerpAPI/SerpAPI.ts b/packages/components/nodes/tools/SerpAPI/SerpAPI.ts index 7e87e9c1..b7230c85 100644 --- a/packages/components/nodes/tools/SerpAPI/SerpAPI.ts +++ b/packages/components/nodes/tools/SerpAPI/SerpAPI.ts @@ -5,6 +5,7 @@ import { SerpAPI } from 'langchain/tools' class SerpAPI_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class SerpAPI_Tools implements INode { constructor() { this.label = 'Serp API' this.name = 'serpAPI' + this.version = 1.0 this.type = 'SerpAPI' this.icon = 'serp.png' this.category = 'Tools' diff --git a/packages/components/nodes/tools/Serper/Serper.ts b/packages/components/nodes/tools/Serper/Serper.ts index 495ac8af..1facdb3d 100644 --- a/packages/components/nodes/tools/Serper/Serper.ts +++ b/packages/components/nodes/tools/Serper/Serper.ts @@ -5,6 +5,7 @@ import { Serper } from 'langchain/tools' class Serper_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class Serper_Tools implements INode { constructor() { this.label = 'Serper' this.name = 'serper' + this.version = 1.0 this.type = 'Serper' this.icon = 'serper.png' this.category = 'Tools' diff --git a/packages/components/nodes/tools/WebBrowser/WebBrowser.ts b/packages/components/nodes/tools/WebBrowser/WebBrowser.ts index 09478047..64a093d0 100644 --- a/packages/components/nodes/tools/WebBrowser/WebBrowser.ts +++ b/packages/components/nodes/tools/WebBrowser/WebBrowser.ts @@ -7,6 +7,7 @@ import { Embeddings } from 'langchain/embeddings/base' class WebBrowser_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class WebBrowser_Tools implements INode { constructor() { this.label = 'Web Browser' this.name = 'webBrowser' + this.version = 1.0 this.type = 'WebBrowser' this.icon = 'webBrowser.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/WriteFile/WriteFile.ts b/packages/components/nodes/tools/WriteFile/WriteFile.ts index 208166d8..2eb7843f 100644 --- a/packages/components/nodes/tools/WriteFile/WriteFile.ts +++ b/packages/components/nodes/tools/WriteFile/WriteFile.ts @@ -6,6 +6,7 @@ import { NodeFileStore } from 'langchain/stores/file/node' class WriteFile_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -16,6 +17,7 @@ class WriteFile_Tools implements INode { constructor() { this.label = 'Write File' this.name = 'writeFile' + this.version = 1.0 this.type = 'WriteFile' this.icon = 'writefile.svg' this.category = 'Tools' diff --git a/packages/components/nodes/tools/ZapierNLA/ZapierNLA.ts b/packages/components/nodes/tools/ZapierNLA/ZapierNLA.ts index 06d3dc5a..49543136 100644 --- a/packages/components/nodes/tools/ZapierNLA/ZapierNLA.ts +++ b/packages/components/nodes/tools/ZapierNLA/ZapierNLA.ts @@ -6,6 +6,7 @@ import { getCredentialData, getCredentialParam } from '../../../src' class ZapierNLA_Tools implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class ZapierNLA_Tools implements INode { constructor() { this.label = 'Zapier NLA' this.name = 'zapierNLA' + this.version = 1.0 this.type = 'ZapierNLA' this.icon = 'zapier.svg' this.category = 'Tools' diff --git a/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts b/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts index e5dfe03e..8b84d33e 100644 --- a/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts +++ b/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts @@ -6,6 +6,7 @@ import { getBaseClasses } from '../../../src/utils' class Chroma_Existing_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class Chroma_Existing_VectorStores implements INode { constructor() { this.label = 'Chroma Load Existing Index' this.name = 'chromaExistingIndex' + this.version = 1.0 this.type = 'Chroma' this.icon = 'chroma.svg' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts b/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts index 26f3c222..2be1bb3a 100644 --- a/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts +++ b/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts @@ -8,6 +8,7 @@ import { flatten } from 'lodash' class ChromaUpsert_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class ChromaUpsert_VectorStores implements INode { constructor() { this.label = 'Chroma Upsert Document' this.name = 'chromaUpsert' + this.version = 1.0 this.type = 'Chroma' this.icon = 'chroma.svg' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Faiss_Existing/Faiss_Existing.ts b/packages/components/nodes/vectorstores/Faiss_Existing/Faiss_Existing.ts index f3030305..8c8d03a8 100644 --- a/packages/components/nodes/vectorstores/Faiss_Existing/Faiss_Existing.ts +++ b/packages/components/nodes/vectorstores/Faiss_Existing/Faiss_Existing.ts @@ -6,6 +6,7 @@ import { getBaseClasses } from '../../../src/utils' class Faiss_Existing_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -17,6 +18,7 @@ class Faiss_Existing_VectorStores implements INode { constructor() { this.label = 'Faiss Load Existing Index' this.name = 'faissExistingIndex' + this.version = 1.0 this.type = 'Faiss' this.icon = 'faiss.svg' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Faiss_Upsert/Faiss_Upsert.ts b/packages/components/nodes/vectorstores/Faiss_Upsert/Faiss_Upsert.ts index e0fd9a52..f56eccdf 100644 --- a/packages/components/nodes/vectorstores/Faiss_Upsert/Faiss_Upsert.ts +++ b/packages/components/nodes/vectorstores/Faiss_Upsert/Faiss_Upsert.ts @@ -8,6 +8,7 @@ import { flatten } from 'lodash' class FaissUpsert_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class FaissUpsert_VectorStores implements INode { constructor() { this.label = 'Faiss Upsert Document' this.name = 'faissUpsert' + this.version = 1.0 this.type = 'Faiss' this.icon = 'faiss.svg' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts b/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts index ac6ed0b2..55a01e2b 100644 --- a/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts +++ b/packages/components/nodes/vectorstores/InMemory/InMemoryVectorStore.ts @@ -8,6 +8,7 @@ import { flatten } from 'lodash' class InMemoryVectorStore_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class InMemoryVectorStore_VectorStores implements INode { constructor() { this.label = 'In-Memory Vector Store' this.name = 'memoryVectorStore' + this.version = 1.0 this.type = 'Memory' this.icon = 'memory.svg' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/OpenSearch_Existing/OpenSearch_existing.ts b/packages/components/nodes/vectorstores/OpenSearch_Existing/OpenSearch_existing.ts index e0f05aad..c8d09470 100644 --- a/packages/components/nodes/vectorstores/OpenSearch_Existing/OpenSearch_existing.ts +++ b/packages/components/nodes/vectorstores/OpenSearch_Existing/OpenSearch_existing.ts @@ -7,6 +7,7 @@ import { getBaseClasses } from '../../../src/utils' class OpenSearch_Existing_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -18,6 +19,7 @@ class OpenSearch_Existing_VectorStores implements INode { constructor() { this.label = 'OpenSearch Load Existing Index' this.name = 'openSearchExistingIndex' + this.version = 1.0 this.type = 'OpenSearch' this.icon = 'opensearch.png' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/OpenSearch_Upsert/OpenSearch_Upsert.ts b/packages/components/nodes/vectorstores/OpenSearch_Upsert/OpenSearch_Upsert.ts index c225f74a..c11d8b11 100644 --- a/packages/components/nodes/vectorstores/OpenSearch_Upsert/OpenSearch_Upsert.ts +++ b/packages/components/nodes/vectorstores/OpenSearch_Upsert/OpenSearch_Upsert.ts @@ -9,6 +9,7 @@ import { getBaseClasses } from '../../../src/utils' class OpenSearchUpsert_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -20,6 +21,7 @@ class OpenSearchUpsert_VectorStores implements INode { constructor() { this.label = 'OpenSearch Upsert Document' this.name = 'openSearchUpsertDocument' + this.version = 1.0 this.type = 'OpenSearch' this.icon = 'opensearch.png' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts index 6d1176ec..2369165d 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts @@ -7,6 +7,7 @@ import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../ class Pinecone_Existing_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class Pinecone_Existing_VectorStores implements INode { constructor() { this.label = 'Pinecone Load Existing Index' this.name = 'pineconeExistingIndex' + this.version = 1.0 this.type = 'Pinecone' this.icon = 'pinecone.png' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts b/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts index ebffc498..3d2a6497 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts @@ -9,6 +9,7 @@ import { flatten } from 'lodash' class PineconeUpsert_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -21,6 +22,7 @@ class PineconeUpsert_VectorStores implements INode { constructor() { this.label = 'Pinecone Upsert Document' this.name = 'pineconeUpsert' + this.version = 1.0 this.type = 'Pinecone' this.icon = 'pinecone.png' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts b/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts index 705795b8..16f83b08 100644 --- a/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts +++ b/packages/components/nodes/vectorstores/Qdrant_Existing/Qdrant_Existing.ts @@ -7,6 +7,7 @@ import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../ class Qdrant_Existing_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class Qdrant_Existing_VectorStores implements INode { constructor() { this.label = 'Qdrant Load Existing Index' this.name = 'qdrantExistingIndex' + this.version = 1.0 this.type = 'Qdrant' this.icon = 'qdrant.png' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts b/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts index a8992879..dcc3099d 100644 --- a/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts +++ b/packages/components/nodes/vectorstores/Qdrant_Upsert/Qdrant_Upsert.ts @@ -9,6 +9,7 @@ import { flatten } from 'lodash' class QdrantUpsert_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -21,6 +22,7 @@ class QdrantUpsert_VectorStores implements INode { constructor() { this.label = 'Qdrant Upsert Document' this.name = 'qdrantUpsert' + this.version = 1.0 this.type = 'Qdrant' this.icon = 'qdrant.png' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Singlestore_Existing/Singlestore_Existing.ts b/packages/components/nodes/vectorstores/Singlestore_Existing/Singlestore_Existing.ts index b0902f5e..c5f6fbce 100644 --- a/packages/components/nodes/vectorstores/Singlestore_Existing/Singlestore_Existing.ts +++ b/packages/components/nodes/vectorstores/Singlestore_Existing/Singlestore_Existing.ts @@ -6,6 +6,7 @@ import { SingleStoreVectorStore, SingleStoreVectorStoreConfig } from 'langchain/ class SingleStoreExisting_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -18,6 +19,7 @@ class SingleStoreExisting_VectorStores implements INode { constructor() { this.label = 'SingleStore Load Existing Table' this.name = 'singlestoreExisting' + this.version = 1.0 this.type = 'SingleStore' this.icon = 'singlestore.svg' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Singlestore_Upsert/Singlestore_Upsert.ts b/packages/components/nodes/vectorstores/Singlestore_Upsert/Singlestore_Upsert.ts index d684e7ec..9889a154 100644 --- a/packages/components/nodes/vectorstores/Singlestore_Upsert/Singlestore_Upsert.ts +++ b/packages/components/nodes/vectorstores/Singlestore_Upsert/Singlestore_Upsert.ts @@ -8,6 +8,7 @@ import { flatten } from 'lodash' class SingleStoreUpsert_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -20,6 +21,7 @@ class SingleStoreUpsert_VectorStores implements INode { constructor() { this.label = 'SingleStore Upsert Document' this.name = 'singlestoreUpsert' + this.version = 1.0 this.type = 'SingleStore' this.icon = 'singlestore.svg' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts b/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts index 0456667e..ed6febb5 100644 --- a/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts +++ b/packages/components/nodes/vectorstores/Supabase_Existing/Supabase_Exisiting.ts @@ -7,6 +7,7 @@ import { createClient } from '@supabase/supabase-js' class Supabase_Existing_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class Supabase_Existing_VectorStores implements INode { constructor() { this.label = 'Supabase Load Existing Index' this.name = 'supabaseExistingIndex' + this.version = 1.0 this.type = 'Supabase' this.icon = 'supabase.svg' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts b/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts index 98927d7b..90fe2121 100644 --- a/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts +++ b/packages/components/nodes/vectorstores/Supabase_Upsert/Supabase_Upsert.ts @@ -9,6 +9,7 @@ import { flatten } from 'lodash' class SupabaseUpsert_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -21,6 +22,7 @@ class SupabaseUpsert_VectorStores implements INode { constructor() { this.label = 'Supabase Upsert Document' this.name = 'supabaseUpsert' + this.version = 1.0 this.type = 'Supabase' this.icon = 'supabase.svg' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts b/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts index bc70a26f..e35a3917 100644 --- a/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts +++ b/packages/components/nodes/vectorstores/Weaviate_Existing/Weaviate_Existing.ts @@ -7,6 +7,7 @@ import { WeaviateLibArgs, WeaviateStore } from 'langchain/vectorstores/weaviate' class Weaviate_Existing_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -19,6 +20,7 @@ class Weaviate_Existing_VectorStores implements INode { constructor() { this.label = 'Weaviate Load Existing Index' this.name = 'weaviateExistingIndex' + this.version = 1.0 this.type = 'Weaviate' this.icon = 'weaviate.png' this.category = 'Vector Stores' diff --git a/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts b/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts index 2f6efd35..a2f82831 100644 --- a/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts +++ b/packages/components/nodes/vectorstores/Weaviate_Upsert/Weaviate_Upsert.ts @@ -9,6 +9,7 @@ import { flatten } from 'lodash' class WeaviateUpsert_VectorStores implements INode { label: string name: string + version: number description: string type: string icon: string @@ -21,6 +22,7 @@ class WeaviateUpsert_VectorStores implements INode { constructor() { this.label = 'Weaviate Upsert Document' this.name = 'weaviateUpsert' + this.version = 1.0 this.type = 'Weaviate' this.icon = 'weaviate.png' this.category = 'Vector Stores' diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index d88ac463..e883d056 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -84,6 +84,7 @@ export interface INodeProperties { name: string type: string icon: string + version: number category: string baseClasses: string[] description?: string diff --git a/packages/server/marketplaces/chatflows/API Agent OpenAI.json b/packages/server/marketplaces/chatflows/API Agent OpenAI.json index c51cdaf8..01e3d8f9 100644 --- a/packages/server/marketplaces/chatflows/API Agent OpenAI.json +++ b/packages/server/marketplaces/chatflows/API Agent OpenAI.json @@ -14,8 +14,9 @@ "id": "openApiChain_1", "label": "OpenAPI Chain", "name": "openApiChain", - "type": "openApiChain", - "baseClasses": ["openApiChain", "BaseChain"], + "version": 1, + "type": "OpenAPIChain", + "baseClasses": ["OpenAPIChain", "BaseChain"], "category": "Chains", "description": "Chain that automatically select and call APIs based only on an OpenAPI spec", "inputParams": [ @@ -59,10 +60,10 @@ }, "outputAnchors": [ { - "id": "openApiChain_1-output-openApiChain-openApiChain|BaseChain", + "id": "openApiChain_1-output-openApiChain-OpenAPIChain|BaseChain", "name": "openApiChain", - "label": "openApiChain", - "type": "openApiChain | BaseChain" + "label": "OpenAPIChain", + "type": "OpenAPIChain | BaseChain" } ], "outputs": {}, @@ -88,6 +89,7 @@ "id": "chatOpenAI_1", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -241,6 +243,7 @@ "id": "chainTool_0", "label": "Chain Tool", "name": "chainTool", + "version": 1, "type": "ChainTool", "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool"], "category": "Tools", @@ -314,6 +317,7 @@ "id": "openAIFunctionAgent_0", "label": "OpenAI Function Agent", "name": "openAIFunctionAgent", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain"], "category": "Agents", @@ -388,6 +392,7 @@ "id": "chatOpenAI_2", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -541,6 +546,7 @@ "id": "bufferMemory_0", "label": "Buffer Memory", "name": "bufferMemory", + "version": 1, "type": "BufferMemory", "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", @@ -598,11 +604,11 @@ }, { "source": "openApiChain_1", - "sourceHandle": "openApiChain_1-output-openApiChain-openApiChain|BaseChain", + "sourceHandle": "openApiChain_1-output-openApiChain-OpenAPIChain|BaseChain", "target": "chainTool_0", "targetHandle": "chainTool_0-input-baseChain-BaseChain", "type": "buttonedge", - "id": "openApiChain_1-openApiChain_1-output-openApiChain-openApiChain|BaseChain-chainTool_0-chainTool_0-input-baseChain-BaseChain", + "id": "openApiChain_1-openApiChain_1-output-openApiChain-OpenAPIChain|BaseChain-chainTool_0-chainTool_0-input-baseChain-BaseChain", "data": { "label": "" } diff --git a/packages/server/marketplaces/chatflows/API Agent.json b/packages/server/marketplaces/chatflows/API Agent.json index c1ed60d5..b9862add 100644 --- a/packages/server/marketplaces/chatflows/API Agent.json +++ b/packages/server/marketplaces/chatflows/API Agent.json @@ -14,6 +14,7 @@ "id": "getApiChain_0", "label": "GET API Chain", "name": "getApiChain", + "version": 1, "type": "GETApiChain", "baseClasses": ["GETApiChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -102,6 +103,7 @@ "id": "chainTool_0", "label": "Chain Tool", "name": "chainTool", + "version": 1, "type": "ChainTool", "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -175,6 +177,7 @@ "id": "bufferMemory_0", "label": "Buffer Memory", "name": "bufferMemory", + "version": 1, "type": "BufferMemory", "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", @@ -231,6 +234,7 @@ "id": "chainTool_1", "label": "Chain Tool", "name": "chainTool", + "version": 1, "type": "ChainTool", "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -304,6 +308,7 @@ "id": "postApiChain_0", "label": "POST API Chain", "name": "postApiChain", + "version": 1, "type": "POSTApiChain", "baseClasses": ["POSTApiChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -392,6 +397,7 @@ "id": "chatOpenAI_2", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -545,6 +551,7 @@ "id": "chatOpenAI_1", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -698,6 +705,7 @@ "id": "chatOpenAI_3", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -851,6 +859,7 @@ "id": "conversationalAgent_0", "label": "Conversational Agent", "name": "conversationalAgent", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain"], "category": "Agents", diff --git a/packages/server/marketplaces/chatflows/Antonym.json b/packages/server/marketplaces/chatflows/Antonym.json index a2801d24..95d3c151 100644 --- a/packages/server/marketplaces/chatflows/Antonym.json +++ b/packages/server/marketplaces/chatflows/Antonym.json @@ -14,6 +14,7 @@ "id": "fewShotPromptTemplate_1", "label": "Few Shot Prompt Template", "name": "fewShotPromptTemplate", + "version": 1, "type": "FewShotPromptTemplate", "baseClasses": ["FewShotPromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], "category": "Prompts", @@ -115,6 +116,7 @@ "id": "promptTemplate_0", "label": "Prompt Template", "name": "promptTemplate", + "version": 1, "type": "PromptTemplate", "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], "category": "Prompts", @@ -174,6 +176,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -327,6 +330,7 @@ "id": "llmChain_0", "label": "LLM Chain", "name": "llmChain", + "version": 1, "type": "LLMChain", "baseClasses": ["LLMChain", "BaseChain"], "category": "Chains", diff --git a/packages/server/marketplaces/chatflows/AutoGPT.json b/packages/server/marketplaces/chatflows/AutoGPT.json index b9cfe330..53837151 100644 --- a/packages/server/marketplaces/chatflows/AutoGPT.json +++ b/packages/server/marketplaces/chatflows/AutoGPT.json @@ -14,6 +14,7 @@ "id": "autoGPT_0", "label": "AutoGPT", "name": "autoGPT", + "version": 1, "type": "AutoGPT", "baseClasses": ["AutoGPT"], "category": "Agents", @@ -104,6 +105,7 @@ "id": "writeFile_1", "label": "Write File", "name": "writeFile", + "version": 1, "type": "WriteFile", "baseClasses": ["WriteFile", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -153,6 +155,7 @@ "id": "readFile_0", "label": "Read File", "name": "readFile", + "version": 1, "type": "ReadFile", "baseClasses": ["ReadFile", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -202,6 +205,7 @@ "id": "serpAPI_0", "label": "Serp API", "name": "serpAPI", + "version": 1, "type": "SerpAPI", "baseClasses": ["SerpAPI", "Tool", "StructuredTool"], "category": "Tools", @@ -248,6 +252,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -401,6 +406,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -484,6 +490,7 @@ "id": "pineconeExistingIndex_0", "label": "Pinecone Load Existing Index", "name": "pineconeExistingIndex", + "version": 1, "type": "Pinecone", "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", diff --git a/packages/server/marketplaces/chatflows/BabyAGI.json b/packages/server/marketplaces/chatflows/BabyAGI.json index 9c0f380c..c2897531 100644 --- a/packages/server/marketplaces/chatflows/BabyAGI.json +++ b/packages/server/marketplaces/chatflows/BabyAGI.json @@ -14,6 +14,7 @@ "id": "babyAGI_1", "label": "BabyAGI", "name": "babyAGI", + "version": 1, "type": "BabyAGI", "baseClasses": ["BabyAGI"], "category": "Agents", @@ -77,6 +78,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -230,6 +232,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -313,6 +316,7 @@ "id": "pineconeExistingIndex_0", "label": "Pinecone Load Existing Index", "name": "pineconeExistingIndex", + "version": 1, "type": "Pinecone", "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", diff --git a/packages/server/marketplaces/chatflows/CSV Agent.json b/packages/server/marketplaces/chatflows/CSV Agent.json index eaaacf39..1515fcad 100644 --- a/packages/server/marketplaces/chatflows/CSV Agent.json +++ b/packages/server/marketplaces/chatflows/CSV Agent.json @@ -14,6 +14,7 @@ "id": "csvAgent_0", "label": "CSV Agent", "name": "csvAgent", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain"], "category": "Agents", @@ -69,6 +70,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", diff --git a/packages/server/marketplaces/chatflows/ChatGPTPlugin.json b/packages/server/marketplaces/chatflows/ChatGPTPlugin.json index eb05132c..471853ba 100644 --- a/packages/server/marketplaces/chatflows/ChatGPTPlugin.json +++ b/packages/server/marketplaces/chatflows/ChatGPTPlugin.json @@ -14,6 +14,7 @@ "id": "aiPlugin_0", "label": "AI Plugin", "name": "aiPlugin", + "version": 1, "type": "AIPlugin", "baseClasses": ["AIPlugin", "Tool"], "category": "Tools", @@ -60,6 +61,7 @@ "id": "requestsGet_0", "label": "Requests Get", "name": "requestsGet", + "version": 1, "type": "RequestsGet", "baseClasses": ["RequestsGet", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -131,6 +133,7 @@ "id": "requestsPost_0", "label": "Requests Post", "name": "requestsPost", + "version": 1, "type": "RequestsPost", "baseClasses": ["RequestsPost", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -212,6 +215,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -365,6 +369,7 @@ "id": "mrklAgentChat_0", "label": "MRKL Agent for Chat Models", "name": "mrklAgentChat", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain"], "category": "Agents", diff --git a/packages/server/marketplaces/chatflows/Claude LLM.json b/packages/server/marketplaces/chatflows/Claude LLM.json index 07304590..243d2600 100644 --- a/packages/server/marketplaces/chatflows/Claude LLM.json +++ b/packages/server/marketplaces/chatflows/Claude LLM.json @@ -14,6 +14,7 @@ "id": "bufferMemory_0", "label": "Buffer Memory", "name": "bufferMemory", + "version": 1, "type": "BufferMemory", "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", @@ -70,6 +71,7 @@ "id": "conversationChain_0", "label": "Conversation Chain", "name": "conversationChain", + "version": 1, "type": "ConversationChain", "baseClasses": ["ConversationChain", "LLMChain", "BaseChain"], "category": "Chains", @@ -146,6 +148,7 @@ "id": "chatAnthropic_0", "label": "ChatAnthropic", "name": "chatAnthropic", + "version": 1, "type": "ChatAnthropic", "baseClasses": ["ChatAnthropic", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -294,6 +297,7 @@ "id": "pdfFile_0", "label": "Pdf File", "name": "pdfFile", + "version": 1, "type": "Document", "baseClasses": ["Document"], "category": "Document Loaders", diff --git a/packages/server/marketplaces/chatflows/Conversational Agent.json b/packages/server/marketplaces/chatflows/Conversational Agent.json index 59d59336..55475b3e 100644 --- a/packages/server/marketplaces/chatflows/Conversational Agent.json +++ b/packages/server/marketplaces/chatflows/Conversational Agent.json @@ -14,6 +14,7 @@ "id": "calculator_1", "label": "Calculator", "name": "calculator", + "version": 1, "type": "Calculator", "baseClasses": ["Calculator", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -52,6 +53,7 @@ "id": "bufferMemory_1", "label": "Buffer Memory", "name": "bufferMemory", + "version": 1, "type": "BufferMemory", "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", @@ -108,6 +110,7 @@ "id": "serpAPI_0", "label": "Serp API", "name": "serpAPI", + "version": 1, "type": "SerpAPI", "baseClasses": ["SerpAPI", "Tool", "StructuredTool"], "category": "Tools", @@ -154,6 +157,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -307,6 +311,7 @@ "id": "conversationalAgent_0", "label": "Conversational Agent", "name": "conversationalAgent", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain"], "category": "Agents", diff --git a/packages/server/marketplaces/chatflows/Conversational Retrieval QA Chain.json b/packages/server/marketplaces/chatflows/Conversational Retrieval QA Chain.json index c6c9187b..bf27e443 100644 --- a/packages/server/marketplaces/chatflows/Conversational Retrieval QA Chain.json +++ b/packages/server/marketplaces/chatflows/Conversational Retrieval QA Chain.json @@ -14,6 +14,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -167,6 +168,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -250,6 +252,7 @@ "id": "pineconeUpsert_0", "label": "Pinecone Upsert Document", "name": "pineconeUpsert", + "version": 1, "type": "Pinecone", "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -357,6 +360,7 @@ "id": "recursiveCharacterTextSplitter_0", "label": "Recursive Character Text Splitter", "name": "recursiveCharacterTextSplitter", + "version": 1, "type": "RecursiveCharacterTextSplitter", "baseClasses": ["RecursiveCharacterTextSplitter", "TextSplitter"], "category": "Text Splitters", @@ -414,6 +418,7 @@ "id": "textFile_0", "label": "Text File", "name": "textFile", + "version": 1, "type": "Document", "baseClasses": ["Document"], "category": "Document Loaders", @@ -479,6 +484,7 @@ "id": "conversationalRetrievalQAChain_0", "label": "Conversational Retrieval QA Chain", "name": "conversationalRetrievalQAChain", + "version": 1, "type": "ConversationalRetrievalQAChain", "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain"], "category": "Chains", diff --git a/packages/server/marketplaces/chatflows/Flowise Docs QnA.json b/packages/server/marketplaces/chatflows/Flowise Docs QnA.json index 4c4d085e..6d11f3d2 100644 --- a/packages/server/marketplaces/chatflows/Flowise Docs QnA.json +++ b/packages/server/marketplaces/chatflows/Flowise Docs QnA.json @@ -14,6 +14,7 @@ "id": "markdownTextSplitter_0", "label": "Markdown Text Splitter", "name": "markdownTextSplitter", + "version": 1, "type": "MarkdownTextSplitter", "baseClasses": ["MarkdownTextSplitter", "RecursiveCharacterTextSplitter", "TextSplitter", "BaseDocumentTransformer"], "category": "Text Splitters", @@ -71,6 +72,7 @@ "id": "memoryVectorStore_0", "label": "In-Memory Vector Store", "name": "memoryVectorStore", + "version": 1, "type": "Memory", "baseClasses": ["Memory", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -153,6 +155,7 @@ "id": "conversationalRetrievalQAChain_0", "label": "Conversational Retrieval QA Chain", "name": "conversationalRetrievalQAChain", + "version": 1, "type": "ConversationalRetrievalQAChain", "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain"], "category": "Chains", @@ -262,6 +265,7 @@ "id": "github_0", "label": "Github", "name": "github", + "version": 1, "type": "Document", "baseClasses": ["Document"], "category": "Document Loaders", @@ -353,6 +357,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -506,6 +511,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", diff --git a/packages/server/marketplaces/chatflows/HuggingFace LLM Chain.json b/packages/server/marketplaces/chatflows/HuggingFace LLM Chain.json index b786aeb9..6e159a28 100644 --- a/packages/server/marketplaces/chatflows/HuggingFace LLM Chain.json +++ b/packages/server/marketplaces/chatflows/HuggingFace LLM Chain.json @@ -14,6 +14,7 @@ "id": "llmChain_1", "label": "LLM Chain", "name": "llmChain", + "version": 1, "type": "LLMChain", "baseClasses": ["LLMChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -94,6 +95,7 @@ "id": "promptTemplate_0", "label": "Prompt Template", "name": "promptTemplate", + "version": 1, "type": "PromptTemplate", "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], "category": "Prompts", @@ -153,6 +155,7 @@ "id": "huggingFaceInference_LLMs_0", "label": "HuggingFace Inference", "name": "huggingFaceInference_LLMs", + "version": 1, "type": "HuggingFaceInference", "baseClasses": ["HuggingFaceInference", "LLM", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", diff --git a/packages/server/marketplaces/chatflows/Local QnA.json b/packages/server/marketplaces/chatflows/Local QnA.json index ea9453b7..9d9f5ec8 100644 --- a/packages/server/marketplaces/chatflows/Local QnA.json +++ b/packages/server/marketplaces/chatflows/Local QnA.json @@ -14,6 +14,7 @@ "id": "recursiveCharacterTextSplitter_1", "label": "Recursive Character Text Splitter", "name": "recursiveCharacterTextSplitter", + "version": 1, "type": "RecursiveCharacterTextSplitter", "baseClasses": ["RecursiveCharacterTextSplitter", "TextSplitter"], "category": "Text Splitters", @@ -71,6 +72,7 @@ "id": "conversationalRetrievalQAChain_0", "label": "Conversational Retrieval QA Chain", "name": "conversationalRetrievalQAChain", + "version": 1, "type": "ConversationalRetrievalQAChain", "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -177,6 +179,7 @@ "id": "faissUpsert_0", "label": "Faiss Upsert Document", "name": "faissUpsert", + "version": 1, "type": "Faiss", "baseClasses": ["Faiss", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -269,6 +272,7 @@ "id": "chatLocalAI_0", "label": "ChatLocalAI", "name": "chatLocalAI", + "version": 1, "type": "ChatLocalAI", "baseClasses": ["ChatLocalAI", "BaseChatModel", "LLM", "BaseLLM", "BaseLanguageModel", "BaseLangChain"], "category": "Chat Models", @@ -361,6 +365,7 @@ "id": "textFile_0", "label": "Text File", "name": "textFile", + "version": 1, "type": "Document", "baseClasses": ["Document"], "category": "Document Loaders", @@ -426,6 +431,7 @@ "id": "localAIEmbeddings_0", "label": "LocalAI Embeddings", "name": "localAIEmbeddings", + "version": 1, "type": "LocalAI Embeddings", "baseClasses": ["LocalAI Embeddings", "Embeddings"], "category": "Embeddings", diff --git a/packages/server/marketplaces/chatflows/Long Term Memory.json b/packages/server/marketplaces/chatflows/Long Term Memory.json index db7ab6c8..07669f82 100644 --- a/packages/server/marketplaces/chatflows/Long Term Memory.json +++ b/packages/server/marketplaces/chatflows/Long Term Memory.json @@ -14,6 +14,7 @@ "id": "conversationalRetrievalQAChain_0", "label": "Conversational Retrieval QA Chain", "name": "conversationalRetrievalQAChain", + "version": 1, "type": "ConversationalRetrievalQAChain", "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -121,6 +122,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -274,6 +276,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -357,6 +360,7 @@ "id": "pineconeExistingIndex_0", "label": "Pinecone Load Existing Index", "name": "pineconeExistingIndex", + "version": 1, "type": "Pinecone", "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -465,6 +469,7 @@ "id": "ZepMemory_0", "label": "Zep Memory", "name": "ZepMemory", + "version": 1, "type": "ZepMemory", "baseClasses": ["ZepMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", diff --git a/packages/server/marketplaces/chatflows/MRKLAgent.json b/packages/server/marketplaces/chatflows/MRKLAgent.json index 4164f886..f851b0ed 100644 --- a/packages/server/marketplaces/chatflows/MRKLAgent.json +++ b/packages/server/marketplaces/chatflows/MRKLAgent.json @@ -14,6 +14,7 @@ "id": "calculator_1", "label": "Calculator", "name": "calculator", + "version": 1, "type": "Calculator", "baseClasses": ["Calculator", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -52,6 +53,7 @@ "id": "mrklAgentLLM_0", "label": "MRKL Agent for LLMs", "name": "mrklAgentLLM", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], "category": "Agents", @@ -107,6 +109,7 @@ "id": "serper_0", "label": "Serper", "name": "serper", + "version": 1, "type": "Serper", "baseClasses": ["Serper", "Tool", "StructuredTool"], "category": "Tools", @@ -153,6 +156,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", diff --git a/packages/server/marketplaces/chatflows/Metadata Filter Load.json b/packages/server/marketplaces/chatflows/Metadata Filter Load.json index 2076c15e..b6ca91e3 100644 --- a/packages/server/marketplaces/chatflows/Metadata Filter Load.json +++ b/packages/server/marketplaces/chatflows/Metadata Filter Load.json @@ -14,6 +14,7 @@ "id": "conversationalRetrievalQAChain_0", "label": "Conversational Retrieval QA Chain", "name": "conversationalRetrievalQAChain", + "version": 1, "type": "ConversationalRetrievalQAChain", "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -119,6 +120,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -272,6 +274,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -355,6 +358,7 @@ "id": "pineconeExistingIndex_0", "label": "Pinecone Load Existing Index", "name": "pineconeExistingIndex", + "version": 1, "type": "Pinecone", "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", diff --git a/packages/server/marketplaces/chatflows/Metadata Filter Upsert.json b/packages/server/marketplaces/chatflows/Metadata Filter Upsert.json index a0852989..e70b11f7 100644 --- a/packages/server/marketplaces/chatflows/Metadata Filter Upsert.json +++ b/packages/server/marketplaces/chatflows/Metadata Filter Upsert.json @@ -14,6 +14,7 @@ "id": "recursiveCharacterTextSplitter_1", "label": "Recursive Character Text Splitter", "name": "recursiveCharacterTextSplitter", + "version": 1, "type": "RecursiveCharacterTextSplitter", "baseClasses": ["RecursiveCharacterTextSplitter", "TextSplitter"], "category": "Text Splitters", @@ -71,6 +72,7 @@ "id": "textFile_0", "label": "Text File", "name": "textFile", + "version": 1, "type": "Document", "baseClasses": ["Document"], "category": "Document Loaders", @@ -136,6 +138,7 @@ "id": "pdfFile_0", "label": "Pdf File", "name": "pdfFile", + "version": 1, "type": "Document", "baseClasses": ["Document"], "category": "Document Loaders", @@ -219,6 +222,7 @@ "id": "conversationalRetrievalQAChain_0", "label": "Conversational Retrieval QA Chain", "name": "conversationalRetrievalQAChain", + "version": 1, "type": "ConversationalRetrievalQAChain", "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -325,6 +329,7 @@ "label": "Pinecone Upsert Document", "name": "pineconeUpsert", "type": "Pinecone", + "version": 1, "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", "description": "Upsert documents to Pinecone", @@ -431,6 +436,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -584,6 +590,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", diff --git a/packages/server/marketplaces/chatflows/Multi Prompt Chain.json b/packages/server/marketplaces/chatflows/Multi Prompt Chain.json index 06684ac0..cf86df5b 100644 --- a/packages/server/marketplaces/chatflows/Multi Prompt Chain.json +++ b/packages/server/marketplaces/chatflows/Multi Prompt Chain.json @@ -14,6 +14,7 @@ "id": "promptRetriever_0", "label": "Prompt Retriever", "name": "promptRetriever", + "version": 1, "type": "PromptRetriever", "baseClasses": ["PromptRetriever"], "category": "Retrievers", @@ -81,6 +82,7 @@ "id": "multiPromptChain_0", "label": "Multi Prompt Chain", "name": "multiPromptChain", + "version": 1, "type": "MultiPromptChain", "baseClasses": ["MultiPromptChain", "MultiRouteChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -140,6 +142,7 @@ "id": "promptRetriever_1", "label": "Prompt Retriever", "name": "promptRetriever", + "version": 1, "type": "PromptRetriever", "baseClasses": ["PromptRetriever"], "category": "Retrievers", @@ -207,6 +210,7 @@ "id": "promptRetriever_2", "label": "Prompt Retriever", "name": "promptRetriever", + "version": 1, "type": "PromptRetriever", "baseClasses": ["PromptRetriever"], "category": "Retrievers", @@ -274,6 +278,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", diff --git a/packages/server/marketplaces/chatflows/Multi Retrieval QA Chain.json b/packages/server/marketplaces/chatflows/Multi Retrieval QA Chain.json index 356e26e5..f5604bf6 100644 --- a/packages/server/marketplaces/chatflows/Multi Retrieval QA Chain.json +++ b/packages/server/marketplaces/chatflows/Multi Retrieval QA Chain.json @@ -14,6 +14,7 @@ "id": "vectorStoreRetriever_0", "label": "Vector Store Retriever", "name": "vectorStoreRetriever", + "version": 1, "type": "VectorStoreRetriever", "baseClasses": ["VectorStoreRetriever"], "category": "Retrievers", @@ -80,6 +81,7 @@ "id": "multiRetrievalQAChain_0", "label": "Multi Retrieval QA Chain", "name": "multiRetrievalQAChain", + "version": 1, "type": "MultiRetrievalQAChain", "baseClasses": ["MultiRetrievalQAChain", "MultiRouteChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -146,6 +148,7 @@ "id": "vectorStoreRetriever_1", "label": "Vector Store Retriever", "name": "vectorStoreRetriever", + "version": 1, "type": "VectorStoreRetriever", "baseClasses": ["VectorStoreRetriever"], "category": "Retrievers", @@ -212,6 +215,7 @@ "id": "vectorStoreRetriever_2", "label": "Vector Store Retriever", "name": "vectorStoreRetriever", + "version": 1, "type": "VectorStoreRetriever", "baseClasses": ["VectorStoreRetriever"], "category": "Retrievers", @@ -278,6 +282,7 @@ "id": "pineconeExistingIndex_0", "label": "Pinecone Load Existing Index", "name": "pineconeExistingIndex", + "version": 1, "type": "Pinecone", "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -386,6 +391,7 @@ "id": "chromaExistingIndex_0", "label": "Chroma Load Existing Index", "name": "chromaExistingIndex", + "version": 1, "type": "Chroma", "baseClasses": ["Chroma", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -476,6 +482,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -559,6 +566,7 @@ "id": "supabaseExistingIndex_0", "label": "Supabase Load Existing Index", "name": "supabaseExistingIndex", + "version": 1, "type": "Supabase", "baseClasses": ["Supabase", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -671,6 +679,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", diff --git a/packages/server/marketplaces/chatflows/Multiple VectorDB.json b/packages/server/marketplaces/chatflows/Multiple VectorDB.json index 3822931a..101a683b 100644 --- a/packages/server/marketplaces/chatflows/Multiple VectorDB.json +++ b/packages/server/marketplaces/chatflows/Multiple VectorDB.json @@ -14,6 +14,7 @@ "id": "chainTool_2", "label": "Chain Tool", "name": "chainTool", + "version": 1, "type": "ChainTool", "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -87,6 +88,7 @@ "id": "chainTool_3", "label": "Chain Tool", "name": "chainTool", + "version": 1, "type": "ChainTool", "baseClasses": ["ChainTool", "DynamicTool", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -160,6 +162,7 @@ "id": "mrklAgentLLM_0", "label": "MRKL Agent for LLMs", "name": "mrklAgentLLM", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], "category": "Agents", @@ -215,6 +218,7 @@ "id": "retrievalQAChain_0", "label": "Retrieval QA Chain", "name": "retrievalQAChain", + "version": 1, "type": "RetrievalQAChain", "baseClasses": ["RetrievalQAChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -269,6 +273,7 @@ "id": "retrievalQAChain_1", "label": "Retrieval QA Chain", "name": "retrievalQAChain", + "version": 1, "type": "RetrievalQAChain", "baseClasses": ["RetrievalQAChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -323,6 +328,7 @@ "id": "openAI_2", "label": "OpenAI", "name": "openAI", + "version": 1, "type": "OpenAI", "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", @@ -478,6 +484,7 @@ "id": "openAIEmbeddings_1", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -561,6 +568,7 @@ "id": "chromaExistingIndex_0", "label": "Chroma Load Existing Index", "name": "chromaExistingIndex", + "version": 1, "type": "Chroma", "baseClasses": ["Chroma", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -651,6 +659,7 @@ "id": "openAIEmbeddings_2", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -734,6 +743,7 @@ "id": "openAI_3", "label": "OpenAI", "name": "openAI", + "version": 1, "type": "OpenAI", "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", @@ -889,6 +899,7 @@ "id": "pineconeExistingIndex_0", "label": "Pinecone Load Existing Index", "name": "pineconeExistingIndex", + "version": 1, "type": "Pinecone", "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -997,6 +1008,7 @@ "id": "openAI_4", "label": "OpenAI", "name": "openAI", + "version": 1, "type": "OpenAI", "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", diff --git a/packages/server/marketplaces/chatflows/OpenAI Agent.json b/packages/server/marketplaces/chatflows/OpenAI Agent.json index 9db4702d..91d5d38c 100644 --- a/packages/server/marketplaces/chatflows/OpenAI Agent.json +++ b/packages/server/marketplaces/chatflows/OpenAI Agent.json @@ -14,6 +14,7 @@ "id": "calculator_0", "label": "Calculator", "name": "calculator", + "version": 1, "type": "Calculator", "baseClasses": ["Calculator", "Tool", "StructuredTool", "BaseLangChain", "Serializable"], "category": "Tools", @@ -52,6 +53,7 @@ "id": "bufferMemory_0", "label": "Buffer Memory", "name": "bufferMemory", + "version": 1, "type": "BufferMemory", "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", @@ -108,6 +110,7 @@ "id": "customTool_0", "label": "Custom Tool", "name": "customTool", + "version": 1, "type": "CustomTool", "baseClasses": ["CustomTool", "Tool", "StructuredTool"], "category": "Tools", @@ -156,6 +159,7 @@ "id": "serper_0", "label": "Serper", "name": "serper", + "version": 1, "type": "Serper", "baseClasses": ["Serper", "Tool", "StructuredTool"], "category": "Tools", @@ -202,6 +206,7 @@ "id": "openAIFunctionAgent_0", "label": "OpenAI Function Agent", "name": "openAIFunctionAgent", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain"], "category": "Agents", @@ -276,6 +281,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", diff --git a/packages/server/marketplaces/chatflows/Prompt Chaining.json b/packages/server/marketplaces/chatflows/Prompt Chaining.json index 8bc512f0..e0491cc1 100644 --- a/packages/server/marketplaces/chatflows/Prompt Chaining.json +++ b/packages/server/marketplaces/chatflows/Prompt Chaining.json @@ -14,6 +14,7 @@ "id": "promptTemplate_0", "label": "Prompt Template", "name": "promptTemplate", + "version": 1, "type": "PromptTemplate", "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], "category": "Prompts", @@ -73,6 +74,7 @@ "id": "promptTemplate_1", "label": "Prompt Template", "name": "promptTemplate", + "version": 1, "type": "PromptTemplate", "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], "category": "Prompts", @@ -132,6 +134,7 @@ "id": "llmChain_0", "label": "LLM Chain", "name": "llmChain", + "version": 1, "type": "LLMChain", "baseClasses": ["LLMChain", "BaseChain"], "category": "Chains", @@ -212,6 +215,7 @@ "id": "llmChain_1", "label": "LLM Chain", "name": "llmChain", + "version": 1, "type": "LLMChain", "baseClasses": ["LLMChain", "BaseChain"], "category": "Chains", @@ -292,6 +296,7 @@ "id": "openAI_1", "label": "OpenAI", "name": "openAI", + "version": 1, "type": "OpenAI", "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", @@ -447,6 +452,7 @@ "id": "openAI_2", "label": "OpenAI", "name": "openAI", + "version": 1, "type": "OpenAI", "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", diff --git a/packages/server/marketplaces/chatflows/Replicate LLM.json b/packages/server/marketplaces/chatflows/Replicate LLM.json index 66377663..5a57b2e7 100644 --- a/packages/server/marketplaces/chatflows/Replicate LLM.json +++ b/packages/server/marketplaces/chatflows/Replicate LLM.json @@ -14,6 +14,7 @@ "id": "llmChain_1", "label": "LLM Chain", "name": "llmChain", + "version": 1, "type": "LLMChain", "baseClasses": ["LLMChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -94,6 +95,7 @@ "id": "promptTemplate_0", "label": "Prompt Template", "name": "promptTemplate", + "version": 1, "type": "PromptTemplate", "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], "category": "Prompts", @@ -153,6 +155,7 @@ "id": "replicate_0", "label": "Replicate", "name": "replicate", + "version": 1, "type": "Replicate", "baseClasses": ["Replicate", "LLM", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", diff --git a/packages/server/marketplaces/chatflows/SQL DB Chain.json b/packages/server/marketplaces/chatflows/SQL DB Chain.json index c33a8f13..b37dc7ce 100644 --- a/packages/server/marketplaces/chatflows/SQL DB Chain.json +++ b/packages/server/marketplaces/chatflows/SQL DB Chain.json @@ -14,6 +14,7 @@ "id": "sqlDatabaseChain_0", "label": "Sql Database Chain", "name": "sqlDatabaseChain", + "version": 1, "type": "SqlDatabaseChain", "baseClasses": ["SqlDatabaseChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -84,6 +85,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", diff --git a/packages/server/marketplaces/chatflows/Simple Conversation Chain.json b/packages/server/marketplaces/chatflows/Simple Conversation Chain.json index bdf3c871..2c41a54f 100644 --- a/packages/server/marketplaces/chatflows/Simple Conversation Chain.json +++ b/packages/server/marketplaces/chatflows/Simple Conversation Chain.json @@ -14,6 +14,7 @@ "id": "bufferMemory_0", "label": "Buffer Memory", "name": "bufferMemory", + "version": 1, "type": "BufferMemory", "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", @@ -70,6 +71,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -223,6 +225,7 @@ "id": "conversationChain_0", "label": "Conversation Chain", "name": "conversationChain", + "version": 1, "type": "ConversationChain", "baseClasses": ["ConversationChain", "LLMChain", "BaseChain"], "category": "Chains", diff --git a/packages/server/marketplaces/chatflows/Simple LLM Chain.json b/packages/server/marketplaces/chatflows/Simple LLM Chain.json index ccc3cf95..0fc648c6 100644 --- a/packages/server/marketplaces/chatflows/Simple LLM Chain.json +++ b/packages/server/marketplaces/chatflows/Simple LLM Chain.json @@ -14,6 +14,7 @@ "id": "llmChain_1", "label": "LLM Chain", "name": "llmChain", + "version": 1, "type": "LLMChain", "baseClasses": ["LLMChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -94,6 +95,7 @@ "id": "promptTemplate_0", "label": "Prompt Template", "name": "promptTemplate", + "version": 1, "type": "PromptTemplate", "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], "category": "Prompts", @@ -153,6 +155,7 @@ "id": "openAI_0", "label": "OpenAI", "name": "openAI", + "version": 1, "type": "OpenAI", "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", diff --git a/packages/server/marketplaces/chatflows/Translator.json b/packages/server/marketplaces/chatflows/Translator.json index 00e002b9..dc2ee6ba 100644 --- a/packages/server/marketplaces/chatflows/Translator.json +++ b/packages/server/marketplaces/chatflows/Translator.json @@ -14,6 +14,7 @@ "id": "llmChain_1", "label": "LLM Chain", "name": "llmChain", + "version": 1, "type": "LLMChain", "baseClasses": ["LLMChain", "BaseChain", "BaseLangChain"], "category": "Chains", @@ -94,6 +95,7 @@ "id": "chatPromptTemplate_0", "label": "Chat Prompt Template", "name": "chatPromptTemplate", + "version": 1, "type": "ChatPromptTemplate", "baseClasses": ["ChatPromptTemplate", "BaseChatPromptTemplate", "BasePromptTemplate"], "category": "Prompts", @@ -162,6 +164,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", diff --git a/packages/server/marketplaces/chatflows/WebBrowser.json b/packages/server/marketplaces/chatflows/WebBrowser.json index f83454d8..95743f9f 100644 --- a/packages/server/marketplaces/chatflows/WebBrowser.json +++ b/packages/server/marketplaces/chatflows/WebBrowser.json @@ -14,6 +14,7 @@ "id": "bufferMemory_0", "label": "Buffer Memory", "name": "bufferMemory", + "version": 1, "type": "BufferMemory", "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", @@ -70,6 +71,7 @@ "id": "webBrowser_0", "label": "Web Browser", "name": "webBrowser", + "version": 1, "type": "WebBrowser", "baseClasses": ["WebBrowser", "Tool", "StructuredTool", "BaseLangChain"], "category": "Tools", @@ -124,6 +126,7 @@ "id": "conversationalAgent_0", "label": "Conversational Agent", "name": "conversationalAgent", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain"], "category": "Agents", @@ -198,6 +201,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -351,6 +355,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -434,6 +439,7 @@ "id": "chatOpenAI_1", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", diff --git a/packages/server/marketplaces/chatflows/WebPage QnA.json b/packages/server/marketplaces/chatflows/WebPage QnA.json index 817bd78f..b04ad5e2 100644 --- a/packages/server/marketplaces/chatflows/WebPage QnA.json +++ b/packages/server/marketplaces/chatflows/WebPage QnA.json @@ -14,6 +14,7 @@ "id": "chatOpenAI_0", "label": "ChatOpenAI", "name": "chatOpenAI", + "version": 1, "type": "ChatOpenAI", "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", @@ -167,6 +168,7 @@ "id": "openAIEmbeddings_0", "label": "OpenAI Embeddings", "name": "openAIEmbeddings", + "version": 1, "type": "OpenAIEmbeddings", "baseClasses": ["OpenAIEmbeddings", "Embeddings"], "category": "Embeddings", @@ -250,6 +252,7 @@ "id": "pineconeUpsert_0", "label": "Pinecone Upsert Document", "name": "pineconeUpsert", + "version": 1, "type": "Pinecone", "baseClasses": ["Pinecone", "VectorStoreRetriever", "BaseRetriever"], "category": "Vector Stores", @@ -357,6 +360,7 @@ "id": "cheerioWebScraper_0", "label": "Cheerio Web Scraper", "name": "cheerioWebScraper", + "version": 1, "type": "Document", "baseClasses": ["Document"], "category": "Document Loaders", @@ -455,6 +459,7 @@ "id": "htmlToMarkdownTextSplitter_0", "label": "HtmlToMarkdown Text Splitter", "name": "htmlToMarkdownTextSplitter", + "version": 1, "type": "HtmlToMarkdownTextSplitter", "baseClasses": [ "HtmlToMarkdownTextSplitter", @@ -518,6 +523,7 @@ "id": "conversationalRetrievalQAChain_0", "label": "Conversational Retrieval QA Chain", "name": "conversationalRetrievalQAChain", + "version": 1, "type": "ConversationalRetrievalQAChain", "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain"], "category": "Chains", @@ -627,6 +633,7 @@ "id": "motorheadMemory_0", "label": "Motorhead Memory", "name": "motorheadMemory", + "version": 1, "type": "MotorheadMemory", "baseClasses": ["MotorheadMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", diff --git a/packages/server/marketplaces/chatflows/Zapier NLA.json b/packages/server/marketplaces/chatflows/Zapier NLA.json index 4e315165..60258b46 100644 --- a/packages/server/marketplaces/chatflows/Zapier NLA.json +++ b/packages/server/marketplaces/chatflows/Zapier NLA.json @@ -14,6 +14,7 @@ "id": "zapierNLA_0", "label": "Zapier NLA", "name": "zapierNLA", + "version": 1, "type": "ZapierNLA", "baseClasses": ["ZapierNLA", "Tool"], "category": "Tools", @@ -59,6 +60,7 @@ "id": "mrklAgentLLM_0", "label": "MRKL Agent for LLMs", "name": "mrklAgentLLM", + "version": 1, "type": "AgentExecutor", "baseClasses": ["AgentExecutor", "BaseChain", "BaseLangChain"], "category": "Agents", @@ -113,6 +115,7 @@ "id": "openAI_0", "label": "OpenAI", "name": "openAI", + "version": 1, "type": "OpenAI", "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index befafd6d..e1ac4724 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -564,6 +564,12 @@ export class App { return res.json(availableConfigs) }) + this.app.post('/api/v1/node-config', async (req: Request, res: Response) => { + const nodes = [{ data: req.body }] as IReactFlowNode[] + const availableConfigs = findAvailableConfigs(nodes, this.nodesPool.componentCredentials) + return res.json(availableConfigs) + }) + // ---------------------------------------- // Export Load Chatflow & ChatMessage & Apikeys // ---------------------------------------- diff --git a/packages/ui/src/api/config.js b/packages/ui/src/api/config.js index 0fb8297d..47ee51a0 100644 --- a/packages/ui/src/api/config.js +++ b/packages/ui/src/api/config.js @@ -1,7 +1,9 @@ import client from './client' const getConfig = (id) => client.get(`/flow-config/${id}`) +const getNodeConfig = (body) => client.post(`/node-config`, body) export default { - getConfig + getConfig, + getNodeConfig } diff --git a/packages/ui/src/assets/images/account.png b/packages/ui/src/assets/images/account.png new file mode 100644 index 0000000000000000000000000000000000000000..a758a1db9bb56fce0adcd99eccddab5525b31184 GIT binary patch literal 20187 zcmce;gN8=h=I&z4qEG?sY%J8tAE$ldzCL5Jax2p<)Cdqy=5N1j(}_0u9ltG~H@Dt&zwCnU!W9ulDylu(SX z9%>tiOsM<*p!?lK zFsKc}PJB)V#b=Z@)iA{Qz=+e6;y9~6cZ2_9MttOAcrzW-sB`}RjjsGvN9LQQ4M3C1a* z!mvs()uWyi=B(S;@T#(qKlrNV$dsj155F?ns9?r2*vx4AC(-h!(g2>C^`5CuqV4~Kj$V<5r$N3)ANFSQ^$TkB}kVd z{Qd#fqv1kRY5=Q}5AT{mXtY@v)iqlqXbcPOVVoPzU%vdn4ga;FT(y4!@j*2ulFWm} zVIy=qpSm5cTI}cc^3h>2=gg##p{Q5yH~ol}W^fKEPZ5WU&qX zFy@>byhW+0d!fpd^JipA%Z@m~xbxPrK z0nHu^FBDZP3?2LHK|)`1Fh=1aB3Nd<*MMZ>w(G-DMCz;}tcgcmu9vYwc{rCM{`okQ zZV7~OLPiBEXyu~nCEd6((#6FaaTE>8jDlskP>IGGmm;j?=6JX6(I=^g#=yR)g5$0eOfMDq6WvxKTi9KUN~2j7E@_D!U|CnO@Gf-Typ=7 zSYl4*=adUazdysNs%m1Gx?{lwkJbpki-1y~jGW}O;ztM9>E47>UMZFoiZST*pRd<= zpKavqNox^u?@7-d3lx^{i!!b6nrlN}(}$JSPQKSwR*)Qt&T_#c2drdp6k*&`TDojO z5grv;FtQB2yM4@M4Yo{h>FRgYf}T}iJD&4I(8-;9zs_$u%f7<%N<}j4!ASnPC%HIi zt}I2N4PydmlZ1FXGEIkRH{5j~h@%6WgUon!+ zhiC8XE;J-W$P+ZW0(<=3s}C*zLpxQ+9^f^#K?%mC9}FOaXLb$iadB>0rdsM;8x#!C z-ox@(QppCh_qa?q@}qDDDaZr$G*9+COCzY@Lc=i50-*Ka)JZp~;~oCLtR?nUNZuPc zH{g-$=Cx3=z7}@RxPNhCGKQ65LP`(MBE}=5va|@f5De#dit_wY;%jPE2W|FYTghV& zx%l{Ss8e1Ok&`RCx>9v@-KApNR5USR5*|_x4wjT-r<7w)IQ_&oK6R_OsE9&pA_2V{ z9A!pwi#|gn*Z@Ifc&`Sm=*|0JuJmSzNPah+mf-$~M$b;ANwamWhHjktTuANu+6z@T zH#wTLq6IHDEBz-e9ww#}#jTYLQTX%%!UF1_UrEqy3ida8Y8%wNWwZ2=IERsJ9I38o zZzm5cjavvq%R=cw@@FBXUJ*ztL8Z@nWE`);D-AJBDH*5Tp=xS_l>v`jT|ZBXs2)Gi zrk3^)?z~s=FQvmn^wDjUb{INT^oDi|`#=LQYhU0*gA}VXQVsS6P^xInR!zYuhi+rB zr4nkHg`S0MIcK7-uJBSPxT&r$&tyPmD?3PwxSSjyH`Mp}aWQ;j9 z;Puf=%W?FHtF>T$53A#8q|+hB$!k%QN6e$o>l&Y$w)#e9-G$WgdiS^E4$50gOO&^Y z+uJP=srLlzEe!oPxHBOM;Ot)Nl=9sd9qm-caJC7`$>Dv_SD;Xk^`z0uc^Nft{}x$d zJBmg}C(X`9-mFZ;_XtZfB?Jm9;e*`9>2a{-(@~z61HC%o~CeO|zEwg3a z>4s%PCG_ri-0bSUTf*aSYHTbt>n}+;BG-Up7t*ea(EDq6`nT74s5&iCX`Gz_k}z^p z9=4O(7eUJgSXx_OyK(V@%v$#9+P;rBDK0cHXZvF9m2DVffnC(Q!2pcR9sQ-@#TTVl zJn)Eh17YZXUixuV)7|phr9S&5N-u+VKb-I{poR3rLbwakC(UlzULDgDTt)&%oI8wNScfQ;t8{FshYbQ=p-1k%rBOu@1C^Z}Ca);f2 z9bReGqK(kgAN?K>;@w*pinZrX(Z_Ym97c;DT$C5!L4N!1^jU9*Kp_XY|HOg`k_6Wi z=?j7)S}u=Cq^svd;HCWa4_SS*u4lE2!Xt@5NV;2cZ8bh@vH&M0br=n|;2HD!v$f_p zxjBk9Jdd7a`P<$=;Wu~iP9cb;tX3`{z+s~98(JyG9MZ5hGJ5(XIbi}qmwsTYNFSFu zAAvK@Z~E{l3SL?q5cuU1UIm?BdHuDsJ38|zpLj-)%psUyhnZ!kbK^s7v5WSu|IvWdONu@O7RV+#HFjC#8>-vV{$7#QM>_23C< zE{Q##T5SYGD>4$1WF`SV&&-W%oMv;;ngU+HTQJ=VI`kzuPCzDBzrfHY&Ry(spJPO` zxCCX@5PF>(GolPxwjns-ck|3Y1Q5!x7tDBhDkG1NgMAbH-Af`2>=&Q$#%d(k$!H2S z;K)lag>LLSJeyC!|JBnkHq*4#OFkvs`z8S&ZTRWk1lldYp*QtC7&X5@1o_(pe3h#G z>Ci#Rsf5sWk_EMmnUJgdx|5h?QoEF(th(+=WBYsIPb*Z zx<+T4G$a#=Fz^f>*CpIGwIM!DLQLiUW$d%PkF4I8zm^;<*ltQ@I1B2$l%`8d;)tg& z2wBqRr|ffm%VIQ@eN=>``fs#pdF+o{P_q(3-6h}e^L@G9uOp)hJcbAoUn9!^oZ*)F zXOGOASXHCw(cTDESho{*pXsFZYOo;i$%LekzixoFUS`z}H;NM@3^&wTShX7I~Ww@a3glV7vTh~H00SN;a}hl2|yP*v+|HSnuA;1DR$ zaKUKYzc0XU6(V(`V^0MmFixIX>eUs?Bj#mKBOer+CR$13rTpg$CL!Y0{3WzZ4mM9u zJxm-L-SrVIi%893NLst}mE_ZB=7vWF4AfAUXCs0IW&{0jb8;<9myjiPKIUb`)q;O{ zFr3R*GR3h0Hg4xdUo3wVeBSAj4O!$AzF2F}(237XRBp4M8op>=TqLXs%-ZGIWG_7! z|1T|wNDlo_f}0#V^tDyK$Lvso>2gQm;i^XK&Y*v!>kQC_sjg|ll|IY@Sn6uJvAWZbv?=bJ=|@(fjEs!2S+*_o#&0Rp645E6 zrLl(|Xs&^dU0UcMr``LXx{Ppt0F&IG(BU6Ty8}+LUIff{6qW8&*4E;ah8_}`1??pu z(~BQY*7T>Ri(Z)_h)(zuA%pkc=EKh&cDk>A73lTx#4+wJaG-!A-06{=TIxwlV9z5l ztzl20P`Zrsli#2(Cngoe-_gdfsY@I!mN)->ed2}q5r&&FhUt9ilF+>&x@Ty8e=}MM zx0t6d*k&rbNfj)^5rR|5&dBIzfy}0Fq*qkH2ydNi=U({+9n(UE?d{BrSNpb=BQw14 z6%7((jZ|yNeeYr<)t+c8u2B-HZ{%-^yBwEJedL|R+CVyeg_wA<-m#In7_M$>v|-{k zn}%nPvw(chd7$xPqowzHql0baC~x)E(j)yI_rK>k+81RurGXXRhZsLcPt6Qu`r%FY z8Of58ySYwEB{JBRU806-vGd=C+ zmODwWO~^IZFAI(H)IT{Vj=ppL90>IL=u!tkaKc$iw;kvzPe3W|DIRAw=~*h79BL0M zeC)$3lJ}w^ z&?IPep@!&wy&Y`NPC%xUny4iISjCLx@zvbFQYW@Pvz%gR+(Q@|7b*V|rv{U`i|GG+ zE!QLJ49`91E0Fjo>^?Y0?Pmi?e>aTvOlL6{9^dlqF&Ak#){3p6IAF|2%aTIOp zL~RT3ISmnnkafsP>;T)N;U;qu;qK_S*to6HFT*Lz`+DalP?!}sG41+N(X3$za&Y+E zjA1B#;A9MaI%zEETo7B4e)nvj*Ed$M!+H-!OiWr-_-*>=s!RI~Hy4){f&jl6WIwu= zVNaeqE;gub-P3vC1S`}djrL_giDB3%o=2%pF@ekmzvho8Vl4e5%14kN8Fp_9Z_oiHr*pPAGoTDGY(R72;!6Y?{hX&Mv1tBgDoHQ$dDgLk;@brsb@MkPMhUZZp}`R89!UxtV0zY!+Z(bcuRKP=ySUwBrx z-07#JHUbB-_FACB5UHs9epwkS<$<6_Nx`3x1QHxz>pJCWr9AQS)e6xRj2w}ih<99f zZQke@N!?e*c^MCk%T0~}Ur_P9;lXyVaVZa#@1Xv0hJv6KZ0woLe@T6!nC+u-S|R=xu6xdw@`j7q~m^N_)l1=Ti%PPx)~wgCXK0E2V*x(vqOUQw!o1`#>GeW6UJt zf0CTc36dET37k>!Tp3wfisw5bW)G!Z|C^UYN^Nh$q8LrZ!g7r{Y&~05HOe9Tcst{| zwhY7!)b~?L?5QCc>gE@+{)8{dt#XD_ z_z@3i`C=I%p=sKi)(E_pv0#d~^~d?{H`Sqm{+9-hQfzq|cek*zeUIRM&rT1I2A0YT z&c!O=3Qt8fD)zy5l0A{g_#Pa^tvc8!HA>t`Qb)!hs>~|gh)F^RDJmk63+4nCxMgH{ z_(uHEvvtY>T2R%#;wW@qm;rJt2w%4mY6}hj?+Frynq;nn4VVB?6RkOl{F=xQTQ|T*#{^&R70DQ;~R-yf-Mt>b6>l06rVqg z5;;A5pRVj?*$U2yJ#AJ2ruC&A)sp|z4y=0(oKpOlQPF$hFTqaD_+lpsK=0T1RO23a z2~-rgLJ~A!jXtNl$YwE{kb(3v^#h+TiJk5XM*0tcHo717Xxhr(kk{JVQ@L})_V|{^ zL*CnXN^00g0@{s`it5mIp4#}>;v$dg`}eOcpmi}|lT74R`;U3se6Jho$0cNlK#(Iy zviyO$c{S1mz0|d-N*Wq*WS^u|)u&}u_%7_bS2EcJhCj1}N z5WojQY1xEZDou$!H&wB6JsoHliRlobKB!4Hc)NbkfRzUr+(JFW@5Zl()2Uhf8{S-K z9w-MNMFGy_xiM8RPKyOJFd~yz*JSxE@J>U70*OT8b9^9)v2leL4lf)O{g2OBX6;|2{B{Mh3l+w{wY@UxP2m2X(hw|bnEu~adImHz$hILA2YDSzDp~> zzB>SS3xB7%x8dtsgcao5H;+14{USevAOpJAnhj3~sH zA=-oHoE){$KURb9Xvh`+Q?;OpmTh}$9uKr^r}aYhs>I$sJ(hrz2fO2&gS?_60Dcl$pTU;=ey=lqaHyL01Jh``Q{YIfXdlWtFI>-$>H1J z%E&m_>u_m`0OPRMM0^;zozdDp$#UCoGc8_m+)3*Nd3GpcpZ@<&N=NBiu_?5{EBR=S z@265sK>YDhXklH+{n||ly#Gu|GiAB=AJDY^qpL=h{Zo=@UKUh50E@Sb1%Ppb+h!Nk zX0fkN%;NSI7#{;E)S&IYnbLYG4KN~Ft9AysPDJ>u$p4KQ3uswh@!Ov6H->##lLB?) zl->{GDmHLS9l(#loR)1{)kK2F9D}wR=SHK59b;ExgDb(%A{*oed@wwW*Ajx}helKh zxne$f{OiNP5P3EIv;yhWOK?Os7uRcWQC1S&_v}`+ZC{nm01bw}`)$>x(;k(af_=fg zwpkaqs2H*f`AiM%c~qDUwgCZ@~H*w^Op~fGR%q#QLNc1o9;u0ntH4}&#w=T*pv#xX)+$9#b$er; zB|M5&(m-hJA*Hx=BZxv3&UY>ncAhnJKqm}I{e9O@_BIa7%ywz?{~Le(osAi>B9g(_ z-yc3%x#|Y(iR9j5DE#zJ3DNf{`0N!8r4shNVsxhqnt3)jS5$o2YS!NhdAWJCPlCa_ z4-}3-M46(gXM=?(Eq!=tPZDq0S@FPOT0;L928tyX_>9cWxk3s_3|*?MT1Z>`wz3jo zZ&w&Z|Nb}p-Qpha3>4!zc(rZCM+O4a=ES}B^h5|cX&HJYkU^n@4JL_#K?3lF-Zh0K zH%Q`@hkNVEsU?Wn>Bn=zFO%?5h>}OGqWQ0z%g`~t6DsN-+*Zssg{m?WVO0mWK>!QF zhUB*^mk_}w|K)yKftET5rCGMe)*$-UH(o#E!BE|o2N}ZmqdA&e8f(w46j%)!JJb*a zhAo4KQ}YS;I#Ls1ios^!`sg9>|65R1sqIGo=ijTJ<3_w4C0}C7`Q??|E7pmBg3b}e zmGN2)Wbk&{;Ju~`gmNjch0QQru_*2HcvL->JJ6SuH9{9!%pSZ$#^c^Bj2Bp2z6}gt`^8XZC82%K&2v+srp01P zX-$y*9!#>j*FJO#Ly|!#0<)k{FGfSGU|A2Vvb0@fKo#IW8}sd+K+Q8b>B~b#9)?~B z5>DU+M|cDjnuQ-Ir;qEJ3Zw@{)K5DkpP8rxTYbr|(0d5#A}2P3sG71+&F7qRzz5kh zww%VgDYgmcFQEeehWt*~H5Y)=GbR>A{VuH#eU$ZmW1tPiY&h_xsRsHkKAL%vjf}?K z_>;RkrNH`uF7Eu--_SE|w|A_iPUoFZ?8`x7tqVelj@F^*nGUXdi4WV(xuj67cQ-qR zX?acFs+Ru!rF#Q1o!ak&aMw1rX?zeyaWE` z>gbP4!q4cR(U%oqY8x>1SI6saws`hmb;`D84q2ombI*smDchaUJqpmYrO~UtZ({4& zz+Z@;v4}P(FHmFH2m?3&{#~e;I6;dKjDVWj`B$GY$%ZZGROYZ!dmKLM6K{{l9kN18 zL_dr@DS`F9MRasD14dw(pM}NJtGi)n{_#Hzb=m0dFtYMp9s5jU<~;wJ zUZjy0g5m^wAku5%LA8Ue-3P)^SAw%m_e+r!dz9c#I?>$aTlQx|5Gpn!Gb6Ts)lv=` zWlMOJ0S&mS5l0~=rYsFHD;;#Ngx{Gz7^aR~z6GxHJ(-46UWmu;?YrxL zynjR;6_?d0BS?s6K00x%z6zuSeiGPHYJm1k2Npky^#LQs0Tj|3nUsVlri;)H-1w8T zyKu(p-IwPb^MWKT@h%R@VYakJMNqI2erCYtK9ITO7rQor`H0zm8YASX4oH(}6dN@GnX zr>Ki0FLctb#@{#$oLj1gmA2RA55MB?oBE26tM(^4wbkHC8kbQ8K+Xy2<*gWEj$3q{ z0vKU+^z`(Lsmlv`K0TJm@tehFqDGWw=N~-1F<{TFm1c;+(TBfGjoLRYz`dUXO}aL{ zrg~e-&UIt|4Yyn`pqZtJBWW%5*S33o?(W$CE^h2Aix8Um=V6e3mW0MpFpK_wTmY_t zD{nkhfQ`+c=r`*-wN^0Sa%5()cZ&xIZ!9YPkxrY(VQB9%LXqH2-1Ci9{)MNk&0j{6 z8Z0dHO>6vQJ2Va7JHa^Lm$_Rv-Qf$eWLGAzU#HfH}vrIHo}wSrz2UbZK5~c5nu%JO+8u;vfCzx4mAj0cYfa0-FtW1*V;C^;KT~*dt~OY z>tnZG_xC}>Lk;9L5y{}q|Gi~k)k3V7x^c-KF!kXmu2v%+0R?7Td~462ta$<5Wt1GPF?-ayT2RbCcSBxNB}5) z#63HUgz@@k_bFC?L7vC+Z3zP}kNjFMH}35`i=UfbBii@nbsoAD$q&b21$71t+W{}i zD)eqgrfz3H?GjtQ+~p?YNVyL074`U4Lm2usn7P92aYiCqgk)p8Xpgrebyx{hHfmlU z8KNr8&aNQ9KS0Cv-bM|DNaIfZ_9Czrl$Y!nb?sHnIQ~~)``P_{Wwggx*V7R7V%zIC z^gl8U98A0>-Qxi*vH1UM^lL*Hw8bYO0CSPv$O|u+dq!~Ta!sp$R}&w9#e8r5?Ac*C z{eSUtESROj#C*K6sOT)Gq?if@=3v71qqTkrLD#?m5Cbs^@@^4N%^~>+C^7u-e*QkT>!&BgY&#(Nipfr$tF_d*YtA@XP1n!P` zb!3!_P+8Uj4w*eS3}zXj@7S>}9gl;;OFlfitD!;lW`rqm zY=kX>R*x+VSQSR2|Gs*Np!}&lE!MTPn>UbGRXxUN%o>r;$bV>la@WnaGdXx_>cscWzrL~W(+k>aG_jiE8X7UmLCSPAX^vF1v;;$SRP^+R z#i63y+<3a*s>&)nPPeZ%ay!mOKJl5DN*9)t(BQWW)wt-(f>`z%R88wwcYOry@8#mY z-JEGcW+54hhQXCBNXuz;O+TFW#GQY0c0XK>^zet=WL6LeStliz#Brw|9Xg2Z^N`F9EO!!o{^KbPE03GX_2dPiU+wh8FbdbewkUf?|Xvt_yp>Lb7i-n!xc*haa0Y(l|zwJNuisEhny1|rs=T!|d(rA85mW~^K_PBc-HiVs!}$(A z@Qb7;?BqcnvX$B|4n=0Kk}1KZI>`L=#`iXNQPSDl?x$n~Vmb)Q69#;9t-I>c zNrE7%-Q&uCUiKD*NF3$=b;89^AVMz(($z3@I^LcR`1D`%h`s0)Xtuz3?)ZOJOzOA9 zv3~;uwJ=2mbUmG++^n)~1YKc6KTtn(Y61obqd}4~k1Y^L_*S7^W8syVd3#U-lBviE z8&8BGYV}nuog^E${}#0A{hVK7an+Y*#~n-pz!0O&jZ0y4m>eyFo!gL zLodOlfzhiyZb1H85XRYknf$4&%uA;xBo#NHc9Er|h>O-Yh`Z+1ZGAy$ zeLiA66ex4E`Z0Gs>GF+dsn0h{;m7};Hr7Yt(>^lygR*fizZo3eygvW_X^ro#TXftH zTVJM>jYn>#J&IyY@3Vly6Hh6HOca;wEG_gk$=-gVVN8rNYZ9=(ff&?6BBMx7r$FxZ z3U`e#nF@5@Q)mkA&}#iAU0+Jv?O61vso^*d++fO^A<^4cmp==4S{Ca{{gmfLu5&pknS={r)^tr9er&&) z44ZA2KS@v{4_4Ro|9PQUZ3UYCSaMJf;9A^MEboA6Y%W}FyzM@XbY5Fi7)N(swJ8kz zt}d>6)A+e2*;y#Q=~4W55+~>yq=Cn- zpRt4K!)-=^-|3Vd|Nh3#TM`w!eI3xcw-$-qY=&ZQYi zo+%W{m!QTA=9te7qzELc9d2JHixpK5G z_@4R6`dgHBm56&>U{2M+M-my_@aI?c($dBEx0(cwpGdxF{~3N7Y-(gUz+cw%i=sa~ z`0TRQ4ncgv2xe3Ij|}ww_3mv*ubhr#V-MsKBT(nxj>lin(yPklLJ*UzaYti4PT-Vh z|Lnnx!KaYhZrVa6JSqN%f~9MKO%-?#G?gjARMf#|!}`c(_y|rmZ$9s}>*qs4b{#If zbgMWTS;J$d38oDKbDs#Etw?J^|2#H%B&6bGT7?u&b#Y&x%SabJ!#&nS1wh#1)9t)V z)3Q7ZR-)+wgIqMkR@?k3D>-YGV%VpwjgtoRd&_<`Fix}_6*ZQyHSju@&Dr&y;DxPy z<7_&6@q0qw1lw~3sNC<=)S8{^ig%#y#F0B|DOSmO&dV{ONp&8q807&ogt>#W0BH+lO*GeLiJ@*R4jrMXPBk>Kn1cG1& zE*dVfshI)n^?YAQo^UUp>5Fk0F63VxS-P+zz>~tT%soCJFBG)bZWf6Wc zx2cAC6SO(k8b`|$S~=C!&36S5n*3EQYZoyZ7_9O9 zN3r?41|C(>R9IW2hDfc~XY){6qaT+WOyDgu1_h}xI`xU(n6&MF#**jTt3}6n8JB3# z=Pmlwwle*}jrK68ojCB;a`$7>frx{>j3;>(CWq5cF`WMaeaS*03nLjuN4Q=ff2@@J z`;onzwnzGm$3et5VY=-J?$e;W=c%n#VT~qFI>_@rHU(iU!ALCF`7S+ja}M{|4#Q^i zS~zORuASDwyX{k(!b!|(PQa#ZE$oD&>N7B8oR!Ev77vUp?^#wbA3X9a2({|VaiCwk z?)S?+@1j$*#3?z9WzaqOYBpFms~b`)nKte=o|nz zwKChOKQve-?GOaa0y1)R!RqA7lm7f%-manbQVoTTC133rzvBy*uBt^P{WhO!ew>SB zk^l)JT&uK4w3S2aWLXI5s&nnZuP1_eTuNxe0sBFt^|V*pZmYQy za_e4adEt$i7fel6)#88MF=F=_z^1bSb@EuOusVz4NhP0+FNL*JG-#f3(9poc_LtNh zkM-a12*}}0v}lh`Zr&Thz)568`GOvWcq}0v!*vvZ)BC$(SskeaVtPes8e7HmWw7_6 z$2~=hOi-CC4S%=azx`OOZdifZA-Krkl^vO1+8iB>)L=~|D&e=uRQ=-$uovKoVW=m( z_ivaP$fA`JO*KqphFjMNB74;U*@DAGmQ9029I{v&R`j~hbiI-B^KbNZcm=4GbE-AC{}q51DDZZ~?3rCd?~-hU3}_b@D6Z^q25DOu~P}jOb(} zD#J=PbAOv3>kk2pmte52fXLGYjhWZ-_*6n* zf}&I2`JR~@5$>A?7y%X6a*xgp-uDZ+x6AienWN_ypINm{bwc)G()_FR9dr?rXVVUS!u_`+7MxF@QKykqOU3d&f}FrsYJw z_IdNVypDnXL>29w*qgk*Q&aY-uk}iUkn67ljEL>JwBz{)=z#_y<^|VVj-;`_p9n^) z0VhmFeTC==x6`S24C}nI_iWQneZ8jo#yi1Lho!?Qsg)`aD`!8;LNIRLkcBOS4LuB7 z{t6LA*K);h??AyTVR%&8P|kJto!x>0wNbZ%nUIceW-`v6KhX4Or7}Q&!GrEuAC?bx z-QG!|E?7@j$vZt`>!DoSli#!XIca{i*<#*uE;8LH0)H!{6`me=zFo(!RT^RNcQ2L@ z2Y&nBW)X7b`(IcLsF<0V$JCeNJFK6VweNyd?vtuuR7f#l@tpTdf%8T8=G@>1w-*Gg ztc=HU3GUcLi^z8zaKV{LQ5-`9*^KXgZz$}9X@&wUGU&iRJK!S9D;iI`pKC+hFnCFP zr({>)cQZVJz5#IZ)VZo;<IInm+oYLX+;ZbTAFRBL@Pr0JMy(B0-Hhpof zuW_G=px~+8#*yjkC+fAxykUg=^`P@6EW&`@fIV!-xSUv4)&T48;KXsUT`xl~WR3VJ zvH-8ULijl@^H@?u9i7&#Wq^{<;pa{AKk15VAa}1Q`Cu^O1lzfb`9ezY)AE8f+Vdal zmR6_5(eIwNb3uE7(s>q1yjtdq8kY$^*QDJv+`ILY#?d$Ro;iw6vT$U6ipKB!yKG7A z;Cp4(Nrkzlo|Y~J`E0jPr)YWuwYA=mF6J=mBkz4RBHi`d@qD>6J=$yiComM?Iq$^b zcaD_wP@XmzxrHGUi#2oeq9m`Lz{7dE0C*4^tMfwjG(83DSn$da*bEqg{=OP230$@Zp`nzP_J+!oJU3jL6Snf0oq!V-vFXlVvW#JCxLq? z^%L&IST1E~5eIQB+1);3Cxe~d2leAD!JKyS zPp1Wej;{cl=uQNFr+%bW@!#++e?S5(xf(ajzBprJU%fk?I3FWMhIlAU(s4@g&D0m% zhzCfWp62&%tp6Id314q7@k0v9nay6&RTKS?FyPsJ$(CpNussmn`&?nvP|9>_A%S&U z)%UYJMnK*8J5Jzz|C1-hxg@^vJdpeiQlE(2uDf$M_RHS><+SSdha3!mZZ}S>^qOlR zTb>}$tWsS&I1QP{6YK3tZ!wjAl!&C-VCR`*D*xxU==2y{tEmSr5;Thm`EhYvs@PDa zOcT1?@scb$&1q3F6SQ8_vXs$95c*Q8LqXYC?w0T$RVJA~3hzAGhC}8Vi4t~WC1YaZ zY1o*f>oqN=PYhp`pWz9(O34B=+=!iNxkUzNzB_&8oE1fcVS7%J5ZlA-XP2~d%mi+` ze1(31gkH-(HyLspsbW;+Mvr`x=31dsKQ+X$@?zv=Y5L^{Wa3@fhzPIK-&0%;UO7lQ z?gGXXy0~Vg^63L__WDV*_fJXQ>-W2ieZRS5`MOiJ&~c&gSMtZPME-EaZ~*%YmU<1s zNmHb~Bf;Q~QGO9-5UA*?PSg-uf#LR;65yBa{l9_9#}Atn7aW10EFk+~^1swXi^rVn z?G1#vR#)HsF?k1VNKuS39DVIHTj6eb57fV(qJ5ws9WCpp@63KSJB1kcQFa47NV}hN z&&s&EgDNKY&NL~PCycE z$T2`1DePHk`13TN0X38@P5^>#a-tHQSKV-aSQvjoTH@#{J6=B9q2C=rc%-PL9hv>V z4&UD;e9zXpMv#_d7#m*`M zj}WlOSC3vQnfof~xmRV>6ON`a|1=;i6Dew;{kFGuJ{RZ$#zZpdw1re7$+%BvBTrnIn+_TY9&06i z;0)|9|&FNg@G2xa-?A8zt#!{WQZfi#7?^`02fcEoK;d{HA<_$5PZBOmff9@Yd`Sy zs<4Jir+p&`=oX2$v^t`M)G9*8NANaD%OqHS(oyKcu`dg&jdM)z3Ifx{w=9yWTmNS3mo(<a5F0Kfsv(yHtWUP1m&N*Jf%)lhWx76dhGXk)pUvER?e!vegPC6zPf`1G&R&& zC#-kQv!~Q=Bf*;TWmUNQ$lP2YKMYW2?6dcq^MuLsH~|fj;9E|NJmw3y7-eyJpOv!f z2TFc-AJD&iIhFg*CLF4PnEJPB-X{-3K}UxQha|(lx%NyW9we#<9b=|Jv zF+knRmRc3srN&Ta@>r63!Oivy+LP<0bbTX|4>-gH*4Z#*Sj7-{_cD&)akiH?tsr-{ z3I-_e>u@BLP&0$xqKvH6?z_)uuJsOch^$E1qi5&pyX0H$cXr{xGB#ketKU)*y-?_y zgde}+&7t^|ydYJ)n>}xTSy7NW-MFKRAfP@-9@n(c7?yA}6)!wcogYT^*~7#l$KXNo zC=Co7t{ziFS-UrOql9q3-EuTF1yeRdfzx-hsIUb5PP$A9$76**Z~3*=Ig8jQLw~wD zW$ypfvb&Za*4~X{j{=y?4c8dY#sV=JfN+q5R-eip9Sag3QL2t!HZjI?GJBu|+-U=s zZj@8#$)WyoNA#-@xh^L_Ert|7flt?7Ac-7dV&UP4yNJ8yI&=~)iQxQI+IpzjA{|`x zvl4gVlnS`nD11e8EX$rerr?+O<|f7qk5CgBn(fW~ujK}r=j$y-^VKK97w5UL0jPA3>uNqUY*epvUFN*KSqB)#}U;EN0C6mT^hVN_{<@Hi0%@&Y&Un8(yK z)i}AiBJ`vk={mEwh;gY&QOWg@;o?-bmuoDy@P?D^zYwWhyXG^gf+2#Ee}JzS6);p` zFYpy()P;7Vjvl6cDB+<>Nd_hz^DQ~_FhKZ@DdKJ+Sfq%qhY>WiB^>WkanqnfU!3zR zdJN5x;?k3%n0S8%oR#qN09(6{$4!$d{Ub69`i8?9iLa<=*@eT1LXMK9eI(^KEYxO~ zCHhS5fEMrjWF6O4dKVAyBw>wDVmQ7ytNr8W*32A(O*M0&#ltJja{r{@*FYNIE%${V zse4hKCJd*?E2>0m+_Jy27sFv_nu5DF5m?` zV_1E1PeK#~4vD528jcMuc7UI%Tuu0;ufHyVsI1f2gsw!mJ8Ph4FYE36mJ}|3e{Kl_>jyc_ltruLw}pLeJ*xzr^*wIml?0qh`MDVDMu7K&tbLrfnb2yedX~ zst16)5_feh>i|u1z`(l;9}np|bUYRX`pGQm?oT?h+@EmYY-ynW>9JbX?IIo+&$VQ`5k?az2}x zMZ2P)ZZNrY{W@*4zFR7GQ7^-b`|9%zt6(pVV5GL-D8HAEThV`yMlV#>1iFo`+uT${ zVW%aJ3Be&sVpQ0Ph#_MTk;k$3p($hpdrTuA)rTB{xp_tPRifkQ*kKSI5E1(ze4YC| znTY}7M%1kXXG3icwSuE;QBi1BOCalcwAh_ybkPz>KqrepdYAgTDsUe> zVnzrQ0anK*J2V~-6CtXUUA8VBsOGaK%C-wgOg1cBbCiV7VHt4eMzwZlkqZf*`L2HGzPDDVM# zr*_wpQ&EW|74^#-5`xl}zz=}RDRq9ptI?9Xh(e~j`x#U6f5NZS+#i{~#=QqK6Z@Mn z+jXk04F`Wkz(5oHT>zYU-b~};cwOwobade2VHNL)kCnnVQdD~um=~{Ea#~epOc}0O z@{WHG47;%K^9Thuu*Qxp2GIU(9cAf4$5m9|26}op`vAH5pXl?vjp{9>Sn>2)wxls+ zVc}rpqo&;dMoxQp1X=9SfMcxv&3;)H8-ti%9ZH?Ts`_n1gDC=+ItBB~1AN?p)g7-$ zLqbF9RFj7lVA(G7l>DWynjn`dg5eO6qOxvgPMB)h&i(Fz5rJcCsa4%SO`w;e|9?+S zO-!_HJF03e{u^qUd;c#z0Jw{e1{JXrZ%d0zt}2|T{l@$3vYW=f1g|LN|<9|AMMQkAKxak}j^tQV>NRA{n)swEiccR*`R zu#R0Q&E1NkLQg`;6b5`B+`@Mu1W;YQ}S(TG%iv z$ij(rdnr!?_jupiHTpLFcjKMswyE3NMS_yZZh~n`(l?1ZFRKE3_`ywlX~~+~ONwG> zS0`WrQ=$!ux~-n(vYttAC1V}=&n9t>#u=WR&*-|N0Y$8rX++y;y9n4e=_0_+1|kC^ z8t>$mO5$PVA$jQI8NNd{l`3WRpU=3S*>P)~uRf;Z8b0>%Pn!!BDU|XTGUpi*gKrm5 z%sQuOpq626u?C{AdT`LC+3F?MyX4!7=5t=PO<-d+=geGI2fsjB0-70z9GtRXm3-E4 z&BcZ2Yme;)C6&3YtBxhy6CC?)@X^s-tVfqf!r$faw|U5W=&|_3iW}#!dM^5t(aAr* z^s3&!31OhLAL4fGGQ*{^i|;s@E6`Bq@>kol8nZn(oJtl~DT#$13FIR$`Z>9k{=D*^iaAl# zs_+Bqz(&l>L#AD)kB-zo&mjYU*z|D2j{ z*l|4`_lBxz%MthAFMcI}oM?2+xI^=tBMKw|b$71P6TK9zd`M?UY;gRvD?shKfxkT| z9kl$a5XnH6WMcjC+((hQmXr`O*%JQz?zt^C(`=jn5Lh6&(9;p&AuMe7 zcu=PY1+=Uq*k+CB{@mDp!n`-fI9HY&6Y#y!ucNc+ZwMEBNxi<$5%?5rjyJ)wPlr+i zrOVm=dwr+BYU~Uu%aqvjr$3VChc6kBe`Y_DM04Tf-$f`ERy?#AW1|%x#?Apjt&vCLb&CJm*fue(6Sge0YCQ9A%o+aUIU{-5akH@?f|m=q!6# z0~!p^)~1q}ymbVqeQi7*;?K6PaMe$;N_7%J>_ZFBG!S^;b?_0t|HLTuQX(#B+75jN zxR1fk3EzIfQ#NJp?vf=?+e~Dd&2Qy$C|+D%#|Uise=K`M+;PQ<;(?-Tq_!i&W*jCN zvKA)XuU@>knwxFAnzWhnW(#fWSVOi|ZUxNzY;b;Bv#9vX{{L&`%-^A2yg2@`3}vft zS(6*tBD)rht&$}fTh=kiC|%o-=8lXhbTe8+wlUehWy@Y<#4sp?mh-3Pzp1wVUweQCmw7`coey3zX)Yi8_N za~hjbr|W_^B9Ps-DxfeCP2n=xwtEm`IrX|zyD!?no_tA3?K5FEK^a=48-uYlZS`xV z*7XOCRpp#9pUe?A4w+9cz7V{{EJKgpDMEZh^$IROv8v6SKS=Til2X@dRS~_7L{&UH z>-ep%u6lN3m1aeS`zA=76b0n^Q~dk}O4#)pX2`;D{ihu`s>Hnl zCH7vE#(XbI;e;E@;SM8zK3+M&G^tK>^eIy8q6q)eHZv)aVfocm9kEcAv7U{g9Ud!O zp)PZ64mHrb%8l>3cU&h{G6j4h{`m$wE%92<3FKp^^E0j) z<&Vgx9Ka};10``)G=`Czmd?3kLz%GPu-ed9!)xSR!d7slUko1;RnG5)sijlSzL zKCM>vET8hVy%Rig@}lF(p)90)J;IehEr8n}?-^0Yc+k1LsLIzd^FsKnU6zr8boPQT z8ZS+YEY!@o%_~yv^y(vBMxWKLYHNCAifUR|!)|q3k3L}KIn)PccENr- z*kzKS5FDtaBt)8-2Ca6bCfxRFa}>|kk}*-BzPAA%>@-UpgkXJS8x23H6$Y7p>x98V zz!)rjE?U#Z2i{*U1z|bU6oTG-Ah`68`c*H;>v(kLdh^Hw6)b)ew#Xhl=A7=n!^##p-_Iz!IS@On+vJ24T`2qS$8V@(^#17J z8wmDTMaL34W31Mm%88om4jWQ_0uMoK=fxlC0#ZTb8Xq(Gx$aP$S2{bZjJN9aH{GcY z*2yh=n({r^`iGWVU)j(GUWzmnr*Ux%>4UK`8Acb`V-QH@80)hMVaZ9FwNx+|e}4rQnc#_y0Q_py)eU3D zxeFPCJjfqq&c#@p45pk@Oz0G9qERoH44a&$62?)7Aj#^%(q%Qin{I~N_A~_`!axm5 z%?}ORq{jEmsI+Mrq)u#2JfH213T)~_i2}_yuG-7c777Zama-15bBJ6tOG6K%gn;I+ zi^U0ptHUJ2h?p_{?#r8-6(ONov0j6wG;Lrl$4>YQeD$me_~Gz85mbuhQ?wuUsL4l2 zlZv!VRSsE_e@2SbFm017&R;>cd9CFZB`i$OefoKJywQQQFbKS z@i&2PK7}4aavIU=*mjtJQI2(9RKwjCL^xfw?c|_m9n%#OURY$n!@WyR6-7qzW+w=P z^$*qq=Cb#^v^}7Av8Mhn+Xku3ht?%F|B5tU z2!*w8Y?SVce@b~c>Mvz*mzB;C<^w(-{NMgBlT^+gRl6=yWkL`8|cd5i_C-SDf6dD-}D(txT( zcor9$_HsiQG;`!QZ0WBZUJ8AHo)H}4K~65-6gRB5eZ?XQxBZ={QiWSqe-gO#2Tece zf)H@s+qF|c3jTf!*B6>u1R|k<<`80(H&{E}_u<>^8DE-yw}cq5<8-0|YQD%%)d~8l z(!WL(n0pN|G`snlyJw493L(K$F|t5JB1tyntxhZCcEdGq%|8k3(~4N6Ey0=0H6NgE zH-Aw20X{VTj1O?_VFnR=f?u1Tt&>-QDV2RgNv3vMtF#0_C?7p{a8{#D7dOZ`+%`El z(B@@`m>w0yaQuZFulDkid0ZAEMYgw8XwcqN?xc@EEt6Fx?-Oa%cX@?wmJ~$X1>Flia zM+zQvsriiiEK$ZbB``5h^z(I-JiAhBYwJBBVJuNN{SmB%nkIQ>86~|j;h7!EMl7vT fMS=gP9Th(i__;w}=Y|N){hQbBD#WV#vVX!qr|&tN literal 0 HcmV?d00001 diff --git a/packages/ui/src/assets/images/robot.png b/packages/ui/src/assets/images/robot.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fe920a969df239010fca35d0f527ed642a4ccb GIT binary patch literal 16382 zcmdVBWn5HW)HZww0YSo`B@__^0cmM4=#qvZq@{b1926B5kY)%8>F%7N1OaJ@0R)CY zdWadi<30TE``i2NeSgn~XMXH6hdDdf-g~WUt$m#@+L}s~$=%_`&xS10=~Y!{0^>8Ue=cG zw)}3M_Nh2&CIDauR9-0Pz5Tw4_6^ZPp)a?G8ikR<)qPbTi`dO>Qe;k2SZQS`Mq1ra zy&36{V$mCSkaL{$W-O^FFX@+ZP9+6ztQ1~Vu&ct^eNJ)x8-p{ur_V*`BoF)3 z{+Q2+W2F(*QIE+babB)s<%L=s&+?1 zTqV{X!a2%bEao)Ej%l(~U&&HmDCOn+>wZc)M@|5&J}WBb8iO+78F;-)1cb+pHucsnn<_X!e)BLuNl-#+!KLDORz z(Y(8^E)du*lhOjf4bFphY*(i)ifFKE#D+2LfiKrNUr*oKJq|A~MB%yHNJ-$kZqkZy zGC*F1(IUO1@Tp-HCZWb~675_yquSap=HCi;9sGd45wiIl094zLjI!$Ht*keFIrk}$ zseEtM#?PLPiX26a*alAy0F#nnbBjEV4_W4z&kYR1KB4;#Dui~WF_%^dzpiS_L&Dd6 zU`v&2qAidj4xdQTlkX1%HlR@L+23dUXFt|Vl!-)Ls~jsB544l5Cl0y) z3;@1%*_s#mw^0fqp6M7*qKUh>U2~!mIF^_oesd&O?IoMY6^m{thH&%NCUnZv z3%5uotD%3aem~>Hez37$bH$Fln2ZEoDFVPVuVi?M#y~Wx$I|!Kd+Xbx1NCYP#$m)C zKCsEMKPX%y5LZsQ1!c1o9GSK4shTpiyO8U^UHg0=Z1=s*{$jZ89?bIa6){yLmr{AZ z?Q-iKD2M!51sM%@#m>~1Q@?R(-opDE=3n3IKXg0mkYu(Wq(;)Rs~QmjcXTqoB&36~ z)4aH}jgRO#E%w(eCBJ$Iik~1?XgObq=_Zuz<(qOneqY;34d7KfCK`ZC!q9T`Va|HuB`f@kDkR_%kIwfi&S) z)cmVE95qwR!yth&lWWDc#kY{Huz&B|?+Hv69`Y(;+1 zSo`ee;1A>TsFhbglWP^487-&oL{OD(?HwZ;9IZyG9Uuj~gsANofiL-ybDi%aNM77A z1c3am&NxvbbGXRZzOqv84x&gY|Da60P{^G1?Kw)KINV@q&j_O6IwUYCl6RPBw?rYx zK=V?XgzRa25vzOR-Hfxy95pA;6Kg!x{x@SrrHm2ZC}y-&fjS1OAD#QWLkCqTOd&`^ zqfZR9-Q$(&v^`IX37*M*4ma>^!H4}tf0WT0q4w|g?!b9;np((-3H?ZNIs$G-9317r4Hbs zz^hJLpzUVs+_85G#yN1V?qUQYM@O}xMTVZ_>u7R(9&PhT&wtYo=jl29LtN(GwwAQoxY zs0b`d!X3m7`v^)>VQTDaWMG9Y-ZkL}UF3>h9g8@w>bM<;PTk58ICQULkG^V;7+`mY z`zbQ9dZUCm(##u!xDF1^mg&h5B8B6+jiLH46`>7A<;29_0D$GvrPgtMgA9>SI#oQQJJKl$IIX=eCx5|A0FWh#KHM^UOOkLbwZD^= zH>j>KLHH{|`QT;1niGrhB{OAl9Y&x?;E8#UU&6`#`!Is0`Y` z^rwXKjJ&PPxgL|a&b?Y1f=dtQ1?~d?!Bu~&^H$T1-G1jK2yEd(epbCabR&-k)jW+z z_Ccmv-R6AbbgyGjUM;)UH4)_7N71h!TQA?e0SgiclV8~AXJGcJ+tOOfDU%J1yYIaY z4K@2*x=%>0FF*F5xSUKv%NmSA23H*wQ=fD`q4eAn=r znJ}+|AAb_tgtKgUE!Kd`iEwsxE5WC7tSzPOQsdo!a_w_U4zC)rdk-On@9z2|n_q4= zzRsX}+cbdMyoMZmWyxOk-$*@f0qN>)E2$xMaS5m{b>y1x<~tXICf(cm zpM?vVH#o*N0;hgq{j;>g8%i=^*2Ip!EpqPufziObS$=Q67Y(&-)6M-akIfnO!?_GsMe z8?fzpW&MECSG4Q9x_Yy;L+cAmi~RtIlRA6?-nV2%#_Q#qXL-VQmx|y86R63<0Pbia+Td5H}zRkAlHnXlLPtnxPYmoL-XJz-Co2{HvLdK%tV*|j}W=^z)iDo;X< z;Ut2Jgz~4-B98a{vZWx_h(d`n%3uO&TE%c7N^DTB@gSWxAv*wEiz!J9OfN|@UiDZ| zWJ=xh(c{VQh-)F~EVY6h6%Iihj0abfBl0D%N$I`6;wdc439L8lM<|6|1y5K1{jw7z3OhP4I;HHOc^)U%V@FAE0G~@k z-aV^qfnR2=beqTCnWBjs+o;)JureP%_Cg&bK8o%uMIx!tQ=9S#FNNXuh@ZvfMEDE~4x<(sg-~JqU zsOT75yP_%%{e-5V;Uoq!+eRoy4Npd{`LEdezgk(z?McpK>}z)={>(HE0QY{|FAMOf zeRGcMSFt?2^^oJV)_Ebq!Sayc#Z7PrtMFIPVXJ->$O=h5-7s%|owGg~DIClIWs}zf zRS(Tl)h<4YOYtyfSi$m8=e4*kQ&`|D|L;l{A<>|aqOTqcs70)?r126gYbAHxqgR7h zk`R)CHFFa-ZX{nuaIPbnlRG+aot(V8)y@kwYR8MzAIiDwiHNdzjAgL*8P65(;pkSC z2boS2oI4_z!EU!nfhr6J}48{Bmy+{|t-+HjfecMlu4tSJHT6|OR-d6s2AKxrCqV7xx)L8RVx7?jr<_r&~SPrajGsRM-9iL|FbiQ66)B6g!H zT6`OG7CLaY6s)4@m!aP0{je}JS%?d$z&Ri4OJTWrgDecVc+N5`d9%YJ`aMBjZo5%wD?t7Tdmu>0`aJ8vHtXLk4PA$`ru{jZ<4lE-*uDFTzMZmU2rZ(-EL+~ zpiWo%!@`X0cNZK^xJp4U!@3riI+5az;imw32mpBVJ=7P*y7Hzmy?KS5^{mYK%@^Q>{XH3YeL+J203l?c(E?}`h{5aq z&)`L#_$GM$zc{l^yDK2|LTKlhZ)(_4D!Dv1fc!n9WIv$;t-rl{8OBmHtc3Cm z{*m~^RdusBIc};`G8<5U{lPlt`9lso+_9-qaKkR^6QHeJOK-^KvRoY7^0-h8%#x`* zrgq}f)pz-9zg{E^t*%D{kUw}OwJl;j;CAP1!5H`>YE&8{i0Kv4O#R`T{y5}0G0=Sr zoxkBA9S~}xbpuHcaNpEANg+%-UT=I-s$4|`qM%j?LPvQNGQAdr;7 z60dh>&~w26vUa1?3AHa%Uoyz9oYHM^*Vc^e4J%;4#+l#;7f=X<= zA{EQiaE<0a2dop%8DKe?2FTNk3y&s!=Rr?0LOF830Tsp2)`t72^yA_L&Fe^7;4{gt zdtS-8?tiYTrYa-BYkECHt%8A+BbnH5S0nwLw9>nimS0mdQ+IDeQI(e9wf+8glZ5^y z);N)e8wLP-R{GGdg>Huq4L(b8ov&}nU+05f^0HU;uO2p_-CJ7-ej4WOa33ssli+oj z*)pe-uCR@dC)hQ>+q4RCY=;#Zw3qta4ftvo*|n8(n$bYnfDny{170<;u|=U>HZo*_ z&NE<=pm3@uqjCfVs%_xtbH{v7jG9;SHPFe=(W@YHmr6KHdfMKX+8E2zfm`ZubVL>o zx%w0-bH=N3>Y-(RG<1&WFcuw>*^BY zGpjQY7_j&OlRHOTobNF^z9GA;4CHA3j!Tr)E4It+z~xTf1nQnw+3m1(%q*1$_JT9tJoRJBzExqTZX25p0GWRRF^;q0Y9j03?0qI=yij9fbmqc}u-_u;txuasREY>) zGv7kRX$f`7GIULbk{qIP3c0XHaoq(?(k*CM6sY0U|2k{>qR+pVA^&BVG}&l8)i6p+ za!9#Qei{lVA#5`+OHm#dX@2Z5^z0j=JH-5?JvV7D5ezh6c!mBQqJd1=Y$2;}fYmHx;`MvwJiPGxY zFqJJ`r#4+W4xM#Zj|4q@hUrd7av9OLA8# zoZhibr=2#0?{n@!>#%Y*x!`!RJzFVnd9$*Q41!cAiWdy%yfQNr5Ar{|Syb+ZdJi|e zWA$5z5eWgC{`TyKfg>4^`sylZG?cQwctrk1P|@PzB!BN%O|H;Lx}lIA0Jsgd->P$^ zKT-AZ(f2?5VrWykd+%_YNAZ#`Bi&-|C0S<_P{C;XWw}i*24_CWRrGLm`zx& z0RY+?R17jk90$03QnnPlzgdW&K|*8y8LZ)M&K-}$qiBu83wo8QixnI+ntpdL&PiZo z(i&}Z14Js^w3mT%FM|$tTfJBaJ*%MQ>Z1|1{G^XWO$m;o-*yHYsw}@Y+>aDIIXHZ{ znxplU`8_yR)vojosBXDA%KzwQKIAB1M_mY>3@h(bP^Bc8J6{`IXRV+0R7(THU!= zp4e%b?H%iyCXj~2?w7iK|B?M|W_pQ+w#U@|=Yh|oYs4Xk!gg83Beg#IC&MWE-{IR@ zQ~(=YxE}%sr!Oii>;1=V7uzw<8CE^~uqWj@5hu%L(FMHq;?e%9@n(@U5Z}}iM5dN9^QMSo5pZ|E`jS7|jmG_5(f^Y`RX1CKd4 zk@%|do&moh;ghNQp}*Lma{_kN2tmY-Qig|bzqfaZz)NC4Wlf@1RngisUUvCtm`T#v zmp+#uQ*Fu@BjdfJl5LhCrzew-FnyyfLlnF_m;ZF01JMtPtE#$MT zWjzL7v>#Pdd+AIV-2`3$(IPD~%BQ4eq6s_`4Y#St5a9DJhkVu?y`q_y*qD*dL1-W! zZ45QABoq65X|7W)jI}a~hxe8O{94HGg0;kv$!x_2ZnMM!N4EJa_eWm>fzKU_Zw|wk6}c9+t(#bXH$CU$1p5$6LSpW&%?7<73IQ0bMZAsJNE2M< zx-YJzfFLzOa#&QR8lk)mCDSDDQIV{fwy}rIgr)c$pp~-^-*0#0fIWnB7TjJ-9 zTs=$+Ro7lj&T~5LjkVIPCEH`hvR)R~Iv<;3}Nzq^Z(BJ}ZHJ>Utg z=t>3-f`VKN4hs(EWb) z>NT%{>!0H|SZQI#xyDcGi`c!XcKsBgeSeJ<&oqOU+8=WZN-Vok+|?t>907(!b|W$% zqzm<}8`QiO@?!JXP~W0?%rF-e`uerKM#gbN7t7^y8OhV73dnFr6#pN=?sIKnx3t?( z-k6_fMEHu4LZM}p&Hk?;Tt5a=3H070MpDAEY2Kjnz zB->qAWRlgxTDD6W5vyLU`d(_18&JgKWwyzZ_=rZqSHjy=D09#!o-Fm2=$EVTQCu#`8IVp` z6D-6WT%>K113hbn&v();;uM*hcQ*;7>^plYCC_yY*HMNTa%6(bm8AE2gv&=_bDcU| zbNgOjyxXkH7+5cSfy!yFTM4gc1Y%LTVZRsCV?~_d5F+TGuL;cm6{uQTZ+EptHrG04 z4@$1&`#Yh!Dj<*iz)p0KBqy<|jjJ=(lnTr^0;}Vj@6C5S57n#=Dela4Me<3)M#^hk z&2%SAH!5nKQoRQoAAa+C-8cm|8m=6e?+aX!_^u-5a3Z**0APgS^vs23C0d6hH*N^8oFSk#F+sd(c5yi zxoR^$*PQ>JUw+R|bq#*JAx5|xCMR1&%Ig1ULrj%qmzucycVKRl-3T`Iv^t6;1hI>N zB(JCWUUODdb27mk&z4%&-{f{GZ8_d#l;&t*0UL4esy;z4ACMg>1IowSyq#Hc9~QX` z&zm362f6ft!$%yfAZuKFA3V7XAyN#wEf(-M40cLHkl6$sQRY28elL2hX~>Df(BY(? ztKGFDSq^iSH2c=eXVT>k-!hwf_iu9@bKhB6{G|;3dFxSGj*$YAQ0y4xbNDC&bbUIK zP5H|$%zR=0o1F)DJbT%4DLzX9e8H_y$Dxcr;;%<1@>%4c;xg!=%!6p3LsLF81Ig5> zJLJ36ciu~g4+r(8<1f~lfjLHe@%*UVGtUJ!R_sW|#caaR>B*=@)CaWUu;sMUh>vHz6l3V!@R9Y3Wl^o(Q_ z)+S|ns(pS~pl@cD`=GF;MZ>LGznp%#bZmD>z)*4&TN4HP2Lr)pv_TsWW=lB*FUf|Y zV1af83%=gVV`K5d2vH4_qZ1}R(*~2jCA;oMhURf6ZJ4|vIakw9&D~Ap=ytt9?dHAANLo%f;n%y|SBbt#Kt$;{0NFR$>K1 z3%7Y7HHeb`^1^gsNWv(98o%yH7XQSl6m)FX2iFX9diQe$zKy;ky)ju$^Hgc?^kWF{@v_D%K;ZZ|v)#ZL<=4nO2!@o>JZPiFOr z`K(-fb=Ssb){%L@!EnpzzSk=zv(Lp^3fW4VKb})D*7W&M$vJ;Mz+eUrw{OW32wk=r zY_!5)l+5GPDlSeN?n7}bxU8dXt_b&6bY}grovu{xSH83i{vt$k2 z|FDR>WEPoNZp8L>KnGmMkcn1UsiPAwQMps@k8~Tkov&?XwG-w+@A<#*7d7U}Y^7u? z9Z1_^1J3T@#BDh8G#{u$1&W77Xh-TKl%CHouw zZmagA+j@XplNyBu=0bm_yyc*-5@KJU^&=!$Tt>oQx2tr)87vt|NZveJlHS6Zpb``ex-G(1n$cMn^9h|jwfGc zBO@gMen{;`Jm1Ua#cT7!eI*B*=ncUz1aAU&RIx9f2Zd^`rho! zc*C&~TCAqgm8t}w2t$F8Kl^Jav+fAAQq&+7Zn(6x2fDa7UPRJd+dFWMc9C$M30@oK zID+@Z^IWy)1ZdyMQ3*ukD=#%iJOZxXHQh*0(BtyUPF?fX#Xgz#`>} zshH-L?3dGiOAOqJRBPF)tbn-V)-5FTyPo=08}?XVylcM?WWM?C-^;)fJh@dd?Y{iy z`N2pJS0oiOGOH6*@-G4T;U`_Iy=*W=TU)UBbyI29(FD1R8yOdM?~h5z!-0^js>7{d z#A^FOhbxDBM(fdoP2sF7OC__+#(kF%_&Vs@a{MS#!u`#p3-NNuaOi$yIZWt(?C>2D z0^ntS$>TiC<+2rOOz#uAm%q5IYzz-Om8c6s6M$W30K1+We7?5Vje#kAd4Xkp+Sj*m za_+`I&Uzm30j=6&c|mXpj^0FxRnW8*`Om7;D)-Q3%};USa_t$5Ff;>%HQ+LwGr*qP z+|!YT?hu?{QMc9B9?(Q}@9jEqt=H&MgHS5A`-}(|Kd41}e_c33Ruy*AL7&zvE~^Y` z@~cY0Xh@7@{fI4S-kFJk_z!VfcXL~35A^r3x-3v$NX@isEy8PD+`E^H>IO1_A6${| zl>qskr$?EVDd&HveP$|8Kcah;?gov``fs)1v28@3z`nyl3I7BqAZHAv@6a`1F-|L& zl8Hm}w!12!Pzi{&-rYSoq&3gH84-rogo8c&c@M~3e49Qz_NaTUup5@MZO_I(#Cvv7 zly2{hlTiBax1QVGm7Pumf|v47K(QD%`}<6k!vys&Q@lPtOcyuUZa9@$lo?tDhdpw; zT3|vTSnQ=tfPnn=$O?K*u%9qA$3vOiaw4=&cX%=IBI=XNtMMLu2~e9etVo@(IzyW6oYX zDc=GEA>*=8YNo90Z+CxKf16dxR;2VC6(PK;;1gJZ!``X_lZ=1#1tvGYpjx<`mUqHw zd%nK*ZI6klXl-F(p_$93v5HQ8Zw|s&t1vH5=c+RmmPm)W5OcGg+L~7&sGn8@G$Vf+LXC0md zJ)va1`^kFJba25k#cM$3o)PboXIigam8!jPZ;o*6jJb+09dOadlcverjJ@?qP;uMH z)Vx1##qT}^0JK+lbbQk8u8$4Gz%vdL`c}w;*P8%>xzLi@wSFJf#%EDCfHqjI6r$do zr$K`H|L9zFcDRB;NYL0c@2sgdx2(!Jy5Xbokj>f^*C{uQ%viRP{^aJrATd|xVcznV zT=CgJNV>h=t5;<=J5HT2L5JGL#*a4+Lb5<{%i3V8d`=cJScglb(hZy-%N#J)a6id| zq##j`c|pm44KX{?x1Yhcf{K;w1pY)YYOPjsnd{5qVT(=({fD9#8y)+9!!`fRDKtM{ zy~S>5V++VpZ|4s4Yz;~o%-7x^j#$;>4N%}t>ZW!a8K{3 zRLciq)>=+2{tN|sMA0=@`WIVFPbCg#=I&LagYxRt~xQMd%UB&Z3S~M|d2RF`7PELKcUvjOTU032w;PD-^ zt+B0^KnD$(p6^T?I)bB?+Vho?+Qnb{gfYJ~?p*jF8vpGeBF@V(z*LAYmQn<$sl5eg zn}9x2vQ*#>tX02QY>gC-E?akPu+YuFn}2l5O5 zozeh&fPyG0;Yt+~tx>s`H`j82u`WK3o;u~V+cs!Xw|Wv|D)+VFzXI#y(-}8%#;;tg zll;p+wQ{YHD^0(m#ZasjcqY#;g=fdq`>$D)J1v)b?X`sp6jcke8EsxkX1g0-9+f5{ zS&GnO~~ydBeR}qH}TbPQW?YjkmWZ^AnPJ>x1;YO>vj~I%9H2AYWY&N z(9$?+RPnqJG^Rx2;qRhxlL3nggD{pUx!+atbF2aL`d7~Os33?*GkJqO^MgJ2F`~bpj}iV?`w9`+axa{;puD^=V^`@A_BNG-YPGOZ37?%E#q{GU zrKI#~pLph$%4E}<8|86j_-lBjn-pB5F!+FuHTM(!-bh-fq@-j{E!$vp+?49>93dx= z?oi_Q(0DXHF`nE%QN&3j&(Gj>Db!+f>X(n$p*dT-F>J!5_Ua0FzTn{HRc zagiOwF6m4%juncLOnRP%WV0r}m<>f4OOuwSr^~EI73vT3 z!&ps9K7FbwzBeUA`PY77#K+iSq?MBeZxxR!hIp@F=pAPo6hJgwr}ff9Fz-mLw09-w zD(tY_+_2Y-Ss%_;%~qruD~JiL!L$Ut`5i6GBvMfy+v83@WhazoQWuz($OkEgTNoD} zQzSZFyiWj6Qm)sQZ~mnE#;sUvSiid64KL2+Tz93(&d)Js+4jAdp0T%01EcMZu7hhh zBt2-+m^Njy@=x%?W*!EZEHXWP&V-()Z@a`^GmF=~Ij}CjN==6W>Gn0JI3FgVhI$g} zwd|jv{>An~Jo_7e%|N?vIK--7RJ>j{nmW7a>4%!AckJk*E49FsP%@{~1_xDx0fTbe zzKJ*BUI&l#6vjKra|sJJx=tS42{Rp>DALz3X>boUD0B9dO|M00P3`dm<<$%0AR$uJ z^UO7bmY2EK$~Jr6Lko@M(la*BtMYWEWS2h0i_Z~pp>*a?4T=q1#)|ZrMZwhzIYS^2 zJo+w@e|^f!;steH^8DD@@qMoV&i^L1BoI@S+h`U$Hj={kMQa;rwHQp);Yx5X;3y_{ z`r>|=q?D(l)4HCQu0dlv`u_UkzE0O6$Ik|J*&4rGRVMp^(`_Cf|{#O zncJWe^IQKonSnaPprF1}&1GDAseou0Tb?b2OqqG!eE}()p3#(5* z)_BWD@bBs2ca8+*3QPU52XRX$dlE_?&?MUKEyMWPbNnHpe4XV~P^>vwE(iMq8Gk*8 zc|WBvGzqzL@1jRh=_VbNSzf^y+v(h~M>>1HPiipF=v2-hs3zZVaX4-7uo^9I5%%uB znDZNppmmrgHIg!O&T2;heu3P@kP^xx9J*Ly)49EM<&$&@JHX_PJiKR`_vpN1;QS|D-2$?5^sS_! z&K_$l@!rq4?j?9yF&bJ-iR5(7PnRj)+b>VgTggDC(1aB@MK@`wRf{3fSh~Xn4RLjg zM_6YSD)9#-Um>I#$HBw|Yt9sdq@O}VJwJf7b)r%MH+ z_P#~XoiF24t*TQ&`O`#*q_@&}plvi^lX9p@NtxRF(?Q`q)I7AlEm3}p1p4an@|BD7 zpOcWB&z1#FO}p!LZiC{8l}N1#%vt}z#YYx@{)gx%n-==|8H^}wf(CrJ+qX$B)9K28 z1JCRxz{GW9Bj+$o z0=;WWiba2indI*@$=w*6s9*geQI7p0L9zcUuH11TrK@6^mnZ0Sd^IWi5G81>w3<|T zT2S^)>!c0(rlKoQeEP|z@5vv2*t9j5Z&ySAkl5-;Z|_ilFTArnrvG@Vm*b=S7z(A2 z?H8s(CEMTSQ8B6X3|*E!PDu}R{J{!4)32?`dycE903#19o?F^1L1VH^0b^vFt(O3! zb-ODCH*HIf!}j-csMGqMj}*iPUe`6{-Dv5V<-fDkwcGm0DG%qU!A^c<2fwUDqJHgm z@uUu56ATSkJK+YaxyOAXunSKE)$ zss~8@h6}=WWp+cqMT)n!6n7FHU+)*wfZWG=fhWL*s+B#dWn>$SFI+N<)gH`W9oT^0 z^=d%t#Mn&P@h;{%F@?GLk6g705X9B?+IiiBB3wW>Hk5RK_|K0Z5zotaOroCAiczdN zYdBiVdXo4m@dv^k3{o=aCoZnzIawyj8hilPc`$OKXSX4qdLyeQ2iEtdZe==bD%DOJZ$)E2F*lX!md@)?mcyG9 z-girX^SPB^WW_kMs|-rD&cGl+$h<*dxegjwus}53vm0@+ig_NehyUTxy|Ei3H?*{K z#aQ?h$!CJBQ(+btb6V&!@LAq*bQ$2z7~)OCX@h}mFrG7l^{pe-%I&=h(lkkz=@pq) z8mXfZoceT8&0bZY#SJ>qE4GgUqc=Xf(u2XTSMNvsUAB|ZG;V#~Rio-C(o!nk)eB06>(0)%TvVAoJsY zZY6hvC;31w$6YXQ?{djwdXTvXQ2_IlBveV1f#<_@5x}39wLb3G0ieQ`IE255Z{3R- zynhMa_tqPf8oLq!fLIjBk`lG`G`$7@&U9c^eM`A{-m)8F0PylN@TXJMc4zIk2O|J% zDS*WWO&o%pG!p{|fRMv`zzcc%Sw|O&b+F;fm%!)G>iMWo2G0Osj)gdc%wc`2wyZX8 z8hl77Kb9j^Vj#Y3#6SjsRQk`EnwYiCWldE5lFdtyCCdF3e8HvNvUKeGHfkJOEXio7 z-ySDu>3a>}zC$SgYiU;}2%;IeshDtGD`6@9mdA4jFqH5OU^iBYkwYJk7jecJsy!62 z&UrDTYuwL`WAsZ;P`VG$#FnIrs>QTkssPa=u{`e|C-p#yjmzdr5`@xPgwia134xKR zPc`9HoBUrBZ_yE`mMYLYyA6?;-2(0xH}l;Nd{vw{7oJE*7&3O(`=`j&I2IP4CxFA2 z1&l}yf$?&e8;A$Mi*bY~<-3U*A>xn#>icbl1$h&`t93EnaU9$-Htw*btG!uP4Krm$PbI1j1il=$e2;2qstO z*czeLDyNAtr`g?@%L~Ggw1YFR@S5PXxb7muHys)=76mVXx81k-zskDfz4&_xmBPY%TP`F(W}j1m+wekE(`wO~bs0JQ7GcN(>xeiY zTGMy+0CFTt6vE;&-LI6;)8JQ`vhAt)?Kt-n!2SsRBq%qBliv~Jak}8>;s(!J|4qPHIM*fHZHx9XuU;P7@ zxi2GnxoEFsI^$1jIN5igf-jt|Yz$*3gLMT2V8zIJkcv{FlIJlM7i+eb1(k(Qh#Jn6 z1@hywqyg{icvjx?CcNY4PV7mt7V*>Ok2-C!^ER;+@|t{WH9gg{;;;KZVQEiskNL*hg2_|wy9!>=GY zC(b3M?nRZR*tOUPnEI1{z859AYO_#~;t~IyGu&`J4Ab~`{{S1+>J`zABm>y2g3Okx zg1vN+Eju6AYnL}8`NIf8Vk=x-LR*4++)yJkI4FBDFPci*AIu!rtt`DgX7`lxsQA^jEoP*~b{Ma83Yrxvkw=2Uw$ zaM{304n}vYa^2Rw;$US7yyFsVeZA)Y0;6x;p+LT~8cQ~=D0nQfrW@KP z&Xfr|G`y7YZ@dc@?HaxG*SBcht1l||y?iFi+Z^xmecNY+D1n`@jqaBYhap4qu4z=< z0CepiOtyUR+jlAkVfFOxmyCd!E;t+bvR251`LUsGb=pV9v3lK|zt_SkgpC~T0nQ4t z)pG+zo@3k`k?t~ywIgTr@YTQh^p3w;h)~(~z7x+0re{Tz@P)lJl z5nUJ1S{105&Kpnk{@E=)9>{?f*_?V$ZTgH1m=bW@dtQoB0BvESY6o$f8p0Iy_3rc?d?99f z=2Et>p%ZFlkQi+auru|W3@yw3?14>yeEaB<^ruE$(%cS16#)bx{I1FS&2iNO;;sL& zgdqUIZ;=5bI^Nx`ozLvR)BR^9)w}MR7eD8G+6b`DutL!ciPt8^BY6Jg=N&jwPwxMDWDak2B(~@H+w}NH zw7Ov@Z3tn(s)UcP92}`S^6P2{R(3f7rJisbCO5O2PysU*g3ORxwQ;gIV>8>_81RK+ zp!1jVZV)DzcUpSkXGOplazc5sSX7*5^d1Kz3msGdpn1sKyl5O?d*#RC&u)Eu29Ui1 zaj{C*5hkWz(25^;5tgvmP;V<`Z0Ng=t49Q`(-VlW4RBNa0MV11Y% zIH+iWl`OKgV#R*8RRj=*xES$culMwenY%&}7m50o;vWV$fcV&S-C`a|sW8aUhHWX! zJ?n$m+Gb8&&O${Y^n+;)9oxxL!c|Wb&e4Z|4OAjyU19{+ZEAlrG`j{?7c@UU_#`&- li+2RH^ZzG5tIsav#>r|_2``DkcM1VO<)!9}vS+W~|3A=E4&wj- literal 0 HcmV?d00001 diff --git a/packages/ui/src/store/actions.js b/packages/ui/src/store/actions.js index 64be4918..0c68f8f2 100644 --- a/packages/ui/src/store/actions.js +++ b/packages/ui/src/store/actions.js @@ -13,6 +13,8 @@ export const REMOVE_DIRTY = '@canvas/REMOVE_DIRTY' export const SET_CHATFLOW = '@canvas/SET_CHATFLOW' export const SHOW_CANVAS_DIALOG = '@canvas/SHOW_CANVAS_DIALOG' export const HIDE_CANVAS_DIALOG = '@canvas/HIDE_CANVAS_DIALOG' +export const SET_COMPONENT_NODES = '@canvas/SET_COMPONENT_NODES' +export const SET_COMPONENT_CREDENTIALS = '@canvas/SET_COMPONENT_CREDENTIALS' // action - notifier reducer export const ENQUEUE_SNACKBAR = 'ENQUEUE_SNACKBAR' diff --git a/packages/ui/src/store/context/ReactFlowContext.js b/packages/ui/src/store/context/ReactFlowContext.js index 4c35d702..055cb8bc 100644 --- a/packages/ui/src/store/context/ReactFlowContext.js +++ b/packages/ui/src/store/context/ReactFlowContext.js @@ -1,7 +1,9 @@ import { createContext, useState } from 'react' +import { useDispatch } from 'react-redux' import PropTypes from 'prop-types' import { getUniqueNodeId } from 'utils/genericHelper' import { cloneDeep } from 'lodash' +import { SET_DIRTY } from 'store/actions' const initialValue = { reactFlowInstance: null, @@ -14,17 +16,20 @@ const initialValue = { export const flowContext = createContext(initialValue) export const ReactFlowContext = ({ children }) => { + const dispatch = useDispatch() const [reactFlowInstance, setReactFlowInstance] = useState(null) const deleteNode = (nodeid) => { deleteConnectedInput(nodeid, 'node') reactFlowInstance.setNodes(reactFlowInstance.getNodes().filter((n) => n.id !== nodeid)) reactFlowInstance.setEdges(reactFlowInstance.getEdges().filter((ns) => ns.source !== nodeid && ns.target !== nodeid)) + dispatch({ type: SET_DIRTY }) } const deleteEdge = (edgeid) => { deleteConnectedInput(edgeid, 'edge') reactFlowInstance.setEdges(reactFlowInstance.getEdges().filter((edge) => edge.id !== edgeid)) + dispatch({ type: SET_DIRTY }) } const deleteConnectedInput = (id, type) => { @@ -103,6 +108,7 @@ export const ReactFlowContext = ({ children }) => { } reactFlowInstance.setNodes([...nodes, duplicatedNode]) + dispatch({ type: SET_DIRTY }) } } diff --git a/packages/ui/src/store/reducers/canvasReducer.js b/packages/ui/src/store/reducers/canvasReducer.js index 8dfae527..1c5e486f 100644 --- a/packages/ui/src/store/reducers/canvasReducer.js +++ b/packages/ui/src/store/reducers/canvasReducer.js @@ -4,7 +4,9 @@ import * as actionTypes from '../actions' export const initialState = { isDirty: false, chatflow: null, - canvasDialogShow: false + canvasDialogShow: false, + componentNodes: [], + componentCredentials: [] } // ==============================|| CANVAS REDUCER ||============================== // @@ -36,6 +38,16 @@ const canvasReducer = (state = initialState, action) => { ...state, canvasDialogShow: false } + case actionTypes.SET_COMPONENT_NODES: + return { + ...state, + componentNodes: action.componentNodes + } + case actionTypes.SET_COMPONENT_CREDENTIALS: + return { + ...state, + componentCredentials: action.componentCredentials + } default: return state } diff --git a/packages/ui/src/themes/palette.js b/packages/ui/src/themes/palette.js index 9e7b7620..19a7df11 100644 --- a/packages/ui/src/themes/palette.js +++ b/packages/ui/src/themes/palette.js @@ -90,6 +90,10 @@ export default function themePalette(theme) { }, codeEditor: { main: theme.customization.isDarkMode ? theme.colors?.darkPrimary800 : theme.colors?.primaryLight + }, + nodeToolTip: { + background: theme.customization.isDarkMode ? theme.colors?.darkPrimary800 : theme.colors?.paper, + color: theme.customization.isDarkMode ? theme.colors?.paper : 'rgba(0, 0, 0, 0.87)' } } } diff --git a/packages/ui/src/ui-component/dialog/AdditionalParamsDialog.js b/packages/ui/src/ui-component/dialog/AdditionalParamsDialog.js index 364706f4..7cf9b3b7 100644 --- a/packages/ui/src/ui-component/dialog/AdditionalParamsDialog.js +++ b/packages/ui/src/ui-component/dialog/AdditionalParamsDialog.js @@ -27,6 +27,7 @@ const AdditionalParamsDialog = ({ show, dialogProps, onCancel }) => { useEffect(() => { if (show) dispatch({ type: SHOW_CANVAS_DIALOG }) else dispatch({ type: HIDE_CANVAS_DIALOG }) + return () => dispatch({ type: HIDE_CANVAS_DIALOG }) }, [show, dispatch]) const component = show ? ( diff --git a/packages/ui/src/ui-component/dialog/ExpandTextDialog.js b/packages/ui/src/ui-component/dialog/ExpandTextDialog.js index 50f506fd..2a4ec4f5 100644 --- a/packages/ui/src/ui-component/dialog/ExpandTextDialog.js +++ b/packages/ui/src/ui-component/dialog/ExpandTextDialog.js @@ -36,6 +36,7 @@ const ExpandTextDialog = ({ show, dialogProps, onCancel, onConfirm }) => { useEffect(() => { if (show) dispatch({ type: SHOW_CANVAS_DIALOG }) else dispatch({ type: HIDE_CANVAS_DIALOG }) + return () => dispatch({ type: HIDE_CANVAS_DIALOG }) }, [show, dispatch]) const component = show ? ( diff --git a/packages/ui/src/ui-component/dialog/FormatPromptValuesDialog.js b/packages/ui/src/ui-component/dialog/FormatPromptValuesDialog.js index 95f833c9..233f0762 100644 --- a/packages/ui/src/ui-component/dialog/FormatPromptValuesDialog.js +++ b/packages/ui/src/ui-component/dialog/FormatPromptValuesDialog.js @@ -15,6 +15,7 @@ const FormatPromptValuesDialog = ({ show, dialogProps, onChange, onCancel }) => useEffect(() => { if (show) dispatch({ type: SHOW_CANVAS_DIALOG }) else dispatch({ type: HIDE_CANVAS_DIALOG }) + return () => dispatch({ type: HIDE_CANVAS_DIALOG }) }, [show, dispatch]) const component = show ? ( diff --git a/packages/ui/src/ui-component/dialog/NodeInfoDialog.js b/packages/ui/src/ui-component/dialog/NodeInfoDialog.js new file mode 100644 index 00000000..054353fc --- /dev/null +++ b/packages/ui/src/ui-component/dialog/NodeInfoDialog.js @@ -0,0 +1,141 @@ +import { createPortal } from 'react-dom' +import { useDispatch } from 'react-redux' +import { useEffect } from 'react' +import PropTypes from 'prop-types' + +// Material +import { Dialog, DialogContent, DialogTitle } from '@mui/material' +import { TableViewOnly } from 'ui-component/table/Table' + +// Store +import { HIDE_CANVAS_DIALOG, SHOW_CANVAS_DIALOG } from 'store/actions' +import { baseURL } from 'store/constant' + +// API +import configApi from 'api/config' +import useApi from 'hooks/useApi' + +const NodeInfoDialog = ({ show, dialogProps, onCancel }) => { + const portalElement = document.getElementById('portal') + const dispatch = useDispatch() + + const getNodeConfigApi = useApi(configApi.getNodeConfig) + + useEffect(() => { + if (dialogProps.data) { + getNodeConfigApi.request(dialogProps.data) + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [dialogProps]) + + useEffect(() => { + if (show) dispatch({ type: SHOW_CANVAS_DIALOG }) + else dispatch({ type: HIDE_CANVAS_DIALOG }) + return () => dispatch({ type: HIDE_CANVAS_DIALOG }) + }, [show, dispatch]) + + const component = show ? ( + + + {dialogProps.data && dialogProps.data.name && dialogProps.data.label && ( +
      +
      + {dialogProps.data.name} +
      +
      + {dialogProps.data.label} +
      +
      + {dialogProps.data.id} +
      + {dialogProps.data.version && ( +
      + version {dialogProps.data.version} +
      + )} +
      +
      +
      + )} +
      + + {dialogProps.data?.description && ( +
      + {dialogProps.data.description} +
      + )} + {getNodeConfigApi.data && getNodeConfigApi.data.length > 0 && ( + + )} +
      +
      + ) : null + + return createPortal(component, portalElement) +} + +NodeInfoDialog.propTypes = { + show: PropTypes.bool, + dialogProps: PropTypes.object, + onCancel: PropTypes.func +} + +export default NodeInfoDialog diff --git a/packages/ui/src/ui-component/input/Input.js b/packages/ui/src/ui-component/input/Input.js index b7e161db..95bf968d 100644 --- a/packages/ui/src/ui-component/input/Input.js +++ b/packages/ui/src/ui-component/input/Input.js @@ -37,7 +37,7 @@ export const Input = ({ inputParam, value, onChange, disabled = false, showDialo onChange(e.target.value) }} inputProps={{ - step: inputParam.step ?? 0.1, + step: inputParam.step ?? 1, style: { height: inputParam.rows ? '90px' : 'inherit' } diff --git a/packages/ui/src/utils/genericHelper.js b/packages/ui/src/utils/genericHelper.js index eb3b08bc..7bf8998e 100644 --- a/packages/ui/src/utils/genericHelper.js +++ b/packages/ui/src/utils/genericHelper.js @@ -268,6 +268,7 @@ export const generateExportFlowData = (flowData) => { const newNodeData = { id: node.data.id, label: node.data.label, + version: node.data.version, name: node.data.name, type: node.data.type, baseClasses: node.data.baseClasses, diff --git a/packages/ui/src/views/canvas/AddNodes.js b/packages/ui/src/views/canvas/AddNodes.js index 810fc53f..c6134cb9 100644 --- a/packages/ui/src/views/canvas/AddNodes.js +++ b/packages/ui/src/views/canvas/AddNodes.js @@ -1,5 +1,5 @@ import { useState, useRef, useEffect } from 'react' -import { useSelector } from 'react-redux' +import { useSelector, useDispatch } from 'react-redux' import PropTypes from 'prop-types' // material-ui @@ -38,12 +38,14 @@ import { IconPlus, IconSearch, IconMinus, IconX } from '@tabler/icons' // const import { baseURL } from 'store/constant' +import { SET_COMPONENT_NODES } from 'store/actions' // ==============================|| ADD NODES||============================== // const AddNodes = ({ nodesData, node }) => { const theme = useTheme() const customization = useSelector((state) => state.customization) + const dispatch = useDispatch() const [searchValue, setSearchValue] = useState('') const [nodes, setNodes] = useState({}) @@ -131,8 +133,11 @@ const AddNodes = ({ nodesData, node }) => { }, [node]) useEffect(() => { - if (nodesData) groupByCategory(nodesData) - }, [nodesData]) + if (nodesData) { + groupByCategory(nodesData) + dispatch({ type: SET_COMPONENT_NODES, componentNodes: nodesData }) + } + }, [nodesData, dispatch]) return ( <> diff --git a/packages/ui/src/views/canvas/CanvasNode.js b/packages/ui/src/views/canvas/CanvasNode.js index 9263d4b6..cabe2329 100644 --- a/packages/ui/src/views/canvas/CanvasNode.js +++ b/packages/ui/src/views/canvas/CanvasNode.js @@ -1,19 +1,22 @@ import PropTypes from 'prop-types' -import { useContext, useState } from 'react' +import { useContext, useState, useEffect } from 'react' +import { useSelector } from 'react-redux' // material-ui import { styled, useTheme } from '@mui/material/styles' import { IconButton, Box, Typography, Divider, Button } from '@mui/material' +import Tooltip, { tooltipClasses } from '@mui/material/Tooltip' // project imports import MainCard from 'ui-component/cards/MainCard' import NodeInputHandler from './NodeInputHandler' import NodeOutputHandler from './NodeOutputHandler' import AdditionalParamsDialog from 'ui-component/dialog/AdditionalParamsDialog' +import NodeInfoDialog from 'ui-component/dialog/NodeInfoDialog' // const import { baseURL } from 'store/constant' -import { IconTrash, IconCopy } from '@tabler/icons' +import { IconTrash, IconCopy, IconInfoCircle, IconAlertTriangle } from '@tabler/icons' import { flowContext } from 'store/context/ReactFlowContext' const CardWrapper = styled(MainCard)(({ theme }) => ({ @@ -30,14 +33,39 @@ const CardWrapper = styled(MainCard)(({ theme }) => ({ } })) +const LightTooltip = styled(({ className, ...props }) => )(({ theme }) => ({ + [`& .${tooltipClasses.tooltip}`]: { + backgroundColor: theme.palette.nodeToolTip.background, + color: theme.palette.nodeToolTip.color, + boxShadow: theme.shadows[1] + } +})) + // ===========================|| CANVAS NODE ||=========================== // const CanvasNode = ({ data }) => { const theme = useTheme() + const canvas = useSelector((state) => state.canvas) const { deleteNode, duplicateNode } = useContext(flowContext) const [showDialog, setShowDialog] = useState(false) const [dialogProps, setDialogProps] = useState({}) + const [showInfoDialog, setShowInfoDialog] = useState(false) + const [infoDialogProps, setInfoDialogProps] = useState({}) + const [warningMessage, setWarningMessage] = useState('') + const [open, setOpen] = useState(false) + + const handleClose = () => { + setOpen(false) + } + + const handleOpen = () => { + setOpen(true) + } + + const nodeOutdatedMessage = (oldVersion, newVersion) => `Node version ${oldVersion} outdated\nUpdate to latest version ${newVersion}` + + const nodeVersionEmptyMessage = (newVersion) => `Node outdated\nUpdate to latest version ${newVersion}` const onDialogClicked = () => { const dialogProps = { @@ -50,6 +78,17 @@ const CanvasNode = ({ data }) => { setShowDialog(true) } + useEffect(() => { + const componentNode = canvas.componentNodes.find((nd) => nd.name === data.name) + if (componentNode) { + if (!data.version) { + setWarningMessage(nodeVersionEmptyMessage(componentNode.version)) + } else { + if (componentNode.version > data.version) setWarningMessage(nodeOutdatedMessage(data.version, componentNode.version)) + } + } + }, [canvas.componentNodes, data.name, data.version]) + return ( <> { }} border={false} > - -
      - -
      - Notification -
      -
      - - - {data.label} - - -
      - { - duplicateNode(data.id) - }} - sx={{ height: 35, width: 35, '&:hover': { color: theme?.palette.primary.main } }} - color={theme?.customization?.isDarkMode ? theme.colors?.paper : 'inherit'} - > - - - { - deleteNode(data.id) - }} - sx={{ height: 35, width: 35, mr: 1, '&:hover': { color: 'red' } }} - color={theme?.customization?.isDarkMode ? theme.colors?.paper : 'inherit'} - > - - -
      - {(data.inputAnchors.length > 0 || data.inputParams.length > 0) && ( - <> - - - - Inputs - - - - - )} - {data.inputAnchors.map((inputAnchor, index) => ( - - ))} - {data.inputParams.map((inputParam, index) => ( - - ))} - {data.inputParams.find((param) => param.additionalParams) && ( + param.additionalParams).length === - data.inputParams.length + data.inputAnchors.length - ? 20 - : 0 + background: 'transparent', + display: 'flex', + flexDirection: 'column' }} > - + { + duplicateNode(data.id) + }} + sx={{ height: '35px', width: '35px', '&:hover': { color: theme?.palette.primary.main } }} + color={theme?.customization?.isDarkMode ? theme.colors?.paper : 'inherit'} + > + + + { + deleteNode(data.id) + }} + sx={{ height: '35px', width: '35px', '&:hover': { color: 'red' } }} + color={theme?.customization?.isDarkMode ? theme.colors?.paper : 'inherit'} + > + + + { + setInfoDialogProps({ data }) + setShowInfoDialog(true) + }} + sx={{ height: '35px', width: '35px', '&:hover': { color: theme?.palette.secondary.main } }} + color={theme?.customization?.isDarkMode ? theme.colors?.paper : 'inherit'} + > + + - )} - - - - Output - - - + } + placement='right-start' + > + +
      + +
      + Notification +
      +
      + + + {data.label} + + + {warningMessage && ( + <> +
      + {warningMessage}} placement='top'> + + + + + + )} +
      + {(data.inputAnchors.length > 0 || data.inputParams.length > 0) && ( + <> + + + + Inputs + + + + + )} + {data.inputAnchors.map((inputAnchor, index) => ( + + ))} + {data.inputParams.map((inputParam, index) => ( + + ))} + {data.inputParams.find((param) => param.additionalParams) && ( +
      param.additionalParams).length === + data.inputParams.length + data.inputAnchors.length + ? 20 + : 0 + }} + > + +
      + )} + + + + Output + + + - {data.outputAnchors.map((outputAnchor, index) => ( - - ))} -
      + {data.outputAnchors.map((outputAnchor, index) => ( + + ))} +
      +
      setShowDialog(false)} > + setShowInfoDialog(false)}> ) } diff --git a/packages/ui/src/views/chatmessage/ChatMessage.js b/packages/ui/src/views/chatmessage/ChatMessage.js index e58fdd00..b89af7bb 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.js +++ b/packages/ui/src/views/chatmessage/ChatMessage.js @@ -28,6 +28,9 @@ import useApi from 'hooks/useApi' // Const import { baseURL, maxScroll } from 'store/constant' +import robotPNG from 'assets/images/robot.png' +import userPNG from 'assets/images/account.png' + export const ChatMessage = ({ open, chatflowid, isDialog }) => { const theme = useTheme() const customization = useSelector((state) => state.customization) @@ -281,21 +284,9 @@ export const ChatMessage = ({ open, chatflowid, isDialog }) => { > {/* Display the correct icon depending on the message type */} {message.type === 'apiMessage' ? ( - AI + AI ) : ( - Me + Me )}
      diff --git a/packages/ui/src/views/credentials/AddEditCredentialDialog.js b/packages/ui/src/views/credentials/AddEditCredentialDialog.js index 6a5c9568..65b72a5f 100644 --- a/packages/ui/src/views/credentials/AddEditCredentialDialog.js +++ b/packages/ui/src/views/credentials/AddEditCredentialDialog.js @@ -27,6 +27,7 @@ import useNotifier from 'utils/useNotifier' // const import { baseURL } from 'store/constant' +import { HIDE_CANVAS_DIALOG, SHOW_CANVAS_DIALOG } from 'store/actions' const AddEditCredentialDialog = ({ show, dialogProps, onCancel, onConfirm }) => { const portalElement = document.getElementById('portal') @@ -87,6 +88,12 @@ const AddEditCredentialDialog = ({ show, dialogProps, onCancel, onConfirm }) => // eslint-disable-next-line react-hooks/exhaustive-deps }, [dialogProps]) + useEffect(() => { + if (show) dispatch({ type: SHOW_CANVAS_DIALOG }) + else dispatch({ type: HIDE_CANVAS_DIALOG }) + return () => dispatch({ type: HIDE_CANVAS_DIALOG }) + }, [show, dispatch]) + const addNewCredential = async () => { try { const obj = { diff --git a/packages/ui/src/views/credentials/CredentialListDialog.js b/packages/ui/src/views/credentials/CredentialListDialog.js index 9333db67..e0a3e08d 100644 --- a/packages/ui/src/views/credentials/CredentialListDialog.js +++ b/packages/ui/src/views/credentials/CredentialListDialog.js @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react' import { createPortal } from 'react-dom' -import { useSelector } from 'react-redux' +import { useSelector, useDispatch } from 'react-redux' import PropTypes from 'prop-types' import { List, @@ -20,11 +20,12 @@ import { IconSearch, IconX } from '@tabler/icons' // const import { baseURL } from 'store/constant' +import { HIDE_CANVAS_DIALOG, SHOW_CANVAS_DIALOG } from 'store/actions' const CredentialListDialog = ({ show, dialogProps, onCancel, onCredentialSelected }) => { const portalElement = document.getElementById('portal') const customization = useSelector((state) => state.customization) - + const dispatch = useDispatch() const theme = useTheme() const [searchValue, setSearchValue] = useState('') const [componentsCredentials, setComponentsCredentials] = useState([]) @@ -43,10 +44,16 @@ const CredentialListDialog = ({ show, dialogProps, onCancel, onCredentialSelecte } useEffect(() => { - if (show && dialogProps.componentsCredentials) { + if (dialogProps.componentsCredentials) { setComponentsCredentials(dialogProps.componentsCredentials) } - }, [show, dialogProps]) + }, [dialogProps]) + + useEffect(() => { + if (show) dispatch({ type: SHOW_CANVAS_DIALOG }) + else dispatch({ type: HIDE_CANVAS_DIALOG }) + return () => dispatch({ type: HIDE_CANVAS_DIALOG }) + }, [show, dispatch]) const component = show ? ( { useEffect(() => { if (getAllComponentsCredentialsApi.data) { setComponentsCredentials(getAllComponentsCredentialsApi.data) + dispatch({ type: SET_COMPONENT_CREDENTIALS, componentsCredentials: getAllComponentsCredentialsApi.data }) } - }, [getAllComponentsCredentialsApi.data]) + }, [getAllComponentsCredentialsApi.data, dispatch]) return ( <> diff --git a/packages/ui/src/views/tools/ToolDialog.js b/packages/ui/src/views/tools/ToolDialog.js index 77ef770d..5e286789 100644 --- a/packages/ui/src/views/tools/ToolDialog.js +++ b/packages/ui/src/views/tools/ToolDialog.js @@ -29,6 +29,7 @@ import useApi from 'hooks/useApi' // utils import useNotifier from 'utils/useNotifier' import { generateRandomGradient } from 'utils/genericHelper' +import { HIDE_CANVAS_DIALOG, SHOW_CANVAS_DIALOG } from 'store/actions' const exampleAPIFunc = `/* * You can use any libraries imported in Flowise @@ -155,6 +156,12 @@ const ToolDialog = ({ show, dialogProps, onUseTemplate, onCancel, onConfirm }) = } } + useEffect(() => { + if (show) dispatch({ type: SHOW_CANVAS_DIALOG }) + else dispatch({ type: HIDE_CANVAS_DIALOG }) + return () => dispatch({ type: HIDE_CANVAS_DIALOG }) + }, [show, dispatch]) + useEffect(() => { if (getSpecificToolApi.data) { setToolId(getSpecificToolApi.data.id) From 5af9b5f63ba14998fe88d89c631a1dcc6e3c0e41 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 28 Jul 2023 17:49:54 +0100 Subject: [PATCH 11/19] =?UTF-8?q?=F0=9F=A5=B3=20flowise-components@1.3.0?= =?UTF-8?q?=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/components/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/package.json b/packages/components/package.json index 01738a7c..e41e5add 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "flowise-components", - "version": "1.2.17", + "version": "1.3.0", "description": "Flowiseai Components", "main": "dist/src/index", "types": "dist/src/index.d.ts", From d47835d383b7713c364179291d0b0c17514b0cb7 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 28 Jul 2023 17:57:50 +0100 Subject: [PATCH 12/19] =?UTF-8?q?=F0=9F=A5=B3=20flowise-ui@1.3.0=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index bdb49846..a2eeec6f 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "flowise-ui", - "version": "1.2.15", + "version": "1.3.0", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://flowiseai.com", "author": { From 3ffc9050b24ef71f352976e0320eb14bbc81eb92 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 28 Jul 2023 17:58:13 +0100 Subject: [PATCH 13/19] =?UTF-8?q?=F0=9F=A5=B3=20flowise@1.3.0=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- packages/server/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 27c5358e..220d5807 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.2.16", + "version": "1.3.0", "private": true, "homepage": "https://flowiseai.com", "workspaces": [ diff --git a/packages/server/package.json b/packages/server/package.json index b8b5fe37..56e47fe3 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.2.16", + "version": "1.3.0", "description": "Flowiseai Server", "main": "dist/index", "types": "dist/index.d.ts", From 722223a87ef4d5fabdcfe63dea7b6823a846fd44 Mon Sep 17 00:00:00 2001 From: Henry Heng Date: Fri, 28 Jul 2023 19:16:42 +0100 Subject: [PATCH 14/19] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 13da9420..65249147 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ Download and Install [NodeJS](https://nodejs.org/en/download) >= 18.15.0 ### Docker Compose 1. Go to `docker` folder at the root of the project -2. Create `.env` file and specify the `PORT` (refer to `.env.example`) +2. Copy `.env.example` file, paste it into the same location, and rename to `.env` 3. `docker-compose up -d` 4. Open [http://localhost:3000](http://localhost:3000) 5. You can bring the containers down by `docker-compose stop` From 2a2fc02c75265499009a8670337c788b73299f7e Mon Sep 17 00:00:00 2001 From: Rafael Reis Date: Fri, 28 Jul 2023 20:18:35 -0300 Subject: [PATCH 15/19] Update CONTRIBUTING.md fixed DATABASE_USER(NAME) --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7c2222a7..524db215 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -135,7 +135,7 @@ Flowise support different environment variables to configure your instance. You | DATABASE_PATH | Location where database is saved (When DATABASE_TYPE is sqlite) | String | `your-home-dir/.flowise` | | DATABASE_HOST | Host URL or IP address (When DATABASE_TYPE is not sqlite) | String | | | DATABASE_PORT | Database port (When DATABASE_TYPE is not sqlite) | String | | -| DATABASE_USERNAME | Database username (When DATABASE_TYPE is not sqlite) | String | | +| DATABASE_USER | Database username (When DATABASE_TYPE is not sqlite) | String | | | DATABASE_PASSWORD | Database password (When DATABASE_TYPE is not sqlite) | String | | | DATABASE_NAME | Database name (When DATABASE_TYPE is not sqlite) | String | | | PASSPHRASE | Passphrase used to create encryption key | String | `MYPASSPHRASE` | From 6378e08f279ad8fccc335dbd8f2ea04c6755517a Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 29 Jul 2023 01:46:51 +0100 Subject: [PATCH 16/19] fix default encryption key file path - Error: Error: Error: ENOENT: no such file or directory, open '' --- packages/components/src/utils.ts | 8 ++++---- packages/server/src/index.ts | 6 +++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/components/src/utils.ts b/packages/components/src/utils.ts index 8167a350..bada7cc0 100644 --- a/packages/components/src/utils.ts +++ b/packages/components/src/utils.ts @@ -355,10 +355,10 @@ export const getEnvironmentVariable = (name: string): string | undefined => { */ const getEncryptionKeyFilePath = (): string => { const checkPaths = [ - path.join(__dirname, '..', '..', 'server', 'encryption.key'), - path.join(__dirname, '..', '..', '..', 'server', 'encryption.key'), - path.join(__dirname, '..', '..', '..', '..', 'server', 'encryption.key'), - path.join(__dirname, '..', '..', '..', '..', '..', 'server', 'encryption.key') + path.join(__dirname, '..', '..', 'encryption.key'), + path.join(__dirname, '..', '..', '..', 'encryption.key'), + path.join(__dirname, '..', '..', '..', '..', 'encryption.key'), + path.join(__dirname, '..', '..', '..', '..', '..', 'encryption.key') ] for (const checkPath of checkPaths) { if (fs.existsSync(checkPath)) { diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index e1ac4724..34357ea9 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -44,7 +44,8 @@ import { transformToCredentialEntity, decryptCredentialData, clearSessionMemory, - replaceInputsWithConfig + replaceInputsWithConfig, + getEncryptionKey } from './utils' import { cloneDeep, omit } from 'lodash' import { getDataSource } from './DataSource' @@ -82,6 +83,9 @@ export class App { // Initialize API keys await getAPIKeys() + + // Initialize encryption key + await getEncryptionKey() }) .catch((err) => { logger.error('❌ [server]: Error during Data Source initialization:', err) From cec026a8895efdf7b58e6bc954cfcaf1eb644aff Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 29 Jul 2023 02:01:18 +0100 Subject: [PATCH 17/19] add check file paths --- packages/components/src/utils.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/components/src/utils.ts b/packages/components/src/utils.ts index bada7cc0..363dd026 100644 --- a/packages/components/src/utils.ts +++ b/packages/components/src/utils.ts @@ -356,9 +356,13 @@ export const getEnvironmentVariable = (name: string): string | undefined => { const getEncryptionKeyFilePath = (): string => { const checkPaths = [ path.join(__dirname, '..', '..', 'encryption.key'), + path.join(__dirname, '..', '..', 'server', 'encryption.key'), path.join(__dirname, '..', '..', '..', 'encryption.key'), + path.join(__dirname, '..', '..', '..', 'server', 'encryption.key'), path.join(__dirname, '..', '..', '..', '..', 'encryption.key'), - path.join(__dirname, '..', '..', '..', '..', '..', 'encryption.key') + path.join(__dirname, '..', '..', '..', '..', 'server', 'encryption.key'), + path.join(__dirname, '..', '..', '..', '..', '..', 'encryption.key'), + path.join(__dirname, '..', '..', '..', '..', '..', 'server', 'encryption.key') ] for (const checkPath of checkPaths) { if (fs.existsSync(checkPath)) { From b2b924a38ab731f53d4b09123f0f46773de316bb Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 29 Jul 2023 12:44:52 +0100 Subject: [PATCH 18/19] minor patch bug fix to 1.3.1 --- package.json | 2 +- packages/server/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 220d5807..b5c7c5fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.3.0", + "version": "1.3.1", "private": true, "homepage": "https://flowiseai.com", "workspaces": [ diff --git a/packages/server/package.json b/packages/server/package.json index 56e47fe3..a8cf1e65 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.3.0", + "version": "1.3.1", "description": "Flowiseai Server", "main": "dist/index", "types": "dist/index.d.ts", From 79cae6962b9afed1862f517b3880b3d330f830e7 Mon Sep 17 00:00:00 2001 From: Henry Date: Sat, 29 Jul 2023 12:45:31 +0100 Subject: [PATCH 19/19] minor patch bug fix to 1.3.1 --- packages/components/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/package.json b/packages/components/package.json index e41e5add..8a3eca6e 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "flowise-components", - "version": "1.3.0", + "version": "1.3.1", "description": "Flowiseai Components", "main": "dist/src/index", "types": "dist/src/index.d.ts",