mirror of
https://github.com/farcasclaudiu/Flowise.git
synced 2026-06-28 21:00:58 +03:00
Merge branch 'main' of github.com:0xi4o/Flowise into feature/chat-message-feedback
This commit is contained in:
@@ -34,6 +34,12 @@ class Folder_DocumentLoaders implements INode {
|
|||||||
type: 'string',
|
type: 'string',
|
||||||
placeholder: ''
|
placeholder: ''
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Recursive',
|
||||||
|
name: 'recursive',
|
||||||
|
type: 'boolean',
|
||||||
|
additionalParams: false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'Text Splitter',
|
label: 'Text Splitter',
|
||||||
name: 'textSplitter',
|
name: 'textSplitter',
|
||||||
@@ -54,49 +60,54 @@ class Folder_DocumentLoaders implements INode {
|
|||||||
const textSplitter = nodeData.inputs?.textSplitter as TextSplitter
|
const textSplitter = nodeData.inputs?.textSplitter as TextSplitter
|
||||||
const folderPath = nodeData.inputs?.folderPath as string
|
const folderPath = nodeData.inputs?.folderPath as string
|
||||||
const metadata = nodeData.inputs?.metadata
|
const metadata = nodeData.inputs?.metadata
|
||||||
|
const recursive = nodeData.inputs?.recursive as boolean
|
||||||
|
|
||||||
const loader = new DirectoryLoader(folderPath, {
|
const loader = new DirectoryLoader(
|
||||||
'.json': (path) => new JSONLoader(path),
|
folderPath,
|
||||||
'.txt': (path) => new TextLoader(path),
|
{
|
||||||
'.csv': (path) => new CSVLoader(path),
|
'.json': (path) => new JSONLoader(path),
|
||||||
'.docx': (path) => new DocxLoader(path),
|
'.txt': (path) => new TextLoader(path),
|
||||||
// @ts-ignore
|
'.csv': (path) => new CSVLoader(path),
|
||||||
'.pdf': (path) => new PDFLoader(path, { pdfjs: () => import('pdf-parse/lib/pdf.js/v1.10.100/build/pdf.js') }),
|
'.docx': (path) => new DocxLoader(path),
|
||||||
'.aspx': (path) => new TextLoader(path),
|
// @ts-ignore
|
||||||
'.asp': (path) => new TextLoader(path),
|
'.pdf': (path) => new PDFLoader(path, { pdfjs: () => import('pdf-parse/lib/pdf.js/v1.10.100/build/pdf.js') }),
|
||||||
'.cpp': (path) => new TextLoader(path), // C++
|
'.aspx': (path) => new TextLoader(path),
|
||||||
'.c': (path) => new TextLoader(path),
|
'.asp': (path) => new TextLoader(path),
|
||||||
'.cs': (path) => new TextLoader(path),
|
'.cpp': (path) => new TextLoader(path), // C++
|
||||||
'.css': (path) => new TextLoader(path),
|
'.c': (path) => new TextLoader(path),
|
||||||
'.go': (path) => new TextLoader(path), // Go
|
'.cs': (path) => new TextLoader(path),
|
||||||
'.h': (path) => new TextLoader(path), // C++ Header files
|
'.css': (path) => new TextLoader(path),
|
||||||
'.kt': (path) => new TextLoader(path), // Kotlin
|
'.go': (path) => new TextLoader(path), // Go
|
||||||
'.java': (path) => new TextLoader(path), // Java
|
'.h': (path) => new TextLoader(path), // C++ Header files
|
||||||
'.js': (path) => new TextLoader(path), // JavaScript
|
'.kt': (path) => new TextLoader(path), // Kotlin
|
||||||
'.less': (path) => new TextLoader(path), // Less files
|
'.java': (path) => new TextLoader(path), // Java
|
||||||
'.ts': (path) => new TextLoader(path), // TypeScript
|
'.js': (path) => new TextLoader(path), // JavaScript
|
||||||
'.php': (path) => new TextLoader(path), // PHP
|
'.less': (path) => new TextLoader(path), // Less files
|
||||||
'.proto': (path) => new TextLoader(path), // Protocol Buffers
|
'.ts': (path) => new TextLoader(path), // TypeScript
|
||||||
'.python': (path) => new TextLoader(path), // Python
|
'.php': (path) => new TextLoader(path), // PHP
|
||||||
'.py': (path) => new TextLoader(path), // Python
|
'.proto': (path) => new TextLoader(path), // Protocol Buffers
|
||||||
'.rst': (path) => new TextLoader(path), // reStructuredText
|
'.python': (path) => new TextLoader(path), // Python
|
||||||
'.ruby': (path) => new TextLoader(path), // Ruby
|
'.py': (path) => new TextLoader(path), // Python
|
||||||
'.rb': (path) => new TextLoader(path), // Ruby
|
'.rst': (path) => new TextLoader(path), // reStructuredText
|
||||||
'.rs': (path) => new TextLoader(path), // Rust
|
'.ruby': (path) => new TextLoader(path), // Ruby
|
||||||
'.scala': (path) => new TextLoader(path), // Scala
|
'.rb': (path) => new TextLoader(path), // Ruby
|
||||||
'.sc': (path) => new TextLoader(path), // Scala
|
'.rs': (path) => new TextLoader(path), // Rust
|
||||||
'.scss': (path) => new TextLoader(path), // Sass
|
'.scala': (path) => new TextLoader(path), // Scala
|
||||||
'.sol': (path) => new TextLoader(path), // Solidity
|
'.sc': (path) => new TextLoader(path), // Scala
|
||||||
'.sql': (path) => new TextLoader(path), //SQL
|
'.scss': (path) => new TextLoader(path), // Sass
|
||||||
'.swift': (path) => new TextLoader(path), // Swift
|
'.sol': (path) => new TextLoader(path), // Solidity
|
||||||
'.markdown': (path) => new TextLoader(path), // Markdown
|
'.sql': (path) => new TextLoader(path), //SQL
|
||||||
'.md': (path) => new TextLoader(path), // Markdown
|
'.swift': (path) => new TextLoader(path), // Swift
|
||||||
'.tex': (path) => new TextLoader(path), // LaTeX
|
'.markdown': (path) => new TextLoader(path), // Markdown
|
||||||
'.ltx': (path) => new TextLoader(path), // LaTeX
|
'.md': (path) => new TextLoader(path), // Markdown
|
||||||
'.html': (path) => new TextLoader(path), // HTML
|
'.tex': (path) => new TextLoader(path), // LaTeX
|
||||||
'.vb': (path) => new TextLoader(path), // Visual Basic
|
'.ltx': (path) => new TextLoader(path), // LaTeX
|
||||||
'.xml': (path) => new TextLoader(path) // XML
|
'.html': (path) => new TextLoader(path), // HTML
|
||||||
})
|
'.vb': (path) => new TextLoader(path), // Visual Basic
|
||||||
|
'.xml': (path) => new TextLoader(path) // XML
|
||||||
|
},
|
||||||
|
recursive
|
||||||
|
)
|
||||||
let docs = []
|
let docs = []
|
||||||
|
|
||||||
if (textSplitter) {
|
if (textSplitter) {
|
||||||
|
|||||||
@@ -51,11 +51,13 @@ class PlainText_DocumentLoaders implements INode {
|
|||||||
{
|
{
|
||||||
label: 'Document',
|
label: 'Document',
|
||||||
name: 'document',
|
name: 'document',
|
||||||
baseClasses: this.baseClasses
|
description: 'Array of document objects containing metadata and pageContent',
|
||||||
|
baseClasses: [...this.baseClasses, 'json']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Text',
|
label: 'Text',
|
||||||
name: 'text',
|
name: 'text',
|
||||||
|
description: 'Concatenated string from pageContent of documents',
|
||||||
baseClasses: ['string', 'json']
|
baseClasses: ['string', 'json']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -51,11 +51,13 @@ class Text_DocumentLoaders implements INode {
|
|||||||
{
|
{
|
||||||
label: 'Document',
|
label: 'Document',
|
||||||
name: 'document',
|
name: 'document',
|
||||||
baseClasses: this.baseClasses
|
description: 'Array of document objects containing metadata and pageContent',
|
||||||
|
baseClasses: [...this.baseClasses, 'json']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Text',
|
label: 'Text',
|
||||||
name: 'text',
|
name: 'text',
|
||||||
|
description: 'Concatenated string from pageContent of documents',
|
||||||
baseClasses: ['string', 'json']
|
baseClasses: ['string', 'json']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
+2
@@ -51,11 +51,13 @@ class VectorStoreToDocument_DocumentLoaders implements INode {
|
|||||||
{
|
{
|
||||||
label: 'Document',
|
label: 'Document',
|
||||||
name: 'document',
|
name: 'document',
|
||||||
|
description: 'Array of document objects containing metadata and pageContent',
|
||||||
baseClasses: [...this.baseClasses, 'json']
|
baseClasses: [...this.baseClasses, 'json']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Text',
|
label: 'Text',
|
||||||
name: 'text',
|
name: 'text',
|
||||||
|
description: 'Concatenated string from pageContent of documents',
|
||||||
baseClasses: ['string', 'json']
|
baseClasses: ['string', 'json']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -117,7 +117,10 @@ const initalizeDynamoDB = async (nodeData: INodeData, options: ICommonObject): P
|
|||||||
memoryKey: memoryKey ?? 'chat_history',
|
memoryKey: memoryKey ?? 'chat_history',
|
||||||
chatHistory: dynamoDb,
|
chatHistory: dynamoDb,
|
||||||
sessionId,
|
sessionId,
|
||||||
dynamodbClient: client
|
dynamodbClient: client,
|
||||||
|
tableName,
|
||||||
|
partitionKey,
|
||||||
|
dynamoKey: { [partitionKey]: { S: sessionId } }
|
||||||
})
|
})
|
||||||
return memory
|
return memory
|
||||||
}
|
}
|
||||||
@@ -125,6 +128,9 @@ const initalizeDynamoDB = async (nodeData: INodeData, options: ICommonObject): P
|
|||||||
interface BufferMemoryExtendedInput {
|
interface BufferMemoryExtendedInput {
|
||||||
dynamodbClient: DynamoDBClient
|
dynamodbClient: DynamoDBClient
|
||||||
sessionId: string
|
sessionId: string
|
||||||
|
tableName: string
|
||||||
|
partitionKey: string
|
||||||
|
dynamoKey: Record<string, AttributeValue>
|
||||||
}
|
}
|
||||||
|
|
||||||
interface DynamoDBSerializedChatMessage {
|
interface DynamoDBSerializedChatMessage {
|
||||||
@@ -142,6 +148,10 @@ interface DynamoDBSerializedChatMessage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
||||||
|
private tableName = ''
|
||||||
|
private partitionKey = ''
|
||||||
|
private dynamoKey: Record<string, AttributeValue>
|
||||||
|
private messageAttributeName: string
|
||||||
sessionId = ''
|
sessionId = ''
|
||||||
dynamodbClient: DynamoDBClient
|
dynamodbClient: DynamoDBClient
|
||||||
|
|
||||||
@@ -149,11 +159,14 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
super(fields)
|
super(fields)
|
||||||
this.sessionId = fields.sessionId
|
this.sessionId = fields.sessionId
|
||||||
this.dynamodbClient = fields.dynamodbClient
|
this.dynamodbClient = fields.dynamodbClient
|
||||||
|
this.tableName = fields.tableName
|
||||||
|
this.partitionKey = fields.partitionKey
|
||||||
|
this.dynamoKey = fields.dynamoKey
|
||||||
}
|
}
|
||||||
|
|
||||||
overrideDynamoKey(overrideSessionId = '') {
|
overrideDynamoKey(overrideSessionId = '') {
|
||||||
const existingDynamoKey = (this as any).dynamoKey
|
const existingDynamoKey = this.dynamoKey
|
||||||
const partitionKey = (this as any).partitionKey
|
const partitionKey = this.partitionKey
|
||||||
|
|
||||||
let newDynamoKey: Record<string, AttributeValue> = {}
|
let newDynamoKey: Record<string, AttributeValue> = {}
|
||||||
|
|
||||||
@@ -209,9 +222,9 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
||||||
if (!this.dynamodbClient) return []
|
if (!this.dynamodbClient) return []
|
||||||
|
|
||||||
const dynamoKey = overrideSessionId ? this.overrideDynamoKey(overrideSessionId) : (this as any).dynamoKey
|
const dynamoKey = overrideSessionId ? this.overrideDynamoKey(overrideSessionId) : this.dynamoKey
|
||||||
const tableName = (this as any).tableName
|
const tableName = this.tableName
|
||||||
const messageAttributeName = (this as any).messageAttributeName
|
const messageAttributeName = this.messageAttributeName
|
||||||
|
|
||||||
const params: GetItemCommandInput = {
|
const params: GetItemCommandInput = {
|
||||||
TableName: tableName,
|
TableName: tableName,
|
||||||
@@ -236,9 +249,9 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
||||||
if (!this.dynamodbClient) return
|
if (!this.dynamodbClient) return
|
||||||
|
|
||||||
const dynamoKey = overrideSessionId ? this.overrideDynamoKey(overrideSessionId) : (this as any).dynamoKey
|
const dynamoKey = overrideSessionId ? this.overrideDynamoKey(overrideSessionId) : this.dynamoKey
|
||||||
const tableName = (this as any).tableName
|
const tableName = this.tableName
|
||||||
const messageAttributeName = (this as any).messageAttributeName
|
const messageAttributeName = this.messageAttributeName
|
||||||
|
|
||||||
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
||||||
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
||||||
@@ -259,8 +272,8 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
||||||
if (!this.dynamodbClient) return
|
if (!this.dynamodbClient) return
|
||||||
|
|
||||||
const dynamoKey = overrideSessionId ? this.overrideDynamoKey(overrideSessionId) : (this as any).dynamoKey
|
const dynamoKey = overrideSessionId ? this.overrideDynamoKey(overrideSessionId) : this.dynamoKey
|
||||||
const tableName = (this as any).tableName
|
const tableName = this.tableName
|
||||||
|
|
||||||
const params: DeleteItemCommandInput = {
|
const params: DeleteItemCommandInput = {
|
||||||
TableName: tableName,
|
TableName: tableName,
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
||||||
if (!this.collection) return []
|
if (!this.collection) return []
|
||||||
|
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
const document = await this.collection.findOne({ sessionId: id })
|
const document = await this.collection.findOne({ sessionId: id })
|
||||||
const messages = document?.messages || []
|
const messages = document?.messages || []
|
||||||
const baseMessages = messages.map(mapStoredMessageToChatMessage)
|
const baseMessages = messages.map(mapStoredMessageToChatMessage)
|
||||||
@@ -164,7 +164,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
||||||
if (!this.collection) return
|
if (!this.collection) return
|
||||||
|
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
||||||
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
||||||
|
|
||||||
@@ -196,7 +196,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
||||||
if (!this.collection) return
|
if (!this.collection) return
|
||||||
|
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
await this.collection.deleteOne({ sessionId: id })
|
await this.collection.deleteOne({ sessionId: id })
|
||||||
await this.clear()
|
await this.clear()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ class MotorheadMemoryExtended extends MotorheadMemory implements MemoryMethods {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
try {
|
try {
|
||||||
const resp = await this.caller.call(fetch, `${this.url}/sessions/${id}/memory`, {
|
const resp = await this.caller.call(fetch, `${this.url}/sessions/${id}/memory`, {
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
@@ -172,7 +172,7 @@ class MotorheadMemoryExtended extends MotorheadMemory implements MemoryMethods {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
||||||
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
||||||
const inputValues = { [this.inputKey ?? 'input']: input?.text }
|
const inputValues = { [this.inputKey ?? 'input']: input?.text }
|
||||||
@@ -182,7 +182,7 @@ class MotorheadMemoryExtended extends MotorheadMemory implements MemoryMethods {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
await this.clear(id)
|
await this.clear(id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
||||||
if (!this.redisClient) return []
|
if (!this.redisClient) return []
|
||||||
|
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
const rawStoredMessages = await this.redisClient.lrange(id, this.windowSize ? this.windowSize * -1 : 0, -1)
|
const rawStoredMessages = await this.redisClient.lrange(id, this.windowSize ? this.windowSize * -1 : 0, -1)
|
||||||
const orderedMessages = rawStoredMessages.reverse().map((message) => JSON.parse(message))
|
const orderedMessages = rawStoredMessages.reverse().map((message) => JSON.parse(message))
|
||||||
const baseMessages = orderedMessages.map(mapStoredMessageToChatMessage)
|
const baseMessages = orderedMessages.map(mapStoredMessageToChatMessage)
|
||||||
@@ -199,7 +199,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
||||||
if (!this.redisClient) return
|
if (!this.redisClient) return
|
||||||
|
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
||||||
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
||||||
|
|
||||||
@@ -219,7 +219,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
||||||
if (!this.redisClient) return
|
if (!this.redisClient) return
|
||||||
|
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
await this.redisClient.del(id)
|
await this.redisClient.del(id)
|
||||||
await this.clear()
|
await this.clear()
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -114,7 +114,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
||||||
if (!this.redisClient) return []
|
if (!this.redisClient) return []
|
||||||
|
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
const rawStoredMessages: StoredMessage[] = await this.redisClient.lrange<StoredMessage>(id, 0, -1)
|
const rawStoredMessages: StoredMessage[] = await this.redisClient.lrange<StoredMessage>(id, 0, -1)
|
||||||
const orderedMessages = rawStoredMessages.reverse()
|
const orderedMessages = rawStoredMessages.reverse()
|
||||||
const previousMessages = orderedMessages.filter((x): x is StoredMessage => x.type !== undefined && x.data.content !== undefined)
|
const previousMessages = orderedMessages.filter((x): x is StoredMessage => x.type !== undefined && x.data.content !== undefined)
|
||||||
@@ -125,7 +125,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
||||||
if (!this.redisClient) return
|
if (!this.redisClient) return
|
||||||
|
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
||||||
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
||||||
|
|
||||||
@@ -145,7 +145,7 @@ class BufferMemoryExtended extends FlowiseMemory implements MemoryMethods {
|
|||||||
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
||||||
if (!this.redisClient) return
|
if (!this.redisClient) return
|
||||||
|
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
await this.redisClient.del(id)
|
await this.redisClient.del(id)
|
||||||
await this.clear()
|
await this.clear()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,14 +163,14 @@ class ZepMemoryExtended extends ZepMemory implements MemoryMethods {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
async getChatMessages(overrideSessionId = '', returnBaseMessages = false): Promise<IMessage[] | BaseMessage[]> {
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
const memoryVariables = await this.loadMemoryVariables({}, id)
|
const memoryVariables = await this.loadMemoryVariables({}, id)
|
||||||
const baseMessages = memoryVariables[this.memoryKey]
|
const baseMessages = memoryVariables[this.memoryKey]
|
||||||
return returnBaseMessages ? baseMessages : convertBaseMessagetoIMessage(baseMessages)
|
return returnBaseMessages ? baseMessages : convertBaseMessagetoIMessage(baseMessages)
|
||||||
}
|
}
|
||||||
|
|
||||||
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
async addChatMessages(msgArray: { text: string; type: MessageType }[], overrideSessionId = ''): Promise<void> {
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
const input = msgArray.find((msg) => msg.type === 'userMessage')
|
||||||
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
const output = msgArray.find((msg) => msg.type === 'apiMessage')
|
||||||
const inputValues = { [this.inputKey ?? 'input']: input?.text }
|
const inputValues = { [this.inputKey ?? 'input']: input?.text }
|
||||||
@@ -180,7 +180,7 @@ class ZepMemoryExtended extends ZepMemory implements MemoryMethods {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
async clearChatMessages(overrideSessionId = ''): Promise<void> {
|
||||||
const id = overrideSessionId ?? this.sessionId
|
const id = overrideSessionId ? overrideSessionId : this.sessionId
|
||||||
await this.clear(id)
|
await this.clear(id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
import { getBaseClasses, INode, INodeData, INodeParams } from '../../../src'
|
||||||
|
import { BaseOutputParser } from 'langchain/schema/output_parser'
|
||||||
|
import { StructuredOutputParser as LangchainStructuredOutputParser } from 'langchain/output_parsers'
|
||||||
|
import { CATEGORY } from '../OutputParserHelpers'
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
|
class AdvancedStructuredOutputParser implements INode {
|
||||||
|
label: string
|
||||||
|
name: string
|
||||||
|
version: number
|
||||||
|
description: string
|
||||||
|
type: string
|
||||||
|
icon: string
|
||||||
|
category: string
|
||||||
|
baseClasses: string[]
|
||||||
|
inputs: INodeParams[]
|
||||||
|
credential: INodeParams
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.label = 'Advanced Structured Output Parser'
|
||||||
|
this.name = 'advancedStructuredOutputParser'
|
||||||
|
this.version = 1.0
|
||||||
|
this.type = 'AdvancedStructuredOutputParser'
|
||||||
|
this.description = 'Parse the output of an LLM call into a given structure by providing a Zod schema.'
|
||||||
|
this.icon = 'structure.svg'
|
||||||
|
this.category = CATEGORY
|
||||||
|
this.baseClasses = [this.type, ...getBaseClasses(BaseOutputParser)]
|
||||||
|
this.inputs = [
|
||||||
|
{
|
||||||
|
label: 'Autofix',
|
||||||
|
name: 'autofixParser',
|
||||||
|
type: 'boolean',
|
||||||
|
optional: true,
|
||||||
|
description: 'In the event that the first call fails, will make another call to the model to fix any errors.'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Example JSON',
|
||||||
|
name: 'exampleJson',
|
||||||
|
type: 'string',
|
||||||
|
description: 'Zod schema for the output of the model',
|
||||||
|
rows: 10,
|
||||||
|
default: `z.object({
|
||||||
|
title: z.string(), // Title of the movie as a string
|
||||||
|
yearOfRelease: z.number().int(), // Release year as an integer number,
|
||||||
|
genres: z.enum([
|
||||||
|
"Action", "Comedy", "Drama", "Fantasy", "Horror",
|
||||||
|
"Mystery", "Romance", "Science Fiction", "Thriller", "Documentary"
|
||||||
|
]).array().max(2), // Array of genres, max of 2 from the defined enum
|
||||||
|
shortDescription: z.string().max(500) // Short description, max 500 characters
|
||||||
|
})`
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
async init(nodeData: INodeData): Promise<any> {
|
||||||
|
const schemaString = nodeData.inputs?.exampleJson as string
|
||||||
|
const autoFix = nodeData.inputs?.autofixParser as boolean
|
||||||
|
|
||||||
|
const zodSchemaFunction = new Function('z', `return ${schemaString}`)
|
||||||
|
const zodSchema = zodSchemaFunction(z)
|
||||||
|
|
||||||
|
try {
|
||||||
|
const structuredOutputParser = LangchainStructuredOutputParser.fromZodSchema(zodSchema)
|
||||||
|
|
||||||
|
// NOTE: When we change Flowise to return a json response, the following has to be changed to: JsonStructuredOutputParser
|
||||||
|
Object.defineProperty(structuredOutputParser, 'autoFix', {
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true,
|
||||||
|
writable: true,
|
||||||
|
value: autoFix
|
||||||
|
})
|
||||||
|
return structuredOutputParser
|
||||||
|
} catch (exception) {
|
||||||
|
throw new Error('Error parsing Zod Schema: ' + exception)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = { nodeClass: AdvancedStructuredOutputParser }
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M16 3V13M16 3L13 6.13609M16 3L19 6.13609" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M7 15V12C7 10.8954 7.89543 10 9 10H11M25 15V12C25 10.8954 24.1046 10 23 10H21" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M12.5644 20.4399C11.6769 19.7608 9 19.6332 9 21.7961C9 24.1915 13 22.5657 13 25.0902C13 26.9875 10.33 27.5912 9 26.3537" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M24 27V20L28 27V20" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M16 23.5C16 20.7 17.6667 20 18.5 20C19.3333 20 21 20.7 21 23.5C21 26.3 19.3333 27 18.5 27C17.6667 27 16 26.3 16 23.5Z" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M6 20V25C6 26.1046 5.10457 27 4 27V27C2.89543 27 2 26.1046 2 25V25" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -94,11 +94,13 @@ class CohereRerankRetriever_Retrievers implements INode {
|
|||||||
{
|
{
|
||||||
label: 'Document',
|
label: 'Document',
|
||||||
name: 'document',
|
name: 'document',
|
||||||
baseClasses: ['Document']
|
description: 'Array of document objects containing metadata and pageContent',
|
||||||
|
baseClasses: ['Document', 'json']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Text',
|
label: 'Text',
|
||||||
name: 'text',
|
name: 'text',
|
||||||
|
description: 'Concatenated string from pageContent of documents',
|
||||||
baseClasses: ['string', 'json']
|
baseClasses: ['string', 'json']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
+3
-1
@@ -78,11 +78,13 @@ class EmbeddingsFilterRetriever_Retrievers implements INode {
|
|||||||
{
|
{
|
||||||
label: 'Document',
|
label: 'Document',
|
||||||
name: 'document',
|
name: 'document',
|
||||||
baseClasses: ['Document']
|
description: 'Array of document objects containing metadata and pageContent',
|
||||||
|
baseClasses: ['Document', 'json']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Text',
|
label: 'Text',
|
||||||
name: 'text',
|
name: 'text',
|
||||||
|
description: 'Concatenated string from pageContent of documents',
|
||||||
baseClasses: ['string', 'json']
|
baseClasses: ['string', 'json']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -140,11 +140,13 @@ Passage:`
|
|||||||
{
|
{
|
||||||
label: 'Document',
|
label: 'Document',
|
||||||
name: 'document',
|
name: 'document',
|
||||||
baseClasses: ['Document']
|
description: 'Array of document objects containing metadata and pageContent',
|
||||||
|
baseClasses: ['Document', 'json']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Text',
|
label: 'Text',
|
||||||
name: 'text',
|
name: 'text',
|
||||||
|
description: 'Concatenated string from pageContent of documents',
|
||||||
baseClasses: ['string', 'json']
|
baseClasses: ['string', 'json']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
+3
-1
@@ -58,11 +58,13 @@ class LLMFilterCompressionRetriever_Retrievers implements INode {
|
|||||||
{
|
{
|
||||||
label: 'Document',
|
label: 'Document',
|
||||||
name: 'document',
|
name: 'document',
|
||||||
baseClasses: ['Document']
|
description: 'Array of document objects containing metadata and pageContent',
|
||||||
|
baseClasses: ['Document', 'json']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Text',
|
label: 'Text',
|
||||||
name: 'text',
|
name: 'text',
|
||||||
|
description: 'Concatenated string from pageContent of documents',
|
||||||
baseClasses: ['string', 'json']
|
baseClasses: ['string', 'json']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -89,11 +89,13 @@ class RRFRetriever_Retrievers implements INode {
|
|||||||
{
|
{
|
||||||
label: 'Document',
|
label: 'Document',
|
||||||
name: 'document',
|
name: 'document',
|
||||||
baseClasses: ['Document']
|
description: 'Array of document objects containing metadata and pageContent',
|
||||||
|
baseClasses: ['Document', 'json']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Text',
|
label: 'Text',
|
||||||
name: 'text',
|
name: 'text',
|
||||||
|
description: 'Concatenated string from pageContent of documents',
|
||||||
baseClasses: ['string', 'json']
|
baseClasses: ['string', 'json']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
+3
-1
@@ -74,11 +74,13 @@ class SimilarityThresholdRetriever_Retrievers implements INode {
|
|||||||
{
|
{
|
||||||
label: 'Document',
|
label: 'Document',
|
||||||
name: 'document',
|
name: 'document',
|
||||||
baseClasses: ['Document']
|
description: 'Array of document objects containing metadata and pageContent',
|
||||||
|
baseClasses: ['Document', 'json']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Text',
|
label: 'Text',
|
||||||
name: 'text',
|
name: 'text',
|
||||||
|
description: 'Concatenated string from pageContent of documents',
|
||||||
baseClasses: ['string', 'json']
|
baseClasses: ['string', 'json']
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class Postgres_VectorStores implements INode {
|
|||||||
constructor() {
|
constructor() {
|
||||||
this.label = 'Postgres'
|
this.label = 'Postgres'
|
||||||
this.name = 'postgres'
|
this.name = 'postgres'
|
||||||
this.version = 2.0
|
this.version = 3.0
|
||||||
this.type = 'Postgres'
|
this.type = 'Postgres'
|
||||||
this.icon = 'postgres.svg'
|
this.icon = 'postgres.svg'
|
||||||
this.category = 'Vector Stores'
|
this.category = 'Vector Stores'
|
||||||
@@ -60,13 +60,6 @@ class Postgres_VectorStores implements INode {
|
|||||||
name: 'database',
|
name: 'database',
|
||||||
type: 'string'
|
type: 'string'
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: 'SSL Connection',
|
|
||||||
name: 'sslConnection',
|
|
||||||
type: 'boolean',
|
|
||||||
default: false,
|
|
||||||
optional: false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: 'Port',
|
label: 'Port',
|
||||||
name: 'port',
|
name: 'port',
|
||||||
@@ -124,7 +117,6 @@ class Postgres_VectorStores implements INode {
|
|||||||
const docs = nodeData.inputs?.document as Document[]
|
const docs = nodeData.inputs?.document as Document[]
|
||||||
const embeddings = nodeData.inputs?.embeddings as Embeddings
|
const embeddings = nodeData.inputs?.embeddings as Embeddings
|
||||||
const additionalConfig = nodeData.inputs?.additionalConfig as string
|
const additionalConfig = nodeData.inputs?.additionalConfig as string
|
||||||
const sslConnection = nodeData.inputs?.sslConnection as boolean
|
|
||||||
|
|
||||||
let additionalConfiguration = {}
|
let additionalConfiguration = {}
|
||||||
if (additionalConfig) {
|
if (additionalConfig) {
|
||||||
@@ -142,8 +134,7 @@ class Postgres_VectorStores implements INode {
|
|||||||
port: nodeData.inputs?.port as number,
|
port: nodeData.inputs?.port as number,
|
||||||
username: user,
|
username: user,
|
||||||
password: password,
|
password: password,
|
||||||
database: nodeData.inputs?.database as string,
|
database: nodeData.inputs?.database as string
|
||||||
ssl: sslConnection
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const args = {
|
const args = {
|
||||||
@@ -198,7 +189,8 @@ class Postgres_VectorStores implements INode {
|
|||||||
type: 'postgres',
|
type: 'postgres',
|
||||||
host: nodeData.inputs?.host as string,
|
host: nodeData.inputs?.host as string,
|
||||||
port: nodeData.inputs?.port as number,
|
port: nodeData.inputs?.port as number,
|
||||||
username: user,
|
username: user, // Required by TypeORMVectorStore
|
||||||
|
user: user, // Required by Pool in similaritySearchVectorWithScore
|
||||||
password: password,
|
password: password,
|
||||||
database: nodeData.inputs?.database as string
|
database: nodeData.inputs?.database as string
|
||||||
}
|
}
|
||||||
@@ -248,14 +240,7 @@ const similaritySearchVectorWithScore = async (
|
|||||||
ORDER BY "_distance" ASC
|
ORDER BY "_distance" ASC
|
||||||
LIMIT $3;`
|
LIMIT $3;`
|
||||||
|
|
||||||
const poolOptions = {
|
const pool = new Pool(postgresConnectionOptions)
|
||||||
host: postgresConnectionOptions.host,
|
|
||||||
port: postgresConnectionOptions.port,
|
|
||||||
user: postgresConnectionOptions.username,
|
|
||||||
password: postgresConnectionOptions.password,
|
|
||||||
database: postgresConnectionOptions.database
|
|
||||||
}
|
|
||||||
const pool = new Pool(poolOptions)
|
|
||||||
const conn = await pool.connect()
|
const conn = await pool.connect()
|
||||||
|
|
||||||
const documents = await conn.query(queryString, [embeddingString, _filter, k])
|
const documents = await conn.query(queryString, [embeddingString, _filter, k])
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Use OpenAI Function Agent and Chain to automatically decide which API to call, generating url and body request from conversation",
|
"description": "Use OpenAI Function Agent and Chain to automatically decide which API to call, generating url and body request from conversation",
|
||||||
|
"categories": "Buffer Memory,ChainTool,API Chain,ChatOpenAI,OpenAI Function Agent,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Given API docs, agent automatically decide which API to call, generating url and body request from conversation",
|
"description": "Given API docs, agent automatically decide which API to call, generating url and body request from conversation",
|
||||||
|
"categories": "Buffer Memory,ChainTool,API Chain,ChatOpenAI,Conversational Agent,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -0,0 +1,464 @@
|
|||||||
|
{
|
||||||
|
"description": "Return response as a JSON structure as specified by a Zod schema",
|
||||||
|
"badge": "NEW",
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"width": 300,
|
||||||
|
"height": 508,
|
||||||
|
"id": "llmChain_0",
|
||||||
|
"position": {
|
||||||
|
"x": 1229.1699649849293,
|
||||||
|
"y": 245.55173505632646
|
||||||
|
},
|
||||||
|
"type": "customNode",
|
||||||
|
"data": {
|
||||||
|
"id": "llmChain_0",
|
||||||
|
"label": "LLM Chain",
|
||||||
|
"version": 3,
|
||||||
|
"name": "llmChain",
|
||||||
|
"type": "LLMChain",
|
||||||
|
"baseClasses": ["LLMChain", "BaseChain", "Runnable"],
|
||||||
|
"category": "Chains",
|
||||||
|
"description": "Chain to run queries against LLMs",
|
||||||
|
"inputParams": [
|
||||||
|
{
|
||||||
|
"label": "Chain Name",
|
||||||
|
"name": "chainName",
|
||||||
|
"type": "string",
|
||||||
|
"placeholder": "Name Your Chain",
|
||||||
|
"optional": true,
|
||||||
|
"id": "llmChain_0-input-chainName-string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputAnchors": [
|
||||||
|
{
|
||||||
|
"label": "Language Model",
|
||||||
|
"name": "model",
|
||||||
|
"type": "BaseLanguageModel",
|
||||||
|
"id": "llmChain_0-input-model-BaseLanguageModel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Prompt",
|
||||||
|
"name": "prompt",
|
||||||
|
"type": "BasePromptTemplate",
|
||||||
|
"id": "llmChain_0-input-prompt-BasePromptTemplate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Output Parser",
|
||||||
|
"name": "outputParser",
|
||||||
|
"type": "BaseLLMOutputParser",
|
||||||
|
"optional": true,
|
||||||
|
"id": "llmChain_0-input-outputParser-BaseLLMOutputParser"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Input Moderation",
|
||||||
|
"description": "Detect text that could generate harmful output and prevent it from being sent to the language model",
|
||||||
|
"name": "inputModeration",
|
||||||
|
"type": "Moderation",
|
||||||
|
"optional": true,
|
||||||
|
"list": true,
|
||||||
|
"id": "llmChain_0-input-inputModeration-Moderation"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputs": {
|
||||||
|
"model": "{{chatOpenAI_0.data.instance}}",
|
||||||
|
"prompt": "{{chatPromptTemplate_0.data.instance}}",
|
||||||
|
"outputParser": "{{advancedStructuredOutputParser_0.data.instance}}",
|
||||||
|
"chainName": "",
|
||||||
|
"inputModeration": ""
|
||||||
|
},
|
||||||
|
"outputAnchors": [
|
||||||
|
{
|
||||||
|
"name": "output",
|
||||||
|
"label": "Output",
|
||||||
|
"type": "options",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"id": "llmChain_0-output-llmChain-LLMChain|BaseChain|Runnable",
|
||||||
|
"name": "llmChain",
|
||||||
|
"label": "LLM Chain",
|
||||||
|
"type": "LLMChain | BaseChain | Runnable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "llmChain_0-output-outputPrediction-string|json",
|
||||||
|
"name": "outputPrediction",
|
||||||
|
"label": "Output Prediction",
|
||||||
|
"type": "string | json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"default": "llmChain"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": {
|
||||||
|
"output": "llmChain"
|
||||||
|
},
|
||||||
|
"selected": false
|
||||||
|
},
|
||||||
|
"positionAbsolute": {
|
||||||
|
"x": 1229.1699649849293,
|
||||||
|
"y": 245.55173505632646
|
||||||
|
},
|
||||||
|
"selected": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"width": 300,
|
||||||
|
"height": 690,
|
||||||
|
"id": "chatPromptTemplate_0",
|
||||||
|
"position": {
|
||||||
|
"x": 493.26582927222483,
|
||||||
|
"y": -156.20470841335592
|
||||||
|
},
|
||||||
|
"type": "customNode",
|
||||||
|
"data": {
|
||||||
|
"id": "chatPromptTemplate_0",
|
||||||
|
"label": "Chat Prompt Template",
|
||||||
|
"version": 1,
|
||||||
|
"name": "chatPromptTemplate",
|
||||||
|
"type": "ChatPromptTemplate",
|
||||||
|
"baseClasses": ["ChatPromptTemplate", "BaseChatPromptTemplate", "BasePromptTemplate", "Runnable"],
|
||||||
|
"category": "Prompts",
|
||||||
|
"description": "Schema to represent a chat prompt",
|
||||||
|
"inputParams": [
|
||||||
|
{
|
||||||
|
"label": "System Message",
|
||||||
|
"name": "systemMessagePrompt",
|
||||||
|
"type": "string",
|
||||||
|
"rows": 4,
|
||||||
|
"placeholder": "You are a helpful assistant that translates {input_language} to {output_language}.",
|
||||||
|
"id": "chatPromptTemplate_0-input-systemMessagePrompt-string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Human Message",
|
||||||
|
"name": "humanMessagePrompt",
|
||||||
|
"type": "string",
|
||||||
|
"rows": 4,
|
||||||
|
"placeholder": "{text}",
|
||||||
|
"id": "chatPromptTemplate_0-input-humanMessagePrompt-string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Format Prompt Values",
|
||||||
|
"name": "promptValues",
|
||||||
|
"type": "json",
|
||||||
|
"optional": true,
|
||||||
|
"acceptVariable": true,
|
||||||
|
"list": true,
|
||||||
|
"id": "chatPromptTemplate_0-input-promptValues-json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputAnchors": [],
|
||||||
|
"inputs": {
|
||||||
|
"systemMessagePrompt": "This AI is designed to only output information in JSON format without exception. This AI can only output JSON and will never output any other text.\n\nWhen asked to correct itself, this AI will only output the corrected JSON and never any other text.",
|
||||||
|
"humanMessagePrompt": "{text}",
|
||||||
|
"promptValues": ""
|
||||||
|
},
|
||||||
|
"outputAnchors": [
|
||||||
|
{
|
||||||
|
"id": "chatPromptTemplate_0-output-chatPromptTemplate-ChatPromptTemplate|BaseChatPromptTemplate|BasePromptTemplate|Runnable",
|
||||||
|
"name": "chatPromptTemplate",
|
||||||
|
"label": "ChatPromptTemplate",
|
||||||
|
"type": "ChatPromptTemplate | BaseChatPromptTemplate | BasePromptTemplate | Runnable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": {},
|
||||||
|
"selected": false
|
||||||
|
},
|
||||||
|
"selected": false,
|
||||||
|
"positionAbsolute": {
|
||||||
|
"x": 493.26582927222483,
|
||||||
|
"y": -156.20470841335592
|
||||||
|
},
|
||||||
|
"dragging": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"width": 300,
|
||||||
|
"height": 576,
|
||||||
|
"id": "chatOpenAI_0",
|
||||||
|
"position": {
|
||||||
|
"x": 860.555928011636,
|
||||||
|
"y": -355.71028569475095
|
||||||
|
},
|
||||||
|
"type": "customNode",
|
||||||
|
"data": {
|
||||||
|
"id": "chatOpenAI_0",
|
||||||
|
"label": "ChatOpenAI",
|
||||||
|
"version": 3,
|
||||||
|
"name": "chatOpenAI",
|
||||||
|
"type": "ChatOpenAI",
|
||||||
|
"baseClasses": ["ChatOpenAI", "BaseChatModel", "BaseLanguageModel", "Runnable"],
|
||||||
|
"category": "Chat Models",
|
||||||
|
"description": "Wrapper around OpenAI large language models that use the Chat endpoint",
|
||||||
|
"inputParams": [
|
||||||
|
{
|
||||||
|
"label": "Connect Credential",
|
||||||
|
"name": "credential",
|
||||||
|
"type": "credential",
|
||||||
|
"credentialNames": ["openAIApi"],
|
||||||
|
"id": "chatOpenAI_0-input-credential-credential"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Model Name",
|
||||||
|
"name": "modelName",
|
||||||
|
"type": "options",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"label": "gpt-4",
|
||||||
|
"name": "gpt-4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "gpt-4-turbo-preview",
|
||||||
|
"name": "gpt-4-turbo-preview"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "gpt-4-0125-preview",
|
||||||
|
"name": "gpt-4-0125-preview"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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-0125",
|
||||||
|
"name": "gpt-3.5-turbo-0125"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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_0-input-modelName-options"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Temperature",
|
||||||
|
"name": "temperature",
|
||||||
|
"type": "number",
|
||||||
|
"step": 0.1,
|
||||||
|
"default": 0.9,
|
||||||
|
"optional": true,
|
||||||
|
"id": "chatOpenAI_0-input-temperature-number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Max Tokens",
|
||||||
|
"name": "maxTokens",
|
||||||
|
"type": "number",
|
||||||
|
"step": 1,
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "chatOpenAI_0-input-maxTokens-number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Top Probability",
|
||||||
|
"name": "topP",
|
||||||
|
"type": "number",
|
||||||
|
"step": 0.1,
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "chatOpenAI_0-input-topP-number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Frequency Penalty",
|
||||||
|
"name": "frequencyPenalty",
|
||||||
|
"type": "number",
|
||||||
|
"step": 0.1,
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "chatOpenAI_0-input-frequencyPenalty-number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Presence Penalty",
|
||||||
|
"name": "presencePenalty",
|
||||||
|
"type": "number",
|
||||||
|
"step": 0.1,
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "chatOpenAI_0-input-presencePenalty-number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Timeout",
|
||||||
|
"name": "timeout",
|
||||||
|
"type": "number",
|
||||||
|
"step": 1,
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "chatOpenAI_0-input-timeout-number"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "BasePath",
|
||||||
|
"name": "basepath",
|
||||||
|
"type": "string",
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "chatOpenAI_0-input-basepath-string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "BaseOptions",
|
||||||
|
"name": "baseOptions",
|
||||||
|
"type": "json",
|
||||||
|
"optional": true,
|
||||||
|
"additionalParams": true,
|
||||||
|
"id": "chatOpenAI_0-input-baseOptions-json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputAnchors": [
|
||||||
|
{
|
||||||
|
"label": "Cache",
|
||||||
|
"name": "cache",
|
||||||
|
"type": "BaseCache",
|
||||||
|
"optional": true,
|
||||||
|
"id": "chatOpenAI_0-input-cache-BaseCache"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputs": {
|
||||||
|
"cache": "",
|
||||||
|
"modelName": "",
|
||||||
|
"temperature": "0",
|
||||||
|
"maxTokens": "",
|
||||||
|
"topP": "",
|
||||||
|
"frequencyPenalty": "",
|
||||||
|
"presencePenalty": "",
|
||||||
|
"timeout": "",
|
||||||
|
"basepath": "",
|
||||||
|
"baseOptions": ""
|
||||||
|
},
|
||||||
|
"outputAnchors": [
|
||||||
|
{
|
||||||
|
"id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable",
|
||||||
|
"name": "chatOpenAI",
|
||||||
|
"label": "ChatOpenAI",
|
||||||
|
"type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | Runnable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": {},
|
||||||
|
"selected": false
|
||||||
|
},
|
||||||
|
"selected": false,
|
||||||
|
"positionAbsolute": {
|
||||||
|
"x": 860.555928011636,
|
||||||
|
"y": -355.71028569475095
|
||||||
|
},
|
||||||
|
"dragging": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"width": 300,
|
||||||
|
"height": 454,
|
||||||
|
"id": "advancedStructuredOutputParser_0",
|
||||||
|
"position": {
|
||||||
|
"x": 489.3637511211284,
|
||||||
|
"y": 580.0628053662244
|
||||||
|
},
|
||||||
|
"type": "customNode",
|
||||||
|
"data": {
|
||||||
|
"id": "advancedStructuredOutputParser_0",
|
||||||
|
"label": "Advanced Structured Output Parser",
|
||||||
|
"version": 1,
|
||||||
|
"name": "advancedStructuredOutputParser",
|
||||||
|
"type": "AdvancedStructuredOutputParser",
|
||||||
|
"baseClasses": ["AdvancedStructuredOutputParser", "BaseLLMOutputParser", "Runnable"],
|
||||||
|
"category": "Output Parsers",
|
||||||
|
"description": "Parse the output of an LLM call into a given structure by providing a Zod schema.",
|
||||||
|
"inputParams": [
|
||||||
|
{
|
||||||
|
"label": "Autofix",
|
||||||
|
"name": "autofixParser",
|
||||||
|
"type": "boolean",
|
||||||
|
"optional": true,
|
||||||
|
"description": "In the event that the first call fails, will make another call to the model to fix any errors.",
|
||||||
|
"id": "advancedStructuredOutputParser_0-input-autofixParser-boolean"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "Example JSON",
|
||||||
|
"name": "exampleJson",
|
||||||
|
"type": "string",
|
||||||
|
"description": "Zod schema for the output of the model",
|
||||||
|
"rows": 10,
|
||||||
|
"default": "z.object({\n title: z.string(), // Title of the movie as a string\n yearOfRelease: z.number().int(), // Release year as an integer number,\n genres: z.enum([\n \"Action\", \"Comedy\", \"Drama\", \"Fantasy\", \"Horror\",\n \"Mystery\", \"Romance\", \"Science Fiction\", \"Thriller\", \"Documentary\"\n ]).array().max(2), // Array of genres, max of 2 from the defined enum\n shortDescription: z.string().max(500) // Short description, max 500 characters\n})",
|
||||||
|
"id": "advancedStructuredOutputParser_0-input-exampleJson-string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"inputAnchors": [],
|
||||||
|
"inputs": {
|
||||||
|
"autofixParser": "",
|
||||||
|
"exampleJson": "z.object({\n title: z.string(), // Title of the movie as a string\n yearOfRelease: z.number().int(), // Release year as an integer number,\n genres: z.enum([\n \"Action\", \"Comedy\", \"Drama\", \"Fantasy\", \"Horror\",\n \"Mystery\", \"Romance\", \"Science Fiction\", \"Thriller\", \"Documentary\"\n ]).array().max(2), // Array of genres, max of 2 from the defined enum\n shortDescription: z.string().max(500) // Short description, max 500 characters\n})"
|
||||||
|
},
|
||||||
|
"outputAnchors": [
|
||||||
|
{
|
||||||
|
"id": "advancedStructuredOutputParser_0-output-advancedStructuredOutputParser-AdvancedStructuredOutputParser|BaseLLMOutputParser|Runnable",
|
||||||
|
"name": "advancedStructuredOutputParser",
|
||||||
|
"label": "AdvancedStructuredOutputParser",
|
||||||
|
"type": "AdvancedStructuredOutputParser | BaseLLMOutputParser | Runnable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"outputs": {},
|
||||||
|
"selected": false
|
||||||
|
},
|
||||||
|
"selected": false,
|
||||||
|
"dragging": false,
|
||||||
|
"positionAbsolute": {
|
||||||
|
"x": 489.3637511211284,
|
||||||
|
"y": 580.0628053662244
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"source": "chatPromptTemplate_0",
|
||||||
|
"sourceHandle": "chatPromptTemplate_0-output-chatPromptTemplate-ChatPromptTemplate|BaseChatPromptTemplate|BasePromptTemplate|Runnable",
|
||||||
|
"target": "llmChain_0",
|
||||||
|
"targetHandle": "llmChain_0-input-prompt-BasePromptTemplate",
|
||||||
|
"type": "buttonedge",
|
||||||
|
"id": "chatPromptTemplate_0-chatPromptTemplate_0-output-chatPromptTemplate-ChatPromptTemplate|BaseChatPromptTemplate|BasePromptTemplate|Runnable-llmChain_0-llmChain_0-input-prompt-BasePromptTemplate",
|
||||||
|
"data": {
|
||||||
|
"label": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "chatOpenAI_0",
|
||||||
|
"sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable",
|
||||||
|
"target": "llmChain_0",
|
||||||
|
"targetHandle": "llmChain_0-input-model-BaseLanguageModel",
|
||||||
|
"type": "buttonedge",
|
||||||
|
"id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable-llmChain_0-llmChain_0-input-model-BaseLanguageModel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "advancedStructuredOutputParser_0",
|
||||||
|
"sourceHandle": "advancedStructuredOutputParser_0-output-advancedStructuredOutputParser-AdvancedStructuredOutputParser|BaseLLMOutputParser|Runnable",
|
||||||
|
"target": "llmChain_0",
|
||||||
|
"targetHandle": "llmChain_0-input-outputParser-BaseLLMOutputParser",
|
||||||
|
"type": "buttonedge",
|
||||||
|
"id": "advancedStructuredOutputParser_0-advancedStructuredOutputParser_0-output-advancedStructuredOutputParser-AdvancedStructuredOutputParser|BaseLLMOutputParser|Runnable-llmChain_0-llmChain_0-input-outputParser-BaseLLMOutputParser"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Output antonym of given user input using few-shot prompt template built with examples",
|
"description": "Output antonym of given user input using few-shot prompt template built with examples",
|
||||||
|
"categories": "Few Shot Prompt,ChatOpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Use AutoGPT - Autonomous agent with chain of thoughts for self-guided task completion",
|
"description": "Use AutoGPT - Autonomous agent with chain of thoughts for self-guided task completion",
|
||||||
|
"categories": "AutoGPT,SERP Tool,File Read/Write,ChatOpenAI,Pinecone,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Use BabyAGI to create tasks and reprioritize for a given objective",
|
"description": "Use BabyAGI to create tasks and reprioritize for a given objective",
|
||||||
|
"categories": "BabyAGI,ChatOpenAI,Pinecone,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Analyse and summarize CSV data",
|
"description": "Analyse and summarize CSV data",
|
||||||
|
"categories": "CSV Agent,ChatOpenAI,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Engage with data sources such as YouTube Transcripts, Google, and more through intelligent Q&A interactions",
|
"description": "Engage with data sources such as YouTube Transcripts, Google, and more through intelligent Q&A interactions",
|
||||||
|
"categories": "Memory Vector Store,SearchAPI,ChatOpenAI,Conversational Retrieval QA Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Use ChatGPT Plugins within LangChain abstractions with GET and POST Tools",
|
"description": "Use ChatGPT Plugins within LangChain abstractions with GET and POST Tools",
|
||||||
|
"categories": "ChatGPT Plugin,HTTP GET/POST,ChatOpenAI,MRKL Agent,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Use Anthropic Claude with 200k context window to ingest whole document for QnA",
|
"description": "Use Anthropic Claude with 200k context window to ingest whole document for QnA",
|
||||||
|
"categories": "Buffer Memory,Prompt Template,Conversation Chain,ChatAnthropic,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
@@ -439,10 +441,10 @@
|
|||||||
"type": "options",
|
"type": "options",
|
||||||
"options": [
|
"options": [
|
||||||
{
|
{
|
||||||
"id": "plainText_0-output-document-Document",
|
"id": "plainText_0-output-document-Document|json",
|
||||||
"name": "document",
|
"name": "document",
|
||||||
"label": "Document",
|
"label": "Document",
|
||||||
"type": "Document"
|
"type": "Document | json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "plainText_0-output-text-string|json",
|
"id": "plainText_0-output-text-string|json",
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Answer question based on retrieved documents (context) with built-in memory to remember conversation using LlamaIndex",
|
"description": "Answer question based on retrieved documents (context) with built-in memory to remember conversation using LlamaIndex",
|
||||||
|
"categories": "Text File,Prompt Template,ChatOpenAI,Conversation Chain,Pinecone,LlamaIndex,Redis",
|
||||||
|
"framework": "LlamaIndex",
|
||||||
"badge": "NEW",
|
"badge": "NEW",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
@@ -57,10 +59,10 @@
|
|||||||
"type": "options",
|
"type": "options",
|
||||||
"options": [
|
"options": [
|
||||||
{
|
{
|
||||||
"id": "textFile_0-output-document-Document",
|
"id": "textFile_0-output-document-Document|json",
|
||||||
"name": "document",
|
"name": "document",
|
||||||
"label": "Document",
|
"label": "Document",
|
||||||
"type": "Document"
|
"type": "Document | json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "textFile_0-output-text-string|json",
|
"id": "textFile_0-output-text-string|json",
|
||||||
@@ -849,11 +851,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "textFile_0",
|
"source": "textFile_0",
|
||||||
"sourceHandle": "textFile_0-output-document-Document",
|
"sourceHandle": "textFile_0-output-document-Document|json",
|
||||||
"target": "pineconeLlamaIndex_0",
|
"target": "pineconeLlamaIndex_0",
|
||||||
"targetHandle": "pineconeLlamaIndex_0-input-document-Document",
|
"targetHandle": "pineconeLlamaIndex_0-input-document-Document",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "textFile_0-textFile_0-output-document-Document-pineconeLlamaIndex_0-pineconeLlamaIndex_0-input-document-Document",
|
"id": "textFile_0-textFile_0-output-document-Document|json-pineconeLlamaIndex_0-pineconeLlamaIndex_0-input-document-Document",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "A conversational agent for a chat model which utilize chat specific prompts",
|
"description": "A conversational agent for a chat model which utilize chat specific prompts",
|
||||||
|
"categories": "Calculator Tool,Buffer Memory,SerpAPI,ChatOpenAI,Conversational Agent,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "Agent optimized for vector retrieval during conversation and answering questions based on previous dialogue.",
|
"description": "Agent optimized for vector retrieval during conversation and answering questions based on previous dialogue.",
|
||||||
|
"categories": "Retriever Tool,Buffer Memory,ChatOpenAI,Conversational Retrieval Agent, Pinecone,Langchain",
|
||||||
"badge": "POPULAR",
|
"badge": "POPULAR",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "Text file QnA using conversational retrieval QA chain",
|
"description": "Text file QnA using conversational retrieval QA chain",
|
||||||
|
"categories": "TextFile,ChatOpenAI,Conversational Retrieval QA Chain,Pinecone,Langchain",
|
||||||
"badge": "POPULAR",
|
"badge": "POPULAR",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
@@ -233,10 +235,10 @@
|
|||||||
"type": "options",
|
"type": "options",
|
||||||
"options": [
|
"options": [
|
||||||
{
|
{
|
||||||
"id": "textFile_0-output-document-Document",
|
"id": "textFile_0-output-document-Document|json",
|
||||||
"name": "document",
|
"name": "document",
|
||||||
"label": "Document",
|
"label": "Document",
|
||||||
"type": "Document"
|
"type": "Document | json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "textFile_0-output-text-string|json",
|
"id": "textFile_0-output-text-string|json",
|
||||||
@@ -730,11 +732,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "textFile_0",
|
"source": "textFile_0",
|
||||||
"sourceHandle": "textFile_0-output-document-Document",
|
"sourceHandle": "textFile_0-output-document-Document|json",
|
||||||
"target": "pinecone_0",
|
"target": "pinecone_0",
|
||||||
"targetHandle": "pinecone_0-input-document-Document",
|
"targetHandle": "pinecone_0-input-document-Document",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "textFile_0-textFile_0-output-document-Document-pinecone_0-pinecone_0-input-document-Document",
|
"id": "textFile_0-textFile_0-output-document-Document|json-pinecone_0-pinecone_0-input-document-Document",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "Flowise Docs Github QnA using conversational retrieval QA chain",
|
"description": "Flowise Docs Github QnA using conversational retrieval QA chain",
|
||||||
|
"categories": "Memory Vector Store,Github Loader,ChatOpenAI,Conversational Retrieval QA Chain,Langchain",
|
||||||
"badge": "POPULAR",
|
"badge": "POPULAR",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Simple LLM Chain using HuggingFace Inference API on falcon-7b-instruct model",
|
"description": "Simple LLM Chain using HuggingFace Inference API on falcon-7b-instruct model",
|
||||||
|
"categories": "HuggingFace,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Split flows based on if else condition",
|
"description": "Split flows based on if else condition",
|
||||||
|
"categories": "IfElse Function,ChatOpenAI,OpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"badge": "new",
|
"badge": "new",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "Generate image using Replicate Stability text-to-image generative AI model",
|
"description": "Generate image using Replicate Stability text-to-image generative AI model",
|
||||||
"badge": "NEW",
|
"badge": "NEW",
|
||||||
|
"categories": "Replicate,ChatOpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "Detect text that could generate harmful output and prevent it from being sent to the language model",
|
"description": "Detect text that could generate harmful output and prevent it from being sent to the language model",
|
||||||
"badge": "NEW",
|
"badge": "NEW",
|
||||||
|
"categories": "Moderation,ChatOpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "Return response as a list (array) instead of a string/text",
|
"description": "Return response as a list (array) instead of a string/text",
|
||||||
"badge": "NEW",
|
"badge": "NEW",
|
||||||
|
"categories": "CSV Output Parser,ChatOpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "QnA chain using Ollama local LLM, LocalAI embedding model, and Faiss local vector store",
|
"description": "QnA chain using Ollama local LLM, LocalAI embedding model, and Faiss local vector store",
|
||||||
"badge": "POPULAR",
|
"badge": "POPULAR",
|
||||||
|
"categories": "Text File,ChatOllama,Conversational Retrieval QA Chain,Faiss,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
@@ -224,10 +226,10 @@
|
|||||||
"type": "options",
|
"type": "options",
|
||||||
"options": [
|
"options": [
|
||||||
{
|
{
|
||||||
"id": "textFile_0-output-document-Document",
|
"id": "textFile_0-output-document-Document|json",
|
||||||
"name": "document",
|
"name": "document",
|
||||||
"label": "Document",
|
"label": "Document",
|
||||||
"type": "Document"
|
"type": "Document | json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "textFile_0-output-text-string|json",
|
"id": "textFile_0-output-text-string|json",
|
||||||
@@ -649,11 +651,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "textFile_0",
|
"source": "textFile_0",
|
||||||
"sourceHandle": "textFile_0-output-document-Document",
|
"sourceHandle": "textFile_0-output-document-Document|json",
|
||||||
"target": "faiss_0",
|
"target": "faiss_0",
|
||||||
"targetHandle": "faiss_0-input-document-Document",
|
"targetHandle": "faiss_0-input-document-Document",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "textFile_0-textFile_0-output-document-Document-faiss_0-faiss_0-input-document-Document",
|
"id": "textFile_0-textFile_0-output-document-Document|json-faiss_0-faiss_0-input-document-Document",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Use long term memory like Zep to differentiate conversations between users with sessionId",
|
"description": "Use long term memory like Zep to differentiate conversations between users with sessionId",
|
||||||
|
"categories": "ChatOpenAI,Conversational Retrieval QA Chain,Zep Memory,Qdrant,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "Upsert multiple files with metadata and filter by it using conversational retrieval QA chain",
|
"description": "Upsert multiple files with metadata and filter by it using conversational retrieval QA chain",
|
||||||
|
"categories": "Text File,PDF File,ChatOpenAI,Conversational Retrieval QA Chain,Pinecone,Langchain",
|
||||||
"badge": "POPULAR",
|
"badge": "POPULAR",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
@@ -126,10 +128,10 @@
|
|||||||
"type": "options",
|
"type": "options",
|
||||||
"options": [
|
"options": [
|
||||||
{
|
{
|
||||||
"id": "textFile_0-output-document-Document",
|
"id": "textFile_0-output-document-Document|json",
|
||||||
"name": "document",
|
"name": "document",
|
||||||
"label": "Document",
|
"label": "Document",
|
||||||
"type": "Document"
|
"type": "Document | json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "textFile_0-output-text-string|json",
|
"id": "textFile_0-output-text-string|json",
|
||||||
@@ -836,11 +838,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "textFile_0",
|
"source": "textFile_0",
|
||||||
"sourceHandle": "textFile_0-output-document-Document",
|
"sourceHandle": "textFile_0-output-document-Document|json",
|
||||||
"target": "pinecone_0",
|
"target": "pinecone_0",
|
||||||
"targetHandle": "pinecone_0-input-document-Document",
|
"targetHandle": "pinecone_0-input-document-Document",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "textFile_0-textFile_0-output-document-Document-pinecone_0-pinecone_0-input-document-Document",
|
"id": "textFile_0-textFile_0-output-document-Document|json-pinecone_0-pinecone_0-input-document-Document",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "A chain that automatically picks an appropriate prompt from multiple prompts",
|
"description": "A chain that automatically picks an appropriate prompt from multiple prompts",
|
||||||
|
"categories": "ChatOpenAI,Multi Prompt Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "A chain that automatically picks an appropriate retriever from multiple different vector databases",
|
"description": "A chain that automatically picks an appropriate retriever from multiple different vector databases",
|
||||||
|
"categories": "ChatOpenAI,Multi Retrieval QA Chain,Pinecone,Chroma,Supabase,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Use the agent to choose between multiple different vector databases, with the ability to use other tools",
|
"description": "Use the agent to choose between multiple different vector databases, with the ability to use other tools",
|
||||||
|
"categories": "Buffer Memory,ChatOpenAI,Chain Tool,Retrieval QA Chain,Redis,Faiss,Conversational Agent,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
@@ -964,10 +966,10 @@
|
|||||||
"type": "options",
|
"type": "options",
|
||||||
"options": [
|
"options": [
|
||||||
{
|
{
|
||||||
"id": "plainText_0-output-document-Document",
|
"id": "plainText_0-output-document-Document|json",
|
||||||
"name": "document",
|
"name": "document",
|
||||||
"label": "Document",
|
"label": "Document",
|
||||||
"type": "Document"
|
"type": "Document | json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "plainText_0-output-text-string|json",
|
"id": "plainText_0-output-text-string|json",
|
||||||
@@ -1501,10 +1503,10 @@
|
|||||||
"type": "options",
|
"type": "options",
|
||||||
"options": [
|
"options": [
|
||||||
{
|
{
|
||||||
"id": "plainText_1-output-document-Document",
|
"id": "plainText_1-output-document-Document|json",
|
||||||
"name": "document",
|
"name": "document",
|
||||||
"label": "Document",
|
"label": "Document",
|
||||||
"type": "Document"
|
"type": "Document | json"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "plainText_1-output-text-string|json",
|
"id": "plainText_1-output-text-string|json",
|
||||||
@@ -1721,11 +1723,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "plainText_0",
|
"source": "plainText_0",
|
||||||
"sourceHandle": "plainText_0-output-document-Document",
|
"sourceHandle": "plainText_0-output-document-Document|json",
|
||||||
"target": "redis_0",
|
"target": "redis_0",
|
||||||
"targetHandle": "redis_0-input-document-Document",
|
"targetHandle": "redis_0-input-document-Document",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "plainText_0-plainText_0-output-document-Document-redis_0-redis_0-input-document-Document",
|
"id": "plainText_0-plainText_0-output-document-Document|json-redis_0-redis_0-input-document-Document",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
@@ -1776,11 +1778,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "plainText_1",
|
"source": "plainText_1",
|
||||||
"sourceHandle": "plainText_1-output-document-Document",
|
"sourceHandle": "plainText_1-output-document-Document|json",
|
||||||
"target": "faiss_0",
|
"target": "faiss_0",
|
||||||
"targetHandle": "faiss_0-input-document-Document",
|
"targetHandle": "faiss_0-input-document-Document",
|
||||||
"type": "buttonedge",
|
"type": "buttonedge",
|
||||||
"id": "plainText_1-plainText_1-output-document-Document-faiss_0-faiss_0-input-document-Document",
|
"id": "plainText_1-plainText_1-output-document-Document|json-faiss_0-faiss_0-input-document-Document",
|
||||||
"data": {
|
"data": {
|
||||||
"label": ""
|
"label": ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "An agent that uses OpenAI's Function Calling functionality to pick the tool and args to call",
|
"description": "An agent that uses OpenAI's Function Calling functionality to pick the tool and args to call",
|
||||||
|
"categories": "Buffer Memory,Custom Tool, SerpAPI,OpenAI Function,Calculator Tool,ChatOpenAI,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "OpenAI Assistant that has instructions and can leverage models, tools, and knowledge to respond to user queries",
|
"description": "OpenAI Assistant that has instructions and can leverage models, tools, and knowledge to respond to user queries",
|
||||||
|
"categories": "Custom Tool, SerpAPI,OpenAI Assistant,Calculator Tool,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"badge": "NEW",
|
"badge": "NEW",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "Use chat history to rephrase user question, and answer the rephrased question using retrieved docs from vector store",
|
"description": "Use chat history to rephrase user question, and answer the rephrased question using retrieved docs from vector store",
|
||||||
|
"categories": "ChatOpenAI,LLM Chain,SingleStore,Langchain",
|
||||||
"badge": "POPULAR",
|
"badge": "POPULAR",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Use output from a chain as prompt for another chain",
|
"description": "Use output from a chain as prompt for another chain",
|
||||||
|
"categories": "Custom Tool,OpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{
|
{
|
||||||
"description": "Stateless query engine designed to answer question over your data using LlamaIndex",
|
"description": "Stateless query engine designed to answer question over your data using LlamaIndex",
|
||||||
|
"categories": "ChatAnthropic,Compact and Refine,Pinecone,LlamaIndex",
|
||||||
"badge": "NEW",
|
"badge": "NEW",
|
||||||
|
"framework": "LlamaIndex",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "An agent that uses ReAct logic to decide what action to take",
|
"description": "An agent that uses ReAct logic to decide what action to take",
|
||||||
|
"categories": "Calculator Tool,SerpAPI,ChatOpenAI,MRKL Agent,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Use Replicate API that runs Llama 13b v2 model with LLMChain",
|
"description": "Use Replicate API that runs Llama 13b v2 model with LLMChain",
|
||||||
|
"categories": "Replicate,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Answer questions over a SQL database",
|
"description": "Answer questions over a SQL database",
|
||||||
|
"categories": "ChatOpenAI,Sql Database Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Manually construct prompts to query a SQL database",
|
"description": "Manually construct prompts to query a SQL database",
|
||||||
|
"categories": "IfElse Function,Variable Set/Get,Custom JS Function,ChatOpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"badge": "new",
|
"badge": "new",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Simple chat engine to handle back and forth conversations using LlamaIndex",
|
"description": "Simple chat engine to handle back and forth conversations using LlamaIndex",
|
||||||
|
"categories": "BufferMemory,AzureChatOpenAI,LlamaIndex",
|
||||||
|
"framework": "LlamaIndex",
|
||||||
"badge": "NEW",
|
"badge": "NEW",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Basic example of Conversation Chain with built-in memory - works exactly like ChatGPT",
|
"description": "Basic example of Conversation Chain with built-in memory - works exactly like ChatGPT",
|
||||||
|
"categories": "Buffer Memory,ChatOpenAI,Conversation Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"badge": "POPULAR",
|
"badge": "POPULAR",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Basic example of stateless (no memory) LLM Chain with a Prompt Template and LLM Model",
|
"description": "Basic example of stateless (no memory) LLM Chain with a Prompt Template and LLM Model",
|
||||||
|
"categories": "OpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Return response as a specified JSON structure instead of a string/text",
|
"description": "Return response as a specified JSON structure instead of a string/text",
|
||||||
|
"categories": "Structured Output Parser,ChatOpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"badge": "NEW",
|
"badge": "NEW",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Breaks down query into sub questions for each relevant data source, then combine into final response",
|
"description": "Breaks down query into sub questions for each relevant data source, then combine into final response",
|
||||||
|
"categories": "Sub Question Query Engine,Sticky Note,QueryEngine Tool,Compact and Refine,ChatOpenAI,Pinecone,LlamaIndex",
|
||||||
|
"framework": "LlamaIndex",
|
||||||
"badge": "NEW",
|
"badge": "NEW",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Language translation using LLM Chain with a Chat Prompt Template and Chat Model",
|
"description": "Language translation using LLM Chain with a Chat Prompt Template and Chat Model",
|
||||||
|
"categories": "Chat Prompt Template,ChatOpenAI,LLM Chain,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
{
|
{
|
||||||
|
"description": "QA chain for Vectara",
|
||||||
|
"categories": "Vectara QA Chain,Vectara,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Conversational Agent with ability to visit a website and extract information",
|
"description": "Conversational Agent with ability to visit a website and extract information",
|
||||||
|
"categories": "Buffer Memory,Web Browser,ChatOpenAI,Conversational Agent",
|
||||||
|
"framework": "Langchain",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
"width": 300,
|
"width": 300,
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{
|
{
|
||||||
"description": "Scrape web pages for QnA with long term memory Motorhead and return source documents",
|
"description": "Scrape web pages for QnA with long term memory Motorhead and return source documents",
|
||||||
|
"categories": "HtmlToMarkdown,Cheerio Web Scraper,ChatOpenAI,Redis,Pinecone,Langchain",
|
||||||
|
"framework": "Langchain",
|
||||||
"badge": "POPULAR",
|
"badge": "POPULAR",
|
||||||
"nodes": [
|
"nodes": [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "add_contact_hubspot",
|
"name": "add_contact_hubspot",
|
||||||
|
"framework": "Langchain",
|
||||||
"description": "Add new contact to Hubspot",
|
"description": "Add new contact to Hubspot",
|
||||||
"color": "linear-gradient(rgb(85,198,123), rgb(0,230,99))",
|
"color": "linear-gradient(rgb(85,198,123), rgb(0,230,99))",
|
||||||
"iconSrc": "https://cdn.worldvectorlogo.com/logos/hubspot-1.svg",
|
"iconSrc": "https://cdn.worldvectorlogo.com/logos/hubspot-1.svg",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "add_airtable",
|
"name": "add_airtable",
|
||||||
|
"framework": "Langchain",
|
||||||
"description": "Add column1, column2 to Airtable",
|
"description": "Add column1, column2 to Airtable",
|
||||||
"color": "linear-gradient(rgb(125,71,222), rgb(128,102,23))",
|
"color": "linear-gradient(rgb(125,71,222), rgb(128,102,23))",
|
||||||
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/airtable.svg",
|
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/airtable.svg",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "todays_date_time",
|
"name": "todays_date_time",
|
||||||
|
"framework": "Langchain",
|
||||||
"description": "Useful to get todays day, date and time.",
|
"description": "Useful to get todays day, date and time.",
|
||||||
"color": "linear-gradient(rgb(117,118,129), rgb(230,10,250))",
|
"color": "linear-gradient(rgb(117,118,129), rgb(230,10,250))",
|
||||||
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/javascript.svg",
|
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/javascript.svg",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "get_stock_movers",
|
"name": "get_stock_movers",
|
||||||
|
"framework": "Langchain",
|
||||||
"description": "Get the stocks that has biggest price/volume moves, e.g. actives, gainers, losers, etc.",
|
"description": "Get the stocks that has biggest price/volume moves, e.g. actives, gainers, losers, etc.",
|
||||||
"iconSrc": "https://rapidapi.com/cdn/images?url=https://rapidapi-prod-apis.s3.amazonaws.com/9c/e743343bdd41edad39a3fdffd5b974/016c33699f51603ae6fe4420c439124b.png",
|
"iconSrc": "https://rapidapi.com/cdn/images?url=https://rapidapi-prod-apis.s3.amazonaws.com/9c/e743343bdd41edad39a3fdffd5b974/016c33699f51603ae6fe4420c439124b.png",
|
||||||
"color": "linear-gradient(rgb(191,202,167), rgb(143,202,246))",
|
"color": "linear-gradient(rgb(191,202,167), rgb(143,202,246))",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "make_webhook",
|
"name": "make_webhook",
|
||||||
|
"framework": "Langchain",
|
||||||
"description": "Useful when you need to send message to Discord",
|
"description": "Useful when you need to send message to Discord",
|
||||||
"color": "linear-gradient(rgb(19,94,2), rgb(19,124,59))",
|
"color": "linear-gradient(rgb(19,94,2), rgb(19,124,59))",
|
||||||
"iconSrc": "https://github.com/FlowiseAI/Flowise/assets/26460777/517fdab2-8a6e-4781-b3c8-fb92cc78aa0b",
|
"iconSrc": "https://github.com/FlowiseAI/Flowise/assets/26460777/517fdab2-8a6e-4781-b3c8-fb92cc78aa0b",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "send_message_to_discord_channel",
|
"name": "send_message_to_discord_channel",
|
||||||
|
"framework": "Langchain",
|
||||||
"description": "Send message to Discord channel",
|
"description": "Send message to Discord channel",
|
||||||
"color": "linear-gradient(rgb(155,190,84), rgb(176,69,245))",
|
"color": "linear-gradient(rgb(155,190,84), rgb(176,69,245))",
|
||||||
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/discord-icon.svg",
|
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/discord-icon.svg",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "send_message_to_slack_channel",
|
"name": "send_message_to_slack_channel",
|
||||||
|
"framework": "Langchain",
|
||||||
"description": "Send message to Slack channel",
|
"description": "Send message to Slack channel",
|
||||||
"color": "linear-gradient(rgb(155,190,84), rgb(176,69,245))",
|
"color": "linear-gradient(rgb(155,190,84), rgb(176,69,245))",
|
||||||
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/slack-icon.svg",
|
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/slack-icon.svg",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "send_message_to_teams_channel",
|
"name": "send_message_to_teams_channel",
|
||||||
|
"framework": "Langchain",
|
||||||
"description": "Send message to Teams channel",
|
"description": "Send message to Teams channel",
|
||||||
"color": "linear-gradient(rgb(155,190,84), rgb(176,69,245))",
|
"color": "linear-gradient(rgb(155,190,84), rgb(176,69,245))",
|
||||||
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/microsoft-teams.svg",
|
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/microsoft-teams.svg",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "sendgrid_email",
|
"name": "sendgrid_email",
|
||||||
|
"framework": "Langchain",
|
||||||
"description": "Send email using SendGrid",
|
"description": "Send email using SendGrid",
|
||||||
"color": "linear-gradient(rgb(230,108,70), rgb(222,4,98))",
|
"color": "linear-gradient(rgb(230,108,70), rgb(222,4,98))",
|
||||||
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/sendgrid-icon.svg",
|
"iconSrc": "https://raw.githubusercontent.com/gilbarbara/logos/main/logos/sendgrid-icon.svg",
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ export class App {
|
|||||||
this.app.get('/api/v1/ip', (request, response) => {
|
this.app.get('/api/v1/ip', (request, response) => {
|
||||||
response.send({
|
response.send({
|
||||||
ip: request.ip,
|
ip: request.ip,
|
||||||
msg: 'See the returned IP address in the response. If it matches your current IP address ( which you can get by going to http://ip.nfriedly.com/ or https://api.ipify.org/ ), then the number of proxies is correct and the rate limiter should now work correctly. If not, increase the number of proxies by 1 until the IP address matches your own. Visit https://docs.flowiseai.com/deployment#rate-limit-setup-guide for more information.'
|
msg: 'Check returned IP address in the response. If it matches your current IP address ( which you can get by going to http://ip.nfriedly.com/ or https://api.ipify.org/ ), then the number of proxies is correct and the rate limiter should now work correctly. If not, increase the number of proxies by 1 and restart Cloud-Hosted Flowise until the IP address matches your own. Visit https://docs.flowiseai.com/configuration/rate-limit#cloud-hosted-rate-limit-setup-guide for more information.'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -1245,50 +1245,52 @@ export class App {
|
|||||||
// Marketplaces
|
// Marketplaces
|
||||||
// ----------------------------------------
|
// ----------------------------------------
|
||||||
|
|
||||||
// Get all chatflows for marketplaces
|
// Get all templates for marketplaces
|
||||||
this.app.get('/api/v1/marketplaces/chatflows', async (req: Request, res: Response) => {
|
this.app.get('/api/v1/marketplaces/templates', async (req: Request, res: Response) => {
|
||||||
const marketplaceDir = path.join(__dirname, '..', 'marketplaces', 'chatflows')
|
let marketplaceDir = path.join(__dirname, '..', 'marketplaces', 'chatflows')
|
||||||
const jsonsInDir = fs.readdirSync(marketplaceDir).filter((file) => path.extname(file) === '.json')
|
let jsonsInDir = fs.readdirSync(marketplaceDir).filter((file) => path.extname(file) === '.json')
|
||||||
const templates: any[] = []
|
let templates: any[] = []
|
||||||
jsonsInDir.forEach((file, index) => {
|
jsonsInDir.forEach((file, index) => {
|
||||||
const filePath = path.join(__dirname, '..', 'marketplaces', 'chatflows', file)
|
const filePath = path.join(__dirname, '..', 'marketplaces', 'chatflows', file)
|
||||||
const fileData = fs.readFileSync(filePath)
|
const fileData = fs.readFileSync(filePath)
|
||||||
const fileDataObj = JSON.parse(fileData.toString())
|
const fileDataObj = JSON.parse(fileData.toString())
|
||||||
const template = {
|
const template = {
|
||||||
id: index,
|
id: index,
|
||||||
name: file.split('.json')[0],
|
templateName: file.split('.json')[0],
|
||||||
flowData: fileData.toString(),
|
flowData: fileData.toString(),
|
||||||
badge: fileDataObj?.badge,
|
badge: fileDataObj?.badge,
|
||||||
|
framework: fileDataObj?.framework,
|
||||||
|
categories: fileDataObj?.categories,
|
||||||
|
type: 'Chatflow',
|
||||||
description: fileDataObj?.description || ''
|
description: fileDataObj?.description || ''
|
||||||
}
|
}
|
||||||
templates.push(template)
|
templates.push(template)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
marketplaceDir = path.join(__dirname, '..', 'marketplaces', 'tools')
|
||||||
|
jsonsInDir = fs.readdirSync(marketplaceDir).filter((file) => path.extname(file) === '.json')
|
||||||
|
jsonsInDir.forEach((file, index) => {
|
||||||
|
const filePath = path.join(__dirname, '..', 'marketplaces', 'tools', file)
|
||||||
|
const fileData = fs.readFileSync(filePath)
|
||||||
|
const fileDataObj = JSON.parse(fileData.toString())
|
||||||
|
const template = {
|
||||||
|
...fileDataObj,
|
||||||
|
id: index,
|
||||||
|
type: 'Tool',
|
||||||
|
framework: fileDataObj?.framework,
|
||||||
|
badge: fileDataObj?.badge,
|
||||||
|
categories: '',
|
||||||
|
templateName: file.split('.json')[0]
|
||||||
|
}
|
||||||
|
templates.push(template)
|
||||||
|
})
|
||||||
const FlowiseDocsQnA = templates.find((tmp) => tmp.name === 'Flowise Docs QnA')
|
const FlowiseDocsQnA = templates.find((tmp) => tmp.name === 'Flowise Docs QnA')
|
||||||
const FlowiseDocsQnAIndex = templates.findIndex((tmp) => tmp.name === 'Flowise Docs QnA')
|
const FlowiseDocsQnAIndex = templates.findIndex((tmp) => tmp.name === 'Flowise Docs QnA')
|
||||||
if (FlowiseDocsQnA && FlowiseDocsQnAIndex > 0) {
|
if (FlowiseDocsQnA && FlowiseDocsQnAIndex > 0) {
|
||||||
templates.splice(FlowiseDocsQnAIndex, 1)
|
templates.splice(FlowiseDocsQnAIndex, 1)
|
||||||
templates.unshift(FlowiseDocsQnA)
|
templates.unshift(FlowiseDocsQnA)
|
||||||
}
|
}
|
||||||
return res.json(templates)
|
return res.json(templates.sort((a, b) => a.templateName.localeCompare(b.templateName)))
|
||||||
})
|
|
||||||
|
|
||||||
// Get all tools for marketplaces
|
|
||||||
this.app.get('/api/v1/marketplaces/tools', async (req: Request, res: Response) => {
|
|
||||||
const marketplaceDir = path.join(__dirname, '..', 'marketplaces', 'tools')
|
|
||||||
const jsonsInDir = fs.readdirSync(marketplaceDir).filter((file) => path.extname(file) === '.json')
|
|
||||||
const templates: any[] = []
|
|
||||||
jsonsInDir.forEach((file, index) => {
|
|
||||||
const filePath = path.join(__dirname, '..', 'marketplaces', 'tools', file)
|
|
||||||
const fileData = fs.readFileSync(filePath)
|
|
||||||
const fileDataObj = JSON.parse(fileData.toString())
|
|
||||||
const template = {
|
|
||||||
...fileDataObj,
|
|
||||||
id: index,
|
|
||||||
templateName: file.split('.json')[0]
|
|
||||||
}
|
|
||||||
templates.push(template)
|
|
||||||
})
|
|
||||||
return res.json(templates)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// ----------------------------------------
|
// ----------------------------------------
|
||||||
@@ -1469,7 +1471,7 @@ export class App {
|
|||||||
chatType,
|
chatType,
|
||||||
chatId,
|
chatId,
|
||||||
memoryType: memoryType ?? (chatId ? IsNull() : undefined),
|
memoryType: memoryType ?? (chatId ? IsNull() : undefined),
|
||||||
sessionId: sessionId ?? (chatId ? IsNull() : undefined),
|
sessionId: sessionId ?? undefined,
|
||||||
createdDate: toDate && fromDate ? Between(fromDate, toDate) : undefined
|
createdDate: toDate && fromDate ? Between(fromDate, toDate) : undefined
|
||||||
},
|
},
|
||||||
order: {
|
order: {
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
ignoreWarnings: [/Failed to parse source map/] // Ignore warnings about source maps
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,10 @@ import client from './client'
|
|||||||
|
|
||||||
const getAllChatflowsMarketplaces = () => client.get('/marketplaces/chatflows')
|
const getAllChatflowsMarketplaces = () => client.get('/marketplaces/chatflows')
|
||||||
const getAllToolsMarketplaces = () => client.get('/marketplaces/tools')
|
const getAllToolsMarketplaces = () => client.get('/marketplaces/tools')
|
||||||
|
const getAllTemplatesFromMarketplaces = () => client.get('/marketplaces/templates')
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
getAllChatflowsMarketplaces,
|
getAllChatflowsMarketplaces,
|
||||||
getAllToolsMarketplaces
|
getAllToolsMarketplaces,
|
||||||
|
getAllTemplatesFromMarketplaces
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,146 @@
|
|||||||
|
import PropTypes from 'prop-types'
|
||||||
|
import { styled } from '@mui/material/styles'
|
||||||
|
import Table from '@mui/material/Table'
|
||||||
|
import TableBody from '@mui/material/TableBody'
|
||||||
|
import TableCell, { tableCellClasses } from '@mui/material/TableCell'
|
||||||
|
import TableContainer from '@mui/material/TableContainer'
|
||||||
|
import TableHead from '@mui/material/TableHead'
|
||||||
|
import TableRow from '@mui/material/TableRow'
|
||||||
|
import Paper from '@mui/material/Paper'
|
||||||
|
import Chip from '@mui/material/Chip'
|
||||||
|
import { Button, Typography } from '@mui/material'
|
||||||
|
|
||||||
|
const StyledTableCell = styled(TableCell)(({ theme }) => ({
|
||||||
|
[`&.${tableCellClasses.head}`]: {
|
||||||
|
backgroundColor: theme.palette.common.black,
|
||||||
|
color: theme.palette.common.white
|
||||||
|
},
|
||||||
|
[`&.${tableCellClasses.body}`]: {
|
||||||
|
fontSize: 14
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
|
||||||
|
const StyledTableRow = styled(TableRow)(({ theme }) => ({
|
||||||
|
'&:nth-of-type(odd)': {
|
||||||
|
backgroundColor: theme.palette.action.hover
|
||||||
|
},
|
||||||
|
// hide last border
|
||||||
|
'&:last-child td, &:last-child th': {
|
||||||
|
border: 0
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
|
||||||
|
export const MarketplaceTable = ({ data, filterFunction, filterByBadge, filterByType, filterByFramework, goToCanvas, goToTool }) => {
|
||||||
|
const openTemplate = (selectedTemplate) => {
|
||||||
|
if (selectedTemplate.flowData) {
|
||||||
|
goToCanvas(selectedTemplate)
|
||||||
|
} else {
|
||||||
|
goToTool(selectedTemplate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<TableContainer style={{ marginTop: '30', border: 1 }} component={Paper}>
|
||||||
|
<Table sx={{ minWidth: 650 }} size='small' aria-label='a dense table'>
|
||||||
|
<TableHead>
|
||||||
|
<TableRow sx={{ marginTop: '10', backgroundColor: 'primary' }}>
|
||||||
|
<StyledTableCell component='th' scope='row' style={{ width: '15%' }} key='0'>
|
||||||
|
Name
|
||||||
|
</StyledTableCell>
|
||||||
|
<StyledTableCell component='th' scope='row' style={{ width: '5%' }} key='1'>
|
||||||
|
Type
|
||||||
|
</StyledTableCell>
|
||||||
|
<StyledTableCell style={{ width: '35%' }} key='2'>
|
||||||
|
Description
|
||||||
|
</StyledTableCell>
|
||||||
|
<StyledTableCell style={{ width: '35%' }} key='3'>
|
||||||
|
Nodes
|
||||||
|
</StyledTableCell>
|
||||||
|
<StyledTableCell component='th' scope='row' style={{ width: '5%' }} key='4'>
|
||||||
|
|
||||||
|
</StyledTableCell>
|
||||||
|
</TableRow>
|
||||||
|
</TableHead>
|
||||||
|
<TableBody>
|
||||||
|
{data
|
||||||
|
.filter(filterByBadge)
|
||||||
|
.filter(filterByType)
|
||||||
|
.filter(filterFunction)
|
||||||
|
.filter(filterByFramework)
|
||||||
|
.map((row, index) => (
|
||||||
|
<StyledTableRow key={index}>
|
||||||
|
<TableCell key='0'>
|
||||||
|
<Typography
|
||||||
|
sx={{ fontSize: '1.2rem', fontWeight: 500, overflowWrap: 'break-word', whiteSpace: 'pre-line' }}
|
||||||
|
>
|
||||||
|
<Button onClick={() => openTemplate(row)} sx={{ textAlign: 'left' }}>
|
||||||
|
{row.templateName || row.name}
|
||||||
|
</Button>
|
||||||
|
</Typography>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell key='1'>
|
||||||
|
<Typography>{row.type}</Typography>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell key='2'>
|
||||||
|
<Typography sx={{ overflowWrap: 'break-word', whiteSpace: 'pre-line' }}>
|
||||||
|
{row.description || ''}
|
||||||
|
</Typography>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell key='3'>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'row',
|
||||||
|
flexWrap: 'wrap',
|
||||||
|
marginTop: 5
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{row.categories &&
|
||||||
|
row.categories
|
||||||
|
.split(',')
|
||||||
|
.map((tag, index) => (
|
||||||
|
<Chip
|
||||||
|
variant='outlined'
|
||||||
|
key={index}
|
||||||
|
size='small'
|
||||||
|
label={tag.toUpperCase()}
|
||||||
|
style={{ marginRight: 3, marginBottom: 3 }}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</TableCell>
|
||||||
|
<TableCell key='4'>
|
||||||
|
<Typography>
|
||||||
|
{row.badge &&
|
||||||
|
row.badge
|
||||||
|
.split(';')
|
||||||
|
.map((tag, index) => (
|
||||||
|
<Chip
|
||||||
|
color={tag === 'POPULAR' ? 'primary' : 'error'}
|
||||||
|
key={index}
|
||||||
|
size='small'
|
||||||
|
label={tag.toUpperCase()}
|
||||||
|
style={{ marginRight: 5, marginBottom: 5 }}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</Typography>
|
||||||
|
</TableCell>
|
||||||
|
</StyledTableRow>
|
||||||
|
))}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
</TableContainer>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
MarketplaceTable.propTypes = {
|
||||||
|
data: PropTypes.array,
|
||||||
|
filterFunction: PropTypes.func,
|
||||||
|
filterByBadge: PropTypes.func,
|
||||||
|
filterByType: PropTypes.func,
|
||||||
|
filterByFramework: PropTypes.func,
|
||||||
|
goToTool: PropTypes.func,
|
||||||
|
goToCanvas: PropTypes.func
|
||||||
|
}
|
||||||
@@ -99,6 +99,7 @@ export const initNode = (nodeData, newNodeId) => {
|
|||||||
id: `${newNodeId}-output-${nodeData.outputs[j].name}-${baseClasses}`,
|
id: `${newNodeId}-output-${nodeData.outputs[j].name}-${baseClasses}`,
|
||||||
name: nodeData.outputs[j].name,
|
name: nodeData.outputs[j].name,
|
||||||
label: nodeData.outputs[j].label,
|
label: nodeData.outputs[j].label,
|
||||||
|
description: nodeData.outputs[j].description ?? '',
|
||||||
type
|
type
|
||||||
}
|
}
|
||||||
options.push(newOutputOption)
|
options.push(newOutputOption)
|
||||||
@@ -107,6 +108,7 @@ export const initNode = (nodeData, newNodeId) => {
|
|||||||
name: 'output',
|
name: 'output',
|
||||||
label: 'Output',
|
label: 'Output',
|
||||||
type: 'options',
|
type: 'options',
|
||||||
|
description: nodeData.outputs[0].description ?? '',
|
||||||
options,
|
options,
|
||||||
default: nodeData.outputs[0].name
|
default: nodeData.outputs[0].name
|
||||||
}
|
}
|
||||||
@@ -116,6 +118,7 @@ export const initNode = (nodeData, newNodeId) => {
|
|||||||
id: `${newNodeId}-output-${nodeData.name}-${nodeData.baseClasses.join('|')}`,
|
id: `${newNodeId}-output-${nodeData.name}-${nodeData.baseClasses.join('|')}`,
|
||||||
name: nodeData.name,
|
name: nodeData.name,
|
||||||
label: nodeData.type,
|
label: nodeData.type,
|
||||||
|
description: nodeData.description ?? '',
|
||||||
type: nodeData.baseClasses.join(' | ')
|
type: nodeData.baseClasses.join(' | ')
|
||||||
}
|
}
|
||||||
outputAnchors.push(newOutput)
|
outputAnchors.push(newOutput)
|
||||||
|
|||||||
@@ -4,9 +4,26 @@ import { useSelector } from 'react-redux'
|
|||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
|
|
||||||
// material-ui
|
// material-ui
|
||||||
import { Grid, Box, Stack, Tabs, Tab, Badge } from '@mui/material'
|
import {
|
||||||
|
Grid,
|
||||||
|
Box,
|
||||||
|
Stack,
|
||||||
|
Badge,
|
||||||
|
Toolbar,
|
||||||
|
TextField,
|
||||||
|
InputAdornment,
|
||||||
|
ButtonGroup,
|
||||||
|
ToggleButton,
|
||||||
|
InputLabel,
|
||||||
|
FormControl,
|
||||||
|
Select,
|
||||||
|
OutlinedInput,
|
||||||
|
Checkbox,
|
||||||
|
ListItemText,
|
||||||
|
Button
|
||||||
|
} from '@mui/material'
|
||||||
import { useTheme } from '@mui/material/styles'
|
import { useTheme } from '@mui/material/styles'
|
||||||
import { IconHierarchy, IconTool } from '@tabler/icons'
|
import { IconChevronsDown, IconChevronsUp, IconLayoutGrid, IconList, IconSearch } from '@tabler/icons'
|
||||||
|
|
||||||
// project imports
|
// project imports
|
||||||
import MainCard from 'ui-component/cards/MainCard'
|
import MainCard from 'ui-component/cards/MainCard'
|
||||||
@@ -23,6 +40,10 @@ import useApi from 'hooks/useApi'
|
|||||||
|
|
||||||
// const
|
// const
|
||||||
import { baseURL } from 'store/constant'
|
import { baseURL } from 'store/constant'
|
||||||
|
import * as React from 'react'
|
||||||
|
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'
|
||||||
|
import { MarketplaceTable } from '../../ui-component/table/MarketplaceTable'
|
||||||
|
import MenuItem from '@mui/material/MenuItem'
|
||||||
|
|
||||||
function TabPanel(props) {
|
function TabPanel(props) {
|
||||||
const { children, value, index, ...other } = props
|
const { children, value, index, ...other } = props
|
||||||
@@ -45,6 +66,19 @@ TabPanel.propTypes = {
|
|||||||
value: PropTypes.number.isRequired
|
value: PropTypes.number.isRequired
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ITEM_HEIGHT = 48
|
||||||
|
const ITEM_PADDING_TOP = 8
|
||||||
|
const badges = ['POPULAR', 'NEW']
|
||||||
|
const types = ['Chatflow', 'Tool']
|
||||||
|
const framework = ['Langchain', 'LlamaIndex']
|
||||||
|
const MenuProps = {
|
||||||
|
PaperProps: {
|
||||||
|
style: {
|
||||||
|
maxHeight: ITEM_HEIGHT * 4.5 + ITEM_PADDING_TOP,
|
||||||
|
width: 250
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// ==============================|| Marketplace ||============================== //
|
// ==============================|| Marketplace ||============================== //
|
||||||
|
|
||||||
const Marketplace = () => {
|
const Marketplace = () => {
|
||||||
@@ -53,16 +87,77 @@ const Marketplace = () => {
|
|||||||
const theme = useTheme()
|
const theme = useTheme()
|
||||||
const customization = useSelector((state) => state.customization)
|
const customization = useSelector((state) => state.customization)
|
||||||
|
|
||||||
const [isChatflowsLoading, setChatflowsLoading] = useState(true)
|
const [isLoading, setLoading] = useState(true)
|
||||||
const [isToolsLoading, setToolsLoading] = useState(true)
|
|
||||||
const [images, setImages] = useState({})
|
const [images, setImages] = useState({})
|
||||||
const tabItems = ['Chatflows', 'Tools']
|
|
||||||
const [value, setValue] = useState(0)
|
|
||||||
const [showToolDialog, setShowToolDialog] = useState(false)
|
const [showToolDialog, setShowToolDialog] = useState(false)
|
||||||
const [toolDialogProps, setToolDialogProps] = useState({})
|
const [toolDialogProps, setToolDialogProps] = useState({})
|
||||||
|
|
||||||
const getAllChatflowsMarketplacesApi = useApi(marketplacesApi.getAllChatflowsMarketplaces)
|
const getAllTemplatesMarketplacesApi = useApi(marketplacesApi.getAllTemplatesFromMarketplaces)
|
||||||
const getAllToolsMarketplacesApi = useApi(marketplacesApi.getAllToolsMarketplaces)
|
|
||||||
|
const [view, setView] = React.useState(localStorage.getItem('mpDisplayStyle') || 'card')
|
||||||
|
const [search, setSearch] = useState('')
|
||||||
|
|
||||||
|
const [badgeFilter, setBadgeFilter] = useState([])
|
||||||
|
const [typeFilter, setTypeFilter] = useState([])
|
||||||
|
const [frameworkFilter, setFrameworkFilter] = useState([])
|
||||||
|
const [open, setOpen] = useState(false)
|
||||||
|
const handleBadgeFilterChange = (event) => {
|
||||||
|
const {
|
||||||
|
target: { value }
|
||||||
|
} = event
|
||||||
|
setBadgeFilter(
|
||||||
|
// On autofill we get a stringified value.
|
||||||
|
typeof value === 'string' ? value.split(',') : value
|
||||||
|
)
|
||||||
|
}
|
||||||
|
const handleTypeFilterChange = (event) => {
|
||||||
|
const {
|
||||||
|
target: { value }
|
||||||
|
} = event
|
||||||
|
setTypeFilter(
|
||||||
|
// On autofill we get a stringified value.
|
||||||
|
typeof value === 'string' ? value.split(',') : value
|
||||||
|
)
|
||||||
|
}
|
||||||
|
const handleFrameworkFilterChange = (event) => {
|
||||||
|
const {
|
||||||
|
target: { value }
|
||||||
|
} = event
|
||||||
|
setFrameworkFilter(
|
||||||
|
// On autofill we get a stringified value.
|
||||||
|
typeof value === 'string' ? value.split(',') : value
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleViewChange = (event, nextView) => {
|
||||||
|
localStorage.setItem('mpDisplayStyle', nextView)
|
||||||
|
setView(nextView)
|
||||||
|
}
|
||||||
|
|
||||||
|
const onSearchChange = (event) => {
|
||||||
|
setSearch(event.target.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterFlows(data) {
|
||||||
|
return (
|
||||||
|
data.categories?.toLowerCase().indexOf(search.toLowerCase()) > -1 ||
|
||||||
|
data.templateName.toLowerCase().indexOf(search.toLowerCase()) > -1 ||
|
||||||
|
(data.description && data.description.toLowerCase().indexOf(search.toLowerCase()) > -1)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterByBadge(data) {
|
||||||
|
return badgeFilter.length > 0 ? badgeFilter.includes(data.badge) : true
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterByType(data) {
|
||||||
|
return typeFilter.length > 0 ? typeFilter.includes(data.type) : true
|
||||||
|
}
|
||||||
|
|
||||||
|
function filterByFramework(data) {
|
||||||
|
return frameworkFilter.length > 0 ? frameworkFilter.includes(data.framework) : true
|
||||||
|
}
|
||||||
|
|
||||||
const onUseTemplate = (selectedTool) => {
|
const onUseTemplate = (selectedTool) => {
|
||||||
const dialogProp = {
|
const dialogProp = {
|
||||||
@@ -90,39 +185,33 @@ const Marketplace = () => {
|
|||||||
navigate(`/marketplace/${selectedChatflow.id}`, { state: selectedChatflow })
|
navigate(`/marketplace/${selectedChatflow.id}`, { state: selectedChatflow })
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleChange = (event, newValue) => {
|
|
||||||
setValue(newValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getAllChatflowsMarketplacesApi.request()
|
getAllTemplatesMarketplacesApi.request()
|
||||||
getAllToolsMarketplacesApi.request()
|
|
||||||
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setChatflowsLoading(getAllChatflowsMarketplacesApi.loading)
|
setLoading(getAllTemplatesMarketplacesApi.loading)
|
||||||
}, [getAllChatflowsMarketplacesApi.loading])
|
}, [getAllTemplatesMarketplacesApi.loading])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setToolsLoading(getAllToolsMarketplacesApi.loading)
|
if (getAllTemplatesMarketplacesApi.data) {
|
||||||
}, [getAllToolsMarketplacesApi.loading])
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (getAllChatflowsMarketplacesApi.data) {
|
|
||||||
try {
|
try {
|
||||||
const chatflows = getAllChatflowsMarketplacesApi.data
|
const flows = getAllTemplatesMarketplacesApi.data
|
||||||
|
|
||||||
const images = {}
|
const images = {}
|
||||||
for (let i = 0; i < chatflows.length; i += 1) {
|
for (let i = 0; i < flows.length; i += 1) {
|
||||||
const flowDataStr = chatflows[i].flowData
|
if (flows[i].flowData) {
|
||||||
const flowData = JSON.parse(flowDataStr)
|
const flowDataStr = flows[i].flowData
|
||||||
const nodes = flowData.nodes || []
|
const flowData = JSON.parse(flowDataStr)
|
||||||
images[chatflows[i].id] = []
|
const nodes = flowData.nodes || []
|
||||||
for (let j = 0; j < nodes.length; j += 1) {
|
images[flows[i].id] = []
|
||||||
const imageSrc = `${baseURL}/api/v1/node-icon/${nodes[j].data.name}`
|
for (let j = 0; j < nodes.length; j += 1) {
|
||||||
if (!images[chatflows[i].id].includes(imageSrc)) {
|
const imageSrc = `${baseURL}/api/v1/node-icon/${nodes[j].data.name}`
|
||||||
images[chatflows[i].id].push(imageSrc)
|
if (!images[flows[i].id].includes(imageSrc)) {
|
||||||
|
images[flows[i].id].push(imageSrc)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -131,80 +220,215 @@ const Marketplace = () => {
|
|||||||
console.error(e)
|
console.error(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [getAllChatflowsMarketplacesApi.data])
|
}, [getAllTemplatesMarketplacesApi.data])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<MainCard sx={{ background: customization.isDarkMode ? theme.palette.common.black : '' }}>
|
<MainCard sx={{ background: customization.isDarkMode ? theme.palette.common.black : '' }}>
|
||||||
<Stack flexDirection='row'>
|
<Box sx={{ flexGrow: 1 }}>
|
||||||
<h1>Marketplace</h1>
|
<Toolbar
|
||||||
</Stack>
|
disableGutters={true}
|
||||||
<Tabs sx={{ mb: 2 }} variant='fullWidth' value={value} onChange={handleChange} aria-label='tabs'>
|
style={{
|
||||||
{tabItems.map((item, index) => (
|
margin: 1,
|
||||||
<Tab
|
padding: 1,
|
||||||
key={index}
|
paddingBottom: 10,
|
||||||
icon={index === 0 ? <IconHierarchy /> : <IconTool />}
|
display: 'flex',
|
||||||
iconPosition='start'
|
justifyContent: 'space-between',
|
||||||
label={<span style={{ fontSize: '1.1rem' }}>{item}</span>}
|
width: '100%'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<h1>Marketplace</h1>
|
||||||
|
<TextField
|
||||||
|
size='small'
|
||||||
|
id='search-filter-textbox'
|
||||||
|
sx={{ display: { xs: 'none', sm: 'block' }, ml: 3 }}
|
||||||
|
variant='outlined'
|
||||||
|
fullWidth='true'
|
||||||
|
placeholder='Search name or description or node name'
|
||||||
|
onChange={onSearchChange}
|
||||||
|
InputProps={{
|
||||||
|
startAdornment: (
|
||||||
|
<InputAdornment position='start'>
|
||||||
|
<IconSearch />
|
||||||
|
</InputAdornment>
|
||||||
|
)
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
))}
|
<Button
|
||||||
</Tabs>
|
sx={{ width: '220px', ml: 3, mr: 5 }}
|
||||||
{tabItems.map((item, index) => (
|
variant='outlined'
|
||||||
<TabPanel key={index} value={value} index={index}>
|
onClick={() => setOpen(!open)}
|
||||||
{item === 'Chatflows' && (
|
startIcon={open ? <IconChevronsUp /> : <IconChevronsDown />}
|
||||||
<Grid container spacing={gridSpacing}>
|
>
|
||||||
{!isChatflowsLoading &&
|
{open ? 'Hide Filters' : 'Show Filters'}
|
||||||
getAllChatflowsMarketplacesApi.data &&
|
</Button>
|
||||||
getAllChatflowsMarketplacesApi.data.map((data, index) => (
|
<Box sx={{ flexGrow: 1 }} />
|
||||||
<Grid key={index} item lg={3} md={4} sm={6} xs={12}>
|
<ButtonGroup sx={{ maxHeight: 40 }} disableElevation variant='contained' aria-label='outlined primary button group'>
|
||||||
{data.badge && (
|
<ButtonGroup disableElevation variant='contained' aria-label='outlined primary button group'>
|
||||||
<Badge
|
<ToggleButtonGroup
|
||||||
sx={{
|
sx={{ maxHeight: 40 }}
|
||||||
'& .MuiBadge-badge': {
|
value={view}
|
||||||
right: 20
|
color='primary'
|
||||||
}
|
exclusive
|
||||||
}}
|
onChange={handleViewChange}
|
||||||
badgeContent={data.badge}
|
>
|
||||||
color={data.badge === 'POPULAR' ? 'primary' : 'error'}
|
<ToggleButton
|
||||||
>
|
sx={{ color: theme?.customization?.isDarkMode ? 'white' : 'inherit' }}
|
||||||
|
variant='contained'
|
||||||
|
value='card'
|
||||||
|
title='Card View'
|
||||||
|
>
|
||||||
|
<IconLayoutGrid />
|
||||||
|
</ToggleButton>
|
||||||
|
<ToggleButton
|
||||||
|
sx={{ color: theme?.customization?.isDarkMode ? 'white' : 'inherit' }}
|
||||||
|
variant='contained'
|
||||||
|
value='list'
|
||||||
|
title='List View'
|
||||||
|
>
|
||||||
|
<IconList />
|
||||||
|
</ToggleButton>
|
||||||
|
</ToggleButtonGroup>
|
||||||
|
</ButtonGroup>
|
||||||
|
</ButtonGroup>
|
||||||
|
</Toolbar>
|
||||||
|
</Box>
|
||||||
|
{open && (
|
||||||
|
<Box sx={{ flexGrow: 1, mb: 2 }}>
|
||||||
|
<Toolbar
|
||||||
|
disableGutters={true}
|
||||||
|
style={{
|
||||||
|
margin: 1,
|
||||||
|
padding: 1,
|
||||||
|
paddingBottom: 10,
|
||||||
|
display: 'flex',
|
||||||
|
justifyContent: 'flex-start',
|
||||||
|
width: '100%',
|
||||||
|
borderBottom: '1px solid'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<FormControl sx={{ m: 1, width: 250 }}>
|
||||||
|
<InputLabel size='small' id='filter-badge-label'>
|
||||||
|
Tag
|
||||||
|
</InputLabel>
|
||||||
|
<Select
|
||||||
|
labelId='filter-badge-label'
|
||||||
|
id='filter-badge-checkbox'
|
||||||
|
size='small'
|
||||||
|
multiple
|
||||||
|
value={badgeFilter}
|
||||||
|
onChange={handleBadgeFilterChange}
|
||||||
|
input={<OutlinedInput label='Badge' />}
|
||||||
|
renderValue={(selected) => selected.join(', ')}
|
||||||
|
MenuProps={MenuProps}
|
||||||
|
>
|
||||||
|
{badges.map((name) => (
|
||||||
|
<MenuItem key={name} value={name}>
|
||||||
|
<Checkbox checked={badgeFilter.indexOf(name) > -1} />
|
||||||
|
<ListItemText primary={name} />
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
|
<FormControl sx={{ m: 1, width: 250 }}>
|
||||||
|
<InputLabel size='small' id='type-badge-label'>
|
||||||
|
Type
|
||||||
|
</InputLabel>
|
||||||
|
<Select
|
||||||
|
size='small'
|
||||||
|
labelId='type-badge-label'
|
||||||
|
id='type-badge-checkbox'
|
||||||
|
multiple
|
||||||
|
value={typeFilter}
|
||||||
|
onChange={handleTypeFilterChange}
|
||||||
|
input={<OutlinedInput label='Badge' />}
|
||||||
|
renderValue={(selected) => selected.join(', ')}
|
||||||
|
MenuProps={MenuProps}
|
||||||
|
>
|
||||||
|
{types.map((name) => (
|
||||||
|
<MenuItem key={name} value={name}>
|
||||||
|
<Checkbox checked={typeFilter.indexOf(name) > -1} />
|
||||||
|
<ListItemText primary={name} />
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
|
<FormControl sx={{ m: 1, width: 250 }}>
|
||||||
|
<InputLabel size='small' id='type-fw-label'>
|
||||||
|
Framework
|
||||||
|
</InputLabel>
|
||||||
|
<Select
|
||||||
|
size='small'
|
||||||
|
labelId='type-fw-label'
|
||||||
|
id='type-fw-checkbox'
|
||||||
|
multiple
|
||||||
|
value={frameworkFilter}
|
||||||
|
onChange={handleFrameworkFilterChange}
|
||||||
|
input={<OutlinedInput label='Badge' />}
|
||||||
|
renderValue={(selected) => selected.join(', ')}
|
||||||
|
MenuProps={MenuProps}
|
||||||
|
>
|
||||||
|
{framework.map((name) => (
|
||||||
|
<MenuItem key={name} value={name}>
|
||||||
|
<Checkbox checked={frameworkFilter.indexOf(name) > -1} />
|
||||||
|
<ListItemText primary={name} />
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
</FormControl>
|
||||||
|
</Toolbar>
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{!isLoading && (!view || view === 'card') && getAllTemplatesMarketplacesApi.data && (
|
||||||
|
<>
|
||||||
|
<Grid container spacing={gridSpacing}>
|
||||||
|
{getAllTemplatesMarketplacesApi.data
|
||||||
|
.filter(filterByBadge)
|
||||||
|
.filter(filterByType)
|
||||||
|
.filter(filterFlows)
|
||||||
|
.filter(filterByFramework)
|
||||||
|
.map((data, index) => (
|
||||||
|
<Grid key={index} item lg={3} md={4} sm={6} xs={12}>
|
||||||
|
{data.badge && (
|
||||||
|
<Badge
|
||||||
|
sx={{
|
||||||
|
'& .MuiBadge-badge': {
|
||||||
|
right: 20
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
badgeContent={data.badge}
|
||||||
|
color={data.badge === 'POPULAR' ? 'primary' : 'error'}
|
||||||
|
>
|
||||||
|
{data.type === 'Chatflow' && (
|
||||||
<ItemCard onClick={() => goToCanvas(data)} data={data} images={images[data.id]} />
|
<ItemCard onClick={() => goToCanvas(data)} data={data} images={images[data.id]} />
|
||||||
</Badge>
|
)}
|
||||||
)}
|
{data.type === 'Tool' && <ItemCard data={data} onClick={() => goToTool(data)} />}
|
||||||
{!data.badge && (
|
</Badge>
|
||||||
<ItemCard onClick={() => goToCanvas(data)} data={data} images={images[data.id]} />
|
)}
|
||||||
)}
|
{!data.badge && data.type === 'Chatflow' && (
|
||||||
</Grid>
|
<ItemCard onClick={() => goToCanvas(data)} data={data} images={images[data.id]} />
|
||||||
))}
|
)}
|
||||||
</Grid>
|
{!data.badge && data.type === 'Tool' && <ItemCard data={data} onClick={() => goToTool(data)} />}
|
||||||
)}
|
</Grid>
|
||||||
{item === 'Tools' && (
|
))}
|
||||||
<Grid container spacing={gridSpacing}>
|
</Grid>
|
||||||
{!isToolsLoading &&
|
</>
|
||||||
getAllToolsMarketplacesApi.data &&
|
)}
|
||||||
getAllToolsMarketplacesApi.data.map((data, index) => (
|
{!isLoading && view === 'list' && getAllTemplatesMarketplacesApi.data && (
|
||||||
<Grid key={index} item lg={3} md={4} sm={6} xs={12}>
|
<MarketplaceTable
|
||||||
{data.badge && (
|
sx={{ mt: 20 }}
|
||||||
<Badge
|
data={getAllTemplatesMarketplacesApi.data}
|
||||||
sx={{
|
filterFunction={filterFlows}
|
||||||
'& .MuiBadge-badge': {
|
filterByType={filterByType}
|
||||||
right: 20
|
filterByBadge={filterByBadge}
|
||||||
}
|
filterByFramework={filterByFramework}
|
||||||
}}
|
goToTool={goToTool}
|
||||||
badgeContent={data.badge}
|
goToCanvas={goToCanvas}
|
||||||
color={data.badge === 'POPULAR' ? 'primary' : 'error'}
|
/>
|
||||||
>
|
)}
|
||||||
<ItemCard data={data} onClick={() => goToTool(data)} />
|
|
||||||
</Badge>
|
{!isLoading && (!getAllTemplatesMarketplacesApi.data || getAllTemplatesMarketplacesApi.data.length === 0) && (
|
||||||
)}
|
|
||||||
{!data.badge && <ItemCard data={data} onClick={() => goToTool(data)} />}
|
|
||||||
</Grid>
|
|
||||||
))}
|
|
||||||
</Grid>
|
|
||||||
)}
|
|
||||||
</TabPanel>
|
|
||||||
))}
|
|
||||||
{((!isChatflowsLoading && (!getAllChatflowsMarketplacesApi.data || getAllChatflowsMarketplacesApi.data.length === 0)) ||
|
|
||||||
(!isToolsLoading && (!getAllToolsMarketplacesApi.data || getAllToolsMarketplacesApi.data.length === 0))) && (
|
|
||||||
<Stack sx={{ alignItems: 'center', justifyContent: 'center' }} flexDirection='column'>
|
<Stack sx={{ alignItems: 'center', justifyContent: 'center' }} flexDirection='column'>
|
||||||
<Box sx={{ p: 2, height: 'auto' }}>
|
<Box sx={{ p: 2, height: 'auto' }}>
|
||||||
<img
|
<img
|
||||||
|
|||||||
Reference in New Issue
Block a user