kunjabijukchhe
feat: implement Claude 3, Claude3.5, Nova Pro, Nova Lite and Mistral model integration with AWS Bedrock (#974)
3ecac25
unverified
| import { BaseProvider } from '~/lib/modules/llm/base-provider'; | |
| import type { ModelInfo } from '~/lib/modules/llm/types'; | |
| import type { LanguageModelV1 } from 'ai'; | |
| import type { IProviderSetting } from '~/types/model'; | |
| import { createAmazonBedrock } from '@ai-sdk/amazon-bedrock'; | |
| interface AWSBedRockConfig { | |
| region: string; | |
| accessKeyId: string; | |
| secretAccessKey: string; | |
| sessionToken?: string; | |
| } | |
| export default class AmazonBedrockProvider extends BaseProvider { | |
| name = 'AmazonBedrock'; | |
| getApiKeyLink = 'https://console.aws.amazon.com/iam/home'; | |
| config = { | |
| apiTokenKey: 'AWS_BEDROCK_CONFIG', | |
| }; | |
| staticModels: ModelInfo[] = [ | |
| { | |
| name: 'anthropic.claude-3-5-sonnet-20240620-v1:0', | |
| label: 'Claude 3.5 Sonnet (Bedrock)', | |
| provider: 'AmazonBedrock', | |
| maxTokenAllowed: 4096, | |
| }, | |
| { | |
| name: 'anthropic.claude-3-sonnet-20240229-v1:0', | |
| label: 'Claude 3 Sonnet (Bedrock)', | |
| provider: 'AmazonBedrock', | |
| maxTokenAllowed: 4096, | |
| }, | |
| { | |
| name: 'anthropic.claude-3-haiku-20240307-v1:0', | |
| label: 'Claude 3 Haiku (Bedrock)', | |
| provider: 'AmazonBedrock', | |
| maxTokenAllowed: 4096, | |
| }, | |
| { | |
| name: 'amazon.nova-pro-v1:0', | |
| label: 'Amazon Nova Pro (Bedrock)', | |
| provider: 'AmazonBedrock', | |
| maxTokenAllowed: 5120, | |
| }, | |
| { | |
| name: 'amazon.nova-lite-v1:0', | |
| label: 'Amazon Nova Lite (Bedrock)', | |
| provider: 'AmazonBedrock', | |
| maxTokenAllowed: 5120, | |
| }, | |
| { | |
| name: 'mistral.mistral-large-2402-v1:0', | |
| label: 'Mistral Large 24.02 (Bedrock)', | |
| provider: 'AmazonBedrock', | |
| maxTokenAllowed: 8192, | |
| }, | |
| ]; | |
| private _parseAndValidateConfig(apiKey: string): AWSBedRockConfig { | |
| let parsedConfig: AWSBedRockConfig; | |
| try { | |
| parsedConfig = JSON.parse(apiKey); | |
| } catch { | |
| throw new Error( | |
| 'Invalid AWS Bedrock configuration format. Please provide a valid JSON string containing region, accessKeyId, and secretAccessKey.', | |
| ); | |
| } | |
| const { region, accessKeyId, secretAccessKey, sessionToken } = parsedConfig; | |
| if (!region || !accessKeyId || !secretAccessKey) { | |
| throw new Error( | |
| 'Missing required AWS credentials. Configuration must include region, accessKeyId, and secretAccessKey.', | |
| ); | |
| } | |
| return { | |
| region, | |
| accessKeyId, | |
| secretAccessKey, | |
| ...(sessionToken && { sessionToken }), | |
| }; | |
| } | |
| getModelInstance(options: { | |
| model: string; | |
| serverEnv: any; | |
| apiKeys?: Record<string, string>; | |
| providerSettings?: Record<string, IProviderSetting>; | |
| }): LanguageModelV1 { | |
| const { model, serverEnv, apiKeys, providerSettings } = options; | |
| const { apiKey } = this.getProviderBaseUrlAndKey({ | |
| apiKeys, | |
| providerSettings: providerSettings?.[this.name], | |
| serverEnv: serverEnv as any, | |
| defaultBaseUrlKey: '', | |
| defaultApiTokenKey: 'AWS_BEDROCK_CONFIG', | |
| }); | |
| if (!apiKey) { | |
| throw new Error(`Missing API key for ${this.name} provider`); | |
| } | |
| const config = this._parseAndValidateConfig(apiKey); | |
| const bedrock = createAmazonBedrock(config); | |
| return bedrock(model); | |
| } | |
| } | |