ChatGPTwithAPI / app.py
pablocst's picture
Update app.py
2a020c3
raw
history blame
3.11 kB
import gradio as gr
import requests
import json
API_URL = "https://api.openai.com/v1/chat/completions"
def predict(inputs, top_p, temperature, openai_api_key, chat_counter, chatbot=[], history=[]):
messages = format_messages(chatbot, inputs, chat_counter)
payload = create_payload(messages, top_p, temperature)
response = make_request(API_URL, openai_api_key, payload)
return process_response(response, history)
def format_messages(chatbot, inputs, chat_counter):
messages = []
if chat_counter != 0:
for i in range(len(chatbot)):
user_message = {"role": "user", "content": chatbot[i][0]}
assistant_message = {"role": "assistant", "content": chatbot[i][1]}
messages.extend([user_message, assistant_message])
messages.append({"role": "user", "content": inputs})
return messages
def create_payload(messages, top_p, temperature):
return {
"model": "gpt-4-1106-preview",
"messages": messages,
"temperature": temperature,
"top_p": top_p,
"n": 1,
"stream": True,
"presence_penalty": 0,
"frequency_penalty": 0,
}
def make_request(url, api_key, payload):
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
response = requests.post(url, headers=headers, json=payload, stream=True)
return response
def process_response(response, history):
token_counter = 0
partial_words = ""
for chunk in response.iter_lines():
if chunk:
chunk_data = json.loads(chunk[6:])['choices'][0]['delta']
if 'content' in chunk_data:
partial_words += chunk_data['content']
if token_counter == 0:
history.append(" " + partial_words)
else:
history[-1] = partial_words
token_counter += 1
chat = [(history[i], history[i + 1]) for i in range(0, len(history) - 1, 2)]
return chat, history, token_counter
def setup_ui():
with gr.Blocks() as demo:
with gr.Column():
openai_api_key = gr.Textbox(type='password', label="Insira sua chave de API OpenAI aqui")
chatbot = gr.Chatbot()
inputs = gr.Textbox(placeholder="Olá!", label="Digite uma entrada e pressione Enter", lines=3)
state = gr.State([])
b1 = gr.Button(value="Executar", variant="primary")
top_p = gr.Slider(minimum=0, maximum=1.0, value=1.0, step=0.05, label="Top-p")
temperature = gr.Slider(minimum=0, maximum=1.0, value=1.0, step=0.05, label="Temperature")
chat_counter = gr.Number(value=0, visible=False)
inputs.submit(predict, [inputs, top_p, temperature, openai_api_key, chat_counter, chatbot, state], [chatbot, state, chat_counter])
b1.click(predict, [inputs, top_p, temperature, openai_api_key, chat_counter, chatbot, state], [chatbot, state, chat_counter])
return demo
def main():
demo = setup_ui()
demo.launch()
if __name__ == "__main__":
main()