From bf1ddc3be5a65e5efeae4c50cc912fbc0999f43b Mon Sep 17 00:00:00 2001 From: Luis Felipe Salazar Ucros <40307832+luisfucros@users.noreply.github.com> Date: Mon, 18 Aug 2025 09:09:39 -0500 Subject: [PATCH] Feature: Add SambaNova (#4961) * add sambanova * add sambanova credential * fix samba nova chat node --------- Co-authored-by: Henry --- .../credentials/SambanovaApi.credential.ts | 23 ++++ .../chatmodels/ChatSambanova/ChatSambanova.ts | 123 ++++++++++++++++++ .../chatmodels/ChatSambanova/sambanova.png | Bin 0 -> 12580 bytes .../nodes/llms/SambaNova/Sambanova.ts | 71 ++++++++++ .../nodes/llms/SambaNova/sambanova.png | Bin 0 -> 12580 bytes packages/server/src/utils/index.ts | 1 + 6 files changed, 218 insertions(+) create mode 100644 packages/components/credentials/SambanovaApi.credential.ts create mode 100644 packages/components/nodes/chatmodels/ChatSambanova/ChatSambanova.ts create mode 100644 packages/components/nodes/chatmodels/ChatSambanova/sambanova.png create mode 100644 packages/components/nodes/llms/SambaNova/Sambanova.ts create mode 100644 packages/components/nodes/llms/SambaNova/sambanova.png diff --git a/packages/components/credentials/SambanovaApi.credential.ts b/packages/components/credentials/SambanovaApi.credential.ts new file mode 100644 index 00000000..60a7e13d --- /dev/null +++ b/packages/components/credentials/SambanovaApi.credential.ts @@ -0,0 +1,23 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class SambanovaApi implements INodeCredential { + label: string + name: string + version: number + inputs: INodeParams[] + + constructor() { + this.label = 'Sambanova API' + this.name = 'sambanovaApi' + this.version = 1.0 + this.inputs = [ + { + label: 'Sambanova Api Key', + name: 'sambanovaApiKey', + type: 'password' + } + ] + } +} + +module.exports = { credClass: SambanovaApi } diff --git a/packages/components/nodes/chatmodels/ChatSambanova/ChatSambanova.ts b/packages/components/nodes/chatmodels/ChatSambanova/ChatSambanova.ts new file mode 100644 index 00000000..a62ebfb3 --- /dev/null +++ b/packages/components/nodes/chatmodels/ChatSambanova/ChatSambanova.ts @@ -0,0 +1,123 @@ +import { BaseCache } from '@langchain/core/caches' +import { ChatOpenAI, ChatOpenAIFields } from '@langchain/openai' +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' + +class ChatSambanova_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 = 'ChatSambanova' + this.name = 'chatSambanova' + this.version = 1.0 + this.type = 'ChatSambanova' + this.icon = 'sambanova.png' + this.category = 'Chat Models' + this.description = 'Wrapper around Sambanova Chat Endpoints' + this.baseClasses = [this.type, ...getBaseClasses(ChatOpenAI)] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + credentialNames: ['sambanovaApi'] + } + this.inputs = [ + { + label: 'Cache', + name: 'cache', + type: 'BaseCache', + optional: true + }, + { + label: 'Model', + name: 'modelName', + type: 'string', + default: 'Meta-Llama-3.3-70B-Instruct', + placeholder: 'Meta-Llama-3.3-70B-Instruct' + }, + { + label: 'Temperature', + name: 'temperature', + type: 'number', + step: 0.1, + default: 0.9, + optional: true + }, + { + label: 'Streaming', + name: 'streaming', + type: 'boolean', + default: true, + optional: true + }, + { + label: 'BasePath', + name: 'basepath', + type: 'string', + optional: true, + default: 'htps://api.sambanova.ai/v1', + additionalParams: true + }, + { + label: 'BaseOptions', + name: 'baseOptions', + type: 'json', + optional: true, + additionalParams: true + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const cache = nodeData.inputs?.cache as BaseCache + const temperature = nodeData.inputs?.temperature as string + const modelName = nodeData.inputs?.modelName as string + const streaming = nodeData.inputs?.streaming as boolean + const basePath = nodeData.inputs?.basepath as string + const baseOptions = nodeData.inputs?.baseOptions + + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const sambanovaApiKey = getCredentialParam('sambanovaApiKey', credentialData, nodeData) + + const obj: ChatOpenAIFields = { + temperature: temperature ? parseFloat(temperature) : undefined, + model: modelName, + apiKey: sambanovaApiKey, + openAIApiKey: sambanovaApiKey, + streaming: streaming ?? true + } + + if (cache) obj.cache = cache + + let parsedBaseOptions: any | undefined = undefined + + if (baseOptions) { + try { + parsedBaseOptions = typeof baseOptions === 'object' ? baseOptions : JSON.parse(baseOptions) + } catch (exception) { + throw new Error("Invalid JSON in the ChatSambanova's BaseOptions: " + exception) + } + } + + if (basePath || parsedBaseOptions) { + obj.configuration = { + baseURL: basePath, + defaultHeaders: parsedBaseOptions + } + } + + const model = new ChatOpenAI(obj) + return model + } +} + +module.exports = { nodeClass: ChatSambanova_ChatModels } diff --git a/packages/components/nodes/chatmodels/ChatSambanova/sambanova.png b/packages/components/nodes/chatmodels/ChatSambanova/sambanova.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc16c5d5e346635a515c337c982602d27b269ff GIT binary patch literal 12580 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

rCS(Rww~YcE-7S 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 { + const cache = nodeData.inputs?.cache as BaseCache + const modelName = nodeData.inputs?.modelName as string + + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const sambanovaKey = getCredentialParam('sambanovaApiKey', credentialData, nodeData) + + const obj: any = { + model: modelName, + configuration: { + baseURL: 'https://api.sambanova.ai/v1', + apiKey: sambanovaKey + } + } + if (cache) obj.cache = cache + + const sambanova = new OpenAI(obj) + return sambanova + } +} + +module.exports = { nodeClass: Sambanova_LLMs } diff --git a/packages/components/nodes/llms/SambaNova/sambanova.png b/packages/components/nodes/llms/SambaNova/sambanova.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc16c5d5e346635a515c337c982602d27b269ff GIT binary patch literal 12580 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

rCS(Rww~YcE-7S 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