From 8b9289219460bd576a0de1ce9ab9778bad376951 Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 25 Sep 2025 15:31:54 -0500 Subject: [PATCH] fix template rendering by states --- .../Agents/IAgentService.cs | 13 ++- .../Agents/Hooks/BasicAgentHook.cs | 5 +- .../Agents/Services/AgentService.Rendering.cs | 86 +++++++++++-------- .../Providers/ChatCompletionProvider.cs | 3 +- .../Providers/Chat/ChatCompletionProvider.cs | 22 ++--- .../Providers/Chat/ChatCompletionProvider.cs | 10 ++- .../Chat/GeminiChatCompletionProvider.cs | 10 ++- .../Chat/PalmChatCompletionProvider.cs | 3 +- .../Realtime/RealTimeCompletionProvider.cs | 10 ++- .../Providers/ChatCompletionProvider.cs | 3 +- ...osoftExtensionsAIChatCompletionProvider.cs | 7 +- .../Providers/Chat/ChatCompletionProvider.cs | 10 ++- .../Realtime/RealTimeCompletionProvider.cs | 10 ++- .../Providers/ChatCompletionProvider.cs | 3 +- .../Core/TestAgentService.cs | 25 +++--- ...manticKernelChatCompletionProviderTests.cs | 2 +- 16 files changed, 122 insertions(+), 100 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs index e2905976b..c195df5e9 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Agents/IAgentService.cs @@ -29,19 +29,18 @@ public interface IAgentService /// Task InheritAgent(Agent agent); - string RenderInstruction(Agent agent); + string RenderInstruction(Agent agent, Dictionary? renderData = null); - string RenderTemplate(Agent agent, string templateName); + string RenderTemplate(Agent agent, string templateName, Dictionary? renderData = null); - bool RenderFunction(Agent agent, FunctionDef def); + bool RenderFunction(Agent agent, FunctionDef def, Dictionary? renderData = null); - FunctionParametersDef? RenderFunctionProperty(Agent agent, FunctionDef def); + FunctionParametersDef? RenderFunctionProperty(Agent agent, FunctionDef def, Dictionary? renderData = null); - (string, IEnumerable) PrepareInstructionAndFunctions(Agent agent, StringComparer? comparer = null); - IEnumerable FilterFunctions(string instruction, Agent agent, StringComparer? comparer = null); - IEnumerable FilterFunctions(string instruction, IEnumerable functions, StringComparer? comparer = null); + (string, IEnumerable) PrepareInstructionAndFunctions(Agent agent, Dictionary? renderData = null, StringComparer? comparer = null); bool RenderVisibility(string? visibilityExpression, Dictionary dict); + Dictionary CollectRenderData(Agent agent); /// diff --git a/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs b/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs index 2620765e3..a8bafdd25 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Hooks/BasicAgentHook.cs @@ -63,17 +63,18 @@ public override void OnAgentUtilityLoaded(Agent agent) var agentService = _services.GetRequiredService(); var innerUtilities = utilities!.Where(x => !string.IsNullOrEmpty(x.Name) && !x.Disabled).ToList(); + var renderDict = agentService.CollectRenderData(agent); var functionNames = new List(); var templateNames = new List(); foreach (var utility in innerUtilities) { - var isVisible = agentService.RenderVisibility(utility.VisibilityExpression, agent.TemplateDict); + var isVisible = agentService.RenderVisibility(utility.VisibilityExpression, renderDict); if (!isVisible || utility.Items.IsNullOrEmpty()) continue; foreach (var item in utility.Items) { - isVisible = agentService.RenderVisibility(item.VisibilityExpression, agent.TemplateDict); + isVisible = agentService.RenderVisibility(item.VisibilityExpression, renderDict); if (!isVisible) continue; if (item.FunctionName?.StartsWith(UTIL_PREFIX) == true) diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Rendering.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Rendering.cs index 9675c5e69..00f50a1db 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Rendering.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.Rendering.cs @@ -7,7 +7,7 @@ namespace BotSharp.Core.Agents.Services; public partial class AgentService { - public string RenderInstruction(Agent agent) + public string RenderInstruction(Agent agent, Dictionary? renderData = null) { var render = _services.GetRequiredService(); var conv = _services.GetRequiredService(); @@ -18,19 +18,16 @@ public string RenderInstruction(Agent agent) instructions.AddRange(secondaryInstructions); // update states - var renderDict = new Dictionary(agent.TemplateDict); - foreach (var t in conv.States.GetStates()) - { - renderDict[t.Key] = t.Value; - } - + var renderDict = renderData != null ? new Dictionary(renderData ?? []) : CollectRenderData(agent); renderDict[TemplateRenderConstant.RENDER_AGENT] = agent; + var res = render.Render(string.Join("\r\n", instructions), renderDict); return res; } - public bool RenderFunction(Agent agent, FunctionDef def) + public bool RenderFunction(Agent agent, FunctionDef def, Dictionary? renderData = null) { + var renderDict = renderData ?? agent.TemplateDict; var isRender = true; var channels = def.Channels; @@ -48,18 +45,19 @@ public bool RenderFunction(Agent agent, FunctionDef def) if (!string.IsNullOrWhiteSpace(def.VisibilityExpression)) { - isRender = RenderVisibility(def.VisibilityExpression, agent.TemplateDict); + isRender = RenderVisibility(def.VisibilityExpression, renderDict); } return isRender; } - public FunctionParametersDef? RenderFunctionProperty(Agent agent, FunctionDef def) + public FunctionParametersDef? RenderFunctionProperty(Agent agent, FunctionDef def, Dictionary? renderData = null) { var parameterDef = def?.Parameters; var propertyDef = parameterDef?.Properties; if (propertyDef == null) return null; + var renderDict = renderData ?? agent.TemplateDict; var visibleExpress = "visibility_expression"; var root = propertyDef.RootElement; var iterator = root.EnumerateObject(); @@ -73,7 +71,7 @@ public bool RenderFunction(Agent agent, FunctionDef def) if (node.TryGetProperty(visibleExpress, out var element)) { var expression = element.GetString(); - matched = RenderVisibility(expression, agent.TemplateDict); + matched = RenderVisibility(expression, renderDict); } if (matched) @@ -107,37 +105,19 @@ public bool RenderFunction(Agent agent, FunctionDef def) return parameterDef; } - public (string, IEnumerable) PrepareInstructionAndFunctions(Agent agent, StringComparer? comparer = null) + public (string, IEnumerable) PrepareInstructionAndFunctions(Agent agent, Dictionary? renderData = null, StringComparer ? comparer = null) { var text = string.Empty; if (!string.IsNullOrEmpty(agent.Instruction) || !agent.SecondaryInstructions.IsNullOrEmpty()) { - text = RenderInstruction(agent); + text = RenderInstruction(agent, renderData); } var functions = FilterFunctions(text, agent, comparer); return (text, functions); } - public IEnumerable FilterFunctions(string instruction, Agent agent, StringComparer? comparer = null) - { - var functions = agent.Functions.Concat(agent.SecondaryFunctions ?? []); - if (agent.FuncVisMode.IsEqualTo(AgentFuncVisMode.Auto) && !string.IsNullOrWhiteSpace(instruction)) - { - functions = FilterFunctions(instruction, functions, comparer); - } - return functions; - } - - public IEnumerable FilterFunctions(string instruction, IEnumerable functions, StringComparer? comparer = null) - { - comparer = comparer ?? StringComparer.OrdinalIgnoreCase; - var matches = Regex.Matches(instruction, @"\b[A-Za-z0-9_-]+\b"); - var words = new HashSet(matches.Select(m => m.Value), comparer); - return functions.Where(x => words.Contains(x.Name, comparer)); - } - - public string RenderTemplate(Agent agent, string templateName) + public string RenderTemplate(Agent agent, string templateName, Dictionary? renderData = null) { var conv = _services.GetRequiredService(); var render = _services.GetRequiredService(); @@ -145,14 +125,11 @@ public string RenderTemplate(Agent agent, string templateName) var template = agent.Templates.FirstOrDefault(x => x.Name == templateName)?.Content ?? string.Empty; // update states - foreach (var t in conv.States.GetStates()) - { - agent.TemplateDict[t.Key] = t.Value; - } + var renderDict = renderData != null ? new Dictionary(renderData ?? []) : CollectRenderData(agent); + renderDict[TemplateRenderConstant.RENDER_AGENT] = agent; // render liquid template - agent.TemplateDict[TemplateRenderConstant.RENDER_AGENT] = agent; - var content = render.Render(template, agent.TemplateDict); + var content = render.Render(template, renderDict); HookEmitter.Emit(_services, async hook => await hook.OnRenderingTemplate(agent, templateName, content), agent.Id).Wait(); @@ -175,4 +152,37 @@ public bool RenderVisibility(string? visibilityExpression, Dictionary CollectRenderData(Agent agent) + { + var state = _services.GetRequiredService(); + + var renderDict = new Dictionary(agent?.TemplateDict ?? []); + foreach (var t in state.GetStates()) + { + renderDict[t.Key] = t.Value; + } + + return renderDict; + } + + #region Private methods + private IEnumerable FilterFunctions(string instruction, Agent agent, StringComparer? comparer = null) + { + var functions = agent.Functions.Concat(agent.SecondaryFunctions ?? []); + if (agent.FuncVisMode.IsEqualTo(AgentFuncVisMode.Auto) && !string.IsNullOrWhiteSpace(instruction)) + { + functions = FilterFunctions(instruction, functions, comparer); + } + return functions; + } + + private IEnumerable FilterFunctions(string instruction, IEnumerable functions, StringComparer? comparer = null) + { + comparer = comparer ?? StringComparer.OrdinalIgnoreCase; + var matches = Regex.Matches(instruction, @"\b[A-Za-z0-9_-]+\b"); + var words = new HashSet(matches.Select(m => m.Value), comparer); + return functions.Where(x => words.Contains(x.Name, comparer)); + } + #endregion } diff --git a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs index 31c1e2300..676c182f1 100644 --- a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs @@ -108,7 +108,8 @@ public Task GetChatCompletionsStreamingAsync(Agent agent, List< renderedInstructions = []; // Prepare instruction and functions - var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { renderedInstructions.Add(instruction); diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs index dcbe3e76c..8aaf043a4 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs @@ -372,7 +372,8 @@ public async Task GetChatCompletionsStreamingAsync(Agent agent, var options = InitChatCompletionOption(agent); // Prepare instruction and functions - var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { renderedInstructions.Add(instruction); @@ -384,9 +385,12 @@ public async Task GetChatCompletionsStreamingAsync(Agent agent, { foreach (var function in functions) { - if (!agentService.RenderFunction(agent, function)) continue; + if (!agentService.RenderFunction(agent, function, renderData)) + { + continue; + } - var property = agentService.RenderFunctionProperty(agent, function); + var property = agentService.RenderFunctionProperty(agent, function, renderData); options.Tools.Add(ChatTool.CreateFunctionTool( functionName: function.Name, @@ -395,18 +399,6 @@ public async Task GetChatCompletionsStreamingAsync(Agent agent, } } - foreach (var function in functions) - { - if (!agentService.RenderFunction(agent, function)) continue; - - var property = agentService.RenderFunctionProperty(agent, function); - - options.Tools.Add(ChatTool.CreateFunctionTool( - functionName: function.Name, - functionDescription: function.Description, - functionParameters: BinaryData.FromObjectAsJson(property))); - } - if (!string.IsNullOrEmpty(agent.Knowledges)) { messages.Add(new SystemChatMessage(agent.Knowledges)); diff --git a/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs index 0ffdf5719..cb661aaae 100644 --- a/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.DeepSeekAI/Providers/Chat/ChatCompletionProvider.cs @@ -345,7 +345,8 @@ public void SetModelName(string model) var options = InitChatCompletionOption(agent); // Prepare instruction and functions - var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { renderedInstructions.Add(instruction); @@ -357,9 +358,12 @@ public void SetModelName(string model) { foreach (var function in functions) { - if (!agentService.RenderFunction(agent, function)) continue; + if (!agentService.RenderFunction(agent, function, renderData)) + { + continue; + } - var property = agentService.RenderFunctionProperty(agent, function); + var property = agentService.RenderFunctionProperty(agent, function, renderData); options.Tools.Add(ChatTool.CreateFunctionTool( functionName: function.Name, diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs index bf6879421..85674a4b8 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs @@ -198,7 +198,8 @@ public void SetModelName(string model) var funcPrompts = new List(); // Prepare instruction and functions - var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { renderedInstructions.Add(instruction); @@ -207,9 +208,12 @@ public void SetModelName(string model) foreach (var function in functions) { - if (!agentService.RenderFunction(agent, function)) continue; + if (!agentService.RenderFunction(agent, function, renderData)) + { + continue; + } - var def = agentService.RenderFunctionProperty(agent, function); + var def = agentService.RenderFunctionProperty(agent, function, renderData); var props = JsonSerializer.Serialize(def?.Properties); var parameters = !string.IsNullOrWhiteSpace(props) && props != "{}" ? new Schema() { diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/PalmChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/PalmChatCompletionProvider.cs index 509ed5ba4..c37bb751c 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/PalmChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/PalmChatCompletionProvider.cs @@ -101,7 +101,8 @@ public async Task GetChatCompletions(Agent agent, List(); // Prepare instruction and functions - var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { renderedInstructions.Add(instruction); @@ -501,9 +502,12 @@ await hook.AfterGenerated(new RoleDialogModel(AgentRole.Assistant, text) foreach (var function in functions) { - if (!agentService.RenderFunction(agent, function)) continue; + if (!agentService.RenderFunction(agent, function, renderData)) + { + continue; + } - var def = agentService.RenderFunctionProperty(agent, function); + var def = agentService.RenderFunctionProperty(agent, function, renderData); var props = JsonSerializer.Serialize(def?.Properties); var parameters = !string.IsNullOrWhiteSpace(props) && props != "{}" ? new Schema() diff --git a/src/Plugins/BotSharp.Plugin.MetaGLM/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.MetaGLM/Providers/ChatCompletionProvider.cs index 20f59db21..f7831e1a9 100644 --- a/src/Plugins/BotSharp.Plugin.MetaGLM/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.MetaGLM/Providers/ChatCompletionProvider.cs @@ -94,7 +94,8 @@ private string PrepareOptions(Agent agent, List conversations, renderedInstructions = []; // Prepare instruction and functions - var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { renderedInstructions.Add(instruction); diff --git a/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/MicrosoftExtensionsAIChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/MicrosoftExtensionsAIChatCompletionProvider.cs index 3394b514e..8440dc455 100644 --- a/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/MicrosoftExtensionsAIChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.MicrosoftExtensionsAI/MicrosoftExtensionsAIChatCompletionProvider.cs @@ -73,7 +73,8 @@ public async Task GetChatCompletions(Agent agent, List(); // Prepare instruction and functions - var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { renderedInstructions.Add(instruction); @@ -82,9 +83,9 @@ public async Task GetChatCompletions(Agent agent, List GetChatCompletionsStreamingAsync(Agent agent, var options = InitChatCompletionOption(agent); // Prepare instruction and functions - var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { renderedInstructions.Add(instruction); @@ -354,9 +355,12 @@ public async Task GetChatCompletionsStreamingAsync(Agent agent, { foreach (var function in functions) { - if (!agentService.RenderFunction(agent, function)) continue; + if (!agentService.RenderFunction(agent, function, renderData)) + { + continue; + } - var property = agentService.RenderFunctionProperty(agent, function); + var property = agentService.RenderFunctionProperty(agent, function, renderData); options.Tools.Add(ChatTool.CreateFunctionTool( functionName: function.Name, diff --git a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs index da5ef0b9c..890a8619c 100644 --- a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Realtime/RealTimeCompletionProvider.cs @@ -568,7 +568,8 @@ private async Task OnUserAudioTranscriptionCompleted(RealtimeHu }; // Prepare instruction and functions - var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, functions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { messages.Add(new SystemChatMessage(instruction)); @@ -576,9 +577,12 @@ private async Task OnUserAudioTranscriptionCompleted(RealtimeHu foreach (var function in functions) { - if (!agentService.RenderFunction(agent, function)) continue; + if (!agentService.RenderFunction(agent, function, renderData)) + { + continue; + } - var property = agentService.RenderFunctionProperty(agent, function); + var property = agentService.RenderFunctionProperty(agent, function, renderData); options.Tools.Add(ChatTool.CreateFunctionTool( functionName: function.Name, diff --git a/src/Plugins/BotSharp.Plugin.SparkDesk/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.SparkDesk/Providers/ChatCompletionProvider.cs index b8191c56c..59c43dc5f 100644 --- a/src/Plugins/BotSharp.Plugin.SparkDesk/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.SparkDesk/Providers/ChatCompletionProvider.cs @@ -235,7 +235,8 @@ public void SetModelName(string model) renderedInstructions = []; // Prepare instruction and functions - var (instruction, agentFunctions) = agentService.PrepareInstructionAndFunctions(agent); + var renderData = agentService.CollectRenderData(agent); + var (instruction, agentFunctions) = agentService.PrepareInstructionAndFunctions(agent, renderData); if (!string.IsNullOrWhiteSpace(instruction)) { renderedInstructions.Add(instruction); diff --git a/tests/BotSharp.LLM.Tests/Core/TestAgentService.cs b/tests/BotSharp.LLM.Tests/Core/TestAgentService.cs index d46b7ca4f..45d6dc6d5 100644 --- a/tests/BotSharp.LLM.Tests/Core/TestAgentService.cs +++ b/tests/BotSharp.LLM.Tests/Core/TestAgentService.cs @@ -41,37 +41,27 @@ public Task InheritAgent(Agent agent) return Task.CompletedTask; } - public string RenderInstruction(Agent agent) + public string RenderInstruction(Agent agent, Dictionary? renderData = null) { return "Fake Instruction"; } - public string RenderTemplate(Agent agent, string templateName) + public string RenderTemplate(Agent agent, string templateName, Dictionary? renderData = null) { return $"Rendered template for {templateName}"; } - public bool RenderFunction(Agent agent, FunctionDef def) + public bool RenderFunction(Agent agent, FunctionDef def, Dictionary? renderData = null) { return true; } - public (string, IEnumerable) PrepareInstructionAndFunctions(Agent agent, StringComparer? comparer = null) + public (string, IEnumerable) PrepareInstructionAndFunctions(Agent agent, Dictionary? renderData = null, StringComparer? comparer = null) { return (string.Empty, []); } - public IEnumerable FilterFunctions(string instruction, Agent agent, StringComparer? comparer = null) - { - return []; - } - - public IEnumerable FilterFunctions(string instruction, IEnumerable functions, StringComparer? comparer = null) - { - return []; - } - - public FunctionParametersDef? RenderFunctionProperty(Agent agent, FunctionDef def) + public FunctionParametersDef? RenderFunctionProperty(Agent agent, FunctionDef def, Dictionary? renderData = null) { return def.Parameters; } @@ -130,5 +120,10 @@ public Task> GetAgentUtilityOptions() { return Task.FromResult(Enumerable.Empty()); } + + public Dictionary CollectRenderData(Agent agent) + { + return []; + } } } \ No newline at end of file diff --git a/tests/BotSharp.Plugin.SemanticKernel.UnitTests/SemanticKernelChatCompletionProviderTests.cs b/tests/BotSharp.Plugin.SemanticKernel.UnitTests/SemanticKernelChatCompletionProviderTests.cs index 0472571c8..620163ac3 100644 --- a/tests/BotSharp.Plugin.SemanticKernel.UnitTests/SemanticKernelChatCompletionProviderTests.cs +++ b/tests/BotSharp.Plugin.SemanticKernel.UnitTests/SemanticKernelChatCompletionProviderTests.cs @@ -38,7 +38,7 @@ public async void GetChatCompletions_Returns_RoleDialogModel() _servicesMock.Setup(x => x.GetService(typeof(IEnumerable))) .Returns(new List()); var agentService = new Mock(); - agentService.Setup(x => x.RenderInstruction(agent)).Returns("How can I help you?"); + agentService.Setup(x => x.RenderInstruction(agent, null)).Returns("How can I help you?"); _servicesMock.Setup(x => x.GetService(typeof(IAgentService))) .Returns(agentService.Object);