From 536ed07f9defc0b5028f934e67b9c8fe9dc17fef Mon Sep 17 00:00:00 2001 From: Henry Date: Wed, 11 Oct 2023 14:08:04 +0100 Subject: [PATCH] add bedrock embeddings --- .../chatmodels/AWSBedrock/AWSChatBedrock.ts | 23 +-- .../AWSBedrockEmbedding.ts | 152 ++++++++++++++++++ .../AWSBedrockEmbedding/awsBedrock.png | Bin 0 -> 62897 bytes .../nodes/llms/AWSBedrock/AWSBedrock.ts | 22 +-- packages/components/package.json | 3 +- 5 files changed, 167 insertions(+), 33 deletions(-) create mode 100644 packages/components/nodes/embeddings/AWSBedrockEmbedding/AWSBedrockEmbedding.ts create mode 100644 packages/components/nodes/embeddings/AWSBedrockEmbedding/awsBedrock.png diff --git a/packages/components/nodes/chatmodels/AWSBedrock/AWSChatBedrock.ts b/packages/components/nodes/chatmodels/AWSBedrock/AWSChatBedrock.ts index 16fbc8dc13c..ade46ab94d2 100644 --- a/packages/components/nodes/chatmodels/AWSBedrock/AWSChatBedrock.ts +++ b/packages/components/nodes/chatmodels/AWSBedrock/AWSChatBedrock.ts @@ -31,7 +31,7 @@ class AWSChatBedrock_ChatModels implements INode { this.type = 'AWSChatBedrock' this.icon = 'awsBedrock.png' this.category = 'Chat Models' - this.description = 'Wrapper around AWS Bedrock large language models' + this.description = 'Wrapper around AWS Bedrock large language models that use the Chat endpoint' this.baseClasses = [this.type, ...getBaseClasses(ChatBedrock)] this.credential = { label: 'AWS Credential', @@ -88,27 +88,18 @@ class AWSChatBedrock_ChatModels implements INode { { label: 'us-west-1', name: 'us-west-1' }, { label: 'us-west-2', name: 'us-west-2' } ], - default: 'us-east-1', - optional: false + default: 'us-east-1' }, { label: 'Model Name', name: 'model', type: 'options', options: [ - { label: 'amazon.titan-tg1-large', name: 'amazon.titan-tg1-large' }, - { label: 'amazon.titan-e1t-medium', name: 'amazon.titan-e1t-medium' }, - { label: 'stability.stable-diffusion-xl', name: 'stability.stable-diffusion-xl' }, - { label: 'ai21.j2-grande-instruct', name: 'ai21.j2-grande-instruct' }, - { label: 'ai21.j2-jumbo-instruct', name: 'ai21.j2-jumbo-instruct' }, - { label: 'ai21.j2-mid', name: 'ai21.j2-mid' }, - { label: 'ai21.j2-ultra', name: 'ai21.j2-ultra' }, { label: 'anthropic.claude-instant-v1', name: 'anthropic.claude-instant-v1' }, { label: 'anthropic.claude-v1', name: 'anthropic.claude-v1' }, { label: 'anthropic.claude-v2', name: 'anthropic.claude-v2' } ], - default: 'anthropic.claude-v2', - optional: false + default: 'anthropic.claude-v2' }, { label: 'Temperature', @@ -117,8 +108,7 @@ class AWSChatBedrock_ChatModels implements INode { step: 0.1, description: 'Temperature parameter may not apply to certain model. Please check available model parameters', optional: true, - default: 0.7, - additionalParams: false + default: 0.7 }, { label: 'Max Tokens to Sample', @@ -126,9 +116,8 @@ class AWSChatBedrock_ChatModels implements INode { type: 'number', step: 10, description: 'Max Tokens parameter may not apply to certain model. Please check available model parameters', - optional: false, - default: 200, - additionalParams: false + optional: true, + default: 200 } ] } diff --git a/packages/components/nodes/embeddings/AWSBedrockEmbedding/AWSBedrockEmbedding.ts b/packages/components/nodes/embeddings/AWSBedrockEmbedding/AWSBedrockEmbedding.ts new file mode 100644 index 00000000000..0ac26d85929 --- /dev/null +++ b/packages/components/nodes/embeddings/AWSBedrockEmbedding/AWSBedrockEmbedding.ts @@ -0,0 +1,152 @@ +import { ICommonObject, INode, INodeData, INodeParams } from '../../../src/Interface' +import { getBaseClasses, getCredentialData, getCredentialParam } from '../../../src/utils' +import { BedrockEmbeddings, BedrockEmbeddingsParams } from 'langchain/embeddings/bedrock' +import { BedrockRuntimeClient, InvokeModelCommand } from '@aws-sdk/client-bedrock-runtime' + +class AWSBedrockEmbedding_Embeddings 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 = 'AWS Bedrock Embeddings' + this.name = 'AWSBedrockEmbeddings' + this.version = 1.0 + this.type = 'AWSBedrockEmbeddings' + this.icon = 'awsBedrock.png' + this.category = 'Embeddings' + this.description = 'AWSBedrock embedding models to generate embeddings for a given text' + this.baseClasses = [this.type, ...getBaseClasses(BedrockEmbeddings)] + this.credential = { + label: 'AWS Credential', + name: 'credential', + type: 'credential', + credentialNames: ['awsApi'], + optional: true + } + this.inputs = [ + { + label: 'Region', + name: 'region', + type: 'options', + options: [ + { label: 'af-south-1', name: 'af-south-1' }, + { label: 'ap-east-1', name: 'ap-east-1' }, + { label: 'ap-northeast-1', name: 'ap-northeast-1' }, + { label: 'ap-northeast-2', name: 'ap-northeast-2' }, + { label: 'ap-northeast-3', name: 'ap-northeast-3' }, + { label: 'ap-south-1', name: 'ap-south-1' }, + { label: 'ap-south-2', name: 'ap-south-2' }, + { label: 'ap-southeast-1', name: 'ap-southeast-1' }, + { label: 'ap-southeast-2', name: 'ap-southeast-2' }, + { label: 'ap-southeast-3', name: 'ap-southeast-3' }, + { label: 'ap-southeast-4', name: 'ap-southeast-4' }, + { label: 'ap-southeast-5', name: 'ap-southeast-5' }, + { label: 'ap-southeast-6', name: 'ap-southeast-6' }, + { label: 'ca-central-1', name: 'ca-central-1' }, + { label: 'ca-west-1', name: 'ca-west-1' }, + { label: 'cn-north-1', name: 'cn-north-1' }, + { label: 'cn-northwest-1', name: 'cn-northwest-1' }, + { label: 'eu-central-1', name: 'eu-central-1' }, + { label: 'eu-central-2', name: 'eu-central-2' }, + { label: 'eu-north-1', name: 'eu-north-1' }, + { label: 'eu-south-1', name: 'eu-south-1' }, + { label: 'eu-south-2', name: 'eu-south-2' }, + { label: 'eu-west-1', name: 'eu-west-1' }, + { label: 'eu-west-2', name: 'eu-west-2' }, + { label: 'eu-west-3', name: 'eu-west-3' }, + { label: 'il-central-1', name: 'il-central-1' }, + { label: 'me-central-1', name: 'me-central-1' }, + { label: 'me-south-1', name: 'me-south-1' }, + { label: 'sa-east-1', name: 'sa-east-1' }, + { label: 'us-east-1', name: 'us-east-1' }, + { label: 'us-east-2', name: 'us-east-2' }, + { label: 'us-gov-east-1', name: 'us-gov-east-1' }, + { label: 'us-gov-west-1', name: 'us-gov-west-1' }, + { label: 'us-west-1', name: 'us-west-1' }, + { label: 'us-west-2', name: 'us-west-2' } + ], + default: 'us-east-1' + }, + { + label: 'Model Name', + name: 'model', + type: 'options', + options: [{ label: 'amazon.titan-embed-text-v1', name: 'amazon.titan-embed-text-v1' }], + default: 'amazon.titan-embed-text-v1' + } + ] + } + + async init(nodeData: INodeData, _: string, options: ICommonObject): Promise { + const iRegion = nodeData.inputs?.region as string + const iModel = nodeData.inputs?.model as string + + const obj: BedrockEmbeddingsParams = { + model: iModel, + region: iRegion + } + + const credentialData = await getCredentialData(nodeData.credential ?? '', options) + if (credentialData && Object.keys(credentialData).length !== 0) { + const credentialApiKey = getCredentialParam('awsKey', credentialData, nodeData) + const credentialApiSecret = getCredentialParam('awsSecret', credentialData, nodeData) + const credentialApiSession = getCredentialParam('awsSession', credentialData, nodeData) + + obj.credentials = { + accessKeyId: credentialApiKey, + secretAccessKey: credentialApiSecret, + sessionToken: credentialApiSession + } + } + + const client = new BedrockRuntimeClient({ + region: obj.region, + credentials: obj.credentials + }) + + const model = new BedrockEmbeddings(obj) + + // Avoid Illegal Invocation + model.embedQuery = async (document: string): Promise => { + return await embedText(document, client, iModel) + } + + model.embedDocuments = async (documents: string[]): Promise => { + return Promise.all(documents.map((document) => embedText(document, client, iModel))) + } + return model + } +} + +const embedText = async (text: string, client: BedrockRuntimeClient, model: string): Promise => { + // replace newlines, which can negatively affect performance. + const cleanedText = text.replace(/\n/g, ' ') + + const res = await client.send( + new InvokeModelCommand({ + modelId: model, + body: JSON.stringify({ + inputText: cleanedText + }), + contentType: 'application/json', + accept: 'application/json' + }) + ) + + try { + const body = new TextDecoder().decode(res.body) + return JSON.parse(body).embedding + } catch (e) { + throw new Error('An invalid response was returned by Bedrock.') + } +} + +module.exports = { nodeClass: AWSBedrockEmbedding_Embeddings } diff --git a/packages/components/nodes/embeddings/AWSBedrockEmbedding/awsBedrock.png b/packages/components/nodes/embeddings/AWSBedrockEmbedding/awsBedrock.png new file mode 100644 index 0000000000000000000000000000000000000000..483bc69a9c7ae460dba316682d08101557629b66 GIT binary patch literal 62897 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 literal 0 HcmV?d00001 diff --git a/packages/components/nodes/llms/AWSBedrock/AWSBedrock.ts b/packages/components/nodes/llms/AWSBedrock/AWSBedrock.ts index 8f57daacd21..b67219f37fc 100644 --- a/packages/components/nodes/llms/AWSBedrock/AWSBedrock.ts +++ b/packages/components/nodes/llms/AWSBedrock/AWSBedrock.ts @@ -88,8 +88,7 @@ class AWSBedrock_LLMs implements INode { { label: 'us-west-1', name: 'us-west-1' }, { label: 'us-west-2', name: 'us-west-2' } ], - default: 'us-east-1', - optional: false + default: 'us-east-1' }, { label: 'Model Name', @@ -98,17 +97,12 @@ class AWSBedrock_LLMs implements INode { options: [ { label: 'amazon.titan-tg1-large', name: 'amazon.titan-tg1-large' }, { label: 'amazon.titan-e1t-medium', name: 'amazon.titan-e1t-medium' }, - { label: 'stability.stable-diffusion-xl', name: 'stability.stable-diffusion-xl' }, + { label: 'cohere.command-text-v14', name: 'cohere.command-text-v14' }, { label: 'ai21.j2-grande-instruct', name: 'ai21.j2-grande-instruct' }, { label: 'ai21.j2-jumbo-instruct', name: 'ai21.j2-jumbo-instruct' }, { label: 'ai21.j2-mid', name: 'ai21.j2-mid' }, - { label: 'ai21.j2-ultra', name: 'ai21.j2-ultra' }, - { label: 'anthropic.claude-instant-v1', name: 'anthropic.claude-instant-v1' }, - { label: 'anthropic.claude-v1', name: 'anthropic.claude-v1' }, - { label: 'anthropic.claude-v2', name: 'anthropic.claude-v2' } - ], - default: 'anthropic.claude-v2', - optional: false + { label: 'ai21.j2-ultra', name: 'ai21.j2-ultra' } + ] }, { label: 'Temperature', @@ -117,8 +111,7 @@ class AWSBedrock_LLMs implements INode { step: 0.1, description: 'Temperature parameter may not apply to certain model. Please check available model parameters', optional: true, - default: 0.7, - additionalParams: false + default: 0.7 }, { label: 'Max Tokens to Sample', @@ -126,9 +119,8 @@ class AWSBedrock_LLMs implements INode { type: 'number', step: 10, description: 'Max Tokens parameter may not apply to certain model. Please check available model parameters', - optional: false, - default: 200, - additionalParams: false + optional: true, + default: 200 } ] } diff --git a/packages/components/package.json b/packages/components/package.json index cf545ec3c2a..b2f302637a7 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -16,6 +16,7 @@ }, "license": "SEE LICENSE IN LICENSE.md", "dependencies": { + "@aws-sdk/client-bedrock-runtime": "3.422.0", "@aws-sdk/client-dynamodb": "^3.360.0", "@dqbd/tiktoken": "^1.0.7", "@getzep/zep-js": "^0.6.3", @@ -45,7 +46,7 @@ "graphql": "^16.6.0", "html-to-text": "^9.0.5", "ioredis": "^5.3.2", - "langchain": "^0.0.157", + "langchain": "^0.0.165", "langfuse-langchain": "^1.0.14-alpha.0", "langsmith": "^0.0.32", "linkifyjs": "^4.1.1",