From c358c956303eea1f229d65af21cbfa73baf38987 Mon Sep 17 00:00:00 2001 From: qingxu fu <505030475@qq.com> Date: Thu, 30 Mar 2023 18:01:06 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=83=AD=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- functional_crazy.py | 22 +++++++++++++--------- toolbox.py | 13 ++++++++++++- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index a281e4f..26640f7 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ https://github.com/polarwinkel/mdtex2html > > 1.请注意只有“红颜色”标识的函数插件(按钮)才支持读取文件。目前暂不能完善地支持pdf格式文献的翻译解读,尚不支持word格式文件的读取。 > -> 2.本项目中每个文件的功能都在`project_self_analysis.md`详细说明。随着版本的迭代,您也可以随时自行点击相关函数插件,调用GPT重新生成项目的自我解析报告。 +> 2.本项目中每个文件的功能都在`project_self_analysis.md`详细说明。随着版本的迭代,您也可以随时自行点击相关函数插件,调用GPT重新生成项目的自译解报告。 > > 3.如果您不太习惯部分中文命名的函数,您可以随时点击相关函数插件,调用GPT一键生成纯英文的项目源代码。 diff --git a/functional_crazy.py b/functional_crazy.py index 3f13853..889e242 100644 --- a/functional_crazy.py +++ b/functional_crazy.py @@ -1,9 +1,12 @@ +from functools import HotReload # HotReload 的意思是热更新,修改函数插件后,不需要重启程序,代码直接生效 + # UserVisibleLevel是过滤器参数。 # 由于UI界面空间有限,所以通过这种方式决定UI界面中显示哪些插件 # 默认函数插件 VisibleLevel 是 0 # 当 UserVisibleLevel >= 函数插件的 VisibleLevel 时,该函数插件才会被显示出来 UserVisibleLevel = 1 + def get_crazy_functionals(): from crazy_functions.读文章写摘要 import 读文章写摘要 from crazy_functions.生成函数注释 import 批量生成函数注释 @@ -16,33 +19,34 @@ def get_crazy_functionals(): function_plugins = { "请解析并解构此项目本身": { - "Function": 解析项目本身 + # HotReload 的意思是热更新,修改函数插件后,不需要重启程序,代码直接生效 + "Function": HotReload(解析项目本身) }, "解析整个py项目": { "Color": "stop", # 按钮颜色 - "Function": 解析一个Python项目 + "Function": HotReload(解析一个Python项目) }, "解析整个C++项目头文件": { "Color": "stop", # 按钮颜色 - "Function": 解析一个C项目的头文件 + "Function": HotReload(解析一个C项目的头文件) }, "解析整个C++项目": { "Color": "stop", # 按钮颜色 - "Function": 解析一个C项目 + "Function": HotReload(解析一个C项目) }, "读tex论文写摘要": { "Color": "stop", # 按钮颜色 - "Function": 读文章写摘要 + "Function": HotReload(读文章写摘要) }, "批量生成函数注释": { "Color": "stop", # 按钮颜色 - "Function": 批量生成函数注释 + "Function": HotReload(批量生成函数注释) }, "[多线程demo] 把本项目源代码切换成全英文": { - "Function": 全项目切换英文 + "Function": HotReload(全项目切换英文) }, "[函数插件模板demo] 历史上的今天": { - "Function": 高阶功能模板函数 + "Function": HotReload(高阶功能模板函数) }, } @@ -52,7 +56,7 @@ def get_crazy_functionals(): function_plugins.update({ "[仅供开发调试] 批量总结PDF文档": { "Color": "stop", - "Function": 批量总结PDF文档 + "Function": HotReload(批量总结PDF文档) }, }) diff --git a/toolbox.py b/toolbox.py index d96b3f6..e50b973 100644 --- a/toolbox.py +++ b/toolbox.py @@ -1,4 +1,4 @@ -import markdown, mdtex2html, threading, importlib, traceback +import markdown, mdtex2html, threading, importlib, traceback, importlib, inspect from show_math import convert as convert_math from functools import wraps @@ -88,6 +88,17 @@ def CatchException(f): yield chatbot, history, f'异常 {e}' return decorated +def HotReload(f): + """ + 装饰器函数,实现函数插件热更新 + """ + @wraps(f) + def decorated(*args, **kwargs): + fn_name = f.__name__ + f_hot_reload = getattr(importlib.reload(inspect.getmodule(f)), fn_name) + yield from f_hot_reload(*args, **kwargs) + return decorated + def report_execption(chatbot, history, a, b): """ 向chatbot中添加错误信息 From 3fe96956ce196bb33d9d364433333ac633d5bd4c Mon Sep 17 00:00:00 2001 From: qingxu fu <505030475@qq.com> Date: Thu, 30 Mar 2023 18:04:20 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=83=AD=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- functional_crazy.py | 11 ++++++++--- toolbox.py | 13 ++++++++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a281e4f..26640f7 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ https://github.com/polarwinkel/mdtex2html > > 1.请注意只有“红颜色”标识的函数插件(按钮)才支持读取文件。目前暂不能完善地支持pdf格式文献的翻译解读,尚不支持word格式文件的读取。 > -> 2.本项目中每个文件的功能都在`project_self_analysis.md`详细说明。随着版本的迭代,您也可以随时自行点击相关函数插件,调用GPT重新生成项目的自我解析报告。 +> 2.本项目中每个文件的功能都在`project_self_analysis.md`详细说明。随着版本的迭代,您也可以随时自行点击相关函数插件,调用GPT重新生成项目的自译解报告。 > > 3.如果您不太习惯部分中文命名的函数,您可以随时点击相关函数插件,调用GPT一键生成纯英文的项目源代码。 diff --git a/functional_crazy.py b/functional_crazy.py index 3f13853..67c3c4b 100644 --- a/functional_crazy.py +++ b/functional_crazy.py @@ -1,3 +1,5 @@ +from functools import HotReload # HotReload 的意思是热更新,修改函数插件后,不需要重启程序,代码直接生效 + # UserVisibleLevel是过滤器参数。 # 由于UI界面空间有限,所以通过这种方式决定UI界面中显示哪些插件 # 默认函数插件 VisibleLevel 是 0 @@ -39,10 +41,12 @@ def get_crazy_functionals(): "Function": 批量生成函数注释 }, "[多线程demo] 把本项目源代码切换成全英文": { - "Function": 全项目切换英文 + # HotReload 的意思是热更新,修改函数插件代码后,不需要重启程序,代码直接生效 + "Function": HotReload(全项目切换英文) }, "[函数插件模板demo] 历史上的今天": { - "Function": 高阶功能模板函数 + # HotReload 的意思是热更新,修改函数插件代码后,不需要重启程序,代码直接生效 + "Function": HotReload(高阶功能模板函数) }, } @@ -52,7 +56,8 @@ def get_crazy_functionals(): function_plugins.update({ "[仅供开发调试] 批量总结PDF文档": { "Color": "stop", - "Function": 批量总结PDF文档 + # HotReload 的意思是热更新,修改函数插件代码后,不需要重启程序,代码直接生效 + "Function": HotReload(批量总结PDF文档) }, }) diff --git a/toolbox.py b/toolbox.py index d96b3f6..e50b973 100644 --- a/toolbox.py +++ b/toolbox.py @@ -1,4 +1,4 @@ -import markdown, mdtex2html, threading, importlib, traceback +import markdown, mdtex2html, threading, importlib, traceback, importlib, inspect from show_math import convert as convert_math from functools import wraps @@ -88,6 +88,17 @@ def CatchException(f): yield chatbot, history, f'异常 {e}' return decorated +def HotReload(f): + """ + 装饰器函数,实现函数插件热更新 + """ + @wraps(f) + def decorated(*args, **kwargs): + fn_name = f.__name__ + f_hot_reload = getattr(importlib.reload(inspect.getmodule(f)), fn_name) + yield from f_hot_reload(*args, **kwargs) + return decorated + def report_execption(chatbot, history, a, b): """ 向chatbot中添加错误信息 From 57a668bf309c9d870572e6194bec84c772accc54 Mon Sep 17 00:00:00 2001 From: qingxu fu <505030475@qq.com> Date: Thu, 30 Mar 2023 18:21:17 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E8=87=AA=E8=AF=91=E8=A7=A3=E6=8A=A5?= =?UTF-8?q?=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project_self_analysis.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project_self_analysis.md b/project_self_analysis.md index c817421..f0a544e 100644 --- a/project_self_analysis.md +++ b/project_self_analysis.md @@ -1,5 +1,5 @@ -# chatgpt-academic项目分析报告 -(Author补充:以下分析均由本项目调用ChatGPT一键生成,如果有不准确的地方全怪GPT) +# chatgpt-academic项目自译解报告 +(Author补充:以下分析均由本项目调用ChatGPT一键生成,如果有不准确的地方,全怪GPT😄) ## [0/10] 程序摘要: check_proxy.py From e3e4fa19a22742839a5cca525bf422a458f32838 Mon Sep 17 00:00:00 2001 From: fulyaec Date: Fri, 31 Mar 2023 16:24:40 +0800 Subject: [PATCH 4/9] refactor and enhance --- main.py | 5 ++--- toolbox.py | 9 +++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/main.py b/main.py index c69795a..3033e39 100644 --- a/main.py +++ b/main.py @@ -10,7 +10,7 @@ proxies, WEB_PORT, LLM_MODEL, CONCURRENT_COUNT, AUTHENTICATION = \ # 如果WEB_PORT是-1, 则随机选取WEB端口 PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT -AUTHENTICATION = None if AUTHENTICATION == [] else AUTHENTICATION +if not AUTHENTICATION: AUTHENTICATION = None initial_prompt = "Serve me as a writing and programming assistant." title_html = """

ChatGPT 学术优化

""" @@ -105,8 +105,7 @@ def auto_opentab_delay(): def open(): time.sleep(2) webbrowser.open_new_tab(f'http://localhost:{PORT}') - t = threading.Thread(target=open) - t.daemon = True; t.start() + threading.Thread(target=open, name="open-browser", daemon=True).start() auto_opentab_delay() demo.title = "ChatGPT 学术优化" diff --git a/toolbox.py b/toolbox.py index d96b3f6..326740a 100644 --- a/toolbox.py +++ b/toolbox.py @@ -226,13 +226,10 @@ def get_conf(*args): except: r = getattr(importlib.import_module('config'), arg) res.append(r) # 在读取API_KEY时,检查一下是不是忘了改config - if arg=='API_KEY' and len(r) != 51: - assert False, "正确的API_KEY密钥是51位,请在config文件中修改API密钥, 添加海外代理之后再运行。" + \ + assert arg != 'API_KEY' or len(r) == 51, "正确的API_KEY密钥是51位,请在config文件中修改API密钥, 添加海外代理之后再运行。" \ "(如果您刚更新过代码,请确保旧版config_private文件中没有遗留任何新增键值)" return res def clear_line_break(txt): - txt = txt.replace('\n', ' ') - txt = txt.replace(' ', ' ') - txt = txt.replace(' ', ' ') - return txt \ No newline at end of file + import re + return re.sub(r"\s+", " ", txt) \ No newline at end of file From 808e23c98af2e88a0259ae84001ed31a3e5fb990 Mon Sep 17 00:00:00 2001 From: Jia Xinglong Date: Fri, 31 Mar 2023 17:38:39 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20re=20=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E7=9A=84=20match=20=E5=87=BD=E6=95=B0=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E6=9B=B4=E7=B2=BE=E5=87=86=E7=9A=84=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E5=92=8C=E7=A1=AE=E8=AE=A4=20API=5FKEY=20=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- toolbox.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/toolbox.py b/toolbox.py index d96b3f6..75dd8bc 100644 --- a/toolbox.py +++ b/toolbox.py @@ -1,6 +1,7 @@ import markdown, mdtex2html, threading, importlib, traceback from show_math import convert as convert_math from functools import wraps +import re def predict_no_ui_but_counting_down(i_say, i_say_show_user, chatbot, top_p, temperature, history=[], sys_prompt=''): """ @@ -226,9 +227,14 @@ def get_conf(*args): except: r = getattr(importlib.import_module('config'), arg) res.append(r) # 在读取API_KEY时,检查一下是不是忘了改config - if arg=='API_KEY' and len(r) != 51: - assert False, "正确的API_KEY密钥是51位,请在config文件中修改API密钥, 添加海外代理之后再运行。" + \ - "(如果您刚更新过代码,请确保旧版config_private文件中没有遗留任何新增键值)" + if arg=='API_KEY': + # 正确的 API_KEY 是 "sk-" + 48 位大小写字母数字的组合 + API_MATCH = re.match(r"sk-[a-zA-Z0-9]{48}$", r) + if API_MATCH: + print("您的 API_KEY 是: ", r, "\nAPI_KEY 导入成功") + else: + assert False, "正确的 API_KEY 是 'sk-' + '48 位大小写字母数字' 的组合,请在config文件中修改API密钥, 添加海外代理之后再运行。" + \ + "(如果您刚更新过代码,请确保旧版config_private文件中没有遗留任何新增键值)" return res def clear_line_break(txt): From ac9e72b9f85ccfae0c6d7f1d2cc593b1c946d681 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 31 Mar 2023 19:46:01 +0800 Subject: [PATCH 6/9] revert toolbox --- toolbox.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/toolbox.py b/toolbox.py index d657c1f..e50b973 100644 --- a/toolbox.py +++ b/toolbox.py @@ -237,10 +237,13 @@ def get_conf(*args): except: r = getattr(importlib.import_module('config'), arg) res.append(r) # 在读取API_KEY时,检查一下是不是忘了改config - assert arg != 'API_KEY' or len(r) == 51, "正确的API_KEY密钥是51位,请在config文件中修改API密钥, 添加海外代理之后再运行。" \ + if arg=='API_KEY' and len(r) != 51: + assert False, "正确的API_KEY密钥是51位,请在config文件中修改API密钥, 添加海外代理之后再运行。" + \ "(如果您刚更新过代码,请确保旧版config_private文件中没有遗留任何新增键值)" return res def clear_line_break(txt): - import re - return re.sub(r"\s+", " ", txt) \ No newline at end of file + txt = txt.replace('\n', ' ') + txt = txt.replace(' ', ' ') + txt = txt.replace(' ', ' ') + return txt \ No newline at end of file From 0abb84ae4bfbaf6a95defcb7ad51ea38b9b27f9d Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 31 Mar 2023 20:02:12 +0800 Subject: [PATCH 7/9] =?UTF-8?q?config=E6=96=B0=E5=A2=9E=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/config.py b/config.py index 7fc73db..72309e7 100644 --- a/config.py +++ b/config.py @@ -1,16 +1,15 @@ -# API_KEY = "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" 此key无效 +# [step 1]>> 例如: API_KEY = "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" (此key无效) API_KEY = "sk-此处填API密钥" -API_URL = "https://api.openai.com/v1/chat/completions" -# 改为True应用代理 + +# [step 2]>> 改为True应用代理,如果直接在海外服务器部署,此处不修改 USE_PROXY = False if USE_PROXY: - - # 填写格式是 [协议]:// [地址] :[端口] , + # 填写格式是 [协议]:// [地址] :[端口],填写之前不要忘记把USE_PROXY改成True,如果直接在海外服务器部署,此处不修改 # 例如 "socks5h://localhost:11284" - # [协议] 常见协议无非socks5h/http,例如 v2*** 和 s** 的默认本地协议是socks5h,cl**h 的默认本地协议是http + # [协议] 常见协议无非socks5h/http; 例如 v2**y 和 ss* 的默认本地协议是socks5h; 而cl**h 的默认本地协议是http # [地址] 懂的都懂,不懂就填localhost或者127.0.0.1肯定错不了(localhost意思是代理软件安装在本机上) - # [端口] 在代理软件的设置里,不同的代理软件界面不一样,但端口号都应该在最显眼的位置上 + # [端口] 在代理软件的设置里找。虽然不同的代理软件界面不一样,但端口号都应该在最显眼的位置上 # 代理网络的地址,打开你的科学上网软件查看代理的协议(socks5/http)、地址(localhost)和端口(11284) proxies = { "http": "socks5h://localhost:11284", "https": "socks5h://localhost:11284", } @@ -19,6 +18,9 @@ else: proxies = None print('网络代理状态:未配置。无代理状态下很可能无法访问。') + +# [step 3]>> 以下配置可以优化体验,但大部分场合下并不需要修改 + # 发送请求到OpenAI后,等待多久判定为超时 TIMEOUT_SECONDS = 25 @@ -28,9 +30,12 @@ WEB_PORT = -1 # 如果OpenAI不响应(网络卡顿、代理失败、KEY失效),重试的次数限制 MAX_RETRY = 2 -# 选择的OpenAI模型是(gpt4现在只对申请成功的人开放) +# OpenAI模型选择是(gpt4现在只对申请成功的人开放) LLM_MODEL = "gpt-3.5-turbo" +# OpenAI的API_URL +API_URL = "https://api.openai.com/v1/chat/completions" + # 设置并行使用的线程数 CONCURRENT_COUNT = 100 From 9ee5545ad551413873b292d54e570bf1e2482c99 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 31 Mar 2023 20:05:31 +0800 Subject: [PATCH 8/9] fix import error --- functional_crazy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functional_crazy.py b/functional_crazy.py index 861aae5..6f455ec 100644 --- a/functional_crazy.py +++ b/functional_crazy.py @@ -1,4 +1,4 @@ -from functools import HotReload # HotReload 的意思是热更新,修改函数插件后,不需要重启程序,代码直接生效 +from toolbox import HotReload # HotReload 的意思是热更新,修改函数插件后,不需要重启程序,代码直接生效 # UserVisibleLevel是过滤器参数。 # 由于UI界面空间有限,所以通过这种方式决定UI界面中显示哪些插件 From 77a98f03d067556a06949e64e28e617b9f0a8347 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 31 Mar 2023 20:12:27 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crazy_functions/高级功能函数模板.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crazy_functions/高级功能函数模板.py b/crazy_functions/高级功能函数模板.py index 4cf1cb9..ec14e74 100644 --- a/crazy_functions/高级功能函数模板.py +++ b/crazy_functions/高级功能函数模板.py @@ -5,7 +5,7 @@ import datetime @CatchException def 高阶功能模板函数(txt, top_p, temperature, chatbot, history, systemPromptTxt, WEB_PORT): history = [] # 清空历史,以免输入溢出 - chatbot.append(("这是什么功能?", "[Local Message] 请注意,您正在调用一个函数模板,该函数面向希望实现更多有趣功能的开发者,它可以作为创建新功能函数的模板。为了做到简单易读,该函数只有25行代码,不会实时反馈文字流或心跳,请耐心等待程序输出完成。另外您若希望分享新的功能模组,请不吝PR!")) + chatbot.append(("这是什么功能?", "[Local Message] 请注意,您正在调用一个[函数插件]的模板,该函数面向希望实现更多有趣功能的开发者,它可以作为创建新功能函数的模板。为了做到简单易读,该函数只有25行代码,所以不会实时反馈文字流或心跳,请耐心等待程序输出完成。此外我们也提供可同步处理大量文件的多线程Demo供您参考。您若希望分享新的功能模组,请不吝PR!")) yield chatbot, history, '正常' # 由于请求gpt需要一段时间,我们先及时地做一次状态显示 for i in range(5):