|
|
|
|
|
import openai |
|
|
import os |
|
|
import gradio as gr |
|
|
openai.api_key = os.environ.get("OPENAI_API_KEY") |
|
|
|
|
|
|
|
|
class Conversation: |
|
|
def __init__(self, prompt, num_of_round): |
|
|
self.prompt = prompt |
|
|
self.num_of_round = num_of_round |
|
|
self.messages = [] |
|
|
self.messages.append({"role": "system", "content": self.prompt}) |
|
|
|
|
|
def ask(self, question): |
|
|
try: |
|
|
self.messages.append({"role": "user", "content": question}) |
|
|
response = openai.ChatCompletion.create( |
|
|
model="gpt-3.5-turbo", |
|
|
messages=self.messages, |
|
|
temperature=0.5, |
|
|
max_tokens=256, |
|
|
top_p=1, |
|
|
) |
|
|
except Exception as e: |
|
|
print(e) |
|
|
return e |
|
|
message = response["choices"][0]["message"]["content"] |
|
|
self.messages.append({"role": "assistant", "content": message}) |
|
|
if len(self.messages) > 3: |
|
|
del self.messages[1:3] |
|
|
return message |
|
|
|
|
|
def add_text(history, text): |
|
|
history = history + [(text, None)] |
|
|
return history, gr.update(value="", interactive=False) |
|
|
|
|
|
def add_file(history, file): |
|
|
history = history + [((file.name,), None)] |
|
|
return history |
|
|
|
|
|
def bot(history, chatbot): |
|
|
prompt = ". ".join([m["content"] for m in history if m["role"] == "user"]) |
|
|
response = openai.Completion.create( |
|
|
engine="davinci", |
|
|
prompt=prompt, |
|
|
temperature=0.5, |
|
|
max_tokens=100, |
|
|
top_p=1.0 |
|
|
) |
|
|
message = response["choices"][0]["text"] |
|
|
chatbot.add_message(content=message, role="assistant") |
|
|
|
|
|
def answer(question, history=None): |
|
|
if history is None: |
|
|
history = [] |
|
|
history.append(question) |
|
|
response = conv.ask(question) |
|
|
history.append(response) |
|
|
responses = [(u,b) for u,b in zip(history[::2], history[1::2])] |
|
|
return responses, history |
|
|
|
|
|
def on_text_submit(chatbot, txt): |
|
|
prompt = ". ".join([m[0] for m in history if m[1] == "user"]) |
|
|
response = openai.Completion.create( |
|
|
engine="davinci", |
|
|
prompt=prompt, |
|
|
temperature=0.5, |
|
|
max_tokens=100, |
|
|
top_p=1.0 |
|
|
) |
|
|
message = response["choices"][0]["text"] |
|
|
chatbot.add(message, "assistant") |
|
|
|
|
|
def on_file_upload(chatbot, btn): |
|
|
chatbot.add((btn.uploaded_file.name,), "user") |
|
|
|
|
|
with gr.Blocks(css="#chatbot{height:300px} .overflow-y-auto{height:500px}") as demo: |
|
|
chatbot = gr.Chatbot([], elem_id="chatbot").style(height=750) |
|
|
|
|
|
|
|
|
prompt = """假如你是GPT-4,你可以回答用户提问的任何问题""" |
|
|
conv = Conversation(prompt, 10) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with gr.Blocks(css="#chatty{height:800px} .overflow-y-auto{height:500px}") as demo: |
|
|
chatty = gr.Chatbot([], name="Chatty", elem_id="chatbot").style(height=800, width=800) |
|
|
|
|
|
with gr.Row(): |
|
|
with gr.Column(scale=0.85): |
|
|
txt = gr.Textbox( |
|
|
show_label=False, |
|
|
placeholder="Enter text and press enter, or upload an image", |
|
|
).style(container=False) |
|
|
with gr.Column(scale=0.15, min_width=0): |
|
|
btn = gr.UploadButton("📁", file_types=["image", "video", "audio"]) |
|
|
|
|
|
txt_msg = txt.submit(add_text, [chatty, txt], [chatty, txt], queue=False).then( |
|
|
bot, chatty, chatty |
|
|
) |
|
|
txt_msg.then(lambda: gr.update(interactive=True), None, [txt], queue=False) |
|
|
file_msg = btn.upload(add_file, [chatty, btn], [chatty], queue=False).then( |
|
|
bot, chatty, chatty |
|
|
) |
|
|
demo.launch() |
|
|
|