Author SHA1 Message Date
Your Name 74d5061969 Merge branch 'test-3-29' of github.com:binary-husky/chatgpt_academic into test-3-29 2023-03-29 12:29:52 +08:00
Your Name 0b7c1c50ca 优化Unsplash API的使用 2023-03-29 12:28:45 +08:00
Your Name f45e0d3486 优化Unsplash API的使用 2023-03-29 12:27:47 +08:00
Your Name 881132557e 历史上的今天,带图片 2023-03-29 12:21:47 +08:00
Your Name 6d852d76b0 更新一个更有意思的模板函数 2023-03-29 11:36:55 +08:00
Your Name b588291cdf [实验] 历史上的今天(高级函数demo) 2023-03-29 11:34:03 +08:00
Your Name b4e0fe39ea bug fix 2023-03-29 01:42:11 +08:00
Your Name 7295978c93 change description 2023-03-29 01:39:15 +08:00
Your Name f2359e0442 更好的多线程交互性 2023-03-29 01:32:28 +08:00
Your Name ced6898daa introduce project self-translation 2023-03-29 01:11:53 +08:00
Your Name 4bca8b4f82 simplify codes 2023-03-28 23:09:25 +08:00
Your Name 5a6877f9fa 界面色彩自定义 2023-03-28 22:35:55 +08:00
Your Name 2c15b51ea4 explain color and theme 2023-03-28 22:31:43 +08:00
Your Name 9666b9b99b Merge branch 'master' of github.com:binary-husky/chatgpt_academic 2023-03-28 22:25:27 +08:00
Your Name baf61477d2 remove .vscode from git 2023-03-28 22:24:59 +08:00
Your Name 00e411bd68 update todo 2023-03-28 22:10:22 +08:00
Your Name 37bcdf684d fix unicode bug 2023-03-28 20:31:44 +08:00
binary-husky c80808a0c5 Merge pull request #46 from mambaHu/master
Markdown analysis report garbled issue
2023-03-28 20:04:01 +08:00
luca hu b69313884d improving garbled words issue with utf8 2023-03-28 19:34:18 +08:00
binary-husky 3b6675755e Delete jpeg-compressor.tps 2023-03-28 17:21:14 +08:00
binary-husky 3e2e4937db Delete JpegLibrary.tps 2023-03-28 17:21:06 +08:00
binary-husky e6f7e75e19 Delete UElibJPG.Build.cs 2023-03-28 17:20:54 +08:00
505030475 232d06a1ab theme 2023-03-28 12:59:31 +08:00
505030475 22db1147db o 2023-03-28 12:53:05 +08:00
binary-husky eb77532df5 Update README.md 2023-03-28 01:36:15 +08:00
binary-husky 9ee3d1390d Update README.md 2023-03-28 01:13:55 +08:00
Your Name 141df08332 http post error show 2023-03-27 18:25:07 +08:00
Your Name 248bcb7095 bug fix 2023-03-27 15:16:50 +08:00
Your Name 7c7b1cb030 Merge branch 'master' of github.com:binary-husky/chatgpt_academic 2023-03-27 15:14:12 +08:00
Your Name 290a33ea74 Merge branch 'master' of github.com:binary-husky/chatgpt_academic 2023-03-27 15:14:05 +08:00
binary-husky aabe2818e7 Update README.md 2023-03-27 15:09:02 +08:00
binary-husky c3a6a09c4c Update README.md 2023-03-27 15:01:49 +08:00
binary-husky 8c5332748f Update README.md 2023-03-27 15:01:07 +08:00
binary-husky 0b0860defc Update README.md 2023-03-27 14:57:12 +08:00
binary-husky 18894b04f1 Update README.md 2023-03-27 14:56:32 +08:00
binary-husky 8e75ad8134 Update README.md 2023-03-27 14:56:20 +08:00
binary-husky 7c33580bf6 Update README.md 2023-03-27 14:56:03 +08:00
Your Name 223e747d57 Merge branch 'master' of github.com:binary-husky/chatgpt_academic 2023-03-27 14:53:46 +08:00
Your Name 8c7be26661 up 2023-03-27 14:51:05 +08:00
binary-husky a1fceeae45 Update README.md 2023-03-27 14:47:52 +08:00
binary-husky 4b534400ea Update README.md 2023-03-27 14:45:32 +08:00
binary-husky ac9b590660 Update README.md 2023-03-27 13:47:08 +08:00
binary-husky 695ed5e02d Update README.md 2023-03-27 13:45:08 +08:00
15 changed files with 434 additions and 155 deletions
+4 -1
View File
@@ -131,9 +131,12 @@ dmypy.json
# Pyre type checker # Pyre type checker
.pyre/ .pyre/
.vscode
history history
ssr_conf ssr_conf
config_private.py config_private.py
gpt_log gpt_log
private.md private.md
private_upload private_upload
other_llms
-16
View File
@@ -1,16 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": false
}
]
}
+20 -10
View File
@@ -3,8 +3,20 @@
**如果喜欢这个项目,请给它一个Star;如果你发明了更好用的学术快捷键,欢迎发issue或者pull requests** **如果喜欢这个项目,请给它一个Star;如果你发明了更好用的学术快捷键,欢迎发issue或者pull requests**
If you like this project, please give it a Star. If you've come up with more useful academic shortcuts, feel free to open an issue or pull request. If you like this project, please give it a Star. If you've come up with more useful academic shortcuts, feel free to open an issue or pull request.
<div align="center">
```
代码中参考了很多其他优秀项目中的设计,主要包括:
# 借鉴项目1:借鉴了mdtex2html中公式处理的方法
https://github.com/polarwinkel/mdtex2html
# 借鉴项目2:借鉴了ChuanhuChatGPT中读取OpenAI json的方法、记录历史问询记录的方法以及gradio queue的使用技巧
https://github.com/GaiZhenbiao/ChuanhuChatGPT
项目使用OpenAI的gpt-3.5-turbo模型,期待gpt-4早点放宽门槛😂
```
<div align="center">
功能 | 描述 功能 | 描述
--- | --- --- | ---
一键润色 | 支持一键润色、一键查找论文语法错误 一键润色 | 支持一键润色、一键查找论文语法错误
@@ -26,7 +38,7 @@ chat分析报告生成 | [实验性功能] 运行后自动生成总结汇报
- 新界面 - 新界面
<div align="center"> <div align="center">
<img src="https://user-images.githubusercontent.com/96192199/227528413-36ab42da-d589-4ef1-ba75-28aa02442d05.png" width="700" > <img src="https://user-images.githubusercontent.com/96192199/227851398-fab5a158-aaf6-4151-95ac-a8172ce611c7.png" width="700" >
</div> </div>
@@ -36,7 +48,7 @@ chat分析报告生成 | [实验性功能] 运行后自动生成总结汇报
<img src="img/公式.gif" width="700" > <img src="img/公式.gif" width="700" >
</div> </div>
- 代码的显示自然也不在话下 https://www.bilibili.com/video/BV1F24y147PD/ - 润色/纠错
<div align="center"> <div align="center">
<img src="img/润色.gif" width="700" > <img src="img/润色.gif" width="700" >
</div> </div>
@@ -195,11 +207,9 @@ python check_proxy.py
<img src="https://user-images.githubusercontent.com/96192199/227504931-19955f78-45cd-4d1c-adac-e71e50957915.png" height="400" > <img src="https://user-images.githubusercontent.com/96192199/227504931-19955f78-45cd-4d1c-adac-e71e50957915.png" height="400" >
</div> </div>
## Todo:
- (Top Priority) 调用另一个开源项目text-generation-webui的web接口,使用其他llm模型
- 总结大工程源代码时,文本过长、token溢出的问题(目前的方法是直接二分丢弃处理溢出,过于粗暴,有效信息大量丢失)
- UI不够美观
## 参考项目
```
https://github.com/Python-Markdown/markdown
https://github.com/gradio-app/gradio
https://github.com/polarwinkel/mdtex2html
https://github.com/GaiZhenbiao/ChuanhuChatGPT
```
@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TpsData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>Jpeg Library</Name>
<Location>/Engine/Source/ThirdParty/libJPG/</Location>
<Date>2016-06-10T14:04:17.9005402-04:00</Date>
<Function>We need it because it is a 3rd party lib in GFx</Function>
<Justification />
<Eula> See license in download: http://www.ijg.org/</Eula>
<RedistributeTo>
<EndUserGroup>Licensees</EndUserGroup>
<EndUserGroup>Git</EndUserGroup>
<EndUserGroup>P4</EndUserGroup>
</RedistributeTo>
<LicenseFolder>/Engine/Source/ThirdParty/Licenses/JPEG_License.txt</LicenseFolder>
</TpsData>
@@ -1,17 +0,0 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class UElibJPG : ModuleRules
{
public UElibJPG(ReadOnlyTargetRules Target) : base(Target)
{
Type = ModuleType.External;
string libJPGPath = Target.UEThirdPartySourceDirectory + "libJPG";
PublicIncludePaths.Add(libJPGPath);
ShadowVariableWarningLevel = WarningLevel.Off;
}
}
@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TpsData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Name>jpeg-compressor</Name>
<Location>/Engine/Source/ThirdParty/libJPG/</Location>
<Date>2016-06-10T14:07:13.8351319-04:00</Date>
<Function>Allows JPEG compression and decompression.</Function>
<Justification>Compressing video frames at runtime for reduced memory usage. Decompression to access the data afterwards.</Justification>
<Eula>https://code.google.com/archive/p/jpeg-compressor/</Eula>
<RedistributeTo>
<EndUserGroup>Licensees</EndUserGroup>
<EndUserGroup>Git</EndUserGroup>
<EndUserGroup>P4</EndUserGroup>
</RedistributeTo>
<LicenseFolder>None</LicenseFolder>
</TpsData>
@@ -0,0 +1,75 @@
import threading
from predict import predict_no_ui_long_connection
from toolbox import CatchException, write_results_to_file
@CatchException
def 全项目切换英文(txt, top_p, temperature, chatbot, history, sys_prompt, WEB_PORT):
history = [] # 清空历史,以免输入溢出
# 集合文件
import time, glob, os
os.makedirs('gpt_log/generated_english_version', exist_ok=True)
os.makedirs('gpt_log/generated_english_version/crazy_functions', exist_ok=True)
file_manifest = [f for f in glob.glob('./*.py') if ('test_project' not in f) and ('gpt_log' not in f)] + \
[f for f in glob.glob('./crazy_functions/*.py') if ('test_project' not in f) and ('gpt_log' not in f)]
i_say_show_user_buffer = []
# 随便显示点什么防止卡顿的感觉
for index, fp in enumerate(file_manifest):
# if 'test_project' in fp: continue
with open(fp, 'r', encoding='utf-8') as f:
file_content = f.read()
i_say_show_user =f'[{index}/{len(file_manifest)}] 接下来请将以下代码中包含的所有中文转化为英文,只输出代码: {os.path.abspath(fp)}'
i_say_show_user_buffer.append(i_say_show_user)
chatbot.append((i_say_show_user, "[Local Message] 等待多线程操作,中间过程不予显示."))
yield chatbot, history, '正常'
# 任务函数
mutable_return = [None for _ in file_manifest]
def thread_worker(fp,index):
with open(fp, 'r', encoding='utf-8') as f:
file_content = f.read()
i_say = f'接下来请将以下代码中包含的所有中文转化为英文,只输出代码,文件名是{fp},文件代码是 ```{file_content}```'
# ** gpt request **
gpt_say = predict_no_ui_long_connection(inputs=i_say, top_p=top_p, temperature=temperature, history=history, sys_prompt=sys_prompt)
mutable_return[index] = gpt_say
# 所有线程同时开始执行任务函数
handles = [threading.Thread(target=thread_worker, args=(fp,index)) for index, fp in enumerate(file_manifest)]
for h in handles:
h.daemon = True
h.start()
chatbot.append(('开始了吗?', f'多线程操作已经开始'))
yield chatbot, history, '正常'
# 循环轮询各个线程是否执行完毕
cnt = 0
while True:
time.sleep(1)
th_alive = [h.is_alive() for h in handles]
if not any(th_alive): break
stat = ['执行中' if alive else '已完成' for alive in th_alive]
stat_str = '|'.join(stat)
cnt += 1
chatbot[-1] = (chatbot[-1][0], f'多线程操作已经开始,完成情况: {stat_str}' + ''.join(['.']*(cnt%4)))
yield chatbot, history, '正常'
# 把结果写入文件
for index, h in enumerate(handles):
h.join() # 这里其实不需要join了,肯定已经都结束了
fp = file_manifest[index]
gpt_say = mutable_return[index]
i_say_show_user = i_say_show_user_buffer[index]
where_to_relocate = f'gpt_log/generated_english_version/{fp}'
with open(where_to_relocate, 'w+', encoding='utf-8') as f: f.write(gpt_say.lstrip('```').rstrip('```'))
chatbot.append((i_say_show_user, f'[Local Message] 已完成{os.path.abspath(fp)}的转化,\n\n存入{os.path.abspath(where_to_relocate)}'))
history.append(i_say_show_user); history.append(gpt_say)
yield chatbot, history, '正常'
time.sleep(1)
# 备份一个文件
res = write_results_to_file(history)
chatbot.append(("给爷一份任务执行报告", res))
yield chatbot, history, '正常'
+10 -5
View File
@@ -1,16 +1,21 @@
from predict import predict_no_ui from predict import predict_no_ui_long_connection
from toolbox import CatchException, report_execption, write_results_to_file, predict_no_ui_but_counting_down from toolbox import CatchException, report_execption, write_results_to_file
fast_debug = False import datetime
@CatchException @CatchException
def 高阶功能模板函数(txt, top_p, temperature, chatbot, history, systemPromptTxt, WEB_PORT): def 高阶功能模板函数(txt, top_p, temperature, chatbot, history, systemPromptTxt, WEB_PORT):
history = [] # 清空历史,以免输入溢出 history = [] # 清空历史,以免输入溢出
for i in range(5): for i in range(5):
i_say = f'我给出一个数字,你给出该数字的平方。我给出数字:{i}' currentMonth = (datetime.date.today() + datetime.timedelta(days=i)).month
currentDay = (datetime.date.today() + datetime.timedelta(days=i)).day
i_say = f'历史中哪些事件发生在{currentMonth}{currentDay}日?列举两条并发送相关图片。发送图片时,请使用Markdown,将Unsplash API中的PUT_YOUR_QUERY_HERE替换成描述改事件的两个最重要的单词。'
chatbot.append((i_say, "[Local Message] waiting gpt response.")) chatbot.append((i_say, "[Local Message] waiting gpt response."))
yield chatbot, history, '正常' # 由于请求gpt需要一段时间,我们先及时地做一次状态显示 yield chatbot, history, '正常' # 由于请求gpt需要一段时间,我们先及时地做一次状态显示
gpt_say = predict_no_ui(inputs=i_say, top_p=top_p, temperature=temperature) # 请求gpt,需要一段时间 # history = [] 每次询问不携带之前的询问历史
gpt_say = predict_no_ui_long_connection(
inputs=i_say, top_p=top_p, temperature=temperature, history=[],
sys_prompt="当你想发送一张照片时,请使用Markdown, 并且不要有反斜线, 不要用代码块。使用 Unsplash API (https://source.unsplash.com/1280x720/? < PUT_YOUR_QUERY_HERE >)。") # 请求gpt,需要一段时间
chatbot[-1] = (i_say, gpt_say) chatbot[-1] = (i_say, gpt_say)
history.append(i_say);history.append(gpt_say) history.append(i_say);history.append(gpt_say)
+4 -8
View File
@@ -1,9 +1,7 @@
# """ # 'primary' 颜色对应 theme.py 中的 primary_hue
# 'primary' for main call-to-action, # 'secondary' 颜色对应 theme.py 中的 neutral_hue
# 'secondary' for a more subdued style, # 'stop' 颜色对应 theme.py 中的 color_er
# 'stop' for a stop button. # 默认按钮颜色是 secondary
# """
def get_functionals(): def get_functionals():
return { return {
@@ -55,5 +53,3 @@ not a Chinese-Chinese translator or an English-English translator. Below is the
"Color": "secondary", "Color": "secondary",
}, },
} }
+5 -26
View File
@@ -7,6 +7,7 @@ def get_crazy_functionals():
from crazy_functions.解析项目源代码 import 解析一个C项目的头文件 from crazy_functions.解析项目源代码 import 解析一个C项目的头文件
from crazy_functions.解析项目源代码 import 解析一个C项目 from crazy_functions.解析项目源代码 import 解析一个C项目
from crazy_functions.高级功能函数模板 import 高阶功能模板函数 from crazy_functions.高级功能函数模板 import 高阶功能模板函数
from crazy_functions.代码重写为全英文_多线程 import 全项目切换英文
return { return {
"[实验] 请解析并解构此项目本身": { "[实验] 请解析并解构此项目本身": {
@@ -32,35 +33,13 @@ def get_crazy_functionals():
"Color": "stop", # 按钮颜色 "Color": "stop", # 按钮颜色
"Function": 批量生成函数注释 "Function": 批量生成函数注释
}, },
"[实验] 实验功能函数模板": { "[实验] 把本项目源代码切换成全英文(多线程demo)": {
"Color": "stop", # 按钮颜色 "Function": 全项目切换英文
},
"[实验] 历史上的今天(高阶功能模板函数demo)": {
"Function": 高阶功能模板函数 "Function": 高阶功能模板函数
}, },
} }
def on_file_uploaded(files, chatbot, txt):
import shutil, os, time, glob
from toolbox import extract_archive
try: shutil.rmtree('./private_upload/')
except: pass
time_tag = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
os.makedirs(f'private_upload/{time_tag}', exist_ok=True)
for file in files:
file_origin_name = os.path.basename(file.orig_name)
shutil.copy(file.name, f'private_upload/{time_tag}/{file_origin_name}')
extract_archive(f'private_upload/{time_tag}/{file_origin_name}',
dest_dir=f'private_upload/{time_tag}/{file_origin_name}.extract')
moved_files = [fp for fp in glob.glob('private_upload/**/*', recursive=True)]
txt = f'private_upload/{time_tag}'
moved_files_str = '\t\n\n'.join(moved_files)
chatbot.append(['我上传了文件,请查收',
f'[Local Message] 收到以下文件: \n\n{moved_files_str}\n\n调用路径参数已自动修正到: \n\n{txt}\n\n现在您可以直接选择任意实现性功能'])
return chatbot, txt
def on_report_generated(files, chatbot):
from toolbox import find_recent_files
report_files = find_recent_files('gpt_log')
# files.extend(report_files)
chatbot.append(['汇总报告如何远程获取?', '汇总报告已经添加到右侧文件上传区,请查收。'])
return report_files, chatbot
+25 -30
View File
@@ -1,42 +1,39 @@
import os; os.environ['no_proxy'] = '*' # 避免代理网络产生意外污染 import os; os.environ['no_proxy'] = '*' # 避免代理网络产生意外污染
import gradio as gr import gradio as gr
from predict import predict from predict import predict
from toolbox import format_io, find_free_port from toolbox import format_io, find_free_port, on_file_uploaded, on_report_generated
# 建议您复制一个config_private.py放自己的秘密如API和代理网址避免不小心传github被别人看到 # 建议您复制一个config_private.py放自己的秘密, 如API和代理网址, 避免不小心传github被别人看到
try: from config_private import proxies, WEB_PORT try: from config_private import proxies, WEB_PORT, LLM_MODEL
except: from config import proxies, WEB_PORT except: from config import proxies, WEB_PORT, LLM_MODEL
# 如果WEB_PORT是-1则随机选取WEB端口 # 如果WEB_PORT是-1, 则随机选取WEB端口
PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT
initial_prompt = "Serve me as a writing and programming assistant." initial_prompt = "Serve me as a writing and programming assistant."
title_html = """<h1 align="center">ChatGPT 学术优化</h1>""" title_html = """<h1 align="center">ChatGPT 学术优化</h1>"""
# 问询记录python 版本建议3.9+(越新越好) # 问询记录, python 版本建议3.9+(越新越好)
import logging import logging
os.makedirs('gpt_log', exist_ok=True) os.makedirs('gpt_log', exist_ok=True)
try:logging.basicConfig(filename='gpt_log/chat_secrets.log', level=logging.INFO, encoding='utf-8') try:logging.basicConfig(filename='gpt_log/chat_secrets.log', level=logging.INFO, encoding='utf-8')
except:logging.basicConfig(filename='gpt_log/chat_secrets.log', level=logging.INFO) except:logging.basicConfig(filename='gpt_log/chat_secrets.log', level=logging.INFO)
print('所有问询记录将自动保存在本地目录./gpt_log/chat_secrets.log请注意自我隐私保护哦!') print('所有问询记录将自动保存在本地目录./gpt_log/chat_secrets.log, 请注意自我隐私保护哦!')
# 一些普通功能模块 # 一些普通功能模块
from functional import get_functionals from functional import get_functionals
functional = get_functionals() functional = get_functionals()
# 对一些丧心病狂的实验性功能模块进行测试 # 对一些丧心病狂的实验性功能模块进行测试
from functional_crazy import get_crazy_functionals, on_file_uploaded, on_report_generated from functional_crazy import get_crazy_functionals
crazy_functional = get_crazy_functionals() crazy_functional = get_crazy_functionals()
# 处理markdown文本格式的转变 # 处理markdown文本格式的转变
gr.Chatbot.postprocess = format_io gr.Chatbot.postprocess = format_io
# 做一些样式上的调整 # 做一些外观色彩上的调整
try: set_theme = gr.themes.Default( primary_hue=gr.themes.utils.colors.orange, from theme import adjust_theme
font=["ui-sans-serif", "system-ui", "sans-serif", gr.themes.utils.fonts.GoogleFont("Source Sans Pro")], set_theme = adjust_theme()
font_mono=["ui-monospace", "Consolas", "monospace", gr.themes.utils.fonts.GoogleFont("IBM Plex Mono")])
except:
set_theme = None; print('gradio版本较旧,不能自定义字体和颜色')
with gr.Blocks(theme=set_theme, analytics_enabled=False) as demo: with gr.Blocks(theme=set_theme, analytics_enabled=False) as demo:
gr.HTML(title_html) gr.HTML(title_html)
@@ -46,14 +43,15 @@ with gr.Blocks(theme=set_theme, analytics_enabled=False) as demo:
chatbot.style(height=1000) chatbot.style(height=1000)
chatbot.style() chatbot.style()
history = gr.State([]) history = gr.State([])
TRUE = gr.State(True)
FALSE = gr.State(False)
with gr.Column(scale=1): with gr.Column(scale=1):
with gr.Row(): with gr.Row():
with gr.Column(scale=12): with gr.Column(scale=12):
txt = gr.Textbox(show_label=False, placeholder="Input question here.").style(container=False) txt = gr.Textbox(show_label=False, placeholder="Input question here.").style(container=False)
with gr.Column(scale=1): with gr.Column(scale=1):
submitBtn = gr.Button("Ask", variant="primary") submitBtn = gr.Button("提交", variant="primary")
with gr.Row():
from check_proxy import check_proxy
statusDisplay = gr.Markdown(f"Tip: 按Enter提交, 按Shift+Enter换行. \nNetwork: {check_proxy(proxies)}\nModel: {LLM_MODEL}")
with gr.Row(): with gr.Row():
for k in functional: for k in functional:
variant = functional[k]["Color"] if "Color" in functional[k] else "secondary" variant = functional[k]["Color"] if "Color" in functional[k] else "secondary"
@@ -68,38 +66,35 @@ with gr.Blocks(theme=set_theme, analytics_enabled=False) as demo:
gr.Markdown("上传本地文件供上面的实验性功能调用.") gr.Markdown("上传本地文件供上面的实验性功能调用.")
with gr.Row(): with gr.Row():
file_upload = gr.Files(label='任何文件,但推荐上传压缩文件(zip, tar)', file_count="multiple") file_upload = gr.Files(label='任何文件,但推荐上传压缩文件(zip, tar)', file_count="multiple")
system_prompt = gr.Textbox(show_label=True, placeholder=f"System Prompt", label="System prompt", value=initial_prompt).style(container=True)
from check_proxy import check_proxy
statusDisplay = gr.Markdown(f"{check_proxy(proxies)}")
systemPromptTxt = gr.Textbox(show_label=True, placeholder=f"System Prompt", label="System prompt", value=initial_prompt).style(container=True)
#inputs, top_p, temperature, top_k, repetition_penalty
with gr.Accordion("arguments", open=False): with gr.Accordion("arguments", open=False):
top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.01,interactive=True, label="Top-p (nucleus sampling)",) top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.01,interactive=True, label="Top-p (nucleus sampling)",)
temperature = gr.Slider(minimum=-0, maximum=5.0, value=1.0, step=0.01, interactive=True, label="Temperature",) temperature = gr.Slider(minimum=-0, maximum=5.0, value=1.0, step=0.01, interactive=True, label="Temperature",)
txt.submit(predict, [txt, top_p, temperature, chatbot, history, systemPromptTxt], [chatbot, history, statusDisplay]) txt.submit(predict, [txt, top_p, temperature, chatbot, history, system_prompt], [chatbot, history, statusDisplay])
submitBtn.click(predict, [txt, top_p, temperature, chatbot, history, systemPromptTxt], [chatbot, history, statusDisplay], show_progress=True) submitBtn.click(predict, [txt, top_p, temperature, chatbot, history, system_prompt], [chatbot, history, statusDisplay], show_progress=True)
for k in functional: for k in functional:
functional[k]["Button"].click(predict, functional[k]["Button"].click(predict,
[txt, top_p, temperature, chatbot, history, systemPromptTxt, TRUE, gr.State(k)], [chatbot, history, statusDisplay], show_progress=True) [txt, top_p, temperature, chatbot, history, system_prompt, gr.State(True), gr.State(k)], [chatbot, history, statusDisplay], show_progress=True)
file_upload.upload(on_file_uploaded, [file_upload, chatbot, txt], [chatbot, txt]) file_upload.upload(on_file_uploaded, [file_upload, chatbot, txt], [chatbot, txt])
for k in crazy_functional: for k in crazy_functional:
click_handle = crazy_functional[k]["Button"].click(crazy_functional[k]["Function"], click_handle = crazy_functional[k]["Button"].click(crazy_functional[k]["Function"],
[txt, top_p, temperature, chatbot, history, systemPromptTxt, gr.State(PORT)], [chatbot, history, statusDisplay] [txt, top_p, temperature, chatbot, history, system_prompt, gr.State(PORT)], [chatbot, history, statusDisplay]
) )
try: click_handle.then(on_report_generated, [file_upload, chatbot], [file_upload, chatbot]) try: click_handle.then(on_report_generated, [file_upload, chatbot], [file_upload, chatbot])
except: pass except: pass
# 延迟函数, 做一些准备工作, 最后尝试打开浏览器
# 延迟函数,做一些准备工作,最后尝试打开浏览器
def auto_opentab_delay(): def auto_opentab_delay():
import threading, webbrowser, time import threading, webbrowser, time
print(f"URL http://localhost:{PORT}") print(f"URL http://localhost:{PORT}")
def open(): time.sleep(2) def open_webbrowser(): time.sleep(2)
webbrowser.open_new_tab(f'http://localhost:{PORT}') webbrowser.open_new_tab(f'http://localhost:{PORT}')
t = threading.Thread(target=open) t = threading.Thread(target=open_webbrowser)
t.daemon = True; t.start() t.daemon = True; t.start()
auto_opentab_delay() auto_opentab_delay()
demo.title = "ChatGPT 学术优化" demo.title = "ChatGPT 学术优化"
demo.queue().launch(server_name="0.0.0.0", share=True, server_port=PORT) demo.queue().launch(server_name="0.0.0.0", share=True, server_port=PORT)
# -> 代码控制在100行以内
+47 -6
View File
@@ -25,7 +25,7 @@ def get_full_error(chunk, stream_response):
break break
return chunk return chunk
def predict_no_ui(inputs, top_p, temperature, history=[]): def predict_no_ui(inputs, top_p, temperature, history=[], sys_prompt=""):
""" """
发送至chatGPT,等待回复,一次性完成,不显示中间过程。 发送至chatGPT,等待回复,一次性完成,不显示中间过程。
predict函数的简化版。 predict函数的简化版。
@@ -36,7 +36,7 @@ def predict_no_ui(inputs, top_p, temperature, history=[]):
history 是之前的对话列表 history 是之前的对话列表
(注意无论是inputs还是history,内容太长了都会触发token数量溢出的错误,然后raise ConnectionAbortedError (注意无论是inputs还是history,内容太长了都会触发token数量溢出的错误,然后raise ConnectionAbortedError
""" """
headers, payload = generate_payload(inputs, top_p, temperature, history, system_prompt="", stream=False) headers, payload = generate_payload(inputs, top_p, temperature, history, system_prompt=sys_prompt, stream=False)
retry = 0 retry = 0
while True: while True:
@@ -47,8 +47,8 @@ def predict_no_ui(inputs, top_p, temperature, history=[]):
except requests.exceptions.ReadTimeout as e: except requests.exceptions.ReadTimeout as e:
retry += 1 retry += 1
traceback.print_exc() traceback.print_exc()
if MAX_RETRY!=0: print(f'请求超时,正在重试 ({retry}/{MAX_RETRY}) ……')
if retry > MAX_RETRY: raise TimeoutError if retry > MAX_RETRY: raise TimeoutError
if MAX_RETRY!=0: print(f'请求超时,正在重试 ({retry}/{MAX_RETRY}) ……')
try: try:
result = json.loads(response.text)["choices"][0]["message"]["content"] result = json.loads(response.text)["choices"][0]["message"]["content"]
@@ -58,6 +58,41 @@ def predict_no_ui(inputs, top_p, temperature, history=[]):
raise ConnectionAbortedError("Json解析不合常规,可能是文本过长" + response.text) raise ConnectionAbortedError("Json解析不合常规,可能是文本过长" + response.text)
def predict_no_ui_long_connection(inputs, top_p, temperature, history=[], sys_prompt=""):
"""
发送至chatGPT,等待回复,一次性完成,不显示中间过程。但内部用stream的方法避免有人中途掐网线。
"""
headers, payload = generate_payload(inputs, top_p, temperature, history, system_prompt=sys_prompt, stream=True)
retry = 0
while True:
try:
# make a POST request to the API endpoint, stream=False
response = requests.post(API_URL, headers=headers, proxies=proxies,
json=payload, stream=True, timeout=TIMEOUT_SECONDS); break
except requests.exceptions.ReadTimeout as e:
retry += 1
traceback.print_exc()
if retry > MAX_RETRY: raise TimeoutError
if MAX_RETRY!=0: print(f'请求超时,正在重试 ({retry}/{MAX_RETRY}) ……')
stream_response = response.iter_lines()
result = ''
while True:
try: chunk = next(stream_response).decode()
except StopIteration: break
if len(chunk)==0: continue
if not chunk.startswith('data:'):
chunk = get_full_error(chunk.encode('utf8'), stream_response)
raise ConnectionAbortedError("OpenAI拒绝了请求:" + chunk.decode())
delta = json.loads(chunk.lstrip('data:'))['choices'][0]["delta"]
if len(delta) == 0: break
if "role" in delta: continue
if "content" in delta: result += delta["content"]; print(delta["content"], end='')
else: raise RuntimeError("意外Json结构:"+delta)
return result
def predict(inputs, top_p, temperature, chatbot=[], history=[], system_prompt='', def predict(inputs, top_p, temperature, chatbot=[], history=[], system_prompt='',
stream = True, additional_fn=None): stream = True, additional_fn=None):
""" """
@@ -126,13 +161,19 @@ def predict(inputs, top_p, temperature, chatbot=[], history=[], system_prompt=''
except Exception as e: except Exception as e:
traceback.print_exc() traceback.print_exc()
yield chatbot, history, "Json解析不合常规,很可能是文本过长" yield chatbot, history, "Json解析不合常规"
chunk = get_full_error(chunk, stream_response) chunk = get_full_error(chunk, stream_response)
error_msg = chunk.decode() error_msg = chunk.decode()
if "reduce the length" in error_msg: if "reduce the length" in error_msg:
chatbot[-1] = (history[-1], "[Local Message] Input (or history) is too long, please reduce input or clear history by refleshing this page.") chatbot[-1] = (chatbot[-1][0], "[Local Message] Input (or history) is too long, please reduce input or clear history by refleshing this page.")
history = [] history = []
yield chatbot, history, "Json解析不合常规,很可能是文本过长" + error_msg elif "Incorrect API key" in error_msg:
chatbot[-1] = (chatbot[-1][0], "[Local Message] Incorrect API key provided.")
else:
from toolbox import regular_txt_to_markdown
tb_str = regular_txt_to_markdown(traceback.format_exc())
chatbot[-1] = (chatbot[-1][0], f"[Local Message] Json Error \n\n {tb_str} \n\n {regular_txt_to_markdown(chunk.decode()[4:])}")
yield chatbot, history, "Json解析不合常规" + error_msg
return return
def generate_payload(inputs, top_p, temperature, history, system_prompt, stream): def generate_payload(inputs, top_p, temperature, history, system_prompt, stream):
+122
View File
@@ -0,0 +1,122 @@
# chatgpt-academic项目分析报告
(Author补充:以下分析均由本项目调用ChatGPT一键生成,如果有不准确的地方全怪GPT)
## [0/10] 程序摘要: check_proxy.py
这个程序是一个用来检查代理服务器是否有效的 Python 程序代码。程序文件名为 check_proxy.py。其中定义了一个函数 check_proxy,该函数接收一个代理配置信息 proxies,使用 requests 库向一个代理服务器发送请求,获取该代理的所在地信息并返回。如果请求超时或者异常,该函数将返回一个代理无效的结果。
程序代码分为两个部分,首先是 check_proxy 函数的定义部分,其次是程序文件的入口部分,在该部分代码中,程序从 config_private.py 文件或者 config.py 文件中加载代理配置信息,然后调用 check_proxy 函数来检测代理服务器是否有效。如果配置文件 config_private.py 存在,则会加载其中的代理配置信息,否则会从 config.py 文件中读取。
## [1/10] 程序摘要: config.py
本程序文件名为config.py,主要功能是存储应用所需的常量和配置信息。
其中,包含了应用所需的OpenAI API密钥、API接口地址、网络代理设置、超时设置、网络端口和OpenAI模型选择等信息,在运行应用前需要进行相应的配置。在未配置网络代理时,程序给出了相应的警告提示。
此外,还包含了一个检查函数,用于检查是否忘记修改API密钥。
总之,config.py文件是应用中的一个重要配置文件,用来存储应用所需的常量和配置信息,需要在应用运行前进行相应的配置。
## [2/10] 程序摘要: config_private.py
该文件是一个配置文件,命名为config_private.py。它是一个Python脚本,用于配置OpenAI的API密钥、模型和其它相关设置。该配置文件还可以设置是否使用代理。如果使用代理,需要设置代理协议、地址和端口。在设置代理之后,该文件还包括一些用于测试代理是否正常工作的代码。该文件还包括超时时间、随机端口、重试次数等设置。在文件末尾,还有一个检查代码,如果没有更改API密钥,则抛出异常。
## [3/10] 程序摘要: functional.py
该程序文件名为 functional.py,其中包含一个名为 get_functionals 的函数,该函数返回一个字典,该字典包含了各种翻译、校对等功能的名称、前缀、后缀以及默认按钮颜色等信息。具体功能包括:英语学术润色、中文学术润色、查找语法错误、中英互译、中译英、学术中译英、英译中、解释代码等。该程序的作用为提供各种翻译、校对等功能的模板,以便后续程序可以直接调用。
(Author补充:这个文件汇总了模块化的Prompt调用,如果发现了新的好用Prompt,别藏着哦^_^速速PR
## [4/10] 程序摘要: functional_crazy.py
这个程序文件 functional_crazy.py 导入了一些 python 模块,并提供了一个函数 get_crazy_functionals(),该函数返回不同实验功能的描述和函数。其中,使用的的模块包括:
- crazy_functions.读文章写摘要 中的 读文章写摘要
- crazy_functions.生成函数注释 中的 批量生成函数注释
- crazy_functions.解析项目源代码 中的 解析项目本身、解析一个Python项目、解析一个C项目的头文件、解析一个C项目
- crazy_functions.高级功能函数模板 中的 高阶功能模板函数
返回的实验功能函数包括:
- "[实验] 请解析并解构此项目本身",包含函数:解析项目本身
- "[实验] 解析整个py项目(配合input输入框)",包含函数:解析一个Python项目
- "[实验] 解析整个C++项目头文件(配合input输入框)",包含函数:解析一个C项目的头文件
- "[实验] 解析整个C++项目(配合input输入框)",包含函数:解析一个C项目
- "[实验] 读tex论文写摘要(配合input输入框)",包含函数:读文章写摘要
- "[实验] 批量生成函数注释(配合input输入框)",包含函数:批量生成函数注释
- "[实验] 实验功能函数模板",包含函数:高阶功能模板函数
这些函数用于系统开发和测试,方便开发者进行特定程序语言后台功能开发的测试和实验,增加系统可靠稳定性和用户友好性。
(Author补充:这个文件汇总了模块化的函数,如此设计以方便任何新功能的加入)
## [5/10] 程序摘要: main.py
该程序是一个基于Gradio框架的聊天机器人应用程序。用户可以通过输入问题来获取答案,并与聊天机器人进行对话。该应用程序还集成了一些实验性功能模块,用户可以通过上传本地文件或点击相关按钮来使用这些模块。程序还可以生成对话日志,并且具有一些外观上的调整。在运行时,它会自动打开一个网页并在本地启动服务器。
## [6/10] 程序摘要: predict.py
该程序文件名为predict.py,主要是针对一个基于ChatGPT的聊天机器人进行交互和预测。
第一部分是导入所需的库和配置文件。
第二部分是一个用于获取Openai返回的完整错误信息的函数。
第三部分是用于一次性完成向ChatGPT发送请求和等待回复的函数。
第四部分是用于基础的对话功能的函数,通过stream参数可以选择是否显示中间的过程。
第五部分是用于整合所需信息和选择LLM模型生成的HTTP请求。
Author补充:主要是predict_no_ui和predict两个函数。前者不用stream,方便、高效、易用。后者用stream,展现效果好。)
## [7/10] 程序摘要: show_math.py
这是一个名为show_math.py的Python程序文件,主要用于将Markdown-LaTeX混合文本转换为HTML格式,并包括MathML数学公式。程序使用latex2mathml.converter库将LaTeX公式转换为MathML格式,并使用正则表达式递归地翻译输入的Markdown-LaTeX混合文本。程序包括转换成双美元符号($$)形式、转换成单美元符号($)形式、转换成\[\]形式以及转换成\(\)形式的LaTeX数学公式。如果转换中出现错误,程序将返回相应的错误消息。
## [8/10] 程序摘要: theme.py
这是一个名为theme.py的程序文件,用于设置Gradio界面的颜色和字体主题。该文件中定义了一个名为adjust_theme()的函数,其作用是返回一个Gradio theme对象,设置了Gradio界面的颜色和字体主题。在该函数里面,使用了Graido可用的颜色列表,主要参数包括primary_hue、neutral_hue、font和font_mono等,用于设置Gradio界面的主题色调、字体等。另外,该函数还实现了一些参数的自定义,如input_background_fill_dark、button_transition、button_shadow_hover等,用于设置Gradio界面的渐变、阴影等特效。如果Gradio版本过于陈旧,该函数会抛出异常并返回None。
## [9/10] 程序摘要: toolbox.py
该文件为Python程序文件,文件名为toolbox.py。主要功能包括:
1. 导入markdown、mdtex2html、threading、functools等模块。
2. 定义函数predict_no_ui_but_counting_down,用于生成对话。
3. 定义函数write_results_to_file,用于将对话记录生成Markdown文件。
4. 定义函数regular_txt_to_markdown,将普通文本转换为Markdown格式的文本。
5. 定义装饰器函数CatchException,用于捕获函数执行异常并返回生成器。
6. 定义函数report_execption,用于向chatbot中添加错误信息。
7. 定义函数text_divide_paragraph,用于将文本按照段落分隔符分割开,生成带有段落标签的HTML代码。
8. 定义函数markdown_convertion,用于将Markdown格式的文本转换为HTML格式。
9. 定义函数format_io,用于将输入和输出解析为HTML格式。
10. 定义函数find_free_port,用于返回当前系统中可用的未使用端口。
11. 定义函数extract_archive,用于解压归档文件。
12. 定义函数find_recent_files,用于查找最近创建的文件。
13. 定义函数on_file_uploaded,用于处理上传文件的操作。
14. 定义函数on_report_generated,用于处理生成报告文件的操作。
## 程序的整体功能和构架做出概括。然后用一张markdown表格整理每个文件的功能。
这是一个基于Gradio框架的聊天机器人应用,支持通过文本聊天来获取答案,并可以使用一系列实验性功能模块,例如生成函数注释、解析项目源代码、读取Latex论文写摘要等。 程序架构分为前端和后端两个部分。前端使用Gradio实现,包括用户输入区域、应答区域、按钮、调用方式等。后端使用Python实现,包括聊天机器人模型、实验性功能模块、模板模块、管理模块、主程序模块等。
每个程序文件的功能如下:
| 文件名 | 功能描述 |
|:----:|:----:|
| check_proxy.py | 检查代理服务器是否有效 |
| config.py | 存储应用所需的常量和配置信息 |
| config_private.py | 存储Openai的API密钥、模型和其他相关设置 |
| functional.py | 提供各种翻译、校对等实用模板 |
| functional_crazy.py | 提供一些实验性质的高级功能 |
| main.py | 基于Gradio框架的聊天机器人应用程序的主程序 |
| predict.py | 用于chatbot预测方案创建,向ChatGPT发送请求和获取回复 |
| show_math.py | 将Markdown-LaTeX混合文本转换为HTML格式,并包括MathML数学公式 |
| theme.py | 设置Gradio界面的颜色和字体主题 |
| toolbox.py | 定义一系列工具函数,用于对输入输出进行格式转换、文件操作、异常捕捉和处理等 |
这些程序文件共同组成了一个聊天机器人应用程序的前端和后端实现,使用户可以方便地进行聊天,并可以使用相应的实验功能模块。
+82
View File
@@ -0,0 +1,82 @@
import gradio as gr
# gradio可用颜色列表
# gr.themes.utils.colors.slate (石板色)
# gr.themes.utils.colors.gray (灰色)
# gr.themes.utils.colors.zinc (锌色)
# gr.themes.utils.colors.neutral (中性色)
# gr.themes.utils.colors.stone (石头色)
# gr.themes.utils.colors.red (红色)
# gr.themes.utils.colors.orange (橙色)
# gr.themes.utils.colors.amber (琥珀色)
# gr.themes.utils.colors.yellow (黄色)
# gr.themes.utils.colors.lime (酸橙色)
# gr.themes.utils.colors.green (绿色)
# gr.themes.utils.colors.emerald (祖母绿)
# gr.themes.utils.colors.teal (青蓝色)
# gr.themes.utils.colors.cyan (青色)
# gr.themes.utils.colors.sky (天蓝色)
# gr.themes.utils.colors.blue (蓝色)
# gr.themes.utils.colors.indigo (靛蓝色)
# gr.themes.utils.colors.violet (紫罗兰色)
# gr.themes.utils.colors.purple (紫色)
# gr.themes.utils.colors.fuchsia (洋红色)
# gr.themes.utils.colors.pink (粉红色)
# gr.themes.utils.colors.rose (玫瑰色)
def adjust_theme():
try:
color_er = gr.themes.utils.colors.pink
set_theme = gr.themes.Default(
primary_hue=gr.themes.utils.colors.orange,
neutral_hue=gr.themes.utils.colors.gray,
font=["sans-serif", "Microsoft YaHei", "ui-sans-serif", "system-ui", "sans-serif", gr.themes.utils.fonts.GoogleFont("Source Sans Pro")],
font_mono=["ui-monospace", "Consolas", "monospace", gr.themes.utils.fonts.GoogleFont("IBM Plex Mono")])
set_theme.set(
# Colors
input_background_fill_dark="*neutral_800",
# Transition
button_transition="none",
# Shadows
button_shadow="*shadow_drop",
button_shadow_hover="*shadow_drop_lg",
button_shadow_active="*shadow_inset",
input_shadow="0 0 0 *shadow_spread transparent, *shadow_inset",
input_shadow_focus="0 0 0 *shadow_spread *secondary_50, *shadow_inset",
input_shadow_focus_dark="0 0 0 *shadow_spread *neutral_700, *shadow_inset",
checkbox_label_shadow="*shadow_drop",
block_shadow="*shadow_drop",
form_gap_width="1px",
# Button borders
input_border_width="1px",
input_background_fill="white",
# Gradients
stat_background_fill="linear-gradient(to right, *primary_400, *primary_200)",
stat_background_fill_dark="linear-gradient(to right, *primary_400, *primary_600)",
error_background_fill=f"linear-gradient(to right, {color_er.c100}, *background_fill_secondary)",
error_background_fill_dark="*background_fill_primary",
checkbox_label_background_fill="linear-gradient(to top, *neutral_50, white)",
checkbox_label_background_fill_dark="linear-gradient(to top, *neutral_900, *neutral_800)",
checkbox_label_background_fill_hover="linear-gradient(to top, *neutral_100, white)",
checkbox_label_background_fill_hover_dark="linear-gradient(to top, *neutral_900, *neutral_800)",
button_primary_background_fill="linear-gradient(to bottom right, *primary_100, *primary_300)",
button_primary_background_fill_dark="linear-gradient(to bottom right, *primary_500, *primary_600)",
button_primary_background_fill_hover="linear-gradient(to bottom right, *primary_100, *primary_200)",
button_primary_background_fill_hover_dark="linear-gradient(to bottom right, *primary_500, *primary_500)",
button_primary_border_color_dark="*primary_500",
button_secondary_background_fill="linear-gradient(to bottom right, *neutral_100, *neutral_200)",
button_secondary_background_fill_dark="linear-gradient(to bottom right, *neutral_600, *neutral_700)",
button_secondary_background_fill_hover="linear-gradient(to bottom right, *neutral_100, *neutral_100)",
button_secondary_background_fill_hover_dark="linear-gradient(to bottom right, *neutral_600, *neutral_600)",
button_cancel_background_fill=f"linear-gradient(to bottom right, {color_er.c100}, {color_er.c200})",
button_cancel_background_fill_dark=f"linear-gradient(to bottom right, {color_er.c600}, {color_er.c700})",
button_cancel_background_fill_hover=f"linear-gradient(to bottom right, {color_er.c100}, {color_er.c100})",
button_cancel_background_fill_hover_dark=f"linear-gradient(to bottom right, {color_er.c600}, {color_er.c600})",
button_cancel_border_color=color_er.c200,
button_cancel_border_color_dark=color_er.c600,
button_cancel_text_color=color_er.c600,
button_cancel_text_color_dark="white",
)
except:
set_theme = None; print('gradio版本较旧, 不能自定义字体和颜色')
return set_theme
+40 -6
View File
@@ -2,7 +2,7 @@ import markdown, mdtex2html, threading
from show_math import convert as convert_math from show_math import convert as convert_math
from functools import wraps from functools import wraps
def predict_no_ui_but_counting_down(i_say, i_say_show_user, chatbot, top_p, temperature, history=[]): def predict_no_ui_but_counting_down(i_say, i_say_show_user, chatbot, top_p, temperature, history=[], sys_prompt=''):
""" """
调用简单的predict_no_ui接口,但是依然保留了些许界面心跳功能,当对话太长时,会自动采用二分法截断 调用简单的predict_no_ui接口,但是依然保留了些许界面心跳功能,当对话太长时,会自动采用二分法截断
""" """
@@ -17,7 +17,7 @@ def predict_no_ui_but_counting_down(i_say, i_say_show_user, chatbot, top_p, temp
def mt(i_say, history): def mt(i_say, history):
while True: while True:
try: try:
mutable[0] = predict_no_ui(inputs=i_say, top_p=top_p, temperature=temperature, history=history) mutable[0] = predict_no_ui(inputs=i_say, top_p=top_p, temperature=temperature, history=history, sys_prompt=sys_prompt)
break break
except ConnectionAbortedError as e: except ConnectionAbortedError as e:
if len(history) > 0: if len(history) > 0:
@@ -27,7 +27,8 @@ def predict_no_ui_but_counting_down(i_say, i_say_show_user, chatbot, top_p, temp
i_say = i_say[:len(i_say)//2] i_say = i_say[:len(i_say)//2]
mutable[1] = 'Warning! Input file is too long, cut into half. ' mutable[1] = 'Warning! Input file is too long, cut into half. '
except TimeoutError as e: except TimeoutError as e:
mutable[0] = '[Local Message] Failed with timeout' mutable[0] = '[Local Message] Failed with timeout.'
raise TimeoutError
# 创建新线程发出http请求 # 创建新线程发出http请求
thread_name = threading.Thread(target=mt, args=(i_say, history)); thread_name.start() thread_name = threading.Thread(target=mt, args=(i_say, history)); thread_name.start()
# 原来的线程则负责持续更新UI,实现一个超时倒计时,并等待新线程的任务完成 # 原来的线程则负责持续更新UI,实现一个超时倒计时,并等待新线程的任务完成
@@ -39,6 +40,7 @@ def predict_no_ui_but_counting_down(i_say, i_say_show_user, chatbot, top_p, temp
time.sleep(1) time.sleep(1)
# 把gpt的输出从mutable中取出来 # 把gpt的输出从mutable中取出来
gpt_say = mutable[0] gpt_say = mutable[0]
if gpt_say=='[Local Message] Failed with timeout.': raise TimeoutError
return gpt_say return gpt_say
def write_results_to_file(history, file_name=None): def write_results_to_file(history, file_name=None):
@@ -47,9 +49,10 @@ def write_results_to_file(history, file_name=None):
""" """
import os, time import os, time
if file_name is None: if file_name is None:
file_name = time.strftime("chatGPT分析报告%Y-%m-%d-%H-%M-%S", time.localtime()) + '.md' # file_name = time.strftime("chatGPT分析报告%Y-%m-%d-%H-%M-%S", time.localtime()) + '.md'
file_name = 'chatGPT分析报告' + time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + '.md'
os.makedirs('./gpt_log/', exist_ok=True) os.makedirs('./gpt_log/', exist_ok=True)
with open(f'./gpt_log/{file_name}', 'w') as f: with open(f'./gpt_log/{file_name}', 'w', encoding = 'utf8') as f:
f.write('# chatGPT 分析报告\n') f.write('# chatGPT 分析报告\n')
for i, content in enumerate(history): for i, content in enumerate(history):
if i%2==0: f.write('## ') if i%2==0: f.write('## ')
@@ -178,8 +181,39 @@ def find_recent_files(directory):
for filename in os.listdir(directory): for filename in os.listdir(directory):
file_path = os.path.join(directory, filename) file_path = os.path.join(directory, filename)
if file_path.endswith('.log'): continue
created_time = os.path.getctime(file_path) created_time = os.path.getctime(file_path)
if created_time >= one_minute_ago: if created_time >= one_minute_ago:
recent_files.append(file_path) recent_files.append(file_path)
return recent_files return recent_files
def on_file_uploaded(files, chatbot, txt):
if len(files) == 0: return chatbot, txt
import shutil, os, time, glob
from toolbox import extract_archive
try: shutil.rmtree('./private_upload/')
except: pass
time_tag = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
os.makedirs(f'private_upload/{time_tag}', exist_ok=True)
for file in files:
file_origin_name = os.path.basename(file.orig_name)
shutil.copy(file.name, f'private_upload/{time_tag}/{file_origin_name}')
extract_archive(f'private_upload/{time_tag}/{file_origin_name}',
dest_dir=f'private_upload/{time_tag}/{file_origin_name}.extract')
moved_files = [fp for fp in glob.glob('private_upload/**/*', recursive=True)]
txt = f'private_upload/{time_tag}'
moved_files_str = '\t\n\n'.join(moved_files)
chatbot.append(['我上传了文件,请查收',
f'[Local Message] 收到以下文件: \n\n{moved_files_str}\n\n调用路径参数已自动修正到: \n\n{txt}\n\n现在您可以直接选择任意实现性功能'])
return chatbot, txt
def on_report_generated(files, chatbot):
from toolbox import find_recent_files
report_files = find_recent_files('gpt_log')
if len(report_files) == 0: return report_files, chatbot
# files.extend(report_files)
chatbot.append(['汇总报告如何远程获取?', '汇总报告已经添加到右侧文件上传区,请查收。'])
return report_files, chatbot