{"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":";;;;;;;;;;;;;;;;AAsBA,MAAM,cAAc;CAClB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,0BAA0B;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,6BAA6B;;;;;;;;;;AAWnC,IAAa,UAAb,cAA6BA,qCAAAA,IAAgC;CAC3D,QAAQ;CAER;CAEA;CAEA;CAEA,cAAmC,KAAA;CAEnC,YAAiC,KAAA;CAEjC;CAEA;CAEA;CAEA,QAA0B,IAAIC,0BAAAA,iBAAiBC,kBAAAA,QAAQC,kBAAAA,SAAS;CAEhE,YAAY;CAEZ,kBAAkB;CAElB,IAAI,aAAqC;AACvC,SAAO;GACL,OAAO;GACP,QAAQ;GACT;;CAGH,IAAI,aAAoD;AACtD,SAAO;GACL,2BAA2B;GAC3B,+BAA+B;GAChC;;CAGH,IAAI,gBAA8C;AAChD,SAAO,EAAE,QAAQ,KAAK,QAAQ;;CAGhC,WAAW;AACT,SAAO;;CAGT,OAAO,UAAU;AACf,SAAO;;CAGT,YAAY,QAAoD;AAC9D,QAAM,UAAU,EAAE,CAAC;AAEnB,OAAK,QAAQ,QAAQ,SAAS,KAAK;AACnC,OAAK,gBAAgB,iBAAiB,KAAK,MAAM;AAEjD,MAAI,CAAC,wBAAwB,SAAS,KAAK,cAAc,CACvD,OAAM,IAAI,MACR,4BAA4B,KAAK,cAAc,+BAA+B,0BAC/E;EAEH,MAAM,SACJ,QAAQ,WAAA,GAAA,0BAAA,wBAAiC,qBAAqB;AAChE,MAAI,CAAC,OACH,OAAM,IAAI,MACR,4GACD;AAEH,OAAK,SAAS;EAEd,MAAM,cAAc,QAAQ;AAC5B,MAAI,CAAC,YACH,OAAM,IAAI,MACR,6DACD;AAEH,OAAK,cAAc;AAEnB,OAAK,cAAc,QAAQ,eAAe,KAAK;AAC/C,OAAK,YAAY,QAAQ,aAAa,KAAK;AAC3C,OAAK,UAAU,QAAQ,WAAW,MAAM,KAAK,WAAW;AACxD,OAAK,eAAe,QAAQ,gBAAgB,QAAQ;AACpD,OAAK,cAAc,QAAQ;AAC3B,OAAK,YAAY,QAAQ,aAAa,KAAK;;;;;;;;;;;;CAa7C,MAAM,MACJ,QACA,SACA,YACiB;EAEjB,MAAM,eACJ,KAAK,gBAAgB,mBAAc,KAAK,OAAO;EACjD,MAAM,WAAW,KAAK;AACtB,MAAI,KAAK,WAAW;GAClB,MAAM,SAAS,KAAK,sBAAsB,QAAQ,SAAS,WAAW;GACtE,IAAI;AACJ,cAAW,MAAM,SAAS,OACxB,KAAI,gBAAgB,KAAA,EAClB,eAAc;OAEd,eAAc,YAAY,OAAO,MAAM;AAG3C,UAAO,aAAa,QAAQ;;EAE9B,MAAM,WAAW,MAAM,KAAK,aAAa,QAAQ,SAAS;GACxD,eAAe;GACf;GACA;GACD,CAAC;EACF,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MACR,SAAS,SAAS,OAAO,IAAI,KAAK,WAAW,KAAK,UAAU,KAAK,GAClE;AAGH,SADaC,cAAAA,6BAA6B,cAAc,UAAU,KAAK;;CAIzE,MAAM,aACJ,QACA,SACA,QAKA;EACA,MAAM,EAAE,eAAe,cAAc,aAAa;EAClD,MAAM,YAAYA,cAAAA,6BAA6B,aAC7C,UACA,QACA,KAAK,WACL,KAAK,aACL,QAAQ,MACR,KAAK,aACL,OAAO,cACR;EAED,MAAM,MAAM,IAAI,IACd,WAAW,aAAa,SAAS,KAAK,MAAM,GAAG,gBAChD;EAED,MAAM,UAAU,IAAIC,sBAAAA,YAAY;GAC9B,UAAU,IAAI;GACd,MAAM,IAAI;GACV,UAAU,IAAI;GACd,QAAQ;GACR,MAAM,KAAK,UAAU,UAAU;GAC/B,OAAO,OAAO,YAAY,IAAI,aAAa,SAAS,CAAC;GACrD,SAAS;IAEP,MAAM,IAAI;IACV,QAAQ;IACR,gBAAgB;IACjB;GACF,CAAC;EASF,MAAM,gBAAgB,MAPP,IAAIC,qBAAAA,YAAY;GAC7B,aAAa,KAAK;GAClB,SAAS;GACT,QAAQ,KAAK;GACb,QAAQC,sBAAAA;GACT,CAAC,CAEiC,KAAK,QAAQ;AAYhD,SATiB,MAAM,KAAK,OAAO,gBACjC,EAAE,QAAQ,QAAQ,QAAQ,EAC1B,YACE,KAAK,QAAQ,KAAK;GAChB,SAAS,cAAc;GACvB,MAAM,cAAc;GACpB,QAAQ,cAAc;GACvB,CAAC,CACL;;CAIH,iBAAiB,SAAqC;AACpD,SAAO;GACL,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,aAAa,KAAK;GAClB,WAAW,KAAK;GAChB,MAAM,SAAS;GACf,aAAa,KAAK;GACnB;;CAGH,OAAO,sBACL,QACA,SACA,YACiC;EACjC,MAAM,WAAW,KAAK;EACtB,MAAM,gBACJ,aAAa,eACb,aAAa,YACb,aAAa,UACb,aAAa,YACT,gCACA;EAGN,MAAM,eACJ,KAAK,gBAAgB,mBAAc,KAAK,OAAO;EAGjD,MAAM,WAAW,MAAM,KAAK,aAAa,QAAQ,SAAS;GACxD;GACA;GACA;GACD,CAAC;AAEF,MAAI,SAAS,SAAS,OAAO,SAAS,UAAU,IAC9C,OAAM,MACJ,oCAAoC,aAAa,SAC/C,SAAS,OACV,GAAG,SAAS,WAAW,IAAI,MAAM,SAAS,MAAM,GAClD;AAGH,MACE,aAAa,eACb,aAAa,YACb,aAAa,UACb,aAAa,WACb;GACA,MAAM,SAAS,SAAS,MAAM,WAAW;GACzC,MAAM,UAAU,IAAI,aAAa;AACjC,cAAW,MAAM,SAAS,KAAK,YAAY,OAAO,EAAE;IAClD,MAAM,QAAQ,KAAK,MAAM,OAAO,MAAM;AACtC,QACG,MAAM,QAAQ,mBAAmB,KAAA,KAChC,MAAM,QAAQ,eAAe,UAAU,WACzC,MAAM,QAAQ,iBAAiB,UAAU,mBAEzC,OAAM,MAAM,kCAAkC,QAAQ;IAExD,MAAM,OAAO,KAAK,MAAM,QAAQ,OAAO,MAAM,KAAK,CAAC;AACnD,QAAI,KAAK,QACP,OAAM,IAAI,MAAM,KAAK,QAAQ;AAE/B,QAAI,KAAK,UAAU,KAAA,GAAW;KAC5B,MAAM,cAAc,KAAK,MACvB,QAAQ,OACN,WAAW,KAAK,KAAK,KAAK,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAChE,CACF;KACD,MAAM,OAAOH,cAAAA,6BAA6B,cACxC,UACA,YACD;AACD,WAAM,IAAII,wBAAAA,gBAAgB;MACxB;MACA,gBAAgB,EAAE;MACnB,CAAC;AAEG,iBAAY,kBAAkB,KAAK;;;SAGvC;GACL,MAAM,OAAO,MAAM,SAAS,MAAM;GAClC,MAAM,OAAOJ,cAAAA,6BAA6B,cAAc,UAAU,KAAK;AACvE,SAAM,IAAII,wBAAAA,gBAAgB;IACxB;IACA,gBAAgB,EAAE;IACnB,CAAC;AAEG,eAAY,kBAAkB,KAAK;;;CAK5C,YAAY,QAAa;EACvB,SAAS,cAAc,GAAe,GAAe;GACnD,MAAM,YAAY,IAAI,WAAW,EAAE,SAAS,EAAE,OAAO;AACrD,aAAU,IAAI,EAAE;AAChB,aAAU,IAAI,GAAG,EAAE,OAAO;AAC1B,UAAO;;EAGT,SAAS,iBAAiB,QAAoB;AAC5C,OAAI,OAAO,aAAa,2BAA4B,QAAO;AAO3D,UANa,IAAI,SACf,OAAO,QACP,OAAO,YACP,OAAO,WACR,CAEW,UAAU,GAAG,MAAM;;AAGjC,SAAO,EACL,QAAQ,OAAO,iBAAiB;GAC9B,IAAI,aAAa,MAAM,OAAO,MAAM;GAEpC,IAAI,SAAqB,IAAI,WAAW,EAAE;AAC1C,UAAO,CAAC,WAAW,MAAM;IACvB,MAAM,QAAoB,WAAW;AAErC,aAAS,cAAc,QAAQ,MAAM;IACrC,IAAI,gBAAgB,iBAAiB,OAAO;AAE5C,WACE,OAAO,cAAc,8BACrB,OAAO,cAAc,eACrB;AACA,WAAM,OAAO,MAAM,GAAG,cAAc;AACpC,cAAS,OAAO,MAAM,cAAc;AACpC,qBAAgB,iBAAiB,OAAO;;AAG1C,iBAAa,MAAM,OAAO,MAAM;;KAGrC;;;AAIL,SAAS,iBAAiB,SAA0B;CAClD,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAO,YAAY,MAAM,WAAW,MAAM,OAAO,OAAO;;AAG1D,SAAS,iBAAiB,SAAyB;CACjD,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,KAAI,iBAAiB,QAAQ,CAC3B,QAAO,MAAM;KAEb,QAAO,MAAM"}