diff --git a/src/Infrastructure/BotSharp.Core/Using.cs b/src/Infrastructure/BotSharp.Core/Using.cs index 709285e2c..c17b2896b 100644 --- a/src/Infrastructure/BotSharp.Core/Using.cs +++ b/src/Infrastructure/BotSharp.Core/Using.cs @@ -28,7 +28,6 @@ global using BotSharp.Abstraction.Files.Enums; global using BotSharp.Abstraction.Translation.Attributes; global using BotSharp.Abstraction.Messaging.Enums; -global using BotSharp.Abstraction.Http.Settings; global using BotSharp.Core.Repository; global using BotSharp.Core.Routing; global using BotSharp.Core.Agents.Services; diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/InstructModeController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/InstructModeController.cs index 465f3d7b2..f2d4bf5d3 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/InstructModeController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/InstructModeController.cs @@ -85,7 +85,7 @@ public async Task MultiModalCompletion([FromBody] IncomingMessageModel i try { var completion = CompletionProvider.GetChatCompletion(_services, provider: input.Provider ?? "openai", - modelId: input.ModelId ?? "gpt-4", multiModal: true); + model: input.Model ?? "gpt-4o", multiModal: true); var message = await completion.GetChatCompletions(new Agent() { Id = Guid.Empty.ToString(), diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs index de257dede..16e2841a6 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Chat/ChatCompletionProvider.cs @@ -193,7 +193,6 @@ public async Task GetChatCompletionsStreamingAsync(Agent agent, List, ChatCompletionOptions) PrepareOptions(Agent agent, List conversations) { var agentService = _services.GetRequiredService(); @@ -257,40 +256,34 @@ public async Task GetChatCompletionsStreamingAsync(Agent agent, List { textPart }; - if (allowMultiModal) + if (allowMultiModal && !message.Files.IsNullOrEmpty()) { - if (!message.Files.IsNullOrEmpty()) + foreach (var file in message.Files) { - foreach (var file in message.Files) + if (!string.IsNullOrEmpty(file.FileUrl)) + { + var uri = new Uri(file.FileUrl); + var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(uri, ImageChatMessageContentPartDetail.Low); + contentParts.Add(contentPart); + } + else if (!string.IsNullOrEmpty(file.FileData)) { - if (!string.IsNullOrEmpty(file.FileUrl)) - { - var uri = new Uri(file.FileUrl); - var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(uri, ImageChatMessageContentPartDetail.Low); - chat = new UserChatMessage(textPart, contentPart) { ParticipantName = message.FunctionName }; - } - else if (!string.IsNullOrEmpty(file.FileData)) - { - var (contentType, bytes) = fileService.GetFileInfoFromData(file.FileData); - var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(BinaryData.FromBytes(bytes), contentType, ImageChatMessageContentPartDetail.Low); - chat = new UserChatMessage(textPart, contentPart) { ParticipantName = message.FunctionName }; - } - else if (!string.IsNullOrEmpty(file.FileStorageUrl)) - { - var contentType = fileService.GetFileContentType(file.FileStorageUrl); - using var stream = File.OpenRead(file.FileStorageUrl); - var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(BinaryData.FromStream(stream), contentType, ImageChatMessageContentPartDetail.Low); - chat = new UserChatMessage(textPart, contentPart) { ParticipantName = message.FunctionName }; - } + var (contentType, bytes) = fileService.GetFileInfoFromData(file.FileData); + var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(BinaryData.FromBytes(bytes), contentType, ImageChatMessageContentPartDetail.Low); + contentParts.Add(contentPart); + } + else if (!string.IsNullOrEmpty(file.FileStorageUrl)) + { + var contentType = fileService.GetFileContentType(file.FileStorageUrl); + using var stream = File.OpenRead(file.FileStorageUrl); + var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(BinaryData.FromStream(stream), contentType, ImageChatMessageContentPartDetail.Low); + contentParts.Add(contentPart); } } } - messages.Add(chat); + messages.Add(new UserChatMessage(contentParts) { ParticipantName = message.FunctionName }); } else if (message.Role == AgentRole.Assistant) { @@ -302,7 +295,6 @@ public async Task GetChatCompletionsStreamingAsync(Agent agent, List messages, ChatCompletionOptions options) { var prompt = string.Empty; diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Functions/HandleHttpRequestFn.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Functions/HandleHttpRequestFn.cs index 4aba44896..9b794b9ff 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Functions/HandleHttpRequestFn.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Functions/HandleHttpRequestFn.cs @@ -1,5 +1,4 @@ using System.Net.Http; -using BotSharp.Plugin.HttpHandler.LlmContexts; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; @@ -58,7 +57,7 @@ public async Task Execute(RoleDialogModel message) { if (string.IsNullOrEmpty(url)) return null; - var settings = _services.GetRequiredService(); + var settings = _services.GetRequiredService(); using var client = _httpClientFactory.CreateClient(); AddRequestHeaders(client); @@ -82,7 +81,7 @@ private void AddRequestHeaders(HttpClient client) { client.DefaultRequestHeaders.Add("Authorization", $"{_context.HttpContext.Request.Headers["Authorization"]}"); - var settings = _services.GetRequiredService(); + var settings = _services.GetRequiredService(); var origin = !string.IsNullOrEmpty(settings.Origin) ? settings.Origin : $"{_context.HttpContext.Request.Headers["Origin"]}"; if (!string.IsNullOrEmpty(origin)) { diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs index a51063809..0d83719d7 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerHook.cs @@ -3,7 +3,6 @@ using BotSharp.Abstraction.Agents.Settings; using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Repositories; -using BotSharp.Plugin.HttpHandler.Enums; namespace BotSharp.Plugin.HttpHandler.Hooks; diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs index ee81372d9..f1f8041e6 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Hooks/HttpHandlerUtilityHook.cs @@ -1,5 +1,4 @@ using BotSharp.Abstraction.Agents; -using BotSharp.Plugin.HttpHandler.Enums; namespace BotSharp.Plugin.HttpHandler.Hooks; diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs index 8958a6b12..48d71ee83 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/HttpHandlerPlugin.cs @@ -1,6 +1,5 @@ using BotSharp.Abstraction.Agents; using BotSharp.Abstraction.Settings; -using BotSharp.Plugin.HttpHandler.Hooks; using Microsoft.Extensions.Configuration; namespace BotSharp.Plugin.HttpHandler; @@ -18,7 +17,7 @@ public void RegisterDI(IServiceCollection services, IConfiguration config) services.AddScoped(provider => { var settingService = provider.GetRequiredService(); - return settingService.Bind("Http"); + return settingService.Bind("HttpHandler"); }); services.AddScoped(); diff --git a/src/Infrastructure/BotSharp.Abstraction/Http/Settings/HttpSettings.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Settings/HttpHandlerSettings.cs similarity index 59% rename from src/Infrastructure/BotSharp.Abstraction/Http/Settings/HttpSettings.cs rename to src/Plugins/BotSharp.Plugin.HttpHandler/Settings/HttpHandlerSettings.cs index 8fc14988f..8f2f66a6c 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Http/Settings/HttpSettings.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Settings/HttpHandlerSettings.cs @@ -1,6 +1,6 @@ -namespace BotSharp.Abstraction.Http.Settings; +namespace BotSharp.Plugin.HttpHandler.Settings; -public class HttpSettings +public class HttpHandlerSettings { public string BaseAddress { get; set; } = string.Empty; public string Origin { get; set; } = string.Empty; diff --git a/src/Plugins/BotSharp.Plugin.HttpHandler/Using.cs b/src/Plugins/BotSharp.Plugin.HttpHandler/Using.cs index 4344b4305..beec51feb 100644 --- a/src/Plugins/BotSharp.Plugin.HttpHandler/Using.cs +++ b/src/Plugins/BotSharp.Plugin.HttpHandler/Using.cs @@ -15,5 +15,8 @@ global using BotSharp.Abstraction.Messaging; global using BotSharp.Abstraction.Messaging.Models.RichContent; global using BotSharp.Abstraction.Options; -global using BotSharp.Abstraction.Http.Settings; -global using BotSharp.Abstraction.Messaging.Enums; \ No newline at end of file +global using BotSharp.Abstraction.Messaging.Enums; +global using BotSharp.Plugin.HttpHandler.Hooks; +global using BotSharp.Plugin.HttpHandler.Settings; +global using BotSharp.Plugin.HttpHandler.LlmContexts; +global using BotSharp.Plugin.HttpHandler.Enums; \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs index 4d9b577d3..23084ead9 100644 --- a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs +++ b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Chat/ChatCompletionProvider.cs @@ -257,40 +257,34 @@ public async Task GetChatCompletionsStreamingAsync(Agent agent, List { textPart }; - if (allowMultiModal) + if (allowMultiModal && !message.Files.IsNullOrEmpty()) { - if (!message.Files.IsNullOrEmpty()) + foreach (var file in message.Files) { - foreach (var file in message.Files) + if (!string.IsNullOrEmpty(file.FileUrl)) + { + var uri = new Uri(file.FileUrl); + var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(uri, ImageChatMessageContentPartDetail.Low); + contentParts.Add(contentPart); + } + else if (!string.IsNullOrEmpty(file.FileData)) + { + var (contentType, bytes) = fileService.GetFileInfoFromData(file.FileData); + var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(BinaryData.FromBytes(bytes), contentType, ImageChatMessageContentPartDetail.Low); + contentParts.Add(contentPart); + } + else if (!string.IsNullOrEmpty(file.FileStorageUrl)) { - if (!string.IsNullOrEmpty(file.FileUrl)) - { - var uri = new Uri(file.FileUrl); - var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(uri, ImageChatMessageContentPartDetail.Low); - chat = new UserChatMessage(textPart, contentPart) { ParticipantName = message.FunctionName }; - } - else if (!string.IsNullOrEmpty(file.FileData)) - { - var (contentType, bytes) = fileService.GetFileInfoFromData(file.FileData); - var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(BinaryData.FromBytes(bytes), contentType, ImageChatMessageContentPartDetail.Low); - chat = new UserChatMessage(textPart, contentPart) { ParticipantName = message.FunctionName }; - } - else if (!string.IsNullOrEmpty(file.FileStorageUrl)) - { - var contentType = fileService.GetFileContentType(file.FileStorageUrl); - using var stream = File.OpenRead(file.FileStorageUrl); - var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(BinaryData.FromStream(stream), contentType, ImageChatMessageContentPartDetail.Low); - chat = new UserChatMessage(textPart, contentPart) { ParticipantName = message.FunctionName }; - } + var contentType = fileService.GetFileContentType(file.FileStorageUrl); + using var stream = File.OpenRead(file.FileStorageUrl); + var contentPart = ChatMessageContentPart.CreateImageMessageContentPart(BinaryData.FromStream(stream), contentType, ImageChatMessageContentPartDetail.Low); + contentParts.Add(contentPart); } } } - messages.Add(chat); + messages.Add(new UserChatMessage(contentParts) { ParticipantName = message.FunctionName }); } else if (message.Role == AgentRole.Assistant) { diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index 84c023993..efc8dbc86 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -154,7 +154,7 @@ "Driver": "Playwright" }, - "Http": { + "HttpHandler": { "BaseAddress": "", "Origin": "" },