跳到內容

工具與擴充

TomoriBot 具備代理能力:聊天之外,她可以呼叫工具來搜尋網頁、讀取文件、生成媒體、設定提醒、在其他頻道行動,還有更多。她會依對話內容決定什麼時候使用它們。這一頁涵蓋內建工具、如何用 MCP 伺服器擴充她,以及如何用明確工具模式讓工具宣告保持精簡。

以下是幾個搞笑範例:

  • 1. 健康關懷檢查
    每隔幾小時,對 @Bredrumb 做一次強制健康關懷。
    問問對方現在感覺如何、最近有沒有從寫程式的工作中休息一下。
    用 {memory_tool} 或 {memory_update_tool} 長期記錄對方的情緒狀態,之後再回報給對方。
  • 2. 每週 時事 百合新聞
    每週五用 {web_search_tool} 整理本週值得注意的百合漫畫章節、動畫集數與社群二創圖。
    用 {voice_message_tool} 以誘惑的 ASMR 嗓音發表整理結果。
  • 3. 睡眠警察
    如果你透過 {message_metadata_tool} 發現有人凌晨兩點後還在聊天,就用 {voice_message_tool} 送一首平靜到有點威脅的 ASMR 搖籃曲,叫對方去睡覺。
    如果十分鐘後對方還在講,就用 {manage_message_tool} 為了對方好刪掉訊息,並提醒對方睡眠不足是造成各種問題的主因。

工具取決於目前生效的供應商與模型是否支援工具呼叫,而且許多工具受到功能旗標(/config > 權限 的切換項目)、Discord 權限、模型能力或選用 API 金鑰的管制。

工具提示詞巨集需要功能
檢視功能{capabilities_tool}回答前先確認目前聊天可用的能力、指令或設定。
建立或更新長期記憶{memory_tool} / {memory_update_tool}self_teaching_enabled儲存或取代穩定的伺服器事實或使用者偏好。
更新短期記憶{short_term_memory_tool}(NovelAI 不支援)為目前頻道或故事線儲存臨時的工作記憶。
建立或更新任務{task_tool} / {task_update_tool}安排或編輯提醒與自我任務(請看排程任務)。
跨頻道訊息{cross_channel_tool}(NovelAI 不支援)在其他頻道或討論串行動,並可選擇回報。
建立討論串{create_thread_tool}thread_creation_enabled + 討論串權限開啟公開討論串並送出它的起始訊息。
選擇貼圖{sticker_tool}sticker_usage_enabled在回覆中加上相符的伺服器貼圖。
管理訊息{manage_message_tool}manage_message_enabled釘選、編輯或刪除最近的訊息(釘選需要 Manage Messages)。
封鎖或解除封鎖使用者{block_user_tool} / {unblock_user_tool}user_blocking_enabled以人格為範圍對某位使用者禁言或封鎖(不會動到記憶)。
與最近的訊息互動{message_interaction_tool}對最近的訊息做出回應,或送出一則簡短回覆。
窺看個人圖片{profile_picture_tool}視覺模型或 vision_llm檢視某位使用者或人格的頭像。
讀取文件{document_tool}從 PDF 或任何 UTF-8 文字檔擷取文字:原始碼(.py/.ts/.rs/……)、.json.yaml.md.txt,以及任何非二進位的附件。
揭露訊息中繼資料{message_metadata_tool}為最近的對話輪加上代稱與時間戳,方便精準指定對象。
處理 YouTube 影片{youtube_tool}支援影片的模型依需求分析特定的 YouTube 連結。
分析圖片{image_analysis_tool}已設定的 vision_llm把圖片理解交給另一套視覺模型處理。
生成圖片或動漫圖片{image_generation_tool} / {anime_image_generation_tool}imagegen_enabled + 支援的供應商生成或編輯圖片(請看媒體生成)。
生成語音訊息{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 是選用的自架 sidecar,可以解鎖更多分類與瀏覽器渲染的頁面抓取,請看自架

要讀取特定頁面時,她使用 fetch_url。NovelAI 不支援這項功能。

MCP(Model Context Protocol)伺服器可以用你自己註冊的外部工具擴充她。

任何公開託管、具備 HTTPS 端點的 MCP 伺服器都可以使用。以下以 Smithery.ai 為例:

  1. 建立帳號,並從你的個人檔案產生一組 API 金鑰。
  2. 在目錄中開啟一個 MCP,複製它的連線 URL(例如 https://youtube.run.tools)。
  3. 開啟 /config > 外掛 > MCP 伺服器,選擇 + 新增 MCP,把連線 URL 貼進 URL,把你的 Smithery 金鑰貼進 驗證權杖,並選擇需要的 伺服器類型一般用途是預設選項。

如果伺服器不需要驗證,把 驗證權杖留空。你的驗證權杖會加密儲存,而且不會再顯示。開啟同一個設定頁面即可檢視已設定的狀態、啟用或停用伺服器,或經明確確認後移除。移除會立刻中斷連線並釋出一個位置。每一列已儲存的紀錄也會顯示上次成功探索到的工具名稱(有數量上限)。未探索到任何工具是已知的零工具結果;探索狀態未知代表這是一筆較舊的紀錄,或伺服器還沒有成功的快照。開啟 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 清單,這讓文字、列舉與數值欄位都適用同一套規則;空字串會被收斂成移除,而不是被拒絕。沒有範圍或動作參數,因為範圍是跟著欄位走的:

欄位儲存方式效果
暱稱、前綴、後綴以 persona lineage 為單位只有做出變更的那個人格會用不同方式稱呼他們
性別認同、代稱、稱呼方式、時區每位使用者一次每個人格讀到的都是同一個值

這個切分是按照儲存方式,而不是偏好:身分欄位每位使用者只有一個位置,沒有以人格為單位的對應欄位。成功通知會在以人格為範圍的列上標示人格名稱,所以差異是可見的,而不是要靠推測。沒有標示的列就是全域,這本身不需要解釋,因為全域才是不令人意外的情況。

參與者脈絡會把每位使用者的前綴與後綴與暱稱分開命名,所以要求去掉一個稱謂時,會解析成詞綴變更,而不是改寫暱稱。被清除的詞綴會存成明確的抑制,所以即使有優先順序較低的層級仍在提供值,也無法讓這個移除失效。

當提交的暱稱附帶一個已經解析過的詞綴時,會透過與解析後的值比對來移除多餘的詞綴;永遠不會用空白切割暱稱來猜測邊界。只要名稱真的變動了,更新就會回報最後的稱呼形式,所以即使這一輪沒有出現任何命名欄位,稱呼方式的切換仍然看得出來;而代稱或時區的編輯則不會重述沒有被動到的名稱。

每個欄位都會在單一次原子寫入之前完成驗證。限制性的隱私設定會阻擋新增與變更,但仍然允許清除值。這個工具無法編輯人格層級的稱呼詞。/config > 權限 中預設開啟的「自動更新使用者資訊」切換,同時控制工具是否出現,以及對過期呼叫的防禦。關閉時,手動的 /personal config 仍然可以使用。