add llamaindex

This commit is contained in:
Henry
2023-12-04 20:04:09 +00:00
parent 423c23aaf0
commit 40f8371de9
56 changed files with 4509 additions and 536 deletions
@@ -0,0 +1,855 @@
{
"description": "Answer question based on retrieved documents (context) with built-in memory to remember conversation using LlamaIndex",
"badge": "NEW",
"nodes": [
{
"width": 300,
"height": 438,
"id": "textFile_0",
"position": {
"x": 221.215421786192,
"y": 94.91489477412404
},
"type": "customNode",
"data": {
"id": "textFile_0",
"label": "Text File",
"version": 3,
"name": "textFile",
"type": "Document",
"baseClasses": ["Document"],
"category": "Document Loaders",
"description": "Load data from text files",
"inputParams": [
{
"label": "Txt File",
"name": "txtFile",
"type": "file",
"fileType": ".txt, .html, .aspx, .asp, .cpp, .c, .cs, .css, .go, .h, .java, .js, .less, .ts, .php, .proto, .python, .py, .rst, .ruby, .rb, .rs, .scala, .sc, .scss, .sol, .sql, .swift, .markdown, .md, .tex, .ltx, .vb, .xml",
"id": "textFile_0-input-txtFile-file"
},
{
"label": "Metadata",
"name": "metadata",
"type": "json",
"optional": true,
"additionalParams": true,
"id": "textFile_0-input-metadata-json"
}
],
"inputAnchors": [
{
"label": "Text Splitter",
"name": "textSplitter",
"type": "TextSplitter",
"optional": true,
"id": "textFile_0-input-textSplitter-TextSplitter"
}
],
"inputs": {
"textSplitter": "{{recursiveCharacterTextSplitter_0.data.instance}}",
"metadata": ""
},
"outputAnchors": [
{
"name": "output",
"label": "Output",
"type": "options",
"options": [
{
"id": "textFile_0-output-document-Document",
"name": "document",
"label": "Document",
"type": "Document"
},
{
"id": "textFile_0-output-text-string|json",
"name": "text",
"label": "Text",
"type": "string | json"
}
],
"default": "document"
}
],
"outputs": {
"output": "document"
},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 221.215421786192,
"y": 94.91489477412404
},
"dragging": false
},
{
"width": 300,
"height": 429,
"id": "recursiveCharacterTextSplitter_0",
"position": {
"x": -203.4868320229876,
"y": 101.32475976329766
},
"type": "customNode",
"data": {
"id": "recursiveCharacterTextSplitter_0",
"label": "Recursive Character Text Splitter",
"version": 2,
"name": "recursiveCharacterTextSplitter",
"type": "RecursiveCharacterTextSplitter",
"baseClasses": ["RecursiveCharacterTextSplitter", "TextSplitter", "BaseDocumentTransformer", "Runnable"],
"category": "Text Splitters",
"description": "Split documents recursively by different characters - starting with \"\\n\\n\", then \"\\n\", then \" \"",
"inputParams": [
{
"label": "Chunk Size",
"name": "chunkSize",
"type": "number",
"default": 1000,
"optional": true,
"id": "recursiveCharacterTextSplitter_0-input-chunkSize-number"
},
{
"label": "Chunk Overlap",
"name": "chunkOverlap",
"type": "number",
"optional": true,
"id": "recursiveCharacterTextSplitter_0-input-chunkOverlap-number"
},
{
"label": "Custom Separators",
"name": "separators",
"type": "string",
"rows": 4,
"description": "Array of custom separators to determine when to split the text, will override the default separators",
"placeholder": "[\"|\", \"##\", \">\", \"-\"]",
"additionalParams": true,
"optional": true,
"id": "recursiveCharacterTextSplitter_0-input-separators-string"
}
],
"inputAnchors": [],
"inputs": {
"chunkSize": 1000,
"chunkOverlap": "",
"separators": ""
},
"outputAnchors": [
{
"id": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable",
"name": "recursiveCharacterTextSplitter",
"label": "RecursiveCharacterTextSplitter",
"type": "RecursiveCharacterTextSplitter | TextSplitter | BaseDocumentTransformer | Runnable"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": -203.4868320229876,
"y": 101.32475976329766
},
"dragging": false
},
{
"width": 300,
"height": 334,
"id": "openAIEmbedding_LlamaIndex_0",
"position": {
"x": 176.27434578083106,
"y": 953.3664298122493
},
"type": "customNode",
"data": {
"id": "openAIEmbedding_LlamaIndex_0",
"label": "OpenAI Embedding",
"version": 1,
"name": "openAIEmbedding_LlamaIndex",
"type": "OpenAIEmbedding",
"baseClasses": ["OpenAIEmbedding", "BaseEmbedding_LlamaIndex", "BaseEmbedding"],
"tags": ["LlamaIndex"],
"category": "Embeddings",
"description": "OpenAI Embedding with LlamaIndex implementation",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"credentialNames": ["openAIApi"],
"id": "openAIEmbedding_LlamaIndex_0-input-credential-credential"
},
{
"label": "Timeout",
"name": "timeout",
"type": "number",
"optional": true,
"additionalParams": true,
"id": "openAIEmbedding_LlamaIndex_0-input-timeout-number"
},
{
"label": "BasePath",
"name": "basepath",
"type": "string",
"optional": true,
"additionalParams": true,
"id": "openAIEmbedding_LlamaIndex_0-input-basepath-string"
}
],
"inputAnchors": [],
"inputs": {
"timeout": "",
"basepath": ""
},
"outputAnchors": [
{
"id": "openAIEmbedding_LlamaIndex_0-output-openAIEmbedding_LlamaIndex-OpenAIEmbedding|BaseEmbedding_LlamaIndex|BaseEmbedding",
"name": "openAIEmbedding_LlamaIndex",
"label": "OpenAIEmbedding",
"type": "OpenAIEmbedding | BaseEmbedding_LlamaIndex | BaseEmbedding"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 176.27434578083106,
"y": 953.3664298122493
},
"dragging": false
},
{
"width": 300,
"height": 585,
"id": "pineconeLlamaIndex_0",
"position": {
"x": 609.3087433345761,
"y": 488.2141798951578
},
"type": "customNode",
"data": {
"id": "pineconeLlamaIndex_0",
"label": "Pinecone",
"version": 1,
"name": "pineconeLlamaIndex",
"type": "Pinecone",
"baseClasses": ["Pinecone", "VectorIndexRetriever"],
"tags": ["LlamaIndex"],
"category": "Vector Stores",
"description": "Upsert embedded data and perform similarity search upon query using Pinecone, a leading fully managed hosted vector database",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"credentialNames": ["pineconeApi"],
"id": "pineconeLlamaIndex_0-input-credential-credential"
},
{
"label": "Pinecone Index",
"name": "pineconeIndex",
"type": "string",
"id": "pineconeLlamaIndex_0-input-pineconeIndex-string"
},
{
"label": "Pinecone Namespace",
"name": "pineconeNamespace",
"type": "string",
"placeholder": "my-first-namespace",
"additionalParams": true,
"optional": true,
"id": "pineconeLlamaIndex_0-input-pineconeNamespace-string"
},
{
"label": "Pinecone Metadata Filter",
"name": "pineconeMetadataFilter",
"type": "json",
"optional": true,
"additionalParams": true,
"id": "pineconeLlamaIndex_0-input-pineconeMetadataFilter-json"
},
{
"label": "Top K",
"name": "topK",
"description": "Number of top results to fetch. Default to 4",
"placeholder": "4",
"type": "number",
"additionalParams": true,
"optional": true,
"id": "pineconeLlamaIndex_0-input-topK-number"
}
],
"inputAnchors": [
{
"label": "Document",
"name": "document",
"type": "Document",
"list": true,
"optional": true,
"id": "pineconeLlamaIndex_0-input-document-Document"
},
{
"label": "Chat Model",
"name": "model",
"type": "BaseChatModel_LlamaIndex",
"id": "pineconeLlamaIndex_0-input-model-BaseChatModel_LlamaIndex"
},
{
"label": "Embeddings",
"name": "embeddings",
"type": "BaseEmbedding_LlamaIndex",
"id": "pineconeLlamaIndex_0-input-embeddings-BaseEmbedding_LlamaIndex"
}
],
"inputs": {
"document": ["{{textFile_0.data.instance}}"],
"model": "{{chatOpenAI_LlamaIndex_1.data.instance}}",
"embeddings": "{{openAIEmbedding_LlamaIndex_0.data.instance}}",
"pineconeIndex": "",
"pineconeNamespace": "",
"pineconeMetadataFilter": "",
"topK": ""
},
"outputAnchors": [
{
"id": "pineconeLlamaIndex_0-output-pineconeLlamaIndex-Pinecone|VectorIndexRetriever",
"name": "pineconeLlamaIndex",
"label": "Pinecone",
"type": "Pinecone | VectorIndexRetriever"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 609.3087433345761,
"y": 488.2141798951578
},
"dragging": false
},
{
"width": 300,
"height": 529,
"id": "chatOpenAI_LlamaIndex_1",
"position": {
"x": -195.15244974578656,
"y": 584.9467028201428
},
"type": "customNode",
"data": {
"id": "chatOpenAI_LlamaIndex_1",
"label": "ChatOpenAI",
"version": 1,
"name": "chatOpenAI_LlamaIndex",
"type": "ChatOpenAI",
"baseClasses": ["ChatOpenAI", "BaseChatModel_LlamaIndex"],
"tags": ["LlamaIndex"],
"category": "Chat Models",
"description": "Wrapper around OpenAI Chat LLM with LlamaIndex implementation",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"credentialNames": ["openAIApi"],
"id": "chatOpenAI_LlamaIndex_1-input-credential-credential"
},
{
"label": "Model Name",
"name": "modelName",
"type": "options",
"options": [
{
"label": "gpt-4",
"name": "gpt-4"
},
{
"label": "gpt-4-1106-preview",
"name": "gpt-4-1106-preview"
},
{
"label": "gpt-4-vision-preview",
"name": "gpt-4-vision-preview"
},
{
"label": "gpt-4-0613",
"name": "gpt-4-0613"
},
{
"label": "gpt-4-32k",
"name": "gpt-4-32k"
},
{
"label": "gpt-4-32k-0613",
"name": "gpt-4-32k-0613"
},
{
"label": "gpt-3.5-turbo",
"name": "gpt-3.5-turbo"
},
{
"label": "gpt-3.5-turbo-1106",
"name": "gpt-3.5-turbo-1106"
},
{
"label": "gpt-3.5-turbo-0613",
"name": "gpt-3.5-turbo-0613"
},
{
"label": "gpt-3.5-turbo-16k",
"name": "gpt-3.5-turbo-16k"
},
{
"label": "gpt-3.5-turbo-16k-0613",
"name": "gpt-3.5-turbo-16k-0613"
}
],
"default": "gpt-3.5-turbo",
"optional": true,
"id": "chatOpenAI_LlamaIndex_1-input-modelName-options"
},
{
"label": "Temperature",
"name": "temperature",
"type": "number",
"step": 0.1,
"default": 0.9,
"optional": true,
"id": "chatOpenAI_LlamaIndex_1-input-temperature-number"
},
{
"label": "Max Tokens",
"name": "maxTokens",
"type": "number",
"step": 1,
"optional": true,
"additionalParams": true,
"id": "chatOpenAI_LlamaIndex_1-input-maxTokens-number"
},
{
"label": "Top Probability",
"name": "topP",
"type": "number",
"step": 0.1,
"optional": true,
"additionalParams": true,
"id": "chatOpenAI_LlamaIndex_1-input-topP-number"
},
{
"label": "Timeout",
"name": "timeout",
"type": "number",
"step": 1,
"optional": true,
"additionalParams": true,
"id": "chatOpenAI_LlamaIndex_1-input-timeout-number"
}
],
"inputAnchors": [],
"inputs": {
"modelName": "gpt-3.5-turbo-16k",
"temperature": 0.9,
"maxTokens": "",
"topP": "",
"timeout": ""
},
"outputAnchors": [
{
"id": "chatOpenAI_LlamaIndex_1-output-chatOpenAI_LlamaIndex-ChatOpenAI|BaseChatModel_LlamaIndex",
"name": "chatOpenAI_LlamaIndex",
"label": "ChatOpenAI",
"type": "ChatOpenAI | BaseChatModel_LlamaIndex"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": -195.15244974578656,
"y": 584.9467028201428
},
"dragging": false
},
{
"width": 300,
"height": 513,
"id": "contextChatEngine_0",
"position": {
"x": 1550.2553933740128,
"y": 270.7914631777829
},
"type": "customNode",
"data": {
"id": "contextChatEngine_0",
"label": "Context Chat Engine",
"version": 1,
"name": "contextChatEngine",
"type": "ContextChatEngine",
"baseClasses": ["ContextChatEngine"],
"tags": ["LlamaIndex"],
"category": "Engine",
"description": "Answer question based on retrieved documents (context) with built-in memory to remember conversation",
"inputParams": [
{
"label": "System Message",
"name": "systemMessagePrompt",
"type": "string",
"rows": 4,
"optional": true,
"placeholder": "I want you to act as a document that I am having a conversation with. Your name is \"AI Assistant\". You will provide me with answers from the given info. If the answer is not included, say exactly \"Hmm, I am not sure.\" and stop after that. Refuse to answer any question not about the info. Never break character.",
"id": "contextChatEngine_0-input-systemMessagePrompt-string"
}
],
"inputAnchors": [
{
"label": "Chat Model",
"name": "model",
"type": "BaseChatModel_LlamaIndex",
"id": "contextChatEngine_0-input-model-BaseChatModel_LlamaIndex"
},
{
"label": "Vector Store Retriever",
"name": "vectorStoreRetriever",
"type": "VectorIndexRetriever",
"id": "contextChatEngine_0-input-vectorStoreRetriever-VectorIndexRetriever"
},
{
"label": "Memory",
"name": "memory",
"type": "BaseChatMemory",
"id": "contextChatEngine_0-input-memory-BaseChatMemory"
}
],
"inputs": {
"model": "{{chatOpenAI_LlamaIndex_2.data.instance}}",
"vectorStoreRetriever": "{{pineconeLlamaIndex_0.data.instance}}",
"memory": "{{RedisBackedChatMemory_0.data.instance}}",
"systemMessagePrompt": ""
},
"outputAnchors": [
{
"id": "contextChatEngine_0-output-contextChatEngine-ContextChatEngine",
"name": "contextChatEngine",
"label": "ContextChatEngine",
"type": "ContextChatEngine"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 1550.2553933740128,
"y": 270.7914631777829
},
"dragging": false
},
{
"width": 300,
"height": 329,
"id": "RedisBackedChatMemory_0",
"position": {
"x": 1081.252815805786,
"y": 990.1701092562037
},
"type": "customNode",
"data": {
"id": "RedisBackedChatMemory_0",
"label": "Redis-Backed Chat Memory",
"version": 2,
"name": "RedisBackedChatMemory",
"type": "RedisBackedChatMemory",
"baseClasses": ["RedisBackedChatMemory", "BaseChatMemory", "BaseMemory"],
"category": "Memory",
"description": "Summarizes the conversation and stores the memory in Redis server",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"optional": true,
"credentialNames": ["redisCacheApi", "redisCacheUrlApi"],
"id": "RedisBackedChatMemory_0-input-credential-credential"
},
{
"label": "Session Id",
"name": "sessionId",
"type": "string",
"description": "If not specified, a random id will be used. Learn <a target=\"_blank\" href=\"https://docs.flowiseai.com/memory/long-term-memory#ui-and-embedded-chat\">more</a>",
"default": "",
"additionalParams": true,
"optional": true,
"id": "RedisBackedChatMemory_0-input-sessionId-string"
},
{
"label": "Session Timeouts",
"name": "sessionTTL",
"type": "number",
"description": "Omit this parameter to make sessions never expire",
"additionalParams": true,
"optional": true,
"id": "RedisBackedChatMemory_0-input-sessionTTL-number"
},
{
"label": "Memory Key",
"name": "memoryKey",
"type": "string",
"default": "chat_history",
"additionalParams": true,
"id": "RedisBackedChatMemory_0-input-memoryKey-string"
}
],
"inputAnchors": [],
"inputs": {
"sessionId": "",
"sessionTTL": "",
"memoryKey": "chat_history"
},
"outputAnchors": [
{
"id": "RedisBackedChatMemory_0-output-RedisBackedChatMemory-RedisBackedChatMemory|BaseChatMemory|BaseMemory",
"name": "RedisBackedChatMemory",
"label": "RedisBackedChatMemory",
"type": "RedisBackedChatMemory | BaseChatMemory | BaseMemory"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"dragging": false,
"positionAbsolute": {
"x": 1081.252815805786,
"y": 990.1701092562037
}
},
{
"width": 300,
"height": 529,
"id": "chatOpenAI_LlamaIndex_2",
"position": {
"x": 1015.1605888108386,
"y": -38.31143117572401
},
"type": "customNode",
"data": {
"id": "chatOpenAI_LlamaIndex_2",
"label": "ChatOpenAI",
"version": 1,
"name": "chatOpenAI_LlamaIndex",
"type": "ChatOpenAI",
"baseClasses": ["ChatOpenAI", "BaseChatModel_LlamaIndex"],
"tags": ["LlamaIndex"],
"category": "Chat Models",
"description": "Wrapper around OpenAI Chat LLM with LlamaIndex implementation",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"credentialNames": ["openAIApi"],
"id": "chatOpenAI_LlamaIndex_2-input-credential-credential"
},
{
"label": "Model Name",
"name": "modelName",
"type": "options",
"options": [
{
"label": "gpt-4",
"name": "gpt-4"
},
{
"label": "gpt-4-1106-preview",
"name": "gpt-4-1106-preview"
},
{
"label": "gpt-4-vision-preview",
"name": "gpt-4-vision-preview"
},
{
"label": "gpt-4-0613",
"name": "gpt-4-0613"
},
{
"label": "gpt-4-32k",
"name": "gpt-4-32k"
},
{
"label": "gpt-4-32k-0613",
"name": "gpt-4-32k-0613"
},
{
"label": "gpt-3.5-turbo",
"name": "gpt-3.5-turbo"
},
{
"label": "gpt-3.5-turbo-1106",
"name": "gpt-3.5-turbo-1106"
},
{
"label": "gpt-3.5-turbo-0613",
"name": "gpt-3.5-turbo-0613"
},
{
"label": "gpt-3.5-turbo-16k",
"name": "gpt-3.5-turbo-16k"
},
{
"label": "gpt-3.5-turbo-16k-0613",
"name": "gpt-3.5-turbo-16k-0613"
}
],
"default": "gpt-3.5-turbo",
"optional": true,
"id": "chatOpenAI_LlamaIndex_2-input-modelName-options"
},
{
"label": "Temperature",
"name": "temperature",
"type": "number",
"step": 0.1,
"default": 0.9,
"optional": true,
"id": "chatOpenAI_LlamaIndex_2-input-temperature-number"
},
{
"label": "Max Tokens",
"name": "maxTokens",
"type": "number",
"step": 1,
"optional": true,
"additionalParams": true,
"id": "chatOpenAI_LlamaIndex_2-input-maxTokens-number"
},
{
"label": "Top Probability",
"name": "topP",
"type": "number",
"step": 0.1,
"optional": true,
"additionalParams": true,
"id": "chatOpenAI_LlamaIndex_2-input-topP-number"
},
{
"label": "Timeout",
"name": "timeout",
"type": "number",
"step": 1,
"optional": true,
"additionalParams": true,
"id": "chatOpenAI_LlamaIndex_2-input-timeout-number"
}
],
"inputAnchors": [],
"inputs": {
"modelName": "gpt-3.5-turbo",
"temperature": 0.9,
"maxTokens": "",
"topP": "",
"timeout": ""
},
"outputAnchors": [
{
"id": "chatOpenAI_LlamaIndex_2-output-chatOpenAI_LlamaIndex-ChatOpenAI|BaseChatModel_LlamaIndex",
"name": "chatOpenAI_LlamaIndex",
"label": "ChatOpenAI",
"type": "ChatOpenAI | BaseChatModel_LlamaIndex"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 1015.1605888108386,
"y": -38.31143117572401
},
"dragging": false
}
],
"edges": [
{
"source": "recursiveCharacterTextSplitter_0",
"sourceHandle": "recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable",
"target": "textFile_0",
"targetHandle": "textFile_0-input-textSplitter-TextSplitter",
"type": "buttonedge",
"id": "recursiveCharacterTextSplitter_0-recursiveCharacterTextSplitter_0-output-recursiveCharacterTextSplitter-RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable-textFile_0-textFile_0-input-textSplitter-TextSplitter",
"data": {
"label": ""
}
},
{
"source": "textFile_0",
"sourceHandle": "textFile_0-output-document-Document",
"target": "pineconeLlamaIndex_0",
"targetHandle": "pineconeLlamaIndex_0-input-document-Document",
"type": "buttonedge",
"id": "textFile_0-textFile_0-output-document-Document-pineconeLlamaIndex_0-pineconeLlamaIndex_0-input-document-Document",
"data": {
"label": ""
}
},
{
"source": "chatOpenAI_LlamaIndex_1",
"sourceHandle": "chatOpenAI_LlamaIndex_1-output-chatOpenAI_LlamaIndex-ChatOpenAI|BaseChatModel_LlamaIndex",
"target": "pineconeLlamaIndex_0",
"targetHandle": "pineconeLlamaIndex_0-input-model-BaseChatModel_LlamaIndex",
"type": "buttonedge",
"id": "chatOpenAI_LlamaIndex_1-chatOpenAI_LlamaIndex_1-output-chatOpenAI_LlamaIndex-ChatOpenAI|BaseChatModel_LlamaIndex-pineconeLlamaIndex_0-pineconeLlamaIndex_0-input-model-BaseChatModel_LlamaIndex",
"data": {
"label": ""
}
},
{
"source": "openAIEmbedding_LlamaIndex_0",
"sourceHandle": "openAIEmbedding_LlamaIndex_0-output-openAIEmbedding_LlamaIndex-OpenAIEmbedding|BaseEmbedding_LlamaIndex|BaseEmbedding",
"target": "pineconeLlamaIndex_0",
"targetHandle": "pineconeLlamaIndex_0-input-embeddings-BaseEmbedding_LlamaIndex",
"type": "buttonedge",
"id": "openAIEmbedding_LlamaIndex_0-openAIEmbedding_LlamaIndex_0-output-openAIEmbedding_LlamaIndex-OpenAIEmbedding|BaseEmbedding_LlamaIndex|BaseEmbedding-pineconeLlamaIndex_0-pineconeLlamaIndex_0-input-embeddings-BaseEmbedding_LlamaIndex",
"data": {
"label": ""
}
},
{
"source": "pineconeLlamaIndex_0",
"sourceHandle": "pineconeLlamaIndex_0-output-pineconeLlamaIndex-Pinecone|VectorIndexRetriever",
"target": "contextChatEngine_0",
"targetHandle": "contextChatEngine_0-input-vectorStoreRetriever-VectorIndexRetriever",
"type": "buttonedge",
"id": "pineconeLlamaIndex_0-pineconeLlamaIndex_0-output-pineconeLlamaIndex-Pinecone|VectorIndexRetriever-contextChatEngine_0-contextChatEngine_0-input-vectorStoreRetriever-VectorIndexRetriever",
"data": {
"label": ""
}
},
{
"source": "RedisBackedChatMemory_0",
"sourceHandle": "RedisBackedChatMemory_0-output-RedisBackedChatMemory-RedisBackedChatMemory|BaseChatMemory|BaseMemory",
"target": "contextChatEngine_0",
"targetHandle": "contextChatEngine_0-input-memory-BaseChatMemory",
"type": "buttonedge",
"id": "RedisBackedChatMemory_0-RedisBackedChatMemory_0-output-RedisBackedChatMemory-RedisBackedChatMemory|BaseChatMemory|BaseMemory-contextChatEngine_0-contextChatEngine_0-input-memory-BaseChatMemory",
"data": {
"label": ""
}
},
{
"source": "chatOpenAI_LlamaIndex_2",
"sourceHandle": "chatOpenAI_LlamaIndex_2-output-chatOpenAI_LlamaIndex-ChatOpenAI|BaseChatModel_LlamaIndex",
"target": "contextChatEngine_0",
"targetHandle": "contextChatEngine_0-input-model-BaseChatModel_LlamaIndex",
"type": "buttonedge",
"id": "chatOpenAI_LlamaIndex_2-chatOpenAI_LlamaIndex_2-output-chatOpenAI_LlamaIndex-ChatOpenAI|BaseChatModel_LlamaIndex-contextChatEngine_0-contextChatEngine_0-input-model-BaseChatModel_LlamaIndex",
"data": {
"label": ""
}
}
]
}
@@ -205,7 +205,7 @@
"data": {
"id": "ZepMemory_0",
"label": "Zep Memory",
"version": 1,
"version": 2,
"name": "ZepMemory",
"type": "ZepMemory",
"baseClasses": ["ZepMemory", "BaseChatMemory", "BaseMemory"],
@@ -228,13 +228,6 @@
"default": "http://127.0.0.1:8000",
"id": "ZepMemory_0-input-baseURL-string"
},
{
"label": "Auto Summary",
"name": "autoSummary",
"type": "boolean",
"default": true,
"id": "ZepMemory_0-input-autoSummary-boolean"
},
{
"label": "Session Id",
"name": "sessionId",
@@ -252,15 +245,8 @@
"default": "10",
"step": 1,
"description": "Window of size k to surface the last k back-and-forths to use as memory.",
"id": "ZepMemory_0-input-k-number"
},
{
"label": "Auto Summary Template",
"name": "autoSummaryTemplate",
"type": "string",
"default": "This is the summary of the following conversation:\n{summary}",
"additionalParams": true,
"id": "ZepMemory_0-input-autoSummaryTemplate-string"
"id": "ZepMemory_0-input-k-number"
},
{
"label": "AI Prefix",
@@ -306,10 +292,8 @@
"inputAnchors": [],
"inputs": {
"baseURL": "http://127.0.0.1:8000",
"autoSummary": true,
"sessionId": "",
"k": "10",
"autoSummaryTemplate": "This is the summary of the following conversation:\n{summary}",
"aiPrefix": "ai",
"humanPrefix": "human",
"memoryKey": "chat_history",
@@ -0,0 +1,509 @@
{
"description": "Stateless query engine designed to answer question over your data using LlamaIndex",
"badge": "NEW",
"nodes": [
{
"width": 300,
"height": 382,
"id": "queryEngine_0",
"position": {
"x": 1407.9610494306783,
"y": 241.12144405808692
},
"type": "customNode",
"data": {
"id": "queryEngine_0",
"label": "Query Engine",
"version": 1,
"name": "queryEngine",
"type": "QueryEngine",
"baseClasses": ["QueryEngine"],
"tags": ["LlamaIndex"],
"category": "Engine",
"description": "Simple query engine built to answer question over your data, without memory",
"inputParams": [
{
"label": "Return Source Documents",
"name": "returnSourceDocuments",
"type": "boolean",
"optional": true,
"id": "queryEngine_0-input-returnSourceDocuments-boolean"
}
],
"inputAnchors": [
{
"label": "Vector Store Retriever",
"name": "vectorStoreRetriever",
"type": "VectorIndexRetriever",
"id": "queryEngine_0-input-vectorStoreRetriever-VectorIndexRetriever"
},
{
"label": "Response Synthesizer",
"name": "responseSynthesizer",
"type": "ResponseSynthesizer",
"description": "ResponseSynthesizer is responsible for sending the query, nodes, and prompt templates to the LLM to generate a response. See <a target=\"_blank\" href=\"https://ts.llamaindex.ai/modules/low_level/response_synthesizer\">more</a>",
"optional": true,
"id": "queryEngine_0-input-responseSynthesizer-ResponseSynthesizer"
}
],
"inputs": {
"vectorStoreRetriever": "{{pineconeLlamaIndex_0.data.instance}}",
"responseSynthesizer": "{{compactrefineLlamaIndex_0.data.instance}}",
"returnSourceDocuments": true
},
"outputAnchors": [
{
"id": "queryEngine_0-output-queryEngine-QueryEngine",
"name": "queryEngine",
"label": "QueryEngine",
"type": "QueryEngine"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 1407.9610494306783,
"y": 241.12144405808692
},
"dragging": false
},
{
"width": 300,
"height": 585,
"id": "pineconeLlamaIndex_0",
"position": {
"x": 977.3886641397302,
"y": -261.2253031641797
},
"type": "customNode",
"data": {
"id": "pineconeLlamaIndex_0",
"label": "Pinecone",
"version": 1,
"name": "pineconeLlamaIndex",
"type": "Pinecone",
"baseClasses": ["Pinecone", "VectorIndexRetriever"],
"tags": ["LlamaIndex"],
"category": "Vector Stores",
"description": "Upsert embedded data and perform similarity search upon query using Pinecone, a leading fully managed hosted vector database",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"credentialNames": ["pineconeApi"],
"id": "pineconeLlamaIndex_0-input-credential-credential"
},
{
"label": "Pinecone Index",
"name": "pineconeIndex",
"type": "string",
"id": "pineconeLlamaIndex_0-input-pineconeIndex-string"
},
{
"label": "Pinecone Namespace",
"name": "pineconeNamespace",
"type": "string",
"placeholder": "my-first-namespace",
"additionalParams": true,
"optional": true,
"id": "pineconeLlamaIndex_0-input-pineconeNamespace-string"
},
{
"label": "Pinecone Metadata Filter",
"name": "pineconeMetadataFilter",
"type": "json",
"optional": true,
"additionalParams": true,
"id": "pineconeLlamaIndex_0-input-pineconeMetadataFilter-json"
},
{
"label": "Top K",
"name": "topK",
"description": "Number of top results to fetch. Default to 4",
"placeholder": "4",
"type": "number",
"additionalParams": true,
"optional": true,
"id": "pineconeLlamaIndex_0-input-topK-number"
}
],
"inputAnchors": [
{
"label": "Document",
"name": "document",
"type": "Document",
"list": true,
"optional": true,
"id": "pineconeLlamaIndex_0-input-document-Document"
},
{
"label": "Chat Model",
"name": "model",
"type": "BaseChatModel_LlamaIndex",
"id": "pineconeLlamaIndex_0-input-model-BaseChatModel_LlamaIndex"
},
{
"label": "Embeddings",
"name": "embeddings",
"type": "BaseEmbedding_LlamaIndex",
"id": "pineconeLlamaIndex_0-input-embeddings-BaseEmbedding_LlamaIndex"
}
],
"inputs": {
"document": "",
"model": "{{chatAnthropic_LlamaIndex_0.data.instance}}",
"embeddings": "{{openAIEmbedding_LlamaIndex_0.data.instance}}",
"pineconeIndex": "",
"pineconeNamespace": "",
"pineconeMetadataFilter": "",
"topK": ""
},
"outputAnchors": [
{
"id": "pineconeLlamaIndex_0-output-pineconeLlamaIndex-Pinecone|VectorIndexRetriever",
"name": "pineconeLlamaIndex",
"label": "Pinecone",
"type": "Pinecone | VectorIndexRetriever"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 977.3886641397302,
"y": -261.2253031641797
},
"dragging": false
},
{
"width": 300,
"height": 334,
"id": "openAIEmbedding_LlamaIndex_0",
"position": {
"x": 529.8690713844503,
"y": -18.955726653613254
},
"type": "customNode",
"data": {
"id": "openAIEmbedding_LlamaIndex_0",
"label": "OpenAI Embedding",
"version": 1,
"name": "openAIEmbedding_LlamaIndex",
"type": "OpenAIEmbedding",
"baseClasses": ["OpenAIEmbedding", "BaseEmbedding_LlamaIndex", "BaseEmbedding"],
"tags": ["LlamaIndex"],
"category": "Embeddings",
"description": "OpenAI Embedding with LlamaIndex implementation",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"credentialNames": ["openAIApi"],
"id": "openAIEmbedding_LlamaIndex_0-input-credential-credential"
},
{
"label": "Timeout",
"name": "timeout",
"type": "number",
"optional": true,
"additionalParams": true,
"id": "openAIEmbedding_LlamaIndex_0-input-timeout-number"
},
{
"label": "BasePath",
"name": "basepath",
"type": "string",
"optional": true,
"additionalParams": true,
"id": "openAIEmbedding_LlamaIndex_0-input-basepath-string"
}
],
"inputAnchors": [],
"inputs": {
"timeout": "",
"basepath": ""
},
"outputAnchors": [
{
"id": "openAIEmbedding_LlamaIndex_0-output-openAIEmbedding_LlamaIndex-OpenAIEmbedding|BaseEmbedding_LlamaIndex|BaseEmbedding",
"name": "openAIEmbedding_LlamaIndex",
"label": "OpenAIEmbedding",
"type": "OpenAIEmbedding | BaseEmbedding_LlamaIndex | BaseEmbedding"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 529.8690713844503,
"y": -18.955726653613254
},
"dragging": false
},
{
"width": 300,
"height": 749,
"id": "compactrefineLlamaIndex_0",
"position": {
"x": 170.71031618977543,
"y": -33.83233752386292
},
"type": "customNode",
"data": {
"id": "compactrefineLlamaIndex_0",
"label": "Compact and Refine",
"version": 1,
"name": "compactrefineLlamaIndex",
"type": "CompactRefine",
"baseClasses": ["CompactRefine", "ResponseSynthesizer"],
"tags": ["LlamaIndex"],
"category": "Response Synthesizer",
"description": "CompactRefine is a slight variation of Refine that first compacts the text chunks into the smallest possible number of chunks.",
"inputParams": [
{
"label": "Refine Prompt",
"name": "refinePrompt",
"type": "string",
"rows": 4,
"default": "The original query is as follows: {query}\nWe have provided an existing answer: {existingAnswer}\nWe have the opportunity to refine the existing answer (only if needed) with some more context below.\n------------\n{context}\n------------\nGiven the new context, refine the original answer to better answer the query. If the context isn't useful, return the original answer.\nRefined Answer:",
"warning": "Prompt can contains no variables, or up to 3 variables. Variables must be {existingAnswer}, {context} and {query}",
"optional": true,
"id": "compactrefineLlamaIndex_0-input-refinePrompt-string"
},
{
"label": "Text QA Prompt",
"name": "textQAPrompt",
"type": "string",
"rows": 4,
"default": "Context information is below.\n---------------------\n{context}\n---------------------\nGiven the context information and not prior knowledge, answer the query.\nQuery: {query}\nAnswer:",
"warning": "Prompt can contains no variables, or up to 2 variables. Variables must be {context} and {query}",
"optional": true,
"id": "compactrefineLlamaIndex_0-input-textQAPrompt-string"
}
],
"inputAnchors": [],
"inputs": {
"refinePrompt": "The original query is as follows: {query}\nWe have provided an existing answer: {existingAnswer}\nWe have the opportunity to refine the existing answer (only if needed) with some more context below.\n------------\n{context}\n------------\nGiven the new context, refine the original answer to better answer the query. If the context isn't useful, return the original answer.\nRefined Answer:",
"textQAPrompt": "Context information:\n<context>\n{context}\n</context>\nGiven the context information and not prior knowledge, answer the query.\nQuery: {query}"
},
"outputAnchors": [
{
"id": "compactrefineLlamaIndex_0-output-compactrefineLlamaIndex-CompactRefine|ResponseSynthesizer",
"name": "compactrefineLlamaIndex",
"label": "CompactRefine",
"type": "CompactRefine | ResponseSynthesizer"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 170.71031618977543,
"y": -33.83233752386292
},
"dragging": false
},
{
"width": 300,
"height": 529,
"id": "chatAnthropic_LlamaIndex_0",
"position": {
"x": 521.3530883359147,
"y": -584.8241219614786
},
"type": "customNode",
"data": {
"id": "chatAnthropic_LlamaIndex_0",
"label": "ChatAnthropic",
"version": 1,
"name": "chatAnthropic_LlamaIndex",
"type": "ChatAnthropic",
"baseClasses": ["ChatAnthropic", "BaseChatModel_LlamaIndex"],
"tags": ["LlamaIndex"],
"category": "Chat Models",
"description": "Wrapper around ChatAnthropic LLM with LlamaIndex implementation",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"credentialNames": ["anthropicApi"],
"id": "chatAnthropic_LlamaIndex_0-input-credential-credential"
},
{
"label": "Model Name",
"name": "modelName",
"type": "options",
"options": [
{
"label": "claude-2",
"name": "claude-2",
"description": "Claude 2 latest major version, automatically get updates to the model as they are released"
},
{
"label": "claude-2.1",
"name": "claude-2.1",
"description": "Claude 2 latest full version"
},
{
"label": "claude-instant-1",
"name": "claude-instant-1",
"description": "Claude Instant latest major version, automatically get updates to the model as they are released"
},
{
"label": "claude-v1",
"name": "claude-v1"
},
{
"label": "claude-v1-100k",
"name": "claude-v1-100k"
},
{
"label": "claude-v1.0",
"name": "claude-v1.0"
},
{
"label": "claude-v1.2",
"name": "claude-v1.2"
},
{
"label": "claude-v1.3",
"name": "claude-v1.3"
},
{
"label": "claude-v1.3-100k",
"name": "claude-v1.3-100k"
},
{
"label": "claude-instant-v1",
"name": "claude-instant-v1"
},
{
"label": "claude-instant-v1-100k",
"name": "claude-instant-v1-100k"
},
{
"label": "claude-instant-v1.0",
"name": "claude-instant-v1.0"
},
{
"label": "claude-instant-v1.1",
"name": "claude-instant-v1.1"
},
{
"label": "claude-instant-v1.1-100k",
"name": "claude-instant-v1.1-100k"
}
],
"default": "claude-2",
"optional": true,
"id": "chatAnthropic_LlamaIndex_0-input-modelName-options"
},
{
"label": "Temperature",
"name": "temperature",
"type": "number",
"step": 0.1,
"default": 0.9,
"optional": true,
"id": "chatAnthropic_LlamaIndex_0-input-temperature-number"
},
{
"label": "Max Tokens",
"name": "maxTokensToSample",
"type": "number",
"step": 1,
"optional": true,
"additionalParams": true,
"id": "chatAnthropic_LlamaIndex_0-input-maxTokensToSample-number"
},
{
"label": "Top P",
"name": "topP",
"type": "number",
"step": 0.1,
"optional": true,
"additionalParams": true,
"id": "chatAnthropic_LlamaIndex_0-input-topP-number"
}
],
"inputAnchors": [],
"inputs": {
"modelName": "claude-2",
"temperature": 0.9,
"maxTokensToSample": "",
"topP": ""
},
"outputAnchors": [
{
"id": "chatAnthropic_LlamaIndex_0-output-chatAnthropic_LlamaIndex-ChatAnthropic|BaseChatModel_LlamaIndex",
"name": "chatAnthropic_LlamaIndex",
"label": "ChatAnthropic",
"type": "ChatAnthropic | BaseChatModel_LlamaIndex"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 521.3530883359147,
"y": -584.8241219614786
},
"dragging": false
}
],
"edges": [
{
"source": "pineconeLlamaIndex_0",
"sourceHandle": "pineconeLlamaIndex_0-output-pineconeLlamaIndex-Pinecone|VectorIndexRetriever",
"target": "queryEngine_0",
"targetHandle": "queryEngine_0-input-vectorStoreRetriever-VectorIndexRetriever",
"type": "buttonedge",
"id": "pineconeLlamaIndex_0-pineconeLlamaIndex_0-output-pineconeLlamaIndex-Pinecone|VectorIndexRetriever-queryEngine_0-queryEngine_0-input-vectorStoreRetriever-VectorIndexRetriever",
"data": {
"label": ""
}
},
{
"source": "openAIEmbedding_LlamaIndex_0",
"sourceHandle": "openAIEmbedding_LlamaIndex_0-output-openAIEmbedding_LlamaIndex-OpenAIEmbedding|BaseEmbedding_LlamaIndex|BaseEmbedding",
"target": "pineconeLlamaIndex_0",
"targetHandle": "pineconeLlamaIndex_0-input-embeddings-BaseEmbedding_LlamaIndex",
"type": "buttonedge",
"id": "openAIEmbedding_LlamaIndex_0-openAIEmbedding_LlamaIndex_0-output-openAIEmbedding_LlamaIndex-OpenAIEmbedding|BaseEmbedding_LlamaIndex|BaseEmbedding-pineconeLlamaIndex_0-pineconeLlamaIndex_0-input-embeddings-BaseEmbedding_LlamaIndex",
"data": {
"label": ""
}
},
{
"source": "compactrefineLlamaIndex_0",
"sourceHandle": "compactrefineLlamaIndex_0-output-compactrefineLlamaIndex-CompactRefine|ResponseSynthesizer",
"target": "queryEngine_0",
"targetHandle": "queryEngine_0-input-responseSynthesizer-ResponseSynthesizer",
"type": "buttonedge",
"id": "compactrefineLlamaIndex_0-compactrefineLlamaIndex_0-output-compactrefineLlamaIndex-CompactRefine|ResponseSynthesizer-queryEngine_0-queryEngine_0-input-responseSynthesizer-ResponseSynthesizer",
"data": {
"label": ""
}
},
{
"source": "chatAnthropic_LlamaIndex_0",
"sourceHandle": "chatAnthropic_LlamaIndex_0-output-chatAnthropic_LlamaIndex-ChatAnthropic|BaseChatModel_LlamaIndex",
"target": "pineconeLlamaIndex_0",
"targetHandle": "pineconeLlamaIndex_0-input-model-BaseChatModel_LlamaIndex",
"type": "buttonedge",
"id": "chatAnthropic_LlamaIndex_0-chatAnthropic_LlamaIndex_0-output-chatAnthropic_LlamaIndex-ChatAnthropic|BaseChatModel_LlamaIndex-pineconeLlamaIndex_0-pineconeLlamaIndex_0-input-model-BaseChatModel_LlamaIndex",
"data": {
"label": ""
}
}
]
}
@@ -0,0 +1,270 @@
{
"description": "Simple chat engine to handle back and forth conversations using LlamaIndex",
"badge": "NEW",
"nodes": [
{
"width": 300,
"height": 462,
"id": "simpleChatEngine_0",
"position": {
"x": 1210.127368000538,
"y": 324.98110560103896
},
"type": "customNode",
"data": {
"id": "simpleChatEngine_0",
"label": "Simple Chat Engine",
"version": 1,
"name": "simpleChatEngine",
"type": "SimpleChatEngine",
"baseClasses": ["SimpleChatEngine"],
"tags": ["LlamaIndex"],
"category": "Engine",
"description": "Simple engine to handle back and forth conversations",
"inputParams": [
{
"label": "System Message",
"name": "systemMessagePrompt",
"type": "string",
"rows": 4,
"optional": true,
"placeholder": "You are a helpful assistant",
"id": "simpleChatEngine_0-input-systemMessagePrompt-string"
}
],
"inputAnchors": [
{
"label": "Chat Model",
"name": "model",
"type": "BaseChatModel_LlamaIndex",
"id": "simpleChatEngine_0-input-model-BaseChatModel_LlamaIndex"
},
{
"label": "Memory",
"name": "memory",
"type": "BaseChatMemory",
"id": "simpleChatEngine_0-input-memory-BaseChatMemory"
}
],
"inputs": {
"model": "{{azureChatOpenAI_LlamaIndex_0.data.instance}}",
"memory": "{{bufferMemory_0.data.instance}}",
"systemMessagePrompt": "You are a helpful assistant."
},
"outputAnchors": [
{
"id": "simpleChatEngine_0-output-simpleChatEngine-SimpleChatEngine",
"name": "simpleChatEngine",
"label": "SimpleChatEngine",
"type": "SimpleChatEngine"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"dragging": false,
"positionAbsolute": {
"x": 1210.127368000538,
"y": 324.98110560103896
}
},
{
"width": 300,
"height": 376,
"id": "bufferMemory_0",
"position": {
"x": 393.9823478014782,
"y": 415.7414943210391
},
"type": "customNode",
"data": {
"id": "bufferMemory_0",
"label": "Buffer Memory",
"version": 1,
"name": "bufferMemory",
"type": "BufferMemory",
"baseClasses": ["BufferMemory", "BaseChatMemory", "BaseMemory"],
"category": "Memory",
"description": "Remembers previous conversational back and forths directly",
"inputParams": [
{
"label": "Memory Key",
"name": "memoryKey",
"type": "string",
"default": "chat_history",
"id": "bufferMemory_0-input-memoryKey-string"
},
{
"label": "Input Key",
"name": "inputKey",
"type": "string",
"default": "input",
"id": "bufferMemory_0-input-inputKey-string"
}
],
"inputAnchors": [],
"inputs": {
"memoryKey": "chat_history",
"inputKey": "input"
},
"outputAnchors": [
{
"id": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory",
"name": "bufferMemory",
"label": "BufferMemory",
"type": "BufferMemory | BaseChatMemory | BaseMemory"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 393.9823478014782,
"y": 415.7414943210391
},
"dragging": false
},
{
"width": 300,
"height": 529,
"id": "azureChatOpenAI_LlamaIndex_0",
"position": {
"x": 746.5530862509605,
"y": -54.107978373323306
},
"type": "customNode",
"data": {
"id": "azureChatOpenAI_LlamaIndex_0",
"label": "AzureChatOpenAI",
"version": 1,
"name": "azureChatOpenAI_LlamaIndex",
"type": "AzureChatOpenAI",
"baseClasses": ["AzureChatOpenAI", "BaseChatModel_LlamaIndex"],
"tags": ["LlamaIndex"],
"category": "Chat Models",
"description": "Wrapper around Azure OpenAI Chat LLM with LlamaIndex implementation",
"inputParams": [
{
"label": "Connect Credential",
"name": "credential",
"type": "credential",
"credentialNames": ["azureOpenAIApi"],
"id": "azureChatOpenAI_LlamaIndex_0-input-credential-credential"
},
{
"label": "Model Name",
"name": "modelName",
"type": "options",
"options": [
{
"label": "gpt-4",
"name": "gpt-4"
},
{
"label": "gpt-4-32k",
"name": "gpt-4-32k"
},
{
"label": "gpt-3.5-turbo",
"name": "gpt-3.5-turbo"
},
{
"label": "gpt-3.5-turbo-16k",
"name": "gpt-3.5-turbo-16k"
}
],
"default": "gpt-3.5-turbo-16k",
"optional": true,
"id": "azureChatOpenAI_LlamaIndex_0-input-modelName-options"
},
{
"label": "Temperature",
"name": "temperature",
"type": "number",
"step": 0.1,
"default": 0.9,
"optional": true,
"id": "azureChatOpenAI_LlamaIndex_0-input-temperature-number"
},
{
"label": "Max Tokens",
"name": "maxTokens",
"type": "number",
"step": 1,
"optional": true,
"additionalParams": true,
"id": "azureChatOpenAI_LlamaIndex_0-input-maxTokens-number"
},
{
"label": "Top Probability",
"name": "topP",
"type": "number",
"step": 0.1,
"optional": true,
"additionalParams": true,
"id": "azureChatOpenAI_LlamaIndex_0-input-topP-number"
},
{
"label": "Timeout",
"name": "timeout",
"type": "number",
"step": 1,
"optional": true,
"additionalParams": true,
"id": "azureChatOpenAI_LlamaIndex_0-input-timeout-number"
}
],
"inputAnchors": [],
"inputs": {
"modelName": "gpt-3.5-turbo-16k",
"temperature": 0.9,
"maxTokens": "",
"topP": "",
"timeout": ""
},
"outputAnchors": [
{
"id": "azureChatOpenAI_LlamaIndex_0-output-azureChatOpenAI_LlamaIndex-AzureChatOpenAI|BaseChatModel_LlamaIndex",
"name": "azureChatOpenAI_LlamaIndex",
"label": "AzureChatOpenAI",
"type": "AzureChatOpenAI | BaseChatModel_LlamaIndex"
}
],
"outputs": {},
"selected": false
},
"selected": false,
"positionAbsolute": {
"x": 746.5530862509605,
"y": -54.107978373323306
},
"dragging": false
}
],
"edges": [
{
"source": "bufferMemory_0",
"sourceHandle": "bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory",
"target": "simpleChatEngine_0",
"targetHandle": "simpleChatEngine_0-input-memory-BaseChatMemory",
"type": "buttonedge",
"id": "bufferMemory_0-bufferMemory_0-output-bufferMemory-BufferMemory|BaseChatMemory|BaseMemory-simpleChatEngine_0-simpleChatEngine_0-input-memory-BaseChatMemory",
"data": {
"label": ""
}
},
{
"source": "azureChatOpenAI_LlamaIndex_0",
"sourceHandle": "azureChatOpenAI_LlamaIndex_0-output-azureChatOpenAI_LlamaIndex-AzureChatOpenAI|BaseChatModel_LlamaIndex",
"target": "simpleChatEngine_0",
"targetHandle": "simpleChatEngine_0-input-model-BaseChatModel_LlamaIndex",
"type": "buttonedge",
"id": "azureChatOpenAI_LlamaIndex_0-azureChatOpenAI_LlamaIndex_0-output-azureChatOpenAI_LlamaIndex-AzureChatOpenAI|BaseChatModel_LlamaIndex-simpleChatEngine_0-simpleChatEngine_0-input-model-BaseChatModel_LlamaIndex",
"data": {
"label": ""
}
}
]
}
@@ -589,7 +589,7 @@
"label": "Session Id",
"name": "sessionId",
"type": "string",
"description": "If not specified, the first CHAT_MESSAGE_ID will be used as sessionId",
"description": "If not specified, a random id will be used. Learn <a target=\"_blank\" href=\"https://docs.flowiseai.com/memory/long-term-memory#ui-and-embedded-chat\">more</a>",
"default": "",
"additionalParams": true,
"optional": true,
+37 -31
View File
@@ -37,13 +37,12 @@ import {
databaseEntities,
transformToCredentialEntity,
decryptCredentialData,
clearAllSessionMemory,
replaceInputsWithConfig,
getEncryptionKey,
checkMemorySessionId,
clearSessionMemoryFromViewMessageDialog,
replaceMemorySessionId,
getUserHome,
replaceChatHistory
replaceChatHistory,
clearSessionMemory
} from './utils'
import { cloneDeep, omit, uniqWith, isEqual } from 'lodash'
import { getDataSource } from './DataSource'
@@ -387,7 +386,12 @@ export class App {
const endingNodeData = nodes.find((nd) => nd.id === endingNodeId)?.data
if (!endingNodeData) return res.status(500).send(`Ending node ${endingNodeId} data not found`)
if (endingNodeData && endingNodeData.category !== 'Chains' && endingNodeData.category !== 'Agents') {
if (
endingNodeData &&
endingNodeData.category !== 'Chains' &&
endingNodeData.category !== 'Agents' &&
endingNodeData.category !== 'Engine'
) {
return res.status(500).send(`Ending node must be either a Chain or Agent`)
}
@@ -472,18 +476,15 @@ export class App {
const parsedFlowData: IReactFlowObject = JSON.parse(flowData)
const nodes = parsedFlowData.nodes
if (isClearFromViewMessageDialog) {
await clearSessionMemoryFromViewMessageDialog(
nodes,
this.nodesPool.componentNodes,
chatId,
this.AppDataSource,
sessionId,
memoryType
)
} else {
await clearAllSessionMemory(nodes, this.nodesPool.componentNodes, chatId, this.AppDataSource, sessionId)
}
await clearSessionMemory(
nodes,
this.nodesPool.componentNodes,
chatId,
this.AppDataSource,
sessionId,
memoryType,
isClearFromViewMessageDialog
)
const deleteOptions: FindOptionsWhere<ChatMessage> = { chatflowid, chatId }
if (memoryType) deleteOptions.memoryType = memoryType
@@ -1377,7 +1378,13 @@ export class App {
const endingNodeData = nodes.find((nd) => nd.id === endingNodeId)?.data
if (!endingNodeData) return res.status(500).send(`Ending node ${endingNodeId} data not found`)
if (endingNodeData && endingNodeData.category !== 'Chains' && endingNodeData.category !== 'Agents' && !isUpsert) {
if (
endingNodeData &&
endingNodeData.category !== 'Chains' &&
endingNodeData.category !== 'Agents' &&
endingNodeData.category !== 'Engine' &&
!isUpsert
) {
return res.status(500).send(`Ending node must be either a Chain or Agent`)
}
@@ -1396,7 +1403,9 @@ export class App {
isStreamValid = isFlowValidForStream(nodes, endingNodeData)
let chatHistory: IMessage[] | string = incomingInput.history
let chatHistory: IMessage[] = incomingInput.history
// If chatHistory is empty, and sessionId/chatId is present, replace it
if (
endingNodeData.inputs?.memory &&
!incomingInput.history &&
@@ -1437,8 +1446,10 @@ export class App {
const nodeToExecute = reactFlowNodes.find((node: IReactFlowNode) => node.id === endingNodeId)
if (!nodeToExecute) return res.status(404).send(`Node ${endingNodeId} not found`)
if (incomingInput.overrideConfig)
if (incomingInput.overrideConfig) {
nodeToExecute.data = replaceInputsWithConfig(nodeToExecute.data, incomingInput.overrideConfig)
}
const reactFlowNodeData: INodeData = resolveVariables(
nodeToExecute.data,
reactFlowNodes,
@@ -1458,19 +1469,11 @@ export class App {
logger.debug(`[server]: Running ${nodeToExecuteData.label} (${nodeToExecuteData.id})`)
let sessionId = undefined
if (nodeToExecuteData.instance) sessionId = checkMemorySessionId(nodeToExecuteData.instance, chatId)
const memoryNode = this.findMemoryLabel(nodes, edges)
const memoryType = memoryNode?.data.label
let chatHistory: IMessage[] | string = incomingInput.history
if (memoryNode && !incomingInput.history && (incomingInput.chatId || incomingInput.overrideConfig?.sessionId)) {
chatHistory = await replaceChatHistory(memoryNode, incomingInput, this.AppDataSource, databaseEntities, logger)
}
if (nodeToExecuteData.instance) sessionId = replaceMemorySessionId(nodeToExecuteData.instance, chatId)
let result = isStreamValid
? await nodeInstance.run(nodeToExecuteData, incomingInput.question, {
chatHistory,
chatHistory: incomingInput.history,
socketIO,
socketIOClientId: incomingInput.socketIOClientId,
logger,
@@ -1480,7 +1483,7 @@ export class App {
chatId
})
: await nodeInstance.run(nodeToExecuteData, incomingInput.question, {
chatHistory,
chatHistory: incomingInput.history,
logger,
appDataSource: this.AppDataSource,
databaseEntities,
@@ -1495,6 +1498,9 @@ export class App {
sessionId = result.assistant.threadId
}
const memoryNode = this.findMemoryLabel(nodes, edges)
const memoryType = memoryNode?.data.label
const userMessage: Omit<IChatMessage, 'id'> = {
role: 'userMessage',
content: incomingInput.question,
+40 -58
View File
@@ -217,7 +217,7 @@ export const buildLangchain = async (
depthQueue: IDepthQueue,
componentNodes: IComponentNodes,
question: string,
chatHistory: IMessage[] | string,
chatHistory: IMessage[],
chatId: string,
chatflowid: string,
appDataSource: DataSource,
@@ -324,22 +324,30 @@ export const buildLangchain = async (
}
/**
* Clear all session memories on the canvas
* Clear session memories
* @param {IReactFlowNode[]} reactFlowNodes
* @param {IComponentNodes} componentNodes
* @param {string} chatId
* @param {DataSource} appDataSource
* @param {string} sessionId
* @param {string} memoryType
* @param {string} isClearFromViewMessageDialog
*/
export const clearAllSessionMemory = async (
export const clearSessionMemory = async (
reactFlowNodes: IReactFlowNode[],
componentNodes: IComponentNodes,
chatId: string,
appDataSource: DataSource,
sessionId?: string
sessionId?: string,
memoryType?: string,
isClearFromViewMessageDialog?: string
) => {
for (const node of reactFlowNodes) {
if (node.data.category !== 'Memory' && node.data.type !== 'OpenAIAssistant') continue
// Only clear specific session memory from View Message Dialog UI
if (isClearFromViewMessageDialog && memoryType && node.data.label !== memoryType) continue
const nodeInstanceFilePath = componentNodes[node.data.name].filePath as string
const nodeModule = await import(nodeInstanceFilePath)
const newNodeInstance = new nodeModule.nodeClass()
@@ -348,42 +356,10 @@ export const clearAllSessionMemory = async (
node.data.inputs.sessionId = sessionId
}
if (newNodeInstance.memoryMethods && newNodeInstance.memoryMethods.clearSessionMemory) {
await newNodeInstance.memoryMethods.clearSessionMemory(node.data, { chatId, appDataSource, databaseEntities, logger })
}
}
}
const initializedInstance = await newNodeInstance.init(node.data, '', { chatId, appDataSource, databaseEntities, logger })
/**
* Clear specific session memory from View Message Dialog UI
* @param {IReactFlowNode[]} reactFlowNodes
* @param {IComponentNodes} componentNodes
* @param {string} chatId
* @param {DataSource} appDataSource
* @param {string} sessionId
* @param {string} memoryType
*/
export const clearSessionMemoryFromViewMessageDialog = async (
reactFlowNodes: IReactFlowNode[],
componentNodes: IComponentNodes,
chatId: string,
appDataSource: DataSource,
sessionId?: string,
memoryType?: string
) => {
if (!sessionId) return
for (const node of reactFlowNodes) {
if (node.data.category !== 'Memory' && node.data.type !== 'OpenAIAssistant') continue
if (memoryType && node.data.label !== memoryType) continue
const nodeInstanceFilePath = componentNodes[node.data.name].filePath as string
const nodeModule = await import(nodeInstanceFilePath)
const newNodeInstance = new nodeModule.nodeClass()
if (sessionId && node.data.inputs) node.data.inputs.sessionId = sessionId
if (newNodeInstance.memoryMethods && newNodeInstance.memoryMethods.clearSessionMemory) {
await newNodeInstance.memoryMethods.clearSessionMemory(node.data, { chatId, appDataSource, databaseEntities, logger })
return
if (initializedInstance.clearChatMessages) {
await initializedInstance.clearChatMessages()
}
}
}
@@ -400,7 +376,7 @@ export const getVariableValue = (
paramValue: string,
reactFlowNodes: IReactFlowNode[],
question: string,
chatHistory: IMessage[] | string,
chatHistory: IMessage[],
isAcceptVariable = false
) => {
let returnVal = paramValue
@@ -433,10 +409,7 @@ export const getVariableValue = (
}
if (isAcceptVariable && variableFullPath === CHAT_HISTORY_VAR_PREFIX) {
variableDict[`{{${variableFullPath}}}`] = handleEscapeCharacters(
typeof chatHistory === 'string' ? chatHistory : convertChatHistoryToText(chatHistory),
false
)
variableDict[`{{${variableFullPath}}}`] = handleEscapeCharacters(convertChatHistoryToText(chatHistory), false)
}
// Split by first occurrence of '.' to get just nodeId
@@ -479,7 +452,7 @@ export const resolveVariables = (
reactFlowNodeData: INodeData,
reactFlowNodes: IReactFlowNode[],
question: string,
chatHistory: IMessage[] | string
chatHistory: IMessage[]
): INodeData => {
let flowNodeData = cloneDeep(reactFlowNodeData)
const types = 'inputs'
@@ -558,7 +531,7 @@ export const isStartNodeDependOnInput = (startingNodes: IReactFlowNode[], nodes:
if (inputVariables.length > 0) return true
}
}
const whitelistNodeNames = ['vectorStoreToDocument', 'autoGPT']
const whitelistNodeNames = ['vectorStoreToDocument', 'autoGPT', 'chatPromptTemplate', 'promptTemplate'] //If these nodes are found, chatflow cannot be reused
for (const node of nodes) {
if (whitelistNodeNames.includes(node.data.name)) return true
}
@@ -706,7 +679,15 @@ export const findAvailableConfigs = (reactFlowNodes: IReactFlowNode[], component
*/
export const isFlowValidForStream = (reactFlowNodes: IReactFlowNode[], endingNodeData: INodeData) => {
const streamAvailableLLMs = {
'Chat Models': ['azureChatOpenAI', 'chatOpenAI', 'chatAnthropic', 'chatOllama', 'awsChatBedrock'],
'Chat Models': [
'azureChatOpenAI',
'chatOpenAI',
'chatOpenAI_LlamaIndex',
'chatAnthropic',
'chatAnthropic_LlamaIndex',
'chatOllama',
'awsChatBedrock'
],
LLMs: ['azureOpenAI', 'openAI', 'ollama']
}
@@ -729,6 +710,9 @@ export const isFlowValidForStream = (reactFlowNodes: IReactFlowNode[], endingNod
// Agent that are available to stream
const whitelistAgents = ['openAIFunctionAgent', 'csvAgent', 'airtableAgent', 'conversationalRetrievalAgent']
isValidChainOrAgent = whitelistAgents.includes(endingNodeData.name)
} else if (endingNodeData.category === 'Engine') {
const whitelistEngine = ['contextChatEngine', 'simpleChatEngine']
isValidChainOrAgent = whitelistEngine.includes(endingNodeData.name)
}
// If no output parser, flow is available to stream
@@ -866,7 +850,7 @@ export const redactCredentialWithPasswordType = (
* @param {any} instance
* @param {string} chatId
*/
export const checkMemorySessionId = (instance: any, chatId: string): string | undefined => {
export const replaceMemorySessionId = (instance: any, chatId: string): string | undefined => {
if (instance.memory && instance.memory.isSessionIdUsingChatMessageId && chatId) {
instance.memory.sessionId = chatId
instance.memory.chatHistory.sessionId = chatId
@@ -893,7 +877,7 @@ export const replaceChatHistory = async (
appDataSource: DataSource,
databaseEntities: IDatabaseEntity,
logger: any
): Promise<string> => {
): Promise<IMessage[]> => {
const nodeInstanceFilePath = memoryNode.data.filePath as string
const nodeModule = await import(nodeInstanceFilePath)
const newNodeInstance = new nodeModule.nodeClass()
@@ -902,14 +886,12 @@ export const replaceChatHistory = async (
memoryNode.data.inputs.sessionId = incomingInput.overrideConfig.sessionId
}
if (newNodeInstance.memoryMethods && newNodeInstance.memoryMethods.getChatMessages) {
return await newNodeInstance.memoryMethods.getChatMessages(memoryNode.data, {
chatId: incomingInput.chatId,
appDataSource,
databaseEntities,
logger
})
}
const initializedInstance = await newNodeInstance.init(memoryNode.data, '', {
chatId: incomingInput.chatId,
appDataSource,
databaseEntities,
logger
})
return ''
return await initializedInstance.getChatMessages()
}