From 02d8284f58694e177d767a80d7963b8eebacb02f Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 11 Apr 2023 10:41:46 +0100 Subject: [PATCH 01/20] Update README --- CONTRIBUTING.md | 2 +- README.md | 2 +- packages/server/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index afe9f5d0..f1938ea6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -116,7 +116,7 @@ In-Progress ## 🏷️ Pull Request process -A member of the FlowiseAI team will automatically be notified/assigned when you open a pull request. You can also reach out to us on [Discord](https://discord.gg/GWcGczPk). +A member of the FlowiseAI team will automatically be notified/assigned when you open a pull request. You can also reach out to us on [Discord](https://discord.gg/7C5xTWP8). ## 📃 Contributor License Agreement diff --git a/README.md b/README.md index 65efcd25..f9a62553 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ Feel free to ask any questions, raise problems, and request new features in [dis ## 🙌 Contributing -See [contributing guide](CONTRIBUTING.md). Reach out to us at [Discord](https://discord.gg/GWcGczPk) if you have any questions or issues. +See [contributing guide](CONTRIBUTING.md). Reach out to us at [Discord](https://discord.gg/7C5xTWP8) if you have any questions or issues. ## 📄 License diff --git a/packages/server/README.md b/packages/server/README.md index b7e3031a..290d4578 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -38,7 +38,7 @@ Feel free to ask any questions, raise problems, and request new features in [dis ## 🙌 Contributing -See [contributing guide](https://github.com/FlowiseAI/Flowise/blob/master/CONTRIBUTING.md). Reach out to us at [Discord](https://discord.gg/GWcGczPk) if you have any questions or issues. +See [contributing guide](https://github.com/FlowiseAI/Flowise/blob/master/CONTRIBUTING.md). Reach out to us at [Discord](https://discord.gg/7C5xTWP8) if you have any questions or issues. ## 📄 License From 9281b57ef1f0590081f81a3786a587aa05392e76 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 13 Apr 2023 18:32:00 +0100 Subject: [PATCH 02/20] - update LangchainJS version - add types & interfaces - small ui bug fix - update marketplace files --- .github/workflows/main.yml | 2 +- .../ConversationalAgent.ts | 20 +- .../MRKLAgentChat.ts} | 26 +- .../agent.svg | 0 .../MRKLAgentLLM.ts} | 28 +- .../{MRLKAgentLLM => MRKLAgentLLM}/agent.svg | 0 .../ConversationalRetrievalQAChain.ts | 19 +- .../nodes/chains/LLMChain/LLMChain.ts | 35 +- .../RetrievalQAChain/RetrievalQAChain.ts | 18 +- .../nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts | 21 +- .../nodes/documentloaders/Github/Github.ts | 17 +- .../nodes/documentloaders/Pdf/Pdf.ts | 13 +- .../nodes/documentloaders/Text/Text.ts | 12 +- .../OpenAIEmbedding/OpenAIEmbedding.ts | 8 +- .../HuggingFaceInference.ts | 11 +- .../components/nodes/llms/OpenAI/OpenAI.ts | 9 +- .../nodes/memory/BufferMemory/BufferMemory.ts | 10 +- .../ChatPromptTemplate/ChatPromptTemplate.ts | 8 +- .../FewShotPromptTemplate.ts | 25 +- .../prompts/PromptTemplate/PromptTemplate.ts | 11 +- .../RecursiveCharacterTextSplitter.ts | 10 +- .../nodes/tools/Calculator/Calculator.ts | 12 +- .../nodes/tools/RequestsGet/RequestsGet.ts | 29 ++ .../nodes/tools/RequestsGet/requestsget.svg | 8 + .../nodes/tools/RequestsPost/RequestsPost.ts | 29 ++ .../nodes/tools/RequestsPost/requestspost.svg | 6 + .../components/nodes/tools/SerpAPI/SerpAPI.ts | 12 +- .../Chroma_Existing/Chroma_Existing.ts | 12 +- .../Chroma_Upsert/Chroma_Upsert.ts | 21 +- .../Pinecone_Existing/Pinecone_Existing.ts | 12 +- .../Pinecone_Upsert/Pinecone_Upsert.ts | 21 +- packages/components/package.json | 2 +- packages/components/src/Interface.ts | 1 - packages/components/tsconfig.json | 3 +- packages/server/marketplaces/Antonym.json | 284 ++++++----- .../marketplaces/Conversational Agent.json | 106 ++-- .../Conversational Retrieval QA Chain.json | 212 ++++---- .../server/marketplaces/Github Repo QnA.json | 466 +++++++++--------- .../{MRLKAgent.json => MRKLAgent.json} | 240 ++++----- .../server/marketplaces/Simple LLM Chain.json | 174 +++---- packages/server/marketplaces/Translator.json | 302 ++++++------ packages/server/src/NodesPool.ts | 3 - packages/server/src/utils/index.ts | 4 +- .../ui/src/views/canvas/NodeInputHandler.js | 21 +- .../ui/src/views/canvas/NodeOutputHandler.js | 20 +- .../ui/src/views/chatmessage/ChatMessage.css | 10 +- .../ui/src/views/chatmessage/ChatMessage.js | 6 +- 47 files changed, 1178 insertions(+), 1141 deletions(-) rename packages/components/nodes/agents/{MRLKAgentChat/MRLKAgentChat.ts => MRKLAgentChat/MRKLAgentChat.ts} (64%) rename packages/components/nodes/agents/{MRLKAgentChat => MRKLAgentChat}/agent.svg (100%) rename packages/components/nodes/agents/{MRLKAgentLLM/MRLKAgentLLM.ts => MRKLAgentLLM/MRKLAgentLLM.ts} (63%) rename packages/components/nodes/agents/{MRLKAgentLLM => MRKLAgentLLM}/agent.svg (100%) create mode 100644 packages/components/nodes/tools/RequestsGet/RequestsGet.ts create mode 100644 packages/components/nodes/tools/RequestsGet/requestsget.svg create mode 100644 packages/components/nodes/tools/RequestsPost/RequestsPost.ts create mode 100644 packages/components/nodes/tools/RequestsPost/requestspost.svg rename packages/server/marketplaces/{MRLKAgent.json => MRKLAgent.json} (69%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index afc43079..a89846a6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,7 +17,7 @@ jobs: strategy: matrix: platform: [ubuntu-latest] - node-version: [14.x, 16.x] + node-version: [18.15.0] runs-on: ${{ matrix.platform }} steps: diff --git a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts index d3ff6f4d..26190de0 100644 --- a/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts +++ b/packages/components/nodes/agents/ConversationalAgent/ConversationalAgent.ts @@ -1,4 +1,9 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { initializeAgentExecutor, AgentExecutor } from 'langchain/agents' +import { Tool } from 'langchain/tools' +import { BaseChatModel } from 'langchain/chat_models/base' +import { BaseChatMemory } from 'langchain/memory' +import { getBaseClasses } from '../../../src/utils' class ConversationalAgent_Agents implements INode { label: string @@ -17,6 +22,7 @@ class ConversationalAgent_Agents implements INode { this.category = 'Agents' this.icon = 'agent.svg' this.description = 'Conversational agent for a chat model. It will utilize chat specific prompts' + this.baseClasses = [this.type, ...getBaseClasses(AgentExecutor)] this.inputs = [ { label: 'Allowed Tools', @@ -37,16 +43,10 @@ class ConversationalAgent_Agents implements INode { ] } - async getBaseClasses(): Promise { - return ['AgentExecutor'] - } - async init(nodeData: INodeData): Promise { - const { initializeAgentExecutor } = await import('langchain/agents') - - const model = nodeData.inputs?.model - const tools = nodeData.inputs?.tools - const memory = nodeData.inputs?.memory + const model = nodeData.inputs?.model as BaseChatModel + const tools = nodeData.inputs?.tools as Tool[] + const memory = nodeData.inputs?.memory as BaseChatMemory const executor = await initializeAgentExecutor(tools, model, 'chat-conversational-react-description', true) executor.memory = memory @@ -54,7 +54,7 @@ class ConversationalAgent_Agents implements INode { } async run(nodeData: INodeData, input: string): Promise { - const executor = nodeData.instance + const executor = nodeData.instance as AgentExecutor const result = await executor.call({ input }) return result?.output diff --git a/packages/components/nodes/agents/MRLKAgentChat/MRLKAgentChat.ts b/packages/components/nodes/agents/MRKLAgentChat/MRKLAgentChat.ts similarity index 64% rename from packages/components/nodes/agents/MRLKAgentChat/MRLKAgentChat.ts rename to packages/components/nodes/agents/MRKLAgentChat/MRKLAgentChat.ts index 207f9145..a60ccf7b 100644 --- a/packages/components/nodes/agents/MRLKAgentChat/MRLKAgentChat.ts +++ b/packages/components/nodes/agents/MRKLAgentChat/MRKLAgentChat.ts @@ -1,6 +1,10 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { initializeAgentExecutor, AgentExecutor } from 'langchain/agents' +import { Tool } from 'langchain/tools' +import { BaseChatModel } from 'langchain/chat_models/base' +import { getBaseClasses } from '../../../src/utils' -class MRLKAgentChat_Agents implements INode { +class MRKLAgentChat_Agents implements INode { label: string name: string description: string @@ -11,12 +15,13 @@ class MRLKAgentChat_Agents implements INode { inputs: INodeParams[] constructor() { - this.label = 'MRLK Agent for Chat Models' - this.name = 'mrlkAgentChat' + this.label = 'MRKL Agent for Chat Models' + this.name = 'mrklAgentChat' this.type = 'AgentExecutor' this.category = 'Agents' this.icon = 'agent.svg' this.description = 'Agent that uses the ReAct Framework to decide what action to take, optimized to be used with Chat Models' + this.baseClasses = [this.type, ...getBaseClasses(AgentExecutor)] this.inputs = [ { label: 'Allowed Tools', @@ -32,27 +37,20 @@ class MRLKAgentChat_Agents implements INode { ] } - async getBaseClasses(): Promise { - return ['AgentExecutor'] - } - async init(nodeData: INodeData): Promise { - const { initializeAgentExecutor } = await import('langchain/agents') - - const model = nodeData.inputs?.model - const tools = nodeData.inputs?.tools + const model = nodeData.inputs?.model as BaseChatModel + const tools = nodeData.inputs?.tools as Tool[] const executor = await initializeAgentExecutor(tools, model, 'chat-zero-shot-react-description', true) - return executor } async run(nodeData: INodeData, input: string): Promise { - const executor = nodeData.instance + const executor = nodeData.instance as AgentExecutor const result = await executor.call({ input }) return result?.output } } -module.exports = { nodeClass: MRLKAgentChat_Agents } +module.exports = { nodeClass: MRKLAgentChat_Agents } diff --git a/packages/components/nodes/agents/MRLKAgentChat/agent.svg b/packages/components/nodes/agents/MRKLAgentChat/agent.svg similarity index 100% rename from packages/components/nodes/agents/MRLKAgentChat/agent.svg rename to packages/components/nodes/agents/MRKLAgentChat/agent.svg diff --git a/packages/components/nodes/agents/MRLKAgentLLM/MRLKAgentLLM.ts b/packages/components/nodes/agents/MRKLAgentLLM/MRKLAgentLLM.ts similarity index 63% rename from packages/components/nodes/agents/MRLKAgentLLM/MRLKAgentLLM.ts rename to packages/components/nodes/agents/MRKLAgentLLM/MRKLAgentLLM.ts index 1f5c636b..4df6ea41 100644 --- a/packages/components/nodes/agents/MRLKAgentLLM/MRLKAgentLLM.ts +++ b/packages/components/nodes/agents/MRKLAgentLLM/MRKLAgentLLM.ts @@ -1,6 +1,10 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { initializeAgentExecutor, AgentExecutor } from 'langchain/agents' +import { Tool } from 'langchain/tools' +import { BaseLLM } from 'langchain/llms/base' +import { getBaseClasses } from '../../../src/utils' -class MRLKAgentLLM_Agents implements INode { +class MRKLAgentLLM_Agents implements INode { label: string name: string description: string @@ -11,12 +15,13 @@ class MRLKAgentLLM_Agents implements INode { inputs: INodeParams[] constructor() { - this.label = 'MRLK Agent for LLMs' - this.name = 'mrlkAgentLLM' + this.label = 'MRKL Agent for LLMs' + this.name = 'mrklAgentLLM' this.type = 'AgentExecutor' this.category = 'Agents' this.icon = 'agent.svg' this.description = 'Agent that uses the ReAct Framework to decide what action to take, optimized to be used with LLMs' + this.baseClasses = [this.type, ...getBaseClasses(AgentExecutor)] this.inputs = [ { label: 'Allowed Tools', @@ -27,32 +32,25 @@ class MRLKAgentLLM_Agents implements INode { { label: 'LLM Model', name: 'model', - type: 'BaseLanguageModel' + type: 'BaseLLM' } ] } - async getBaseClasses(): Promise { - return ['AgentExecutor'] - } - async init(nodeData: INodeData): Promise { - const { initializeAgentExecutor } = await import('langchain/agents') - - const model = nodeData.inputs?.model - const tools = nodeData.inputs?.tools + const model = nodeData.inputs?.model as BaseLLM + const tools = nodeData.inputs?.tools as Tool[] const executor = await initializeAgentExecutor(tools, model, 'zero-shot-react-description', true) - return executor } async run(nodeData: INodeData, input: string): Promise { - const executor = nodeData.instance + const executor = nodeData.instance as AgentExecutor const result = await executor.call({ input }) return result?.output } } -module.exports = { nodeClass: MRLKAgentLLM_Agents } +module.exports = { nodeClass: MRKLAgentLLM_Agents } diff --git a/packages/components/nodes/agents/MRLKAgentLLM/agent.svg b/packages/components/nodes/agents/MRKLAgentLLM/agent.svg similarity index 100% rename from packages/components/nodes/agents/MRLKAgentLLM/agent.svg rename to packages/components/nodes/agents/MRKLAgentLLM/agent.svg diff --git a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts index c23a4d92..616e2a9b 100644 --- a/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts +++ b/packages/components/nodes/chains/ConversationalRetrievalQAChain/ConversationalRetrievalQAChain.ts @@ -1,5 +1,8 @@ import { ICommonObject, IMessage, INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { ConversationalRetrievalQAChain } from 'langchain/chains' +import { BaseLLM } from 'langchain/llms/base' +import { BaseRetriever } from 'langchain/schema' class ConversationalRetrievalQAChain_Chains implements INode { label: string @@ -18,11 +21,12 @@ class ConversationalRetrievalQAChain_Chains implements INode { this.icon = 'chain.svg' this.category = 'Chains' this.description = 'Document QA - built on RetrievalQAChain to provide a chat history component' + this.baseClasses = [this.type, ...getBaseClasses(ConversationalRetrievalQAChain)] this.inputs = [ { label: 'LLM', name: 'llm', - type: 'BaseLanguageModel' + type: 'BaseLLM' }, { label: 'Vector Store Retriever', @@ -32,23 +36,16 @@ class ConversationalRetrievalQAChain_Chains implements INode { ] } - async getBaseClasses(): Promise { - const { ConversationalRetrievalQAChain } = await import('langchain/chains') - return getBaseClasses(ConversationalRetrievalQAChain) - } - async init(nodeData: INodeData): Promise { - const { ConversationalRetrievalQAChain } = await import('langchain/chains') - - const llm = nodeData.inputs?.llm - const vectorStoreRetriever = nodeData.inputs?.vectorStoreRetriever + const llm = nodeData.inputs?.llm as BaseLLM + const vectorStoreRetriever = nodeData.inputs?.vectorStoreRetriever as BaseRetriever const chain = ConversationalRetrievalQAChain.fromLLM(llm, vectorStoreRetriever) return chain } async run(nodeData: INodeData, input: string, options: ICommonObject): Promise { - const chain = nodeData.instance + const chain = nodeData.instance as ConversationalRetrievalQAChain let chatHistory = '' if (options && options.chatHistory) { diff --git a/packages/components/nodes/chains/LLMChain/LLMChain.ts b/packages/components/nodes/chains/LLMChain/LLMChain.ts index 18376545..0200b316 100644 --- a/packages/components/nodes/chains/LLMChain/LLMChain.ts +++ b/packages/components/nodes/chains/LLMChain/LLMChain.ts @@ -1,5 +1,8 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { LLMChain } from 'langchain/chains' +import { BaseLanguageModel } from 'langchain/base_language' +import { BasePromptTemplate } from 'langchain/prompts' class LLMChain_Chains implements INode { label: string @@ -18,10 +21,11 @@ class LLMChain_Chains implements INode { this.icon = 'chain.svg' this.category = 'Chains' this.description = 'Chain to run queries against LLMs' + this.baseClasses = [this.type, ...getBaseClasses(LLMChain)] this.inputs = [ { - label: 'LLM', - name: 'llm', + label: 'Language Model', + name: 'model', type: 'BaseLanguageModel' }, { @@ -43,24 +47,17 @@ class LLMChain_Chains implements INode { ] } - async getBaseClasses(): Promise { - const { LLMChain } = await import('langchain/chains') - return getBaseClasses(LLMChain) - } - async init(nodeData: INodeData): Promise { - const { LLMChain } = await import('langchain/chains') + const model = nodeData.inputs?.model as BaseLanguageModel + const prompt = nodeData.inputs?.prompt as BasePromptTemplate - const llm = nodeData.inputs?.llm - const prompt = nodeData.inputs?.prompt - - const chain = new LLMChain({ llm, prompt }) + const chain = new LLMChain({ llm: model, prompt }) return chain } async run(nodeData: INodeData, input: string): Promise { - const inputVariables = nodeData.instance.prompt.inputVariables // ["product"] - const chain = nodeData.instance + const inputVariables = nodeData.instance.prompt.inputVariables as string[] // ["product"] + const chain = nodeData.instance as LLMChain if (inputVariables.length === 1) { const res = await chain.run(input) @@ -71,7 +68,7 @@ class LLMChain_Chains implements INode { const promptValues = JSON.parse(promptValuesStr.replace(/\s/g, '')) - let seen = [] + let seen: string[] = [] for (const variable of inputVariables) { seen.push(variable) @@ -81,13 +78,17 @@ class LLMChain_Chains implements INode { } if (seen.length === 1) { + const lastValue = seen.pop() + if (!lastValue) throw new Error('Please provide Prompt Values') const options = { ...promptValues, - [seen.pop()]: input + [lastValue]: input } const res = await chain.call(options) return res?.text - } else throw new Error('Please provide Prompt Values') + } else { + throw new Error('Please provide Prompt Values') + } } else { const res = await chain.run(input) return res diff --git a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts index 3bfce6fc..2887643a 100644 --- a/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts +++ b/packages/components/nodes/chains/RetrievalQAChain/RetrievalQAChain.ts @@ -1,4 +1,8 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { RetrievalQAChain } from 'langchain/chains' +import { BaseLLM } from 'langchain/llms/base' +import { BaseRetriever } from 'langchain/schema' +import { getBaseClasses } from '../../../src/utils' class RetrievalQAChain_Chains implements INode { label: string @@ -17,11 +21,12 @@ class RetrievalQAChain_Chains implements INode { this.icon = 'chain.svg' this.category = 'Chains' this.description = 'QA chain to answer a question based on the retrieved documents' + this.baseClasses = [this.type, ...getBaseClasses(RetrievalQAChain)] this.inputs = [ { label: 'LLM', name: 'llm', - type: 'BaseLanguageModel' + type: 'BaseLLM' }, { label: 'Vector Store Retriever', @@ -31,21 +36,16 @@ class RetrievalQAChain_Chains implements INode { ] } - async getBaseClasses(): Promise { - return ['BaseChain'] - } - async init(nodeData: INodeData): Promise { - const { RetrievalQAChain } = await import('langchain/chains') - const llm = nodeData.inputs?.llm - const vectorStoreRetriever = nodeData.inputs?.vectorStoreRetriever + const llm = nodeData.inputs?.llm as BaseLLM + const vectorStoreRetriever = nodeData.inputs?.vectorStoreRetriever as BaseRetriever const chain = RetrievalQAChain.fromLLM(llm, vectorStoreRetriever) return chain } async run(nodeData: INodeData, input: string): Promise { - const chain = nodeData.instance + const chain = nodeData.instance as RetrievalQAChain const obj = { query: input } diff --git a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts index 9cb12592..66104c9e 100644 --- a/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts +++ b/packages/components/nodes/chatmodels/ChatOpenAI/ChatOpenAI.ts @@ -1,5 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { ChatOpenAI } from 'langchain/chat_models/openai' class ChatOpenAI_ChatModels implements INode { label: string @@ -18,6 +19,7 @@ class ChatOpenAI_ChatModels implements INode { this.icon = 'openai.png' this.category = 'Chat Models' this.description = 'Wrapper around OpenAI large language models that use the Chat endpoint' + this.baseClasses = [this.type, ...getBaseClasses(ChatOpenAI)] this.inputs = [ { label: 'OpenAI Api Key', @@ -29,6 +31,18 @@ class ChatOpenAI_ChatModels implements INode { 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-3.5-turbo', name: 'gpt-3.5-turbo' @@ -51,14 +65,7 @@ class ChatOpenAI_ChatModels implements INode { ] } - async getBaseClasses(): Promise { - const { ChatOpenAI } = await import('langchain/chat_models') - return getBaseClasses(ChatOpenAI) - } - async init(nodeData: INodeData): Promise { - const { ChatOpenAI } = await import('langchain/chat_models') - const temperature = nodeData.inputs?.temperature as string const modelName = nodeData.inputs?.modelName as string const openAIApiKey = nodeData.inputs?.openAIApiKey as string diff --git a/packages/components/nodes/documentloaders/Github/Github.ts b/packages/components/nodes/documentloaders/Github/Github.ts index ff4a5a7e..2340bea7 100644 --- a/packages/components/nodes/documentloaders/Github/Github.ts +++ b/packages/components/nodes/documentloaders/Github/Github.ts @@ -1,4 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { TextSplitter } from 'langchain/text_splitter' +import { GithubRepoLoader, GithubRepoLoaderParams } from 'langchain/document_loaders/web/github' class Github_DocumentLoaders implements INode { label: string @@ -13,10 +15,11 @@ class Github_DocumentLoaders implements INode { constructor() { this.label = 'Github' this.name = 'github' - this.type = 'Github' + this.type = 'Document' this.icon = 'github.png' this.category = 'Document Loaders' this.description = `Load data from a GitHub repository` + this.baseClasses = [this.type] this.inputs = [ { label: 'Repo Link', @@ -46,23 +49,17 @@ class Github_DocumentLoaders implements INode { ] } - async getBaseClasses(): Promise { - return ['Document'] - } - async init(nodeData: INodeData): Promise { - const { GithubRepoLoader } = await import('langchain/document_loaders') - const repoLink = nodeData.inputs?.repoLink as string const branch = nodeData.inputs?.branch as string const accessToken = nodeData.inputs?.accessToken as string - const textSplitter = nodeData.inputs?.textSplitter + const textSplitter = nodeData.inputs?.textSplitter as TextSplitter - const options = { + const options: GithubRepoLoaderParams = { branch, recursive: false, unknown: 'warn' - } as any + } if (accessToken) options.accessToken = accessToken diff --git a/packages/components/nodes/documentloaders/Pdf/Pdf.ts b/packages/components/nodes/documentloaders/Pdf/Pdf.ts index 10e12226..49b6e52f 100644 --- a/packages/components/nodes/documentloaders/Pdf/Pdf.ts +++ b/packages/components/nodes/documentloaders/Pdf/Pdf.ts @@ -1,4 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { TextSplitter } from 'langchain/text_splitter' +import { PDFLoader } from 'langchain/document_loaders/fs/pdf' class Pdf_DocumentLoaders implements INode { label: string @@ -13,10 +15,11 @@ class Pdf_DocumentLoaders implements INode { constructor() { this.label = 'Pdf File' this.name = 'pdfFile' - this.type = 'PDF' + this.type = 'Document' this.icon = 'pdf.svg' this.category = 'Document Loaders' this.description = `Load data from PDF files` + this.baseClasses = [this.type] this.inputs = [ { label: 'Pdf File', @@ -49,14 +52,8 @@ class Pdf_DocumentLoaders implements INode { ] } - async getBaseClasses(): Promise { - return ['Document'] - } - async init(nodeData: INodeData): Promise { - const { PDFLoader } = await import('langchain/document_loaders') - - const textSplitter = nodeData.inputs?.textSplitter + const textSplitter = nodeData.inputs?.textSplitter as TextSplitter const pdfFileBase64 = nodeData.inputs?.pdfFile as string const usage = nodeData.inputs?.usage as string diff --git a/packages/components/nodes/documentloaders/Text/Text.ts b/packages/components/nodes/documentloaders/Text/Text.ts index b174e230..bad20792 100644 --- a/packages/components/nodes/documentloaders/Text/Text.ts +++ b/packages/components/nodes/documentloaders/Text/Text.ts @@ -1,4 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { TextSplitter } from 'langchain/text_splitter' +import { TextLoader } from 'langchain/document_loaders/fs/text' class Text_DocumentLoaders implements INode { label: string @@ -13,10 +15,11 @@ class Text_DocumentLoaders implements INode { constructor() { this.label = 'Text File' this.name = 'textFile' - this.type = 'Text' + this.type = 'Document' this.icon = 'textFile.svg' this.category = 'Document Loaders' this.description = `Load data from text files` + this.baseClasses = [this.type] this.inputs = [ { label: 'Txt File', @@ -33,13 +36,8 @@ class Text_DocumentLoaders implements INode { ] } - async getBaseClasses(): Promise { - return ['Document'] - } - async init(nodeData: INodeData): Promise { - const { TextLoader } = await import('langchain/document_loaders') - const textSplitter = nodeData.inputs?.textSplitter + const textSplitter = nodeData.inputs?.textSplitter as TextSplitter const txtFileBase64 = nodeData.inputs?.txtFile as string const splitDataURI = txtFileBase64.split(',') splitDataURI.pop() diff --git a/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts b/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts index 414259fe..f361be63 100644 --- a/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts +++ b/packages/components/nodes/embeddings/OpenAIEmbedding/OpenAIEmbedding.ts @@ -1,5 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { OpenAIEmbeddings } from 'langchain/embeddings/openai' class OpenAIEmbedding_Embeddings implements INode { label: string @@ -18,6 +19,7 @@ class OpenAIEmbedding_Embeddings implements INode { this.icon = 'openai.png' this.category = 'Embeddings' this.description = 'OpenAI API to generate embeddings for a given text' + this.baseClasses = [this.type, ...getBaseClasses(OpenAIEmbeddings)] this.inputs = [ { label: 'OpenAI Api Key', @@ -27,13 +29,7 @@ class OpenAIEmbedding_Embeddings implements INode { ] } - async getBaseClasses(): Promise { - const { OpenAIEmbeddings } = await import('langchain/embeddings') - return getBaseClasses(OpenAIEmbeddings) - } - async init(nodeData: INodeData): Promise { - const { OpenAIEmbeddings } = await import('langchain/embeddings') const openAIApiKey = nodeData.inputs?.openAIApiKey as string const model = new OpenAIEmbeddings({ openAIApiKey }) diff --git a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts index 5141781e..b33c72db 100644 --- a/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts +++ b/packages/components/nodes/llms/HuggingFaceInference/HuggingFaceInference.ts @@ -1,5 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { HuggingFaceInference } from 'langchain/llms/hf' class HuggingFaceInference_LLMs implements INode { label: string @@ -17,7 +18,8 @@ class HuggingFaceInference_LLMs implements INode { this.type = 'HuggingFaceInference' this.icon = 'huggingface.png' this.category = 'LLMs' - this.description = 'Wrapper around OpenAI large language models' + this.description = 'Wrapper around HuggingFace large language models' + this.baseClasses = [this.type, ...getBaseClasses(HuggingFaceInference)] this.inputs = [ { label: 'Model', @@ -42,14 +44,7 @@ class HuggingFaceInference_LLMs implements INode { ] } - async getBaseClasses(): Promise { - const { HuggingFaceInference } = await import('langchain/llms') - return getBaseClasses(HuggingFaceInference) - } - async init(nodeData: INodeData): Promise { - const { HuggingFaceInference } = await import('langchain/llms') - const temperature = nodeData.inputs?.temperature as string const model = nodeData.inputs?.model as string diff --git a/packages/components/nodes/llms/OpenAI/OpenAI.ts b/packages/components/nodes/llms/OpenAI/OpenAI.ts index 7bfa15d8..7ec179ed 100644 --- a/packages/components/nodes/llms/OpenAI/OpenAI.ts +++ b/packages/components/nodes/llms/OpenAI/OpenAI.ts @@ -1,5 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { OpenAI } from 'langchain/llms/openai' class OpenAI_LLMs implements INode { label: string @@ -18,6 +19,7 @@ class OpenAI_LLMs implements INode { this.icon = 'openai.png' this.category = 'LLMs' this.description = 'Wrapper around OpenAI large language models' + this.baseClasses = [this.type, ...getBaseClasses(OpenAI)] this.inputs = [ { label: 'OpenAI Api Key', @@ -59,14 +61,7 @@ class OpenAI_LLMs implements INode { ] } - async getBaseClasses(): Promise { - const { OpenAI } = await import('langchain/llms') - return getBaseClasses(OpenAI) - } - async init(nodeData: INodeData): Promise { - const { OpenAI } = await import('langchain/llms') - const temperature = nodeData.inputs?.temperature as string const modelName = nodeData.inputs?.modelName as string const openAIApiKey = nodeData.inputs?.openAIApiKey as string diff --git a/packages/components/nodes/memory/BufferMemory/BufferMemory.ts b/packages/components/nodes/memory/BufferMemory/BufferMemory.ts index 7a668432..fd635ff4 100644 --- a/packages/components/nodes/memory/BufferMemory/BufferMemory.ts +++ b/packages/components/nodes/memory/BufferMemory/BufferMemory.ts @@ -1,5 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { BufferMemory } from 'langchain/memory' class BufferMemory_Memory implements INode { label: string @@ -17,7 +18,8 @@ class BufferMemory_Memory implements INode { this.type = 'BufferMemory' this.icon = 'memory.svg' this.category = 'Memory' - this.description = 'Perform calculations on response' + this.description = 'Remembers previous conversational back and forths directly' + this.baseClasses = [this.type, ...getBaseClasses(BufferMemory)] this.inputs = [ { label: 'Memory Key', @@ -34,13 +36,7 @@ class BufferMemory_Memory implements INode { ] } - async getBaseClasses(): Promise { - const { BufferMemory } = await import('langchain/memory') - return getBaseClasses(BufferMemory) - } - async init(nodeData: INodeData): Promise { - const { BufferMemory } = await import('langchain/memory') const memoryKey = nodeData.inputs?.memoryKey as string const inputKey = nodeData.inputs?.inputKey as string return new BufferMemory({ diff --git a/packages/components/nodes/prompts/ChatPromptTemplate/ChatPromptTemplate.ts b/packages/components/nodes/prompts/ChatPromptTemplate/ChatPromptTemplate.ts index c5084a55..5bec3ac0 100644 --- a/packages/components/nodes/prompts/ChatPromptTemplate/ChatPromptTemplate.ts +++ b/packages/components/nodes/prompts/ChatPromptTemplate/ChatPromptTemplate.ts @@ -1,5 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate } from 'langchain/prompts' class ChatPromptTemplate_Prompts implements INode { label: string @@ -18,6 +19,7 @@ class ChatPromptTemplate_Prompts implements INode { this.icon = 'prompt.svg' this.category = 'Prompts' this.description = 'Schema to represent a chat prompt' + this.baseClasses = [this.type, ...getBaseClasses(ChatPromptTemplate)] this.inputs = [ { label: 'System Message', @@ -36,13 +38,7 @@ class ChatPromptTemplate_Prompts implements INode { ] } - async getBaseClasses(): Promise { - const { ChatPromptTemplate } = await import('langchain/prompts') - return getBaseClasses(ChatPromptTemplate) - } - async init(nodeData: INodeData): Promise { - const { ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate } = await import('langchain/prompts') const systemMessagePrompt = nodeData.inputs?.systemMessagePrompt as string const humanMessagePrompt = nodeData.inputs?.humanMessagePrompt as string diff --git a/packages/components/nodes/prompts/FewShotPromptTemplate/FewShotPromptTemplate.ts b/packages/components/nodes/prompts/FewShotPromptTemplate/FewShotPromptTemplate.ts index d2c3e1af..f137eedf 100644 --- a/packages/components/nodes/prompts/FewShotPromptTemplate/FewShotPromptTemplate.ts +++ b/packages/components/nodes/prompts/FewShotPromptTemplate/FewShotPromptTemplate.ts @@ -1,5 +1,8 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses, getInputVariables } from '../../../src/utils' +import { FewShotPromptTemplate, FewShotPromptTemplateInput, PromptTemplate } from 'langchain/prompts' +import { Example } from 'langchain/schema' +import { TemplateFormat } from 'langchain/dist/prompts/template' class FewShotPromptTemplate_Prompts implements INode { label: string @@ -18,6 +21,7 @@ class FewShotPromptTemplate_Prompts implements INode { this.icon = 'prompt.svg' this.category = 'Prompts' this.description = 'Prompt template you can build with examples' + this.baseClasses = [this.type, ...getBaseClasses(FewShotPromptTemplate)] this.inputs = [ { label: 'Examples', @@ -32,7 +36,7 @@ class FewShotPromptTemplate_Prompts implements INode { { label: 'Example Prompt', name: 'examplePrompt', - type: 'BasePromptTemplate' + type: 'PromptTemplate' }, { label: 'Prefix', @@ -73,27 +77,19 @@ class FewShotPromptTemplate_Prompts implements INode { ] } - async getBaseClasses(): Promise { - const { FewShotPromptTemplate } = await import('langchain/prompts') - return getBaseClasses(FewShotPromptTemplate) - } - async init(nodeData: INodeData): Promise { - const { FewShotPromptTemplate } = await import('langchain/prompts') - const examplesStr = nodeData.inputs?.examples as string - const prefix = nodeData.inputs?.prefix as string const suffix = nodeData.inputs?.suffix as string const exampleSeparator = nodeData.inputs?.exampleSeparator as string - const templateFormat = nodeData.inputs?.templateFormat - const examplePrompt = nodeData.inputs?.examplePrompt + const templateFormat = nodeData.inputs?.templateFormat as TemplateFormat + const examplePrompt = nodeData.inputs?.examplePrompt as PromptTemplate const inputVariables = getInputVariables(suffix) - const examples = JSON.parse(examplesStr.replace(/\s/g, '')) + const examples: Example[] = JSON.parse(examplesStr.replace(/\s/g, '')) try { - const prompt = new FewShotPromptTemplate({ + const obj: FewShotPromptTemplateInput = { examples, examplePrompt, prefix, @@ -101,7 +97,8 @@ class FewShotPromptTemplate_Prompts implements INode { inputVariables, exampleSeparator, templateFormat - }) + } + const prompt = new FewShotPromptTemplate(obj) return prompt } catch (e) { throw new Error(e) diff --git a/packages/components/nodes/prompts/PromptTemplate/PromptTemplate.ts b/packages/components/nodes/prompts/PromptTemplate/PromptTemplate.ts index 672362a5..50e79255 100644 --- a/packages/components/nodes/prompts/PromptTemplate/PromptTemplate.ts +++ b/packages/components/nodes/prompts/PromptTemplate/PromptTemplate.ts @@ -1,5 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses, getInputVariables } from '../../../src/utils' +import { PromptTemplate, PromptTemplateInput } from 'langchain/prompts' class PromptTemplate_Prompts implements INode { label: string @@ -18,6 +19,7 @@ class PromptTemplate_Prompts implements INode { this.icon = 'prompt.svg' this.category = 'Prompts' this.description = 'Schema to represent a basic prompt for an LLM' + this.baseClasses = [this.type, ...getBaseClasses(PromptTemplate)] this.inputs = [ { label: 'Template', @@ -29,19 +31,12 @@ class PromptTemplate_Prompts implements INode { ] } - async getBaseClasses(): Promise { - const { PromptTemplate } = await import('langchain/prompts') - return getBaseClasses(PromptTemplate) - } - async init(nodeData: INodeData): Promise { - const { PromptTemplate } = await import('langchain/prompts') - const template = nodeData.inputs?.template as string const inputVariables = getInputVariables(template) try { - const options = { + const options: PromptTemplateInput = { template, inputVariables } diff --git a/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts b/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts index d19ba342..d74b2903 100644 --- a/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts +++ b/packages/components/nodes/textsplitters/RecursiveCharacterTextSplitter/RecursiveCharacterTextSplitter.ts @@ -1,5 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { RecursiveCharacterTextSplitter, RecursiveCharacterTextSplitterParams } from 'langchain/text_splitter' class RecursiveCharacterTextSplitter_TextSplitters implements INode { label: string @@ -18,6 +19,7 @@ class RecursiveCharacterTextSplitter_TextSplitters implements INode { this.icon = 'textsplitter.svg' this.category = 'Text Splitters' this.description = `Split documents recursively by different characters - starting with "\n\n", then "\n", then " "` + this.baseClasses = [this.type, ...getBaseClasses(RecursiveCharacterTextSplitter)] this.inputs = [ { label: 'Chunk Size', @@ -35,17 +37,11 @@ class RecursiveCharacterTextSplitter_TextSplitters implements INode { ] } - async getBaseClasses(): Promise { - const { RecursiveCharacterTextSplitter } = await import('langchain/text_splitter') - return getBaseClasses(RecursiveCharacterTextSplitter) - } - async init(nodeData: INodeData): Promise { - const { RecursiveCharacterTextSplitter } = await import('langchain/text_splitter') const chunkSize = nodeData.inputs?.chunkSize as string const chunkOverlap = nodeData.inputs?.chunkOverlap as string - const obj = {} as any + const obj = {} as RecursiveCharacterTextSplitterParams if (chunkSize) obj.chunkSize = parseInt(chunkSize, 10) if (chunkOverlap) obj.chunkOverlap = parseInt(chunkOverlap, 10) diff --git a/packages/components/nodes/tools/Calculator/Calculator.ts b/packages/components/nodes/tools/Calculator/Calculator.ts index 35a304d0..85284f0f 100644 --- a/packages/components/nodes/tools/Calculator/Calculator.ts +++ b/packages/components/nodes/tools/Calculator/Calculator.ts @@ -1,7 +1,8 @@ import { INode } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { Calculator } from 'langchain/tools/calculator' -class Calculator implements INode { +class Calculator_Tools implements INode { label: string name: string description: string @@ -17,17 +18,12 @@ class Calculator implements INode { this.icon = 'calculator.svg' this.category = 'Tools' this.description = 'Perform calculations on response' - } - - async getBaseClasses(): Promise { - const { Calculator } = await import('langchain/tools') - return getBaseClasses(Calculator) + this.baseClasses = [this.type, ...getBaseClasses(Calculator)] } async init(): Promise { - const { Calculator } = await import('langchain/tools') return new Calculator() } } -module.exports = { nodeClass: Calculator } +module.exports = { nodeClass: Calculator_Tools } diff --git a/packages/components/nodes/tools/RequestsGet/RequestsGet.ts b/packages/components/nodes/tools/RequestsGet/RequestsGet.ts new file mode 100644 index 00000000..4df64720 --- /dev/null +++ b/packages/components/nodes/tools/RequestsGet/RequestsGet.ts @@ -0,0 +1,29 @@ +import { INode } from '../../../src/Interface' +import { getBaseClasses } from '../../../src/utils' +import { RequestsGetTool } from 'langchain/tools' + +class RequestsGet_Tools implements INode { + label: string + name: string + description: string + type: string + icon: string + category: string + baseClasses: string[] + + constructor() { + this.label = 'Requests Get' + this.name = 'requestsGet' + this.type = 'RequestsGet' + this.icon = 'requestsget.svg' + this.category = 'Tools' + this.description = 'Execute HTTP GET requests' + this.baseClasses = [this.type, ...getBaseClasses(RequestsGetTool)] + } + + async init(): Promise { + return new RequestsGetTool() + } +} + +module.exports = { nodeClass: RequestsGet_Tools } diff --git a/packages/components/nodes/tools/RequestsGet/requestsget.svg b/packages/components/nodes/tools/RequestsGet/requestsget.svg new file mode 100644 index 00000000..03777e7c --- /dev/null +++ b/packages/components/nodes/tools/RequestsGet/requestsget.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/components/nodes/tools/RequestsPost/RequestsPost.ts b/packages/components/nodes/tools/RequestsPost/RequestsPost.ts new file mode 100644 index 00000000..6efaf208 --- /dev/null +++ b/packages/components/nodes/tools/RequestsPost/RequestsPost.ts @@ -0,0 +1,29 @@ +import { INode } from '../../../src/Interface' +import { getBaseClasses } from '../../../src/utils' +import { RequestsPostTool } from 'langchain/tools' + +class RequestsPost_Tools implements INode { + label: string + name: string + description: string + type: string + icon: string + category: string + baseClasses: string[] + + constructor() { + this.label = 'Requests Post' + this.name = 'requestsPost' + this.type = 'RequestsPost' + this.icon = 'requestspost.svg' + this.category = 'Tools' + this.description = 'Execute HTTP POST requests' + this.baseClasses = [this.type, ...getBaseClasses(RequestsPostTool)] + } + + async init(): Promise { + return new RequestsPostTool() + } +} + +module.exports = { nodeClass: RequestsPost_Tools } diff --git a/packages/components/nodes/tools/RequestsPost/requestspost.svg b/packages/components/nodes/tools/RequestsPost/requestspost.svg new file mode 100644 index 00000000..2bea6e96 --- /dev/null +++ b/packages/components/nodes/tools/RequestsPost/requestspost.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/components/nodes/tools/SerpAPI/SerpAPI.ts b/packages/components/nodes/tools/SerpAPI/SerpAPI.ts index ea58b5a4..69432408 100644 --- a/packages/components/nodes/tools/SerpAPI/SerpAPI.ts +++ b/packages/components/nodes/tools/SerpAPI/SerpAPI.ts @@ -1,7 +1,8 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' +import { SerpAPI } from 'langchain/tools' -class SerpAPI implements INode { +class SerpAPI_Tools implements INode { label: string name: string description: string @@ -25,18 +26,13 @@ class SerpAPI implements INode { type: 'password' } ] - } - - async getBaseClasses(): Promise { - const { SerpAPI } = await import('langchain/tools') - return getBaseClasses(SerpAPI) + this.baseClasses = [this.type, ...getBaseClasses(SerpAPI)] } async init(nodeData: INodeData): Promise { - const { SerpAPI } = await import('langchain/tools') const apiKey = nodeData.inputs?.apiKey as string return new SerpAPI(apiKey) } } -module.exports = { nodeClass: SerpAPI } +module.exports = { nodeClass: SerpAPI_Tools } diff --git a/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts b/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts index c8fd81af..ee520092 100644 --- a/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts +++ b/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts @@ -1,4 +1,7 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { Chroma } from 'langchain/vectorstores/chroma' +import { Embeddings } from 'langchain/embeddings/base' +import { getBaseClasses } from '../../../src/utils' class Chroma_Existing_VectorStores implements INode { label: string @@ -17,6 +20,7 @@ class Chroma_Existing_VectorStores implements INode { this.icon = 'chroma.svg' this.category = 'Vector Stores' this.description = 'Load existing index from Chroma (i.e: Document has been upserted)' + this.baseClasses = [this.type, ...getBaseClasses(Chroma)] this.inputs = [ { label: 'Embeddings', @@ -31,15 +35,9 @@ class Chroma_Existing_VectorStores implements INode { ] } - async getBaseClasses(): Promise { - return ['BaseRetriever'] - } - async init(nodeData: INodeData): Promise { - const { Chroma } = await import('langchain/vectorstores') - const collectionName = nodeData.inputs?.collectionName as string - const embeddings = nodeData.inputs?.embeddings + const embeddings = nodeData.inputs?.embeddings as Embeddings const vectorStore = await Chroma.fromExistingCollection(embeddings, { collectionName diff --git a/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts b/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts index 8b039bd2..015bc628 100644 --- a/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts +++ b/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts @@ -1,4 +1,8 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { Chroma } from 'langchain/vectorstores/chroma' +import { Embeddings } from 'langchain/embeddings/base' +import { Document } from 'langchain/document' +import { getBaseClasses } from '../../../src/utils' class ChromaUpsert_VectorStores implements INode { label: string @@ -17,6 +21,7 @@ class ChromaUpsert_VectorStores implements INode { this.icon = 'chroma.svg' this.category = 'Vector Stores' this.description = 'Upsert documents to Chroma' + this.baseClasses = [this.type, ...getBaseClasses(Chroma)] this.inputs = [ { label: 'Document', @@ -36,28 +41,20 @@ class ChromaUpsert_VectorStores implements INode { ] } - async getBaseClasses(): Promise { - return ['BaseRetriever'] - } - async init(nodeData: INodeData): Promise { - const { Chroma } = await import('langchain/vectorstores') - const { Document } = await import('langchain/document') - const collectionName = nodeData.inputs?.collectionName as string - const docs = nodeData.inputs?.document - const embeddings = nodeData.inputs?.embeddings + const docs = nodeData.inputs?.document as Document[] + const embeddings = nodeData.inputs?.embeddings as Embeddings const finalDocs = [] for (let i = 0; i < docs.length; i += 1) { finalDocs.push(new Document(docs[i])) } - const result = await Chroma.fromDocuments(finalDocs, embeddings, { + const vectorStore = await Chroma.fromDocuments(finalDocs, embeddings, { collectionName }) - - const retriever = result.asRetriever() + const retriever = vectorStore.asRetriever() return retriever } } diff --git a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts index 2d4f459d..d588a127 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts @@ -1,5 +1,8 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { PineconeClient } from '@pinecone-database/pinecone' +import { PineconeStore } from 'langchain/vectorstores/pinecone' +import { Embeddings } from 'langchain/embeddings/base' +import { getBaseClasses } from '../../../src/utils' class Pinecone_Existing_VectorStores implements INode { label: string @@ -18,6 +21,7 @@ class Pinecone_Existing_VectorStores implements INode { this.icon = 'pinecone.png' this.category = 'Vector Stores' this.description = 'Load existing index from Pinecone (i.e: Document has been upserted)' + this.baseClasses = [this.type, ...getBaseClasses(PineconeStore)] this.inputs = [ { label: 'Embeddings', @@ -42,17 +46,11 @@ class Pinecone_Existing_VectorStores implements INode { ] } - async getBaseClasses(): Promise { - return ['BaseRetriever'] - } - async init(nodeData: INodeData): Promise { - const { PineconeStore } = await import('langchain/vectorstores') - const pineconeApiKey = nodeData.inputs?.pineconeApiKey as string const pineconeEnv = nodeData.inputs?.pineconeEnv as string const index = nodeData.inputs?.pineconeIndex as string - const embeddings = nodeData.inputs?.embeddings + const embeddings = nodeData.inputs?.embeddings as Embeddings 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 14921ac2..cb9c4af7 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts @@ -1,5 +1,9 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { PineconeClient } from '@pinecone-database/pinecone' +import { PineconeStore } from 'langchain/vectorstores/pinecone' +import { Embeddings } from 'langchain/embeddings/base' +import { Document } from 'langchain/document' +import { getBaseClasses } from '../../../src/utils' class PineconeUpsert_VectorStores implements INode { label: string @@ -18,6 +22,7 @@ class PineconeUpsert_VectorStores implements INode { this.icon = 'pinecone.png' this.category = 'Vector Stores' this.description = 'Upsert documents to Pinecone' + this.baseClasses = [this.type, ...getBaseClasses(PineconeStore)] this.inputs = [ { label: 'Document', @@ -47,19 +52,12 @@ class PineconeUpsert_VectorStores implements INode { ] } - async getBaseClasses(): Promise { - return ['BaseRetriever'] - } - async init(nodeData: INodeData): Promise { - const { PineconeStore } = await import('langchain/vectorstores') - const { Document } = await import('langchain/document') - const pineconeApiKey = nodeData.inputs?.pineconeApiKey as string const pineconeEnv = nodeData.inputs?.pineconeEnv as string const index = nodeData.inputs?.pineconeIndex as string - const docs = nodeData.inputs?.document - const embeddings = nodeData.inputs?.embeddings + const docs = nodeData.inputs?.document as Document[] + const embeddings = nodeData.inputs?.embeddings as Embeddings const client = new PineconeClient() await client.init({ @@ -74,11 +72,10 @@ class PineconeUpsert_VectorStores implements INode { finalDocs.push(new Document(docs[i])) } - const result = await PineconeStore.fromDocuments(finalDocs, embeddings, { + const vectorStore = await PineconeStore.fromDocuments(finalDocs, embeddings, { pineconeIndex }) - - const retriever = result.asRetriever() + const retriever = vectorStore.asRetriever() return retriever } } diff --git a/packages/components/package.json b/packages/components/package.json index 0a211553..84c2b9a2 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -24,7 +24,7 @@ "dotenv": "^16.0.0", "express": "^4.17.3", "form-data": "^4.0.0", - "langchain": "^0.0.44", + "langchain": "^0.0.53", "moment": "^2.29.3", "node-fetch": "2", "pdfjs-dist": "^3.5.141", diff --git a/packages/components/src/Interface.ts b/packages/components/src/Interface.ts index 7e4159ed..2de18d5c 100644 --- a/packages/components/src/Interface.ts +++ b/packages/components/src/Interface.ts @@ -75,7 +75,6 @@ export interface INodeProperties { export interface INode extends INodeProperties { inputs?: INodeParams[] - getBaseClasses?(): Promise getInstance?(nodeData: INodeData): Promise run?(nodeData: INodeData, input: string, options?: ICommonObject): Promise } diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json index 96e7c60a..2002d62f 100644 --- a/packages/components/tsconfig.json +++ b/packages/components/tsconfig.json @@ -14,8 +14,7 @@ "strictPropertyInitialization": false, "useUnknownInCatchVariables": false, "declaration": true, - "module": "commonjs", - "moduleResolution": "node16" + "module": "commonjs" }, "include": ["src", "nodes"] } diff --git a/packages/server/marketplaces/Antonym.json b/packages/server/marketplaces/Antonym.json index 260db7bf..c91161fc 100644 --- a/packages/server/marketplaces/Antonym.json +++ b/packages/server/marketplaces/Antonym.json @@ -3,11 +3,58 @@ "nodes": [ { "width": 300, - "height": 885, + "height": 360, + "id": "promptTemplate_0", + "position": { + "x": 294.38456937448433, + "y": 66.5400435451831 + }, + "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": 5, + "placeholder": "What is a good name for a company that makes {product}?" + } + ], + "inputAnchors": [], + "inputs": { + "template": "Word: {word}\\nAntonym: {antonym}\\n" + }, + "outputAnchors": [ + { + "id": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", + "name": "promptTemplate", + "label": "PromptTemplate", + "type": "PromptTemplate | BaseStringPromptTemplate | BasePromptTemplate" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 294.38456937448433, + "y": 66.5400435451831 + }, + "dragging": false + }, + { + "width": 300, + "height": 886, "id": "fewShotPromptTemplate_0", "position": { - "x": 495.78246013667433, - "y": 168.3684510250569 + "x": 719.2200337843097, + "y": 67.20405755860693 }, "type": "customNode", "data": { @@ -15,7 +62,7 @@ "label": "Few Shot Prompt Template", "name": "fewShotPromptTemplate", "type": "FewShotPromptTemplate", - "baseClasses": ["BaseStringPromptTemplate", "BasePromptTemplate"], + "baseClasses": ["FewShotPromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], "category": "Prompts", "description": "Prompt template you can build with examples", "inputParams": [ @@ -24,7 +71,7 @@ "name": "examples", "type": "string", "rows": 5, - "placeholder": "[\n { word: \"happy\", antonym: \"sad\" },\n { word: \"tall\", antonym: \"short\" },\n]" + "placeholder": "[\n { \"word\": \"happy\", \"antonym\": \"sad\" },\n { \"word\": \"tall\", \"antonym\": \"short\" },\n]" }, { "label": "Prefix", @@ -67,12 +114,12 @@ { "label": "Example Prompt", "name": "examplePrompt", - "type": "BasePromptTemplate", - "id": "fewShotPromptTemplate_0-input-examplePrompt-BasePromptTemplate" + "type": "PromptTemplate", + "id": "fewShotPromptTemplate_0-input-examplePrompt-PromptTemplate" } ], "inputs": { - "examples": "[\n { \"word\": \"happy\", \"antonym\": \"sad\" },\n { \"word\": \"tall\", \"antonym\": \"short\" }\n]", + "examples": "[\n { \"word\": \"happy\", \"antonym\": \"sad\" },\n { \"word\": \"tall\", \"antonym\": \"short\" }\n]", "examplePrompt": "{{promptTemplate_0.data.instance}}", "prefix": "Give the antonym of every input", "suffix": "Word: {input}\\nAntonym:", @@ -81,128 +128,28 @@ }, "outputAnchors": [ { - "id": "fewShotPromptTemplate_0-output-fewShotPromptTemplate-BaseStringPromptTemplate|BasePromptTemplate", + "id": "fewShotPromptTemplate_0-output-fewShotPromptTemplate-FewShotPromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", "name": "fewShotPromptTemplate", "label": "FewShotPromptTemplate", - "type": "BaseStringPromptTemplate | BasePromptTemplate" + "type": "FewShotPromptTemplate | BaseStringPromptTemplate | BasePromptTemplate" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 495.78246013667433, - "y": 168.3684510250569 + "x": 719.2200337843097, + "y": 67.20405755860693 }, "dragging": false }, { "width": 300, - "height": 359, - "id": "promptTemplate_0", - "position": { - "x": 13.229214123006699, - "y": 171.79555808656028 - }, - "type": "customNode", - "data": { - "id": "promptTemplate_0", - "label": "Prompt Template", - "name": "promptTemplate", - "type": "PromptTemplate", - "baseClasses": ["BaseStringPromptTemplate", "BasePromptTemplate"], - "category": "Prompts", - "description": "Schema to represent a basic prompt for an LLM", - "inputParams": [ - { - "label": "Template", - "name": "template", - "type": "string", - "rows": 5, - "placeholder": "What is a good name for a company that makes {product}?" - } - ], - "inputAnchors": [], - "inputs": { - "template": "Word: {word}\\nAntonym: {antonym}\\n" - }, - "outputAnchors": [ - { - "id": "promptTemplate_0-output-promptTemplate-BaseStringPromptTemplate|BasePromptTemplate", - "name": "promptTemplate", - "label": "PromptTemplate", - "type": "BaseStringPromptTemplate | BasePromptTemplate" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 13.229214123006699, - "y": 171.79555808656028 - }, - "dragging": false - }, - { - "width": 300, - "height": 279, - "id": "llmChain_0", - "position": { - "x": 1237.4411644942688, - "y": 508.82448993622904 - }, - "type": "customNode", - "data": { - "id": "llmChain_0", - "label": "LLM Chain", - "name": "llmChain", - "type": "LLMChain", - "baseClasses": ["BaseChain"], - "category": "Chains", - "description": "Chain to run queries against LLMs", - "inputParams": [], - "inputAnchors": [ - { - "label": "LLM", - "name": "llm", - "type": "BaseLanguageModel", - "id": "llmChain_0-input-llm-BaseLanguageModel" - }, - { - "label": "Prompt", - "name": "prompt", - "type": "BasePromptTemplate", - "id": "llmChain_0-input-prompt-BasePromptTemplate" - } - ], - "inputs": { - "llm": "{{openAI_0.data.instance}}", - "prompt": "{{fewShotPromptTemplate_0.data.instance}}" - }, - "outputAnchors": [ - { - "id": "llmChain_0-output-llmChain-BaseChain", - "name": "llmChain", - "label": "LLMChain", - "type": "BaseChain" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1237.4411644942688, - "y": 508.82448993622904 - }, - "dragging": false - }, - { - "width": 300, - "height": 471, + "height": 472, "id": "openAI_0", "position": { - "x": 859.220671981777, - "y": 166.25170842824588 + "x": 1089.6434062122398, + "y": 27.515288538129425 }, "type": "customNode", "data": { @@ -210,7 +157,7 @@ "label": "OpenAI", "name": "openAI", "type": "OpenAI", - "baseClasses": ["BaseLLM", "BaseLanguageModel"], + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", "description": "Wrapper around OpenAI large language models", "inputParams": [ @@ -259,18 +206,81 @@ }, "outputAnchors": [ { - "id": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", + "id": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "name": "openAI", "label": "OpenAI", - "type": "BaseLLM | BaseLanguageModel" + "type": "OpenAI | BaseLLM | BaseLanguageModel" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 859.220671981777, - "y": 166.25170842824588 + "x": 1089.6434062122398, + "y": 27.515288538129425 + }, + "dragging": false + }, + { + "width": 300, + "height": 461, + "id": "llmChain_0", + "position": { + "x": 1499.2654451385026, + "y": 356.3275374721362 + }, + "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": "Format Prompt Values", + "name": "promptValues", + "type": "string", + "rows": 5, + "placeholder": "{\n \"input_language\": \"English\",\n \"output_language\": \"French\"\n}", + "optional": true + } + ], + "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_0.data.instance}}", + "prompt": "{{fewShotPromptTemplate_0.data.instance}}", + "promptValues": "" + }, + "outputAnchors": [ + { + "id": "llmChain_0-output-llmChain-LLMChain|BaseChain", + "name": "llmChain", + "label": "LLMChain", + "type": "LLMChain | BaseChain" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1499.2654451385026, + "y": 356.3275374721362 }, "dragging": false } @@ -278,33 +288,33 @@ "edges": [ { "source": "promptTemplate_0", - "sourceHandle": "promptTemplate_0-output-promptTemplate-BaseStringPromptTemplate|BasePromptTemplate", + "sourceHandle": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", "target": "fewShotPromptTemplate_0", - "targetHandle": "fewShotPromptTemplate_0-input-examplePrompt-BasePromptTemplate", + "targetHandle": "fewShotPromptTemplate_0-input-examplePrompt-PromptTemplate", "type": "buttonedge", - "id": "promptTemplate_0-promptTemplate_0-output-promptTemplate-BaseStringPromptTemplate|BasePromptTemplate-fewShotPromptTemplate_0-fewShotPromptTemplate_0-input-examplePrompt-BasePromptTemplate", - "data": { - "label": "" - } - }, - { - "source": "fewShotPromptTemplate_0", - "sourceHandle": "fewShotPromptTemplate_0-output-fewShotPromptTemplate-BaseStringPromptTemplate|BasePromptTemplate", - "target": "llmChain_0", - "targetHandle": "llmChain_0-input-prompt-BasePromptTemplate", - "type": "buttonedge", - "id": "fewShotPromptTemplate_0-fewShotPromptTemplate_0-output-fewShotPromptTemplate-BaseStringPromptTemplate|BasePromptTemplate-llmChain_0-llmChain_0-input-prompt-BasePromptTemplate", + "id": "promptTemplate_0-promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate-fewShotPromptTemplate_0-fewShotPromptTemplate_0-input-examplePrompt-PromptTemplate", "data": { "label": "" } }, { "source": "openAI_0", - "sourceHandle": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", + "sourceHandle": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "target": "llmChain_0", - "targetHandle": "llmChain_0-input-llm-BaseLanguageModel", + "targetHandle": "llmChain_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "openAI_0-openAI_0-output-openAI-BaseLLM|BaseLanguageModel-llmChain_0-llmChain_0-input-llm-BaseLanguageModel", + "id": "openAI_0-openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-llmChain_0-llmChain_0-input-model-BaseLanguageModel", + "data": { + "label": "" + } + }, + { + "source": "fewShotPromptTemplate_0", + "sourceHandle": "fewShotPromptTemplate_0-output-fewShotPromptTemplate-FewShotPromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", + "target": "llmChain_0", + "targetHandle": "llmChain_0-input-prompt-BasePromptTemplate", + "type": "buttonedge", + "id": "fewShotPromptTemplate_0-fewShotPromptTemplate_0-output-fewShotPromptTemplate-FewShotPromptTemplate|BaseStringPromptTemplate|BasePromptTemplate-llmChain_0-llmChain_0-input-prompt-BasePromptTemplate", "data": { "label": "" } diff --git a/packages/server/marketplaces/Conversational Agent.json b/packages/server/marketplaces/Conversational Agent.json index e65d6681..ab0af4bc 100644 --- a/packages/server/marketplaces/Conversational Agent.json +++ b/packages/server/marketplaces/Conversational Agent.json @@ -3,11 +3,11 @@ "nodes": [ { "width": 300, - "height": 277, + "height": 278, "id": "serpAPI_0", "position": { - "x": 738.3791942291381, - "y": 61.26790912730354 + "x": 509.0449726750261, + "y": 40.29354052812607 }, "type": "customNode", "data": { @@ -15,7 +15,7 @@ "label": "Serp API", "name": "serpAPI", "type": "SerpAPI", - "baseClasses": ["Tool"], + "baseClasses": ["SerpAPI", "Tool"], "category": "Tools", "description": "Wrapper around SerpAPI - a real-time API to access Google search results", "inputParams": [ @@ -29,28 +29,28 @@ "inputs": {}, "outputAnchors": [ { - "id": "serpAPI_0-output-serpAPI-Tool", + "id": "serpAPI_0-output-serpAPI-SerpAPI|Tool", "name": "serpAPI", "label": "SerpAPI", - "type": "Tool" + "type": "SerpAPI | Tool" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 738.3791942291381, - "y": 61.26790912730354 + "x": 509.0449726750261, + "y": 40.29354052812607 }, "dragging": false }, { "width": 300, - "height": 142, + "height": 143, "id": "calculator_0", "position": { - "x": 1088.946090950564, - "y": 63.99579982092973 + "x": 877.5497970197198, + "y": 59.162476101133734 }, "type": "customNode", "data": { @@ -58,7 +58,7 @@ "label": "Calculator", "name": "calculator", "type": "Calculator", - "baseClasses": ["Tool"], + "baseClasses": ["Calculator", "Tool"], "category": "Tools", "description": "Perform calculations on response", "inputParams": [], @@ -66,28 +66,28 @@ "inputs": {}, "outputAnchors": [ { - "id": "calculator_0-output-calculator-Tool", + "id": "calculator_0-output-calculator-Calculator|Tool", "name": "calculator", "label": "Calculator", - "type": "Tool" + "type": "Calculator | Tool" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 1088.946090950564, - "y": 63.99579982092973 + "x": 877.5497970197198, + "y": 59.162476101133734 }, "dragging": false }, { "width": 300, - "height": 471, + "height": 472, "id": "chatOpenAI_0", "position": { - "x": 741.0274881835038, - "y": 365.0891876953251 + "x": 451.9774324962526, + "y": 370.86893557300755 }, "type": "customNode", "data": { @@ -95,7 +95,7 @@ "label": "ChatOpenAI", "name": "chatOpenAI", "type": "ChatOpenAI", - "baseClasses": ["BaseChatModel", "BaseLanguageModel"], + "baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel"], "category": "Chat Models", "description": "Wrapper around OpenAI large language models that use the Chat endpoint", "inputParams": [ @@ -109,6 +109,18 @@ "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-3.5-turbo", "name": "gpt-3.5-turbo" @@ -136,18 +148,18 @@ }, "outputAnchors": [ { - "id": "chatOpenAI_0-output-chatOpenAI-BaseChatModel|BaseLanguageModel", + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "name": "chatOpenAI", "label": "ChatOpenAI", - "type": "BaseChatModel | BaseLanguageModel" + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 741.0274881835038, - "y": 365.0891876953251 + "x": 451.9774324962526, + "y": 370.86893557300755 }, "dragging": false }, @@ -156,8 +168,8 @@ "height": 376, "id": "bufferMemory_0", "position": { - "x": 753.3628847860326, - "y": 864.8446075184364 + "x": 823.1867811443266, + "y": 704.7589374803455 }, "type": "customNode", "data": { @@ -165,7 +177,7 @@ "label": "Buffer Memory", "name": "bufferMemory", "type": "BufferMemory", - "baseClasses": ["BaseChatMemory", "BaseMemory"], + "baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"], "category": "Memory", "description": "Perform calculations on response", "inputParams": [ @@ -189,28 +201,28 @@ }, "outputAnchors": [ { - "id": "bufferMemory_0-output-bufferMemory-BaseChatMemory|BaseMemory", + "id": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory", "name": "bufferMemory", "label": "BufferMemory", - "type": "BaseChatMemory | BaseMemory" + "type": "BufferMemory | BaseChatMemory | BaseMemory" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 753.3628847860326, - "y": 864.8446075184364 + "x": 823.1867811443266, + "y": 704.7589374803455 }, "dragging": false }, { "width": 300, - "height": 330, + "height": 331, "id": "conversationalAgent_0", "position": { - "x": 1487.0651648211865, - "y": 497.1658250180486 + "x": 1257.706443811743, + "y": 335.10277854416955 }, "type": "customNode", "data": { @@ -218,7 +230,7 @@ "label": "Conversational Agent", "name": "conversationalAgent", "type": "AgentExecutor", - "baseClasses": ["AgentExecutor"], + "baseClasses": ["AgentExecutor", "BaseChain"], "category": "Agents", "description": "Conversational agent for a chat model. It will utilize chat specific prompts", "inputParams": [], @@ -250,18 +262,18 @@ }, "outputAnchors": [ { - "id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor", + "id": "conversationalAgent_0-output-conversationalAgent-AgentExecutor|BaseChain", "name": "conversationalAgent", "label": "AgentExecutor", - "type": "AgentExecutor" + "type": "AgentExecutor | BaseChain" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 1487.0651648211865, - "y": 497.1658250180486 + "x": 1257.706443811743, + "y": 335.10277854416955 }, "dragging": false } @@ -269,44 +281,44 @@ "edges": [ { "source": "calculator_0", - "sourceHandle": "calculator_0-output-calculator-Tool", + "sourceHandle": "calculator_0-output-calculator-Calculator|Tool", "target": "conversationalAgent_0", "targetHandle": "conversationalAgent_0-input-tools-Tool", "type": "buttonedge", - "id": "calculator_0-calculator_0-output-calculator-Tool-conversationalAgent_0-conversationalAgent_0-input-tools-Tool", + "id": "calculator_0-calculator_0-output-calculator-Calculator|Tool-conversationalAgent_0-conversationalAgent_0-input-tools-Tool", "data": { "label": "" } }, { "source": "serpAPI_0", - "sourceHandle": "serpAPI_0-output-serpAPI-Tool", + "sourceHandle": "serpAPI_0-output-serpAPI-SerpAPI|Tool", "target": "conversationalAgent_0", "targetHandle": "conversationalAgent_0-input-tools-Tool", "type": "buttonedge", - "id": "serpAPI_0-serpAPI_0-output-serpAPI-Tool-conversationalAgent_0-conversationalAgent_0-input-tools-Tool", + "id": "serpAPI_0-serpAPI_0-output-serpAPI-SerpAPI|Tool-conversationalAgent_0-conversationalAgent_0-input-tools-Tool", "data": { "label": "" } }, { "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-BaseChatModel|BaseLanguageModel", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "conversationalAgent_0", "targetHandle": "conversationalAgent_0-input-model-BaseChatModel", "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseChatModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-conversationalAgent_0-conversationalAgent_0-input-model-BaseChatModel", "data": { "label": "" } }, { "source": "bufferMemory_0", - "sourceHandle": "bufferMemory_0-output-bufferMemory-BaseChatMemory|BaseMemory", + "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-BaseChatMemory|BaseMemory-conversationalAgent_0-conversationalAgent_0-input-memory-BaseChatMemory", + "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/Conversational Retrieval QA Chain.json b/packages/server/marketplaces/Conversational Retrieval QA Chain.json index 015a8a05..082c53f6 100644 --- a/packages/server/marketplaces/Conversational Retrieval QA Chain.json +++ b/packages/server/marketplaces/Conversational Retrieval QA Chain.json @@ -6,8 +6,8 @@ "height": 376, "id": "recursiveCharacterTextSplitter_0", "position": { - "x": 542.7867965644035, - "y": 239.47308806541884 + "x": 483.2031495359837, + "y": 208.70988551611597 }, "type": "customNode", "data": { @@ -15,7 +15,7 @@ "label": "Recursive Character Text Splitter", "name": "recursiveCharacterTextSplitter", "type": "RecursiveCharacterTextSplitter", - "baseClasses": ["TextSplitter"], + "baseClasses": ["RecursiveCharacterTextSplitter", "TextSplitter"], "category": "Text Splitters", "description": "Split documents recursively by different characters - starting with \"\n\n\", then \"\n\", then \" \"", "inputParams": [ @@ -40,35 +40,35 @@ }, "outputAnchors": [ { - "id": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-TextSplitter", + "id": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter", "name": "recursiveCharacterTextSplitter", "label": "RecursiveCharacterTextSplitter", - "type": "TextSplitter" + "type": "RecursiveCharacterTextSplitter | TextSplitter" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 542.7867965644035, - "y": 239.47308806541884 + "x": 483.2031495359837, + "y": 208.70988551611597 }, "dragging": false }, { "width": 300, - "height": 358, + "height": 359, "id": "textFile_0", "position": { - "x": 928.3774169979697, - "y": 473.8284271247462 + "x": 858.2160149124683, + "y": 215.870325304158 }, "type": "customNode", "data": { "id": "textFile_0", "label": "Text File", "name": "textFile", - "type": "Text", + "type": "Document", "baseClasses": ["Document"], "category": "Document Loaders", "description": "Load data from text files", @@ -96,7 +96,7 @@ { "id": "textFile_0-output-textFile-Document", "name": "textFile", - "label": "Text", + "label": "Document", "type": "Document" } ], @@ -104,61 +104,18 @@ }, "selected": false, "positionAbsolute": { - "x": 928.3774169979697, - "y": 473.8284271247462 + "x": 858.2160149124683, + "y": 215.870325304158 }, "dragging": false }, { "width": 300, - "height": 277, - "id": "openAIEmbeddings_0", - "position": { - "x": 924.7825209307788, - "y": 870.671152679558 - }, - "type": "customNode", - "data": { - "id": "openAIEmbeddings_0", - "label": "OpenAI Embeddings", - "name": "openAIEmbeddings", - "type": "OpenAIEmbeddings", - "baseClasses": ["Embeddings"], - "category": "Embeddings", - "description": "OpenAI API to generate embeddings for a given text", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password" - } - ], - "inputAnchors": [], - "inputs": {}, - "outputAnchors": [ - { - "id": "openAIEmbeddings_0-output-openAIEmbeddings-Embeddings", - "name": "openAIEmbeddings", - "label": "OpenAIEmbeddings", - "type": "Embeddings" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 924.7825209307788, - "y": 870.671152679558 - }, - "dragging": false - }, - { - "width": 300, - "height": 471, + "height": 472, "id": "openAI_0", "position": { - "x": 1296.7206878349027, - "y": 167.80701218012993 + "x": 1207.112878089014, + "y": 19.892224585997383 }, "type": "customNode", "data": { @@ -166,7 +123,7 @@ "label": "OpenAI", "name": "openAI", "type": "OpenAI", - "baseClasses": ["BaseLLM", "BaseLanguageModel"], + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", "description": "Wrapper around OpenAI large language models", "inputParams": [ @@ -215,28 +172,71 @@ }, "outputAnchors": [ { - "id": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", + "id": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "name": "openAI", "label": "OpenAI", - "type": "BaseLLM | BaseLanguageModel" + "type": "OpenAI | BaseLLM | BaseLanguageModel" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 1296.7206878349027, - "y": 167.80701218012993 + "x": 1207.112878089014, + "y": 19.892224585997383 }, "dragging": false }, { "width": 300, - "height": 576, + "height": 278, + "id": "openAIEmbeddings_0", + "position": { + "x": 758.2670802362803, + "y": 635.7886850619154 + }, + "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" + } + ], + "inputAnchors": [], + "inputs": {}, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 758.2670802362803, + "y": 635.7886850619154 + }, + "dragging": false + }, + { + "width": 300, + "height": 577, "id": "pineconeUpsert_0", "position": { - "x": 1293.8922607101565, - "y": 692.4802438205481 + "x": 1212.220130988712, + "y": 526.8130243230098 }, "type": "customNode", "data": { @@ -296,18 +296,18 @@ }, "selected": false, "positionAbsolute": { - "x": 1293.8922607101565, - "y": 692.4802438205481 + "x": 1212.220130988712, + "y": 526.8130243230098 }, "dragging": false }, { "width": 300, - "height": 279, + "height": 280, "id": "conversationalRetrievalQAChain_0", "position": { - "x": 1742.1979599824272, - "y": 607.6274300781624 + "x": 1608.0332939239609, + "y": 410.3973881655837 }, "type": "customNode", "data": { @@ -315,7 +315,7 @@ "label": "Conversational Retrieval QA Chain", "name": "conversationalRetrievalQAChain", "type": "ConversationalRetrievalQAChain", - "baseClasses": ["BaseChain"], + "baseClasses": ["ConversationalRetrievalQAChain", "BaseChain"], "category": "Chains", "description": "Document QA - built on RetrievalQAChain to provide a chat history component", "inputParams": [], @@ -323,8 +323,8 @@ { "label": "LLM", "name": "llm", - "type": "BaseLanguageModel", - "id": "conversationalRetrievalQAChain_0-input-llm-BaseLanguageModel" + "type": "BaseLLM", + "id": "conversationalRetrievalQAChain_0-input-llm-BaseLLM" }, { "label": "Vector Store Retriever", @@ -339,18 +339,18 @@ }, "outputAnchors": [ { - "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-BaseChain", + "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-ConversationalRetrievalQAChain|BaseChain", "name": "conversationalRetrievalQAChain", "label": "ConversationalRetrievalQAChain", - "type": "BaseChain" + "type": "ConversationalRetrievalQAChain | BaseChain" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 1742.1979599824272, - "y": 607.6274300781624 + "x": 1608.0332939239609, + "y": 410.3973881655837 }, "dragging": false } @@ -358,33 +358,11 @@ "edges": [ { "source": "recursiveCharacterTextSplitter_0", - "sourceHandle": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-TextSplitter", + "sourceHandle": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter", "target": "textFile_0", "targetHandle": "textFile_0-input-textSplitter-TextSplitter", "type": "buttonedge", - "id": "recursiveCharacterTextSplitter_0-recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-TextSplitter-textFile_0-textFile_0-input-textSplitter-TextSplitter", - "data": { - "label": "" - } - }, - { - "source": "openAI_0", - "sourceHandle": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", - "target": "conversationalRetrievalQAChain_0", - "targetHandle": "conversationalRetrievalQAChain_0-input-llm-BaseLanguageModel", - "type": "buttonedge", - "id": "openAI_0-openAI_0-output-openAI-BaseLLM|BaseLanguageModel-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-llm-BaseLanguageModel", - "data": { - "label": "" - } - }, - { - "source": "pineconeUpsert_0", - "sourceHandle": "pineconeUpsert_0-output-pineconeUpsert-BaseRetriever", - "target": "conversationalRetrievalQAChain_0", - "targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", - "type": "buttonedge", - "id": "pineconeUpsert_0-pineconeUpsert_0-output-pineconeUpsert-BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "id": "recursiveCharacterTextSplitter_0-recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter-textFile_0-textFile_0-input-textSplitter-TextSplitter", "data": { "label": "" } @@ -402,11 +380,33 @@ }, { "source": "openAIEmbeddings_0", - "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-Embeddings", + "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-Embeddings-pineconeUpsert_0-pineconeUpsert_0-input-embeddings-Embeddings", + "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-pineconeUpsert_0-pineconeUpsert_0-input-embeddings-Embeddings", + "data": { + "label": "" + } + }, + { + "source": "openAI_0", + "sourceHandle": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "target": "conversationalRetrievalQAChain_0", + "targetHandle": "conversationalRetrievalQAChain_0-input-llm-BaseLLM", + "type": "buttonedge", + "id": "openAI_0-openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-llm-BaseLLM", + "data": { + "label": "" + } + }, + { + "source": "pineconeUpsert_0", + "sourceHandle": "pineconeUpsert_0-output-pineconeUpsert-BaseRetriever", + "target": "conversationalRetrievalQAChain_0", + "targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "type": "buttonedge", + "id": "pineconeUpsert_0-pineconeUpsert_0-output-pineconeUpsert-BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", "data": { "label": "" } diff --git a/packages/server/marketplaces/Github Repo QnA.json b/packages/server/marketplaces/Github Repo QnA.json index e9abd3fe..124a1f9f 100644 --- a/packages/server/marketplaces/Github Repo QnA.json +++ b/packages/server/marketplaces/Github Repo QnA.json @@ -3,64 +3,177 @@ "nodes": [ { "width": 300, - "height": 279, - "id": "conversationalRetrievalQAChain_0", + "height": 376, + "id": "recursiveCharacterTextSplitter_0", "position": { - "x": 1557.4588265034258, - "y": 314.1114881397983 + "x": 515.0218130437521, + "y": 133.69013788278536 }, "type": "customNode", "data": { - "id": "conversationalRetrievalQAChain_0", - "label": "Conversational Retrieval QA Chain", - "name": "conversationalRetrievalQAChain", - "type": "ConversationalRetrievalQAChain", - "baseClasses": ["BaseChain"], - "category": "Chains", - "description": "Document QA - built on RetrievalQAChain to provide a chat history component", - "inputParams": [], - "inputAnchors": [ + "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": "LLM", - "name": "llm", - "type": "BaseLanguageModel", - "id": "conversationalRetrievalQAChain_0-input-llm-BaseLanguageModel" + "label": "Chunk Size", + "name": "chunkSize", + "type": "number", + "default": 1000, + "optional": true }, { - "label": "Vector Store Retriever", - "name": "vectorStoreRetriever", - "type": "BaseRetriever", - "id": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever" + "label": "Chunk Overlap", + "name": "chunkOverlap", + "type": "number", + "optional": true } ], + "inputAnchors": [], "inputs": { - "llm": "{{openAI_0.data.instance}}", - "vectorStoreRetriever": "{{pineconeUpsert_0.data.instance}}" + "chunkSize": 1000, + "chunkOverlap": "" }, "outputAnchors": [ { - "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-BaseChain", - "name": "conversationalRetrievalQAChain", - "label": "ConversationalRetrievalQAChain", - "type": "BaseChain" + "id": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter", + "name": "recursiveCharacterTextSplitter", + "label": "RecursiveCharacterTextSplitter", + "type": "RecursiveCharacterTextSplitter | TextSplitter" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 1557.4588265034258, - "y": 314.1114881397983 + "x": 515.0218130437521, + "y": 133.69013788278536 }, "dragging": false }, { "width": 300, - "height": 471, + "height": 526, + "id": "github_0", + "position": { + "x": 900.6064873076141, + "y": 12.699982761973843 + }, + "type": "customNode", + "data": { + "id": "github_0", + "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" + }, + { + "label": "Branch", + "name": "branch", + "type": "string", + "default": "main" + }, + { + "label": "Access Token", + "name": "accessToken", + "type": "password", + "placeholder": "", + "optional": true + } + ], + "inputAnchors": [ + { + "label": "Text Splitter", + "name": "textSplitter", + "type": "TextSplitter", + "optional": true, + "id": "github_0-input-textSplitter-TextSplitter" + } + ], + "inputs": { + "repoLink": "https://github.com/kyrolabs/awesome-langchain", + "branch": "main", + "textSplitter": "{{recursiveCharacterTextSplitter_0.data.instance}}" + }, + "outputAnchors": [ + { + "id": "github_0-output-github-Document", + "name": "github", + "label": "Document", + "type": "Document" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 900.6064873076141, + "y": 12.699982761973843 + }, + "dragging": false + }, + { + "width": 300, + "height": 278, + "id": "openAIEmbeddings_0", + "position": { + "x": 904.1187025903466, + "y": 591.9520266659382 + }, + "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" + } + ], + "inputAnchors": [], + "inputs": {}, + "outputAnchors": [ + { + "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings", + "name": "openAIEmbeddings", + "label": "OpenAIEmbeddings", + "type": "OpenAIEmbeddings | Embeddings" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 904.1187025903466, + "y": 591.9520266659382 + }, + "dragging": false + }, + { + "width": 300, + "height": 472, "id": "openAI_0", "position": { - "x": 1079.79101466888, - "y": -178.54116849152098 + "x": 1268.0020638568344, + "y": -134.40583642072306 }, "type": "customNode", "data": { @@ -68,7 +181,7 @@ "label": "OpenAI", "name": "openAI", "type": "OpenAI", - "baseClasses": ["BaseLLM", "BaseLanguageModel"], + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", "description": "Wrapper around OpenAI large language models", "inputParams": [ @@ -113,198 +226,32 @@ "inputAnchors": [], "inputs": { "modelName": "text-davinci-003", - "temperature": "0" + "temperature": 0.7 }, "outputAnchors": [ { - "id": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", + "id": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "name": "openAI", "label": "OpenAI", - "type": "BaseLLM | BaseLanguageModel" + "type": "OpenAI | BaseLLM | BaseLanguageModel" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 1079.79101466888, - "y": -178.54116849152098 + "x": 1268.0020638568344, + "y": -134.40583642072306 }, "dragging": false }, { "width": 300, - "height": 376, - "id": "recursiveCharacterTextSplitter_0", - "position": { - "x": 235.6130554027991, - "y": -89.82544163833616 - }, - "type": "customNode", - "data": { - "id": "recursiveCharacterTextSplitter_0", - "label": "Recursive Character Text Splitter", - "name": "recursiveCharacterTextSplitter", - "type": "RecursiveCharacterTextSplitter", - "baseClasses": ["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 - }, - { - "label": "Chunk Overlap", - "name": "chunkOverlap", - "type": "number", - "optional": true - } - ], - "inputAnchors": [], - "inputs": { - "chunkSize": 1000, - "chunkOverlap": "" - }, - "outputAnchors": [ - { - "id": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-TextSplitter", - "name": "recursiveCharacterTextSplitter", - "label": "RecursiveCharacterTextSplitter", - "type": "TextSplitter" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 235.6130554027991, - "y": -89.82544163833616 - }, - "dragging": false - }, - { - "width": 300, - "height": 277, - "id": "openAIEmbeddings_0", - "position": { - "x": 654.473220763302, - "y": 508.09797567725514 - }, - "type": "customNode", - "data": { - "id": "openAIEmbeddings_0", - "label": "OpenAI Embeddings", - "name": "openAIEmbeddings", - "type": "OpenAIEmbeddings", - "baseClasses": ["Embeddings"], - "category": "Embeddings", - "description": "OpenAI API to generate embeddings for a given text", - "inputParams": [ - { - "label": "OpenAI Api Key", - "name": "openAIApiKey", - "type": "password" - } - ], - "inputAnchors": [], - "inputs": {}, - "outputAnchors": [ - { - "id": "openAIEmbeddings_0-output-openAIEmbeddings-Embeddings", - "name": "openAIEmbeddings", - "label": "OpenAIEmbeddings", - "type": "Embeddings" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 654.473220763302, - "y": 508.09797567725514 - }, - "dragging": false - }, - { - "width": 300, - "height": 525, - "id": "github_0", - "position": { - "x": 649.303910738229, - "y": -93.90566658624722 - }, - "type": "customNode", - "data": { - "id": "github_0", - "label": "Github", - "name": "github", - "type": "Github", - "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" - }, - { - "label": "Branch", - "name": "branch", - "type": "string", - "default": "main" - }, - { - "label": "Access Token", - "name": "accessToken", - "type": "password", - "placeholder": "", - "optional": true - } - ], - "inputAnchors": [ - { - "label": "Text Splitter", - "name": "textSplitter", - "type": "TextSplitter", - "optional": true, - "id": "github_0-input-textSplitter-TextSplitter" - } - ], - "inputs": { - "repoLink": "https://github.com/kyrolabs/awesome-langchain", - "branch": "main", - "textSplitter": "{{recursiveCharacterTextSplitter_0.data.instance}}" - }, - "outputAnchors": [ - { - "id": "github_0-output-github-Document", - "name": "github", - "label": "Github", - "type": "Document" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 649.303910738229, - "y": -93.90566658624722 - }, - "dragging": false - }, - { - "width": 300, - "height": 576, + "height": 577, "id": "pineconeUpsert_0", "position": { - "x": 1089.3652950320754, - "y": 354.9656606763275 + "x": 1265.1304547629002, + "y": 376.13121569675315 }, "type": "customNode", "data": { @@ -364,8 +311,61 @@ }, "selected": false, "positionAbsolute": { - "x": 1089.3652950320754, - "y": 354.9656606763275 + "x": 1265.1304547629002, + "y": 376.13121569675315 + }, + "dragging": false + }, + { + "width": 300, + "height": 280, + "id": "conversationalRetrievalQAChain_0", + "position": { + "x": 1658.7012040564862, + "y": 197.0636463189023 + }, + "type": "customNode", + "data": { + "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": [], + "inputAnchors": [ + { + "label": "LLM", + "name": "llm", + "type": "BaseLLM", + "id": "conversationalRetrievalQAChain_0-input-llm-BaseLLM" + }, + { + "label": "Vector Store Retriever", + "name": "vectorStoreRetriever", + "type": "BaseRetriever", + "id": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever" + } + ], + "inputs": { + "llm": "{{openAI_0.data.instance}}", + "vectorStoreRetriever": "{{pineconeUpsert_0.data.instance}}" + }, + "outputAnchors": [ + { + "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-ConversationalRetrievalQAChain|BaseChain", + "name": "conversationalRetrievalQAChain", + "label": "ConversationalRetrievalQAChain", + "type": "ConversationalRetrievalQAChain | BaseChain" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1658.7012040564862, + "y": 197.0636463189023 }, "dragging": false } @@ -373,22 +373,33 @@ "edges": [ { "source": "openAI_0", - "sourceHandle": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", + "sourceHandle": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "target": "conversationalRetrievalQAChain_0", - "targetHandle": "conversationalRetrievalQAChain_0-input-llm-BaseLanguageModel", + "targetHandle": "conversationalRetrievalQAChain_0-input-llm-BaseLLM", "type": "buttonedge", - "id": "openAI_0-openAI_0-output-openAI-BaseLLM|BaseLanguageModel-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-llm-BaseLanguageModel", + "id": "openAI_0-openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-llm-BaseLLM", "data": { "label": "" } }, { - "source": "recursiveCharacterTextSplitter_0", - "sourceHandle": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-TextSplitter", - "target": "github_0", - "targetHandle": "github_0-input-textSplitter-TextSplitter", + "source": "pineconeUpsert_0", + "sourceHandle": "pineconeUpsert_0-output-pineconeUpsert-BaseRetriever", + "target": "conversationalRetrievalQAChain_0", + "targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", "type": "buttonedge", - "id": "recursiveCharacterTextSplitter_0-recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-TextSplitter-github_0-github_0-input-textSplitter-TextSplitter", + "id": "pineconeUpsert_0-pineconeUpsert_0-output-pineconeUpsert-BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "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": "" } @@ -405,23 +416,12 @@ } }, { - "source": "openAIEmbeddings_0", - "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-Embeddings", - "target": "pineconeUpsert_0", - "targetHandle": "pineconeUpsert_0-input-embeddings-Embeddings", + "source": "recursiveCharacterTextSplitter_0", + "sourceHandle": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter", + "target": "github_0", + "targetHandle": "github_0-input-textSplitter-TextSplitter", "type": "buttonedge", - "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-Embeddings-pineconeUpsert_0-pineconeUpsert_0-input-embeddings-Embeddings", - "data": { - "label": "" - } - }, - { - "source": "pineconeUpsert_0", - "sourceHandle": "pineconeUpsert_0-output-pineconeUpsert-BaseRetriever", - "target": "conversationalRetrievalQAChain_0", - "targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", - "type": "buttonedge", - "id": "pineconeUpsert_0-pineconeUpsert_0-output-pineconeUpsert-BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever", + "id": "recursiveCharacterTextSplitter_0-recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter-github_0-github_0-input-textSplitter-TextSplitter", "data": { "label": "" } diff --git a/packages/server/marketplaces/MRLKAgent.json b/packages/server/marketplaces/MRKLAgent.json similarity index 69% rename from packages/server/marketplaces/MRLKAgent.json rename to packages/server/marketplaces/MRKLAgent.json index badbcb58..5877be60 100644 --- a/packages/server/marketplaces/MRLKAgent.json +++ b/packages/server/marketplaces/MRKLAgent.json @@ -3,102 +3,11 @@ "nodes": [ { "width": 300, - "height": 279, - "id": "mrlkAgentLLM_0", - "position": { - "x": 1520.156054894558, - "y": 466.34196346475386 - }, - "type": "customNode", - "data": { - "id": "mrlkAgentLLM_0", - "label": "MRLK Agent for LLMs", - "name": "mrlkAgentLLM", - "type": "AgentExecutor", - "baseClasses": ["AgentExecutor"], - "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": "mrlkAgentLLM_0-input-tools-Tool" - }, - { - "label": "LLM Model", - "name": "model", - "type": "BaseLanguageModel", - "id": "mrlkAgentLLM_0-input-model-BaseLanguageModel" - } - ], - "inputs": { - "tools": ["{{calculator_0.data.instance}}", "{{serpAPI_0.data.instance}}"], - "model": "{{openAI_0.data.instance}}" - }, - "outputAnchors": [ - { - "id": "mrlkAgentLLM_0-output-mrlkAgentLLM-AgentExecutor", - "name": "mrlkAgentLLM", - "label": "AgentExecutor", - "type": "AgentExecutor" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1520.156054894558, - "y": 466.34196346475386 - }, - "dragging": false - }, - { - "width": 300, - "height": 142, - "id": "calculator_0", - "position": { - "x": 1141.0497522733922, - "y": 172.32224599434292 - }, - "type": "customNode", - "data": { - "id": "calculator_0", - "label": "Calculator", - "name": "calculator", - "type": "Calculator", - "baseClasses": ["Tool"], - "category": "Tools", - "description": "Perform calculations on response", - "inputParams": [], - "inputAnchors": [], - "inputs": {}, - "outputAnchors": [ - { - "id": "calculator_0-output-calculator-Tool", - "name": "calculator", - "label": "Calculator", - "type": "Tool" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1141.0497522733922, - "y": 172.32224599434292 - }, - "dragging": false - }, - { - "width": 300, - "height": 277, + "height": 278, "id": "serpAPI_0", "position": { - "x": 797.0350733284566, - "y": 199.36655049779267 + "x": 571.585786437627, + "y": 127.14213562373095 }, "type": "customNode", "data": { @@ -106,7 +15,7 @@ "label": "Serp API", "name": "serpAPI", "type": "SerpAPI", - "baseClasses": ["Tool"], + "baseClasses": ["SerpAPI", "Tool"], "category": "Tools", "description": "Wrapper around SerpAPI - a real-time API to access Google search results", "inputParams": [ @@ -120,28 +29,119 @@ "inputs": {}, "outputAnchors": [ { - "id": "serpAPI_0-output-serpAPI-Tool", + "id": "serpAPI_0-output-serpAPI-SerpAPI|Tool", "name": "serpAPI", "label": "SerpAPI", - "type": "Tool" + "type": "SerpAPI | Tool" + } + ], + "selected": false + }, + "positionAbsolute": { + "x": 571.585786437627, + "y": 127.14213562373095 + }, + "selected": false, + "dragging": false + }, + { + "width": 300, + "height": 143, + "id": "calculator_0", + "position": { + "x": 904.7519886598635, + "y": 135.4705627484772 + }, + "type": "customNode", + "data": { + "id": "calculator_0", + "label": "Calculator", + "name": "calculator", + "type": "Calculator", + "baseClasses": ["Calculator", "Tool"], + "category": "Tools", + "description": "Perform calculations on response", + "inputParams": [], + "inputAnchors": [], + "inputs": {}, + "outputAnchors": [ + { + "id": "calculator_0-output-calculator-Calculator|Tool", + "name": "calculator", + "label": "Calculator", + "type": "Calculator | Tool" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 797.0350733284566, - "y": 199.36655049779267 + "x": 904.7519886598635, + "y": 135.4705627484772 }, "dragging": false }, { "width": 300, - "height": 471, + "height": 280, + "id": "mrklAgentLLM_0", + "position": { + "x": 1251.3621617151298, + "y": 323.8137084989848 + }, + "type": "customNode", + "data": { + "id": "mrklAgentLLM_0", + "label": "MRKL Agent for LLMs", + "name": "mrklAgentLLM", + "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 LLMs", + "inputParams": [], + "inputAnchors": [ + { + "label": "Allowed Tools", + "name": "tools", + "type": "Tool", + "list": true, + "id": "mrklAgentLLM_0-input-tools-Tool" + }, + { + "label": "LLM Model", + "name": "model", + "type": "BaseLLM", + "id": "mrklAgentLLM_0-input-model-BaseLLM" + } + ], + "inputs": { + "tools": ["{{calculator_0.data.instance}}", "{{serpAPI_0.data.instance}}"], + "model": "{{openAI_0.data.instance}}" + }, + "outputAnchors": [ + { + "id": "mrklAgentLLM_0-output-mrklAgentLLM-AgentExecutor|BaseChain", + "name": "mrklAgentLLM", + "label": "AgentExecutor", + "type": "AgentExecutor | BaseChain" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1251.3621617151298, + "y": 323.8137084989848 + }, + "dragging": false + }, + { + "width": 300, + "height": 472, "id": "openAI_0", "position": { - "x": 917.6484006031452, - "y": 522.1507882519595 + "x": 708.9235615351174, + "y": 438.84314575050763 }, "type": "customNode", "data": { @@ -149,7 +149,7 @@ "label": "OpenAI", "name": "openAI", "type": "OpenAI", - "baseClasses": ["BaseLLM", "BaseLanguageModel"], + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", "description": "Wrapper around OpenAI large language models", "inputParams": [ @@ -198,52 +198,52 @@ }, "outputAnchors": [ { - "id": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", + "id": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "name": "openAI", "label": "OpenAI", - "type": "BaseLLM | BaseLanguageModel" + "type": "OpenAI | BaseLLM | BaseLanguageModel" } ], "selected": false }, - "selected": false, "positionAbsolute": { - "x": 917.6484006031452, - "y": 522.1507882519595 + "x": 708.9235615351174, + "y": 438.84314575050763 }, + "selected": false, "dragging": false } ], "edges": [ { "source": "openAI_0", - "sourceHandle": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", - "target": "mrlkAgentLLM_0", - "targetHandle": "mrlkAgentLLM_0-input-model-BaseLanguageModel", + "sourceHandle": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "target": "mrklAgentLLM_0", + "targetHandle": "mrklAgentLLM_0-input-model-BaseLLM", "type": "buttonedge", - "id": "openAI_0-openAI_0-output-openAI-BaseLLM|BaseLanguageModel-mrlkAgentLLM_0-mrlkAgentLLM_0-input-model-BaseLanguageModel", + "id": "openAI_0-openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-mrklAgentLLM_0-mrklAgentLLM_0-input-model-BaseLLM", "data": { "label": "" } }, { "source": "calculator_0", - "sourceHandle": "calculator_0-output-calculator-Tool", - "target": "mrlkAgentLLM_0", - "targetHandle": "mrlkAgentLLM_0-input-tools-Tool", + "sourceHandle": "calculator_0-output-calculator-Calculator|Tool", + "target": "mrklAgentLLM_0", + "targetHandle": "mrklAgentLLM_0-input-tools-Tool", "type": "buttonedge", - "id": "calculator_0-calculator_0-output-calculator-Tool-mrlkAgentLLM_0-mrlkAgentLLM_0-input-tools-Tool", + "id": "calculator_0-calculator_0-output-calculator-Calculator|Tool-mrklAgentLLM_0-mrklAgentLLM_0-input-tools-Tool", "data": { "label": "" } }, { "source": "serpAPI_0", - "sourceHandle": "serpAPI_0-output-serpAPI-Tool", - "target": "mrlkAgentLLM_0", - "targetHandle": "mrlkAgentLLM_0-input-tools-Tool", + "sourceHandle": "serpAPI_0-output-serpAPI-SerpAPI|Tool", + "target": "mrklAgentLLM_0", + "targetHandle": "mrklAgentLLM_0-input-tools-Tool", "type": "buttonedge", - "id": "serpAPI_0-serpAPI_0-output-serpAPI-Tool-mrlkAgentLLM_0-mrlkAgentLLM_0-input-tools-Tool", + "id": "serpAPI_0-serpAPI_0-output-serpAPI-SerpAPI|Tool-mrklAgentLLM_0-mrklAgentLLM_0-input-tools-Tool", "data": { "label": "" } diff --git a/packages/server/marketplaces/Simple LLM Chain.json b/packages/server/marketplaces/Simple LLM Chain.json index 4e712bb6..1e7529a0 100644 --- a/packages/server/marketplaces/Simple LLM Chain.json +++ b/packages/server/marketplaces/Simple LLM Chain.json @@ -3,74 +3,11 @@ "nodes": [ { "width": 300, - "height": 460, - "id": "llmChain_0", - "position": { - "x": 1515.563392772433, - "y": 334.61150897841924 - }, - "type": "customNode", - "data": { - "id": "llmChain_0", - "label": "LLM Chain", - "name": "llmChain", - "type": "LLMChain", - "baseClasses": ["BaseChain"], - "category": "Chains", - "description": "Chain to run queries against LLMs", - "inputParams": [ - { - "label": "Format Prompt Values", - "name": "promptValues", - "type": "string", - "rows": 5, - "placeholder": "{\n \"input_language\": \"English\",\n \"output_language\": \"French\"\n}", - "optional": true - } - ], - "inputAnchors": [ - { - "label": "LLM", - "name": "llm", - "type": "BaseLanguageModel", - "id": "llmChain_0-input-llm-BaseLanguageModel" - }, - { - "label": "Prompt", - "name": "prompt", - "type": "BasePromptTemplate", - "id": "llmChain_0-input-prompt-BasePromptTemplate" - } - ], - "inputs": { - "llm": "{{openAI_0.data.instance}}", - "prompt": "{{promptTemplate_0.data.instance}}", - "promptValues": "" - }, - "outputAnchors": [ - { - "id": "llmChain_0-output-llmChain-BaseChain", - "name": "llmChain", - "label": "LLMChain", - "type": "BaseChain" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1515.563392772433, - "y": 334.61150897841924 - }, - "dragging": false - }, - { - "width": 300, - "height": 471, + "height": 472, "id": "openAI_0", "position": { - "x": 954.7026430819806, - "y": 6.975032607064918 + "x": 968.1753795547951, + "y": -8.62176310944858 }, "type": "customNode", "data": { @@ -78,7 +15,7 @@ "label": "OpenAI", "name": "openAI", "type": "OpenAI", - "baseClasses": ["BaseLLM", "BaseLanguageModel"], + "baseClasses": ["OpenAI", "BaseLLM", "BaseLanguageModel"], "category": "LLMs", "description": "Wrapper around OpenAI large language models", "inputParams": [ @@ -127,28 +64,28 @@ }, "outputAnchors": [ { - "id": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", + "id": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "name": "openAI", "label": "OpenAI", - "type": "BaseLLM | BaseLanguageModel" + "type": "OpenAI | BaseLLM | BaseLanguageModel" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 954.7026430819806, - "y": 6.975032607064918 + "x": 968.1753795547951, + "y": -8.62176310944858 }, "dragging": false }, { "width": 300, - "height": 359, + "height": 360, "id": "promptTemplate_0", "position": { - "x": 954.1542757936061, - "y": 515.2247261712328 + "x": 970.576876549135, + "y": 502.493937944275 }, "type": "customNode", "data": { @@ -156,7 +93,7 @@ "label": "Prompt Template", "name": "promptTemplate", "type": "PromptTemplate", - "baseClasses": ["BaseStringPromptTemplate", "BasePromptTemplate"], + "baseClasses": ["PromptTemplate", "BaseStringPromptTemplate", "BasePromptTemplate"], "category": "Prompts", "description": "Schema to represent a basic prompt for an LLM", "inputParams": [ @@ -174,41 +111,104 @@ }, "outputAnchors": [ { - "id": "promptTemplate_0-output-promptTemplate-BaseStringPromptTemplate|BasePromptTemplate", + "id": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", "name": "promptTemplate", "label": "PromptTemplate", - "type": "BaseStringPromptTemplate | BasePromptTemplate" + "type": "PromptTemplate | BaseStringPromptTemplate | BasePromptTemplate" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 954.1542757936061, - "y": 515.2247261712328 + "x": 970.576876549135, + "y": 502.493937944275 + }, + "dragging": false + }, + { + "width": 300, + "height": 461, + "id": "llmChain_0", + "position": { + "x": 1414.1175742139496, + "y": 340.4040954840462 + }, + "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": "Format Prompt Values", + "name": "promptValues", + "type": "string", + "rows": 5, + "placeholder": "{\n \"input_language\": \"English\",\n \"output_language\": \"French\"\n}", + "optional": true + } + ], + "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_0.data.instance}}", + "prompt": "{{promptTemplate_0.data.instance}}", + "promptValues": "" + }, + "outputAnchors": [ + { + "id": "llmChain_0-output-llmChain-LLMChain|BaseChain", + "name": "llmChain", + "label": "LLMChain", + "type": "LLMChain | BaseChain" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1414.1175742139496, + "y": 340.4040954840462 }, "dragging": false } ], "edges": [ { - "source": "openAI_0", - "sourceHandle": "openAI_0-output-openAI-BaseLLM|BaseLanguageModel", + "source": "promptTemplate_0", + "sourceHandle": "promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate", "target": "llmChain_0", - "targetHandle": "llmChain_0-input-llm-BaseLanguageModel", + "targetHandle": "llmChain_0-input-prompt-BasePromptTemplate", "type": "buttonedge", - "id": "openAI_0-openAI_0-output-openAI-BaseLLM|BaseLanguageModel-llmChain_0-llmChain_0-input-llm-BaseLanguageModel", + "id": "promptTemplate_0-promptTemplate_0-output-promptTemplate-PromptTemplate|BaseStringPromptTemplate|BasePromptTemplate-llmChain_0-llmChain_0-input-prompt-BasePromptTemplate", "data": { "label": "" } }, { - "source": "promptTemplate_0", - "sourceHandle": "promptTemplate_0-output-promptTemplate-BaseStringPromptTemplate|BasePromptTemplate", + "source": "openAI_0", + "sourceHandle": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", "target": "llmChain_0", - "targetHandle": "llmChain_0-input-prompt-BasePromptTemplate", + "targetHandle": "llmChain_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "promptTemplate_0-promptTemplate_0-output-promptTemplate-BaseStringPromptTemplate|BasePromptTemplate-llmChain_0-llmChain_0-input-prompt-BasePromptTemplate", + "id": "openAI_0-openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-llmChain_0-llmChain_0-input-model-BaseLanguageModel", "data": { "label": "" } diff --git a/packages/server/marketplaces/Translator.json b/packages/server/marketplaces/Translator.json index 9e90866c..f9179228 100644 --- a/packages/server/marketplaces/Translator.json +++ b/packages/server/marketplaces/Translator.json @@ -4,143 +4,10 @@ { "width": 300, "height": 460, - "id": "llmChain_0", - "position": { - "x": 1301.8762472836022, - "y": 772.7199253009146 - }, - "type": "customNode", - "data": { - "id": "llmChain_0", - "label": "LLM Chain", - "name": "llmChain", - "type": "LLMChain", - "baseClasses": ["BaseChain"], - "category": "Chains", - "description": "Chain to run queries against LLMs", - "inputParams": [ - { - "label": "Format Prompt Values", - "name": "promptValues", - "type": "string", - "rows": 5, - "placeholder": "{\n \"input_language\": \"English\",\n \"output_language\": \"French\"\n}", - "optional": true - } - ], - "inputAnchors": [ - { - "label": "LLM", - "name": "llm", - "type": "BaseLanguageModel", - "id": "llmChain_0-input-llm-BaseLanguageModel" - }, - { - "label": "Prompt", - "name": "prompt", - "type": "BasePromptTemplate", - "id": "llmChain_0-input-prompt-BasePromptTemplate" - } - ], - "inputs": { - "llm": "{{chatOpenAI_0.data.instance}}", - "prompt": "{{chatPromptTemplate_0.data.instance}}", - "promptValues": "{\n \"input_language\": \"English\",\n \"output_language\": \"Italian\"\n}" - }, - "outputAnchors": [ - { - "id": "llmChain_0-output-llmChain-BaseChain", - "name": "llmChain", - "label": "LLMChain", - "type": "BaseChain" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 1301.8762472836022, - "y": 772.7199253009146 - }, - "dragging": false - }, - { - "width": 300, - "height": 471, - "id": "chatOpenAI_0", - "position": { - "x": 821.5000372338304, - "y": 369.8333649665954 - }, - "type": "customNode", - "data": { - "id": "chatOpenAI_0", - "label": "ChatOpenAI", - "name": "chatOpenAI", - "type": "ChatOpenAI", - "baseClasses": ["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" - }, - { - "label": "Model Name", - "name": "modelName", - "type": "options", - "options": [ - { - "label": "gpt-3.5-turbo", - "name": "gpt-3.5-turbo" - }, - { - "label": "gpt-3.5-turbo-0301", - "name": "gpt-3.5-turbo-0301" - } - ], - "default": "gpt-3.5-turbo", - "optional": true - }, - { - "label": "Temperature", - "name": "temperature", - "type": "number", - "default": 0.9, - "optional": true - } - ], - "inputAnchors": [], - "inputs": { - "modelName": "gpt-3.5-turbo", - "temperature": "0" - }, - "outputAnchors": [ - { - "id": "chatOpenAI_0-output-chatOpenAI-BaseChatModel|BaseLanguageModel", - "name": "chatOpenAI", - "label": "ChatOpenAI", - "type": "BaseChatModel | BaseLanguageModel" - } - ], - "selected": false - }, - "selected": false, - "positionAbsolute": { - "x": 821.5000372338304, - "y": 369.8333649665954 - }, - "dragging": false - }, - { - "width": 300, - "height": 459, "id": "chatPromptTemplate_0", "position": { - "x": 821.3479428749118, - "y": 871.7203878238932 + "x": 524, + "y": 237 }, "type": "customNode", "data": { @@ -148,7 +15,7 @@ "label": "Chat Prompt Template", "name": "chatPromptTemplate", "type": "ChatPromptTemplate", - "baseClasses": ["BasePromptTemplate"], + "baseClasses": ["ChatPromptTemplate", "BaseChatPromptTemplate", "BasePromptTemplate"], "category": "Prompts", "description": "Schema to represent a chat prompt", "inputParams": [ @@ -174,18 +41,163 @@ }, "outputAnchors": [ { - "id": "chatPromptTemplate_0-output-chatPromptTemplate-BasePromptTemplate", + "id": "chatPromptTemplate_0-output-chatPromptTemplate-ChatPromptTemplate|BaseChatPromptTemplate|BasePromptTemplate", "name": "chatPromptTemplate", "label": "ChatPromptTemplate", - "type": "BasePromptTemplate" + "type": "ChatPromptTemplate | BaseChatPromptTemplate | BasePromptTemplate" + } + ], + "selected": false + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 524, + "y": 237 + } + }, + { + "width": 300, + "height": 472, + "id": "chatOpenAI_0", + "position": { + "x": 855.1997276913991, + "y": 24.090553068402556 + }, + "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": "OpenAI Api Key", + "name": "openAIApiKey", + "type": "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-3.5-turbo", + "name": "gpt-3.5-turbo" + }, + { + "label": "gpt-3.5-turbo-0301", + "name": "gpt-3.5-turbo-0301" + } + ], + "default": "gpt-3.5-turbo", + "optional": true + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.9, + "optional": true + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "gpt-3.5-turbo", + "temperature": 0.9 + }, + "outputAnchors": [ + { + "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", + "name": "chatOpenAI", + "label": "ChatOpenAI", + "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel" } ], "selected": false }, "selected": false, "positionAbsolute": { - "x": 821.3479428749118, - "y": 871.7203878238932 + "x": 855.1997276913991, + "y": 24.090553068402556 + }, + "dragging": false + }, + { + "width": 300, + "height": 461, + "id": "llmChain_0", + "position": { + "x": 1192.2235692202612, + "y": 361.71736677076257 + }, + "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": "Format Prompt Values", + "name": "promptValues", + "type": "string", + "rows": 5, + "placeholder": "{\n \"input_language\": \"English\",\n \"output_language\": \"French\"\n}", + "optional": true + } + ], + "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": "{{chatPromptTemplate_0.data.instance}}", + "promptValues": "{\n \"input_language\": \"English\",\n \"output_language\": \"French\"\n}" + }, + "outputAnchors": [ + { + "id": "llmChain_0-output-llmChain-LLMChain|BaseChain", + "name": "llmChain", + "label": "LLMChain", + "type": "LLMChain | BaseChain" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1192.2235692202612, + "y": 361.71736677076257 }, "dragging": false } @@ -193,22 +205,22 @@ "edges": [ { "source": "chatOpenAI_0", - "sourceHandle": "chatOpenAI_0-output-chatOpenAI-BaseChatModel|BaseLanguageModel", + "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel", "target": "llmChain_0", - "targetHandle": "llmChain_0-input-llm-BaseLanguageModel", + "targetHandle": "llmChain_0-input-model-BaseLanguageModel", "type": "buttonedge", - "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-BaseChatModel|BaseLanguageModel-llmChain_0-llmChain_0-input-llm-BaseLanguageModel", + "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel-llmChain_0-llmChain_0-input-model-BaseLanguageModel", "data": { "label": "" } }, { "source": "chatPromptTemplate_0", - "sourceHandle": "chatPromptTemplate_0-output-chatPromptTemplate-BasePromptTemplate", + "sourceHandle": "chatPromptTemplate_0-output-chatPromptTemplate-ChatPromptTemplate|BaseChatPromptTemplate|BasePromptTemplate", "target": "llmChain_0", "targetHandle": "llmChain_0-input-prompt-BasePromptTemplate", "type": "buttonedge", - "id": "chatPromptTemplate_0-chatPromptTemplate_0-output-chatPromptTemplate-BasePromptTemplate-llmChain_0-llmChain_0-input-prompt-BasePromptTemplate", + "id": "chatPromptTemplate_0-chatPromptTemplate_0-output-chatPromptTemplate-ChatPromptTemplate|BaseChatPromptTemplate|BasePromptTemplate-llmChain_0-llmChain_0-input-prompt-BasePromptTemplate", "data": { "label": "" } diff --git a/packages/server/src/NodesPool.ts b/packages/server/src/NodesPool.ts index 1485ffe5..b17164e0 100644 --- a/packages/server/src/NodesPool.ts +++ b/packages/server/src/NodesPool.ts @@ -23,9 +23,6 @@ export class NodesPool { const newNodeInstance = new nodeModule.nodeClass() newNodeInstance.filePath = file - const baseClasses = await newNodeInstance.getBaseClasses!.call(newNodeInstance) - newNodeInstance.baseClasses = baseClasses - this.componentNodes[newNodeInstance.name] = newNodeInstance // Replace file icon with absolute path diff --git a/packages/server/src/utils/index.ts b/packages/server/src/utils/index.ts index bc50aff2..e8ac8a3a 100644 --- a/packages/server/src/utils/index.ts +++ b/packages/server/src/utils/index.ts @@ -107,7 +107,9 @@ export const getEndingNode = (nodeDependencies: INodeDependencies, graph: INodeD // Find ending node let endingNodeId = '' Object.keys(graph).forEach((nodeId) => { - if (!graph[nodeId].length && nodeDependencies[nodeId] > 0) { + if (Object.keys(nodeDependencies).length === 1) { + endingNodeId = nodeId + } else if (!graph[nodeId].length && nodeDependencies[nodeId] > 0) { endingNodeId = nodeId } }) diff --git a/packages/ui/src/views/canvas/NodeInputHandler.js b/packages/ui/src/views/canvas/NodeInputHandler.js index 404d4087..019cddeb 100644 --- a/packages/ui/src/views/canvas/NodeInputHandler.js +++ b/packages/ui/src/views/canvas/NodeInputHandler.js @@ -3,15 +3,21 @@ import { Handle, Position, useUpdateNodeInternals } from 'reactflow' import { useEffect, useRef, useState, useContext } from 'react' // material-ui -import { useTheme } from '@mui/material/styles' +import { useTheme, styled } from '@mui/material/styles' import { Box, Typography, Tooltip } from '@mui/material' - +import { tooltipClasses } from '@mui/material/Tooltip' import { Dropdown } from 'ui-component/dropdown/Dropdown' import { Input } from 'ui-component/input/Input' import { File } from 'ui-component/file/File' import { flowContext } from 'store/context/ReactFlowContext' import { isValidConnection } from 'utils/genericHelper' +const CustomWidthTooltip = styled(({ className, ...props }) => )({ + [`& .${tooltipClasses.tooltip}`]: { + maxWidth: 500 + } +}) + // ===========================|| NodeInputHandler ||=========================== // const NodeInputHandler = ({ inputAnchor, inputParam, data, disabled = false }) => { @@ -36,14 +42,7 @@ const NodeInputHandler = ({ inputAnchor, inputParam, data, disabled = false }) =
{inputAnchor && ( <> - - {'Type: ' + inputAnchor.type} - - } - > + - + {inputAnchor.label} diff --git a/packages/ui/src/views/canvas/NodeOutputHandler.js b/packages/ui/src/views/canvas/NodeOutputHandler.js index 5f4d2942..62babb7b 100644 --- a/packages/ui/src/views/canvas/NodeOutputHandler.js +++ b/packages/ui/src/views/canvas/NodeOutputHandler.js @@ -3,11 +3,18 @@ import { Handle, Position, useUpdateNodeInternals } from 'reactflow' import { useEffect, useRef, useState, useContext } from 'react' // material-ui -import { useTheme } from '@mui/material/styles' +import { useTheme, styled } from '@mui/material/styles' import { Box, Typography, Tooltip } from '@mui/material' +import { tooltipClasses } from '@mui/material/Tooltip' import { flowContext } from 'store/context/ReactFlowContext' import { isValidConnection } from 'utils/genericHelper' +const CustomWidthTooltip = styled(({ className, ...props }) => )({ + [`& .${tooltipClasses.tooltip}`]: { + maxWidth: 500 + } +}) + // ===========================|| NodeOutputHandler ||=========================== // const NodeOutputHandler = ({ outputAnchor, data }) => { @@ -34,14 +41,7 @@ const NodeOutputHandler = ({ outputAnchor, data }) => { return (
- - {'Type: ' + outputAnchor.type} - - } - > + { top: position }} /> - + {outputAnchor.label} diff --git a/packages/ui/src/views/chatmessage/ChatMessage.css b/packages/ui/src/views/chatmessage/ChatMessage.css index 4aa651b1..a29e49ff 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.css +++ b/packages/ui/src/views/chatmessage/ChatMessage.css @@ -1,7 +1,3 @@ -.cloudform { - position: relative; -} - .messagelist { width: 100%; height: 100%; @@ -113,13 +109,11 @@ position: relative; flex-direction: column; padding: 10px; - max-width: 500px; } .cloud { - width: '100%'; - max-width: 500px; - height: 73vh; + width: 400px; + height: calc(100vh - 260px); border-radius: 0.5rem; display: flex; justify-content: center; diff --git a/packages/ui/src/views/chatmessage/ChatMessage.js b/packages/ui/src/views/chatmessage/ChatMessage.js index 45cd3873..4fbb54e6 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.js +++ b/packages/ui/src/views/chatmessage/ChatMessage.js @@ -336,13 +336,13 @@ export const ChatMessage = ({ chatflowid }) => {
-
-
+
+ Date: Thu, 13 Apr 2023 19:56:48 +0100 Subject: [PATCH 03/20] use pdf-parser --- packages/components/nodes/documentloaders/Pdf/Pdf.ts | 6 ++++-- packages/components/package.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/components/nodes/documentloaders/Pdf/Pdf.ts b/packages/components/nodes/documentloaders/Pdf/Pdf.ts index 10e12226..936259cb 100644 --- a/packages/components/nodes/documentloaders/Pdf/Pdf.ts +++ b/packages/components/nodes/documentloaders/Pdf/Pdf.ts @@ -66,7 +66,8 @@ class Pdf_DocumentLoaders implements INode { const blob = new Blob([bf]) if (usage === 'perFile') { - const loader = new PDFLoader(blob, { splitPages: false }) + // @ts-ignore + const loader = new PDFLoader(blob, { splitPages: false, pdfjs: () => import('pdf-parse/lib/pdf.js/v1.10.100/build/pdf.js') }) if (textSplitter) { const docs = await loader.loadAndSplit(textSplitter) return docs @@ -75,7 +76,8 @@ class Pdf_DocumentLoaders implements INode { return docs } } else { - const loader = new PDFLoader(blob) + // @ts-ignore + const loader = new PDFLoader(blob, { pdfjs: () => import('pdf-parse/lib/pdf.js/v1.10.100/build/pdf.js') }) if (textSplitter) { const docs = await loader.loadAndSplit(textSplitter) return docs diff --git a/packages/components/package.json b/packages/components/package.json index 0a211553..a80c434e 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -27,7 +27,7 @@ "langchain": "^0.0.44", "moment": "^2.29.3", "node-fetch": "2", - "pdfjs-dist": "^3.5.141", + "pdf-parse": "^1.1.1", "ws": "^8.9.0" }, "devDependencies": { From f90f97822533954f5bd656aec6263b59d153c233 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 13 Apr 2023 20:12:55 +0100 Subject: [PATCH 04/20] =?UTF-8?q?=F0=9F=A5=B3=20flowise-components@1.1.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 34da56a1..ab35c011 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "flowise-components", - "version": "1.0.0", + "version": "1.1.0", "description": "Flowiseai Components", "main": "dist/src/index", "types": "dist/src/index.d.ts", From c437c17505fb127a0c8ecccb8f3830361d56c2ca Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 13 Apr 2023 20:28:33 +0100 Subject: [PATCH 05/20] =?UTF-8?q?=F0=9F=A5=B3=20flowise-ui@1.1.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 fe9ca521..dfbac842 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "flowise-ui", - "version": "1.0.0", + "version": "1.1.0", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://flowiseai.com", "author": { From 81be7d3f1dad4cba01de4514e176a840c81c952e Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 13 Apr 2023 20:30:57 +0100 Subject: [PATCH 06/20] =?UTF-8?q?=F0=9F=A5=B3=20flowise@1.1.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 794c3b66..b60de3f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.0.0", + "version": "1.1.0", "private": true, "homepage": "https://flowiseai.com", "workspaces": [ diff --git a/packages/server/package.json b/packages/server/package.json index 582371a9..568143e7 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.0.1", + "version": "1.1.0", "description": "Flowiseai Server", "main": "dist/index", "types": "dist/index.d.ts", From 140b3cd2a28471a8b9d482c5b1022eb7954efdb5 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 13 Apr 2023 23:46:17 +0100 Subject: [PATCH 07/20] bugfix/VectorStore-BaseClasses --- .../nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts | 3 +-- .../nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts | 3 +-- .../nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts | 3 +-- .../nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts | 3 +-- packages/components/package.json | 2 +- 5 files changed, 5 insertions(+), 9 deletions(-) diff --git a/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts b/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts index ee520092..1e16140f 100644 --- a/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts +++ b/packages/components/nodes/vectorstores/Chroma_Existing/Chroma_Existing.ts @@ -1,7 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { Chroma } from 'langchain/vectorstores/chroma' import { Embeddings } from 'langchain/embeddings/base' -import { getBaseClasses } from '../../../src/utils' class Chroma_Existing_VectorStores implements INode { label: string @@ -20,7 +19,7 @@ class Chroma_Existing_VectorStores implements INode { this.icon = 'chroma.svg' this.category = 'Vector Stores' this.description = 'Load existing index from Chroma (i.e: Document has been upserted)' - this.baseClasses = [this.type, ...getBaseClasses(Chroma)] + this.baseClasses = [this.type, 'BaseRetriever'] this.inputs = [ { label: 'Embeddings', diff --git a/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts b/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts index 015bc628..71d3edf5 100644 --- a/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts +++ b/packages/components/nodes/vectorstores/Chroma_Upsert/Chroma_Upsert.ts @@ -2,7 +2,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { Chroma } from 'langchain/vectorstores/chroma' import { Embeddings } from 'langchain/embeddings/base' import { Document } from 'langchain/document' -import { getBaseClasses } from '../../../src/utils' class ChromaUpsert_VectorStores implements INode { label: string @@ -21,7 +20,7 @@ class ChromaUpsert_VectorStores implements INode { this.icon = 'chroma.svg' this.category = 'Vector Stores' this.description = 'Upsert documents to Chroma' - this.baseClasses = [this.type, ...getBaseClasses(Chroma)] + this.baseClasses = [this.type, 'BaseRetriever'] this.inputs = [ { label: 'Document', diff --git a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts index d588a127..bdc5ba87 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Existing/Pinecone_Existing.ts @@ -2,7 +2,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { PineconeClient } from '@pinecone-database/pinecone' import { PineconeStore } from 'langchain/vectorstores/pinecone' import { Embeddings } from 'langchain/embeddings/base' -import { getBaseClasses } from '../../../src/utils' class Pinecone_Existing_VectorStores implements INode { label: string @@ -21,7 +20,7 @@ class Pinecone_Existing_VectorStores implements INode { this.icon = 'pinecone.png' this.category = 'Vector Stores' this.description = 'Load existing index from Pinecone (i.e: Document has been upserted)' - this.baseClasses = [this.type, ...getBaseClasses(PineconeStore)] + this.baseClasses = [this.type, 'BaseRetriever'] this.inputs = [ { label: 'Embeddings', diff --git a/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts b/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts index cb9c4af7..d498e9ca 100644 --- a/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts +++ b/packages/components/nodes/vectorstores/Pinecone_Upsert/Pinecone_Upsert.ts @@ -3,7 +3,6 @@ import { PineconeClient } from '@pinecone-database/pinecone' import { PineconeStore } from 'langchain/vectorstores/pinecone' import { Embeddings } from 'langchain/embeddings/base' import { Document } from 'langchain/document' -import { getBaseClasses } from '../../../src/utils' class PineconeUpsert_VectorStores implements INode { label: string @@ -22,7 +21,7 @@ class PineconeUpsert_VectorStores implements INode { this.icon = 'pinecone.png' this.category = 'Vector Stores' this.description = 'Upsert documents to Pinecone' - this.baseClasses = [this.type, ...getBaseClasses(PineconeStore)] + this.baseClasses = [this.type, 'BaseRetriever'] this.inputs = [ { label: 'Document', diff --git a/packages/components/package.json b/packages/components/package.json index ab35c011..d2d68037 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "flowise-components", - "version": "1.1.0", + "version": "1.1.1", "description": "Flowiseai Components", "main": "dist/src/index", "types": "dist/src/index.d.ts", From 7e3c8f268fdde43b66a126636cb157d86039ffa4 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 14 Apr 2023 22:55:52 +0100 Subject: [PATCH 08/20] add fixes to bugs where nodes are triggered multiple times --- packages/server/src/Interface.ts | 4 ++ packages/server/src/index.ts | 23 +++++++-- packages/server/src/utils/index.ts | 79 +++++++++++++++++++++++++----- 3 files changed, 88 insertions(+), 18 deletions(-) diff --git a/packages/server/src/Interface.ts b/packages/server/src/Interface.ts index 08906d44..d228d937 100644 --- a/packages/server/src/Interface.ts +++ b/packages/server/src/Interface.ts @@ -95,6 +95,10 @@ export interface INodeQueue { depth: number } +export interface IDepthQueue { + [key: string]: number +} + export interface IMessage { message: string type: MessageType diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 777d5fd1..cec71051 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -5,7 +5,7 @@ import http from 'http' import * as fs from 'fs' import { IChatFlow, IncomingInput, IReactFlowNode, IReactFlowObject } from './Interface' -import { getNodeModulesPackagePath, getStartingNode, buildLangchain, getEndingNode, constructGraphs } from './utils' +import { getNodeModulesPackagePath, getStartingNodes, buildLangchain, getEndingNode, constructGraphs } from './utils' import { cloneDeep } from 'lodash' import { getDataSource } from './DataSource' import { NodesPool } from './NodesPool' @@ -209,13 +209,26 @@ export class App { const flowData = chatflow.flowData const parsedFlowData: IReactFlowObject = JSON.parse(flowData) + + /*** Get Ending Node with Directed Graph ***/ const { graph, nodeDependencies } = constructGraphs(parsedFlowData.nodes, parsedFlowData.edges) + const directedGraph = graph + const endingNodeId = getEndingNode(nodeDependencies, directedGraph) + if (!endingNodeId) return res.status(500).send(`Ending node must be either a Chain or Agent`) - const startingNodeIds = getStartingNode(nodeDependencies) - const endingNodeId = getEndingNode(nodeDependencies, graph) - if (!endingNodeId) return res.status(500).send(`Ending node must be either Chain or Agent`) + /*** Get Starting Nodes with Non-Directed Graph ***/ + const constructedObj = constructGraphs(parsedFlowData.nodes, parsedFlowData.edges, true) + const nonDirectedGraph = constructedObj.graph + const { startingNodeIds, depthQueue } = getStartingNodes(nonDirectedGraph, endingNodeId) - const reactFlowNodes = await buildLangchain(startingNodeIds, parsedFlowData.nodes, graph, this.nodesPool.componentNodes) + /*** BFS to traverse from Starting Nodes to Ending Node ***/ + const reactFlowNodes = await buildLangchain( + startingNodeIds, + parsedFlowData.nodes, + graph, + depthQueue, + this.nodesPool.componentNodes + ) const nodeToExecute = reactFlowNodes.find((node: IReactFlowNode) => node.id === endingNodeId) if (!nodeToExecute) return res.status(404).send(`Node ${endingNodeId} not found`) diff --git a/packages/server/src/utils/index.ts b/packages/server/src/utils/index.ts index e8ac8a3a..fce1e02e 100644 --- a/packages/server/src/utils/index.ts +++ b/packages/server/src/utils/index.ts @@ -2,6 +2,7 @@ import path from 'path' import fs from 'fs' import { IComponentNodes, + IDepthQueue, IExploredNode, INodeDependencies, INodeDirectedGraph, @@ -54,11 +55,12 @@ export const getNodeModulesPackagePath = (packageName: string): string => { } /** - * Construct directed graph and node dependencies score + * Construct graph and node dependencies score * @param {IReactFlowNode[]} reactFlowNodes * @param {IReactFlowEdge[]} reactFlowEdges + * @param {boolean} isNondirected */ -export const constructGraphs = (reactFlowNodes: IReactFlowNode[], reactFlowEdges: IReactFlowEdge[]) => { +export const constructGraphs = (reactFlowNodes: IReactFlowNode[], reactFlowEdges: IReactFlowEdge[], isNondirected = false) => { const nodeDependencies = {} as INodeDependencies const graph = {} as INodeDirectedGraph @@ -77,6 +79,14 @@ export const constructGraphs = (reactFlowNodes: IReactFlowNode[], reactFlowEdges } else { graph[source] = [target] } + + if (isNondirected) { + if (Object.prototype.hasOwnProperty.call(graph, target)) { + graph[target].push(source) + } else { + graph[target] = [source] + } + } nodeDependencies[target] += 1 } @@ -84,18 +94,52 @@ export const constructGraphs = (reactFlowNodes: IReactFlowNode[], reactFlowEdges } /** - * Get starting node and check if flow is valid - * @param {INodeDependencies} nodeDependencies + * Get starting nodes and check if flow is valid + * @param {INodeDependencies} graph + * @param {string} endNodeId */ -export const getStartingNode = (nodeDependencies: INodeDependencies) => { - // Find starting node - const startingNodeIds = [] as string[] - Object.keys(nodeDependencies).forEach((nodeId) => { - if (nodeDependencies[nodeId] === 0) { - startingNodeIds.push(nodeId) +export const getStartingNodes = (graph: INodeDirectedGraph, endNodeId: string) => { + const visited = new Set() + const queue: Array<[string, number]> = [[endNodeId, 0]] + const depthQueue: IDepthQueue = { + [endNodeId]: 0 + } + + let maxDepth = 0 + let startingNodeIds: string[] = [] + + while (queue.length > 0) { + const [currentNode, depth] = queue.shift()! + + if (visited.has(currentNode)) { + continue } - }) - return startingNodeIds + + visited.add(currentNode) + + if (depth > maxDepth) { + maxDepth = depth + startingNodeIds = [currentNode] + } else if (depth === maxDepth) { + startingNodeIds.push(currentNode) + } + + for (const neighbor of graph[currentNode]) { + if (!visited.has(neighbor)) { + queue.push([neighbor, depth + 1]) + depthQueue[neighbor] = depth + 1 + } + } + } + + const depthQueueReversed: IDepthQueue = {} + for (const nodeId in depthQueue) { + if (Object.prototype.hasOwnProperty.call(depthQueue, nodeId)) { + depthQueueReversed[nodeId] = Math.abs(depthQueue[nodeId] - maxDepth) + } + } + + return { startingNodeIds, depthQueue: depthQueueReversed } } /** @@ -104,7 +148,6 @@ export const getStartingNode = (nodeDependencies: INodeDependencies) => { * @param {INodeDirectedGraph} graph */ export const getEndingNode = (nodeDependencies: INodeDependencies, graph: INodeDirectedGraph) => { - // Find ending node let endingNodeId = '' Object.keys(graph).forEach((nodeId) => { if (Object.keys(nodeDependencies).length === 1) { @@ -121,12 +164,14 @@ export const getEndingNode = (nodeDependencies: INodeDependencies, graph: INodeD * @param {string} startingNodeId * @param {IReactFlowNode[]} reactFlowNodes * @param {INodeDirectedGraph} graph + * @param {IDepthQueue} depthQueue * @param {IComponentNodes} componentNodes */ export const buildLangchain = async ( startingNodeIds: string[], reactFlowNodes: IReactFlowNode[], graph: INodeDirectedGraph, + depthQueue: IDepthQueue, componentNodes: IComponentNodes ) => { const flowNodes = cloneDeep(reactFlowNodes) @@ -166,6 +211,14 @@ export const buildLangchain = async ( const neighbourNodeIds = graph[nodeId] const nextDepth = depth + 1 + // Find other nodes that are on the same depth level + const sameDepthNodeIds = Object.keys(depthQueue).filter((key) => depthQueue[key] === nextDepth) + + for (const id of sameDepthNodeIds) { + if (neighbourNodeIds.includes(id)) continue + neighbourNodeIds.push(id) + } + for (let i = 0; i < neighbourNodeIds.length; i += 1) { const neighNodeId = neighbourNodeIds[i] From 0681a344084343f850809a9e88486d0f9de731c2 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 14 Apr 2023 23:27:49 +0100 Subject: [PATCH 09/20] =?UTF-8?q?=F0=9F=A5=B3=20flowise@1.1.1=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- package.json | 2 +- packages/server/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f9a62553..21f9f53a 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Drag & drop UI to build your customized LLM flow using [LangchainJS](https://git ```bash npm install -g flowise ``` -2. Start FlowiseAI +2. Start Flowise ```bash npx flowise start diff --git a/package.json b/package.json index b60de3f9..cfc2aee5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.1.0", + "version": "1.1.1", "private": true, "homepage": "https://flowiseai.com", "workspaces": [ diff --git a/packages/server/package.json b/packages/server/package.json index 568143e7..56607f41 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.1.0", + "version": "1.1.1", "description": "Flowiseai Server", "main": "dist/index", "types": "dist/index.d.ts", From 1e18c289cb06b8cc4401f53d99b31f689b059b13 Mon Sep 17 00:00:00 2001 From: chungyau97 Date: Sun, 16 Apr 2023 00:15:12 +0700 Subject: [PATCH 10/20] add CSV loader --- .../nodes/documentloaders/Csv/Csv.png | Bin 0 -> 8498 bytes .../nodes/documentloaders/Csv/Csv.ts | 59 ++++++++++++++++++ packages/components/package.json | 1 + 3 files changed, 60 insertions(+) create mode 100644 packages/components/nodes/documentloaders/Csv/Csv.png create mode 100644 packages/components/nodes/documentloaders/Csv/Csv.ts diff --git a/packages/components/nodes/documentloaders/Csv/Csv.png b/packages/components/nodes/documentloaders/Csv/Csv.png new file mode 100644 index 0000000000000000000000000000000000000000..41b84e16a04dd8b6b6eb1606f4fa9f5317bffc96 GIT binary patch literal 8498 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 literal 0 HcmV?d00001 diff --git a/packages/components/nodes/documentloaders/Csv/Csv.ts b/packages/components/nodes/documentloaders/Csv/Csv.ts new file mode 100644 index 00000000..db1a3bac --- /dev/null +++ b/packages/components/nodes/documentloaders/Csv/Csv.ts @@ -0,0 +1,59 @@ +import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { TextSplitter } from 'langchain/text_splitter' +import { CSVLoader } from "langchain/document_loaders/fs/csv"; + +class Csv_DocumentLoaders implements INode { + label: string + name: string + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + + constructor() { + this.label = 'Csv File' + this.name = 'csvFile' + this.type = 'Document' + this.icon = 'Csv.png' + this.category = 'Document Loaders' + this.description = `Load data from CSV files` + this.baseClasses = [this.type] + this.inputs = [ + { + label: 'Csv File', + name: 'csvFile', + type: 'file', + fileType: '.csv' + }, + { + label: 'Text Splitter', + name: 'textSplitter', + type: 'TextSplitter', + optional: true + } + ] + } + + async init(nodeData: INodeData): Promise { + const textSplitter = nodeData.inputs?.textSplitter as TextSplitter + const csvFileBase64 = nodeData.inputs?.csvFile as string + const splitDataURI = csvFileBase64.split(',') + splitDataURI.pop() + const bf = Buffer.from(splitDataURI.pop() || '', 'base64') + + const blob = new Blob([bf]) + const loader = new CSVLoader(blob) + + if (textSplitter) { + const docs = await loader.loadAndSplit(textSplitter) + return docs + } else { + const docs = await loader.load() + return docs + } + } +} + +module.exports = { nodeClass: Csv_DocumentLoaders } diff --git a/packages/components/package.json b/packages/components/package.json index d2d68037..d75cda9d 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -21,6 +21,7 @@ "@pinecone-database/pinecone": "^0.0.12", "axios": "^0.27.2", "chromadb": "^1.3.1", + "d3-dsv": "2", "dotenv": "^16.0.0", "express": "^4.17.3", "form-data": "^4.0.0", From 256550f953ac7f58c7a80d193f817505b86fbb5c Mon Sep 17 00:00:00 2001 From: chungyau97 Date: Sun, 16 Apr 2023 00:56:16 +0700 Subject: [PATCH 11/20] add single column extraction --- packages/components/nodes/documentloaders/Csv/Csv.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/components/nodes/documentloaders/Csv/Csv.ts b/packages/components/nodes/documentloaders/Csv/Csv.ts index db1a3bac..819bfeaf 100644 --- a/packages/components/nodes/documentloaders/Csv/Csv.ts +++ b/packages/components/nodes/documentloaders/Csv/Csv.ts @@ -32,6 +32,14 @@ class Csv_DocumentLoaders implements INode { name: 'textSplitter', type: 'TextSplitter', optional: true + }, + { + label: 'Single Column Extraction', + name: 'columnName', + type: 'string', + description: 'Extracting a single column', + placeholder: "Enter column name", + optional: true } ] } @@ -39,12 +47,13 @@ class Csv_DocumentLoaders implements INode { async init(nodeData: INodeData): Promise { const textSplitter = nodeData.inputs?.textSplitter as TextSplitter const csvFileBase64 = nodeData.inputs?.csvFile as string + const columnName = nodeData.inputs?.columnName as string const splitDataURI = csvFileBase64.split(',') splitDataURI.pop() const bf = Buffer.from(splitDataURI.pop() || '', 'base64') const blob = new Blob([bf]) - const loader = new CSVLoader(blob) + const loader = new CSVLoader(blob, columnName.trim().length === 0 ? undefined : columnName.trim()) if (textSplitter) { const docs = await loader.loadAndSplit(textSplitter) From da56cd5f689fdc06fe88911bfc6234d8f2947d43 Mon Sep 17 00:00:00 2001 From: Miles Zimmerman Date: Sun, 16 Apr 2023 13:48:41 +0000 Subject: [PATCH 12/20] feat(components): cohere.ai embeddings node --- .../CohereEmbedding/CohereEmbedding.ts | 40 ++++++++++++++++++ .../embeddings/CohereEmbedding/cohere.png | Bin 0 -> 7847 bytes packages/components/package.json | 3 +- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts create mode 100644 packages/components/nodes/embeddings/CohereEmbedding/cohere.png diff --git a/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts b/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts new file mode 100644 index 00000000..923cf6c6 --- /dev/null +++ b/packages/components/nodes/embeddings/CohereEmbedding/CohereEmbedding.ts @@ -0,0 +1,40 @@ +import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses } from '../../../src/utils' +import { CohereEmbeddings } from 'langchain/embeddings/cohere' + +class CohereEmbedding_Embeddings implements INode { + label: string + name: string + type: string + icon: string + category: string + description: string + baseClasses: string[] + inputs: INodeParams[] + + constructor() { + this.label = 'Cohere Embeddings' + this.name = 'cohereEmbeddings' + this.type = 'CohereEmbeddings' + this.icon = 'cohere.png' + this.category = 'Embeddings' + this.description = 'Cohere API to generate embeddings for a given text' + this.baseClasses = [this.type, ...getBaseClasses(CohereEmbeddings)] + this.inputs = [ + { + label: 'Cohere API Key', + name: 'cohereApiKey', + type: 'password' + } + ] + } + + async init(nodeData: INodeData): Promise { + const apiKey = nodeData.inputs?.cohereApiKey as string + + const model = new CohereEmbeddings({ apiKey }) + return model + } +} + +module.exports = { nodeClass: CohereEmbedding_Embeddings } diff --git a/packages/components/nodes/embeddings/CohereEmbedding/cohere.png b/packages/components/nodes/embeddings/CohereEmbedding/cohere.png new file mode 100644 index 0000000000000000000000000000000000000000..266adeac2214b8627504eaf299c990b28f0448e0 GIT binary patch literal 7847 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 literal 0 HcmV?d00001 diff --git a/packages/components/package.json b/packages/components/package.json index d2d68037..d71499a1 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -21,10 +21,11 @@ "@pinecone-database/pinecone": "^0.0.12", "axios": "^0.27.2", "chromadb": "^1.3.1", + "cohere-ai": "^6.2.0", "dotenv": "^16.0.0", "express": "^4.17.3", "form-data": "^4.0.0", - "langchain": "^0.0.53", + "langchain": "^0.0.56", "moment": "^2.29.3", "node-fetch": "2", "pdf-parse": "^1.1.1", From f5acca1aee8cd741e9d006f0d9c1d2e7799286c5 Mon Sep 17 00:00:00 2001 From: chungyau97 Date: Sun, 16 Apr 2023 20:56:35 +0700 Subject: [PATCH 13/20] fix yarn lint-fix --- packages/components/nodes/documentloaders/Csv/Csv.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/components/nodes/documentloaders/Csv/Csv.ts b/packages/components/nodes/documentloaders/Csv/Csv.ts index 819bfeaf..2ead7055 100644 --- a/packages/components/nodes/documentloaders/Csv/Csv.ts +++ b/packages/components/nodes/documentloaders/Csv/Csv.ts @@ -1,6 +1,6 @@ import { INode, INodeData, INodeParams } from '../../../src/Interface' import { TextSplitter } from 'langchain/text_splitter' -import { CSVLoader } from "langchain/document_loaders/fs/csv"; +import { CSVLoader } from 'langchain/document_loaders/fs/csv' class Csv_DocumentLoaders implements INode { label: string @@ -38,7 +38,7 @@ class Csv_DocumentLoaders implements INode { name: 'columnName', type: 'string', description: 'Extracting a single column', - placeholder: "Enter column name", + placeholder: 'Enter column name', optional: true } ] From b28546c2ac6fc134e2bd4fce48f7fb98ff91d1c5 Mon Sep 17 00:00:00 2001 From: chungyau97 Date: Mon, 17 Apr 2023 21:53:47 +0700 Subject: [PATCH 14/20] add cheerio web scraper --- .../nodes/documentloaders/Cheerio/Cheerio.ts | 64 +++++++++++++++++++ .../nodes/documentloaders/Cheerio/cheerio.svg | 5 ++ packages/components/package.json | 1 + 3 files changed, 70 insertions(+) create mode 100644 packages/components/nodes/documentloaders/Cheerio/Cheerio.ts create mode 100644 packages/components/nodes/documentloaders/Cheerio/cheerio.svg diff --git a/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts b/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts new file mode 100644 index 00000000..8be10f74 --- /dev/null +++ b/packages/components/nodes/documentloaders/Cheerio/Cheerio.ts @@ -0,0 +1,64 @@ +import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { TextSplitter } from 'langchain/text_splitter' +import { CheerioWebBaseLoader } from 'langchain/document_loaders/web/cheerio' + +class Cheerio_DocumentLoaders implements INode { + label: string + name: string + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + + constructor() { + this.label = 'Cheerio Web Scraper' + this.name = 'cheerioWebScraper' + this.type = 'Document' + this.icon = 'cheerio.svg' + this.category = 'Document Loaders' + this.description = `Load data from webpages` + this.baseClasses = [this.type] + this.inputs = [ + { + label: 'URL', + name: 'url', + type: 'string' + }, + { + label: 'Text Splitter', + name: 'textSplitter', + type: 'TextSplitter', + optional: true + } + ] + } + + async init(nodeData: INodeData): Promise { + const textSplitter = nodeData.inputs?.textSplitter as TextSplitter + let url = nodeData.inputs?.url as string + + var urlPattern = new RegExp( + '^(https?:\\/\\/)?' + // validate protocol + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // validate domain name + '((\\d{1,3}\\.){3}\\d{1,3}))' + // validate OR ip (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // validate port and path + '(\\?[;&a-z\\d%_.~+=-]*)?' + // validate query string + '(\\#[-a-z\\d_]*)?$', + 'i' + ) // validate fragment locator + + const loader = new CheerioWebBaseLoader(urlPattern.test(url.trim()) ? url.trim() : '') + + if (textSplitter) { + const docs = await loader.loadAndSplit(textSplitter) + return docs + } else { + const docs = await loader.load() + return docs + } + } +} + +module.exports = { nodeClass: Cheerio_DocumentLoaders } diff --git a/packages/components/nodes/documentloaders/Cheerio/cheerio.svg b/packages/components/nodes/documentloaders/Cheerio/cheerio.svg new file mode 100644 index 00000000..8e3334b9 --- /dev/null +++ b/packages/components/nodes/documentloaders/Cheerio/cheerio.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/packages/components/package.json b/packages/components/package.json index d75cda9d..1775a8cf 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -20,6 +20,7 @@ "@huggingface/inference": "^1.6.3", "@pinecone-database/pinecone": "^0.0.12", "axios": "^0.27.2", + "cheerio": "^1.0.0-rc.12", "chromadb": "^1.3.1", "d3-dsv": "2", "dotenv": "^16.0.0", From 180990b0258a34640c589c1708296da1241bcb8a Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 17 Apr 2023 20:33:32 +0100 Subject: [PATCH 15/20] clear connected input if node/edge is removed --- .../ui/src/store/context/ReactFlowContext.js | 48 +++++++++++++++++-- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/store/context/ReactFlowContext.js b/packages/ui/src/store/context/ReactFlowContext.js index b8b32606..1a6b979f 100644 --- a/packages/ui/src/store/context/ReactFlowContext.js +++ b/packages/ui/src/store/context/ReactFlowContext.js @@ -13,13 +13,51 @@ export const flowContext = createContext(initialValue) export const ReactFlowContext = ({ children }) => { const [reactFlowInstance, setReactFlowInstance] = useState(null) - const deleteNode = (id) => { - reactFlowInstance.setNodes(reactFlowInstance.getNodes().filter((n) => n.id !== id)) - reactFlowInstance.setEdges(reactFlowInstance.getEdges().filter((ns) => ns.source !== id && ns.target !== id)) + 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)) } - const deleteEdge = (id) => { - reactFlowInstance.setEdges(reactFlowInstance.getEdges().filter((edge) => edge.id !== id)) + const deleteEdge = (edgeid) => { + deleteConnectedInput(edgeid, 'edge') + reactFlowInstance.setEdges(reactFlowInstance.getEdges().filter((edge) => edge.id !== edgeid)) + } + + const deleteConnectedInput = (id, type) => { + const connectedEdges = + type === 'node' + ? reactFlowInstance.getEdges().filter((edge) => edge.source === id) + : reactFlowInstance.getEdges().filter((edge) => edge.id === id) + + for (const edge of connectedEdges) { + const targetNodeId = edge.target + const sourceNodeId = edge.source + const targetInput = edge.targetHandle.split('-')[2] + + reactFlowInstance.setNodes((nds) => + nds.map((node) => { + if (node.id === targetNodeId) { + let value + const inputAnchor = node.data.inputAnchors.find((ancr) => ancr.name === targetInput) + if (inputAnchor && inputAnchor.list) { + const values = node.data.inputs[targetInput] || [] + value = values.filter((item) => !item.includes(sourceNodeId)) + } else { + value = '' + } + node.data = { + ...node.data, + inputs: { + ...node.data.inputs, + [targetInput]: value + } + } + } + return node + }) + ) + } } return ( From 4a9d91dd34a177f0118f0f5b1b3552c8bc5811c5 Mon Sep 17 00:00:00 2001 From: Henry Heng Date: Mon, 17 Apr 2023 20:50:57 +0100 Subject: [PATCH 16/20] Update langchain version to ^0.0.53 --- 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 edf0336f..83e3e023 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -26,7 +26,7 @@ "dotenv": "^16.0.0", "express": "^4.17.3", "form-data": "^4.0.0", - "langchain": "^0.0.56", + "langchain": "^0.0.53", "moment": "^2.29.3", "node-fetch": "2", "pdf-parse": "^1.1.1", From eb3897b042b973f35f53a893e51c25b0fe782365 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 17 Apr 2023 22:12:12 +0100 Subject: [PATCH 17/20] add fix to chat message scroll --- packages/ui/src/views/chatmessage/ChatMessage.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/views/chatmessage/ChatMessage.js b/packages/ui/src/views/chatmessage/ChatMessage.js index 4fbb54e6..4dbdc849 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.js +++ b/packages/ui/src/views/chatmessage/ChatMessage.js @@ -39,6 +39,7 @@ export const ChatMessage = ({ chatflowid }) => { const customization = useSelector((state) => state.customization) const { confirm } = useConfirm() const dispatch = useDispatch() + const ps = useRef() useNotifier() const enqueueSnackbar = (...args) => dispatch(enqueueSnackbarAction(...args)) @@ -115,7 +116,9 @@ export const ChatMessage = ({ chatflowid }) => { } const scrollToBottom = () => { - messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }) + if (ps.current) { + ps.current.scrollTo({ top: Number.MAX_SAFE_INTEGER, behavior: 'smooth' }) + } } const addChatMessage = async (message, type) => { @@ -286,7 +289,7 @@ export const ChatMessage = ({ chatflowid }) => {
-
+
{messages.map((message, index) => { return ( // The latest message sent by the user will be animated while waiting for a response @@ -331,7 +334,6 @@ export const ChatMessage = ({ chatflowid }) => { ) })} -
From f938ee7b4b412be2050dabcbaaad1012d05e8b00 Mon Sep 17 00:00:00 2001 From: Henry Heng Date: Tue, 18 Apr 2023 00:03:45 +0100 Subject: [PATCH 18/20] Fix yarn lint --- packages/ui/src/views/chatmessage/ChatMessage.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/ui/src/views/chatmessage/ChatMessage.js b/packages/ui/src/views/chatmessage/ChatMessage.js index 4dbdc849..b6632b1e 100644 --- a/packages/ui/src/views/chatmessage/ChatMessage.js +++ b/packages/ui/src/views/chatmessage/ChatMessage.js @@ -55,7 +55,6 @@ export const ChatMessage = ({ chatflowid }) => { } ]) - const messagesEndRef = useRef(null) const inputRef = useRef(null) const anchorRef = useRef(null) const prevOpen = useRef(open) From e1624d11d5ae069b58b9095029a643e695ca6647 Mon Sep 17 00:00:00 2001 From: Henry Date: Tue, 18 Apr 2023 00:36:18 +0100 Subject: [PATCH 19/20] add sqldbchain and example --- .../SqlDatabaseChain/SqlDatabaseChain.ts | 81 +++++++++ .../chains/SqlDatabaseChain/sqlchain.svg | 7 + .../server/marketplaces/SQL DB Chain.json | 163 ++++++++++++++++++ 3 files changed, 251 insertions(+) create mode 100644 packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts create mode 100644 packages/components/nodes/chains/SqlDatabaseChain/sqlchain.svg create mode 100644 packages/server/marketplaces/SQL DB Chain.json diff --git a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts new file mode 100644 index 00000000..1f6d9fdd --- /dev/null +++ b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts @@ -0,0 +1,81 @@ +import { INode, INodeData, INodeParams } from '../../../src/Interface' +import { SqlDatabaseChain } from 'langchain/chains' +import { getBaseClasses } from '../../../src/utils' +import { DataSource } from 'typeorm' +import { SqlDatabase } from 'langchain/sql_db' +import { BaseLLM } from 'langchain/llms/base' + +class SqlDatabaseChain_Chains implements INode { + label: string + name: string + type: string + icon: string + category: string + baseClasses: string[] + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Sql Database Chain' + this.name = 'sqlDatabaseChain' + this.type = 'SqlDatabaseChain' + this.icon = 'sqlchain.svg' + this.category = 'Chains' + this.description = 'Answer questions over a SQL database' + this.baseClasses = [this.type, ...getBaseClasses(SqlDatabaseChain)] + this.inputs = [ + { + label: 'LLM', + name: 'llm', + type: 'BaseLLM' + }, + { + label: 'Database', + name: 'database', + type: 'options', + options: [ + { + label: 'SQlite', + name: 'sqlite' + } + ], + default: 'sqlite' + }, + { + label: 'Database File Path', + name: 'dbFilePath', + type: 'string', + placeholder: 'C:/Users/chinook.db' + } + ] + } + + async init(nodeData: INodeData): Promise { + const databaseType = nodeData.inputs?.database + const llm = nodeData.inputs?.llm as BaseLLM + const dbFilePath = nodeData.inputs?.dbFilePath + + const datasource = new DataSource({ + type: databaseType, + database: dbFilePath + }) + + const db = await SqlDatabase.fromDataSourceParams({ + appDataSource: datasource + }) + + const chain = new SqlDatabaseChain({ + llm, + database: db + }) + return chain + } + + async run(nodeData: INodeData, input: string): Promise { + const chain = nodeData.instance as SqlDatabaseChain + const res = await chain.run(input) + return res + } +} + +module.exports = { nodeClass: SqlDatabaseChain_Chains } diff --git a/packages/components/nodes/chains/SqlDatabaseChain/sqlchain.svg b/packages/components/nodes/chains/SqlDatabaseChain/sqlchain.svg new file mode 100644 index 00000000..dcf937b3 --- /dev/null +++ b/packages/components/nodes/chains/SqlDatabaseChain/sqlchain.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/packages/server/marketplaces/SQL DB Chain.json b/packages/server/marketplaces/SQL DB Chain.json new file mode 100644 index 00000000..4d8b35c8 --- /dev/null +++ b/packages/server/marketplaces/SQL DB Chain.json @@ -0,0 +1,163 @@ +{ + "description": "Answer questions over a SQL database", + "nodes": [ + { + "width": 300, + "height": 424, + "id": "sqlDatabaseChain_0", + "position": { + "x": 1271.2742585099204, + "y": 232.91561199714107 + }, + "type": "customNode", + "data": { + "id": "sqlDatabaseChain_0", + "label": "Sql Database Chain", + "name": "sqlDatabaseChain", + "type": "SqlDatabaseChain", + "baseClasses": ["SqlDatabaseChain", "BaseChain"], + "category": "Chains", + "description": "Answer questions over a SQL database", + "inputParams": [ + { + "label": "Database", + "name": "database", + "type": "options", + "options": [ + { + "label": "SQlite", + "name": "sqlite" + } + ], + "default": "sqlite" + }, + { + "label": "Database File Path", + "name": "dbFilePath", + "type": "string", + "placeholder": "C:/Users/chinook.db" + } + ], + "inputAnchors": [ + { + "label": "LLM", + "name": "llm", + "type": "BaseLLM", + "id": "sqlDatabaseChain_0-input-llm-BaseLLM" + } + ], + "inputs": { + "llm": "{{openAI_0.data.instance}}", + "database": "sqlite", + "dbFilePath": "" + }, + "outputAnchors": [ + { + "id": "sqlDatabaseChain_0-output-sqlDatabaseChain-SqlDatabaseChain|BaseChain", + "name": "sqlDatabaseChain", + "label": "SqlDatabaseChain", + "type": "SqlDatabaseChain | BaseChain" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 1271.2742585099204, + "y": 232.91561199714107 + }, + "dragging": false + }, + { + "width": 300, + "height": 472, + "id": "openAI_0", + "position": { + "x": 867.8574087065126, + "y": 209.58625096303308 + }, + "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": "OpenAI Api Key", + "name": "openAIApiKey", + "type": "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 + }, + { + "label": "Temperature", + "name": "temperature", + "type": "number", + "default": 0.7, + "optional": true + } + ], + "inputAnchors": [], + "inputs": { + "modelName": "text-davinci-003", + "temperature": "0" + }, + "outputAnchors": [ + { + "id": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "name": "openAI", + "label": "OpenAI", + "type": "OpenAI | BaseLLM | BaseLanguageModel" + } + ], + "selected": false + }, + "selected": false, + "positionAbsolute": { + "x": 867.8574087065126, + "y": 209.58625096303308 + }, + "dragging": false + } + ], + "edges": [ + { + "source": "openAI_0", + "sourceHandle": "openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel", + "target": "sqlDatabaseChain_0", + "targetHandle": "sqlDatabaseChain_0-input-llm-BaseLLM", + "type": "buttonedge", + "id": "openAI_0-openAI_0-output-openAI-OpenAI|BaseLLM|BaseLanguageModel-sqlDatabaseChain_0-sqlDatabaseChain_0-input-llm-BaseLLM", + "data": { + "label": "" + } + } + ] +} From 557f50e52d07dfbcc129cd2219041de1a3b5ca47 Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 19 Apr 2023 14:55:32 +0100 Subject: [PATCH 20/20] add yarn build-force --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index cfc2aee5..82ade94c 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ ], "scripts": { "build": "turbo run build", + "build-force": "turbo run build --force", "dev": "turbo run dev --parallel", "start": "run-script-os", "start:windows": "cd packages/server/bin && run start",