From f85c9359839a133e0a56ce8a404401a0fef795e0 Mon Sep 17 00:00:00 2001 From: vinodkiran Date: Wed, 20 Sep 2023 14:31:52 +0530 Subject: [PATCH 01/11] Adding support for LLMonitor --- .../credentials/LLMonitorApi.credential.ts | 33 ++++++++++++++++++ .../nodes/analytic/LLMonitor/LLMonitor.ts | 33 ++++++++++++++++++ .../nodes/analytic/LLMonitor/llmonitor.png | Bin 0 -> 1726 bytes packages/components/package.json | 1 + packages/components/src/handler.ts | 18 +++++++--- packages/ui/src/assets/images/llmonitor.png | Bin 0 -> 1726 bytes .../ui-component/dialog/AnalyseFlowDialog.js | 21 +++++++++++ 7 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 packages/components/credentials/LLMonitorApi.credential.ts create mode 100644 packages/components/nodes/analytic/LLMonitor/LLMonitor.ts create mode 100644 packages/components/nodes/analytic/LLMonitor/llmonitor.png create mode 100644 packages/ui/src/assets/images/llmonitor.png diff --git a/packages/components/credentials/LLMonitorApi.credential.ts b/packages/components/credentials/LLMonitorApi.credential.ts new file mode 100644 index 000000000..97b195ec5 --- /dev/null +++ b/packages/components/credentials/LLMonitorApi.credential.ts @@ -0,0 +1,33 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class LLMonitorApi implements INodeCredential { + label: string + name: string + version: number + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'LLMonitor API' + this.name = 'llmonitorApi' + this.version = 1.0 + this.description = + 'Refer to official guide on how to get API key on Langsmith' + this.inputs = [ + { + label: 'APP ID', + name: 'llmonitorAppId', + type: 'password', + placeholder: '' + }, + { + label: 'Endpoint', + name: 'llmonitorEndpoint', + type: 'string', + default: 'https://app.llmonitor.com' + } + ] + } +} + +module.exports = { credClass: LLMonitorApi } diff --git a/packages/components/nodes/analytic/LLMonitor/LLMonitor.ts b/packages/components/nodes/analytic/LLMonitor/LLMonitor.ts new file mode 100644 index 000000000..a1ae317c4 --- /dev/null +++ b/packages/components/nodes/analytic/LLMonitor/LLMonitor.ts @@ -0,0 +1,33 @@ +import { INode, INodeParams } from '../../../src/Interface' + +class LLMonitor_Analytic 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 = 'LLMonitor' + this.name = 'llmonitor' + this.version = 1.0 + this.type = 'LLMonitor' + this.icon = 'llmonitor.png' + this.category = 'Analytic' + this.baseClasses = [this.type] + this.inputs = [] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['llmonitorApi'] + } + } +} + +module.exports = { nodeClass: LLMonitor_Analytic } diff --git a/packages/components/nodes/analytic/LLMonitor/llmonitor.png b/packages/components/nodes/analytic/LLMonitor/llmonitor.png new file mode 100644 index 0000000000000000000000000000000000000000..d50a704431d724fa02aae7e24a58f68600e802d8 GIT binary patch literal 1726 zcmV;v20{6WP)$hw(%WbFxUp$fMGFUHU%~`3A7A69(!ggFdoMC__nGxJn%iu z`RAPfd~^PDzW+bN`T9qn0v8F;=S`p#mxOBJl29#NI6|DK9|?h-a!H3ws1Wd*5Dq|5 zNjw`(XI$~5H<6;A86gk=MzyM!jjcnPW*!G-?UTZ@4+GIpU3(jmM8p0Y62>vT`r890 zy+l}Ne|seHrxm9?ivIrzi4e|@uUSU4%KBZ?xWB#ohvlstSyveA3YkvQbZdM_BN8x; z;UjD@5ZR2Pfn+*`XJHT&A>4MU@QO+{s#QvO2;K9wZkdIJ3XTXfj2D1>lPy|E!#2l=FAdKkkv-@UY{zr3b~x$ygJg^EP)to zVrlH%&z2ttWA(5B0Dz)^)o|PyJG`b-ai9}ciY9)ufcG#Etul&T7$;4w$|in^an>91 zBvN&RUX)2w+tt?Qh6!oKP31)H<8eB0Vxg%JBGi(`1XF`CXWn>-l$MxWvJE}fXirHu&;zvuAXbNEUQ`9JKQF}>O( z7Xtubkcmdxl#6@pfn#5xX;%=-=9rcoNq({upqpwT|F>Tmy90+{9TUTI1 zy*FoDDhR=>H?$at{^X1O`R3Pp+Diy+L=tZno;&4YRzeNeL%m9=5INg7)9$^cVp*E= zg%r9R&BztwNbf6Y5DS?4_aE1?4rI63xXdNtki zpPOE$PYI7}R!DJz*o>l85BhLtlkTH^<8_B>$`UEm`>dx6XiKg7&H?GO^FA4 zG;!a#OE+KZ(thWv899x9{5bQ${A#7TmOW%~40jaj^Uh{Tk3!0PixcE8W}kQ~XMRT% zeSgkIXS2Z;`45JBk-}b-3wSrjt&-xLLxa5@IuSjJdR}+7{#r@Xv^&Uro6Zu`t{_g3 z?NSk+kp!Y??4woJhmRZ>L)oXST_qb4f#KM3W-E4BK5s>(p7Vy@>Nn+uq)#P#!>s>! zt4MaUBzb4UbJy-Q$wg|RfI2x-X-}NxMkW&=<^Gid9_zdng^{4BKiiyi^KEOFMI|fm zMpBgXAo;)_Uhs$AY-|7k2qsw$zq>-jt10!oFTAjOmIt^n^wV+cK#ROee^v~r!Eag&KN_|0IOm^@6U2Xa zBfnc%PZ!r)G-_WI6$0LSlh0{H=k==(J^K5)Yr!8OD0X5n2tKb@-LM#$dpVRk{`tR` zLn(}`Fsfccrw0|eH9pjNT7c3(F??|^>Nve9CNP|$C@CM&NrYFF(qXMq$}8H)?s)Q- zvn#RVOwGCKy-Fi6^!+dNyke?YdRD=VJNV(F&Fa^&h6&}-ua-|)JI%#9Sp{3M!`n8e zEflYRipB`#VNuH_jcp@Zr5IsX+a#V{3`A$#!L@J$RPuP5A6Dz(#CkXZ0)SpBG|I$k z5uXR2h;=4MMADcmp7f(f&+dm64eIo`Jw<_09T)B&<0YY5xFl2y7mm>X0ssL2|JvM= Uk^cbmzW@LL07*qoM6N<$f_vUR-2eap literal 0 HcmV?d00001 diff --git a/packages/components/package.json b/packages/components/package.json index a69b8f262..2512104e1 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -46,6 +46,7 @@ "langfuse-langchain": "^1.0.14-alpha.0", "langsmith": "^0.0.32", "linkifyjs": "^4.1.1", + "llmonitor": "^0.5.5", "mammoth": "^1.5.1", "moment": "^2.29.3", "mysql2": "^3.5.1", diff --git a/packages/components/src/handler.ts b/packages/components/src/handler.ts index f13719ce6..10f9a2141 100644 --- a/packages/components/src/handler.ts +++ b/packages/components/src/handler.ts @@ -4,6 +4,7 @@ import { Logger } from 'winston' import { Server } from 'socket.io' import { Client } from 'langsmith' import { LangChainTracer } from 'langchain/callbacks' +import { LLMonitorHandler } from 'langchain/callbacks/handlers/llmonitor' import { getCredentialData, getCredentialParam } from './utils' import { ICommonObject, INodeData } from './Interface' import CallbackHandler from 'langfuse-langchain' @@ -194,11 +195,11 @@ export const additionalCallbacks = async (nodeData: INodeData, options: ICommonO for (const provider in analytic) { const providerStatus = analytic[provider].status as boolean if (providerStatus) { + const credentialId = analytic[provider].credentialId as string + const credentialData = await getCredentialData(credentialId ?? '', options) if (provider === 'langSmith') { - const credentialId = analytic[provider].credentialId as string const langSmithProject = analytic[provider].projectName as string - const credentialData = await getCredentialData(credentialId ?? '', options) const langSmithApiKey = getCredentialParam('langSmithApiKey', credentialData, nodeData) const langSmithEndpoint = getCredentialParam('langSmithEndpoint', credentialData, nodeData) @@ -214,13 +215,11 @@ export const additionalCallbacks = async (nodeData: INodeData, options: ICommonO }) callbacks.push(tracer) } else if (provider === 'langFuse') { - const credentialId = analytic[provider].credentialId as string const flushAt = analytic[provider].flushAt as string const flushInterval = analytic[provider].flushInterval as string const requestTimeout = analytic[provider].requestTimeout as string const release = analytic[provider].release as string - const credentialData = await getCredentialData(credentialId ?? '', options) const langFuseSecretKey = getCredentialParam('langFuseSecretKey', credentialData, nodeData) const langFusePublicKey = getCredentialParam('langFusePublicKey', credentialData, nodeData) const langFuseEndpoint = getCredentialParam('langFuseEndpoint', credentialData, nodeData) @@ -237,6 +236,17 @@ export const additionalCallbacks = async (nodeData: INodeData, options: ICommonO const handler = new CallbackHandler(langFuseOptions) callbacks.push(handler) + } else if (provider === 'llmonitor') { + const llmonitorAppId = getCredentialParam('llmonitorAppId', credentialData, nodeData) + const llmonitorEndpoint = getCredentialParam('llmonitorEndpoint', credentialData, nodeData) + + const llmonitorFields: ICommonObject = { + appId: llmonitorAppId, + apiUrl: llmonitorEndpoint ?? 'https://app.llmonitor.com' + } + + const handler = new LLMonitorHandler(llmonitorFields) + callbacks.push(handler) } } } diff --git a/packages/ui/src/assets/images/llmonitor.png b/packages/ui/src/assets/images/llmonitor.png new file mode 100644 index 0000000000000000000000000000000000000000..d50a704431d724fa02aae7e24a58f68600e802d8 GIT binary patch literal 1726 zcmV;v20{6WP)$hw(%WbFxUp$fMGFUHU%~`3A7A69(!ggFdoMC__nGxJn%iu z`RAPfd~^PDzW+bN`T9qn0v8F;=S`p#mxOBJl29#NI6|DK9|?h-a!H3ws1Wd*5Dq|5 zNjw`(XI$~5H<6;A86gk=MzyM!jjcnPW*!G-?UTZ@4+GIpU3(jmM8p0Y62>vT`r890 zy+l}Ne|seHrxm9?ivIrzi4e|@uUSU4%KBZ?xWB#ohvlstSyveA3YkvQbZdM_BN8x; z;UjD@5ZR2Pfn+*`XJHT&A>4MU@QO+{s#QvO2;K9wZkdIJ3XTXfj2D1>lPy|E!#2l=FAdKkkv-@UY{zr3b~x$ygJg^EP)to zVrlH%&z2ttWA(5B0Dz)^)o|PyJG`b-ai9}ciY9)ufcG#Etul&T7$;4w$|in^an>91 zBvN&RUX)2w+tt?Qh6!oKP31)H<8eB0Vxg%JBGi(`1XF`CXWn>-l$MxWvJE}fXirHu&;zvuAXbNEUQ`9JKQF}>O( z7Xtubkcmdxl#6@pfn#5xX;%=-=9rcoNq({upqpwT|F>Tmy90+{9TUTI1 zy*FoDDhR=>H?$at{^X1O`R3Pp+Diy+L=tZno;&4YRzeNeL%m9=5INg7)9$^cVp*E= zg%r9R&BztwNbf6Y5DS?4_aE1?4rI63xXdNtki zpPOE$PYI7}R!DJz*o>l85BhLtlkTH^<8_B>$`UEm`>dx6XiKg7&H?GO^FA4 zG;!a#OE+KZ(thWv899x9{5bQ${A#7TmOW%~40jaj^Uh{Tk3!0PixcE8W}kQ~XMRT% zeSgkIXS2Z;`45JBk-}b-3wSrjt&-xLLxa5@IuSjJdR}+7{#r@Xv^&Uro6Zu`t{_g3 z?NSk+kp!Y??4woJhmRZ>L)oXST_qb4f#KM3W-E4BK5s>(p7Vy@>Nn+uq)#P#!>s>! zt4MaUBzb4UbJy-Q$wg|RfI2x-X-}NxMkW&=<^Gid9_zdng^{4BKiiyi^KEOFMI|fm zMpBgXAo;)_Uhs$AY-|7k2qsw$zq>-jt10!oFTAjOmIt^n^wV+cK#ROee^v~r!Eag&KN_|0IOm^@6U2Xa zBfnc%PZ!r)G-_WI6$0LSlh0{H=k==(J^K5)Yr!8OD0X5n2tKb@-LM#$dpVRk{`tR` zLn(}`Fsfccrw0|eH9pjNT7c3(F??|^>Nve9CNP|$C@CM&NrYFF(qXMq$}8H)?s)Q- zvn#RVOwGCKy-Fi6^!+dNyke?YdRD=VJNV(F&Fa^&h6&}-ua-|)JI%#9Sp{3M!`n8e zEflYRipB`#VNuH_jcp@Zr5IsX+a#V{3`A$#!L@J$RPuP5A6Dz(#CkXZ0)SpBG|I$k z5uXR2h;=4MMADcmp7f(f&+dm64eIo`Jw<_09T)B&<0YY5xFl2y7mm>X0ssL2|JvM= Uk^cbmzW@LL07*qoM6N<$f_vUR-2eap literal 0 HcmV?d00001 diff --git a/packages/ui/src/ui-component/dialog/AnalyseFlowDialog.js b/packages/ui/src/ui-component/dialog/AnalyseFlowDialog.js index 1ed68fb58..2d9a7d91f 100644 --- a/packages/ui/src/ui-component/dialog/AnalyseFlowDialog.js +++ b/packages/ui/src/ui-component/dialog/AnalyseFlowDialog.js @@ -31,6 +31,7 @@ import { Input } from 'ui-component/input/Input' import { StyledButton } from 'ui-component/button/StyledButton' import langsmithPNG from 'assets/images/langchain.png' import langfusePNG from 'assets/images/langfuse.png' +import llmonitorPNG from 'assets/images/llmonitor.png' // store import { HIDE_CANVAS_DIALOG, SHOW_CANVAS_DIALOG } from 'store/actions' @@ -115,6 +116,26 @@ const analyticProviders = [ optional: true } ] + }, + { + label: 'LLMonitor', + name: 'llmonitor', + icon: llmonitorPNG, + url: 'https://llmonitor.com', + inputs: [ + { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['llmonitorApi'] + }, + { + label: 'On/Off', + name: 'status', + type: 'boolean', + optional: true + } + ] } ] From e312c6ee2256124f1669fd1a68cd443ecfd77bf4 Mon Sep 17 00:00:00 2001 From: vinodkiran Date: Thu, 21 Sep 2023 08:35:19 +0530 Subject: [PATCH 02/11] Fix: Incorrect documentation link for LLMonitor. --- packages/components/credentials/LLMonitorApi.credential.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/components/credentials/LLMonitorApi.credential.ts b/packages/components/credentials/LLMonitorApi.credential.ts index 97b195ec5..e5ecc8aba 100644 --- a/packages/components/credentials/LLMonitorApi.credential.ts +++ b/packages/components/credentials/LLMonitorApi.credential.ts @@ -11,8 +11,7 @@ class LLMonitorApi implements INodeCredential { this.label = 'LLMonitor API' this.name = 'llmonitorApi' this.version = 1.0 - this.description = - 'Refer to official guide on how to get API key on Langsmith' + this.description = 'Refer to official guide to get APP ID' this.inputs = [ { label: 'APP ID', From 50903453f000eb79f1541e5696f6ec6bca7a877a Mon Sep 17 00:00:00 2001 From: BitVoyagerMan Date: Thu, 21 Sep 2023 02:40:55 -0400 Subject: [PATCH 03/11] add bittensor chatmodel --- .../nodes/chatmodels/Bittensor/Bittensor.ts | 48 +++++++++++++++ .../nodes/chatmodels/Bittensor/logo.png | Bin 0 -> 24561 bytes .../nodes/llms/Bittensor/Bittensor.ts | 58 ++++++++++++++++++ .../components/nodes/llms/Bittensor/logo.png | Bin 0 -> 24561 bytes 4 files changed, 106 insertions(+) create mode 100644 packages/components/nodes/chatmodels/Bittensor/Bittensor.ts create mode 100644 packages/components/nodes/chatmodels/Bittensor/logo.png create mode 100644 packages/components/nodes/llms/Bittensor/Bittensor.ts create mode 100644 packages/components/nodes/llms/Bittensor/logo.png diff --git a/packages/components/nodes/chatmodels/Bittensor/Bittensor.ts b/packages/components/nodes/chatmodels/Bittensor/Bittensor.ts new file mode 100644 index 000000000..8ca05634f --- /dev/null +++ b/packages/components/nodes/chatmodels/Bittensor/Bittensor.ts @@ -0,0 +1,48 @@ +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses } from '../../../src/utils' +import {NIBittensorChatModel, BittensorInput} from 'langchain/experimental/chat_models/bittensor'; + +class Bittensor_ChatModels implements INode { + label: string + name: string + version: number + type: string + icon: string + category: string + description: string + baseClasses: string[] + inputs: INodeParams[] + + constructor() { + this.label = 'NIBittensorChat' + this.name = 'NIBittensorChatModel' + this.version = 1.0 + this.type = 'BittensorChat' + this.icon = 'logo.png' + this.category = 'Chat Models' + this.description = 'Wrapper around Bittensor subnet 1 large language models' + this.baseClasses = [this.type, ...getBaseClasses(NIBittensorChatModel)] + this.inputs = [ + { + label: 'System prompt', + name: 'system_prompt', + type: 'string', + additionalParams: true, + optional: true + }, + ] + + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const system_prompt = nodeData.inputs?.system_prompt as string + const obj: Partial = { + systemPrompt: system_prompt, + } + + const model = new NIBittensorChatModel(obj) + return model + } +} + +module.exports = { nodeClass: Bittensor_ChatModels } diff --git a/packages/components/nodes/chatmodels/Bittensor/logo.png b/packages/components/nodes/chatmodels/Bittensor/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad51774d5198772b36f6bd19aa8f8404f5906698 GIT binary patch literal 24561 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 F{{W%y8Djtd literal 0 HcmV?d00001 diff --git a/packages/components/nodes/llms/Bittensor/Bittensor.ts b/packages/components/nodes/llms/Bittensor/Bittensor.ts new file mode 100644 index 000000000..86b400a4c --- /dev/null +++ b/packages/components/nodes/llms/Bittensor/Bittensor.ts @@ -0,0 +1,58 @@ +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses } from '../../../src/utils' +import {NIBittensorLLM, BittensorInput} from 'langchain/experimental/llms/bittensor'; + +class Bittensor_LLMs implements INode { + label: string + name: string + version: number + type: string + icon: string + category: string + description: string + baseClasses: string[] + inputs: INodeParams[] + + constructor() { + this.label = 'NIBittensorLLM' + this.name = 'NIBittensorLLM' + this.version = 1.0 + this.type = 'Bittensor' + this.icon = 'logo.png' + this.category = 'LLMs' + this.description = 'Wrapper around Bittensor subnet 1 large language models' + this.baseClasses = [this.type, ...getBaseClasses(NIBittensorLLM)] + this.inputs = [ + { + label: 'System prompt', + name: 'system_prompt', + type: 'string', + additionalParams: true, + optional: true + }, + { + label: 'Top Responses', + name: 'topResponses', + type: 'number', + step: 1, + optional: true, + additionalParams: true + } + ] + + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const system_prompt = nodeData.inputs?.system_prompt as string + const topResponses = Number(nodeData.inputs?.topResponses as number); + const obj: Partial = { + systemPrompt: system_prompt, + topResponses: topResponses, + } + + const model = new NIBittensorLLM(obj) + return model + } +} + +module.exports = { nodeClass: Bittensor_LLMs } diff --git a/packages/components/nodes/llms/Bittensor/logo.png b/packages/components/nodes/llms/Bittensor/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad51774d5198772b36f6bd19aa8f8404f5906698 GIT binary patch literal 24561 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 F{{W%y8Djtd literal 0 HcmV?d00001 From 37d8b3f310e40a12f79eb289e48640a2d43e6add Mon Sep 17 00:00:00 2001 From: BitVoyagerMan Date: Thu, 21 Sep 2023 07:12:28 -0400 Subject: [PATCH 04/11] fix lint --- .../nodes/chatmodels/Bittensor/Bittensor.ts | 12 +++++------- .../components/nodes/llms/Bittensor/Bittensor.ts | 11 +++++------ 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/packages/components/nodes/chatmodels/Bittensor/Bittensor.ts b/packages/components/nodes/chatmodels/Bittensor/Bittensor.ts index 8ca05634f..cfcac863b 100644 --- a/packages/components/nodes/chatmodels/Bittensor/Bittensor.ts +++ b/packages/components/nodes/chatmodels/Bittensor/Bittensor.ts @@ -1,6 +1,6 @@ -import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' -import {NIBittensorChatModel, BittensorInput} from 'langchain/experimental/chat_models/bittensor'; +import { NIBittensorChatModel, BittensorInput } from 'langchain/experimental/chat_models/bittensor' class Bittensor_ChatModels implements INode { label: string @@ -29,17 +29,15 @@ class Bittensor_ChatModels implements INode { type: 'string', additionalParams: true, optional: true - }, + } ] - } - async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + async init(nodeData: INodeData, _: string): Promise { const system_prompt = nodeData.inputs?.system_prompt as string const obj: Partial = { - systemPrompt: system_prompt, + systemPrompt: system_prompt } - const model = new NIBittensorChatModel(obj) return model } diff --git a/packages/components/nodes/llms/Bittensor/Bittensor.ts b/packages/components/nodes/llms/Bittensor/Bittensor.ts index 86b400a4c..a87a7e480 100644 --- a/packages/components/nodes/llms/Bittensor/Bittensor.ts +++ b/packages/components/nodes/llms/Bittensor/Bittensor.ts @@ -1,6 +1,6 @@ -import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { INode, INodeData, INodeParams } from '../../../src/Interface' import { getBaseClasses } from '../../../src/utils' -import {NIBittensorLLM, BittensorInput} from 'langchain/experimental/llms/bittensor'; +import { NIBittensorLLM, BittensorInput } from 'langchain/experimental/llms/bittensor' class Bittensor_LLMs implements INode { label: string @@ -39,15 +39,14 @@ class Bittensor_LLMs implements INode { additionalParams: true } ] - } - async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + async init(nodeData: INodeData, _: string): Promise { const system_prompt = nodeData.inputs?.system_prompt as string - const topResponses = Number(nodeData.inputs?.topResponses as number); + const topResponses = Number(nodeData.inputs?.topResponses as number) const obj: Partial = { systemPrompt: system_prompt, - topResponses: topResponses, + topResponses: topResponses } const model = new NIBittensorLLM(obj) From 9b86a96e1dc581b42dd9d14892c05354ec9cad69 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 21 Sep 2023 15:56:05 +0100 Subject: [PATCH 05/11] =?UTF-8?q?=F0=9F=A5=B3=20flowise@1.3.6=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- packages/server/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index d0ac9b0d2..210a95c49 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.3.5", + "version": "1.3.6", "private": true, "homepage": "https://flowiseai.com", "workspaces": [ diff --git a/packages/server/package.json b/packages/server/package.json index 46c8d666f..6f17ad611 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "flowise", - "version": "1.3.5", + "version": "1.3.6", "description": "Flowiseai Server", "main": "dist/index", "types": "dist/index.d.ts", From c48efeba3042484d88bf77d0c4283a69eff38bd2 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 21 Sep 2023 15:56:43 +0100 Subject: [PATCH 06/11] =?UTF-8?q?=F0=9F=A5=B3=20flowise-components@1.3.7?= =?UTF-8?q?=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/components/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/package.json b/packages/components/package.json index 69428b78c..936091062 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "flowise-components", - "version": "1.3.6", + "version": "1.3.7", "description": "Flowiseai Components", "main": "dist/src/index", "types": "dist/src/index.d.ts", From ef5bc230b98de05e00d9d13005f786d5c697f676 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 21 Sep 2023 15:57:01 +0100 Subject: [PATCH 07/11] =?UTF-8?q?=F0=9F=A5=B3=20flowise-ui@1.3.4=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index 71a8dccad..f0101d2ce 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "flowise-ui", - "version": "1.3.3", + "version": "1.3.4", "license": "SEE LICENSE IN LICENSE.md", "homepage": "https://flowiseai.com", "author": { From ce9b9ad8ca2b2db423601a50ad977b11f015ab41 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 21 Sep 2023 21:54:03 +0100 Subject: [PATCH 08/11] add env variable to start.ts --- packages/server/src/commands/start.ts | 2 ++ packages/server/src/utils/rateLimit.ts | 14 +++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/server/src/commands/start.ts b/packages/server/src/commands/start.ts index b9ea970d5..6bf7d6993 100644 --- a/packages/server/src/commands/start.ts +++ b/packages/server/src/commands/start.ts @@ -27,6 +27,7 @@ export default class Start extends Command { LOG_LEVEL: Flags.string(), TOOL_FUNCTION_BUILTIN_DEP: Flags.string(), TOOL_FUNCTION_EXTERNAL_DEP: Flags.string(), + NUMBER_OF_PROXIES: Flags.string(), DATABASE_TYPE: Flags.string(), DATABASE_PATH: Flags.string(), DATABASE_PORT: Flags.string(), @@ -72,6 +73,7 @@ export default class Start extends Command { if (flags.PORT) process.env.PORT = flags.PORT if (flags.DEBUG) process.env.DEBUG = flags.DEBUG + if (flags.NUMBER_OF_PROXIES) process.env.NUMBER_OF_PROXIES = flags.NUMBER_OF_PROXIES // Authorization if (flags.FLOWISE_USERNAME) process.env.FLOWISE_USERNAME = flags.FLOWISE_USERNAME diff --git a/packages/server/src/utils/rateLimit.ts b/packages/server/src/utils/rateLimit.ts index b1cd1819d..68b5b693b 100644 --- a/packages/server/src/utils/rateLimit.ts +++ b/packages/server/src/utils/rateLimit.ts @@ -12,7 +12,7 @@ async function addRateLimiter(id: string, duration: number, limit: number, messa rateLimiters[id] = rateLimit({ windowMs: duration * 1000, max: limit, - handler: (req, res) => { + handler: (_, res) => { res.status(429).send(message) } }) @@ -33,15 +33,19 @@ export function getRateLimiter(req: Request, res: Response, next: NextFunction) export async function createRateLimiter(chatFlow: IChatFlow) { if (!chatFlow.apiConfig) return - const apiConfig: any = JSON.parse(chatFlow.apiConfig) + const apiConfig = JSON.parse(chatFlow.apiConfig) + const rateLimit: { limitDuration: number; limitMax: number; limitMsg: string } = apiConfig.rateLimit if (!rateLimit) return + const { limitDuration, limitMax, limitMsg } = rateLimit if (limitMax && limitDuration && limitMsg) await addRateLimiter(chatFlow.id, limitDuration, limitMax, limitMsg) } export async function initializeRateLimiter(chatFlowPool: IChatFlow[]) { - await chatFlowPool.map(async (chatFlow) => { - await createRateLimiter(chatFlow) - }) + await Promise.all( + chatFlowPool.map(async (chatFlow) => { + await createRateLimiter(chatFlow) + }) + ) } From 88f0fe9598c0a15fe34d09dfd8f7bf2bcb7b4253 Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 21 Sep 2023 22:08:45 +0100 Subject: [PATCH 09/11] chroma authorization --- packages/components/nodes/vectorstores/Chroma/core.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/nodes/vectorstores/Chroma/core.ts b/packages/components/nodes/vectorstores/Chroma/core.ts index 8277c58ef..b1bf9cc79 100644 --- a/packages/components/nodes/vectorstores/Chroma/core.ts +++ b/packages/components/nodes/vectorstores/Chroma/core.ts @@ -30,7 +30,7 @@ export class ChromaExtended extends Chroma { if (this.chromaApiKey) { obj.fetchOptions = { headers: { - 'X-Api-Key': this.chromaApiKey + Authorization: `Bearer ${this.chromaApiKey}` } } } From ea4d3d0278a1c1137bf538c88218b348d6a36521 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 25 Sep 2023 11:32:31 +0100 Subject: [PATCH 10/11] update fields --- .../SqlDatabaseChain/SqlDatabaseChain.ts | 8 ++-- .../marketplaces/chatflows/SQL DB Chain.json | 42 ++++++++++++++++++- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts index 5d270fd8e..ba9cd7f81 100644 --- a/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts +++ b/packages/components/nodes/chains/SqlDatabaseChain/SqlDatabaseChain.ts @@ -43,7 +43,7 @@ class SqlDatabaseChain_Chains implements INode { constructor() { this.label = 'Sql Database Chain' this.name = 'sqlDatabaseChain' - this.version = 3.0 + this.version = 4.0 this.type = 'SqlDatabaseChain' this.icon = 'sqlchain.svg' this.category = 'Chains' @@ -89,7 +89,8 @@ class SqlDatabaseChain_Chains implements INode { label: 'Include Tables', name: 'includesTables', type: 'string', - description: 'Tables to include for queries.', + description: 'Tables to include for queries, seperated by comma. Can only use Include Tables or Ignore Tables', + placeholder: 'table1, table2', additionalParams: true, optional: true }, @@ -97,7 +98,8 @@ class SqlDatabaseChain_Chains implements INode { label: 'Ignore Tables', name: 'ignoreTables', type: 'string', - description: 'Tables to ignore for queries.', + description: 'Tables to ignore for queries, seperated by comma. Can only use Ignore Tables or Include Tables', + placeholder: 'table1, table2', additionalParams: true, optional: true }, diff --git a/packages/server/marketplaces/chatflows/SQL DB Chain.json b/packages/server/marketplaces/chatflows/SQL DB Chain.json index acec5432e..646db5d42 100644 --- a/packages/server/marketplaces/chatflows/SQL DB Chain.json +++ b/packages/server/marketplaces/chatflows/SQL DB Chain.json @@ -167,7 +167,7 @@ "data": { "id": "sqlDatabaseChain_0", "label": "Sql Database Chain", - "version": 2, + "version": 4, "name": "sqlDatabaseChain", "type": "SqlDatabaseChain", "baseClasses": ["SqlDatabaseChain", "BaseChain", "Runnable"], @@ -206,6 +206,46 @@ "placeholder": "1270.0.0.1:5432/chinook", "id": "sqlDatabaseChain_0-input-url-string" }, + { + "label": "Include Tables", + "name": "includesTables", + "type": "string", + "description": "Tables to include for queries, seperated by comma. Can only use Include Tables or Ignore Tables", + "placeholder": "table1, table2", + "additionalParams": true, + "optional": true, + "id": "sqlDatabaseChain_0-input-includesTables-string" + }, + { + "label": "Ignore Tables", + "name": "ignoreTables", + "type": "string", + "description": "Tables to ignore for queries, seperated by comma. Can only use Ignore Tables or Include Tables", + "placeholder": "table1, table2", + "additionalParams": true, + "optional": true, + "id": "sqlDatabaseChain_0-input-ignoreTables-string" + }, + { + "label": "Sample table's rows info", + "name": "sampleRowsInTableInfo", + "type": "number", + "description": "Number of sample row for tables to load for info.", + "placeholder": "3", + "additionalParams": true, + "optional": true, + "id": "sqlDatabaseChain_0-input-sampleRowsInTableInfo-number" + }, + { + "label": "Top Keys", + "name": "topK", + "type": "number", + "description": "If you are querying for several rows of a table you can select the maximum number of results you want to get by using the top_k parameter (default is 10). This is useful for avoiding query results that exceed the prompt max length or consume tokens unnecessarily.", + "placeholder": "10", + "additionalParams": true, + "optional": true, + "id": "sqlDatabaseChain_0-input-topK-number" + }, { "label": "Custom Prompt", "name": "customPrompt", From 5574e82a029307a9926ebdc584d90dd500f1dc7b Mon Sep 17 00:00:00 2001 From: Henry Date: Thu, 28 Sep 2023 11:04:01 +0100 Subject: [PATCH 11/11] update rate limit guide link --- packages/ui/src/views/chatflows/Configuration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/views/chatflows/Configuration.js b/packages/ui/src/views/chatflows/Configuration.js index 51b8d61c8..d569020b4 100644 --- a/packages/ui/src/views/chatflows/Configuration.js +++ b/packages/ui/src/views/chatflows/Configuration.js @@ -136,7 +136,7 @@ const Configuration = () => { Rate Limit Setup Guide to set up Rate Limit correctly in your hosting environment.' + 'Visit Rate Limit Setup Guide to set up Rate Limit correctly in your hosting environment.' } />