diff --git a/src/AI.Tests/AI.Tests.csproj b/src/AI.Tests/AI.Tests.csproj index 198de5d..5ac8bed 100644 --- a/src/AI.Tests/AI.Tests.csproj +++ b/src/AI.Tests/AI.Tests.csproj @@ -1,7 +1,7 @@  - net8.0 + net8.0;net10.0 OPENAI001;$(NoWarn) diff --git a/src/AI/Chat.cs b/src/AI/Chat.cs new file mode 100644 index 0000000..4cc595a --- /dev/null +++ b/src/AI/Chat.cs @@ -0,0 +1,47 @@ +using System.Collections; +using Microsoft.Extensions.AI; + +namespace Devlooped.Extensions.AI; + +/// +/// Collection of for more convenient usage +/// in fluent construction of chat messages. +/// +public class Chat : IEnumerable +{ + readonly List messages = []; + + /// + /// Adds a message to the list of chat messages. + /// For use with collection initializer syntax. + /// + public void Add(ChatMessage message) => messages.Add(message); + + /// + /// Adds a message to the list of chat messages. + /// + /// The message role + /// The message text + /// + /// Example usage: + /// + /// var messages = new Chat() + /// { + /// { "system", "You are a highly intelligent AI assistant." }, + /// { "user", "What is 101*3?" }, + /// }; + /// + /// + public void Add(string role, string message) + => messages.Add(new ChatMessage(role.ToLowerInvariant() switch + { + "system" => ChatRole.System, + "assistant" => ChatRole.Assistant, + "user" => ChatRole.User, + _ => new ChatRole(role) + }, message)); + + IEnumerator IEnumerable.GetEnumerator() => messages.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => messages.GetEnumerator(); +} \ No newline at end of file diff --git a/src/AI/ChatExtensions.cs b/src/AI/ChatExtensions.cs new file mode 100644 index 0000000..6e0d14a --- /dev/null +++ b/src/AI/ChatExtensions.cs @@ -0,0 +1,23 @@ +using System.ComponentModel; +using Microsoft.Extensions.AI; + +namespace Devlooped.Extensions.AI; + +/// +/// Provides usability overloads for the interface. +/// +[EditorBrowsable(EditorBrowsableState.Never)] +public static class ChatExtensions +{ + extension(IChatClient client) + { + /// + /// Allows passing a instance to the chat client + /// + /// The chat messages in a single object. + /// The optional chat options. + /// Optional cancellation token. + public Task GetResponseAsync(Chat chat, ChatOptions? options = null, CancellationToken cancellation = default) + => client.GetResponseAsync((IEnumerable)chat, options, cancellation); + } +} diff --git a/src/AI/Devlooped.Extensions.AI.props b/src/AI/Devlooped.Extensions.AI.props index 892ff6f..f5c82f0 100644 --- a/src/AI/Devlooped.Extensions.AI.props +++ b/src/AI/Devlooped.Extensions.AI.props @@ -1,34 +1,15 @@  - true enable true - - - - - - - - - - - - - - - - - - - - + + \ No newline at end of file