diff --git a/src/Extensions/Chat.cs b/src/Extensions/Chat.cs
index 4cc595a..e5421ac 100644
--- a/src/Extensions/Chat.cs
+++ b/src/Extensions/Chat.cs
@@ -41,6 +41,15 @@ public void Add(string role, string message)
_ => new ChatRole(role)
}, message));
+ /// Creates a user message.
+ public static ChatMessage User(string message) => new(ChatRole.User, message);
+
+ /// Creates an assistant message.
+ public static ChatMessage Assistant(string message) => new(ChatRole.Assistant, message);
+
+ /// Creates a system message.
+ public static ChatMessage System(string message) => new(ChatRole.System, message);
+
IEnumerator IEnumerable.GetEnumerator() => messages.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => messages.GetEnumerator();
diff --git a/src/Tests/ChatExtensionsTests.cs b/src/Tests/ChatExtensionsTests.cs
new file mode 100644
index 0000000..80b88ac
--- /dev/null
+++ b/src/Tests/ChatExtensionsTests.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Devlooped.Extensions.AI;
+using Microsoft.Extensions.AI;
+using static Devlooped.Extensions.AI.Chat;
+
+namespace Devlooped;
+
+public class ChatExtensionsTests
+{
+ [Fact]
+ public void FactoryMethods()
+ {
+ var message = User("hello");
+
+ Assert.Equal(ChatRole.User, message.Role);
+ Assert.Equal("hello", message.Text);
+
+ message = Assistant("hello");
+
+ Assert.Equal(ChatRole.Assistant, message.Role);
+ Assert.Equal("hello", message.Text);
+
+ // Can't use System without qualifying since it's also a namespace.
+ message = Chat.System("hello");
+ Assert.Equal(ChatRole.System, message.Role);
+ Assert.Equal("hello", message.Text);
+ }
+}