@opentelemetry/instrumentation-aws-sdk 0.51.0 → 0.52.0

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.
@@ -4,7 +4,9 @@ import { AwsSdkInstrumentationConfig, NormalizedRequest, NormalizedResponse } fr
4
4
  export declare class BedrockRuntimeServiceExtension implements ServiceExtension {
5
5
  requestPreSpanHook(request: NormalizedRequest, config: AwsSdkInstrumentationConfig, diag: DiagLogger): RequestMetadata;
6
6
  private requestPreSpanHookConverse;
7
+ private requestPreSpanHookInvokeModel;
7
8
  responseHook(response: NormalizedResponse, span: Span, tracer: Tracer, config: AwsSdkInstrumentationConfig): void;
8
9
  private responseHookConverse;
10
+ private responseHookInvokeModel;
9
11
  }
10
12
  //# sourceMappingURL=bedrock-runtime.d.ts.map
@@ -7,6 +7,8 @@ class BedrockRuntimeServiceExtension {
7
7
  switch (request.commandName) {
8
8
  case 'Converse':
9
9
  return this.requestPreSpanHookConverse(request, config, diag);
10
+ case 'InvokeModel':
11
+ return this.requestPreSpanHookInvokeModel(request, config, diag);
10
12
  }
11
13
  return {
12
14
  isIncoming: false,
@@ -47,6 +49,160 @@ class BedrockRuntimeServiceExtension {
47
49
  spanAttributes,
48
50
  };
49
51
  }
52
+ requestPreSpanHookInvokeModel(request, config, diag) {
53
+ let spanName;
54
+ const spanAttributes = {
55
+ [semconv_1.ATTR_GEN_AI_SYSTEM]: semconv_1.GEN_AI_SYSTEM_VALUE_AWS_BEDROCK,
56
+ // add operation name for InvokeModel API
57
+ };
58
+ const modelId = request.commandInput?.modelId;
59
+ if (modelId) {
60
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_MODEL] = modelId;
61
+ }
62
+ if (request.commandInput?.body) {
63
+ const requestBody = JSON.parse(request.commandInput.body);
64
+ if (modelId.includes('amazon.titan')) {
65
+ if (requestBody.textGenerationConfig?.temperature !== undefined) {
66
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TEMPERATURE] =
67
+ requestBody.textGenerationConfig.temperature;
68
+ }
69
+ if (requestBody.textGenerationConfig?.topP !== undefined) {
70
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TOP_P] =
71
+ requestBody.textGenerationConfig.topP;
72
+ }
73
+ if (requestBody.textGenerationConfig?.maxTokenCount !== undefined) {
74
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_MAX_TOKENS] =
75
+ requestBody.textGenerationConfig.maxTokenCount;
76
+ }
77
+ if (requestBody.textGenerationConfig?.stopSequences !== undefined) {
78
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =
79
+ requestBody.textGenerationConfig.stopSequences;
80
+ }
81
+ }
82
+ else if (modelId.includes('amazon.nova')) {
83
+ if (requestBody.inferenceConfig?.temperature !== undefined) {
84
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TEMPERATURE] =
85
+ requestBody.inferenceConfig.temperature;
86
+ }
87
+ if (requestBody.inferenceConfig?.top_p !== undefined) {
88
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TOP_P] =
89
+ requestBody.inferenceConfig.top_p;
90
+ }
91
+ if (requestBody.inferenceConfig?.max_new_tokens !== undefined) {
92
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_MAX_TOKENS] =
93
+ requestBody.inferenceConfig.max_new_tokens;
94
+ }
95
+ if (requestBody.inferenceConfig?.stopSequences !== undefined) {
96
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =
97
+ requestBody.inferenceConfig.stopSequences;
98
+ }
99
+ }
100
+ else if (modelId.includes('anthropic.claude')) {
101
+ if (requestBody.max_tokens !== undefined) {
102
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_MAX_TOKENS] =
103
+ requestBody.max_tokens;
104
+ }
105
+ if (requestBody.temperature !== undefined) {
106
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TEMPERATURE] =
107
+ requestBody.temperature;
108
+ }
109
+ if (requestBody.top_p !== undefined) {
110
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;
111
+ }
112
+ if (requestBody.stop_sequences !== undefined) {
113
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =
114
+ requestBody.stop_sequences;
115
+ }
116
+ }
117
+ else if (modelId.includes('meta.llama')) {
118
+ if (requestBody.max_gen_len !== undefined) {
119
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_MAX_TOKENS] =
120
+ requestBody.max_gen_len;
121
+ }
122
+ if (requestBody.temperature !== undefined) {
123
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TEMPERATURE] =
124
+ requestBody.temperature;
125
+ }
126
+ if (requestBody.top_p !== undefined) {
127
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;
128
+ }
129
+ // request for meta llama models does not contain stop_sequences field
130
+ }
131
+ else if (modelId.includes('cohere.command-r')) {
132
+ if (requestBody.max_tokens !== undefined) {
133
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_MAX_TOKENS] =
134
+ requestBody.max_tokens;
135
+ }
136
+ if (requestBody.temperature !== undefined) {
137
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TEMPERATURE] =
138
+ requestBody.temperature;
139
+ }
140
+ if (requestBody.p !== undefined) {
141
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.p;
142
+ }
143
+ if (requestBody.message !== undefined) {
144
+ // NOTE: We approximate the token count since this value is not directly available in the body
145
+ // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.
146
+ // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html
147
+ spanAttributes[semconv_1.ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(requestBody.message.length / 6);
148
+ }
149
+ if (requestBody.stop_sequences !== undefined) {
150
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =
151
+ requestBody.stop_sequences;
152
+ }
153
+ }
154
+ else if (modelId.includes('cohere.command')) {
155
+ if (requestBody.max_tokens !== undefined) {
156
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_MAX_TOKENS] =
157
+ requestBody.max_tokens;
158
+ }
159
+ if (requestBody.temperature !== undefined) {
160
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TEMPERATURE] =
161
+ requestBody.temperature;
162
+ }
163
+ if (requestBody.p !== undefined) {
164
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.p;
165
+ }
166
+ if (requestBody.prompt !== undefined) {
167
+ // NOTE: We approximate the token count since this value is not directly available in the body
168
+ // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.
169
+ // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html
170
+ spanAttributes[semconv_1.ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(requestBody.prompt.length / 6);
171
+ }
172
+ if (requestBody.stop_sequences !== undefined) {
173
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] =
174
+ requestBody.stop_sequences;
175
+ }
176
+ }
177
+ else if (modelId.includes('mistral')) {
178
+ if (requestBody.prompt !== undefined) {
179
+ // NOTE: We approximate the token count since this value is not directly available in the body
180
+ // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.
181
+ // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html
182
+ spanAttributes[semconv_1.ATTR_GEN_AI_USAGE_INPUT_TOKENS] = Math.ceil(requestBody.prompt.length / 6);
183
+ }
184
+ if (requestBody.max_tokens !== undefined) {
185
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_MAX_TOKENS] =
186
+ requestBody.max_tokens;
187
+ }
188
+ if (requestBody.temperature !== undefined) {
189
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TEMPERATURE] =
190
+ requestBody.temperature;
191
+ }
192
+ if (requestBody.top_p !== undefined) {
193
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_TOP_P] = requestBody.top_p;
194
+ }
195
+ if (requestBody.stop !== undefined) {
196
+ spanAttributes[semconv_1.ATTR_GEN_AI_REQUEST_STOP_SEQUENCES] = requestBody.stop;
197
+ }
198
+ }
199
+ }
200
+ return {
201
+ spanName,
202
+ isIncoming: false,
203
+ spanAttributes,
204
+ };
205
+ }
50
206
  responseHook(response, span, tracer, config) {
51
207
  if (!span.isRecording()) {
52
208
  return;
@@ -54,6 +210,8 @@ class BedrockRuntimeServiceExtension {
54
210
  switch (response.request.commandName) {
55
211
  case 'Converse':
56
212
  return this.responseHookConverse(response, span, tracer, config);
213
+ case 'InvokeModel':
214
+ return this.responseHookInvokeModel(response, span, tracer, config);
57
215
  }
58
216
  }
59
217
  responseHookConverse(response, span, tracer, config) {
@@ -71,6 +229,108 @@ class BedrockRuntimeServiceExtension {
71
229
  span.setAttribute(semconv_1.ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [stopReason]);
72
230
  }
73
231
  }
232
+ responseHookInvokeModel(response, span, tracer, config) {
233
+ const currentModelId = response.request.commandInput?.modelId;
234
+ if (response.data?.body) {
235
+ const decodedResponseBody = new TextDecoder().decode(response.data.body);
236
+ const responseBody = JSON.parse(decodedResponseBody);
237
+ if (currentModelId.includes('amazon.titan')) {
238
+ if (responseBody.inputTextTokenCount !== undefined) {
239
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_INPUT_TOKENS, responseBody.inputTextTokenCount);
240
+ }
241
+ if (responseBody.results?.[0]?.tokenCount !== undefined) {
242
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, responseBody.results[0].tokenCount);
243
+ }
244
+ if (responseBody.results?.[0]?.completionReason !== undefined) {
245
+ span.setAttribute(semconv_1.ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [
246
+ responseBody.results[0].completionReason,
247
+ ]);
248
+ }
249
+ }
250
+ else if (currentModelId.includes('amazon.nova')) {
251
+ if (responseBody.usage !== undefined) {
252
+ if (responseBody.usage.inputTokens !== undefined) {
253
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_INPUT_TOKENS, responseBody.usage.inputTokens);
254
+ }
255
+ if (responseBody.usage.outputTokens !== undefined) {
256
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, responseBody.usage.outputTokens);
257
+ }
258
+ }
259
+ if (responseBody.stopReason !== undefined) {
260
+ span.setAttribute(semconv_1.ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [
261
+ responseBody.stopReason,
262
+ ]);
263
+ }
264
+ }
265
+ else if (currentModelId.includes('anthropic.claude')) {
266
+ if (responseBody.usage?.input_tokens !== undefined) {
267
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_INPUT_TOKENS, responseBody.usage.input_tokens);
268
+ }
269
+ if (responseBody.usage?.output_tokens !== undefined) {
270
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, responseBody.usage.output_tokens);
271
+ }
272
+ if (responseBody.stop_reason !== undefined) {
273
+ span.setAttribute(semconv_1.ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [
274
+ responseBody.stop_reason,
275
+ ]);
276
+ }
277
+ }
278
+ else if (currentModelId.includes('meta.llama')) {
279
+ if (responseBody.prompt_token_count !== undefined) {
280
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_INPUT_TOKENS, responseBody.prompt_token_count);
281
+ }
282
+ if (responseBody.generation_token_count !== undefined) {
283
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, responseBody.generation_token_count);
284
+ }
285
+ if (responseBody.stop_reason !== undefined) {
286
+ span.setAttribute(semconv_1.ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [
287
+ responseBody.stop_reason,
288
+ ]);
289
+ }
290
+ }
291
+ else if (currentModelId.includes('cohere.command-r')) {
292
+ if (responseBody.text !== undefined) {
293
+ // NOTE: We approximate the token count since this value is not directly available in the body
294
+ // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.
295
+ // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html
296
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, Math.ceil(responseBody.text.length / 6));
297
+ }
298
+ if (responseBody.finish_reason !== undefined) {
299
+ span.setAttribute(semconv_1.ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [
300
+ responseBody.finish_reason,
301
+ ]);
302
+ }
303
+ }
304
+ else if (currentModelId.includes('cohere.command')) {
305
+ if (responseBody.generations?.[0]?.text !== undefined) {
306
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,
307
+ // NOTE: We approximate the token count since this value is not directly available in the body
308
+ // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.
309
+ // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html
310
+ Math.ceil(responseBody.generations[0].text.length / 6));
311
+ }
312
+ if (responseBody.generations?.[0]?.finish_reason !== undefined) {
313
+ span.setAttribute(semconv_1.ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [
314
+ responseBody.generations[0].finish_reason,
315
+ ]);
316
+ }
317
+ }
318
+ else if (currentModelId.includes('mistral')) {
319
+ if (responseBody.outputs?.[0]?.text !== undefined) {
320
+ span.setAttribute(semconv_1.ATTR_GEN_AI_USAGE_OUTPUT_TOKENS,
321
+ // NOTE: We approximate the token count since this value is not directly available in the body
322
+ // According to Bedrock docs they use (total_chars / 6) to approximate token count for pricing.
323
+ // https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-prepare.html
324
+ Math.ceil(responseBody.outputs[0].text.length / 6));
325
+ }
326
+ if (responseBody.outputs?.[0]?.stop_reason !== undefined) {
327
+ span.setAttribute(semconv_1.ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [
328
+ responseBody.outputs[0].stop_reason,
329
+ ]);
330
+ }
331
+ }
332
+ }
333
+ }
74
334
  }
75
335
  exports.BedrockRuntimeServiceExtension = BedrockRuntimeServiceExtension;
76
336
  //# sourceMappingURL=bedrock-runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bedrock-runtime.js","sourceRoot":"","sources":["../../../src/services/bedrock-runtime.ts"],"names":[],"mappings":";;;AAiBA,wCAaoB;AAOpB,MAAa,8BAA8B;IACzC,kBAAkB,CAChB,OAA0B,EAC1B,MAAmC,EACnC,IAAgB;QAEhB,QAAQ,OAAO,CAAC,WAAW,EAAE;YAC3B,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;SACjE;QAED,OAAO;YACL,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAEO,0BAA0B,CAChC,OAA0B,EAC1B,MAAmC,EACnC,IAAgB;QAEhB,IAAI,QAAQ,GAAG,0CAAgC,CAAC;QAChD,MAAM,cAAc,GAAe;YACjC,CAAC,4BAAkB,CAAC,EAAE,yCAA+B;YACrD,CAAC,oCAA0B,CAAC,EAAE,0CAAgC;SAC/D,CAAC;QAEF,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;QAC7C,IAAI,OAAO,EAAE;YACX,cAAc,CAAC,mCAAyB,CAAC,GAAG,OAAO,CAAC;YACpD,IAAI,QAAQ,EAAE;gBACZ,QAAQ,IAAI,IAAI,OAAO,EAAE,CAAC;aAC3B;SACF;QAED,MAAM,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC;QAC7D,IAAI,eAAe,EAAE;YACnB,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,eAAe,CAAC;YACxE,IAAI,SAAS,KAAK,SAAS,EAAE;gBAC3B,cAAc,CAAC,wCAA8B,CAAC,GAAG,SAAS,CAAC;aAC5D;YACD,IAAI,WAAW,KAAK,SAAS,EAAE;gBAC7B,cAAc,CAAC,yCAA+B,CAAC,GAAG,WAAW,CAAC;aAC/D;YACD,IAAI,IAAI,KAAK,SAAS,EAAE;gBACtB,cAAc,CAAC,mCAAyB,CAAC,GAAG,IAAI,CAAC;aAClD;YACD,IAAI,aAAa,KAAK,SAAS,EAAE;gBAC/B,cAAc,CAAC,4CAAkC,CAAC,GAAG,aAAa,CAAC;aACpE;SACF;QAED,OAAO;YACL,QAAQ;YACR,UAAU,EAAE,KAAK;YACjB,cAAc;SACf,CAAC;IACJ,CAAC;IAED,YAAY,CACV,QAA4B,EAC5B,IAAU,EACV,MAAc,EACd,MAAmC;QAEnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;YACvB,OAAO;SACR;QAED,QAAQ,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE;YACpC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;SACpE;IACH,CAAC;IAEO,oBAAoB,CAC1B,QAA4B,EAC5B,IAAU,EACV,MAAc,EACd,MAAmC;QAEnC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC5C,IAAI,KAAK,EAAE;YACT,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;YAC5C,IAAI,WAAW,KAAK,SAAS,EAAE;gBAC7B,IAAI,CAAC,YAAY,CAAC,wCAA8B,EAAE,WAAW,CAAC,CAAC;aAChE;YACD,IAAI,YAAY,KAAK,SAAS,EAAE;gBAC9B,IAAI,CAAC,YAAY,CAAC,yCAA+B,EAAE,YAAY,CAAC,CAAC;aAClE;SACF;QAED,IAAI,UAAU,KAAK,SAAS,EAAE;YAC5B,IAAI,CAAC,YAAY,CAAC,6CAAmC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;SACtE;IACH,CAAC;CACF;AAhGD,wEAgGC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\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 { Attributes, DiagLogger, Span, Tracer } 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_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} from '../semconv';\nimport {\n AwsSdkInstrumentationConfig,\n NormalizedRequest,\n NormalizedResponse,\n} from '../types';\n\nexport class BedrockRuntimeServiceExtension implements ServiceExtension {\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);\n }\n\n return {\n isIncoming: false,\n };\n }\n\n private requestPreSpanHookConverse(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger\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 spanAttributes,\n };\n }\n\n responseHook(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ) {\n if (!span.isRecording()) {\n return;\n }\n\n switch (response.request.commandName) {\n case 'Converse':\n return this.responseHookConverse(response, span, tracer, config);\n }\n }\n\n private responseHookConverse(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ) {\n const { stopReason, usage } = response.data;\n if (usage) {\n const { inputTokens, outputTokens } = usage;\n if (inputTokens !== undefined) {\n span.setAttribute(ATTR_GEN_AI_USAGE_INPUT_TOKENS, inputTokens);\n }\n if (outputTokens !== undefined) {\n span.setAttribute(ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, outputTokens);\n }\n }\n\n if (stopReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [stopReason]);\n }\n }\n}\n"]}
1
+ {"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 *\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 { Attributes, DiagLogger, Span, Tracer } 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_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} from '../semconv';\nimport {\n AwsSdkInstrumentationConfig,\n NormalizedRequest,\n NormalizedResponse,\n} from '../types';\n\nexport class BedrockRuntimeServiceExtension implements ServiceExtension {\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);\n case 'InvokeModel':\n return this.requestPreSpanHookInvokeModel(request, config, diag);\n }\n\n return {\n isIncoming: false,\n };\n }\n\n private requestPreSpanHookConverse(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger\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 spanAttributes,\n };\n }\n\n private requestPreSpanHookInvokeModel(\n request: NormalizedRequest,\n config: AwsSdkInstrumentationConfig,\n diag: DiagLogger\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 spanAttributes,\n };\n }\n\n responseHook(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ) {\n if (!span.isRecording()) {\n return;\n }\n\n switch (response.request.commandName) {\n case 'Converse':\n return this.responseHookConverse(response, span, tracer, config);\n case 'InvokeModel':\n return this.responseHookInvokeModel(response, span, tracer, config);\n }\n }\n\n private responseHookConverse(\n response: NormalizedResponse,\n span: Span,\n tracer: Tracer,\n config: AwsSdkInstrumentationConfig\n ) {\n const { stopReason, usage } = response.data;\n if (usage) {\n const { inputTokens, outputTokens } = usage;\n if (inputTokens !== undefined) {\n span.setAttribute(ATTR_GEN_AI_USAGE_INPUT_TOKENS, inputTokens);\n }\n if (outputTokens !== undefined) {\n span.setAttribute(ATTR_GEN_AI_USAGE_OUTPUT_TOKENS, outputTokens);\n }\n }\n\n if (stopReason !== undefined) {\n span.setAttribute(ATTR_GEN_AI_RESPONSE_FINISH_REASONS, [stopReason]);\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"]}
@@ -1,3 +1,3 @@
1
- export declare const PACKAGE_VERSION = "0.51.0";
1
+ export declare const PACKAGE_VERSION = "0.52.0";
2
2
  export declare const PACKAGE_NAME = "@opentelemetry/instrumentation-aws-sdk";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -17,6 +17,6 @@
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.PACKAGE_NAME = exports.PACKAGE_VERSION = void 0;
19
19
  // this is autogenerated file, see scripts/version-update.js
20
- exports.PACKAGE_VERSION = '0.51.0';
20
+ exports.PACKAGE_VERSION = '0.52.0';
21
21
  exports.PACKAGE_NAME = '@opentelemetry/instrumentation-aws-sdk';
22
22
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,eAAe,GAAG,QAAQ,CAAC;AAC3B,QAAA,YAAY,GAAG,wCAAwC,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\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 */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const PACKAGE_VERSION = '0.51.0';\nexport const PACKAGE_NAME = '@opentelemetry/instrumentation-aws-sdk';\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAEH,4DAA4D;AAC/C,QAAA,eAAe,GAAG,QAAQ,CAAC;AAC3B,QAAA,YAAY,GAAG,wCAAwC,CAAC","sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\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 */\n\n// this is autogenerated file, see scripts/version-update.js\nexport const PACKAGE_VERSION = '0.52.0';\nexport const PACKAGE_NAME = '@opentelemetry/instrumentation-aws-sdk';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentelemetry/instrumentation-aws-sdk",
3
- "version": "0.51.0",
3
+ "version": "0.52.0",
4
4
  "description": "OpenTelemetry instrumentation for `aws-sdk` and `@aws-sdk/client-*` clients for various AWS services",
5
5
  "keywords": [
6
6
  "aws",
@@ -68,7 +68,7 @@
68
68
  "eslint": "8.7.0",
69
69
  "expect": "29.2.0",
70
70
  "nock": "13.3.3",
71
- "nyc": "15.1.0",
71
+ "nyc": "17.1.0",
72
72
  "rimraf": "5.0.10",
73
73
  "sinon": "15.2.0",
74
74
  "test-all-versions": "6.1.0",
@@ -77,5 +77,5 @@
77
77
  "engines": {
78
78
  "node": "^18.19.0 || >=20.6.0"
79
79
  },
80
- "gitHead": "88386368afca78a4b3ed898eb5c28e4f5bde2271"
80
+ "gitHead": "a99ba69d9646d8861161b29c0d6ccb91508b7b61"
81
81
  }