From 96262c35d2a750a0bbb9d1b10e0debde1ce59133 Mon Sep 17 00:00:00 2001 From: Jicheng Lu Date: Mon, 13 Oct 2025 11:53:36 -0500 Subject: [PATCH] add CodeScript in ProgramCodeTemplateMessage --- .../Conversations/Models/RoleDialogModel.cs | 2 +- .../RichContent/Template/ProgramCodeTemplateMessage.cs | 3 +++ .../Providers/ChatCompletionProvider.cs | 6 +++--- .../Providers/Chat/ChatCompletionProvider.cs | 6 +++--- .../Functions/PlotChartFn.cs | 1 + .../Providers/Chat/ChatCompletionProvider.cs | 6 +++--- .../Providers/Chat/GeminiChatCompletionProvider.cs | 8 ++++---- .../Providers/Chat/PalmChatCompletionProvider.cs | 6 +++--- .../Providers/Realtime/RealTimeCompletionProvider.cs | 10 +++++----- .../Providers/ChatCompletionProvider.cs | 4 ++-- .../Providers/ChatCompletionProvider.cs | 2 +- .../Providers/ChatCompletionProvider.cs | 8 ++++---- .../MicrosoftExtensionsAIChatCompletionProvider.cs | 6 +++--- .../Providers/Chat/ChatCompletionProvider.cs | 6 +++--- .../Providers/Realtime/RealTimeCompletionProvider.cs | 6 +++--- .../Functions/PyProgrammerFn.cs | 3 ++- .../Providers/ChatCompletionProvider.cs | 4 ++-- 17 files changed, 46 insertions(+), 41 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs index e99b187c..90cc4488 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/Models/RoleDialogModel.cs @@ -141,7 +141,7 @@ public class RoleDialogModel : ITrackableMessage public bool IsFromAssistant => Role == AgentRole.Assistant || Role == AgentRole.Model; [JsonIgnore(Condition = JsonIgnoreCondition.Always)] - public string RoleContent + public string LlmContent { get { diff --git a/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/Template/ProgramCodeTemplateMessage.cs b/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/Template/ProgramCodeTemplateMessage.cs index 60f6464a..a47584b4 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/Template/ProgramCodeTemplateMessage.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Messaging/Models/RichContent/Template/ProgramCodeTemplateMessage.cs @@ -8,6 +8,9 @@ public class ProgramCodeTemplateMessage : IRichMessage, ITemplateMessage [JsonPropertyName("text")] public string Text { get; set; } = string.Empty; + [JsonPropertyName("code_script")] + public string? CodeScript { get; set; } + [JsonPropertyName("template_type")] public virtual string TemplateType { get; set; } = TemplateTypeEnum.ProgramCode; diff --git a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs index 0d24bc41..fcb63910 100644 --- a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs @@ -140,11 +140,11 @@ public class ChatCompletionProvider : IChatCompletion { if (message.Role == AgentRole.User) { - messages.Add(new Message(RoleType.User, message.RoleContent)); + messages.Add(new Message(RoleType.User, message.LlmContent)); } else if (message.Role == AgentRole.Assistant) { - messages.Add(new Message(RoleType.Assistant, message.RoleContent)); + messages.Add(new Message(RoleType.Assistant, message.LlmContent)); } else if (message.Role == AgentRole.Function) { @@ -170,7 +170,7 @@ public class ChatCompletionProvider : IChatCompletion new ToolResultContent() { ToolUseId = message.ToolCallId, - Content = [new TextContent() { Text = message.RoleContent }] + Content = [new TextContent() { Text = message.LlmContent }] } } }); diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs index b7efb11f..dc9a0fbc 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs @@ -432,11 +432,11 @@ public class ChatCompletionProvider : IChatCompletion ChatToolCall.CreateFunctionToolCall(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.FunctionName, BinaryData.FromString(message.FunctionArgs ?? "{}")) })); - messages.Add(new ToolChatMessage(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.RoleContent)); + messages.Add(new ToolChatMessage(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.LlmContent)); } else if (message.Role == AgentRole.User) { - var text = message.RoleContent; + var text = message.LlmContent; var textPart = ChatMessageContentPart.CreateTextPart(text); var contentParts = new List { textPart }; @@ -448,7 +448,7 @@ public class ChatCompletionProvider : IChatCompletion } else if (message.Role == AgentRole.Assistant) { - var text = message.RoleContent; + var text = message.LlmContent; var textPart = ChatMessageContentPart.CreateTextPart(text); var contentParts = new List { textPart }; diff --git a/src/Plugins/BotSharp.Plugin.ChartHandler/Functions/PlotChartFn.cs b/src/Plugins/BotSharp.Plugin.ChartHandler/Functions/PlotChartFn.cs index 187e22ae..71efda50 100644 --- a/src/Plugins/BotSharp.Plugin.ChartHandler/Functions/PlotChartFn.cs +++ b/src/Plugins/BotSharp.Plugin.ChartHandler/Functions/PlotChartFn.cs @@ -83,6 +83,7 @@ public class PlotChartFn : IFunctionCallback Message = new ProgramCodeTemplateMessage { Text = ret?.JsCode ?? string.Empty, + CodeScript = ret?.JsCode, Language = "javascript" } }; diff --git a/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs index eb143ebb..6349b1ed 100644 --- a/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs @@ -399,11 +399,11 @@ public class ChatCompletionProvider : IChatCompletion ChatToolCall.CreateFunctionToolCall(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.FunctionName, BinaryData.FromString(message.FunctionArgs ?? "{}")) })); - messages.Add(new ToolChatMessage(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.RoleContent)); + messages.Add(new ToolChatMessage(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.LlmContent)); } else if (message.Role == AgentRole.User) { - var text = message.RoleContent; + var text = message.LlmContent; var textPart = ChatMessageContentPart.CreateTextPart(text); var contentParts = new List { textPart }; @@ -415,7 +415,7 @@ public class ChatCompletionProvider : IChatCompletion } else if (message.Role == AgentRole.Assistant) { - var text = message.RoleContent; + var text = message.LlmContent; var textPart = ChatMessageContentPart.CreateTextPart(text); var contentParts = new List { textPart }; diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs index 1d2b4ef4..60e0ef02 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs @@ -263,17 +263,17 @@ public class GeminiChatCompletionProvider : IChatCompletion Name = message.FunctionName, Response = new JsonObject() { - ["result"] = message.RoleContent ?? string.Empty + ["result"] = message.LlmContent ?? string.Empty } } } ], AgentRole.Function)); - convPrompts.Add($"{AgentRole.Assistant}: Call function {message.FunctionName}({message.FunctionArgs}) => {message.RoleContent}"); + convPrompts.Add($"{AgentRole.Assistant}: Call function {message.FunctionName}({message.FunctionArgs}) => {message.LlmContent}"); } else if (message.Role == AgentRole.User) { - var text = message.RoleContent; + var text = message.LlmContent; var contentParts = new List { new() { Text = text } }; if (allowMultiModal && !message.Files.IsNullOrEmpty()) @@ -285,7 +285,7 @@ public class GeminiChatCompletionProvider : IChatCompletion } else if (message.Role == AgentRole.Assistant) { - var text = message.RoleContent; + var text = message.LlmContent; var contentParts = new List { new() { Text = text } }; if (allowMultiModal && !message.Files.IsNullOrEmpty()) diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/PalmChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/PalmChatCompletionProvider.cs index 8dfaa695..bec65e17 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/PalmChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/PalmChatCompletionProvider.cs @@ -108,7 +108,7 @@ public class PalmChatCompletionProvider : IChatCompletion renderedInstructions.Add(prompt); } - var messages = conversations.Select(c => new PalmChatMessage(c.RoleContent, c.Role == AgentRole.User ? "user" : "AI")) + var messages = conversations.Select(c => new PalmChatMessage(c.LlmContent, c.Role == AgentRole.User ? "user" : "AI")) .ToList(); if (!functions.IsNullOrEmpty()) @@ -124,8 +124,8 @@ public class PalmChatCompletionProvider : IChatCompletion foreach (var dialog in conversations) { prompt += dialog.Role == AgentRole.Function ? - $"{dialog.Role}: {dialog.FunctionName} => {dialog.RoleContent}\r\n" : - $"{dialog.Role}: {dialog.RoleContent}\r\n"; + $"{dialog.Role}: {dialog.FunctionName} => {dialog.LlmContent}\r\n" : + $"{dialog.Role}: {dialog.LlmContent}\r\n"; } prompt += "\r\n\r\n" + router.Templates.FirstOrDefault(x => x.Name == "response_with_function").Content; diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/RealTimeCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/RealTimeCompletionProvider.cs index 1bc5d74d..180d18c3 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/RealTimeCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/RealTimeCompletionProvider.cs @@ -567,25 +567,25 @@ public class GoogleRealTimeProvider : IRealTimeCompletion Name = message.FunctionName ?? string.Empty, Response = new JsonObject() { - ["result"] = message.RoleContent ?? string.Empty + ["result"] = message.LlmContent ?? string.Empty } } } ], AgentRole.Function)); convPrompts.Add( - $"{AgentRole.Assistant}: Call function {message.FunctionName}({message.FunctionArgs}) => {message.RoleContent}"); + $"{AgentRole.Assistant}: Call function {message.FunctionName}({message.FunctionArgs}) => {message.LlmContent}"); } else if (message.Role == AgentRole.User) { - var text = message.RoleContent; + var text = message.LlmContent; contents.Add(new Content(text, AgentRole.User)); convPrompts.Add($"{AgentRole.User}: {text}"); } else if (message.Role == AgentRole.Assistant) { - contents.Add(new Content(message.RoleContent, AgentRole.Model)); - convPrompts.Add($"{AgentRole.Assistant}: {message.RoleContent}"); + contents.Add(new Content(message.LlmContent, AgentRole.Model)); + convPrompts.Add($"{AgentRole.Assistant}: {message.LlmContent}"); } } diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/ChatCompletionProvider.cs index ea6f75fd..a2463393 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/ChatCompletionProvider.cs @@ -42,7 +42,7 @@ public class ChatCompletionProvider : IChatCompletion await hook.BeforeGenerating(agent, conversations); } - var content = string.Join("\r\n", conversations.Select(x => $"{x.Role}: {x.RoleContent}")).Trim(); + var content = string.Join("\r\n", conversations.Select(x => $"{x.Role}: {x.LlmContent}")).Trim(); content += $"\r\n{AgentRole.Assistant}: "; var llama = _services.GetRequiredService(); @@ -118,7 +118,7 @@ public class ChatCompletionProvider : IChatCompletion Func onMessageReceived, Func onFunctionExecuting) { - var content = string.Join("\r\n", conversations.Select(x => $"{x.Role}: {x.RoleContent}")).Trim(); + var content = string.Join("\r\n", conversations.Select(x => $"{x.Role}: {x.LlmContent}")).Trim(); content += $"\r\n{AgentRole.Assistant}: "; var state = _services.GetRequiredService(); diff --git a/src/Plugins/BotSharp.Plugin.LangChain/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.LangChain/Providers/ChatCompletionProvider.cs index a7a4addd..a748ed2a 100644 --- a/src/Plugins/BotSharp.Plugin.LangChain/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.LangChain/Providers/ChatCompletionProvider.cs @@ -41,7 +41,7 @@ namespace BotSharp.Plugin.VertexAI.Providers var client = new VertexAIProvider(_config); var model = new VertexAIChatModel(client, _model); var messages = conversations - .Select(c => new Message(c.RoleContent, c.Role == AgentRole.User ? MessageRole.Human : MessageRole.Ai)).ToList(); + .Select(c => new Message(c.LlmContent, c.Role == AgentRole.User ? MessageRole.Human : MessageRole.Ai)).ToList(); var response = await model.GenerateAsync(new ChatRequest { Messages = messages }, _settings); diff --git a/src/Plugins/BotSharp.Plugin.MetaGLM/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.MetaGLM/Providers/ChatCompletionProvider.cs index 2505eed1..38c3b398 100644 --- a/src/Plugins/BotSharp.Plugin.MetaGLM/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.MetaGLM/Providers/ChatCompletionProvider.cs @@ -111,8 +111,8 @@ public class ChatCompletionProvider : IChatCompletion foreach (var message in samples) { messages.Add(message.Role == AgentRole.User ? - new MessageItem("user", message.RoleContent) : - new MessageItem("assistant", message.RoleContent)); + new MessageItem("user", message.LlmContent) : + new MessageItem("assistant", message.LlmContent)); } foreach (var function in functions) @@ -129,13 +129,13 @@ public class ChatCompletionProvider : IChatCompletion } else if (message.Role == "user") { - var userMessage = new MessageItem("user",message.RoleContent); + var userMessage = new MessageItem("user",message.LlmContent); messages.Add(userMessage); } else if (message.Role == "assistant") { - messages.Add(new MessageItem("assistant", message.RoleContent)); + messages.Add(new MessageItem("assistant", message.LlmContent)); } } diff --git a/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/MicrosoftExtensionsAIChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/MicrosoftExtensionsAIChatCompletionProvider.cs index 43f5134a..888fe341 100644 --- a/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/MicrosoftExtensionsAIChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/MicrosoftExtensionsAIChatCompletionProvider.cs @@ -109,16 +109,16 @@ public sealed class MicrosoftExtensionsAIChatCompletionProvider : IChatCompletio messages.Add(new(ChatRole.Assistant, [ new FunctionCallContent(x.FunctionName, x.FunctionName, JsonSerializer.Deserialize>(x.FunctionArgs ?? "{}")), - new FunctionResultContent(x.FunctionName, x.RoleContent) + new FunctionResultContent(x.FunctionName, x.LlmContent) ])); } else if (x.Role == AgentRole.System || x.Role == AgentRole.Assistant) { - messages.Add(new(x.Role == AgentRole.System ? ChatRole.System : ChatRole.Assistant, x.RoleContent)); + messages.Add(new(x.Role == AgentRole.System ? ChatRole.System : ChatRole.Assistant, x.LlmContent)); } else if (x.Role == AgentRole.User) { - List contents = [new TextContent(x.RoleContent)]; + List contents = [new TextContent(x.LlmContent)]; if (allowMultiModal) { foreach (var file in x.Files) diff --git a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs index 3812a591..7ab149e2 100644 --- a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs @@ -402,11 +402,11 @@ public class ChatCompletionProvider : IChatCompletion ChatToolCall.CreateFunctionToolCall(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.FunctionName, BinaryData.FromString(message.FunctionArgs ?? "{}")) })); - messages.Add(new ToolChatMessage(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.RoleContent)); + messages.Add(new ToolChatMessage(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.LlmContent)); } else if (message.Role == AgentRole.User) { - var text = message.RoleContent; + var text = message.LlmContent; var textPart = ChatMessageContentPart.CreateTextPart(text); var contentParts = new List { textPart }; @@ -418,7 +418,7 @@ public class ChatCompletionProvider : IChatCompletion } else if (message.Role == AgentRole.Assistant) { - var text = message.RoleContent; + var text = message.LlmContent; var textPart = ChatMessageContentPart.CreateTextPart(text); var contentParts = new List { textPart }; diff --git a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs index 269cafa2..379941b4 100644 --- a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs @@ -621,15 +621,15 @@ public class RealTimeCompletionProvider : IRealTimeCompletion ChatToolCall.CreateFunctionToolCall(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.FunctionName, BinaryData.FromString(message.FunctionArgs ?? "{}")) })); - messages.Add(new ToolChatMessage(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.RoleContent)); + messages.Add(new ToolChatMessage(message.ToolCallId.IfNullOrEmptyAs(message.FunctionName), message.LlmContent)); } else if (message.Role == AgentRole.User) { - messages.Add(new UserChatMessage(message.RoleContent)); + messages.Add(new UserChatMessage(message.LlmContent)); } else if (message.Role == AgentRole.Assistant) { - messages.Add(new AssistantChatMessage(message.RoleContent)); + messages.Add(new AssistantChatMessage(message.LlmContent)); } } diff --git a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Functions/PyProgrammerFn.cs b/src/Plugins/BotSharp.Plugin.PythonInterpreter/Functions/PyProgrammerFn.cs index 15b618b0..8dc9e7d5 100644 --- a/src/Plugins/BotSharp.Plugin.PythonInterpreter/Functions/PyProgrammerFn.cs +++ b/src/Plugins/BotSharp.Plugin.PythonInterpreter/Functions/PyProgrammerFn.cs @@ -75,7 +75,8 @@ public class PyProgrammerFn : IFunctionCallback Recipient = new Recipient { Id = convService.ConversationId }, Message = new ProgramCodeTemplateMessage { - Text = ret.PythonCode ?? string.Empty, + Text = result, + CodeScript = ret.PythonCode, Language = "python" } }; diff --git a/src/Plugins/BotSharp.Plugin.SparkDesk/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.SparkDesk/Providers/ChatCompletionProvider.cs index 93b90d13..5f0405c1 100644 --- a/src/Plugins/BotSharp.Plugin.SparkDesk/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.SparkDesk/Providers/ChatCompletionProvider.cs @@ -269,13 +269,13 @@ public class ChatCompletionProvider : IChatCompletion } else if (message.Role == "user") { - var userMessage = ChatMessage.FromUser(message.RoleContent); + var userMessage = ChatMessage.FromUser(message.LlmContent); messages.Add(userMessage); } else if (message.Role == "assistant") { - messages.Add(ChatMessage.FromAssistant(message.RoleContent)); + messages.Add(ChatMessage.FromAssistant(message.LlmContent)); } }