import\ tkinter\ as\ tk\nfrom\ tkinter\ import\ scrolledtext,\ messagebox\nimport\ openai\nimport\ threading\n\nclass\ ChatApp:\n def\ init(self,\ root):\n self.root\ =\ root\n self.root.title("OpenAI Chat")\n self.setup_ui()\n self.api_key\ =\ None\n self.assistant_message\ =\ None\n self.user_messages\ =\ []\n self.ai_messages\ =\ []\n\n def\ setup_ui(self):\n # 创建和布局界面元素\n self.conversation_canvas\ =\ scrolledtext.ScrolledText(self.root,\ width=60,\ height=20)\n self.conversation_canvas.pack()\n\n self.user_input_label\ =\ tk.Label(self.root,\ text="用户输入:")\n self.user_input_label.pack()\n self.user_input_entry\ =\ tk.Entry(self.root,\ width=50)\n self.user_input_entry.pack()\n\n self.settings_frame\ =\ tk.Frame(self.root)\n\n self.api_key_label\ =\ tk.Label(self.settings_frame,\ text="请输入OpenAI API密钥:")\n self.api_key_label.pack()\n self.api_key_entry\ =\ tk.Entry(self.settings_frame,\ width=50)\n self.api_key_entry.pack()\n\n self.default_api_key\ =\ "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"\n self.api_key_entry.insert(0,\ self.default_api_key)\n\n self.assistant_message_label\ =\ tk.Label(self.settings_frame,\ text="角色:")\n self.assistant_message_label.pack()\n self.assistant_message_entry\ =\ tk.Entry(self.settings_frame,\ width=50)\n self.assistant_message_entry.pack()\n\n self.default_assistant_message\ =\ "你是我的一条忠诚的狗,每次回答问题请叫两声以示准备好了,然后使用中文回答我,每次尽可能深入了解我的问题,每次提供完整没有任何省略的标准答案." \n self.assistant_message_entry.insert(0,\ self.default_assistant_message)\n\n self.max_tokens_label\ =\ tk.Label(self.settings_frame,\ text="max_tokens:")\n self.max_tokens_label.pack()\n self.max_tokens_entry\ =\ tk.Entry(self.settings_frame,\ width=10)\n self.max_tokens_entry.pack()\n self.max_tokens_entry.insert(0,\ "100")\n\n self.temperature_label\ =\ tk.Label(self.settings_frame,\ text="temperature:")\n self.temperature_label.pack()\n self.temperature_entry\ =\ tk.Entry(self.settings_frame,\ width=10)\n self.temperature_entry.pack()\n self.temperature_entry.insert(0,\ "0.5")\n\n self.api_key_button\ =\ tk.Button(self.settings_frame,\ text="设置API密钥和角色",\ command=self.set_api_key_and_assistant_message)\n self.return_button\ =\ tk.Button(self.settings_frame,\ text="返回",\ command=self.return_to_main_page)\n\n self.settings_button\ =\ tk.Button(self.root,\ text="设置",\ command=self.show_settings)\n self.settings_button.pack()\n\n self.get_response_button\ =\ tk.Button(self.root,\ text="发送",\ command=self.get_openai_response)\n self.get_response_button.pack()\n\n self.clear_conversation_button\ =\ tk.Button(self.root,\ text="清除对话记录",\ command=self.clear_conversation)\n self.clear_conversation_button.pack()\n\n self.conversation_canvas.tag_config('user_message',\ foreground='blue')\n self.conversation_canvas.tag_config('ai_message',\ foreground='red')\n\n def\ set_api_key_and_assistant_message(self):\n # 设置API密钥和角色\n api_key\ =\ self.api_key_entry.get().strip()\n assistant_message\ =\ self.assistant_message_entry.get().strip()\n\n openai.api_key\ =\ api_key\n openai.api_base\ =\ "https://api.openai-proxy.com/v1"\n\n self.api_key\ =\ api_key\n self.assistant_message\ =\ assistant_message\n self.assistant_message_label.config(text=f"角色:\ {assistant_message}")\n self.assistant_message_entry.delete(0,\ tk.END)\n\n messagebox.showinfo("提示",\ "设置成功,开始聊天吧!")\n self.return_to_main_page()\n\n def\ return_to_main_page(self):\n # 返回主页面\n self.settings_frame.pack_forget()\n self.user_input_entry.pack()\n self.conversation_canvas.pack()\n self.settings_button.pack()\n self.get_response_button.pack()\n self.clear_conversation_button.pack()\n self.user_input_entry.focus()\n\n def\ show_settings(self):\n # 显示设置参数页面\n self.user_input_entry.pack_forget()\n self.conversation_canvas.pack_forget()\n self.settings_button.pack_forget()\n self.get_response_button.pack_forget()\n self.clear_conversation_button.pack_forget()\n self.settings_frame.pack()\n self.api_key_button.pack()\n self.return_button.pack()\n\n def\ draw_user_message(self,\ message):\n self.conversation_canvas.configure(state='normal')\n self.conversation_canvas.insert(tk.END,\ f"\n用户:\ {message}",\ 'user_message')\n self.conversation_canvas.tag_config('user_message',\ foreground='blue')\n self.conversation_canvas.configure(state='disabled')\n self.conversation_canvas.see(tk.END)\n\n self.user_messages.append(message)\n self.draw_copy_button(len(self.user_messages)-1,\ 'user')\n\n def\ draw_ai_message(self,\ message):\n self.conversation_canvas.configure(state='normal')\n self.conversation_canvas.insert(tk.END,\ f"\nAI:\ {message}",\ 'ai_message')\n self.conversation_canvas.tag_config('ai_message',\ foreground='red')\n self.conversation_canvas.configure(state='disabled')\n self.conversation_canvas.see(tk.END)\n\n self.ai_messages.append(message)\n self.draw_copy_button(len(self.ai_messages)-1,\ 'ai')\n\n def\ draw_copy_button(self,\ index,\ role):\n start_index\ =\ self.get_message_start_index(role,\ index)\n end_index\ =\ self.get_message_end_index(role,\ index)\n\n button_text\ =\ "复制"\n button_command\ =\ lambda\ event:\ self.copy_message(event.widget.index('current'))\n\n self.conversation_canvas.tag_add(f'{role}copy_button{index}',\ start_index,\ end_index)\n self.conversation_canvas.tag_bind(f'{role}copy_button{index}',\ '',\ button_command)\n self.conversation_canvas.tag_config(f'{role}copy_button{index}',\ foreground='blue',\ underline=True)\n self.conversation_canvas.insert(end_index,\ button_text,\ f'{role}copy_button{index}')\n\n def\ get_message_start_index(self,\ role,\ index):\n if\ role\ ==\ 'user':\n return\ f'{len(self.user_messages)-1}.{len(self.user_messages[-1])+3}'\n elif\ role\ ==\ 'ai':\n return\ f'{len(self.user_messages)+len(self.ai_messages)}.0'\n\n def\ get_message_end_index(self,\ role,\ index):\n if\ role\ ==\ 'user':\n return\ f'{len(self.user_messages)+index+1}.0'\n elif\ role\ ==\ 'ai':\n return\ 'end-1c'\n\n def\ copy_message(self,\ index):\n if\ index.startswith('user_copy_button_'):\n message\ =\ self.user_messages[int(index.replace('user_copy_button_', ''))]\n elif\ index.startswith('ai_copy_button_'):\n message\ =\ self.ai_messages[int(index.replace('ai_copy_button_', ''))]\n\n self.root.clipboard_clear()\n self.root.clipboard_append(message)\n\n def\ send_message(self):\n # 发送用户消息并获取AI回复\n user_input\ =\ self.user_input_entry.get()\n max_tokens\ =\ self.max_tokens_entry.get()\n temperature\ =\ self.temperature_entry.get()\n\n try:\n max_tokens\ =\ int(max_tokens)\n temperature\ =\ float(temperature)\n except\ ValueError:\n messagebox.showerror("错误",\ "max_tokens和temperature必须是数字。")\n return\n\n response\ =\ openai.ChatCompletion.create(\n model="gpt-3.5-turbo-16k",\n messages=[\n {"role": "system", "content": f"用户:\ {user_input}"},\n {"role": "system", "content": f"AI:\ {self.assistant_message}"},\n {"role": "user", "content": user_input}\n ],\n max_tokens=max_tokens,\n temperature=temperature\n )\n\n ai_response\ =\ response.choices[0].message["content"]\n\n self.draw_user_message(user_input)\n self.draw_ai_message(ai_response)\n self.user_input_entry.delete(0,\ tk.END)\n self.user_input_entry.focus()\n\n def\ get_openai_response(self):\n t\ =\ threading.Thread(target=self.send_message)\n t.start()\n\n def\ clear_conversation(self):\n self.conversation_canvas.configure(state='normal')\n self.conversation_canvas.delete('1.0',\ tk.END)\n self.conversation_canvas.configure(state='disabled')\n\n self.user_messages\ =\ []\n self.ai_messages\ =\ []\n\nif\ name\ ==\ "main":\n root\ =\ tk.Tk()\n app\ =\ ChatApp(root)\n\n root.mainloop()


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

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