Orami01/ChatGPT4-Using-Chat-Completions-API
0
1import gradio as gr2import os 3import json 4import requests5 6#Streaming endpoint 7API_URL = "https://api.openai.com/v1/chat/completions" #os.getenv("API_URL") + "/generate_stream"8 9#Inferenec function10def predict(openai_gpt4_key, system_msg, inputs, top_p, temperature, chat_counter, chatbot=[], history=[]): 11 12 headers = {13 "Content-Type": "application/json",14 "Authorization": f"Bearer {openai_gpt4_key}" #Users will provide their own OPENAI_API_KEY 15 }16 print(f"system message is ^^ {system_msg}")17 if system_msg.strip() == '':18 initial_message = [{"role": "user", "content": f"{inputs}"},]19 multi_turn_message = []20 else:21 initial_message= [{"role": "system", "content": system_msg},22 {"role": "user", "content": f"{inputs}"},]23 multi_turn_message = [{"role": "system", "content": system_msg},]24 25 if chat_counter == 0 :26 payload = {27 "model": "gpt-4",28 "messages": initial_message , 29 "temperature" : 1.0,30 "top_p":1.0,31 "n" : 1,32 "stream": True,33 "presence_penalty":0,34 "frequency_penalty":0,35 }36 print(f"chat_counter - {chat_counter}")37 else: #if chat_counter != 0 :38 messages=multi_turn_message # Of the type of - [{"role": "system", "content": system_msg},]39 for data in chatbot:40 user = {}41 user["role"] = "user" 42 user["content"] = data[0] 43 assistant = {}44 assistant["role"] = "assistant" 45 assistant["content"] = data[1]46 messages.append(user)47 messages.append(assistant)48 temp = {}49 temp["role"] = "user" 50 temp["content"] = inputs51 messages.append(temp)52 #messages53 payload = {54 "model": "gpt-4",55 "messages": messages, # Of the type of [{"role": "user", "content": f"{inputs}"}],56 "temperature" : temperature, #1.0,57 "top_p": top_p, #1.0,58 "n" : 1,59 "stream": True,60 "presence_penalty":0,61 "frequency_penalty":0,}62 63 chat_counter+=164 65 history.append(inputs)66 print(f"Logging : payload is - {payload}")67 # make a POST request to the API endpoint using the requests.post method, passing in stream=True68 response = requests.post(API_URL, headers=headers, json=payload, stream=True)69 print(f"Logging : response code - {response}")70 token_counter = 0 71 partial_words = "" 72 73 counter=074 for chunk in response.iter_lines():75 #Skipping first chunk76 if counter == 0:77 counter+=178 continue79 # check whether each line is non-empty80 if chunk.decode() :81 chunk = chunk.decode()82 # decode each line as response data is in bytes83 if len(chunk) > 12 and "content" in json.loads(chunk[6:])['choices'][0]['delta']:84 partial_words = partial_words + json.loads(chunk[6:])['choices'][0]["delta"]["content"]85 if token_counter == 0:86 history.append(" " + partial_words)87 else:88 history[-1] = partial_words89 chat = [(history[i], history[i + 1]) for i in range(0, len(history) - 1, 2) ] # convert to tuples of list90 token_counter+=191 yield chat, history, chat_counter, response # resembles {chatbot: chat, state: history} 92 93#Resetting to blank94def reset_textbox():95 return gr.update(value='')96 97#to set a component as visible=False98def set_visible_false():99 return gr.update(visible=False)100 101#to set a component as visible=True102def set_visible_true():103 return gr.update(visible=True)104 105title = """<h1 align="center">🔥GPT4 using Chat-Completions API & 🚀Gradio-Streaming</h1>"""106#display message for themes feature107theme_addon_msg = """<center>🌟 This Demo also introduces you to Gradio Themes. Discover more on Gradio website using our <a href="https://gradio.app/theming-guide/" target="_blank">Themeing-Guide🎨</a>! You can develop from scratch, modify an existing Gradio theme, and share your themes with community by uploading them to huggingface-hub easily using <code>theme.push_to_hub()</code>.</center>108""" 109 110#Using info to add additional information about System message in GPT4111system_msg_info = """A conversation could begin with a system message to gently instruct the assistant. 112System message helps set the behavior of the AI Assistant. For example, the assistant could be instructed with 'You are a helpful assistant.'"""113 114#Modifying existing Gradio Theme115theme = gr.themes.Soft(primary_hue="zinc", secondary_hue="green", neutral_hue="green",116 text_size=gr.themes.sizes.text_lg) 117 118with gr.Blocks(css = """#col_container { margin-left: auto; margin-right: auto;} #chatbot {height: 520px; overflow: auto;}""",119 theme=theme) as demo:120 gr.HTML(title)121 gr.HTML("""<h3 align="center">🔥This Huggingface Gradio Demo provides you access to GPT4 API with System Messages. Please note that you would be needing an OPENAI API key for GPT4 access🙌</h1>""")122 gr.HTML(theme_addon_msg)123 gr.HTML('''<center><a href="https://huggingface.co/spaces/ysharma/ChatGPT4?duplicate=true"><img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a>Duplicate the Space and run securely with your OpenAI API Key</center>''')124 125 with gr.Column(elem_id = "col_container"):126 #Users need to provide their own GPT4 API key, it is no longer provided by Huggingface 127 with gr.Row():128 openai_gpt4_key = gr.Textbox(label="OpenAI GPT4 Key", value="", type="password", placeholder="sk..", info = "You have to provide your own GPT4 keys for this app to function properly",)129 with gr.Accordion(label="System message:", open=False):130 system_msg = gr.Textbox(label="Instruct the AI Assistant to set its beaviour", info = system_msg_info, value="",placeholder="Type here..")131 accordion_msg = gr.HTML(value="🚧 To set System message you will have to refresh the app", visible=False)132 133 chatbot = gr.Chatbot(label='GPT4', elem_id="chatbot")134 inputs = gr.Textbox(placeholder= "Hi there!", label= "Type an input and press Enter")135 state = gr.State([]) 136 with gr.Row():137 with gr.Column(scale=7):138 b1 = gr.Button().style(full_width=True)139 with gr.Column(scale=3):140 server_status_code = gr.Textbox(label="Status code from OpenAI server", )141 142 #top_p, temperature143 with gr.Accordion("Parameters", open=False):144 top_p = gr.Slider( minimum=-0, maximum=1.0, value=1.0, step=0.05, interactive=True, label="Top-p (nucleus sampling)",)145 temperature = gr.Slider( minimum=-0, maximum=5.0, value=1.0, step=0.1, interactive=True, label="Temperature",)146 chat_counter = gr.Number(value=0, visible=False, precision=0)147 148 #Event handling149 inputs.submit( predict, [openai_gpt4_key, system_msg, inputs, top_p, temperature, chat_counter, chatbot, state], [chatbot, state, chat_counter, server_status_code],) #openai_api_key150 b1.click( predict, [openai_gpt4_key, system_msg, inputs, top_p, temperature, chat_counter, chatbot, state], [chatbot, state, chat_counter, server_status_code],) #openai_api_key151 152 inputs.submit(set_visible_false, [], [system_msg])153 b1.click(set_visible_false, [], [system_msg])154 inputs.submit(set_visible_true, [], [accordion_msg])155 b1.click(set_visible_true, [], [accordion_msg])156 157 b1.click(reset_textbox, [], [inputs])158 inputs.submit(reset_textbox, [], [inputs])159 160 #Examples 161 with gr.Accordion(label="Examples for System message:", open=False):162 gr.Examples(163 examples = [["""You are an AI programming assistant.164 165 - Follow the user's requirements carefully and to the letter.166 - First think step-by-step -- describe your plan for what to build in pseudocode, written out in great detail.167 - Then output the code in a single code block.168 - Minimize any other prose."""], ["""You are ComedianGPT who is a helpful assistant. You answer everything with a joke and witty replies."""],169 ["You are ChefGPT, a helpful assistant who answers questions with culinary expertise and a pinch of humor."],170 ["You are FitnessGuruGPT, a fitness expert who shares workout tips and motivation with a playful twist."],171 ["You are SciFiGPT, an AI assistant who discusses science fiction topics with a blend of knowledge and wit."],172 ["You are PhilosopherGPT, a thoughtful assistant who responds to inquiries with philosophical insights and a touch of humor."],173 ["You are EcoWarriorGPT, a helpful assistant who shares environment-friendly advice with a lighthearted approach."],174 ["You are MusicMaestroGPT, a knowledgeable AI who discusses music and its history with a mix of facts and playful banter."],175 ["You are SportsFanGPT, an enthusiastic assistant who talks about sports and shares amusing anecdotes."],176 ["You are TechWhizGPT, a tech-savvy AI who can help users troubleshoot issues and answer questions with a dash of humor."],177 ["You are FashionistaGPT, an AI fashion expert who shares style advice and trends with a sprinkle of wit."],178 ["You are ArtConnoisseurGPT, an AI assistant who discusses art and its history with a blend of knowledge and playful commentary."],179 ["You are a helpful assistant that provides detailed and accurate information."],180 ["You are an assistant that speaks like Shakespeare."],181 ["You are a friendly assistant who uses casual language and humor."],182 ["You are a financial advisor who gives expert advice on investments and budgeting."],183 ["You are a health and fitness expert who provides advice on nutrition and exercise."],184 ["You are a travel consultant who offers recommendations for destinations, accommodations, and attractions."],185 ["You are a movie critic who shares insightful opinions on films and their themes."],186 ["You are a history enthusiast who loves to discuss historical events and figures."],187 ["You are a tech-savvy assistant who can help users troubleshoot issues and answer questions about gadgets and software."],188 ["You are an AI poet who can compose creative and evocative poems on any given topic."],],189 inputs = system_msg,)190 191demo.queue(max_size=99, concurrency_count=20).launch(debug=True)