import os import openai import gradio as gr from langchain import OpenAI from langchain.prompts import PromptTemplate from langchain.chains import LLMChain import datetime NUM_WORDS_DEFAULT = 80 TEMPERATURE_DEFAULT = 0.5 EMOTION_DEFAULT = "N/A" LITERARY_STYLE_DEFAULT = "Poetry" CHARACTER_DEFAULT = "The Old Lady Who Swallowed A Fly" # FORMALITY_DEFAULT = "Casual" # TRANSLATE_TO_DEFAULT = "Don't translate" # PROMPT_TEMPLATE = PromptTemplate( # input_variables=["original_words", "num_words", "formality", "emotions", "translate_to", "literary_style", "character"], # template="Express {num_words} in a {formality} manner, " # "{emotions}{translate_to}{literary_style}{character} the following: \n{original_words}\n", # ) PROMPT_TEMPLATE = PromptTemplate( input_variables=["num_words", "literary_style", "emotions", "character", "original_words"], template="{num_words}{literary_style}{emotions}{character} express the following: \n{original_words}\n", ) def set_openai_api_key(api_key, openai_api_key, temperature, llm_chain): if api_key: print("temperature: ", temperature) openai_api_key = api_key os.environ["OPENAI_API_KEY"] = api_key llm = OpenAI(model_name='text-davinci-003', temperature=temperature, max_tokens=512) os.environ["OPENAI_API_KEY"] = "" llm_chain = LLMChain(llm=llm, prompt=PROMPT_TEMPLATE, verbose=True) return openai_api_key, llm_chain # def transform_text(desc, openai_api_key, temperature, llm_chain, num_words, formality, # anticipation_level, joy_level, trust_level, # fear_level, surprise_level, sadness_level, disgust_level, anger_level, # translate_to, literary_style, character): def transform_text(desc, openai_api_key, temperature, llm_chain, num_words, anticipation_level, joy_level, trust_level, fear_level, surprise_level, sadness_level, disgust_level, anger_level, literary_style, character): if not openai_api_key or openai_api_key == "": return "
Please paste your OpenAI API key (see https://beta.openai.com)
" num_words_prompt = "" if num_words and int(num_words) != 0: num_words_prompt = "using up to " + str(num_words) + " words, " # Change some arguments to lower case # formality = formality.lower() anticipation_level = anticipation_level.lower() joy_level = joy_level.lower() trust_level = trust_level.lower() fear_level = fear_level.lower() surprise_level = surprise_level.lower() sadness_level = sadness_level.lower() disgust_level = disgust_level.lower() anger_level = anger_level.lower() llm_chain.llm.temperature = temperature # put all emotions into a list emotions = [] if anticipation_level != "n/a": emotions.append(anticipation_level) if joy_level != "n/a": emotions.append(joy_level) if trust_level != "n/a": emotions.append(trust_level) if fear_level != "n/a": emotions.append(fear_level) if surprise_level != "n/a": emotions.append(surprise_level) if sadness_level != "n/a": emotions.append(sadness_level) if disgust_level != "n/a": emotions.append(disgust_level) if anger_level != "n/a": emotions.append(anger_level) emotions_str = "" if len(emotions) > 0: if len(emotions) == 1: emotions_str = "with emotion of " + emotions[0] + ", " else: emotions_str = "with emotions of " + ", ".join(emotions[:-1]) + " and " + emotions[-1] + ", " # translate_to_str = "" # if translate_to != TRANSLATE_TO_DEFAULT: # translate_to_str = "translated to " + translate_to + ", " literary_style_str = "as a poem, " if literary_style != LITERARY_STYLE_DEFAULT: if literary_style == "Haiku": literary_style_str = "as a haiku, " elif literary_style == "Limerick": literary_style_str = "as a limerick, " # elif literary_style == "Joke": # literary_style_str = "as a very funny joke with a setup and punchline, " elif literary_style == "Knock-knock": literary_style_str = "as a very funny knock-knock joke, " character_str = "as if written by The Old Lady Who Swallowed A Fly, " if character != CHARACTER_DEFAULT: if character == "The Old Woman Who Lived In A Shoe": character_str = "as if written by the Old Woman Who Lived In A Shoe, " # elif character == "Mary Had A Little Lamb": # character_str = "as if written by Mary from Mary Had A Little Lamb, " elif character == "Humpty-Dumpty": character_str = "as if written by Humpty Dumpty, " # formatted_prompt = PROMPT_TEMPLATE.format( # original_words=desc, # num_words=num_words_prompt, # formality=formality, # emotions=emotions_str, # translate_to=translate_to_str, # literary_style=literary_style_str, # character=character_str, # ) formatted_prompt = PROMPT_TEMPLATE.format( original_words=desc, num_words=num_words_prompt, emotions=emotions_str, literary_style=literary_style_str, character=character_str, ) # generated_text = llm_chain.run({'original_words': desc, 'num_words': num_words_prompt, 'formality': formality, # 'emotions': emotions_str, 'translate_to': translate_to_str, # 'literary_style': literary_style_str, 'character': character_str}).strip() generated_text = llm_chain.run({'original_words': desc, 'num_words': num_words_prompt, 'emotions': emotions_str, 'literary_style': literary_style_str, 'character': character_str}).strip() # replace all newlines with
in generated_text generated_text = generated_text.replace("\n", "
") prompt_plus_generated = "GPT prompt: " + formatted_prompt + "

" + generated_text + "" print("\n==== date/time: " + str(datetime.datetime.now() - datetime.timedelta(hours=5)) + " ====") print("temperature: ", temperature) print("prompt_plus_generated: " + prompt_plus_generated) return prompt_plus_generated def update_foo(widget, state): if widget: state = widget return state block = gr.Blocks(css=".gradio-container {background-color: lightgray}") with block: openai_api_key_state = gr.State() temperature_state = gr.State(TEMPERATURE_DEFAULT) llm_chain_state = gr.State() num_words_state = gr.State(NUM_WORDS_DEFAULT) # formality_state = gr.State(FORMALITY_DEFAULT) anticipation_level_state = gr.State(EMOTION_DEFAULT) joy_level_state = gr.State(EMOTION_DEFAULT) trust_level_state = gr.State(EMOTION_DEFAULT) fear_level_state = gr.State(EMOTION_DEFAULT) surprise_level_state = gr.State(EMOTION_DEFAULT) sadness_level_state = gr.State(EMOTION_DEFAULT) disgust_level_state = gr.State(EMOTION_DEFAULT) anger_level_state = gr.State(EMOTION_DEFAULT) # translate_to_state = gr.State(TRANSLATE_TO_DEFAULT) literary_style_state = gr.State(LITERARY_STYLE_DEFAULT) character_state = gr.State(CHARACTER_DEFAULT) with gr.Row(): temperature_slider = gr.Slider(label="GPT Temperature", value=TEMPERATURE_DEFAULT, minimum=0.0, maximum=1.0, step=0.1) title = gr.Markdown ("""

GPT-3 Grimm Verses

""") openai_api_key_textbox = gr.Textbox(placeholder="Paste your OpenAI API key", show_label=False, lines=1, type='password') output = gr.Markdown("") with gr.Row(): request = gr.Textbox(label="Express this: ", value="", placeholder="Ex: My armpits are sweating gravy.") submit = gr.Button(value="Express", variant="secondary").style(full_width=False) with gr.Row(): with gr.Column(): gr.Examples( examples=[ "My armpits are sweating gravy", "My skull is filled with solid bone", "Something underneath the house smells horrible", ], inputs=request ) num_words_slider = gr.Slider(label="Max number of words to generate (0 for don't care)", value=NUM_WORDS_DEFAULT, minimum=0, maximum=100, step=10) num_words_slider.change(update_foo, inputs=[num_words_slider, num_words_state], outputs=[num_words_state]) character_radio = gr.Radio(label="As if written by:", choices=["The Old Lady Who Swallowed A Fly", "The Old Woman Who Lived In A Shoe", "Humpty-Dumpty"], value=CHARACTER_DEFAULT) character_radio.change(update_foo, inputs=[character_radio, character_state], outputs=[character_state]) literary_style_radio = gr.Radio(label="Literary style:", choices=[ LITERARY_STYLE_DEFAULT, "Haiku", "Limerick", "Knock-knock"], value=LITERARY_STYLE_DEFAULT) literary_style_radio.change(update_foo, inputs=[literary_style_radio, literary_style_state], outputs=[literary_style_state]) # formality_radio = gr.Radio(label="Formality:", choices=["Casual", "Polite", "Honorific"], # value=FORMALITY_DEFAULT) # formality_radio.change(update_foo, # inputs=[formality_radio, formality_state], # outputs=[formality_state]) # translate_to_radio = gr.Radio(label="Translate to:", choices=[TRANSLATE_TO_DEFAULT, "emojis", "Gen Z slang", "how the stereotypical Karen would say it", "Pirate"], value=TRANSLATE_TO_DEFAULT) # translate_to_radio = gr.Radio(label="Translate to:", choices=[ # TRANSLATE_TO_DEFAULT, "Arabic", "British English", "Chinese (Simplified)", "Chinese (Traditional)", # "Czech", "Danish", "Dutch", "emojis", "English", "Finnish", "French", "Gen Z slang", "German", "Greek", # "Hebrew", "Hindi", "Hungarian", "Indonesian", "Italian", "Japanese", # "how the stereotypical Karen would say it", # "Klingon", "Korean", "Norwegian", "Old English", "Pirate", "Polish", "Portuguese", "Romanian", # "Russian", "Spanish", "Strange Planet expospeak technical talk", "Swedish", "Thai", "Turkish", "Vietnamese", "Yoda"], value=TRANSLATE_TO_DEFAULT) # translate_to_radio.change(update_foo, # inputs=[translate_to_radio, translate_to_state], # outputs=[translate_to_state]) with gr.Column(): with gr.Accordion("Emotions", open=True): anticipation_level_radio = gr.Radio(label="Anticipation level:", choices=[EMOTION_DEFAULT, "Interest", "Anticipation", "Vigilance"], value=EMOTION_DEFAULT) anticipation_level_radio.change(update_foo, inputs=[anticipation_level_radio, anticipation_level_state], outputs=[anticipation_level_state]) joy_level_radio = gr.Radio(label="Joy level:", choices=[EMOTION_DEFAULT, "Serenity", "Joy", "Ecstasy"], value=EMOTION_DEFAULT) joy_level_radio.change(update_foo, inputs=[joy_level_radio, joy_level_state], outputs=[joy_level_state]) trust_level_radio = gr.Radio(label="Trust level:", choices=[EMOTION_DEFAULT, "Acceptance", "Trust", "Admiration"], value=EMOTION_DEFAULT) trust_level_radio.change(update_foo, inputs=[trust_level_radio, trust_level_state], outputs=[trust_level_state]) fear_level_radio = gr.Radio(label="Fear level:", choices=[EMOTION_DEFAULT, "Apprehension", "Fear", "Terror"], value=EMOTION_DEFAULT) fear_level_radio.change(update_foo, inputs=[fear_level_radio, fear_level_state], outputs=[fear_level_state]) surprise_level_radio = gr.Radio(label="Surprise level:", choices=[EMOTION_DEFAULT, "Distraction", "Surprise", "Amazement"], value=EMOTION_DEFAULT) surprise_level_radio.change(update_foo, inputs=[surprise_level_radio, surprise_level_state], outputs=[surprise_level_state]) sadness_level_radio = gr.Radio(label="Sadness level:", choices=[EMOTION_DEFAULT, "Pensiveness", "Sadness", "Grief"], value=EMOTION_DEFAULT) sadness_level_radio.change(update_foo, inputs=[sadness_level_radio, sadness_level_state], outputs=[sadness_level_state]) disgust_level_radio = gr.Radio(label="Disgust level:", choices=[EMOTION_DEFAULT, "Boredom", "Disgust", "Loathing"], value=EMOTION_DEFAULT) disgust_level_radio.change(update_foo, inputs=[disgust_level_radio, disgust_level_state], outputs=[disgust_level_state]) anger_level_radio = gr.Radio(label="Anger level:", choices=[EMOTION_DEFAULT, "Annoyance", "Anger", "Rage"], value=EMOTION_DEFAULT) anger_level_radio.change(update_foo, inputs=[anger_level_radio, anger_level_state], outputs=[anger_level_state]) gr.HTML("""
Based on an app by @JavaFXpert.
""") gr.HTML("
Powered by LangChain 🦜️🔗
") # submit.click(transform_text, # inputs=[ # request, openai_api_key_state, temperature_state, llm_chain_state, num_words_state, # formality_state, # anticipation_level_state, joy_level_state, trust_level_state, fear_level_state, # surprise_level_state, sadness_level_state, disgust_level_state, anger_level_state, # translate_to_state, literary_style_state, character_state], # outputs=[output]) submit.click(transform_text, inputs=[ request, openai_api_key_state, temperature_state, llm_chain_state, num_words_state, anticipation_level_state, joy_level_state, trust_level_state, fear_level_state, surprise_level_state, sadness_level_state, disgust_level_state, anger_level_state, literary_style_state, character_state], outputs=[output]) # request.submit(transform_text, # inputs=[ # request, openai_api_key_state, temperature_state, llm_chain_state, num_words_state, # formality_state, # anticipation_level_state, joy_level_state, trust_level_state, fear_level_state, # surprise_level_state, sadness_level_state, disgust_level_state, anger_level_state, # translate_to_state, literary_style_state, character_state], # outputs=[output]) request.submit(transform_text, inputs=[ request, openai_api_key_state, temperature_state, llm_chain_state, num_words_state, anticipation_level_state, joy_level_state, trust_level_state, fear_level_state, surprise_level_state, sadness_level_state, disgust_level_state, anger_level_state, literary_style_state, character_state], outputs=[output]) openai_api_key_textbox.change(set_openai_api_key, inputs=[openai_api_key_textbox, openai_api_key_state, temperature_state, llm_chain_state], outputs=[openai_api_key_state, llm_chain_state]) temperature_slider.change(update_foo, inputs=[temperature_slider, temperature_state], outputs=[temperature_state]) block.launch()