DragonCard/ChuanhuChatGPT
0
1# -*- coding:utf-8 -*-2import os3import logging4import sys5 6import gradio as gr7 8from utils import *9from presets import *10from overwrites import *11from chat_func import *12 13logging.basicConfig(14 level=logging.DEBUG,15 format="%(asctime)s [%(levelname)s] [%(filename)s:%(lineno)d] %(message)s",16)17 18my_api_key = "" # 在这里输入你的 API 密钥19 20# if we are running in Docker21if os.environ.get("dockerrun") == "yes":22 dockerflag = True23else:24 dockerflag = False25 26authflag = False27 28if dockerflag:29 my_api_key = os.environ.get("my_api_key")30 if my_api_key == "empty":31 logging.error("Please give a api key!")32 sys.exit(1)33 # auth34 username = os.environ.get("USERNAME")35 password = os.environ.get("PASSWORD")36 if not (isinstance(username, type(None)) or isinstance(password, type(None))):37 authflag = True38else:39 if (40 not my_api_key41 and os.path.exists("api_key.txt")42 and os.path.getsize("api_key.txt")43 ):44 with open("api_key.txt", "r") as f:45 my_api_key = f.read().strip()46 if os.path.exists("auth.json"):47 with open("auth.json", "r") as f:48 auth = json.load(f)49 username = auth["username"]50 password = auth["password"]51 if username != "" and password != "":52 authflag = True53 54gr.Chatbot.postprocess = postprocess55PromptHelper.compact_text_chunks = compact_text_chunks56 57with open("custom.css", "r", encoding="utf-8") as f:58 customCSS = f.read()59 60with gr.Blocks(61 css=customCSS,62) as demo:63 history = gr.State([])64 token_count = gr.State([])65 promptTemplates = gr.State(load_template(get_template_names(plain=True)[0], mode=2))66 user_api_key = gr.State(my_api_key)67 TRUECOMSTANT = gr.State(True)68 FALSECONSTANT = gr.State(False)69 topic = gr.State("未命名对话历史记录")70 71 with gr.Row():72 gr.HTML(title)73 status_display = gr.Markdown("status: ready", elem_id="status_display")74 75 with gr.Row(scale=1).style(equal_height=True):76 with gr.Column(scale=5):77 with gr.Row(scale=1):78 chatbot = gr.Chatbot(elem_id="chuanhu_chatbot").style(height="100%")79 with gr.Row(scale=1):80 with gr.Column(scale=12):81 user_input = gr.Textbox(82 show_label=False, placeholder="在这里输入"83 ).style(container=False)84 with gr.Column(min_width=70, scale=1):85 submitBtn = gr.Button("发送", variant="primary")86 with gr.Row(scale=1):87 emptyBtn = gr.Button(88 "🧹 新的对话",89 )90 retryBtn = gr.Button("🔄 重新生成")91 delLastBtn = gr.Button("🗑️ 删除一条对话")92 reduceTokenBtn = gr.Button("♻️ 总结对话")93 94 with gr.Column():95 with gr.Column(min_width=50, scale=1):96 with gr.Tab(label="ChatGPT"):97 keyTxt = gr.Textbox(98 show_label=True,99 placeholder=f"OpenAI API-key...",100 value=hide_middle_chars(my_api_key),101 type="password",102 visible=not HIDE_MY_KEY,103 label="API-Key(按Enter提交)",104 )105 model_select_dropdown = gr.Dropdown(106 label="选择模型", choices=MODELS, multiselect=False, value=MODELS[0]107 )108 use_streaming_checkbox = gr.Checkbox(109 label="实时传输回答", value=True, visible=enable_streaming_option110 )111 use_websearch_checkbox = gr.Checkbox(label="使用在线搜索", value=False)112 index_files = gr.Files(label="上传索引文件", type="file", multiple=True)113 114 with gr.Tab(label="Prompt"):115 systemPromptTxt = gr.Textbox(116 show_label=True,117 placeholder=f"在这里输入System Prompt...",118 label="System prompt",119 value=initial_prompt,120 lines=10,121 ).style(container=True)122 with gr.Accordion(label="加载Prompt模板", open=True):123 with gr.Column():124 with gr.Row():125 with gr.Column(scale=6):126 templateFileSelectDropdown = gr.Dropdown(127 label="选择Prompt模板集合文件",128 choices=get_template_names(plain=True),129 multiselect=False,130 value=get_template_names(plain=True)[0],131 )132 with gr.Column(scale=1):133 templateRefreshBtn = gr.Button("🔄 刷新")134 with gr.Row():135 with gr.Column():136 templateSelectDropdown = gr.Dropdown(137 label="从Prompt模板中加载",138 choices=load_template(139 get_template_names(plain=True)[0], mode=1140 ),141 multiselect=False,142 value=load_template(143 get_template_names(plain=True)[0], mode=1144 )[0],145 )146 147 with gr.Tab(label="保存/加载"):148 with gr.Accordion(label="保存/加载对话历史记录", open=True):149 with gr.Column():150 with gr.Row():151 with gr.Column(scale=6):152 historyFileSelectDropdown = gr.Dropdown(153 label="从列表中加载对话",154 choices=get_history_names(plain=True),155 multiselect=False,156 value=get_history_names(plain=True)[0],157 )158 with gr.Column(scale=1):159 historyRefreshBtn = gr.Button("🔄 刷新")160 with gr.Row():161 with gr.Column(scale=6):162 saveFileName = gr.Textbox(163 show_label=True,164 placeholder=f"设置文件名: 默认为.json,可选为.md",165 label="设置保存文件名",166 value="对话历史记录",167 ).style(container=True)168 with gr.Column(scale=1):169 saveHistoryBtn = gr.Button("💾 保存对话")170 exportMarkdownBtn = gr.Button("📝 导出为Markdown")171 gr.Markdown("默认保存于history文件夹")172 with gr.Row():173 with gr.Column():174 downloadFile = gr.File(interactive=True)175 176 with gr.Tab(label="高级"):177 default_btn = gr.Button("🔙 恢复默认设置")178 gr.Markdown("# ⚠️ 务必谨慎更改 ⚠️\n\n如果无法使用请恢复默认设置")179 180 with gr.Accordion("参数", open=False):181 top_p = gr.Slider(182 minimum=-0,183 maximum=1.0,184 value=1.0,185 step=0.05,186 interactive=True,187 label="Top-p (nucleus sampling)",188 )189 temperature = gr.Slider(190 minimum=-0,191 maximum=2.0,192 value=1.0,193 step=0.1,194 interactive=True,195 label="Temperature",196 )197 198 apiurlTxt = gr.Textbox(199 show_label=True,200 placeholder=f"在这里输入API地址...",201 label="API地址",202 value="https://api.openai.com/v1/chat/completions",203 lines=2,204 )205 changeAPIURLBtn = gr.Button("🔄 切换API地址")206 proxyTxt = gr.Textbox(207 show_label=True,208 placeholder=f"在这里输入代理地址...",209 label="代理地址(示例:http://127.0.0.1:10809)",210 value="",211 lines=2,212 )213 changeProxyBtn = gr.Button("🔄 设置代理地址")214 215 gr.Markdown(description)216 217 keyTxt.submit(submit_key, keyTxt, [user_api_key, status_display])218 keyTxt.change(submit_key, keyTxt, [user_api_key, status_display])219 # Chatbot220 user_input.submit(221 predict,222 [223 user_api_key,224 systemPromptTxt,225 history,226 user_input,227 chatbot,228 token_count,229 top_p,230 temperature,231 use_streaming_checkbox,232 model_select_dropdown,233 use_websearch_checkbox,234 index_files235 ],236 [chatbot, history, status_display, token_count],237 show_progress=True,238 )239 user_input.submit(reset_textbox, [], [user_input])240 241 submitBtn.click(242 predict,243 [244 user_api_key,245 systemPromptTxt,246 history,247 user_input,248 chatbot,249 token_count,250 top_p,251 temperature,252 use_streaming_checkbox,253 model_select_dropdown,254 use_websearch_checkbox,255 index_files256 ],257 [chatbot, history, status_display, token_count],258 show_progress=True,259 )260 submitBtn.click(reset_textbox, [], [user_input])261 262 emptyBtn.click(263 reset_state,264 outputs=[chatbot, history, token_count, status_display],265 show_progress=True,266 )267 268 retryBtn.click(269 retry,270 [271 user_api_key,272 systemPromptTxt,273 history,274 chatbot,275 token_count,276 top_p,277 temperature,278 use_streaming_checkbox,279 model_select_dropdown,280 ],281 [chatbot, history, status_display, token_count],282 show_progress=True,283 )284 285 delLastBtn.click(286 delete_last_conversation,287 [chatbot, history, token_count],288 [chatbot, history, token_count, status_display],289 show_progress=True,290 )291 292 reduceTokenBtn.click(293 reduce_token_size,294 [295 user_api_key,296 systemPromptTxt,297 history,298 chatbot,299 token_count,300 top_p,301 temperature,302 use_streaming_checkbox,303 model_select_dropdown,304 ],305 [chatbot, history, status_display, token_count],306 show_progress=True,307 )308 309 # Template310 templateRefreshBtn.click(get_template_names, None, [templateFileSelectDropdown])311 templateFileSelectDropdown.change(312 load_template,313 [templateFileSelectDropdown],314 [promptTemplates, templateSelectDropdown],315 show_progress=True,316 )317 templateSelectDropdown.change(318 get_template_content,319 [promptTemplates, templateSelectDropdown, systemPromptTxt],320 [systemPromptTxt],321 show_progress=True,322 )323 324 # S&L325 saveHistoryBtn.click(326 save_chat_history,327 [saveFileName, systemPromptTxt, history, chatbot],328 downloadFile,329 show_progress=True,330 )331 saveHistoryBtn.click(get_history_names, None, [historyFileSelectDropdown])332 exportMarkdownBtn.click(333 export_markdown,334 [saveFileName, systemPromptTxt, history, chatbot],335 downloadFile,336 show_progress=True,337 )338 historyRefreshBtn.click(get_history_names, None, [historyFileSelectDropdown])339 historyFileSelectDropdown.change(340 load_chat_history,341 [historyFileSelectDropdown, systemPromptTxt, history, chatbot],342 [saveFileName, systemPromptTxt, history, chatbot],343 show_progress=True,344 )345 downloadFile.change(346 load_chat_history,347 [downloadFile, systemPromptTxt, history, chatbot],348 [saveFileName, systemPromptTxt, history, chatbot],349 )350 351 # Advanced352 default_btn.click(353 reset_default, [], [apiurlTxt, proxyTxt, status_display], show_progress=True354 )355 changeAPIURLBtn.click(356 change_api_url,357 [apiurlTxt],358 [status_display],359 show_progress=True,360 )361 changeProxyBtn.click(362 change_proxy,363 [proxyTxt],364 [status_display],365 show_progress=True,366 )367 368logging.info(369 colorama.Back.GREEN370 + "\n川虎的温馨提示:访问 http://localhost:7860 查看界面"371 + colorama.Style.RESET_ALL372)373# 默认开启本地服务器,默认可以直接从IP访问,默认不创建公开分享链接374demo.title = "川虎ChatGPT 🚀"375 376if __name__ == "__main__":377 # if running in Docker378 if dockerflag:379 if authflag:380 demo.queue().launch(381 server_name="0.0.0.0", server_port=7860, auth=(username, password)382 )383 else:384 demo.queue().launch(server_name="0.0.0.0", server_port=7860, share=False)385 # if not running in Docker386 else:387 if authflag:388 demo.queue().launch(share=False, auth=(username, password))389 else:390 demo.queue().launch(share=False) # 改为 share=True 可以创建公开分享链接391 # demo.queue().launch(server_name="0.0.0.0", server_port=7860, share=False) # 可自定义端口392 # demo.queue().launch(server_name="0.0.0.0", server_port=7860,auth=("在这里填写用户名", "在这里填写密码")) # 可设置用户名与密码393 # demo.queue().launch(auth=("在这里填写用户名", "在这里填写密码")) # 适合Nginx反向代理394 