Skip to content

Commit 2e414f5

Browse files
committed
Fix attempt
1 parent 0a09373 commit 2e414f5

File tree

5 files changed

+106
-53
lines changed

5 files changed

+106
-53
lines changed

orchestration/src/main/java/com/sap/ai/sdk/orchestration/AssistantMessage.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
import com.google.common.annotations.Beta;
66
import com.sap.ai.sdk.orchestration.model.AssistantChatMessage;
77
import com.sap.ai.sdk.orchestration.model.ChatMessage;
8+
import com.sap.ai.sdk.orchestration.model.ChatMessageContent;
89
import com.sap.ai.sdk.orchestration.model.MessageToolCall;
10+
import com.sap.ai.sdk.orchestration.model.TextContent;
911
import java.util.List;
1012
import javax.annotation.Nonnull;
1113
import javax.annotation.Nullable;
1214
import lombok.Getter;
1315
import lombok.Value;
1416
import lombok.experimental.Accessors;
17+
import lombok.val;
1518

1619
/** Represents a chat message as 'assistant' to the orchestration service. */
1720
@Value
@@ -40,6 +43,16 @@ public AssistantMessage(@Nonnull final String singleMessage) {
4043
toolCalls = null;
4144
}
4245

46+
/**
47+
* Creates a new assistant message with the given single message.
48+
*
49+
* @param content the single message.
50+
*/
51+
AssistantMessage(@Nonnull final MessageContent content) {
52+
this.content = content;
53+
toolCalls = null;
54+
}
55+
4356
/**
4457
* Creates a new assistant message with the given tool calls.
4558
*
@@ -56,6 +69,13 @@ public ChatMessage createChatMessage() {
5669
if (toolCalls() != null) {
5770
return AssistantChatMessage.create().role(ASSISTANT).toolCalls(toolCalls);
5871
}
59-
return AssistantChatMessage.create().role(ASSISTANT).content(content);
72+
val texts =
73+
content.items().stream()
74+
.filter(item -> item instanceof TextItem)
75+
.map(item -> (TextItem) item)
76+
.map(item -> TextContent.create().type(TextContent.TypeEnum.TEXT).text(item.text()))
77+
.toList();
78+
79+
return AssistantChatMessage.create().role(ASSISTANT).content(ChatMessageContent.create(texts));
6080
}
6181
}
Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.sap.ai.sdk.orchestration;
22

33
import com.sap.ai.sdk.orchestration.model.ChatMessageContent;
4-
import com.sap.ai.sdk.orchestration.model.ImageContent;
5-
import com.sap.ai.sdk.orchestration.model.TextContent;
4+
import com.sap.ai.sdk.orchestration.model.UserChatMessageContent;
5+
import com.sap.ai.sdk.orchestration.model.UserChatMessageContentItem;
6+
import java.util.ArrayList;
67
import java.util.List;
78
import javax.annotation.Nonnull;
9+
import lombok.val;
810

911
/**
1012
* Represents the content of a chat message.
@@ -14,22 +16,39 @@
1416
*/
1517
public record MessageContent(@Nonnull List<ContentItem> items) {
1618
@Nonnull
17-
static MessageContent fromMCMContentList(@Nonnull final List<ChatMessageContent> mCMContentList) {
18-
final var itemList =
19-
mCMContentList.stream()
20-
.map(
21-
content -> {
22-
if (content instanceof TextContent text) {
23-
return new TextItem(text.getText());
24-
} else {
25-
final var imageUrl = ((ImageContent) content).getImageUrl();
26-
return (ContentItem)
27-
new ImageItem(
28-
imageUrl.getUrl(),
29-
ImageItem.DetailLevel.fromString(imageUrl.getDetail()));
30-
}
31-
})
32-
.toList();
33-
return new MessageContent(itemList);
19+
static MessageContent fromChatMessageContent(final ChatMessageContent chatMessageContent) {
20+
if (chatMessageContent instanceof ChatMessageContent.InnerString innerString) {
21+
return new MessageContent(List.of(new TextItem(innerString.value())));
22+
} else if (chatMessageContent
23+
instanceof ChatMessageContent.InnerTextContents innerTextContents) {
24+
val texts =
25+
innerTextContents.values().stream()
26+
.map(textContent -> ((ContentItem) new TextItem(textContent.getText())))
27+
.toList();
28+
return new MessageContent(texts);
29+
}
30+
return new MessageContent(List.of());
31+
}
32+
33+
@Nonnull
34+
static MessageContent fromUserChatMessageContent(
35+
final UserChatMessageContent chatMessageContent) {
36+
if (chatMessageContent instanceof UserChatMessageContent.InnerString innerString) {
37+
return new MessageContent(List.of(new TextItem(innerString.value())));
38+
} else if (chatMessageContent
39+
instanceof
40+
final UserChatMessageContent.InnerUserChatMessageContentItems innerContentItems) {
41+
val items = new ArrayList<ContentItem>();
42+
for (val value : innerContentItems.values()) {
43+
if (value.getType().equals(UserChatMessageContentItem.TypeEnum.TEXT)) {
44+
items.add(new TextItem(value.getText()));
45+
} else if (value.getType().equals(UserChatMessageContentItem.TypeEnum.IMAGE_URL)) {
46+
val detailLevel = ImageItem.DetailLevel.fromString(value.getImageUrl().getDetail());
47+
items.add(new ImageItem(value.getImageUrl().getUrl(), detailLevel));
48+
}
49+
}
50+
return new MessageContent(items);
51+
}
52+
return new MessageContent(List.of());
3453
}
3554
}

orchestration/src/main/java/com/sap/ai/sdk/orchestration/OrchestrationChatResponse.java

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,21 @@
22

33
import static lombok.AccessLevel.PACKAGE;
44

5+
import com.sap.ai.sdk.orchestration.model.AssistantChatMessage;
56
import com.sap.ai.sdk.orchestration.model.ChatMessage;
7+
import com.sap.ai.sdk.orchestration.model.ChatMessageContent;
68
import com.sap.ai.sdk.orchestration.model.CompletionPostResponseSynchronous;
79
import 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;
1111
import 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;
1214
import java.util.ArrayList;
1315
import java.util.List;
1416
import javax.annotation.Nonnull;
1517
import lombok.RequiredArgsConstructor;
1618
import 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
}

orchestration/src/main/java/com/sap/ai/sdk/orchestration/SystemMessage.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,20 @@
44

55
import com.google.common.annotations.Beta;
66
import com.sap.ai.sdk.orchestration.model.ChatMessage;
7+
import com.sap.ai.sdk.orchestration.model.ChatMessageContent;
78
import com.sap.ai.sdk.orchestration.model.SystemChatMessage;
89
import java.util.LinkedList;
910
import java.util.List;
1011
import javax.annotation.Nonnull;
12+
13+
import com.sap.ai.sdk.orchestration.model.TextContent;
1114
import lombok.AccessLevel;
1215
import lombok.Getter;
1316
import lombok.RequiredArgsConstructor;
1417
import lombok.Value;
1518
import lombok.experimental.Accessors;
1619
import lombok.experimental.Tolerate;
20+
import lombok.val;
1721

1822
/** Represents a chat message as 'system' to the orchestration service. */
1923
@Value
@@ -56,6 +60,12 @@ public SystemMessage withText(@Nonnull final String message) {
5660
@Nonnull
5761
@Override
5862
public ChatMessage createChatMessage() {
59-
return SystemChatMessage.create().role(SYSTEM).content(content);
63+
val texts =
64+
content.items().stream()
65+
.filter(item -> item instanceof TextItem)
66+
.map(item -> (TextItem) item)
67+
.map(item -> TextContent.create().type(TextContent.TypeEnum.TEXT).text(item.text()))
68+
.toList();
69+
return SystemChatMessage.create().role(SYSTEM).content(ChatMessageContent.create(texts));
6070
}
6171
}

orchestration/src/main/java/com/sap/ai/sdk/orchestration/UserMessage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public UserMessage withImage(@Nonnull final String imageUrl) {
8888
return new UserMessage(new MessageContent(contentItems));
8989
}
9090

91+
@Override
9192
@Nonnull
9293
public ChatMessage createChatMessage() {
9394
final var contentList = new LinkedList<UserChatMessageContentItem>();

0 commit comments

Comments
 (0)