@@ -10,7 +10,6 @@ import ai.koog.agents.features.opentelemetry.attribute.CommonAttributes
10
10
import ai.koog.agents.features.opentelemetry.attribute.SpanAttributes
11
11
import ai.koog.agents.features.opentelemetry.event.AssistantMessageEvent
12
12
import ai.koog.agents.features.opentelemetry.event.ChoiceEvent
13
- import ai.koog.agents.features.opentelemetry.event.GenAIAgentEvent
14
13
import ai.koog.agents.features.opentelemetry.event.ModerationResponseEvent
15
14
import ai.koog.agents.features.opentelemetry.event.SystemMessageEvent
16
15
import ai.koog.agents.features.opentelemetry.event.ToolMessageEvent
@@ -261,27 +260,24 @@ public class OpenTelemetry {
261
260
spanProcessor.startSpan(inferenceSpan)
262
261
263
262
// Add events to the InferenceSpan after the span is created
264
- val lastMessage = eventContext.prompt.messages.lastOrNull()
265
-
266
- val events: List <GenAIAgentEvent > = lastMessage?.let { message ->
267
- buildList {
268
- when (message) {
269
- is Message .User -> add(UserMessageEvent (provider, message, verbose = config.isVerbose))
270
- is Message .System -> add(SystemMessageEvent (provider, message, verbose = config.isVerbose))
271
- is Message .Assistant -> add(
272
- AssistantMessageEvent (
273
- provider,
274
- message,
275
- verbose = config.isVerbose
276
- )
263
+ val eventsFromMessages = eventContext.prompt.messages.mapNotNull { message ->
264
+ when (message) {
265
+ is Message .User -> UserMessageEvent (provider, message, verbose = config.isVerbose)
266
+ is Message .System -> SystemMessageEvent (provider, message, verbose = config.isVerbose)
267
+ is Message .Assistant -> AssistantMessageEvent (provider, message, verbose = config.isVerbose)
268
+ is Message .Tool .Result -> {
269
+ ToolMessageEvent (
270
+ provider = provider,
271
+ toolCallId = message.id,
272
+ content = message.content,
273
+ verbose = config.isVerbose
277
274
)
278
-
279
- else -> {}
280
275
}
276
+ else -> null
281
277
}
282
- } ? : emptyList()
278
+ }
283
279
284
- inferenceSpan.addEvents(events )
280
+ inferenceSpan.addEvents(eventsFromMessages )
285
281
}
286
282
287
283
pipeline.interceptAfterLLMCall(interceptContext) { eventContext ->
@@ -305,22 +301,20 @@ public class OpenTelemetry {
305
301
val provider = eventContext.model.provider
306
302
307
303
// Add events to the InferenceSpan before finishing the span
308
- val lastMessage = eventContext.responses.lastOrNull()
309
-
310
- val moderationResult = eventContext.moderationResponse
311
-
312
- val events: List <GenAIAgentEvent > = lastMessage?.let { message ->
313
- buildList {
304
+ val eventsToAdd = buildList {
305
+ eventContext.responses.map { message ->
314
306
when (message) {
315
- is Message .Assistant -> add(ChoiceEvent (provider, message, config.isVerbose))
316
- else -> {}
307
+ is Message .Assistant -> add(AssistantMessageEvent (provider, message, verbose = config.isVerbose))
308
+ is Message . Tool . Call -> add( ChoiceEvent (provider, message, verbose = config.isVerbose))
317
309
}
318
310
}
319
- } ? : moderationResult?.let {
320
- buildList { add(ModerationResponseEvent (provider, it, config.isVerbose)) }
321
- } ? : emptyList()
322
311
323
- inferenceSpan.addEvents(events)
312
+ eventContext.moderationResponse?.let { response ->
313
+ ModerationResponseEvent (provider, response, config.isVerbose)
314
+ }
315
+ }
316
+
317
+ inferenceSpan.addEvents(eventsToAdd)
324
318
325
319
// Stop InferenceSpan
326
320
spanProcessor.endSpan(inferenceSpanId)
@@ -364,38 +358,13 @@ public class OpenTelemetry {
364
358
val nodeInfoElement = currentCoroutineContext().getNodeInfoElement()
365
359
? : error(" Unable to create tool call span due to missing node info in context" )
366
360
367
- val agentId = agentRunInfoElement.agentId
368
- val runId = agentRunInfoElement.runId
369
- val provider = agentRunInfoElement.agentConfig.model.provider
370
- val nodeName = nodeInfoElement.nodeName
371
- val toolName = eventContext.tool.name
372
-
373
361
val executeToolSpanId = ExecuteToolSpan .createId(
374
- agentId = agentId,
375
- runId = runId,
376
- nodeName = nodeName,
377
- toolName = toolName
362
+ agentId = agentRunInfoElement. agentId,
363
+ runId = agentRunInfoElement. runId,
364
+ nodeName = nodeInfoElement. nodeName,
365
+ toolName = eventContext.tool.name
378
366
)
379
367
380
- // Add events to the ExecuteToolSpan before finishing the span
381
- val events = buildList {
382
- val toolResult = eventContext.result
383
- logger.debug { " Last tool result message from prompt: $toolResult " }
384
-
385
- if (toolResult != null ) {
386
- add(
387
- ToolMessageEvent (
388
- provider = provider,
389
- toolCallId = eventContext.toolCallId,
390
- toolResult = toolResult,
391
- verbose = config.isVerbose
392
- )
393
- )
394
- }
395
- }
396
-
397
- spanProcessor.addEventsToSpan(spanId = executeToolSpanId, events = events)
398
-
399
368
// End the ExecuteToolSpan span
400
369
spanProcessor.endSpan(executeToolSpanId)
401
370
}
@@ -409,16 +378,11 @@ public class OpenTelemetry {
409
378
val nodeInfoElement = currentCoroutineContext().getNodeInfoElement()
410
379
? : error(" Unable to create tool call span due to missing node info in context" )
411
380
412
- val agentId = agentRunInfoElement.agentId
413
- val runId = agentRunInfoElement.runId
414
- val nodeName = nodeInfoElement.nodeName
415
- val toolName = eventContext.tool.name
416
-
417
381
val executeToolSpanId = ExecuteToolSpan .createId(
418
- agentId = agentId,
419
- runId = runId,
420
- nodeName = nodeName,
421
- toolName = toolName
382
+ agentId = agentRunInfoElement. agentId,
383
+ runId = agentRunInfoElement. runId,
384
+ nodeName = nodeInfoElement. nodeName,
385
+ toolName = eventContext.tool.name
422
386
)
423
387
424
388
// End the ExecuteToolSpan span
0 commit comments