diff --git a/assets/default_character.json b/assets/default_character.json index db6b6faa..c242ee3b 100644 --- a/assets/default_character.json +++ b/assets/default_character.json @@ -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", diff --git a/lib/classes/generation_options.dart b/lib/classes/generation_options.dart index c115fe4d..fc5d7160 100644 --- a/lib/classes/generation_options.dart +++ b/lib/classes/generation_options.dart @@ -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; @@ -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; @@ -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; @@ -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"]; diff --git a/lib/pages/character_page.dart b/lib/pages/character_page.dart index 3a6f81a5..f1d94a3d 100644 --- a/lib/pages/character_page.dart +++ b/lib/pages/character_page.dart @@ -22,9 +22,10 @@ class _CharacterPageState extends State { 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 _exampleControllers; @override @@ -38,9 +39,10 @@ class _CharacterPageState extends State { final character = context.read(); _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, @@ -246,27 +248,38 @@ class _CharacterPageState extends State { ), ), 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, ), diff --git a/lib/providers/character.dart b/lib/providers/character.dart index 51fc3d6b..16c2a6a2 100644 --- a/lib/providers/character.dart +++ b/lib/providers/character.dart @@ -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> _examples = []; @@ -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) { @@ -86,11 +88,13 @@ _userAlias = inputJson["user_alias"] ?? ""; Map 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; @@ -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(); } @@ -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; @@ -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), }; @@ -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>.from(json.decode(image.textData!["examples"] ?? "[]")); } diff --git a/lib/static/local_generation.dart b/lib/static/local_generation.dart index 02d932ab..94fcf7da 100644 --- a/lib/static/local_generation.dart +++ b/lib/static/local_generation.dart @@ -33,6 +33,39 @@ class LocalGeneration { contextParams ); + List> 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) { diff --git a/lib/static/remote_generation.dart b/lib/static/remote_generation.dart index da9776d3..78fb8291 100644 --- a/lib/static/remote_generation.dart +++ b/lib/static/remote_generation.dart @@ -114,7 +114,14 @@ class RemoteGeneration { List 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']) { @@ -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));