Skip to content

Commit 90a24a1

Browse files
committed
AWS Bedrock llm event refactor, rename llm-events-new to llm-events
1 parent 4b263e9 commit 90a24a1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+245
-593
lines changed

lib/instrumentation/aws-sdk/v3/bedrock.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@
44
*/
55

66
'use strict'
7+
const StreamHandler = require('./stream-handler')
8+
const ConverseStreamHandler = require('./converse-stream-handler')
79
const {
810
LlmChatCompletionMessage,
911
LlmChatCompletionSummary,
1012
LlmEmbedding,
11-
LlmErrorMessage,
1213
BedrockCommand,
1314
BedrockResponse,
14-
StreamHandler
1515
} = require('../../../llm-events/aws-bedrock')
16+
const LlmErrorMessage = require('#agentlib/llm-events/error-message.js')
1617

1718
const { DESTINATIONS } = require('../../../config/attribute-filter')
1819
const { AI } = require('../../../metrics/names')
1920
const { RecorderSpec } = require('../../../shim/specs')
2021
const InstrumentationDescriptor = require('../../../instrumentation-descriptor')
2122
const { extractLlmContext } = require('../../../util/llm-utils')
22-
const ConverseStreamHandler = require('../../../llm-events/aws-bedrock/converse-stream-handler')
2323

2424
let TRACKING_METRIC
2525

@@ -73,7 +73,7 @@ function isStreamingEnabled({ commandName, config }) {
7373
* @param {object} params.msg LLM event
7474
*/
7575
function recordEvent({ agent, type, msg }) {
76-
msg.serialize()
76+
if (msg.serialize) msg.serialize() // TODO: remove
7777
const llmContext = extractLlmContext(agent)
7878
const timestamp = msg?.timestamp ?? Date.now()
7979

@@ -134,7 +134,7 @@ function recordChatCompletionMessages({
134134
bedrockCommand,
135135
transaction,
136136
segment,
137-
isError: err !== null
137+
error: err !== null
138138
})
139139

140140
// Record context message(s)
@@ -149,7 +149,7 @@ function recordChatCompletionMessages({
149149
content: contextMessage.content,
150150
role: contextMessage.role,
151151
bedrockResponse,
152-
index: i,
152+
sequence: i,
153153
completionId: summary.id
154154
})
155155
recordEvent({ agent, type: 'LlmChatCompletionMessage', msg })
@@ -164,7 +164,7 @@ function recordChatCompletionMessages({
164164
bedrockCommand,
165165
bedrockResponse,
166166
isResponse: true,
167-
index: promptContextMessages.length + i,
167+
sequence: promptContextMessages.length + i,
168168
content,
169169
role: 'assistant',
170170
completionId: summary.id
@@ -216,10 +216,11 @@ function recordEmbeddingMessage({
216216
agent,
217217
segment,
218218
transaction,
219-
bedrockCommand,
220-
input: prompt.content,
221-
bedrockResponse,
222-
isError: err !== null
219+
requestModel: bedrockCommand?.modelId,
220+
requestInput: prompt.content,
221+
requestId: bedrockResponse?.requestId,
222+
totalTokenCount: bedrockResponse?.totalTokenCount,
223+
error: err !== null
223224
}))
224225

225226
for (const embedding of embeddings) {

lib/llm-events/aws-bedrock/converse-stream-handler.js renamed to lib/instrumentation/aws-sdk/v3/converse-stream-handler.js

File renamed without changes.
File renamed without changes.

lib/llm-events/aws-bedrock/chat-completion-message.js

Lines changed: 0 additions & 92 deletions
This file was deleted.

lib/llm-events/aws-bedrock/chat-completion-summary.js

Lines changed: 0 additions & 68 deletions
This file was deleted.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright 2026 New Relic Corporation. All rights reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
const LlmChatCompletionMessage = require('../chat-message')
7+
8+
module.exports = class AwsBedrockLlmChatCompletionMessage extends LlmChatCompletionMessage {
9+
/**
10+
*
11+
* @param {object} params constructor parameters
12+
* @param {Agent} params.agent New Relic agent instance
13+
* @param {object} params.segment Current segment
14+
* @param {object} params.transaction Current and active transaction
15+
* @param {object} params.bedrockCommand AWS Bedrock Command object, represents the request
16+
* @param {object} params.bedrockResponse AWS Bedrock Response object
17+
* @param {string} params.content Content of the message
18+
* @param {string} [params.role] Role of the message creator (e.g. `user`, `assistant`, `tool`)
19+
* @param {string} params.completionId ID of the `LlmChatCompletionSummary` event that
20+
* this message event is connected to
21+
* @param {number} params.sequence Index (beginning at 0) associated with
22+
* each message including the prompt and responses
23+
* @param {boolean} [params.isResponse] Indiciates if this message is the response
24+
*/
25+
constructor({ agent, segment, transaction, bedrockCommand, bedrockResponse, content, role, completionId, sequence = 0, isResponse }) {
26+
super({ agent,
27+
segment,
28+
transaction,
29+
vendor: 'bedrock',
30+
content,
31+
role,
32+
sequence,
33+
requestId: bedrockResponse?.requestId,
34+
responseId: bedrockResponse?.id,
35+
responseModel: bedrockCommand?.modelId, // we can assume requestModel==responseModel in bedrock
36+
completionId,
37+
isResponse })
38+
39+
this.appName = agent.config.applications()[0] // TODO: still required?
40+
this.setTokenCount(agent, bedrockCommand, bedrockResponse)
41+
}
42+
43+
setTokenCount(agent, bedrockCommand, bedrockResponse) {
44+
const tokenCB = agent?.llm?.tokenCountCallback
45+
46+
if (tokenCB) {
47+
const promptContent = bedrockCommand?.prompt?.map((msg) => msg.content).join(' ')
48+
const completionContent = bedrockResponse?.completions?.join(' ')
49+
50+
if (promptContent && completionContent) {
51+
this.setTokenFromCallback(
52+
{
53+
tokenCB,
54+
reqModel: bedrockCommand.modelId,
55+
resModel: bedrockCommand.modelId,
56+
promptContent,
57+
completionContent
58+
}
59+
)
60+
}
61+
return
62+
}
63+
64+
this.setTokenInCompletionMessage({ promptTokens: bedrockResponse.inputTokenCount,
65+
completionTokens: bedrockResponse.outputTokenCount })
66+
}
67+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright 2026 New Relic Corporation. All rights reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
const LlmChatCompletionSummary = require('../chat-summary')
7+
8+
module.exports = class AwsBedrockLlmChatCompletionSummary extends LlmChatCompletionSummary {
9+
/**
10+
*
11+
* @param {object} params constructor parameters
12+
* @param {Agent} params.agent New Relic agent instance
13+
* @param {object} params.segment Current segment
14+
* @param {object} params.transaction Current and active transaction
15+
* @param {object} params.bedrockCommand AWS Bedrock Command object, represents the request
16+
* @param {object} params.bedrockResponse AWS Bedrock Response object
17+
* @param {boolean} [params.error] Set to `true` if an error occurred during creation call, omitted if no error occurred
18+
*/
19+
constructor({ agent, segment, transaction, bedrockCommand, bedrockResponse, error }) {
20+
super({ agent,
21+
segment,
22+
transaction,
23+
error,
24+
vendor: 'bedrock',
25+
requestModel: bedrockCommand?.modelId,
26+
requestId: bedrockResponse?.requestId,
27+
responseModel: bedrockCommand?.modelId, // we can assume requestModel==responseModel in bedrock
28+
temperature: bedrockCommand.temperature,
29+
maxTokens: bedrockCommand.maxTokens,
30+
numMsgs: (bedrockCommand.prompt.length ?? 0) + (bedrockResponse.completions.length ?? 0),
31+
finishReason: bedrockResponse?.finishReason })
32+
33+
this.appName = agent.config.applications()[0] // TODO: still required?
34+
this.setTokens(agent, bedrockCommand, bedrockResponse)
35+
}
36+
37+
setTokens(agent, bedrockCommand, bedrockResponse) {
38+
const tokenCB = agent?.llm?.tokenCountCallback
39+
40+
// Prefer callback for prompt and completion tokens; if unavailable, fall back to response data.
41+
if (tokenCB) {
42+
const promptContent = bedrockCommand?.prompt?.map((msg) => msg.content).join(' ')
43+
const completionContent = bedrockResponse?.completions?.join(' ')
44+
45+
this.setTokenUsageFromCallback(
46+
{
47+
tokenCB,
48+
reqModel: bedrockCommand.modelId,
49+
resModel: bedrockCommand.modelId,
50+
promptContent,
51+
completionContent
52+
}
53+
)
54+
return
55+
}
56+
57+
this.setTokensInResponse({ promptTokens: bedrockResponse.inputTokenCount,
58+
completionTokens: bedrockResponse.outputTokenCount,
59+
totalTokens: bedrockResponse.totalTokenCount })
60+
}
61+
}

0 commit comments

Comments
 (0)