feat(sdk): 22 个示例插件配齐 skill + 三态启动声明 + 打包期校验

## 用户的三条要求

1. 「所有插件都默认自启会占启动时间,还在 llms 上下文塞大量工具」
   ⇒ 纯工具型改为按需加载,靠 skill 让 agent 知道要先拉起。
2. 「会向 agent 注入输入的部分插件不能这样做」
   ⇒ 9 个必须常驻,其余 13 个按需。
3. 「sdk 是不是没有暴露插件声明自身行为的方案」
   ⇒ 对:auto_start 只在 internal/plugin/manifest.go 有,SDK 零命中。

## 定级依据(代码证据,不是猜描述)

注入 / 钩子 ⇒ 必须常驻(9 个):

	qq         HTTP 监听 NapCat 推送,消息到达要立刻注入
	rss        轮询订阅源,新文章主动推送
	calendar   30s ticker 检查提醒
	memo       5min ticker 检查待办到期
	a2a        TCP 监听外部 Agent 请求
	acp        TCP 监听 ACP 客户端
	browser    ticker + 长命令完成回调
	sanitizer  注册 stage 钩子(无工具,要每轮生效)
	luademo    注册 stage 钩子做示范

纯工具型 ⇒ 按需(13 个):
	weather ocr music bili ai_image files editdoc deepsearch
	plugindev recoverydiag vanblog vikunja commondev

★ commondev 值得单独说:它虽然有 6 处 Inject 调用,但**注入源是自己的
sidecar 完成回投**,而 sidecar 只在 commondev_agent_up 时才拉起
(Start() 里不启 sidecar,通道也在 agent_up 时才注册)。所以没有 agent
调用它时,它不需要做任何事 —— 可以按需。44 个工具 ≈726 tokens 省下来可观。

## 改动

 · 22 个插件各配一个 skill,写明:何时用、先 plugin_start、
   工具清单、**用 plugin_stop 而不是 plugin_disable**
 · 13 个 plg.json 加 `auto_start: false`
 · `sdk/autostart.go`:把三态语义与"按需插件必须有 skill"的理由写进公开 SDK
 · hmapdev 打包期校验:`auto_start=false` 但无 skill/ 目录 ⇒ 直接 exit 1
   (理由:缺 skill 的按需插件**等价于没装**,比没装更糟 —— 占着磁盘让人以为可用)
 · 修 Lua 打包路径:它**完全不走** rawfile/skill 收集,luademo 的 skill 永远打不进去
 · 修 build-examples.sh:原来 `[ ! -x ]` 判"二进制在不在",改了 hmapdev 源码后
   重新打包**仍用旧工具链**(实测:luademo 的 skill 一直是 0)
 · 补 mocksdk.ToolDef.Timeout(上一轮加 ToolDef.Timeout 时漏了镜像)

## 判据

 · TestHasSkillDirRequiresRealSkillMd(空目录/.gitkeep/无 SKILL.md 都不算)
 · TestBuildRejectsOnDemandWithoutSkill(打包期必须真拦住 + exit 1)
 · TestLuaPackagingCollectsSkillAndRawfiles(**验代码行**,不验注释 —— 第一版
   只查符号存在,把 createHmapWithRaw 换回 createHmap 判据照样通过)

## 踩过的坑

 · Lua 分支的结束边界原是 `// Resolve build config`,但那个注释在文件里
   **出现多次**(Go 路径里也有),用它截取会把 Go 分支一起包进来 ⇒
   变异测不出。改成截到 Lua 分支自己的 `return` + `}`。
This commit is contained in:
JianFeeeee
2026-10-18 13:21:47 +08:00
parent e1b458a710
commit 74e2c654ed
42 changed files with 1537 additions and 28 deletions

View File

@ -0,0 +1,45 @@
---
name: a2a-tools
description: Agent-to-Agent 协议通信(TCP 服务端 + 客户端)。本插件**常驻自启**:它在监听外部 Agent 请求。
---
# A2A 通信
## 本插件为什么常驻
a2a 插件在 **TCP 端口上监听**其他 Agent 发来的 Tasks/Send 请求,收到后注入给本 agent 处理。
改成按需加载 ⇒ 端口不监听 ⇒ **外部 Agent 的请求无人应答**,
对方只会看到连接失败或超时,而本机**毫无记录**。
## 工具
| 工具 | 用途 |
|---|---|
| `a2a_query` | 向其他 Agent 发请求 |
| `a2a_discover` | 发现可用的对端 |
| `a2a_configure` | 配置对端地址 |
| `a2a_restart` | 重启监听 |
| `a2a_status` | 查监听状态与已知对端 |
## 注意
- 监听地址/端口在插件配置里。端口冲突时 `a2a_status` 会明确报错。
- 出站 `a2a_query` 需要能连上对端,网络不通时明确报错,不要重试到超时。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -0,0 +1,43 @@
---
name: acp-tools
description: Agent Client Protocol 通信(服务端 + 客户端)。本插件**常驻自启**:它在监听外部 ACP 请求。
---
# ACP 通信
## 本插件为什么常驻
acp 插件在 **TCP 端口上监听** ACP 客户端的 session/new 等请求。
改成按需加载 ⇒ 端口不监听 ⇒ 外部调用方(如编辑器、其他 agent 框架)
连不上,而本机无任何记录。
## 工具
| 工具 | 用途 |
|---|---|
| `acp_query` | 以 ACP 客户端身份向对端发起请求 |
| `acp_configure` | 配置对端 |
| `acp_status` | 查监听与对端状态 |
## 注意
与 a2a 的区别:A2A 是 Agent 对 Agent 的任务协议,ACP 是
"客户端驱动 agent 会话"的协议(更像 IDE 集成)。两者可能同时在跑。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -16,5 +16,6 @@
"outdir": "dist",
"bundle": true,
"replaces": {},
"source_dirs": []
}
"source_dirs": [],
"auto_start": false
}

View File

@ -0,0 +1,50 @@
---
name: ai-image-tools
description: AI 图像生成(DALL·E / Stable Diffusion)。按需工具:先 plugin_start ai_image,用完可 plugin_stop。
---
# AI 画图
## 什么时候用
用户要求**生成图片**(画一张、生成插画、做个配图)时。
## 先拉起插件
```
plugin_start name=ai_image
```
| 工具 | 用途 |
|---|---|
| `ai_image_generate` | 按提示词生成图片 |
## 用完可释放
```
plugin_stop name=ai_image
```
## 注意
- 需要配置**上游服务**(DALL·E 或 SD)与各自的密钥;没配时会明确报错,
不要重试或猜一个 URL。
- 生图有成本(按张计费)。一次不满意就调整提示词,不要连续盲试。
- 提示词用**画面描述**(主体/风格/构图/光线),不是命令式句子。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -15,5 +15,6 @@
"outdir": "dist",
"bundle": true,
"replaces": {},
"source_dirs": []
}
"source_dirs": [],
"auto_start": false
}

View File

@ -0,0 +1,49 @@
---
name: bili-tools
description: B站视频清晰度查询与下载(yt-dlp)。按需工具:先 plugin_start bili,用完可 plugin_stop。
---
# B站视频
## 什么时候用
用户要**下载 B站视频**,或想知道某个视频有哪些清晰度可选时。
## 先拉起插件
```
plugin_start name=bili
```
| 工具 | 用途 |
|---|---|
| `bili_video` | 查清晰度列表 / 按指定格式下载 |
## 用完可释放
```
plugin_stop name=bili
```
## 注意
- 依赖 **yt-dlp**,未安装时会明确报错。
- 下载目录由插件配置决定,不要假设是当前工作目录。
- 先查清晰度列表再下载,不要盲目选最高(可能体积很大)。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -0,0 +1,55 @@
---
name: browser-tools
description: 统一浏览器能力(搜索/HTTP 抓取/无头渲染/CDP 交互)。本插件**常驻自启**:它有 ticker 与长命令回调,会主动注入。
---
# 浏览器
## 本插件为什么常驻
browser 插件有两处**主动注入**:
1. **30 秒 ticker** —— 检查长任务(渲染、下载)的进度
2. **长时间命令的完成回调** —— 命令跑完后把结果注入回来
改成按需加载 ⇒ 长任务还在跑、插件却被卸载 ⇒ 结果无人接收,
或者在跑的任务变成孤儿进程。
## 工具
| 组 | 工具 |
|---|---|
| 轻量 | `search` `fetch`(HTTP 抓取,快) |
| 渲染 | `render` `html`(无头浏览器,慢) |
| 交互 | `start` `navigate` `screenshot` `click` `type` `scroll` `close` |
| 环境 | `install`(装浏览器依赖) |
## 选哪个
| 需求 | 用 |
|---|---|
| 只要页面文字 | `fetch`(最快,不执行 JS) |
| 页面靠 JS 渲染 | `render` |
| 要点击/填表/截图 | `start` → `navigate` → 交互 → `close` |
## 注意
- 交互式会话**用完必须 `close`**,否则浏览器进程一直占内存。
- `install` 只在缺依赖时用,不要每次都跑。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -0,0 +1,47 @@
---
name: calendar-tools
description: 日历事件与提醒。本插件**常驻自启**:它定时检查提醒并主动通知。
---
# 日历
## 本插件为什么常驻
日历插件有一个 **30 秒的提醒 ticker**。到点的事件会主动注入给 agent,
让 agent 提醒用户。
改成按需加载 ⇒ 没有 ticker ⇒ **提醒永远不会响**。而"提醒不响"比"没有提醒功能"
更糟:用户以为设了闹钟,实际上什么都没发生。
## 工具
| 工具 | 用途 |
|---|---|
| `calendar_event_add` | 新建事件(可带提醒) |
| `calendar_event_list` | 列出事件 |
| `calendar_event_update` | 修改事件 |
| `calendar_event_delete` | 删除事件 |
| `calendar_today` / `week` / `month` | 按范围查看 |
| `calendar_search` | 搜索事件 |
## 注意
- 时间必须确认**时区**。用户说"明天三点"时,先确认是本地时间。
- 重复事件要明确是每天/每周/每月。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -6,7 +6,13 @@
"description": "主管式多仓库开发流水线:登记项目、开工程对话、为每条线拉起内置 pi 并注册一对通道,投递任务给 pi 并在同一会话内续投。",
"author": "HomeAgent",
"entry": "plugin.so",
"tags": ["commondev", "git", "agent", "develop"],
"tags": [
"commondev",
"git",
"agent",
"develop"
],
"targets": "linux/amd64",
"rawfiles": []
"rawfiles": [],
"auto_start": false
}

View File

@ -7,6 +7,43 @@ author: HomeAgent
# commondev 纪律(主管模式 · 工程对话 · 平台操作)
## ★ 本插件默认不自启:先拉起再用
commondev 的 44 个工具占约 726 tokens,是本组最大的。因此它**默认不自启**
(`auto_start: false`),不在初始工具清单里。
需要开工程线/派活时:
```
plugin_start name=commondev
```
**用完必须关掉**(44 个工具常驻会持续吃上下文):
```
plugin_stop name=commondev
```
### 什么时候可以关
安全关闭的判据是"**没有在跑的工程线**":
1. 先查有没有活着的 sidecar:`commondev_agent_state`(看 `agent_alive`)
2. 有在跑的线,先停:`commondev_agent_down`(暂停)或
`commondev_agent_interrupt`(只停当前这一轮,保留会话)
3. 确认都不在跑,再 `plugin_stop`
★ **不要在有 sidecar 在跑时直接 disable** —— 进程会变成孤儿。
插件 `Stop()` 里有幂等全清(sidecar / pi 进程一个不留),但那是兜底,
不是正常路径。
### 关闭不影响已做的活
台账(`ledger.json`)、工作目录、分支状态、凭据全部**持久化在磁盘**。
下次 `plugin_start` 后 `commondev_project_list` / `commondev_branch_status`
能看到之前的一切,`commondev_agent_up` 能接着用原来的 session 续投。
本技能三部分,**都可能与你的任务直接相关**:
- **第一部分:使用者纪律** —— 怎么开工程、怎么派活。
@ -853,3 +890,20 @@ pi 进程、sidecar、ssh 会话、workdir(含凭据残留检查)一个不
6. **改了内置插件源码只重启服务** —— 必须重编 homed。
7. **手改生成的文档**(`docs/api/*.md` 首行写着「请勿手改」)—— 改 `sdk/*.go` 注释再重新生成。
8. **为了让插件生效去改 homed 的源码** —— 先确认它是不是内置插件。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -13,5 +13,6 @@
"retrieval",
"news"
],
"targets": "linux/amd64"
}
"targets": "linux/amd64",
"auto_start": false
}

View File

@ -0,0 +1,58 @@
---
name: deepsearch-tools
description: 真正的联网检索(本地 SearXNG 聚合多引擎)。按需工具:先 plugin_start deepsearch,用完可 plugin_stop。
---
# 联网检索
## 什么时候用
需要**当前**信息(新闻、价格、版本号、事件进展),
而你的训练数据可能过期时。
★ 判断标准:答案是"昨天的"就会出错的问题,就用它。
常识性、不变的知识不用搜。
## 先拉起插件
```
plugin_start name=deepsearch
```
| 工具 | 用途 |
|---|---|
| `deepsearch_search` | 通用检索(标题/URL/摘要/时间) |
| `deepsearch_news` | 新闻检索 |
| `deepsearch_fetch` | 抓取指定 URL 正文 |
| `deepsearch_deep` | 深度检索(多轮、更全) |
| `deepsearch_status` | 查后端服务是否可用 |
## 用完可释放
```
plugin_stop name=deepsearch
```
## 注意
- 后端是**本地 SearXNG**。服务没起时 `deepsearch_status` 会明确报错,
不要编造检索结果。
- 引用检索结果时**带上 URL 和日期**,让用户能自己核对。
- 摘要可能不准,关键事实要 `deepsearch_fetch` 打开原文确认。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -18,5 +18,6 @@
"outdir": "dist",
"bundle": true,
"replaces": {},
"source_dirs": []
}
"source_dirs": [],
"auto_start": false
}

View File

@ -0,0 +1,54 @@
---
name: office-tools
description: 办公文档读写转换(docx/xlsx/pptx/md/csv/txt,基于 python-docx 等)。按需工具:先 plugin_start editdoc,用完可 plugin_stop。
---
# 办公文档
## 什么时候用
用户要**新建/读取/编辑/转换** Word、Excel、PPT、Markdown、CSV 文件时。
## 先拉起插件
```
plugin_start name=editdoc
```
| 工具 | 用途 |
|---|---|
| `read_document` | 读文档内容与结构 |
| `create_document` | 新建文档 |
| `create_from_template` | 用模板新建 |
| `edit_document` | 编辑现有文档 |
| `convert_document` | 格式转换(如 docx→md) |
| `office_check` | 检查依赖是否齐全 |
## 用完可释放
```
plugin_stop name=editdoc
```
## 注意
- 依赖 **Python 库**(python-docx / openpyxl / python-pptx)。
先跑 `office_check` 确认,缺库时工具会明确报错。
- 改文档前先 `read_document` 看清结构,避免覆盖掉原有格式与内容。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -6,10 +6,14 @@
"description": "文件系统操作工具集(读取/写入/编辑/列表),提供沙箱化文件访问,支持配置工作目录。",
"author": "HomeAgent",
"entry": "plugin.so",
"tags": ["files", "filesystem"],
"tags": [
"files",
"filesystem"
],
"targets": "linux/amd64",
"outdir": "dist",
"bundle": true,
"replaces": {},
"source_dirs": []
"source_dirs": [],
"auto_start": false
}

View File

@ -0,0 +1,54 @@
---
name: file-tools
description: 沙箱内文件读写(read/write/edit/ls)。按需工具:先 plugin_start files,用完可 plugin_stop。
---
# 文件操作
## 什么时候用
需要在**插件配置的工作目录**内读写文件时。
★ 如果你已经有 run_shell / bash 之类的能力,优先用那个 —— 它更直接。
本插件适合**没有 shell 权限**或需要走沙箱路径限制的场景。
## 先拉起插件
```
plugin_start name=files
```
| 工具 | 用途 |
|---|---|
| `files_read` | 读文件内容 |
| `files_write` | 写文件(覆盖) |
| `files_edit` | 局部替换编辑 |
| `files_ls` | 列目录 |
## 用完可释放
```
plugin_stop name=files
```
## 注意
- 只能访问**配置的工作目录**内。走出沙箱会明确报错,不要试图绕。
- 写/改之前先读一遍,确认不是要保留的内容。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -0,0 +1,47 @@
---
name: luademo-tools
description: Lua 插件全功能示例(工具 + 阶段钩子 + 通道 + 数据 API)。本插件**常驻自启**:它注册 stage 钩子做示范。
---
# Lua 插件示例(luademo)
## 这个插件是什么
**示例工程**,不是实用工具。它演示 Lua 插件能做的四件事:
1. 注册工具(`no_memory` / `cleaner` 两种形态)
2. 注册阶段钩子
3. 注册通道
4. 使用数据类 API
## 本插件为什么常驻
它注册了 stage 钩子(与 sanitizer 同理,钩子要每轮生效)。
若只是想看代码示例,可以关掉;若在**验证 Lua 适配层**,必须让它常驻跑着。
```
plugin_stop name=luademo # 仅看代码时
plugin_start name=luademo # 验证 Lua VM / 钩子时
```
## 开发者看这里
读 `example/luademo/` 的源码 + 本文件即可上手写自己的 Lua 插件。
Lua 侧能力边界由内核 `FacilityLua`(Lua 协议适配 VM)决定。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -0,0 +1,45 @@
---
name: memo-tools
description: 待办与备忘录(到期主动提醒)。本插件**常驻自启**:它定时检查待办到期。
---
# 待办与备忘录
## 本插件为什么常驻
memo 插件有一个 **5 分钟的 ticker**,检查有没有到期的待办,到点主动提醒。
改成按需加载 ⇒ 没有 ticker ⇒ **待办到期不提醒**,
而用户设待办就是为了被提醒。
## 工具
| 工具 | 用途 |
|---|---|
| `memo_todo_add` | 加待办(可带截止时间) |
| `memo_todo_complete` | 完成待办 |
| `memo_todo_list` | 列出待办 |
| `memo_todo_delete` | 删除待办 |
| `memo_create` / `memo_list` / `memo_delete` | 备忘录增删查 |
## 注意
待办 vs 备忘录的区别:**待办**有完成状态、会提醒;**备忘录**只是记着。
用户说"提醒我"时用待办,说"记一下"时用备忘录。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -6,10 +6,16 @@
"description": "音乐搜索插件,支持搜索歌曲和查看歌词(基于网易云音乐)",
"author": "HomeAgent",
"entry": "plugin.so",
"tags": ["music", "song", "lyrics", "网易云"],
"tags": [
"music",
"song",
"lyrics",
"网易云"
],
"targets": "linux/amd64",
"outdir": "dist",
"bundle": true,
"replaces": {},
"source_dirs": []
"source_dirs": [],
"auto_start": false
}

View File

@ -0,0 +1,48 @@
---
name: music-tools
description: 搜索歌曲与查看歌词(网易云音乐)。按需工具:先 plugin_start music,用完可 plugin_stop。
---
# 音乐搜索
## 什么时候用
用户问某首歌、某个歌手、想找歌词时。
## 先拉起插件
```
plugin_start name=music
```
| 工具 | 用途 |
|---|---|
| `music_search` | 按歌名/歌手搜索 |
| `music_lyrics` | 查指定歌曲的歌词 |
## 用完可释放
```
plugin_stop name=music
```
## 注意
只返回**曲目信息与歌词文本**,不下载音频文件。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -6,10 +6,15 @@
"description": "图片文字识别工具,基于 Tesseract OCR 引擎。支持从 URL 或 base64 图片中提取文字内容。",
"author": "HomeAgent",
"entry": "plugin.so",
"tags": ["ocr", "image", "text"],
"tags": [
"ocr",
"image",
"text"
],
"targets": "linux/amd64",
"outdir": "dist",
"bundle": true,
"replaces": {},
"source_dirs": []
"source_dirs": [],
"auto_start": false
}

View File

@ -0,0 +1,51 @@
---
name: ocr-tools
description: 从图片中提取文字(Tesseract OCR)。按需工具:先 plugin_start ocr,用完可 plugin_stop。
---
# 图片文字识别
## 什么时候用
用户给了**图片里带文字**(截图、照片、扫描件),需要把文字读出来时。
★ 如果图片是**给模型看内容**(风景、人物、界面布局),不需要 OCR ——
直接用 see_image 看就行。只有"要文字"才用本插件。
## 先拉起插件
```
plugin_start name=ocr
```
| 工具 | 用途 |
|---|---|
| `ocr_ocr_image` | 从 URL 或 base64 图片提取文字 |
## 用完可释放
```
plugin_stop name=ocr
```
## 注意
- 依赖本机 **Tesseract** 引擎;未安装时工具会明确报错,不要当成"图片里没字"。
- 识别结果可能含错字(尤其手写/低分辨率)。引用原文时提示这一点。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -15,5 +15,6 @@
"outdir": "dist",
"bundle": true,
"replaces": {},
"source_dirs": []
"source_dirs": [],
"auto_start": false
}

View File

@ -0,0 +1,55 @@
---
name: plugindev-tools
description: 插件开发工具链(脚手架/构建 .hmap/SDK 管理)。按需工具:先 plugin_start plugindev。
---
# 插件开发
## 什么时候用
用户要**写一个新插件**、构建 `.hmap`、或管理 SDK 版本时。
## 先拉起插件
```
plugin_start name=plugindev
```
| 工具 | 用途 |
|---|---|
| `plugindev_status` | 查工具链与 SDK 状态 |
| `plugindev_init` | 生成插件工程脚手架 |
| `plugindev_build` | 构建打包 `.hmap` |
| `plugindev_sdk` | SDK 版本安装/切换 |
| `plugindev_projects` | 列已有插件工程 |
## 开发完可释放
```
plugin_stop name=plugindev
```
## 关键纪律
- 构建产物(`.hmap`)**必须用 `plugin_install` 安装**,
不要手工解包替换 `plugin.bin` —— 那会绕过整包校验、备份回滚、
rawfile 全量解包。
- 声明 `auto_start=false`(按需加载)的插件**必须**配 `skill/`,
否则 agent 不知道它存在,等价于没装。打包时会被拦下。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -0,0 +1,48 @@
---
name: qq-tools
description: QQ 消息收发(NapCat 协议桥接)。本插件**常驻自启**:它在监听外部消息,不能按需加载。
---
# QQ 消息
## 本插件为什么常驻
QQ 插件在 **HTTP 端口上监听 NapCat 推送**。用户发来的 QQ 消息**随时可能到达**,
到达后它立刻注入给 agent。
如果把本插件改成按需加载:
- 内核启动时它不会被拉起
- **没有人会去拉起它** —— 因为没有人知道有消息在等着
- 结果:QQ 消息**静默丢失**,用户以为 agent 不理他
所以 `auto_start` 必须保持默认(true)。这不是性能取舍,是**功能正确性**。
## 工具
| 工具 | 用途 |
|---|---|
| `qq_send`(及消息类工具) | 主动发消息 |
## 注意
- 依赖 **NapCat** 服务在运行且已登录。
- 消息可能过期(NapCat 侧有时效),发送失败时会明确报错。
- **不要在群里 @全体成员**、不要连续刷屏。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -17,5 +17,6 @@
"outdir": "dist",
"bundle": true,
"replaces": {},
"source_dirs": []
}
"source_dirs": [],
"auto_start": false
}

View File

@ -0,0 +1,53 @@
---
name: recovery-tools
description: 崩溃取证与自检(退出码/信号/config.db 完整性/日志扫描)。按需工具:先 plugin_start recoverydiag。
---
# 故障取证
## 什么时候用
服务**起不来、反复重启、行为异常**,需要查清原因时。
正常运行时不需要它。
## 先拉起插件
```
plugin_start name=recoverydiag
```
| 工具 | 用途 |
|---|---|
| `diag_triage` | 退出码/信号/存活状态粗分 |
| `diag_db` | config.db 完整性检查 |
| `diag_log_scan` | 扫描日志找错误模式 |
| `diag_delta` | 对比两次快照的差异 |
| `diag_loc` | 定位日志/配置位置 |
## 排查完可释放
```
plugin_stop name=recoverydiag
```
## 注意
这些工具**只读**诊断,不修改任何状态。
要修复请明确告知用户具体动作,不要自行修改系统配置。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -0,0 +1,44 @@
---
name: rss-tools
description: RSS/Atom 订阅与更新推送。本插件**常驻自启**:它定时轮询订阅源,新内容要主动推送。
---
# RSS 订阅
## 本插件为什么常驻
RSS 插件每 **N 分钟轮询**所有订阅源。发现新文章后**主动注入**给 agent,
由 agent 决定要不要告诉用户。
改成按需加载 ⇒ 没人轮询 ⇒ **新文章永远不会被发现**,而且不报错。
## 工具
| 工具 | 用途 |
|---|---|
| `rss_subscribe` | 订阅一个源 |
| `rss_unsubscribe` | 取消订阅 |
| `rss_list` | 列出所有订阅 |
| `rss_check_now` | 立刻检查一次(不等下一次轮询) |
## 注意
- 轮询间隔可在插件配置里调(默认 30 分钟)。
- 订阅源失效会记日志但不会删订阅,需要时用 `rss_list` 看状态。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -0,0 +1,38 @@
---
name: sanitizer-tools
description: 清洗 LLM 输出里的工具调用残留(思维泄漏)。本插件**常驻自启**:它注册的是 stage 钩子,不解包任何工具。
---
# 输出清洗
## 本插件为什么常驻
sanitizer **没有工具**,它注册三个 stage 钩子:
| 钩子 | 时机 | 作用 |
|---|---|---|
| `StageOnInput` | 输入时 | 清理输入里的协议残留 |
| `StageAfterToolcall` | 工具调用后 | 去掉工具结果的格式噪声 |
| `StagePostAction` | 动作后 | 清洗即将发出去的回复 |
stage 钩子**必须在每一轮**都生效。停掉它不影响"能不能用",
但会让脏输出漏给用户(模型把内部工具调用语法当正文吐出来)。
所以它属于"基础设施型"插件:既不占工具槽位,也不能按需加载。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -6,6 +6,11 @@
"description": "管理 VanBlog 开源博客系统:文章的增删改查、分类标签管理、草稿发布、备份导出等",
"author": "HomeAgent",
"entry": "plugin.so",
"tags": ["blog", "vanblog", "cms"],
"targets": "linux/amd64"
}
"tags": [
"blog",
"vanblog",
"cms"
],
"targets": "linux/amd64",
"auto_start": false
}

View File

@ -0,0 +1,60 @@
---
name: vanblog-tools
description: 管理 VanBlog 博客(文章/分类/标签/草稿/备份等,28 个工具)。按需工具:先 plugin_start vanblog,用完可 plugin_stop。
---
# VanBlog 博客管理
## 什么时候用
用户要**写/改文章、管分类标签、发布草稿、备份**他们的 VanBlog 站点时。
## 先拉起插件
```
plugin_start name=vanblog
```
工具按用途分组(都带 `vanblog_` 前缀):
| 组 | 工具 |
|---|---|
| 文章 | `list_articles` `get_article` `create_article` `update_article` `delete_article` `search_articles` |
| 草稿 | `manage_drafts` |
| 分类/标签 | `manage_categories` `manage_tags` |
| 媒体/链接 | `manage_images` `manage_links` |
| 站点配置 | `manage_settings` `manage_site` `manage_menu` `manage_about` `manage_social` `manage_rewards` |
| 页面 | `manage_pages` |
| 运维 | `get_analysis` `get_logs` `manage_backup` `manage_caddy` `manage_isr` `manage_pipelines` |
| 协作 | `manage_collaborators` `manage_tokens` `auth` `get_meta` |
## 用完可释放
28 个工具占约 454 tokens,是本组里第二大的。写完博客就关掉:
```
plugin_stop name=vanblog
```
## 关键纪律
- **删除类操作**(`delete_article` 等)不可逆。执行前必须向用户确认是哪一篇。
- 改文章前先 `get_article` 读原文,不要用新内容整篇覆盖。
- 需要 API key 与站点地址;没配时工具会明确报错,不要猜。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -13,5 +13,6 @@
"gtd",
"productivity"
],
"targets": "linux/amd64"
}
"targets": "linux/amd64",
"auto_start": false
}

View File

@ -0,0 +1,58 @@
---
name: vikunja-tools
description: 管理 Vikunja 任务/项目/看板(28 个工具)。按需工具:先 plugin_start vikunja,用完可 plugin_stop。
---
# Vikunja 任务管理
## 什么时候用
用户要**建/改任务、管项目看板、打标签、看通知**他们的 Vikunja 时。
## 先拉起插件
```
plugin_start name=vikunja
```
工具按用途分组(都带 `vikunja_` 前缀):
| 组 | 工具 |
|---|---|
| 任务 | `tasks` `task_get` `task_create` `task_update` `task_done` `task_delete` `task_bulk` |
| 任务细节 | `task_assignees` `task_labels` `task_comments` `task_relations` `task_attachments` |
| 项目/视图 | `projects` `project_views` |
| 组织 | `labels` `filters` `teams` `sharing` |
| 协作 | `notifications` `subscriptions` `webhooks` `reactions` |
| 其他 | `time_entries` `migrate` `user` `admin` `api` `status` |
## 用完可释放
28 个工具占约 365 tokens。做完任务管理就关掉:
```
plugin_stop name=vikunja
```
## 关键纪律
- **`task_delete` 与 `admin` 不可逆**。执行前向用户确认具体对象。
- `task_bulk` 会一次改多条,先说明影响范围。
- 需要 API token 与实例地址;没配时明确报错,不要猜。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)

View File

@ -6,11 +6,15 @@
"description": "天气查询插件(基于 wttr.in),支持实时天气和未来预报",
"author": "HomeAgent",
"entry": "plugin.so",
"tags": ["weather", "forecast", "wttr"],
"tags": [
"weather",
"forecast",
"wttr"
],
"targets": "linux/amd64",
"outdir": "dist",
"bundle": true,
"replaces": {},
"source_dirs": []
"source_dirs": [],
"auto_start": false
}

View File

@ -0,0 +1,58 @@
---
name: weather-tools
description: 查询实时天气与未来预报。按需工具:用到时先 plugin_start weather 拉起,用完可 plugin_stop 释放。
---
# 天气查询
## 什么时候用
用户问**天气**、气温、是否下雨、要不要带伞、未来几天怎么样时。
## 先拉起插件
本插件默认**不自启**(不在初始工具清单里)。调用前先启用:
```
plugin_start name=weather
```
启用后可用工具:
| 工具 | 用途 |
|---|---|
| `weather_current` | 当前实时天气(温度/湿度/风力/天气现象) |
| `weather_forecast` | 未来若干天预报 |
| `weather_set_location` | 设置默认城市(避免每次都说地名) |
## 用完可释放
天气是一次性查询,问完不再需要。连续问同一类问题时保持启用即可;
换了别的话题、且较长时间不会再查天气,可以关掉以释放上下文:
```
plugin_stop name=weather
```
## 注意
- 数据源是 wttr.in,**不需要 API key**。
- 用户没给城市时,先看有没有设置过默认位置;没有就问一句,不要瞎猜。
- 查的是**真实天气**,不要把训练数据里的气温当答案。
## ★ 用 plugin_stop / plugin_start,不要用 plugin_disable / plugin_enable
四个工具看着像同义词,语义差别很大:
| 工具 | 作用 | 跨重启 |
|---|---|---|
| `plugin_stop` | **运行态**关闭,现在停掉 | **不影响**,重启照常加载 |
| `plugin_start` | **运行态**拉起,现在开回来 | 不影响 |
| `plugin_disable` | **持久**禁用 | **会记下来**,开机也不自启 |
| `plugin_enable` | 解除持久禁用 | 会记下来 |
**释放上下文用 `plugin_stop`。** 用 `plugin_disable` 会顺手把"开机自启"
永久关掉 —— 用户下次开机发现插件没了,得再手动开回来。
(本插件声明 `auto_start: false`,所以它本来就不自启;但 `plugin_disable`
仍会写进持久禁用清单,让 `plugin_start` 拒绝拉起,只能再用 `plugin_enable` 解。)