症狀:Kimi K3 Tool Calls 一直重複同一函數,Agent 不停請求。
最快解法:先保存完整請求證據,確認 assistant、tool_call_id 與工具結果原樣回傳;消息鏈正確後,再用「同工具、同參數、無新進展」判定循環,並立即啟用輪次、時間、費用及副作用限制。
這篇適合三類讀者:正在修復重複函數呼叫的工具調用 Agent 開發者、需要替無人值守工作流加上熔斷與恢復的自動化平台工程師,以及使用發信、建單或資料寫入工具的團隊。
最後更新於 2026 年 8 月 3 日;流程核對自 Kimi 官方 API troubleshooting、Tool Calls 與流式輸出文件。若 Kimi 修改工具呼叫格式、
finish_reason、流式欄位或重複呼叫建議,應重新驗證本文流程。
先保留證據,再切斷副作用
不要一看到畫面上重複出現函數名稱,就立刻修改提示詞。你首先要分清楚三種情況:
- UI 將同一個請求重複顯示,但 API 實際只呼叫一次。
- SDK、代理層或網路重試重新送出請求。
- Kimi K3 API 確實在新的對話輪次中重複產生同一個 Tool Calls。
至少保存以下脫敏資料:
- 完整
messages,包括 assistant 的tool_calls。 - 每次回應的
finish_reason、request_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 封裝,只保留一個簡單的唯讀工具,送出最小請求。驗證順序如下:
- 用固定的工具定義與固定輸入建立請求。
- 記錄原始 assistant 回應,不經過 UI 轉換。
- 將該 assistant 訊息原樣加入
messages。 - 執行工具並回傳完全相同的
tool_call_id。 - 再發送下一輪,確認模型能讀到工具結果並停止或轉入下一步。
如果非流式版本正常、封裝後版本循環,問題通常在 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 的固定答案。唯讀搜尋、資料彙整與支付提交的風險不同,不能把官方提醒阈值直接當成通用最佳值。你的輪次上限應由業務風險、單次工具成本及可恢復性決定。
對有寫入副作用的工具,建議採用:
預覽 -> 顯示變更 -> 確認 -> 帶幂等鍵提交 -> 查詢結果
即使網路重試造成同一提交請求再次送達,服務端也應依幂等鍵返回先前結果,而不是重新建立一筆資料。
第一週:用四組樣本完成驗收
生產前不要只測一次正常成功。至少準備四組可重播樣本:
- 正常呼叫:工具成功回傳新狀態,Agent 正常結束。
- 參數變化:同一工具名稱不變,但參數或查詢範圍改變,不能誤判為重複。
- 無進展重複:工具名稱、規範化參數及結果狀態都不變,應觸發熔斷。
- 網路重試:模擬請求逾時或服務端錯誤,確認重試不會造成重複副作用。
驗收時特別檢查:
- 熔斷後是否仍有背景請求。
- 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.