Skip to content

Commit 1d26ac3

Browse files
committed
Add Tool Calls support
(cherry picked from commit 6a42965)
1 parent f1c223b commit 1d26ac3

File tree

3 files changed

+53
-2
lines changed

3 files changed

+53
-2
lines changed

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.sql.SQLException;
55
import java.util.ArrayList;
66
import java.util.Date;
7-
import java.util.List;
87

98
import com.genexus.db.Namespace;
109
import com.genexus.db.UserInformation;
@@ -263,6 +262,10 @@ protected void mockExecute() {
263262
privateExecute( );
264263
}
265264

265+
protected String callTool(String name, String arguments) throws Exception {
266+
return "";
267+
}
268+
266269
protected String callAssistant(String agent, GXProperties properties, ArrayList<OpenAIResponse.Message> messages, CallResult result) {
267270
return callAgent(agent, properties, messages, result);
268271
}
@@ -276,10 +279,34 @@ protected String callAgent(String agent, GXProperties properties, ArrayList<Open
276279
OpenAIResponse aiResponse = SaiaService.call(aiRequest, result);
277280
if (aiResponse != null) {
278281
for (OpenAIResponse.Choice element : aiResponse.getChoices()) {
279-
if (element.getFinishReason().equals("stop"))
282+
String finishReason = element.getFinishReason();
283+
if (finishReason.equals("stop"))
280284
return element.getMessage().getContent();
285+
if (finishReason.equals("tool_calls")) {
286+
messages.add(element.getMessage());
287+
for (OpenAIResponse.ToolCall tollCall :element.getMessage().getToolCalls()) {
288+
processToolCall(tollCall, messages);
289+
}
290+
return callAgent(agent, properties, messages, result);
291+
}
281292
}
282293
}
283294
return "";
284295
}
296+
297+
private void processToolCall(OpenAIResponse.ToolCall toolCall, ArrayList<OpenAIResponse.Message> messages) {
298+
String result;
299+
String functionName = toolCall.getFunction().getName();
300+
try {
301+
result = callTool(functionName, toolCall.getFunction().getArguments());
302+
}
303+
catch (Exception e) {
304+
result = String.format("Error calling tool %s", functionName);
305+
}
306+
OpenAIResponse.Message toolCallMessage = new OpenAIResponse.Message();
307+
toolCallMessage.setRole("tool");
308+
toolCallMessage.setContent(result);
309+
toolCallMessage.setToolCallId(toolCall.getId());
310+
messages.add(toolCallMessage);
311+
}
285312
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ protected void privateExecute( )
4848
message.setContent("Que me puedes contar de la ciudad que te pedi el clima previamente?");
4949
messages.add(message);
5050
}
51+
else if (AV3Parameter1.equals("toolcall")) {
52+
OpenAIResponse.Message message = new OpenAIResponse.Message();
53+
message.setRole("user");
54+
message.setContent("Necesito nombre y descripcion del producto 1779");
55+
messages.add(message);
56+
AV5OutputVariable = callAgent( "ProductInfo", Gxproperties, messages, new CallResult()) ;
57+
cleanup();
58+
return;
59+
}
5160
else {
5261
Gxproperties.set("&Parameter1", AV3Parameter1);
5362
Gxproperties.set("&Parameter2", AV4Parameter2);
@@ -62,6 +71,17 @@ protected void cleanup( )
6271
this.aP2[0] = AV5OutputVariable;
6372
}
6473

74+
protected String callTool(String name, String arguments) throws Exception {
75+
switch (name) {
76+
case "GetProductName":
77+
return "Televisor Panavox 80 pulgadas";
78+
case "GetProductDescription":
79+
return "Flor de Televisor el Panavox de 80 pulgadas";
80+
default:
81+
return String.format("Unknown function %s", name);
82+
}
83+
}
84+
6585
public void initialize( )
6686
{
6787
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,9 @@ public void testAPICallAgent() {
2525
String[] GXv_char5 = new String[1] ;
2626
new Agent(-1).execute( "chat", "", GXv_char5) ;
2727
System.out.println(GXv_char5[0]);
28+
29+
String[] GXv_char6 = new String[1] ;
30+
new Agent(-1).execute( "toolcall", "", GXv_char6) ;
31+
System.out.println(GXv_char6[0]);
2832
}
2933
}

0 commit comments

Comments
 (0)