JavaFXpert/GPT-3.5-Express-inator
40
1import os2import openai3import gradio as gr4from langchain import OpenAI5from langchain.prompts import PromptTemplate6from langchain.chains import LLMChain7import datetime8 9NUM_WORDS_DEFAULT = 010FORMALITY_DEFAULT = "Casual"11TEMPERATURE_DEFAULT = 0.512EMOTION_DEFAULT = "N/A"13TRANSLATE_TO_DEFAULT = "Don't translate"14LITERARY_STYLE_DEFAULT = "Prose"15PROMPT_TEMPLATE = PromptTemplate(16 input_variables=["original_words", "num_words", "formality", "emotions", "translate_to", "literary_style"],17 template="Express {num_words}in a {formality} manner, "18 "{emotions}{translate_to}{literary_style}the following: \n{original_words}\n",19)20 21 22def set_openai_api_key(api_key, openai_api_key, temperature, llm_chain):23 if api_key:24 print("temperature: ", temperature)25 openai_api_key = api_key26 27 os.environ["OPENAI_API_KEY"] = api_key28 llm = OpenAI(model_name='text-davinci-003', temperature=temperature, max_tokens=512)29 os.environ["OPENAI_API_KEY"] = ""30 31 llm_chain = LLMChain(llm=llm, prompt=PROMPT_TEMPLATE, verbose=True)32 return openai_api_key, llm_chain33 34 35def transform_text(desc, openai_api_key, temperature, llm_chain, num_words, formality,36 anticipation_level, joy_level, trust_level,37 fear_level, surprise_level, sadness_level, disgust_level, anger_level,38 translate_to, literary_style):39 if not openai_api_key or openai_api_key == "":40 return "<pre>Please paste your OpenAI API key (see https://beta.openai.com)</pre>"41 42 num_words_prompt = ""43 if num_words and int(num_words) != 0:44 num_words_prompt = "using up to " + str(num_words) + " words, "45 46 # Change some arguments to lower case47 formality = formality.lower()48 anticipation_level = anticipation_level.lower()49 joy_level = joy_level.lower()50 trust_level = trust_level.lower()51 fear_level = fear_level.lower()52 surprise_level = surprise_level.lower()53 sadness_level = sadness_level.lower()54 disgust_level = disgust_level.lower()55 anger_level = anger_level.lower()56 57 llm_chain.llm.temperature = temperature58 59 # put all emotions into a list60 emotions = []61 if anticipation_level != "n/a":62 emotions.append(anticipation_level)63 if joy_level != "n/a":64 emotions.append(joy_level)65 if trust_level != "n/a":66 emotions.append(trust_level)67 if fear_level != "n/a":68 emotions.append(fear_level)69 if surprise_level != "n/a":70 emotions.append(surprise_level)71 if sadness_level != "n/a":72 emotions.append(sadness_level)73 if disgust_level != "n/a":74 emotions.append(disgust_level)75 if anger_level != "n/a":76 emotions.append(anger_level)77 78 emotions_str = ""79 if len(emotions) > 0:80 if len(emotions) == 1:81 emotions_str = "with emotion of " + emotions[0] + ", "82 else:83 emotions_str = "with emotions of " + ", ".join(emotions[:-1]) + " and " + emotions[-1] + ", "84 85 translate_to_str = ""86 if translate_to != TRANSLATE_TO_DEFAULT:87 translate_to_str = "translated to " + translate_to + ", "88 89 literary_style_str = ""90 if literary_style != LITERARY_STYLE_DEFAULT:91 if literary_style == "Poetry":92 literary_style_str = "as a poem, "93 elif literary_style == "Haiku":94 literary_style_str = "as a haiku, "95 elif literary_style == "Limerick":96 literary_style_str = "as a limerick, "97 elif literary_style == "Joke":98 literary_style_str = "as a very funny joke with a setup and punchline, "99 elif literary_style == "Knock-knock":100 literary_style_str = "as a very funny knock-knock joke, "101 102 formatted_prompt = PROMPT_TEMPLATE.format(103 original_words=desc,104 num_words=num_words_prompt,105 formality=formality,106 emotions=emotions_str,107 translate_to=translate_to_str,108 literary_style=literary_style_str109 )110 111 generated_text = llm_chain.run({'original_words': desc, 'num_words': num_words_prompt, 'formality': formality,112 'emotions': emotions_str, 'translate_to': translate_to_str,113 'literary_style': literary_style_str}).strip()114 115 # replace all newlines with <br> in generated_text116 generated_text = generated_text.replace("\n", "<br>")117 118 prompt_plus_generated = "<b>GPT prompt:</b> " + formatted_prompt + "<br/><br/><code>" + generated_text + "</code>"119 120 print("\n==== date/time: " + str(datetime.datetime.now() - datetime.timedelta(hours=5)) + " ====")121 print("temperature: ", temperature)122 print("prompt_plus_generated: " + prompt_plus_generated)123 124 return prompt_plus_generated125 126 127def update_foo(widget, state):128 if widget:129 state = widget130 return state131 132 133block = gr.Blocks(css=".gradio-container {background-color: lightgray}")134 135with block:136 openai_api_key_state = gr.State()137 temperature_state = gr.State(TEMPERATURE_DEFAULT)138 llm_chain_state = gr.State()139 num_words_state = gr.State(NUM_WORDS_DEFAULT)140 formality_state = gr.State(FORMALITY_DEFAULT)141 anticipation_level_state = gr.State(EMOTION_DEFAULT)142 joy_level_state = gr.State(EMOTION_DEFAULT)143 trust_level_state = gr.State(EMOTION_DEFAULT)144 fear_level_state = gr.State(EMOTION_DEFAULT)145 surprise_level_state = gr.State(EMOTION_DEFAULT)146 sadness_level_state = gr.State(EMOTION_DEFAULT)147 disgust_level_state = gr.State(EMOTION_DEFAULT)148 anger_level_state = gr.State(EMOTION_DEFAULT)149 translate_to_state = gr.State(TRANSLATE_TO_DEFAULT)150 literary_style_state = gr.State(LITERARY_STYLE_DEFAULT)151 152 with gr.Row():153 temperature_slider = gr.Slider(label="GPT Temperature", value=TEMPERATURE_DEFAULT, minimum=0.0, maximum=1.0,154 step=0.1)155 title = gr.Markdown ("""<h3><center>GPT-3.5 Express-inator</center></h3>""")156 openai_api_key_textbox = gr.Textbox(placeholder="Paste your OpenAI API key",157 show_label=False, lines=1, type='password')158 159 output = gr.Markdown("")160 with gr.Row():161 request = gr.Textbox(label="Express this: ",162 value="",163 placeholder="Ex: The quick brown fox jumped over the lazy dog.")164 165 submit = gr.Button(value="Express", variant="secondary").style(full_width=False)166 167 with gr.Row():168 with gr.Column():169 num_words_slider = gr.Slider(label="Max number of words to generate (0 for don't care)",170 value=NUM_WORDS_DEFAULT, minimum=0, maximum=100, step=10)171 num_words_slider.change(update_foo,172 inputs=[num_words_slider, num_words_state],173 outputs=[num_words_state])174 175 formality_radio = gr.Radio(label="Formality:", choices=["Casual", "Polite", "Honorific"],176 value=FORMALITY_DEFAULT)177 formality_radio.change(update_foo,178 inputs=[formality_radio, formality_state],179 outputs=[formality_state])180 181 translate_to_radio = gr.Radio(label="Translate to:", choices=[182 TRANSLATE_TO_DEFAULT, "Arabic", "British English", "Chinese (Simplified)", "Chinese (Traditional)",183 "Czech", "Danish", "Dutch", "emojis", "English", "Finnish", "French", "Gen Z slang", "German", "Greek",184 "Hebrew", "Hindi", "Hungarian", "Indonesian", "Italian", "Japanese",185 "how the stereotypical Karen would say it",186 "Klingon", "Korean", "Norwegian", "Old English", "Pirate", "Polish", "Portuguese", "Romanian",187 "Russian", "Spanish", "Strange Planet expospeak technical talk", "Swedish", "Thai", "Turkish", "Vietnamese", "Yoda"], value=TRANSLATE_TO_DEFAULT)188 189 translate_to_radio.change(update_foo,190 inputs=[translate_to_radio, translate_to_state],191 outputs=[translate_to_state])192 193 literary_style_radio = gr.Radio(label="Literary style:", choices=[194 LITERARY_STYLE_DEFAULT, "Poetry", "Haiku", "Limerick", "Joke", "Knock-knock"],195 value=LITERARY_STYLE_DEFAULT)196 197 literary_style_radio.change(update_foo,198 inputs=[literary_style_radio, literary_style_state],199 outputs=[literary_style_state])200 201 gr.Examples(202 examples=[203 "The quick brown fox jumped over the lazy dog",204 "I want some ice cream",205 "Platypuses are weird",206 ],207 inputs=request208 )209 210 with gr.Column():211 with gr.Accordion("Emotions", open=True):212 anticipation_level_radio = gr.Radio(label="Anticipation level:",213 choices=[EMOTION_DEFAULT, "Interest", "Anticipation", "Vigilance"],214 value=EMOTION_DEFAULT)215 anticipation_level_radio.change(update_foo,216 inputs=[anticipation_level_radio, anticipation_level_state],217 outputs=[anticipation_level_state])218 219 joy_level_radio = gr.Radio(label="Joy level:",220 choices=[EMOTION_DEFAULT, "Serenity", "Joy", "Ecstasy"],221 value=EMOTION_DEFAULT)222 joy_level_radio.change(update_foo,223 inputs=[joy_level_radio, joy_level_state],224 outputs=[joy_level_state])225 226 trust_level_radio = gr.Radio(label="Trust level:",227 choices=[EMOTION_DEFAULT, "Acceptance", "Trust", "Admiration"],228 value=EMOTION_DEFAULT)229 trust_level_radio.change(update_foo,230 inputs=[trust_level_radio, trust_level_state],231 outputs=[trust_level_state])232 233 fear_level_radio = gr.Radio(label="Fear level:",234 choices=[EMOTION_DEFAULT, "Apprehension", "Fear", "Terror"],235 value=EMOTION_DEFAULT)236 fear_level_radio.change(update_foo,237 inputs=[fear_level_radio, fear_level_state],238 outputs=[fear_level_state])239 240 surprise_level_radio = gr.Radio(label="Surprise level:",241 choices=[EMOTION_DEFAULT, "Distraction", "Surprise", "Amazement"],242 value=EMOTION_DEFAULT)243 surprise_level_radio.change(update_foo,244 inputs=[surprise_level_radio, surprise_level_state],245 outputs=[surprise_level_state])246 247 sadness_level_radio = gr.Radio(label="Sadness level:",248 choices=[EMOTION_DEFAULT, "Pensiveness", "Sadness", "Grief"],249 value=EMOTION_DEFAULT)250 sadness_level_radio.change(update_foo,251 inputs=[sadness_level_radio, sadness_level_state],252 outputs=[sadness_level_state])253 254 disgust_level_radio = gr.Radio(label="Disgust level:",255 choices=[EMOTION_DEFAULT, "Boredom", "Disgust", "Loathing"],256 value=EMOTION_DEFAULT)257 disgust_level_radio.change(update_foo,258 inputs=[disgust_level_radio, disgust_level_state],259 outputs=[disgust_level_state])260 261 anger_level_radio = gr.Radio(label="Anger level:",262 choices=[EMOTION_DEFAULT, "Annoyance", "Anger", "Rage"],263 value=EMOTION_DEFAULT)264 anger_level_radio.change(update_foo,265 inputs=[anger_level_radio, anger_level_state],266 outputs=[anger_level_state])267 268 gr.HTML("""269 <center>This app by <a target='_blank' href='https://twitter.com/JavaFXpert'>@JavaFXpert</a> leverages GPT-3.5 for text completion to facilitate expressing yourself. 270 The author is not responsible for the content of the generated text.</center>""")271 272 gr.HTML("<center>Powered by <a href='https://github.com/hwchase17/langchain'>LangChain ๐ฆ๏ธ๐</a></center>")273 274 submit.click(transform_text,275 inputs=[276 request, openai_api_key_state, temperature_state, llm_chain_state, num_words_state,277 formality_state,278 anticipation_level_state, joy_level_state, trust_level_state, fear_level_state,279 surprise_level_state, sadness_level_state, disgust_level_state, anger_level_state,280 translate_to_state, literary_style_state],281 outputs=[output])282 283 request.submit(transform_text,284 inputs=[285 request, openai_api_key_state, temperature_state, llm_chain_state, num_words_state,286 formality_state,287 anticipation_level_state, joy_level_state, trust_level_state, fear_level_state,288 surprise_level_state, sadness_level_state, disgust_level_state, anger_level_state,289 translate_to_state, literary_style_state],290 outputs=[output])291 292 openai_api_key_textbox.change(set_openai_api_key,293 inputs=[openai_api_key_textbox, openai_api_key_state, temperature_state,294 llm_chain_state],295 outputs=[openai_api_key_state, llm_chain_state])296 297 temperature_slider.change(update_foo,298 inputs=[temperature_slider, temperature_state],299 outputs=[temperature_state])300 301block.launch()302 