From f46737e118fe8103a92eebc662a26ac28eece582 Mon Sep 17 00:00:00 2001 From: Gunpal Jain Date: Fri, 4 Apr 2025 06:48:14 +0530 Subject: [PATCH] Update nullability, clean up formatting, and improve naming --- .../Functions/Models/FunctionDef.cs | 2 +- .../Providers/ChatCompletionProvider.cs | 36 ++++++++----- .../Chat/GeminiChatCompletionProvider.cs | 10 ++-- .../Embedding/TextEmbeddingProvider.cs | 4 +- .../Providers/ProviderHelper.cs | 8 +-- .../Realtime/RealTimeCompletionProvider.cs | 51 ++++++++----------- ...nctionTool.cs => TemporaryFunctionTool.cs} | 4 +- .../Text/GeminiTextCompletionProvider.cs | 6 +-- src/WebStarter/appsettings.json | 11 +++- ...letion_Tests.cs => ChatCompletionTests.cs} | 4 +- .../{Embedding_Tests.cs => EmbeddingTests.cs} | 2 +- ...lling_Tests.cs => FunctionCallingTests.cs} | 2 +- ...alTime_Tests.cs => GoogleRealTimeTests.cs} | 2 +- .../BotSharp.Plugin.PizzaBot.csproj | 5 -- 14 files changed, 75 insertions(+), 72 deletions(-) rename src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/{FakeFunctionTool.cs => TemporaryFunctionTool.cs} (85%) rename tests/BotSharp.LLM.Tests/{ChatCompletion_Tests.cs => ChatCompletionTests.cs} (98%) rename tests/BotSharp.LLM.Tests/{Embedding_Tests.cs => EmbeddingTests.cs} (98%) rename tests/BotSharp.LLM.Tests/{FunctionCalling_Tests.cs => FunctionCallingTests.cs} (99%) rename tests/BotSharp.LLM.Tests/{GoogleRealTime_Tests.cs => GoogleRealTimeTests.cs} (97%) diff --git a/src/Infrastructure/BotSharp.Abstraction/Functions/Models/FunctionDef.cs b/src/Infrastructure/BotSharp.Abstraction/Functions/Models/FunctionDef.cs index bd71009b..2160e372 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Functions/Models/FunctionDef.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Functions/Models/FunctionDef.cs @@ -23,7 +23,7 @@ public class FunctionDef public string? Impact { get; set; } [JsonPropertyName("parameters")] - public FunctionParametersDef Parameters { get; set; } = new FunctionParametersDef(); + public FunctionParametersDef? Parameters { get; set; } = new FunctionParametersDef(); [JsonPropertyName("output")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] diff --git a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs index 98ca310e..5c1015ef 100644 --- a/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AnthropicAI/Providers/ChatCompletionProvider.cs @@ -89,17 +89,20 @@ public class ChatCompletionProvider : IChatCompletion return responseMessage; } - public Task GetChatCompletionsAsync(Agent agent, List conversations, Func onMessageReceived, Func onFunctionExecuting) + public Task GetChatCompletionsAsync(Agent agent, List conversations, + Func onMessageReceived, Func onFunctionExecuting) { throw new NotImplementedException(); } - public Task GetChatCompletionsStreamingAsync(Agent agent, List conversations, Func onMessageReceived) + public Task GetChatCompletionsStreamingAsync(Agent agent, List conversations, + Func onMessageReceived) { throw new NotImplementedException(); } - private (string, MessageParameters) PrepareOptions(Agent agent, List conversations, LlmModelSetting settings) + private (string, MessageParameters) PrepareOptions(Agent agent, List conversations, + LlmModelSetting settings) { var instruction = ""; renderedInstructions = []; @@ -178,8 +181,8 @@ public class ChatCompletionProvider : IChatCompletion var state = _services.GetRequiredService(); var temperature = decimal.Parse(state.GetState("temperature", "0.0")); var maxTokens = int.TryParse(state.GetState("max_tokens"), out var tokens) - ? tokens - : agent.LlmConfig?.MaxOutputTokens ?? LlmConstant.DEFAULT_MAX_OUTPUT_TOKEN; + ? tokens + : agent.LlmConfig?.MaxOutputTokens ?? LlmConstant.DEFAULT_MAX_OUTPUT_TOKEN; var parameters = new MessageParameters() { @@ -188,7 +191,7 @@ public class ChatCompletionProvider : IChatCompletion Model = settings.Name, Stream = false, Temperature = temperature, - Tools = new List() + Tools = new List() }; if (!string.IsNullOrEmpty(instruction)) @@ -197,9 +200,11 @@ public class ChatCompletionProvider : IChatCompletion { new SystemMessage(instruction) }; - }; + } - JsonSerializerOptions jsonSerializationOptions = new() + ; + + JsonSerializerOptions? jsonSerializationOptions = new() { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, Converters = { new JsonStringEnumConverter() }, @@ -238,7 +243,7 @@ public class ChatCompletionProvider : IChatCompletion private string GetPrompt(MessageParameters parameters) { - var prompt = $"{string.Join("\r\n", (parameters.System??new List()).Select(x => x.Text))}\r\n"; + var prompt = $"{string.Join("\r\n", (parameters.System ?? new List()).Select(x => x.Text))}\r\n"; prompt += "\r\n[CONVERSATION]"; var verbose = string.Join("\r\n", parameters.Messages @@ -272,6 +277,7 @@ public class ChatCompletionProvider : IChatCompletion })); return $"{role}: {content}"; } + return string.Empty; })); @@ -279,10 +285,12 @@ public class ChatCompletionProvider : IChatCompletion if (parameters.Tools != null && parameters.Tools.Count > 0) { - var functions = string.Join("\r\n", parameters.Tools.Select(x => - { - return $"\r\n{x.Function.Name}: {x.Function.Description}\r\n{JsonSerializer.Serialize(x.Function.Parameters)}"; - })); + var functions = string.Join("\r\n", + parameters.Tools.Select(x => + { + return + $"\r\n{x.Function.Name}: {x.Function.Description}\r\n{JsonSerializer.Serialize(x.Function.Parameters)}"; + })); prompt += $"\r\n[FUNCTIONS]\r\n{functions}\r\n"; } @@ -293,4 +301,4 @@ public class ChatCompletionProvider : IChatCompletion { _model = model; } -} +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs index 38b2fd13..3409121a 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Chat/GeminiChatCompletionProvider.cs @@ -21,13 +21,13 @@ public class GeminiChatCompletionProvider : IChatCompletion public string Provider => "google-ai"; public string Model => _model; - private GoogleAiSettings _googleSettings; + private GoogleAiSettings _settings; public GeminiChatCompletionProvider( IServiceProvider services, GoogleAiSettings googleSettings, ILogger logger) { - _googleSettings = googleSettings; + _settings = googleSettings; _services = services; _logger = logger; } @@ -42,7 +42,7 @@ public class GeminiChatCompletionProvider : IChatCompletion await hook.BeforeGenerating(agent, conversations); } - var client = ProviderHelper.GetGeminiClient(Provider, _model, _services, _googleSettings, _logger); + var client = ProviderHelper.GetGeminiClient(Provider, _model, _services); var aiModel = client.CreateGenerativeModel(_model); var (prompt, request) = PrepareOptions(aiModel, agent, conversations); @@ -101,7 +101,7 @@ public class GeminiChatCompletionProvider : IChatCompletion await hook.BeforeGenerating(agent, conversations); } - var client = ProviderHelper.GetGeminiClient(Provider, _model, _services, _googleSettings, _logger); + var client = ProviderHelper.GetGeminiClient(Provider, _model, _services); var chatClient = client.CreateGenerativeModel(_model); var (prompt, messages) = PrepareOptions(chatClient, agent, conversations); @@ -166,7 +166,7 @@ public class GeminiChatCompletionProvider : IChatCompletion public async Task GetChatCompletionsStreamingAsync(Agent agent, List conversations, Func onMessageReceived) { - var client = ProviderHelper.GetGeminiClient(Provider, _model, _services, _googleSettings, _logger); + var client = ProviderHelper.GetGeminiClient(Provider, _model, _services); var chatClient = client.CreateGenerativeModel(_model); var (prompt, messages) = PrepareOptions(chatClient,agent, conversations); diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Embedding/TextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Embedding/TextEmbeddingProvider.cs index 0bff0011..0f8d823e 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Embedding/TextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Embedding/TextEmbeddingProvider.cs @@ -30,7 +30,7 @@ public class TextEmbeddingProvider : ITextEmbedding public async Task GetVectorAsync(string text) { - var client = ProviderHelper.GetGeminiClient(Provider, _model, _services, _settings, _logger); + var client = ProviderHelper.GetGeminiClient(Provider, _model, _services); var embeddingClient = client.CreateEmbeddingModel(_model); var response = await embeddingClient.EmbedContentAsync(text); @@ -40,7 +40,7 @@ public class TextEmbeddingProvider : ITextEmbedding public async Task> GetVectorsAsync(List texts) { - var client = ProviderHelper.GetGeminiClient(Provider, _model, _services, _settings, _logger); + var client = ProviderHelper.GetGeminiClient(Provider, _model, _services); var embeddingClient = client.CreateEmbeddingModel(_model); var response = await embeddingClient.BatchEmbedContentAsync(texts.Select(s=>new Content(s, Roles.User))); diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/ProviderHelper.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/ProviderHelper.cs index 5e787457..5f7e1312 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/ProviderHelper.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/ProviderHelper.cs @@ -5,20 +5,20 @@ namespace BotSharp.Plugin.GoogleAi.Providers; public static class ProviderHelper { - public static GenerativeAI.GoogleAi GetGeminiClient(string provider, string model, IServiceProvider services, GoogleAiSettings? aiSettings, ILogger? _logger) + public static GenerativeAI.GoogleAi GetGeminiClient(string provider, string model, IServiceProvider services) { + var aiSettings = services.GetRequiredService(); if (aiSettings == null || aiSettings.Gemini ==null || string.IsNullOrEmpty(aiSettings.Gemini.ApiKey)) { var settingsService = services.GetRequiredService(); var settings = settingsService.GetSetting(provider, model); - var client = new GenerativeAI.GoogleAi(settings.ApiKey, logger:_logger); + var client = new GenerativeAI.GoogleAi(settings.ApiKey); return client; } else { - return new GenerativeAI.GoogleAi(aiSettings.Gemini.ApiKey, logger:_logger); + return new GenerativeAI.GoogleAi(aiSettings.Gemini.ApiKey); } - } public static GooglePalmClient GetPalmClient(string provider, string model, IServiceProvider services) diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/RealTimeCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/RealTimeCompletionProvider.cs index ac374480..be6355d3 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/RealTimeCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/RealTimeCompletionProvider.cs @@ -33,13 +33,14 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime private readonly ILogger _logger; private List renderedInstructions = []; - private readonly GoogleAiSettings _googleSettings; + private readonly GoogleAiSettings _settings; + public GoogleRealTimeProvider( IServiceProvider services, GoogleAiSettings googleSettings, ILogger logger) { - _googleSettings = googleSettings; + _settings = googleSettings; _services = services; _logger = logger; } @@ -88,7 +89,7 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime public async Task AppenAudioBuffer(string message) { - await _client.SendAudioAsync(Convert.FromBase64String(message)); + await _client.SendAudioAsync(Convert.FromBase64String(message)); } public async Task TriggerModelInference(string? instructions = null) @@ -101,13 +102,10 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime public async Task CancelModelResponse() { - } public async Task RemoveConversationItem(string itemId) { - - } private async Task AttachEvents() @@ -124,8 +122,8 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime { if (e.Payload.ServerContent.TurnComplete == true) { - var responseDone = await ResponseDone(conn,e.Payload.ServerContent); - onModelResponseDone(responseDone); + var responseDone = await ResponseDone(conn, e.Payload.ServerContent); + onModelResponseDone(responseDone); } } }; @@ -139,16 +137,14 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime onInputAudioTranscriptionCompleted(new RoleDialogModel(AgentRole.Assistant, e.Text)); }; _client.GenerationInterrupted += async (sender, e) => { onUserInterrupted(); }; - _client.AudioReceiveCompleted += async (sender, e) => - { - onModelAudioResponseDone(); - }; + _client.AudioReceiveCompleted += async (sender, e) => { onModelAudioResponseDone(); }; } - private async Task> ResponseDone(RealtimeHubConnection conn, BidiGenerateContentServerContent serverContent) + private async Task> ResponseDone(RealtimeHubConnection conn, + BidiGenerateContentServerContent serverContent) { var outputs = new List(); - + var parts = serverContent.ModelTurn?.Parts; if (parts != null) { @@ -194,6 +190,7 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime Model = _model, }); } + return outputs; } @@ -206,29 +203,25 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime { var contentHooks = _services.GetServices().ToList(); - var client = ProviderHelper.GetGeminiClient(Provider, _model, _services, _googleSettings, _logger); + var client = ProviderHelper.GetGeminiClient(Provider, _model, _services); var chatClient = client.CreateGenerativeModel(_model); var (prompt, request) = PrepareOptions(chatClient, agent, conversations); - var config = request.GenerationConfig; - + //Output Modality can either be text or audio config.ResponseModalities = new List([Modality.AUDIO]); - var settingsService = _services.GetRequiredService(); var settings = settingsService.GetSetting(Provider, _model); - - _client = chatClient.CreateMultiModalLiveClient(config, systemInstruction: request.SystemInstruction?.Parts.FirstOrDefault()?.Text); - _client.UseGoogleSearch = _googleSettings.Gemini.UseGoogleSearch; - + _client.UseGoogleSearch = _settings.Gemini.UseGoogleSearch; + if (request.Tools != null && request.Tools.Count > 0) { - var lst = (request.Tools.Select(s => (IFunctionTool)new FakeFunctionTool(s)).ToList()); + var lst = (request.Tools.Select(s => (IFunctionTool)new TemporaryFunctionTool(s)).ToList()); _client.AddFunctionTools(lst, new ToolConfig() { @@ -261,7 +254,7 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime var agentService = _services.GetRequiredService(); var agent = await agentService.LoadAgent(conn.CurrentAgentId); - var client = ProviderHelper.GetGeminiClient(Provider, _model, _services, _googleSettings, _logger); + var client = ProviderHelper.GetGeminiClient(Provider, _model, _services); var chatClient = client.CreateGenerativeModel(_model); var (prompt, request) = PrepareOptions(chatClient, agent, new List()); @@ -295,7 +288,7 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime async hook => { await hook.OnSessionUpdated(agent, prompt, functions); }); //ToDo: Not sure what's the purpose of UpdateSession, Google Realtime conversion works right after sending the message away! - + // await _client.SendSetupAsync(new BidiGenerateContentSetup() // { // GenerationConfig = config, @@ -316,7 +309,7 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime Name = message.FunctionName, Response = JsonNode.Parse(message.Content ?? "{}") }; - + await _client.SendToolResponseAsync(new BidiGenerateContentToolResponse() { FunctionResponses = [function] @@ -330,7 +323,7 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime await _client.SendClientContentAsync(new BidiGenerateContentClientContent() { TurnComplete = true, - Turns = new []{new Content(message.Content, AgentRole.User)} + Turns = new[] { new Content(message.Content, AgentRole.User) } }); } else @@ -354,7 +347,7 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime List conversations) { var agentService = _services.GetRequiredService(); - var googleSettings = _googleSettings; + var googleSettings = _settings; renderedInstructions = []; // Add settings @@ -472,7 +465,7 @@ namespace BotSharp.Plugin.GoogleAi.Providers.Realtime GenerationConfig = new() { Temperature = temperature, - MaxOutputTokens = maxTokens + MaxOutputTokens = maxTokens } }; diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/FakeFunctionTool.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/TemporaryFunctionTool.cs similarity index 85% rename from src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/FakeFunctionTool.cs rename to src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/TemporaryFunctionTool.cs index 5a20026c..3554574c 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/FakeFunctionTool.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Realtime/TemporaryFunctionTool.cs @@ -4,11 +4,11 @@ using GenerativeAI.Types; namespace BotSharp.Plugin.GoogleAi.Providers.Realtime { - public class FakeFunctionTool:IFunctionTool + public class TemporaryFunctionTool:IFunctionTool { public Tool Tool { get; set; } - public FakeFunctionTool(Tool tool) + public TemporaryFunctionTool(Tool tool) { this.Tool = tool; } diff --git a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Text/GeminiTextCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Text/GeminiTextCompletionProvider.cs index 6c6b2c72..7d4173d6 100644 --- a/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Text/GeminiTextCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.GoogleAI/Providers/Text/GeminiTextCompletionProvider.cs @@ -17,14 +17,14 @@ public class GeminiTextCompletionProvider : ITextCompletion public string Provider => "google-ai"; public string Model => _model; - private GoogleAiSettings _googleSettings; + private GoogleAiSettings _settings; public GeminiTextCompletionProvider( IServiceProvider services, GoogleAiSettings googleSettings, ILogger logger, ITokenStatistics tokenStatistics) { - _googleSettings = googleSettings; + _settings = googleSettings; _services = services; _logger = logger; _tokenStatistics = tokenStatistics; @@ -50,7 +50,7 @@ public class GeminiTextCompletionProvider : ITextCompletion await hook.BeforeGenerating(agent, new List { userMessage }); } - var client = ProviderHelper.GetGeminiClient(Provider, _model, _services, _googleSettings, _logger); + var client = ProviderHelper.GetGeminiClient(Provider, _model, _services); var aiModel = client.CreateGenerativeModel(_model); PrepareOptions(aiModel); diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index 743cf7fa..69625129 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -169,11 +169,18 @@ "Provider": "google-ai", "Models": [ { - "Name": "gemini-2.0-flash-exp", + "Name": "gemini-2.0-flash", "ApiKey": "", "Type": "chat", "MultiModal": true, - "RealTime": true, + "PromptCost": 0.0015, + "CompletionCost": 0.002 + }, + { + "Name": "gemini-2.0-flash-exp", + "ApiKey": "", + "Type": "realtime", + "MultiModal": true, "PromptCost": 0.0015, "CompletionCost": 0.002 } diff --git a/tests/BotSharp.LLM.Tests/ChatCompletion_Tests.cs b/tests/BotSharp.LLM.Tests/ChatCompletionTests.cs similarity index 98% rename from tests/BotSharp.LLM.Tests/ChatCompletion_Tests.cs rename to tests/BotSharp.LLM.Tests/ChatCompletionTests.cs index 67c5c010..ee3e132a 100644 --- a/tests/BotSharp.LLM.Tests/ChatCompletion_Tests.cs +++ b/tests/BotSharp.LLM.Tests/ChatCompletionTests.cs @@ -11,7 +11,7 @@ using Shouldly; namespace BotSharp.Plugin.Google.Core { - public class ChatCompletion_Tests:TestBase + public class ChatCompletionTests:TestBase { protected static Agent CreateTestAgent() { @@ -56,7 +56,7 @@ namespace BotSharp.Plugin.Google.Core yield return new object[] { services.BuildServiceProvider().GetService() ?? throw new Exception("Error while initializing"), agent, modelName }; } } - public ChatCompletion_Tests() + public ChatCompletionTests() { } diff --git a/tests/BotSharp.LLM.Tests/Embedding_Tests.cs b/tests/BotSharp.LLM.Tests/EmbeddingTests.cs similarity index 98% rename from tests/BotSharp.LLM.Tests/Embedding_Tests.cs rename to tests/BotSharp.LLM.Tests/EmbeddingTests.cs index 5fdb1c8c..a2871643 100644 --- a/tests/BotSharp.LLM.Tests/Embedding_Tests.cs +++ b/tests/BotSharp.LLM.Tests/EmbeddingTests.cs @@ -9,7 +9,7 @@ using Shouldly; namespace BotSharp.Plugin.Google.Core { - public class Embedding_Tests:TestBase + public class EmbeddingTests:TestBase { protected static Agent CreateTestAgent() { diff --git a/tests/BotSharp.LLM.Tests/FunctionCalling_Tests.cs b/tests/BotSharp.LLM.Tests/FunctionCallingTests.cs similarity index 99% rename from tests/BotSharp.LLM.Tests/FunctionCalling_Tests.cs rename to tests/BotSharp.LLM.Tests/FunctionCallingTests.cs index 09ce9125..b283caa1 100644 --- a/tests/BotSharp.LLM.Tests/FunctionCalling_Tests.cs +++ b/tests/BotSharp.LLM.Tests/FunctionCallingTests.cs @@ -10,7 +10,7 @@ using Shouldly; namespace BotSharp.Plugin.Google.Core { - public class FunctionCalling_Tests : TestBase + public class FunctionCallingTests : TestBase { public static IEnumerable CreateTestLLMProviders() { diff --git a/tests/BotSharp.LLM.Tests/GoogleRealTime_Tests.cs b/tests/BotSharp.LLM.Tests/GoogleRealTimeTests.cs similarity index 97% rename from tests/BotSharp.LLM.Tests/GoogleRealTime_Tests.cs rename to tests/BotSharp.LLM.Tests/GoogleRealTimeTests.cs index 62a06b4c..8908b62b 100644 --- a/tests/BotSharp.LLM.Tests/GoogleRealTime_Tests.cs +++ b/tests/BotSharp.LLM.Tests/GoogleRealTimeTests.cs @@ -11,7 +11,7 @@ using Shouldly; namespace BotSharp.Plugin.Google.Core { - public class GoogleRealTime_Tests : TestBase + public class GoogleRealTimeTests : TestBase { protected static Agent CreateTestAgent() { diff --git a/tests/BotSharp.Plugin.PizzaBot/BotSharp.Plugin.PizzaBot.csproj b/tests/BotSharp.Plugin.PizzaBot/BotSharp.Plugin.PizzaBot.csproj index d3b04ece..d132125f 100644 --- a/tests/BotSharp.Plugin.PizzaBot/BotSharp.Plugin.PizzaBot.csproj +++ b/tests/BotSharp.Plugin.PizzaBot/BotSharp.Plugin.PizzaBot.csproj @@ -100,9 +100,4 @@ PreserveNewest - - - - -