技能与功能调用配置
智能体(agent)有三块能力可以在 WebUI 里按需开关:功能插件(Function Plugin)、功能调用(Function Calling) 和 技能(Skills),都在 智能体 页面的标签页里操作。
前置条件
这里的所有操作都需要登录 WebUI(主人身份),入口是 WebUI 的 智能体 页面:
功能插件标签页功能调用标签页技能标签页
开关状态保存在 data/config/plugins/agent_config.json,重启后依然生效。
功能插件
功能插件把若干技能与功能调用打包成一个整体,用一个开关统一控制,适合按玩法成组管理。
三个标签页怎么分工
| 标签页 | 管什么 |
|---|---|
| 功能插件 | 插件整体开关,以及插件内技能与功能调用的启用开关 |
| 功能调用 | 不属于任何插件的独立功能调用 |
| 技能 | 不属于任何插件的独立技能(可新建、编辑、删除) |
插件内的技能与功能调用不会出现在后两个页面——同一个开关只在一个地方出现,避免两边状态打架。
插件开关的效果
关掉一个功能插件后:
- 它名下的技能既不进提示词、也不能被
list_skills/get_skill_content查到,即使该技能自己的「启用」是开的; - 它名下的功能调用一律不可用,模型调用时会收到
功能 xxx 当前不可用:...; - 技能与功能自己的开关状态不会被清掉,插件重新打开后按原状态恢复。
也就是说插件开关优先于成员的开关:插件开着,成员各自生效;插件关着,成员全部停下。
成员各自也有开关
插件内的技能和功能调用都有自己的「启用」开关:
| 成员 | 开关效果 |
|---|---|
| 技能 | 关掉后不进提示词、也不能被查询 |
| 功能调用 | 关掉后模型不能调用它(不常用功能也会从 call 的清单里消失) |
插件整体关闭时,成员的开关会置灰(提示"插件已关闭,成员开关不生效"),但状态保留;插件重新打开后按原状态恢复。核心功能(stop_thinking / send_message)即使被插件声明,开关也是灰的。
插件内的技能只能开关
插件内技能只提供「启用」一个开关:不能新建、不能编辑、不能删除,也不能设置内嵌。这些内容由插件随代码分发,改了会让插件声明与实际内容脱节。
想改插件内技能的内容
先用 /agent.reload 之外的方式不行——插件声明是代码里的常量。需要改动请联系插件作者,或把该技能从插件声明里移出。
不常用功能调用
插件可以把功能调用声明为不常用:这类功能不进智能体的功能提示词(省 Token),只在 call 后面列出来,由模型按需调用。
- 模型看到的是
call(function="功能名", args={"参数": 值}); - 具体用法通常写在技能正文里,所以插件应当把「说明 + 不常用功能」配对给出;
- 没有可用的不常用功能时,
call本身不会出现在提示词里。
功能调用
功能调用是智能体可以主动触发的动作,例如发消息、联网搜索、查目录、读文件、查技能等。
三列状态怎么读
列表有五个关键列:
| 列 | 含义 |
|---|---|
| 功能名 | 功能的持久化标识,开关就记在这个名字上 |
| 说明 | 这个功能做什么 |
| 参数摘要 | 该功能接受的参数(仅供参考,不可在此编辑) |
| 手动开关 | 你是否允许它工作 |
| 环境可用性 | 当前环境是否具备使用条件 |
只有 手动开关 = 开 且 环境可用性 = 可用 时,该功能才真正生效,生效状态 才成立。
核心功能不能关
stop_thinking(结束本次思考)和 send_message(发送消息)是智能体跑完一轮对话所必需的两个动作,在列表里带一个「核心」标签:
- 它们的开关恒为开且置灰,点不动;
- 即使手改
data/config/plugins/agent_config.json把它们写进function_calling_disable,重载后也会被自动剔除; - 其余功能(包括
send_md_message、send_face等)都可以正常关闭。
环境不可用是什么意思
"环境可用性"灰显时,把鼠标移到灰色的 不可用 标签上,可以看到具体原因,例如:
未配置 TOOL 类型模型:需要在data/config/system/provider.yml里配置一个tool类型的模型未启用联网搜索/未配置搜索 API 密钥:需要在设置里打开联网搜索并填写密钥未配置 EMBEDDING 类型模型:记忆相关功能需要配置embedding类型的模型
这类不可用不是开关没打开,而是缺少依赖。补齐依赖后刷新页面即可,无需在这里操作。
特殊情况:send_face
send_face(发送表情)只在 OneBot 适配器下可用。如果机器人运行在其他适配器上,这个功能会一直灰显——这是正常的,不是配置错误。
关掉功能调用的效果
关闭「功能调用」页里的某个开关后:
- 该功能不再出现在智能体的功能列表(提示词)里;
- 如果模型仍然"幻想"去调用它,会被拦下并回复:
功能 xxx 当前不可用:原因; - 直接调用也会被拒绝。
也就是说,关闭是干净的:既不给模型看到,也不给它钻空子。
关于 list_skills
list_skills 负责让智能体发现有哪些技能。如果把它关掉,智能体将无法得知任何非内嵌技能(内嵌技能仍会出现在提示词里)。此时页面顶部会出现一条提醒。除非你有意如此,否则建议保持开启。
技能
技能是给智能体看的玩法/操作说明文档(Markdown)。它解决的是"用户问某个功能怎么用"这类问题:与其把一大段说明塞进每轮提示词,不如让智能体需要时自己去查。
技能页只展示不属于任何功能插件的技能;插件内的技能在 功能插件 页开关。
内置与用户技能
技能列表里每一项都有一个类型标签:
| 标签 | 含义 | 能做什么 |
|---|---|---|
内置 | 随机器人分发的技能 | 只能查看、编辑,不能删除 |
用户 | 你新建的技能 | 查看、编辑、删除 |
内置(已修改) | 内置技能被你改过 | 查看、编辑、恢复内置 |
插件提供 的技能不会出现在技能页,它们在「功能插件」页跟随所属插件一起管理,正文由插件自己提供、只存在内存里,data/plugins/agent/skills/ 下不会有对应文件。
内置技能存放在 res/data/agent/skills/,是只读的,升级机器人时会随之更新。所以在列表里点内置技能的「编辑」时,会先提示:
编辑将创建同名用户配置覆盖内置
确认后,机器人会在 data/plugins/agent/skills/ 下创建一个同名用户文件,以它覆盖内置内容,该行类型随即变成 内置(已修改)。此时按钮会多出一个「恢复内置」:
将恢复内置内容,用户修改会丢失
点它即删除用户文件,内置正文重新生效。注意:这会丢掉你的修改,请先「查看」确认不需要了再操作。
用户技能的「删除」则会同时清理它的启用/内嵌开关记录(因为它已经不存在了)。
两个开关
每行还有两个开关,它们的含义是互相独立的:
| 开关 | 默认 | 打开后 | 关闭后 |
|---|---|---|---|
| 启用 | 开启 | 技能可以被智能体发现和查询 | 既不进提示词,也不能被查询 |
| 内嵌开关 | 关闭 | 正文直接嵌入每轮提示词,且不可被智能体查询 | 不占提示词,由智能体按需查询 |
组合效果:
- 启用 + 不内嵌(默认):省 Token。智能体平时看不到这个技能,用户问到相关玩法时它通过
list_skills找到名字、再get_skill_content读正文。 - 启用 + 内嵌:每轮提示词里都带着正文,强制生效;代价是每轮都花 Token,而且智能体无法再主动查询它(因为已经给它了)。
- 不启用:完全不参与,内嵌开关也会随之失效。
内嵌只适合短小内容
内嵌意味着这段正文会每轮进入提示词。列表里有「正文字数」一列供参考——几十字的强制规范(例如"回复格式要求")适合内嵌;几百字以上的玩法说明请保持不内嵌,让智能体自己按需查。
新建与编辑
点右上角「新建」即可创建用户技能,填写三项:
- 名称:技能标识,也就是文件名。不能为空、不能含
\ / : * ? " < > |、不能以.开头、首尾不能有空格。 - 描述:一句话说明,会显示在列表和智能体拿到的技能清单里。留空时会从正文首行自动截断回退。
- 正文:Markdown 正文。
编辑已有技能时,名称会被锁定:
用户/内置(已修改)技能的名称不可改(改名等价于"新建一个 + 删掉旧的",需要改名请新建后删除原技能);内置技能在确认覆盖后名称自然也是内置名,同样锁定。
智能体实际看到的内容
- 内嵌技能:正文出现在思考提示词里,不出现在
list_skills结果里,也不能被get_skill_content读取。 - 启用且不内嵌的技能:出现在
list_skills结果的清单里(名字: [类型] 描述),可被get_skill_content读取。 - 未启用的技能:两边都不出现。
相关文件
| 路径 | 说明 |
|---|---|
data/config/plugins/agent_config.json | 四个开关列表(禁用的功能插件、禁用的功能、禁用的技能、内嵌的技能) |
res/data/agent/skills/ | 内置技能,只读,随版本更新 |
data/plugins/agent/skills/ | 用户技能与覆盖内置的同名文件 |
data/config/system/provider.yml | 模型配置(决定"环境可用性") |
排障
| 现象 | 原因 / 处理 |
|---|---|
功能调用灰显 不可用 | 鼠标悬停看原因,通常是缺 tool / embedding 模型或搜索密钥 |
| 核心功能的开关点不动 | 正常现象,stop_thinking / send_message 不允许关闭 |
技能在 技能 页找不到 | 它被功能插件收编了,去 功能插件 页看 |
| 技能开着但智能体查不到 | 检查它所属的功能插件是否被关掉;插件关掉时成员一律失效 |
| 插件内技能不能编辑/删除 | 设计如此:插件内技能只能开关 |
看不到 call 功能 | 当前没有可用的不常用功能,call 会自动隐藏 |
| 智能体不知道有哪些技能 | 检查 list_skills 是否被关掉;检查目标技能的「启用」是否为开 |
| 某技能怎么都不生效 | 若已内嵌,正文只会出现在提示词里;若只改了描述,描述是给智能体看的索引,不改变行为 |
| 改了内置技能想还原 | 在该行点「恢复内置」,用户文件会被删除,内置正文重新生效 |
| 开关关了但重启后又开了 | 检查 data/config/plugins/agent_config.json 是否可写(权限 / 只读挂载) |