Skip to content

feat: 实现插件系统与默认插件#1200

Draft
Keldos-Li wants to merge 1 commit into
GaiZhenbiao:mainfrom
Keldos-Li:extension
Draft

feat: 实现插件系统与默认插件#1200
Keldos-Li wants to merge 1 commit into
GaiZhenbiao:mainfrom
Keldos-Li:extension

Conversation

@Keldos-Li
Copy link
Copy Markdown
Collaborator

@Keldos-Li Keldos-Li commented May 17, 2026

工作概览

这个 PR 为 ChuanhuChat 引入一套参考 Stable Diffusion WebUI 设计的插件系统,并提供两个示例插件作为开发范例。

主要目标是让第三方插件可以在不直接修改主工程代码的情况下扩展聊天流程、设置页、侧边栏工具箱和前端资源。

主要变更

  • 新增插件加载与管理模块:modules/extensions.pymodules/plugin_callbacks.pymodules/plugin_context.py
  • 启动时自动扫描 extensions/ 目录,读取插件 metadata.json,并按启用状态加载 Python 脚本、CSS、JS
  • 新增聊天生命周期 hook,插件可以在对话发送前、模型响应后等阶段介入流程
  • 新增插件管理设置页,可安装 Git URL 或本地插件目录、启用/禁用插件、刷新插件列表、预留 Git 插件更新接口
  • 插件可以注册自己的设置 Tab,也可以注册侧边栏工具箱 Tab
  • 暴露 window.ChuanhuApp 前端 API,插件脚本可以复用主工程的 Gradio DOM 访问和初始化钩子
  • 新增开发者文档 docs/extensions.md

插件接口与开发规范

插件目录结构建议如下:

extensions/<extension_id>/
  metadata.json
  scripts/main.py
  style.css
  javascript/*.js

metadata.json 用于声明插件基础信息,例如:

  • id:稳定的插件 ID,只使用小写字母、数字、下划线或短横线
  • name / name_i18n:插件显示名和插件自带翻译
  • description / description_i18n:插件描述和插件自带翻译
  • version:插件版本
  • entry:Python 入口脚本,默认可指向 scripts/main.py

插件应当自行提供翻译字符串,不应把示例插件或第三方插件的文案写入主工程 locale 文件。

Python 插件入口通过 setup(context) 注册能力。当前支持的主要扩展点包括:

  • on_before_chat:发送到模型前修改用户输入、系统提示词或请求上下文
  • on_after_chat:模型返回后处理输出或记录结果
  • on_toolbox_tab:向侧边栏工具箱注册插件自己的 Tab
  • on_settings_tab:向设置页注册插件自己的设置 Tab

前端资源规范:

  • 插件自己的 CSS 必须放在插件目录内,例如 extensions/<id>/style.css,不要写入 ChuanhuChat 全局 custom CSS
  • 插件自己的 JS 应放在插件目录的 javascript/
  • 前端脚本应优先使用 window.ChuanhuApp
    • root() / gradioApp():获取 Gradio 根节点
    • onReady(callback):主界面首次初始化完成后执行
    • onRender(callback):Gradio render 后执行
    • onMutation(callback):Gradio 根节点内容变化后执行
    • userInput():获取主输入框
    • setInputValue(input, value):设置输入框值并派发 input/change 事件
  • 事件绑定应当幂等,例如使用 data-* 标记避免重复绑定

示例插件

提示词工具箱

extensions/prompt_tools

这是一个真实可用的侧边栏插件。它会在工具箱中注册一个 Tab,用户可以选择输出语言,并点击常用任务按钮,把润色、翻译、总结、解释代码、提取待办、邮件草稿、评审优化、会议纪要等提示词插入当前输入框。

这个插件主要展示:

  • 插件如何注册侧边栏 Tab
  • 插件如何维护自己的 CSS/JS
  • 插件如何通过 window.ChuanhuApp.userInput()setInputValue() 与主输入框交互
  • 插件如何提供自己的翻译字符串

自动笔记

extensions/auto_notes

这是一个流程 hook 示例。插件可以按配置把启用期间的问答追加到 Markdown 笔记中,适合沉淀会议纪要、学习记录和调试日志。

这个插件主要展示:

  • 插件如何注册自己的设置 Tab
  • 插件如何使用 on_after_chat 处理模型返回后的内容
  • 插件如何把自己的状态和说明放在插件设置页,而不是塞进插件管理页

UI 约定

  • 设置页保留一个“插件”管理 Tab,用于安装、启用/禁用和基础管理
  • 插件自己的设置项不放在插件管理 Tab 下,而是由插件注册独立设置 Tab
  • 设置页左侧在 About 后方显示“插件设置”分组标题,再列出插件注册的设置 Tab
  • 小屏幕下隐藏“插件设置”分组标题,避免横向 Tab 栏被无意义标题挤占
  • 插件列表使用紧凑列表:第一列为插件名和淡色元信息,第二列为启用开关
  • 暂时隐藏刷新列表和全部更新按钮,但保留后端接口,后续可恢复 UI

文档

新增 docs/extensions.md,覆盖:

  • 插件目录结构
  • metadata 字段说明
  • Python hook 注册方式
  • 前端资源加载规则
  • window.ChuanhuApp 前端 API
  • 侧边栏 Tab 与设置 Tab 注册方式
  • 插件安装、启用、禁用、更新接口约定
  • 示例插件说明

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant