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 = 0 FORMALITY_DEFAULT = "Casual" TEMPERATURE_DEFAULT = 0.5 EMOTION_DEFAULT = "N/A" TRANSLATE_TO_DEFAULT = "Don't translate" LITERARY_STYLE_DEFAULT = "Prose" PROMPT_TEMPLATE = PromptTemplate( input_variables=["original_words", "num_words", "formality", "emotions", "translate_to", "literary_style"], template="Express {num_words}in a {formality} manner, " "{emotions}{translate_to}{literary_style}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): 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 = "" if literary_style != LITERARY_STYLE_DEFAULT: if literary_style == "Poetry": literary_style_str = "as a poem, " elif 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, " 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 ) 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}).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) 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.5 Express-inator

""") 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: The quick brown fox jumped over the lazy dog.") submit = gr.Button(value="Express", variant="secondary").style(full_width=False) with gr.Row(): with gr.Column(): 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]) 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, "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]) literary_style_radio = gr.Radio(label="Literary style:", choices=[ LITERARY_STYLE_DEFAULT, "Poetry", "Haiku", "Limerick", "Joke", "Knock-knock"], value=LITERARY_STYLE_DEFAULT) literary_style_radio.change(update_foo, inputs=[literary_style_radio, literary_style_state], outputs=[literary_style_state]) gr.Examples( examples=[ "The quick brown fox jumped over the lazy dog", "I want some ice cream", "Platypuses are weird", ], inputs=request ) 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("""
This app by @JavaFXpert leverages GPT-3.5 for text completion to facilitate expressing yourself. The author is not responsible for the content of the generated text.
""") 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], 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], 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()