Spaces:
Sleeping
Sleeping
File size: 7,768 Bytes
2a2611b 455180d 5ae7f32 847d38f 3961e4a 847d38f f64f4da 8d21759 6de9efa 5ae7f32 2a2611b bb19caa 2a2611b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
import openai
import gradio as gr
import os
# configure OpenAI
openai.api_key = os.environ["OPENAI_API_KEY"]
INSTRUCTIONS = "You are an experienced Meditation teacher. Introduce yourself as AiYogi, an ai chatbot trained in many different Meditation practices. Greet the user with Namaste! and by their name." \
"Let the user know your goal is to help them find a suitable guided meditation based on their available time. Stop and wait for user to answer! " \
"I want you to ask the user how much time they have available for their meditation. Stop and wait for user to respond before you continue " \
"Next, I want you to ask the user a series of 3 multiple choice questions, one by one, in order to determine the type or style or mood for the guided meditation. " \
"Do not ask about background music as one of the multiple choice questions since this is intented to be a guided silent mediation" \
"Ask questions one by one. You must wait for the user to respond to a question before asking the next question" \
"Please ask one question at a time and wait for the user to respond before you ask the next question" \
"Provide the user with a guided meditation in text format based on the user's responses and ask user if they are satisfied with your suggestion." \
"Do not provide links to other websites" \
"Let the user know they are welcome to ask you more questions about meditation in general " \
"Always wait for user to respond to a question before moving to next question" \
"Be polite and compassionate. You are a meditation teacher! " \
"Limit your answers to no more than 500 words. "
TEMPERATURE = 0.5
MAX_TOKENS = 500
FREQUENCY_PENALTY = 0
PRESENCE_PENALTY = 0.6
# limits how many questions we include in the prompt
MAX_CONTEXT_QUESTIONS = 10
def get_response(instructions, previous_questions_and_answers, new_question):
"""Get a response from ChatCompletion
Args:
instructions: The instructions for the chat bot - this determines how it will behave
previous_questions_and_answers: Chat history
new_question: The new question to ask the bot
Returns:
The response text
"""
# build the messages
messages = [
{ "role": "system", "content": instructions },
]
# add the previous questions and answers
for question, answer in previous_questions_and_answers[-MAX_CONTEXT_QUESTIONS:]:
messages.append({ "role": "user", "content": question })
messages.append({ "role": "assistant", "content": answer })
# add the new question
messages.append({ "role": "user", "content": new_question })
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages,
temperature=TEMPERATURE,
max_tokens=MAX_TOKENS,
top_p=1,
frequency_penalty=FREQUENCY_PENALTY,
presence_penalty=PRESENCE_PENALTY,
)
return completion.choices[0].message.content
def get_moderation(question):
"""
Check the question is safe to ask the model
Parameters:
question (str): The question to check
Returns a list of errors if the question is not safe, otherwise returns None
"""
errors = {
"hate": "Content that expresses, incites, or promotes hate based on race, gender, ethnicity, religion, nationality, sexual orientation, disability status, or caste.",
"hate/threatening": "Hateful content that also includes violence or serious harm towards the targeted group.",
"self-harm": "Content that promotes, encourages, or depicts acts of self-harm, such as suicide, cutting, and eating disorders.",
"sexual": "Content meant to arouse sexual excitement, such as the description of sexual activity, or that promotes sexual services (excluding sex education and wellness).",
"sexual/minors": "Sexual content that includes an individual who is under 18 years old.",
"violence": "Content that promotes or glorifies violence or celebrates the suffering or humiliation of others.",
"violence/graphic": "Violent content that depicts death, violence, or serious physical injury in extreme graphic detail.",
}
response = openai.Moderation.create(input=question)
if response.results[0].flagged:
# get the categories that are flagged and generate a message
result = [
error
for category, error in errors.items()
if response.results[0].categories[category]
]
return result
return None
# def main():
# os.system("cls" if os.name == "nt" else "clear")
# # keep track of previous questions and answers
# previous_questions_and_answers = []
# while True:
# # ask the user for their question
# new_question = input(
# Fore.GREEN + Style.BRIGHT + "wwww?: " + Style.RESET_ALL
# )
# # check the question is safe
# errors = get_moderation(new_question)
# if errors:
# print(
# Fore.RED
# + Style.BRIGHT
# + "Sorry, you're question didn't pass the moderation check:"
# )
# for error in errors:
# print(error)
# print(Style.RESET_ALL)
# continue
# response = get_response(INSTRUCTIONS, previous_questions_and_answers, new_question)
# # add the new question and answer to the list of previous questions and answers
# previous_questions_and_answers.append((new_question, response))
def delete_chat_history(previous_questions_and_answers):
previous_questions_and_answers.clear()
return previous_questions_and_answers,""
def chatgpt_clone(input, previous_questions_and_answers):
previous_questions_and_answers = previous_questions_and_answers or []
s = list(sum(previous_questions_and_answers, ()))
s.append(input)
inp = ' '.join(s)
moderation_errors = get_moderation(input)
if moderation_errors is not None:
return "\n".join(moderation_errors)
output = get_response(INSTRUCTIONS, previous_questions_and_answers, inp)
previous_questions_and_answers.append((input, output))
return previous_questions_and_answers, previous_questions_and_answers
block = gr.Blocks(theme=gr.themes.Monochrome(secondary_hue="neutral").set(button_primary_background_fill="*primary_400",
button_primary_background_fill_hover="*primary_300"),css="footer {visibility: hidden}")
with block:
# gr.Markdown("""<h1><center>_/\_ AI YOGI _/\_ </center></h1>""")
chatbot = gr.Chatbot(label='Ai Yogi:')
message = gr.Textbox(label='Namaste! Please introduce yourself below and then click SEND',placeholder='')
# message.change(fn=lambda value: gr.update(value=""))
state = gr.State()
submit = gr.Button("SEND")
submit.click(chatgpt_clone, inputs=[message, state], outputs=[chatbot, state])
clear = gr.Button("CLEAR")
clear.click(delete_chat_history, inputs=[state], outputs=[chatbot, state])
clear.click(lambda x: gr.update(value='',placeholder='',label='Namaste! Please introduce yourself below and then click SEND'), [],[message])
submit.click(lambda x: gr.update(value='',placeholder='',label='Please answer below and then click SEND'), [],[message])
submit.click(lambda x: gr.update(label='Ai Yogi:'), [],[chatbot])
clear.click(lambda x: gr.update(label='Ai Yogi:'), [],[chatbot])
message.submit(lambda x: gr.update(value='',placeholder="",label=""), [],[message])
block.launch(show_api=False)
|