in instrumentation/openai-client-instrumentation/instrumentation-1.1/src/main/java/co/elastic/otel/openai/v1_1/wrappers/ChatCompletionEventsHelper.java [57:114]
public static void emitPromptLogEvents(
ChatCompletionCreateParams request, InstrumentationSettings settings) {
if (!settings.emitEvents) {
return;
}
for (ChatCompletionMessageParam msg : request.messages()) {
String eventType;
MapValueBuilder bodyBuilder = new MapValueBuilder();
if (msg.isSystem()) {
eventType = "gen_ai.system.message";
if (settings.captureMessageContent) {
putIfNotEmpty(bodyBuilder, "content", contentToString(msg.asSystem().content()));
}
} else if (msg.isDeveloper()) {
eventType = "gen_ai.system.message";
putIfNotEmpty(bodyBuilder, "role", "developer");
if (settings.captureMessageContent) {
putIfNotEmpty(bodyBuilder, "content", contentToString(msg.asDeveloper().content()));
}
} else if (msg.isUser()) {
eventType = "gen_ai.user.message";
if (settings.captureMessageContent) {
putIfNotEmpty(bodyBuilder, "content", contentToString(msg.asUser().content()));
}
} else if (msg.isAssistant()) {
ChatCompletionAssistantMessageParam assistantMsg = msg.asAssistant();
eventType = "gen_ai.assistant.message";
if (settings.captureMessageContent) {
assistantMsg
.content()
.ifPresent(
content -> putIfNotEmpty(bodyBuilder, "content", contentToString(content)));
assistantMsg
.toolCalls()
.ifPresent(
toolCalls -> {
List<Value<?>> toolCallsJson =
toolCalls.stream()
.map(ChatCompletionEventsHelper::buildToolCallEventObject)
.collect(Collectors.toList());
bodyBuilder.put("tool_calls", Value.of(toolCallsJson));
});
}
} else if (msg.isTool()) {
ChatCompletionToolMessageParam toolMsg = msg.asTool();
eventType = "gen_ai.tool.message";
if (settings.captureMessageContent) {
putIfNotEmpty(bodyBuilder, "content", contentToString(toolMsg.content()));
bodyBuilder.put("id", toolMsg.toolCallId());
}
} else {
LOG.log(Level.WARNING, "Unhandled OpenAI message type will be dropped: {0}", msg);
continue;
}
newEvent(eventType).setBody(bodyBuilder.build()).emit();
}
}