跳转到内容

工具与扩展

TomoriBot 是代理式的:除了聊天,她还能调用工具去搜索网页、读取 文档、生成媒体、设置提醒、在别的频道里行动等等。她会根据对话自行决定 什么时候使用它们。这一页讲内置工具、如何用 MCP 服务器扩展 她,以及如何用明确工具模式让工具声明保持精简。

下面是几个搞怪的例子:

  • 1. 健康检查员
    每隔几个小时,对 @Bredrumb 做一次强制的健康检查。
    问问对方现在感觉如何,最近有没有从写代码里抽空休息。
    用 {memory_tool} 和/或 {memory_update_tool} 记录对方的情绪变化,之后再向本人汇报。
  • 2. 每周 时事 百合新闻
    每周五,用 {web_search_tool} 汇总这一周值得关注的百合漫画章节、动画集数和社群同人图。
    用 {voice_message_tool} 以撩人的 ASMR 嗓音播报汇总结果。
  • 3. 睡眠警察
    如果你通过 {message_metadata_tool} 发现有谁凌晨 2 点之后还在聊天,就用 {voice_message_tool} 给对方发一段平静得吓人的 ASMR 摇篮曲,叫对方去睡觉。
    如果 10 分钟后还在说话,就用 {manage_message_tool} 为对方好而删掉那条消息,并提醒对方睡眠不足正是其问题的首要原因。

工具能否使用取决于当前生效的提供方与模型是否支持工具调用,而且很多工具还被 功能开关(/config > 权限 里的开关)、Discord 权限、模型能力,或者 一个可选 API 密钥所限制。

工具提示词宏需要它做什么
Review capabilities{capabilities_tool}回答之前先检查当前的聊天能力、指令或设置。
Create / update long-term memory{memory_tool} / {memory_update_tool}self_teaching_enabled保存或替换一条稳定的服务器事实或用户偏好。
Update short-term memory{short_term_memory_tool}(NovelAI 上不可用)为当前频道或剧情线保存临时工作记忆。
Create / update task{task_tool} / {task_update_tool}安排或编辑提醒与自我任务(见定时任务)。
Cross-channel message{cross_channel_tool}(NovelAI 上不可用)在另一个频道或子区里行动,可选回报结果。
Create thread{create_thread_tool}thread_creation_enabled + 子区权限开一个公开子区并发出它的起始消息。
Select sticker{sticker_tool}sticker_usage_enabled在回复里附上一张匹配的服务器贴纸。
Manage message{manage_message_tool}manage_message_enabled置顶、编辑或删除近期消息(置顶需要 Manage Messages)。
Block / unblock user{block_user_tool} / {unblock_user_tool}user_blocking_enabled按人格对某个用户禁言或屏蔽(不涉及记忆)。
Interact with recent message{message_interaction_tool}对一条近期消息做出表情回应,或者回一句短的。
Peek profile picture{profile_picture_tool}视觉模型或 vision_llm查看某个用户或人格的头像。
Read document{document_tool}从 PDF 或任何 UTF-8 文本文件里提取文字:源代码(.py/.ts/.rs/……)、.json.yaml.md.txt,以及任何非二进制的附件。
Reveal message metadata{message_metadata_tool}给近期发言标注句柄与时间戳,便于精确指向。
Process YouTube video{youtube_tool}支持视频的模型按需分析某个 YouTube 链接。
Analyze image{image_analysis_tool}已配置的 vision_llm把图像理解交给一个独立的视觉模型。
Generate image / anime image{image_generation_tool} / {anime_image_generation_tool}imagegen_enabled + 有能力的提供方生成或编辑图像(见媒体生成)。
Generate voice message{voice_message_tool}ElevenLabs 密钥 + 人格语音 + voice_message_enabled发一条说出来的 Discord 语音回复。

支持上述工具宏的提示词文本也支持带范围的条件:

{{if capability:self_teaching}}
有值得记住的细节时,使用 {memory_tool}。
{{else}}
不要承诺保存长期记忆。
{{/if}}

capability:<name> 表示某个已启用的 TomoriBot 设置,用 tool:<function_name> 表示 仅当那个确切的工具对当前提供方和模型可用时,这段文本才出现。当内置的 URL 读取器或者服务器 MCP 提供的替代项任一可用时,用 tool_family:url_fetch。在条件前加 ! 可以取反。区块可以嵌套, 并且最多包含一个 {{else}};不支持通用的 and/or 表达式。

支持的功能名有 tool_useself_teachingpersonal_memoriesemoji_usagesticker_usageweb_searchmanage_messagethread_creationimage_generationvideo_generationvoice_messageuser_blockingshort_term_memorytime_awareness

工具条件反映的是提供方与模型的支持情况、服务器配置、已配置的后端、 MCP 替代项,以及当前的明确工具模式允许清单。它们不会绕过或预测工具执行时 进行的 Discord 权限检查。未知的功能名会 判定为 false 并被记录下来;格式错误的区块会被省略。原始聊天消息、模型 输出和工具结果永远不会被当作条件模板处理。

模型看到的是一个统一的 web_search(query, category) 工具。在它背后,一个调度器 把每次调用按引擎链依次路由,并返回第一个成功的结果:

Brave → SearXNG → DuckDuckGo → IAsk

  • 配置了 Brave API 密钥时Brave 排在第一个(用 /providers 设置);它会增加图像、视频和新闻搜索。⚠️ 请在 Brave 后台设置 5 美元的用量上限, 以免出现意外扣费。
  • 没有设置密钥时DuckDuckGo 是默认项,在遇到速率限制或结果为空时级联到 IAsk
  • SearXNGCrawl4AI 是可选的自行部署附属服务,能解锁更多分类 以及浏览器渲染的页面抓取;见自部署

要读取某个具体页面,她使用 fetch_url。它在 NovelAI 上不可用。

MCP(Model Context Protocol)服务器能用你自己 登记的外部工具扩展她。

任何公开托管、带 HTTPS 端点的 MCP 服务器都可以。以 Smithery.ai 为例:

  1. 注册账号,并在个人资料里生成一个 API 密钥。
  2. 在目录里打开一个 MCP,复制它的连接 URL(例如 https://youtube.run.tools)。
  3. 打开 /config > 插件 > MCP 服务器,选择 + Add MCP,把连接 URL 粘贴到 URL,把你的 Smithery 密钥粘贴到 Auth Token,并选择所需的 Server TypeGeneral Purpose 默认已选中。

如果服务器不需要认证,把 Auth Token 留空。你的认证令牌在静态存储时会被加密, 之后不再显示。打开同一个配置页面可以查看已配置的状态、启用或禁用一个服务器, 或者在明确确认后移除它。移除会立刻断开连接并释放一个槽位。 每一行已保存的记录还会显示它上次成功发现到的工具名列表(有长度上限)。None discovered 是已知的零工具结果;Discovery unknown 表示这是一行历史遗留记录,或者是一个 还没有成功快照的服务器。打开 MCP 管理界面只会读取已保存的元数据,不会联系 远端服务器。

本地 MCP 服务器只在自部署实例上受支持,因为公开托管的 bot 要求 HTTPS 并会拦截本地与私有地址。如果你自己跑实例,见 设置:本地 MCP 服务器

每一个声明的工具都会增加提示词长度。明确工具模式让工具声明在 普通聊天轮次里不出现,除非消息看起来确实需要一个工具;这能减小 提示词体积,并帮助更小的本地模型更快回答。

  • 她会先检查消息里有没有工具意图。内置触发覆盖常见请求 (提醒、网页搜索、记忆更新、跨频道消息、图像与视频与语音 生成、媒体分析、创建子区、消息操作)。关于她当前 模型、工具、设置,或者某项功能为何不可用的问题,会同时暴露能力查看与 官方文档访问。后续措辞也有效,比如在一条语音消息请求之后说「再来一次 但是更生气一点」。
  • 服务器管理员可以用 /server trigger add 添加字面的自定义触发短语, 例如把 picimgpfp 映射到图像生成。
  • 内置触发读取的是英语措辞。其他语言通过 各语言自己的关键词列表到达同样的工具。所有已发布语言的列表都会在每条消息上检查, 不管你自己的语言设置是什么,所以一个双语服务器在两种语言下都能用。
  • 日语、中文或韩语的自定义短语也会在更长的词内部匹配,因为这些 语言不用空格分词。以 * 结尾的短语会匹配任何以它 开头的词:remind* 覆盖 reminderreminding
  • /server dtm:服务器管理员开关它。
  • /personal config:用户为自己覆盖它。
  • 配置了思考日志频道(/server thought-logs)之后,明确模式下成功的 工具调用会连同暴露该工具的触发一起记录在那里。

明确工具模式只决定哪些工具展示给模型,但模型仍然要 自己选择调用其中一个。在 /help 里选择 行为,再选 明确工具模式,可以看到 Discord 里的说明。

内置的 update_user_info 工具处理明确提出的修改请求,可改已登记用户的 昵称、前缀、后缀、性别认同、人称代词、称呼风格或数字 UTC 偏移。 它使用和其他个人工具相同的、能感知重名的名字、别名、提及与 Discord ID 解析器。省略目标 就表示触发该轮发言的人;alleveryone 永远不是通配目标。

每个字段都是它自己的可选参数,所以一次修改通过传那个字段来表达。移除 则是传一个 clear 字段名列表,这样文本、枚举和数值字段 都遵循同一条规则;空字符串会被折算成一次移除,而不是被拒绝。没有范围或动作 参数,因为范围跟着字段走:

字段存储方式效果
nickname、prefix、suffix按人格记忆谱系只有做出这次修改的那个人格会用不同的方式称呼对方
gender identity、pronouns、addressing style、timezone每位用户一份所有的人格读到的是同一个值

这种划分跟随的是存储方式而不是偏好:身份类字段每位用户只有一个槽位, 没有按人格的对应物。成功提示会给按人格范围的记录行标上 人格的名字,所以这个区别是看得见的,而不必去猜。没有标注的记录行是全局的, 这一点本身不需要额外解释,因为全局才是那个不让人意外的情形。

参与者上下文会分别列出每位用户的前缀、后缀和昵称,所以一次 去掉称呼的请求会解析成词缀修改,而不是昵称重写。被清空的 词缀会存成一次明确的抑制,所以这个移除不会被更低 优先级的层仍然提供的值还原。

当提交的昵称里已经带上解析后的词缀时,这个多余词缀会被 拿去与解析后的值比较并剥掉;昵称永远不会按空白切分来 猜边界。只要名字确实变了,更新结果都会报告最终的称呼形式, 所以一次称呼风格切换能在同一轮里看出来,即使那一轮里没有任何命名字段 出现;而一次人称代词或时区修改不会重述一个没被碰过的名字。

每个字段都会在一次原子写入之前完成校验。严格的隐私设置会拦截新增与 修改,但仍然允许清空取值。这个工具无法编辑人格级的称呼词。/config > 权限 里 默认开启的 User Info Updates 开关同时控制工具的暴露与 过期调用的防御。关掉它之后,手动 /personal config 仍然可用。