← 返回技術實踐

AIAgent

Kimi K3 Tool Calls 循環怎麼辦?2026 止損教程

約 10 分鐘閱讀

Kimi K3 Tool Calls 循環怎麼辦?2026 止損教程

症狀:Kimi K3 Tool Calls 一直重複同一函數,Agent 不停請求。
最快解法:先保存完整請求證據,確認 assistant、tool_call_id 與工具結果原樣回傳;消息鏈正確後,再用「同工具、同參數、無新進展」判定循環,並立即啟用輪次、時間、費用及副作用限制。

這篇適合三類讀者:正在修復重複函數呼叫的工具調用 Agent 開發者、需要替無人值守工作流加上熔斷與恢復的自動化平台工程師,以及使用發信、建單或資料寫入工具的團隊。

最後更新於 2026 年 8 月 3 日;流程核對自 Kimi 官方 API troubleshooting、Tool Calls 與流式輸出文件。若 Kimi 修改工具呼叫格式、finish_reason、流式欄位或重複呼叫建議,應重新驗證本文流程。

先保留證據,再切斷副作用

不要一看到畫面上重複出現函數名稱,就立刻修改提示詞。你首先要分清楚三種情況:

  1. UI 將同一個請求重複顯示,但 API 實際只呼叫一次。
  2. SDK、代理層或網路重試重新送出請求。
  3. Kimi K3 API 確實在新的對話輪次中重複產生同一個 Tool Calls。

至少保存以下脫敏資料:

  • 完整 messages,包括 assistant 的 tool_calls
  • 每次回應的 finish_reasonrequest_id 及時間戳。
  • tool_call_id、函數名稱與原始參數字串。
  • 工具開始、結束、失敗及重試紀錄。
  • 工具結果是否真的改變了任務狀態。
  • API usage 與客戶端重試次數。

Kimi 官方資料指出,連線錯誤、408、409、429 及 500 或以上的內部錯誤預設可能觸發重試;因此「畫面看到兩次」不等於模型生成了兩次。你要把 API request ID、SDK retry log 與工具執行 ID 串在一起,才能分辨來源。可參考官方 API troubleshooting 排查清單。(kimi.com)

若工具具有寫入副作用,先把發信、付款、建單或資料修改切換至唯讀、預覽或沙箱模式。不要在尚未確認循環來源前,繼續讓它操作正式資料。

第一個里程碑:修正訊息鏈

Kimi K3 Tool Calls 循環最常見的根因,不是「模型不聽話」,而是上一輪工具結果沒有以正確格式回到下一次請求。

正常流程應是:

[
  {
    "role": "assistant",
    "tool_calls": [
      {
        "id": "<TOOL_CALL_ID>",
        "type": "function",
        "function": {
          "name": "<FUNCTION_NAME>",
          "arguments": "{\"item_id\":\"<ITEM_ID>\"}"
        }
      }
    ]
  },
  {
    "role": "tool",
    "tool_call_id": "<TOOL_CALL_ID>",
    "name": "<FUNCTION_NAME>",
    "content": "{\"status\":\"ok\",\"state\":\"<NEW_STATE>\"}"
  }
]

你要逐項核對:

  • assistant 回應是否完整加入 messages,不要只保存文字內容。
  • 每一個 tool_calls 是否都有對應的 role=tool 訊息。
  • tool_call_id 是否逐字相同,包括大小寫、連字符及前後字元。
  • name 是否與原本的函數名稱一致。
  • 工具結果是否是字串化 JSON,而不是客戶端自訂物件。
  • 工具結果是否真的包含狀態變化,而不是永遠回傳相同的「成功」。

官方 Tool Calls 範例要求先加入模型返回的 assistant 訊息,再逐一附上帶有 tool_call_id 的工具結果。若跳過 assistant 訊息,或把工具結果放進下一個不相關的對話,模型便可能無法理解上一輪已完成。參考官方 Tool Calls 使用說明。(platform.kimi.ai)

最小非流式驗證

先暫停串流與所有自訂 Agent 封裝,只保留一個簡單的唯讀工具,送出最小請求。驗證順序如下:

  1. 用固定的工具定義與固定輸入建立請求。
  2. 記錄原始 assistant 回應,不經過 UI 轉換。
  3. 將該 assistant 訊息原樣加入 messages
  4. 執行工具並回傳完全相同的 tool_call_id
  5. 再發送下一輪,確認模型能讀到工具結果並停止或轉入下一步。

如果非流式版本正常、封裝後版本循環,問題通常在 SDK adapter、訊息序列化或重試層,而不是 Kimi K3 本身。

檢查位置 正常證據 異常時的止損動作
assistant 訊息 保留完整 tool_calls 與 ID 停止執行工具,修正訊息保存
tool 結果 role=tool 且 ID 完全匹配 不再送下一輪,記錄配對錯誤
函數參數 原始 JSON 可完整解析 改用唯讀工具並保存原始字串
重試層 可區分模型請求與工具重試 關閉無限重試,加入上限
任務狀態 工具結果帶來可驗證進展 進入重複偵測與人工接管

第二個里程碑:完成流式參數組裝

啟用串流後,回應不再是單一 JSON,而是 text/event-stream 形式的 SSE 資料。官方文件也提醒,串流模式下你必須自行處理分片;不能把每一個 chunk 當成完整工具呼叫。參考官方流式輸出文件。(platform.kimi.ai)

實作時,應為每個工具索引建立累積器:

tool_index -> {
  function_name: "<FUNCTION_NAME>",
  arguments_text: "<PART_1><PART_2>..."
}

組裝規則如下:

  • 依照分片的工具索引分開累積。
  • 函數名稱只在首次出現時寫入,避免後續空值覆蓋。
  • arguments 必須按收到的順序串接,不能排序或去除字元。
  • 只有在完整 JSON 形成並通過嚴格解析後,才允許執行工具。
  • 解析失敗時保存原始分片與組裝結果,不要自動刪除逗號、補引號或猜測欄位。
  • 收到中斷、錯誤或不完整結束訊號時,該次工具呼叫視為未執行。

若你的程式在收到第一段 arguments 後便立即執行,後續分片可能被當成另一個請求;若多個工具同時出現而你沒有按索引分桶,也可能把 A 工具的參數拼到 B 工具上。這兩類錯誤都會讓下一輪對話呈現「工具沒有完成,所以再叫一次」的假象。

第三個里程碑:建立重複偵測

當消息鏈與流式組裝都正確後,才進入真正的 Kimi K3 Tool Calls 循環判定。不要只比較函數名稱,建議將下列三項組合成指紋:

fingerprint =
  function_name
  + normalize(arguments)
  + progress_signature(tool_result)

其中 normalize(arguments) 可以統一 JSON 欄位順序、移除不影響語意的空白,並固定可預期的數值格式;但不要刪除可能影響業務意義的欄位。

progress_signature 不應只使用「成功」或「完成」這類固定文字,而應包含真正的狀態,例如:

  • 查詢結果的版本或更新時間。
  • 建單後生成的業務狀態。
  • 工作佇列是否從待處理變成完成。
  • 寫入操作返回的唯一執行 ID。
  • 工具是否回傳新的候選資料。

官方 troubleshooting 建議:如果同一工具使用完全相同的函數名稱與參數,而工具結果又沒有提供新的有效資訊,可以視為重複工具呼叫;同時可在客戶端加入重複偵測,並在下一輪提示模型。提示詞只是軟性干預,不能取代程式熔斷。參考官方重複呼叫排障說明。(kimi.com)

偵測到無進展循環後,應返回明確狀態,例如:

{
  "status": "blocked_repeated_tool_call",
  "message": "工具結果沒有產生新進展,任務已暫停,等待人工接管。",
  "last_tool_call_id": "<TOOL_CALL_ID>"
}

不要伪造工具成功,也不要把錯誤包裝成正常業務結果,否則下游系統會誤以為訂單、通知或資料寫入已完成。

第一天:完成副作用保護

第一天的目標不是調到「模型看起來不再重複」,而是讓重複也不會造成不可逆損害。

若滿足以下條件,優先採用唯讀工具加人工確認:

  • 工具會發送外部通知。
  • 工具會扣款、退款或產生費用。
  • 工具會建立訂單、工單或帳戶資料。
  • 工具會修改不能輕易復原的資料。
  • 工具結果無法立即查詢確認。

否則,才可以讓低風險工具在自動流程中繼續執行,但仍要加入以下限制:

  • 每個任務的最大工具輪次。
  • 任務總執行時間。
  • 累計 API 使用量或費用上限。
  • 單一工具的連續重複上限。
  • 單一幂等鍵只能提交一次副作用。
  • 熔斷後禁止背景 worker 繼續發送請求。
  • 保存最後安全檢查點,讓人工可以恢復。

「Kimi K3 工具呼叫最多允許多少輪」沒有適合所有 Agent 的固定答案。唯讀搜尋、資料彙整與支付提交的風險不同,不能把官方提醒阈值直接當成通用最佳值。你的輪次上限應由業務風險、單次工具成本及可恢復性決定。

對有寫入副作用的工具,建議採用:

預覽 -> 顯示變更 -> 確認 -> 帶幂等鍵提交 -> 查詢結果

即使網路重試造成同一提交請求再次送達,服務端也應依幂等鍵返回先前結果,而不是重新建立一筆資料。

第一週:用四組樣本完成驗收

生產前不要只測一次正常成功。至少準備四組可重播樣本:

  1. 正常呼叫:工具成功回傳新狀態,Agent 正常結束。
  2. 參數變化:同一工具名稱不變,但參數或查詢範圍改變,不能誤判為重複。
  3. 無進展重複:工具名稱、規範化參數及結果狀態都不變,應觸發熔斷。
  4. 網路重試:模擬請求逾時或服務端錯誤,確認重試不會造成重複副作用。

驗收時特別檢查:

  • 熔斷後是否仍有背景請求。
  • SDK 重試是否繞過任務級上限。
  • 工具服務是否按幂等鍵拒絕重複寫入。
  • 人工接管後能否從安全檢查點恢復。
  • request_id、工具執行 ID、tool_call_id 與 API usage 是否能串成一條審計證據鏈。
  • 流式原始分片是否仍可追查,而不是只剩最後組裝結果。

你也可以把常見 API 限制與失敗處理整理到 Kvmkit 幫助中心,讓開發、測試與值班人員使用同一份驗收規格。

決策條件:現在應該修模型,還是先停任務

  • 若 assistant 訊息、tool_call_id 或 role=tool 缺失:先修正消息鏈,暫停工具執行。
  • 若非流式正常、流式異常:先修流式分片索引、參數拼接與完整 JSON 判斷。
  • 若訊息鏈正確,但工具結果沒有新狀態:加入重複指紋與熔斷,不要只改提示詞。
  • 若工具有發信、支付或資料寫入副作用:先回退到沙箱、預覽或人工確認模式。
  • 若是低風險唯讀工具,且每輪都有新資料:可以保留自動流程,但仍須限制輪次、時間與費用。
  • 若熔斷後仍有請求發出:優先修 worker、佇列與重試層,模型調整不是第一優先。
  • 若需要長時間重播與留存紀錄:把 Agent 放到可持續在線的遠端 Mac 環境,避免依賴個人電腦休眠或網路中斷。

如果你正在評估長時間執行環境,可先查看 美國東部 Mac mini 租用方案;重點不是把所有工作搬到 Mac,而是為回歸測試、日誌留存與人工接管提供一個穩定節點。

常見排障問答

Kimi K3 為什麼會一直呼叫同一個函數?

通常先檢查訊息鏈,而不是先改 system prompt。若上一輪 assistant 的 tool_calls 沒有原樣保留,或工具結果的 tool_call_id 不匹配,模型可能無法得知工具已完成。只有在三項內容都一致,且工具結果沒有帶來新進展時,才應判定為真正的重複循環。

tool_call_id 回傳錯誤會造成工具循環嗎?

會。工具結果必須使用原本 assistant tool call 的完整 ID;錯一個字元也可能令模型無法配對結果。客戶端應在執行前驗證 ID 是否存在於當前 assistant 訊息,並拒絕沒有對應 ID 的 role=tool 訊息,避免錯誤結果繼續進入下一輪。

流式 Tool Calls 參數怎樣正確拼接?

按工具索引分開累積函數名稱與參數字串,保留原始順序;完整 JSON 解析成功前不要執行。若分片遺失、順序錯亂或出現解析錯誤,應將該次請求標記為不完整並保存原始 SSE 內容,禁止自動猜測參數。

Agent 重複執行有副作用的工具怎樣阻止?

在服務端加入幂等鍵與提交前確認,並在 Agent 層設置連續重複偵測。熔斷時要同時停止背景重試、寫入佇列及後續模型請求;只回傳「任務暫停、等待接管」的明確狀態,不要回傳偽造成功。

Kimi K3 工具呼叫最多跑多少輪合適?

不應用單一數字套用所有工作流。你應按唯讀或寫入風險、工具結果是否可驗證、單輪費用及任務是否可恢復來設計上限。真正必要的是四項硬限制同時存在:最大輪次、總時間、累計費用,以及副作用提交次數。

Kimi K3 Tool Calls 循環的處理順序,應該是「證據、消息鏈、流式組裝、重複偵測、副作用保護、驗收」,而不是只靠提示詞要求模型停止。若你目前的方案依賴個人電腦長時間執行,常見缺點是休眠中斷、終端關閉後缺少日誌、網路重連造成重試,以及人工接管時找不到最後安全狀態。先在沙箱完整重現一次循環;若接下來需要長時間跑回歸樣本,租用 Kvmkit 的遠端 Mac 環境會比把正式 Agent 綁在本地工作站更容易維持在線與留存紀錄。

常見問題

Kimi K3 為什麼會一直呼叫同一個函數?

先不要直接歸咎模型。常見原因是 assistant 訊息沒有原樣回傳、tool_call_id 對不上、工具結果沒有加入對話,或工具雖然成功執行卻沒有帶來新狀態。當工具名稱、規範化參數與結果進展都沒有變化時,才應在客戶端判定為無進展循環。

tool_call_id 回傳錯誤真的會造成工具循環嗎?

會,而且不一定每次都直接報錯。若 role=tool 的訊息使用了錯誤 ID,模型無法把結果配回原本的 assistant tool call,下一輪可能再次要求同一工具。你應保留原始 assistant 訊息,逐一複製每個 ID,並確認工具結果在同一輪完成回傳。

流式 Tool Calls 的參數應該怎樣拼接?

不要把每個分片當成完整 JSON 立即解析。應按工具索引累積函數名稱與 arguments 字串,保留分片順序,直到收到完整結束訊號並通過 JSON 解析後才執行工具。若拼接失敗,應停止該輪並記錄原始分片,不能由解析器靜默補字。

Agent 重複執行有副作用的工具,怎樣才能阻止?

在工具層加入幂等鍵,並把發信、支付、建單及資料寫入分成預覽、確認、提交三個階段。執行前先查詢相同幂等鍵是否已有結果;偵測到循環時立即停止新寫入,保留最後安全檢查點,再由人工確認是否恢復。

Kimi K3 工具呼叫最多跑多少輪才合理?

沒有適用所有 Agent 的固定輪次。官方建議的重複提醒不能直接當成通用上限;你應依任務風險設定輪次、總時間、累計費用和副作用四項限制。唯讀查詢可較寬鬆,有寫入工具則應採用更保守的上限與人工接管。

把 CI/CD 放在 M4 Mac mini 上,才算真正省心

Xcode, Fastlane, CocoaPods, and SPM are first-class on macOS. Mac mini M4 unified memory keeps signing and archiving smooth; ~4W standby power suits 24/7 build nodes.

View Kvmkit plans

需要技術支援或選型建議?

在使用 Mac 實例或 CI/CD 流水線過程中遇到問題,可先查看幫助中心;下單與計價見定價頁。