From 4efec94dc8d404755379a8068628341870c5da04 Mon Sep 17 00:00:00 2001 From: vinodkiran Date: Sat, 30 Sep 2023 12:07:48 +0530 Subject: [PATCH] LLM Cache - Addition of Momento Cache --- .../credentials/MomentoCacheApi.credential.ts | 36 +++++++++ .../LLMMomentoCache/LLMMomentoCache.ts | 75 ++++++++++++++++++ .../llmcache/LLMMomentoCache/momento.png | Bin 0 -> 5534 bytes packages/components/package.json | 1 + 4 files changed, 112 insertions(+) create mode 100644 packages/components/credentials/MomentoCacheApi.credential.ts create mode 100644 packages/components/nodes/llmcache/LLMMomentoCache/LLMMomentoCache.ts create mode 100644 packages/components/nodes/llmcache/LLMMomentoCache/momento.png diff --git a/packages/components/credentials/MomentoCacheApi.credential.ts b/packages/components/credentials/MomentoCacheApi.credential.ts new file mode 100644 index 000000000..038f826d9 --- /dev/null +++ b/packages/components/credentials/MomentoCacheApi.credential.ts @@ -0,0 +1,36 @@ +import { INodeParams, INodeCredential } from '../src/Interface' + +class MomentoCacheApi implements INodeCredential { + label: string + name: string + version: number + description: string + inputs: INodeParams[] + + constructor() { + this.label = 'Momento Cache API' + this.name = 'momentoCacheApi' + this.version = 1.0 + this.description = + 'Refer to official guide on how to get API key on Momento' + this.inputs = [ + { + label: 'Cache', + name: 'momentoCache', + type: 'string' + }, + { + label: 'API Key', + name: 'momentoApiKey', + type: 'password' + }, + { + label: 'Endpoint', + name: 'momentoEndpoint', + type: 'string' + } + ] + } +} + +module.exports = { credClass: MomentoCacheApi } diff --git a/packages/components/nodes/llmcache/LLMMomentoCache/LLMMomentoCache.ts b/packages/components/nodes/llmcache/LLMMomentoCache/LLMMomentoCache.ts new file mode 100644 index 000000000..82267c24a --- /dev/null +++ b/packages/components/nodes/llmcache/LLMMomentoCache/LLMMomentoCache.ts @@ -0,0 +1,75 @@ +import { + getBaseClasses, + getCredentialData, + getCredentialParam, + ICommonObject, + INode, + INodeData, + INodeOutputsValue, + INodeParams +} from '../../../src' +import { MomentoCache } from 'langchain/cache/momento' +import { CacheClient, Configurations, CredentialProvider } from '@gomomento/sdk' + +class LLMMomentoCache implements INode { + label: string + name: string + version: number + description: string + type: string + icon: string + category: string + baseClasses: string[] + inputs: INodeParams[] + outputs: INodeOutputsValue[] + credential: INodeParams + + constructor() { + this.label = 'Momento Cache' + this.name = 'momentoCache' + this.version = 1.0 + this.type = 'LLMCache' + this.icon = 'momento.png' + this.category = 'LLM Cache' + this.baseClasses = [this.type, 'LLMCacheBase'] + this.credential = { + label: 'Connect Credential', + name: 'credential', + type: 'credential', + optional: true, + credentialNames: ['momentoCacheApi'] + } + this.inputs = [] + this.outputs = [ + { + label: 'LLM Cache', + name: 'cache', + baseClasses: [this.type, ...getBaseClasses(MomentoCache)] + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + const apiKey = getCredentialParam('momentoApiKey', credentialData, nodeData) + const cacheName = getCredentialParam('momentoCache', credentialData, nodeData) + const endPoint = getCredentialParam('momentoEndpoint', credentialData, nodeData) + + // See https://github.com/momentohq/client-sdk-javascript for connection options + const client = new CacheClient({ + configuration: Configurations.Laptop.v1(), + credentialProvider: CredentialProvider.fromString({ + apiKey: apiKey + }), + defaultTtlSeconds: 60 * 60 * 24 + }) + + let momentoCache = await MomentoCache.fromProps({ + client, + cacheName: cacheName + }) + return momentoCache + } +} + +module.exports = { nodeClass: LLMMomentoCache } diff --git a/packages/components/nodes/llmcache/LLMMomentoCache/momento.png b/packages/components/nodes/llmcache/LLMMomentoCache/momento.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2b54b6a0c0e6100d2546d053e0b4548c42e4c6 GIT binary patch literal 5534 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 literal 0 HcmV?d00001 diff --git a/packages/components/package.json b/packages/components/package.json index f8498e314..18bf8e6ad 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -19,6 +19,7 @@ "@aws-sdk/client-dynamodb": "^3.360.0", "@dqbd/tiktoken": "^1.0.7", "@getzep/zep-js": "^0.6.3", + "@gomomento/sdk": "^1.40.2", "@google-ai/generativelanguage": "^0.2.1", "@huggingface/inference": "^2.6.1", "@notionhq/client": "^2.2.8",