
GPT Academic 插件开发指南从函数式插件到类式插件的完整实践【免费下载链接】gpt_academic为GPT/GLM等LLM大语言模型提供实用化交互接口特别优化论文阅读/润色/写作体验模块化设计支持自定义快捷按钮函数插件支持Python和C等项目剖析自译解功能PDF/LaTex论文翻译总结功能支持并行问询多种LLM模型支持chatglm3等本地模型。接入通义千问, deepseekcoder, 讯飞星火, 文心一言, llama2, rwkv, claude2, moss等。项目地址: https://gitcode.com/GitHub_Trending/gp/gpt_academicGPT Academic 的核心能力来源于其丰富的插件生态从论文翻译到代码分析从联网搜索到图片生成每一个功能都以插件形式实现在crazy_functions/目录下。本文基于仓库中的 插件开发文档 与真实源码完整讲解两类插件函数式与类式的编写、注册、参数传递机制、文件上传与批量处理等实战技巧并深入toolbox.py、crazy_functions/crazy_utils.py与插件模板类帮助读者掌握从零开发一个可注册、可热更新、可交互的 GPT Academic 插件的完整能力。插件系统概览在开始编写代码之前先了解 GPT Academic 插件系统的基本架构。所有插件都位于crazy_functions/目录下。当用户点击界面上的功能按钮或从下拉菜单选择插件时系统会调用相应的插件函数或类来处理请求。插件可以访问用户的输入文本、对话历史、文件上传等信息并通过大模型生成响应。GPT Academic 支持两种插件形式类型适用场景特点函数式插件简单功能无需用户额外输入开发快速代码简洁类式插件复杂功能需要二级选项菜单支持参数配置交互更灵活对于大多数场景函数式插件已经足够。当需要在执行前让用户选择参数如翻译语言、输出格式等时再考虑使用类式插件。这一区分在源码中也有直接体现crazy_functional.py 的get_crazy_functions()函数集中导入并注册了所有插件每个插件以字符串名为键配置字典为值Function指向函数式入口Class可选指向类式插件例如注释Python项目同时注册了HotReload(注释Python项目)与SourceCodeComment_Wrap两个入口。开发环境与热重载机制插件开发无需特殊的环境配置只需确保已经成功运行了 GPT Academic。开发过程中建议开启热重载功能修改插件代码后无需重启程序即可生效。热重载能力来自 toolbox.py 中的HotReload装饰器。从源码实现看它依赖配置项PLUGIN_HOT_RELOADdef HotReload(f): if get_conf(PLUGIN_HOT_RELOAD): wraps(f) def decorated(*args, **kwargs): fn_name f.__name__ f_hot_reload getattr(importlib.reload(inspect.getmodule(f)), fn_name) yield from f_hot_reload(*args, **kwargs) return decorated else: return f当PLUGIN_HOT_RELOAD开启时装饰器在每次调用插件前通过importlib.reload重新加载插件所在模块并用getattr取出同名的最新函数执行。这意味着保存插件文件后下次调用该插件时会自动加载最新代码极大提升开发效率若该配置关闭HotReload会原样返回原函数不影响插件正常运行。函数式插件开发从最简单的函数式插件开始下面这个示例会查询历史上的今天发生的事件from toolbox import CatchException, update_ui from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive import datetime CatchException def 历史上的今天(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_request): 插件入口函数 参数说明: txt - 用户在输入框中输入的文本 llm_kwargs - 大模型参数温度、top_p 等 plugin_kwargs - 插件参数来自二级菜单函数式插件通常为空 chatbot - 对话显示组件用于更新界面 history - 对话历史记录 system_prompt - 系统提示词 user_request - 用户请求信息包含 IP 等 # 清空历史避免上下文过长 history [] # 获取当前日期 today datetime.date.today() # 在界面上显示处理状态 chatbot.append((正在查询历史上的今天..., 请稍候...)) yield from update_ui(chatbotchatbot, historyhistory) # 构造提问 query f请列举历史上 {today.month} 月 {today.day} 日发生的 3 个重要事件简要说明每个事件的背景和影响。 # 调用大模型并流式输出 response yield from request_gpt_model_in_new_thread_with_ui_alive( inputsquery, inputs_show_userquery, llm_kwargsllm_kwargs, chatbotchatbot, historyhistory, sys_prompt你是一位历史学专家擅长介绍历史事件。 ) # 更新对话历史 history.extend([query, response]) yield from update_ui(chatbotchatbot, historyhistory)这个示例虽然简单但包含了插件开发的所有核心要素逐一解析如下装饰器CatchException是一个错误处理包装器确保插件运行时的异常不会导致整个程序崩溃。从 toolbox.py 的源码实现看它会区分FriendlyException与一般Exception两类异常前者渲染友好的错误 HTML后者将精简后的 traceback 以[Local Message] 插件调用出错的形式追加到对话界面并通过update_ui刷新界面。在开发阶段它会把错误信息显示在对话界面中方便调试。函数签名定义了插件接收的参数。这七个参数是所有插件的标准接口可以按需要使用其中的部分或全部。yield from update_ui()是更新界面的关键。由于插件函数是一个生成器使用yield from可以实时将处理进度反馈给用户而不是等待所有处理完成后才显示结果。request_gpt_model_in_new_thread_with_ui_alive()是调用大模型的核心函数定义于 crazy_functions/crazy_utils.py。从源码实现看它内部使用ThreadPoolExecutor在独立线程中发起请求同时以约 0.2 秒的间隔向chatbot回写部分结果以保持界面响应它还内置了看门狗机制watch_dog_patience检测程序终止并可在 token 溢出时通过input_clipping自动截断重试。函数返回的response是模型的完整回复文本。其关键参数包括参数含义inputs真正发送给模型的输入文本inputs_show_user展示给用户的输入可借此在报告中隐藏啰嗦的真实输入llm_kwargs大模型参数模型名、温度、top_p 等chatbot界面对话窗口句柄用于数据流可视化history对话历史列表sys_prompt系统提示词refresh_intervalUI 刷新间隔默认 0.2建议低于 1不可高于 3handle_token_exceed是否自动处理 token 溢出默认开启溢出时暴力截断retry_times_at_unknown_error未知错误时的重试次数默认 2注册插件插件编写完成后需要在 crazy_functional.py 的function_plugins字典中注册才能在界面上使用。以仓库中已注册的插件为例function_plugins { # ... 其他插件 ... 历史上的今天: { Group: 对话, # 所属分组用于插件分类 Color: secondary, # 按钮颜色primary/secondary/stop AsButton: False, # True 显示为按钮False 放入下拉菜单 Info: 查询历史上今天发生的重要事件, # 插件说明 Function: HotReload(历史上的今天), # 关联函数HotReload 启用热重载 }, # ... 其他插件 ... }注册时需要指定的属性含义如下Group决定插件在界面上的分类位置。可选值包括对话、编程、学术、智能体也可以用|分隔同时归属多个分组如 crazy_functional.py 中虚空终端注册的Group: 对话|编程|学术|智能体。Color控制按钮颜色可选primary/secondary/stop。AsButton控制插件的显示形式。设为True时插件以按钮形式显示在主界面设为False时插件出现在下拉菜单中。常用功能建议设为按钮以便快速访问。Info是插件说明文本展示在菜单中。Function必须用HotReload()包装这样修改插件代码后无需重启程序。保存文件后刷新浏览器页面新插件就会出现在界面上。类式插件开发当插件需要用户在执行前配置参数时类式插件是更好的选择。它允许定义一个二级选项菜单用户可以在其中输入文本、选择下拉选项等。类式插件的基类是 crazy_functions/plugin_template/plugin_class_template.py 中的GptAcademicPluginTemplate参数描述模型ArgProperty也由该模块提供。下面是一个支持自定义天数的历史上的今天类式插件from crazy_functions.plugin_template.plugin_class_template import GptAcademicPluginTemplate, ArgProperty from toolbox import update_ui from crazy_functions.crazy_utils import request_gpt_model_in_new_thread_with_ui_alive import datetime class HistoryToday_Wrap(GptAcademicPluginTemplate): 类式插件必须继承 GptAcademicPluginTemplate def __init__(self): 初始化函数。注意execute 方法可能在不同线程中运行 避免在此存储会被多线程访问的状态。 pass def define_arg_selection_menu(self): 定义二级选项菜单 返回一个字典每个键值对对应一个参数。 支持的参数类型 - typestring: 文本输入框 - typedropdown: 下拉选择菜单 gui_definition { main_input: ArgProperty( title查询日期, description留空则查询今天或输入指定日期如 3-15, default_value, typestring ).model_dump_json(), event_count: ArgProperty( title事件数量, description选择要列举的历史事件数量, options[3个事件, 5个事件, 10个事件], default_value3个事件, typedropdown ).model_dump_json(), advanced_arg: ArgProperty( title额外要求, description如有特殊要求可在此输入如只列举中国历史事件, default_value, typestring ).model_dump_json(), } return gui_definition def execute(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_request): 执行插件主逻辑 用户在二级菜单中的选择会通过 plugin_kwargs 字典传入。 字典的键与 define_arg_selection_menu 中定义的参数名对应。 # 从 plugin_kwargs 获取用户选择 main_input plugin_kwargs.get(main_input, ) event_count plugin_kwargs.get(event_count, 3个事件) advanced_arg plugin_kwargs.get(advanced_arg, ) # 解析日期 if main_input: try: month, day map(int, main_input.split(-)) except Exception: month, day datetime.date.today().month, datetime.date.today().day else: month, day datetime.date.today().month, datetime.date.today().day # 解析事件数量 count int(event_count.replace(个事件, )) # 构造提问 query f请列举历史上 {month} 月 {day} 日发生的 {count} 个重要事件。 if advanced_arg: query f 额外要求{advanced_arg} # 清空历史并显示状态 history [] chatbot.append((f查询 {month}月{day}日 的历史事件, 正在查询...)) yield from update_ui(chatbotchatbot, historyhistory) # 调用大模型 response yield from request_gpt_model_in_new_thread_with_ui_alive( inputsquery, inputs_show_userquery, llm_kwargsllm_kwargs, chatbotchatbot, historyhistory, sys_prompt你是一位历史学专家。 ) history.extend([query, response]) yield from update_ui(chatbotchatbot, historyhistory)类式插件的核心在于define_arg_selection_menu()方法。它返回的字典定义了二级菜单的结构每个参数都由ArgProperty对象描述。ArgProperty是一个 Pydantic 模型包含五个字段字段含义约束title参数标题字符串description参数说明字符串default_value默认值字符串type控件类型目前支持string文本输入框与dropdown下拉选择options下拉选项列表仅当typedropdown时使用每个ArgProperty通过model_dump_json()序列化为 JSON 字符串后放入返回字典。从模板类源码看前端菜单由get_js_code_for_generating_menu方法生成它把define_arg_selection_menu()的返回值序列化为 JSON 并做 base64 编码传给前端渲染同时会执行硬约束校验——参数数量最多 8 个超出会抛出ValueError。有两个特殊的参数名需要注意main_input会与界面主输入框自动同步用户在输入框中的内容会预填到这个参数advanced_arg会与界面的高级参数输入区自动同步。除此之外可以自由定义其他参数名如示例中的event_count。另外execute方法可能在不同线程中运行模板类注释明确提醒不应在插件实例中存储可能被多线程访问的状态开发时不要把可变状态放在实例属性上。注册类式插件注册类式插件时需要同时指定Function和Class历史上的今天高级版: { Group: 对话, Color: stop, AsButton: False, Info: 可自定义日期和事件数量的历史查询插件, Function: HotReload(历史上的今天), # 兼容虚空终端调用 Class: HistoryToday_Wrap, # 类式插件的类名 },当插件同时注册了Function和Class时界面按钮会触发类式插件显示二级菜单而虚空终端等自然语言调用场景会使用函数式入口。这一点在 crazy_functional.py 中也有官方注释佐证例如Arxiv论文翻译同时注册了Function: HotReload(Latex翻译中文并重新编译PDF)注释说明当注册 Class 后Function 旧接口仅会在虚空终端中起作用和Class: Arxiv_Localize。仓库中Conversation_To_File_Wrap、Document_Conversation_Wrap、ImageGen_Wrap、NetworkGPT_Wrap等都是可以参考的类式插件实现。实用开发技巧处理文件上传许多插件需要处理用户上传的文件。用户上传的文件路径会通过txt参数传入可以使用以下模式解析import os, glob CatchException def 处理上传文件(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_request): # txt 可能是单个文件路径也可能是目录路径 if os.path.isfile(txt): file_list [txt] elif os.path.isdir(txt): # 获取目录下所有 PDF 文件 file_list glob.glob(os.path.join(txt, *.pdf)) else: chatbot.append((错误, 请先上传文件或输入有效路径)) yield from update_ui(chatbotchatbot, historyhistory) return for file_path in file_list: # 处理每个文件... pass多线程批量处理当需要处理大量文件或执行耗时操作时可以使用 crazy_functions/crazy_utils.py 中的多线程请求函数request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency提升效率from crazy_functions.crazy_utils import request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency def 批量处理(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_request): # 准备多个任务 inputs_array [任务1, 任务2, 任务3] inputs_show_user_array inputs_array.copy() # 并行执行 results yield from request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency( inputs_arrayinputs_array, inputs_show_user_arrayinputs_show_user_array, llm_kwargsllm_kwargs, chatbotchatbot, history_array[[] for _ in inputs_array], sys_prompt_array[ for _ in inputs_array], ) # results 是所有任务结果的列表从源码实现看该函数以_array结尾的参数都是列表列表长度为子任务数量执行时会把列表拆解、放到每个子线程中分别执行并实时在 UI 上反馈远程数据流。它还提供max_workers参数控制线程池大小默认读取配置项DEFAULT_WORKER_NUM用于避免高频请求模型导致限流错误、scroller_max_len控制数据流滚动显示长度、show_user_at_complete控制结束时是否把完整输入-输出结果展示在聊天框。如果某个子任务出错results中对应项会携带 traceback 报错信息方便调试和定位问题。生成下载文件插件可以生成文件供用户下载。使用 toolbox.py 中的on_report_generated()函数将文件注册到下载区from toolbox import on_report_generated def 生成报告(txt, llm_kwargs, plugin_kwargs, chatbot, history, system_prompt, user_request): # ... 生成报告内容 ... # 保存文件 report_path path/to/report.pdf with open(report_path, wb) as f: f.write(report_content) # 注册到下载区 cookies user_request.get(cookies, {}) cookies, report_files, chatbot on_report_generated( cookiescookies, files[report_path], chatbotchatbot ) yield from update_ui(chatbotchatbot, historyhistory)on_report_generated(cookies, files, chatbot)接收 cookies 字典、文件路径列表和 chatbot 句柄将生成的文件登记到会话的下载区并刷新界面用户即可在界面上下载。调试与测试开发过程中可以使用以下方法进行调试查看日志输出在插件代码中使用logger输出调试信息from loguru import logger logger.info(f处理文件: {file_path}) logger.warning(参数可能不正确) logger.error(发生错误)日志会输出到终端帮助追踪插件的执行流程。使用虚空终端测试虚空终端支持通过自然语言调用插件是快速测试插件功能的好方法。只需在虚空终端中描述想执行的任务系统会自动匹配并调用相应插件。这也是为什么类式插件建议同时注册Function入口——自然语言调用走的正是函数式入口。渐进式开发建议先实现最基本的功能验证可行后再逐步添加复杂特性。利用热重载特性可以在不重启程序的情况下快速迭代。小结GPT Academic 的插件体系可以归纳为三条主线函数式插件标准七参数生成器函数 CatchExceptionHotReload注册适合无需额外参数的快速功能类式插件继承GptAcademicPluginTemplate通过define_arg_selection_menu()声明二级菜单最多 8 个ArgProperty参数支持string/dropdown两类控件main_input与advanced_arg为特殊同步参数适合需要用户配置参数的复杂交互核心工具链update_ui负责界面刷新request_gpt_model_in_new_thread_with_ui_alive负责单请求流式输出多线程版函数负责批量并行任务on_report_generated负责产出文件下载。掌握以上内容后可以进一步阅读crazy_functions/目录下的现有插件源码如 PDF_Translate_Wrap.py、Internet_GPT_Wrap.py、Mermaid_Figure_Gen.py学习更多实现技巧也可以探索 自定义按钮 功能创建更轻量的快捷功能或查阅 主题定制 为插件界面增添个性。【免费下载链接】gpt_academic为GPT/GLM等LLM大语言模型提供实用化交互接口特别优化论文阅读/润色/写作体验模块化设计支持自定义快捷按钮函数插件支持Python和C等项目剖析自译解功能PDF/LaTex论文翻译总结功能支持并行问询多种LLM模型支持chatglm3等本地模型。接入通义千问, deepseekcoder, 讯飞星火, 文心一言, llama2, rwkv, claude2, moss等。项目地址: https://gitcode.com/GitHub_Trending/gp/gpt_academic创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考