binary-husky commited on
Commit
e04d57c
2 Parent(s): 77e3456 0b03c79

Merge pull request #198 from oneLuckyman/feature-match-API_KEY

Browse files
Files changed (7) hide show
  1. README.md +68 -25
  2. check_proxy.py +4 -3
  3. config.py +1 -6
  4. functional.py +31 -36
  5. main.py +13 -13
  6. predict.py +7 -4
  7. toolbox.py +32 -8
README.md CHANGED
@@ -1,3 +1,5 @@
 
 
1
  # ChatGPT 学术优化
2
 
3
  **如果喜欢这个项目,请给它一个Star;如果你发明了更好用的学术快捷键,欢迎发issue或者pull requests**
@@ -16,6 +18,14 @@ https://github.com/polarwinkel/mdtex2html
16
  项目使用OpenAI的gpt-3.5-turbo模型,期待gpt-4早点放宽门槛😂
17
  ```
18
 
 
 
 
 
 
 
 
 
19
  <div align="center">
20
 
21
  功能 | 描述
@@ -34,12 +44,13 @@ chat分析报告生成 | [实验性功能] 运行后自动生成总结汇报
34
  公式显示 | 可以同时显示公式的tex形式和渲染形式
35
  图片显示 | 可以在markdown中显示图片
36
  支持GPT输出的markdown表格 | 可以输出支持GPT的markdown表格
 
37
 
38
  </div>
39
 
40
  - 新界面
41
  <div align="center">
42
- <img src="https://user-images.githubusercontent.com/96192199/227851398-fab5a158-aaf6-4151-95ac-a8172ce611c7.png" width="700" >
43
  </div>
44
 
45
 
@@ -71,33 +82,57 @@ chat分析报告生成 | [实验性功能] 运行后自动生成总结汇报
71
  <img src="https://user-images.githubusercontent.com/96192199/226935232-6b6a73ce-8900-4aee-93f9-733c7e6fef53.png" width="700" >
72
  </div>
73
 
74
- ## 直接运行 (Windows or Linux or MacOS)
75
 
76
- ``` sh
77
- # 下载项目
78
  git clone https://github.com/binary-husky/chatgpt_academic.git
79
  cd chatgpt_academic
80
- # 在config.py中,配置 海外Proxy 和 OpenAI API KEY
81
- - 1.如果你在国内,需要设置海外代理才能够使用 OpenAI API,你可以通过 config.py 文件来进行设置。
82
- - 2.配置 OpenAI API KEY。你需要在 OpenAI 官网上注册并获取 API KEY。一旦你拿到了 API KEY,在 config.py 文件里配置好即可。
83
- # 安装依赖
84
- python -m pip install -r requirements.txt
85
- # 运行
86
- python main.py
87
 
88
- # 测试实验性功能
89
- ## 测试C++项目头文件分析
90
- input区域 输入 ./crazy_functions/test_project/cpp/libJPG 然后点击 "[实验] 解析整个C++项目(input输入项目根路径)"
91
- ## 测试给Latex项目写摘要
92
- input区域 输入 ./crazy_functions/test_project/latex/attention 然后点击 "[实验] 读tex论文写摘要(input输入项目根路径)"
93
- ## 测试Python项目分析
94
- input区域 输入 ./crazy_functions/test_project/python/dqn , 然后点击 "[实验] 解析整个py项目(input输入项目根路径)"
95
- ## 测试自我代码解读
96
- 点击 "[实验] 请解析并解构此项目本身"
97
- ## 测试实验功能模板函数(要求gpt回答几个数的平方是什么),您可以根据此函数为模板,实现更复杂的功能
98
- 点击 "[实验] 实验功能函数模板"
99
  ```
 
 
 
 
 
 
 
100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
  ## 使用docker (Linux)
103
 
@@ -115,7 +150,7 @@ docker run --rm -it --net=host gpt-academic
115
  # 测试实验性功能
116
  ## 测试自我代码解读
117
  点击 "[实验] 请解析并解构此项目本身"
118
- ## 测试实验功能模板函数(要求gpt回答几个数的平方是什么),您可以根据此函数为模板,实现更复杂的功能
119
  点击 "[实验] 实验功能函数模板"
120
  ##(请注意在docker中运行时,需要额外注意程序的文件访问权限问题)
121
  ## 测试C++项目头文件分析
@@ -127,6 +162,13 @@ input区域 输入 ./crazy_functions/test_project/python/dqn , 然后点击 "[
127
 
128
  ```
129
 
 
 
 
 
 
 
 
130
 
131
  ## 自定义新的便捷按钮(学术快捷键自定义)
132
  打开functional.py,添加条目如下,然后重启程序即可。(如果按钮已经添加成功并可见,那么前缀、后缀都支持热修改,无需重启程序即可生效。)
@@ -166,11 +208,12 @@ python check_proxy.py
166
  ## 兼容性测试
167
 
168
  ### 图片显示:
 
169
  <div align="center">
170
- <img src="https://user-images.githubusercontent.com/96192199/226906087-b5f1c127-2060-4db9-af05-487643b21ed9.png" height="200" >
171
- <img src="https://user-images.githubusercontent.com/96192199/226906703-7226495d-6a1f-4a53-9728-ce6778cbdd19.png" height="200" >
172
  </div>
173
 
 
174
  ### 如果一个程序能够读懂并剖析自己:
175
 
176
  <div align="center">
 
1
+
2
+
3
  # ChatGPT 学术优化
4
 
5
  **如果喜欢这个项目,请给它一个Star;如果你发明了更好用的学术快捷键,欢迎发issue或者pull requests**
 
18
  项目使用OpenAI的gpt-3.5-turbo模型,期待gpt-4早点放宽门槛😂
19
  ```
20
 
21
+ > **Note**
22
+ >
23
+ > 1.请注意只有“红颜色”标识的函数插件(按钮)才支持读取文件。目前暂不能完善地支持pdf格式文献的翻译解读,尚不支持word格式文件的读取。
24
+ >
25
+ > 2.本项目中每个文件的功能都在自译解[`project_self_analysis.md`](https://github.com/binary-husky/chatgpt_academic/wiki/chatgpt-academic%E9%A1%B9%E7%9B%AE%E8%87%AA%E8%AF%91%E8%A7%A3%E6%8A%A5%E5%91%8A)详细说明。随着版本的迭代,您也可以随时自行点击相关函数插件,调用GPT重新生成项目的自我解析报告。常见问题汇总在[`wiki`](https://github.com/binary-husky/chatgpt_academic/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)当中。
26
+ >
27
+ > 3.如果您不太习惯部分中文命名的函数,您可以随时点击相关函数插件,调用GPT一键生成纯英文的项目源代码。
28
+
29
  <div align="center">
30
 
31
  功能 | 描述
 
44
  公式显示 | 可以同时显示公式的tex形式和渲染形式
45
  图片显示 | 可以在markdown中显示图片
46
  支持GPT输出的markdown表格 | 可以输出支持GPT的markdown表格
47
+ …… | ……
48
 
49
  </div>
50
 
51
  - 新界面
52
  <div align="center">
53
+ <img src="https://user-images.githubusercontent.com/96192199/228600410-7d44e34f-63f1-4046-acb8-045cb05da8bb.png" width="700" >
54
  </div>
55
 
56
 
 
82
  <img src="https://user-images.githubusercontent.com/96192199/226935232-6b6a73ce-8900-4aee-93f9-733c7e6fef53.png" width="700" >
83
  </div>
84
 
85
+ ## 直接运行 (Windows, Linux or MacOS)
86
 
87
+ ### 1. 下载项目
88
+ ```sh
89
  git clone https://github.com/binary-husky/chatgpt_academic.git
90
  cd chatgpt_academic
91
+ ```
 
 
 
 
 
 
92
 
93
+ ### 2. 配置API_KEY和代理设置
94
+
95
+ 在`config.py`中,配置 海外Proxy OpenAI API KEY,说明如下
96
+ ```
97
+ 1. 如果你在国内,需要设置海外代理才能够顺利使用 OpenAI API,设置方法请仔细阅读config.py(1.修改其中的USE_PROXY为True; 2.按照说明修改其中的proxies)。
98
+ 2. 配置 OpenAI API KEY。你需要在 OpenAI 官网上注册并获取 API KEY。一旦你拿到了 API KEY,在 config.py 文件里配置好即可。
99
+ 3. 与代理网络有关的issue(网络超时、代理不起作用)汇总到 https://github.com/binary-husky/chatgpt_academic/issues/1
 
 
 
 
100
  ```
101
+ (P.S. 程序运行时会优先检查是否存在名为`config_private.py`的私密配置文件,并用其中的配置覆盖`config.py`的同名配置。因此,如果您能理解我们的配置读取逻辑,我们强烈建议您在`config.py`旁边创建一个名为`config_private.py`的新配置文件,并把`config.py`中的配置转移(复制)到`config_private.py`中。`config_private.py`不受git管控,可以让您的隐私信息更加安全。)
102
+
103
+
104
+ ### 3. 安装依赖
105
+ ```sh
106
+ # (选择一)推荐
107
+ python -m pip install -r requirements.txt
108
 
109
+ # (选择二)如果您使用anaconda,步骤也是类似的:
110
+ # (选择二.1)conda create -n gptac_venv python=3.11
111
+ # (选择二.2)conda activate gptac_venv
112
+ # (选择二.3)python -m pip install -r requirements.txt
113
+
114
+ # 备注:使用官方pip源或者阿里pip源,其他pip源(如清华pip)有可能出问题,临时换源方法:
115
+ # python -m pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
116
+ ```
117
+
118
+ ### 4. 运行
119
+ ```sh
120
+ python main.py
121
+ ```
122
+
123
+ ### 5. 测试实验性功能
124
+ ```
125
+ - 测试C++项目头文件分析
126
+ input区域 输入 `./crazy_functions/test_project/cpp/libJPG` , 然后点击 "[实验] 解析整个C++项目(input输入项目根路径)"
127
+ - 测试给Latex项目写摘要
128
+ input区域 输入 `./crazy_functions/test_project/latex/attention` , 然后点击 "[实验] 读tex论文写摘要(input输入项目根路径)"
129
+ - 测试Python项目分析
130
+ input区域 输入 `./crazy_functions/test_project/python/dqn` , 然后点击 "[实验] 解析整个py项目(input输入项目根路径)"
131
+ - 测试自我代码解读
132
+ 点击 "[实验] 请解析并解构此项目本身"
133
+ - 测试实验功能模板函数(要求gpt回答历史上的今天发生了什么),您可以根据此函数为模板,实现更复杂的功能
134
+ 点击 "[实验] 实验功能函数模板"
135
+ ```
136
 
137
  ## 使用docker (Linux)
138
 
 
150
  # 测试实验性功能
151
  ## 测试自我代码解读
152
  点击 "[实验] 请解析并解构此项目本身"
153
+ ## 测试实验功能模板函数(要求gpt回答历史上的今天发生了什么),您可以根据此函数为模板,实现更复杂的功能
154
  点击 "[实验] 实验功能函数模板"
155
  ##(请注意在docker中运行时,需要额外注意程序的文件访问权限问题)
156
  ## 测试C++项目头文件分析
 
162
 
163
  ```
164
 
165
+ ## 其他部署方式
166
+ - 使用WSL2(Windows Subsystem for Linux 子系统)
167
+ 请访问[部署wiki-1](https://github.com/binary-husky/chatgpt_academic/wiki/%E4%BD%BF%E7%94%A8WSL2%EF%BC%88Windows-Subsystem-for-Linux-%E5%AD%90%E7%B3%BB%E7%BB%9F%EF%BC%89%E9%83%A8%E7%BD%B2)
168
+
169
+ - nginx远程部署
170
+ 请访问[部署wiki-2](https://github.com/binary-husky/chatgpt_academic/wiki/%E8%BF%9C%E7%A8%8B%E9%83%A8%E7%BD%B2%E7%9A%84%E6%8C%87%E5%AF%BC)
171
+
172
 
173
  ## 自定义新的便捷按钮(学术快捷键自定义)
174
  打开functional.py,添加条目如下,然后重启程序即可。(如果按钮已经添加成功并可见,那么前缀、后缀都支持热修改,无需重启程序即可生效。)
 
208
  ## 兼容性测试
209
 
210
  ### 图片显示:
211
+
212
  <div align="center">
213
+ <img src="https://user-images.githubusercontent.com/96192199/228737599-bf0a9d9c-1808-4f43-ae15-dfcc7af0f295.png" width="800" >
 
214
  </div>
215
 
216
+
217
  ### 如果一个程序能够读懂并剖析自己:
218
 
219
  <div align="center">
check_proxy.py CHANGED
@@ -21,6 +21,7 @@ def check_proxy(proxies):
21
 
22
  if __name__ == '__main__':
23
  import os; os.environ['no_proxy'] = '*' # 避免代理网络产生意外污染
24
- try: from config_private import proxies # 放自己的秘密如API和代理网址 os.path.exists('config_private.py')
25
- except: from config import proxies
26
- check_proxy(proxies)
 
 
21
 
22
  if __name__ == '__main__':
23
  import os; os.environ['no_proxy'] = '*' # 避免代理网络产生意外污染
24
+ from toolbox import get_conf
25
+ proxies, = get_conf('proxies')
26
+ check_proxy(proxies)
27
+
config.py CHANGED
@@ -1,5 +1,5 @@
1
  # API_KEY = "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" 此key无效
2
- API_KEY = "sk-此处填API秘钥"
3
  API_URL = "https://api.openai.com/v1/chat/completions"
4
 
5
  # 改为True应用代理
@@ -36,8 +36,3 @@ CONCURRENT_COUNT = 100
36
 
37
  # 设置用户名和密码
38
  AUTHENTICATION = [] # [("username", "password"), ("username2", "password2"), ...]
39
-
40
- # 检查一下是不是忘了改config
41
- if len(API_KEY) != 51:
42
- assert False, "正确的API_KEY密钥是51位,请在config文件中修改API密钥, 添加海外代理之后再运行。" + \
43
- "(如果您刚更新过代码,请确保旧版config_private文件中没有遗留任何新增键值)"
 
1
  # API_KEY = "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" 此key无效
2
+ API_KEY = "sk-此处填API密钥"
3
  API_URL = "https://api.openai.com/v1/chat/completions"
4
 
5
  # 改为True应用代理
 
36
 
37
  # 设置用户名和密码
38
  AUTHENTICATION = [] # [("username", "password"), ("username2", "password2"), ...]
 
 
 
 
 
functional.py CHANGED
@@ -2,58 +2,53 @@
2
  # 'secondary' 颜色对应 theme.py 中的 neutral_hue
3
  # 'stop' 颜色对应 theme.py 中的 color_er
4
  # 默认按钮颜色是 secondary
 
5
 
6
  def get_functionals():
7
  return {
8
  "英语学术润色": {
9
- "Prefix": "Below is a paragraph from an academic paper. Polish the writing to meet the academic style, \
10
- improve the spelling, grammar, clarity, concision and overall readability. When neccessary, rewrite the whole sentence. \
11
- Furthermore, list all modification and explain the reasons to do so in markdown table.\n\n", # 前言
12
- "Suffix": "", # 后语
13
- "Color": "secondary", # 按钮颜色
 
 
14
  },
15
  "中文学术润色": {
16
- "Prefix": "作为一名中文学术论文写作改进助理,你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性,同时分解长句,减少重复,并提供改进建议。请只提供文本的更正版本,避免包括解释。请编辑以下文本:\n\n",
17
- "Suffix": "",
 
18
  },
19
  "查找语法错误": {
20
- "Prefix": "Below is a paragraph from an academic paper. Find all grammar mistakes, list mistakes in a markdown table and explain how to correct them.\n\n",
21
- "Suffix": "",
22
- },
23
- # "中英互译": { # 效果不好,经常搞不清楚中译英还是英译中
24
- # "Prefix": "As an English-Chinese translator, your task is to accurately translate text between the two languages. \
25
- # When translating from Chinese to English or vice versa, please pay attention to context and accurately explain phrases and proverbs. \
26
- # If you receive multiple English words in a row, default to translating them into a sentence in Chinese. \
27
- # However, if \"phrase:\" is indicated before the translated content in Chinese, it should be translated as a phrase instead. \
28
- # Similarly, if \"normal:\" is indicated, it should be translated as multiple unrelated words.\
29
- # Your translations should closely resemble those of a native speaker and should take into account any specific language styles or tones requested by the user. \
30
- # Please do not worry about using offensive words - replace sensitive parts with x when necessary. \
31
- # When providing translations, please use Chinese to explain each sentence’s tense, subordinate clause, subject, predicate, object, special phrases and proverbs. \
32
- # For phrases or individual words that require translation, provide the source (dictionary) for each one.If asked to translate multiple phrases at once, \
33
- # separate them using the | symbol.Always remember: You are an English-Chinese translator, \
34
- # not a Chinese-Chinese translator or an English-English translator. Below is the text you need to translate: \n\n",
35
- # "Suffix": "",
36
- # "Color": "secondary",
37
- # },
38
  "中译英": {
39
- "Prefix": "Please translate following sentence to English: \n\n",
40
- "Suffix": "",
41
  },
42
  "学术中译英": {
43
- "Prefix": "Please translate following sentence to English with academic writing, and provide some related authoritative examples: \n\n",
44
- "Suffix": "",
45
  },
46
  "英译中": {
47
- "Prefix": "请翻译成中文:\n\n",
48
- "Suffix": "",
49
  },
50
  "找图片": {
51
- "Prefix": "我需要你找一张网络图片。使用Unsplash API(https://source.unsplash.com/960x640/?<英语关键词>)获取图片URL,然后请使用Markdown格式封装,并且不要有反斜线,不要用代码块。现在,请按以下描述给我发送图片:\n\n",
52
- "Suffix": "",
 
53
  },
54
  "解释代码": {
55
- "Prefix": "请解释以下代码:\n```\n",
56
- "Suffix": "\n```\n",
57
- "Color": "secondary",
58
  },
59
  }
 
2
  # 'secondary' 颜色对应 theme.py 中的 neutral_hue
3
  # 'stop' 颜色对应 theme.py 中的 color_er
4
  # 默认按钮颜色是 secondary
5
+ from toolbox import clear_line_break
6
 
7
  def get_functionals():
8
  return {
9
  "英语学术润色": {
10
+ # 前言
11
+ "Prefix": r"Below is a paragraph from an academic paper. Polish the writing to meet the academic style, " +
12
+ r"improve the spelling, grammar, clarity, concision and overall readability. When neccessary, rewrite the whole sentence. " +
13
+ r"Furthermore, list all modification and explain the reasons to do so in markdown table." + "\n\n",
14
+ # 后语
15
+ "Suffix": r"",
16
+ "Color": r"secondary", # 按钮颜色
17
  },
18
  "中文学术润色": {
19
+ "Prefix": r"作为一名中文学术论文写作改进助理,你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性," +
20
+ r"同时分解长句,减少重复,并提供改进建议。请只提供文本的更正版本,避免包括解释。请编辑以下文本" + "\n\n",
21
+ "Suffix": r"",
22
  },
23
  "查找语法错误": {
24
+ "Prefix": r"Below is a paragraph from an academic paper. " +
25
+ r"Can you help me ensure that the grammar and the spelling is correct? " +
26
+ r"Do not try to polish the text, if no mistake is found, tell me that this paragraph is good." +
27
+ r"If you find grammar or spelling mistakes, please list mistakes you find in a two-column markdown table, " +
28
+ r"put the original text the first column, " +
29
+ r"put the corrected text in the second column and highlight the key words you fixed." + "\n\n",
30
+ "Suffix": r"",
31
+ "PreProcess": clear_line_break, # 预处理:清除换行符
32
+ },
 
 
 
 
 
 
 
 
 
33
  "中译英": {
34
+ "Prefix": r"Please translate following sentence to English:" + "\n\n",
35
+ "Suffix": r"",
36
  },
37
  "学术中译英": {
38
+ "Prefix": r"Please translate following sentence to English with academic writing, and provide some related authoritative examples:" + "\n\n",
39
+ "Suffix": r"",
40
  },
41
  "英译中": {
42
+ "Prefix": r"请翻译成中文:" + "\n\n",
43
+ "Suffix": r"",
44
  },
45
  "找图片": {
46
+ "Prefix": r"我需要你找一张网络图片。使用Unsplash API(https://source.unsplash.com/960x640/?<英语关键词>)获取图片URL" +
47
+ r"然后请使用Markdown格式封装,并且不要有反斜线,不要用代码块。现在,请按以下描述给我发送图片:" + "\n\n",
48
+ "Suffix": r"",
49
  },
50
  "解释代码": {
51
+ "Prefix": r"请解释以下代码:" + "\n```\n",
52
+ "Suffix": "\n```\n",
 
53
  },
54
  }
main.py CHANGED
@@ -1,11 +1,12 @@
1
  import os; os.environ['no_proxy'] = '*' # 避免代理网络产生意外污染
2
  import gradio as gr
3
  from predict import predict
4
- from toolbox import format_io, find_free_port, on_file_uploaded, on_report_generated
5
 
6
  # 建议您复制一个config_private.py放自己的秘密, 如API和代理网址, 避免不小心传github被别人看到
7
- try: from config_private import proxies, WEB_PORT, LLM_MODEL, CONCURRENT_COUNT, AUTHENTICATION
8
- except: from config import proxies, WEB_PORT, LLM_MODEL, CONCURRENT_COUNT, AUTHENTICATION
 
9
 
10
  # 如果WEB_PORT是-1, 则随机选取WEB端口
11
  PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT
@@ -42,18 +43,17 @@ with gr.Blocks(theme=set_theme, analytics_enabled=False) as demo:
42
  with gr.Row():
43
  with gr.Column(scale=2):
44
  chatbot = gr.Chatbot()
45
- chatbot.style(height=1000)
46
  chatbot.style()
47
  history = gr.State([])
48
  with gr.Column(scale=1):
49
  with gr.Row():
50
- with gr.Column(scale=12):
51
- txt = gr.Textbox(show_label=False, placeholder="Input question here.").style(container=False)
52
- with gr.Column(scale=1):
53
- with gr.Row():
54
- resetBtn = gr.Button("重置", variant="secondary")
55
- stopBtn = gr.Button("停止", variant="secondary")
56
- submitBtn = gr.Button("提交", variant="primary")
57
  with gr.Row():
58
  from check_proxy import check_proxy
59
  statusDisplay = gr.Markdown(f"Tip: 按Enter提交, 按Shift+Enter换行。当前模型: {LLM_MODEL} \n {check_proxy(proxies)}")
@@ -62,7 +62,7 @@ with gr.Blocks(theme=set_theme, analytics_enabled=False) as demo:
62
  variant = functional[k]["Color"] if "Color" in functional[k] else "secondary"
63
  functional[k]["Button"] = gr.Button(k, variant=variant)
64
  with gr.Row():
65
- gr.Markdown("注意:以下红颜色标识的函数插件需从input区读取路径作为参数.")
66
  with gr.Row():
67
  for k in crazy_functional:
68
  variant = crazy_functional[k]["Color"] if "Color" in crazy_functional[k] else "secondary"
@@ -101,7 +101,7 @@ with gr.Blocks(theme=set_theme, analytics_enabled=False) as demo:
101
  # gradio的inbrowser触发不太稳定,回滚代码到原始的浏览器打开函数
102
  def auto_opentab_delay():
103
  import threading, webbrowser, time
104
- print(f"URL http://localhost:{PORT}")
105
  def open():
106
  time.sleep(2)
107
  webbrowser.open_new_tab(f'http://localhost:{PORT}')
 
1
  import os; os.environ['no_proxy'] = '*' # 避免代理网络产生意外污染
2
  import gradio as gr
3
  from predict import predict
4
+ from toolbox import format_io, find_free_port, on_file_uploaded, on_report_generated, get_conf
5
 
6
  # 建议您复制一个config_private.py放自己的秘密, 如API和代理网址, 避免不小心传github被别人看到
7
+ proxies, WEB_PORT, LLM_MODEL, CONCURRENT_COUNT, AUTHENTICATION = \
8
+ get_conf('proxies', 'WEB_PORT', 'LLM_MODEL', 'CONCURRENT_COUNT', 'AUTHENTICATION')
9
+
10
 
11
  # 如果WEB_PORT是-1, 则随机选取WEB端口
12
  PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT
 
43
  with gr.Row():
44
  with gr.Column(scale=2):
45
  chatbot = gr.Chatbot()
46
+ chatbot.style(height=1150)
47
  chatbot.style()
48
  history = gr.State([])
49
  with gr.Column(scale=1):
50
  with gr.Row():
51
+ txt = gr.Textbox(show_label=False, placeholder="Input question here.").style(container=False)
52
+ with gr.Row():
53
+ submitBtn = gr.Button("提交", variant="primary")
54
+ with gr.Row():
55
+ resetBtn = gr.Button("重置", variant="secondary"); resetBtn.style(size="sm")
56
+ stopBtn = gr.Button("停止", variant="secondary"); stopBtn.style(size="sm")
 
57
  with gr.Row():
58
  from check_proxy import check_proxy
59
  statusDisplay = gr.Markdown(f"Tip: 按Enter提交, 按Shift+Enter换行。当前模型: {LLM_MODEL} \n {check_proxy(proxies)}")
 
62
  variant = functional[k]["Color"] if "Color" in functional[k] else "secondary"
63
  functional[k]["Button"] = gr.Button(k, variant=variant)
64
  with gr.Row():
65
+ gr.Markdown("注意:以下“红颜色”标识的函数插件需从input区读取路径作为参数.")
66
  with gr.Row():
67
  for k in crazy_functional:
68
  variant = crazy_functional[k]["Color"] if "Color" in crazy_functional[k] else "secondary"
 
101
  # gradio的inbrowser触发不太稳定,回滚代码到原始的浏览器打开函数
102
  def auto_opentab_delay():
103
  import threading, webbrowser, time
104
+ print(f"如果浏览器没有自动打开,请复制并转到以下URL: http://localhost:{PORT}")
105
  def open():
106
  time.sleep(2)
107
  webbrowser.open_new_tab(f'http://localhost:{PORT}')
predict.py CHANGED
@@ -20,10 +20,12 @@ import importlib
20
 
21
  # config_private.py放自己的秘密如API和代理网址
22
  # 读取时首先看是否存在私密的config_private配置文件(不受git管控),如果有,则覆盖原config文件
23
- try: from config_private import proxies, API_URL, API_KEY, TIMEOUT_SECONDS, MAX_RETRY, LLM_MODEL
24
- except: from config import proxies, API_URL, API_KEY, TIMEOUT_SECONDS, MAX_RETRY, LLM_MODEL
 
25
 
26
- timeout_bot_msg = '[local] Request timeout, network error. please check proxy settings in config.py.'
 
27
 
28
  def get_full_error(chunk, stream_response):
29
  """
@@ -117,8 +119,9 @@ def predict(inputs, top_p, temperature, chatbot=[], history=[], system_prompt=''
117
  """
118
  if additional_fn is not None:
119
  import functional
120
- importlib.reload(functional)
121
  functional = functional.get_functionals()
 
122
  inputs = functional[additional_fn]["Prefix"] + inputs + functional[additional_fn]["Suffix"]
123
 
124
  if stream:
 
20
 
21
  # config_private.py放自己的秘密如API和代理网址
22
  # 读取时首先看是否存在私密的config_private配置文件(不受git管控),如果有,则覆盖原config文件
23
+ from toolbox import get_conf
24
+ proxies, API_URL, API_KEY, TIMEOUT_SECONDS, MAX_RETRY, LLM_MODEL = \
25
+ get_conf('proxies', 'API_URL', 'API_KEY', 'TIMEOUT_SECONDS', 'MAX_RETRY', 'LLM_MODEL')
26
 
27
+ timeout_bot_msg = '[Local Message] Request timeout. Network error. Please check proxy settings in config.py.' + \
28
+ '网络错误,检查代理服务器是否可用,以及代理设置的格式是否正确,格式须是[协议]://[地址]:[端口],缺一不可。'
29
 
30
  def get_full_error(chunk, stream_response):
31
  """
 
119
  """
120
  if additional_fn is not None:
121
  import functional
122
+ importlib.reload(functional) # 热更新prompt
123
  functional = functional.get_functionals()
124
+ if "PreProcess" in functional[additional_fn]: inputs = functional[additional_fn]["PreProcess"](inputs) # 获取预处理函数(如果有的话)
125
  inputs = functional[additional_fn]["Prefix"] + inputs + functional[additional_fn]["Suffix"]
126
 
127
  if stream:
toolbox.py CHANGED
@@ -1,15 +1,16 @@
1
- import markdown, mdtex2html, threading
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
  """
7
  调用简单的predict_no_ui接口,但是依然保留了些许界面心跳功能,当对话太长时,会自动采用二分法截断
8
  """
9
  import time
10
- try: from config_private import TIMEOUT_SECONDS, MAX_RETRY
11
- except: from config import TIMEOUT_SECONDS, MAX_RETRY
12
  from predict import predict_no_ui
 
 
13
  # 多线程的时候,需要一个mutable结构在不同线程之间传递信息
14
  # list就是最简单的mutable结构,我们第一个位置放gpt输出,第二个位置传递报错信息
15
  mutable = [None, '']
@@ -80,10 +81,9 @@ def CatchException(f):
80
  try:
81
  yield from f(txt, top_p, temperature, chatbot, history, systemPromptTxt, WEB_PORT)
82
  except Exception as e:
83
- import traceback
84
  from check_proxy import check_proxy
85
- try: from config_private import proxies
86
- except: from config import proxies
87
  tb_str = regular_txt_to_markdown(traceback.format_exc())
88
  chatbot[-1] = (chatbot[-1][0], f"[Local Message] 实验性函数调用出错: \n\n {tb_str} \n\n 当前代理可用性: \n\n {check_proxy(proxies)}")
89
  yield chatbot, history, f'异常 {e}'
@@ -107,8 +107,8 @@ def text_divide_paragraph(text):
107
  # wtf input
108
  lines = text.split("\n")
109
  for i, line in enumerate(lines):
110
- lines[i] = "<p>"+lines[i].replace(" ", "&nbsp;")+"</p>"
111
- text = "\n".join(lines)
112
  return text
113
 
114
  def markdown_convertion(txt):
@@ -218,3 +218,27 @@ def on_report_generated(files, chatbot):
218
  # files.extend(report_files)
219
  chatbot.append(['汇总报告如何远程获取?', '汇总报告已经添加到右侧文件上传区,请查收。'])
220
  return report_files, chatbot
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import markdown, mdtex2html, threading, importlib, traceback
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
  """
8
  调用简单的predict_no_ui接口,但是依然保留了些许界面心跳功能,当对话太长时,会自动采用二分法截断
9
  """
10
  import time
 
 
11
  from predict import predict_no_ui
12
+ from toolbox import get_conf
13
+ TIMEOUT_SECONDS, MAX_RETRY = get_conf('TIMEOUT_SECONDS', 'MAX_RETRY')
14
  # 多线程的时候,需要一个mutable结构在不同线程之间传递信息
15
  # list就是最简单的mutable结构,我们第一个位置放gpt输出,第二个位置传递报错信息
16
  mutable = [None, '']
 
81
  try:
82
  yield from f(txt, top_p, temperature, chatbot, history, systemPromptTxt, WEB_PORT)
83
  except Exception as e:
 
84
  from check_proxy import check_proxy
85
+ from toolbox import get_conf
86
+ proxies, = get_conf('proxies')
87
  tb_str = regular_txt_to_markdown(traceback.format_exc())
88
  chatbot[-1] = (chatbot[-1][0], f"[Local Message] 实验性函数调用出错: \n\n {tb_str} \n\n 当前代理可用性: \n\n {check_proxy(proxies)}")
89
  yield chatbot, history, f'异常 {e}'
 
107
  # wtf input
108
  lines = text.split("\n")
109
  for i, line in enumerate(lines):
110
+ lines[i] = lines[i].replace(" ", "&nbsp;")
111
+ text = "</br>".join(lines)
112
  return text
113
 
114
  def markdown_convertion(txt):
 
218
  # files.extend(report_files)
219
  chatbot.append(['汇总报告如何远程获取?', '汇总报告已经添加到右侧文件上传区,请查收。'])
220
  return report_files, chatbot
221
+
222
+ def get_conf(*args):
223
+ # 建议您复制一个config_private.py放自己的秘密, 如API和代理网址, 避免不小心传github被别人看到
224
+ res = []
225
+ for arg in args:
226
+ try: r = getattr(importlib.import_module('config_private'), arg)
227
+ except: r = getattr(importlib.import_module('config'), arg)
228
+ res.append(r)
229
+ # 在读取API_KEY时,检查一下是不是忘了改config
230
+ if arg=='API_KEY':
231
+ # 正确的 API_KEY 是 "sk-" + 48 位大小写字母数字的组合
232
+ API_MATCH = re.match(r"sk-[a-zA-Z0-9]{48}$", r)
233
+ if API_MATCH:
234
+ print("您的 API_KEY 是: ", r, "\nAPI_KEY 导入成功")
235
+ else:
236
+ assert False, "正确的 API_KEY 是 'sk-' + '48 位大小写字母数字' 的组合,请在config文件中修改API密钥, 添加海外代理之后再运行。" + \
237
+ "(如果您刚更新过代码,请确保旧版config_private文件中没有遗留任何新增键值)"
238
+ return res
239
+
240
+ def clear_line_break(txt):
241
+ txt = txt.replace('\n', ' ')
242
+ txt = txt.replace(' ', ' ')
243
+ txt = txt.replace(' ', ' ')
244
+ return txt