2222
2323import com .openai .models .ChatCompletion ;
2424import com .openai .models .ChatCompletionAssistantMessageParam ;
25- import com .openai .models .ChatCompletionContentPart ;
2625import com .openai .models .ChatCompletionContentPartText ;
2726import com .openai .models .ChatCompletionCreateParams ;
2827import com .openai .models .ChatCompletionMessage ;
4039import java .util .HashMap ;
4140import java .util .List ;
4241import java .util .Map ;
42+ import java .util .Objects ;
4343import java .util .stream .Collectors ;
4444
4545public class ChatCompletionEventsHelper {
@@ -54,24 +54,28 @@ public static void emitPromptLogEvents(
5454 if (!settings .emitEvents ) {
5555 return ;
5656 }
57+
5758 for (ChatCompletionMessageParam msg : request .messages ()) {
5859 String eventType ;
5960 MapValueBuilder bodyBuilder = new MapValueBuilder ();
60- if (msg .isChatCompletionSystemMessageParam ()) {
61- ChatCompletionSystemMessageParam sysMsg = msg .asChatCompletionSystemMessageParam ();
61+ Object concreteMessageParam = ApiAdapter .get ().extractConcreteCompletionMessageParam (msg );
62+ if (concreteMessageParam instanceof ChatCompletionSystemMessageParam ) {
63+ ChatCompletionSystemMessageParam sysMsg =
64+ (ChatCompletionSystemMessageParam ) concreteMessageParam ;
6265 eventType = "gen_ai.system.message" ;
6366 if (settings .captureMessageContent ) {
6467 putIfNotEmpty (bodyBuilder , "content" , contentToString (sysMsg .content ()));
6568 }
66- } else if (msg .isChatCompletionUserMessageParam ()) {
67- ChatCompletionUserMessageParam userMsg = msg .asChatCompletionUserMessageParam ();
69+ } else if (concreteMessageParam instanceof ChatCompletionUserMessageParam ) {
70+ ChatCompletionUserMessageParam userMsg =
71+ (ChatCompletionUserMessageParam ) concreteMessageParam ;
6872 eventType = "gen_ai.user.message" ;
6973 if (settings .captureMessageContent ) {
7074 putIfNotEmpty (bodyBuilder , "content" , contentToString (userMsg .content ()));
7175 }
72- } else if (msg . isChatCompletionAssistantMessageParam () ) {
76+ } else if (concreteMessageParam instanceof ChatCompletionAssistantMessageParam ) {
7377 ChatCompletionAssistantMessageParam assistantMsg =
74- msg . asChatCompletionAssistantMessageParam () ;
78+ ( ChatCompletionAssistantMessageParam ) concreteMessageParam ;
7579 eventType = "gen_ai.assistant.message" ;
7680 if (settings .captureMessageContent ) {
7781 assistantMsg
@@ -89,8 +93,9 @@ public static void emitPromptLogEvents(
8993 bodyBuilder .put ("tool_calls" , Value .of (toolCallsJson ));
9094 });
9195 }
92- } else if (msg .isChatCompletionToolMessageParam ()) {
93- ChatCompletionToolMessageParam toolMsg = msg .asChatCompletionToolMessageParam ();
96+ } else if (concreteMessageParam instanceof ChatCompletionToolMessageParam ) {
97+ ChatCompletionToolMessageParam toolMsg =
98+ (ChatCompletionToolMessageParam ) concreteMessageParam ;
9499 eventType = "gen_ai.tool.message" ;
95100 if (settings .captureMessageContent ) {
96101 putIfNotEmpty (bodyBuilder , "content" , contentToString (toolMsg .content ()));
@@ -110,8 +115,9 @@ private static void putIfNotEmpty(MapValueBuilder bodyBuilder, String key, Strin
110115 }
111116
112117 private static String contentToString (ChatCompletionToolMessageParam .Content content ) {
113- if (content .isTextContent ()) {
114- return content .asTextContent ();
118+ String text = ApiAdapter .get ().asText (content );
119+ if (text != null ) {
120+ return text ;
115121 } else if (content .isArrayOfContentParts ()) {
116122 return content .asArrayOfContentParts ().stream ()
117123 .map (ChatCompletionContentPartText ::text )
@@ -122,28 +128,23 @@ private static String contentToString(ChatCompletionToolMessageParam.Content con
122128 }
123129
124130 private static String contentToString (ChatCompletionAssistantMessageParam .Content content ) {
125- if (content .isTextContent ()) {
126- return content .asTextContent ();
131+ String text = ApiAdapter .get ().asText (content );
132+ if (text != null ) {
133+ return text ;
127134 } else if (content .isArrayOfContentParts ()) {
128135 return content .asArrayOfContentParts ().stream ()
129- .map (
130- cnt -> {
131- if (cnt .isChatCompletionContentPartText ()) {
132- return cnt .asChatCompletionContentPartText ().text ();
133- } else if (cnt .isChatCompletionContentPartRefusal ()) {
134- return cnt .asChatCompletionContentPartRefusal ().refusal ();
135- }
136- return "" ;
137- })
136+ .map (ApiAdapter .get ()::extractTextOrRefusal )
137+ .filter (Objects ::nonNull )
138138 .collect (Collectors .joining ());
139139 } else {
140140 throw new IllegalStateException ("Unhandled content type for " + content );
141141 }
142142 }
143143
144144 private static String contentToString (ChatCompletionSystemMessageParam .Content content ) {
145- if (content .isTextContent ()) {
146- return content .asTextContent ();
145+ String text = ApiAdapter .get ().asText (content );
146+ if (text != null ) {
147+ return text ;
147148 } else if (content .isArrayOfContentParts ()) {
148149 return content .asArrayOfContentParts ().stream ()
149150 .map (ChatCompletionContentPartText ::text )
@@ -154,13 +155,13 @@ private static String contentToString(ChatCompletionSystemMessageParam.Content c
154155 }
155156
156157 private static String contentToString (ChatCompletionUserMessageParam .Content content ) {
157- if (content .isTextContent ()) {
158- return content .asTextContent ();
158+ String text = ApiAdapter .get ().asText (content );
159+ if (text != null ) {
160+ return text ;
159161 } else if (content .isArrayOfContentParts ()) {
160162 return content .asArrayOfContentParts ().stream ()
161- .filter (ChatCompletionContentPart ::isChatCompletionContentPartText )
162- .map (ChatCompletionContentPart ::asChatCompletionContentPartText )
163- .map (ChatCompletionContentPartText ::text )
163+ .map (ApiAdapter .get ()::extractText )
164+ .filter (Objects ::nonNull )
164165 .collect (Collectors .joining ());
165166 } else {
166167 throw new IllegalStateException ("Unhandled content type for " + content );
0 commit comments