Skip to content

Commit fb0c867

Browse files
committed
feat: Add beta mode support to Message builder
Add support for the beta attribute on the <messageML> tag, as introduced in messageml-utils PR #421. This enables experimental features like <sym-ai-context> for Symphony AI integration. Changes: - Add beta field to Message class and MessageBuilder - When beta=true, wrap content with <messageML beta="true"> - Throw MessageCreationException if beta=true but content is already wrapped without the beta attribute - Add unit tests for all beta mode scenarios
1 parent 78c2349 commit fb0c867

2 files changed

Lines changed: 74 additions & 2 deletions

File tree

  • symphony-bdk-core/src

symphony-bdk-core/src/main/java/com/symphony/bdk/core/service/message/model/Message.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ public class Message {
5858
* @since Agent 20.14
5959
*/
6060
private final Boolean silent;
61+
/**
62+
* Optional boolean flag to enable beta features in MessageML.
63+
* When set to true, the messageML wrapper will include the beta="true" attribute,
64+
* enabling experimental features like sym-ai-context.
65+
*/
66+
private final Boolean beta;
6167

6268
Message(final MessageBuilder builder) {
6369
this.content = builder.content();
@@ -66,6 +72,7 @@ public class Message {
6672
this.attachments = builder.attachments();
6773
this.previews = builder.previews();
6874
this.silent = builder.silent();
75+
this.beta = builder.beta();
6976
}
7077

7178
/**
@@ -94,6 +101,7 @@ public static class MessageBuilder {
94101
private String content;
95102
private String data;
96103
private Boolean silent = Boolean.TRUE;
104+
private Boolean beta;
97105
private List<Attachment> attachments = new ArrayList<>();
98106
@Setter(value = AccessLevel.PRIVATE) private List<Attachment> previews = new ArrayList<>();
99107

@@ -149,6 +157,19 @@ public MessageBuilder silent(@Nonnull Boolean silent) {
149157
return this;
150158
}
151159

160+
/**
161+
* Enable beta mode for the message.
162+
* When set to true, the messageML wrapper will include the beta="true" attribute,
163+
* enabling experimental features like sym-ai-context.
164+
*
165+
* @param beta true to enable beta features, false or null to disable.
166+
* @return this builder with beta configured.
167+
*/
168+
public MessageBuilder beta(Boolean beta) {
169+
this.beta = beta;
170+
return this;
171+
}
172+
152173
/**
153174
* Add attachment to the message.
154175
* @param content Attachment content.
@@ -185,9 +206,19 @@ public Message build() {
185206
}
186207

187208
// check if content is encapsulated in <messageML/> node
188-
if (!this.content.startsWith("<messageML>") && !this.content.endsWith("</messageML>")) {
209+
boolean isAlreadyWrapped = this.content.startsWith("<messageML") && this.content.endsWith("</messageML>");
210+
if (!isAlreadyWrapped) {
189211
log.trace("Processing content to prefix with <messageML> and suffix with </messageML>");
190-
this.content = "<messageML>" + this.content + "</messageML>";
212+
if (Boolean.TRUE.equals(this.beta)) {
213+
this.content = "<messageML beta=\"true\">" + this.content + "</messageML>";
214+
} else {
215+
this.content = "<messageML>" + this.content + "</messageML>";
216+
}
217+
} else if (Boolean.TRUE.equals(this.beta) && this.content.startsWith("<messageML>")) {
218+
// beta=true but content is already wrapped without beta attribute
219+
throw new MessageCreationException(
220+
"Cannot set beta=true when content is already wrapped with <messageML> without the beta attribute. "
221+
+ "Either remove the wrapper or include beta=\"true\" in your messageML tag.");
191222
}
192223

193224
// check done below because it will rejected by the agent otherwise

symphony-bdk-core/src/test/java/com/symphony/bdk/core/service/message/model/MessageTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.symphony.bdk.core.service.message.model;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNull;
45
import static org.junit.jupiter.api.Assertions.assertThrows;
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
57

68
import com.symphony.bdk.core.service.message.exception.MessageCreationException;
79

@@ -38,4 +40,43 @@ void checkMessageSilentValueIfSet() {
3840
void checkMessageSilentDefaultValue() {
3941
assertEquals(Boolean.TRUE, Message.builder().content("<messageML>hello</messageML>").build().getSilent());
4042
}
43+
44+
@Test
45+
void checkBetaModeNotAddedByDefault() {
46+
Message message = Message.builder().content("hello").build();
47+
assertEquals("<messageML>hello</messageML>", message.getContent());
48+
assertNull(message.getBeta());
49+
}
50+
51+
@Test
52+
void checkBetaModeAddedWhenTrue() {
53+
Message message = Message.builder().content("hello").beta(true).build();
54+
assertEquals("<messageML beta=\"true\">hello</messageML>", message.getContent());
55+
assertEquals(Boolean.TRUE, message.getBeta());
56+
}
57+
58+
@Test
59+
void checkBetaModeNotAddedWhenFalse() {
60+
Message message = Message.builder().content("hello").beta(false).build();
61+
assertEquals("<messageML>hello</messageML>", message.getContent());
62+
assertEquals(Boolean.FALSE, message.getBeta());
63+
}
64+
65+
@Test
66+
void checkBetaTrueWithPreWrappedContentThrowsException() {
67+
MessageCreationException exception = assertThrows(
68+
MessageCreationException.class,
69+
() -> Message.builder().content("<messageML>hello</messageML>").beta(true).build()
70+
);
71+
assertTrue(exception.getMessage().contains("Cannot set beta=true when content is already wrapped"));
72+
}
73+
74+
@Test
75+
void checkBetaTrueWithPreWrappedBetaContentAllowed() {
76+
Message message = Message.builder()
77+
.content("<messageML beta=\"true\">hello</messageML>")
78+
.beta(true)
79+
.build();
80+
assertEquals("<messageML beta=\"true\">hello</messageML>", message.getContent());
81+
}
4182
}

0 commit comments

Comments
 (0)