Spaces:
				
			
			
	
			
			
		Runtime error
		
	
	
	
			
			
	
	
	
	
		
		
		Runtime error
		
	version 3.6
Browse filesThis view is limited to 50 files because it contains too many changes.  
							See raw diff
- Dockerfile +12 -11
- README.md +70 -85
- app.py +108 -17
- check_proxy.py +4 -4
- config.py +52 -11
- core_functional.py +12 -5
- crazy_functional.py +55 -25
- crazy_functions/Latex全文润色.py +11 -11
- crazy_functions/Latex全文翻译.py +8 -8
- crazy_functions/Latex输出PDF结果.py +7 -7
- crazy_functions/agent_fns/auto_agent.py +23 -0
- crazy_functions/agent_fns/echo_agent.py +19 -0
- crazy_functions/agent_fns/general.py +134 -0
- crazy_functions/agent_fns/persistent.py +16 -0
- crazy_functions/agent_fns/pipe.py +194 -0
- crazy_functions/agent_fns/watchdog.py +28 -0
- crazy_functions/crazy_utils.py +22 -61
- crazy_functions/latex_fns/latex_actions.py +25 -6
- crazy_functions/latex_fns/latex_toolbox.py +70 -1
- crazy_functions/live_audio/aliyunASR.py +138 -6
- crazy_functions/live_audio/audio_io.py +1 -1
- crazy_functions/multi_stage/multi_stage_utils.py +45 -0
- crazy_functions/pdf_fns/parse_pdf.py +4 -4
- crazy_functions/pdf_fns/report_gen_html.py +58 -0
- crazy_functions/pdf_fns/report_template.html +0 -0
- crazy_functions/vt_fns/vt_call_plugin.py +1 -1
- crazy_functions/vt_fns/vt_modify_config.py +3 -3
- crazy_functions/下载arxiv论文翻译摘要.py +5 -5
- crazy_functions/图片生成.py +151 -16
- crazy_functions/多智能体.py +108 -0
- crazy_functions/对话历史存档.py +18 -8
- crazy_functions/总结word文档.py +5 -5
- crazy_functions/总结音视频.py +6 -6
- crazy_functions/批量Markdown翻译.py +12 -12
- crazy_functions/批量总结PDF文档.py +5 -5
- crazy_functions/批量总结PDF文档pdfminer.py +4 -4
- crazy_functions/批量翻译PDF文档_NOUGAT.py +28 -18
- crazy_functions/批量翻译PDF文档_多线程.py +9 -12
- crazy_functions/理解PDF文档内容.py +6 -6
- crazy_functions/生成函数注释.py +3 -3
- crazy_functions/联网的ChatGPT.py +2 -2
- crazy_functions/联网的ChatGPT_bing版.py +2 -2
- crazy_functions/虚空终端.py +1 -1
- crazy_functions/解析JupyterNotebook.py +4 -4
- crazy_functions/解析项目源代码.py +24 -24
- crazy_functions/询问多个大语言模型.py +4 -3
- crazy_functions/语音助手.py +26 -33
- crazy_functions/读文章写摘要.py +3 -3
- crazy_functions/谷歌检索小助手.py +10 -4
- crazy_functions/辅助功能.py +17 -5
    	
        Dockerfile
    CHANGED
    
    | @@ -1,34 +1,35 @@ | |
| 1 | 
            -
            # 此Dockerfile | 
| 2 | 
            -
            #  | 
| 3 | 
            -
            #  | 
| 4 | 
            -
            # 如何运行( | 
|  | |
| 5 | 
             
            FROM python:3.11
         | 
| 6 |  | 
| 7 |  | 
| 8 | 
            -
            # 非必要步骤,更换pip源
         | 
| 9 | 
             
            RUN echo '[global]' > /etc/pip.conf && \
         | 
| 10 | 
             
                echo 'index-url = https://mirrors.aliyun.com/pypi/simple/' >> /etc/pip.conf && \
         | 
| 11 | 
             
                echo 'trusted-host = mirrors.aliyun.com' >> /etc/pip.conf
         | 
| 12 |  | 
| 13 |  | 
| 14 | 
            -
            #  | 
| 15 | 
             
            WORKDIR /gpt
         | 
| 16 |  | 
| 17 |  | 
| 18 | 
            -
            # 安装大部分依赖,利用Docker缓存加速以后的构建
         | 
| 19 | 
             
            COPY requirements.txt ./
         | 
| 20 | 
            -
            COPY ./docs/gradio-3.32. | 
| 21 | 
             
            RUN pip3 install -r requirements.txt
         | 
| 22 |  | 
| 23 |  | 
| 24 | 
            -
            #  | 
| 25 | 
             
            COPY . .
         | 
| 26 | 
             
            RUN pip3 install -r requirements.txt
         | 
| 27 |  | 
| 28 |  | 
| 29 | 
            -
            #  | 
| 30 | 
             
            RUN python3  -c 'from check_proxy import warm_up_modules; warm_up_modules()'
         | 
| 31 |  | 
| 32 |  | 
| 33 | 
            -
            #  | 
| 34 | 
             
            CMD ["python3", "-u", "main.py"]
         | 
|  | |
| 1 | 
            +
            # 此Dockerfile适用于“无本地模型”的迷你运行环境构建
         | 
| 2 | 
            +
            # 如果需要使用chatglm等本地模型或者latex运行依赖,请参考 docker-compose.yml
         | 
| 3 | 
            +
            # - 如何构建: 先修改 `config.py`, 然后 `docker build -t gpt-academic . `
         | 
| 4 | 
            +
            # - 如何运行(Linux下): `docker run --rm -it --net=host gpt-academic `
         | 
| 5 | 
            +
            # - 如何运行(其他操作系统,选择任意一个固定端口50923): `docker run --rm -it -e WEB_PORT=50923 -p 50923:50923 gpt-academic `
         | 
| 6 | 
             
            FROM python:3.11
         | 
| 7 |  | 
| 8 |  | 
| 9 | 
            +
            # 非必要步骤,更换pip源 (以下三行,可以删除)
         | 
| 10 | 
             
            RUN echo '[global]' > /etc/pip.conf && \
         | 
| 11 | 
             
                echo 'index-url = https://mirrors.aliyun.com/pypi/simple/' >> /etc/pip.conf && \
         | 
| 12 | 
             
                echo 'trusted-host = mirrors.aliyun.com' >> /etc/pip.conf
         | 
| 13 |  | 
| 14 |  | 
| 15 | 
            +
            # 进入工作路径(必要)
         | 
| 16 | 
             
            WORKDIR /gpt
         | 
| 17 |  | 
| 18 |  | 
| 19 | 
            +
            # 安装大部分依赖,利用Docker缓存加速以后的构建 (以下三行,可以删除)
         | 
| 20 | 
             
            COPY requirements.txt ./
         | 
| 21 | 
            +
            COPY ./docs/gradio-3.32.6-py3-none-any.whl ./docs/gradio-3.32.6-py3-none-any.whl
         | 
| 22 | 
             
            RUN pip3 install -r requirements.txt
         | 
| 23 |  | 
| 24 |  | 
| 25 | 
            +
            # 装载项目文件,安装剩余依赖(必要)
         | 
| 26 | 
             
            COPY . .
         | 
| 27 | 
             
            RUN pip3 install -r requirements.txt
         | 
| 28 |  | 
| 29 |  | 
| 30 | 
            +
            # 非必要步骤,用于预热模块(可以删除)
         | 
| 31 | 
             
            RUN python3  -c 'from check_proxy import warm_up_modules; warm_up_modules()'
         | 
| 32 |  | 
| 33 |  | 
| 34 | 
            +
            # 启动(必要)
         | 
| 35 | 
             
            CMD ["python3", "-u", "main.py"]
         | 
    	
        README.md
    CHANGED
    
    | @@ -11,26 +11,27 @@ pinned: false | |
| 11 |  | 
| 12 | 
             
            # ChatGPT 学术优化
         | 
| 13 | 
             
            > **Note**
         | 
| 14 | 
            -
            >
         | 
| 15 | 
            -
            > 2023. | 
| 16 | 
            -
            >
         | 
| 17 | 
            -
            >  | 
|  | |
| 18 |  | 
| 19 |  | 
| 20 | 
             
            # <div align=center><img src="docs/logo.png" width="40"> GPT 学术优化 (GPT Academic)</div>
         | 
| 21 |  | 
| 22 | 
            -
            **如果喜欢这个项目,请给它一个Star | 
| 23 |  | 
| 24 | 
            -
            If you like this project, please give it a Star.  | 
| 25 | 
             
            To translate this project to arbitrary language with GPT, read and run [`multi_language.py`](multi_language.py) (experimental).
         | 
| 26 |  | 
| 27 | 
             
            > **Note**
         | 
| 28 | 
             
            >
         | 
| 29 | 
            -
            > 1.请注意只有 **高亮**  | 
| 30 | 
             
            >
         | 
| 31 | 
            -
            > 2.本项目中每个文件的功能都在[自译解报告`self_analysis.md`](https://github.com/binary-husky/gpt_academic/wiki/GPT‐Academic项目自译解报告)详细说明。随着版本的迭代,您也可以随时自行点击相关函数插件,调用GPT重新生成项目的自我解析报告。常见问题[`wiki`](https://github.com/binary-husky/gpt_academic/wiki)。[ | 
| 32 | 
             
            > 
         | 
| 33 | 
            -
            > 3.本项目兼容并鼓励尝试国产大语言模型ChatGLM | 
| 34 |  | 
| 35 |  | 
| 36 |  | 
| @@ -39,41 +40,38 @@ To translate this project to arbitrary language with GPT, read and run [`multi_l | |
| 39 |  | 
| 40 | 
             
            功能(⭐= 近期新增功能) | 描述
         | 
| 41 | 
             
            --- | ---
         | 
| 42 | 
            -
            ⭐[接入新模型](https://github.com/binary-husky/gpt_academic/wiki/%E5%A6%82%E4%BD%95%E5%88%87%E6%8D%A2%E6%A8%A1%E5%9E%8B)! | 百度[千帆](https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Nlks5zkzu)与文心一言, [通义千问](https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary),上海AI-Lab[书生](https://github.com/InternLM/InternLM),讯飞[星火](https://xinghuo.xfyun.cn/),[LLaMa2](https://huggingface.co/meta-llama/Llama-2-7b-chat-hf)
         | 
| 43 | 
            -
             | 
| 44 | 
            -
            一键中英互译 | 一键中英互译
         | 
| 45 | 
            -
            一键代码解释 | 显示代码、解释代码、生成代码、给代码加注释
         | 
| 46 | 
             
            [自定义快捷键](https://www.bilibili.com/video/BV14s4y1E7jN) | 支持自定义快捷键
         | 
| 47 | 
            -
            模块化设计 | 支持自定义强大的[ | 
| 48 | 
            -
            [ | 
| 49 | 
            -
            [ | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
            [ | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
            ⭐ | 
| 61 | 
            -
            ⭐[实时语音对话输入](https://github.com/binary-husky/gpt_academic/blob/master/docs/use_audio.md) | [函数插件] 异步[监听音频](https://www.bilibili.com/video/BV1AV4y187Uy/),自动断句,自动寻找回答时机
         | 
| 62 | 
             
            公式/图片/表格显示 | 可以同时显示公式的[tex形式和渲染形式](https://user-images.githubusercontent.com/96192199/230598842-1d7fcddd-815d-40ee-af60-baf488a199df.png),支持公式、代码高亮
         | 
| 63 | 
            -
             | 
| 64 | 
             
            启动暗色[主题](https://github.com/binary-husky/gpt_academic/issues/173) | 在浏览器url后面添加```/?__theme=dark```可以切换dark主题
         | 
| 65 | 
             
            [多LLM模型](https://www.bilibili.com/video/BV1wT411p7yf)支持 | 同时被GPT3.5、GPT4、[清华ChatGLM2](https://github.com/THUDM/ChatGLM2-6B)、[复旦MOSS](https://github.com/OpenLMLab/MOSS)同时伺候的感觉一定会很不错吧?
         | 
| 66 | 
             
            ⭐ChatGLM2微调模型 | 支持加载ChatGLM2微调模型,提供ChatGLM2微调辅助插件
         | 
| 67 | 
             
            更多LLM模型接入,支持[huggingface部署](https://huggingface.co/spaces/qingxu98/gpt-academic) | 加入Newbing接口(新必应),引入清华[Jittorllms](https://github.com/Jittor/JittorLLMs)支持[LLaMA](https://github.com/facebookresearch/llama)和[盘古α](https://openi.org.cn/pangu/)
         | 
| 68 | 
             
            ⭐[void-terminal](https://github.com/binary-husky/void-terminal) pip包 | 脱离GUI,在Python中直接调用本项目的所有函数插件(开发中)
         | 
| 69 | 
            -
            ⭐虚空终端插件 | [ | 
| 70 | 
             
            更多新功能展示 (图像生成等) …… | 见本文档结尾处 ……
         | 
| 71 | 
             
            </div>
         | 
| 72 |  | 
| 73 |  | 
| 74 | 
             
            - 新界面(修改`config.py`中的LAYOUT选项即可实现“左右布局”和“上下布局”的切换)
         | 
| 75 | 
             
            <div align="center">
         | 
| 76 | 
            -
            <img src="https:// | 
| 77 | 
             
            </div>
         | 
| 78 |  | 
| 79 |  | 
| @@ -113,16 +111,16 @@ cd gpt_academic | |
| 113 |  | 
| 114 | 
             
            2. 配置API_KEY
         | 
| 115 |  | 
| 116 | 
            -
            在`config.py`中,配置API KEY等设置,[点击查看特殊网络环境设置方法](https://github.com/binary-husky/gpt_academic/issues/1) 。[Wiki页面](https://github.com/binary-husky/gpt_academic/wiki | 
| 117 |  | 
| 118 | 
             
            「 程序会优先检查是否存在名为`config_private.py`的私密配置文件,并用其中的配置覆盖`config.py`的同名配置。如您能理解该读取逻辑,我们强烈建议您在`config.py`旁边创建一个名为`config_private.py`的新配置文件,并把`config.py`中的配置转移(复制)到`config_private.py`中(仅复制您修改过的配置条目即可)。 」
         | 
| 119 |  | 
| 120 | 
            -
            「 支持通过`环境变量`配置项目,环境变量的书写格式参考`docker-compose.yml`文件或者我们的[Wiki页面](https://github.com/binary-husky/gpt_academic/wiki | 
| 121 |  | 
| 122 |  | 
| 123 | 
             
            3. 安装依赖
         | 
| 124 | 
             
            ```sh
         | 
| 125 | 
            -
            # (选择I: 如熟悉python | 
| 126 | 
             
            python -m pip install -r requirements.txt
         | 
| 127 |  | 
| 128 | 
             
            # (选择II: 使用Anaconda)步骤也是类似的 (https://www.bilibili.com/video/BV1rc411W7Dr):
         | 
| @@ -138,17 +136,17 @@ python -m pip install -r requirements.txt # 这个步骤和pip安装一样的步 | |
| 138 | 
             
            【可选步骤】如果需要支持清华ChatGLM2/复旦MOSS作为后端,需要额外安装更多依赖(前提条件:熟悉Python + 用过Pytorch + 电脑配置够强):
         | 
| 139 | 
             
            ```sh
         | 
| 140 | 
             
            # 【可选步骤I】支持清华ChatGLM2。清华ChatGLM备注:如果遇到"Call ChatGLM fail 不能正常加载ChatGLM的参数" 错误,参考如下: 1:以上默认安装的为torch+cpu版,使用cuda需要卸载torch重新安装torch+cuda; 2:如因本机配置不够无法加载模型,可以修改request_llm/bridge_chatglm.py中的模型精度, 将 AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True) 都修改为 AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True)
         | 
| 141 | 
            -
            python -m pip install -r  | 
| 142 |  | 
| 143 | 
             
            # 【可选步骤II】支持复旦MOSS
         | 
| 144 | 
            -
            python -m pip install -r  | 
| 145 | 
            -
            git clone --depth=1 https://github.com/OpenLMLab/MOSS.git  | 
| 146 |  | 
| 147 | 
             
            # 【可选步骤III】支持RWKV Runner
         | 
| 148 | 
             
            参考wiki:https://github.com/binary-husky/gpt_academic/wiki/%E9%80%82%E9%85%8DRWKV-Runner
         | 
| 149 |  | 
| 150 | 
             
            # 【可选步骤IV】确保config.py配置文件的AVAIL_LLM_MODELS包含了期望的模型,目前支持的全部模型如下(jittorllms系列目前仅支持docker方案):
         | 
| 151 | 
            -
            AVAIL_LLM_MODELS = ["gpt-3.5-turbo", "api2d-gpt-3.5-turbo", "gpt-4", "api2d-gpt-4", "chatglm", " | 
| 152 | 
             
            ```
         | 
| 153 |  | 
| 154 | 
             
            </p>
         | 
| @@ -163,11 +161,11 @@ python main.py | |
| 163 |  | 
| 164 | 
             
            ### 安装方法II:使用Docker
         | 
| 165 |  | 
| 166 | 
            -
            0. 部署项目的全部能力(这个是包含cuda和latex | 
| 167 | 
            -
            [](https://github.com/binary-husky/gpt_academic/actions/workflows/build-with- | 
| 168 |  | 
| 169 | 
             
            ``` sh
         | 
| 170 | 
            -
            # 修改docker-compose.yml,保留方案0 | 
| 171 | 
             
            docker-compose up
         | 
| 172 | 
             
            ```
         | 
| 173 |  | 
| @@ -177,7 +175,7 @@ docker-compose up | |
| 177 | 
             
            [](https://github.com/binary-husky/gpt_academic/actions/workflows/build-with-audio-assistant.yml)
         | 
| 178 |  | 
| 179 | 
             
            ``` sh
         | 
| 180 | 
            -
            # 修改docker-compose.yml,保留方案1 | 
| 181 | 
             
            docker-compose up
         | 
| 182 | 
             
            ```
         | 
| 183 |  | 
| @@ -187,48 +185,30 @@ P.S. 如果需要依赖Latex的插件功能,请见Wiki。另外,您也可以 | |
| 187 | 
             
            [](https://github.com/binary-husky/gpt_academic/actions/workflows/build-with-chatglm.yml)
         | 
| 188 |  | 
| 189 | 
             
            ``` sh
         | 
| 190 | 
            -
            # 修改docker-compose.yml,保留方案2 | 
| 191 | 
            -
            docker-compose up
         | 
| 192 | 
            -
            ```
         | 
| 193 | 
            -
             | 
| 194 | 
            -
            3. ChatGPT + LLAMA + 盘古 + RWKV(需要熟悉[Nvidia Docker](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#installing-on-ubuntu-and-debian)运行时)
         | 
| 195 | 
            -
            [](https://github.com/binary-husky/gpt_academic/actions/workflows/build-with-jittorllms.yml)
         | 
| 196 | 
            -
             | 
| 197 | 
            -
            ``` sh
         | 
| 198 | 
            -
            # 修改docker-compose.yml,保留方案3并删除其他方案。修改docker-compose.yml中方案3的配置,参考其中注释即可
         | 
| 199 | 
             
            docker-compose up
         | 
| 200 | 
             
            ```
         | 
| 201 |  | 
| 202 |  | 
| 203 | 
             
            ### 安装方法III:其他部署姿势
         | 
| 204 | 
            -
            1.  | 
| 205 | 
             
            完全不熟悉python环境的Windows用户可以下载[Release](https://github.com/binary-husky/gpt_academic/releases)中发布的一键运行脚本安装无本地模型的版本。
         | 
| 206 | 
             
            脚本的贡献来源是[oobabooga](https://github.com/oobabooga/one-click-installers)。
         | 
| 207 |  | 
| 208 | 
            -
            2.  | 
| 209 | 
            -
            请阅读docker-compose.yml后,按照其中的提示操作即可
         | 
| 210 | 
            -
             | 
| 211 | 
            -
            3. 如何使用反代URL
         | 
| 212 | 
            -
            按照`config.py`中的说明配置API_URL_REDIRECT即可。
         | 
| 213 |  | 
| 214 | 
            -
             | 
| 215 | 
            -
             | 
| 216 |  | 
| 217 | 
            -
             | 
| 218 | 
            -
             | 
| 219 | 
            -
             | 
| 220 | 
            -
             | 
| 221 | 
            -
             | 
| 222 | 
            -
            7. 使用WSL2(Windows Subsystem for Linux 子系统)。
         | 
| 223 | 
            -
            请访问[部署wiki-2](https://github.com/binary-husky/gpt_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)
         | 
| 224 | 
            -
             | 
| 225 | 
            -
            8. 如何在二级网址(如`http://localhost/subpath`)下运行。
         | 
| 226 | 
            -
            请访问[FastAPI运行说明](docs/WithFastapi.md)
         | 
| 227 |  | 
| 228 |  | 
| 229 | 
             
            # Advanced Usage
         | 
| 230 | 
             
            ### I:自定义新的便捷按钮(学术快捷键)
         | 
| 231 | 
            -
            任意文本编辑器打开`core_functional.py | 
| 232 | 
             
            例如
         | 
| 233 | 
             
            ```
         | 
| 234 | 
             
            "超级英译中": {
         | 
| @@ -244,14 +224,13 @@ docker-compose up | |
| 244 | 
             
            </div>
         | 
| 245 |  | 
| 246 | 
             
            ### II:自定义函数插件
         | 
| 247 | 
            -
             | 
| 248 | 
             
            编写强大的函数插件来执行任何你想得到的和想不到的任务。
         | 
| 249 | 
             
            本项目的插件编写、调试难度很低,只要您具备一定的python基础知识,就可以仿照我们提供的模板实现自己的插件功能。
         | 
| 250 | 
             
            详情请参考[函数插件指南](https://github.com/binary-husky/gpt_academic/wiki/%E5%87%BD%E6%95%B0%E6%8F%92%E4%BB%B6%E6%8C%87%E5%8D%97)。
         | 
| 251 |  | 
| 252 |  | 
| 253 | 
            -
            #  | 
| 254 | 
            -
            ### I | 
| 255 |  | 
| 256 | 
             
            1. 对话保存功能。在函数插件区调用 `保存当前的对话` 即可将当前对话保存为可读+可复原的html文件,
         | 
| 257 | 
             
            另外在函数插件区(下拉菜单)调用 `载入对话历史存档` ,即可还原之前的会话。
         | 
| @@ -292,28 +271,23 @@ Tip:不指定文件直接点击 `载入对话历史存档` 可以查看历史h | |
| 292 | 
             
            <img src="https://user-images.githubusercontent.com/96192199/236432361-67739153-73e8-43fe-8111-b61296edabd9.png" width="500" >
         | 
| 293 | 
             
            </div>
         | 
| 294 |  | 
| 295 | 
            -
            7.  | 
| 296 | 
            -
            <div align="center">
         | 
| 297 | 
            -
            <img src="https://user-images.githubusercontent.com/96192199/236639178-92836f37-13af-4fdd-984d-b4450fe30336.png" width="500" >
         | 
| 298 | 
            -
            </div>
         | 
| 299 | 
            -
             | 
| 300 | 
            -
            8. OpenAI图像生成
         | 
| 301 | 
             
            <div align="center">
         | 
| 302 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/bc7ab234-ad90-48a0-8d62-f703d9e74665" width="500" >
         | 
| 303 | 
             
            </div>
         | 
| 304 |  | 
| 305 | 
            -
             | 
| 306 | 
             
            <div align="center">
         | 
| 307 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/709ccf95-3aee-498a-934a-e1c22d3d5d5b" width="500" >
         | 
| 308 | 
             
            </div>
         | 
| 309 |  | 
| 310 | 
            -
             | 
| 311 | 
             
            <div align="center">
         | 
| 312 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/651ccd98-02c9-4464-91e1-77a6b7d1b033" height="200" > ===>
         | 
| 313 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/476f66d9-7716-4537-b5c1-735372c25adb" height="200">
         | 
| 314 | 
             
            </div>
         | 
| 315 |  | 
| 316 | 
            -
             | 
| 317 | 
             
            <div align="center">
         | 
| 318 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/b6799499-b6fb-4f0c-9c8e-1b441872f4e8" width="500" >
         | 
| 319 | 
             
            </div>
         | 
| @@ -321,7 +295,12 @@ Tip:不指定文件直接点击 `载入对话历史存档` 可以查看历史h | |
| 321 |  | 
| 322 |  | 
| 323 | 
             
            ### II:版本:
         | 
| 324 | 
            -
            - version 3. | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 325 | 
             
            - version 3.53: 支持动态选择不同界面主题,提高稳定性&解决多用户冲突问题
         | 
| 326 | 
             
            - version 3.50: 使用自然语言调用本项目的所有函数插件��虚空终端),支持插件分类,改进UI,设计新主题
         | 
| 327 | 
             
            - version 3.49: 支持百度千帆平台和文心一言
         | 
| @@ -343,7 +322,7 @@ Tip:不指定文件直接点击 `载入对话历史存档` 可以查看历史h | |
| 343 | 
             
            - version 2.0: 引入模块化函数插件
         | 
| 344 | 
             
            - version 1.0: 基础功能
         | 
| 345 |  | 
| 346 | 
            -
             | 
| 347 |  | 
| 348 | 
             
            - 已知问题
         | 
| 349 | 
             
                - 某些浏览器翻译插件干扰此软件前端的运行
         | 
| @@ -354,7 +333,13 @@ gpt_academic开发者QQ群-2:610599535 | |
| 354 | 
             
            1. `Chuanhu-Small-and-Beautiful` [网址](https://github.com/GaiZhenbiao/ChuanhuChatGPT/)
         | 
| 355 |  | 
| 356 |  | 
| 357 | 
            -
            ### IV | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 358 |  | 
| 359 | 
             
            ```
         | 
| 360 | 
             
            代码中参考了很多其他优秀项目中的设计,顺序不分先后:
         | 
|  | |
| 11 |  | 
| 12 | 
             
            # ChatGPT 学术优化
         | 
| 13 | 
             
            > **Note**
         | 
| 14 | 
            +
            > 
         | 
| 15 | 
            +
            > 2023.11.12: 某些依赖包尚不兼容python 3.12,推荐python 3.11。
         | 
| 16 | 
            +
            > 
         | 
| 17 | 
            +
            > 2023.11.7: 安装依赖时,请选择`requirements.txt`中**指定的版本**。 安装命令:`pip install -r requirements.txt`。本项目开源免费,近期发现有人蔑视开源协议并利用本项目违规圈钱,请提高警惕,谨防上当受骗。
         | 
| 18 | 
            +
             | 
| 19 |  | 
| 20 |  | 
| 21 | 
             
            # <div align=center><img src="docs/logo.png" width="40"> GPT 学术优化 (GPT Academic)</div>
         | 
| 22 |  | 
| 23 | 
            +
            **如果喜欢这个项目,请给它一个Star;如果您发明了好用的快捷键或插件,欢迎发pull requests!**
         | 
| 24 |  | 
| 25 | 
            +
            If you like this project, please give it a Star. We also have a README in [English|](docs/README.English.md)[日本語|](docs/README.Japanese.md)[한국어|](docs/README.Korean.md)[Русский|](docs/README.Russian.md)[Français](docs/README.French.md) translated by this project itself.
         | 
| 26 | 
             
            To translate this project to arbitrary language with GPT, read and run [`multi_language.py`](multi_language.py) (experimental).
         | 
| 27 |  | 
| 28 | 
             
            > **Note**
         | 
| 29 | 
             
            >
         | 
| 30 | 
            +
            > 1.请注意只有 **高亮** 标识的插件(按钮)才支持读取文件,部分插件位于插件区的**下拉菜单**中。另外我们以**最高优先级**欢迎和处理任何新插件的PR。
         | 
| 31 | 
             
            >
         | 
| 32 | 
            +
            > 2.本项目中每个文件的功能都在[自译解报告`self_analysis.md`](https://github.com/binary-husky/gpt_academic/wiki/GPT‐Academic项目自译解报告)详细说明。随着版本的迭代,您也可以随时自行点击相关函数插件,调用GPT重新生成项目的自我解析报告。常见问题[`wiki`](https://github.com/binary-husky/gpt_academic/wiki)。[常规安装方法](#installation) | [一键安装脚本](https://github.com/binary-husky/gpt_academic/releases) | [配置说明](https://github.com/binary-husky/gpt_academic/wiki/项目配置说明)。
         | 
| 33 | 
             
            > 
         | 
| 34 | 
            +
            > 3.本项目兼容并鼓励尝试国产大语言模型ChatGLM等。支持多个api-key共存,可在配置文件中填写如`API_KEY="openai-key1,openai-key2,azure-key3,api2d-key4"`。需要临时更换`API_KEY`时,在输入区输入临时的`API_KEY`然后回车键提交后即可生效。
         | 
| 35 |  | 
| 36 |  | 
| 37 |  | 
|  | |
| 40 |  | 
| 41 | 
             
            功能(⭐= 近期新增功能) | 描述
         | 
| 42 | 
             
            --- | ---
         | 
| 43 | 
            +
            ⭐[接入新模型](https://github.com/binary-husky/gpt_academic/wiki/%E5%A6%82%E4%BD%95%E5%88%87%E6%8D%A2%E6%A8%A1%E5%9E%8B)! | 百度[千帆](https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Nlks5zkzu)与文心一言, [通义千问](https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary),上海AI-Lab[书生](https://github.com/InternLM/InternLM),讯飞[星火](https://xinghuo.xfyun.cn/),[LLaMa2](https://huggingface.co/meta-llama/Llama-2-7b-chat-hf),智谱API,DALLE3
         | 
| 44 | 
            +
            润色、翻译、代码解释 | 一键润色、翻译、查找论文语法错误、解释代码
         | 
|  | |
|  | |
| 45 | 
             
            [自定义快捷键](https://www.bilibili.com/video/BV14s4y1E7jN) | 支持自定义快捷键
         | 
| 46 | 
            +
            模块化设计 | 支持自定义强大的[插件](https://github.com/binary-husky/gpt_academic/tree/master/crazy_functions),插件支持[热更新](https://github.com/binary-husky/gpt_academic/wiki/%E5%87%BD%E6%95%B0%E6%8F%92%E4%BB%B6%E6%8C%87%E5%8D%97)
         | 
| 47 | 
            +
            [程序剖析](https://www.bilibili.com/video/BV1cj411A7VW) | [插件] 一键可以剖析Python/C/C++/Java/Lua/...项目树 或 [自我剖析](https://www.bilibili.com/video/BV1cj411A7VW)
         | 
| 48 | 
            +
            读论文、[翻译](https://www.bilibili.com/video/BV1KT411x7Wn)论文 | [插件] 一键解读latex/pdf论文全文并生成摘要
         | 
| 49 | 
            +
            Latex全文[翻译](https://www.bilibili.com/video/BV1nk4y1Y7Js/)、[润色](https://www.bilibili.com/video/BV1FT411H7c5/) | [插件] 一键翻译或润色latex论文
         | 
| 50 | 
            +
            批量注释生成 | [插件] 一键批量生成函数注释
         | 
| 51 | 
            +
            Markdown[中英互译](https://www.bilibili.com/video/BV1yo4y157jV/) | [插件] 看到上面5种语言的[README](https://github.com/binary-husky/gpt_academic/blob/master/docs/README_EN.md)了吗?
         | 
| 52 | 
            +
            chat分析报告生成 | [插件] 运行后自动生成总结汇报
         | 
| 53 | 
            +
            [PDF论文全文翻译功能](https://www.bilibili.com/video/BV1KT411x7Wn) | [插件] PDF论文提取题目&摘要+翻译全文(多线程)
         | 
| 54 | 
            +
            [Arxiv小助手](https://www.bilibili.com/video/BV1LM4y1279X) | [插件] 输入arxiv文章url即可一键翻译摘要+下载PDF
         | 
| 55 | 
            +
            Latex论文一键校对 | [插件] 仿Grammarly对Latex文章进行语法、拼写纠错+输出对照PDF
         | 
| 56 | 
            +
            [谷歌学术统合小助手](https://www.bilibili.com/video/BV19L411U7ia) | [插件] 给定任意谷歌学术搜索页面URL,让gpt帮你[写relatedworks](https://www.bilibili.com/video/BV1GP411U7Az/)
         | 
| 57 | 
            +
            互联网信息聚合+GPT | [插件] 一键[让GPT从互联网获取信息](https://www.bilibili.com/video/BV1om4y127ck)回答问题,让信息永不过时
         | 
| 58 | 
            +
            ⭐Arxiv论文精细翻译 ([Docker](https://github.com/binary-husky/gpt_academic/pkgs/container/gpt_academic_with_latex)) | [插件] 一键[以超高质量翻译arxiv论文](https://www.bilibili.com/video/BV1dz4y1v77A/),目前最好的论文翻译工具
         | 
| 59 | 
            +
            ⭐[实时语音对话输入](https://github.com/binary-husky/gpt_academic/blob/master/docs/use_audio.md) | [插件] 异步[监听音频](https://www.bilibili.com/video/BV1AV4y187Uy/),自动断句,自动寻找回答时机
         | 
|  | |
| 60 | 
             
            公式/图片/表格显示 | 可以同时显示公式的[tex形式和渲染形式](https://user-images.githubusercontent.com/96192199/230598842-1d7fcddd-815d-40ee-af60-baf488a199df.png),支持公式、代码高亮
         | 
| 61 | 
            +
            ⭐AutoGen多智能体插件 | [插件] 借助微软AutoGen,探索多Agent的智能涌现可能!
         | 
| 62 | 
             
            启动暗色[主题](https://github.com/binary-husky/gpt_academic/issues/173) | 在浏览器url后面添加```/?__theme=dark```可以切换dark主题
         | 
| 63 | 
             
            [多LLM模型](https://www.bilibili.com/video/BV1wT411p7yf)支持 | 同时被GPT3.5、GPT4、[清华ChatGLM2](https://github.com/THUDM/ChatGLM2-6B)、[复旦MOSS](https://github.com/OpenLMLab/MOSS)同时伺候的感觉一定会很不错吧?
         | 
| 64 | 
             
            ⭐ChatGLM2微调模型 | 支持加载ChatGLM2微调模型,提供ChatGLM2微调辅助插件
         | 
| 65 | 
             
            更多LLM模型接入,支持[huggingface部署](https://huggingface.co/spaces/qingxu98/gpt-academic) | 加入Newbing接口(新必应),引入清华[Jittorllms](https://github.com/Jittor/JittorLLMs)支持[LLaMA](https://github.com/facebookresearch/llama)和[盘古α](https://openi.org.cn/pangu/)
         | 
| 66 | 
             
            ⭐[void-terminal](https://github.com/binary-husky/void-terminal) pip包 | 脱离GUI,在Python中直接调用本项目的所有函数插件(开发中)
         | 
| 67 | 
            +
            ⭐虚空终端插件 | [插件] 用自然语言,直接调度本项目其他插件
         | 
| 68 | 
             
            更多新功能展示 (图像生成等) …… | 见本文档结尾处 ……
         | 
| 69 | 
             
            </div>
         | 
| 70 |  | 
| 71 |  | 
| 72 | 
             
            - 新界面(修改`config.py`中的LAYOUT选项即可实现“左右布局”和“上下布局”的切换)
         | 
| 73 | 
             
            <div align="center">
         | 
| 74 | 
            +
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/d81137c3-affd-4cd1-bb5e-b15610389762" width="700" >
         | 
| 75 | 
             
            </div>
         | 
| 76 |  | 
| 77 |  | 
|  | |
| 111 |  | 
| 112 | 
             
            2. 配置API_KEY
         | 
| 113 |  | 
| 114 | 
            +
            在`config.py`中,配置API KEY等设置,[点击查看特殊网络环境设置方法](https://github.com/binary-husky/gpt_academic/issues/1) 。[Wiki页面](https://github.com/binary-husky/gpt_academic/wiki/项目配置说明)。
         | 
| 115 |  | 
| 116 | 
             
            「 程序会优先检查是否存在名为`config_private.py`的私密配置文件,并用其中的配置覆盖`config.py`的同名配置。如您能理解该读取逻辑,我们强烈建议您在`config.py`旁边创建一个名为`config_private.py`的新配置文件,并把`config.py`中的配置转移(复制)到`config_private.py`中(仅复制您修改过的配置条目即可)。 」
         | 
| 117 |  | 
| 118 | 
            +
            「 支持通过`环境变量`配置项目,环境变量的书写格式参考`docker-compose.yml`文件或者我们的[Wiki页面](https://github.com/binary-husky/gpt_academic/wiki/项目配置说明)。配置读取优先级: `环境变量` > `config_private.py` > `config.py`。 」
         | 
| 119 |  | 
| 120 |  | 
| 121 | 
             
            3. 安装依赖
         | 
| 122 | 
             
            ```sh
         | 
| 123 | 
            +
            # (选择I: 如熟悉python, python推荐版本 3.9 ~ 3.11)备注:使用官方pip源或者阿里pip源, 临时换源方法:python -m pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
         | 
| 124 | 
             
            python -m pip install -r requirements.txt
         | 
| 125 |  | 
| 126 | 
             
            # (选择II: 使用Anaconda)步骤也是类似的 (https://www.bilibili.com/video/BV1rc411W7Dr):
         | 
|  | |
| 136 | 
             
            【可选步骤】如果需要支持清华ChatGLM2/复旦MOSS作为后端,需要额外安装更多依赖(前提条件:熟悉Python + 用过Pytorch + 电脑配置够强):
         | 
| 137 | 
             
            ```sh
         | 
| 138 | 
             
            # 【可选步骤I】支持清华ChatGLM2。清华ChatGLM备注:如果遇到"Call ChatGLM fail 不能正常加载ChatGLM的参数" 错误,参考如下: 1:以上默认安装的为torch+cpu版,使用cuda需要卸载torch重新安装torch+cuda; 2:如因本机配置不够无法加载模型,可以修改request_llm/bridge_chatglm.py中的模型精度, 将 AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True) 都修改为 AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True)
         | 
| 139 | 
            +
            python -m pip install -r request_llms/requirements_chatglm.txt  
         | 
| 140 |  | 
| 141 | 
             
            # 【可选步骤II】支持复旦MOSS
         | 
| 142 | 
            +
            python -m pip install -r request_llms/requirements_moss.txt
         | 
| 143 | 
            +
            git clone --depth=1 https://github.com/OpenLMLab/MOSS.git request_llms/moss  # 注意执行此行代码时,必须处于项目根路径
         | 
| 144 |  | 
| 145 | 
             
            # 【可选步骤III】支持RWKV Runner
         | 
| 146 | 
             
            参考wiki:https://github.com/binary-husky/gpt_academic/wiki/%E9%80%82%E9%85%8DRWKV-Runner
         | 
| 147 |  | 
| 148 | 
             
            # 【可选步骤IV】确保config.py配置文件的AVAIL_LLM_MODELS包含了期望的模型,目前支持的全部模型如下(jittorllms系列目前仅支持docker方案):
         | 
| 149 | 
            +
            AVAIL_LLM_MODELS = ["gpt-3.5-turbo", "api2d-gpt-3.5-turbo", "gpt-4", "api2d-gpt-4", "chatglm", "moss"] # + ["jittorllms_rwkv", "jittorllms_pangualpha", "jittorllms_llama"]
         | 
| 150 | 
             
            ```
         | 
| 151 |  | 
| 152 | 
             
            </p>
         | 
|  | |
| 161 |  | 
| 162 | 
             
            ### 安装方法II:使用Docker
         | 
| 163 |  | 
| 164 | 
            +
            0. 部署项目的全部能力(这个是包含cuda和latex的大型镜像。但如果您网速慢、硬盘小,则不推荐使用这个)
         | 
| 165 | 
            +
            [](https://github.com/binary-husky/gpt_academic/actions/workflows/build-with-all-capacity.yml)
         | 
| 166 |  | 
| 167 | 
             
            ``` sh
         | 
| 168 | 
            +
            # 修改docker-compose.yml,保留方案0并删除其他方案。然后运行:
         | 
| 169 | 
             
            docker-compose up
         | 
| 170 | 
             
            ```
         | 
| 171 |  | 
|  | |
| 175 | 
             
            [](https://github.com/binary-husky/gpt_academic/actions/workflows/build-with-audio-assistant.yml)
         | 
| 176 |  | 
| 177 | 
             
            ``` sh
         | 
| 178 | 
            +
            # 修改docker-compose.yml,保留方案1并删除其他方案。然后运行:
         | 
| 179 | 
             
            docker-compose up
         | 
| 180 | 
             
            ```
         | 
| 181 |  | 
|  | |
| 185 | 
             
            [](https://github.com/binary-husky/gpt_academic/actions/workflows/build-with-chatglm.yml)
         | 
| 186 |  | 
| 187 | 
             
            ``` sh
         | 
| 188 | 
            +
            # 修改docker-compose.yml,保留方案2并删除其他方案。然后运行:
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 189 | 
             
            docker-compose up
         | 
| 190 | 
             
            ```
         | 
| 191 |  | 
| 192 |  | 
| 193 | 
             
            ### 安装方法III:其他部署姿势
         | 
| 194 | 
            +
            1. **Windows一键运行脚本**。
         | 
| 195 | 
             
            完全不熟悉python环境的Windows用户可以下载[Release](https://github.com/binary-husky/gpt_academic/releases)中发布的一键运行脚本安装无本地模型的版本。
         | 
| 196 | 
             
            脚本的贡献来源是[oobabooga](https://github.com/oobabooga/one-click-installers)。
         | 
| 197 |  | 
| 198 | 
            +
            2. 使用第三方API、Azure等、文心一言、星火等,见[Wiki页面](https://github.com/binary-husky/gpt_academic/wiki/项目配置说明)
         | 
|  | |
|  | |
|  | |
|  | |
| 199 |  | 
| 200 | 
            +
            3. 云服务器远程部署避坑指南。
         | 
| 201 | 
            +
            请访问[云服务器远程部署wiki](https://github.com/binary-husky/gpt_academic/wiki/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9C%E7%A8%8B%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97)
         | 
| 202 |  | 
| 203 | 
            +
            4. 一些新型的部署平台或方法
         | 
| 204 | 
            +
                - 使用Sealos[一键部署](https://github.com/binary-husky/gpt_academic/issues/993)。
         | 
| 205 | 
            +
                - 使用WSL2(Windows Subsystem for Linux 子系统)。请访问[部署wiki-2](https://github.com/binary-husky/gpt_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)
         | 
| 206 | 
            +
                - 如何在二级网址(如`http://localhost/subpath`)下运行。请访问[FastAPI运行说明](docs/WithFastapi.md)
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 207 |  | 
| 208 |  | 
| 209 | 
             
            # Advanced Usage
         | 
| 210 | 
             
            ### I:自定义新的便捷按钮(学术快捷键)
         | 
| 211 | 
            +
            任意文本编辑器打开`core_functional.py`,添加条目如下,然后重启程序。(如按钮已存在,那么前缀、后缀都支持热修改,无需重启程序即可生效。)
         | 
| 212 | 
             
            例如
         | 
| 213 | 
             
            ```
         | 
| 214 | 
             
            "超级英译中": {
         | 
|  | |
| 224 | 
             
            </div>
         | 
| 225 |  | 
| 226 | 
             
            ### II:自定义函数插件
         | 
|  | |
| 227 | 
             
            编写强大的函数插件来执行任何你想得到的和想不到的任务。
         | 
| 228 | 
             
            本项目的插件编写、调试难度很低,只要您具备一定的python基础知识,就可以仿照我们提供的模板实现自己的插件功能。
         | 
| 229 | 
             
            详情请参考[函数插件指南](https://github.com/binary-husky/gpt_academic/wiki/%E5%87%BD%E6%95%B0%E6%8F%92%E4%BB%B6%E6%8C%87%E5%8D%97)。
         | 
| 230 |  | 
| 231 |  | 
| 232 | 
            +
            # Updates
         | 
| 233 | 
            +
            ### I:动态
         | 
| 234 |  | 
| 235 | 
             
            1. 对话保存功能。在函数插件区调用 `保存当前的对话` 即可将当前对话保存为可读+可复原的html文件,
         | 
| 236 | 
             
            另外在函数插件区(下拉菜单)调用 `载入对话历史存档` ,即可还原之前的会话。
         | 
|  | |
| 271 | 
             
            <img src="https://user-images.githubusercontent.com/96192199/236432361-67739153-73e8-43fe-8111-b61296edabd9.png" width="500" >
         | 
| 272 | 
             
            </div>
         | 
| 273 |  | 
| 274 | 
            +
            7. OpenAI图像生成
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 275 | 
             
            <div align="center">
         | 
| 276 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/bc7ab234-ad90-48a0-8d62-f703d9e74665" width="500" >
         | 
| 277 | 
             
            </div>
         | 
| 278 |  | 
| 279 | 
            +
            8. OpenAI音频解析与总结
         | 
| 280 | 
             
            <div align="center">
         | 
| 281 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/709ccf95-3aee-498a-934a-e1c22d3d5d5b" width="500" >
         | 
| 282 | 
             
            </div>
         | 
| 283 |  | 
| 284 | 
            +
            9. Latex全文校对纠错
         | 
| 285 | 
             
            <div align="center">
         | 
| 286 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/651ccd98-02c9-4464-91e1-77a6b7d1b033" height="200" > ===>
         | 
| 287 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/476f66d9-7716-4537-b5c1-735372c25adb" height="200">
         | 
| 288 | 
             
            </div>
         | 
| 289 |  | 
| 290 | 
            +
            10. 语言、主题切换
         | 
| 291 | 
             
            <div align="center">
         | 
| 292 | 
             
            <img src="https://github.com/binary-husky/gpt_academic/assets/96192199/b6799499-b6fb-4f0c-9c8e-1b441872f4e8" width="500" >
         | 
| 293 | 
             
            </div>
         | 
|  | |
| 295 |  | 
| 296 |  | 
| 297 | 
             
            ### II:版本:
         | 
| 298 | 
            +
            - version 3.70(todo): 优化AutoGen插件主题并设计一系列衍生插件
         | 
| 299 | 
            +
            - version 3.60: 引入AutoGen作为新一代插件的基石
         | 
| 300 | 
            +
            - version 3.57: 支持GLM3,星火v3,文心一言v4,修复本地模型的并发BUG
         | 
| 301 | 
            +
            - version 3.56: 支持动态追加基础功能按钮,新汇报PDF汇总页面
         | 
| 302 | 
            +
            - version 3.55: 重构前端界面,引入悬浮窗口与菜单栏
         | 
| 303 | 
            +
            - version 3.54: 新增动态代码解释器(Code Interpreter)(待完善)
         | 
| 304 | 
             
            - version 3.53: 支持动态选择不同界面主题,提高稳定性&解决多用户冲突问题
         | 
| 305 | 
             
            - version 3.50: 使用自然语言调用本项目的所有函数插件��虚空终端),支持插件分类,改进UI,设计新主题
         | 
| 306 | 
             
            - version 3.49: 支持百度千帆平台和文心一言
         | 
|  | |
| 322 | 
             
            - version 2.0: 引入模块化函数插件
         | 
| 323 | 
             
            - version 1.0: 基础功能
         | 
| 324 |  | 
| 325 | 
            +
            GPT Academic开发者QQ群:`610599535`
         | 
| 326 |  | 
| 327 | 
             
            - 已知问题
         | 
| 328 | 
             
                - 某些浏览器翻译插件干扰此软件前端的运行
         | 
|  | |
| 333 | 
             
            1. `Chuanhu-Small-and-Beautiful` [网址](https://github.com/GaiZhenbiao/ChuanhuChatGPT/)
         | 
| 334 |  | 
| 335 |  | 
| 336 | 
            +
            ### IV:本项目的开发分支
         | 
| 337 | 
            +
             | 
| 338 | 
            +
            1. `master` 分支: 主分支,稳定版
         | 
| 339 | 
            +
            2. `frontier` 分支: 开发分支,测试版
         | 
| 340 | 
            +
             | 
| 341 | 
            +
             | 
| 342 | 
            +
            ### V:参考与学习
         | 
| 343 |  | 
| 344 | 
             
            ```
         | 
| 345 | 
             
            代码中参考了很多其他优秀项目中的设计,顺序不分先后:
         | 
    	
        app.py
    CHANGED
    
    | @@ -1,4 +1,6 @@ | |
| 1 | 
             
            import os; os.environ['no_proxy'] = '*' # 避免代理网络产生意外污染
         | 
|  | |
|  | |
| 2 |  | 
| 3 | 
             
            def main():
         | 
| 4 | 
             
                import subprocess, sys
         | 
| @@ -6,20 +8,20 @@ def main(): | |
| 6 | 
             
                import gradio as gr
         | 
| 7 | 
             
                if gr.__version__ not in ['3.32.6']: 
         | 
| 8 | 
             
                    raise ModuleNotFoundError("使用项目内置Gradio获取最优体验! 请运行 `pip install -r requirements.txt` 指令安装内置Gradio及其他依赖, 详情信息见requirements.txt.")
         | 
| 9 | 
            -
                from  | 
| 10 | 
             
                from toolbox import format_io, find_free_port, on_file_uploaded, on_report_generated, get_conf, ArgsGeneralWrapper, load_chat_cookies, DummyWith
         | 
| 11 | 
             
                # 建议您复制一个config_private.py放自己的秘密, 如API和代理网址, 避免不小心传github被别人看到
         | 
| 12 | 
             
                proxies, WEB_PORT, LLM_MODEL, CONCURRENT_COUNT, AUTHENTICATION = get_conf('proxies', 'WEB_PORT', 'LLM_MODEL', 'CONCURRENT_COUNT', 'AUTHENTICATION')
         | 
| 13 | 
             
                CHATBOT_HEIGHT, LAYOUT, AVAIL_LLM_MODELS, AUTO_CLEAR_TXT = get_conf('CHATBOT_HEIGHT', 'LAYOUT', 'AVAIL_LLM_MODELS', 'AUTO_CLEAR_TXT')
         | 
| 14 | 
             
                ENABLE_AUDIO, AUTO_CLEAR_TXT, PATH_LOGGING, AVAIL_THEMES, THEME = get_conf('ENABLE_AUDIO', 'AUTO_CLEAR_TXT', 'PATH_LOGGING', 'AVAIL_THEMES', 'THEME')
         | 
| 15 | 
            -
                DARK_MODE, = get_conf('DARK_MODE')
         | 
|  | |
| 16 |  | 
| 17 | 
             
                # 如果WEB_PORT是-1, 则随机选取WEB端口
         | 
| 18 | 
             
                PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT
         | 
| 19 | 
             
                from check_proxy import get_current_version
         | 
| 20 | 
             
                from themes.theme import adjust_theme, advanced_css, theme_declaration, load_dynamic_theme
         | 
| 21 |  | 
| 22 | 
            -
                initial_prompt = "Serve me as a writing and programming assistant."
         | 
| 23 | 
             
                title_html = f"<h1 align=\"center\">GPT 学术优化 {get_current_version()}</h1>{theme_declaration}"
         | 
| 24 | 
             
                description =  "Github源代码开源和更新[地址🚀](https://github.com/binary-husky/gpt_academic), "
         | 
| 25 | 
             
                description += "感谢热情的[开发者们❤️](https://github.com/binary-husky/gpt_academic/graphs/contributors)."
         | 
| @@ -31,6 +33,7 @@ def main(): | |
| 31 | 
             
                description += "</br></br>虚空终端使用说明: 点击虚空终端, 然后根据提示输入指令, 再次点击虚空终端"
         | 
| 32 | 
             
                description += "</br></br>如何保存对话: 点击保存当前的对话按钮"
         | 
| 33 | 
             
                description += "</br></br>如何语音对话: 请阅读Wiki"
         | 
|  | |
| 34 |  | 
| 35 | 
             
                # 问询记录, python 版本建议3.9+(越新越好)
         | 
| 36 | 
             
                import logging, uuid
         | 
| @@ -47,7 +50,7 @@ def main(): | |
| 47 |  | 
| 48 | 
             
                # 高级函数插件
         | 
| 49 | 
             
                from crazy_functional import get_crazy_functions
         | 
| 50 | 
            -
                DEFAULT_FN_GROUPS | 
| 51 | 
             
                plugins = get_crazy_functions()
         | 
| 52 | 
             
                all_plugin_groups = list(set([g for _, plugin in plugins.items() for g in plugin['Group'].split('|')]))
         | 
| 53 | 
             
                match_group = lambda tags, groups: any([g in groups for g in tags.split('|')])
         | 
| @@ -70,10 +73,12 @@ def main(): | |
| 70 | 
             
                    CHATBOT_HEIGHT /= 2
         | 
| 71 |  | 
| 72 | 
             
                cancel_handles = []
         | 
|  | |
|  | |
| 73 | 
             
                with gr.Blocks(title="GPT 学术优化", theme=set_theme, analytics_enabled=False, css=advanced_css) as demo:
         | 
| 74 | 
             
                    gr.HTML(title_html)
         | 
| 75 | 
             
                    gr.HTML('''<center><a href="https://huggingface.co/spaces/qingxu98/gpt-academic?duplicate=true"><img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a>请您打开此页面后务必点击上方的“复制空间”(Duplicate Space)按钮!<font color="#FF00FF">使用时,先在输入框填入API-KEY然后回车。</font><br/>切忌在“复制空间”(Duplicate Space)之前填入API_KEY或进行提问,否则您的API_KEY将极可能被空间所有者攫取!<br/>支持任意数量的OpenAI的密钥和API2D的密钥共存,例如输入"OpenAI密钥1,API2D密钥2",然后提交,即可同时使用两种模型接口。</center>''')
         | 
| 76 | 
            -
                    secret_css, dark_mode = gr.Textbox(visible=False), gr.Textbox(DARK_MODE, visible=False)
         | 
| 77 | 
             
                    cookies = gr.State(load_chat_cookies())
         | 
| 78 | 
             
                    with gr_L1():
         | 
| 79 | 
             
                        with gr_L2(scale=2, elem_id="gpt-chat"):
         | 
| @@ -92,16 +97,21 @@ def main(): | |
| 92 | 
             
                                    clearBtn = gr.Button("清除", elem_id="elem_clear", variant="secondary", visible=False); clearBtn.style(size="sm")
         | 
| 93 | 
             
                                if ENABLE_AUDIO: 
         | 
| 94 | 
             
                                    with gr.Row():
         | 
| 95 | 
            -
                                        audio_mic = gr.Audio(source="microphone", type="numpy", streaming=True, show_label=False).style(container=False)
         | 
| 96 | 
             
                                with gr.Row():
         | 
| 97 | 
             
                                    status = gr.Markdown(f"Tip: 按Enter提交, 按Shift+Enter换行。当前模型: {LLM_MODEL} \n {proxy_info}", elem_id="state-panel")
         | 
| 98 | 
             
                            with gr.Accordion("基础功能区", open=True, elem_id="basic-panel") as area_basic_fn:
         | 
| 99 | 
             
                                with gr.Row():
         | 
|  | |
|  | |
|  | |
|  | |
| 100 | 
             
                                    for k in functional:
         | 
| 101 | 
             
                                        if ("Visible" in functional[k]) and (not functional[k]["Visible"]): continue
         | 
| 102 | 
             
                                        variant = functional[k]["Color"] if "Color" in functional[k] else "secondary"
         | 
| 103 | 
             
                                        functional[k]["Button"] = gr.Button(k, variant=variant, info_str=f'基础功能区: {k}')
         | 
| 104 | 
             
                                        functional[k]["Button"].style(size="sm")
         | 
|  | |
| 105 | 
             
                            with gr.Accordion("函数插件区", open=True, elem_id="plugin-panel") as area_crazy_fn:
         | 
| 106 | 
             
                                with gr.Row():
         | 
| 107 | 
             
                                    gr.Markdown("插件可读取“输入区”文本/路径作为参数(上传文件自动修正路径)")
         | 
| @@ -146,12 +156,14 @@ def main(): | |
| 146 | 
             
                                top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.01,interactive=True, label="Top-p (nucleus sampling)",)
         | 
| 147 | 
             
                                temperature = gr.Slider(minimum=-0, maximum=2.0, value=1.0, step=0.01, interactive=True, label="Temperature",)
         | 
| 148 | 
             
                                max_length_sl = gr.Slider(minimum=256, maximum=1024*32, value=4096, step=128, interactive=True, label="Local LLM MaxLength",)
         | 
| 149 | 
            -
                                system_prompt = gr.Textbox(show_label=True, lines=2, placeholder=f"System Prompt", label="System prompt", value= | 
| 150 |  | 
| 151 | 
             
                            with gr.Tab("界面外观", elem_id="interact-panel"):
         | 
| 152 | 
             
                                theme_dropdown = gr.Dropdown(AVAIL_THEMES, value=THEME, label="更换UI主题").style(container=False)
         | 
| 153 | 
             
                                checkboxes = gr.CheckboxGroup(["基础功能区", "函数插件区", "浮动输入区", "输入清除键", "插件参数区"], 
         | 
| 154 | 
             
                                                              value=["基础功能区", "函数插件区"], label="显示/隐藏功能区", elem_id='cbs').style(container=False)
         | 
|  | |
|  | |
| 155 | 
             
                                dark_mode_btn = gr.Button("切换界面明暗 ☀", variant="secondary").style(size="sm")
         | 
| 156 | 
             
                                dark_mode_btn.click(None, None, None, _js="""() => {
         | 
| 157 | 
             
                                        if (document.querySelectorAll('.dark').length) {
         | 
| @@ -176,6 +188,77 @@ def main(): | |
| 176 | 
             
                                    stopBtn2 = gr.Button("停止", variant="secondary"); stopBtn2.style(size="sm")
         | 
| 177 | 
             
                                    clearBtn2 = gr.Button("清除", variant="secondary", visible=False); clearBtn2.style(size="sm")
         | 
| 178 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 179 | 
             
                    # 功能区显示开关与功能区的互动
         | 
| 180 | 
             
                    def fn_area_visibility(a):
         | 
| 181 | 
             
                        ret = {}
         | 
| @@ -189,6 +272,14 @@ def main(): | |
| 189 | 
             
                        if "浮动输入区" in a: ret.update({txt: gr.update(value="")})
         | 
| 190 | 
             
                        return ret
         | 
| 191 | 
             
                    checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2, clearBtn, clearBtn2, plugin_advanced_arg] )
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 192 | 
             
                    # 整理反复出现的控件句柄组合
         | 
| 193 | 
             
                    input_combo = [cookies, max_length_sl, md_dropdown, txt, txt2, top_p, temperature, chatbot, history, system_prompt, plugin_advanced_arg]
         | 
| 194 | 
             
                    output_combo = [cookies, chatbot, history, status]
         | 
| @@ -212,6 +303,9 @@ def main(): | |
| 212 | 
             
                        if ("Visible" in functional[k]) and (not functional[k]["Visible"]): continue
         | 
| 213 | 
             
                        click_handle = functional[k]["Button"].click(fn=ArgsGeneralWrapper(predict), inputs=[*input_combo, gr.State(True), gr.State(k)], outputs=output_combo)
         | 
| 214 | 
             
                        cancel_handles.append(click_handle)
         | 
|  | |
|  | |
|  | |
| 215 | 
             
                    # 文件上传区,接收文件后与chatbot的互动
         | 
| 216 | 
             
                    file_upload.upload(on_file_uploaded, [file_upload, chatbot, txt, txt2, checkboxes, cookies], [chatbot, txt, txt2, cookies])
         | 
| 217 | 
             
                    file_upload_2.upload(on_file_uploaded, [file_upload_2, chatbot, txt, txt2, checkboxes, cookies], [chatbot, txt, txt2, cookies])
         | 
| @@ -310,33 +404,30 @@ def main(): | |
| 310 | 
             
                            }
         | 
| 311 | 
             
                        }
         | 
| 312 | 
             
                    }"""
         | 
|  | |
|  | |
|  | |
|  | |
| 313 | 
             
                    demo.load(None, inputs=[dark_mode], outputs=None, _js=darkmode_js)    # 配置暗色主题或亮色主题
         | 
| 314 | 
             
                    demo.load(None, inputs=[gr.Textbox(LAYOUT, visible=False)], outputs=None, _js='(LAYOUT)=>{GptAcademicJavaScriptInit(LAYOUT);}')
         | 
| 315 |  | 
| 316 | 
             
                # gradio的inbrowser触发不太稳定,回滚代码到原始的浏览器打开函数
         | 
| 317 | 
            -
                def  | 
| 318 | 
             
                    import threading, webbrowser, time
         | 
| 319 | 
             
                    print(f"如果浏览器没有自动打开,请复制并转到以下URL:")
         | 
| 320 | 
             
                    if DARK_MODE:   print(f"\t「暗色主题已启用(支持动态切换主题)」: http://localhost:{PORT}")
         | 
| 321 | 
             
                    else:           print(f"\t「亮色主题已启用(支持动态切换主题)」: http://localhost:{PORT}")
         | 
| 322 | 
            -
                    def open():
         | 
| 323 | 
            -
                        time.sleep(2)       # 打开浏览器
         | 
| 324 | 
            -
                        webbrowser.open_new_tab(f"http://localhost:{PORT}")
         | 
| 325 | 
            -
                    threading.Thread(target=open, name="open-browser", daemon=True).start()
         | 
| 326 | 
            -
                    threading.Thread(target=auto_update, name="self-upgrade", daemon=True).start()
         | 
| 327 | 
            -
                    threading.Thread(target=warm_up_modules, name="warm-up", daemon=True).start()
         | 
| 328 |  | 
| 329 | 
            -
                auto_opentab_delay()
         | 
| 330 | 
             
                demo.queue(concurrency_count=CONCURRENT_COUNT).launch(server_name="0.0.0.0", share=False, favicon_path="docs/logo.png", blocked_paths=["config.py","config_private.py","docker-compose.yml","Dockerfile"])
         | 
| 331 |  | 
| 332 | 
             
                # 如果需要在二级路径下运行
         | 
| 333 | 
            -
                # CUSTOM_PATH | 
| 334 | 
             
                # if CUSTOM_PATH != "/": 
         | 
| 335 | 
             
                #     from toolbox import run_gradio_in_subpath
         | 
| 336 | 
             
                #     run_gradio_in_subpath(demo, auth=AUTHENTICATION, port=PORT, custom_path=CUSTOM_PATH)
         | 
| 337 | 
             
                # else: 
         | 
| 338 | 
             
                #     demo.launch(server_name="0.0.0.0", server_port=PORT, auth=AUTHENTICATION, favicon_path="docs/logo.png",
         | 
| 339 | 
            -
                #                 blocked_paths=["config.py","config_private.py","docker-compose.yml","Dockerfile"])
         | 
| 340 |  | 
| 341 | 
             
            if __name__ == "__main__":
         | 
| 342 | 
             
                main()
         | 
|  | |
| 1 | 
             
            import os; os.environ['no_proxy'] = '*' # 避免代理网络产生意外污染
         | 
| 2 | 
            +
            import pickle
         | 
| 3 | 
            +
            import base64
         | 
| 4 |  | 
| 5 | 
             
            def main():
         | 
| 6 | 
             
                import subprocess, sys
         | 
|  | |
| 8 | 
             
                import gradio as gr
         | 
| 9 | 
             
                if gr.__version__ not in ['3.32.6']: 
         | 
| 10 | 
             
                    raise ModuleNotFoundError("使用项目内置Gradio获取最优体验! 请运行 `pip install -r requirements.txt` 指令安装内置Gradio及其他依赖, 详情信息见requirements.txt.")
         | 
| 11 | 
            +
                from request_llms.bridge_all import predict
         | 
| 12 | 
             
                from toolbox import format_io, find_free_port, on_file_uploaded, on_report_generated, get_conf, ArgsGeneralWrapper, load_chat_cookies, DummyWith
         | 
| 13 | 
             
                # 建议您复制一个config_private.py放自己的秘密, 如API和代理网址, 避免不小心传github被别人看到
         | 
| 14 | 
             
                proxies, WEB_PORT, LLM_MODEL, CONCURRENT_COUNT, AUTHENTICATION = get_conf('proxies', 'WEB_PORT', 'LLM_MODEL', 'CONCURRENT_COUNT', 'AUTHENTICATION')
         | 
| 15 | 
             
                CHATBOT_HEIGHT, LAYOUT, AVAIL_LLM_MODELS, AUTO_CLEAR_TXT = get_conf('CHATBOT_HEIGHT', 'LAYOUT', 'AVAIL_LLM_MODELS', 'AUTO_CLEAR_TXT')
         | 
| 16 | 
             
                ENABLE_AUDIO, AUTO_CLEAR_TXT, PATH_LOGGING, AVAIL_THEMES, THEME = get_conf('ENABLE_AUDIO', 'AUTO_CLEAR_TXT', 'PATH_LOGGING', 'AVAIL_THEMES', 'THEME')
         | 
| 17 | 
            +
                DARK_MODE, NUM_CUSTOM_BASIC_BTN, SSL_KEYFILE, SSL_CERTFILE = get_conf('DARK_MODE', 'NUM_CUSTOM_BASIC_BTN', 'SSL_KEYFILE', 'SSL_CERTFILE')
         | 
| 18 | 
            +
                INIT_SYS_PROMPT = get_conf('INIT_SYS_PROMPT')
         | 
| 19 |  | 
| 20 | 
             
                # 如果WEB_PORT是-1, 则随机选取WEB端口
         | 
| 21 | 
             
                PORT = find_free_port() if WEB_PORT <= 0 else WEB_PORT
         | 
| 22 | 
             
                from check_proxy import get_current_version
         | 
| 23 | 
             
                from themes.theme import adjust_theme, advanced_css, theme_declaration, load_dynamic_theme
         | 
| 24 |  | 
|  | |
| 25 | 
             
                title_html = f"<h1 align=\"center\">GPT 学术优化 {get_current_version()}</h1>{theme_declaration}"
         | 
| 26 | 
             
                description =  "Github源代码开源和更新[地址🚀](https://github.com/binary-husky/gpt_academic), "
         | 
| 27 | 
             
                description += "感谢热情的[开发者们❤️](https://github.com/binary-husky/gpt_academic/graphs/contributors)."
         | 
|  | |
| 33 | 
             
                description += "</br></br>虚空终端使用说明: 点击虚空终端, 然后根据提示输入指令, 再次点击虚空终端"
         | 
| 34 | 
             
                description += "</br></br>如何保存对话: 点击保存当前的对话按钮"
         | 
| 35 | 
             
                description += "</br></br>如何语音对话: 请阅读Wiki"
         | 
| 36 | 
            +
                description += "</br></br>如何临时更换API_KEY: 在输入区输入临时API_KEY后提交(网页刷新后失效)"
         | 
| 37 |  | 
| 38 | 
             
                # 问询记录, python 版本建议3.9+(越新越好)
         | 
| 39 | 
             
                import logging, uuid
         | 
|  | |
| 50 |  | 
| 51 | 
             
                # 高级函数插件
         | 
| 52 | 
             
                from crazy_functional import get_crazy_functions
         | 
| 53 | 
            +
                DEFAULT_FN_GROUPS = get_conf('DEFAULT_FN_GROUPS')
         | 
| 54 | 
             
                plugins = get_crazy_functions()
         | 
| 55 | 
             
                all_plugin_groups = list(set([g for _, plugin in plugins.items() for g in plugin['Group'].split('|')]))
         | 
| 56 | 
             
                match_group = lambda tags, groups: any([g in groups for g in tags.split('|')])
         | 
|  | |
| 73 | 
             
                    CHATBOT_HEIGHT /= 2
         | 
| 74 |  | 
| 75 | 
             
                cancel_handles = []
         | 
| 76 | 
            +
                customize_btns = {}
         | 
| 77 | 
            +
                predefined_btns = {}
         | 
| 78 | 
             
                with gr.Blocks(title="GPT 学术优化", theme=set_theme, analytics_enabled=False, css=advanced_css) as demo:
         | 
| 79 | 
             
                    gr.HTML(title_html)
         | 
| 80 | 
             
                    gr.HTML('''<center><a href="https://huggingface.co/spaces/qingxu98/gpt-academic?duplicate=true"><img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a>请您打开此页面后务必点击上方的“复制空间”(Duplicate Space)按钮!<font color="#FF00FF">使用时,先在输入框填入API-KEY然后回车。</font><br/>切忌在“复制空间”(Duplicate Space)之前填入API_KEY或进行提问,否则您的API_KEY将极可能被空间所有者攫取!<br/>支持任意数量的OpenAI的密钥和API2D的密钥共存,例如输入"OpenAI密钥1,API2D密钥2",然后提交,即可同时使用两种模型接口。</center>''')
         | 
| 81 | 
            +
                    secret_css, dark_mode, persistent_cookie = gr.Textbox(visible=False), gr.Textbox(DARK_MODE, visible=False), gr.Textbox(visible=False)
         | 
| 82 | 
             
                    cookies = gr.State(load_chat_cookies())
         | 
| 83 | 
             
                    with gr_L1():
         | 
| 84 | 
             
                        with gr_L2(scale=2, elem_id="gpt-chat"):
         | 
|  | |
| 97 | 
             
                                    clearBtn = gr.Button("清除", elem_id="elem_clear", variant="secondary", visible=False); clearBtn.style(size="sm")
         | 
| 98 | 
             
                                if ENABLE_AUDIO: 
         | 
| 99 | 
             
                                    with gr.Row():
         | 
| 100 | 
            +
                                        audio_mic = gr.Audio(source="microphone", type="numpy", elem_id="elem_audio", streaming=True, show_label=False).style(container=False)
         | 
| 101 | 
             
                                with gr.Row():
         | 
| 102 | 
             
                                    status = gr.Markdown(f"Tip: 按Enter提交, 按Shift+Enter换行。当前模型: {LLM_MODEL} \n {proxy_info}", elem_id="state-panel")
         | 
| 103 | 
             
                            with gr.Accordion("基础功能区", open=True, elem_id="basic-panel") as area_basic_fn:
         | 
| 104 | 
             
                                with gr.Row():
         | 
| 105 | 
            +
                                    for k in range(NUM_CUSTOM_BASIC_BTN):
         | 
| 106 | 
            +
                                        customize_btn = gr.Button("自定义按钮" + str(k+1), visible=False, variant="secondary", info_str=f'基础功能区: 自定义按钮')
         | 
| 107 | 
            +
                                        customize_btn.style(size="sm")
         | 
| 108 | 
            +
                                        customize_btns.update({"自定义按钮" + str(k+1): customize_btn})
         | 
| 109 | 
             
                                    for k in functional:
         | 
| 110 | 
             
                                        if ("Visible" in functional[k]) and (not functional[k]["Visible"]): continue
         | 
| 111 | 
             
                                        variant = functional[k]["Color"] if "Color" in functional[k] else "secondary"
         | 
| 112 | 
             
                                        functional[k]["Button"] = gr.Button(k, variant=variant, info_str=f'基础功能区: {k}')
         | 
| 113 | 
             
                                        functional[k]["Button"].style(size="sm")
         | 
| 114 | 
            +
                                        predefined_btns.update({k: functional[k]["Button"]})
         | 
| 115 | 
             
                            with gr.Accordion("函数插件区", open=True, elem_id="plugin-panel") as area_crazy_fn:
         | 
| 116 | 
             
                                with gr.Row():
         | 
| 117 | 
             
                                    gr.Markdown("插件可读取“输入区”文本/路径作为参数(上传文件自动修正路径)")
         | 
|  | |
| 156 | 
             
                                top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.01,interactive=True, label="Top-p (nucleus sampling)",)
         | 
| 157 | 
             
                                temperature = gr.Slider(minimum=-0, maximum=2.0, value=1.0, step=0.01, interactive=True, label="Temperature",)
         | 
| 158 | 
             
                                max_length_sl = gr.Slider(minimum=256, maximum=1024*32, value=4096, step=128, interactive=True, label="Local LLM MaxLength",)
         | 
| 159 | 
            +
                                system_prompt = gr.Textbox(show_label=True, lines=2, placeholder=f"System Prompt", label="System prompt", value=INIT_SYS_PROMPT)
         | 
| 160 |  | 
| 161 | 
             
                            with gr.Tab("界面外观", elem_id="interact-panel"):
         | 
| 162 | 
             
                                theme_dropdown = gr.Dropdown(AVAIL_THEMES, value=THEME, label="更换UI主题").style(container=False)
         | 
| 163 | 
             
                                checkboxes = gr.CheckboxGroup(["基础功能区", "函数插件区", "浮动输入区", "输入清除键", "插件参数区"], 
         | 
| 164 | 
             
                                                              value=["基础功能区", "函数插件区"], label="显示/隐藏功能区", elem_id='cbs').style(container=False)
         | 
| 165 | 
            +
                                checkboxes_2 = gr.CheckboxGroup(["自定义菜单"], 
         | 
| 166 | 
            +
                                                              value=[], label="显示/隐藏自定义菜单", elem_id='cbs').style(container=False)
         | 
| 167 | 
             
                                dark_mode_btn = gr.Button("切换界面明暗 ☀", variant="secondary").style(size="sm")
         | 
| 168 | 
             
                                dark_mode_btn.click(None, None, None, _js="""() => {
         | 
| 169 | 
             
                                        if (document.querySelectorAll('.dark').length) {
         | 
|  | |
| 188 | 
             
                                    stopBtn2 = gr.Button("停止", variant="secondary"); stopBtn2.style(size="sm")
         | 
| 189 | 
             
                                    clearBtn2 = gr.Button("清除", variant="secondary", visible=False); clearBtn2.style(size="sm")
         | 
| 190 |  | 
| 191 | 
            +
                    def to_cookie_str(d):
         | 
| 192 | 
            +
                        # Pickle the dictionary and encode it as a string
         | 
| 193 | 
            +
                        pickled_dict = pickle.dumps(d)
         | 
| 194 | 
            +
                        cookie_value = base64.b64encode(pickled_dict).decode('utf-8')
         | 
| 195 | 
            +
                        return cookie_value
         | 
| 196 | 
            +
                    
         | 
| 197 | 
            +
                    def from_cookie_str(c):
         | 
| 198 | 
            +
                        # Decode the base64-encoded string and unpickle it into a dictionary
         | 
| 199 | 
            +
                        pickled_dict = base64.b64decode(c.encode('utf-8'))
         | 
| 200 | 
            +
                        return pickle.loads(pickled_dict)
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                    with gr.Floating(init_x="20%", init_y="50%", visible=False, width="40%", drag="top") as area_customize:
         | 
| 203 | 
            +
                        with gr.Accordion("自定义菜单", open=True, elem_id="edit-panel"):
         | 
| 204 | 
            +
                            with gr.Row() as row:
         | 
| 205 | 
            +
                                with gr.Column(scale=10):
         | 
| 206 | 
            +
                                    AVAIL_BTN = [btn for btn in customize_btns.keys()] + [k for k in functional]
         | 
| 207 | 
            +
                                    basic_btn_dropdown = gr.Dropdown(AVAIL_BTN, value="自定义按钮1", label="选择一个需要自定义基础功能区按钮").style(container=False)
         | 
| 208 | 
            +
                                    basic_fn_title = gr.Textbox(show_label=False, placeholder="输入新按钮名称", lines=1).style(container=False)
         | 
| 209 | 
            +
                                    basic_fn_prefix = gr.Textbox(show_label=False, placeholder="输入新提示前缀", lines=4).style(container=False)
         | 
| 210 | 
            +
                                    basic_fn_suffix = gr.Textbox(show_label=False, placeholder="输入新提示后缀", lines=4).style(container=False)
         | 
| 211 | 
            +
                                with gr.Column(scale=1, min_width=70):
         | 
| 212 | 
            +
                                    basic_fn_confirm = gr.Button("确认并保存", variant="primary"); basic_fn_confirm.style(size="sm")
         | 
| 213 | 
            +
                                    basic_fn_load    = gr.Button("加载已保存", variant="primary"); basic_fn_load.style(size="sm")
         | 
| 214 | 
            +
                                    def assign_btn(persistent_cookie_, cookies_, basic_btn_dropdown_, basic_fn_title, basic_fn_prefix, basic_fn_suffix):
         | 
| 215 | 
            +
                                        ret = {}
         | 
| 216 | 
            +
                                        customize_fn_overwrite_ = cookies_['customize_fn_overwrite']
         | 
| 217 | 
            +
                                        customize_fn_overwrite_.update({
         | 
| 218 | 
            +
                                            basic_btn_dropdown_:
         | 
| 219 | 
            +
                                                {
         | 
| 220 | 
            +
                                                    "Title":basic_fn_title,
         | 
| 221 | 
            +
                                                    "Prefix":basic_fn_prefix,
         | 
| 222 | 
            +
                                                    "Suffix":basic_fn_suffix,
         | 
| 223 | 
            +
                                                }
         | 
| 224 | 
            +
                                            }
         | 
| 225 | 
            +
                                        )
         | 
| 226 | 
            +
                                        cookies_.update(customize_fn_overwrite_)
         | 
| 227 | 
            +
                                        if basic_btn_dropdown_ in customize_btns:
         | 
| 228 | 
            +
                                            ret.update({customize_btns[basic_btn_dropdown_]: gr.update(visible=True, value=basic_fn_title)})
         | 
| 229 | 
            +
                                        else:
         | 
| 230 | 
            +
                                            ret.update({predefined_btns[basic_btn_dropdown_]: gr.update(visible=True, value=basic_fn_title)})
         | 
| 231 | 
            +
                                        ret.update({cookies: cookies_})
         | 
| 232 | 
            +
                                        try: persistent_cookie_ = from_cookie_str(persistent_cookie_)    # persistent cookie to dict
         | 
| 233 | 
            +
                                        except: persistent_cookie_ = {}
         | 
| 234 | 
            +
                                        persistent_cookie_["custom_bnt"] = customize_fn_overwrite_   # dict update new value
         | 
| 235 | 
            +
                                        persistent_cookie_ = to_cookie_str(persistent_cookie_)         # persistent cookie to dict
         | 
| 236 | 
            +
                                        ret.update({persistent_cookie: persistent_cookie_})                             # write persistent cookie
         | 
| 237 | 
            +
                                        return ret
         | 
| 238 | 
            +
                                    
         | 
| 239 | 
            +
                                    def reflesh_btn(persistent_cookie_, cookies_):
         | 
| 240 | 
            +
                                        ret = {}
         | 
| 241 | 
            +
                                        for k in customize_btns:
         | 
| 242 | 
            +
                                            ret.update({customize_btns[k]: gr.update(visible=False, value="")})
         | 
| 243 | 
            +
             | 
| 244 | 
            +
                                        try: persistent_cookie_ = from_cookie_str(persistent_cookie_)    # persistent cookie to dict
         | 
| 245 | 
            +
                                        except: return ret
         | 
| 246 | 
            +
                                        
         | 
| 247 | 
            +
                                        customize_fn_overwrite_ = persistent_cookie_.get("custom_bnt", {})
         | 
| 248 | 
            +
                                        cookies_['customize_fn_overwrite'] = customize_fn_overwrite_
         | 
| 249 | 
            +
                                        ret.update({cookies: cookies_})
         | 
| 250 | 
            +
             | 
| 251 | 
            +
                                        for k,v in persistent_cookie_["custom_bnt"].items():
         | 
| 252 | 
            +
                                            if v['Title'] == "": continue
         | 
| 253 | 
            +
                                            if k in customize_btns: ret.update({customize_btns[k]: gr.update(visible=True, value=v['Title'])})
         | 
| 254 | 
            +
                                            else: ret.update({predefined_btns[k]: gr.update(visible=True, value=v['Title'])})
         | 
| 255 | 
            +
                                        return ret
         | 
| 256 | 
            +
                                    
         | 
| 257 | 
            +
                                    basic_fn_load.click(reflesh_btn, [persistent_cookie, cookies],[cookies, *customize_btns.values(), *predefined_btns.values()])
         | 
| 258 | 
            +
                                    h = basic_fn_confirm.click(assign_btn, [persistent_cookie, cookies, basic_btn_dropdown, basic_fn_title, basic_fn_prefix, basic_fn_suffix], 
         | 
| 259 | 
            +
                                                               [persistent_cookie, cookies, *customize_btns.values(), *predefined_btns.values()])
         | 
| 260 | 
            +
                                    h.then(None, [persistent_cookie], None, _js="""(persistent_cookie)=>{setCookie("persistent_cookie", persistent_cookie, 5);}""") # save persistent cookie
         | 
| 261 | 
            +
             | 
| 262 | 
             
                    # 功能区显示开关与功能区的互动
         | 
| 263 | 
             
                    def fn_area_visibility(a):
         | 
| 264 | 
             
                        ret = {}
         | 
|  | |
| 272 | 
             
                        if "浮动输入区" in a: ret.update({txt: gr.update(value="")})
         | 
| 273 | 
             
                        return ret
         | 
| 274 | 
             
                    checkboxes.select(fn_area_visibility, [checkboxes], [area_basic_fn, area_crazy_fn, area_input_primary, area_input_secondary, txt, txt2, clearBtn, clearBtn2, plugin_advanced_arg] )
         | 
| 275 | 
            +
             | 
| 276 | 
            +
                    # 功能区显示开关与功能区的互动
         | 
| 277 | 
            +
                    def fn_area_visibility_2(a):
         | 
| 278 | 
            +
                        ret = {}
         | 
| 279 | 
            +
                        ret.update({area_customize: gr.update(visible=("自定义菜单" in a))})
         | 
| 280 | 
            +
                        return ret
         | 
| 281 | 
            +
                    checkboxes_2.select(fn_area_visibility_2, [checkboxes_2], [area_customize] )
         | 
| 282 | 
            +
             | 
| 283 | 
             
                    # 整理反复出现的控件句柄组合
         | 
| 284 | 
             
                    input_combo = [cookies, max_length_sl, md_dropdown, txt, txt2, top_p, temperature, chatbot, history, system_prompt, plugin_advanced_arg]
         | 
| 285 | 
             
                    output_combo = [cookies, chatbot, history, status]
         | 
|  | |
| 303 | 
             
                        if ("Visible" in functional[k]) and (not functional[k]["Visible"]): continue
         | 
| 304 | 
             
                        click_handle = functional[k]["Button"].click(fn=ArgsGeneralWrapper(predict), inputs=[*input_combo, gr.State(True), gr.State(k)], outputs=output_combo)
         | 
| 305 | 
             
                        cancel_handles.append(click_handle)
         | 
| 306 | 
            +
                    for btn in customize_btns.values():
         | 
| 307 | 
            +
                        click_handle = btn.click(fn=ArgsGeneralWrapper(predict), inputs=[*input_combo, gr.State(True), gr.State(btn.value)], outputs=output_combo)
         | 
| 308 | 
            +
                        cancel_handles.append(click_handle)
         | 
| 309 | 
             
                    # 文件上传区,接收文件后与chatbot的互动
         | 
| 310 | 
             
                    file_upload.upload(on_file_uploaded, [file_upload, chatbot, txt, txt2, checkboxes, cookies], [chatbot, txt, txt2, cookies])
         | 
| 311 | 
             
                    file_upload_2.upload(on_file_uploaded, [file_upload_2, chatbot, txt, txt2, checkboxes, cookies], [chatbot, txt, txt2, cookies])
         | 
|  | |
| 404 | 
             
                            }
         | 
| 405 | 
             
                        }
         | 
| 406 | 
             
                    }"""
         | 
| 407 | 
            +
                    load_cookie_js = """(persistent_cookie) => {
         | 
| 408 | 
            +
                        return getCookie("persistent_cookie");
         | 
| 409 | 
            +
                    }"""
         | 
| 410 | 
            +
                    demo.load(None, inputs=None, outputs=[persistent_cookie], _js=load_cookie_js)
         | 
| 411 | 
             
                    demo.load(None, inputs=[dark_mode], outputs=None, _js=darkmode_js)    # 配置暗色主题或亮色主题
         | 
| 412 | 
             
                    demo.load(None, inputs=[gr.Textbox(LAYOUT, visible=False)], outputs=None, _js='(LAYOUT)=>{GptAcademicJavaScriptInit(LAYOUT);}')
         | 
| 413 |  | 
| 414 | 
             
                # gradio的inbrowser触发不太稳定,回滚代码到原始的浏览器打开函数
         | 
| 415 | 
            +
                def run_delayed_tasks():
         | 
| 416 | 
             
                    import threading, webbrowser, time
         | 
| 417 | 
             
                    print(f"如果浏览器没有自动打开,请复制并转到以下URL:")
         | 
| 418 | 
             
                    if DARK_MODE:   print(f"\t「暗色主题已启用(支持动态切换主题)」: http://localhost:{PORT}")
         | 
| 419 | 
             
                    else:           print(f"\t「亮色主题已启用(支持动态切换主题)」: http://localhost:{PORT}")
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 420 |  | 
|  | |
| 421 | 
             
                demo.queue(concurrency_count=CONCURRENT_COUNT).launch(server_name="0.0.0.0", share=False, favicon_path="docs/logo.png", blocked_paths=["config.py","config_private.py","docker-compose.yml","Dockerfile"])
         | 
| 422 |  | 
| 423 | 
             
                # 如果需要在二级路径下运行
         | 
| 424 | 
            +
                # CUSTOM_PATH = get_conf('CUSTOM_PATH')
         | 
| 425 | 
             
                # if CUSTOM_PATH != "/": 
         | 
| 426 | 
             
                #     from toolbox import run_gradio_in_subpath
         | 
| 427 | 
             
                #     run_gradio_in_subpath(demo, auth=AUTHENTICATION, port=PORT, custom_path=CUSTOM_PATH)
         | 
| 428 | 
             
                # else: 
         | 
| 429 | 
             
                #     demo.launch(server_name="0.0.0.0", server_port=PORT, auth=AUTHENTICATION, favicon_path="docs/logo.png",
         | 
| 430 | 
            +
                #                 blocked_paths=["config.py","config_private.py","docker-compose.yml","Dockerfile",f"{PATH_LOGGING}/admin"])
         | 
| 431 |  | 
| 432 | 
             
            if __name__ == "__main__":
         | 
| 433 | 
             
                main()
         | 
    	
        check_proxy.py
    CHANGED
    
    | @@ -46,7 +46,7 @@ def backup_and_download(current_version, remote_version): | |
| 46 | 
             
                    return new_version_dir
         | 
| 47 | 
             
                os.makedirs(new_version_dir)
         | 
| 48 | 
             
                shutil.copytree('./', backup_dir, ignore=lambda x, y: ['history'])
         | 
| 49 | 
            -
                proxies | 
| 50 | 
             
                r = requests.get(
         | 
| 51 | 
             
                    'https://github.com/binary-husky/chatgpt_academic/archive/refs/heads/master.zip', proxies=proxies, stream=True)
         | 
| 52 | 
             
                zip_file_path = backup_dir+'/master.zip'
         | 
| @@ -113,7 +113,7 @@ def auto_update(raise_error=False): | |
| 113 | 
             
                    import requests
         | 
| 114 | 
             
                    import time
         | 
| 115 | 
             
                    import json
         | 
| 116 | 
            -
                    proxies | 
| 117 | 
             
                    response = requests.get(
         | 
| 118 | 
             
                        "https://raw.githubusercontent.com/binary-husky/chatgpt_academic/master/version", proxies=proxies, timeout=5)
         | 
| 119 | 
             
                    remote_json_data = json.loads(response.text)
         | 
| @@ -156,7 +156,7 @@ def auto_update(raise_error=False): | |
| 156 | 
             
            def warm_up_modules():
         | 
| 157 | 
             
                print('正在执行一些模块的预热...')
         | 
| 158 | 
             
                from toolbox import ProxyNetworkActivate
         | 
| 159 | 
            -
                from  | 
| 160 | 
             
                with ProxyNetworkActivate("Warmup_Modules"):
         | 
| 161 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 162 | 
             
                    enc.encode("模块预热", disallowed_special=())
         | 
| @@ -167,5 +167,5 @@ if __name__ == '__main__': | |
| 167 | 
             
                import os
         | 
| 168 | 
             
                os.environ['no_proxy'] = '*'  # 避免代理网络产生意外污染
         | 
| 169 | 
             
                from toolbox import get_conf
         | 
| 170 | 
            -
                proxies | 
| 171 | 
             
                check_proxy(proxies)
         | 
|  | |
| 46 | 
             
                    return new_version_dir
         | 
| 47 | 
             
                os.makedirs(new_version_dir)
         | 
| 48 | 
             
                shutil.copytree('./', backup_dir, ignore=lambda x, y: ['history'])
         | 
| 49 | 
            +
                proxies = get_conf('proxies')
         | 
| 50 | 
             
                r = requests.get(
         | 
| 51 | 
             
                    'https://github.com/binary-husky/chatgpt_academic/archive/refs/heads/master.zip', proxies=proxies, stream=True)
         | 
| 52 | 
             
                zip_file_path = backup_dir+'/master.zip'
         | 
|  | |
| 113 | 
             
                    import requests
         | 
| 114 | 
             
                    import time
         | 
| 115 | 
             
                    import json
         | 
| 116 | 
            +
                    proxies = get_conf('proxies')
         | 
| 117 | 
             
                    response = requests.get(
         | 
| 118 | 
             
                        "https://raw.githubusercontent.com/binary-husky/chatgpt_academic/master/version", proxies=proxies, timeout=5)
         | 
| 119 | 
             
                    remote_json_data = json.loads(response.text)
         | 
|  | |
| 156 | 
             
            def warm_up_modules():
         | 
| 157 | 
             
                print('正在执行一些模块的预热...')
         | 
| 158 | 
             
                from toolbox import ProxyNetworkActivate
         | 
| 159 | 
            +
                from request_llms.bridge_all import model_info
         | 
| 160 | 
             
                with ProxyNetworkActivate("Warmup_Modules"):
         | 
| 161 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 162 | 
             
                    enc.encode("模块预热", disallowed_special=())
         | 
|  | |
| 167 | 
             
                import os
         | 
| 168 | 
             
                os.environ['no_proxy'] = '*'  # 避免代理网络产生意外污染
         | 
| 169 | 
             
                from toolbox import get_conf
         | 
| 170 | 
            +
                proxies = get_conf('proxies')
         | 
| 171 | 
             
                check_proxy(proxies)
         | 
    	
        config.py
    CHANGED
    
    | @@ -53,6 +53,10 @@ THEME = "Chuanhu-Small-and-Beautiful" | |
| 53 | 
             
            AVAIL_THEMES = ["Default", "Chuanhu-Small-and-Beautiful", "High-Contrast", "Gstaff/Xkcd", "NoCrypt/Miku"]
         | 
| 54 |  | 
| 55 |  | 
|  | |
|  | |
|  | |
|  | |
| 56 | 
             
            # 对话窗的高度 (仅在LAYOUT="TOP-DOWN"时生效)
         | 
| 57 | 
             
            CHATBOT_HEIGHT = 1115
         | 
| 58 |  | 
| @@ -90,16 +94,23 @@ DEFAULT_FN_GROUPS = ['对话', '编程', '学术', '智能体'] | |
| 90 |  | 
| 91 | 
             
            # 模型选择是 (注意: LLM_MODEL是默认选中的模型, 它*必须*被包含在AVAIL_LLM_MODELS列表中 )
         | 
| 92 | 
             
            LLM_MODEL = "gpt-3.5-turbo" # 可选 ↓↓↓
         | 
| 93 | 
            -
            AVAIL_LLM_MODELS = ["gpt-3.5-turbo- | 
| 94 | 
            -
                                "gpt- | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 97 |  | 
| 98 |  | 
| 99 | 
             
            # 百度千帆(LLM_MODEL="qianfan")
         | 
| 100 | 
             
            BAIDU_CLOUD_API_KEY = ''
         | 
| 101 | 
             
            BAIDU_CLOUD_SECRET_KEY = ''
         | 
| 102 | 
            -
            BAIDU_CLOUD_QIANFAN_MODEL = 'ERNIE-Bot'    # 可选 "ERNIE-Bot"(文心一言), "ERNIE-Bot-turbo", "BLOOMZ-7B", "Llama-2-70B-Chat", "Llama-2-13B-Chat", "Llama-2-7B-Chat"
         | 
| 103 |  | 
| 104 |  | 
| 105 | 
             
            # 如果使用ChatGLM2微调模型,请把 LLM_MODEL="chatglmft",并在此处指定模型路径
         | 
| @@ -132,22 +143,31 @@ AUTHENTICATION = [] | |
| 132 | 
             
            CUSTOM_PATH = "/"
         | 
| 133 |  | 
| 134 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 135 | 
             
            # 极少数情况下,openai的官方KEY需要伴随组织编码(格式如org-xxxxxxxxxxxxxxxxxxxxxxxx)使用
         | 
| 136 | 
             
            API_ORG = ""
         | 
| 137 |  | 
| 138 |  | 
| 139 | 
            -
            # 如果需要使用Slack Claude,使用教程详情见  | 
| 140 | 
             
            SLACK_CLAUDE_BOT_ID = ''   
         | 
| 141 | 
             
            SLACK_CLAUDE_USER_TOKEN = ''
         | 
| 142 |  | 
| 143 |  | 
| 144 | 
            -
            # 如果需要使用AZURE  | 
| 145 | 
             
            AZURE_ENDPOINT = "https://你亲手写的api名称.openai.azure.com/"
         | 
| 146 | 
             
            AZURE_API_KEY = "填入azure openai api的密钥"    # 建议直接在API_KEY处填写,该选项即将被弃用
         | 
| 147 | 
             
            AZURE_ENGINE = "填入你亲手写的部署名"            # 读 docs\use_azure.md
         | 
| 148 |  | 
| 149 |  | 
| 150 | 
            -
            #  | 
|  | |
|  | |
|  | |
|  | |
| 151 | 
             
            NEWBING_STYLE = "creative"  # ["creative", "balanced", "precise"]
         | 
| 152 | 
             
            NEWBING_COOKIES = """
         | 
| 153 | 
             
            put your new bing cookies here
         | 
| @@ -168,6 +188,11 @@ XFYUN_API_SECRET = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" | |
| 168 | 
             
            XFYUN_API_KEY = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
         | 
| 169 |  | 
| 170 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 171 | 
             
            # Claude API KEY
         | 
| 172 | 
             
            ANTHROPIC_API_KEY = ""
         | 
| 173 |  | 
| @@ -184,7 +209,8 @@ HUGGINGFACE_ACCESS_TOKEN = "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" | |
| 184 | 
             
            # 获取方法:复制以下空间https://huggingface.co/spaces/qingxu98/grobid,设为public,然后GROBID_URL = "https://(你的hf用户名如qingxu98)-(你的填写的空间名如grobid).hf.space"
         | 
| 185 | 
             
            GROBID_URLS = [
         | 
| 186 | 
             
                "https://qingxu98-grobid.hf.space","https://qingxu98-grobid2.hf.space","https://qingxu98-grobid3.hf.space",
         | 
| 187 | 
            -
                "https:// | 
|  | |
| 188 | 
             
            ]
         | 
| 189 |  | 
| 190 |  | 
| @@ -192,6 +218,10 @@ GROBID_URLS = [ | |
| 192 | 
             
            ALLOW_RESET_CONFIG = False
         | 
| 193 |  | 
| 194 |  | 
|  | |
|  | |
|  | |
|  | |
| 195 | 
             
            # 临时的上传文件夹位置,请勿修改
         | 
| 196 | 
             
            PATH_PRIVATE_UPLOAD = "private_upload"
         | 
| 197 |  | 
| @@ -201,9 +231,17 @@ PATH_LOGGING = "gpt_log" | |
| 201 |  | 
| 202 |  | 
| 203 | 
             
            # 除了连接OpenAI之外,还有哪些场合允许使用代理,请勿修改
         | 
| 204 | 
            -
            WHEN_TO_USE_PROXY = ["Download_LLM", "Download_Gradio_Theme", "Connect_Grobid",  | 
|  | |
| 205 |  | 
| 206 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 207 | 
             
            """
         | 
| 208 | 
             
            在线大模型配置关联关系示意图
         | 
| 209 | 
             
            │
         | 
| @@ -213,13 +251,16 @@ WHEN_TO_USE_PROXY = ["Download_LLM", "Download_Gradio_Theme", "Connect_Grobid", | |
| 213 | 
             
            │   ├── API_ORG(不常用)
         | 
| 214 | 
             
            │   └── API_URL_REDIRECT(不常用)
         | 
| 215 | 
             
            │
         | 
| 216 | 
            -
            ├── "azure-gpt-3.5" 等azure | 
| 217 | 
             
            │   ├── API_KEY
         | 
| 218 | 
             
            │   ├── AZURE_ENDPOINT
         | 
| 219 | 
             
            │   ├── AZURE_API_KEY
         | 
| 220 | 
             
            │   ├── AZURE_ENGINE
         | 
| 221 | 
             
            │   └── API_URL_REDIRECT
         | 
| 222 | 
             
            │
         | 
|  | |
|  | |
|  | |
| 223 | 
             
            ├── "spark" 星火认知大模型 spark & sparkv2
         | 
| 224 | 
             
            │   ├── XFYUN_APPID
         | 
| 225 | 
             
            │   ├── XFYUN_API_SECRET
         | 
|  | |
| 53 | 
             
            AVAIL_THEMES = ["Default", "Chuanhu-Small-and-Beautiful", "High-Contrast", "Gstaff/Xkcd", "NoCrypt/Miku"]
         | 
| 54 |  | 
| 55 |  | 
| 56 | 
            +
            # 默认的系统提示词(system prompt)
         | 
| 57 | 
            +
            INIT_SYS_PROMPT = "Serve me as a writing and programming assistant."
         | 
| 58 | 
            +
             | 
| 59 | 
            +
             | 
| 60 | 
             
            # 对话窗的高度 (仅在LAYOUT="TOP-DOWN"时生效)
         | 
| 61 | 
             
            CHATBOT_HEIGHT = 1115
         | 
| 62 |  | 
|  | |
| 94 |  | 
| 95 | 
             
            # 模型选择是 (注意: LLM_MODEL是默认选中的模型, 它*必须*被包含在AVAIL_LLM_MODELS列表中 )
         | 
| 96 | 
             
            LLM_MODEL = "gpt-3.5-turbo" # 可选 ↓↓↓
         | 
| 97 | 
            +
            AVAIL_LLM_MODELS = ["gpt-3.5-turbo-1106","gpt-4-1106-preview",
         | 
| 98 | 
            +
                                "gpt-3.5-turbo-16k", "gpt-3.5-turbo", "azure-gpt-3.5",
         | 
| 99 | 
            +
                                "api2d-gpt-3.5-turbo", 'api2d-gpt-3.5-turbo-16k',
         | 
| 100 | 
            +
                                "gpt-4", "gpt-4-32k", "azure-gpt-4", "api2d-gpt-4",
         | 
| 101 | 
            +
                                "chatglm3", "moss", "newbing", "claude-2"]
         | 
| 102 | 
            +
            # P.S. 其他可用的模型还包括 ["zhipuai", "qianfan", "llama2", "qwen", "gpt-3.5-turbo-0613", "gpt-3.5-turbo-16k-0613",  "gpt-3.5-random"
         | 
| 103 | 
            +
            # "spark", "sparkv2", "sparkv3", "chatglm_onnx", "claude-1-100k", "claude-2", "internlm", "jittorllms_pangualpha", "jittorllms_llama"]
         | 
| 104 | 
            +
             | 
| 105 | 
            +
             | 
| 106 | 
            +
            # 定义界面上“询问多个GPT模型”插件应该使用哪些模型,请从AVAIL_LLM_MODELS中选择,并在不同模型之间用`&`间隔,例如"gpt-3.5-turbo&chatglm3&azure-gpt-4"
         | 
| 107 | 
            +
            MULTI_QUERY_LLM_MODELS = "gpt-3.5-turbo&chatglm3"
         | 
| 108 |  | 
| 109 |  | 
| 110 | 
             
            # 百度千帆(LLM_MODEL="qianfan")
         | 
| 111 | 
             
            BAIDU_CLOUD_API_KEY = ''
         | 
| 112 | 
             
            BAIDU_CLOUD_SECRET_KEY = ''
         | 
| 113 | 
            +
            BAIDU_CLOUD_QIANFAN_MODEL = 'ERNIE-Bot'    # 可选 "ERNIE-Bot-4"(文心大模型4.0), "ERNIE-Bot"(文心一言), "ERNIE-Bot-turbo", "BLOOMZ-7B", "Llama-2-70B-Chat", "Llama-2-13B-Chat", "Llama-2-7B-Chat"
         | 
| 114 |  | 
| 115 |  | 
| 116 | 
             
            # 如果使用ChatGLM2微调模型,请把 LLM_MODEL="chatglmft",并在此处指定模型路径
         | 
|  | |
| 143 | 
             
            CUSTOM_PATH = "/"
         | 
| 144 |  | 
| 145 |  | 
| 146 | 
            +
            # HTTPS 秘钥和证书(不需要修改)
         | 
| 147 | 
            +
            SSL_KEYFILE = ""
         | 
| 148 | 
            +
            SSL_CERTFILE = ""
         | 
| 149 | 
            +
             | 
| 150 | 
            +
             | 
| 151 | 
             
            # 极少数情况下,openai的官方KEY需要伴随组织编码(格式如org-xxxxxxxxxxxxxxxxxxxxxxxx)使用
         | 
| 152 | 
             
            API_ORG = ""
         | 
| 153 |  | 
| 154 |  | 
| 155 | 
            +
            # 如果需要使用Slack Claude,使用教程详情见 request_llms/README.md
         | 
| 156 | 
             
            SLACK_CLAUDE_BOT_ID = ''   
         | 
| 157 | 
             
            SLACK_CLAUDE_USER_TOKEN = ''
         | 
| 158 |  | 
| 159 |  | 
| 160 | 
            +
            # 如果需要使用AZURE(方法一:单个azure模型部署)详情请见额外文档 docs\use_azure.md
         | 
| 161 | 
             
            AZURE_ENDPOINT = "https://你亲手写的api名称.openai.azure.com/"
         | 
| 162 | 
             
            AZURE_API_KEY = "填入azure openai api的密钥"    # 建议直接在API_KEY处填写,该选项即将被弃用
         | 
| 163 | 
             
            AZURE_ENGINE = "填入你亲手写的部署名"            # 读 docs\use_azure.md
         | 
| 164 |  | 
| 165 |  | 
| 166 | 
            +
            # 如果需要使用AZURE(方法二:多个azure模型部署+动态切换)详情请见额外文档 docs\use_azure.md
         | 
| 167 | 
            +
            AZURE_CFG_ARRAY = {}
         | 
| 168 | 
            +
             | 
| 169 | 
            +
             | 
| 170 | 
            +
            # 使用Newbing (不推荐使用,未来将删除)
         | 
| 171 | 
             
            NEWBING_STYLE = "creative"  # ["creative", "balanced", "precise"]
         | 
| 172 | 
             
            NEWBING_COOKIES = """
         | 
| 173 | 
             
            put your new bing cookies here
         | 
|  | |
| 188 | 
             
            XFYUN_API_KEY = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
         | 
| 189 |  | 
| 190 |  | 
| 191 | 
            +
            # 接入智谱大模型
         | 
| 192 | 
            +
            ZHIPUAI_API_KEY = ""
         | 
| 193 | 
            +
            ZHIPUAI_MODEL = "chatglm_turbo"
         | 
| 194 | 
            +
             | 
| 195 | 
            +
             | 
| 196 | 
             
            # Claude API KEY
         | 
| 197 | 
             
            ANTHROPIC_API_KEY = ""
         | 
| 198 |  | 
|  | |
| 209 | 
             
            # 获取方法:复制以下空间https://huggingface.co/spaces/qingxu98/grobid,设为public,然后GROBID_URL = "https://(你的hf用户名如qingxu98)-(你的填写的空间名如grobid).hf.space"
         | 
| 210 | 
             
            GROBID_URLS = [
         | 
| 211 | 
             
                "https://qingxu98-grobid.hf.space","https://qingxu98-grobid2.hf.space","https://qingxu98-grobid3.hf.space",
         | 
| 212 | 
            +
                "https://qingxu98-grobid4.hf.space","https://qingxu98-grobid5.hf.space", "https://qingxu98-grobid6.hf.space", 
         | 
| 213 | 
            +
                "https://qingxu98-grobid7.hf.space", "https://qingxu98-grobid8.hf.space", 
         | 
| 214 | 
             
            ]
         | 
| 215 |  | 
| 216 |  | 
|  | |
| 218 | 
             
            ALLOW_RESET_CONFIG = False
         | 
| 219 |  | 
| 220 |  | 
| 221 | 
            +
            # 在使用AutoGen插件时,是否使用Docker容器运行代码
         | 
| 222 | 
            +
            AUTOGEN_USE_DOCKER = False
         | 
| 223 | 
            +
             | 
| 224 | 
            +
             | 
| 225 | 
             
            # 临时的上传文件夹位置,请勿修改
         | 
| 226 | 
             
            PATH_PRIVATE_UPLOAD = "private_upload"
         | 
| 227 |  | 
|  | |
| 231 |  | 
| 232 |  | 
| 233 | 
             
            # 除了连接OpenAI之外,还有哪些场合允许使用代理,请勿修改
         | 
| 234 | 
            +
            WHEN_TO_USE_PROXY = ["Download_LLM", "Download_Gradio_Theme", "Connect_Grobid", 
         | 
| 235 | 
            +
                                 "Warmup_Modules", "Nougat_Download", "AutoGen"]
         | 
| 236 |  | 
| 237 |  | 
| 238 | 
            +
            # *实验性功能*: 自动检测并屏蔽失效的KEY,请勿使用
         | 
| 239 | 
            +
            BLOCK_INVALID_APIKEY = False
         | 
| 240 | 
            +
             | 
| 241 | 
            +
             | 
| 242 | 
            +
            # 自定义按钮的最大数量限制
         | 
| 243 | 
            +
            NUM_CUSTOM_BASIC_BTN = 4
         | 
| 244 | 
            +
             | 
| 245 | 
             
            """
         | 
| 246 | 
             
            在线大模型配置关联关系示意图
         | 
| 247 | 
             
            │
         | 
|  | |
| 251 | 
             
            │   ├── API_ORG(不常用)
         | 
| 252 | 
             
            │   └── API_URL_REDIRECT(不常用)
         | 
| 253 | 
             
            │
         | 
| 254 | 
            +
            ├── "azure-gpt-3.5" 等azure模型(单个azure模型,不需要动态切换)
         | 
| 255 | 
             
            │   ├── API_KEY
         | 
| 256 | 
             
            │   ├── AZURE_ENDPOINT
         | 
| 257 | 
             
            │   ├── AZURE_API_KEY
         | 
| 258 | 
             
            │   ├── AZURE_ENGINE
         | 
| 259 | 
             
            │   └── API_URL_REDIRECT
         | 
| 260 | 
             
            │
         | 
| 261 | 
            +
            ├── "azure-gpt-3.5" 等azure模型(多个azure模型,需要动态切换,高优先级)
         | 
| 262 | 
            +
            │   └── AZURE_CFG_ARRAY
         | 
| 263 | 
            +
            │
         | 
| 264 | 
             
            ├── "spark" 星火认知大模型 spark & sparkv2
         | 
| 265 | 
             
            │   ├── XFYUN_APPID
         | 
| 266 | 
             
            │   ├── XFYUN_API_SECRET
         | 
    	
        core_functional.py
    CHANGED
    
    | @@ -91,8 +91,15 @@ def handle_core_functionality(additional_fn, inputs, history, chatbot): | |
| 91 | 
             
                import core_functional
         | 
| 92 | 
             
                importlib.reload(core_functional)    # 热更新prompt
         | 
| 93 | 
             
                core_functional = core_functional.get_core_functions()
         | 
| 94 | 
            -
                 | 
| 95 | 
            -
                 | 
| 96 | 
            -
             | 
| 97 | 
            -
                     | 
| 98 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 91 | 
             
                import core_functional
         | 
| 92 | 
             
                importlib.reload(core_functional)    # 热更新prompt
         | 
| 93 | 
             
                core_functional = core_functional.get_core_functions()
         | 
| 94 | 
            +
                addition = chatbot._cookies['customize_fn_overwrite']
         | 
| 95 | 
            +
                if additional_fn in addition:
         | 
| 96 | 
            +
                    # 自定义功能
         | 
| 97 | 
            +
                    inputs = addition[additional_fn]["Prefix"] + inputs + addition[additional_fn]["Suffix"]
         | 
| 98 | 
            +
                    return inputs, history
         | 
| 99 | 
            +
                else:
         | 
| 100 | 
            +
                    # 预制功能
         | 
| 101 | 
            +
                    if "PreProcess" in core_functional[additional_fn]: inputs = core_functional[additional_fn]["PreProcess"](inputs)  # 获取预处理函数(如果有的话)
         | 
| 102 | 
            +
                    inputs = core_functional[additional_fn]["Prefix"] + inputs + core_functional[additional_fn]["Suffix"]
         | 
| 103 | 
            +
                    if core_functional[additional_fn].get("AutoClearHistory", False):
         | 
| 104 | 
            +
                        history = []
         | 
| 105 | 
            +
                    return inputs, history
         | 
    	
        crazy_functional.py
    CHANGED
    
    | @@ -1,4 +1,5 @@ | |
| 1 | 
             
            from toolbox import HotReload  # HotReload 的意思是热更新,修改函数插件后,不需要重启程序,代码直接生效
         | 
|  | |
| 2 |  | 
| 3 |  | 
| 4 | 
             
            def get_crazy_functions():
         | 
| @@ -190,10 +191,10 @@ def get_crazy_functions(): | |
| 190 | 
             
                        "Info": "多线程解析并翻译此项目的源码 | 不需要输入参数",
         | 
| 191 | 
             
                        "Function": HotReload(解析项目本身)
         | 
| 192 | 
             
                    },
         | 
| 193 | 
            -
                    " | 
| 194 | 
             
                        "Group": "对话",
         | 
| 195 | 
             
                        "AsButton": True,
         | 
| 196 | 
            -
                        "Info": "查看历史上的今天事件 | 不需要输入参数",
         | 
| 197 | 
             
                        "Function": HotReload(高阶功能模板函数)
         | 
| 198 | 
             
                    },
         | 
| 199 | 
             
                    "精准翻译PDF论文": {
         | 
| @@ -252,7 +253,7 @@ def get_crazy_functions(): | |
| 252 | 
             
                        "Function": HotReload(Latex中文润色)
         | 
| 253 | 
             
                    },
         | 
| 254 |  | 
| 255 | 
            -
                    #  | 
| 256 | 
             
                    # "Latex项目全文中译英(输入路径或上传压缩包)": {
         | 
| 257 | 
             
                    #     "Group": "学术",
         | 
| 258 | 
             
                    #     "Color": "stop",
         | 
| @@ -260,6 +261,8 @@ def get_crazy_functions(): | |
| 260 | 
             
                    #     "Info": "对Latex项目全文进行中译英处理 | 输入参数为路径或上传压缩包",
         | 
| 261 | 
             
                    #     "Function": HotReload(Latex中译英)
         | 
| 262 | 
             
                    # },
         | 
|  | |
|  | |
| 263 | 
             
                    # "Latex项目全文英译中(输入路径或上传压缩包)": {
         | 
| 264 | 
             
                    #     "Group": "学术",
         | 
| 265 | 
             
                    #     "Color": "stop",
         | 
| @@ -290,6 +293,7 @@ def get_crazy_functions(): | |
| 290 | 
             
                        }
         | 
| 291 | 
             
                    })
         | 
| 292 | 
             
                except:
         | 
|  | |
| 293 | 
             
                    print('Load function plugin failed')
         | 
| 294 |  | 
| 295 | 
             
                try:
         | 
| @@ -314,6 +318,7 @@ def get_crazy_functions(): | |
| 314 | 
             
                        }
         | 
| 315 | 
             
                    })
         | 
| 316 | 
             
                except:
         | 
|  | |
| 317 | 
             
                    print('Load function plugin failed')
         | 
| 318 |  | 
| 319 | 
             
                try:
         | 
| @@ -329,6 +334,7 @@ def get_crazy_functions(): | |
| 329 | 
             
                        },
         | 
| 330 | 
             
                    })
         | 
| 331 | 
             
                except:
         | 
|  | |
| 332 | 
             
                    print('Load function plugin failed')
         | 
| 333 |  | 
| 334 | 
             
                try:
         | 
| @@ -344,22 +350,35 @@ def get_crazy_functions(): | |
| 344 | 
             
                        },
         | 
| 345 | 
             
                    })
         | 
| 346 | 
             
                except:
         | 
|  | |
| 347 | 
             
                    print('Load function plugin failed')
         | 
| 348 |  | 
| 349 | 
             
                try:
         | 
| 350 | 
            -
                    from crazy_functions.图片生成 import 图片生成
         | 
| 351 | 
             
                    function_plugins.update({
         | 
| 352 | 
            -
                        " | 
| 353 | 
             
                            "Group": "对话",
         | 
| 354 | 
             
                            "Color": "stop",
         | 
| 355 | 
             
                            "AsButton": False,
         | 
| 356 | 
             
                            "AdvancedArgs": True,  # 调用时,唤起高级参数输入区(默认False)
         | 
| 357 | 
            -
                            "ArgsReminder": "在这里输入分辨率, 如256x256 | 
| 358 | 
            -
                            "Info": " | 
| 359 | 
            -
                            "Function": HotReload(图片生成)
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 360 | 
             
                        },
         | 
| 361 | 
             
                    })
         | 
| 362 | 
             
                except:
         | 
|  | |
| 363 | 
             
                    print('Load function plugin failed')
         | 
| 364 |  | 
| 365 | 
             
                try:
         | 
| @@ -376,6 +395,7 @@ def get_crazy_functions(): | |
| 376 | 
             
                        }
         | 
| 377 | 
             
                    })
         | 
| 378 | 
             
                except:
         | 
|  | |
| 379 | 
             
                    print('Load function plugin failed')
         | 
| 380 |  | 
| 381 | 
             
                try:
         | 
| @@ -390,12 +410,13 @@ def get_crazy_functions(): | |
| 390 | 
             
                        }
         | 
| 391 | 
             
                    })
         | 
| 392 | 
             
                except:
         | 
|  | |
| 393 | 
             
                    print('Load function plugin failed')
         | 
| 394 |  | 
| 395 | 
             
                try:
         | 
| 396 | 
             
                    from crazy_functions.批量Markdown翻译 import Markdown翻译指定语言
         | 
| 397 | 
             
                    function_plugins.update({
         | 
| 398 | 
            -
                        "Markdown | 
| 399 | 
             
                            "Group": "编程",
         | 
| 400 | 
             
                            "Color": "stop",
         | 
| 401 | 
             
                            "AsButton": False,
         | 
| @@ -405,6 +426,7 @@ def get_crazy_functions(): | |
| 405 | 
             
                        }
         | 
| 406 | 
             
                    })
         | 
| 407 | 
             
                except:
         | 
|  | |
| 408 | 
             
                    print('Load function plugin failed')
         | 
| 409 |  | 
| 410 | 
             
                try:
         | 
| @@ -420,6 +442,7 @@ def get_crazy_functions(): | |
| 420 | 
             
                        }
         | 
| 421 | 
             
                    })
         | 
| 422 | 
             
                except:
         | 
|  | |
| 423 | 
             
                    print('Load function plugin failed')
         | 
| 424 |  | 
| 425 | 
             
                try:
         | 
| @@ -435,12 +458,13 @@ def get_crazy_functions(): | |
| 435 | 
             
                        }
         | 
| 436 | 
             
                    })
         | 
| 437 | 
             
                except:
         | 
|  | |
| 438 | 
             
                    print('Load function plugin failed')
         | 
| 439 |  | 
| 440 | 
             
                try:
         | 
| 441 | 
             
                    from crazy_functions.交互功能函数模板 import 交互功能模板函数
         | 
| 442 | 
             
                    function_plugins.update({
         | 
| 443 | 
            -
                        " | 
| 444 | 
             
                            "Group": "对话",
         | 
| 445 | 
             
                            "Color": "stop",
         | 
| 446 | 
             
                            "AsButton": False,
         | 
| @@ -448,6 +472,7 @@ def get_crazy_functions(): | |
| 448 | 
             
                        }
         | 
| 449 | 
             
                    })
         | 
| 450 | 
             
                except:
         | 
|  | |
| 451 | 
             
                    print('Load function plugin failed')
         | 
| 452 |  | 
| 453 | 
             
                try:
         | 
| @@ -492,23 +517,25 @@ def get_crazy_functions(): | |
| 492 | 
             
                        }
         | 
| 493 | 
             
                    })
         | 
| 494 | 
             
                except:
         | 
|  | |
| 495 | 
             
                    print('Load function plugin failed')
         | 
| 496 |  | 
| 497 | 
             
                try:
         | 
| 498 | 
             
                    from toolbox import get_conf
         | 
| 499 | 
            -
                    ENABLE_AUDIO | 
| 500 | 
             
                    if ENABLE_AUDIO:
         | 
| 501 | 
             
                        from crazy_functions.语音助手 import 语音助手
         | 
| 502 | 
             
                        function_plugins.update({
         | 
| 503 | 
            -
                            " | 
| 504 | 
             
                                "Group": "对话",
         | 
| 505 | 
             
                                "Color": "stop",
         | 
| 506 | 
             
                                "AsButton": True,
         | 
| 507 | 
            -
                                "Info": " | 
| 508 | 
             
                                "Function": HotReload(语音助手)
         | 
| 509 | 
             
                            }
         | 
| 510 | 
             
                        })
         | 
| 511 | 
             
                except:
         | 
|  | |
| 512 | 
             
                    print('Load function plugin failed')
         | 
| 513 |  | 
| 514 | 
             
                try:
         | 
| @@ -522,6 +549,7 @@ def get_crazy_functions(): | |
| 522 | 
             
                        }
         | 
| 523 | 
             
                    })
         | 
| 524 | 
             
                except:
         | 
|  | |
| 525 | 
             
                    print('Load function plugin failed')
         | 
| 526 |  | 
| 527 | 
             
                try:
         | 
| @@ -535,20 +563,22 @@ def get_crazy_functions(): | |
| 535 | 
             
                        }
         | 
| 536 | 
             
                    })
         | 
| 537 | 
             
                except:
         | 
|  | |
| 538 | 
             
                    print('Load function plugin failed')
         | 
| 539 |  | 
| 540 | 
            -
                 | 
| 541 | 
            -
             | 
| 542 | 
            -
             | 
| 543 | 
            -
             | 
| 544 | 
            -
             | 
| 545 | 
            -
             | 
| 546 | 
            -
             | 
| 547 | 
            -
             | 
| 548 | 
            -
             | 
| 549 | 
            -
             | 
| 550 | 
            -
                 | 
| 551 | 
            -
             | 
|  | |
| 552 |  | 
| 553 | 
             
                # try:
         | 
| 554 | 
             
                #     from crazy_functions.chatglm微调工具 import 微调数据集生成
         | 
|  | |
| 1 | 
             
            from toolbox import HotReload  # HotReload 的意思是热更新,修改函数插件后,不需要重启程序,代码直接生效
         | 
| 2 | 
            +
            from toolbox import trimmed_format_exc
         | 
| 3 |  | 
| 4 |  | 
| 5 | 
             
            def get_crazy_functions():
         | 
|  | |
| 191 | 
             
                        "Info": "多线程解析并翻译此项目的源码 | 不需要输入参数",
         | 
| 192 | 
             
                        "Function": HotReload(解析项目本身)
         | 
| 193 | 
             
                    },
         | 
| 194 | 
            +
                    "历史上的今天": {
         | 
| 195 | 
             
                        "Group": "对话",
         | 
| 196 | 
             
                        "AsButton": True,
         | 
| 197 | 
            +
                        "Info": "查看历史上的今天事件 (这是一个面向开发者的插件Demo) | 不需要输入参数",
         | 
| 198 | 
             
                        "Function": HotReload(高阶功能模板函数)
         | 
| 199 | 
             
                    },
         | 
| 200 | 
             
                    "精准翻译PDF论文": {
         | 
|  | |
| 253 | 
             
                        "Function": HotReload(Latex中文润色)
         | 
| 254 | 
             
                    },
         | 
| 255 |  | 
| 256 | 
            +
                    # 已经被新插件取代
         | 
| 257 | 
             
                    # "Latex项目全文中译英(输入路径或上传压缩包)": {
         | 
| 258 | 
             
                    #     "Group": "学术",
         | 
| 259 | 
             
                    #     "Color": "stop",
         | 
|  | |
| 261 | 
             
                    #     "Info": "对Latex项目全文进行中译英处理 | 输入参数为路径或上传压缩包",
         | 
| 262 | 
             
                    #     "Function": HotReload(Latex中译英)
         | 
| 263 | 
             
                    # },
         | 
| 264 | 
            +
             | 
| 265 | 
            +
                    # 已经被新插件取代
         | 
| 266 | 
             
                    # "Latex项目全文英译中(输入路径或上传压缩包)": {
         | 
| 267 | 
             
                    #     "Group": "学术",
         | 
| 268 | 
             
                    #     "Color": "stop",
         | 
|  | |
| 293 | 
             
                        }
         | 
| 294 | 
             
                    })
         | 
| 295 | 
             
                except:
         | 
| 296 | 
            +
                    print(trimmed_format_exc())
         | 
| 297 | 
             
                    print('Load function plugin failed')
         | 
| 298 |  | 
| 299 | 
             
                try:
         | 
|  | |
| 318 | 
             
                        }
         | 
| 319 | 
             
                    })
         | 
| 320 | 
             
                except:
         | 
| 321 | 
            +
                    print(trimmed_format_exc())
         | 
| 322 | 
             
                    print('Load function plugin failed')
         | 
| 323 |  | 
| 324 | 
             
                try:
         | 
|  | |
| 334 | 
             
                        },
         | 
| 335 | 
             
                    })
         | 
| 336 | 
             
                except:
         | 
| 337 | 
            +
                    print(trimmed_format_exc())
         | 
| 338 | 
             
                    print('Load function plugin failed')
         | 
| 339 |  | 
| 340 | 
             
                try:
         | 
|  | |
| 350 | 
             
                        },
         | 
| 351 | 
             
                    })
         | 
| 352 | 
             
                except:
         | 
| 353 | 
            +
                    print(trimmed_format_exc())
         | 
| 354 | 
             
                    print('Load function plugin failed')
         | 
| 355 |  | 
| 356 | 
             
                try:
         | 
| 357 | 
            +
                    from crazy_functions.图片生成 import 图片生成_DALLE2, 图片生成_DALLE3
         | 
| 358 | 
             
                    function_plugins.update({
         | 
| 359 | 
            +
                        "图片生成_DALLE2 (先切换模型到openai或api2d)": {
         | 
| 360 | 
             
                            "Group": "对话",
         | 
| 361 | 
             
                            "Color": "stop",
         | 
| 362 | 
             
                            "AsButton": False,
         | 
| 363 | 
             
                            "AdvancedArgs": True,  # 调用时,唤起高级参数输入区(默认False)
         | 
| 364 | 
            +
                            "ArgsReminder": "在这里输入分辨率, 如1024x1024(默认),支持 256x256, 512x512, 1024x1024",  # 高级参数输入区的显示提示
         | 
| 365 | 
            +
                            "Info": "使用DALLE2生成图片 | 输入参数字符串,提供图像的内容",
         | 
| 366 | 
            +
                            "Function": HotReload(图片生成_DALLE2)
         | 
| 367 | 
            +
                        },
         | 
| 368 | 
            +
                    })
         | 
| 369 | 
            +
                    function_plugins.update({
         | 
| 370 | 
            +
                        "图片生成_DALLE3 (先切换模型到openai或api2d)": {
         | 
| 371 | 
            +
                            "Group": "对话",
         | 
| 372 | 
            +
                            "Color": "stop",
         | 
| 373 | 
            +
                            "AsButton": False,
         | 
| 374 | 
            +
                            "AdvancedArgs": True,  # 调用时,唤起高级参数输入区(默认False)
         | 
| 375 | 
            +
                            "ArgsReminder": "在这里输入分辨率, 如1024x1024(默认),支持 1024x1024, 1792x1024, 1024x1792。如需生成高清图像,请输入 1024x1024-HD, 1792x1024-HD, 1024x1792-HD。",  # 高级参数输入区的显示提示
         | 
| 376 | 
            +
                            "Info": "使用DALLE3生成图片 | 输入参数字符串,提供图像的内容",
         | 
| 377 | 
            +
                            "Function": HotReload(图片生成_DALLE3)
         | 
| 378 | 
             
                        },
         | 
| 379 | 
             
                    })
         | 
| 380 | 
             
                except:
         | 
| 381 | 
            +
                    print(trimmed_format_exc())
         | 
| 382 | 
             
                    print('Load function plugin failed')
         | 
| 383 |  | 
| 384 | 
             
                try:
         | 
|  | |
| 395 | 
             
                        }
         | 
| 396 | 
             
                    })
         | 
| 397 | 
             
                except:
         | 
| 398 | 
            +
                    print(trimmed_format_exc())
         | 
| 399 | 
             
                    print('Load function plugin failed')
         | 
| 400 |  | 
| 401 | 
             
                try:
         | 
|  | |
| 410 | 
             
                        }
         | 
| 411 | 
             
                    })
         | 
| 412 | 
             
                except:
         | 
| 413 | 
            +
                    print(trimmed_format_exc())
         | 
| 414 | 
             
                    print('Load function plugin failed')
         | 
| 415 |  | 
| 416 | 
             
                try:
         | 
| 417 | 
             
                    from crazy_functions.批量Markdown翻译 import Markdown翻译指定语言
         | 
| 418 | 
             
                    function_plugins.update({
         | 
| 419 | 
            +
                        "Markdown翻译(指定翻译成何种语言)": {
         | 
| 420 | 
             
                            "Group": "编程",
         | 
| 421 | 
             
                            "Color": "stop",
         | 
| 422 | 
             
                            "AsButton": False,
         | 
|  | |
| 426 | 
             
                        }
         | 
| 427 | 
             
                    })
         | 
| 428 | 
             
                except:
         | 
| 429 | 
            +
                    print(trimmed_format_exc())
         | 
| 430 | 
             
                    print('Load function plugin failed')
         | 
| 431 |  | 
| 432 | 
             
                try:
         | 
|  | |
| 442 | 
             
                        }
         | 
| 443 | 
             
                    })
         | 
| 444 | 
             
                except:
         | 
| 445 | 
            +
                    print(trimmed_format_exc())
         | 
| 446 | 
             
                    print('Load function plugin failed')
         | 
| 447 |  | 
| 448 | 
             
                try:
         | 
|  | |
| 458 | 
             
                        }
         | 
| 459 | 
             
                    })
         | 
| 460 | 
             
                except:
         | 
| 461 | 
            +
                    print(trimmed_format_exc())
         | 
| 462 | 
             
                    print('Load function plugin failed')
         | 
| 463 |  | 
| 464 | 
             
                try:
         | 
| 465 | 
             
                    from crazy_functions.交互功能函数模板 import 交互功能模板函数
         | 
| 466 | 
             
                    function_plugins.update({
         | 
| 467 | 
            +
                        "交互功能模板Demo函数(查找wallhaven.cc的壁纸)": {
         | 
| 468 | 
             
                            "Group": "对话",
         | 
| 469 | 
             
                            "Color": "stop",
         | 
| 470 | 
             
                            "AsButton": False,
         | 
|  | |
| 472 | 
             
                        }
         | 
| 473 | 
             
                    })
         | 
| 474 | 
             
                except:
         | 
| 475 | 
            +
                    print(trimmed_format_exc())
         | 
| 476 | 
             
                    print('Load function plugin failed')
         | 
| 477 |  | 
| 478 | 
             
                try:
         | 
|  | |
| 517 | 
             
                        }
         | 
| 518 | 
             
                    })
         | 
| 519 | 
             
                except:
         | 
| 520 | 
            +
                    print(trimmed_format_exc())
         | 
| 521 | 
             
                    print('Load function plugin failed')
         | 
| 522 |  | 
| 523 | 
             
                try:
         | 
| 524 | 
             
                    from toolbox import get_conf
         | 
| 525 | 
            +
                    ENABLE_AUDIO = get_conf('ENABLE_AUDIO')
         | 
| 526 | 
             
                    if ENABLE_AUDIO:
         | 
| 527 | 
             
                        from crazy_functions.语音助手 import 语音助手
         | 
| 528 | 
             
                        function_plugins.update({
         | 
| 529 | 
            +
                            "实时语音对话": {
         | 
| 530 | 
             
                                "Group": "对话",
         | 
| 531 | 
             
                                "Color": "stop",
         | 
| 532 | 
             
                                "AsButton": True,
         | 
| 533 | 
            +
                                "Info": "这是一个时刻聆听着的语音对话助手 | 没有输入参数",
         | 
| 534 | 
             
                                "Function": HotReload(语音助手)
         | 
| 535 | 
             
                            }
         | 
| 536 | 
             
                        })
         | 
| 537 | 
             
                except:
         | 
| 538 | 
            +
                    print(trimmed_format_exc())
         | 
| 539 | 
             
                    print('Load function plugin failed')
         | 
| 540 |  | 
| 541 | 
             
                try:
         | 
|  | |
| 549 | 
             
                        }
         | 
| 550 | 
             
                    })
         | 
| 551 | 
             
                except:
         | 
| 552 | 
            +
                    print(trimmed_format_exc())
         | 
| 553 | 
             
                    print('Load function plugin failed')
         | 
| 554 |  | 
| 555 | 
             
                try:
         | 
|  | |
| 563 | 
             
                        }
         | 
| 564 | 
             
                    })
         | 
| 565 | 
             
                except:
         | 
| 566 | 
            +
                    print(trimmed_format_exc())
         | 
| 567 | 
             
                    print('Load function plugin failed')
         | 
| 568 |  | 
| 569 | 
            +
                try:
         | 
| 570 | 
            +
                    from crazy_functions.多智能体 import 多智能体终端
         | 
| 571 | 
            +
                    function_plugins.update({
         | 
| 572 | 
            +
                        "AutoGen多智能体终端(仅供测试)": {
         | 
| 573 | 
            +
                            "Group": "智能体",
         | 
| 574 | 
            +
                            "Color": "stop",
         | 
| 575 | 
            +
                            "AsButton": False,
         | 
| 576 | 
            +
                            "Function": HotReload(多智能体终端)
         | 
| 577 | 
            +
                        }
         | 
| 578 | 
            +
                    })
         | 
| 579 | 
            +
                except:
         | 
| 580 | 
            +
                    print(trimmed_format_exc())
         | 
| 581 | 
            +
                    print('Load function plugin failed')
         | 
| 582 |  | 
| 583 | 
             
                # try:
         | 
| 584 | 
             
                #     from crazy_functions.chatglm微调工具 import 微调数据集生成
         | 
    	
        crazy_functions/Latex全文润色.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui, trimmed_format_exc, promote_file_to_downloadzone, get_log_folder
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 |  | 
| 4 |  | 
| 5 | 
             
            class PaperFileGroup():
         | 
| @@ -11,7 +11,7 @@ class PaperFileGroup(): | |
| 11 | 
             
                    self.sp_file_tag = []
         | 
| 12 |  | 
| 13 | 
             
                    # count_token
         | 
| 14 | 
            -
                    from  | 
| 15 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 16 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 17 | 
             
                    self.get_token_num = get_token_num
         | 
| @@ -146,7 +146,7 @@ def Latex英文润色(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 146 | 
             
                try:
         | 
| 147 | 
             
                    import tiktoken
         | 
| 148 | 
             
                except:
         | 
| 149 | 
            -
                     | 
| 150 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 151 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 152 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -157,12 +157,12 @@ def Latex英文润色(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 157 | 
             
                    project_folder = txt
         | 
| 158 | 
             
                else:
         | 
| 159 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 160 | 
            -
                     | 
| 161 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 162 | 
             
                    return
         | 
| 163 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 164 | 
             
                if len(file_manifest) == 0:
         | 
| 165 | 
            -
                     | 
| 166 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 167 | 
             
                    return
         | 
| 168 | 
             
                yield from 多文件润色(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='en')
         | 
| @@ -184,7 +184,7 @@ def Latex中文润色(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 184 | 
             
                try:
         | 
| 185 | 
             
                    import tiktoken
         | 
| 186 | 
             
                except:
         | 
| 187 | 
            -
                     | 
| 188 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 189 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 190 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -195,12 +195,12 @@ def Latex中文润色(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 195 | 
             
                    project_folder = txt
         | 
| 196 | 
             
                else:
         | 
| 197 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 198 | 
            -
                     | 
| 199 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 200 | 
             
                    return
         | 
| 201 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 202 | 
             
                if len(file_manifest) == 0:
         | 
| 203 | 
            -
                     | 
| 204 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 205 | 
             
                    return
         | 
| 206 | 
             
                yield from 多文件润色(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='zh')
         | 
| @@ -220,7 +220,7 @@ def Latex英文纠错(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 220 | 
             
                try:
         | 
| 221 | 
             
                    import tiktoken
         | 
| 222 | 
             
                except:
         | 
| 223 | 
            -
                     | 
| 224 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 225 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 226 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -231,12 +231,12 @@ def Latex英文纠错(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 231 | 
             
                    project_folder = txt
         | 
| 232 | 
             
                else:
         | 
| 233 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 234 | 
            -
                     | 
| 235 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 236 | 
             
                    return
         | 
| 237 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 238 | 
             
                if len(file_manifest) == 0:
         | 
| 239 | 
            -
                     | 
| 240 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 241 | 
             
                    return
         | 
| 242 | 
             
                yield from 多文件润色(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='en', mode='proofread')
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui, trimmed_format_exc, promote_file_to_downloadzone, get_log_folder
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception, write_history_to_file, zip_folder
         | 
| 3 |  | 
| 4 |  | 
| 5 | 
             
            class PaperFileGroup():
         | 
|  | |
| 11 | 
             
                    self.sp_file_tag = []
         | 
| 12 |  | 
| 13 | 
             
                    # count_token
         | 
| 14 | 
            +
                    from request_llms.bridge_all import model_info
         | 
| 15 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 16 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 17 | 
             
                    self.get_token_num = get_token_num
         | 
|  | |
| 146 | 
             
                try:
         | 
| 147 | 
             
                    import tiktoken
         | 
| 148 | 
             
                except:
         | 
| 149 | 
            +
                    report_exception(chatbot, history,
         | 
| 150 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 151 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 152 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 157 | 
             
                    project_folder = txt
         | 
| 158 | 
             
                else:
         | 
| 159 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 160 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 161 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 162 | 
             
                    return
         | 
| 163 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 164 | 
             
                if len(file_manifest) == 0:
         | 
| 165 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex文件: {txt}")
         | 
| 166 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 167 | 
             
                    return
         | 
| 168 | 
             
                yield from 多文件润色(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='en')
         | 
|  | |
| 184 | 
             
                try:
         | 
| 185 | 
             
                    import tiktoken
         | 
| 186 | 
             
                except:
         | 
| 187 | 
            +
                    report_exception(chatbot, history,
         | 
| 188 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 189 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 190 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 195 | 
             
                    project_folder = txt
         | 
| 196 | 
             
                else:
         | 
| 197 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 198 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 199 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 200 | 
             
                    return
         | 
| 201 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 202 | 
             
                if len(file_manifest) == 0:
         | 
| 203 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex文件: {txt}")
         | 
| 204 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 205 | 
             
                    return
         | 
| 206 | 
             
                yield from 多文件润色(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='zh')
         | 
|  | |
| 220 | 
             
                try:
         | 
| 221 | 
             
                    import tiktoken
         | 
| 222 | 
             
                except:
         | 
| 223 | 
            +
                    report_exception(chatbot, history,
         | 
| 224 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 225 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 226 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 231 | 
             
                    project_folder = txt
         | 
| 232 | 
             
                else:
         | 
| 233 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 234 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 235 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 236 | 
             
                    return
         | 
| 237 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 238 | 
             
                if len(file_manifest) == 0:
         | 
| 239 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex文件: {txt}")
         | 
| 240 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 241 | 
             
                    return
         | 
| 242 | 
             
                yield from 多文件润色(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='en', mode='proofread')
         | 
    	
        crazy_functions/Latex全文翻译.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            fast_debug = False
         | 
| 4 |  | 
| 5 | 
             
            class PaperFileGroup():
         | 
| @@ -11,7 +11,7 @@ class PaperFileGroup(): | |
| 11 | 
             
                    self.sp_file_tag = []
         | 
| 12 |  | 
| 13 | 
             
                    # count_token
         | 
| 14 | 
            -
                    from  | 
| 15 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 16 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 17 | 
             
                    self.get_token_num = get_token_num
         | 
| @@ -117,7 +117,7 @@ def Latex英译中(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prom | |
| 117 | 
             
                try:
         | 
| 118 | 
             
                    import tiktoken
         | 
| 119 | 
             
                except:
         | 
| 120 | 
            -
                     | 
| 121 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 122 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 123 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -128,12 +128,12 @@ def Latex英译中(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prom | |
| 128 | 
             
                    project_folder = txt
         | 
| 129 | 
             
                else:
         | 
| 130 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 131 | 
            -
                     | 
| 132 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 133 | 
             
                    return
         | 
| 134 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 135 | 
             
                if len(file_manifest) == 0:
         | 
| 136 | 
            -
                     | 
| 137 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 138 | 
             
                    return
         | 
| 139 | 
             
                yield from 多文件翻译(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='en->zh')
         | 
| @@ -154,7 +154,7 @@ def Latex中译英(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prom | |
| 154 | 
             
                try:
         | 
| 155 | 
             
                    import tiktoken
         | 
| 156 | 
             
                except:
         | 
| 157 | 
            -
                     | 
| 158 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 159 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 160 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -165,12 +165,12 @@ def Latex中译英(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prom | |
| 165 | 
             
                    project_folder = txt
         | 
| 166 | 
             
                else:
         | 
| 167 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 168 | 
            -
                     | 
| 169 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 170 | 
             
                    return
         | 
| 171 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 172 | 
             
                if len(file_manifest) == 0:
         | 
| 173 | 
            -
                     | 
| 174 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 175 | 
             
                    return
         | 
| 176 | 
             
                yield from 多文件翻译(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='zh->en')
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception, write_history_to_file
         | 
| 3 | 
             
            fast_debug = False
         | 
| 4 |  | 
| 5 | 
             
            class PaperFileGroup():
         | 
|  | |
| 11 | 
             
                    self.sp_file_tag = []
         | 
| 12 |  | 
| 13 | 
             
                    # count_token
         | 
| 14 | 
            +
                    from request_llms.bridge_all import model_info
         | 
| 15 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 16 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 17 | 
             
                    self.get_token_num = get_token_num
         | 
|  | |
| 117 | 
             
                try:
         | 
| 118 | 
             
                    import tiktoken
         | 
| 119 | 
             
                except:
         | 
| 120 | 
            +
                    report_exception(chatbot, history,
         | 
| 121 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 122 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 123 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 128 | 
             
                    project_folder = txt
         | 
| 129 | 
             
                else:
         | 
| 130 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 131 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 132 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 133 | 
             
                    return
         | 
| 134 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 135 | 
             
                if len(file_manifest) == 0:
         | 
| 136 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex文件: {txt}")
         | 
| 137 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 138 | 
             
                    return
         | 
| 139 | 
             
                yield from 多文件翻译(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='en->zh')
         | 
|  | |
| 154 | 
             
                try:
         | 
| 155 | 
             
                    import tiktoken
         | 
| 156 | 
             
                except:
         | 
| 157 | 
            +
                    report_exception(chatbot, history,
         | 
| 158 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 159 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 160 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 165 | 
             
                    project_folder = txt
         | 
| 166 | 
             
                else:
         | 
| 167 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 168 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 169 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 170 | 
             
                    return
         | 
| 171 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 172 | 
             
                if len(file_manifest) == 0:
         | 
| 173 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex文件: {txt}")
         | 
| 174 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 175 | 
             
                    return
         | 
| 176 | 
             
                yield from 多文件翻译(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='zh->en')
         | 
    	
        crazy_functions/Latex输出PDF结果.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui, trimmed_format_exc, get_conf, get_log_folder, promote_file_to_downloadzone
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from functools import partial
         | 
| 4 | 
             
            import glob, os, requests, time
         | 
| 5 | 
             
            pj = os.path.join
         | 
| @@ -129,7 +129,7 @@ def arxiv_download(chatbot, history, txt, allow_cache=True): | |
| 129 | 
             
                    yield from update_ui_lastest_msg("调用缓存", chatbot=chatbot, history=history)  # 刷新界面
         | 
| 130 | 
             
                else:
         | 
| 131 | 
             
                    yield from update_ui_lastest_msg("开始下载", chatbot=chatbot, history=history)  # 刷新界面
         | 
| 132 | 
            -
                    proxies | 
| 133 | 
             
                    r = requests.get(url_tar, proxies=proxies)
         | 
| 134 | 
             
                    with open(dst, 'wb+') as f:
         | 
| 135 | 
             
                        f.write(r.content)
         | 
| @@ -171,12 +171,12 @@ def Latex英文纠错加PDF对比(txt, llm_kwargs, plugin_kwargs, chatbot, histo | |
| 171 | 
             
                    project_folder = txt
         | 
| 172 | 
             
                else:
         | 
| 173 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 174 | 
            -
                     | 
| 175 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 176 | 
             
                    return
         | 
| 177 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 178 | 
             
                if len(file_manifest) == 0:
         | 
| 179 | 
            -
                     | 
| 180 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 181 | 
             
                    return
         | 
| 182 |  | 
| @@ -249,7 +249,7 @@ def Latex翻译中文并重新编译PDF(txt, llm_kwargs, plugin_kwargs, chatbot, | |
| 249 | 
             
                history = []
         | 
| 250 | 
             
                txt, arxiv_id = yield from arxiv_download(chatbot, history, txt, allow_cache)
         | 
| 251 | 
             
                if txt.endswith('.pdf'):
         | 
| 252 | 
            -
                     | 
| 253 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 254 | 
             
                    return
         | 
| 255 |  | 
| @@ -258,13 +258,13 @@ def Latex翻译中文并重新编译PDF(txt, llm_kwargs, plugin_kwargs, chatbot, | |
| 258 | 
             
                    project_folder = txt
         | 
| 259 | 
             
                else:
         | 
| 260 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 261 | 
            -
                     | 
| 262 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 263 | 
             
                    return
         | 
| 264 |  | 
| 265 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 266 | 
             
                if len(file_manifest) == 0:
         | 
| 267 | 
            -
                     | 
| 268 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 269 | 
             
                    return
         | 
| 270 |  | 
|  | |
| 1 | 
             
            from toolbox import update_ui, trimmed_format_exc, get_conf, get_log_folder, promote_file_to_downloadzone
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception, update_ui_lastest_msg, zip_result, gen_time_str
         | 
| 3 | 
             
            from functools import partial
         | 
| 4 | 
             
            import glob, os, requests, time
         | 
| 5 | 
             
            pj = os.path.join
         | 
|  | |
| 129 | 
             
                    yield from update_ui_lastest_msg("调用缓存", chatbot=chatbot, history=history)  # 刷新界面
         | 
| 130 | 
             
                else:
         | 
| 131 | 
             
                    yield from update_ui_lastest_msg("开始下载", chatbot=chatbot, history=history)  # 刷新界面
         | 
| 132 | 
            +
                    proxies = get_conf('proxies')
         | 
| 133 | 
             
                    r = requests.get(url_tar, proxies=proxies)
         | 
| 134 | 
             
                    with open(dst, 'wb+') as f:
         | 
| 135 | 
             
                        f.write(r.content)
         | 
|  | |
| 171 | 
             
                    project_folder = txt
         | 
| 172 | 
             
                else:
         | 
| 173 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 174 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 175 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 176 | 
             
                    return
         | 
| 177 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 178 | 
             
                if len(file_manifest) == 0:
         | 
| 179 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex文件: {txt}")
         | 
| 180 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 181 | 
             
                    return
         | 
| 182 |  | 
|  | |
| 249 | 
             
                history = []
         | 
| 250 | 
             
                txt, arxiv_id = yield from arxiv_download(chatbot, history, txt, allow_cache)
         | 
| 251 | 
             
                if txt.endswith('.pdf'):
         | 
| 252 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"发现已经存在翻译好的PDF文档")
         | 
| 253 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 254 | 
             
                    return
         | 
| 255 |  | 
|  | |
| 258 | 
             
                    project_folder = txt
         | 
| 259 | 
             
                else:
         | 
| 260 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 261 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无法处理: {txt}")
         | 
| 262 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 263 | 
             
                    return
         | 
| 264 |  | 
| 265 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)]
         | 
| 266 | 
             
                if len(file_manifest) == 0:
         | 
| 267 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex文件: {txt}")
         | 
| 268 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 269 | 
             
                    return
         | 
| 270 |  | 
    	
        crazy_functions/agent_fns/auto_agent.py
    ADDED
    
    | @@ -0,0 +1,23 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from toolbox import CatchException, update_ui, gen_time_str, trimmed_format_exc, ProxyNetworkActivate
         | 
| 2 | 
            +
            from toolbox import report_exception, get_log_folder, update_ui_lastest_msg, Singleton
         | 
| 3 | 
            +
            from crazy_functions.agent_fns.pipe import PluginMultiprocessManager, PipeCom
         | 
| 4 | 
            +
            from crazy_functions.agent_fns.general import AutoGenGeneral
         | 
| 5 | 
            +
             | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
            class AutoGenMath(AutoGenGeneral):
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def define_agents(self):
         | 
| 11 | 
            +
                    from autogen import AssistantAgent, UserProxyAgent
         | 
| 12 | 
            +
                    return [
         | 
| 13 | 
            +
                        {
         | 
| 14 | 
            +
                            "name": "assistant",            # name of the agent.
         | 
| 15 | 
            +
                            "cls":  AssistantAgent,         # class of the agent.
         | 
| 16 | 
            +
                        },
         | 
| 17 | 
            +
                        {
         | 
| 18 | 
            +
                            "name": "user_proxy",           # name of the agent.
         | 
| 19 | 
            +
                            "cls":  UserProxyAgent,         # class of the agent.
         | 
| 20 | 
            +
                            "human_input_mode": "ALWAYS",   # always ask for human input.
         | 
| 21 | 
            +
                            "llm_config": False,            # disables llm-based auto reply.
         | 
| 22 | 
            +
                        },
         | 
| 23 | 
            +
                    ]
         | 
    	
        crazy_functions/agent_fns/echo_agent.py
    ADDED
    
    | @@ -0,0 +1,19 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from crazy_functions.agent_fns.pipe import PluginMultiprocessManager, PipeCom
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class EchoDemo(PluginMultiprocessManager):
         | 
| 4 | 
            +
                def subprocess_worker(self, child_conn):
         | 
| 5 | 
            +
                    # ⭐⭐ 子进程
         | 
| 6 | 
            +
                    self.child_conn = child_conn
         | 
| 7 | 
            +
                    while True:
         | 
| 8 | 
            +
                        msg = self.child_conn.recv() # PipeCom
         | 
| 9 | 
            +
                        if msg.cmd == "user_input":
         | 
| 10 | 
            +
                            # wait futher user input
         | 
| 11 | 
            +
                            self.child_conn.send(PipeCom("show", msg.content))
         | 
| 12 | 
            +
                            wait_success = self.subprocess_worker_wait_user_feedback(wait_msg="我准备好处理下一个问题了.")
         | 
| 13 | 
            +
                            if not wait_success:
         | 
| 14 | 
            +
                                # wait timeout, terminate this subprocess_worker
         | 
| 15 | 
            +
                                break
         | 
| 16 | 
            +
                        elif msg.cmd == "terminate":
         | 
| 17 | 
            +
                            self.child_conn.send(PipeCom("done", ""))
         | 
| 18 | 
            +
                            break
         | 
| 19 | 
            +
                    print('[debug] subprocess_worker terminated')
         | 
    	
        crazy_functions/agent_fns/general.py
    ADDED
    
    | @@ -0,0 +1,134 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from toolbox import trimmed_format_exc, get_conf, ProxyNetworkActivate
         | 
| 2 | 
            +
            from crazy_functions.agent_fns.pipe import PluginMultiprocessManager, PipeCom
         | 
| 3 | 
            +
            from request_llms.bridge_all import predict_no_ui_long_connection
         | 
| 4 | 
            +
            import time
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            def gpt_academic_generate_oai_reply(
         | 
| 7 | 
            +
                self,
         | 
| 8 | 
            +
                messages,
         | 
| 9 | 
            +
                sender,
         | 
| 10 | 
            +
                config,
         | 
| 11 | 
            +
            ):
         | 
| 12 | 
            +
                llm_config = self.llm_config if config is None else config
         | 
| 13 | 
            +
                if llm_config is False:
         | 
| 14 | 
            +
                    return False, None
         | 
| 15 | 
            +
                if messages is None:
         | 
| 16 | 
            +
                    messages = self._oai_messages[sender]
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                inputs = messages[-1]['content']
         | 
| 19 | 
            +
                history = []
         | 
| 20 | 
            +
                for message in messages[:-1]:
         | 
| 21 | 
            +
                    history.append(message['content'])
         | 
| 22 | 
            +
                context=messages[-1].pop("context", None)
         | 
| 23 | 
            +
                assert context is None, "预留参数 context 未实现"
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                reply = predict_no_ui_long_connection(
         | 
| 26 | 
            +
                    inputs=inputs,
         | 
| 27 | 
            +
                    llm_kwargs=llm_config,
         | 
| 28 | 
            +
                    history=history,
         | 
| 29 | 
            +
                    sys_prompt=self._oai_system_message[0]['content'],
         | 
| 30 | 
            +
                    console_slience=True
         | 
| 31 | 
            +
                )
         | 
| 32 | 
            +
                assumed_done = reply.endswith('\nTERMINATE')
         | 
| 33 | 
            +
                return True, reply
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            class AutoGenGeneral(PluginMultiprocessManager):
         | 
| 36 | 
            +
                def gpt_academic_print_override(self, user_proxy, message, sender):
         | 
| 37 | 
            +
                    # ⭐⭐ run in subprocess
         | 
| 38 | 
            +
                    self.child_conn.send(PipeCom("show", sender.name + "\n\n---\n\n" + message["content"]))
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                def gpt_academic_get_human_input(self, user_proxy, message):
         | 
| 41 | 
            +
                    # ⭐⭐ run in subprocess
         | 
| 42 | 
            +
                    patience = 300
         | 
| 43 | 
            +
                    begin_waiting_time = time.time()
         | 
| 44 | 
            +
                    self.child_conn.send(PipeCom("interact", message))
         | 
| 45 | 
            +
                    while True:
         | 
| 46 | 
            +
                        time.sleep(0.5)
         | 
| 47 | 
            +
                        if self.child_conn.poll():
         | 
| 48 | 
            +
                            wait_success = True
         | 
| 49 | 
            +
                            break
         | 
| 50 | 
            +
                        if time.time() - begin_waiting_time > patience:
         | 
| 51 | 
            +
                            self.child_conn.send(PipeCom("done", ""))
         | 
| 52 | 
            +
                            wait_success = False
         | 
| 53 | 
            +
                            break
         | 
| 54 | 
            +
                    if wait_success:
         | 
| 55 | 
            +
                        return self.child_conn.recv().content
         | 
| 56 | 
            +
                    else:
         | 
| 57 | 
            +
                        raise TimeoutError("等待用户输入超时")
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                def define_agents(self):
         | 
| 60 | 
            +
                    raise NotImplementedError
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def exe_autogen(self, input):
         | 
| 63 | 
            +
                    # ⭐⭐ run in subprocess
         | 
| 64 | 
            +
                    input = input.content
         | 
| 65 | 
            +
                    with ProxyNetworkActivate("AutoGen"):
         | 
| 66 | 
            +
                        code_execution_config = {"work_dir": self.autogen_work_dir, "use_docker": self.use_docker}
         | 
| 67 | 
            +
                        agents = self.define_agents()
         | 
| 68 | 
            +
                        user_proxy = None
         | 
| 69 | 
            +
                        assistant = None
         | 
| 70 | 
            +
                        for agent_kwargs in agents:
         | 
| 71 | 
            +
                            agent_cls = agent_kwargs.pop('cls')
         | 
| 72 | 
            +
                            kwargs = {
         | 
| 73 | 
            +
                                'llm_config':self.llm_kwargs,
         | 
| 74 | 
            +
                                'code_execution_config':code_execution_config
         | 
| 75 | 
            +
                            }
         | 
| 76 | 
            +
                            kwargs.update(agent_kwargs)
         | 
| 77 | 
            +
                            agent_handle = agent_cls(**kwargs)
         | 
| 78 | 
            +
                            agent_handle._print_received_message = lambda a,b: self.gpt_academic_print_override(agent_kwargs, a, b)
         | 
| 79 | 
            +
                            for d in agent_handle._reply_func_list:
         | 
| 80 | 
            +
                                if hasattr(d['reply_func'],'__name__') and d['reply_func'].__name__ == 'generate_oai_reply':
         | 
| 81 | 
            +
                                    d['reply_func'] = gpt_academic_generate_oai_reply
         | 
| 82 | 
            +
                            if agent_kwargs['name'] == 'user_proxy':
         | 
| 83 | 
            +
                                agent_handle.get_human_input = lambda a: self.gpt_academic_get_human_input(user_proxy, a)
         | 
| 84 | 
            +
                                user_proxy = agent_handle
         | 
| 85 | 
            +
                            if agent_kwargs['name'] == 'assistant': assistant = agent_handle
         | 
| 86 | 
            +
                        try:
         | 
| 87 | 
            +
                            if user_proxy is None or assistant is None: raise Exception("用户代理或助理代理未定义")
         | 
| 88 | 
            +
                            user_proxy.initiate_chat(assistant, message=input)
         | 
| 89 | 
            +
                        except Exception as e:
         | 
| 90 | 
            +
                            tb_str = '```\n' + trimmed_format_exc() + '```'
         | 
| 91 | 
            +
                            self.child_conn.send(PipeCom("done", "AutoGen 执行失败: \n\n" + tb_str))
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                def subprocess_worker(self, child_conn):
         | 
| 94 | 
            +
                    # ⭐⭐ run in subprocess
         | 
| 95 | 
            +
                    self.child_conn = child_conn
         | 
| 96 | 
            +
                    while True:
         | 
| 97 | 
            +
                        msg = self.child_conn.recv()  # PipeCom
         | 
| 98 | 
            +
                        self.exe_autogen(msg)
         | 
| 99 | 
            +
             | 
| 100 | 
            +
             | 
| 101 | 
            +
            class AutoGenGroupChat(AutoGenGeneral):
         | 
| 102 | 
            +
                def exe_autogen(self, input):
         | 
| 103 | 
            +
                    # ⭐⭐ run in subprocess
         | 
| 104 | 
            +
                    import autogen
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    input = input.content
         | 
| 107 | 
            +
                    with ProxyNetworkActivate("AutoGen"):
         | 
| 108 | 
            +
                        code_execution_config = {"work_dir": self.autogen_work_dir, "use_docker": self.use_docker}
         | 
| 109 | 
            +
                        agents = self.define_agents()
         | 
| 110 | 
            +
                        agents_instances = []
         | 
| 111 | 
            +
                        for agent_kwargs in agents:
         | 
| 112 | 
            +
                            agent_cls = agent_kwargs.pop("cls")
         | 
| 113 | 
            +
                            kwargs = {"code_execution_config": code_execution_config}
         | 
| 114 | 
            +
                            kwargs.update(agent_kwargs)
         | 
| 115 | 
            +
                            agent_handle = agent_cls(**kwargs)
         | 
| 116 | 
            +
                            agent_handle._print_received_message = lambda a, b: self.gpt_academic_print_override(agent_kwargs, a, b)
         | 
| 117 | 
            +
                            agents_instances.append(agent_handle)
         | 
| 118 | 
            +
                            if agent_kwargs["name"] == "user_proxy":
         | 
| 119 | 
            +
                                user_proxy = agent_handle
         | 
| 120 | 
            +
                                user_proxy.get_human_input = lambda a: self.gpt_academic_get_human_input(user_proxy, a)
         | 
| 121 | 
            +
                        try:
         | 
| 122 | 
            +
                            groupchat = autogen.GroupChat(agents=agents_instances, messages=[], max_round=50)
         | 
| 123 | 
            +
                            manager = autogen.GroupChatManager(groupchat=groupchat, **self.define_group_chat_manager_config())
         | 
| 124 | 
            +
                            manager._print_received_message = lambda a, b: self.gpt_academic_print_override(agent_kwargs, a, b)
         | 
| 125 | 
            +
                            manager.get_human_input = lambda a: self.gpt_academic_get_human_input(manager, a)
         | 
| 126 | 
            +
                            if user_proxy is None:
         | 
| 127 | 
            +
                                raise Exception("user_proxy is not defined")
         | 
| 128 | 
            +
                            user_proxy.initiate_chat(manager, message=input)
         | 
| 129 | 
            +
                        except Exception:
         | 
| 130 | 
            +
                            tb_str = "```\n" + trimmed_format_exc() + "```"
         | 
| 131 | 
            +
                            self.child_conn.send(PipeCom("done", "AutoGen exe failed: \n\n" + tb_str))
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                def define_group_chat_manager_config(self):
         | 
| 134 | 
            +
                    raise NotImplementedError
         | 
    	
        crazy_functions/agent_fns/persistent.py
    ADDED
    
    | @@ -0,0 +1,16 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from toolbox import Singleton
         | 
| 2 | 
            +
            @Singleton
         | 
| 3 | 
            +
            class GradioMultiuserManagerForPersistentClasses():
         | 
| 4 | 
            +
                def __init__(self):
         | 
| 5 | 
            +
                    self.mapping = {}
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def already_alive(self, key):
         | 
| 8 | 
            +
                    return (key in self.mapping) and (self.mapping[key].is_alive())
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def set(self, key, x):
         | 
| 11 | 
            +
                    self.mapping[key] = x
         | 
| 12 | 
            +
                    return self.mapping[key]
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def get(self, key):
         | 
| 15 | 
            +
                    return self.mapping[key]
         | 
| 16 | 
            +
             | 
    	
        crazy_functions/agent_fns/pipe.py
    ADDED
    
    | @@ -0,0 +1,194 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from toolbox import get_log_folder, update_ui, gen_time_str, get_conf, promote_file_to_downloadzone
         | 
| 2 | 
            +
            from crazy_functions.agent_fns.watchdog import WatchDog
         | 
| 3 | 
            +
            import time, os
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            class PipeCom:
         | 
| 6 | 
            +
                def __init__(self, cmd, content) -> None:
         | 
| 7 | 
            +
                    self.cmd = cmd
         | 
| 8 | 
            +
                    self.content = content
         | 
| 9 | 
            +
             | 
| 10 | 
            +
             | 
| 11 | 
            +
            class PluginMultiprocessManager:
         | 
| 12 | 
            +
                def __init__(self, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
         | 
| 13 | 
            +
                    # ⭐ run in main process
         | 
| 14 | 
            +
                    self.autogen_work_dir = os.path.join(get_log_folder("autogen"), gen_time_str())
         | 
| 15 | 
            +
                    self.previous_work_dir_files = {}
         | 
| 16 | 
            +
                    self.llm_kwargs = llm_kwargs
         | 
| 17 | 
            +
                    self.plugin_kwargs = plugin_kwargs
         | 
| 18 | 
            +
                    self.chatbot = chatbot
         | 
| 19 | 
            +
                    self.history = history
         | 
| 20 | 
            +
                    self.system_prompt = system_prompt
         | 
| 21 | 
            +
                    # self.web_port = web_port
         | 
| 22 | 
            +
                    self.alive = True
         | 
| 23 | 
            +
                    self.use_docker = get_conf("AUTOGEN_USE_DOCKER")
         | 
| 24 | 
            +
                    self.last_user_input = ""
         | 
| 25 | 
            +
                    # create a thread to monitor self.heartbeat, terminate the instance if no heartbeat for a long time
         | 
| 26 | 
            +
                    timeout_seconds = 5 * 60
         | 
| 27 | 
            +
                    self.heartbeat_watchdog = WatchDog(timeout=timeout_seconds, bark_fn=self.terminate, interval=5)
         | 
| 28 | 
            +
                    self.heartbeat_watchdog.begin_watch()
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def feed_heartbeat_watchdog(self):
         | 
| 31 | 
            +
                    # feed this `dog`, so the dog will not `bark` (bark_fn will terminate the instance)
         | 
| 32 | 
            +
                    self.heartbeat_watchdog.feed()
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def is_alive(self):
         | 
| 35 | 
            +
                    return self.alive
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                def launch_subprocess_with_pipe(self):
         | 
| 38 | 
            +
                    # ⭐ run in main process
         | 
| 39 | 
            +
                    from multiprocessing import Process, Pipe
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    parent_conn, child_conn = Pipe()
         | 
| 42 | 
            +
                    self.p = Process(target=self.subprocess_worker, args=(child_conn,))
         | 
| 43 | 
            +
                    self.p.daemon = True
         | 
| 44 | 
            +
                    self.p.start()
         | 
| 45 | 
            +
                    return parent_conn
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                def terminate(self):
         | 
| 48 | 
            +
                    self.p.terminate()
         | 
| 49 | 
            +
                    self.alive = False
         | 
| 50 | 
            +
                    print("[debug] instance terminated")
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def subprocess_worker(self, child_conn):
         | 
| 53 | 
            +
                    # ⭐⭐ run in subprocess
         | 
| 54 | 
            +
                    raise NotImplementedError
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                def send_command(self, cmd):
         | 
| 57 | 
            +
                    # ⭐ run in main process
         | 
| 58 | 
            +
                    repeated = False
         | 
| 59 | 
            +
                    if cmd == self.last_user_input:
         | 
| 60 | 
            +
                        repeated = True
         | 
| 61 | 
            +
                        cmd = ""
         | 
| 62 | 
            +
                    else:
         | 
| 63 | 
            +
                        self.last_user_input = cmd
         | 
| 64 | 
            +
                    self.parent_conn.send(PipeCom("user_input", cmd))
         | 
| 65 | 
            +
                    return repeated, cmd
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                def immediate_showoff_when_possible(self, fp):
         | 
| 68 | 
            +
                    # ⭐ 主进程
         | 
| 69 | 
            +
                    # 获取fp的拓展名
         | 
| 70 | 
            +
                    file_type = fp.split('.')[-1]
         | 
| 71 | 
            +
                    # 如果是文本文件, 则直接显示文本内容
         | 
| 72 | 
            +
                    if file_type.lower() in ['png', 'jpg']:
         | 
| 73 | 
            +
                        image_path = os.path.abspath(fp)
         | 
| 74 | 
            +
                        self.chatbot.append([
         | 
| 75 | 
            +
                            '检测到新生图像:', 
         | 
| 76 | 
            +
                            f'本地文件预览: <br/><div align="center"><img src="file={image_path}"></div>'
         | 
| 77 | 
            +
                        ])
         | 
| 78 | 
            +
                        yield from update_ui(chatbot=self.chatbot, history=self.history)
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                def overwatch_workdir_file_change(self):
         | 
| 81 | 
            +
                    # ⭐ 主进程 Docker 外挂文件夹监控
         | 
| 82 | 
            +
                    path_to_overwatch = self.autogen_work_dir
         | 
| 83 | 
            +
                    change_list = []
         | 
| 84 | 
            +
                    # 扫描路径下的所有文件, 并与self.previous_work_dir_files中所记录的文件进行对比,
         | 
| 85 | 
            +
                    # 如果有新文件出现,或者文件的修改时间发生变化,则更新self.previous_work_dir_files中
         | 
| 86 | 
            +
                    # 把新文件和发生变化的文件的路径记录到 change_list 中
         | 
| 87 | 
            +
                    for root, dirs, files in os.walk(path_to_overwatch):
         | 
| 88 | 
            +
                        for file in files:
         | 
| 89 | 
            +
                            file_path = os.path.join(root, file)
         | 
| 90 | 
            +
                            if file_path not in self.previous_work_dir_files.keys():
         | 
| 91 | 
            +
                                last_modified_time = os.stat(file_path).st_mtime
         | 
| 92 | 
            +
                                self.previous_work_dir_files.update({file_path: last_modified_time})
         | 
| 93 | 
            +
                                change_list.append(file_path)
         | 
| 94 | 
            +
                            else:
         | 
| 95 | 
            +
                                last_modified_time = os.stat(file_path).st_mtime
         | 
| 96 | 
            +
                                if last_modified_time != self.previous_work_dir_files[file_path]:
         | 
| 97 | 
            +
                                    self.previous_work_dir_files[file_path] = last_modified_time
         | 
| 98 | 
            +
                                    change_list.append(file_path)
         | 
| 99 | 
            +
                    if len(change_list) > 0:
         | 
| 100 | 
            +
                        file_links = ""
         | 
| 101 | 
            +
                        for f in change_list:
         | 
| 102 | 
            +
                            res = promote_file_to_downloadzone(f)
         | 
| 103 | 
            +
                            file_links += f'<br/><a href="file={res}" target="_blank">{res}</a>'
         | 
| 104 | 
            +
                            yield from self.immediate_showoff_when_possible(f)
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                        self.chatbot.append(['检测到新生文档.', f'文档清单如下: {file_links}'])
         | 
| 107 | 
            +
                        yield from update_ui(chatbot=self.chatbot, history=self.history)
         | 
| 108 | 
            +
                    return change_list
         | 
| 109 | 
            +
             | 
| 110 | 
            +
             | 
| 111 | 
            +
                def main_process_ui_control(self, txt, create_or_resume) -> str:
         | 
| 112 | 
            +
                    # ⭐ 主进程
         | 
| 113 | 
            +
                    if create_or_resume == 'create':
         | 
| 114 | 
            +
                        self.cnt = 1
         | 
| 115 | 
            +
                        self.parent_conn = self.launch_subprocess_with_pipe() # ⭐⭐⭐
         | 
| 116 | 
            +
                    repeated, cmd_to_autogen = self.send_command(txt)
         | 
| 117 | 
            +
                    if txt == 'exit': 
         | 
| 118 | 
            +
                        self.chatbot.append([f"结束", "结束信号已明确,终止AutoGen程序。"])
         | 
| 119 | 
            +
                        yield from update_ui(chatbot=self.chatbot, history=self.history)
         | 
| 120 | 
            +
                        self.terminate()
         | 
| 121 | 
            +
                        return "terminate"
         | 
| 122 | 
            +
                    
         | 
| 123 | 
            +
                    # patience = 10
         | 
| 124 | 
            +
                    
         | 
| 125 | 
            +
                    while True:
         | 
| 126 | 
            +
                        time.sleep(0.5)
         | 
| 127 | 
            +
                        if not self.alive:
         | 
| 128 | 
            +
                            # the heartbeat watchdog might have it killed
         | 
| 129 | 
            +
                            self.terminate()
         | 
| 130 | 
            +
                            return "terminate"
         | 
| 131 | 
            +
                        if self.parent_conn.poll(): 
         | 
| 132 | 
            +
                            self.feed_heartbeat_watchdog()
         | 
| 133 | 
            +
                            if "[GPT-Academic] 等待中" in self.chatbot[-1][-1]:
         | 
| 134 | 
            +
                                self.chatbot.pop(-1)  # remove the last line
         | 
| 135 | 
            +
                            if "等待您的进一步指令" in self.chatbot[-1][-1]:
         | 
| 136 | 
            +
                                self.chatbot.pop(-1)  # remove the last line
         | 
| 137 | 
            +
                            if '[GPT-Academic] 等待中' in self.chatbot[-1][-1]:
         | 
| 138 | 
            +
                                self.chatbot.pop(-1)    # remove the last line
         | 
| 139 | 
            +
                            msg = self.parent_conn.recv() # PipeCom
         | 
| 140 | 
            +
                            if msg.cmd == "done":
         | 
| 141 | 
            +
                                self.chatbot.append([f"结束", msg.content])
         | 
| 142 | 
            +
                                self.cnt += 1
         | 
| 143 | 
            +
                                yield from update_ui(chatbot=self.chatbot, history=self.history)
         | 
| 144 | 
            +
                                self.terminate()
         | 
| 145 | 
            +
                                break
         | 
| 146 | 
            +
                            if msg.cmd == "show":
         | 
| 147 | 
            +
                                yield from self.overwatch_workdir_file_change()
         | 
| 148 | 
            +
                                notice = ""
         | 
| 149 | 
            +
                                if repeated: notice = "(自动忽略重复的输入)"
         | 
| 150 | 
            +
                                self.chatbot.append([f"运行阶段-{self.cnt}(上次用户反馈输入为: 「{cmd_to_autogen}」{notice}", msg.content])
         | 
| 151 | 
            +
                                self.cnt += 1
         | 
| 152 | 
            +
                                yield from update_ui(chatbot=self.chatbot, history=self.history)
         | 
| 153 | 
            +
                            if msg.cmd == "interact":
         | 
| 154 | 
            +
                                yield from self.overwatch_workdir_file_change()
         | 
| 155 | 
            +
                                self.chatbot.append([f"程序抵达用户反馈节点.", msg.content + 
         | 
| 156 | 
            +
                                                     "\n\n等待您的进一步指令." + 
         | 
| 157 | 
            +
                                                     "\n\n(1) 一般情况下您不需要说什么, 清空输入区, 然后直接点击“提交”以继续. " +
         | 
| 158 | 
            +
                                                     "\n\n(2) 如果您需要补充些什么, 输入要反馈的内容, 直接点击“提交”以继续. " +
         | 
| 159 | 
            +
                                                     "\n\n(3) 如果您想终止程序, 输入exit, 直接点击“提交”以终止AutoGen并解锁. "
         | 
| 160 | 
            +
                                ])
         | 
| 161 | 
            +
                                yield from update_ui(chatbot=self.chatbot, history=self.history)
         | 
| 162 | 
            +
                                # do not terminate here, leave the subprocess_worker instance alive
         | 
| 163 | 
            +
                                return "wait_feedback"
         | 
| 164 | 
            +
                        else:
         | 
| 165 | 
            +
                            self.feed_heartbeat_watchdog()
         | 
| 166 | 
            +
                            if '[GPT-Academic] 等待中' not in self.chatbot[-1][-1]:
         | 
| 167 | 
            +
                                # begin_waiting_time = time.time()
         | 
| 168 | 
            +
                                self.chatbot.append(["[GPT-Academic] 等待AutoGen执行结果 ...", "[GPT-Academic] 等待中"])
         | 
| 169 | 
            +
                            self.chatbot[-1] = [self.chatbot[-1][0], self.chatbot[-1][1].replace("[GPT-Academic] 等待中", "[GPT-Academic] 等待中.")]
         | 
| 170 | 
            +
                            yield from update_ui(chatbot=self.chatbot, history=self.history)
         | 
| 171 | 
            +
                            # if time.time() - begin_waiting_time > patience:
         | 
| 172 | 
            +
                            #     self.chatbot.append([f"结束", "等待超时, 终止AutoGen程序。"])
         | 
| 173 | 
            +
                            #     yield from update_ui(chatbot=self.chatbot, history=self.history)
         | 
| 174 | 
            +
                            #     self.terminate()
         | 
| 175 | 
            +
                            #     return "terminate"
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                    self.terminate()
         | 
| 178 | 
            +
                    return "terminate"
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                def subprocess_worker_wait_user_feedback(self, wait_msg="wait user feedback"):
         | 
| 181 | 
            +
                    # ⭐⭐ run in subprocess
         | 
| 182 | 
            +
                    patience = 5 * 60
         | 
| 183 | 
            +
                    begin_waiting_time = time.time()
         | 
| 184 | 
            +
                    self.child_conn.send(PipeCom("interact", wait_msg))
         | 
| 185 | 
            +
                    while True:
         | 
| 186 | 
            +
                        time.sleep(0.5)
         | 
| 187 | 
            +
                        if self.child_conn.poll():
         | 
| 188 | 
            +
                            wait_success = True
         | 
| 189 | 
            +
                            break
         | 
| 190 | 
            +
                        if time.time() - begin_waiting_time > patience:
         | 
| 191 | 
            +
                            self.child_conn.send(PipeCom("done", ""))
         | 
| 192 | 
            +
                            wait_success = False
         | 
| 193 | 
            +
                            break
         | 
| 194 | 
            +
                    return wait_success
         | 
    	
        crazy_functions/agent_fns/watchdog.py
    ADDED
    
    | @@ -0,0 +1,28 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            import threading, time
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class WatchDog():
         | 
| 4 | 
            +
                def __init__(self, timeout, bark_fn, interval=3, msg="") -> None:
         | 
| 5 | 
            +
                    self.last_feed = None
         | 
| 6 | 
            +
                    self.timeout = timeout
         | 
| 7 | 
            +
                    self.bark_fn = bark_fn
         | 
| 8 | 
            +
                    self.interval = interval
         | 
| 9 | 
            +
                    self.msg = msg
         | 
| 10 | 
            +
                    self.kill_dog = False
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                def watch(self):
         | 
| 13 | 
            +
                    while True:
         | 
| 14 | 
            +
                        if self.kill_dog: break
         | 
| 15 | 
            +
                        if time.time() - self.last_feed > self.timeout:
         | 
| 16 | 
            +
                            if len(self.msg) > 0: print(self.msg)
         | 
| 17 | 
            +
                            self.bark_fn()
         | 
| 18 | 
            +
                            break
         | 
| 19 | 
            +
                        time.sleep(self.interval)
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def begin_watch(self):
         | 
| 22 | 
            +
                    self.last_feed = time.time()
         | 
| 23 | 
            +
                    th = threading.Thread(target=self.watch)
         | 
| 24 | 
            +
                    th.daemon = True
         | 
| 25 | 
            +
                    th.start()
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def feed(self):
         | 
| 28 | 
            +
                    self.last_feed = time.time()
         | 
    	
        crazy_functions/crazy_utils.py
    CHANGED
    
    | @@ -5,7 +5,7 @@ import logging | |
| 5 |  | 
| 6 | 
             
            def input_clipping(inputs, history, max_token_limit):
         | 
| 7 | 
             
                import numpy as np
         | 
| 8 | 
            -
                from  | 
| 9 | 
             
                enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 10 | 
             
                def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 11 |  | 
| @@ -63,18 +63,21 @@ def request_gpt_model_in_new_thread_with_ui_alive( | |
| 63 | 
             
                """
         | 
| 64 | 
             
                import time
         | 
| 65 | 
             
                from concurrent.futures import ThreadPoolExecutor
         | 
| 66 | 
            -
                from  | 
| 67 | 
             
                # 用户反馈
         | 
| 68 | 
             
                chatbot.append([inputs_show_user, ""])
         | 
| 69 | 
             
                yield from update_ui(chatbot=chatbot, history=[]) # 刷新界面
         | 
| 70 | 
             
                executor = ThreadPoolExecutor(max_workers=16)
         | 
| 71 | 
             
                mutable = ["", time.time(), ""]
         | 
|  | |
|  | |
|  | |
| 72 | 
             
                def _req_gpt(inputs, history, sys_prompt):
         | 
| 73 | 
             
                    retry_op = retry_times_at_unknown_error
         | 
| 74 | 
             
                    exceeded_cnt = 0
         | 
| 75 | 
             
                    while True:
         | 
| 76 | 
             
                        # watchdog error
         | 
| 77 | 
            -
                        if len(mutable) >= 2 and (time.time()-mutable[1]) >  | 
| 78 | 
             
                            raise RuntimeError("检测到程序终止。")
         | 
| 79 | 
             
                        try:
         | 
| 80 | 
             
                            # 【第一种情况】:顺利完成
         | 
| @@ -174,11 +177,11 @@ def request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency( | |
| 174 | 
             
                """
         | 
| 175 | 
             
                import time, random
         | 
| 176 | 
             
                from concurrent.futures import ThreadPoolExecutor
         | 
| 177 | 
            -
                from  | 
| 178 | 
             
                assert len(inputs_array) == len(history_array)
         | 
| 179 | 
             
                assert len(inputs_array) == len(sys_prompt_array)
         | 
| 180 | 
             
                if max_workers == -1: # 读取配置文件
         | 
| 181 | 
            -
                    try: max_workers | 
| 182 | 
             
                    except: max_workers = 8
         | 
| 183 | 
             
                    if max_workers <= 0: max_workers = 3
         | 
| 184 | 
             
                # 屏蔽掉 chatglm的多线程,可能会导致严重卡顿
         | 
| @@ -193,19 +196,21 @@ def request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency( | |
| 193 | 
             
                # 跨线程传递
         | 
| 194 | 
             
                mutable = [["", time.time(), "等待中"] for _ in range(n_frag)]
         | 
| 195 |  | 
|  | |
|  | |
|  | |
| 196 | 
             
                # 子线程任务
         | 
| 197 | 
             
                def _req_gpt(index, inputs, history, sys_prompt):
         | 
| 198 | 
             
                    gpt_say = ""
         | 
| 199 | 
             
                    retry_op = retry_times_at_unknown_error
         | 
| 200 | 
             
                    exceeded_cnt = 0
         | 
| 201 | 
             
                    mutable[index][2] = "执行中"
         | 
|  | |
| 202 | 
             
                    while True:
         | 
| 203 | 
             
                        # watchdog error
         | 
| 204 | 
            -
                        if  | 
| 205 | 
            -
                            raise RuntimeError("检测到程序终止。")
         | 
| 206 | 
             
                        try:
         | 
| 207 | 
             
                            # 【第一种情况】:顺利完成
         | 
| 208 | 
            -
                            # time.sleep(10); raise RuntimeError("测试")
         | 
| 209 | 
             
                            gpt_say = predict_no_ui_long_connection(
         | 
| 210 | 
             
                                inputs=inputs, llm_kwargs=llm_kwargs, history=history, 
         | 
| 211 | 
             
                                sys_prompt=sys_prompt, observe_window=mutable[index], console_slience=True
         | 
| @@ -213,7 +218,7 @@ def request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency( | |
| 213 | 
             
                            mutable[index][2] = "已成功"
         | 
| 214 | 
             
                            return gpt_say
         | 
| 215 | 
             
                        except ConnectionAbortedError as token_exceeded_error:
         | 
| 216 | 
            -
                            # 【第二种情况】:Token | 
| 217 | 
             
                            if handle_token_exceed:
         | 
| 218 | 
             
                                exceeded_cnt += 1
         | 
| 219 | 
             
                                # 【选择处理】 尝试计算比例,尽可能多地保留文本
         | 
| @@ -234,6 +239,7 @@ def request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency( | |
| 234 | 
             
                                return gpt_say # 放弃
         | 
| 235 | 
             
                        except:
         | 
| 236 | 
             
                            # 【第三种情况】:其他错误
         | 
|  | |
| 237 | 
             
                            tb_str = '```\n' + trimmed_format_exc() + '```'
         | 
| 238 | 
             
                            print(tb_str)
         | 
| 239 | 
             
                            gpt_say += f"[Local Message] 警告,线程{index}在执行过程中遭遇问题, Traceback:\n\n{tb_str}\n\n"
         | 
| @@ -250,6 +256,7 @@ def request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency( | |
| 250 | 
             
                                for i in range(wait):
         | 
| 251 | 
             
                                    mutable[index][2] = f"{fail_info}等待重试 {wait-i}"; time.sleep(1)
         | 
| 252 | 
             
                                # 开始重试
         | 
|  | |
| 253 | 
             
                                mutable[index][2] = f"重试中 {retry_times_at_unknown_error-retry_op}/{retry_times_at_unknown_error}"
         | 
| 254 | 
             
                                continue # 返回重试
         | 
| 255 | 
             
                            else:
         | 
| @@ -275,7 +282,7 @@ def request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency( | |
| 275 | 
             
                    # 在前端打���些好玩的东西
         | 
| 276 | 
             
                    for thread_index, _ in enumerate(worker_done):
         | 
| 277 | 
             
                        print_something_really_funny = "[ ...`"+mutable[thread_index][0][-scroller_max_len:].\
         | 
| 278 | 
            -
                            replace('\n', '').replace(' | 
| 279 | 
             
                                ' ', '.').replace('<br/>', '.....').replace('$', '.')+"`... ]"
         | 
| 280 | 
             
                        observe_win.append(print_something_really_funny)
         | 
| 281 | 
             
                    # 在前端打印些好玩的东西
         | 
| @@ -301,7 +308,7 @@ def request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency( | |
| 301 | 
             
                        gpt_res = f.result()
         | 
| 302 | 
             
                        chatbot.append([inputs_show_user, gpt_res])
         | 
| 303 | 
             
                        yield from update_ui(chatbot=chatbot, history=[]) # 刷新界面
         | 
| 304 | 
            -
                        time.sleep(0. | 
| 305 | 
             
                return gpt_response_collection
         | 
| 306 |  | 
| 307 |  | 
| @@ -596,7 +603,7 @@ def get_files_from_everything(txt, type): # type='.md' | |
| 596 | 
             
                    import requests
         | 
| 597 | 
             
                    from toolbox import get_conf
         | 
| 598 | 
             
                    from toolbox import get_log_folder, gen_time_str
         | 
| 599 | 
            -
                    proxies | 
| 600 | 
             
                    try:
         | 
| 601 | 
             
                        r = requests.get(txt, proxies=proxies)
         | 
| 602 | 
             
                    except:
         | 
| @@ -715,8 +722,10 @@ class nougat_interface(): | |
| 715 |  | 
| 716 | 
             
                def nougat_with_timeout(self, command, cwd, timeout=3600):
         | 
| 717 | 
             
                    import subprocess
         | 
|  | |
| 718 | 
             
                    logging.info(f'正在执行命令 {command}')
         | 
| 719 | 
            -
                     | 
|  | |
| 720 | 
             
                    try:
         | 
| 721 | 
             
                        stdout, stderr = process.communicate(timeout=timeout)
         | 
| 722 | 
             
                    except subprocess.TimeoutExpired:
         | 
| @@ -761,54 +770,6 @@ def try_install_deps(deps, reload_m=[]): | |
| 761 | 
             
                    importlib.reload(__import__(m))
         | 
| 762 |  | 
| 763 |  | 
| 764 | 
            -
            HTML_CSS = """
         | 
| 765 | 
            -
            .row {
         | 
| 766 | 
            -
              display: flex;
         | 
| 767 | 
            -
              flex-wrap: wrap;
         | 
| 768 | 
            -
            }
         | 
| 769 | 
            -
            .column {
         | 
| 770 | 
            -
              flex: 1;
         | 
| 771 | 
            -
              padding: 10px;
         | 
| 772 | 
            -
            }
         | 
| 773 | 
            -
            .table-header {
         | 
| 774 | 
            -
              font-weight: bold;
         | 
| 775 | 
            -
              border-bottom: 1px solid black;
         | 
| 776 | 
            -
            }
         | 
| 777 | 
            -
            .table-row {
         | 
| 778 | 
            -
              border-bottom: 1px solid lightgray;
         | 
| 779 | 
            -
            }
         | 
| 780 | 
            -
            .table-cell {
         | 
| 781 | 
            -
              padding: 5px;
         | 
| 782 | 
            -
            }
         | 
| 783 | 
            -
            """
         | 
| 784 | 
            -
             | 
| 785 | 
            -
            TABLE_CSS = """
         | 
| 786 | 
            -
            <div class="row table-row">
         | 
| 787 | 
            -
                <div class="column table-cell">REPLACE_A</div>
         | 
| 788 | 
            -
                <div class="column table-cell">REPLACE_B</div>
         | 
| 789 | 
            -
            </div>
         | 
| 790 | 
            -
            """
         | 
| 791 | 
            -
             | 
| 792 | 
            -
            class construct_html():
         | 
| 793 | 
            -
                def __init__(self) -> None:
         | 
| 794 | 
            -
                    self.css = HTML_CSS
         | 
| 795 | 
            -
                    self.html_string = f'<!DOCTYPE html><head><meta charset="utf-8"><title>翻译结果</title><style>{self.css}</style></head>'
         | 
| 796 | 
            -
             | 
| 797 | 
            -
             | 
| 798 | 
            -
                def add_row(self, a, b):
         | 
| 799 | 
            -
                    tmp = TABLE_CSS
         | 
| 800 | 
            -
                    from toolbox import markdown_convertion
         | 
| 801 | 
            -
                    tmp = tmp.replace('REPLACE_A', markdown_convertion(a))
         | 
| 802 | 
            -
                    tmp = tmp.replace('REPLACE_B', markdown_convertion(b))
         | 
| 803 | 
            -
                    self.html_string += tmp
         | 
| 804 | 
            -
             | 
| 805 | 
            -
             | 
| 806 | 
            -
                def save_file(self, file_name):
         | 
| 807 | 
            -
                    with open(os.path.join(get_log_folder(), file_name), 'w', encoding='utf8') as f:
         | 
| 808 | 
            -
                        f.write(self.html_string.encode('utf-8', 'ignore').decode())
         | 
| 809 | 
            -
                    return os.path.join(get_log_folder(), file_name)
         | 
| 810 | 
            -
             | 
| 811 | 
            -
             | 
| 812 | 
             
            def get_plugin_arg(plugin_kwargs, key, default):
         | 
| 813 | 
             
                # 如果参数是空的
         | 
| 814 | 
             
                if (key in plugin_kwargs) and (plugin_kwargs[key] == ""): plugin_kwargs.pop(key)
         | 
|  | |
| 5 |  | 
| 6 | 
             
            def input_clipping(inputs, history, max_token_limit):
         | 
| 7 | 
             
                import numpy as np
         | 
| 8 | 
            +
                from request_llms.bridge_all import model_info
         | 
| 9 | 
             
                enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 10 | 
             
                def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 11 |  | 
|  | |
| 63 | 
             
                """
         | 
| 64 | 
             
                import time
         | 
| 65 | 
             
                from concurrent.futures import ThreadPoolExecutor
         | 
| 66 | 
            +
                from request_llms.bridge_all import predict_no_ui_long_connection
         | 
| 67 | 
             
                # 用户反馈
         | 
| 68 | 
             
                chatbot.append([inputs_show_user, ""])
         | 
| 69 | 
             
                yield from update_ui(chatbot=chatbot, history=[]) # 刷新界面
         | 
| 70 | 
             
                executor = ThreadPoolExecutor(max_workers=16)
         | 
| 71 | 
             
                mutable = ["", time.time(), ""]
         | 
| 72 | 
            +
                # 看门狗耐心
         | 
| 73 | 
            +
                watch_dog_patience = 5
         | 
| 74 | 
            +
                # 请求任务
         | 
| 75 | 
             
                def _req_gpt(inputs, history, sys_prompt):
         | 
| 76 | 
             
                    retry_op = retry_times_at_unknown_error
         | 
| 77 | 
             
                    exceeded_cnt = 0
         | 
| 78 | 
             
                    while True:
         | 
| 79 | 
             
                        # watchdog error
         | 
| 80 | 
            +
                        if len(mutable) >= 2 and (time.time()-mutable[1]) > watch_dog_patience: 
         | 
| 81 | 
             
                            raise RuntimeError("检测到程序终止。")
         | 
| 82 | 
             
                        try:
         | 
| 83 | 
             
                            # 【第一种情况】:顺利完成
         | 
|  | |
| 177 | 
             
                """
         | 
| 178 | 
             
                import time, random
         | 
| 179 | 
             
                from concurrent.futures import ThreadPoolExecutor
         | 
| 180 | 
            +
                from request_llms.bridge_all import predict_no_ui_long_connection
         | 
| 181 | 
             
                assert len(inputs_array) == len(history_array)
         | 
| 182 | 
             
                assert len(inputs_array) == len(sys_prompt_array)
         | 
| 183 | 
             
                if max_workers == -1: # 读取配置文件
         | 
| 184 | 
            +
                    try: max_workers = get_conf('DEFAULT_WORKER_NUM')
         | 
| 185 | 
             
                    except: max_workers = 8
         | 
| 186 | 
             
                    if max_workers <= 0: max_workers = 3
         | 
| 187 | 
             
                # 屏蔽掉 chatglm的多线程,可能会导致严重卡顿
         | 
|  | |
| 196 | 
             
                # 跨线程传递
         | 
| 197 | 
             
                mutable = [["", time.time(), "等待中"] for _ in range(n_frag)]
         | 
| 198 |  | 
| 199 | 
            +
                # 看门狗耐心
         | 
| 200 | 
            +
                watch_dog_patience = 5
         | 
| 201 | 
            +
             | 
| 202 | 
             
                # 子线程任务
         | 
| 203 | 
             
                def _req_gpt(index, inputs, history, sys_prompt):
         | 
| 204 | 
             
                    gpt_say = ""
         | 
| 205 | 
             
                    retry_op = retry_times_at_unknown_error
         | 
| 206 | 
             
                    exceeded_cnt = 0
         | 
| 207 | 
             
                    mutable[index][2] = "执行中"
         | 
| 208 | 
            +
                    detect_timeout = lambda: len(mutable[index]) >= 2 and (time.time()-mutable[index][1]) > watch_dog_patience
         | 
| 209 | 
             
                    while True:
         | 
| 210 | 
             
                        # watchdog error
         | 
| 211 | 
            +
                        if detect_timeout(): raise RuntimeError("检测到程序终止。")
         | 
|  | |
| 212 | 
             
                        try:
         | 
| 213 | 
             
                            # 【第一种情况】:顺利完成
         | 
|  | |
| 214 | 
             
                            gpt_say = predict_no_ui_long_connection(
         | 
| 215 | 
             
                                inputs=inputs, llm_kwargs=llm_kwargs, history=history, 
         | 
| 216 | 
             
                                sys_prompt=sys_prompt, observe_window=mutable[index], console_slience=True
         | 
|  | |
| 218 | 
             
                            mutable[index][2] = "已成功"
         | 
| 219 | 
             
                            return gpt_say
         | 
| 220 | 
             
                        except ConnectionAbortedError as token_exceeded_error:
         | 
| 221 | 
            +
                            # 【第二种情况】:Token溢出
         | 
| 222 | 
             
                            if handle_token_exceed:
         | 
| 223 | 
             
                                exceeded_cnt += 1
         | 
| 224 | 
             
                                # 【选择处理】 尝试计算比例,尽可能多地保留文本
         | 
|  | |
| 239 | 
             
                                return gpt_say # 放弃
         | 
| 240 | 
             
                        except:
         | 
| 241 | 
             
                            # 【第三种情况】:其他错误
         | 
| 242 | 
            +
                            if detect_timeout(): raise RuntimeError("检测到程序终止。")
         | 
| 243 | 
             
                            tb_str = '```\n' + trimmed_format_exc() + '```'
         | 
| 244 | 
             
                            print(tb_str)
         | 
| 245 | 
             
                            gpt_say += f"[Local Message] 警告,线程{index}在执行过程中遭遇问题, Traceback:\n\n{tb_str}\n\n"
         | 
|  | |
| 256 | 
             
                                for i in range(wait):
         | 
| 257 | 
             
                                    mutable[index][2] = f"{fail_info}等待重试 {wait-i}"; time.sleep(1)
         | 
| 258 | 
             
                                # 开始重试
         | 
| 259 | 
            +
                                if detect_timeout(): raise RuntimeError("检测到程序终止。")
         | 
| 260 | 
             
                                mutable[index][2] = f"重试中 {retry_times_at_unknown_error-retry_op}/{retry_times_at_unknown_error}"
         | 
| 261 | 
             
                                continue # 返回重试
         | 
| 262 | 
             
                            else:
         | 
|  | |
| 282 | 
             
                    # 在前端打���些好玩的东西
         | 
| 283 | 
             
                    for thread_index, _ in enumerate(worker_done):
         | 
| 284 | 
             
                        print_something_really_funny = "[ ...`"+mutable[thread_index][0][-scroller_max_len:].\
         | 
| 285 | 
            +
                            replace('\n', '').replace('`', '.').replace(
         | 
| 286 | 
             
                                ' ', '.').replace('<br/>', '.....').replace('$', '.')+"`... ]"
         | 
| 287 | 
             
                        observe_win.append(print_something_really_funny)
         | 
| 288 | 
             
                    # 在前端打印些好玩的东西
         | 
|  | |
| 308 | 
             
                        gpt_res = f.result()
         | 
| 309 | 
             
                        chatbot.append([inputs_show_user, gpt_res])
         | 
| 310 | 
             
                        yield from update_ui(chatbot=chatbot, history=[]) # 刷新界面
         | 
| 311 | 
            +
                        time.sleep(0.5)
         | 
| 312 | 
             
                return gpt_response_collection
         | 
| 313 |  | 
| 314 |  | 
|  | |
| 603 | 
             
                    import requests
         | 
| 604 | 
             
                    from toolbox import get_conf
         | 
| 605 | 
             
                    from toolbox import get_log_folder, gen_time_str
         | 
| 606 | 
            +
                    proxies = get_conf('proxies')
         | 
| 607 | 
             
                    try:
         | 
| 608 | 
             
                        r = requests.get(txt, proxies=proxies)
         | 
| 609 | 
             
                    except:
         | 
|  | |
| 722 |  | 
| 723 | 
             
                def nougat_with_timeout(self, command, cwd, timeout=3600):
         | 
| 724 | 
             
                    import subprocess
         | 
| 725 | 
            +
                    from toolbox import ProxyNetworkActivate
         | 
| 726 | 
             
                    logging.info(f'正在执行命令 {command}')
         | 
| 727 | 
            +
                    with ProxyNetworkActivate("Nougat_Download"):
         | 
| 728 | 
            +
                        process = subprocess.Popen(command, shell=True, cwd=cwd, env=os.environ)
         | 
| 729 | 
             
                    try:
         | 
| 730 | 
             
                        stdout, stderr = process.communicate(timeout=timeout)
         | 
| 731 | 
             
                    except subprocess.TimeoutExpired:
         | 
|  | |
| 770 | 
             
                    importlib.reload(__import__(m))
         | 
| 771 |  | 
| 772 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 773 | 
             
            def get_plugin_arg(plugin_kwargs, key, default):
         | 
| 774 | 
             
                # 如果参数是空的
         | 
| 775 | 
             
                if (key in plugin_kwargs) and (plugin_kwargs[key] == ""): plugin_kwargs.pop(key)
         | 
    	
        crazy_functions/latex_fns/latex_actions.py
    CHANGED
    
    | @@ -1,9 +1,10 @@ | |
| 1 | 
             
            from toolbox import update_ui, update_ui_lastest_msg, get_log_folder
         | 
| 2 | 
            -
            from toolbox import  | 
| 3 | 
             
            from .latex_toolbox import PRESERVE, TRANSFORM
         | 
| 4 | 
             
            from .latex_toolbox import set_forbidden_text, set_forbidden_text_begin_end, set_forbidden_text_careful_brace
         | 
| 5 | 
             
            from .latex_toolbox import reverse_forbidden_text_careful_brace, reverse_forbidden_text, convert_to_linklist, post_process
         | 
| 6 | 
             
            from .latex_toolbox import fix_content, find_main_tex_file, merge_tex_files, compile_latex_with_timeout
         | 
|  | |
| 7 |  | 
| 8 | 
             
            import os, shutil
         | 
| 9 | 
             
            import re
         | 
| @@ -90,7 +91,18 @@ class LatexPaperSplit(): | |
| 90 | 
             
                        "项目Github地址 \\url{https://github.com/binary-husky/gpt_academic/}。"
         | 
| 91 | 
             
                    # 请您不要删除或修改这行警告,除非您是论文的原作者(如果您是论文原作者,欢迎加REAME中的QQ联系开发者)
         | 
| 92 | 
             
                    self.msg_declare = "为了防止大语言模型的意外谬误产生扩散影响,禁止移除或修改此警告。}}\\\\" 
         | 
| 93 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 94 |  | 
| 95 | 
             
                def merge_result(self, arr, mode, msg, buggy_lines=[], buggy_line_surgery_n_lines=10):
         | 
| 96 | 
             
                    """
         | 
| @@ -165,7 +177,7 @@ class LatexPaperFileGroup(): | |
| 165 | 
             
                    self.sp_file_tag = []
         | 
| 166 |  | 
| 167 | 
             
                    # count_token
         | 
| 168 | 
            -
                    from  | 
| 169 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 170 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 171 | 
             
                    self.get_token_num = get_token_num
         | 
| @@ -234,8 +246,8 @@ def Latex精细分解与转化(file_manifest, project_folder, llm_kwargs, plugin | |
| 234 | 
             
                chatbot.append((f"Latex文件融合完成", f'[Local Message] 正在精细切分latex文件,这需要一段时间计算,文档越长耗时越长,请耐心等待。'))
         | 
| 235 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 236 | 
             
                lps = LatexPaperSplit()
         | 
|  | |
| 237 | 
             
                res = lps.split(merged_content, project_folder, opts) # 消耗时间的函数
         | 
| 238 | 
            -
             | 
| 239 | 
             
                #  <-------- 拆分过长的latex片段 ----------> 
         | 
| 240 | 
             
                pfg = LatexPaperFileGroup()
         | 
| 241 | 
             
                for index, r in enumerate(res):
         | 
| @@ -256,12 +268,19 @@ def Latex精细分解与转化(file_manifest, project_folder, llm_kwargs, plugin | |
| 256 |  | 
| 257 | 
             
                else:
         | 
| 258 | 
             
                    #  <-------- gpt 多线程请求 ----------> 
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 259 | 
             
                    gpt_response_collection = yield from request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency(
         | 
| 260 | 
             
                        inputs_array=inputs_array,
         | 
| 261 | 
             
                        inputs_show_user_array=inputs_show_user_array,
         | 
| 262 | 
             
                        llm_kwargs=llm_kwargs,
         | 
| 263 | 
             
                        chatbot=chatbot,
         | 
| 264 | 
            -
                        history_array= | 
| 265 | 
             
                        sys_prompt_array=sys_prompt_array,
         | 
| 266 | 
             
                        # max_workers=5,  # 并行任务数量限制, 最多同时执行5个, 其他的排队等待
         | 
| 267 | 
             
                        scroller_max_len = 40
         | 
| @@ -423,7 +442,7 @@ def write_html(sp_file_contents, sp_file_result, chatbot, project_folder): | |
| 423 | 
             
                # write html
         | 
| 424 | 
             
                try:
         | 
| 425 | 
             
                    import shutil
         | 
| 426 | 
            -
                    from  | 
| 427 | 
             
                    from toolbox import gen_time_str
         | 
| 428 | 
             
                    ch = construct_html() 
         | 
| 429 | 
             
                    orig = ""
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui, update_ui_lastest_msg, get_log_folder
         | 
| 2 | 
            +
            from toolbox import get_conf, objdump, objload, promote_file_to_downloadzone
         | 
| 3 | 
             
            from .latex_toolbox import PRESERVE, TRANSFORM
         | 
| 4 | 
             
            from .latex_toolbox import set_forbidden_text, set_forbidden_text_begin_end, set_forbidden_text_careful_brace
         | 
| 5 | 
             
            from .latex_toolbox import reverse_forbidden_text_careful_brace, reverse_forbidden_text, convert_to_linklist, post_process
         | 
| 6 | 
             
            from .latex_toolbox import fix_content, find_main_tex_file, merge_tex_files, compile_latex_with_timeout
         | 
| 7 | 
            +
            from .latex_toolbox import find_title_and_abs
         | 
| 8 |  | 
| 9 | 
             
            import os, shutil
         | 
| 10 | 
             
            import re
         | 
|  | |
| 91 | 
             
                        "项目Github地址 \\url{https://github.com/binary-husky/gpt_academic/}。"
         | 
| 92 | 
             
                    # 请您不要删除或修改这行警告,除非您是论文的原作者(如果您是论文原作者,欢迎加REAME中的QQ联系开发者)
         | 
| 93 | 
             
                    self.msg_declare = "为了防止大语言模型的意外谬误产生扩散影响,禁止移除或修改此警告。}}\\\\" 
         | 
| 94 | 
            +
                    self.title = "unknown"
         | 
| 95 | 
            +
                    self.abstract = "unknown"
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                def read_title_and_abstract(self, txt):
         | 
| 98 | 
            +
                    try:
         | 
| 99 | 
            +
                        title, abstract = find_title_and_abs(txt)
         | 
| 100 | 
            +
                        if title is not None: 
         | 
| 101 | 
            +
                            self.title = title.replace('\n', ' ').replace('\\\\', ' ').replace('  ', '').replace('  ', '')
         | 
| 102 | 
            +
                        if abstract is not None: 
         | 
| 103 | 
            +
                            self.abstract = abstract.replace('\n', ' ').replace('\\\\', ' ').replace('  ', '').replace('  ', '')
         | 
| 104 | 
            +
                    except:
         | 
| 105 | 
            +
                        pass
         | 
| 106 |  | 
| 107 | 
             
                def merge_result(self, arr, mode, msg, buggy_lines=[], buggy_line_surgery_n_lines=10):
         | 
| 108 | 
             
                    """
         | 
|  | |
| 177 | 
             
                    self.sp_file_tag = []
         | 
| 178 |  | 
| 179 | 
             
                    # count_token
         | 
| 180 | 
            +
                    from request_llms.bridge_all import model_info
         | 
| 181 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 182 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 183 | 
             
                    self.get_token_num = get_token_num
         | 
|  | |
| 246 | 
             
                chatbot.append((f"Latex文件融合完成", f'[Local Message] 正在精细切分latex文件,这需要一段时间计算,文档越长耗时越长,请耐心等待。'))
         | 
| 247 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 248 | 
             
                lps = LatexPaperSplit()
         | 
| 249 | 
            +
                lps.read_title_and_abstract(merged_content)
         | 
| 250 | 
             
                res = lps.split(merged_content, project_folder, opts) # 消耗时间的函数
         | 
|  | |
| 251 | 
             
                #  <-------- 拆分过长的latex片段 ----------> 
         | 
| 252 | 
             
                pfg = LatexPaperFileGroup()
         | 
| 253 | 
             
                for index, r in enumerate(res):
         | 
|  | |
| 268 |  | 
| 269 | 
             
                else:
         | 
| 270 | 
             
                    #  <-------- gpt 多线程请求 ----------> 
         | 
| 271 | 
            +
                    history_array = [[""] for _ in range(n_split)]
         | 
| 272 | 
            +
                    # LATEX_EXPERIMENTAL, = get_conf('LATEX_EXPERIMENTAL')
         | 
| 273 | 
            +
                    # if LATEX_EXPERIMENTAL:
         | 
| 274 | 
            +
                    #     paper_meta = f"The paper you processing is `{lps.title}`, a part of the abstraction is `{lps.abstract}`"
         | 
| 275 | 
            +
                    #     paper_meta_max_len = 888
         | 
| 276 | 
            +
                    #     history_array = [[ paper_meta[:paper_meta_max_len] + '...',  "Understand, what should I do?"] for _ in range(n_split)]
         | 
| 277 | 
            +
             | 
| 278 | 
             
                    gpt_response_collection = yield from request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency(
         | 
| 279 | 
             
                        inputs_array=inputs_array,
         | 
| 280 | 
             
                        inputs_show_user_array=inputs_show_user_array,
         | 
| 281 | 
             
                        llm_kwargs=llm_kwargs,
         | 
| 282 | 
             
                        chatbot=chatbot,
         | 
| 283 | 
            +
                        history_array=history_array,
         | 
| 284 | 
             
                        sys_prompt_array=sys_prompt_array,
         | 
| 285 | 
             
                        # max_workers=5,  # 并行任务数量限制, 最多同时执行5个, 其他的排队等待
         | 
| 286 | 
             
                        scroller_max_len = 40
         | 
|  | |
| 442 | 
             
                # write html
         | 
| 443 | 
             
                try:
         | 
| 444 | 
             
                    import shutil
         | 
| 445 | 
            +
                    from crazy_functions.pdf_fns.report_gen_html import construct_html
         | 
| 446 | 
             
                    from toolbox import gen_time_str
         | 
| 447 | 
             
                    ch = construct_html() 
         | 
| 448 | 
             
                    orig = ""
         | 
    	
        crazy_functions/latex_fns/latex_toolbox.py
    CHANGED
    
    | @@ -308,13 +308,51 @@ def merge_tex_files_(project_foler, main_file, mode): | |
| 308 | 
             
                    fp = os.path.join(project_foler, f)
         | 
| 309 | 
             
                    fp_ = find_tex_file_ignore_case(fp)
         | 
| 310 | 
             
                    if fp_:
         | 
| 311 | 
            -
                         | 
|  | |
|  | |
|  | |
| 312 | 
             
                    else:
         | 
| 313 | 
             
                        raise RuntimeError(f'找不到{fp},Tex源文件缺失!')
         | 
| 314 | 
             
                    c = merge_tex_files_(project_foler, c, mode)
         | 
| 315 | 
             
                    main_file = main_file[:s.span()[0]] + c + main_file[s.span()[1]:]
         | 
| 316 | 
             
                return main_file
         | 
| 317 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 318 | 
             
            def merge_tex_files(project_foler, main_file, mode):
         | 
| 319 | 
             
                """
         | 
| 320 | 
             
                Merge Tex project recrusively
         | 
| @@ -342,10 +380,41 @@ def merge_tex_files(project_foler, main_file, mode): | |
| 342 | 
             
                    pattern_opt2 = re.compile(r"\\abstract\{(.*?)\}", flags=re.DOTALL)
         | 
| 343 | 
             
                    match_opt1 = pattern_opt1.search(main_file)
         | 
| 344 | 
             
                    match_opt2 = pattern_opt2.search(main_file)
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 345 | 
             
                    assert (match_opt1 is not None) or (match_opt2 is not None), "Cannot find paper abstract section!"
         | 
| 346 | 
             
                return main_file
         | 
| 347 |  | 
| 348 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 349 | 
             
            """
         | 
| 350 | 
             
            =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
         | 
| 351 | 
             
            Post process
         | 
|  | |
| 308 | 
             
                    fp = os.path.join(project_foler, f)
         | 
| 309 | 
             
                    fp_ = find_tex_file_ignore_case(fp)
         | 
| 310 | 
             
                    if fp_:
         | 
| 311 | 
            +
                        try:
         | 
| 312 | 
            +
                            with open(fp_, 'r', encoding='utf-8', errors='replace') as fx: c = fx.read()
         | 
| 313 | 
            +
                        except:
         | 
| 314 | 
            +
                            c = f"\n\nWarning from GPT-Academic: LaTex source file is missing!\n\n"
         | 
| 315 | 
             
                    else:
         | 
| 316 | 
             
                        raise RuntimeError(f'找不到{fp},Tex源文件缺失!')
         | 
| 317 | 
             
                    c = merge_tex_files_(project_foler, c, mode)
         | 
| 318 | 
             
                    main_file = main_file[:s.span()[0]] + c + main_file[s.span()[1]:]
         | 
| 319 | 
             
                return main_file
         | 
| 320 |  | 
| 321 | 
            +
             | 
| 322 | 
            +
            def find_title_and_abs(main_file):
         | 
| 323 | 
            +
             | 
| 324 | 
            +
                def extract_abstract_1(text):
         | 
| 325 | 
            +
                    pattern = r"\\abstract\{(.*?)\}"
         | 
| 326 | 
            +
                    match = re.search(pattern, text, re.DOTALL)
         | 
| 327 | 
            +
                    if match:
         | 
| 328 | 
            +
                        return match.group(1)
         | 
| 329 | 
            +
                    else:
         | 
| 330 | 
            +
                        return None
         | 
| 331 | 
            +
             | 
| 332 | 
            +
                def extract_abstract_2(text):
         | 
| 333 | 
            +
                    pattern = r"\\begin\{abstract\}(.*?)\\end\{abstract\}"
         | 
| 334 | 
            +
                    match = re.search(pattern, text, re.DOTALL)
         | 
| 335 | 
            +
                    if match:
         | 
| 336 | 
            +
                        return match.group(1)
         | 
| 337 | 
            +
                    else:
         | 
| 338 | 
            +
                        return None
         | 
| 339 | 
            +
             | 
| 340 | 
            +
                def extract_title(string):
         | 
| 341 | 
            +
                    pattern = r"\\title\{(.*?)\}"
         | 
| 342 | 
            +
                    match = re.search(pattern, string, re.DOTALL)
         | 
| 343 | 
            +
             | 
| 344 | 
            +
                    if match:
         | 
| 345 | 
            +
                        return match.group(1)
         | 
| 346 | 
            +
                    else:
         | 
| 347 | 
            +
                        return None
         | 
| 348 | 
            +
             | 
| 349 | 
            +
                abstract = extract_abstract_1(main_file)
         | 
| 350 | 
            +
                if abstract is None:
         | 
| 351 | 
            +
                    abstract = extract_abstract_2(main_file)
         | 
| 352 | 
            +
                title = extract_title(main_file)
         | 
| 353 | 
            +
                return title, abstract
         | 
| 354 | 
            +
             | 
| 355 | 
            +
             | 
| 356 | 
             
            def merge_tex_files(project_foler, main_file, mode):
         | 
| 357 | 
             
                """
         | 
| 358 | 
             
                Merge Tex project recrusively
         | 
|  | |
| 380 | 
             
                    pattern_opt2 = re.compile(r"\\abstract\{(.*?)\}", flags=re.DOTALL)
         | 
| 381 | 
             
                    match_opt1 = pattern_opt1.search(main_file)
         | 
| 382 | 
             
                    match_opt2 = pattern_opt2.search(main_file)
         | 
| 383 | 
            +
                    if (match_opt1 is None) and (match_opt2 is None):
         | 
| 384 | 
            +
                        # "Cannot find paper abstract section!"
         | 
| 385 | 
            +
                        main_file = insert_abstract(main_file)
         | 
| 386 | 
            +
                    match_opt1 = pattern_opt1.search(main_file)
         | 
| 387 | 
            +
                    match_opt2 = pattern_opt2.search(main_file)
         | 
| 388 | 
             
                    assert (match_opt1 is not None) or (match_opt2 is not None), "Cannot find paper abstract section!"
         | 
| 389 | 
             
                return main_file
         | 
| 390 |  | 
| 391 |  | 
| 392 | 
            +
            insert_missing_abs_str = r"""
         | 
| 393 | 
            +
            \begin{abstract}
         | 
| 394 | 
            +
            The GPT-Academic program cannot find abstract section in this paper.
         | 
| 395 | 
            +
            \end{abstract}
         | 
| 396 | 
            +
            """
         | 
| 397 | 
            +
             | 
| 398 | 
            +
            def insert_abstract(tex_content):
         | 
| 399 | 
            +
                if "\\maketitle" in tex_content:
         | 
| 400 | 
            +
                    # find the position of "\maketitle"
         | 
| 401 | 
            +
                    find_index = tex_content.index("\\maketitle")
         | 
| 402 | 
            +
                    # find the nearest ending line
         | 
| 403 | 
            +
                    end_line_index = tex_content.find("\n", find_index)
         | 
| 404 | 
            +
                    # insert "abs_str" on the next line
         | 
| 405 | 
            +
                    modified_tex = tex_content[:end_line_index+1] + '\n\n' + insert_missing_abs_str + '\n\n' + tex_content[end_line_index+1:]
         | 
| 406 | 
            +
                    return modified_tex
         | 
| 407 | 
            +
                elif r"\begin{document}" in tex_content:
         | 
| 408 | 
            +
                    # find the position of "\maketitle"
         | 
| 409 | 
            +
                    find_index = tex_content.index(r"\begin{document}")
         | 
| 410 | 
            +
                    # find the nearest ending line
         | 
| 411 | 
            +
                    end_line_index = tex_content.find("\n", find_index)
         | 
| 412 | 
            +
                    # insert "abs_str" on the next line
         | 
| 413 | 
            +
                    modified_tex = tex_content[:end_line_index+1] + '\n\n' + insert_missing_abs_str + '\n\n' + tex_content[end_line_index+1:]
         | 
| 414 | 
            +
                    return modified_tex
         | 
| 415 | 
            +
                else:
         | 
| 416 | 
            +
                    return tex_content
         | 
| 417 | 
            +
             | 
| 418 | 
             
            """
         | 
| 419 | 
             
            =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
         | 
| 420 | 
             
            Post process
         | 
    	
        crazy_functions/live_audio/aliyunASR.py
    CHANGED
    
    | @@ -1,4 +1,106 @@ | |
| 1 | 
            -
            import time, logging, json
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 2 |  | 
| 3 |  | 
| 4 | 
             
            class AliyunASR():
         | 
| @@ -66,12 +168,22 @@ class AliyunASR(): | |
| 66 | 
             
                                on_close=self.test_on_close,
         | 
| 67 | 
             
                                callback_args=[uuid.hex]
         | 
| 68 | 
             
                            )
         | 
| 69 | 
            -
             | 
| 70 | 
             
                    r = sr.start(aformat="pcm",
         | 
|  | |
| 71 | 
             
                            enable_intermediate_result=True,
         | 
| 72 | 
             
                            enable_punctuation_prediction=True,
         | 
| 73 | 
             
                            enable_inverse_text_normalization=True)
         | 
| 74 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 75 | 
             
                    while not self.stop:
         | 
| 76 | 
             
                        # time.sleep(self.capture_interval)
         | 
| 77 | 
             
                        audio = rad.read(uuid.hex) 
         | 
| @@ -79,12 +191,32 @@ class AliyunASR(): | |
| 79 | 
             
                            # convert to pcm file
         | 
| 80 | 
             
                            temp_file = f'{temp_folder}/{uuid.hex}.pcm' # 
         | 
| 81 | 
             
                            dsdata = change_sample_rate(audio, rad.rate, NEW_SAMPLERATE) # 48000 --> 16000
         | 
| 82 | 
            -
                             | 
| 83 | 
             
                            # read pcm binary
         | 
| 84 | 
             
                            with open(temp_file, "rb") as f: data = f.read()
         | 
| 85 | 
            -
                             | 
| 86 | 
            -
             | 
| 87 | 
            -
                             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 88 | 
             
                        else:
         | 
| 89 | 
             
                            time.sleep(0.1)
         | 
| 90 |  | 
|  | |
| 1 | 
            +
            import time, logging, json, sys, struct
         | 
| 2 | 
            +
            import numpy as np
         | 
| 3 | 
            +
            from scipy.io.wavfile import WAVE_FORMAT
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            def write_numpy_to_wave(filename, rate, data, add_header=False):
         | 
| 6 | 
            +
                """
         | 
| 7 | 
            +
                Write a NumPy array as a WAV file.
         | 
| 8 | 
            +
                """
         | 
| 9 | 
            +
                def _array_tofile(fid, data):
         | 
| 10 | 
            +
                    # ravel gives a c-contiguous buffer
         | 
| 11 | 
            +
                    fid.write(data.ravel().view('b').data)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                if hasattr(filename, 'write'):
         | 
| 14 | 
            +
                    fid = filename
         | 
| 15 | 
            +
                else:
         | 
| 16 | 
            +
                    fid = open(filename, 'wb')
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                fs = rate
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                try:
         | 
| 21 | 
            +
                    dkind = data.dtype.kind
         | 
| 22 | 
            +
                    if not (dkind == 'i' or dkind == 'f' or (dkind == 'u' and
         | 
| 23 | 
            +
                                                             data.dtype.itemsize == 1)):
         | 
| 24 | 
            +
                        raise ValueError("Unsupported data type '%s'" % data.dtype)
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    header_data = b''
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    header_data += b'RIFF'
         | 
| 29 | 
            +
                    header_data += b'\x00\x00\x00\x00'
         | 
| 30 | 
            +
                    header_data += b'WAVE'
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    # fmt chunk
         | 
| 33 | 
            +
                    header_data += b'fmt '
         | 
| 34 | 
            +
                    if dkind == 'f':
         | 
| 35 | 
            +
                        format_tag = WAVE_FORMAT.IEEE_FLOAT
         | 
| 36 | 
            +
                    else:
         | 
| 37 | 
            +
                        format_tag = WAVE_FORMAT.PCM
         | 
| 38 | 
            +
                    if data.ndim == 1:
         | 
| 39 | 
            +
                        channels = 1
         | 
| 40 | 
            +
                    else:
         | 
| 41 | 
            +
                        channels = data.shape[1]
         | 
| 42 | 
            +
                    bit_depth = data.dtype.itemsize * 8
         | 
| 43 | 
            +
                    bytes_per_second = fs*(bit_depth // 8)*channels
         | 
| 44 | 
            +
                    block_align = channels * (bit_depth // 8)
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    fmt_chunk_data = struct.pack('<HHIIHH', format_tag, channels, fs,
         | 
| 47 | 
            +
                                                 bytes_per_second, block_align, bit_depth)
         | 
| 48 | 
            +
                    if not (dkind == 'i' or dkind == 'u'):
         | 
| 49 | 
            +
                        # add cbSize field for non-PCM files
         | 
| 50 | 
            +
                        fmt_chunk_data += b'\x00\x00'
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                    header_data += struct.pack('<I', len(fmt_chunk_data))
         | 
| 53 | 
            +
                    header_data += fmt_chunk_data
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    # fact chunk (non-PCM files)
         | 
| 56 | 
            +
                    if not (dkind == 'i' or dkind == 'u'):
         | 
| 57 | 
            +
                        header_data += b'fact'
         | 
| 58 | 
            +
                        header_data += struct.pack('<II', 4, data.shape[0])
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    # check data size (needs to be immediately before the data chunk)
         | 
| 61 | 
            +
                    if ((len(header_data)-4-4) + (4+4+data.nbytes)) > 0xFFFFFFFF:
         | 
| 62 | 
            +
                        raise ValueError("Data exceeds wave file size limit")
         | 
| 63 | 
            +
                    if add_header:
         | 
| 64 | 
            +
                        fid.write(header_data)
         | 
| 65 | 
            +
                        # data chunk
         | 
| 66 | 
            +
                        fid.write(b'data')
         | 
| 67 | 
            +
                        fid.write(struct.pack('<I', data.nbytes))
         | 
| 68 | 
            +
                        if data.dtype.byteorder == '>' or (data.dtype.byteorder == '=' and
         | 
| 69 | 
            +
                                                        sys.byteorder == 'big'):
         | 
| 70 | 
            +
                            data = data.byteswap()
         | 
| 71 | 
            +
                    _array_tofile(fid, data)
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    if add_header:
         | 
| 74 | 
            +
                        # Determine file size and place it in correct
         | 
| 75 | 
            +
                        #  position at start of the file.
         | 
| 76 | 
            +
                        size = fid.tell()
         | 
| 77 | 
            +
                        fid.seek(4)
         | 
| 78 | 
            +
                        fid.write(struct.pack('<I', size-8))
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                finally:
         | 
| 81 | 
            +
                    if not hasattr(filename, 'write'):
         | 
| 82 | 
            +
                        fid.close()
         | 
| 83 | 
            +
                    else:
         | 
| 84 | 
            +
                        fid.seek(0)
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            def is_speaker_speaking(vad, data, sample_rate):
         | 
| 87 | 
            +
                # Function to detect if the speaker is speaking
         | 
| 88 | 
            +
                # The WebRTC VAD only accepts 16-bit mono PCM audio, 
         | 
| 89 | 
            +
                # sampled at 8000, 16000, 32000 or 48000 Hz. 
         | 
| 90 | 
            +
                # A frame must be either 10, 20, or 30 ms in duration:
         | 
| 91 | 
            +
                frame_duration = 30
         | 
| 92 | 
            +
                n_bit_each = int(sample_rate * frame_duration / 1000)*2 # x2 because audio is 16 bit (2 bytes)
         | 
| 93 | 
            +
                res_list = []
         | 
| 94 | 
            +
                for t in range(len(data)):
         | 
| 95 | 
            +
                    if t!=0 and t % n_bit_each == 0:
         | 
| 96 | 
            +
                        res_list.append(vad.is_speech(data[t-n_bit_each:t], sample_rate))
         | 
| 97 | 
            +
                
         | 
| 98 | 
            +
                info = ''.join(['^' if r else '.' for r in res_list])
         | 
| 99 | 
            +
                info = info[:10]
         | 
| 100 | 
            +
                if any(res_list):
         | 
| 101 | 
            +
                    return True, info
         | 
| 102 | 
            +
                else:
         | 
| 103 | 
            +
                    return False, info
         | 
| 104 |  | 
| 105 |  | 
| 106 | 
             
            class AliyunASR():
         | 
|  | |
| 168 | 
             
                                on_close=self.test_on_close,
         | 
| 169 | 
             
                                callback_args=[uuid.hex]
         | 
| 170 | 
             
                            )
         | 
| 171 | 
            +
                    timeout_limit_second = 20
         | 
| 172 | 
             
                    r = sr.start(aformat="pcm",
         | 
| 173 | 
            +
                            timeout=timeout_limit_second,
         | 
| 174 | 
             
                            enable_intermediate_result=True,
         | 
| 175 | 
             
                            enable_punctuation_prediction=True,
         | 
| 176 | 
             
                            enable_inverse_text_normalization=True)
         | 
| 177 |  | 
| 178 | 
            +
                    import webrtcvad
         | 
| 179 | 
            +
                    vad = webrtcvad.Vad()
         | 
| 180 | 
            +
                    vad.set_mode(1)
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                    is_previous_frame_transmitted = False   # 上一帧是否有人说话
         | 
| 183 | 
            +
                    previous_frame_data = None
         | 
| 184 | 
            +
                    echo_cnt = 0        # 在没有声音之后,继续向服务器发送n次音频数据
         | 
| 185 | 
            +
                    echo_cnt_max = 4   # 在没有声音之后,继续向服务器发送n次音频数据
         | 
| 186 | 
            +
                    keep_alive_last_send_time = time.time()
         | 
| 187 | 
             
                    while not self.stop:
         | 
| 188 | 
             
                        # time.sleep(self.capture_interval)
         | 
| 189 | 
             
                        audio = rad.read(uuid.hex) 
         | 
|  | |
| 191 | 
             
                            # convert to pcm file
         | 
| 192 | 
             
                            temp_file = f'{temp_folder}/{uuid.hex}.pcm' # 
         | 
| 193 | 
             
                            dsdata = change_sample_rate(audio, rad.rate, NEW_SAMPLERATE) # 48000 --> 16000
         | 
| 194 | 
            +
                            write_numpy_to_wave(temp_file, NEW_SAMPLERATE, dsdata)
         | 
| 195 | 
             
                            # read pcm binary
         | 
| 196 | 
             
                            with open(temp_file, "rb") as f: data = f.read()
         | 
| 197 | 
            +
                            is_speaking, info = is_speaker_speaking(vad, data, NEW_SAMPLERATE)
         | 
| 198 | 
            +
             | 
| 199 | 
            +
                            if is_speaking or echo_cnt > 0:
         | 
| 200 | 
            +
                                # 如果话筒激活 / 如果处于回声收尾阶段
         | 
| 201 | 
            +
                                echo_cnt -= 1
         | 
| 202 | 
            +
                                if not is_previous_frame_transmitted:   # 上一帧没有人声,但是我们把上一帧同样加上
         | 
| 203 | 
            +
                                    if previous_frame_data is not None: data = previous_frame_data + data
         | 
| 204 | 
            +
                                if is_speaking:
         | 
| 205 | 
            +
                                    echo_cnt = echo_cnt_max
         | 
| 206 | 
            +
                                slices = zip(*(iter(data),) * 640)      # 640个字节为一组
         | 
| 207 | 
            +
                                for i in slices: sr.send_audio(bytes(i))
         | 
| 208 | 
            +
                                keep_alive_last_send_time = time.time()
         | 
| 209 | 
            +
                                is_previous_frame_transmitted = True
         | 
| 210 | 
            +
                            else:
         | 
| 211 | 
            +
                                is_previous_frame_transmitted = False
         | 
| 212 | 
            +
                                echo_cnt = 0
         | 
| 213 | 
            +
                                # 保持链接激活,即使没有声音,也根据时间间隔,发送一些音频片段给服务器
         | 
| 214 | 
            +
                                if time.time() - keep_alive_last_send_time > timeout_limit_second/2:
         | 
| 215 | 
            +
                                    slices = zip(*(iter(data),) * 640)    # 640个字节为一组
         | 
| 216 | 
            +
                                    for i in slices: sr.send_audio(bytes(i))
         | 
| 217 | 
            +
                                    keep_alive_last_send_time = time.time()
         | 
| 218 | 
            +
                                    is_previous_frame_transmitted = True
         | 
| 219 | 
            +
                            self.audio_shape = info
         | 
| 220 | 
             
                        else:
         | 
| 221 | 
             
                            time.sleep(0.1)
         | 
| 222 |  | 
    	
        crazy_functions/live_audio/audio_io.py
    CHANGED
    
    | @@ -35,7 +35,7 @@ class RealtimeAudioDistribution(): | |
| 35 | 
             
                def read(self, uuid):
         | 
| 36 | 
             
                    if uuid in self.data:
         | 
| 37 | 
             
                        res = self.data.pop(uuid)
         | 
| 38 | 
            -
                        print('\r read-', len(res), '-', max(res), end='', flush=True)
         | 
| 39 | 
             
                    else:
         | 
| 40 | 
             
                        res = None
         | 
| 41 | 
             
                    return res
         | 
|  | |
| 35 | 
             
                def read(self, uuid):
         | 
| 36 | 
             
                    if uuid in self.data:
         | 
| 37 | 
             
                        res = self.data.pop(uuid)
         | 
| 38 | 
            +
                        # print('\r read-', len(res), '-', max(res), end='', flush=True)
         | 
| 39 | 
             
                    else:
         | 
| 40 | 
             
                        res = None
         | 
| 41 | 
             
                    return res
         | 
    	
        crazy_functions/multi_stage/multi_stage_utils.py
    ADDED
    
    | @@ -0,0 +1,45 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from pydantic import BaseModel, Field
         | 
| 2 | 
            +
            from typing import List
         | 
| 3 | 
            +
            from toolbox import update_ui_lastest_msg, disable_auto_promotion
         | 
| 4 | 
            +
            from request_llms.bridge_all import predict_no_ui_long_connection
         | 
| 5 | 
            +
            from crazy_functions.json_fns.pydantic_io import GptJsonIO, JsonStringError
         | 
| 6 | 
            +
            import time
         | 
| 7 | 
            +
            import pickle
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            def have_any_recent_upload_files(chatbot):
         | 
| 10 | 
            +
                _5min = 5 * 60
         | 
| 11 | 
            +
                if not chatbot: return False    # chatbot is None
         | 
| 12 | 
            +
                most_recent_uploaded = chatbot._cookies.get("most_recent_uploaded", None)
         | 
| 13 | 
            +
                if not most_recent_uploaded: return False   # most_recent_uploaded is None
         | 
| 14 | 
            +
                if time.time() - most_recent_uploaded["time"] < _5min: return True # most_recent_uploaded is new
         | 
| 15 | 
            +
                else: return False  # most_recent_uploaded is too old
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            class GptAcademicState():
         | 
| 18 | 
            +
                def __init__(self):
         | 
| 19 | 
            +
                    self.reset()
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def reset(self):
         | 
| 22 | 
            +
                    pass
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def lock_plugin(self, chatbot):
         | 
| 25 | 
            +
                    chatbot._cookies['plugin_state'] = pickle.dumps(self)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def unlock_plugin(self, chatbot):
         | 
| 28 | 
            +
                    self.reset()
         | 
| 29 | 
            +
                    chatbot._cookies['plugin_state'] = pickle.dumps(self)
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def set_state(self, chatbot, key, value):
         | 
| 32 | 
            +
                    setattr(self, key, value)
         | 
| 33 | 
            +
                    chatbot._cookies['plugin_state'] = pickle.dumps(self)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def get_state(chatbot, cls=None):
         | 
| 36 | 
            +
                    state = chatbot._cookies.get('plugin_state', None)
         | 
| 37 | 
            +
                    if state is not None:   state = pickle.loads(state)
         | 
| 38 | 
            +
                    elif cls is not None:   state = cls()
         | 
| 39 | 
            +
                    else:                   state = GptAcademicState()
         | 
| 40 | 
            +
                    state.chatbot = chatbot
         | 
| 41 | 
            +
                    return state
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            class GatherMaterials():
         | 
| 44 | 
            +
                def __init__(self, materials) -> None:
         | 
| 45 | 
            +
                    materials = ['image', 'prompt']
         | 
    	
        crazy_functions/pdf_fns/parse_pdf.py
    CHANGED
    
    | @@ -14,7 +14,7 @@ import math | |
| 14 | 
             
            class GROBID_OFFLINE_EXCEPTION(Exception): pass
         | 
| 15 |  | 
| 16 | 
             
            def get_avail_grobid_url():
         | 
| 17 | 
            -
                GROBID_URLS | 
| 18 | 
             
                if len(GROBID_URLS) == 0: return None
         | 
| 19 | 
             
                try:
         | 
| 20 | 
             
                    _grobid_url = random.choice(GROBID_URLS) # 随机负载均衡
         | 
| @@ -73,7 +73,7 @@ def produce_report_markdown(gpt_response_collection, meta, paper_meta_info, chat | |
| 73 | 
             
                return res_path
         | 
| 74 |  | 
| 75 | 
             
            def translate_pdf(article_dict, llm_kwargs, chatbot, fp, generated_conclusion_files, TOKEN_LIMIT_PER_FRAGMENT, DST_LANG):
         | 
| 76 | 
            -
                from crazy_functions. | 
| 77 | 
             
                from crazy_functions.crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 78 | 
             
                from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 79 | 
             
                from crazy_functions.crazy_utils import request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency
         | 
| @@ -82,7 +82,7 @@ def translate_pdf(article_dict, llm_kwargs, chatbot, fp, generated_conclusion_fi | |
| 82 | 
             
                # title
         | 
| 83 | 
             
                title = article_dict.get('title', '无法获取 title'); prompt += f'title:{title}\n\n'
         | 
| 84 | 
             
                # authors
         | 
| 85 | 
            -
                authors = article_dict.get('authors', '无法获取 authors'); prompt += f'authors:{authors}\n\n'
         | 
| 86 | 
             
                # abstract
         | 
| 87 | 
             
                abstract = article_dict.get('abstract', '无法获取 abstract'); prompt += f'abstract:{abstract}\n\n'
         | 
| 88 | 
             
                # command
         | 
| @@ -103,7 +103,7 @@ def translate_pdf(article_dict, llm_kwargs, chatbot, fp, generated_conclusion_fi | |
| 103 | 
             
                inputs_show_user_array = []
         | 
| 104 |  | 
| 105 | 
             
                # get_token_num
         | 
| 106 | 
            -
                from  | 
| 107 | 
             
                enc = model_info[llm_kwargs['llm_model']]['tokenizer']
         | 
| 108 | 
             
                def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 109 |  | 
|  | |
| 14 | 
             
            class GROBID_OFFLINE_EXCEPTION(Exception): pass
         | 
| 15 |  | 
| 16 | 
             
            def get_avail_grobid_url():
         | 
| 17 | 
            +
                GROBID_URLS = get_conf('GROBID_URLS')
         | 
| 18 | 
             
                if len(GROBID_URLS) == 0: return None
         | 
| 19 | 
             
                try:
         | 
| 20 | 
             
                    _grobid_url = random.choice(GROBID_URLS) # 随机负载均衡
         | 
|  | |
| 73 | 
             
                return res_path
         | 
| 74 |  | 
| 75 | 
             
            def translate_pdf(article_dict, llm_kwargs, chatbot, fp, generated_conclusion_files, TOKEN_LIMIT_PER_FRAGMENT, DST_LANG):
         | 
| 76 | 
            +
                from crazy_functions.pdf_fns.report_gen_html import construct_html
         | 
| 77 | 
             
                from crazy_functions.crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 78 | 
             
                from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 79 | 
             
                from crazy_functions.crazy_utils import request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency
         | 
|  | |
| 82 | 
             
                # title
         | 
| 83 | 
             
                title = article_dict.get('title', '无法获取 title'); prompt += f'title:{title}\n\n'
         | 
| 84 | 
             
                # authors
         | 
| 85 | 
            +
                authors = article_dict.get('authors', '无法获取 authors')[:100]; prompt += f'authors:{authors}\n\n'
         | 
| 86 | 
             
                # abstract
         | 
| 87 | 
             
                abstract = article_dict.get('abstract', '无法获取 abstract'); prompt += f'abstract:{abstract}\n\n'
         | 
| 88 | 
             
                # command
         | 
|  | |
| 103 | 
             
                inputs_show_user_array = []
         | 
| 104 |  | 
| 105 | 
             
                # get_token_num
         | 
| 106 | 
            +
                from request_llms.bridge_all import model_info
         | 
| 107 | 
             
                enc = model_info[llm_kwargs['llm_model']]['tokenizer']
         | 
| 108 | 
             
                def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 109 |  | 
    	
        crazy_functions/pdf_fns/report_gen_html.py
    ADDED
    
    | @@ -0,0 +1,58 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            from toolbox import update_ui, get_conf, trimmed_format_exc, get_log_folder
         | 
| 2 | 
            +
            import os
         | 
| 3 | 
            +
             | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
             | 
| 7 | 
            +
            class construct_html():
         | 
| 8 | 
            +
                def __init__(self) -> None:
         | 
| 9 | 
            +
                    self.html_string = ""
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def add_row(self, a, b):
         | 
| 12 | 
            +
                    from toolbox import markdown_convertion
         | 
| 13 | 
            +
                    template = """
         | 
| 14 | 
            +
                        {
         | 
| 15 | 
            +
                            primary_col: {
         | 
| 16 | 
            +
                                header: String.raw`__PRIMARY_HEADER__`,
         | 
| 17 | 
            +
                                msg: String.raw`__PRIMARY_MSG__`,
         | 
| 18 | 
            +
                            },
         | 
| 19 | 
            +
                            secondary_rol: {
         | 
| 20 | 
            +
                                header: String.raw`__SECONDARY_HEADER__`,
         | 
| 21 | 
            +
                                msg: String.raw`__SECONDARY_MSG__`,
         | 
| 22 | 
            +
                            }
         | 
| 23 | 
            +
                        },
         | 
| 24 | 
            +
                    """
         | 
| 25 | 
            +
                    def std(str):
         | 
| 26 | 
            +
                        str = str.replace(r'`',r'`')
         | 
| 27 | 
            +
                        if str.endswith("\\"): str += ' '
         | 
| 28 | 
            +
                        if str.endswith("}"): str += ' '
         | 
| 29 | 
            +
                        if str.endswith("$"): str += ' '
         | 
| 30 | 
            +
                        return str
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    template_ = template
         | 
| 33 | 
            +
                    a_lines = a.split('\n')
         | 
| 34 | 
            +
                    b_lines = b.split('\n')
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    if len(a_lines) == 1 or len(a_lines[0]) > 50:
         | 
| 37 | 
            +
                        template_ = template_.replace("__PRIMARY_HEADER__", std(a[:20]))
         | 
| 38 | 
            +
                        template_ = template_.replace("__PRIMARY_MSG__", std(markdown_convertion(a)))
         | 
| 39 | 
            +
                    else:
         | 
| 40 | 
            +
                        template_ = template_.replace("__PRIMARY_HEADER__", std(a_lines[0]))
         | 
| 41 | 
            +
                        template_ = template_.replace("__PRIMARY_MSG__", std(markdown_convertion('\n'.join(a_lines[1:]))))
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    if len(b_lines) == 1 or len(b_lines[0]) > 50:
         | 
| 44 | 
            +
                        template_ = template_.replace("__SECONDARY_HEADER__", std(b[:20]))
         | 
| 45 | 
            +
                        template_ = template_.replace("__SECONDARY_MSG__", std(markdown_convertion(b)))
         | 
| 46 | 
            +
                    else:
         | 
| 47 | 
            +
                        template_ = template_.replace("__SECONDARY_HEADER__", std(b_lines[0]))
         | 
| 48 | 
            +
                        template_ = template_.replace("__SECONDARY_MSG__", std(markdown_convertion('\n'.join(b_lines[1:]))))
         | 
| 49 | 
            +
                    self.html_string += template_
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def save_file(self, file_name):
         | 
| 52 | 
            +
                    from toolbox import get_log_folder
         | 
| 53 | 
            +
                    with open('crazy_functions/pdf_fns/report_template.html', 'r', encoding='utf8') as f:
         | 
| 54 | 
            +
                        html_template = f.read()
         | 
| 55 | 
            +
                    html_template = html_template.replace("__TF_ARR__", self.html_string)
         | 
| 56 | 
            +
                    with open(os.path.join(get_log_folder(), file_name), 'w', encoding='utf8') as f:
         | 
| 57 | 
            +
                        f.write(html_template.encode('utf-8', 'ignore').decode())
         | 
| 58 | 
            +
                    return os.path.join(get_log_folder(), file_name)
         | 
    	
        crazy_functions/pdf_fns/report_template.html
    ADDED
    
    | The diff for this file is too large to render. 
		See raw diff | 
|  | 
    	
        crazy_functions/vt_fns/vt_call_plugin.py
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 | 
             
            from pydantic import BaseModel, Field
         | 
| 2 | 
             
            from typing import List
         | 
| 3 | 
             
            from toolbox import update_ui_lastest_msg, disable_auto_promotion
         | 
| 4 | 
            -
            from  | 
| 5 | 
             
            from crazy_functions.json_fns.pydantic_io import GptJsonIO, JsonStringError
         | 
| 6 | 
             
            import copy, json, pickle, os, sys, time
         | 
| 7 |  | 
|  | |
| 1 | 
             
            from pydantic import BaseModel, Field
         | 
| 2 | 
             
            from typing import List
         | 
| 3 | 
             
            from toolbox import update_ui_lastest_msg, disable_auto_promotion
         | 
| 4 | 
            +
            from request_llms.bridge_all import predict_no_ui_long_connection
         | 
| 5 | 
             
            from crazy_functions.json_fns.pydantic_io import GptJsonIO, JsonStringError
         | 
| 6 | 
             
            import copy, json, pickle, os, sys, time
         | 
| 7 |  | 
    	
        crazy_functions/vt_fns/vt_modify_config.py
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 | 
             
            from pydantic import BaseModel, Field
         | 
| 2 | 
             
            from typing import List
         | 
| 3 | 
             
            from toolbox import update_ui_lastest_msg, get_conf
         | 
| 4 | 
            -
            from  | 
| 5 | 
             
            from crazy_functions.json_fns.pydantic_io import GptJsonIO
         | 
| 6 | 
             
            import copy, json, pickle, os, sys
         | 
| 7 |  | 
| 8 |  | 
| 9 | 
             
            def modify_configuration_hot(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_intention):
         | 
| 10 | 
            -
                ALLOW_RESET_CONFIG | 
| 11 | 
             
                if not ALLOW_RESET_CONFIG:
         | 
| 12 | 
             
                    yield from update_ui_lastest_msg(
         | 
| 13 | 
             
                        lastmsg=f"当前配置不允许被修改!如需激活本功能,请在config.py中设置ALLOW_RESET_CONFIG=True后重启软件。", 
         | 
| @@ -66,7 +66,7 @@ def modify_configuration_hot(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 66 | 
             
                    )
         | 
| 67 |  | 
| 68 | 
             
            def modify_configuration_reboot(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_intention):
         | 
| 69 | 
            -
                ALLOW_RESET_CONFIG | 
| 70 | 
             
                if not ALLOW_RESET_CONFIG:
         | 
| 71 | 
             
                    yield from update_ui_lastest_msg(
         | 
| 72 | 
             
                        lastmsg=f"当前配置不允许被修改!如需激活本功能,请在config.py中设置ALLOW_RESET_CONFIG=True后重启软件。", 
         | 
|  | |
| 1 | 
             
            from pydantic import BaseModel, Field
         | 
| 2 | 
             
            from typing import List
         | 
| 3 | 
             
            from toolbox import update_ui_lastest_msg, get_conf
         | 
| 4 | 
            +
            from request_llms.bridge_all import predict_no_ui_long_connection
         | 
| 5 | 
             
            from crazy_functions.json_fns.pydantic_io import GptJsonIO
         | 
| 6 | 
             
            import copy, json, pickle, os, sys
         | 
| 7 |  | 
| 8 |  | 
| 9 | 
             
            def modify_configuration_hot(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_intention):
         | 
| 10 | 
            +
                ALLOW_RESET_CONFIG = get_conf('ALLOW_RESET_CONFIG')
         | 
| 11 | 
             
                if not ALLOW_RESET_CONFIG:
         | 
| 12 | 
             
                    yield from update_ui_lastest_msg(
         | 
| 13 | 
             
                        lastmsg=f"当前配置不允许被修改!如需激活本功能,请在config.py中设置ALLOW_RESET_CONFIG=True后重启软件。", 
         | 
|  | |
| 66 | 
             
                    )
         | 
| 67 |  | 
| 68 | 
             
            def modify_configuration_reboot(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_intention):
         | 
| 69 | 
            +
                ALLOW_RESET_CONFIG = get_conf('ALLOW_RESET_CONFIG')
         | 
| 70 | 
             
                if not ALLOW_RESET_CONFIG:
         | 
| 71 | 
             
                    yield from update_ui_lastest_msg(
         | 
| 72 | 
             
                        lastmsg=f"当前配置不允许被修改!如需激活本功能,请在config.py中设置ALLOW_RESET_CONFIG=True后重启软件。", 
         | 
    	
        crazy_functions/下载arxiv论文翻译摘要.py
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 | 
             
            from toolbox import update_ui, get_log_folder
         | 
| 2 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 3 | 
            -
            from toolbox import CatchException,  | 
| 4 | 
             
            import re, requests, unicodedata, os
         | 
| 5 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 6 | 
             
            def download_arxiv_(url_pdf):
         | 
| @@ -43,7 +43,7 @@ def download_arxiv_(url_pdf): | |
| 43 | 
             
                file_path = download_dir+title_str
         | 
| 44 |  | 
| 45 | 
             
                print('下载中')
         | 
| 46 | 
            -
                proxies | 
| 47 | 
             
                r = requests.get(requests_pdf_url, proxies=proxies)
         | 
| 48 | 
             
                with open(file_path, 'wb+') as f:
         | 
| 49 | 
             
                    f.write(r.content)
         | 
| @@ -77,7 +77,7 @@ def get_name(_url_): | |
| 77 | 
             
                #     print('在缓存中')
         | 
| 78 | 
             
                #     return arxiv_recall[_url_]
         | 
| 79 |  | 
| 80 | 
            -
                proxies | 
| 81 | 
             
                res = requests.get(_url_, proxies=proxies)
         | 
| 82 |  | 
| 83 | 
             
                bs = BeautifulSoup(res.text, 'html.parser')
         | 
| @@ -144,7 +144,7 @@ def 下载arxiv论文并翻译摘要(txt, llm_kwargs, plugin_kwargs, chatbot, hi | |
| 144 | 
             
                try:
         | 
| 145 | 
             
                    import bs4
         | 
| 146 | 
             
                except:
         | 
| 147 | 
            -
                     | 
| 148 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 149 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade beautifulsoup4```。")
         | 
| 150 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -157,7 +157,7 @@ def 下载arxiv论文并翻译摘要(txt, llm_kwargs, plugin_kwargs, chatbot, hi | |
| 157 | 
             
                try:
         | 
| 158 | 
             
                    pdf_path, info = download_arxiv_(txt)
         | 
| 159 | 
             
                except:
         | 
| 160 | 
            -
                     | 
| 161 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 162 | 
             
                        b = f"下载pdf文件未成功")
         | 
| 163 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui, get_log_folder
         | 
| 2 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 3 | 
            +
            from toolbox import CatchException, report_exception, get_conf
         | 
| 4 | 
             
            import re, requests, unicodedata, os
         | 
| 5 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 6 | 
             
            def download_arxiv_(url_pdf):
         | 
|  | |
| 43 | 
             
                file_path = download_dir+title_str
         | 
| 44 |  | 
| 45 | 
             
                print('下载中')
         | 
| 46 | 
            +
                proxies = get_conf('proxies')
         | 
| 47 | 
             
                r = requests.get(requests_pdf_url, proxies=proxies)
         | 
| 48 | 
             
                with open(file_path, 'wb+') as f:
         | 
| 49 | 
             
                    f.write(r.content)
         | 
|  | |
| 77 | 
             
                #     print('在缓存中')
         | 
| 78 | 
             
                #     return arxiv_recall[_url_]
         | 
| 79 |  | 
| 80 | 
            +
                proxies = get_conf('proxies')
         | 
| 81 | 
             
                res = requests.get(_url_, proxies=proxies)
         | 
| 82 |  | 
| 83 | 
             
                bs = BeautifulSoup(res.text, 'html.parser')
         | 
|  | |
| 144 | 
             
                try:
         | 
| 145 | 
             
                    import bs4
         | 
| 146 | 
             
                except:
         | 
| 147 | 
            +
                    report_exception(chatbot, history, 
         | 
| 148 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 149 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade beautifulsoup4```。")
         | 
| 150 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 157 | 
             
                try:
         | 
| 158 | 
             
                    pdf_path, info = download_arxiv_(txt)
         | 
| 159 | 
             
                except:
         | 
| 160 | 
            +
                    report_exception(chatbot, history, 
         | 
| 161 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 162 | 
             
                        b = f"下载pdf文件未成功")
         | 
| 163 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
    	
        crazy_functions/图片生成.py
    CHANGED
    
    | @@ -1,13 +1,12 @@ | |
| 1 | 
             
            from toolbox import CatchException, update_ui, get_conf, select_api_key, get_log_folder
         | 
| 2 | 
            -
            from . | 
| 3 | 
            -
            import datetime
         | 
| 4 |  | 
| 5 |  | 
| 6 | 
            -
            def gen_image(llm_kwargs, prompt, resolution=" | 
| 7 | 
             
                import requests, json, time, os
         | 
| 8 | 
            -
                from  | 
| 9 |  | 
| 10 | 
            -
                proxies | 
| 11 | 
             
                # Set up OpenAI API key and model 
         | 
| 12 | 
             
                api_key = select_api_key(llm_kwargs['api_key'], llm_kwargs['llm_model'])
         | 
| 13 | 
             
                chat_endpoint = model_info[llm_kwargs['llm_model']]['endpoint']
         | 
| @@ -23,8 +22,10 @@ def gen_image(llm_kwargs, prompt, resolution="256x256"): | |
| 23 | 
             
                    'prompt': prompt,
         | 
| 24 | 
             
                    'n': 1,
         | 
| 25 | 
             
                    'size': resolution,
         | 
|  | |
| 26 | 
             
                    'response_format': 'url'
         | 
| 27 | 
             
                }
         | 
|  | |
| 28 | 
             
                response = requests.post(url, headers=headers, json=data, proxies=proxies)
         | 
| 29 | 
             
                print(response.content)
         | 
| 30 | 
             
                try:
         | 
| @@ -42,23 +43,62 @@ def gen_image(llm_kwargs, prompt, resolution="256x256"): | |
| 42 | 
             
                return image_url, file_path+file_name
         | 
| 43 |  | 
| 44 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 45 |  | 
| 46 | 
             
            @CatchException
         | 
| 47 | 
            -
            def 图片生成(prompt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
         | 
| 48 | 
             
                """
         | 
| 49 | 
            -
                txt              | 
| 50 | 
            -
                llm_kwargs      gpt | 
| 51 | 
            -
                plugin_kwargs    | 
| 52 | 
            -
                chatbot          | 
| 53 | 
            -
                history          | 
| 54 | 
             
                system_prompt   给gpt的静默提醒
         | 
| 55 | 
             
                web_port        当前软件运行的端口号
         | 
| 56 | 
             
                """
         | 
| 57 | 
            -
                history = []    #  | 
| 58 | 
            -
                chatbot.append((" | 
| 59 | 
            -
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面  | 
| 60 | 
             
                if ("advanced_arg" in plugin_kwargs) and (plugin_kwargs["advanced_arg"] == ""): plugin_kwargs.pop("advanced_arg")
         | 
| 61 | 
            -
                resolution = plugin_kwargs.get("advanced_arg", ' | 
| 62 | 
             
                image_url, image_path = gen_image(llm_kwargs, prompt, resolution)
         | 
| 63 | 
             
                chatbot.append([prompt,  
         | 
| 64 | 
             
                    f'图像中转网址: <br/>`{image_url}`<br/>'+
         | 
| @@ -66,4 +106,99 @@ def 图片生成(prompt, llm_kwargs, plugin_kwargs, chatbot, history, system_pro | |
| 66 | 
             
                    f'本地文件地址: <br/>`{image_path}`<br/>'+
         | 
| 67 | 
             
                    f'本地文件预览: <br/><div align="center"><img src="file={image_path}"></div>'
         | 
| 68 | 
             
                ])
         | 
| 69 | 
            -
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
             
            from toolbox import CatchException, update_ui, get_conf, select_api_key, get_log_folder
         | 
| 2 | 
            +
            from crazy_functions.multi_stage.multi_stage_utils import GptAcademicState
         | 
|  | |
| 3 |  | 
| 4 |  | 
| 5 | 
            +
            def gen_image(llm_kwargs, prompt, resolution="1024x1024", model="dall-e-2", quality=None):
         | 
| 6 | 
             
                import requests, json, time, os
         | 
| 7 | 
            +
                from request_llms.bridge_all import model_info
         | 
| 8 |  | 
| 9 | 
            +
                proxies = get_conf('proxies')
         | 
| 10 | 
             
                # Set up OpenAI API key and model 
         | 
| 11 | 
             
                api_key = select_api_key(llm_kwargs['api_key'], llm_kwargs['llm_model'])
         | 
| 12 | 
             
                chat_endpoint = model_info[llm_kwargs['llm_model']]['endpoint']
         | 
|  | |
| 22 | 
             
                    'prompt': prompt,
         | 
| 23 | 
             
                    'n': 1,
         | 
| 24 | 
             
                    'size': resolution,
         | 
| 25 | 
            +
                    'model': model,
         | 
| 26 | 
             
                    'response_format': 'url'
         | 
| 27 | 
             
                }
         | 
| 28 | 
            +
                if quality is not None: data.update({'quality': quality})
         | 
| 29 | 
             
                response = requests.post(url, headers=headers, json=data, proxies=proxies)
         | 
| 30 | 
             
                print(response.content)
         | 
| 31 | 
             
                try:
         | 
|  | |
| 43 | 
             
                return image_url, file_path+file_name
         | 
| 44 |  | 
| 45 |  | 
| 46 | 
            +
            def edit_image(llm_kwargs, prompt, image_path, resolution="1024x1024", model="dall-e-2"):
         | 
| 47 | 
            +
                import requests, json, time, os
         | 
| 48 | 
            +
                from request_llms.bridge_all import model_info
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                proxies = get_conf('proxies')
         | 
| 51 | 
            +
                api_key = select_api_key(llm_kwargs['api_key'], llm_kwargs['llm_model'])
         | 
| 52 | 
            +
                chat_endpoint = model_info[llm_kwargs['llm_model']]['endpoint']
         | 
| 53 | 
            +
                # 'https://api.openai.com/v1/chat/completions'
         | 
| 54 | 
            +
                img_endpoint = chat_endpoint.replace('chat/completions','images/edits')
         | 
| 55 | 
            +
                # # Generate the image
         | 
| 56 | 
            +
                url = img_endpoint
         | 
| 57 | 
            +
                headers = {
         | 
| 58 | 
            +
                    'Authorization': f"Bearer {api_key}",
         | 
| 59 | 
            +
                    'Content-Type': 'application/json'
         | 
| 60 | 
            +
                }
         | 
| 61 | 
            +
                data = {
         | 
| 62 | 
            +
                    'image': open(image_path, 'rb'),
         | 
| 63 | 
            +
                    'prompt': prompt,
         | 
| 64 | 
            +
                    'n': 1,
         | 
| 65 | 
            +
                    'size': resolution,
         | 
| 66 | 
            +
                    'model': model,
         | 
| 67 | 
            +
                    'response_format': 'url'
         | 
| 68 | 
            +
                }
         | 
| 69 | 
            +
                response = requests.post(url, headers=headers, json=data, proxies=proxies)
         | 
| 70 | 
            +
                print(response.content)
         | 
| 71 | 
            +
                try:
         | 
| 72 | 
            +
                    image_url = json.loads(response.content.decode('utf8'))['data'][0]['url']
         | 
| 73 | 
            +
                except:
         | 
| 74 | 
            +
                    raise RuntimeError(response.content.decode())
         | 
| 75 | 
            +
                # 文件保存到本地
         | 
| 76 | 
            +
                r = requests.get(image_url, proxies=proxies)
         | 
| 77 | 
            +
                file_path = f'{get_log_folder()}/image_gen/'
         | 
| 78 | 
            +
                os.makedirs(file_path, exist_ok=True)
         | 
| 79 | 
            +
                file_name = 'Image' + time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + '.png'
         | 
| 80 | 
            +
                with open(file_path+file_name, 'wb+') as f: f.write(r.content)
         | 
| 81 | 
            +
             | 
| 82 | 
            +
             | 
| 83 | 
            +
                return image_url, file_path+file_name
         | 
| 84 | 
            +
             | 
| 85 |  | 
| 86 | 
             
            @CatchException
         | 
| 87 | 
            +
            def 图片生成_DALLE2(prompt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
         | 
| 88 | 
             
                """
         | 
| 89 | 
            +
                txt             输入栏用户输入的文本,例如需要翻译的一段话,再例如一个包含了待处理文件的路径
         | 
| 90 | 
            +
                llm_kwargs      gpt模型参数,如温度和top_p等,一般原样传递下去就行
         | 
| 91 | 
            +
                plugin_kwargs   插件模型的参数,暂时没有用武之地
         | 
| 92 | 
            +
                chatbot         聊天显示框的句柄,用于显示给用户
         | 
| 93 | 
            +
                history         聊天历史,前情提要
         | 
| 94 | 
             
                system_prompt   给gpt的静默提醒
         | 
| 95 | 
             
                web_port        当前软件运行的端口号
         | 
| 96 | 
             
                """
         | 
| 97 | 
            +
                history = []    # 清空历史,以免输入溢出
         | 
| 98 | 
            +
                chatbot.append(("您正在调用“图像生成”插件。", "[Local Message] 生成图像, 请先把模型切换至gpt-*或者api2d-*。如果中文Prompt效果不理想, 请尝试英文Prompt。正在处理中 ....."))
         | 
| 99 | 
            +
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 由于请求gpt需要一段时间,我们先及时地做一次界面更新
         | 
| 100 | 
             
                if ("advanced_arg" in plugin_kwargs) and (plugin_kwargs["advanced_arg"] == ""): plugin_kwargs.pop("advanced_arg")
         | 
| 101 | 
            +
                resolution = plugin_kwargs.get("advanced_arg", '1024x1024')
         | 
| 102 | 
             
                image_url, image_path = gen_image(llm_kwargs, prompt, resolution)
         | 
| 103 | 
             
                chatbot.append([prompt,  
         | 
| 104 | 
             
                    f'图像中转网址: <br/>`{image_url}`<br/>'+
         | 
|  | |
| 106 | 
             
                    f'本地文件地址: <br/>`{image_path}`<br/>'+
         | 
| 107 | 
             
                    f'本地文件预览: <br/><div align="center"><img src="file={image_path}"></div>'
         | 
| 108 | 
             
                ])
         | 
| 109 | 
            +
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 界面更新
         | 
| 110 | 
            +
             | 
| 111 | 
            +
             | 
| 112 | 
            +
            @CatchException
         | 
| 113 | 
            +
            def 图片生成_DALLE3(prompt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
         | 
| 114 | 
            +
                history = []    # 清空历史,以免输入溢出
         | 
| 115 | 
            +
                chatbot.append(("您正在调用“图像生成”插件。", "[Local Message] 生成图像, 请先把模型切换至gpt-*或者api2d-*。如果中文Prompt效果不理想, 请尝试英文Prompt。正在处理中 ....."))
         | 
| 116 | 
            +
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 由于请求gpt需要一段时间,我们先及时地做一次界面更新
         | 
| 117 | 
            +
                if ("advanced_arg" in plugin_kwargs) and (plugin_kwargs["advanced_arg"] == ""): plugin_kwargs.pop("advanced_arg")
         | 
| 118 | 
            +
                resolution = plugin_kwargs.get("advanced_arg", '1024x1024').lower()
         | 
| 119 | 
            +
                if resolution.endswith('-hd'):
         | 
| 120 | 
            +
                    resolution = resolution.replace('-hd', '')
         | 
| 121 | 
            +
                    quality = 'hd'
         | 
| 122 | 
            +
                else:
         | 
| 123 | 
            +
                    quality = 'standard'
         | 
| 124 | 
            +
                image_url, image_path = gen_image(llm_kwargs, prompt, resolution, model="dall-e-3", quality=quality)
         | 
| 125 | 
            +
                chatbot.append([prompt,  
         | 
| 126 | 
            +
                    f'图像中转网址: <br/>`{image_url}`<br/>'+
         | 
| 127 | 
            +
                    f'中转网址预览: <br/><div align="center"><img src="{image_url}"></div>'
         | 
| 128 | 
            +
                    f'本地文件地址: <br/>`{image_path}`<br/>'+
         | 
| 129 | 
            +
                    f'本地文件预览: <br/><div align="center"><img src="file={image_path}"></div>'
         | 
| 130 | 
            +
                ])
         | 
| 131 | 
            +
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 界面更新
         | 
| 132 | 
            +
             | 
| 133 | 
            +
            class ImageEditState(GptAcademicState):
         | 
| 134 | 
            +
                # 尚未完成
         | 
| 135 | 
            +
                def get_image_file(self, x):
         | 
| 136 | 
            +
                    import os, glob
         | 
| 137 | 
            +
                    if len(x) == 0:             return False, None
         | 
| 138 | 
            +
                    if not os.path.exists(x):   return False, None
         | 
| 139 | 
            +
                    if x.endswith('.png'):      return True, x
         | 
| 140 | 
            +
                    file_manifest = [f for f in glob.glob(f'{x}/**/*.png', recursive=True)]
         | 
| 141 | 
            +
                    confirm = (len(file_manifest) >= 1 and file_manifest[0].endswith('.png') and os.path.exists(file_manifest[0]))
         | 
| 142 | 
            +
                    file = None if not confirm else file_manifest[0]
         | 
| 143 | 
            +
                    return confirm, file
         | 
| 144 | 
            +
                
         | 
| 145 | 
            +
                def get_resolution(self, x):
         | 
| 146 | 
            +
                    return (x in ['256x256', '512x512', '1024x1024']), x
         | 
| 147 | 
            +
                
         | 
| 148 | 
            +
                def get_prompt(self, x):
         | 
| 149 | 
            +
                    confirm = (len(x)>=5) and (not self.get_resolution(x)[0]) and (not self.get_image_file(x)[0])
         | 
| 150 | 
            +
                    return confirm, x
         | 
| 151 | 
            +
                
         | 
| 152 | 
            +
                def reset(self):
         | 
| 153 | 
            +
                    self.req = [
         | 
| 154 | 
            +
                        {'value':None, 'description': '请先上传图像(必须是.png格式), 然后再次点击本插件',    'verify_fn': self.get_image_file},
         | 
| 155 | 
            +
                        {'value':None, 'description': '请输入分辨率,可选:256x256, 512x512 或 1024x1024',   'verify_fn': self.get_resolution},
         | 
| 156 | 
            +
                        {'value':None, 'description': '请输入修改需求,建议您使用英文提示词',                 'verify_fn': self.get_prompt},
         | 
| 157 | 
            +
                    ]
         | 
| 158 | 
            +
                    self.info = ""
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                def feed(self, prompt, chatbot):
         | 
| 161 | 
            +
                    for r in self.req:
         | 
| 162 | 
            +
                        if r['value'] is None:
         | 
| 163 | 
            +
                            confirm, res = r['verify_fn'](prompt)
         | 
| 164 | 
            +
                            if confirm:
         | 
| 165 | 
            +
                                r['value'] = res
         | 
| 166 | 
            +
                                self.set_state(chatbot, 'dummy_key', 'dummy_value')
         | 
| 167 | 
            +
                                break
         | 
| 168 | 
            +
                    return self
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                def next_req(self):
         | 
| 171 | 
            +
                    for r in self.req:
         | 
| 172 | 
            +
                        if r['value'] is None:
         | 
| 173 | 
            +
                            return r['description']
         | 
| 174 | 
            +
                    return "已经收集到所有信息"
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                def already_obtained_all_materials(self):
         | 
| 177 | 
            +
                    return all([x['value'] is not None for x in self.req])
         | 
| 178 | 
            +
             | 
| 179 | 
            +
            @CatchException
         | 
| 180 | 
            +
            def 图片修改_DALLE2(prompt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
         | 
| 181 | 
            +
                # 尚未完成
         | 
| 182 | 
            +
                history = []    # 清空历史
         | 
| 183 | 
            +
                state = ImageEditState.get_state(chatbot, ImageEditState)
         | 
| 184 | 
            +
                state = state.feed(prompt, chatbot)
         | 
| 185 | 
            +
                if not state.already_obtained_all_materials():
         | 
| 186 | 
            +
                    chatbot.append(["图片修改(先上传图片,再输入修改需求,最后输入分辨率)", state.next_req()])
         | 
| 187 | 
            +
                    yield from update_ui(chatbot=chatbot, history=history)
         | 
| 188 | 
            +
                    return
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                image_path = state.req[0]
         | 
| 191 | 
            +
                resolution = state.req[1]
         | 
| 192 | 
            +
                prompt = state.req[2]
         | 
| 193 | 
            +
                chatbot.append(["图片修改, 执行中", f"图片:`{image_path}`<br/>分辨率:`{resolution}`<br/>修改需求:`{prompt}`"])
         | 
| 194 | 
            +
                yield from update_ui(chatbot=chatbot, history=history)
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                image_url, image_path = edit_image(llm_kwargs, prompt, image_path, resolution)
         | 
| 197 | 
            +
                chatbot.append([state.prompt,  
         | 
| 198 | 
            +
                    f'图像中转网址: <br/>`{image_url}`<br/>'+
         | 
| 199 | 
            +
                    f'中转网址预览: <br/><div align="center"><img src="{image_url}"></div>'
         | 
| 200 | 
            +
                    f'本地文件地址: <br/>`{image_path}`<br/>'+
         | 
| 201 | 
            +
                    f'本地文件预览: <br/><div align="center"><img src="file={image_path}"></div>'
         | 
| 202 | 
            +
                ])
         | 
| 203 | 
            +
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 界面更新
         | 
| 204 | 
            +
             | 
    	
        crazy_functions/多智能体.py
    ADDED
    
    | @@ -0,0 +1,108 @@ | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | 
|  | |
| 1 | 
            +
            # 本源代码中, ⭐ = 关键步骤
         | 
| 2 | 
            +
            """
         | 
| 3 | 
            +
            测试:
         | 
| 4 | 
            +
                - show me the solution of $x^2=cos(x)$, solve this problem with figure, and plot and save image to t.jpg
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            """
         | 
| 7 | 
            +
             | 
| 8 | 
            +
             | 
| 9 | 
            +
            from toolbox import CatchException, update_ui, gen_time_str, trimmed_format_exc, ProxyNetworkActivate
         | 
| 10 | 
            +
            from toolbox import get_conf, select_api_key, update_ui_lastest_msg, Singleton
         | 
| 11 | 
            +
            from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive, get_plugin_arg
         | 
| 12 | 
            +
            from crazy_functions.crazy_utils import input_clipping, try_install_deps
         | 
| 13 | 
            +
            from crazy_functions.agent_fns.persistent import GradioMultiuserManagerForPersistentClasses
         | 
| 14 | 
            +
            from crazy_functions.agent_fns.auto_agent import AutoGenMath
         | 
| 15 | 
            +
            import time
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            def remove_model_prefix(llm):
         | 
| 18 | 
            +
                if llm.startswith('api2d-'): llm = llm.replace('api2d-', '')
         | 
| 19 | 
            +
                if llm.startswith('azure-'): llm = llm.replace('azure-', '')
         | 
| 20 | 
            +
                return llm
         | 
| 21 | 
            +
             | 
| 22 | 
            +
             | 
| 23 | 
            +
            @CatchException
         | 
| 24 | 
            +
            def 多智能体终端(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
         | 
| 25 | 
            +
                """
         | 
| 26 | 
            +
                txt             输入栏用户输入的文本,例如需要翻译的一段话,再例如一个包含了待处理文件的路径
         | 
| 27 | 
            +
                llm_kwargs      gpt模型参数,如温度和top_p等,一般原样传递下去就行
         | 
| 28 | 
            +
                plugin_kwargs   插件模型的参数
         | 
| 29 | 
            +
                chatbot         聊天显示框的句柄,用于显示给用户
         | 
| 30 | 
            +
                history         聊天历史,前情提要
         | 
| 31 | 
            +
                system_prompt   给gpt的静默提醒
         | 
| 32 | 
            +
                web_port        当前软件运行的端口号
         | 
| 33 | 
            +
                """
         | 
| 34 | 
            +
                # 检查当前的模型是否符合要求
         | 
| 35 | 
            +
                supported_llms = [
         | 
| 36 | 
            +
                    "gpt-3.5-turbo-16k",
         | 
| 37 | 
            +
                    'gpt-3.5-turbo-1106',
         | 
| 38 | 
            +
                    "gpt-4",
         | 
| 39 | 
            +
                    "gpt-4-32k",
         | 
| 40 | 
            +
                    'gpt-4-1106-preview',
         | 
| 41 | 
            +
                    "azure-gpt-3.5-turbo-16k",
         | 
| 42 | 
            +
                    "azure-gpt-3.5-16k",
         | 
| 43 | 
            +
                    "azure-gpt-4",
         | 
| 44 | 
            +
                    "azure-gpt-4-32k",
         | 
| 45 | 
            +
                ]
         | 
| 46 | 
            +
                from request_llms.bridge_all import model_info
         | 
| 47 | 
            +
                if model_info[llm_kwargs['llm_model']]["max_token"] < 8000: # 至少是8k上下文的模型
         | 
| 48 | 
            +
                    chatbot.append([f"处理任务: {txt}", f"当前插件只支持{str(supported_llms)}, 当前模型{llm_kwargs['llm_model']}的最大上下文长度太短, 不能支撑AutoGen运行。"])
         | 
| 49 | 
            +
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 50 | 
            +
                    return
         | 
| 51 | 
            +
                if model_info[llm_kwargs['llm_model']]["endpoint"] is not None: # 如果不是本地模型,加载API_KEY
         | 
| 52 | 
            +
                    llm_kwargs['api_key'] = select_api_key(llm_kwargs['api_key'], llm_kwargs['llm_model'])
         | 
| 53 | 
            +
                
         | 
| 54 | 
            +
                # 检查当前的模型是否符合要求
         | 
| 55 | 
            +
                API_URL_REDIRECT = get_conf('API_URL_REDIRECT')
         | 
| 56 | 
            +
                if len(API_URL_REDIRECT) > 0:
         | 
| 57 | 
            +
                    chatbot.append([f"处理任务: {txt}", f"暂不支持中转."])
         | 
| 58 | 
            +
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 59 | 
            +
                    return
         | 
| 60 | 
            +
                
         | 
| 61 | 
            +
                # 尝试导入依赖,如果缺少依赖,则给出安装建议
         | 
| 62 | 
            +
                try:
         | 
| 63 | 
            +
                    import autogen
         | 
| 64 | 
            +
                    if get_conf("AUTOGEN_USE_DOCKER"):
         | 
| 65 | 
            +
                        import docker
         | 
| 66 | 
            +
                except:
         | 
| 67 | 
            +
                    chatbot.append([ f"处理任务: {txt}", 
         | 
| 68 | 
            +
                        f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pyautogen docker```。"])
         | 
| 69 | 
            +
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 70 | 
            +
                    return
         | 
| 71 | 
            +
                
         | 
| 72 | 
            +
                # 尝试导入依赖,如果缺少依赖,则给出安装建议
         | 
| 73 | 
            +
                try:
         | 
| 74 | 
            +
                    import autogen
         | 
| 75 | 
            +
                    import glob, os, time, subprocess
         | 
| 76 | 
            +
                    if get_conf("AUTOGEN_USE_DOCKER"):
         | 
| 77 | 
            +
                        subprocess.Popen(["docker", "--version"])
         | 
| 78 | 
            +
                except:
         | 
| 79 | 
            +
                    chatbot.append([f"处理任务: {txt}", f"缺少docker运行环境!"])
         | 
| 80 | 
            +
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 81 | 
            +
                    return
         | 
| 82 | 
            +
                
         | 
| 83 | 
            +
                # 解锁插件
         | 
| 84 | 
            +
                chatbot.get_cookies()['lock_plugin'] = None
         | 
| 85 | 
            +
                persistent_class_multi_user_manager = GradioMultiuserManagerForPersistentClasses()
         | 
| 86 | 
            +
                user_uuid = chatbot.get_cookies().get('uuid')
         | 
| 87 | 
            +
                persistent_key = f"{user_uuid}->多智能体终端"
         | 
| 88 | 
            +
                if persistent_class_multi_user_manager.already_alive(persistent_key):
         | 
| 89 | 
            +
                    # 当已经存在一个正在运行的多智能体终端时,直接将用户输入传递给它,而不是再次启动一个新的多智能体终端
         | 
| 90 | 
            +
                    print('[debug] feed new user input')
         | 
| 91 | 
            +
                    executor = persistent_class_multi_user_manager.get(persistent_key)
         | 
| 92 | 
            +
                    exit_reason = yield from executor.main_process_ui_control(txt, create_or_resume="resume")
         | 
| 93 | 
            +
                else:
         | 
| 94 | 
            +
                    # 运行多智能体终端 (首次)
         | 
| 95 | 
            +
                    print('[debug] create new executor instance')
         | 
| 96 | 
            +
                    history = []
         | 
| 97 | 
            +
                    chatbot.append(["正在启动: 多智能体终端", "插件动态生成, 执行开始, 作者 Microsoft & Binary-Husky."])
         | 
| 98 | 
            +
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 99 | 
            +
                    executor = AutoGenMath(llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port)
         | 
| 100 | 
            +
                    persistent_class_multi_user_manager.set(persistent_key, executor)
         | 
| 101 | 
            +
                    exit_reason = yield from executor.main_process_ui_control(txt, create_or_resume="create")
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                if exit_reason == "wait_feedback":
         | 
| 104 | 
            +
                    # 当用户点击了“等待反馈”按钮时,将executor存储到cookie中,等待用户的再次调用
         | 
| 105 | 
            +
                    executor.chatbot.get_cookies()['lock_plugin'] = 'crazy_functions.多智能体->多智能体终端'
         | 
| 106 | 
            +
                else:
         | 
| 107 | 
            +
                    executor.chatbot.get_cookies()['lock_plugin'] = None
         | 
| 108 | 
            +
                yield from update_ui(chatbot=executor.chatbot, history=executor.history) # 更新状态
         | 
    	
        crazy_functions/对话历史存档.py
    CHANGED
    
    | @@ -1,7 +1,8 @@ | |
| 1 | 
            -
            from toolbox import CatchException, update_ui, promote_file_to_downloadzone, get_log_folder
         | 
| 2 | 
            -
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 3 | 
             
            import re
         | 
| 4 |  | 
|  | |
|  | |
| 5 | 
             
            def write_chat_to_file(chatbot, history=None, file_name=None):
         | 
| 6 | 
             
                """
         | 
| 7 | 
             
                将对话记录history以Markdown格式写入文件中。如果没有指定文件名,则使用当前时间生成文件名。
         | 
| @@ -9,8 +10,8 @@ def write_chat_to_file(chatbot, history=None, file_name=None): | |
| 9 | 
             
                import os
         | 
| 10 | 
             
                import time
         | 
| 11 | 
             
                if file_name is None:
         | 
| 12 | 
            -
                    file_name =  | 
| 13 | 
            -
                fp = os.path.join(get_log_folder(), file_name)
         | 
| 14 | 
             
                with open(fp, 'w', encoding='utf8') as f:
         | 
| 15 | 
             
                    from themes.theme import advanced_css
         | 
| 16 | 
             
                    f.write(f'<!DOCTYPE html><head><meta charset="utf-8"><title>对话历史</title><style>{advanced_css}</style></head>')
         | 
| @@ -80,7 +81,7 @@ def 对话历史存档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_ | |
| 80 | 
             
                """
         | 
| 81 |  | 
| 82 | 
             
                chatbot.append(("保存当前对话", 
         | 
| 83 | 
            -
                    f"[Local Message] {write_chat_to_file(chatbot, history)} | 
| 84 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 由于请求gpt需要一段时间,我们先及时地做一次界面更新
         | 
| 85 |  | 
| 86 | 
             
            def hide_cwd(str):
         | 
| @@ -106,7 +107,12 @@ def 载入对话历史存档(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 106 | 
             
                if not success:
         | 
| 107 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 108 | 
             
                    import glob
         | 
| 109 | 
            -
                    local_history = "<br/>".join([ | 
|  | |
|  | |
|  | |
|  | |
|  | |
| 110 | 
             
                    chatbot.append([f"正在查找对话历史文件(html格式): {txt}", f"找不到任何html文件: {txt}。但本地存储了以下历史文件,您可以将任意一个文件路径粘贴到输入区,然后重试:<br/>{local_history}"])
         | 
| 111 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 112 | 
             
                    return
         | 
| @@ -132,8 +138,12 @@ def 删除所有本地对话历史记录(txt, llm_kwargs, plugin_kwargs, chatbot | |
| 132 | 
             
                """
         | 
| 133 |  | 
| 134 | 
             
                import glob, os
         | 
| 135 | 
            -
                local_history = "<br/>".join([ | 
| 136 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
| 137 | 
             
                    os.remove(f)
         | 
| 138 | 
             
                chatbot.append([f"删除所有历史对话文件", f"已删除<br/>{local_history}"])
         | 
| 139 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 1 | 
            +
            from toolbox import CatchException, update_ui, promote_file_to_downloadzone, get_log_folder, get_user
         | 
|  | |
| 2 | 
             
            import re
         | 
| 3 |  | 
| 4 | 
            +
            f_prefix = 'GPT-Academic对话存档'
         | 
| 5 | 
            +
             | 
| 6 | 
             
            def write_chat_to_file(chatbot, history=None, file_name=None):
         | 
| 7 | 
             
                """
         | 
| 8 | 
             
                将对话记录history以Markdown格式写入文件中。如果没有指定文件名,则使用当前时间生成文件名。
         | 
|  | |
| 10 | 
             
                import os
         | 
| 11 | 
             
                import time
         | 
| 12 | 
             
                if file_name is None:
         | 
| 13 | 
            +
                    file_name = f_prefix + time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + '.html'
         | 
| 14 | 
            +
                fp = os.path.join(get_log_folder(get_user(chatbot), plugin_name='chat_history'), file_name)
         | 
| 15 | 
             
                with open(fp, 'w', encoding='utf8') as f:
         | 
| 16 | 
             
                    from themes.theme import advanced_css
         | 
| 17 | 
             
                    f.write(f'<!DOCTYPE html><head><meta charset="utf-8"><title>对话历史</title><style>{advanced_css}</style></head>')
         | 
|  | |
| 81 | 
             
                """
         | 
| 82 |  | 
| 83 | 
             
                chatbot.append(("保存当前对话", 
         | 
| 84 | 
            +
                    f"[Local Message] {write_chat_to_file(chatbot, history)},您可以调用下拉菜单中的“载入对话历史存档”还原当下的对话。"))
         | 
| 85 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 由于请求gpt需要一段时间,我们先及时地做一次界面更新
         | 
| 86 |  | 
| 87 | 
             
            def hide_cwd(str):
         | 
|  | |
| 107 | 
             
                if not success:
         | 
| 108 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 109 | 
             
                    import glob
         | 
| 110 | 
            +
                    local_history = "<br/>".join([
         | 
| 111 | 
            +
                        "`"+hide_cwd(f)+f" ({gen_file_preview(f)})"+"`" 
         | 
| 112 | 
            +
                        for f in glob.glob(
         | 
| 113 | 
            +
                            f'{get_log_folder(get_user(chatbot), plugin_name="chat_history")}/**/{f_prefix}*.html', 
         | 
| 114 | 
            +
                            recursive=True
         | 
| 115 | 
            +
                        )])
         | 
| 116 | 
             
                    chatbot.append([f"正在查找对话历史文件(html格式): {txt}", f"找不到任何html文件: {txt}。但本地存储了以下历史文件,您可以将任意一个文件路径粘贴到输入区,然后重试:<br/>{local_history}"])
         | 
| 117 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 118 | 
             
                    return
         | 
|  | |
| 138 | 
             
                """
         | 
| 139 |  | 
| 140 | 
             
                import glob, os
         | 
| 141 | 
            +
                local_history = "<br/>".join([
         | 
| 142 | 
            +
                    "`"+hide_cwd(f)+"`" 
         | 
| 143 | 
            +
                    for f in glob.glob(
         | 
| 144 | 
            +
                        f'{get_log_folder(get_user(chatbot), plugin_name="chat_history")}/**/{f_prefix}*.html', recursive=True
         | 
| 145 | 
            +
                    )])
         | 
| 146 | 
            +
                for f in glob.glob(f'{get_log_folder(get_user(chatbot), plugin_name="chat_history")}/**/{f_prefix}*.html', recursive=True):
         | 
| 147 | 
             
                    os.remove(f)
         | 
| 148 | 
             
                chatbot.append([f"删除所有历史对话文件", f"已删除<br/>{local_history}"])
         | 
| 149 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
    	
        crazy_functions/总结word文档.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 | 
             
            fast_debug = False
         | 
| @@ -32,7 +32,7 @@ def 解析docx(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot | |
| 32 | 
             
                    print(file_content)
         | 
| 33 | 
             
                    # private_upload里面的文件名在解压zip后容易出现乱码(rar和7z格式正常),故可以只分析文章内容,不输入文件名
         | 
| 34 | 
             
                    from .crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 35 | 
            -
                    from  | 
| 36 | 
             
                    max_token = model_info[llm_kwargs['llm_model']]['max_token']
         | 
| 37 | 
             
                    TOKEN_LIMIT_PER_FRAGMENT = max_token * 3 // 4
         | 
| 38 | 
             
                    paper_fragments = breakdown_txt_to_satisfy_token_limit_for_pdf(
         | 
| @@ -97,7 +97,7 @@ def 总结word文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_pr | |
| 97 | 
             
                try:
         | 
| 98 | 
             
                    from docx import Document
         | 
| 99 | 
             
                except:
         | 
| 100 | 
            -
                     | 
| 101 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 102 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade python-docx pywin32```。")
         | 
| 103 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -111,7 +111,7 @@ def 总结word文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_pr | |
| 111 | 
             
                    project_folder = txt
         | 
| 112 | 
             
                else:
         | 
| 113 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 114 | 
            -
                     | 
| 115 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 116 | 
             
                    return
         | 
| 117 |  | 
| @@ -124,7 +124,7 @@ def 总结word文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_pr | |
| 124 |  | 
| 125 | 
             
                # 如果没找到任何文件
         | 
| 126 | 
             
                if len(file_manifest) == 0:
         | 
| 127 | 
            -
                     | 
| 128 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 129 | 
             
                    return
         | 
| 130 |  | 
|  | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 | 
             
            fast_debug = False
         | 
|  | |
| 32 | 
             
                    print(file_content)
         | 
| 33 | 
             
                    # private_upload里面的文件名在解压zip后容易出现乱码(rar和7z格式正常),故可以只分析文章内容,不输入文件名
         | 
| 34 | 
             
                    from .crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 35 | 
            +
                    from request_llms.bridge_all import model_info
         | 
| 36 | 
             
                    max_token = model_info[llm_kwargs['llm_model']]['max_token']
         | 
| 37 | 
             
                    TOKEN_LIMIT_PER_FRAGMENT = max_token * 3 // 4
         | 
| 38 | 
             
                    paper_fragments = breakdown_txt_to_satisfy_token_limit_for_pdf(
         | 
|  | |
| 97 | 
             
                try:
         | 
| 98 | 
             
                    from docx import Document
         | 
| 99 | 
             
                except:
         | 
| 100 | 
            +
                    report_exception(chatbot, history,
         | 
| 101 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 102 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade python-docx pywin32```。")
         | 
| 103 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 111 | 
             
                    project_folder = txt
         | 
| 112 | 
             
                else:
         | 
| 113 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 114 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 115 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 116 | 
             
                    return
         | 
| 117 |  | 
|  | |
| 124 |  | 
| 125 | 
             
                # 如果没找到任何文件
         | 
| 126 | 
             
                if len(file_manifest) == 0:
         | 
| 127 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到任何.docx或doc文件: {txt}")
         | 
| 128 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 129 | 
             
                    return
         | 
| 130 |  | 
    	
        crazy_functions/总结音视频.py
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            from toolbox import CatchException,  | 
| 2 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone, get_log_folder
         | 
| 4 |  | 
| @@ -41,7 +41,7 @@ def split_audio_file(filename, split_duration=1000): | |
| 41 | 
             
            def AnalyAudio(parse_prompt, file_manifest, llm_kwargs, chatbot, history):
         | 
| 42 | 
             
                import os, requests
         | 
| 43 | 
             
                from moviepy.editor import AudioFileClip
         | 
| 44 | 
            -
                from  | 
| 45 |  | 
| 46 | 
             
                # 设置OpenAI密钥和模型
         | 
| 47 | 
             
                api_key = select_api_key(llm_kwargs['api_key'], llm_kwargs['llm_model'])
         | 
| @@ -79,7 +79,7 @@ def AnalyAudio(parse_prompt, file_manifest, llm_kwargs, chatbot, history): | |
| 79 |  | 
| 80 | 
             
                        chatbot.append([f"将 {i} 发送到openai音频解析终端 (whisper),当前参数:{parse_prompt}", "正在处理 ..."])
         | 
| 81 | 
             
                        yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 82 | 
            -
                        proxies | 
| 83 | 
             
                        response = requests.post(url, headers=headers, files=files, data=data, proxies=proxies).text
         | 
| 84 |  | 
| 85 | 
             
                        chatbot.append(["音频解析结果", response])
         | 
| @@ -144,7 +144,7 @@ def 总结音视频(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_pro | |
| 144 | 
             
                try:
         | 
| 145 | 
             
                    from moviepy.editor import AudioFileClip
         | 
| 146 | 
             
                except:
         | 
| 147 | 
            -
                     | 
| 148 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 149 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade moviepy```。")
         | 
| 150 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| @@ -158,7 +158,7 @@ def 总结音视频(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_pro | |
| 158 | 
             
                    project_folder = txt
         | 
| 159 | 
             
                else:
         | 
| 160 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 161 | 
            -
                     | 
| 162 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 163 | 
             
                    return
         | 
| 164 |  | 
| @@ -174,7 +174,7 @@ def 总结音视频(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_pro | |
| 174 |  | 
| 175 | 
             
                # 如果没找到任何文件
         | 
| 176 | 
             
                if len(file_manifest) == 0:
         | 
| 177 | 
            -
                     | 
| 178 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 179 | 
             
                    return
         | 
| 180 |  | 
|  | |
| 1 | 
            +
            from toolbox import CatchException, report_exception, select_api_key, update_ui, get_conf
         | 
| 2 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone, get_log_folder
         | 
| 4 |  | 
|  | |
| 41 | 
             
            def AnalyAudio(parse_prompt, file_manifest, llm_kwargs, chatbot, history):
         | 
| 42 | 
             
                import os, requests
         | 
| 43 | 
             
                from moviepy.editor import AudioFileClip
         | 
| 44 | 
            +
                from request_llms.bridge_all import model_info
         | 
| 45 |  | 
| 46 | 
             
                # 设置OpenAI密钥和模型
         | 
| 47 | 
             
                api_key = select_api_key(llm_kwargs['api_key'], llm_kwargs['llm_model'])
         | 
|  | |
| 79 |  | 
| 80 | 
             
                        chatbot.append([f"将 {i} 发送到openai音频解析终端 (whisper),当前参数:{parse_prompt}", "正在处理 ..."])
         | 
| 81 | 
             
                        yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 82 | 
            +
                        proxies = get_conf('proxies')
         | 
| 83 | 
             
                        response = requests.post(url, headers=headers, files=files, data=data, proxies=proxies).text
         | 
| 84 |  | 
| 85 | 
             
                        chatbot.append(["音频解析结果", response])
         | 
|  | |
| 144 | 
             
                try:
         | 
| 145 | 
             
                    from moviepy.editor import AudioFileClip
         | 
| 146 | 
             
                except:
         | 
| 147 | 
            +
                    report_exception(chatbot, history,
         | 
| 148 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 149 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade moviepy```。")
         | 
| 150 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
|  | |
| 158 | 
             
                    project_folder = txt
         | 
| 159 | 
             
                else:
         | 
| 160 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 161 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 162 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 163 | 
             
                    return
         | 
| 164 |  | 
|  | |
| 174 |  | 
| 175 | 
             
                # 如果没找到任何文件
         | 
| 176 | 
             
                if len(file_manifest) == 0:
         | 
| 177 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到任何音频或视频文件: {txt}")
         | 
| 178 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 179 | 
             
                    return
         | 
| 180 |  | 
    	
        crazy_functions/批量Markdown翻译.py
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 | 
             
            import glob, time, os, re, logging
         | 
| 2 | 
             
            from toolbox import update_ui, trimmed_format_exc, gen_time_str, disable_auto_promotion
         | 
| 3 | 
            -
            from toolbox import CatchException,  | 
| 4 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 5 | 
             
            fast_debug = False
         | 
| 6 |  | 
| @@ -13,7 +13,7 @@ class PaperFileGroup(): | |
| 13 | 
             
                    self.sp_file_tag = []
         | 
| 14 |  | 
| 15 | 
             
                    # count_token
         | 
| 16 | 
            -
                    from  | 
| 17 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 18 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 19 | 
             
                    self.get_token_num = get_token_num
         | 
| @@ -118,7 +118,7 @@ def get_files_from_everything(txt, preference=''): | |
| 118 | 
             
                if txt.startswith('http'):
         | 
| 119 | 
             
                    import requests
         | 
| 120 | 
             
                    from toolbox import get_conf
         | 
| 121 | 
            -
                    proxies | 
| 122 | 
             
                    # 网络的远程文件
         | 
| 123 | 
             
                    if preference == 'Github':
         | 
| 124 | 
             
                        logging.info('正在从github下载资源 ...')
         | 
| @@ -165,7 +165,7 @@ def Markdown英译中(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 165 | 
             
                try:
         | 
| 166 | 
             
                    import tiktoken
         | 
| 167 | 
             
                except:
         | 
| 168 | 
            -
                     | 
| 169 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 170 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 171 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -177,12 +177,12 @@ def Markdown英译中(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 177 | 
             
                if not success:
         | 
| 178 | 
             
                    # 什么都没有
         | 
| 179 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 180 | 
            -
                     | 
| 181 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 182 | 
             
                    return
         | 
| 183 |  | 
| 184 | 
             
                if len(file_manifest) == 0:
         | 
| 185 | 
            -
                     | 
| 186 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 187 | 
             
                    return
         | 
| 188 |  | 
| @@ -205,7 +205,7 @@ def Markdown中译英(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 205 | 
             
                try:
         | 
| 206 | 
             
                    import tiktoken
         | 
| 207 | 
             
                except:
         | 
| 208 | 
            -
                     | 
| 209 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 210 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 211 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -215,11 +215,11 @@ def Markdown中译英(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 215 | 
             
                if not success:
         | 
| 216 | 
             
                    # 什么都没有
         | 
| 217 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 218 | 
            -
                     | 
| 219 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 220 | 
             
                    return
         | 
| 221 | 
             
                if len(file_manifest) == 0:
         | 
| 222 | 
            -
                     | 
| 223 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 224 | 
             
                    return
         | 
| 225 | 
             
                yield from 多文件翻译(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='zh->en')
         | 
| @@ -238,7 +238,7 @@ def Markdown翻译指定语言(txt, llm_kwargs, plugin_kwargs, chatbot, history, | |
| 238 | 
             
                try:
         | 
| 239 | 
             
                    import tiktoken
         | 
| 240 | 
             
                except:
         | 
| 241 | 
            -
                     | 
| 242 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 243 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 244 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -248,11 +248,11 @@ def Markdown翻译指定语言(txt, llm_kwargs, plugin_kwargs, chatbot, history, | |
| 248 | 
             
                if not success:
         | 
| 249 | 
             
                    # 什么都没有
         | 
| 250 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 251 | 
            -
                     | 
| 252 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 253 | 
             
                    return
         | 
| 254 | 
             
                if len(file_manifest) == 0:
         | 
| 255 | 
            -
                     | 
| 256 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 257 | 
             
                    return
         | 
| 258 |  | 
|  | |
| 1 | 
             
            import glob, time, os, re, logging
         | 
| 2 | 
             
            from toolbox import update_ui, trimmed_format_exc, gen_time_str, disable_auto_promotion
         | 
| 3 | 
            +
            from toolbox import CatchException, report_exception, get_log_folder
         | 
| 4 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 5 | 
             
            fast_debug = False
         | 
| 6 |  | 
|  | |
| 13 | 
             
                    self.sp_file_tag = []
         | 
| 14 |  | 
| 15 | 
             
                    # count_token
         | 
| 16 | 
            +
                    from request_llms.bridge_all import model_info
         | 
| 17 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 18 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 19 | 
             
                    self.get_token_num = get_token_num
         | 
|  | |
| 118 | 
             
                if txt.startswith('http'):
         | 
| 119 | 
             
                    import requests
         | 
| 120 | 
             
                    from toolbox import get_conf
         | 
| 121 | 
            +
                    proxies = get_conf('proxies')
         | 
| 122 | 
             
                    # 网络的远程文件
         | 
| 123 | 
             
                    if preference == 'Github':
         | 
| 124 | 
             
                        logging.info('正在从github下载资源 ...')
         | 
|  | |
| 165 | 
             
                try:
         | 
| 166 | 
             
                    import tiktoken
         | 
| 167 | 
             
                except:
         | 
| 168 | 
            +
                    report_exception(chatbot, history,
         | 
| 169 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 170 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 171 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 177 | 
             
                if not success:
         | 
| 178 | 
             
                    # 什么都没有
         | 
| 179 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 180 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 181 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 182 | 
             
                    return
         | 
| 183 |  | 
| 184 | 
             
                if len(file_manifest) == 0:
         | 
| 185 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.md文件: {txt}")
         | 
| 186 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 187 | 
             
                    return
         | 
| 188 |  | 
|  | |
| 205 | 
             
                try:
         | 
| 206 | 
             
                    import tiktoken
         | 
| 207 | 
             
                except:
         | 
| 208 | 
            +
                    report_exception(chatbot, history,
         | 
| 209 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 210 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 211 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 215 | 
             
                if not success:
         | 
| 216 | 
             
                    # 什么都没有
         | 
| 217 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 218 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 219 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 220 | 
             
                    return
         | 
| 221 | 
             
                if len(file_manifest) == 0:
         | 
| 222 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.md文件: {txt}")
         | 
| 223 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 224 | 
             
                    return
         | 
| 225 | 
             
                yield from 多文件翻译(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, language='zh->en')
         | 
|  | |
| 238 | 
             
                try:
         | 
| 239 | 
             
                    import tiktoken
         | 
| 240 | 
             
                except:
         | 
| 241 | 
            +
                    report_exception(chatbot, history,
         | 
| 242 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 243 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade tiktoken```。")
         | 
| 244 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 248 | 
             
                if not success:
         | 
| 249 | 
             
                    # 什么都没有
         | 
| 250 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 251 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 252 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 253 | 
             
                    return
         | 
| 254 | 
             
                if len(file_manifest) == 0:
         | 
| 255 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.md文件: {txt}")
         | 
| 256 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 257 | 
             
                    return
         | 
| 258 |  | 
    	
        crazy_functions/批量总结PDF文档.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone, gen_time_str
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 | 
             
            from .crazy_utils import read_and_clean_pdf_text
         | 
| @@ -21,7 +21,7 @@ def 解析PDF(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, | |
| 21 | 
             
                    TOKEN_LIMIT_PER_FRAGMENT = 2500
         | 
| 22 |  | 
| 23 | 
             
                    from .crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 24 | 
            -
                    from  | 
| 25 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 26 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 27 | 
             
                    paper_fragments = breakdown_txt_to_satisfy_token_limit_for_pdf(
         | 
| @@ -119,7 +119,7 @@ def 批量总结PDF文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst | |
| 119 | 
             
                try:
         | 
| 120 | 
             
                    import fitz
         | 
| 121 | 
             
                except:
         | 
| 122 | 
            -
                     | 
| 123 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 124 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pymupdf```。")
         | 
| 125 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -133,7 +133,7 @@ def 批量总结PDF文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst | |
| 133 | 
             
                    project_folder = txt
         | 
| 134 | 
             
                else:
         | 
| 135 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 136 | 
            -
                     | 
| 137 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 138 | 
             
                    return
         | 
| 139 |  | 
| @@ -142,7 +142,7 @@ def 批量总结PDF文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst | |
| 142 |  | 
| 143 | 
             
                # 如果没找到任何文件
         | 
| 144 | 
             
                if len(file_manifest) == 0:
         | 
| 145 | 
            -
                     | 
| 146 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 147 | 
             
                    return
         | 
| 148 |  | 
|  | |
| 1 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone, gen_time_str
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 | 
             
            from .crazy_utils import read_and_clean_pdf_text
         | 
|  | |
| 21 | 
             
                    TOKEN_LIMIT_PER_FRAGMENT = 2500
         | 
| 22 |  | 
| 23 | 
             
                    from .crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 24 | 
            +
                    from request_llms.bridge_all import model_info
         | 
| 25 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 26 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 27 | 
             
                    paper_fragments = breakdown_txt_to_satisfy_token_limit_for_pdf(
         | 
|  | |
| 119 | 
             
                try:
         | 
| 120 | 
             
                    import fitz
         | 
| 121 | 
             
                except:
         | 
| 122 | 
            +
                    report_exception(chatbot, history, 
         | 
| 123 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 124 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pymupdf```。")
         | 
| 125 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 133 | 
             
                    project_folder = txt
         | 
| 134 | 
             
                else:
         | 
| 135 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 136 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 137 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 138 | 
             
                    return
         | 
| 139 |  | 
|  | |
| 142 |  | 
| 143 | 
             
                # 如果没找到任何文件
         | 
| 144 | 
             
                if len(file_manifest) == 0:
         | 
| 145 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex或.pdf文件: {txt}")
         | 
| 146 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 147 | 
             
                    return
         | 
| 148 |  | 
    	
        crazy_functions/批量总结PDF文档pdfminer.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 4 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 5 |  | 
| @@ -138,7 +138,7 @@ def 批量总结PDF文档pdfminer(txt, llm_kwargs, plugin_kwargs, chatbot, histo | |
| 138 | 
             
                try:
         | 
| 139 | 
             
                    import pdfminer, bs4
         | 
| 140 | 
             
                except:
         | 
| 141 | 
            -
                     | 
| 142 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 143 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pdfminer beautifulsoup4```。")
         | 
| 144 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -147,7 +147,7 @@ def 批量总结PDF文档pdfminer(txt, llm_kwargs, plugin_kwargs, chatbot, histo | |
| 147 | 
             
                    project_folder = txt
         | 
| 148 | 
             
                else:
         | 
| 149 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 150 | 
            -
                     | 
| 151 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 152 | 
             
                    return
         | 
| 153 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)] + \
         | 
| @@ -155,7 +155,7 @@ def 批量总结PDF文档pdfminer(txt, llm_kwargs, plugin_kwargs, chatbot, histo | |
| 155 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.cpp', recursive=True)] + \
         | 
| 156 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.c', recursive=True)]
         | 
| 157 | 
             
                if len(file_manifest) == 0:
         | 
| 158 | 
            -
                     | 
| 159 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 160 | 
             
                    return
         | 
| 161 | 
             
                yield from 解析Paper(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception
         | 
| 3 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 4 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 5 |  | 
|  | |
| 138 | 
             
                try:
         | 
| 139 | 
             
                    import pdfminer, bs4
         | 
| 140 | 
             
                except:
         | 
| 141 | 
            +
                    report_exception(chatbot, history, 
         | 
| 142 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 143 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pdfminer beautifulsoup4```。")
         | 
| 144 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 147 | 
             
                    project_folder = txt
         | 
| 148 | 
             
                else:
         | 
| 149 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 150 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 151 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 152 | 
             
                    return
         | 
| 153 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)] + \
         | 
|  | |
| 155 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.cpp', recursive=True)] + \
         | 
| 156 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.c', recursive=True)]
         | 
| 157 | 
             
                if len(file_manifest) == 0:
         | 
| 158 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex或pdf文件: {txt}")
         | 
| 159 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 160 | 
             
                    return
         | 
| 161 | 
             
                yield from 解析Paper(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
    	
        crazy_functions/批量翻译PDF文档_NOUGAT.py
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            from toolbox import CatchException,  | 
| 2 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone, update_ui_lastest_msg, disable_auto_promotion
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| @@ -57,30 +57,35 @@ def 批量翻译PDF文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst | |
| 57 | 
             
                    "批量翻译PDF文档。函数插件贡献者: Binary-Husky"])
         | 
| 58 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 59 |  | 
| 60 | 
            -
                # 尝试导入依赖,如果缺少依赖,则给出安装建议
         | 
| 61 | 
            -
                try:
         | 
| 62 | 
            -
                    import nougat
         | 
| 63 | 
            -
                    import tiktoken
         | 
| 64 | 
            -
                except:
         | 
| 65 | 
            -
                    report_execption(chatbot, history,
         | 
| 66 | 
            -
                                     a=f"解析项目: {txt}",
         | 
| 67 | 
            -
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade nougat-ocr tiktoken```。")
         | 
| 68 | 
            -
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 69 | 
            -
                    return
         | 
| 70 | 
            -
             | 
| 71 | 
             
                # 清空历史,以免输入溢出
         | 
| 72 | 
             
                history = []
         | 
| 73 |  | 
| 74 | 
             
                from .crazy_utils import get_files_from_everything
         | 
| 75 | 
             
                success, file_manifest, project_folder = get_files_from_everything(txt, type='.pdf')
         | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 76 | 
             
                # 检测输入参数,如没有给定输入参数,直接退出
         | 
| 77 | 
             
                if not success:
         | 
| 78 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 79 |  | 
| 80 | 
             
                # 如果没找到任何文件
         | 
| 81 | 
             
                if len(file_manifest) == 0:
         | 
| 82 | 
            -
                     | 
| 83 | 
            -
                                     a=f"解析项目: {txt}", b=f"找不到任何. | 
| 84 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 85 | 
             
                    return
         | 
| 86 |  | 
| @@ -97,12 +102,17 @@ def 解析PDF_基于NOUGAT(file_manifest, project_folder, llm_kwargs, plugin_kwa | |
| 97 | 
             
                generated_conclusion_files = []
         | 
| 98 | 
             
                generated_html_files = []
         | 
| 99 | 
             
                DST_LANG = "中文"
         | 
| 100 | 
            -
                from crazy_functions.crazy_utils import nougat_interface | 
|  | |
| 101 | 
             
                nougat_handle = nougat_interface()
         | 
| 102 | 
             
                for index, fp in enumerate(file_manifest):
         | 
| 103 | 
            -
                     | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
| 106 | 
             
                    with open(fpp, 'r', encoding='utf8') as f:
         | 
| 107 | 
             
                        article_content = f.readlines()
         | 
| 108 | 
             
                    article_dict = markdown_to_dict(article_content)
         | 
|  | |
| 1 | 
            +
            from toolbox import CatchException, report_exception, get_log_folder, gen_time_str
         | 
| 2 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone, update_ui_lastest_msg, disable_auto_promotion
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
|  | |
| 57 | 
             
                    "批量翻译PDF文档。函数插件贡献者: Binary-Husky"])
         | 
| 58 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 59 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 60 | 
             
                # 清空历史,以免输入溢出
         | 
| 61 | 
             
                history = []
         | 
| 62 |  | 
| 63 | 
             
                from .crazy_utils import get_files_from_everything
         | 
| 64 | 
             
                success, file_manifest, project_folder = get_files_from_everything(txt, type='.pdf')
         | 
| 65 | 
            +
                if len(file_manifest) > 0:
         | 
| 66 | 
            +
                    # 尝试导入依赖,如果缺少依赖,则给出安装建议
         | 
| 67 | 
            +
                    try:
         | 
| 68 | 
            +
                        import nougat
         | 
| 69 | 
            +
                        import tiktoken
         | 
| 70 | 
            +
                    except:
         | 
| 71 | 
            +
                        report_exception(chatbot, history,
         | 
| 72 | 
            +
                                         a=f"解析项目: {txt}",
         | 
| 73 | 
            +
                                         b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade nougat-ocr tiktoken```。")
         | 
| 74 | 
            +
                        yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 75 | 
            +
                        return
         | 
| 76 | 
            +
                success_mmd, file_manifest_mmd, _ = get_files_from_everything(txt, type='.mmd')
         | 
| 77 | 
            +
                success = success or success_mmd
         | 
| 78 | 
            +
                file_manifest += file_manifest_mmd
         | 
| 79 | 
            +
                chatbot.append(["文件列表:", ", ".join([e.split('/')[-1] for e in file_manifest])]); 
         | 
| 80 | 
            +
                yield from update_ui(      chatbot=chatbot, history=history) 
         | 
| 81 | 
             
                # 检测输入参数,如没有给定输入参数,直接退出
         | 
| 82 | 
             
                if not success:
         | 
| 83 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 84 |  | 
| 85 | 
             
                # 如果没找到任何文件
         | 
| 86 | 
             
                if len(file_manifest) == 0:
         | 
| 87 | 
            +
                    report_exception(chatbot, history,
         | 
| 88 | 
            +
                                     a=f"解析项目: {txt}", b=f"找不到任何.pdf拓展名的文件: {txt}")
         | 
| 89 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 90 | 
             
                    return
         | 
| 91 |  | 
|  | |
| 102 | 
             
                generated_conclusion_files = []
         | 
| 103 | 
             
                generated_html_files = []
         | 
| 104 | 
             
                DST_LANG = "中文"
         | 
| 105 | 
            +
                from crazy_functions.crazy_utils import nougat_interface
         | 
| 106 | 
            +
                from crazy_functions.pdf_fns.report_gen_html import construct_html
         | 
| 107 | 
             
                nougat_handle = nougat_interface()
         | 
| 108 | 
             
                for index, fp in enumerate(file_manifest):
         | 
| 109 | 
            +
                    if fp.endswith('pdf'):
         | 
| 110 | 
            +
                        chatbot.append(["当前进度:", f"正在解析论文,请稍候。(第一次运行时,需要花费较长时间下载NOUGAT参数)"]); yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 111 | 
            +
                        fpp = yield from nougat_handle.NOUGAT_parse_pdf(fp, chatbot, history)
         | 
| 112 | 
            +
                        promote_file_to_downloadzone(fpp, rename_file=os.path.basename(fpp)+'.nougat.mmd', chatbot=chatbot)
         | 
| 113 | 
            +
                    else:
         | 
| 114 | 
            +
                        chatbot.append(["当前论文无需解析:", fp]); yield from update_ui(      chatbot=chatbot, history=history)
         | 
| 115 | 
            +
                        fpp = fp
         | 
| 116 | 
             
                    with open(fpp, 'r', encoding='utf8') as f:
         | 
| 117 | 
             
                        article_content = f.readlines()
         | 
| 118 | 
             
                    article_dict = markdown_to_dict(article_content)
         | 
    	
        crazy_functions/批量翻译PDF文档_多线程.py
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            from toolbox import CatchException,  | 
| 2 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone, update_ui_lastest_msg, disable_auto_promotion
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| @@ -6,9 +6,8 @@ from .crazy_utils import request_gpt_model_multi_threads_with_very_awesome_ui_an | |
| 6 | 
             
            from .crazy_utils import read_and_clean_pdf_text
         | 
| 7 | 
             
            from .pdf_fns.parse_pdf import parse_pdf, get_avail_grobid_url, translate_pdf
         | 
| 8 | 
             
            from colorful import *
         | 
| 9 | 
            -
            import copy
         | 
| 10 | 
             
            import os
         | 
| 11 | 
            -
             | 
| 12 |  | 
| 13 | 
             
            @CatchException
         | 
| 14 | 
             
            def 批量翻译PDF文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
         | 
| @@ -22,11 +21,9 @@ def 批量翻译PDF文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst | |
| 22 |  | 
| 23 | 
             
                # 尝试导入依赖,如果缺少依赖,则给出安装建议
         | 
| 24 | 
             
                try:
         | 
| 25 | 
            -
                     | 
| 26 | 
            -
                    import tiktoken
         | 
| 27 | 
            -
                    import scipdf
         | 
| 28 | 
             
                except:
         | 
| 29 | 
            -
                     | 
| 30 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 31 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pymupdf tiktoken scipdf_parser```。")
         | 
| 32 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -43,8 +40,8 @@ def 批量翻译PDF文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst | |
| 43 |  | 
| 44 | 
             
                # 如果没找到任何文件
         | 
| 45 | 
             
                if len(file_manifest) == 0:
         | 
| 46 | 
            -
                     | 
| 47 | 
            -
                                     a=f"解析项目: {txt}", b=f"找不到任何. | 
| 48 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 49 | 
             
                    return
         | 
| 50 |  | 
| @@ -63,7 +60,7 @@ def 解析PDF_基于GROBID(file_manifest, project_folder, llm_kwargs, plugin_kwa | |
| 63 | 
             
                generated_conclusion_files = []
         | 
| 64 | 
             
                generated_html_files = []
         | 
| 65 | 
             
                DST_LANG = "中文"
         | 
| 66 | 
            -
                from crazy_functions. | 
| 67 | 
             
                for index, fp in enumerate(file_manifest):
         | 
| 68 | 
             
                    chatbot.append(["当前进度:", f"正在连接GROBID服务,请稍候: {grobid_url}\n如果等待时间过长,请修改config中的GROBID_URL,可修改成本地GROBID服务。"]); yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 69 | 
             
                    article_dict = parse_pdf(fp, grobid_url)
         | 
| @@ -86,7 +83,7 @@ def 解析PDF(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, | |
| 86 | 
             
                TOKEN_LIMIT_PER_FRAGMENT = 1024
         | 
| 87 | 
             
                generated_conclusion_files = []
         | 
| 88 | 
             
                generated_html_files = []
         | 
| 89 | 
            -
                from crazy_functions. | 
| 90 | 
             
                for index, fp in enumerate(file_manifest):
         | 
| 91 | 
             
                    # 读取PDF文件
         | 
| 92 | 
             
                    file_content, page_one = read_and_clean_pdf_text(fp)
         | 
| @@ -95,7 +92,7 @@ def 解析PDF(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, | |
| 95 |  | 
| 96 | 
             
                    # 递归地切割PDF文件
         | 
| 97 | 
             
                    from .crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 98 | 
            -
                    from  | 
| 99 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 100 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 101 | 
             
                    paper_fragments = breakdown_txt_to_satisfy_token_limit_for_pdf(
         | 
|  | |
| 1 | 
            +
            from toolbox import CatchException, report_exception, get_log_folder, gen_time_str, check_packages
         | 
| 2 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone, update_ui_lastest_msg, disable_auto_promotion
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
|  | |
| 6 | 
             
            from .crazy_utils import read_and_clean_pdf_text
         | 
| 7 | 
             
            from .pdf_fns.parse_pdf import parse_pdf, get_avail_grobid_url, translate_pdf
         | 
| 8 | 
             
            from colorful import *
         | 
|  | |
| 9 | 
             
            import os
         | 
| 10 | 
            +
             | 
| 11 |  | 
| 12 | 
             
            @CatchException
         | 
| 13 | 
             
            def 批量翻译PDF文档(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, web_port):
         | 
|  | |
| 21 |  | 
| 22 | 
             
                # 尝试导入依赖,如果缺少依赖,则给出安装建议
         | 
| 23 | 
             
                try:
         | 
| 24 | 
            +
                    check_packages(["fitz", "tiktoken", "scipdf"])
         | 
|  | |
|  | |
| 25 | 
             
                except:
         | 
| 26 | 
            +
                    report_exception(chatbot, history,
         | 
| 27 | 
             
                                     a=f"解析项目: {txt}",
         | 
| 28 | 
             
                                     b=f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pymupdf tiktoken scipdf_parser```。")
         | 
| 29 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 40 |  | 
| 41 | 
             
                # 如果没找到任何文件
         | 
| 42 | 
             
                if len(file_manifest) == 0:
         | 
| 43 | 
            +
                    report_exception(chatbot, history,
         | 
| 44 | 
            +
                                     a=f"解析项目: {txt}", b=f"找不到任何.pdf拓展名的文件: {txt}")
         | 
| 45 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 46 | 
             
                    return
         | 
| 47 |  | 
|  | |
| 60 | 
             
                generated_conclusion_files = []
         | 
| 61 | 
             
                generated_html_files = []
         | 
| 62 | 
             
                DST_LANG = "中文"
         | 
| 63 | 
            +
                from crazy_functions.pdf_fns.report_gen_html import construct_html
         | 
| 64 | 
             
                for index, fp in enumerate(file_manifest):
         | 
| 65 | 
             
                    chatbot.append(["当前进度:", f"正在连接GROBID服务,请稍候: {grobid_url}\n如果等待时间过长,请修改config中的GROBID_URL,可修改成本地GROBID服务。"]); yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 66 | 
             
                    article_dict = parse_pdf(fp, grobid_url)
         | 
|  | |
| 83 | 
             
                TOKEN_LIMIT_PER_FRAGMENT = 1024
         | 
| 84 | 
             
                generated_conclusion_files = []
         | 
| 85 | 
             
                generated_html_files = []
         | 
| 86 | 
            +
                from crazy_functions.pdf_fns.report_gen_html import construct_html
         | 
| 87 | 
             
                for index, fp in enumerate(file_manifest):
         | 
| 88 | 
             
                    # 读取PDF文件
         | 
| 89 | 
             
                    file_content, page_one = read_and_clean_pdf_text(fp)
         | 
|  | |
| 92 |  | 
| 93 | 
             
                    # 递归地切割PDF文件
         | 
| 94 | 
             
                    from .crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 95 | 
            +
                    from request_llms.bridge_all import model_info
         | 
| 96 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 97 | 
             
                    def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 98 | 
             
                    paper_fragments = breakdown_txt_to_satisfy_token_limit_for_pdf(
         | 
    	
        crazy_functions/理解PDF文档内容.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from .crazy_utils import read_and_clean_pdf_text
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 | 
             
            fast_debug = False
         | 
| @@ -19,7 +19,7 @@ def 解析PDF(file_name, llm_kwargs, plugin_kwargs, chatbot, history, system_pro | |
| 19 | 
             
                TOKEN_LIMIT_PER_FRAGMENT = 2500
         | 
| 20 |  | 
| 21 | 
             
                from .crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 22 | 
            -
                from  | 
| 23 | 
             
                enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 24 | 
             
                def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 25 | 
             
                paper_fragments = breakdown_txt_to_satisfy_token_limit_for_pdf(
         | 
| @@ -49,7 +49,7 @@ def 解析PDF(file_name, llm_kwargs, plugin_kwargs, chatbot, history, system_pro | |
| 49 | 
             
                    gpt_say = yield from request_gpt_model_in_new_thread_with_ui_alive(i_say, i_say_show_user,  # i_say=真正给chatgpt的提问, i_say_show_user=给用户看的提问
         | 
| 50 | 
             
                                                                                       llm_kwargs, chatbot, 
         | 
| 51 | 
             
                                                                                       history=["The main idea of the previous section is?", last_iteration_result], # 迭代上一次的结果
         | 
| 52 | 
            -
                                                                                       sys_prompt="Extract the main idea of this section."  # 提示
         | 
| 53 | 
             
                                                                                    ) 
         | 
| 54 | 
             
                    iteration_results.append(gpt_say)
         | 
| 55 | 
             
                    last_iteration_result = gpt_say
         | 
| @@ -81,7 +81,7 @@ def 理解PDF文档内容标准文件输入(txt, llm_kwargs, plugin_kwargs, chat | |
| 81 | 
             
                try:
         | 
| 82 | 
             
                    import fitz
         | 
| 83 | 
             
                except:
         | 
| 84 | 
            -
                     | 
| 85 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 86 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pymupdf```。")
         | 
| 87 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| @@ -96,7 +96,7 @@ def 理解PDF文档内容标准文件输入(txt, llm_kwargs, plugin_kwargs, chat | |
| 96 | 
             
                else:
         | 
| 97 | 
             
                    if txt == "":
         | 
| 98 | 
             
                        txt = '空空如也的输入栏'
         | 
| 99 | 
            -
                     | 
| 100 | 
             
                                     a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 101 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 102 | 
             
                    return
         | 
| @@ -105,7 +105,7 @@ def 理解PDF文档内容标准文件输入(txt, llm_kwargs, plugin_kwargs, chat | |
| 105 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.pdf', recursive=True)]
         | 
| 106 | 
             
                # 如果没找到任何文件
         | 
| 107 | 
             
                if len(file_manifest) == 0:
         | 
| 108 | 
            -
                     | 
| 109 | 
             
                                     a=f"解析项目: {txt}", b=f"找不到任何.tex或.pdf文件: {txt}")
         | 
| 110 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 111 | 
             
                    return
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception
         | 
| 3 | 
             
            from .crazy_utils import read_and_clean_pdf_text
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 | 
             
            fast_debug = False
         | 
|  | |
| 19 | 
             
                TOKEN_LIMIT_PER_FRAGMENT = 2500
         | 
| 20 |  | 
| 21 | 
             
                from .crazy_utils import breakdown_txt_to_satisfy_token_limit_for_pdf
         | 
| 22 | 
            +
                from request_llms.bridge_all import model_info
         | 
| 23 | 
             
                enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 24 | 
             
                def get_token_num(txt): return len(enc.encode(txt, disallowed_special=()))
         | 
| 25 | 
             
                paper_fragments = breakdown_txt_to_satisfy_token_limit_for_pdf(
         | 
|  | |
| 49 | 
             
                    gpt_say = yield from request_gpt_model_in_new_thread_with_ui_alive(i_say, i_say_show_user,  # i_say=真正给chatgpt的提问, i_say_show_user=给用户看的提问
         | 
| 50 | 
             
                                                                                       llm_kwargs, chatbot, 
         | 
| 51 | 
             
                                                                                       history=["The main idea of the previous section is?", last_iteration_result], # 迭代上一次的结果
         | 
| 52 | 
            +
                                                                                       sys_prompt="Extract the main idea of this section, answer me with Chinese."  # 提示
         | 
| 53 | 
             
                                                                                    ) 
         | 
| 54 | 
             
                    iteration_results.append(gpt_say)
         | 
| 55 | 
             
                    last_iteration_result = gpt_say
         | 
|  | |
| 81 | 
             
                try:
         | 
| 82 | 
             
                    import fitz
         | 
| 83 | 
             
                except:
         | 
| 84 | 
            +
                    report_exception(chatbot, history, 
         | 
| 85 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 86 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade pymupdf```。")
         | 
| 87 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 96 | 
             
                else:
         | 
| 97 | 
             
                    if txt == "":
         | 
| 98 | 
             
                        txt = '空空如也的输入栏'
         | 
| 99 | 
            +
                    report_exception(chatbot, history,
         | 
| 100 | 
             
                                     a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 101 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 102 | 
             
                    return
         | 
|  | |
| 105 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.pdf', recursive=True)]
         | 
| 106 | 
             
                # 如果没找到任何文件
         | 
| 107 | 
             
                if len(file_manifest) == 0:
         | 
| 108 | 
            +
                    report_exception(chatbot, history,
         | 
| 109 | 
             
                                     a=f"解析项目: {txt}", b=f"找不到任何.tex或.pdf文件: {txt}")
         | 
| 110 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 111 | 
             
                    return
         | 
    	
        crazy_functions/生成函数注释.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 | 
             
            fast_debug = False
         | 
| @@ -43,14 +43,14 @@ def 批量生成函数注释(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 43 | 
             
                    project_folder = txt
         | 
| 44 | 
             
                else:
         | 
| 45 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 46 | 
            -
                     | 
| 47 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 48 | 
             
                    return
         | 
| 49 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.py', recursive=True)] + \
         | 
| 50 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.cpp', recursive=True)]
         | 
| 51 |  | 
| 52 | 
             
                if len(file_manifest) == 0:
         | 
| 53 | 
            -
                     | 
| 54 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 55 | 
             
                    return
         | 
| 56 | 
             
                yield from 生成函数注释(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 | 
             
            fast_debug = False
         | 
|  | |
| 43 | 
             
                    project_folder = txt
         | 
| 44 | 
             
                else:
         | 
| 45 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 46 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 47 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 48 | 
             
                    return
         | 
| 49 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.py', recursive=True)] + \
         | 
| 50 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.cpp', recursive=True)]
         | 
| 51 |  | 
| 52 | 
             
                if len(file_manifest) == 0:
         | 
| 53 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex文件: {txt}")
         | 
| 54 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 55 | 
             
                    return
         | 
| 56 | 
             
                yield from 生成函数注释(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
    	
        crazy_functions/联网的ChatGPT.py
    CHANGED
    
    | @@ -2,7 +2,7 @@ from toolbox import CatchException, update_ui | |
| 2 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive, input_clipping
         | 
| 3 | 
             
            import requests
         | 
| 4 | 
             
            from bs4 import BeautifulSoup
         | 
| 5 | 
            -
            from  | 
| 6 |  | 
| 7 | 
             
            def google(query, proxies):
         | 
| 8 | 
             
                query = query # 在此处替换您要搜索的关键词
         | 
| @@ -72,7 +72,7 @@ def 连接网络回答问题(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 72 |  | 
| 73 | 
             
                # ------------- < 第1步:爬取搜索引擎的结果 > -------------
         | 
| 74 | 
             
                from toolbox import get_conf
         | 
| 75 | 
            -
                proxies | 
| 76 | 
             
                urls = google(txt, proxies)
         | 
| 77 | 
             
                history = []
         | 
| 78 | 
             
                if len(urls) == 0:
         | 
|  | |
| 2 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive, input_clipping
         | 
| 3 | 
             
            import requests
         | 
| 4 | 
             
            from bs4 import BeautifulSoup
         | 
| 5 | 
            +
            from request_llms.bridge_all import model_info
         | 
| 6 |  | 
| 7 | 
             
            def google(query, proxies):
         | 
| 8 | 
             
                query = query # 在此处替换您要搜索的关键词
         | 
|  | |
| 72 |  | 
| 73 | 
             
                # ------------- < 第1步:爬取搜索引擎的结果 > -------------
         | 
| 74 | 
             
                from toolbox import get_conf
         | 
| 75 | 
            +
                proxies = get_conf('proxies')
         | 
| 76 | 
             
                urls = google(txt, proxies)
         | 
| 77 | 
             
                history = []
         | 
| 78 | 
             
                if len(urls) == 0:
         | 
    	
        crazy_functions/联网的ChatGPT_bing版.py
    CHANGED
    
    | @@ -2,7 +2,7 @@ from toolbox import CatchException, update_ui | |
| 2 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive, input_clipping
         | 
| 3 | 
             
            import requests
         | 
| 4 | 
             
            from bs4 import BeautifulSoup
         | 
| 5 | 
            -
            from  | 
| 6 |  | 
| 7 |  | 
| 8 | 
             
            def bing_search(query, proxies=None):
         | 
| @@ -72,7 +72,7 @@ def 连接bing搜索回答问题(txt, llm_kwargs, plugin_kwargs, chatbot, histor | |
| 72 |  | 
| 73 | 
             
                # ------------- < 第1步:爬取搜索引擎的结果 > -------------
         | 
| 74 | 
             
                from toolbox import get_conf
         | 
| 75 | 
            -
                proxies | 
| 76 | 
             
                urls = bing_search(txt, proxies)
         | 
| 77 | 
             
                history = []
         | 
| 78 | 
             
                if len(urls) == 0:
         | 
|  | |
| 2 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive, input_clipping
         | 
| 3 | 
             
            import requests
         | 
| 4 | 
             
            from bs4 import BeautifulSoup
         | 
| 5 | 
            +
            from request_llms.bridge_all import model_info
         | 
| 6 |  | 
| 7 |  | 
| 8 | 
             
            def bing_search(query, proxies=None):
         | 
|  | |
| 72 |  | 
| 73 | 
             
                # ------------- < 第1步:爬取搜索引擎的结果 > -------------
         | 
| 74 | 
             
                from toolbox import get_conf
         | 
| 75 | 
            +
                proxies = get_conf('proxies')
         | 
| 76 | 
             
                urls = bing_search(txt, proxies)
         | 
| 77 | 
             
                history = []
         | 
| 78 | 
             
                if len(urls) == 0:
         | 
    	
        crazy_functions/虚空终端.py
    CHANGED
    
    | @@ -48,7 +48,7 @@ from pydantic import BaseModel, Field | |
| 48 | 
             
            from typing import List
         | 
| 49 | 
             
            from toolbox import CatchException, update_ui, is_the_upload_folder
         | 
| 50 | 
             
            from toolbox import update_ui_lastest_msg, disable_auto_promotion
         | 
| 51 | 
            -
            from  | 
| 52 | 
             
            from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 53 | 
             
            from crazy_functions.crazy_utils import input_clipping
         | 
| 54 | 
             
            from crazy_functions.json_fns.pydantic_io import GptJsonIO, JsonStringError
         | 
|  | |
| 48 | 
             
            from typing import List
         | 
| 49 | 
             
            from toolbox import CatchException, update_ui, is_the_upload_folder
         | 
| 50 | 
             
            from toolbox import update_ui_lastest_msg, disable_auto_promotion
         | 
| 51 | 
            +
            from request_llms.bridge_all import predict_no_ui_long_connection
         | 
| 52 | 
             
            from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 53 | 
             
            from crazy_functions.crazy_utils import input_clipping
         | 
| 54 | 
             
            from crazy_functions.json_fns.pydantic_io import GptJsonIO, JsonStringError
         | 
    	
        crazy_functions/解析JupyterNotebook.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            fast_debug = True
         | 
| 5 |  | 
| @@ -13,7 +13,7 @@ class PaperFileGroup(): | |
| 13 | 
             
                    self.sp_file_tag = []
         | 
| 14 |  | 
| 15 | 
             
                    # count_token
         | 
| 16 | 
            -
                    from  | 
| 17 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 18 | 
             
                    def get_token_num(txt): return len(
         | 
| 19 | 
             
                        enc.encode(txt, disallowed_special=()))
         | 
| @@ -131,7 +131,7 @@ def 解析ipynb文件(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 131 | 
             
                else:
         | 
| 132 | 
             
                    if txt == "":
         | 
| 133 | 
             
                        txt = '空空如也的输入栏'
         | 
| 134 | 
            -
                     | 
| 135 | 
             
                                     a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 136 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 137 | 
             
                    return
         | 
| @@ -141,7 +141,7 @@ def 解析ipynb文件(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_p | |
| 141 | 
             
                    file_manifest = [f for f in glob.glob(
         | 
| 142 | 
             
                        f'{project_folder}/**/*.ipynb', recursive=True)]
         | 
| 143 | 
             
                if len(file_manifest) == 0:
         | 
| 144 | 
            -
                     | 
| 145 | 
             
                                     a=f"解析项目: {txt}", b=f"找不到任何.ipynb文件: {txt}")
         | 
| 146 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 147 | 
             
                    return
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            fast_debug = True
         | 
| 5 |  | 
|  | |
| 13 | 
             
                    self.sp_file_tag = []
         | 
| 14 |  | 
| 15 | 
             
                    # count_token
         | 
| 16 | 
            +
                    from request_llms.bridge_all import model_info
         | 
| 17 | 
             
                    enc = model_info["gpt-3.5-turbo"]['tokenizer']
         | 
| 18 | 
             
                    def get_token_num(txt): return len(
         | 
| 19 | 
             
                        enc.encode(txt, disallowed_special=()))
         | 
|  | |
| 131 | 
             
                else:
         | 
| 132 | 
             
                    if txt == "":
         | 
| 133 | 
             
                        txt = '空空如也的输入栏'
         | 
| 134 | 
            +
                    report_exception(chatbot, history,
         | 
| 135 | 
             
                                     a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 136 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 137 | 
             
                    return
         | 
|  | |
| 141 | 
             
                    file_manifest = [f for f in glob.glob(
         | 
| 142 | 
             
                        f'{project_folder}/**/*.ipynb', recursive=True)]
         | 
| 143 | 
             
                if len(file_manifest) == 0:
         | 
| 144 | 
            +
                    report_exception(chatbot, history,
         | 
| 145 | 
             
                                     a=f"解析项目: {txt}", b=f"找不到任何.ipynb文件: {txt}")
         | 
| 146 | 
             
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 147 | 
             
                    return
         | 
    	
        crazy_functions/解析项目源代码.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone, disable_auto_promotion
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from .crazy_utils import input_clipping
         | 
| 4 |  | 
| 5 | 
             
            def 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt):
         | 
| @@ -113,7 +113,7 @@ def 解析项目本身(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_ | |
| 113 | 
             
                                [f for f in glob.glob('./*/*.py')]
         | 
| 114 | 
             
                project_folder = './'
         | 
| 115 | 
             
                if len(file_manifest) == 0:
         | 
| 116 | 
            -
                     | 
| 117 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 118 | 
             
                    return
         | 
| 119 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -126,12 +126,12 @@ def 解析一个Python项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 126 | 
             
                    project_folder = txt
         | 
| 127 | 
             
                else:
         | 
| 128 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 129 | 
            -
                     | 
| 130 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 131 | 
             
                    return
         | 
| 132 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.py', recursive=True)]
         | 
| 133 | 
             
                if len(file_manifest) == 0:
         | 
| 134 | 
            -
                     | 
| 135 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 136 | 
             
                    return
         | 
| 137 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -144,12 +144,12 @@ def 解析一个Matlab项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 144 | 
             
                    project_folder = txt
         | 
| 145 | 
             
                else:
         | 
| 146 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 147 | 
            -
                     | 
| 148 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 149 | 
             
                    return
         | 
| 150 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.m', recursive=True)]
         | 
| 151 | 
             
                if len(file_manifest) == 0:
         | 
| 152 | 
            -
                     | 
| 153 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 154 | 
             
                    return
         | 
| 155 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -162,14 +162,14 @@ def 解析一个C项目的头文件(txt, llm_kwargs, plugin_kwargs, chatbot, his | |
| 162 | 
             
                    project_folder = txt
         | 
| 163 | 
             
                else:
         | 
| 164 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 165 | 
            -
                     | 
| 166 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 167 | 
             
                    return
         | 
| 168 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.h', recursive=True)]  + \
         | 
| 169 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.hpp', recursive=True)] #+ \
         | 
| 170 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.c', recursive=True)]
         | 
| 171 | 
             
                if len(file_manifest) == 0:
         | 
| 172 | 
            -
                     | 
| 173 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 174 | 
             
                    return
         | 
| 175 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -182,7 +182,7 @@ def 解析一个C项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, system | |
| 182 | 
             
                    project_folder = txt
         | 
| 183 | 
             
                else:
         | 
| 184 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 185 | 
            -
                     | 
| 186 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 187 | 
             
                    return
         | 
| 188 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.h', recursive=True)]  + \
         | 
| @@ -190,7 +190,7 @@ def 解析一个C项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, system | |
| 190 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.hpp', recursive=True)] + \
         | 
| 191 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.c', recursive=True)]
         | 
| 192 | 
             
                if len(file_manifest) == 0:
         | 
| 193 | 
            -
                     | 
| 194 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 195 | 
             
                    return
         | 
| 196 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -204,7 +204,7 @@ def 解析一个Java项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, sys | |
| 204 | 
             
                    project_folder = txt
         | 
| 205 | 
             
                else:
         | 
| 206 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 207 | 
            -
                     | 
| 208 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 209 | 
             
                    return
         | 
| 210 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.java', recursive=True)] + \
         | 
| @@ -212,7 +212,7 @@ def 解析一个Java项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, sys | |
| 212 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.xml', recursive=True)] + \
         | 
| 213 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.sh', recursive=True)]
         | 
| 214 | 
             
                if len(file_manifest) == 0:
         | 
| 215 | 
            -
                     | 
| 216 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 217 | 
             
                    return
         | 
| 218 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -226,7 +226,7 @@ def 解析一个前端项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 226 | 
             
                    project_folder = txt
         | 
| 227 | 
             
                else:
         | 
| 228 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 229 | 
            -
                     | 
| 230 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 231 | 
             
                    return
         | 
| 232 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.ts', recursive=True)] + \
         | 
| @@ -241,7 +241,7 @@ def 解析一个前端项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 241 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.css', recursive=True)] + \
         | 
| 242 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.jsx', recursive=True)]
         | 
| 243 | 
             
                if len(file_manifest) == 0:
         | 
| 244 | 
            -
                     | 
| 245 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 246 | 
             
                    return
         | 
| 247 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -255,7 +255,7 @@ def 解析一个Golang项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 255 | 
             
                    project_folder = txt
         | 
| 256 | 
             
                else:
         | 
| 257 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 258 | 
            -
                     | 
| 259 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 260 | 
             
                    return
         | 
| 261 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.go', recursive=True)] + \
         | 
| @@ -263,7 +263,7 @@ def 解析一个Golang项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 263 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/go.sum', recursive=True)] + \
         | 
| 264 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/go.work', recursive=True)]
         | 
| 265 | 
             
                if len(file_manifest) == 0:
         | 
| 266 | 
            -
                     | 
| 267 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 268 | 
             
                    return
         | 
| 269 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -276,14 +276,14 @@ def 解析一个Rust项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, sys | |
| 276 | 
             
                    project_folder = txt
         | 
| 277 | 
             
                else:
         | 
| 278 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 279 | 
            -
                     | 
| 280 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 281 | 
             
                    return
         | 
| 282 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.rs', recursive=True)] + \
         | 
| 283 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.toml', recursive=True)] + \
         | 
| 284 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.lock', recursive=True)]
         | 
| 285 | 
             
                if len(file_manifest) == 0:
         | 
| 286 | 
            -
                     | 
| 287 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 288 | 
             
                    return
         | 
| 289 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -296,7 +296,7 @@ def 解析一个Lua项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst | |
| 296 | 
             
                    project_folder = txt
         | 
| 297 | 
             
                else:
         | 
| 298 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 299 | 
            -
                     | 
| 300 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 301 | 
             
                    return
         | 
| 302 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.lua', recursive=True)] + \
         | 
| @@ -304,7 +304,7 @@ def 解析一个Lua项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst | |
| 304 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.json', recursive=True)] + \
         | 
| 305 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.toml', recursive=True)]
         | 
| 306 | 
             
                if len(file_manifest) == 0:
         | 
| 307 | 
            -
                     | 
| 308 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 309 | 
             
                    return
         | 
| 310 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -318,13 +318,13 @@ def 解析一个CSharp项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, s | |
| 318 | 
             
                    project_folder = txt
         | 
| 319 | 
             
                else:
         | 
| 320 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 321 | 
            -
                     | 
| 322 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 323 | 
             
                    return
         | 
| 324 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.cs', recursive=True)] + \
         | 
| 325 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.csproj', recursive=True)]
         | 
| 326 | 
             
                if len(file_manifest) == 0:
         | 
| 327 | 
            -
                     | 
| 328 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 329 | 
             
                    return
         | 
| 330 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
| @@ -352,7 +352,7 @@ def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, sys | |
| 352 | 
             
                    project_folder = txt
         | 
| 353 | 
             
                else:
         | 
| 354 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 355 | 
            -
                     | 
| 356 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 357 | 
             
                    return
         | 
| 358 | 
             
                # 若上传压缩文件, 先寻找到解压的文件夹路径, 从而避免解析压缩文件
         | 
| @@ -365,7 +365,7 @@ def 解析任意code项目(txt, llm_kwargs, plugin_kwargs, chatbot, history, sys | |
| 365 | 
             
                file_manifest = [f for pattern in pattern_include for f in glob.glob(f'{extract_folder_path}/**/{pattern}', recursive=True) if "" != extract_folder_path and \
         | 
| 366 | 
             
                                  os.path.isfile(f) and (not re.search(pattern_except, f) or pattern.endswith('.' + re.search(pattern_except, f).group().split('.')[-1]))]
         | 
| 367 | 
             
                if len(file_manifest) == 0:
         | 
| 368 | 
            -
                     | 
| 369 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 370 | 
             
                    return
         | 
| 371 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui, promote_file_to_downloadzone, disable_auto_promotion
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception, write_history_to_file
         | 
| 3 | 
             
            from .crazy_utils import input_clipping
         | 
| 4 |  | 
| 5 | 
             
            def 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt):
         | 
|  | |
| 113 | 
             
                                [f for f in glob.glob('./*/*.py')]
         | 
| 114 | 
             
                project_folder = './'
         | 
| 115 | 
             
                if len(file_manifest) == 0:
         | 
| 116 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何python文件: {txt}")
         | 
| 117 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 118 | 
             
                    return
         | 
| 119 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 126 | 
             
                    project_folder = txt
         | 
| 127 | 
             
                else:
         | 
| 128 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 129 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 130 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 131 | 
             
                    return
         | 
| 132 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.py', recursive=True)]
         | 
| 133 | 
             
                if len(file_manifest) == 0:
         | 
| 134 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何python文件: {txt}")
         | 
| 135 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 136 | 
             
                    return
         | 
| 137 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 144 | 
             
                    project_folder = txt
         | 
| 145 | 
             
                else:
         | 
| 146 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 147 | 
            +
                    report_exception(chatbot, history, a = f"解析Matlab项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 148 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 149 | 
             
                    return
         | 
| 150 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.m', recursive=True)]
         | 
| 151 | 
             
                if len(file_manifest) == 0:
         | 
| 152 | 
            +
                    report_exception(chatbot, history, a = f"解析Matlab项目: {txt}", b = f"找不到任何`.m`源文件: {txt}")
         | 
| 153 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 154 | 
             
                    return
         | 
| 155 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 162 | 
             
                    project_folder = txt
         | 
| 163 | 
             
                else:
         | 
| 164 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 165 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 166 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 167 | 
             
                    return
         | 
| 168 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.h', recursive=True)]  + \
         | 
| 169 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.hpp', recursive=True)] #+ \
         | 
| 170 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.c', recursive=True)]
         | 
| 171 | 
             
                if len(file_manifest) == 0:
         | 
| 172 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.h头文件: {txt}")
         | 
| 173 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 174 | 
             
                    return
         | 
| 175 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 182 | 
             
                    project_folder = txt
         | 
| 183 | 
             
                else:
         | 
| 184 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 185 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 186 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 187 | 
             
                    return
         | 
| 188 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.h', recursive=True)]  + \
         | 
|  | |
| 190 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.hpp', recursive=True)] + \
         | 
| 191 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.c', recursive=True)]
         | 
| 192 | 
             
                if len(file_manifest) == 0:
         | 
| 193 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.h头文件: {txt}")
         | 
| 194 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 195 | 
             
                    return
         | 
| 196 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 204 | 
             
                    project_folder = txt
         | 
| 205 | 
             
                else:
         | 
| 206 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 207 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 208 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 209 | 
             
                    return
         | 
| 210 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.java', recursive=True)] + \
         | 
|  | |
| 212 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.xml', recursive=True)] + \
         | 
| 213 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.sh', recursive=True)]
         | 
| 214 | 
             
                if len(file_manifest) == 0:
         | 
| 215 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到任何java文件: {txt}")
         | 
| 216 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 217 | 
             
                    return
         | 
| 218 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 226 | 
             
                    project_folder = txt
         | 
| 227 | 
             
                else:
         | 
| 228 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 229 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 230 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 231 | 
             
                    return
         | 
| 232 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.ts', recursive=True)] + \
         | 
|  | |
| 241 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.css', recursive=True)] + \
         | 
| 242 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.jsx', recursive=True)]
         | 
| 243 | 
             
                if len(file_manifest) == 0:
         | 
| 244 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到任何前端相关文件: {txt}")
         | 
| 245 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 246 | 
             
                    return
         | 
| 247 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 255 | 
             
                    project_folder = txt
         | 
| 256 | 
             
                else:
         | 
| 257 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 258 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 259 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 260 | 
             
                    return
         | 
| 261 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.go', recursive=True)] + \
         | 
|  | |
| 263 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/go.sum', recursive=True)] + \
         | 
| 264 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/go.work', recursive=True)]
         | 
| 265 | 
             
                if len(file_manifest) == 0:
         | 
| 266 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到任何golang文件: {txt}")
         | 
| 267 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 268 | 
             
                    return
         | 
| 269 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 276 | 
             
                    project_folder = txt
         | 
| 277 | 
             
                else:
         | 
| 278 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 279 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到本地项目或无权访问: {txt}")
         | 
| 280 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 281 | 
             
                    return
         | 
| 282 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.rs', recursive=True)] + \
         | 
| 283 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.toml', recursive=True)] + \
         | 
| 284 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.lock', recursive=True)]
         | 
| 285 | 
             
                if len(file_manifest) == 0:
         | 
| 286 | 
            +
                    report_exception(chatbot, history, a=f"解析项目: {txt}", b=f"找不到任何golang文件: {txt}")
         | 
| 287 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 288 | 
             
                    return
         | 
| 289 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 296 | 
             
                    project_folder = txt
         | 
| 297 | 
             
                else:
         | 
| 298 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 299 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 300 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 301 | 
             
                    return
         | 
| 302 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.lua', recursive=True)] + \
         | 
|  | |
| 304 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.json', recursive=True)] + \
         | 
| 305 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.toml', recursive=True)]
         | 
| 306 | 
             
                if len(file_manifest) == 0:
         | 
| 307 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何lua文件: {txt}")
         | 
| 308 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 309 | 
             
                    return
         | 
| 310 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 318 | 
             
                    project_folder = txt
         | 
| 319 | 
             
                else:
         | 
| 320 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 321 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 322 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 323 | 
             
                    return
         | 
| 324 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.cs', recursive=True)] + \
         | 
| 325 | 
             
                                [f for f in glob.glob(f'{project_folder}/**/*.csproj', recursive=True)]
         | 
| 326 | 
             
                if len(file_manifest) == 0:
         | 
| 327 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何CSharp文件: {txt}")
         | 
| 328 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 329 | 
             
                    return
         | 
| 330 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 352 | 
             
                    project_folder = txt
         | 
| 353 | 
             
                else:
         | 
| 354 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 355 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 356 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 357 | 
             
                    return
         | 
| 358 | 
             
                # 若上传压缩文件, 先寻找到解压的文件夹路径, 从而避免解析压缩文件
         | 
|  | |
| 365 | 
             
                file_manifest = [f for pattern in pattern_include for f in glob.glob(f'{extract_folder_path}/**/{pattern}', recursive=True) if "" != extract_folder_path and \
         | 
| 366 | 
             
                                  os.path.isfile(f) and (not re.search(pattern_except, f) or pattern.endswith('.' + re.search(pattern_except, f).group().split('.')[-1]))]
         | 
| 367 | 
             
                if len(file_manifest) == 0:
         | 
| 368 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何文件: {txt}")
         | 
| 369 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 370 | 
             
                    return
         | 
| 371 | 
             
                yield from 解析源代码新(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
    	
        crazy_functions/询问多个大语言模型.py
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            from toolbox import CatchException, update_ui
         | 
| 2 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 3 | 
             
            import datetime
         | 
| 4 | 
             
            @CatchException
         | 
| @@ -13,11 +13,12 @@ def 同时问询(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt | |
| 13 | 
             
                web_port        当前软件运行的端口号
         | 
| 14 | 
             
                """
         | 
| 15 | 
             
                history = []    # 清空历史,以免输入溢出
         | 
| 16 | 
            -
                 | 
|  | |
| 17 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 由于请求gpt需要一段时间,我们先及时地做一次界面更新
         | 
| 18 |  | 
| 19 | 
             
                # llm_kwargs['llm_model'] = 'chatglm&gpt-3.5-turbo&api2d-gpt-3.5-turbo' # 支持任意数量的llm接口,用&符号分隔
         | 
| 20 | 
            -
                llm_kwargs['llm_model'] =  | 
| 21 | 
             
                gpt_say = yield from request_gpt_model_in_new_thread_with_ui_alive(
         | 
| 22 | 
             
                    inputs=txt, inputs_show_user=txt, 
         | 
| 23 | 
             
                    llm_kwargs=llm_kwargs, chatbot=chatbot, history=history, 
         | 
|  | |
| 1 | 
            +
            from toolbox import CatchException, update_ui, get_conf
         | 
| 2 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 3 | 
             
            import datetime
         | 
| 4 | 
             
            @CatchException
         | 
|  | |
| 13 | 
             
                web_port        当前软件运行的端口号
         | 
| 14 | 
             
                """
         | 
| 15 | 
             
                history = []    # 清空历史,以免输入溢出
         | 
| 16 | 
            +
                MULTI_QUERY_LLM_MODELS = get_conf('MULTI_QUERY_LLM_MODELS')
         | 
| 17 | 
            +
                chatbot.append((txt, "正在同时咨询" + MULTI_QUERY_LLM_MODELS))
         | 
| 18 | 
             
                yield from update_ui(chatbot=chatbot, history=history) # 刷新界面 # 由于请求gpt需要一段时间,我们先及时地做一次界面更新
         | 
| 19 |  | 
| 20 | 
             
                # llm_kwargs['llm_model'] = 'chatglm&gpt-3.5-turbo&api2d-gpt-3.5-turbo' # 支持任意数量的llm接口,用&符号分隔
         | 
| 21 | 
            +
                llm_kwargs['llm_model'] = MULTI_QUERY_LLM_MODELS # 支持任意数量的llm接口,用&符号分隔
         | 
| 22 | 
             
                gpt_say = yield from request_gpt_model_in_new_thread_with_ui_alive(
         | 
| 23 | 
             
                    inputs=txt, inputs_show_user=txt, 
         | 
| 24 | 
             
                    llm_kwargs=llm_kwargs, chatbot=chatbot, history=history, 
         | 
    	
        crazy_functions/语音助手.py
    CHANGED
    
    | @@ -1,47 +1,35 @@ | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
             
            from toolbox import CatchException, get_conf, markdown_convertion
         | 
| 3 | 
             
            from crazy_functions.crazy_utils import input_clipping
         | 
| 4 | 
            -
            from  | 
|  | |
| 5 | 
             
            import threading, time
         | 
| 6 | 
             
            import numpy as np
         | 
| 7 | 
             
            from .live_audio.aliyunASR import AliyunASR
         | 
| 8 | 
             
            import json
         | 
|  | |
| 9 |  | 
| 10 | 
            -
            class WatchDog():
         | 
| 11 | 
            -
                def __init__(self, timeout, bark_fn, interval=3, msg="") -> None:
         | 
| 12 | 
            -
                    self.last_feed = None
         | 
| 13 | 
            -
                    self.timeout = timeout
         | 
| 14 | 
            -
                    self.bark_fn = bark_fn
         | 
| 15 | 
            -
                    self.interval = interval
         | 
| 16 | 
            -
                    self.msg = msg
         | 
| 17 | 
            -
                    self.kill_dog = False
         | 
| 18 | 
            -
                
         | 
| 19 | 
            -
                def watch(self):
         | 
| 20 | 
            -
                    while True:
         | 
| 21 | 
            -
                        if self.kill_dog: break
         | 
| 22 | 
            -
                        if time.time() - self.last_feed > self.timeout:
         | 
| 23 | 
            -
                            if len(self.msg) > 0: print(self.msg)
         | 
| 24 | 
            -
                            self.bark_fn()
         | 
| 25 | 
            -
                            break
         | 
| 26 | 
            -
                        time.sleep(self.interval)
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                def begin_watch(self):
         | 
| 29 | 
            -
                    self.last_feed = time.time()
         | 
| 30 | 
            -
                    th = threading.Thread(target=self.watch)
         | 
| 31 | 
            -
                    th.daemon = True
         | 
| 32 | 
            -
                    th.start()
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                def feed(self):
         | 
| 35 | 
            -
                    self.last_feed = time.time()
         | 
| 36 |  | 
| 37 | 
             
            def chatbot2history(chatbot):
         | 
| 38 | 
             
                history = []
         | 
| 39 | 
             
                for c in chatbot:
         | 
| 40 | 
             
                    for q in c:
         | 
| 41 | 
            -
                        if q  | 
|  | |
|  | |
|  | |
|  | |
| 42 | 
             
                            history.append(q.strip('<div class="markdown-body">').strip('</div>').strip('<p>').strip('</p>'))
         | 
| 43 | 
             
                return history
         | 
| 44 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 45 | 
             
            class AsyncGptTask():
         | 
| 46 | 
             
                def __init__(self) -> None:
         | 
| 47 | 
             
                    self.observe_future = []
         | 
| @@ -81,8 +69,9 @@ class InterviewAssistant(AliyunASR): | |
| 81 | 
             
                    self.capture_interval = 0.5 # second
         | 
| 82 | 
             
                    self.stop = False
         | 
| 83 | 
             
                    self.parsed_text = ""   # 下个句子中已经说完的部分, 由 test_on_result_chg() 写入
         | 
| 84 | 
            -
                    self.parsed_sentence = ""   #  | 
| 85 | 
             
                    self.buffered_sentence = ""    #
         | 
|  | |
| 86 | 
             
                    self.event_on_result_chg = threading.Event()
         | 
| 87 | 
             
                    self.event_on_entence_end = threading.Event()
         | 
| 88 | 
             
                    self.event_on_commit_question = threading.Event()
         | 
| @@ -117,7 +106,7 @@ class InterviewAssistant(AliyunASR): | |
| 117 | 
             
                def begin(self, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt):
         | 
| 118 | 
             
                    # main plugin function
         | 
| 119 | 
             
                    self.init(chatbot)
         | 
| 120 | 
            -
                    chatbot.append(["[请讲话]", "[正在等您说完问题]"])
         | 
| 121 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 122 | 
             
                    self.plugin_wd.begin_watch()
         | 
| 123 | 
             
                    self.agt = AsyncGptTask()
         | 
| @@ -157,14 +146,18 @@ class InterviewAssistant(AliyunASR): | |
| 157 |  | 
| 158 | 
             
                            self.commit_wd.begin_watch()
         | 
| 159 | 
             
                            chatbot[-1] = list(chatbot[-1])
         | 
| 160 | 
            -
                            chatbot[-1] = [self.buffered_sentence, "[等待GPT响应]"]
         | 
| 161 | 
             
                            yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 162 | 
             
                            # add gpt task 创建子线程请求gpt,避免线程阻塞
         | 
| 163 | 
             
                            history = chatbot2history(chatbot)
         | 
| 164 | 
             
                            self.agt.add_async_gpt_task(self.buffered_sentence, len(chatbot)-1, llm_kwargs, history, system_prompt)
         | 
| 165 |  | 
| 166 | 
             
                            self.buffered_sentence = ""
         | 
| 167 | 
            -
                            chatbot.append(["[请讲话]", "[正在等您说完问题]"])
         | 
|  | |
|  | |
|  | |
|  | |
| 168 | 
             
                            yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 169 |  | 
| 170 | 
             
                    if len(self.stop_msg) != 0:
         | 
| @@ -183,7 +176,7 @@ def 语音助手(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt | |
| 183 | 
             
                    import nls
         | 
| 184 | 
             
                    from scipy import io
         | 
| 185 | 
             
                except:
         | 
| 186 | 
            -
                    chatbot.append(["导入依赖失败", "使用该模块需要额外依赖, 安装方法:```pip install --upgrade aliyun-python-sdk-core==2.13.3 pyOpenSSL scipy git+https://github.com/aliyun/alibabacloud-nls-python-sdk.git```"])
         | 
| 187 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 188 | 
             
                    return
         | 
| 189 |  | 
|  | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
             
            from toolbox import CatchException, get_conf, markdown_convertion
         | 
| 3 | 
             
            from crazy_functions.crazy_utils import input_clipping
         | 
| 4 | 
            +
            from crazy_functions.agent_fns.watchdog import WatchDog
         | 
| 5 | 
            +
            from request_llms.bridge_all import predict_no_ui_long_connection
         | 
| 6 | 
             
            import threading, time
         | 
| 7 | 
             
            import numpy as np
         | 
| 8 | 
             
            from .live_audio.aliyunASR import AliyunASR
         | 
| 9 | 
             
            import json
         | 
| 10 | 
            +
            import re
         | 
| 11 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 12 |  | 
| 13 | 
             
            def chatbot2history(chatbot):
         | 
| 14 | 
             
                history = []
         | 
| 15 | 
             
                for c in chatbot:
         | 
| 16 | 
             
                    for q in c:
         | 
| 17 | 
            +
                        if q in ["[ 请讲话 ]", "[ 等待GPT响应 ]", "[ 正在等您说完问题 ]"]:
         | 
| 18 | 
            +
                            continue
         | 
| 19 | 
            +
                        elif q.startswith("[ 正在等您说完问题 ]"):
         | 
| 20 | 
            +
                            continue
         | 
| 21 | 
            +
                        else:
         | 
| 22 | 
             
                            history.append(q.strip('<div class="markdown-body">').strip('</div>').strip('<p>').strip('</p>'))
         | 
| 23 | 
             
                return history
         | 
| 24 |  | 
| 25 | 
            +
            def visualize_audio(chatbot, audio_shape):
         | 
| 26 | 
            +
                if len(chatbot) == 0: chatbot.append(["[ 请讲话 ]", "[ 正在等您说完问题 ]"])
         | 
| 27 | 
            +
                chatbot[-1] = list(chatbot[-1])
         | 
| 28 | 
            +
                p1 = '「'
         | 
| 29 | 
            +
                p2 = '」'
         | 
| 30 | 
            +
                chatbot[-1][-1] = re.sub(p1+r'(.*)'+p2, '', chatbot[-1][-1])
         | 
| 31 | 
            +
                chatbot[-1][-1] += (p1+f"`{audio_shape}`"+p2)
         | 
| 32 | 
            +
             | 
| 33 | 
             
            class AsyncGptTask():
         | 
| 34 | 
             
                def __init__(self) -> None:
         | 
| 35 | 
             
                    self.observe_future = []
         | 
|  | |
| 69 | 
             
                    self.capture_interval = 0.5 # second
         | 
| 70 | 
             
                    self.stop = False
         | 
| 71 | 
             
                    self.parsed_text = ""   # 下个句子中已经说完的部分, 由 test_on_result_chg() 写入
         | 
| 72 | 
            +
                    self.parsed_sentence = ""   # 某段话的整个句子, 由 test_on_sentence_end() 写入
         | 
| 73 | 
             
                    self.buffered_sentence = ""    #
         | 
| 74 | 
            +
                    self.audio_shape = ""   # 音频的可视化表现, 由 audio_convertion_thread() 写入
         | 
| 75 | 
             
                    self.event_on_result_chg = threading.Event()
         | 
| 76 | 
             
                    self.event_on_entence_end = threading.Event()
         | 
| 77 | 
             
                    self.event_on_commit_question = threading.Event()
         | 
|  | |
| 106 | 
             
                def begin(self, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt):
         | 
| 107 | 
             
                    # main plugin function
         | 
| 108 | 
             
                    self.init(chatbot)
         | 
| 109 | 
            +
                    chatbot.append(["[ 请讲话 ]", "[ 正在等您说完问题 ]"])
         | 
| 110 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 111 | 
             
                    self.plugin_wd.begin_watch()
         | 
| 112 | 
             
                    self.agt = AsyncGptTask()
         | 
|  | |
| 146 |  | 
| 147 | 
             
                            self.commit_wd.begin_watch()
         | 
| 148 | 
             
                            chatbot[-1] = list(chatbot[-1])
         | 
| 149 | 
            +
                            chatbot[-1] = [self.buffered_sentence, "[ 等待GPT响应 ]"]
         | 
| 150 | 
             
                            yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 151 | 
             
                            # add gpt task 创建子线程请求gpt,避免线程阻塞
         | 
| 152 | 
             
                            history = chatbot2history(chatbot)
         | 
| 153 | 
             
                            self.agt.add_async_gpt_task(self.buffered_sentence, len(chatbot)-1, llm_kwargs, history, system_prompt)
         | 
| 154 |  | 
| 155 | 
             
                            self.buffered_sentence = ""
         | 
| 156 | 
            +
                            chatbot.append(["[ 请讲话 ]", "[ 正在等您说完问题 ]"])
         | 
| 157 | 
            +
                            yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                        if not self.event_on_result_chg.is_set() and not self.event_on_entence_end.is_set() and not self.event_on_commit_question.is_set():
         | 
| 160 | 
            +
                            visualize_audio(chatbot, self.audio_shape)
         | 
| 161 | 
             
                            yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 162 |  | 
| 163 | 
             
                    if len(self.stop_msg) != 0:
         | 
|  | |
| 176 | 
             
                    import nls
         | 
| 177 | 
             
                    from scipy import io
         | 
| 178 | 
             
                except:
         | 
| 179 | 
            +
                    chatbot.append(["导入依赖失败", "使用该模块需要额外依赖, 安装方法:```pip install --upgrade aliyun-python-sdk-core==2.13.3 pyOpenSSL webrtcvad scipy git+https://github.com/aliyun/alibabacloud-nls-python-sdk.git```"])
         | 
| 180 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 181 | 
             
                    return
         | 
| 182 |  | 
    	
        crazy_functions/读文章写摘要.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 |  | 
| @@ -51,14 +51,14 @@ def 读文章写摘要(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_ | |
| 51 | 
             
                    project_folder = txt
         | 
| 52 | 
             
                else:
         | 
| 53 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 54 | 
            -
                     | 
| 55 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 56 | 
             
                    return
         | 
| 57 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)] # + \
         | 
| 58 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.cpp', recursive=True)] + \
         | 
| 59 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.c', recursive=True)]
         | 
| 60 | 
             
                if len(file_manifest) == 0:
         | 
| 61 | 
            -
                     | 
| 62 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 63 | 
             
                    return
         | 
| 64 | 
             
                yield from 解析Paper(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
|  | |
| 1 | 
             
            from toolbox import update_ui
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception
         | 
| 3 | 
             
            from toolbox import write_history_to_file, promote_file_to_downloadzone
         | 
| 4 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 5 |  | 
|  | |
| 51 | 
             
                    project_folder = txt
         | 
| 52 | 
             
                else:
         | 
| 53 | 
             
                    if txt == "": txt = '空空如也的输入栏'
         | 
| 54 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到本地项目或无权访问: {txt}")
         | 
| 55 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 56 | 
             
                    return
         | 
| 57 | 
             
                file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.tex', recursive=True)] # + \
         | 
| 58 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.cpp', recursive=True)] + \
         | 
| 59 | 
             
                                # [f for f in glob.glob(f'{project_folder}/**/*.c', recursive=True)]
         | 
| 60 | 
             
                if len(file_manifest) == 0:
         | 
| 61 | 
            +
                    report_exception(chatbot, history, a = f"解析项目: {txt}", b = f"找不到任何.tex文件: {txt}")
         | 
| 62 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
| 63 | 
             
                    return
         | 
| 64 | 
             
                yield from 解析Paper(file_manifest, project_folder, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt)
         | 
    	
        crazy_functions/谷歌检索小助手.py
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 2 | 
            -
            from toolbox import CatchException,  | 
| 3 | 
             
            from toolbox import update_ui, update_ui_lastest_msg, disable_auto_promotion, write_history_to_file
         | 
| 4 | 
             
            import logging
         | 
| 5 | 
             
            import requests
         | 
| @@ -17,7 +17,7 @@ def get_meta_information(url, chatbot, history): | |
| 17 | 
             
                from urllib.parse import urlparse
         | 
| 18 | 
             
                session = requests.session()
         | 
| 19 |  | 
| 20 | 
            -
                proxies | 
| 21 | 
             
                headers = {
         | 
| 22 | 
             
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
         | 
| 23 | 
             
                    'Accept-Encoding': 'gzip, deflate, br', 
         | 
| @@ -26,7 +26,13 @@ def get_meta_information(url, chatbot, history): | |
| 26 | 
             
                    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 
         | 
| 27 | 
             
                    'Connection': 'keep-alive'
         | 
| 28 | 
             
                }
         | 
| 29 | 
            -
                 | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 30 | 
             
                session.headers.update(headers)
         | 
| 31 |  | 
| 32 | 
             
                response = session.get(url)
         | 
| @@ -140,7 +146,7 @@ def 谷歌检索小助手(txt, llm_kwargs, plugin_kwargs, chatbot, history, syst | |
| 140 | 
             
                    import math
         | 
| 141 | 
             
                    from bs4 import BeautifulSoup
         | 
| 142 | 
             
                except:
         | 
| 143 | 
            -
                     | 
| 144 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 145 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade beautifulsoup4 arxiv```。")
         | 
| 146 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
|  | |
| 1 | 
             
            from .crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 2 | 
            +
            from toolbox import CatchException, report_exception, promote_file_to_downloadzone
         | 
| 3 | 
             
            from toolbox import update_ui, update_ui_lastest_msg, disable_auto_promotion, write_history_to_file
         | 
| 4 | 
             
            import logging
         | 
| 5 | 
             
            import requests
         | 
|  | |
| 17 | 
             
                from urllib.parse import urlparse
         | 
| 18 | 
             
                session = requests.session()
         | 
| 19 |  | 
| 20 | 
            +
                proxies = get_conf('proxies')
         | 
| 21 | 
             
                headers = {
         | 
| 22 | 
             
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
         | 
| 23 | 
             
                    'Accept-Encoding': 'gzip, deflate, br', 
         | 
|  | |
| 26 | 
             
                    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 
         | 
| 27 | 
             
                    'Connection': 'keep-alive'
         | 
| 28 | 
             
                }
         | 
| 29 | 
            +
                try:
         | 
| 30 | 
            +
                    session.proxies.update(proxies)
         | 
| 31 | 
            +
                except:
         | 
| 32 | 
            +
                    report_exception(chatbot, history,
         | 
| 33 | 
            +
                                a=f"获取代理失败 无代理状态下很可能无法访问OpenAI家族的模型及谷歌学术 建议:检查USE_PROXY选项是否修改。",
         | 
| 34 | 
            +
                                b=f"尝试直接连接")
         | 
| 35 | 
            +
                    yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 36 | 
             
                session.headers.update(headers)
         | 
| 37 |  | 
| 38 | 
             
                response = session.get(url)
         | 
|  | |
| 146 | 
             
                    import math
         | 
| 147 | 
             
                    from bs4 import BeautifulSoup
         | 
| 148 | 
             
                except:
         | 
| 149 | 
            +
                    report_exception(chatbot, history, 
         | 
| 150 | 
             
                        a = f"解析项目: {txt}", 
         | 
| 151 | 
             
                        b = f"导入软件依赖失败。使用该模块需要额外依赖,安装方法```pip install --upgrade beautifulsoup4 arxiv```。")
         | 
| 152 | 
             
                    yield from update_ui(chatbot=chatbot, history=history) # 刷新界面
         | 
    	
        crazy_functions/辅助功能.py
    CHANGED
    
    | @@ -2,9 +2,12 @@ | |
| 2 | 
             
            # @Time   : 2023/4/19
         | 
| 3 | 
             
            # @Author : Spike
         | 
| 4 | 
             
            # @Descr   :
         | 
| 5 | 
            -
            from toolbox import update_ui, get_conf
         | 
| 6 | 
             
            from toolbox import CatchException
         | 
|  | |
| 7 | 
             
            from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
|  | |
|  | |
| 8 |  | 
| 9 |  | 
| 10 | 
             
            @CatchException
         | 
| @@ -33,10 +36,19 @@ def 清除缓存(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt | |
| 33 | 
             
                chatbot.append(['清除本地缓存数据', '执行中. 删除数据'])
         | 
| 34 | 
             
                yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 35 |  | 
| 36 | 
            -
                 | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 40 |  | 
| 41 | 
             
                chatbot.append(['清除本地缓存数据', '执行完成'])
         | 
| 42 | 
             
                yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
|  | |
| 2 | 
             
            # @Time   : 2023/4/19
         | 
| 3 | 
             
            # @Author : Spike
         | 
| 4 | 
             
            # @Descr   :
         | 
| 5 | 
            +
            from toolbox import update_ui, get_conf, get_user
         | 
| 6 | 
             
            from toolbox import CatchException
         | 
| 7 | 
            +
            from toolbox import default_user_name
         | 
| 8 | 
             
            from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive
         | 
| 9 | 
            +
            import shutil
         | 
| 10 | 
            +
            import os
         | 
| 11 |  | 
| 12 |  | 
| 13 | 
             
            @CatchException
         | 
|  | |
| 36 | 
             
                chatbot.append(['清除本地缓存数据', '执行中. 删除数据'])
         | 
| 37 | 
             
                yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         | 
| 38 |  | 
| 39 | 
            +
                def _get_log_folder(user=default_user_name):
         | 
| 40 | 
            +
                    PATH_LOGGING = get_conf('PATH_LOGGING')
         | 
| 41 | 
            +
                    _dir = os.path.join(PATH_LOGGING, user)
         | 
| 42 | 
            +
                    if not os.path.exists(_dir): os.makedirs(_dir)
         | 
| 43 | 
            +
                    return _dir
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def _get_upload_folder(user=default_user_name):
         | 
| 46 | 
            +
                    PATH_PRIVATE_UPLOAD = get_conf('PATH_PRIVATE_UPLOAD')
         | 
| 47 | 
            +
                    _dir = os.path.join(PATH_PRIVATE_UPLOAD, user)
         | 
| 48 | 
            +
                    return _dir
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                shutil.rmtree(_get_log_folder(get_user(chatbot)), ignore_errors=True)
         | 
| 51 | 
            +
                shutil.rmtree(_get_upload_folder(get_user(chatbot)), ignore_errors=True)
         | 
| 52 |  | 
| 53 | 
             
                chatbot.append(['清除本地缓存数据', '执行完成'])
         | 
| 54 | 
             
                yield from update_ui(chatbot=chatbot, history=history)  # 刷新界面
         |