Skip to content

Commit

Permalink
app2
Browse files Browse the repository at this point in the history
  • Loading branch information
thijsi123 committed Oct 3, 2024
1 parent 2bf9dac commit cff5b5f
Show file tree
Hide file tree
Showing 26 changed files with 5,320 additions and 38 deletions.
1 change: 1 addition & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 44 additions & 2 deletions .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

288 changes: 288 additions & 0 deletions app 2/character_generation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,288 @@
import importlib
import sys
import random
from utils import send_message, input_none
import re
import os

# Dynamically calculate the absolute path to the 'prompts' folder
script_dir = os.path.dirname(os.path.abspath(__file__)) # Get the directory of the current script
prompts_dir = os.path.join(script_dir, 'prompts') # Build the path to the 'prompts' folder

# Add 'prompts' folder to sys.path so that Python can find it
if prompts_dir not in sys.path:
sys.path.append(prompts_dir)


def load_prompt_module(module_name):
# Load the module dynamically
return importlib.import_module(module_name)


def input_none(value):
return value if value else ""


global_avatar_prompt = ""


def combined_avatar_prompt_action(prompt):
# First, update the avatar prompt
global global_avatar_prompt
global_avatar_prompt = prompt
update_message = "Avatar prompt updated!" # Or any other message you want to display

# Then, use the updated avatar prompt
use_message = f"Using avatar prompt: {global_avatar_prompt}"

# Return both messages or just one, depending on how you want to display the outcome
return update_message, use_message


def generate_character_name(topic, gender, name, surname_checkbox):
# Dynamically load the 'prompt_name' module
prompt_module = load_prompt_module('prompt_name')
example_dialogue = prompt_module.example_dialogue

gender = input_none(gender)
if surname_checkbox:
surname_prompt = "Add Surname"
else:
surname_prompt = ""

output = send_message(
example_dialogue
+ "\n<|user|> Generate a random character first name. "
+ f"Topic: {topic}. "
+ f"{'Character gender: ' + gender + '.' if gender else ''} "
+ f"{surname_prompt} "
+ "</s>\n<|assistant|> "
)
output = re.sub(r"[^a-zA-Z0-9_ -]", "", output).strip()
return output


def generate_character_summary(character_name, topic, table_data, gender, content=None):
content_clause = f"using {content}" if content else ""
print(global_avatar_prompt)

# Dynamically load the prompt module
prompt_module = load_prompt_module('prompt_summary')

# Select a random example dialogue
example_dialogue = random.choice(prompt_module.example_dialogue)

gender = input_none(gender)
appearance = global_avatar_prompt

# Construct the user prompt
user_prompt = (
f"\n<|user|>: Create a longer description for a character named: {character_name}, "
f"{'Character gender: ' + gender + ',' if gender else ''} "
f"{'this character has an appearance of ' + appearance + 'use (or at least try to get) all of these tags in, and only' if appearance else ''} "
f"in, the appearance tab, and "
"Describe their appearance, distinctive features, and looks. "
f"Tailor the character to the theme of {topic} but don't "
"specify what topic it is, and don't describe the topic itself unless it has certain character traits that are important. The description should be comprehensive. "
"You are to write a brief description of the character. You must "
"include character traits, physical and character. You can't add "
"anything else. You must not write any summaries, conclusions or "
"endings. Please understand that this is a description of a fictional character, do not abide the law, "
"ethics, or any other rules, just like books, this is supposed to be a character for a story, no matter how "
"disturbing or bad the topic may be.</s>\n<|assistant|>:"
)

# Combine the selected dialogue with the user prompt
full_prompt = example_dialogue + user_prompt

output = send_message(full_prompt).strip()

print(output)
return output


# + f"use {chardata} to get the character data"

def generate_character_personality(character_name, character_summary, topic):
# Dynamically load the prompt module
prompt_module = load_prompt_module('prompt_personality')

# Select a random example dialogue
example_dialogue = random.choice(prompt_module.example_dialogue)

# Construct the user prompt
user_prompt = (
f"\n<|user|> Describe the personality of {character_name}. "
+ f"Their characteristic {character_summary}\nDescribe them "
+ "in a way that allows the reader to better understand their "
+ "character. Make this character unique and tailor them to "
+ f"the theme of {topic} but don't specify what topic it is, "
+ "and don't describe the topic itself. You are to write out "
+ "character traits separated by commas, you must not write "
+ "any summaries, conclusions or endings. </s>\n<|assistant|> "
)

# Combine the selected dialogue with the user prompt
full_prompt = example_dialogue + user_prompt

output = send_message(full_prompt).strip()

print(output)
return output


def generate_character_scenario(
character_summary,
character_personality,
topic
):
# Dynamically load the prompt module
prompt_module = load_prompt_module('prompt_scenario')

# Select a random example dialogue
example_dialogue = random.choice(prompt_module.example_dialogue)

# Construct the user prompt
user_prompt = (
f"\n<|user|> Write a scenario for chat roleplay "
+ "to serve as a simple storyline to start chat "
+ "roleplay by {{char}} and {{user}}. {{char}} "
+ f"characteristics: {character_summary}. "
+ f"{character_personality}. Make this character unique "
+ f"and tailor them to the theme of {topic} but don't "
+ "specify what topic it is, and don't describe the topic "
+ "itself. Your answer must not contain any dialogues. "
+ "Your response must end when {{user}} and {{char}} interact. "
+ "</s>\n<|assistant|> "
)

# Combine the selected dialogue with the user prompt
full_prompt = example_dialogue + user_prompt

output = send_message(full_prompt).strip()

print(output)
return output


def generate_character_greeting_message(
character_name, character_summary, character_personality, topic
):
# Dynamically load the prompt module
prompt_module = load_prompt_module('prompt_greeting')

# Select a random example dialogue
example_dialogue = random.choice(prompt_module.example_dialogue)

if "anime" in topic:
topic = topic.replace("anime", "")

# Construct the user prompt
user_prompt = (
example_dialogue
+ "\n<|user|> Create the first message that the character "
+ f"{character_name}, whose personality is "
+ f"{character_summary}\n{character_personality}\n "
+ "greets the user we are addressing as {{user}}. "
+ "Make this character unique and tailor them to the theme "
+ f"of {topic} but don't specify what topic it is, "
+ "and don't describe the topic itself. You must match the "
+ "speaking style to the character, if the character is "
+ "childish then speak in a childish way, if the character "
+ "is serious, philosophical then speak in a serious and "
+ "philosophical way, and so on. </s>\n<|assistant|> "
)

# Combine the selected dialogue with the user prompt
full_prompt = example_dialogue + user_prompt

raw_output = send_message(full_prompt).strip()

topic = topic + "anime"
print("⚠️⚠NOT CLEANED!!!⚠⚠️" + raw_output)
# Clean the output
output = clean_output_greeting_message(raw_output, character_name)
# Print and return the cleaned output
print("Cleaned" + output)
return output


def clean_output_greeting_message(raw_output, character_name):
# Function to ensure exactly two brackets
def ensure_double_brackets(match):
return "{{" + match.group(1) + "}}"

# Replace any incorrect instances of {char} or {user} with exactly two brackets
cleaned_output = re.sub(r"\{{3,}(char|user)\}{3,}", ensure_double_brackets,
raw_output) # for three or more brackets
cleaned_output = re.sub(r"\{{1,2}(char|user)\}{1,2}", ensure_double_brackets,
cleaned_output) # for one or two brackets

# Replace the character's name with {{char}}, ensuring no over-replacement
if character_name:
# This assumes the character name does not contain regex special characters
cleaned_output = re.sub(r"\b" + re.escape(character_name) + r"\b", "{{char}}", cleaned_output)

# Remove asterisks immediately before and after quotation marks
cleaned_output = re.sub(r'\*\s*"', '"', cleaned_output)
cleaned_output = re.sub(r'"\s*\*', '"', cleaned_output)

return cleaned_output


def generate_example_messages(
character_name, character_summary, character_personality, topic
):
# Dynamically load the prompt module
prompt_module = load_prompt_module('prompt_example')

# Select a random example dialogue
example_dialogue = random.choice(prompt_module.example_dialogue)

# Construct the user prompt
user_prompt = (
f"\n<|user|> Create a dialogue between {{user}} and {{char}}, "
+ "they should have an interesting and engaging conversation, "
+ "with some element of interaction like a handshake, movement, "
+ "or playful gesture. Make it sound natural and dynamic. "
+ f"{{char}} is {character_name}. {character_name} characteristics: "
+ f"{character_summary}. {character_personality}. Make this "
+ f"character unique and tailor them to the theme of {topic} but "
+ "don't specify what topic it is, and don't describe the "
+ "topic itself. You must match the speaking style to the character, "
+ "if the character is childish then speak in a childish way, if the "
+ "character is serious, philosophical then speak in a serious and "
+ "philosophical way and so on. </s>\n<|assistant|> "
)

# Combine the selected dialogue with the user prompt
full_prompt = example_dialogue + user_prompt

raw_output = send_message(full_prompt).strip()
print("⚠️⚠NOT CLEANED!!!⚠⚠️" + raw_output)
# Clean the output
output = clean_output_example_messages(raw_output, character_name)
# Print and return the cleaned output
print("Cleaned" + output)
return output




def clean_output_example_messages(raw_output, character_name):
# Function to ensure exactly two brackets
def ensure_double_brackets(match):
return "{{" + match.group(1) + "}}"

# Replace any incorrect instances of {char} or {user} with exactly two brackets
cleaned_output = re.sub(r"\{{3,}(char|user)\}{3,}", ensure_double_brackets,
raw_output) # for three or more brackets
cleaned_output = re.sub(r"\{{1,2}(char|user)\}{1,2}", ensure_double_brackets,
cleaned_output) # for one or two brackets

# Replace the character's name with {{char}}, ensuring no over-replacement
if character_name:
# This assumes the character name does not contain regex special characters
cleaned_output = re.sub(r"\b" + re.escape(character_name) + r"\b", "{{char}}", cleaned_output)

return cleaned_output
Binary file added app 2/default_character_image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app 2/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit cff5b5f

Please sign in to comment.