Spaces:
Sleeping
Sleeping
Merge branch 'dev' into Euclid-Jie-Euclid_Test
Browse files- config.py +13 -8
- crazy_functions/高级功能函数模板.py +1 -1
- functional_crazy.py +10 -3
- main.py +2 -3
- project_self_analysis.md +2 -2
- toolbox.py +21 -4
config.py
CHANGED
|
@@ -1,16 +1,15 @@
|
|
| 1 |
-
# API_KEY = "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"
|
| 2 |
API_KEY = "sk-此处填API密钥"
|
| 3 |
-
API_URL = "https://api.openai.com/v1/chat/completions"
|
| 4 |
|
| 5 |
-
|
|
|
|
| 6 |
USE_PROXY = False
|
| 7 |
if USE_PROXY:
|
| 8 |
-
|
| 9 |
-
# 填写格式是 [协议]:// [地址] :[端口] ,
|
| 10 |
# 例如 "socks5h://localhost:11284"
|
| 11 |
-
# [协议] 常见协议无非socks5h/http
|
| 12 |
# [地址] 懂的都懂,不懂就填localhost或者127.0.0.1肯定错不了(localhost意思是代理软件安装在本机上)
|
| 13 |
-
# [端口]
|
| 14 |
|
| 15 |
# 代理网络的地址,打开你的科学上网软件查看代理的协议(socks5/http)、地址(localhost)和端口(11284)
|
| 16 |
proxies = { "http": "socks5h://localhost:11284", "https": "socks5h://localhost:11284", }
|
|
@@ -19,6 +18,9 @@ else:
|
|
| 19 |
proxies = None
|
| 20 |
print('网络代理状态:未配置。无代理状态下很可能无法访问。')
|
| 21 |
|
|
|
|
|
|
|
|
|
|
| 22 |
# 发送请求到OpenAI后,等待多久判定为超时
|
| 23 |
TIMEOUT_SECONDS = 25
|
| 24 |
|
|
@@ -28,9 +30,12 @@ WEB_PORT = -1
|
|
| 28 |
# 如果OpenAI不响应(网络卡顿、代理失败、KEY失效),重试的次数限制
|
| 29 |
MAX_RETRY = 2
|
| 30 |
|
| 31 |
-
#
|
| 32 |
LLM_MODEL = "gpt-3.5-turbo"
|
| 33 |
|
|
|
|
|
|
|
|
|
|
| 34 |
# 设置并行使用的线程数
|
| 35 |
CONCURRENT_COUNT = 100
|
| 36 |
|
|
|
|
| 1 |
+
# [step 1]>> 例如: API_KEY = "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" (此key无效)
|
| 2 |
API_KEY = "sk-此处填API密钥"
|
|
|
|
| 3 |
|
| 4 |
+
|
| 5 |
+
# [step 2]>> 改为True应用代理,如果直接在海外服务器部署,此处不修改
|
| 6 |
USE_PROXY = False
|
| 7 |
if USE_PROXY:
|
| 8 |
+
# 填写格式是 [协议]:// [地址] :[端口],填写之前不要忘记把USE_PROXY改成True,如果直接在海外服务器部署,此处不修改
|
|
|
|
| 9 |
# 例如 "socks5h://localhost:11284"
|
| 10 |
+
# [协议] 常见协议无非socks5h/http; 例如 v2**y 和 ss* 的默认本地协议是socks5h; 而cl**h 的默认本地协议是http
|
| 11 |
# [地址] 懂的都懂,不懂就填localhost或者127.0.0.1肯定错不了(localhost意思是代理软件安装在本机上)
|
| 12 |
+
# [端口] 在代理软件的设置里找。虽然不同的代理软件界面不一样,但端口号都应该在最显眼的位置上
|
| 13 |
|
| 14 |
# 代理网络的地址,打开你的科学上网软件查看代理的协议(socks5/http)、地址(localhost)和端口(11284)
|
| 15 |
proxies = { "http": "socks5h://localhost:11284", "https": "socks5h://localhost:11284", }
|
|
|
|
| 18 |
proxies = None
|
| 19 |
print('网络代理状态:未配置。无代理状态下很可能无法访问。')
|
| 20 |
|
| 21 |
+
|
| 22 |
+
# [step 3]>> 以下配置可以优化体验,但大部分场合下并不需要修改
|
| 23 |
+
|
| 24 |
# 发送请求到OpenAI后,等待多久判定为超时
|
| 25 |
TIMEOUT_SECONDS = 25
|
| 26 |
|
|
|
|
| 30 |
# 如果OpenAI不响应(网络卡顿、代理失败、KEY失效),重试的次数限制
|
| 31 |
MAX_RETRY = 2
|
| 32 |
|
| 33 |
+
# OpenAI模型选择是(gpt4现在只对申请成功的人开放)
|
| 34 |
LLM_MODEL = "gpt-3.5-turbo"
|
| 35 |
|
| 36 |
+
# OpenAI的API_URL
|
| 37 |
+
API_URL = "https://api.openai.com/v1/chat/completions"
|
| 38 |
+
|
| 39 |
# 设置并行使用的线程数
|
| 40 |
CONCURRENT_COUNT = 100
|
| 41 |
|
crazy_functions/高级功能函数模板.py
CHANGED
|
@@ -5,7 +5,7 @@ import datetime
|
|
| 5 |
@CatchException
|
| 6 |
def 高阶功能模板函数(txt, top_p, temperature, chatbot, history, systemPromptTxt, WEB_PORT):
|
| 7 |
history = [] # 清空历史,以免输入溢出
|
| 8 |
-
chatbot.append(("这是什么功能?", "[Local Message]
|
| 9 |
yield chatbot, history, '正常' # 由于请求gpt需要一段时间,我们先及时地做一次状态显示
|
| 10 |
|
| 11 |
for i in range(5):
|
|
|
|
| 5 |
@CatchException
|
| 6 |
def 高阶功能模板函数(txt, top_p, temperature, chatbot, history, systemPromptTxt, WEB_PORT):
|
| 7 |
history = [] # 清空历史,以免输入溢出
|
| 8 |
+
chatbot.append(("这是什么功能?", "[Local Message] 请注意,您正在调用一个[函数插件]的模板,该函数面向希望实现更多有趣功能的开发者,它可以作为创建新功能函数的模板。为了做到简单易读,该函数只有25行代码,所以不会实时反馈文字流或心跳,请耐心等待程序输出完成。此外我们也提供可同步处理大量文件的多线程Demo供您参考。您若希望分享新的功能模组,请不吝PR!"))
|
| 9 |
yield chatbot, history, '正常' # 由于请求gpt需要一段时间,我们先及时地做一次状态显示
|
| 10 |
|
| 11 |
for i in range(5):
|
functional_crazy.py
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
|
|
|
|
|
| 1 |
# UserVisibleLevel是过滤器参数。
|
| 2 |
# 由于UI界面空间有限,所以通过这种方式决定UI界面中显示哪些插件
|
| 3 |
# 默认函数插件 VisibleLevel 是 0
|
| 4 |
# 当 UserVisibleLevel >= 函数插件的 VisibleLevel 时,该函数插件才会被显示出来
|
| 5 |
UserVisibleLevel = 1
|
| 6 |
|
|
|
|
| 7 |
def get_crazy_functionals():
|
| 8 |
from crazy_functions.读文章写摘要 import 读文章写摘要
|
| 9 |
from crazy_functions.生成函数注释 import 批量生成函数注释
|
|
@@ -16,6 +19,7 @@ def get_crazy_functionals():
|
|
| 16 |
|
| 17 |
function_plugins = {
|
| 18 |
"请解析并解构此项目本身": {
|
|
|
|
| 19 |
"Function": 解析项目本身
|
| 20 |
},
|
| 21 |
"解析整个py项目": {
|
|
@@ -39,10 +43,12 @@ def get_crazy_functionals():
|
|
| 39 |
"Function": 批量生成函数注释
|
| 40 |
},
|
| 41 |
"[多线程demo] 把本项目源代码切换成全英文": {
|
| 42 |
-
|
|
|
|
| 43 |
},
|
| 44 |
"[函数插件模板demo] 历史上的今天": {
|
| 45 |
-
|
|
|
|
| 46 |
},
|
| 47 |
}
|
| 48 |
|
|
@@ -52,7 +58,8 @@ def get_crazy_functionals():
|
|
| 52 |
function_plugins.update({
|
| 53 |
"[仅供开发调试] 批量总结PDF文档": {
|
| 54 |
"Color": "stop",
|
| 55 |
-
|
|
|
|
| 56 |
},
|
| 57 |
})
|
| 58 |
from crazy_functions.批量总结PDF文档pdfminer import 批量总结PDF文档pdfminer
|
|
|
|
| 1 |
+
from toolbox import HotReload # HotReload 的意思是热更新,修改函数插件后,不需要重启程序,代码直接生效
|
| 2 |
+
|
| 3 |
# UserVisibleLevel是过滤器参数。
|
| 4 |
# 由于UI界面空间有限,所以通过这种方式决定UI界面中显示哪些插件
|
| 5 |
# 默认函数插件 VisibleLevel 是 0
|
| 6 |
# 当 UserVisibleLevel >= 函数插件的 VisibleLevel 时,该函数插件才会被显示出来
|
| 7 |
UserVisibleLevel = 1
|
| 8 |
|
| 9 |
+
|
| 10 |
def get_crazy_functionals():
|
| 11 |
from crazy_functions.读文章写摘要 import 读文章写摘要
|
| 12 |
from crazy_functions.生成函数注释 import 批量生成函数注释
|
|
|
|
| 19 |
|
| 20 |
function_plugins = {
|
| 21 |
"请解析并解构此项目本身": {
|
| 22 |
+
# HotReload 的意思是热更新,修改函数插件后,不需要重启程序,代码直接生效
|
| 23 |
"Function": 解析项目本身
|
| 24 |
},
|
| 25 |
"解析整个py项目": {
|
|
|
|
| 43 |
"Function": 批量生成函数注释
|
| 44 |
},
|
| 45 |
"[多线程demo] 把本项目源代码切换成全英文": {
|
| 46 |
+
# HotReload 的意思是热更新,修改函数插件代码后,不需要重启程序,代码直接生效
|
| 47 |
+
"Function": HotReload(全项目切换英文)
|
| 48 |
},
|
| 49 |
"[函数插件模板demo] 历史上的今天": {
|
| 50 |
+
# HotReload 的意思是热更新,修改函数插件代码后,不需要重启程序,代码直接生效
|
| 51 |
+
"Function": HotReload(高阶功能模板函数)
|
| 52 |
},
|
| 53 |
}
|
| 54 |
|
|
|
|
| 58 |
function_plugins.update({
|
| 59 |
"[仅供开发调试] 批量总结PDF文档": {
|
| 60 |
"Color": "stop",
|
| 61 |
+
# HotReload 的意思是热更新,修改函数插件代码后,不需要重启程序,代码直接生效
|
| 62 |
+
"Function": HotReload(批量总结PDF文档)
|
| 63 |
},
|
| 64 |
})
|
| 65 |
from crazy_functions.批量总结PDF文档pdfminer import 批量总结PDF文档pdfminer
|
main.py
CHANGED
|
@@ -10,7 +10,7 @@ proxies, WEB_PORT, LLM_MODEL, CONCURRENT_COUNT, AUTHENTICATION = \
|
|
| 10 |
|
| 11 |
# 如果WEB_PORT是-1, 则随机选取WEB端口
|
| 12 |
PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT
|
| 13 |
-
|
| 14 |
|
| 15 |
initial_prompt = "Serve me as a writing and programming assistant."
|
| 16 |
title_html = """<h1 align="center">ChatGPT 学术优化</h1>"""
|
|
@@ -105,8 +105,7 @@ def auto_opentab_delay():
|
|
| 105 |
def open():
|
| 106 |
time.sleep(2)
|
| 107 |
webbrowser.open_new_tab(f'http://localhost:{PORT}')
|
| 108 |
-
|
| 109 |
-
t.daemon = True; t.start()
|
| 110 |
|
| 111 |
auto_opentab_delay()
|
| 112 |
demo.title = "ChatGPT 学术优化"
|
|
|
|
| 10 |
|
| 11 |
# 如果WEB_PORT是-1, 则随机选取WEB端口
|
| 12 |
PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT
|
| 13 |
+
if not AUTHENTICATION: AUTHENTICATION = None
|
| 14 |
|
| 15 |
initial_prompt = "Serve me as a writing and programming assistant."
|
| 16 |
title_html = """<h1 align="center">ChatGPT 学术优化</h1>"""
|
|
|
|
| 105 |
def open():
|
| 106 |
time.sleep(2)
|
| 107 |
webbrowser.open_new_tab(f'http://localhost:{PORT}')
|
| 108 |
+
threading.Thread(target=open, name="open-browser", daemon=True).start()
|
|
|
|
| 109 |
|
| 110 |
auto_opentab_delay()
|
| 111 |
demo.title = "ChatGPT 学术优化"
|
project_self_analysis.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
-
# chatgpt-academic
|
| 2 |
-
(Author补充:以下分析均由本项目调用ChatGPT
|
| 3 |
|
| 4 |
## [0/10] 程序摘要: check_proxy.py
|
| 5 |
|
|
|
|
| 1 |
+
# chatgpt-academic项目自译解报告
|
| 2 |
+
(Author补充:以下分析均由本项目调用ChatGPT一键生成,如果有不准确的地方,全怪GPT😄)
|
| 3 |
|
| 4 |
## [0/10] 程序摘要: check_proxy.py
|
| 5 |
|
toolbox.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
| 1 |
-
import markdown, mdtex2html, threading, importlib, traceback
|
| 2 |
from show_math import convert as convert_math
|
| 3 |
from functools import wraps
|
|
|
|
| 4 |
|
| 5 |
def predict_no_ui_but_counting_down(i_say, i_say_show_user, chatbot, top_p, temperature, history=[], sys_prompt=''):
|
| 6 |
"""
|
|
@@ -88,6 +89,17 @@ def CatchException(f):
|
|
| 88 |
yield chatbot, history, f'异常 {e}'
|
| 89 |
return decorated
|
| 90 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
def report_execption(chatbot, history, a, b):
|
| 92 |
"""
|
| 93 |
向chatbot中添加错误信息
|
|
@@ -226,9 +238,14 @@ def get_conf(*args):
|
|
| 226 |
except: r = getattr(importlib.import_module('config'), arg)
|
| 227 |
res.append(r)
|
| 228 |
# 在读取API_KEY时,检查一下是不是忘了改config
|
| 229 |
-
if arg=='API_KEY'
|
| 230 |
-
|
| 231 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 232 |
return res
|
| 233 |
|
| 234 |
def clear_line_break(txt):
|
|
|
|
| 1 |
+
import markdown, mdtex2html, threading, importlib, traceback, importlib, inspect
|
| 2 |
from show_math import convert as convert_math
|
| 3 |
from functools import wraps
|
| 4 |
+
import re
|
| 5 |
|
| 6 |
def predict_no_ui_but_counting_down(i_say, i_say_show_user, chatbot, top_p, temperature, history=[], sys_prompt=''):
|
| 7 |
"""
|
|
|
|
| 89 |
yield chatbot, history, f'异常 {e}'
|
| 90 |
return decorated
|
| 91 |
|
| 92 |
+
def HotReload(f):
|
| 93 |
+
"""
|
| 94 |
+
装饰器函数,实现函数插件热更新
|
| 95 |
+
"""
|
| 96 |
+
@wraps(f)
|
| 97 |
+
def decorated(*args, **kwargs):
|
| 98 |
+
fn_name = f.__name__
|
| 99 |
+
f_hot_reload = getattr(importlib.reload(inspect.getmodule(f)), fn_name)
|
| 100 |
+
yield from f_hot_reload(*args, **kwargs)
|
| 101 |
+
return decorated
|
| 102 |
+
|
| 103 |
def report_execption(chatbot, history, a, b):
|
| 104 |
"""
|
| 105 |
向chatbot中添加错误信息
|
|
|
|
| 238 |
except: r = getattr(importlib.import_module('config'), arg)
|
| 239 |
res.append(r)
|
| 240 |
# 在读取API_KEY时,检查一下是不是忘了改config
|
| 241 |
+
if arg=='API_KEY':
|
| 242 |
+
# 正确的 API_KEY 是 "sk-" + 48 位大小写字母数字的组合
|
| 243 |
+
API_MATCH = re.match(r"sk-[a-zA-Z0-9]{48}$", r)
|
| 244 |
+
if API_MATCH:
|
| 245 |
+
print("您的 API_KEY 是: ", r, "\nAPI_KEY 导入成功")
|
| 246 |
+
else:
|
| 247 |
+
assert False, "正确的 API_KEY 是 'sk-' + '48 位大小写字母数字' 的组合,请在config文件中修改API密钥, 添加海外代理之后再运行。" + \
|
| 248 |
+
"(如果您刚更新过代码,请确保旧版config_private文件中没有遗留任何新增键值)"
|
| 249 |
return res
|
| 250 |
|
| 251 |
def clear_line_break(txt):
|