File size: 4,560 Bytes
4655007
a882137
34564f3
 
 
a882137
2f5ca58
34564f3
ea1eb32
2f5ca58
4339cd0
2f5ca58
 
 
 
 
 
 
a882137
34564f3
 
 
 
a882137
34564f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4655007
34564f3
 
 
 
 
4655007
34564f3
 
 
 
 
 
 
7094f38
34564f3
 
 
 
 
 
 
 
 
 
c693d2c
34564f3
c693d2c
abe00c8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import os
import gradio as gr
import json
import requests
import openai

try:
     openai.api_key = os.environ["OPENAI_API_KEY"]

except KeyError:
    error_message = "System is at capacity right now.Please try again later"
    print(error_message)
    def chatbot(input):
        return error_message
else:
    messages = [
        {"role": "system", "content": "My AI Assistant"},
    ]

#Streaming endpoint for OPENAI ChatGPT
API_URL = "https://api.openai.com/v1/chat/completions"
top_p_chatgpt = 1.0
temperature_chatgpt = 1.0

#Predict function for CHATGPT
def chatbot(inputs, chat_counter_chatgpt, chatbot_chatgpt=[], history=[]):  
    #Define payload and header for chatgpt API
    payload = {
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": f"{inputs}"}],
    "temperature" : 1.0,
    "top_p":1.0,
    "n" : 1,
    "stream": True,
    "presence_penalty":0,
    "frequency_penalty":0,
    }

    headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {openai.api_key}"
    }
    
    #Handling the different roles for ChatGPT
    if chat_counter_chatgpt != 0 :
        messages=[]
        for data in chatbot_chatgpt:
          temp1 = {}
          temp1["role"] = "user" 
          temp1["content"] = data[0] 
          temp2 = {}
          temp2["role"] = "assistant" 
          temp2["content"] = data[1]
          messages.append(temp1)
          messages.append(temp2)
        temp3 = {}
        temp3["role"] = "user" 
        temp3["content"] = inputs
        messages.append(temp3)
        payload = {
        "model": "gpt-3.5-turbo",
        "messages": messages, #[{"role": "user", "content": f"{inputs}"}],
        "temperature" : temperature_chatgpt, #1.0,
        "top_p": top_p_chatgpt, #1.0,
        "n" : 1,
        "stream": True,
        "presence_penalty":0,
        "frequency_penalty":0,
        }

    chat_counter_chatgpt+=1

    history.append("You asked:  "+ inputs)

    # make a POST request to the API endpoint using the requests.post method, passing in stream=True
    response = requests.post(API_URL, headers=headers, json=payload, stream=True)
    token_counter = 0 
    partial_words = ""  

    counter=0
    for chunk in response.iter_lines():
        #Skipping the first chunk
        if counter == 0:
          counter+=1
          continue
        # check whether each line is non-empty
        if chunk.decode() :
          chunk = chunk.decode()
          # decode each line as response data is in bytes
          if len(chunk) > 13 and "content" in json.loads(chunk[6:])['choices'][0]["delta"]:
              partial_words = partial_words + json.loads(chunk[6:])['choices'][0]["delta"]["content"]
              if token_counter == 0:
                history.append(" " + partial_words)
              else:
                history[-1] = partial_words
              chat = [(history[i], history[i + 1]) for i in range(0, len(history) - 1, 2) ]  # convert to tuples of list
              token_counter+=1
              yield chat, history, chat_counter_chatgpt  # this resembles {chatbot: chat, state: history}  


def reset_textbox():
    return gr.update(value="")

def reset_chat(chatbot, state):
    return None, []

with gr.Blocks(css="""#col_container {width: 1000px; margin-left: auto; margin-right: auto;}
                #chatgpt {height: 400px; overflow: auto;}} """, theme=gr.themes.Default(primary_hue="slate") ) as demo:
    with gr.Row():
      with gr.Column(scale=14):
          with gr.Box():
              with gr.Row():
                  with gr.Column(scale=13):
                    inputs = gr.Textbox(label="Ask me anything ⤵️   Try: Value of pi" )
                  with gr.Column(scale=1):
                      b1 = gr.Button('Submit', elem_id = 'submit').style(full_width=True)
                      b2 = gr.Button('Clear', elem_id = 'clear').style(full_width=True)
                  state_chatgpt = gr.State([])

          with gr.Box():
              with gr.Row():
                  chatbot_chatgpt = gr.Chatbot(elem_id="chatgpt", label=''My ChatGPT Turbo")
    chat_counter_chatgpt = gr.Number(value=0, visible=False, precision=0)
             

    inputs.submit(reset_textbox, [], [inputs])
    
    b1.click( chatbot, 
                [ inputs,  chat_counter_chatgpt, chatbot_chatgpt, state_chatgpt], 
                [chatbot_chatgpt, state_chatgpt],)

    b2.click(reset_chat, [chatbot_chatgpt, state_chatgpt], [chatbot_chatgpt, state_chatgpt])

    demo.queue(concurrency_count=16).launch(height= 2500, debug=True)