Skip to content

Commit

Permalink
Merge pull request #306 from danemadsen/main
Browse files Browse the repository at this point in the history
work on character cards
  • Loading branch information
danemadsen committed Jan 26, 2024
2 parents 3ad72fe + 1853143 commit fa129c1
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 60 deletions.
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

0 comments on commit fa129c1

Please sign in to comment.