Skip to content

Commit b0613ab

Browse files
claudiamurialdoclaudiamurialdo
andauthored
The ChatMessages parameter in Agent.Chat was not accumulating messages across calls because it created a copy using ToList(). (#1208)
The DONE response from the chat agent was not being handled correctly. Co-authored-by: claudiamurialdo <c.murialdo@globant.com>
1 parent d542d16 commit b0613ab

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

dotnet/src/dotnetcore/Providers/AI/Model/GXAgent.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,18 @@ public class GXAgent : GXProcedure
1717
protected ChatResult ChatAgent(String agent, GXProperties properties, IList chatMessages, object result)
1818
{
1919
CallResult callResult = result as CallResult;
20-
List<ChatMessage> chatMessagesList = chatMessages != null ? chatMessages.Cast<ChatMessage>().ToList() : null;
2120
try
2221
{
2322
GXLogging.Debug(log, "Chatting Agent: ", agent);
2423

25-
GxHttpClient httpClient = AgentService.AgentHandlerInstance.ChatAgent(agent, chatMessagesList, properties, context);
26-
27-
return new ChatResult(this, agent, properties, chatMessagesList, callResult, httpClient);
24+
GxHttpClient httpClient = AgentService.AgentHandlerInstance.ChatAgent(agent, chatMessages, properties, context);
25+
return new ChatResult(this, agent, properties, chatMessages, callResult, httpClient);
2826
}
2927
catch (Exception ex)
3028
{
3129
callResult.AddMessage($"Error chatting Agent {agent}:" + ex.Message);
3230
callResult.IsFail = true;
33-
return new ChatResult(this, agent, properties, chatMessagesList, callResult, null);
31+
return new ChatResult(this, agent, properties, chatMessages, callResult, null);
3432
}
3533
}
3634
protected string CallAgent(string assistant, GXProperties gxproperties, IList chatMessages, object result)
@@ -71,13 +69,13 @@ protected string CallAgent(string assistant, GXProperties gxproperties, IList ch
7169
}
7270

7371
}
74-
internal override string ProcessChatResponse(Choice choice, bool stream, string assistant, GXProperties gxproperties, List<ChatMessage> chatMessagesList, object result)
72+
internal override string ProcessChatResponse(Choice choice, bool stream, string assistant, GXProperties gxproperties, IList chatMessagesList, object result)
7573
{
7674
foreach (ToolCall toolCall in choice.Message.ToolCalls)
7775
ProcessToolCall(toolCall, chatMessagesList);
7876
return CallAgent(assistant, gxproperties, chatMessagesList, result, stream);
7977
}
80-
private void ProcessToolCall(ToolCall toolCall, List<ChatMessage> messages)
78+
private void ProcessToolCall(ToolCall toolCall, IList messages)
8179
{
8280
string result = string.Empty;
8381
string functionName = toolCall.Function.Name;

dotnet/src/dotnetcore/Providers/AI/Services/AgentService.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System;
2+
using System.Collections;
23
using System.Collections.Generic;
4+
using System.Linq;
35
using System.Net.Http;
46
using System.Text.Json;
57
using System.Threading.Tasks;
@@ -75,7 +77,7 @@ internal async Task<ChatCompletionResult> CallAgent(string assistant, List<Chat.
7577
}
7678

7779
}
78-
internal GxHttpClient ChatAgent(string assistant, List<Chat.ChatMessage> messages, GXProperties properties, IGxContext context)
80+
internal GxHttpClient ChatAgent(string assistant, IList messages, GXProperties properties, IGxContext context)
7981
{
8082
try
8183
{
@@ -97,7 +99,7 @@ internal GxHttpClient ChatAgent(string assistant, List<Chat.ChatMessage> message
9799
}
98100

99101
}
100-
internal GxHttpClient AgentHttpClient(IGxContext context, string assistant, List<Chat.ChatMessage> messages, GXProperties properties, bool stream)
102+
internal GxHttpClient AgentHttpClient(IGxContext context, string assistant, IList messages, GXProperties properties, bool stream)
101103
{
102104
GxHttpClient httpClient = new GxHttpClient(context);
103105
httpClient.Secure = 1;
@@ -112,11 +114,12 @@ internal GxHttpClient AgentHttpClient(IGxContext context, string assistant, List
112114
return httpClient;
113115
}
114116

115-
private string AgentPaylod(string assistant, List<ChatMessage> messages, GXProperties properties, bool stream)
117+
private string AgentPaylod(string assistant, IList messages, GXProperties properties, bool stream)
116118
{
119+
List<Chat.ChatMessage> chatMessagesList = messages != null ? messages.Cast<Chat.ChatMessage>().ToList() : null;
117120
ChatRequestPayload requestBody = new ChatRequestPayload();
118121
requestBody.Model = $"{SAIA_AGENT}{assistant}";
119-
requestBody.Messages = messages;
122+
requestBody.Messages = chatMessagesList;
120123
requestBody.Variables = properties.ToList();
121124
requestBody.Stream = stream;
122125

dotnet/src/dotnetframework/GxClasses/Domain/ChatResult.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections;
23
using System.Collections.Generic;
34
using System.Text.Json;
45
using System.Text.Json.Serialization;
@@ -17,15 +18,15 @@ public class ChatResult: IDisposable
1718
private GxHttpClient Client { get; set; }
1819
private string Agent { get; set; }
1920
private GXProperties Properties { get; set; }
20-
private List<ChatMessage> Messages { get; set; }
21+
private IList Messages { get; set; }
2122
private CallResult Result { get; set; }
2223
private GXProcedure AgentProcedure { get; set; }
2324
private bool disposed = false;
2425
public ChatResult()
2526
{
2627
}
2728

28-
public ChatResult(GXProcedure agentProcedure, string agent, GXProperties properties, List<ChatMessage> messages, CallResult result, GxHttpClient client)
29+
public ChatResult(GXProcedure agentProcedure, string agent, GXProperties properties, IList messages, CallResult result, GxHttpClient client)
2930
{
3031
AgentProcedure = agentProcedure;
3132
Agent = agent;
@@ -46,6 +47,8 @@ public string GetMoreData()
4647
return string.Empty;
4748
int index = data.IndexOf(ChatCompletionResult.DATA) + ChatCompletionResult.DATA.Length;
4849
string chunkJson = data.Substring(index).Trim();
50+
if (chunkJson.Equals(ChatCompletionResult.DONE))
51+
return string.Empty;
4952
try
5053
{
5154
ChatCompletionResult chatCompletion = JsonSerializer.Deserialize<ChatCompletionResult>(chunkJson);
@@ -117,6 +120,8 @@ internal class ChatCompletionResult
117120
internal const string FINISH_REASON_STOP = "stop";
118121
internal const string FINISH_REASON_TOOL_CALLS = "tool_calls";
119122
internal const string DATA = "data:";
123+
internal const string DONE = "[DONE]";
124+
120125

121126
[JsonPropertyName("id")]
122127
public string Id { get; set; }

dotnet/src/dotnetframework/GxClasses/Model/gxproc.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace GeneXus.Procedure
44
{
55
using System;
6+
using System.Collections;
67
using System.Collections.Generic;
78
using System.IO;
89
using System.Reflection;
@@ -53,7 +54,7 @@ public GXProcedure()
5354
}
5455
#endif
5556
}
56-
internal virtual string ProcessChatResponse(Choice choice, bool stream, string assistant, GXProperties gxproperties, List<ChatMessage> chatMessagesList, object result)
57+
internal virtual string ProcessChatResponse(Choice choice, bool stream, string assistant, GXProperties gxproperties, IList chatMessagesList, object result)
5758
{
5859
return string.Empty;
5960
}

0 commit comments

Comments
 (0)