@langchain/community
Version:
Third-party integrations for LangChain.js
1 lines • 17 kB
Source Map (JSON)
{"version":3,"file":"web.cjs","names":["LLM","EventStreamCodec","toUtf8","fromUtf8","BedrockLLMInputOutputAdapter","HttpRequest","SignatureV4","Sha256","GenerationChunk"],"sources":["../../../src/llms/bedrock/web.ts"],"sourcesContent":["import { SignatureV4 } from \"@smithy/signature-v4\";\n\nimport { HttpRequest } from \"@smithy/protocol-http\";\nimport { EventStreamCodec } from \"@smithy/eventstream-codec\";\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nimport { Sha256 } from \"@aws-crypto/sha256-js\";\n\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport { GenerationChunk } from \"@langchain/core/outputs\";\nimport { LLM, type BaseLLMParams } from \"@langchain/core/language_models/llms\";\n\nimport {\n BaseBedrockInput,\n BedrockLLMInputOutputAdapter,\n type CredentialType,\n} from \"../../utils/bedrock/index.js\";\nimport type { SerializedFields } from \"../../load/map_keys.js\";\n\n/**\n * @see https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html#Concepts.RegionsAndAvailabilityZones.Regions\n */\nconst AWS_REGIONS = [\n \"us\",\n \"sa\",\n \"me\",\n \"mx\",\n \"il\",\n \"eu\",\n \"cn\",\n \"ca\",\n \"ap\",\n \"af\",\n \"us-gov\",\n \"apac\",\n \"au\",\n \"jp\",\n \"global\",\n];\n\nconst ALLOWED_MODEL_PROVIDERS = [\n \"ai21\",\n \"anthropic\",\n \"amazon\",\n \"cohere\",\n \"meta\",\n \"mistral\",\n \"deepseek\",\n];\n\nconst PRELUDE_TOTAL_LENGTH_BYTES = 4;\n\n/**\n * A type of Large Language Model (LLM) that interacts with the Bedrock\n * service. It extends the base `LLM` class and implements the\n * `BaseBedrockInput` interface. The class is designed to authenticate and\n * interact with the Bedrock service, which is a part of Amazon Web\n * Services (AWS). It uses AWS credentials for authentication and can be\n * configured with various parameters such as the model to use, the AWS\n * region, and the maximum number of tokens to generate.\n */\nexport class Bedrock extends LLM implements BaseBedrockInput {\n model = \"amazon.titan-tg1-large\";\n\n modelProvider: string;\n\n region: string;\n\n credentials: CredentialType;\n\n temperature?: number | undefined = undefined;\n\n maxTokens?: number | undefined = undefined;\n\n fetchFn: typeof fetch;\n\n endpointHost?: string;\n\n modelKwargs?: Record<string, unknown>;\n\n codec: EventStreamCodec = new EventStreamCodec(toUtf8, fromUtf8);\n\n streaming = false;\n\n lc_serializable = true;\n\n get lc_aliases(): Record<string, string> {\n return {\n model: \"model_id\",\n region: \"region_name\",\n };\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n \"credentials.accessKeyId\": \"BEDROCK_AWS_ACCESS_KEY_ID\",\n \"credentials.secretAccessKey\": \"BEDROCK_AWS_SECRET_ACCESS_KEY\",\n };\n }\n\n get lc_attributes(): SerializedFields | undefined {\n return { region: this.region };\n }\n\n _llmType() {\n return \"bedrock\";\n }\n\n static lc_name() {\n return \"Bedrock\";\n }\n\n constructor(fields?: Partial<BaseBedrockInput> & BaseLLMParams) {\n super(fields ?? {});\n\n this.model = fields?.model ?? this.model;\n this.modelProvider = getModelProvider(this.model);\n\n if (!ALLOWED_MODEL_PROVIDERS.includes(this.modelProvider)) {\n throw new Error(\n `Unknown model provider: '${this.modelProvider}', only these are supported: ${ALLOWED_MODEL_PROVIDERS}`\n );\n }\n const region =\n fields?.region ?? getEnvironmentVariable(\"AWS_DEFAULT_REGION\");\n if (!region) {\n throw new Error(\n \"Please set the AWS_DEFAULT_REGION environment variable or pass it to the constructor as the region field.\"\n );\n }\n this.region = region;\n\n const credentials = fields?.credentials;\n if (!credentials) {\n throw new Error(\n \"Please set the AWS credentials in the 'credentials' field.\"\n );\n }\n this.credentials = credentials;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.fetchFn = fields?.fetchFn ?? fetch.bind(globalThis);\n this.endpointHost = fields?.endpointHost ?? fields?.endpointUrl;\n this.modelKwargs = fields?.modelKwargs;\n this.streaming = fields?.streaming ?? this.streaming;\n }\n\n /** Call out to Bedrock service model.\n Arguments:\n prompt: The prompt to pass into the model.\n\n Returns:\n The string generated by the model.\n\n Example:\n response = model.invoke(\"Tell me a joke.\")\n */\n async _call(\n prompt: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): Promise<string> {\n const service = \"bedrock-runtime\";\n const endpointHost =\n this.endpointHost ?? `${service}.${this.region}.amazonaws.com`;\n const provider = this.modelProvider;\n if (this.streaming) {\n const stream = this._streamResponseChunks(prompt, options, runManager);\n let finalResult: GenerationChunk | undefined;\n for await (const chunk of stream) {\n if (finalResult === undefined) {\n finalResult = chunk;\n } else {\n finalResult = finalResult.concat(chunk);\n }\n }\n return finalResult?.text ?? \"\";\n }\n const response = await this._signedFetch(prompt, options, {\n bedrockMethod: \"invoke\",\n endpointHost,\n provider,\n });\n const json = await response.json();\n if (!response.ok) {\n throw new Error(\n `Error ${response.status}: ${json.message ?? JSON.stringify(json)}`\n );\n }\n const text = BedrockLLMInputOutputAdapter.prepareOutput(provider, json);\n return text;\n }\n\n async _signedFetch(\n prompt: string,\n options: this[\"ParsedCallOptions\"],\n fields: {\n bedrockMethod: \"invoke\" | \"invoke-with-response-stream\";\n endpointHost: string;\n provider: string;\n }\n ) {\n const { bedrockMethod, endpointHost, provider } = fields;\n const inputBody = BedrockLLMInputOutputAdapter.prepareInput(\n provider,\n prompt,\n this.maxTokens,\n this.temperature,\n options.stop,\n this.modelKwargs,\n fields.bedrockMethod\n );\n\n const url = new URL(\n `https://${endpointHost}/model/${this.model}/${bedrockMethod}`\n );\n\n const request = new HttpRequest({\n hostname: url.hostname,\n path: url.pathname,\n protocol: url.protocol,\n method: \"POST\", // method must be uppercase\n body: JSON.stringify(inputBody),\n query: Object.fromEntries(url.searchParams.entries()),\n headers: {\n // host is required by AWS Signature V4: https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n host: url.host,\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n },\n });\n\n const signer = new SignatureV4({\n credentials: this.credentials,\n service: \"bedrock\",\n region: this.region,\n sha256: Sha256,\n });\n\n const signedRequest = await signer.sign(request);\n\n // Send request to AWS using the low-level fetch API\n const response = await this.caller.callWithOptions(\n { signal: options.signal },\n async () =>\n this.fetchFn(url, {\n headers: signedRequest.headers,\n body: signedRequest.body,\n method: signedRequest.method,\n })\n );\n return response;\n }\n\n invocationParams(options?: this[\"ParsedCallOptions\"]) {\n return {\n model: this.model,\n region: this.region,\n temperature: this.temperature,\n maxTokens: this.maxTokens,\n stop: options?.stop,\n modelKwargs: this.modelKwargs,\n };\n }\n\n async *_streamResponseChunks(\n prompt: string,\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<GenerationChunk> {\n const provider = this.modelProvider;\n const bedrockMethod =\n provider === \"anthropic\" ||\n provider === \"cohere\" ||\n provider === \"meta\" ||\n provider === \"mistral\"\n ? \"invoke-with-response-stream\"\n : \"invoke\";\n\n const service = \"bedrock-runtime\";\n const endpointHost =\n this.endpointHost ?? `${service}.${this.region}.amazonaws.com`;\n\n // Send request to AWS using the low-level fetch API\n const response = await this._signedFetch(prompt, options, {\n bedrockMethod,\n endpointHost,\n provider,\n });\n\n if (response.status < 200 || response.status >= 300) {\n throw Error(\n `Failed to access underlying url '${endpointHost}': got ${\n response.status\n } ${response.statusText}: ${await response.text()}`\n );\n }\n\n if (\n provider === \"anthropic\" ||\n provider === \"cohere\" ||\n provider === \"meta\" ||\n provider === \"mistral\"\n ) {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n for await (const chunk of this._readChunks(reader)) {\n const event = this.codec.decode(chunk);\n if (\n (event.headers[\":event-type\"] !== undefined &&\n event.headers[\":event-type\"].value !== \"chunk\") ||\n event.headers[\":content-type\"].value !== \"application/json\"\n ) {\n throw Error(`Failed to get event chunk: got ${chunk}`);\n }\n const body = JSON.parse(decoder.decode(event.body));\n if (body.message) {\n throw new Error(body.message);\n }\n if (body.bytes !== undefined) {\n const chunkResult = JSON.parse(\n decoder.decode(\n Uint8Array.from(atob(body.bytes), (m) => m.codePointAt(0) ?? 0)\n )\n );\n const text = BedrockLLMInputOutputAdapter.prepareOutput(\n provider,\n chunkResult\n );\n yield new GenerationChunk({\n text,\n generationInfo: {},\n });\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(text);\n }\n }\n } else {\n const json = await response.json();\n const text = BedrockLLMInputOutputAdapter.prepareOutput(provider, json);\n yield new GenerationChunk({\n text,\n generationInfo: {},\n });\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(text);\n }\n }\n\n // oxlint-disable-next-line typescript/no-explicit-any\n _readChunks(reader: any) {\n function _concatChunks(a: Uint8Array, b: Uint8Array) {\n const newBuffer = new Uint8Array(a.length + b.length);\n newBuffer.set(a);\n newBuffer.set(b, a.length);\n return newBuffer;\n }\n\n function getMessageLength(buffer: Uint8Array) {\n if (buffer.byteLength < PRELUDE_TOTAL_LENGTH_BYTES) return 0;\n const view = new DataView(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength\n );\n\n return view.getUint32(0, false);\n }\n\n return {\n async *[Symbol.asyncIterator]() {\n let readResult = await reader.read();\n\n let buffer: Uint8Array = new Uint8Array(0);\n while (!readResult.done) {\n const chunk: Uint8Array = readResult.value;\n\n buffer = _concatChunks(buffer, chunk);\n let messageLength = getMessageLength(buffer);\n\n while (\n buffer.byteLength >= PRELUDE_TOTAL_LENGTH_BYTES &&\n buffer.byteLength >= messageLength\n ) {\n yield buffer.slice(0, messageLength);\n buffer = buffer.slice(messageLength);\n messageLength = getMessageLength(buffer);\n }\n\n readResult = await reader.read();\n }\n },\n };\n }\n}\n\nfunction isInferenceModel(modelId: string): boolean {\n const parts = modelId.split(\".\");\n return AWS_REGIONS.some((region) => parts[0] === region);\n}\n\nfunction getModelProvider(modelId: string): string {\n const parts = modelId.split(\".\");\n if (isInferenceModel(modelId)) {\n return parts[1];\n } else {\n return parts[0];\n }\n}\n"],"mappings":"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"}