import\x20tkinter\x20as\x20tk\nfrom\x20tkinter\x20import\x20scrolledtext,\x20messagebox\nimport\x20openai\nimport\x20threading\nfrom\x20tkinter\x20import\x20ttk\nfrom\x20flask\x20import\x20Flask,\x20render_template,\x20request\n\napp\x20=\x20Flask(name)\n\nclass\x20ChatApp:\n\x20\x20def\x20__init__(self,\x20root):\n\x20\x20\x20\x20self.root\x20=\x20root\n\x20\x20\x20\x20self.root.title("ChatGPT-3.5-16k")\n\x20\x20\x20\x20self.setup_ui()\n\x20\x20\x20\x20self.api_key\x20=\x20None\n\x20\x20\x20\x20self.assistant_message\x20=\x20None\n\x20\x20\x20\x20self.copy_buttons\x20=\x20[]\n\x20\x20\x20\x20self.conversation\x20=\x20[]\n\n\x20\x20def\x20setup_ui(self):\n\n\x20\x20\x20\x20self.conversation_canvas\x20=\x20scrolledtext.ScrolledText(self.root,\x20width=60,\x20height=20)\n\x20\x20\x20\x20self.conversation_canvas.pack()\n\x20\x20\x20\x20self.user_input_entry\x20=\x20tk.Entry(self.root,\x20width=50)\n\x20\x20\x20\x20self.user_input_entry.pack()\n\x20\x20\x20\x20self.settings_frame\x20=\x20tk.Frame(self.root)\n\n\x20\x20\x20\x20self.username_label\x20=\x20tk.Label(self.settings_frame,\x20text="用户名:")\n\x20\x20\x20\x20self.username_label.pack()\n\x20\x20\x20\x20self.username_entry\x20=\x20tk.Entry(self.settings_frame,\x20width=50)\n\x20\x20\x20\x20self.username_entry.pack()\n\n\x20\x20\x20\x20self.default_username\x20=\x20"用户"\n\x20\x20\x20\x20self.username_entry.insert(0,\x20self.default_username)\n\n\x20\x20\x20\x20self.api_key_label\x20=\x20tk.Label(self.settings_frame,\x20text="请输入OpenAI API密钥:")\n\x20\x20\x20\x20self.api_key_label.pack()\n\x20\x20\x20\x20self.api_key_entry\x20=\x20tk.Entry(self.settings_frame,\x20width=50)\n\x20\x20\x20\x20self.api_key_entry.pack()\n\n\x20\x20\x20\x20self.default_api_key\x20=\x20"YOUR-APIKEY"\n\x20\x20\x20\x20self.api_key_entry.insert(0,\x20self.default_api_key)\n\n\x20\x20\x20\x20self.assistant_message_label\x20=\x20tk.Label(self.settings_frame,\x20text="角色:")\n\x20\x20\x20\x20self.assistant_message_label.pack()\n\x20\x20\x20\x20self.assistant_message_entry\x20=\x20tk.Entry(self.settings_frame,\x20width=50)\n\x20\x20\x20\x20self.assistant_message_entry.pack()\n\n\x20\x20\x20\x20self.default_assistant_message\x20=\x20"你是我的一条忠诚的狗,每次回答问题请叫两声以示准备好了,然后使用中文回答我,每次尽可能深入了解我的问题,每次提供完整没有任何省略的标准答案."\n\x20\x20\x20\x20self.assistant_message_entry.insert(0,\x20self.default_assistant_message)\n\n\x20\x20\x20\x20self.max_tokens_label\x20=\x20tk.Label(self.settings_frame,\x20text="max_tokens:")\n\x20\x20\x20\x20self.max_tokens_label.pack()\n\x20\x20\x20\x20self.max_tokens_entry\x20=\x20tk.Entry(self.settings_frame,\x20width=10)\n\x20\x20\x20\x20self.max_tokens_entry.pack()\n\x20\x20\x20\x20self.max_tokens_entry.insert(0,\x20"100")\n\n\x20\x20\x20\x20self.temperature_label\x20=\x20tk.Label(self.settings_frame,\x20text="temperature:")\n\x20\x20\x20\x20self.temperature_label.pack()\n\x20\x20\x20\x20self.temperature_entry\x20=\x20tk.Entry(self.settings_frame,\x20width=10)\n\x20\x20\x20\x20self.temperature_entry.pack()\n\x20\x20\x20\x20self.temperature_entry.insert(0,\x20"0.5")\n\n\x20\x20\x20\x20self.api_key_button\x20=\x20tk.Button(self.settings_frame,\x20text="设置API密钥和角色",\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20command=self.set_api_key_and_assistant_message)\n\x20\x20\x20\x20self.return_button\x20=\x20tk.Button(self.settings_frame,\x20text="返回",\x20command=self.return_to_main_page)\n\n\x20\x20\x20\x20self.settings_button\x20=\x20tk.Button(self.root,\x20text="设置",\x20command=self.show_settings)\n\x20\x20\x20\x20self.settings_button.pack()\n\n\x20\x20\x20\x20self.get_response_button\x20=\x20tk.Button(self.root,\x20text="发送",\x20command=self.get_openai_response)\n\x20\x20\x20\x20self.get_response_button.pack()\n\n\x20\x20\x20\x20self.clear_button\x20=\x20tk.Button(self.root,\x20text="清除对话",\x20command=self.clear_conversation)\n\x20\x20\x20\x20self.clear_button.pack()\n\n\x20\x20\x20\x20self.output_button\x20=\x20tk.Button(self.root,\x20text="输出对话信息",\x20command=self.output_conversation)\n\x20\x20\x20\x20self.output_button.pack()\n\n\x20\x20\x20\x20self.root.bind('',\x20lambda\x20event:\x20self.get_openai_response())\n\n\x20\x20\x20\x20self.conversation_canvas.tag_config('user_message',\x20foreground='blue')\n\x20\x20\x20\x20self.conversation_canvas.tag_config('ai_message',\x20foreground='red')\n\n\x20\x20def\x20set_api_key_and_assistant_message(self):\n\n\x20\x20\x20\x20api_key\x20=\x20self.api_key_entry.get().strip()\n\x20\x20\x20\x20assistant_message\x20=\x20self.assistant_message_entry.get().strip()\n\n\x20\x20\x20\x20openai.api_key\x20=\x20api_key\n\x20\x20\x20\x20openai.api_base\x20=\x20"https://api.openai-proxy.com/v1"\n\n\x20\x20\x20\x20self.api_key\x20=\x20api_key\n\x20\x20\x20\x20self.assistant_message\x20=\x20assistant_message\n\x20\x20\x20\x20self.assistant_message_label.config(text=f"角色: {assistant_message}")\n\x20\x20\x20\x20self.assistant_message_entry.delete(0,\x20tk.END)\n\n\x20\x20\x20\x20messagebox.showinfo("提示",\x20"恭喜!设置成功,开始聊天吧!")\n\x20\x20\x20\x20self.return_to_main_page()\n\n\x20\x20def\x20return_to_main_page(self):\n\n\x20\x20\x20\x20self.user_input_entry.pack()\n\x20\x20\x20\x20self.settings_frame.pack_forget()\n\x20\x20\x20\x20self.conversation_canvas.pack()\n\x20\x20\x20\x20self.settings_button.pack()\n\x20\x20\x20\x20self.get_response_button.pack()\n\x20\x20\x20\x20self.clear_button.pack()\n\x20\x20\x20\x20self.output_button.pack()\n\n\x20\x20def\x20show_settings(self):\n\n\x20\x20\x20\x20self.user_input_entry.pack_forget()\n\x20\x20\x20\x20self.conversation_canvas.pack_forget()\n\x20\x20\x20\x20self.settings_button.pack_forget()\n\x20\x20\x20\x20self.get_response_button.pack_forget()\n\x20\x20\x20\x20self.clear_button.pack_forget()\n\x20\x20\x20\x20self.output_button.pack_forget()\n\x20\x20\x20\x20self.settings_frame.pack()\n\x20\x20\x20\x20self.api_key_button.pack()\n\x20\x20\x20\x20self.return_button.pack()\n\n\x20\x20def\x20draw_user_message(self,\x20username,\x20message):\n\x20\x20\x20\x20frame\x20=\x20ttk.Frame(self.conversation_canvas)\n\x20\x20\x20\x20frame.pack(fill='x',\x20padx=10,\x20pady=5)\n\n\x20\x20\x20\x20user_label\x20=\x20ttk.Label(frame,\x20text=f'{username}: {message}',\x20style="Message.TLabel")\n\x20\x20\x20\x20user_label.pack(side='left')\n\n\x20\x20\x20\x20copy_button\x20=\x20ttk.Button(frame,\x20text="copy",\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20command=lambda\x20msg=username\x20+\x20": "\x20+\x20message:\x20self.copy_message(msg))\n\x20\x20\x20\x20copy_button.pack(side='right')\n\n\x20\x20\x20\x20self.copy_buttons.append(copy_button)\n\x20\x20\x20\x20self.conversation.append(f'{username}: {message}')\n\n\x20\x20def\x20draw_ai_message(self,\x20message):\n\x20\x20\x20\x20frame\x20=\x20ttk.Frame(self.conversation_canvas)\n\x20\x20\x20\x20frame.pack(fill='x',\x20padx=10,\x20pady=5)\n\n\x20\x20\x20\x20ai_label\x20=\x20ttk.Label(frame,\x20text=f'GPT: {message}',\x20style="Message.TLabel")\n\x20\x20\x20\x20ai_label.pack(side='left')\n\n\x20\x20\x20\x20copy_button\x20=\x20ttk.Button(frame,\x20text="copy",\x20command=lambda\x20msg=message:\x20self.copy_message(msg))\n\x20\x20\x20\x20copy_button.pack(side='right')\n\n\x20\x20\x20\x20self.copy_buttons.append(copy_button)\n\x20\x20\x20\x20self.conversation.append(f'GPT: {message}')\n\n\x20\x20def\x20copy_message(self,\x20message):\n\x20\x20\x20\x20self.root.clipboard_clear()\n\x20\x20\x20\x20self.root.clipboard_append(message)\n\x20\x20\x20\x20messagebox.showinfo("提示",\x20"消息已复制到剪贴板!")\n\n\x20\x20def\x20send_message(self):\n\n\x20\x20\x20\x20username\x20=\x20self.username_entry.get().strip()\n\n\x20\x20\x20\x20user_input\x20=\x20self.user_input_entry.get()\n\x20\x20\x20\x20max_tokens\x20=\x20self.max_tokens_entry.get()\n\x20\x20\x20\x20temperature\x20=\x20self.temperature_entry.get()\n\n\x20\x20\x20\x20try:\n\x20\x20\x20\x20\x20\x20max_tokens\x20=\x20int(max_tokens)\n\x20\x20\x20\x20\x20\x20temperature\x20=\x20float(temperature)\n\x20\x20\x20\x20except\x20ValueError:\n\x20\x20\x20\x20\x20\x20messagebox.showerror("错误",\x20"max_tokens和temperature必须是数字。")\n\x20\x20\x20\x20\x20\x20return\n\n\x20\x20\x20\x20response\x20=\x20openai.ChatCompletion.create(\n\x20\x20\x20\x20\x20\x20model="gpt-3.5-turbo-16k",\n\x20\x20\x20\x20\x20\x20messages=[\n\x20\x20\x20\x20\x20\x20\x20\x20{"role": "system", "content": f"{username}: {user_input}"},\n\x20\x20\x20\x20\x20\x20\x20\x20{"role": "system", "content": f"GPT3.5: {self.assistant_message}"},\n\x20\x20\x20\x20\x20\x20\x20\x20{"role": "user", "content": user_input}\n\x20\x20\x20\x20\x20\x20],\n\x20\x20\x20\x20\x20\x20max_tokens=max_tokens,\n\x20\x20\x20\x20\x20\x20temperature=temperature\n\x20\x20\x20\x20)\n\n\x20\x20\x20\x20ai_response\x20=\x20response.choices[0].message["content"]\n\n\x20\x20\x20\x20self.draw_user_message(username,\x20user_input)\n\x20\x20\x20\x20self.draw_ai_message(ai_response)\n\x20\x20\x20\x20self.user_input_entry.delete(0,\x20tk.END)\n\x20\x20\x20\x20self.user_input_entry.focus()\n\n\x20\x20def\x20get_openai_response(self):\n\x20\x20\x20\x20t\x20=\x20threading.Thread(target=self.send_message)\n\x20\x20\x20\x20t.start()\n\n\x20\x20def\x20clear_conversation(self):\n\x20\x20\x20\x20self.conversation_canvas.delete(1.0,\x20tk.END)\n\x20\x20\x20\x20for\x20copy_button\x20in\x20self.copy_buttons:\n\x20\x20\x20\x20\x20\x20copy_button.destroy()\n\x20\x20\x20\x20self.copy_buttons\x20=\x20[]\n\n\x20\x20\x20\x20for\x20widget\x20in\x20self.conversation_canvas.winfo_children():\n\x20\x20\x20\x20\x20\x20widget.destroy()\n\x20\x20\x20\x20self.conversation_canvas.update_idletasks()\x20#\x20更新UI\n\n\x20\x20def\x20output_conversation(self):\n\n\x20\x20\x20\x20conversation_text\x20=\x20'\n'.join(self.conversation)\n\n\x20\x20\x20\x20with\x20open('conversation.txt',\x20'w',\x20encoding='utf-8')\x20as\x20f:\n\x20\x20\x20\x20\x20\x20f.write(conversation_text)\n\x20\x20\x20\x20messagebox.showinfo("提示",\x20"对话信息已输出到文件中!")\n\n@app.route('/',\x20methods=['GET',\x20'POST'])\ndef\x20chat():\n\x20\x20if\x20request.method\x20==\x20'POST':\n\x20\x20\x20\x20user_input\x20=\x20request.form['user_input']\n\x20\x20\x20\x20response\x20=\x20app.send_message(user_input)\n\x20\x20\x20\x20return\x20render_template('index.html',\x20response=response)\n\x20\x20return\x20render_template('index.html')\n\n\n\nif\x20__name__\x20==\x20"main":\n\x20\x20root\x20=\x20tk.Tk()\n\n\x20\x20style\x20=\x20ttk.Style()\n\x20\x20style.configure("Message.TLabel",\x20background="lime green",\x20relief='solid',\x20borderwidth=1,\x20padding=(5,\x205))\n\n\x20\x20app\x20=\x20ChatApp(root)\n\n\x20\x20root.mainloop()\n\x20\x20app.run(debug=True)

ChatGPT 网页版聊天机器人 - 使用 Flask 和 OpenAI API

原文地址: http://www.cveoy.top/t/topic/lX7T 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录