---
name: gscore-plugin-development
description: >
  当用户要求"帮我写一个 GsCore 插件"、"给这个插件加功能"、"改造触发器支持 AI"、
  "怎么用 to_ai"、"注册 ai_tools"、"写一个游戏查询插件"、"插件帮助怎么注册"、
  "能力代理/代理画像"、"怎么为触发器添加AI功能"、"几个触发器的差别在哪"、"数据库和配置项怎么添加"
  "如何把数据库表挂到网页控制台"、"PIL/pytakumi/playwright 哪个用哪个"、
  "插件怎么挂自己的 HTTP 接口"、"插件怎么注册 FastAPI 路由"、
  "插件怎么挂前端页面"、"register_plugin_page"、"插件页 iframe"、
  "怎么扩展 RAG 嵌入后端"、"注册自定义 Embedding Provider"时触发此 SKILL。
  对所有 GsCore Bot 插件开发任务都应优先读取此 SKILL。

  为 GsCore 机器人框架编写插件的完整指南。涵盖项目级目录规范（参照 ZZZeroUID / SayuStock）、
  Plugins/SV 双层架构、各类触发器的语义差异（on_command vs on_prefix vs on_fullmatch vs
  on_keyword vs on_regex vs on_message vs on_file）、on_meta 监听平台元事件（进群 / 退群 / 戳一戳
  三种标准事件）、消息收发与撤回（wait_recall / unsend）/ 禁言（ban）、数据库操作并注册到网页控制台
  （site.register_admin / GsAdminModel）、订阅系统（gs_subscribe）、定时任务、配置管理、
  帮助系统（register_help + get_new_help）、推荐的渲染范式（优先 PIL → pytakumi
  → playwright 兜底）、AI 工具集成（@ai_tools、to_ai、ai_return、create_agent）、
  知识库 / 别名注册、启动钩子、to_ai 批量改造工作流、为插件挂 FastAPI 后端接口、
  嵌入 Provider 注册表（插件扩展 RAG 嵌入后端）。
---

# GsCore 插件开发完整指南（核心入口）

> 本 SKILL 已按章节拆分为主入口 + `references/` 子文档的形式组织。Agent 在需要某专题细节时，
> 顺着下文的相对路径按需 `ViewFile` / `ReadFile` 加载对应文件，**不要**一次性把所有内容塞进上下文。

## 文档目录索引

| 章节 | 主题 | 链接 |
|------|------|------|
| 一 | 插件基础结构（目录、命名、入口三件套、Plugins vs SV、pyproject、资源路径、**meta plugin**、**ruff / .vscode**） | [references/01-plugin-basics.md](./references/01-plugin-basics.md) |
| 二 | SV 与触发器（SV 实例、八种触发器语义对比、装饰器通用参数、签名规范） | [references/02-sv-and-triggers.md](./references/02-sv-and-triggers.md) |
| 三 | 消息收发（Event 属性、bot.send 各种形态、send_option、多步会话） | [references/03-messaging.md](./references/03-messaging.md) |
| 四 | 配置管理（CONFIG_DEFAULT、StringConfig、所有配置类型） | [references/04-config-management.md](./references/04-config-management.md) |
| 五 | 数据库操作（SQLModel 基类、`@with_session` / `@with_read_session`、`async_maker`、注册到 Web 控制台、`exec_list` 自动迁移） | [references/05-database.md](./references/05-database.md) |
| 六 | 定时任务与订阅（APScheduler、`gs_subscribe` 全套 API） | [references/06-scheduler-and-subscribe.md](./references/06-scheduler-and-subscribe.md) |
| 七 | 启动 / 关闭 / Bot 上线钩子（4 类钩子的区别与适用场景） | [references/07-lifecycle-hooks.md](./references/07-lifecycle-hooks.md) |
| 八 | 帮助系统注册（`register_help`、`get_new_help`、`register_status`） | [references/08-help-system.md](./references/08-help-system.md) |
| 九 | 图片渲染范式（PIL → pytakumi → playwright；AI 资料图走 `render_chart_spec`） | [references/09-image-rendering.md](./references/09-image-rendering.md) |
| 十 | AI 集成：`to_ai` 与 `ai_return`（**优先方案**） | [references/10-ai-to-ai-and-ai-return.md](./references/10-ai-to-ai-and-ai-return.md) |
| 十一 | AI 集成：`@ai_tools`（含 **covers/aliases**；仅纯 AI 内部工具） | [references/11-ai-tools-decorator.md](./references/11-ai-tools-decorator.md) |
| 十二 | AI 集成：知识库（`ai_entity`）与别名（`ai_alias`）注册 | [references/12-ai-knowledge-and-alias.md](./references/12-ai-knowledge-and-alias.md) |
| 十三 | AI 集成：`create_agent`（临时专用 AI Agent） | [references/13-ai-create-agent.md](./references/13-ai-create-agent.md) |
| 十四 | AI 集成：能力代理（`AgentNode`）Cookbook + `render_agent` / 业务节点（如 stock_report）+ `plugin_developer_agent` | [references/14-ai-capability-profile.md](./references/14-ai-capability-profile.md) |
| 十五 | 完整插件示例（MyGameUID 端到端） | [references/15-full-plugin-example.md](./references/15-full-plugin-example.md) |
| 十六 | 常用工具模块速查（`get_res_path` / `send_msg_to_master` / `error_reply` / 限流 / 缓存 / 字体 / `to_thread` / `cache_data` / 批量播报 / 常用 import） | [references/16-common-utilities.md](./references/16-common-utilities.md) |
| 十七 | 代码规范红线（禁止 try/except 兜底、cast、type:ignore、getattr/dict.get 兜底、Any、同步阻塞函数） | [references/17-code-redlines.md](./references/17-code-redlines.md) |
| 十八 | to_ai 批量改造工作流（背景、Step 0~4、完整股票 / 游戏示例、质量检查清单、Q&A） | [references/18-ai-trigger-migration.md](./references/18-ai-trigger-migration.md) |
| 十九 | 为插件挂 FastAPI 后端接口（共享 app、鉴权、CRUD、命名规范、反模式） | [references/19-fastapi-plugin-api.md](./references/19-fastapi-plugin-api.md) |
| 二十 | 嵌入 Provider 注册表（插件扩展 RAG 嵌入后端：懒 import、工厂模式、降级策略） | [references/20-embedding-provider-registry.md](./references/20-embedding-provider-registry.md) |
| 二十一 | AI 集成：在插件 repo 内管理 AI Skill（`ai_skill` 注册目录式 `SKILL.md` + 脚本/资源） | [references/21-ai-skill-registration.md](./references/21-ai-skill-registration.md) |
| 二十二 | 为插件挂 Web 控制台页面（`register_plugin_page` + `PluginAPI` + 页面 i18n + Hub iframe） | [references/22-plugin-pages.md](./references/22-plugin-pages.md) |

## 推荐开发流程（按需跳转）

1. **新建插件**：先看 [一、插件基础结构](./references/01-plugin-basics.md) 确定目录与命名，参考 [十五、完整插件示例](./references/15-full-plugin-example.md) 起步。
2. **加命令**：看 [二、SV 与触发器](./references/02-sv-and-triggers.md) 选合适触发器，按 [三、消息收发](./references/03-messaging.md) 写发送 / 多步会话；要监听进群/退群/戳一戳用 `on_meta`（[§2.6](./references/02-sv-and-triggers.md#26-on_meta监听平台元事件进群--退群--戳一戳)），要撤回/禁言看 [§3.5](./references/03-messaging.md#35-撤回消息wait_recall--unsend与禁言ban)。
3. **加配置**：看 [四、配置管理](./references/04-config-management.md) 定义 `CONFIG_DEFAULT` 与 `StringConfig`。
4. **加数据库表**：看 [五、数据库操作](./references/05-database.md)；纯 SELECT 用 `@with_read_session`，写入仍用 `@with_session`；要可视化后台看 §5.5，要给已部署用户补字段看 §5.7。
5. **加定时推送**：看 [六、定时任务与订阅](./references/06-scheduler-and-subscribe.md) 的 `gs_subscribe` 强制规范。
6. **加启动逻辑**：在 [七、生命周期钩子](./references/07-lifecycle-hooks.md) 选合适的钩子。
7. **加帮助 / 状态**：看 [八、帮助系统注册](./references/08-help-system.md)。
8. **画图**：参考 [九、图片渲染范式](./references/09-image-rendering.md) 的"决策口诀"选 PIL / pytakumi / playwright。
9. **想被 AI 调用**：
   - 命令同时也是用户命令 → [十、`to_ai` 与 `ai_return`](./references/10-ai-to-ai-and-ai-return.md) **（优先）**
   - 纯数据 / 内部工具 → [十一、`@ai_tools` 装饰器](./references/11-ai-tools-decorator.md)
   - 知识库 / 别名 → [十二、知识库与别名注册](./references/12-ai-knowledge-and-alias.md)
   - 临时 Agent 子任务 → [十三、`create_agent`](./references/13-ai-create-agent.md)
   - 业务专业代理 → [十四、能力代理画像](./references/14-ai-capability-profile.md)
   - 随插件分发 Markdown「技能」（SKILL.md + 脚本/资源，模型 `list_skills`/`run_skill_script` 调用）→ [二十一、AI Skill 注册](./references/21-ai-skill-registration.md)
   - **批量改造已有触发器支持 AI** → [十八、to_ai 批量改造工作流](./references/18-ai-trigger-migration.md)
10. **挂自己的 HTTP 后端接口**：看 [十九、FastAPI 插件 API](./references/19-fastapi-plugin-api.md)——复用 `gsuid_core.webconsole.app_app.app`，3 行加一个接口；要同时挂 **前端页** 用 [二十二、插件 Web 页面](./references/22-plugin-pages.md) 的 `register_plugin_page` + `PluginAPI`。
11. **扩展 RAG 嵌入后端**：看 [二十、嵌入 Provider 注册表](./references/20-embedding-provider-registry.md)——用 `register_embedding_provider` 注册 `sentence_transformers` / `llama.cpp embedding` 等自定义 Provider，懒 import + 工厂模式，自动出现在 WebConsole 下拉选项。
12. **定制 MCP Server**（Bearer 鉴权 / 工具导出过滤 / Event 会话补全）：看 [gscore-ai-core-api §11.1.7](../gscore-ai-core-api/references/11-mcp-image-search-and-meme.md#117-mcp-server-插件扩展点)。
13. **遇到 API 缓存 / 限流 / 字体 / 错误码 / 推主人 / 批量播报** 等问题：直接看 [十六、常用工具模块速查](./references/16-common-utilities.md)。
14. **写完代码**：用 [十七、代码规范红线](./references/17-code-redlines.md) 自查（try/except、cast、type:ignore、getattr 兜底、Any、同步阻塞函数全部禁止）。

## 关键概念速记（先看这一段再决定读哪一章）

- **嵌套加载**：`外层 __init__.py` + `外层 __nest__.py`（空文件） + `内层 __init__.py` 声明 `Plugins(...)` + `内层 __full__.py`（空文件）。详见 [一、插件基础结构 §1.2](./references/01-plugin-basics.md#12-入口三件套)。
- **基础设施插件（meta plugin）**：`[tool.gsuid] kind = "meta"` + 内层 `api/`。别人硬依赖 `from gscore_mail.api import send`；软依赖先 `import_api("gscore_mail")` 再同样 import。不要 try/except，不要改 Core 去声明对方的类型。详见 [§1.6](./references/01-plugin-basics.md#16-基础设施插件meta-plugin)。
- **每个插件自带 Ruff / `.vscode`**：插件常被单独打开，读不到 Core 根配置。根目录放 `ruff.toml` + `.vscode/extensions.json` + `.vscode/settings.json`（`extraPaths` 指到 Core 仓库根）。详见 [§1.7](./references/01-plugin-basics.md#17-插件仓库的-ruff--vs-code-配置)。
- **Plugins vs SV**：插件级 vs 服务模块级；`SV` 自动从调用栈推断归属。详见 [§1.3](./references/01-plugin-basics.md#13-plugins-vs-sv-的层级关系)。
- **触发器选择**：`on_command`（推荐默认）vs `on_prefix`（强制带参）vs `on_fullmatch`（精确匹配）vs `on_keyword`（污染消息流，慎用）vs `on_regex`（复杂结构）vs `on_file` / `on_message`（特殊）。详见 [§2.2](./references/02-sv-and-triggers.md#22-触发器语义速查)。
- **监听平台事件用 `on_meta`**：标准元事件**仅三种**——`user_join_group` / `user_exit_group` / `poke`，`data` 字段跨平台统一（适配器侧已归一），可放心监听；其他事件不做适配。触发器内用 `ev.get_meta(key)` 读字段；与命令路径**双向隔离**。详见 [§2.6](./references/02-sv-and-triggers.md#26-on_meta监听平台元事件进群--退群--戳一戳)。
- **撤回 / 禁言**：`bot.send(..., wait_recall=True)` 返回出站 id 列表（`Optional[List[str]]`），配 `bot.unsend(...)` 撤回；`bot.ban(user_id, group_id, duration)` 禁言（`duration=0` 解禁）。三者 HTTP 模式不支持。详见 [§3.5](./references/03-messaging.md#35-撤回消息wait_recall--unsend与禁言ban)。
- **`to_ai` vs `@ai_tools` 二选一**：同一函数不可同时用。命令也允许用户直接触发 → `to_ai`；纯 AI 内部工具 → `@ai_tools`。详见 [§10](./references/10-ai-to-ai-and-ai-return.md) / [§11](./references/11-ai-tools-decorator.md)。
- **插件工具要被跨措辞召回**：填 **`covers`（数据域）** + **`aliases`（领域·同义问法）**，勿只靠 docstring。详见 [§11.5](./references/11-ai-tools-decorator.md#115-covers--aliases跨措辞召回2026-08)。
- **主动推送必须用 `gs_subscribe`**：不要 `for bot in gss.active_bot.items(): await bot.target_send(...)` 硬塞群号。详见 [§6.2](./references/06-scheduler-and-subscribe.md#62-主动推送强制规范)。
- **数据库 Schema 变更用 `exec_list`**：放在 `on_core_start_before` 阶段执行。详见 [§5.7](./references/05-database.md#57-为已定义的表添加新列)。
- **只读查询用 `@with_read_session`**：纯 SELECT 走独立读槽（SQLite WAL）；写入 / 读后写仍用 `@with_session`。详见 [§5.3](./references/05-database.md#53-with_session--with_read_session)。
- **MCP Server 插件钩子**：`register_mcp_token_verifier` / `register_mcp_event_enricher` / `register_mcp_export_filter`，在插件 `__init__.py` 顶层注册。详见 [gscore-ai-core-api §11.1.7](../gscore-ai-core-api/references/11-mcp-image-search-and-meme.md#117-mcp-server-插件扩展点)。
- **唯一允许 `try/except` 的地方**：`_ai_return_xxx()` 辅助函数。详见 [§17.3](./references/17-code-redlines.md#173-ai_return-辅助函数的特殊说明)。
- **图片渲染优先级**：PIL（首选）→ pytakumi（推荐）→ playwright（兜底）。详见 [§9.1](./references/09-image-rendering.md#91-三档渲染方案优先级从高到低)。
- **能力代理用 `AgentNode` + `register_agent_node`**：交付边界默认框架叠加；出图派 `render_agent`；业务强制「插件工具 > web」。详见 [§14](./references/14-ai-capability-profile.md)。
- **`to_ai` 改造三层**：触发器层 `to_ai="..."` + 数据/渲染层 `ai_return()` + 业务画像 `CapabilityAgentProfile`；详见 [§18.1](./references/18-ai-trigger-migration.md#181-背景你要做的事) 与 [§18.3 Step 0.4](./references/18-ai-trigger-migration.md#step-04-判断是否需要注册-capability-agent-画像)。
- **`ai_return` 注入点 = 数据已拿到 / 图片未生成**：必须在数据层函数里，不能只在触发器层。详见 [§18.3 Step 3](./references/18-ai-trigger-migration.md#step-3逐层分析调用链找出数据层注入-ai_return)。
- **插件 FastAPI = 共享 app + `Depends(require_auth)`**：从 `gsuid_core.webconsole.app_app import app` 即可挂自己的 `/api/<插件名>/...` 路由；详见 [§19.2](./references/19-fastapi-plugin-api.md#192-最简示例3-行代码加一个-get-接口) 与 [§19.3](./references/19-fastapi-plugin-api.md#193-加鉴权推荐-复用-require_auth)。
- **插件前端页 = `register_plugin_page` + `web/` 静态目录**：Hub `/plugins` 右侧按钮打开 iframe；页面 i18n 放 `web/locales/{zh-CN,en-US,ja-JP}.json`，引入 `/plugin-pages/_sdk/gshub-plugin.js`。API 用 `PluginAPI()` 前缀 `/api/<plugin_id>`。详见 [§22](./references/22-plugin-pages.md)。
- **嵌入 Provider 注册 = 懒 import + 工厂模式**：插件 `__init__.py` 顶层调用 `register_embedding_provider` 注册 `EmbeddingProviderEntry`，重依赖只能在 `factory` 内部 import；注册时序保证早于消费；配置指向的 Provider 不可用时框架自动降级回 `local` 并记录 error，不会导致 AI 核心整体不可用。详见 [§20](./references/20-embedding-provider-registry.md)。
- **AI Skill 随插件走 = `ai_skill(目录)`**：插件 `__init__.py` 顶层一行 `ai_skill(Path(__file__).parent / "skills")` 即把 repo 内 `skills/<name>/SKILL.md`（+ 脚本/资源）注册为运行时技能，无需挪进 `data/ai_core/skills/`；webconsole 内标记 `source="plugin"` 且只读。注意「运行时 Skill」≠「`.agents/skills` 开发文档 skill」。详见 [§21](./references/21-ai-skill-registration.md)。

## 关联文档（本 SKILL 文件夹内）

- 触发器 → AI 迁移工作流：[§18、to_ai 批量改造](./references/18-ai-trigger-migration.md)
- 插件挂后端 API：[§19、FastAPI 插件 API](./references/19-fastapi-plugin-api.md)
- 插件挂前端页：[§22、插件 Web 页面](./references/22-plugin-pages.md)
- 嵌入 Provider 注册：[§20、嵌入 Provider 注册表](./references/20-embedding-provider-registry.md)

## 关联文档（同仓库其他位置）

- AI Agent 总架构：[`docs/AI_AGENT_ARCHITECTURE.md`](../../../docs/AI_AGENT_ARCHITECTURE.md)
- AI 触发流程 / 框架开发：[`.agents/skills/gscore-development/SKILL.md`](../gscore-development/SKILL.md)
- AGENTS.md（代码红线）：仓库根目录 [`AGENTS.md`](../../../AGENTS.md)
- AI Core API（给插件用）：[gscore-ai-core-api](../gscore-ai-core-api/SKILL.md)；MCP Server 钩子见 [§11.1.7](../gscore-ai-core-api/references/11-mcp-image-search-and-meme.md#117-mcp-server-插件扩展点)
- WebConsole 后端 API 设计：[`gsuid_core/webconsole/docs/README.md`](../../../gsuid_core/webconsole/docs/README.md)
