Skip to content

Commit 2c97806

Browse files
T24: Change ChatModelTypes.Message rawContent from Object to String
Spring AI's Content.getText() returns String. We always cast to String on both sides. Object type gave false flexibility that would ClassCastException at runtime. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent e19463b commit 2c97806

4 files changed

Lines changed: 10 additions & 10 deletions

File tree

TASK_QUEUE.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"severity": "low",
4949
"category": "bugfix",
5050
"depends_on": [],
51-
"status": "todo",
51+
"status": "completed",
5252
"notes": "DABH review comment: https://github.com/temporalio/sdk-java/pull/2829/files#r3054049714. Verified Spring AI Message interface uses String, not Object."
5353
},
5454
{

temporal-spring-ai/src/main/java/io/temporal/springai/activity/ChatModelActivityImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ private Prompt createPrompt(ChatModelTypes.ChatModelActivityInput input) {
115115

116116
private org.springframework.ai.chat.messages.Message toSpringMessage(Message message) {
117117
return switch (message.role()) {
118-
case SYSTEM -> new SystemMessage((String) message.rawContent());
118+
case SYSTEM -> new SystemMessage(message.rawContent());
119119
case USER -> {
120-
UserMessage.Builder builder = UserMessage.builder().text((String) message.rawContent());
120+
UserMessage.Builder builder = UserMessage.builder().text(message.rawContent());
121121
if (!CollectionUtils.isEmpty(message.mediaContents())) {
122122
builder.media(
123123
message.mediaContents().stream().map(this::toMedia).collect(Collectors.toList()));
@@ -126,7 +126,7 @@ private org.springframework.ai.chat.messages.Message toSpringMessage(Message mes
126126
}
127127
case ASSISTANT ->
128128
AssistantMessage.builder()
129-
.content((String) message.rawContent())
129+
.content(message.rawContent())
130130
.properties(Map.of())
131131
.toolCalls(
132132
message.toolCalls() != null
@@ -152,7 +152,7 @@ private org.springframework.ai.chat.messages.Message toSpringMessage(Message mes
152152
.responses(
153153
List.of(
154154
new ToolResponseMessage.ToolResponse(
155-
message.toolCallId(), message.name(), (String) message.rawContent())))
155+
message.toolCallId(), message.name(), message.rawContent())))
156156
.build();
157157
};
158158
}

temporal-spring-ai/src/main/java/io/temporal/springai/model/ActivityChatModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ private AssistantMessage toAssistantMessage(ChatModelTypes.Message message) {
369369
}
370370

371371
return AssistantMessage.builder()
372-
.content((String) message.rawContent())
372+
.content(message.rawContent())
373373
.properties(Map.of())
374374
.toolCalls(toolCalls)
375375
.media(media)

temporal-spring-ai/src/main/java/io/temporal/springai/model/ChatModelTypes.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public record Usage(
8282
/**
8383
* A message in the conversation.
8484
*
85-
* @param rawContent the message content (typically a String)
85+
* @param rawContent the message text content
8686
* @param role the role of the message author
8787
* @param name optional name for the participant
8888
* @param toolCallId tool call ID this message responds to (for TOOL role)
@@ -92,7 +92,7 @@ public record Usage(
9292
@JsonInclude(JsonInclude.Include.NON_NULL)
9393
@JsonIgnoreProperties(ignoreUnknown = true)
9494
public record Message(
95-
@JsonProperty("content") Object rawContent,
95+
@JsonProperty("content") String rawContent,
9696
@JsonProperty("role") Role role,
9797
@JsonProperty("name") String name,
9898
@JsonProperty("tool_call_id") String toolCallId,
@@ -101,11 +101,11 @@ public record Message(
101101
List<ToolCall> toolCalls,
102102
@JsonProperty("media") @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
103103
List<MediaContent> mediaContents) {
104-
public Message(Object content, Role role) {
104+
public Message(String content, Role role) {
105105
this(content, role, null, null, null, null);
106106
}
107107

108-
public Message(Object content, List<MediaContent> mediaContents, Role role) {
108+
public Message(String content, List<MediaContent> mediaContents, Role role) {
109109
this(content, role, null, null, null, mediaContents);
110110
}
111111

0 commit comments

Comments
 (0)