@traceloop/instrumentation-bedrock 0.22.2 → 0.22.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,8 +4,9 @@ var tslib = require('tslib');
4
4
  var api = require('@opentelemetry/api');
5
5
  var instrumentation = require('@opentelemetry/instrumentation');
6
6
  var aiSemanticConventions = require('@traceloop/ai-semantic-conventions');
7
+ var incubating = require('@opentelemetry/semantic-conventions/incubating');
7
8
 
8
- var version = "0.22.2";
9
+ var version = "0.22.6";
9
10
 
10
11
  class BedrockInstrumentation extends instrumentation.InstrumentationBase {
11
12
  constructor(config = {}) {
@@ -83,9 +84,9 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
83
84
  const input = params.input;
84
85
  const { modelVendor, model } = this._extractVendorAndModel(input.modelId || "");
85
86
  attributes = {
86
- [aiSemanticConventions.SpanAttributes.LLM_SYSTEM]: "AWS",
87
- [aiSemanticConventions.SpanAttributes.LLM_REQUEST_MODEL]: model,
88
- [aiSemanticConventions.SpanAttributes.LLM_RESPONSE_MODEL]: input.modelId,
87
+ [incubating.ATTR_GEN_AI_SYSTEM]: "AWS",
88
+ [incubating.ATTR_GEN_AI_REQUEST_MODEL]: model,
89
+ [incubating.ATTR_GEN_AI_RESPONSE_MODEL]: input.modelId,
89
90
  [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TYPE]: aiSemanticConventions.LLMRequestTypeValues.COMPLETION,
90
91
  };
91
92
  if (typeof input.body === "string") {
@@ -111,10 +112,10 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
111
112
  const attributes = "attributes" in span
112
113
  ? span["attributes"]
113
114
  : {};
114
- if (aiSemanticConventions.SpanAttributes.LLM_SYSTEM in attributes) {
115
- const modelId = attributes[aiSemanticConventions.SpanAttributes.LLM_RESPONSE_MODEL];
115
+ if (incubating.ATTR_GEN_AI_SYSTEM in attributes) {
116
+ const modelId = attributes[incubating.ATTR_GEN_AI_RESPONSE_MODEL];
116
117
  const { modelVendor, model } = this._extractVendorAndModel(modelId);
117
- span.setAttribute(aiSemanticConventions.SpanAttributes.LLM_RESPONSE_MODEL, model);
118
+ span.setAttribute(incubating.ATTR_GEN_AI_RESPONSE_MODEL, model);
118
119
  if (!(result.body instanceof Object.getPrototypeOf(Uint8Array))) {
119
120
  const rawRes = result.body;
120
121
  let streamedContent = "";
@@ -128,8 +129,8 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
128
129
  // Parse the JSON string
129
130
  const parsedResponse = JSON.parse(jsonString);
130
131
  if ("amazon-bedrock-invocationMetrics" in parsedResponse) {
131
- span.setAttribute(aiSemanticConventions.SpanAttributes.LLM_USAGE_PROMPT_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"]);
132
- span.setAttribute(aiSemanticConventions.SpanAttributes.LLM_USAGE_COMPLETION_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
132
+ span.setAttribute(incubating.ATTR_GEN_AI_USAGE_PROMPT_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"]);
133
+ span.setAttribute(incubating.ATTR_GEN_AI_USAGE_COMPLETION_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
133
134
  span.setAttribute(aiSemanticConventions.SpanAttributes.LLM_USAGE_TOTAL_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"] +
134
135
  parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
135
136
  }
@@ -138,9 +139,9 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
138
139
  if (this._shouldSendPrompts()) {
139
140
  // Update local value with attribute value that was set by _setResponseAttributes
140
141
  streamedContent +=
141
- responseAttributes[`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.content`];
142
+ responseAttributes[`${incubating.ATTR_GEN_AI_COMPLETION}.0.content`];
142
143
  // re-assign the new value to responseAttributes
143
- responseAttributes = Object.assign(Object.assign({}, responseAttributes), { [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.content`]: streamedContent });
144
+ responseAttributes = Object.assign(Object.assign({}, responseAttributes), { [`${incubating.ATTR_GEN_AI_COMPLETION}.0.content`]: streamedContent });
144
145
  }
145
146
  span.setAttributes(responseAttributes);
146
147
  }
@@ -175,27 +176,27 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
175
176
  _setRequestAttributes(vendor, requestBody) {
176
177
  switch (vendor) {
177
178
  case "ai21": {
178
- return Object.assign({ [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["topP"], [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["temperature"], [aiSemanticConventions.SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["maxTokens"], [aiSemanticConventions.SpanAttributes.LLM_PRESENCE_PENALTY]: requestBody["presencePenalty"]["scale"], [aiSemanticConventions.SpanAttributes.LLM_FREQUENCY_PENALTY]: requestBody["frequencyPenalty"]["scale"] }, (this._shouldSendPrompts()
179
+ return Object.assign({ [incubating.ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["topP"], [incubating.ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["temperature"], [incubating.ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["maxTokens"], [aiSemanticConventions.SpanAttributes.LLM_PRESENCE_PENALTY]: requestBody["presencePenalty"]["scale"], [aiSemanticConventions.SpanAttributes.LLM_FREQUENCY_PENALTY]: requestBody["frequencyPenalty"]["scale"] }, (this._shouldSendPrompts()
179
180
  ? {
180
- [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.role`]: "user",
181
- [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["prompt"],
181
+ [`${incubating.ATTR_GEN_AI_PROMPT}.0.role`]: "user",
182
+ [`${incubating.ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["prompt"],
182
183
  }
183
184
  : {}));
184
185
  }
185
186
  case "amazon": {
186
- return Object.assign({ [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["textGenerationConfig"]["topP"], [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["textGenerationConfig"]["temperature"], [aiSemanticConventions.SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["textGenerationConfig"]["maxTokenCount"] }, (this._shouldSendPrompts()
187
+ return Object.assign({ [incubating.ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["textGenerationConfig"]["topP"], [incubating.ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["textGenerationConfig"]["temperature"], [incubating.ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["textGenerationConfig"]["maxTokenCount"] }, (this._shouldSendPrompts()
187
188
  ? {
188
- [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.role`]: "user",
189
- [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["inputText"],
189
+ [`${incubating.ATTR_GEN_AI_PROMPT}.0.role`]: "user",
190
+ [`${incubating.ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["inputText"],
190
191
  }
191
192
  : {}));
192
193
  }
193
194
  case "anthropic": {
194
195
  const baseAttributes = {
195
- [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["top_p"],
196
+ [incubating.ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["top_p"],
196
197
  [aiSemanticConventions.SpanAttributes.LLM_TOP_K]: requestBody["top_k"],
197
- [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["temperature"],
198
- [aiSemanticConventions.SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["max_tokens_to_sample"] || requestBody["max_tokens"],
198
+ [incubating.ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["temperature"],
199
+ [incubating.ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["max_tokens_to_sample"] || requestBody["max_tokens"],
199
200
  };
200
201
  if (!this._shouldSendPrompts()) {
201
202
  return baseAttributes;
@@ -204,9 +205,9 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
204
205
  if (requestBody["messages"]) {
205
206
  const promptAttributes = {};
206
207
  requestBody["messages"].forEach((message, index) => {
207
- promptAttributes[`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.${index}.role`] =
208
+ promptAttributes[`${incubating.ATTR_GEN_AI_PROMPT}.${index}.role`] =
208
209
  message.role;
209
- promptAttributes[`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.${index}.content`] =
210
+ promptAttributes[`${incubating.ATTR_GEN_AI_PROMPT}.${index}.content`] =
210
211
  typeof message.content === "string"
211
212
  ? message.content
212
213
  : JSON.stringify(message.content);
@@ -215,7 +216,7 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
215
216
  }
216
217
  // Handle legacy prompt format
217
218
  if (requestBody["prompt"]) {
218
- return Object.assign(Object.assign({}, baseAttributes), { [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.role`]: "user", [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["prompt"]
219
+ return Object.assign(Object.assign({}, baseAttributes), { [`${incubating.ATTR_GEN_AI_PROMPT}.0.role`]: "user", [`${incubating.ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["prompt"]
219
220
  // The format is removing when we are setting span attribute
220
221
  .replace("\n\nHuman:", "")
221
222
  .replace("\n\nAssistant:", "") });
@@ -223,18 +224,18 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
223
224
  return baseAttributes;
224
225
  }
225
226
  case "cohere": {
226
- return Object.assign({ [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["p"], [aiSemanticConventions.SpanAttributes.LLM_TOP_K]: requestBody["k"], [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["temperature"], [aiSemanticConventions.SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["max_tokens"] }, (this._shouldSendPrompts()
227
+ return Object.assign({ [incubating.ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["p"], [aiSemanticConventions.SpanAttributes.LLM_TOP_K]: requestBody["k"], [incubating.ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["temperature"], [incubating.ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["max_tokens"] }, (this._shouldSendPrompts()
227
228
  ? {
228
- [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.role`]: "user",
229
- [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["message"] || requestBody["prompt"],
229
+ [`${incubating.ATTR_GEN_AI_PROMPT}.0.role`]: "user",
230
+ [`${incubating.ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["message"] || requestBody["prompt"],
230
231
  }
231
232
  : {}));
232
233
  }
233
234
  case "meta": {
234
- return Object.assign({ [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["top_p"], [aiSemanticConventions.SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["temperature"], [aiSemanticConventions.SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["max_gen_len"] }, (this._shouldSendPrompts()
235
+ return Object.assign({ [incubating.ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["top_p"], [incubating.ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["temperature"], [incubating.ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["max_gen_len"] }, (this._shouldSendPrompts()
235
236
  ? {
236
- [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.role`]: "user",
237
- [`${aiSemanticConventions.SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["prompt"],
237
+ [`${incubating.ATTR_GEN_AI_PROMPT}.0.role`]: "user",
238
+ [`${incubating.ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["prompt"],
238
239
  }
239
240
  : {}));
240
241
  }
@@ -246,16 +247,16 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
246
247
  var _a, _b, _c, _d;
247
248
  switch (vendor) {
248
249
  case "ai21": {
249
- return Object.assign({ [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: response["completions"][0]["finishReason"]["reason"], [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant" }, (this._shouldSendPrompts()
250
+ return Object.assign({ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: response["completions"][0]["finishReason"]["reason"], [`${incubating.ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant" }, (this._shouldSendPrompts()
250
251
  ? {
251
- [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.content`]: response["completions"][0]["data"]["text"],
252
+ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.content`]: response["completions"][0]["data"]["text"],
252
253
  }
253
254
  : {}));
254
255
  }
255
256
  case "amazon": {
256
- return Object.assign({ [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: isStream
257
+ return Object.assign({ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: isStream
257
258
  ? response["completionReason"]
258
- : response["results"][0]["completionReason"], [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant", [aiSemanticConventions.SpanAttributes.LLM_USAGE_PROMPT_TOKENS]: response["inputTextTokenCount"], [aiSemanticConventions.SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: isStream
259
+ : response["results"][0]["completionReason"], [`${incubating.ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant", [incubating.ATTR_GEN_AI_USAGE_PROMPT_TOKENS]: response["inputTextTokenCount"], [incubating.ATTR_GEN_AI_USAGE_COMPLETION_TOKENS]: isStream
259
260
  ? response["totalOutputTextTokenCount"]
260
261
  : response["results"][0]["tokenCount"], [aiSemanticConventions.SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: isStream
261
262
  ? response["inputTextTokenCount"] +
@@ -263,7 +264,7 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
263
264
  : response["inputTextTokenCount"] +
264
265
  response["results"][0]["tokenCount"] }, (this._shouldSendPrompts()
265
266
  ? {
266
- [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.content`]: isStream
267
+ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.content`]: isStream
267
268
  ? response["outputText"]
268
269
  : response["results"][0]["outputText"],
269
270
  }
@@ -271,8 +272,8 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
271
272
  }
272
273
  case "anthropic": {
273
274
  const baseAttributes = {
274
- [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: response["stop_reason"],
275
- [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant",
275
+ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: response["stop_reason"],
276
+ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant",
276
277
  };
277
278
  if (!this._shouldSendPrompts()) {
278
279
  return baseAttributes;
@@ -282,32 +283,32 @@ class BedrockInstrumentation extends instrumentation.InstrumentationBase {
282
283
  const content = Array.isArray(response["content"])
283
284
  ? response["content"].map((c) => c.text || c).join("")
284
285
  : response["content"];
285
- return Object.assign(Object.assign({}, baseAttributes), { [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.content`]: content });
286
+ return Object.assign(Object.assign({}, baseAttributes), { [`${incubating.ATTR_GEN_AI_COMPLETION}.0.content`]: content });
286
287
  }
287
288
  // Handle legacy completion format
288
289
  if (response["completion"]) {
289
- return Object.assign(Object.assign({}, baseAttributes), { [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.content`]: response["completion"] });
290
+ return Object.assign(Object.assign({}, baseAttributes), { [`${incubating.ATTR_GEN_AI_COMPLETION}.0.content`]: response["completion"] });
290
291
  }
291
292
  return baseAttributes;
292
293
  }
293
294
  case "cohere": {
294
- const baseAttributes = Object.assign({ [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: (_b = (_a = response["generations"]) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b["finish_reason"], [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant" }, (this._shouldSendPrompts()
295
+ const baseAttributes = Object.assign({ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: (_b = (_a = response["generations"]) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b["finish_reason"], [`${incubating.ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant" }, (this._shouldSendPrompts()
295
296
  ? {
296
- [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.content`]: (_d = (_c = response["generations"]) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d["text"],
297
+ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.content`]: (_d = (_c = response["generations"]) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d["text"],
297
298
  }
298
299
  : {}));
299
300
  // Add token usage if available
300
301
  if (response["meta"] && response["meta"]["billed_units"]) {
301
302
  const billedUnits = response["meta"]["billed_units"];
302
- return Object.assign(Object.assign({}, baseAttributes), { [aiSemanticConventions.SpanAttributes.LLM_USAGE_PROMPT_TOKENS]: billedUnits["input_tokens"], [aiSemanticConventions.SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: billedUnits["output_tokens"], [aiSemanticConventions.SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: (billedUnits["input_tokens"] || 0) +
303
+ return Object.assign(Object.assign({}, baseAttributes), { [incubating.ATTR_GEN_AI_USAGE_PROMPT_TOKENS]: billedUnits["input_tokens"], [incubating.ATTR_GEN_AI_USAGE_COMPLETION_TOKENS]: billedUnits["output_tokens"], [aiSemanticConventions.SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: (billedUnits["input_tokens"] || 0) +
303
304
  (billedUnits["output_tokens"] || 0) });
304
305
  }
305
306
  return baseAttributes;
306
307
  }
307
308
  case "meta": {
308
- return Object.assign({ [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: response["stop_reason"], [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant", [aiSemanticConventions.SpanAttributes.LLM_USAGE_PROMPT_TOKENS]: response["prompt_token_count"], [aiSemanticConventions.SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: response["generation_token_count"], [aiSemanticConventions.SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: response["prompt_token_count"] + response["generation_token_count"] }, (this._shouldSendPrompts()
309
+ return Object.assign({ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: response["stop_reason"], [`${incubating.ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant", [incubating.ATTR_GEN_AI_USAGE_PROMPT_TOKENS]: response["prompt_token_count"], [incubating.ATTR_GEN_AI_USAGE_COMPLETION_TOKENS]: response["generation_token_count"], [aiSemanticConventions.SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: response["prompt_token_count"] + response["generation_token_count"] }, (this._shouldSendPrompts()
309
310
  ? {
310
- [`${aiSemanticConventions.SpanAttributes.LLM_COMPLETIONS}.0.content`]: response["generation"],
311
+ [`${incubating.ATTR_GEN_AI_COMPLETION}.0.content`]: response["generation"],
311
312
  }
312
313
  : {}));
313
314
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/instrumentation.ts"],"sourcesContent":["/*\n * Copyright Traceloop\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Span,\n Attributes,\n SpanKind,\n SpanStatusCode,\n context,\n trace,\n} from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n safeExecuteInTheMiddle,\n} from \"@opentelemetry/instrumentation\";\nimport { BedrockInstrumentationConfig } from \"./types\";\nimport type * as bedrock from \"@aws-sdk/client-bedrock-runtime\";\nimport {\n CONTEXT_KEY_ALLOW_TRACE_CONTENT,\n LLMRequestTypeValues,\n SpanAttributes,\n} from \"@traceloop/ai-semantic-conventions\";\nimport { version } from \"../package.json\";\n\nexport class BedrockInstrumentation extends InstrumentationBase {\n declare protected _config: BedrockInstrumentationConfig;\n\n constructor(config: BedrockInstrumentationConfig = {}) {\n super(\"@traceloop/instrumentation-bedrock\", version, config);\n }\n\n public override setConfig(config: BedrockInstrumentationConfig = {}) {\n super.setConfig(config);\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@aws-sdk/client-bedrock-runtime\",\n [\">=3.499.0\"],\n this.wrap.bind(this),\n this.unwrap.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(module: typeof bedrock) {\n this._diag.debug(`Patching @aws-sdk/client-bedrock-runtime manually`);\n\n this._wrap(\n module.BedrockRuntimeClient.prototype,\n \"send\",\n this.wrapperMethod(),\n );\n }\n\n private wrap(module: typeof bedrock, moduleVersion?: string) {\n this._diag.debug(\n `Patching @aws-sdk/client-bedrock-runtime@${moduleVersion}`,\n );\n\n this._wrap(\n module.BedrockRuntimeClient.prototype,\n \"send\",\n this.wrapperMethod(),\n );\n\n return module;\n }\n\n private unwrap(module: typeof bedrock, moduleVersion?: string) {\n this._diag.debug(\n `Unpatching @aws-sdk/client-bedrock-runtime@${moduleVersion}`,\n );\n\n this._unwrap(module.BedrockRuntimeClient.prototype, \"send\");\n }\n\n private wrapperMethod() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const plugin = this;\n // eslint-disable-next-line\n return (original: Function) => {\n return function method(this: any, ...args: any) {\n const span = plugin._startSpan({\n params: args[0],\n });\n const execContext = trace.setSpan(context.active(), span);\n const execPromise = safeExecuteInTheMiddle(\n () => {\n return context.with(execContext, () => {\n return original.apply(this, args);\n });\n },\n (e) => {\n if (e) {\n plugin._diag.error(`Error in bedrock instrumentation`, e);\n }\n },\n );\n const wrappedPromise = plugin._wrapPromise(span, execPromise);\n return context.bind(execContext, wrappedPromise);\n };\n };\n }\n private _wrapPromise<T>(span: Span, promise: Promise<T>): Promise<T> {\n return promise\n .then(async (result) => {\n await this._endSpan({\n span,\n result: result as\n | bedrock.InvokeModelCommandOutput\n | bedrock.InvokeModelWithResponseStreamCommandOutput,\n });\n\n return new Promise<T>((resolve) => resolve(result));\n })\n .catch((error: Error) => {\n return new Promise<T>((_, reject) => {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n\n reject(error);\n });\n });\n }\n\n private _startSpan({\n params,\n }: {\n params: Parameters<bedrock.BedrockRuntimeClient[\"send\"]>[0];\n }): Span {\n let attributes: Attributes = {};\n\n try {\n const input = params.input as bedrock.InvokeModelCommandInput;\n const { modelVendor, model } = this._extractVendorAndModel(\n input.modelId || \"\",\n );\n\n attributes = {\n [SpanAttributes.LLM_SYSTEM]: \"AWS\",\n [SpanAttributes.LLM_REQUEST_MODEL]: model,\n [SpanAttributes.LLM_RESPONSE_MODEL]: input.modelId,\n [SpanAttributes.LLM_REQUEST_TYPE]: LLMRequestTypeValues.COMPLETION,\n };\n\n if (typeof input.body === \"string\") {\n const requestBody = JSON.parse(input.body);\n\n attributes = {\n ...attributes,\n ...this._setRequestAttributes(modelVendor, requestBody),\n };\n }\n } catch (e) {\n this._diag.debug(e);\n this._config.exceptionLogger?.(e);\n }\n\n return this.tracer.startSpan(`bedrock.completion`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n }\n\n private async _endSpan({\n span,\n result,\n }: {\n span: Span;\n result:\n | bedrock.InvokeModelCommandOutput\n | bedrock.InvokeModelWithResponseStreamCommandOutput;\n }) {\n try {\n if (\"body\" in result) {\n const attributes =\n \"attributes\" in span\n ? (span[\"attributes\"] as Record<string, any>)\n : {};\n\n if (SpanAttributes.LLM_SYSTEM in attributes) {\n const modelId = attributes[\n SpanAttributes.LLM_RESPONSE_MODEL\n ] as string;\n const { modelVendor, model } = this._extractVendorAndModel(modelId);\n\n span.setAttribute(SpanAttributes.LLM_RESPONSE_MODEL, model);\n\n if (!(result.body instanceof Object.getPrototypeOf(Uint8Array))) {\n const rawRes = result.body as AsyncIterable<bedrock.ResponseStream>;\n\n let streamedContent = \"\";\n for await (const value of rawRes) {\n // Convert it to a JSON String\n const jsonString = new TextDecoder().decode(value.chunk?.bytes);\n // Parse the JSON string\n const parsedResponse = JSON.parse(jsonString);\n\n if (\"amazon-bedrock-invocationMetrics\" in parsedResponse) {\n span.setAttribute(\n SpanAttributes.LLM_USAGE_PROMPT_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"inputTokenCount\"\n ],\n );\n span.setAttribute(\n SpanAttributes.LLM_USAGE_COMPLETION_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"outputTokenCount\"\n ],\n );\n\n span.setAttribute(\n SpanAttributes.LLM_USAGE_TOTAL_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"inputTokenCount\"\n ] +\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"outputTokenCount\"\n ],\n );\n }\n\n let responseAttributes = this._setResponseAttributes(\n modelVendor,\n parsedResponse,\n true,\n );\n\n // ! NOTE: This make sure the content always have all streamed chunks\n if (this._shouldSendPrompts()) {\n // Update local value with attribute value that was set by _setResponseAttributes\n streamedContent +=\n responseAttributes[\n `${SpanAttributes.LLM_COMPLETIONS}.0.content`\n ];\n // re-assign the new value to responseAttributes\n responseAttributes = {\n ...responseAttributes,\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n streamedContent,\n };\n }\n\n span.setAttributes(responseAttributes);\n }\n } else if (result.body instanceof Object.getPrototypeOf(Uint8Array)) {\n // Convert it to a JSON String\n const jsonString = new TextDecoder().decode(\n result.body as Uint8Array,\n );\n // Parse the JSON string\n const parsedResponse = JSON.parse(jsonString);\n\n const responseAttributes = this._setResponseAttributes(\n modelVendor,\n parsedResponse,\n );\n\n span.setAttributes(responseAttributes);\n }\n }\n }\n } catch (e) {\n this._diag.debug(e);\n this._config.exceptionLogger?.(e);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n\n private _setRequestAttributes(\n vendor: string,\n requestBody: Record<string, any>,\n ) {\n switch (vendor) {\n case \"ai21\": {\n return {\n [SpanAttributes.LLM_REQUEST_TOP_P]: requestBody[\"topP\"],\n [SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody[\"maxTokens\"],\n [SpanAttributes.LLM_PRESENCE_PENALTY]:\n requestBody[\"presencePenalty\"][\"scale\"],\n [SpanAttributes.LLM_FREQUENCY_PENALTY]:\n requestBody[\"frequencyPenalty\"][\"scale\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n case \"amazon\": {\n return {\n [SpanAttributes.LLM_REQUEST_TOP_P]:\n requestBody[\"textGenerationConfig\"][\"topP\"],\n [SpanAttributes.LLM_REQUEST_TEMPERATURE]:\n requestBody[\"textGenerationConfig\"][\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]:\n requestBody[\"textGenerationConfig\"][\"maxTokenCount\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"inputText\"],\n }\n : {}),\n };\n }\n case \"anthropic\": {\n const baseAttributes = {\n [SpanAttributes.LLM_REQUEST_TOP_P]: requestBody[\"top_p\"],\n [SpanAttributes.LLM_TOP_K]: requestBody[\"top_k\"],\n [SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]:\n requestBody[\"max_tokens_to_sample\"] || requestBody[\"max_tokens\"],\n };\n\n if (!this._shouldSendPrompts()) {\n return baseAttributes;\n }\n\n // Handle new messages API format (used by langchain)\n if (requestBody[\"messages\"]) {\n const promptAttributes: Record<string, any> = {};\n requestBody[\"messages\"].forEach((message: any, index: number) => {\n promptAttributes[`${SpanAttributes.LLM_PROMPTS}.${index}.role`] =\n message.role;\n promptAttributes[`${SpanAttributes.LLM_PROMPTS}.${index}.content`] =\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content);\n });\n return { ...baseAttributes, ...promptAttributes };\n }\n\n // Handle legacy prompt format\n if (requestBody[\"prompt\"]) {\n return {\n ...baseAttributes,\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody[\"prompt\"]\n // The format is removing when we are setting span attribute\n .replace(\"\\n\\nHuman:\", \"\")\n .replace(\"\\n\\nAssistant:\", \"\"),\n };\n }\n\n return baseAttributes;\n }\n case \"cohere\": {\n return {\n [SpanAttributes.LLM_REQUEST_TOP_P]: requestBody[\"p\"],\n [SpanAttributes.LLM_TOP_K]: requestBody[\"k\"],\n [SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody[\"max_tokens\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"message\"] || requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n case \"meta\": {\n return {\n [SpanAttributes.LLM_REQUEST_TOP_P]: requestBody[\"top_p\"],\n [SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody[\"temperature\"],\n [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody[\"max_gen_len\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_PROMPTS}.0.role`]: \"user\",\n [`${SpanAttributes.LLM_PROMPTS}.0.content`]:\n requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n default:\n return {};\n }\n }\n\n private _setResponseAttributes(\n vendor: string,\n response: Record<string, any>,\n isStream = false,\n ) {\n switch (vendor) {\n case \"ai21\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"completions\"][0][\"finishReason\"][\"reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"completions\"][0][\"data\"][\"text\"],\n }\n : {}),\n };\n }\n case \"amazon\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: isStream\n ? response[\"completionReason\"]\n : response[\"results\"][0][\"completionReason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]:\n response[\"inputTextTokenCount\"],\n [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: isStream\n ? response[\"totalOutputTextTokenCount\"]\n : response[\"results\"][0][\"tokenCount\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: isStream\n ? response[\"inputTextTokenCount\"] +\n response[\"totalOutputTextTokenCount\"]\n : response[\"inputTextTokenCount\"] +\n response[\"results\"][0][\"tokenCount\"],\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: isStream\n ? response[\"outputText\"]\n : response[\"results\"][0][\"outputText\"],\n }\n : {}),\n };\n }\n case \"anthropic\": {\n const baseAttributes = {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"stop_reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n };\n\n if (!this._shouldSendPrompts()) {\n return baseAttributes;\n }\n\n // Handle new messages API format response\n if (response[\"content\"]) {\n const content = Array.isArray(response[\"content\"])\n ? response[\"content\"].map((c: any) => c.text || c).join(\"\")\n : response[\"content\"];\n return {\n ...baseAttributes,\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: content,\n };\n }\n\n // Handle legacy completion format\n if (response[\"completion\"]) {\n return {\n ...baseAttributes,\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"completion\"],\n };\n }\n\n return baseAttributes;\n }\n case \"cohere\": {\n const baseAttributes = {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"generations\"]?.[0]?.[\"finish_reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"generations\"]?.[0]?.[\"text\"],\n }\n : {}),\n };\n\n // Add token usage if available\n if (response[\"meta\"] && response[\"meta\"][\"billed_units\"]) {\n const billedUnits = response[\"meta\"][\"billed_units\"];\n return {\n ...baseAttributes,\n [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]:\n billedUnits[\"input_tokens\"],\n [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]:\n billedUnits[\"output_tokens\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]:\n (billedUnits[\"input_tokens\"] || 0) +\n (billedUnits[\"output_tokens\"] || 0),\n };\n }\n\n return baseAttributes;\n }\n case \"meta\": {\n return {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]:\n response[\"stop_reason\"],\n [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: \"assistant\",\n [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]:\n response[\"prompt_token_count\"],\n [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]:\n response[\"generation_token_count\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]:\n response[\"prompt_token_count\"] + response[\"generation_token_count\"],\n ...(this._shouldSendPrompts()\n ? {\n [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]:\n response[\"generation\"],\n }\n : {}),\n };\n }\n default:\n return {};\n }\n }\n\n private _shouldSendPrompts() {\n const contextShouldSendPrompts = context\n .active()\n .getValue(CONTEXT_KEY_ALLOW_TRACE_CONTENT);\n\n if (contextShouldSendPrompts !== undefined) {\n return contextShouldSendPrompts;\n }\n\n return this._config.traceContent !== undefined\n ? this._config.traceContent\n : true;\n }\n\n private _extractVendorAndModel(modelId: string): {\n modelVendor: string;\n model: string;\n } {\n if (!modelId) {\n return { modelVendor: \"\", model: \"\" };\n }\n\n const parts = modelId.split(\".\");\n return {\n modelVendor: parts[0] || \"\",\n model: parts[1] || \"\",\n };\n }\n}\n"],"names":["InstrumentationBase","InstrumentationNodeModuleDefinition","trace","context","safeExecuteInTheMiddle","__awaiter","SpanStatusCode","SpanAttributes","LLMRequestTypeValues","SpanKind","__asyncValues","CONTEXT_KEY_ALLOW_TRACE_CONTENT"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/instrumentation.ts"],"sourcesContent":["/*\n * Copyright Traceloop\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Span,\n Attributes,\n SpanKind,\n SpanStatusCode,\n context,\n trace,\n} from \"@opentelemetry/api\";\nimport {\n InstrumentationBase,\n InstrumentationModuleDefinition,\n InstrumentationNodeModuleDefinition,\n safeExecuteInTheMiddle,\n} from \"@opentelemetry/instrumentation\";\nimport { BedrockInstrumentationConfig } from \"./types\";\nimport type * as bedrock from \"@aws-sdk/client-bedrock-runtime\";\nimport {\n CONTEXT_KEY_ALLOW_TRACE_CONTENT,\n LLMRequestTypeValues,\n SpanAttributes,\n} from \"@traceloop/ai-semantic-conventions\";\nimport {\n ATTR_GEN_AI_COMPLETION,\n ATTR_GEN_AI_PROMPT,\n ATTR_GEN_AI_REQUEST_MAX_TOKENS,\n ATTR_GEN_AI_REQUEST_MODEL,\n ATTR_GEN_AI_REQUEST_TEMPERATURE,\n ATTR_GEN_AI_REQUEST_TOP_P,\n ATTR_GEN_AI_RESPONSE_MODEL,\n ATTR_GEN_AI_SYSTEM,\n ATTR_GEN_AI_USAGE_COMPLETION_TOKENS,\n ATTR_GEN_AI_USAGE_PROMPT_TOKENS,\n} from \"@opentelemetry/semantic-conventions/incubating\";\nimport { version } from \"../package.json\";\n\nexport class BedrockInstrumentation extends InstrumentationBase {\n declare protected _config: BedrockInstrumentationConfig;\n\n constructor(config: BedrockInstrumentationConfig = {}) {\n super(\"@traceloop/instrumentation-bedrock\", version, config);\n }\n\n public override setConfig(config: BedrockInstrumentationConfig = {}) {\n super.setConfig(config);\n }\n\n protected init(): InstrumentationModuleDefinition {\n const module = new InstrumentationNodeModuleDefinition(\n \"@aws-sdk/client-bedrock-runtime\",\n [\">=3.499.0\"],\n this.wrap.bind(this),\n this.unwrap.bind(this),\n );\n\n return module;\n }\n\n public manuallyInstrument(module: typeof bedrock) {\n this._diag.debug(`Patching @aws-sdk/client-bedrock-runtime manually`);\n\n this._wrap(\n module.BedrockRuntimeClient.prototype,\n \"send\",\n this.wrapperMethod(),\n );\n }\n\n private wrap(module: typeof bedrock, moduleVersion?: string) {\n this._diag.debug(\n `Patching @aws-sdk/client-bedrock-runtime@${moduleVersion}`,\n );\n\n this._wrap(\n module.BedrockRuntimeClient.prototype,\n \"send\",\n this.wrapperMethod(),\n );\n\n return module;\n }\n\n private unwrap(module: typeof bedrock, moduleVersion?: string) {\n this._diag.debug(\n `Unpatching @aws-sdk/client-bedrock-runtime@${moduleVersion}`,\n );\n\n this._unwrap(module.BedrockRuntimeClient.prototype, \"send\");\n }\n\n private wrapperMethod() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const plugin = this;\n // eslint-disable-next-line\n return (original: Function) => {\n return function method(this: any, ...args: any) {\n const span = plugin._startSpan({\n params: args[0],\n });\n const execContext = trace.setSpan(context.active(), span);\n const execPromise = safeExecuteInTheMiddle(\n () => {\n return context.with(execContext, () => {\n return original.apply(this, args);\n });\n },\n (e) => {\n if (e) {\n plugin._diag.error(`Error in bedrock instrumentation`, e);\n }\n },\n );\n const wrappedPromise = plugin._wrapPromise(span, execPromise);\n return context.bind(execContext, wrappedPromise);\n };\n };\n }\n private _wrapPromise<T>(span: Span, promise: Promise<T>): Promise<T> {\n return promise\n .then(async (result) => {\n await this._endSpan({\n span,\n result: result as\n | bedrock.InvokeModelCommandOutput\n | bedrock.InvokeModelWithResponseStreamCommandOutput,\n });\n\n return new Promise<T>((resolve) => resolve(result));\n })\n .catch((error: Error) => {\n return new Promise<T>((_, reject) => {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n span.recordException(error);\n span.end();\n\n reject(error);\n });\n });\n }\n\n private _startSpan({\n params,\n }: {\n params: Parameters<bedrock.BedrockRuntimeClient[\"send\"]>[0];\n }): Span {\n let attributes: Attributes = {};\n\n try {\n const input = params.input as bedrock.InvokeModelCommandInput;\n const { modelVendor, model } = this._extractVendorAndModel(\n input.modelId || \"\",\n );\n\n attributes = {\n [ATTR_GEN_AI_SYSTEM]: \"AWS\",\n [ATTR_GEN_AI_REQUEST_MODEL]: model,\n [ATTR_GEN_AI_RESPONSE_MODEL]: input.modelId,\n [SpanAttributes.LLM_REQUEST_TYPE]: LLMRequestTypeValues.COMPLETION,\n };\n\n if (typeof input.body === \"string\") {\n const requestBody = JSON.parse(input.body);\n\n attributes = {\n ...attributes,\n ...this._setRequestAttributes(modelVendor, requestBody),\n };\n }\n } catch (e) {\n this._diag.debug(e);\n this._config.exceptionLogger?.(e);\n }\n\n return this.tracer.startSpan(`bedrock.completion`, {\n kind: SpanKind.CLIENT,\n attributes,\n });\n }\n\n private async _endSpan({\n span,\n result,\n }: {\n span: Span;\n result:\n | bedrock.InvokeModelCommandOutput\n | bedrock.InvokeModelWithResponseStreamCommandOutput;\n }) {\n try {\n if (\"body\" in result) {\n const attributes =\n \"attributes\" in span\n ? (span[\"attributes\"] as Record<string, any>)\n : {};\n\n if (ATTR_GEN_AI_SYSTEM in attributes) {\n const modelId = attributes[ATTR_GEN_AI_RESPONSE_MODEL] as string;\n const { modelVendor, model } = this._extractVendorAndModel(modelId);\n\n span.setAttribute(ATTR_GEN_AI_RESPONSE_MODEL, model);\n\n if (!(result.body instanceof Object.getPrototypeOf(Uint8Array))) {\n const rawRes = result.body as AsyncIterable<bedrock.ResponseStream>;\n\n let streamedContent = \"\";\n for await (const value of rawRes) {\n // Convert it to a JSON String\n const jsonString = new TextDecoder().decode(value.chunk?.bytes);\n // Parse the JSON string\n const parsedResponse = JSON.parse(jsonString);\n\n if (\"amazon-bedrock-invocationMetrics\" in parsedResponse) {\n span.setAttribute(\n ATTR_GEN_AI_USAGE_PROMPT_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"inputTokenCount\"\n ],\n );\n span.setAttribute(\n ATTR_GEN_AI_USAGE_COMPLETION_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"outputTokenCount\"\n ],\n );\n\n span.setAttribute(\n SpanAttributes.LLM_USAGE_TOTAL_TOKENS,\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"inputTokenCount\"\n ] +\n parsedResponse[\"amazon-bedrock-invocationMetrics\"][\n \"outputTokenCount\"\n ],\n );\n }\n\n let responseAttributes = this._setResponseAttributes(\n modelVendor,\n parsedResponse,\n true,\n );\n\n // ! NOTE: This make sure the content always have all streamed chunks\n if (this._shouldSendPrompts()) {\n // Update local value with attribute value that was set by _setResponseAttributes\n streamedContent +=\n responseAttributes[`${ATTR_GEN_AI_COMPLETION}.0.content`];\n // re-assign the new value to responseAttributes\n responseAttributes = {\n ...responseAttributes,\n [`${ATTR_GEN_AI_COMPLETION}.0.content`]: streamedContent,\n };\n }\n\n span.setAttributes(responseAttributes);\n }\n } else if (result.body instanceof Object.getPrototypeOf(Uint8Array)) {\n // Convert it to a JSON String\n const jsonString = new TextDecoder().decode(\n result.body as Uint8Array,\n );\n // Parse the JSON string\n const parsedResponse = JSON.parse(jsonString);\n\n const responseAttributes = this._setResponseAttributes(\n modelVendor,\n parsedResponse,\n );\n\n span.setAttributes(responseAttributes);\n }\n }\n }\n } catch (e) {\n this._diag.debug(e);\n this._config.exceptionLogger?.(e);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n span.end();\n }\n\n private _setRequestAttributes(\n vendor: string,\n requestBody: Record<string, any>,\n ) {\n switch (vendor) {\n case \"ai21\": {\n return {\n [ATTR_GEN_AI_REQUEST_TOP_P]: requestBody[\"topP\"],\n [ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody[\"temperature\"],\n [ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody[\"maxTokens\"],\n [SpanAttributes.LLM_PRESENCE_PENALTY]:\n requestBody[\"presencePenalty\"][\"scale\"],\n [SpanAttributes.LLM_FREQUENCY_PENALTY]:\n requestBody[\"frequencyPenalty\"][\"scale\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${ATTR_GEN_AI_PROMPT}.0.role`]: \"user\",\n [`${ATTR_GEN_AI_PROMPT}.0.content`]: requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n case \"amazon\": {\n return {\n [ATTR_GEN_AI_REQUEST_TOP_P]:\n requestBody[\"textGenerationConfig\"][\"topP\"],\n [ATTR_GEN_AI_REQUEST_TEMPERATURE]:\n requestBody[\"textGenerationConfig\"][\"temperature\"],\n [ATTR_GEN_AI_REQUEST_MAX_TOKENS]:\n requestBody[\"textGenerationConfig\"][\"maxTokenCount\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${ATTR_GEN_AI_PROMPT}.0.role`]: \"user\",\n [`${ATTR_GEN_AI_PROMPT}.0.content`]: requestBody[\"inputText\"],\n }\n : {}),\n };\n }\n case \"anthropic\": {\n const baseAttributes = {\n [ATTR_GEN_AI_REQUEST_TOP_P]: requestBody[\"top_p\"],\n [SpanAttributes.LLM_TOP_K]: requestBody[\"top_k\"],\n [ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody[\"temperature\"],\n [ATTR_GEN_AI_REQUEST_MAX_TOKENS]:\n requestBody[\"max_tokens_to_sample\"] || requestBody[\"max_tokens\"],\n };\n\n if (!this._shouldSendPrompts()) {\n return baseAttributes;\n }\n\n // Handle new messages API format (used by langchain)\n if (requestBody[\"messages\"]) {\n const promptAttributes: Record<string, any> = {};\n requestBody[\"messages\"].forEach((message: any, index: number) => {\n promptAttributes[`${ATTR_GEN_AI_PROMPT}.${index}.role`] =\n message.role;\n promptAttributes[`${ATTR_GEN_AI_PROMPT}.${index}.content`] =\n typeof message.content === \"string\"\n ? message.content\n : JSON.stringify(message.content);\n });\n return { ...baseAttributes, ...promptAttributes };\n }\n\n // Handle legacy prompt format\n if (requestBody[\"prompt\"]) {\n return {\n ...baseAttributes,\n [`${ATTR_GEN_AI_PROMPT}.0.role`]: \"user\",\n [`${ATTR_GEN_AI_PROMPT}.0.content`]: requestBody[\"prompt\"]\n // The format is removing when we are setting span attribute\n .replace(\"\\n\\nHuman:\", \"\")\n .replace(\"\\n\\nAssistant:\", \"\"),\n };\n }\n\n return baseAttributes;\n }\n case \"cohere\": {\n return {\n [ATTR_GEN_AI_REQUEST_TOP_P]: requestBody[\"p\"],\n [SpanAttributes.LLM_TOP_K]: requestBody[\"k\"],\n [ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody[\"temperature\"],\n [ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody[\"max_tokens\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${ATTR_GEN_AI_PROMPT}.0.role`]: \"user\",\n [`${ATTR_GEN_AI_PROMPT}.0.content`]:\n requestBody[\"message\"] || requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n case \"meta\": {\n return {\n [ATTR_GEN_AI_REQUEST_TOP_P]: requestBody[\"top_p\"],\n [ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody[\"temperature\"],\n [ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody[\"max_gen_len\"],\n\n // Prompt & Role\n ...(this._shouldSendPrompts()\n ? {\n [`${ATTR_GEN_AI_PROMPT}.0.role`]: \"user\",\n [`${ATTR_GEN_AI_PROMPT}.0.content`]: requestBody[\"prompt\"],\n }\n : {}),\n };\n }\n default:\n return {};\n }\n }\n\n private _setResponseAttributes(\n vendor: string,\n response: Record<string, any>,\n isStream = false,\n ) {\n switch (vendor) {\n case \"ai21\": {\n return {\n [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]:\n response[\"completions\"][0][\"finishReason\"][\"reason\"],\n [`${ATTR_GEN_AI_COMPLETION}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${ATTR_GEN_AI_COMPLETION}.0.content`]:\n response[\"completions\"][0][\"data\"][\"text\"],\n }\n : {}),\n };\n }\n case \"amazon\": {\n return {\n [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: isStream\n ? response[\"completionReason\"]\n : response[\"results\"][0][\"completionReason\"],\n [`${ATTR_GEN_AI_COMPLETION}.0.role`]: \"assistant\",\n [ATTR_GEN_AI_USAGE_PROMPT_TOKENS]: response[\"inputTextTokenCount\"],\n [ATTR_GEN_AI_USAGE_COMPLETION_TOKENS]: isStream\n ? response[\"totalOutputTextTokenCount\"]\n : response[\"results\"][0][\"tokenCount\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: isStream\n ? response[\"inputTextTokenCount\"] +\n response[\"totalOutputTextTokenCount\"]\n : response[\"inputTextTokenCount\"] +\n response[\"results\"][0][\"tokenCount\"],\n ...(this._shouldSendPrompts()\n ? {\n [`${ATTR_GEN_AI_COMPLETION}.0.content`]: isStream\n ? response[\"outputText\"]\n : response[\"results\"][0][\"outputText\"],\n }\n : {}),\n };\n }\n case \"anthropic\": {\n const baseAttributes = {\n [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]:\n response[\"stop_reason\"],\n [`${ATTR_GEN_AI_COMPLETION}.0.role`]: \"assistant\",\n };\n\n if (!this._shouldSendPrompts()) {\n return baseAttributes;\n }\n\n // Handle new messages API format response\n if (response[\"content\"]) {\n const content = Array.isArray(response[\"content\"])\n ? response[\"content\"].map((c: any) => c.text || c).join(\"\")\n : response[\"content\"];\n return {\n ...baseAttributes,\n [`${ATTR_GEN_AI_COMPLETION}.0.content`]: content,\n };\n }\n\n // Handle legacy completion format\n if (response[\"completion\"]) {\n return {\n ...baseAttributes,\n [`${ATTR_GEN_AI_COMPLETION}.0.content`]: response[\"completion\"],\n };\n }\n\n return baseAttributes;\n }\n case \"cohere\": {\n const baseAttributes = {\n [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]:\n response[\"generations\"]?.[0]?.[\"finish_reason\"],\n [`${ATTR_GEN_AI_COMPLETION}.0.role`]: \"assistant\",\n ...(this._shouldSendPrompts()\n ? {\n [`${ATTR_GEN_AI_COMPLETION}.0.content`]:\n response[\"generations\"]?.[0]?.[\"text\"],\n }\n : {}),\n };\n\n // Add token usage if available\n if (response[\"meta\"] && response[\"meta\"][\"billed_units\"]) {\n const billedUnits = response[\"meta\"][\"billed_units\"];\n return {\n ...baseAttributes,\n [ATTR_GEN_AI_USAGE_PROMPT_TOKENS]: billedUnits[\"input_tokens\"],\n [ATTR_GEN_AI_USAGE_COMPLETION_TOKENS]: billedUnits[\"output_tokens\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]:\n (billedUnits[\"input_tokens\"] || 0) +\n (billedUnits[\"output_tokens\"] || 0),\n };\n }\n\n return baseAttributes;\n }\n case \"meta\": {\n return {\n [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]:\n response[\"stop_reason\"],\n [`${ATTR_GEN_AI_COMPLETION}.0.role`]: \"assistant\",\n [ATTR_GEN_AI_USAGE_PROMPT_TOKENS]: response[\"prompt_token_count\"],\n [ATTR_GEN_AI_USAGE_COMPLETION_TOKENS]:\n response[\"generation_token_count\"],\n [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]:\n response[\"prompt_token_count\"] + response[\"generation_token_count\"],\n ...(this._shouldSendPrompts()\n ? {\n [`${ATTR_GEN_AI_COMPLETION}.0.content`]: response[\"generation\"],\n }\n : {}),\n };\n }\n default:\n return {};\n }\n }\n\n private _shouldSendPrompts() {\n const contextShouldSendPrompts = context\n .active()\n .getValue(CONTEXT_KEY_ALLOW_TRACE_CONTENT);\n\n if (contextShouldSendPrompts !== undefined) {\n return contextShouldSendPrompts;\n }\n\n return this._config.traceContent !== undefined\n ? this._config.traceContent\n : true;\n }\n\n private _extractVendorAndModel(modelId: string): {\n modelVendor: string;\n model: string;\n } {\n if (!modelId) {\n return { modelVendor: \"\", model: \"\" };\n }\n\n const parts = modelId.split(\".\");\n return {\n modelVendor: parts[0] || \"\",\n model: parts[1] || \"\",\n };\n }\n}\n"],"names":["InstrumentationBase","InstrumentationNodeModuleDefinition","trace","context","safeExecuteInTheMiddle","__awaiter","SpanStatusCode","ATTR_GEN_AI_SYSTEM","ATTR_GEN_AI_REQUEST_MODEL","ATTR_GEN_AI_RESPONSE_MODEL","SpanAttributes","LLMRequestTypeValues","SpanKind","__asyncValues","ATTR_GEN_AI_USAGE_PROMPT_TOKENS","ATTR_GEN_AI_USAGE_COMPLETION_TOKENS","ATTR_GEN_AI_COMPLETION","ATTR_GEN_AI_REQUEST_TOP_P","ATTR_GEN_AI_REQUEST_TEMPERATURE","ATTR_GEN_AI_REQUEST_MAX_TOKENS","ATTR_GEN_AI_PROMPT","CONTEXT_KEY_ALLOW_TRACE_CONTENT"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -2,8 +2,9 @@ import { __awaiter, __asyncValues } from 'tslib';
2
2
  import { trace, context, SpanStatusCode, SpanKind } from '@opentelemetry/api';
3
3
  import { InstrumentationBase, InstrumentationNodeModuleDefinition, safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';
4
4
  import { LLMRequestTypeValues, SpanAttributes, CONTEXT_KEY_ALLOW_TRACE_CONTENT } from '@traceloop/ai-semantic-conventions';
5
+ import { ATTR_GEN_AI_RESPONSE_MODEL, ATTR_GEN_AI_REQUEST_MODEL, ATTR_GEN_AI_SYSTEM, ATTR_GEN_AI_USAGE_PROMPT_TOKENS, ATTR_GEN_AI_USAGE_COMPLETION_TOKENS, ATTR_GEN_AI_COMPLETION, ATTR_GEN_AI_REQUEST_MAX_TOKENS, ATTR_GEN_AI_REQUEST_TEMPERATURE, ATTR_GEN_AI_REQUEST_TOP_P, ATTR_GEN_AI_PROMPT } from '@opentelemetry/semantic-conventions/incubating';
5
6
 
6
- var version = "0.22.2";
7
+ var version = "0.22.6";
7
8
 
8
9
  class BedrockInstrumentation extends InstrumentationBase {
9
10
  constructor(config = {}) {
@@ -81,9 +82,9 @@ class BedrockInstrumentation extends InstrumentationBase {
81
82
  const input = params.input;
82
83
  const { modelVendor, model } = this._extractVendorAndModel(input.modelId || "");
83
84
  attributes = {
84
- [SpanAttributes.LLM_SYSTEM]: "AWS",
85
- [SpanAttributes.LLM_REQUEST_MODEL]: model,
86
- [SpanAttributes.LLM_RESPONSE_MODEL]: input.modelId,
85
+ [ATTR_GEN_AI_SYSTEM]: "AWS",
86
+ [ATTR_GEN_AI_REQUEST_MODEL]: model,
87
+ [ATTR_GEN_AI_RESPONSE_MODEL]: input.modelId,
87
88
  [SpanAttributes.LLM_REQUEST_TYPE]: LLMRequestTypeValues.COMPLETION,
88
89
  };
89
90
  if (typeof input.body === "string") {
@@ -109,10 +110,10 @@ class BedrockInstrumentation extends InstrumentationBase {
109
110
  const attributes = "attributes" in span
110
111
  ? span["attributes"]
111
112
  : {};
112
- if (SpanAttributes.LLM_SYSTEM in attributes) {
113
- const modelId = attributes[SpanAttributes.LLM_RESPONSE_MODEL];
113
+ if (ATTR_GEN_AI_SYSTEM in attributes) {
114
+ const modelId = attributes[ATTR_GEN_AI_RESPONSE_MODEL];
114
115
  const { modelVendor, model } = this._extractVendorAndModel(modelId);
115
- span.setAttribute(SpanAttributes.LLM_RESPONSE_MODEL, model);
116
+ span.setAttribute(ATTR_GEN_AI_RESPONSE_MODEL, model);
116
117
  if (!(result.body instanceof Object.getPrototypeOf(Uint8Array))) {
117
118
  const rawRes = result.body;
118
119
  let streamedContent = "";
@@ -126,8 +127,8 @@ class BedrockInstrumentation extends InstrumentationBase {
126
127
  // Parse the JSON string
127
128
  const parsedResponse = JSON.parse(jsonString);
128
129
  if ("amazon-bedrock-invocationMetrics" in parsedResponse) {
129
- span.setAttribute(SpanAttributes.LLM_USAGE_PROMPT_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"]);
130
- span.setAttribute(SpanAttributes.LLM_USAGE_COMPLETION_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
130
+ span.setAttribute(ATTR_GEN_AI_USAGE_PROMPT_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"]);
131
+ span.setAttribute(ATTR_GEN_AI_USAGE_COMPLETION_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
131
132
  span.setAttribute(SpanAttributes.LLM_USAGE_TOTAL_TOKENS, parsedResponse["amazon-bedrock-invocationMetrics"]["inputTokenCount"] +
132
133
  parsedResponse["amazon-bedrock-invocationMetrics"]["outputTokenCount"]);
133
134
  }
@@ -136,9 +137,9 @@ class BedrockInstrumentation extends InstrumentationBase {
136
137
  if (this._shouldSendPrompts()) {
137
138
  // Update local value with attribute value that was set by _setResponseAttributes
138
139
  streamedContent +=
139
- responseAttributes[`${SpanAttributes.LLM_COMPLETIONS}.0.content`];
140
+ responseAttributes[`${ATTR_GEN_AI_COMPLETION}.0.content`];
140
141
  // re-assign the new value to responseAttributes
141
- responseAttributes = Object.assign(Object.assign({}, responseAttributes), { [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: streamedContent });
142
+ responseAttributes = Object.assign(Object.assign({}, responseAttributes), { [`${ATTR_GEN_AI_COMPLETION}.0.content`]: streamedContent });
142
143
  }
143
144
  span.setAttributes(responseAttributes);
144
145
  }
@@ -173,27 +174,27 @@ class BedrockInstrumentation extends InstrumentationBase {
173
174
  _setRequestAttributes(vendor, requestBody) {
174
175
  switch (vendor) {
175
176
  case "ai21": {
176
- return Object.assign({ [SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["topP"], [SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["temperature"], [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["maxTokens"], [SpanAttributes.LLM_PRESENCE_PENALTY]: requestBody["presencePenalty"]["scale"], [SpanAttributes.LLM_FREQUENCY_PENALTY]: requestBody["frequencyPenalty"]["scale"] }, (this._shouldSendPrompts()
177
+ return Object.assign({ [ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["topP"], [ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["temperature"], [ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["maxTokens"], [SpanAttributes.LLM_PRESENCE_PENALTY]: requestBody["presencePenalty"]["scale"], [SpanAttributes.LLM_FREQUENCY_PENALTY]: requestBody["frequencyPenalty"]["scale"] }, (this._shouldSendPrompts()
177
178
  ? {
178
- [`${SpanAttributes.LLM_PROMPTS}.0.role`]: "user",
179
- [`${SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["prompt"],
179
+ [`${ATTR_GEN_AI_PROMPT}.0.role`]: "user",
180
+ [`${ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["prompt"],
180
181
  }
181
182
  : {}));
182
183
  }
183
184
  case "amazon": {
184
- return Object.assign({ [SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["textGenerationConfig"]["topP"], [SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["textGenerationConfig"]["temperature"], [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["textGenerationConfig"]["maxTokenCount"] }, (this._shouldSendPrompts()
185
+ return Object.assign({ [ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["textGenerationConfig"]["topP"], [ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["textGenerationConfig"]["temperature"], [ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["textGenerationConfig"]["maxTokenCount"] }, (this._shouldSendPrompts()
185
186
  ? {
186
- [`${SpanAttributes.LLM_PROMPTS}.0.role`]: "user",
187
- [`${SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["inputText"],
187
+ [`${ATTR_GEN_AI_PROMPT}.0.role`]: "user",
188
+ [`${ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["inputText"],
188
189
  }
189
190
  : {}));
190
191
  }
191
192
  case "anthropic": {
192
193
  const baseAttributes = {
193
- [SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["top_p"],
194
+ [ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["top_p"],
194
195
  [SpanAttributes.LLM_TOP_K]: requestBody["top_k"],
195
- [SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["temperature"],
196
- [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["max_tokens_to_sample"] || requestBody["max_tokens"],
196
+ [ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["temperature"],
197
+ [ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["max_tokens_to_sample"] || requestBody["max_tokens"],
197
198
  };
198
199
  if (!this._shouldSendPrompts()) {
199
200
  return baseAttributes;
@@ -202,9 +203,9 @@ class BedrockInstrumentation extends InstrumentationBase {
202
203
  if (requestBody["messages"]) {
203
204
  const promptAttributes = {};
204
205
  requestBody["messages"].forEach((message, index) => {
205
- promptAttributes[`${SpanAttributes.LLM_PROMPTS}.${index}.role`] =
206
+ promptAttributes[`${ATTR_GEN_AI_PROMPT}.${index}.role`] =
206
207
  message.role;
207
- promptAttributes[`${SpanAttributes.LLM_PROMPTS}.${index}.content`] =
208
+ promptAttributes[`${ATTR_GEN_AI_PROMPT}.${index}.content`] =
208
209
  typeof message.content === "string"
209
210
  ? message.content
210
211
  : JSON.stringify(message.content);
@@ -213,7 +214,7 @@ class BedrockInstrumentation extends InstrumentationBase {
213
214
  }
214
215
  // Handle legacy prompt format
215
216
  if (requestBody["prompt"]) {
216
- return Object.assign(Object.assign({}, baseAttributes), { [`${SpanAttributes.LLM_PROMPTS}.0.role`]: "user", [`${SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["prompt"]
217
+ return Object.assign(Object.assign({}, baseAttributes), { [`${ATTR_GEN_AI_PROMPT}.0.role`]: "user", [`${ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["prompt"]
217
218
  // The format is removing when we are setting span attribute
218
219
  .replace("\n\nHuman:", "")
219
220
  .replace("\n\nAssistant:", "") });
@@ -221,18 +222,18 @@ class BedrockInstrumentation extends InstrumentationBase {
221
222
  return baseAttributes;
222
223
  }
223
224
  case "cohere": {
224
- return Object.assign({ [SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["p"], [SpanAttributes.LLM_TOP_K]: requestBody["k"], [SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["temperature"], [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["max_tokens"] }, (this._shouldSendPrompts()
225
+ return Object.assign({ [ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["p"], [SpanAttributes.LLM_TOP_K]: requestBody["k"], [ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["temperature"], [ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["max_tokens"] }, (this._shouldSendPrompts()
225
226
  ? {
226
- [`${SpanAttributes.LLM_PROMPTS}.0.role`]: "user",
227
- [`${SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["message"] || requestBody["prompt"],
227
+ [`${ATTR_GEN_AI_PROMPT}.0.role`]: "user",
228
+ [`${ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["message"] || requestBody["prompt"],
228
229
  }
229
230
  : {}));
230
231
  }
231
232
  case "meta": {
232
- return Object.assign({ [SpanAttributes.LLM_REQUEST_TOP_P]: requestBody["top_p"], [SpanAttributes.LLM_REQUEST_TEMPERATURE]: requestBody["temperature"], [SpanAttributes.LLM_REQUEST_MAX_TOKENS]: requestBody["max_gen_len"] }, (this._shouldSendPrompts()
233
+ return Object.assign({ [ATTR_GEN_AI_REQUEST_TOP_P]: requestBody["top_p"], [ATTR_GEN_AI_REQUEST_TEMPERATURE]: requestBody["temperature"], [ATTR_GEN_AI_REQUEST_MAX_TOKENS]: requestBody["max_gen_len"] }, (this._shouldSendPrompts()
233
234
  ? {
234
- [`${SpanAttributes.LLM_PROMPTS}.0.role`]: "user",
235
- [`${SpanAttributes.LLM_PROMPTS}.0.content`]: requestBody["prompt"],
235
+ [`${ATTR_GEN_AI_PROMPT}.0.role`]: "user",
236
+ [`${ATTR_GEN_AI_PROMPT}.0.content`]: requestBody["prompt"],
236
237
  }
237
238
  : {}));
238
239
  }
@@ -244,16 +245,16 @@ class BedrockInstrumentation extends InstrumentationBase {
244
245
  var _a, _b, _c, _d;
245
246
  switch (vendor) {
246
247
  case "ai21": {
247
- return Object.assign({ [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: response["completions"][0]["finishReason"]["reason"], [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant" }, (this._shouldSendPrompts()
248
+ return Object.assign({ [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: response["completions"][0]["finishReason"]["reason"], [`${ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant" }, (this._shouldSendPrompts()
248
249
  ? {
249
- [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: response["completions"][0]["data"]["text"],
250
+ [`${ATTR_GEN_AI_COMPLETION}.0.content`]: response["completions"][0]["data"]["text"],
250
251
  }
251
252
  : {}));
252
253
  }
253
254
  case "amazon": {
254
- return Object.assign({ [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: isStream
255
+ return Object.assign({ [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: isStream
255
256
  ? response["completionReason"]
256
- : response["results"][0]["completionReason"], [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant", [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]: response["inputTextTokenCount"], [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: isStream
257
+ : response["results"][0]["completionReason"], [`${ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant", [ATTR_GEN_AI_USAGE_PROMPT_TOKENS]: response["inputTextTokenCount"], [ATTR_GEN_AI_USAGE_COMPLETION_TOKENS]: isStream
257
258
  ? response["totalOutputTextTokenCount"]
258
259
  : response["results"][0]["tokenCount"], [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: isStream
259
260
  ? response["inputTextTokenCount"] +
@@ -261,7 +262,7 @@ class BedrockInstrumentation extends InstrumentationBase {
261
262
  : response["inputTextTokenCount"] +
262
263
  response["results"][0]["tokenCount"] }, (this._shouldSendPrompts()
263
264
  ? {
264
- [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: isStream
265
+ [`${ATTR_GEN_AI_COMPLETION}.0.content`]: isStream
265
266
  ? response["outputText"]
266
267
  : response["results"][0]["outputText"],
267
268
  }
@@ -269,8 +270,8 @@ class BedrockInstrumentation extends InstrumentationBase {
269
270
  }
270
271
  case "anthropic": {
271
272
  const baseAttributes = {
272
- [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: response["stop_reason"],
273
- [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant",
273
+ [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: response["stop_reason"],
274
+ [`${ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant",
274
275
  };
275
276
  if (!this._shouldSendPrompts()) {
276
277
  return baseAttributes;
@@ -280,32 +281,32 @@ class BedrockInstrumentation extends InstrumentationBase {
280
281
  const content = Array.isArray(response["content"])
281
282
  ? response["content"].map((c) => c.text || c).join("")
282
283
  : response["content"];
283
- return Object.assign(Object.assign({}, baseAttributes), { [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: content });
284
+ return Object.assign(Object.assign({}, baseAttributes), { [`${ATTR_GEN_AI_COMPLETION}.0.content`]: content });
284
285
  }
285
286
  // Handle legacy completion format
286
287
  if (response["completion"]) {
287
- return Object.assign(Object.assign({}, baseAttributes), { [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: response["completion"] });
288
+ return Object.assign(Object.assign({}, baseAttributes), { [`${ATTR_GEN_AI_COMPLETION}.0.content`]: response["completion"] });
288
289
  }
289
290
  return baseAttributes;
290
291
  }
291
292
  case "cohere": {
292
- const baseAttributes = Object.assign({ [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: (_b = (_a = response["generations"]) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b["finish_reason"], [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant" }, (this._shouldSendPrompts()
293
+ const baseAttributes = Object.assign({ [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: (_b = (_a = response["generations"]) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b["finish_reason"], [`${ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant" }, (this._shouldSendPrompts()
293
294
  ? {
294
- [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: (_d = (_c = response["generations"]) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d["text"],
295
+ [`${ATTR_GEN_AI_COMPLETION}.0.content`]: (_d = (_c = response["generations"]) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d["text"],
295
296
  }
296
297
  : {}));
297
298
  // Add token usage if available
298
299
  if (response["meta"] && response["meta"]["billed_units"]) {
299
300
  const billedUnits = response["meta"]["billed_units"];
300
- return Object.assign(Object.assign({}, baseAttributes), { [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]: billedUnits["input_tokens"], [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: billedUnits["output_tokens"], [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: (billedUnits["input_tokens"] || 0) +
301
+ return Object.assign(Object.assign({}, baseAttributes), { [ATTR_GEN_AI_USAGE_PROMPT_TOKENS]: billedUnits["input_tokens"], [ATTR_GEN_AI_USAGE_COMPLETION_TOKENS]: billedUnits["output_tokens"], [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: (billedUnits["input_tokens"] || 0) +
301
302
  (billedUnits["output_tokens"] || 0) });
302
303
  }
303
304
  return baseAttributes;
304
305
  }
305
306
  case "meta": {
306
- return Object.assign({ [`${SpanAttributes.LLM_COMPLETIONS}.0.finish_reason`]: response["stop_reason"], [`${SpanAttributes.LLM_COMPLETIONS}.0.role`]: "assistant", [SpanAttributes.LLM_USAGE_PROMPT_TOKENS]: response["prompt_token_count"], [SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]: response["generation_token_count"], [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: response["prompt_token_count"] + response["generation_token_count"] }, (this._shouldSendPrompts()
307
+ return Object.assign({ [`${ATTR_GEN_AI_COMPLETION}.0.finish_reason`]: response["stop_reason"], [`${ATTR_GEN_AI_COMPLETION}.0.role`]: "assistant", [ATTR_GEN_AI_USAGE_PROMPT_TOKENS]: response["prompt_token_count"], [ATTR_GEN_AI_USAGE_COMPLETION_TOKENS]: response["generation_token_count"], [SpanAttributes.LLM_USAGE_TOTAL_TOKENS]: response["prompt_token_count"] + response["generation_token_count"] }, (this._shouldSendPrompts()
307
308
  ? {
308
- [`${SpanAttributes.LLM_COMPLETIONS}.0.content`]: response["generation"],
309
+ [`${ATTR_GEN_AI_COMPLETION}.0.content`]: response["generation"],
309
310
  }
310
311
  : {}));
311
312
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@traceloop/instrumentation-bedrock",
3
- "version": "0.22.2",
3
+ "version": "0.22.6",
4
4
  "description": "Amazon Bedrock Instrumentation",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -10,7 +10,7 @@
10
10
  "build": "rollup -c",
11
11
  "lint": "eslint .",
12
12
  "lint:fix": "eslint . --fix",
13
- "test": "ts-mocha -p tsconfig.json 'tests/**/*.test.ts' --timeout 20000"
13
+ "test": "ts-mocha -p tsconfig.test.json 'tests/**/*.test.ts' --timeout 20000"
14
14
  },
15
15
  "keywords": [
16
16
  "opentelemetry",
@@ -41,12 +41,12 @@
41
41
  "@opentelemetry/api": "^1.9.0",
42
42
  "@opentelemetry/core": "^2.0.1",
43
43
  "@opentelemetry/instrumentation": "^0.203.0",
44
- "@opentelemetry/semantic-conventions": "^1.36.0",
45
- "@traceloop/ai-semantic-conventions": "0.22.2",
44
+ "@opentelemetry/semantic-conventions": "^1.38.0",
45
+ "@traceloop/ai-semantic-conventions": "0.22.5",
46
46
  "tslib": "^2.8.1"
47
47
  },
48
48
  "devDependencies": {
49
- "@aws-sdk/client-bedrock-runtime": "^3.848.0",
49
+ "@aws-sdk/client-bedrock-runtime": "^3.969.0",
50
50
  "@opentelemetry/context-async-hooks": "^2.0.1",
51
51
  "@opentelemetry/sdk-trace-node": "^2.0.1",
52
52
  "@pollyjs/adapter-fetch": "^6.0.6",
@@ -57,5 +57,5 @@
57
57
  "ts-mocha": "^11.1.0"
58
58
  },
59
59
  "homepage": "https://github.com/traceloop/openllmetry-js/tree/main/packages/instrumentation-openai",
60
- "gitHead": "389987af4053ef0ecc1842f97e52be9e7b466d09"
60
+ "gitHead": "fa98799ee0752bd76906709752800a66fbca8210"
61
61
  }