{"version":3,"file":"bedrock-runtime.js","sourceRoot":"","sources":["../../../src/services/bedrock-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\nimport {\n  Attributes,\n  DiagLogger,\n  diag,\n  Histogram,\n  HrTime,\n  Meter,\n  Span,\n  Tracer,\n  ValueType,\n} from '@opentelemetry/api';\nimport { RequestMetadata, ServiceExtension } from './ServiceExtension';\nimport {\n  ATTR_GEN_AI_SYSTEM,\n  ATTR_GEN_AI_OPERATION_NAME,\n  ATTR_GEN_AI_REQUEST_MODEL,\n  ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n  ATTR_GEN_AI_REQUEST_TEMPERATURE,\n  ATTR_GEN_AI_REQUEST_TOP_P,\n  ATTR_GEN_AI_REQUEST_STOP_SEQUENCES,\n  ATTR_GEN_AI_TOKEN_TYPE,\n  ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n  ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n  ATTR_GEN_AI_RESPONSE_FINISH_REASONS,\n  GEN_AI_OPERATION_NAME_VALUE_CHAT,\n  GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n  GEN_AI_TOKEN_TYPE_VALUE_INPUT,\n  GEN_AI_TOKEN_TYPE_VALUE_OUTPUT,\n  METRIC_GEN_AI_CLIENT_OPERATION_DURATION,\n  METRIC_GEN_AI_CLIENT_TOKEN_USAGE,\n} from '../semconv';\nimport {\n  AwsSdkInstrumentationConfig,\n  NormalizedRequest,\n  NormalizedResponse,\n} from '../types';\nimport type {\n  ConverseStreamOutput,\n  TokenUsage,\n} from '@aws-sdk/client-bedrock-runtime';\nimport {\n  hrTime,\n  hrTimeDuration,\n  hrTimeToMilliseconds,\n} from '@opentelemetry/core';\n\nexport class BedrockRuntimeServiceExtension implements ServiceExtension {\n  private tokenUsage!: Histogram;\n  private operationDuration!: Histogram;\n  private _diag: DiagLogger = diag;\n\n  updateMetricInstruments(meter: Meter) {\n    // https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/#metric-gen_aiclienttokenusage\n    this.tokenUsage = meter.createHistogram(METRIC_GEN_AI_CLIENT_TOKEN_USAGE, {\n      unit: '{token}',\n      description: 'Measures number of input and output tokens used',\n      valueType: ValueType.INT,\n      advice: {\n        explicitBucketBoundaries: [\n          1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, 262144, 1048576, 4194304,\n          16777216, 67108864,\n        ],\n      },\n    });\n\n    // https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/#metric-gen_aiclientoperationduration\n    this.operationDuration = meter.createHistogram(\n      METRIC_GEN_AI_CLIENT_OPERATION_DURATION,\n      {\n        unit: 's',\n        description: 'GenAI operation duration',\n        advice: {\n          explicitBucketBoundaries: [\n            0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28, 2.56, 5.12, 10.24,\n            20.48, 40.96, 81.92,\n          ],\n        },\n      }\n    );\n  }\n\n  requestPreSpanHook(\n    request: NormalizedRequest,\n    config: AwsSdkInstrumentationConfig,\n    diag: DiagLogger\n  ): RequestMetadata {\n    switch (request.commandName) {\n      case 'Converse':\n        return this.requestPreSpanHookConverse(request, config, diag, false);\n      case 'ConverseStream':\n        return this.requestPreSpanHookConverse(request, config, diag, true);\n      case 'InvokeModel':\n        return this.requestPreSpanHookInvokeModel(request, config, diag, false);\n      case 'InvokeModelWithResponseStream':\n        return this.requestPreSpanHookInvokeModel(request, config, diag, true);\n    }\n\n    return {\n      isIncoming: false,\n    };\n  }\n\n  private requestPreSpanHookConverse(\n    request: NormalizedRequest,\n    config: AwsSdkInstrumentationConfig,\n    diag: DiagLogger,\n    isStream: boolean\n  ): RequestMetadata {\n    let spanName = GEN_AI_OPERATION_NAME_VALUE_CHAT;\n    const spanAttributes: Attributes = {\n      [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n      [ATTR_GEN_AI_OPERATION_NAME]: GEN_AI_OPERATION_NAME_VALUE_CHAT,\n    };\n\n    const modelId = request.commandInput.modelId;\n    if (modelId) {\n      spanAttributes[ATTR_GEN_AI_REQUEST_MODEL] = modelId;\n      if (spanName) {\n        spanName += ` ${modelId}`;\n      }\n    }\n\n    const inferenceConfig = request.commandInput.inferenceConfig;\n    if (inferenceConfig) {\n      const { maxTokens, temperature, topP, stopSequences } = inferenceConfig;\n      if (maxTokens !== undefined) {\n        spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] = maxTokens;\n      }\n      if (temperature !== undefined) {\n        spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] = temperature;\n      }\n      if (topP !== undefined) {\n        spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = topP;\n      }\n      if (stopSequences !== undefined) {\n        spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = stopSequences;\n      }\n    }\n\n    return {\n      spanName,\n      isIncoming: false,\n      isStream,\n      spanAttributes,\n    };\n  }\n\n  private requestPreSpanHookInvokeModel(\n    request: NormalizedRequest,\n    config: AwsSdkInstrumentationConfig,\n    diag: DiagLogger,\n    isStream: boolean\n  ): RequestMetadata {\n    let spanName: string | undefined;\n    const spanAttributes: Attributes = {\n      [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n      // add operation name for InvokeModel API\n    };\n\n    const modelId = request.commandInput?.modelId;\n    if (modelId) {\n      spanAttributes[ATTR_GEN_AI_REQUEST_MODEL] = modelId;\n    }\n\n    if (request.commandInput?.body) {\n      const requestBody = JSON.parse(request.commandInput.body);\n      if (modelId.includes('amazon.titan')) {\n        if (requestBody.textGenerationConfig?.temperature !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n            requestBody.textGenerationConfig.temperature;\n        }\n        if (requestBody.textGenerationConfig?.topP !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] =\n            requestBody.textGenerationConfig.topP;\n        }\n        if (requestBody.textGenerationConfig?.maxTokenCount !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n            requestBody.textGenerationConfig.maxTokenCount;\n        }\n        if (requestBody.textGenerationConfig?.stopSequences !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n            requestBody.textGenerationConfig.stopSequences;\n        }\n      } else if (modelId.includes('amazon.nova')) {\n        if (requestBody.inferenceConfig?.temperature !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n            requestBody.inferenceConfig.temperature;\n        }\n        if (requestBody.inferenceConfig?.top_p !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] =\n            requestBody.inferenceConfig.top_p;\n        }\n        if (requestBody.inferenceConfig?.max_new_tokens !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n            requestBody.inferenceConfig.max_new_tokens;\n        }\n        if (requestBody.inferenceConfig?.stopSequences !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n            requestBody.inferenceConfig.stopSequences;\n        }\n      } else if (modelId.includes('anthropic.claude')) {\n        if (requestBody.max_tokens !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n            requestBody.max_tokens;\n        }\n        if (requestBody.temperature !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n            requestBody.temperature;\n        }\n        if (requestBody.top_p !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;\n        }\n        if (requestBody.stop_sequences !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n            requestBody.stop_sequences;\n        }\n      } else if (modelId.includes('meta.llama')) {\n        if (requestBody.max_gen_len !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n            requestBody.max_gen_len;\n        }\n        if (requestBody.temperature !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n            requestBody.temperature;\n        }\n        if (requestBody.top_p !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;\n        }\n        // request for meta llama models does not contain stop_sequences field\n      } else if (modelId.includes('cohere.command-r')) {\n        if (requestBody.max_tokens !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n            requestBody.max_tokens;\n        }\n        if (requestBody.temperature !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n            requestBody.temperature;\n        }\n        if (requestBody.p !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.p;\n        }\n        if (requestBody.message !== undefined) {\n          // NOTE: We approximate the token count since this value is not directly available in the body\n          // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n          // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n          spanAttributes[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(\n            requestBody.message.length / 6\n          );\n        }\n        if (requestBody.stop_sequences !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n            requestBody.stop_sequences;\n        }\n      } else if (modelId.includes('cohere.command')) {\n        if (requestBody.max_tokens !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n            requestBody.max_tokens;\n        }\n        if (requestBody.temperature !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n            requestBody.temperature;\n        }\n        if (requestBody.p !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.p;\n        }\n        if (requestBody.prompt !== undefined) {\n          // NOTE: We approximate the token count since this value is not directly available in the body\n          // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n          // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n          spanAttributes[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(\n            requestBody.prompt.length / 6\n          );\n        }\n        if (requestBody.stop_sequences !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =\n            requestBody.stop_sequences;\n        }\n      } else if (modelId.includes('mistral')) {\n        if (requestBody.prompt !== undefined) {\n          // NOTE: We approximate the token count since this value is not directly available in the body\n          // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n          // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n          spanAttributes[ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(\n            requestBody.prompt.length / 6\n          );\n        }\n        if (requestBody.max_tokens !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_MAX_TOKENS] =\n            requestBody.max_tokens;\n        }\n        if (requestBody.temperature !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TEMPERATURE] =\n            requestBody.temperature;\n        }\n        if (requestBody.top_p !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;\n        }\n        if (requestBody.stop !== undefined) {\n          spanAttributes[ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = requestBody.stop;\n        }\n      }\n    }\n\n    return {\n      spanName,\n      isIncoming: false,\n      isStream,\n      spanAttributes,\n    };\n  }\n\n  responseHook(\n    response: NormalizedResponse,\n    span: Span,\n    tracer: Tracer,\n    config: AwsSdkInstrumentationConfig,\n    startTime: HrTime\n  ) {\n    if (!span.isRecording()) {\n      return;\n    }\n\n    switch (response.request.commandName) {\n      case 'Converse':\n        return this.responseHookConverse(\n          response,\n          span,\n          tracer,\n          config,\n          startTime\n        );\n      case 'ConverseStream':\n        return this.responseHookConverseStream(\n          response,\n          span,\n          tracer,\n          config,\n          startTime\n        );\n      case 'InvokeModel':\n        return this.responseHookInvokeModel(response, span, tracer, config);\n      case 'InvokeModelWithResponseStream':\n        return this.responseHookInvokeModelWithResponseStream(\n          response,\n          span,\n          tracer,\n          config\n        );\n    }\n  }\n\n  private responseHookConverse(\n    response: NormalizedResponse,\n    span: Span,\n    tracer: Tracer,\n    config: AwsSdkInstrumentationConfig,\n    startTime: HrTime\n  ) {\n    const { stopReason, usage } = response.data;\n\n    BedrockRuntimeServiceExtension.setStopReason(span, stopReason);\n    this.setUsage(response, span, usage, startTime);\n  }\n\n  private responseHookConverseStream(\n    response: NormalizedResponse,\n    span: Span,\n    tracer: Tracer,\n    config: AwsSdkInstrumentationConfig,\n    startTime: HrTime\n  ) {\n    return {\n      ...response.data,\n      // Wrap and replace the response stream to allow processing events to telemetry\n      // before yielding to the user.\n      stream: this.wrapConverseStreamResponse(\n        response,\n        response.data.stream,\n        span,\n        startTime\n      ),\n    };\n  }\n\n  private async *wrapConverseStreamResponse(\n    response: NormalizedResponse,\n    stream: AsyncIterable<ConverseStreamOutput>,\n    span: Span,\n    startTime: HrTime\n  ) {\n    try {\n      let usage: TokenUsage | undefined;\n      for await (const item of stream) {\n        BedrockRuntimeServiceExtension.setStopReason(\n          span,\n          item.messageStop?.stopReason\n        );\n        usage = item.metadata?.usage;\n        yield item;\n      }\n      this.setUsage(response, span, usage, startTime);\n    } finally {\n      span.end();\n    }\n  }\n\n  private static setStopReason(span: Span, stopReason: string | undefined) {\n    if (stopReason !== undefined) {\n      span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [stopReason]);\n    }\n  }\n\n  private setUsage(\n    response: NormalizedResponse,\n    span: Span,\n    usage: TokenUsage | undefined,\n    startTime: HrTime\n  ) {\n    const sharedMetricAttrs: Attributes = {\n      [ATTR_GEN_AI_SYSTEM]: GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,\n      [ATTR_GEN_AI_OPERATION_NAME]: GEN_AI_OPERATION_NAME_VALUE_CHAT,\n      [ATTR_GEN_AI_REQUEST_MODEL]: response.request.commandInput.modelId,\n    };\n\n    const durationSecs =\n      hrTimeToMilliseconds(hrTimeDuration(startTime, hrTime())) / 1000;\n    this.operationDuration.record(durationSecs, sharedMetricAttrs);\n\n    if (usage) {\n      const { inputTokens, outputTokens } = usage;\n      if (inputTokens !== undefined) {\n        span.setAttribute(ATTR_GEN_AI_USAGE_INPUT_TOKENS, inputTokens);\n\n        this.tokenUsage.record(inputTokens, {\n          ...sharedMetricAttrs,\n          [ATTR_GEN_AI_TOKEN_TYPE]: GEN_AI_TOKEN_TYPE_VALUE_INPUT,\n        });\n      }\n      if (outputTokens !== undefined) {\n        span.setAttribute(ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, outputTokens);\n\n        this.tokenUsage.record(outputTokens, {\n          ...sharedMetricAttrs,\n          [ATTR_GEN_AI_TOKEN_TYPE]: GEN_AI_TOKEN_TYPE_VALUE_OUTPUT,\n        });\n      }\n    }\n  }\n\n  private responseHookInvokeModel(\n    response: NormalizedResponse,\n    span: Span,\n    tracer: Tracer,\n    config: AwsSdkInstrumentationConfig\n  ) {\n    const currentModelId = response.request.commandInput?.modelId;\n    if (response.data?.body) {\n      const decodedResponseBody = new TextDecoder().decode(response.data.body);\n      const responseBody = JSON.parse(decodedResponseBody);\n      if (currentModelId.includes('amazon.titan')) {\n        if (responseBody.inputTextTokenCount !== undefined) {\n          span.setAttribute(\n            ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n            responseBody.inputTextTokenCount\n          );\n        }\n        if (responseBody.results?.[0]?.tokenCount !== undefined) {\n          span.setAttribute(\n            ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n            responseBody.results[0].tokenCount\n          );\n        }\n        if (responseBody.results?.[0]?.completionReason !== undefined) {\n          span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n            responseBody.results[0].completionReason,\n          ]);\n        }\n      } else if (currentModelId.includes('amazon.nova')) {\n        if (responseBody.usage !== undefined) {\n          if (responseBody.usage.inputTokens !== undefined) {\n            span.setAttribute(\n              ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n              responseBody.usage.inputTokens\n            );\n          }\n          if (responseBody.usage.outputTokens !== undefined) {\n            span.setAttribute(\n              ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n              responseBody.usage.outputTokens\n            );\n          }\n        }\n        if (responseBody.stopReason !== undefined) {\n          span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n            responseBody.stopReason,\n          ]);\n        }\n      } else if (currentModelId.includes('anthropic.claude')) {\n        if (responseBody.usage?.input_tokens !== undefined) {\n          span.setAttribute(\n            ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n            responseBody.usage.input_tokens\n          );\n        }\n        if (responseBody.usage?.output_tokens !== undefined) {\n          span.setAttribute(\n            ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n            responseBody.usage.output_tokens\n          );\n        }\n        if (responseBody.stop_reason !== undefined) {\n          span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n            responseBody.stop_reason,\n          ]);\n        }\n      } else if (currentModelId.includes('meta.llama')) {\n        if (responseBody.prompt_token_count !== undefined) {\n          span.setAttribute(\n            ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n            responseBody.prompt_token_count\n          );\n        }\n        if (responseBody.generation_token_count !== undefined) {\n          span.setAttribute(\n            ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n            responseBody.generation_token_count\n          );\n        }\n        if (responseBody.stop_reason !== undefined) {\n          span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n            responseBody.stop_reason,\n          ]);\n        }\n      } else if (currentModelId.includes('cohere.command-r')) {\n        if (responseBody.text !== undefined) {\n          // NOTE: We approximate the token count since this value is not directly available in the body\n          // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n          // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n          span.setAttribute(\n            ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n            Math.ceil(responseBody.text.length / 6)\n          );\n        }\n        if (responseBody.finish_reason !== undefined) {\n          span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n            responseBody.finish_reason,\n          ]);\n        }\n      } else if (currentModelId.includes('cohere.command')) {\n        if (responseBody.generations?.[0]?.text !== undefined) {\n          span.setAttribute(\n            ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n            // NOTE: We approximate the token count since this value is not directly available in the body\n            // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n            // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n            Math.ceil(responseBody.generations[0].text.length / 6)\n          );\n        }\n        if (responseBody.generations?.[0]?.finish_reason !== undefined) {\n          span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n            responseBody.generations[0].finish_reason,\n          ]);\n        }\n      } else if (currentModelId.includes('mistral')) {\n        if (responseBody.outputs?.[0]?.text !== undefined) {\n          span.setAttribute(\n            ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n            // NOTE: We approximate the token count since this value is not directly available in the body\n            // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n            // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n            Math.ceil(responseBody.outputs[0].text.length / 6)\n          );\n        }\n        if (responseBody.outputs?.[0]?.stop_reason !== undefined) {\n          span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n            responseBody.outputs[0].stop_reason,\n          ]);\n        }\n      }\n    }\n  }\n\n  private async responseHookInvokeModelWithResponseStream(\n    response: NormalizedResponse,\n    span: Span,\n    tracer: Tracer,\n    config: AwsSdkInstrumentationConfig\n  ): Promise<any> {\n    const stream = response.data?.body;\n    const modelId = response.request.commandInput?.modelId;\n    if (!stream || !modelId) return;\n\n    // Replace the original response body with our instrumented stream.\n    // - Defers span.end() until the entire stream is consumed\n    // This ensures downstream consumers still receive the full stream correctly,\n    // while OpenTelemetry can record span attributes from streamed data.\n    response.data.body = async function* (\n      this: BedrockRuntimeServiceExtension\n    ) {\n      try {\n        for await (const chunk of stream) {\n          const parsedChunk = this.parseChunk(chunk?.chunk?.bytes);\n\n          if (!parsedChunk) {\n            // pass through\n          } else if (modelId.includes('amazon.titan')) {\n            BedrockRuntimeServiceExtension.recordTitanAttributes(\n              parsedChunk,\n              span\n            );\n          } else if (modelId.includes('anthropic.claude')) {\n            BedrockRuntimeServiceExtension.recordClaudeAttributes(\n              parsedChunk,\n              span\n            );\n          } else if (modelId.includes('amazon.nova')) {\n            BedrockRuntimeServiceExtension.recordNovaAttributes(\n              parsedChunk,\n              span\n            );\n          } else if (modelId.includes('meta.llama')) {\n            BedrockRuntimeServiceExtension.recordLlamaAttributes(\n              parsedChunk,\n              span\n            );\n          } else if (modelId.includes('cohere.command-r')) {\n            BedrockRuntimeServiceExtension.recordCohereRAttributes(\n              parsedChunk,\n              span\n            );\n          } else if (modelId.includes('cohere.command')) {\n            BedrockRuntimeServiceExtension.recordCohereAttributes(\n              parsedChunk,\n              span\n            );\n          } else if (modelId.includes('mistral')) {\n            BedrockRuntimeServiceExtension.recordMistralAttributes(\n              parsedChunk,\n              span\n            );\n          }\n          yield chunk;\n        }\n      } finally {\n        span.end();\n      }\n    }.bind(this)();\n    return response.data;\n  }\n\n  private parseChunk(bytes?: Uint8Array): any {\n    if (!bytes || !(bytes instanceof Uint8Array)) return null;\n    try {\n      const str = Buffer.from(bytes).toString('utf-8');\n      return JSON.parse(str);\n    } catch (err) {\n      this._diag.warn('Failed to parse streamed chunk', err);\n      return null;\n    }\n  }\n\n  private static recordNovaAttributes(parsedChunk: any, span: Span) {\n    if (parsedChunk.metadata?.usage !== undefined) {\n      if (parsedChunk.metadata?.usage.inputTokens !== undefined) {\n        span.setAttribute(\n          ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n          parsedChunk.metadata.usage.inputTokens\n        );\n      }\n      if (parsedChunk.metadata?.usage.outputTokens !== undefined) {\n        span.setAttribute(\n          ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n          parsedChunk.metadata.usage.outputTokens\n        );\n      }\n    }\n    if (parsedChunk.messageStop?.stopReason !== undefined) {\n      span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n        parsedChunk.messageStop.stopReason,\n      ]);\n    }\n  }\n\n  private static recordClaudeAttributes(parsedChunk: any, span: Span) {\n    if (parsedChunk.message?.usage?.input_tokens !== undefined) {\n      span.setAttribute(\n        ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n        parsedChunk.message.usage.input_tokens\n      );\n    }\n    if (parsedChunk.message?.usage?.output_tokens !== undefined) {\n      span.setAttribute(\n        ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n        parsedChunk.message.usage.output_tokens\n      );\n    }\n    if (parsedChunk.delta?.stop_reason !== undefined) {\n      span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n        parsedChunk.delta.stop_reason,\n      ]);\n    }\n  }\n\n  private static recordTitanAttributes(parsedChunk: any, span: Span) {\n    if (parsedChunk.inputTextTokenCount !== undefined) {\n      span.setAttribute(\n        ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n        parsedChunk.inputTextTokenCount\n      );\n    }\n    if (parsedChunk.totalOutputTextTokenCount !== undefined) {\n      span.setAttribute(\n        ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n        parsedChunk.totalOutputTextTokenCount\n      );\n    }\n    if (parsedChunk.completionReason !== undefined) {\n      span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n        parsedChunk.completionReason,\n      ]);\n    }\n  }\n  private static recordLlamaAttributes(parsedChunk: any, span: Span) {\n    if (parsedChunk.prompt_token_count !== undefined) {\n      span.setAttribute(\n        ATTR_GEN_AI_USAGE_INPUT_TOKENS,\n        parsedChunk.prompt_token_count\n      );\n    }\n    if (parsedChunk.generation_token_count !== undefined) {\n      span.setAttribute(\n        ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n        parsedChunk.generation_token_count\n      );\n    }\n    if (parsedChunk.stop_reason !== undefined) {\n      span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n        parsedChunk.stop_reason,\n      ]);\n    }\n  }\n\n  private static recordMistralAttributes(parsedChunk: any, span: Span) {\n    if (parsedChunk.outputs?.[0]?.text !== undefined) {\n      span.setAttribute(\n        ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n        // NOTE: We approximate the token count since this value is not directly available in the body\n        // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n        // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n        Math.ceil(parsedChunk.outputs[0].text.length / 6)\n      );\n    }\n    if (parsedChunk.outputs?.[0]?.stop_reason !== undefined) {\n      span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n        parsedChunk.outputs[0].stop_reason,\n      ]);\n    }\n  }\n\n  private static recordCohereAttributes(parsedChunk: any, span: Span) {\n    if (parsedChunk.generations?.[0]?.text !== undefined) {\n      span.setAttribute(\n        ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n        // NOTE: We approximate the token count since this value is not directly available in the body\n        // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n        // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n        Math.ceil(parsedChunk.generations[0].text.length / 6)\n      );\n    }\n    if (parsedChunk.generations?.[0]?.finish_reason !== undefined) {\n      span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n        parsedChunk.generations[0].finish_reason,\n      ]);\n    }\n  }\n\n  private static recordCohereRAttributes(parsedChunk: any, span: Span) {\n    if (parsedChunk.text !== undefined) {\n      // NOTE: We approximate the token count since this value is not directly available in the body\n      // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.\n      // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html\n      span.setAttribute(\n        ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,\n        Math.ceil(parsedChunk.text.length / 6)\n      );\n    }\n    if (parsedChunk.finish_reason !== undefined) {\n      span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [\n        parsedChunk.finish_reason,\n      ]);\n    }\n  }\n}\n"]}