From 5fb4e6c8b749f2575630a3beb069439915312d06 Mon Sep 17 00:00:00 2001 From: "patrickreinan (aider)" Date: Thu, 31 Oct 2024 21:11:32 -0300 Subject: [PATCH 1/3] feat: add ChatLitellm component and LitellmApi credential --- .../credentials/LitellmApi.credential.ts | 23 +++ .../chatmodels/ChatLitellm/ChatLitellm.ts | 134 ++++++++++++++++++ .../nodes/chatmodels/ChatLitellm/litellm.jpg | Bin 0 -> 12575 bytes .../LLMFilterCompressionRetriever.ts | 19 ++- 4 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 packages/components/credentials/LitellmApi.credential.ts create mode 100644 packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts create mode 100644 packages/components/nodes/chatmodels/ChatLitellm/litellm.jpg diff --git a/packages/components/credentials/LitellmApi.credential.ts b/packages/components/credentials/LitellmApi.credential.ts new file mode 100644 index 00000000000..6bf866f5cee --- /dev/null +++ b/packages/components/credentials/LitellmApi.credential.ts @@ -0,0 +1,23 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class LitellmApi implements INodeCredential { + label: string + name: string + version: number + inputs: INodeParams[] + + constructor() { + this.label = 'Litellm API' + this.name = 'litellmApi' + this.version = 1.0 + this.inputs = [ + { + label: 'API Key', + name: 'litellmApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: LitellmApi } diff --git a/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts b/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts new file mode 100644 index 00000000000..2e35abb62a1 --- /dev/null +++ b/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts @@ -0,0 +1,134 @@ +import { OpenAIChatInput, ChatOpenAI } from '@langchain/openai' +import { BaseCache } from '@langchain/core/caches' +import { BaseLLMParams } from '@langchain/core/language_models/llms' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' + +class ChatLitellm_ChatModels implements INode { + label: string + name: string + version: number + type: string + icon: string + category: string + description: string + baseClasses: string[] + credential: INodeParams + inputs: INodeParams[] + + constructor() { + this.label = 'ChatLitellm' + this.name = 'chatLitellm' + this.version = 1.0 + this.type = 'ChatLitellm' + this.icon = 'litellm.jpg' + this.category = 'Chat Models' + this.description = 'Connect to a Litellm server using OpenAI-compatible API' + this.baseClasses = [this.type, 'BaseChatModel', ...getBaseClasses(ChatOpenAI)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['litellmApi'], + optional: true + } + this.inputs = [ + { + label: 'Cache', + name: 'cache', + type: 'BaseCache', + optional: true + }, + { + label: 'Base URL', + name: 'basePath', + type: 'string', + placeholder: 'http://localhost:8000' + }, + { + label: 'Model Name', + name: 'modelName', + type: 'string', + placeholder: 'model_name' + }, + { + label: 'Temperature', + name: 'temperature', + type: 'number', + step: 0.1, + default: 0.9, + optional: true + }, + { + label: 'Streaming', + name: 'streaming', + type: 'boolean', + default: true, + optional: true, + additionalParams: true + }, + { + label: 'Max Tokens', + name: 'maxTokens', + type: 'number', + step: 1, + optional: true, + additionalParams: true + }, + { + label: 'Top P', + name: 'topP', + type: 'number', + step: 0.1, + optional: true, + additionalParams: true + }, + { + label: 'Timeout', + name: 'timeout', + type: 'number', + step: 1, + optional: true, + additionalParams: true + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const cache = nodeData.inputs?.cache as BaseCache + const basePath = nodeData.inputs?.basePath as string + const modelName = nodeData.inputs?.modelName as string + const temperature = nodeData.inputs?.temperature as string + const streaming = nodeData.inputs?.streaming as boolean + const maxTokens = nodeData.inputs?.maxTokens as string + const topP = nodeData.inputs?.topP as string + const timeout = nodeData.inputs?.timeout as string + + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const apiKey = getCredentialParam('litellmApiKey', credentialData, nodeData) + + const obj: Partial & BaseLLMParams & { openAIApiKey?: string } & { configuration?: { baseURL?: string; defaultHeaders?: ICommonObject } } = { + temperature: parseFloat(temperature), + modelName, + streaming: streaming ?? true + } + + if (basePath ) { + obj.configuration = { + baseURL: basePath + } + } + + if (maxTokens) obj.maxTokens = parseInt(maxTokens, 10) + if (topP) obj.topP = parseFloat(topP) + if (timeout) obj.timeout = parseInt(timeout, 10) + if (cache) obj.cache = cache + if (apiKey) obj.openAIApiKey = apiKey + + const model = new ChatOpenAI(obj) + + return model + } +} + +module.exports = { nodeClass: ChatLitellm_ChatModels } diff --git a/packages/components/nodes/chatmodels/ChatLitellm/litellm.jpg b/packages/components/nodes/chatmodels/ChatLitellm/litellm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d6a77b2d105b212542a43116f4379641d0739c82 GIT binary patch literal 12575 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 { const baseRetriever = nodeData.inputs?.baseRetriever as BaseRetriever const model = nodeData.inputs?.model as BaseLanguageModel const query = nodeData.inputs?.query as string const output = nodeData.outputs?.output as string - if (!model) throw new Error('There must be a LLM model connected to LLM Filter Retriever') + if (!model) throw new Error('There must be a LLM model connected to LLM Filter Retriever') // Ensure a model is provided const retriever = new ContextualCompressionRetriever({ baseCompressor: LLMChainExtractor.fromLLM(model), baseRetriever: baseRetriever }) + // Return the appropriate output based on the specified output type if (output === 'retriever') return retriever else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) else if (output === 'text') { From f589f79bbdc9a824c1a452ef872f0fa244f9647f Mon Sep 17 00:00:00 2001 From: patrickreinan Date: Mon, 21 Apr 2025 21:12:44 -0300 Subject: [PATCH 2/3] fix: lint errors --- .../components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts b/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts index 2e35abb62a1..352f883c64b 100644 --- a/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts +++ b/packages/components/nodes/chatmodels/ChatLitellm/ChatLitellm.ts @@ -107,13 +107,14 @@ class ChatLitellm_ChatModels implements INode { const credentialData = await getCredentialData(nodeData.credential ?? '', options) const apiKey = getCredentialParam('litellmApiKey', credentialData, nodeData) - const obj: Partial & BaseLLMParams & { openAIApiKey?: string } & { configuration?: { baseURL?: string; defaultHeaders?: ICommonObject } } = { + const obj: Partial & + BaseLLMParams & { openAIApiKey?: string } & { configuration?: { baseURL?: string; defaultHeaders?: ICommonObject } } = { temperature: parseFloat(temperature), modelName, streaming: streaming ?? true } - if (basePath ) { + if (basePath) { obj.configuration = { baseURL: basePath } From bc45ff6c84434deaec4f1358cb17284891a6eb57 Mon Sep 17 00:00:00 2001 From: Henry Heng Date: Tue, 6 May 2025 10:38:29 +0800 Subject: [PATCH 3/3] Update LLMFilterCompressionRetriever.ts --- .../LLMFilterCompressionRetriever.ts | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts b/packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts index 370570d4a35..7fbdfab1ded 100644 --- a/packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts +++ b/packages/components/nodes/retrievers/LLMFilterRetriever/LLMFilterCompressionRetriever.ts @@ -1,6 +1,3 @@ -/** - * Import necessary modules and interfaces for the retriever functionality. - */ import { BaseRetriever } from '@langchain/core/retrievers' import { BaseLanguageModel } from '@langchain/core/language_models/base' import { ContextualCompressionRetriever } from 'langchain/retrievers/contextual_compression' @@ -8,10 +5,6 @@ import { LLMChainExtractor } from 'langchain/retrievers/document_compressors/cha import { handleEscapeCharacters } from '../../../src/utils' import { INode, INodeData, INodeOutputsValue, INodeParams } from '../../../src/Interface' -/** - * Class representing a retriever that filters and compresses documents - * using a language model and a vector store retriever. - */ class LLMFilterCompressionRetriever_Retrievers implements INode { label: string name: string @@ -25,9 +18,6 @@ class LLMFilterCompressionRetriever_Retrievers implements INode { outputs: INodeOutputsValue[] badge: string - /** - * Initializes a new instance of the LLMFilterCompressionRetriever_Retrievers class. - */ constructor() { this.label = 'LLM Filter Retriever' this.name = 'llmFilterRetriever' @@ -79,26 +69,19 @@ class LLMFilterCompressionRetriever_Retrievers implements INode { ] } - /** - * Initializes the retriever with the provided node data and input string. - * @param nodeData - The data for the node, including inputs and outputs. - * @param input - The input string for the retriever. - * @returns The retriever or processed documents based on the output type. - */ async init(nodeData: INodeData, input: string): Promise { const baseRetriever = nodeData.inputs?.baseRetriever as BaseRetriever const model = nodeData.inputs?.model as BaseLanguageModel const query = nodeData.inputs?.query as string const output = nodeData.outputs?.output as string - if (!model) throw new Error('There must be a LLM model connected to LLM Filter Retriever') // Ensure a model is provided + if (!model) throw new Error('There must be a LLM model connected to LLM Filter Retriever') const retriever = new ContextualCompressionRetriever({ baseCompressor: LLMChainExtractor.fromLLM(model), baseRetriever: baseRetriever }) - // Return the appropriate output based on the specified output type if (output === 'retriever') return retriever else if (output === 'document') return await retriever.getRelevantDocuments(query ? query : input) else if (output === 'text') {