22
33import static lombok .AccessLevel .PACKAGE ;
44
5+ import com .sap .ai .sdk .orchestration .model .AssistantChatMessage ;
56import com .sap .ai .sdk .orchestration .model .ChatMessage ;
7+ import com .sap .ai .sdk .orchestration .model .ChatMessageContent ;
68import com .sap .ai .sdk .orchestration .model .CompletionPostResponseSynchronous ;
79import com .sap .ai .sdk .orchestration .model .LLMChoiceSynchronous ;
8- import com .sap .ai .sdk .orchestration .model .LLMModuleResultSynchronous ;
9- import com .sap .ai .sdk .orchestration .model .MultiChatMessage ;
10- import com .sap .ai .sdk .orchestration .model .SingleChatMessage ;
10+ import com .sap .ai .sdk .orchestration .model .SystemChatMessage ;
1111import com .sap .ai .sdk .orchestration .model .TokenUsage ;
12+ import com .sap .ai .sdk .orchestration .model .ToolChatMessage ;
13+ import com .sap .ai .sdk .orchestration .model .UserChatMessage ;
1214import java .util .ArrayList ;
1315import java .util .List ;
1416import javax .annotation .Nonnull ;
1517import lombok .RequiredArgsConstructor ;
1618import lombok .Value ;
19+ import lombok .val ;
1720
1821/** Orchestration chat completion output. */
1922@ Value
@@ -46,7 +49,7 @@ public String getContent() throws OrchestrationClientException {
4649 */
4750 @ Nonnull
4851 public TokenUsage getTokenUsage () {
49- return (( LLMModuleResultSynchronous ) originalResponse .getOrchestrationResult () ).getUsage ();
52+ return originalResponse .getOrchestrationResult ().getUsage ();
5053 }
5154
5255 /**
@@ -57,50 +60,50 @@ public TokenUsage getTokenUsage() {
5760 */
5861 @ Nonnull
5962 public List <Message > getAllMessages () throws IllegalArgumentException {
60- final var messages = new ArrayList <Message >();
63+ val messages = new ArrayList <Message >();
6164 for (final ChatMessage chatMessage : originalResponse .getModuleResults ().getTemplating ()) {
62- if (chatMessage instanceof SingleChatMessage simpleMsg ) {
63- messages .add (chatMessageIntoMessage (simpleMsg ));
64- } else if (chatMessage instanceof MultiChatMessage mCMessage ) {
65- messages .add (chatMessageIntoMessage (mCMessage ));
65+ if (chatMessage instanceof AssistantChatMessage assistantChatMessage ) {
66+ val toolCalls = assistantChatMessage .getToolCalls ();
67+ if (!toolCalls .isEmpty ()) {
68+ messages .add (new AssistantMessage (toolCalls ));
69+ } else {
70+ messages .add (
71+ new AssistantMessage (
72+ MessageContent .fromChatMessageContent (assistantChatMessage .getContent ())));
73+ }
74+ } else if (chatMessage instanceof SystemChatMessage systemChatMessage ) {
75+ messages .add (
76+ new SystemMessage (
77+ MessageContent .fromChatMessageContent (systemChatMessage .getContent ())));
78+ } else if (chatMessage instanceof UserChatMessage userChatMessage ) {
79+ messages .add (
80+ new UserMessage (
81+ MessageContent .fromUserChatMessageContent (userChatMessage .getContent ())));
82+ } else if (chatMessage instanceof ToolChatMessage toolChatMessage ) {
83+ messages .add (
84+ new ToolMessage (
85+ toolChatMessage .getToolCallId (),
86+ ((ChatMessageContent .InnerString ) toolChatMessage .getContent ()).value ()));
6687 } else {
6788 throw new IllegalArgumentException (
6889 "Messages of type " + chatMessage .getClass () + " are not supported by convenience API" );
6990 }
7091 }
92+
7193 messages .add (Message .assistant (getChoice ().getMessage ().getContent ()));
7294 return messages ;
7395 }
7496
75- @ Nonnull
76- private Message chatMessageIntoMessage (@ Nonnull final SingleChatMessage simpleMsg ) {
77- return switch (simpleMsg .getRole ()) {
78- case "user" -> Message .user (simpleMsg .getContent ());
79- case "assistant" -> Message .assistant (simpleMsg .getContent ());
80- case "system" -> Message .system (simpleMsg .getContent ());
81- default -> throw new IllegalStateException ("Unexpected role: " + simpleMsg .getRole ());
82- };
83- }
84-
85- @ Nonnull
86- private Message chatMessageIntoMessage (@ Nonnull final MultiChatMessage mCMessage ) {
87- return switch (mCMessage .getRole ()) {
88- case "user" -> new UserMessage (MessageContent .fromMCMContentList (mCMessage .getContent ()));
89- case "system" -> new SystemMessage (MessageContent .fromMCMContentList (mCMessage .getContent ()));
90- default ->
91- throw new IllegalStateException (
92- "Unexpected role with complex message: " + mCMessage .getRole ());
93- };
94- }
95-
9697 /**
9798 * Get the LLM response. Useful for accessing the finish reason or further data like logprobs.
9899 *
99- * @return The (first, in case of multiple) {@link LLMChoiceSynchronous}.
100+ * @return The (first, in case of multiple) {@link com.sap.ai.sdk.orchestration.model. LLMChoiceSynchronous}.
100101 */
101102 @ Nonnull
102103 public LLMChoiceSynchronous getChoice () {
103104 // We expect choices to be defined and never empty.
104- return originalResponse .getOrchestrationResult ().getChoices ().get (0 );
105+ return originalResponse .getOrchestrationResult ()
106+ .getChoices ()
107+ .get (0 );
105108 }
106109}
0 commit comments