diff --git a/common/src/main/java/com/genexus/internet/GXHttpClient.java b/common/src/main/java/com/genexus/internet/GXHttpClient.java index b693bf406..951f13d8d 100644 --- a/common/src/main/java/com/genexus/internet/GXHttpClient.java +++ b/common/src/main/java/com/genexus/internet/GXHttpClient.java @@ -483,6 +483,8 @@ protected void resetState() public abstract String getString(); + public abstract void unreadChunk(); + public abstract String readChunk(); public abstract boolean getEof(); diff --git a/common/src/main/java/com/genexus/internet/HttpClient.java b/common/src/main/java/com/genexus/internet/HttpClient.java index c1277c5df..f7af8aa32 100644 --- a/common/src/main/java/com/genexus/internet/HttpClient.java +++ b/common/src/main/java/com/genexus/internet/HttpClient.java @@ -253,6 +253,11 @@ public String getString() return session.getString(); } + public void unreadChunk() + { + session.unreadChunk(); + } + public String readChunk() { return session.readChunk(); diff --git a/common/src/main/java/com/genexus/internet/HttpClientManual.java b/common/src/main/java/com/genexus/internet/HttpClientManual.java index 6a2a15403..38017c62d 100644 --- a/common/src/main/java/com/genexus/internet/HttpClientManual.java +++ b/common/src/main/java/com/genexus/internet/HttpClientManual.java @@ -436,6 +436,9 @@ public boolean getEof() { return true; } + public void unreadChunk() { + } + public String readChunk() { return getString(); } diff --git a/common/src/main/java/com/genexus/internet/IHttpClient.java b/common/src/main/java/com/genexus/internet/IHttpClient.java index 7fc3f063a..2c5efcb18 100644 --- a/common/src/main/java/com/genexus/internet/IHttpClient.java +++ b/common/src/main/java/com/genexus/internet/IHttpClient.java @@ -48,6 +48,7 @@ public interface IHttpClient { public void getHeader(String name, double[] value); public InputStream getInputStream() throws IOException; public String getString(); + public void unreadChunk(); public String readChunk(); public boolean getEof(); public void toFile(String fileName); diff --git a/java/src/main/java/com/genexus/GxUserType.java b/java/src/main/java/com/genexus/GxUserType.java index b3be376b8..1b8c5e97b 100644 --- a/java/src/main/java/com/genexus/GxUserType.java +++ b/java/src/main/java/com/genexus/GxUserType.java @@ -1,5 +1,6 @@ package com.genexus; +import com.fasterxml.jackson.databind.ObjectMapper; import com.genexus.xml.GXXMLSerializable; import java.util.HashMap; import com.genexus.json.JSONObjectWrapper; @@ -38,6 +39,11 @@ protected Object getJsonObjectFromHashMap( Object userType) { try { if (userType instanceof HashMap) jsonObj = new JSONObjectWrapper((HashMap)userType); + else { + ObjectMapper mapper = new ObjectMapper(); + String jsonString = mapper.writeValueAsString(userType); + jsonObj = new JSONObjectWrapper(jsonString); + } } catch(Exception e) { log.error("Could not create Json Object", e); @@ -49,5 +55,14 @@ protected void setHashMapFromJson(String json) { fromjson(json); } - protected void fromjson(String json){} + protected void fromjson(String json){ + try { + Object instance = this.getClass().getMethod("getExternalInstance").invoke(this); + ObjectMapper mapper = new ObjectMapper(); + mapper.readerForUpdating(instance).readValue(json); + } + catch(Exception e) { + log.error("Error executing FromJson() method", e); + } + } } diff --git a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java index 8742190de..f032efae2 100644 --- a/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java +++ b/java/src/main/java/com/genexus/internet/HttpClientJavaLib.java @@ -742,14 +742,25 @@ public String getString() { } private boolean eof; + private String previousChunkReaded; + private boolean usePreviousChunkReaded; public boolean getEof() { return eof; } + public void unreadChunk() { + usePreviousChunkReaded = true; + } + public String readChunk() { if (!isChunkedResponse) return getString(); + if (usePreviousChunkReaded) { + usePreviousChunkReaded = false; + return previousChunkReaded; + } + if (response == null) return ""; try { @@ -759,6 +770,7 @@ public String readChunk() { eof = true; res = ""; } + previousChunkReaded = res; return res; } catch (IOException e) { setExceptionsCatch(e); diff --git a/java/src/main/java/com/genexus/util/ChatResult.java b/java/src/main/java/com/genexus/util/ChatResult.java index 14eabe0ee..7496a9289 100644 --- a/java/src/main/java/com/genexus/util/ChatResult.java +++ b/java/src/main/java/com/genexus/util/ChatResult.java @@ -42,10 +42,6 @@ public String getMoreData() { JSONObject jsonResponse = new JSONObject(chunkJson); OpenAIResponse chunkResponse = new ObjectMapper().readValue(jsonResponse.toString(), OpenAIResponse.class); OpenAIResponse.Choice choise = chunkResponse.getChoices().get(0); - if (choise.getFinishReason() != null && choise.getFinishReason().equals("tool_calls") && agent != null) { - messages.add(choise.getMessage()); - return agentProcedure.processNotChunkedResponse(agent, true, properties, messages, result, choise.getMessage().getToolCalls()); - } String chunkString = choise.getDelta().getStringContent(); if (chunkString == null) return ""; diff --git a/java/src/main/java/com/genexus/util/saia/SaiaService.java b/java/src/main/java/com/genexus/util/saia/SaiaService.java index 30230b281..d34e1ffcc 100644 --- a/java/src/main/java/com/genexus/util/saia/SaiaService.java +++ b/java/src/main/java/com/genexus/util/saia/SaiaService.java @@ -42,15 +42,35 @@ public static OpenAIResponse call(OpenAIRequest request, boolean isEmbedding, Ht client.addString(jsonRequest); client.execute("POST", providerURL); if (client.getStatusCode() == 200) { + String saiaResponse; if (client.getHeader("Content-Type").contains("text/event-stream")){ - return null; + saiaResponse = client.readChunk(); + int index = saiaResponse.indexOf("data:") + "data:".length(); + String chunkJson = saiaResponse.substring(index).trim(); + try { + JSONObject jsonResponse = new JSONObject(chunkJson); + OpenAIResponse chunkResponse = new ObjectMapper().readValue(jsonResponse.toString(), OpenAIResponse.class); + OpenAIResponse.Choice choise = chunkResponse.getChoices().get(0); + if (choise.getFinishReason() != null && choise.getFinishReason().equals("tool_calls")){ + saiaResponse = chunkJson; + } + else { + client.unreadChunk(); + return null; + } + } + catch (Exception e) { + client.unreadChunk(); + return null; + } } else { - String saiaResponse = client.getString(); - logger.debug("Agent response: " + saiaResponse); - JSONObject jsonResponse = new JSONObject(saiaResponse); - return new ObjectMapper().readValue(jsonResponse.toString(), OpenAIResponse.class); + saiaResponse = client.getString(); } + + logger.debug("Agent response: " + saiaResponse); + JSONObject jsonResponse = new JSONObject(saiaResponse); + return new ObjectMapper().readValue(jsonResponse.toString(), OpenAIResponse.class); } else { String errorDescription = String.format("Error calling Enterprise AI API, StatusCode: %d, ReasonLine: %s",