GPT 聊天机器人 - 使用 OpenAI API 的强大聊天工具
import tkinter as tk/nfrom tkinter import messagebox, ttk/nimport openai/nimport threading/n/n# 设置代理网址/nopenai.api_base = 'https://api.openai-proxy.com/v1'/n/ndef get_response():/n # 获取用户输入/n user_input = user_input_entry.get()/n selected_model = model_var.get()/n system_message = system_message_var.get()/n temperature = float(temperature_var.get())/n max_tokens = int(max_tokens_var.get())/n/n # 检查用户输入是否为空/n if not user_input:/n messagebox.showerror('Error', '请输入问题或内容,然后再点击发送。')/n return/n/n # 获取API密钥/n api_key = api_key_entry.get()/n/n # 初始化OpenAI/n openai.api_key = api_key/n/n # 在单独的线程中执行GPT调用/n def call_openai():/n try:/n response = openai.ChatCompletion.create(/n model=selected_model,/n messages=[/n {'role': 'system', 'content': system_message},/n {'role': 'user', 'content': user_input}/n ],/n temperature=temperature,/n max_tokens=max_tokens,/n )/n generated_text = response.choices[0].message['content']/n/n # 在对话框中添加用户输入和AI回复/n conversation_text.config(state='normal')/n conversation_text.insert(tk.END, f'用户: {user_input}//n')/n conversation_text.insert(tk.END, f'{available_models[selected_model]}: {generated_text}//n')/n conversation_text.insert(tk.END, '-' * 50 + '//n')/n conversation_text.see(tk.END) # 滚动到最底部/n conversation_text.config(state='disabled')/n # 添加复制按钮/n add_copy_button(conversation_text, f'用户: {user_input}//nAI: {generated_text}//n')/n # 清除用户输入框内容/n user_input_entry.delete(0, tk.END)/n/n except Exception as e:/n messagebox.showerror('Error', f'发生错误: {str(e)}')/n/n # 创建并启动新线程/n thread = threading.Thread(target=call_openai)/n thread.start()/n/ndef copy_text(text):/n root.clipboard_clear()/n root.clipboard_append(text)/n/n/ndef add_copy_button(conversation_text, text):/n copy_button = tk.Button(conversation_text, text='复制', font=('宋体', 12), bg='#0077c8', fg='white',/n bd=1, relief=tk.SOLID, command=lambda: copy_text(text))/n copy_button.place(x=510, y=6)/n/ndef toggle_api_key_visibility():/n global api_key_entry, api_key_visibility_button/n/n if api_key_entry['show'] == '':/n api_key_entry.config(show='')/n api_key_visibility_button.config(text='显示')/n else:/n api_key_entry.config(show='')/n api_key_visibility_button.config(text='隐藏')/ndef clear_conversation():/n conversation_text.delete('1.0', tk.END)/n/ndef save_conversation():/n conversation = conversation_text.get('1.0', tk.END).strip()/n if conversation:/n with open('conversation.txt', 'w', encoding='utf-8') as file:/n file.write(conversation)/n messagebox.showinfo('提示', '对话已保存到 conversation.txt 文件中。')/n else:/n messagebox.showinfo('提示', '对话为空,无需保存。')/n/n# 创建主窗口/nroot = tk.Tk()/nroot.title('GPT聊天机器人')/nroot.geometry('600x720') # 调整窗口大小/n/n# 更改背景颜色/nroot.configure(bg='lightblue')/n/n# 添加标题/ntitle_label = tk.Label(root, text='GPT-3.5-turbo/GPT-4', font=('Arial Bold', 20),bg='lightblue',fg='#0077c8')/ntitle_label.pack(pady=20)/n# 添加界面元素/napi_key_frame = tk.Frame(root, bg='#ffffff')/napi_key_frame.pack(pady=20)/n/napi_key_label = tk.Label(api_key_frame, text='API密钥:', font=('Arial Bold', 14), bg='lightblue',fg='#0077c8')/napi_key_label.grid(row=0, column=0, padx=5, pady=5, sticky='w')/n/napi_key_var = tk.StringVar(value='')/napi_key_entry = tk.Entry(api_key_frame, width=51, font=('宋体', 11), bd=2, relief=tk.SOLID, show='', textvariable=api_key_var)/napi_key_entry.grid(row=0, column=1, padx=5, pady=5)/n/napi_key_visibility_button = tk.Button(api_key_frame, text='显示', command=toggle_api_key_visibility, font=('黑体', 12),/n bg='#0077c8', fg='white', bd=2, relief=tk.SOLID)/napi_key_visibility_button.grid(row=0, column=2, padx=5, pady=5)/n/ninput_frame = tk.Frame(root, bg='#ffffff')/ninput_frame.pack(pady=20)/n/nuser_input_label = tk.Label(input_frame, text='您的问题或内容:', font=('Arial Bold', 14), bg='lightblue', fg='#0077c8')/nuser_input_label.grid(row=0, column=0, padx=5, pady=5, sticky='w')/n/nuser_input_entry = tk.Entry(input_frame, width=30, font=('Arial', 14), bd=2, relief=tk.SOLID)/nuser_input_entry.grid(row=0, column=1, padx=5, pady=5)/n/nsystem_message_label = tk.Label(input_frame, text='系统角色:', font=('Arial Bold', 14), bg='lightblue', fg='#0077c8')/nsystem_message_label.grid(row=1, column=0, padx=5, pady=5, sticky='w')/n/ndefault_system_message = 'You are a helpful assistant.'/nsystem_message_var = tk.StringVar(value=default_system_message)/nsystem_message_entry = tk.Entry(input_frame, textvariable=system_message_var,width=30, font=('Arial', 14), bd=2, relief=tk.SOLID)/nsystem_message_entry.grid(row=1, column=1, padx=5, pady=5)/n/nmodel_label = tk.Label(input_frame, text='选择GPT模型:', font=('Arial Bold', 14), bg='lightblue', fg='#0077c8')/nmodel_label.grid(row=2, column=0, padx=5, pady=5, sticky='w')/n/nmodel_var = tk.StringVar()/navailable_models = {/n 'gpt-3.5-turbo': 'GPT-3.5-Turbo(4097tokens)',/n 'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16k(16385tokens)',/n 'gpt-3.5-turbo-0613': 'GPT-3.5-Turbo-0613(4097tokens)',/n 'gpt-3.5-turbo-16k-0613': 'GPT-3.5-Turbo-16k-0613(16385tokens)',/n 'gpt-3.5-turbo-0301': 'GPT-3.5-Turbo-0301(4097tokens)',/n 'gpt-4':'GPT-4(8192tokens)',/n 'gpt-4-0613':'GPT-4-0613(8192tokens)',/n 'gpt-4-32k':'GPT-4-32k(32768tokens)',/n 'gpt-4-32k-0613':'GPT-4-32k-0613(32768tokens)',/n 'gpt-4-0314':'GPT-4-0314(8192tokens)',/n 'gpt-4-32k-0314':'GPT-4-32k-0314(32768tokens)'/n/n}/nmodel_dropdown = ttk.Combobox(input_frame, textvariable=model_var, values=list(available_models.keys()), font=('Arial', 12),state='readonly')/nmodel_dropdown.grid(row=2, column=1, padx=5, pady=5, sticky='w')/n/ntemperature_label = tk.Label(input_frame, text='Temperature (>=0):', font=('Arial Bold', 14), bg='lightblue', fg='#0077c8')/ntemperature_label.grid(row=3, column=0, padx=5, pady=5, sticky='w')/n/ntemperature_var = tk.StringVar(value='0.3')/ntemperature_entry = tk.Entry(input_frame, textvariable=temperature_var, font=('Arial', 14), bd=2, relief=tk.SOLID)/ntemperature_entry.grid(row=3, column=1, padx=5, pady=5)/n/nmax_tokens_label = tk.Label(input_frame, text='最大 Tokens 数量:', font=('Arial Bold', 14),bg='lightblue', fg='#0077c8')/nmax_tokens_label.grid(row=4, column=0, padx=5, pady=5, sticky='w')/n/nmax_tokens_var = tk.StringVar(value='3000')/nmax_tokens_entry = tk.Entry(input_frame, textvariable=max_tokens_var, font=('Arial', 14), bd=2, relief=tk.SOLID)/nmax_tokens_entry.grid(row=4, column=1, padx=5, pady=5)/n/nbutton_container = tk.Frame(root)/nbutton_container.pack(pady=5)/n/nsend_button = tk.Button(button_container, text='发送消息', command=get_response, font=('Arial Bold', 14), bg='#0077c8', fg='white', padx=5,/n bd=2, relief=tk.SOLID)/nsend_button.pack(side=tk.LEFT)/n/nclear_button = tk.Button(button_container, text='清除消息', command=clear_conversation, font=('Arial Bold', 14), bg='#0077c8', fg='white',/n padx=5, bd=2, relief=tk.SOLID)/nclear_button.pack(side=tk.LEFT)/n/nsave_button = tk.Button(button_container, text='保存对话', command=save_conversation, font=('Arial Bold', 14), bg='#0077c8',/n fg='white', padx=5, bd=2, relief=tk.SOLID)/nsave_button.pack(side=tk.LEFT)/n/nresponse_frame = tk.LabelFrame(root, text='聊天对话框', font=('Arial Bold', 14), bg='#ffffff', bd=2, relief=tk.SOLID)/nresponse_frame.pack(pady=10)/n/nconversation_text = tk.Text(response_frame, height=12, width=55, font=('宋体', 13), bd=2, relief=tk.SOLID, state='disabled')/nconversation_text.pack(padx=5, pady=5)/nroot.mainloop()/n/n# 出错invalid header value b'Bearersk-Jb30EZ4pQw1bfpPay8dyT3BlbkFJaL3GtmXnKxv9SbmqJz5y//n'/n# 内容:抱歉,发生了一个错误。该错误可能是由于无效的API密钥导致的。请确保您提供的API密钥是正确的,并且没有额外的空格或换行符。如果问题仍然存在,请尝试重新输入API密钥并重启应用程序。如果问题仍然无法解决,请联系OpenAI支持团队以获取进一步的帮助。/
原文地址: https://www.cveoy.top/t/topic/iRh5 著作权归作者所有。请勿转载和采集!