OpenRouter 的Armor 測試版在模型提出的工具呼叫與可能執行它的應用程式之間,加入了規則分類器。對代理開發者來說,關鍵在於判定結果究竟在哪個環節阻止執行。在 Chat Completions 和 Responses 中,Armor 可以攔下被標記的呼叫。在 Messages API 的 Claude Code 相容模式中,被標記的 tool_use 仍會留在回應中,必須由用戶端拒絕執行。

目前的文件介紹了自2026年10月起提供的測試版。BIG CHANGE 於10月17日查閱了文件中的請求與回應契約。我們沒有發送 API 請求、執行代理,或測量其安全效能。

重大變化

  • 有何改變: OpenRouter 代理可以先將提出的工具呼叫交由分類器處理,在呼叫抵達應用程式前,套用開發者撰寫的規則。在預設的強制執行流程中,被標記的呼叫會略過執行,並回傳原因,讓模型可以繼續。
  • 為何重要: 開發者可以用自然語言描述動作層級的限制,包括針對嚴格限定的允許作業設定例外。不過,Messages 相容模式的契約仍把執行的決定性一步交給用戶端:忽略標記判定的用戶端,仍可能執行該呼叫。
  • 值得留意: 團隊必須讓用戶端配合所選 API 輸出模式,以自身流量測試規則,並決定分類器出錯時應如何處理。測試版格式可能改變,OpenRouter 也表示,分類器既可能攔下可接受的呼叫,也可能漏掉不可接受的呼叫。

從提議到判定,追蹤一次呼叫

OpenRouter 表示,每當模型提出工具呼叫,都會在轉交應用程式前先暫扣。其決策模型會收到呼叫、規則,以及截至當下的對話,估計每條規則是否符合,再將結果彙整為 flagged 或 not_flagged。未被標記的呼叫會原樣放行。在強制執行模式中,被標記的呼叫會註明略過執行;模型會收到原因,可以嘗試範圍更小的呼叫,或解釋拒絕原因。這是分類器對擬議動作的判斷,並不能證明後續工具或整個代理都是安全的。

不同層級的規則回答不同問題。符合 hard_deny 時,無論是否有允許規則或使用者請求,都會阻擋。符合 soft_deny 時,可由符合 allow 的規則解除,也可以由使用者在對話中,明確要求對該確切目標執行該確切操作來解除。allow 規則本身絕不會阻擋呼叫。OpenRouter 文件也記載了內建的軟性拒絕規則,適用於使用者已設定且未撤銷的界線。開發者可在 environment 中提供受信任的儲存庫或部署目標等事實;過時資訊可能降低規則的精確度。具名規則物件會在判定中顯示 ID 和名稱。可選的門檻值預設為:拒絕規則0.6,允許規則0.7。

文件中的Responses 範例為 bash 工具設定針對 git push 的硬性拒絕規則。使用 output_mode: "custom_item" 時,被標記的推送會替換為 openrouter:armor_blocked 項目,內含呼叫和原因,後面接著模型的回應。範例展示的是文件所述的服務回傳結果,並非 BIG CHANGE 進行的測試。

執行工具前,先選擇輸出契約

在 Chat Completions 和 Responses 中,預設的 text 模式會移除被阻擋的呼叫,並在助理文字中加入 <openrouter_armor_blocked> 標記。Responses API 也支援 custom_item,會在原本出現 function_call 的位置回傳帶有類型資訊的阻擋項目。文件表示,下次 Responses 輸入應原樣回傳該項目,而不要另外為它建立 function_call_output。safeguard_results 會依呼叫 ID 記錄判定。

若請求含有 safeguards,Messages API 的預設行為則有明顯不同:claude_code_compatibility 會將被標記的 tool_use 留在 content[] 中,並把其 flagged 結果加入 safeguard_results。應用程式必須讀取該結果,並拒絕執行呼叫。 OpenRouter 明確警告,忽略判定的 Messages 用戶端會執行被標記的工具操作。無法控制用戶端的開發者,可以在 Messages 中要求 output_mode: "text",由 OpenRouter 攔下呼叫。若要求 API 使用它無法承載的輸出模式,會收到400回應。

透過 OpenRouter 的 Ori metaharness 使用 Claude Code 自動模式時,會採用 Messages 契約,無須額外加入 Armor 外掛項目。文件表示,Claude Code 會拒絕被標記的呼叫,將錯誤結果寫入對話紀錄,然後讓模型繼續。文件也表示,支援自身分類器的 Anthropic 端點可以提供直接轉傳的判定;其他端點則由 Armor 評估。這是文件記載的整合行為,並不表示所有第三方用戶端都正確實作了它。

設定並檢查範圍明確的規則集

對自訂代理來說,Armor 指南會放入一個 armor 項目,位置是 plugins,並包含有版本的 classifier_context(v: 1)、auto_mode 規則,以及可選的環境事實。先確定規則應識別的動作與受保護資源,再選擇拒絕類型:若使用者同意也不應解除禁令,採用硬性拒絕;若明確同意或具名允許條件可合理解除,採用軟性拒絕。文件建議描述動作,而非僅描述某種指令寫法,並保持環境事實為最新狀態。

預設的 enforce 模式會依判定採取動作。audit 會回報相同判定,但放行所有呼叫,包括被標記的呼叫。這可用來檢查真實流量,在強制執行前調整規則,本身並不是保護模式。稽核模式不能搭配 claude_code_compatibility 使用。不論採用哪種模式,都應讀取 safeguard_results:not_flagged 表示允許,flagged 表示符合某條規則,unavailable 表示評估失敗,而 skipped 表示未經評估的供應商原生工具。串流時,判定物件會在回應結尾抵達,因此使用 Messages 的用戶端必須等它到達,才能依工具操作採取動作。

OpenRouter 列出 on_error: "block" 為分類器逾時、出錯,或無法處理過大請求時的預設值;on_error: "log" 則會放行呼叫。在 Claude Code 相容模式中,狀態為 unavailable 的呼叫會被放行,判定結果仍然可見。供應商原生伺服器工具預設會略過,除非 evaluate_native_tools 強制讓它們離開原生路徑接受評估。這些設定與實際工具路徑,都應納入團隊的整合檢查;僅有 Armor 項目,不能證明所有工具都經過評估。

測試版的成本、速度與涵蓋範圍限制

OpenRouter 表示,載入其 Claude Code 相容規則集後,評估額外增加了中位數279毫秒、90百分位334毫秒的延遲。這些是供應商在所述條件下回報的測量值,並非特定代理或所有規則集的基準測試。每次呼叫會在放行或阻擋前評估一次。測試版期間不收評估費;OpenRouter 表示,會在正式推出前公布定價。文件沒有確立未來費率。

決策模型以自然語言參數對照自然語言規則作判斷,因此可能產生誤判或漏判。文件建議,使用真實流量的稽核判定,調整個別規則的門檻。目前 Armor 評估尚不支援 HIPAA、Zero Data Retention,或有資料地區限制的請求。在這些情境啟用外掛的請求會收到403回應;Claude Code 請求則會將呼叫以 unavailable 狀態放行,Claude Code 隨後退回本機自動模式評估。測試版警告也涵蓋設定欄位、safeguard_results,以及 openrouter:armor_blocked 項目類型的變動。

Armor 在模型將呼叫交給應用程式時,篩查擬議呼叫。因此,它的機制不同於微軟的 MXC 指令限制機制與NVIDIA 的 OpenShell 和 Sentry 執行階段控制,後兩者在工作負載或其存取周圍實施限制。對 Armor 而言,當下的實作決策是:所選回應格式會攔下被標記的呼叫,還是必須由用戶端阻止執行。

來源與延伸閱讀

  • OpenRouter Armor 文件,查閱日期為2026年10月17日。這是關於測試版狀態、分類器流程、規則優先順序、API 回應契約、錯誤行為、隱私情境排除項、所報告延遲及測試版計費的一手來源。這些是 OpenRouter 文件中的說法;BIG CHANGE 並未執行該外掛。
  • BIG CHANGE 關於微軟 MXC 的報導解釋了針對代理產生的指令,依政策施加限制的方式。它介紹的是另一層執行控制,並非 Armor 的早期階段。
  • BIG CHANGE 關於 NVIDIA OpenShell 和 Sentry 的報導介紹軟體存取控制,以及可選的硬體監控設計。這是相關背景,並非這項 OpenRouter 功能的直接延續。