From 6b23b7433d54632f981ecbc1076ed2b1312b7f52 Mon Sep 17 00:00:00 2001 From: danemadsen Date: Wed, 21 Feb 2024 21:46:56 +1000 Subject: [PATCH] greetings character card --- assets/default_character.json | 9 +++-- lib/pages/character_page.dart | 57 +++++++++++++++++++++++-------- lib/pages/home_page.dart | 5 ++- lib/providers/character.dart | 64 +++++++++++++++++++++++++++++------ 4 files changed, 105 insertions(+), 30 deletions(-) diff --git a/assets/default_character.json b/assets/default_character.json index 0f89bf71..1527d836 100644 --- a/assets/default_character.json +++ b/assets/default_character.json @@ -3,8 +3,10 @@ "description": "The {{char}} is a chatbot that acts as a personal assistant and companion to the user.", "personality": "The {{char}} 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 {{char}}.", - "greeting": "Hello, I am the {{char}}. How can I help you today?", - "system_prompt": "The {{char}} is not aware that it is an Artificial Intelligence, and believes that it is a human.", + "greetings": [ + "Hello, I am the {{char}}. How can I help you today?", + "Hello Monsieur, what would you like to talk about today?" + ], "examples":[ { "role": "user", @@ -14,5 +16,6 @@ "role": "assistant", "content": "Hello Monsieur, I am doing wonderful today. How are you?" } - ] + ], + "system_prompt": "The {{char}} is not aware that it is an Artificial Intelligence, and believes that it is a human." } \ No newline at end of file diff --git a/lib/pages/character_page.dart b/lib/pages/character_page.dart index efe2e99a..635deb5a 100644 --- a/lib/pages/character_page.dart +++ b/lib/pages/character_page.dart @@ -25,8 +25,8 @@ class _CharacterPageState extends State { late TextEditingController _descriptionController; late TextEditingController _personalityController; late TextEditingController _scenarioController; - late TextEditingController _greetingController; late TextEditingController _systemController; + late List _greetingControllers; late List _exampleControllers; @override @@ -58,9 +58,13 @@ class _CharacterPageState extends State { _descriptionController = TextEditingController(text: character.description); _personalityController = TextEditingController(text: character.personality); _scenarioController = TextEditingController(text: character.scenario); - _greetingController = TextEditingController(text: character.greeting); _systemController = TextEditingController(text: character.system); + _greetingControllers = List.generate( + character.greetings.length, + (index) => TextEditingController(text: character.greetings[index]), + ); + _exampleControllers = List.generate( character.examples.length, (index) => @@ -330,19 +334,6 @@ class _CharacterPageState extends State { }, multiline: true, ), - ToggleableTextFieldListTile( - headingText: 'Greeting', - labelText: 'Greeting', - controller: _greetingController, - onChanged: (value) { - character.setGreeting(value); - }, - multiline: true, - onSwitchChanged: (value) { - character.setUseGreeting(value); - }, - initialSwitchState: character.useGreeting, - ), TextFieldListTile( headingText: 'System Prompt', labelText: 'System Prompt', @@ -357,6 +348,42 @@ class _CharacterPageState extends State { endIndent: 10, color: Theme.of(context).colorScheme.primary, ), + SwitchListTile( + title: const Text('Use Greeting'), + value: character.useGreeting, + onChanged: (value) { + character.setUseGreeting(value); + }, + ), + if (character.useGreeting) ...[ + DoubleButtonRow( + leftText: "Add Greeting", + leftOnPressed: () { + character.newGreeting(); + }, + rightText: "Remove Greeting", + rightOnPressed: () { + character.removeLastGreeting(); + }, + ), + const SizedBox(height: 10.0), + if (character.greetings.isNotEmpty) ...[ + for (int i = 0; i < character.greetings.length; i++) + TextFieldListTile( + headingText: 'Greeting $i', + labelText: 'Greeting $i', + controller: _greetingControllers[i], + onChanged: (value) { + character.updateGreeting(i, value); + }, + ), + ], + ], + Divider( + indent: 10, + endIndent: 10, + color: Theme.of(context).colorScheme.primary, + ), SwitchListTile( title: const Text('Use Examples'), value: character.useExamples, diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index ac60efdd..83d6afe7 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:flutter/material.dart'; import 'package:maid/pages/about_page.dart'; import 'package:maid/pages/character_page.dart'; @@ -223,7 +225,8 @@ class HomePageState extends State { if (history.isEmpty && character.useGreeting) { final newKey = UniqueKey(); - session.add(newKey, message: character.greeting, userGenerated: false, notify: false); + final index = Random().nextInt(character.greetings.length); + session.add(newKey, message: character.greetings[index], userGenerated: false, notify: false); history = {newKey: false}; } diff --git a/lib/providers/character.dart b/lib/providers/character.dart index cee0044b..f0b00022 100644 --- a/lib/providers/character.dart +++ b/lib/providers/character.dart @@ -18,7 +18,7 @@ class Character extends ChangeNotifier { String _scenario = ""; bool _useGreeting = false; - String _greeting = ""; + List _greetings = []; String _system = ""; bool _useExamples = true; @@ -77,8 +77,22 @@ class Character extends ChangeNotifier { _description = inputJson["description"] ?? ""; _personality = inputJson["personality"] ?? ""; _scenario = inputJson["scenario"] ?? ""; + _useGreeting = inputJson["use_greeting"] ?? false; - _greeting = inputJson["greeting"] ?? inputJson["first_mes"] ?? ""; + + if (inputJson["greetings"] != null) { + _greetings = List.from(inputJson["greetings"]); + } else { + if (inputJson["first_mes"] != null) { + _greetings = [inputJson["first_mes"]]; + } + + if (inputJson["alternate_greetings"] != null) { + _greetings.addAll(inputJson["alternate_greetings"]); + } + } + + _system = inputJson["system_prompt"] ?? ""; _useExamples = inputJson["use_examples"] ?? true; @@ -104,8 +118,9 @@ class Character extends ChangeNotifier { jsonCharacter["personality"] = _personality; jsonCharacter["scenario"] = _scenario; jsonCharacter["use_greeting"] = _useGreeting; - jsonCharacter["greeting"] = _greeting; - jsonCharacter["first_mes"] = _greeting; + jsonCharacter["greetings"] = _greetings; + jsonCharacter["first_mes"] = _greetings.firstOrNull ?? ""; + jsonCharacter["alternate_greetings"] = _greetings.sublist(1); jsonCharacter["system_prompt"] = _system; jsonCharacter["use_examples"] = _useExamples; @@ -140,8 +155,23 @@ class Character extends ChangeNotifier { notifyListeners(); } - void setGreeting(String newGreeting) { - _greeting = newGreeting; + void newGreeting() { + _greetings.add(""); + notifyListeners(); + } + + void updateGreeting(int index, String newGreeting) { + _greetings[index] = newGreeting; + notifyListeners(); + } + + void removeGreeting(int index) { + _greetings.removeAt(index); + notifyListeners(); + } + + void removeLastGreeting() { + _greetings.removeLast(); notifyListeners(); } @@ -196,7 +226,7 @@ class Character extends ChangeNotifier { bool get useGreeting => _useGreeting; - String get greeting => _greeting; + List get greetings => _greetings; String get system => _system; @@ -270,8 +300,9 @@ class Character extends ChangeNotifier { "description": _description, "personality": _personality, "scenario": _scenario, - "greeting": _greeting, - "first_mes": _greeting, + "greetings": json.encode(_greetings), + "first_mes": _greetings.firstOrNull ?? "", + "alternate_greetings": json.encode(_greetings.sublist(1)), "system_prompt": _system, "examples": json.encode(_examples), "mes_example": examplesToString(), @@ -303,8 +334,19 @@ class Character extends ChangeNotifier { _description = image.textData!["description"] ?? ""; _personality = image.textData!["personality"] ?? ""; _scenario = image.textData!["scenario"] ?? ""; - _greeting = - image.textData!["greeting"] ?? image.textData!["first_mes"] ?? ""; + + if (image.textData!["greetings"] != null) { + _greetings = List.from(json.decode(image.textData!["greetings"] ?? "[]")); + } else { + if (image.textData!["first_mes"] != null) { + _greetings = [image.textData!["first_mes"] ?? ""]; + } + + if (image.textData!["alternate_greetings"] != null) { + _greetings.addAll(List.from(json.decode(image.textData!["alternate_greetings"] ?? "[]"))); + } + } + _system = image.textData!["system_prompt"] ?? ""; if (image.textData!["examples"] != null) {