Create and use an enum for AIRole in Scribe

This commit is contained in:
Théo Poizat
2026-02-23 15:33:04 +01:00
committed by Dat H. Pham
parent b84b2ce703
commit 71901b2640
4 changed files with 36 additions and 32 deletions
@@ -2,12 +2,16 @@ import 'package:json_annotation/json_annotation.dart';
part 'ai_message.g.dart'; part 'ai_message.g.dart';
enum AIRole {
@JsonValue('user')
user,
@JsonValue('system')
system,
}
@JsonSerializable() @JsonSerializable()
class AIMessage { class AIMessage {
static const String aiUserRole = 'user'; final AIRole role;
static const String aiSystemRole = 'system';
final String role;
final String content; final String content;
const AIMessage({ const AIMessage({
@@ -21,12 +25,12 @@ class AIMessage {
Map<String, dynamic> toJson() => _$AIMessageToJson(this); Map<String, dynamic> toJson() => _$AIMessageToJson(this);
factory AIMessage.ofUser(String content) => AIMessage( factory AIMessage.ofUser(String content) => AIMessage(
role: aiUserRole, role: AIRole.user,
content: content, content: content,
); );
factory AIMessage.ofSystem(String content) => AIMessage( factory AIMessage.ofSystem(String content) => AIMessage(
role: aiSystemRole, role: AIRole.system,
content: content, content: content,
); );
} }
@@ -54,9 +54,9 @@ class Prompt {
List<AIMessage> buildPrompt(String inputText, {String? task}) { List<AIMessage> buildPrompt(String inputText, {String? task}) {
final messages = <AIMessage>[]; final messages = <AIMessage>[];
for (final message in this.messages) { for (final message in this.messages) {
if (message.role == 'system') { if (message.role == AIRole.system) {
messages.add(AIMessage.ofSystem(message.content)); messages.add(AIMessage.ofSystem(message.content));
} else if (message.role == 'user') { } else if (message.role == AIRole.user) {
final userContent = _replacePlaceholders(message.content, inputText, task); final userContent = _replacePlaceholders(message.content, inputText, task);
messages.add(AIMessage.ofUser(userContent)); messages.add(AIMessage.ofUser(userContent));
} }
@@ -85,17 +85,17 @@ void main() {
// Assert // Assert
expect(prompt.name, 'test-prompt'); expect(prompt.name, 'test-prompt');
expect(prompt.messages.length, 2); expect(prompt.messages.length, 2);
expect(prompt.messages.first.role, 'system'); expect(prompt.messages.first.role, AIRole.system);
expect(prompt.messages.first.content, 'System message'); expect(prompt.messages.first.content, 'System message');
expect(prompt.messages.last.role, 'user'); expect(prompt.messages.last.role, AIRole.user);
expect(prompt.messages.last.content, 'User message with {{input}} placeholder'); expect(prompt.messages.last.content, 'User message with {{input}} placeholder');
}); });
test('buildPrompt should replace input placeholder correctly', () { test('buildPrompt should replace input placeholder correctly', () {
// Arrange // Arrange
final messages = [ final messages = [
const AIMessage(role: 'system', content: 'System message'), const AIMessage(role: AIRole.system, content: 'System message'),
const AIMessage(role: 'user', content: 'User message with {{input}} placeholder') const AIMessage(role: AIRole.user, content: 'User message with {{input}} placeholder')
]; ];
final prompt = Prompt(name: 'test-prompt', messages: messages); final prompt = Prompt(name: 'test-prompt', messages: messages);
@@ -104,17 +104,17 @@ void main() {
// Assert // Assert
expect(result.length, 2); expect(result.length, 2);
expect(result.first.role, 'system'); expect(result.first.role, AIRole.system);
expect(result.first.content, 'System message'); expect(result.first.content, 'System message');
expect(result.last.role, 'user'); expect(result.last.role, AIRole.user);
expect(result.last.content, 'User message with test input value placeholder'); expect(result.last.content, 'User message with test input value placeholder');
}); });
test('buildPrompt should replace task placeholder when provided', () { test('buildPrompt should replace task placeholder when provided', () {
// Arrange // Arrange
final messages = [ final messages = [
const AIMessage(role: 'system', content: 'System message'), const AIMessage(role: AIRole.system, content: 'System message'),
const AIMessage(role: 'user', content: 'Task: {{task}}, Input: {{input}}') const AIMessage(role: AIRole.user, content: 'Task: {{task}}, Input: {{input}}')
]; ];
final prompt = Prompt(name: 'test-prompt', messages: messages); final prompt = Prompt(name: 'test-prompt', messages: messages);
@@ -123,17 +123,17 @@ void main() {
// Assert // Assert
expect(result.length, 2); expect(result.length, 2);
expect(result.first.role, 'system'); expect(result.first.role, AIRole.system);
expect(result.first.content, 'System message'); expect(result.first.content, 'System message');
expect(result.last.role, 'user'); expect(result.last.role, AIRole.user);
expect(result.last.content, 'Task: test task value, Input: test input value'); expect(result.last.content, 'Task: test task value, Input: test input value');
}); });
test('buildPrompt should not replace task placeholder when not provided', () { test('buildPrompt should not replace task placeholder when not provided', () {
// Arrange // Arrange
final messages = [ final messages = [
const AIMessage(role: 'system', content: 'System message'), const AIMessage(role: AIRole.system, content: 'System message'),
const AIMessage(role: 'user', content: 'Task: {{task}}, Input: {{input}}') const AIMessage(role: AIRole.user, content: 'Task: {{task}}, Input: {{input}}')
]; ];
final prompt = Prompt(name: 'test-prompt', messages: messages); final prompt = Prompt(name: 'test-prompt', messages: messages);
@@ -142,17 +142,17 @@ void main() {
// Assert // Assert
expect(result.length, 2); expect(result.length, 2);
expect(result.first.role, 'system'); expect(result.first.role, AIRole.system);
expect(result.first.content, 'System message'); expect(result.first.content, 'System message');
expect(result.last.role, 'user'); expect(result.last.role, AIRole.user);
expect(result.last.content, 'Task: {{task}}, Input: test input value'); expect(result.last.content, 'Task: {{task}}, Input: test input value');
}); });
test('buildPrompt should handle messages without placeholders', () { test('buildPrompt should handle messages without placeholders', () {
// Arrange // Arrange
final messages = [ final messages = [
const AIMessage(role: 'system', content: 'System message'), const AIMessage(role: AIRole.system, content: 'System message'),
const AIMessage(role: 'user', content: 'User message without placeholders') const AIMessage(role: AIRole.user, content: 'User message without placeholders')
]; ];
final prompt = Prompt(name: 'test-prompt', messages: messages); final prompt = Prompt(name: 'test-prompt', messages: messages);
@@ -27,8 +27,8 @@ void main() {
// Assert // Assert
expect(messages.length, 2); expect(messages.length, 2);
expect(messages.first.role, 'system'); expect(messages.first.role, AIRole.system);
expect(messages.last.role, 'user'); expect(messages.last.role, AIRole.user);
expect(messages.last.content, contains('Hello, how are you?')); expect(messages.last.content, contains('Hello, how are you?'));
}); });
@@ -41,8 +41,8 @@ void main() {
// Assert // Assert
expect(messages.length, 2); expect(messages.length, 2);
expect(messages.first.role, 'system'); expect(messages.first.role, AIRole.system);
expect(messages.last.role, 'user'); expect(messages.last.role, AIRole.user);
expect(messages.last.content, contains('Hello, how are you?')); expect(messages.last.content, contains('Hello, how are you?'));
expect(messages.last.content, contains('Make it more casual')); expect(messages.last.content, contains('Make it more casual'));
}); });
@@ -56,8 +56,8 @@ void main() {
Prompt( Prompt(
name: 'test-prompt', name: 'test-prompt',
messages: [ messages: [
const AIMessage(role: 'system', content: 'System message'), const AIMessage(role: AIRole.system, content: 'System message'),
const AIMessage(role: 'user', content: 'User message with {{input}}') const AIMessage(role: AIRole.user, content: 'User message with {{input}}')
] ]
) )
] ]
@@ -81,8 +81,8 @@ void main() {
Prompt( Prompt(
name: 'test-prompt', name: 'test-prompt',
messages: [ messages: [
const AIMessage(role: 'system', content: 'System message'), const AIMessage(role: AIRole.system, content: 'System message'),
const AIMessage(role: 'user', content: 'User message') const AIMessage(role: AIRole.user, content: 'User message')
] ]
) )
] ]