File size: 3,831 Bytes
a9024eb
 
 
7c84710
 
6c5a57a
7c84710
2ce6944
46773d0
2ce6944
 
f6e601b
2ce6944
47ec66f
 
 
 
2ce6944
 
 
7c84710
a9024eb
 
 
 
 
 
 
 
 
8c05ec6
0936cf0
46773d0
 
 
 
 
 
 
 
 
 
47ec66f
2ce6944
47ec66f
 
 
 
46773d0
a9024eb
3b57062
a9024eb
d425876
a9024eb
 
 
 
 
 
 
 
5003a8d
 
 
 
 
a9024eb
47ec66f
 
 
 
46773d0
0936cf0
46773d0
47ec66f
 
 
c9a8c83
a9024eb
 
47ec66f
 
d425876
 
 
 
 
 
 
 
 
 
 
47ec66f
7c84710
 
46773d0
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
import numpy as np
import cv2
import urllib.request
import openai
import gradio as gr
import random


user_contexts = {}

def get_assistant_response(user_question, context):
    context.append({"role": "user", "content": user_question+"Let's think step by step"})
    response = openai.ChatCompletion.create(
        model='gpt-3.5-turbo',
        messages=context,
        temperature=0
    )
    assistant_response = response.choices[0].message['content']
    context.append({"role": "assistant", "content": assistant_response})
    return assistant_response

def generate_image_url(prompt):
    response = openai.Image.create(
        prompt=prompt,
        n=1,  # 生成1张图片
        size="512x512",  # 图像大小
    )
    image_url = response["data"][0]["url"]
    return image_url

def greet(user_id, api_key, user_question, clear_history):
    openai.api_key = api_key
    global user_contexts
    if user_id not in user_contexts:
        user_contexts[user_id] = [
            {"role": "system", "content": "你是一个聪明的AI助手。"},
            {"role": "user", "content": "你会说中文吗?"},
            {"role": "assistant", "content": "是的,我可以说中文。"}
        ]

    context = user_contexts[user_id]

    if clear_history:
        context = [
            {"role": "system", "content": "你是一个聪明的AI助手。"},
            {"role": "user", "content": "你会说中文吗?"},
            {"role": "assistant", "content": "是的,我可以说中文。"}
        ]
        user_contexts[user_id] = context
        return '清空成功', '保持聊天记录', np.ones((5,5))
    else:
        # 如果user提问包含生成图像的特定指令(这里我们使用“生成图片:”作为示例)
        if user_question.startswith("生成图片:") or user_question.startswith("生成图片:"):
            image_prompt = user_question[5:]  # 提取用于生成图片的文本
            image_url = generate_image_url(image_prompt)
            resp = urllib.request.urlopen(image_url)
            image = np.asarray(bytearray(resp.read()), dtype="uint8")
            image = cv2.imdecode(image, cv2.IMREAD_COLOR)
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        # return image
            return '', '图片已生成', image
        get_assistant_response(user_question, context)
        prompt = ""

        for item in context[3:]:
            prompt += item["role"] + ": " + item["content"] + "\n"
        return '', prompt, np.ones((5,5))

demo = gr.Interface(
    fn=greet,
    inputs=[
        gr.Textbox(lines=1, label='请输入用户ID', placeholder='请输入用户ID'),
        gr.Textbox(lines=1, label='请输入你的OpenAI API密钥', placeholder='请输入你的OpenAI API密钥'),
        gr.Textbox(lines=15, label='请输入问题', placeholder='请输入您的问题'),
        gr.Checkbox(label='清空聊天记录', default=False)
    ],
    outputs=[
        gr.Textbox(lines=1, label='聊天记录状态', placeholder='等待清空聊天记录'),
        gr.Textbox(lines=20, label='AI回答', placeholder='等待AI回答'),
        gr.Image(label='等待图片生成')
    ],
    title="AI助手",
    description="""
1.使用说明:
请输入您的问题,AI助手会给出回答。
支持连续对话,可以记录对话历史。
重新开始对话勾选清空聊天记录,输出清空成功表示重新开启对话。
2.特别警告:
为了防止用户数据混乱,请自定义用户ID。
理论上如果被别人知道自己的ID,那么别人可以查看自己的历史对话,对此你可以选择在对话结束后清除对话记录。
3.图片生成示例:格式-【生成图片:xxxxxxxx】
生成图片:春天到了,万物复苏
    """
)

if __name__ == "__main__":
    demo.launch()