Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

work on character cards #306

Merged
merged 1 commit into from
Jan 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 4 additions & 3 deletions assets/default_character.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
{
"name":"Maid",
"pre_prompt":"A chat between a curious user and an artificial intelligence maid. The maid will act cheerful and bubbly, and will give helpful, detailed, and polite answers to the user's questions.",
"user_alias":"USER:",
"response_alias":"ASSISTANT:",
"description": "The maid is a chatbot that acts as a personal assistant and companion to the user.",
"personality": "The maid will act cheerful and bubbly, and will give helpful, detailed, and polite answers to the user's questions.",
"scenario": "A chat between a curious user and an artificial intelligence maid.",
"system_prompt": "The maid is not aware that it is an Artificial Intelligence, and believes that it is a human.",
"examples":[
{
"role": "user",
Expand Down
28 changes: 16 additions & 12 deletions lib/classes/generation_options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ class GenerationOptions {
late String? _apiKey;
late String? _remoteModel;
late String? _path;
late String _prePrompt;
late String _userAlias;
late String _responseAlias;
late String _description;
late String _personality;
late String _scenario;
late String _system;
late int _nKeep;
late int _seed;
late int _nPredict;
Expand Down Expand Up @@ -45,9 +46,10 @@ class GenerationOptions {
String? get apiKey => _apiKey;
String? get remoteModel => _remoteModel;
String? get path => _path;
String get prePrompt => _prePrompt;
String get userAlias => _userAlias;
String get responseAlias => _responseAlias;
String get description => _description;
String get personality => _personality;
String get scenario => _scenario;
String get system => _system;
int get nKeep => _nKeep;
int get seed => _seed;
int get nPredict => _nPredict;
Expand Down Expand Up @@ -78,9 +80,10 @@ class GenerationOptions {
map["api_key"] = _apiKey;
map["remote_model"] = _remoteModel;
map["path"] = _path;
map["pre_prompt"] = _prePrompt;
map["user_alias"] = _userAlias;
map["response_alias"] = _responseAlias;
map["description"] = _description;
map["personality"] = _personality;
map["scenario"] = _scenario;
map["system"] = _system;
map["n_keep"] = _nKeep;
map["seed"] = _seed;
map["n_predict"] = _nPredict;
Expand Down Expand Up @@ -126,9 +129,10 @@ class GenerationOptions {
_apiKey = model.parameters["api_key"];
_remoteModel = model.parameters["remote_model"];
_path = model.parameters["path"];
_prePrompt = character.prePrompt;
_userAlias = character.userAlias;
_responseAlias = character.responseAlias;
_description = character.description;
_personality = character.personality;
_scenario = character.scenario;
_system = character.system;
_nKeep = model.parameters["n_keep"];
_seed = model.parameters["random_seed"] ? Random().nextInt(1000000) : model.parameters["seed"];
_nPredict = model.parameters["n_predict"];
Expand Down
49 changes: 31 additions & 18 deletions lib/pages/character_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ class _CharacterPageState extends State<CharacterPage> {
late Character cachedCharacter;

late TextEditingController _nameController;
late TextEditingController _userAliasController;
late TextEditingController _responseAliasController;
late TextEditingController _prePromptController;
late TextEditingController _descriptionController;
late TextEditingController _personalityController;
late TextEditingController _scenarioController;
late TextEditingController _systemController;
late List<TextEditingController> _exampleControllers;

@override
Expand All @@ -38,9 +39,10 @@ class _CharacterPageState extends State<CharacterPage> {

final character = context.read<Character>();
_nameController = TextEditingController(text: character.name);
_userAliasController = TextEditingController(text: character.userAlias);
_responseAliasController = TextEditingController(text: character.responseAlias);
_prePromptController = TextEditingController(text: character.prePrompt);
_descriptionController = TextEditingController(text: character.description);
_personalityController = TextEditingController(text: character.personality);
_scenarioController = TextEditingController(text: character.scenario);
_systemController = TextEditingController(text: character.system);

_exampleControllers = List.generate(
character.examples.length,
Expand Down Expand Up @@ -246,27 +248,38 @@ class _CharacterPageState extends State<CharacterPage> {
),
),
MaidTextField(
headingText: 'User alias',
labelText: 'Alias',
controller: _userAliasController,
headingText: 'Description',
labelText: 'Description',
controller: _descriptionController,
onChanged: (value) {
character.setUserAlias(value);
character.setDescription(value);
},
multiline: true,
),
MaidTextField(
headingText: 'Response alias',
labelText: 'Alias',
controller: _responseAliasController,
headingText: 'Personality',
labelText: 'Personality',
controller: _personalityController,
onChanged: (value) {
character.setResponseAlias(value);
character.setPersonality(value);
},
multiline: true,
),
MaidTextField(
headingText: 'Scenario',
labelText: 'Scenario',
controller: _scenarioController,
onChanged: (value) {
character.setScenario(value);
},
multiline: true,
),
MaidTextField(
headingText: 'PrePrompt',
labelText: 'PrePrompt',
controller: _prePromptController,
headingText: 'System Prompt',
labelText: 'System Prompt',
controller: _systemController,
onChanged: (value) {
character.setPrePrompt(value);
character.setSystem(value);
},
multiline: true,
),
Expand Down
63 changes: 38 additions & 25 deletions lib/providers/character.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@ import 'package:shared_preferences/shared_preferences.dart';
class Character extends ChangeNotifier {
File _profile = File("/assets/default_profile.png");
String _name = "Maid";
String _prePrompt = "";
String _userAlias = "";
String _responseAlias = "";
String _description = "";
String _personality = "";
String _scenario = "";
String _system = "";

bool _useExamples = true;
List<Map<String,dynamic>> _examples = [];
Expand Down Expand Up @@ -68,9 +69,10 @@ class Character extends ChangeNotifier {
resetAll();
}

_prePrompt = inputJson["pre_prompt"] ?? "";
_userAlias = inputJson["user_alias"] ?? "";
_responseAlias = inputJson["response_alias"] ?? "";
_description = inputJson["description"] ?? "";
_personality = inputJson["personality"] ?? "";
_scenario = inputJson["scenario"] ?? "";
_system = inputJson["system_prompt"] ?? "";

_useExamples = inputJson["use_examples"] ?? true;
if (inputJson["examples"] != null) {
Expand All @@ -86,11 +88,13 @@ _userAlias = inputJson["user_alias"] ?? "";
Map<String, dynamic> jsonCharacter = {};

jsonCharacter["profile"] = _profile.path;

jsonCharacter["name"] = _name;

jsonCharacter["pre_prompt"] = _prePrompt;
jsonCharacter["user_alias"] = _userAlias;
jsonCharacter["response_alias"] = _responseAlias;
jsonCharacter["description"] = _description;
jsonCharacter["personality"] = _personality;
jsonCharacter["scenario"] = _scenario;
jsonCharacter["system_prompt"] = _system;

jsonCharacter["use_examples"] = _useExamples;
jsonCharacter["examples"] = _examples;

Expand All @@ -102,18 +106,23 @@ jsonCharacter["user_alias"] = _userAlias;
notifyListeners();
}

void setUserAlias(String newAlias) {
_userAlias = newAlias;
void setDescription(String newDescription) {
_description = newDescription;
notifyListeners();
}

void setResponseAlias(String newAlias) {
_responseAlias = newAlias;
void setPersonality(String newPersonality) {
_personality = newPersonality;
notifyListeners();
}

void setPrePrompt(String newPrePrompt) {
_prePrompt = newPrePrompt;
void setScenario(String newScenario) {
_scenario = newScenario;
notifyListeners();
}

void setSystem(String newSystem) {
_system = newSystem;
notifyListeners();
}

Expand Down Expand Up @@ -157,11 +166,13 @@ jsonCharacter["user_alias"] = _userAlias;

String get name => _name;

String get userAlias => _userAlias;
String get description => _description;

String get personality => _personality;

String get responseAlias => _responseAlias;
String get scenario => _scenario;

String get prePrompt => _prePrompt;
String get system => _system;

bool get useExamples => _useExamples;

Expand Down Expand Up @@ -231,9 +242,10 @@ jsonCharacter["user_alias"] = _userAlias;

image.textData = {
"name": _name,
"pre_prompt": _prePrompt,
"user_alias": _userAlias,
"response_alias": _responseAlias,
"description": _description,
"personality": _personality,
"scenario": _scenario,
"system_prompt": _system,
"examples": json.encode(_examples),
};

Expand All @@ -260,9 +272,10 @@ jsonCharacter["user_alias"] = _userAlias;

if (image != null && image.textData != null) {
_name = image.textData!["name"] ?? "";
_prePrompt = image.textData!["pre_prompt"] ?? "";
_userAlias = image.textData!["user_alias"] ?? "";
_responseAlias = image.textData!["response_alias"] ?? "";
_description = image.textData!["description"] ?? "";
_personality = image.textData!["personality"] ?? "";
_scenario = image.textData!["scenario"] ?? "";
_system = image.textData!["system_prompt"] ?? "";
_examples = List<Map<String,dynamic>>.from(json.decode(image.textData!["examples"] ?? "[]"));
}

Expand Down
33 changes: 33 additions & 0 deletions lib/static/local_generation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,39 @@ class LocalGeneration {
contextParams
);

List<Map<String, dynamic>> messages = [
{
'role': 'system',
'content': '''
${options.description}\n\n
${options.personality}\n\n
${options.scenario}\n\n
${options.system}\n\n
'''
}
];

for (var message in options.messages) {
switch (message['role']) {
case "user":
messages.add(message);
break;
case "assistant":
messages.add(message);
break;
case "system": // Under normal circumstances, this should never be called
messages.add(message);
break;
default:
break;
}

messages.add({
'role': 'system',
'content': options.system
});
}

llamaProcessor!.messages = options.messages;

llamaProcessor!.stream.listen((data) {
Expand Down
13 changes: 11 additions & 2 deletions lib/static/remote_generation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,14 @@ class RemoteGeneration {

List<ChatMessage> chatMessages = [];

chatMessages.add(ChatMessage.system(options.prePrompt));
final prePrompt = '''
${options.description}\n\n
${options.personality}\n\n
${options.scenario}\n\n
${options.system}\n\n
''';

chatMessages.add(ChatMessage.system(prePrompt));

for (var message in options.messages) {
switch (message['role']) {
Expand All @@ -124,12 +131,14 @@ class RemoteGeneration {
case "assistant":
chatMessages.add(ChatMessage.ai(message['content']));
break;
case "system":
case "system": // Under normal circumstances, this should never be called
chatMessages.add(ChatMessage.system(message['content']));
break;
default:
break;
}

chatMessages.add(ChatMessage.system(options.system));
}

chatMessages.add(ChatMessage.humanText(input));
Expand Down