Skip to content

Commit 174cba2

Browse files
committed
Implements support for multimodal content in Agent messages.
1 parent e33217a commit 174cba2

File tree

4 files changed

+113
-16
lines changed

4 files changed

+113
-16
lines changed

java/src/main/java/com/genexus/GXProcedure.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ protected String callAgent(String agent, boolean stream, GXProperties properties
297297
for (OpenAIResponse.Choice element : aiResponse.getChoices()) {
298298
String finishReason = element.getFinishReason();
299299
if (finishReason.equals("stop"))
300-
return element.getMessage().getContent();
300+
return element.getMessage().getStringContent();
301301
if (finishReason.equals("tool_calls")) {
302302
messages.add(element.getMessage());
303303
return processNotChunkedResponse(agent, stream, properties, messages, result, element.getMessage().getToolCalls());
@@ -327,7 +327,7 @@ private void processToolCall(OpenAIResponse.ToolCall toolCall, ArrayList<OpenAIR
327327
}
328328
OpenAIResponse.Message toolCallMessage = new OpenAIResponse.Message();
329329
toolCallMessage.setRole("tool");
330-
toolCallMessage.setContent(result);
330+
toolCallMessage.setStringContent(result);
331331
toolCallMessage.setToolCallId(toolCall.getId());
332332
messages.add(toolCallMessage);
333333
}

java/src/main/java/com/genexus/util/ChatResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public String getMoreData() {
4646
messages.add(choise.getMessage());
4747
return agentProcedure.processNotChunkedResponse(agent, true, properties, messages, result, choise.getMessage().getToolCalls());
4848
}
49-
String chunkString = choise.getDelta().getContent();
49+
String chunkString = choise.getDelta().getStringContent();
5050
if (chunkString == null)
5151
return "";
5252
return chunkString;

java/src/main/java/com/genexus/util/saia/OpenAIResponse.java

Lines changed: 100 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.genexus.util.saia;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
34
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
5+
import com.fasterxml.jackson.annotation.JsonInclude;
46
import com.fasterxml.jackson.annotation.JsonProperty;
7+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
8+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
59

610
import java.util.ArrayList;
711

@@ -85,7 +89,9 @@ public static class Message {
8589
private String role;
8690

8791
@JsonProperty("content")
88-
private String content;
92+
@JsonSerialize(using = ContentSerializer.class)
93+
@JsonDeserialize(using = ContentDeserializer.class)
94+
private Content content;
8995

9096
@JsonProperty("tool_calls")
9197
private ArrayList<ToolCall> toolCalls;
@@ -96,8 +102,14 @@ public static class Message {
96102
public String getRole() { return role; }
97103
public void setRole(String role) { this.role = role; }
98104

99-
public String getContent() { return content; }
100-
public void setContent(String content) { this.content = content; }
105+
@JsonIgnore
106+
public String getStringContent() { return ((StringContent) content).getValue(); }
107+
public Content getContent() { return content; }
108+
@JsonIgnore
109+
public void setStringContent(String content) { this.content = new StringContent(content); }
110+
@JsonIgnore
111+
public void setStructuredContent(StructuredContent content) { this.content = content; }
112+
public void setContent(Content content) { this.content = content; }
101113

102114
public ArrayList<ToolCall> getToolCalls() { return toolCalls; }
103115
public void setToolCalls(ArrayList<ToolCall> toolCalls) { this.toolCalls = toolCalls; }
@@ -106,6 +118,91 @@ public static class Message {
106118
public void setToolCallId(String toolCallId) { this.toolCallId = toolCallId; }
107119
}
108120

121+
public interface Content { }
122+
123+
public static class StringContent implements Content {
124+
public StringContent() {}
125+
126+
private String value;
127+
128+
public StringContent(String value) {
129+
this.value = value;
130+
}
131+
132+
public String getValue() {
133+
return value;
134+
}
135+
136+
public void setValue(String value) {
137+
this.value = value;
138+
}
139+
}
140+
141+
public static class StructuredContent implements Content {
142+
public StructuredContent() {}
143+
144+
private ArrayList<StructuredContentItem> items;
145+
146+
public StructuredContent(ArrayList<StructuredContentItem> items) {
147+
this.items = items;
148+
}
149+
150+
public ArrayList<StructuredContentItem> getItems() {
151+
return items;
152+
}
153+
154+
public void setItems(ArrayList<StructuredContentItem> items) {
155+
this.items = items;
156+
}
157+
}
158+
159+
@JsonInclude(JsonInclude.Include.NON_NULL)
160+
public static class StructuredContentItem {
161+
public StructuredContentItem() {}
162+
163+
private String type;
164+
private String text;
165+
private ImageUrl image_url;
166+
167+
public String getType() {
168+
return type;
169+
}
170+
171+
public void setType(String type) {
172+
this.type = type;
173+
}
174+
175+
public String getText() {
176+
return text;
177+
}
178+
179+
public void setText(String text) {
180+
this.text = text;
181+
}
182+
183+
public ImageUrl getImage_url() {
184+
return image_url;
185+
}
186+
187+
public void setImage_url(ImageUrl image_url) {
188+
this.image_url = image_url;
189+
}
190+
191+
public static class ImageUrl {
192+
public ImageUrl() {}
193+
194+
private String url;
195+
196+
public String getUrl() {
197+
return url;
198+
}
199+
200+
public void setUrl(String url) {
201+
this.url = url;
202+
}
203+
}
204+
}
205+
109206
@JsonIgnoreProperties(ignoreUnknown = true)
110207
public static class ToolCall {
111208

java/src/test/java/com/genexus/agent/Agent.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,30 +37,30 @@ protected void privateExecute( )
3737
if (AV3Parameter1.equals("chat")) {
3838
OpenAIResponse.Message message = new OpenAIResponse.Message();
3939
message.setRole("user");
40-
message.setContent("Dime el clima en Lima - Peru");
40+
message.setStringContent("Dime el clima en Lima - Peru");
4141
messages.add(message);
4242
message = new OpenAIResponse.Message();
4343
message.setRole("assistant");
44-
message.setContent("El clima actual en Lima, Perú, es soleado con una temperatura de 20.9°C (69.6°F). La dirección del viento es del suroeste (SSW) a 15.1 km/h (9.4 mph), y la humedad relativa es del 68%. La presión atmosférica es de 1013 mb. La visibilidad es de 10 km y el índice UV es de 12.5.");
44+
message.setStringContent("El clima actual en Lima, Perú, es soleado con una temperatura de 20.9°C (69.6°F). La dirección del viento es del suroeste (SSW) a 15.1 km/h (9.4 mph), y la humedad relativa es del 68%. La presión atmosférica es de 1013 mb. La visibilidad es de 10 km y el índice UV es de 12.5.");
4545
messages.add(message);
4646
message = new OpenAIResponse.Message();
4747
message.setRole("user");
48-
message.setContent("Que me puedes contar de la ciudad que te pedi el clima previamente?");
48+
message.setStringContent("Que me puedes contar de la ciudad que te pedi el clima previamente?");
4949
messages.add(message);
5050
AV5OutputVariable = callAgent( "The weatherman", Gxproperties, messages, new CallResult()) ;
5151
}
5252
else if (AV3Parameter1.equals("chat_stream")) {
5353
OpenAIResponse.Message message = new OpenAIResponse.Message();
5454
message.setRole("user");
55-
message.setContent("Dime el clima en Lima - Peru");
55+
message.setStringContent("Dime el clima en Lima - Peru");
5656
messages.add(message);
5757
message = new OpenAIResponse.Message();
5858
message.setRole("assistant");
59-
message.setContent("El clima actual en Lima, Perú, es soleado con una temperatura de 20.9°C (69.6°F). La dirección del viento es del suroeste (SSW) a 15.1 km/h (9.4 mph), y la humedad relativa es del 68%. La presión atmosférica es de 1013 mb. La visibilidad es de 10 km y el índice UV es de 12.5.");
59+
message.setStringContent("El clima actual en Lima, Perú, es soleado con una temperatura de 20.9°C (69.6°F). La dirección del viento es del suroeste (SSW) a 15.1 km/h (9.4 mph), y la humedad relativa es del 68%. La presión atmosférica es de 1013 mb. La visibilidad es de 10 km y el índice UV es de 12.5.");
6060
messages.add(message);
6161
message = new OpenAIResponse.Message();
6262
message.setRole("user");
63-
message.setContent("Que me puedes contar de la ciudad que te pedi el clima previamente?");
63+
message.setStringContent("Que me puedes contar de la ciudad que te pedi el clima previamente?");
6464
messages.add(message);
6565
ChatResult chatResult = chatAgent( "The weatherman", Gxproperties, messages, new CallResult()) ;
6666
while (chatResult.hasMoreData()) {
@@ -70,23 +70,23 @@ else if (AV3Parameter1.equals("chat_stream")) {
7070
else if (AV3Parameter1.equals("toolcall")) {
7171
OpenAIResponse.Message message = new OpenAIResponse.Message();
7272
message.setRole("user");
73-
message.setContent("Necesito nombre y descripcion del producto 1779");
73+
message.setStringContent("Necesito nombre y descripcion del producto 1779");
7474
messages.add(message);
7575
AV5OutputVariable = callAgent( "ProductInfo", Gxproperties, messages, new CallResult()) ;
7676
message = new OpenAIResponse.Message();
7777
message.setRole("assistant");
78-
message.setContent(AV5OutputVariable);
78+
message.setStringContent(AV5OutputVariable);
7979
messages.add(message);
8080
message = new OpenAIResponse.Message();
8181
message.setRole("user");
82-
message.setContent("Quiero que traduzcas la descripcion del producto que me habias enviado previamente");
82+
message.setStringContent("Quiero que traduzcas la descripcion del producto que me habias enviado previamente");
8383
messages.add(message);
8484
AV5OutputVariable = callAgent( "ProductInfo", Gxproperties, messages, new CallResult()) ;
8585
}
8686
else if (AV3Parameter1.equals("toolcall_stream")) {
8787
OpenAIResponse.Message message = new OpenAIResponse.Message();
8888
message.setRole("user");
89-
message.setContent("Necesito nombre y descripcion del producto 1779");
89+
message.setStringContent("Necesito nombre y descripcion del producto 1779");
9090
messages.add(message);
9191
ChatResult chatResult = chatAgent( "ProductInfo", Gxproperties, messages, new CallResult()) ;
9292
while (chatResult.hasMoreData()) {

0 commit comments

Comments
 (0)