博客 AI / Agent

AI Coding Agent 如何工作?Claude Code、Codex、Xcode 27 Agent、Tool Calling 與 JSON 數據詳解

打開 Claude Code、Codex 或 Xcode 27,界面都像在聊天。真正讓它們改倉庫、跑測試、點模擬器的,不是那段自然語言回覆。

AI Coding Agent 的工作方式是:模型推理下一步,發出 Tool Calling;本地或 IDE 裏的 harness 執行工具,把結果寫成結構化數據再喂回去。參數和結果幾乎都是 JSON。

本文將介紹:

先記住這一點:界面像聊天,真正幹活的是 Tool Calling。模型選工具、填 JSON 參數;能不能改文件、跑測試、連模擬器,取決於 harness 給了哪些工具、權限和校驗。下面按循環 → 工具調用 → 三家產品 → JSON 契約拆開。

不是聊天框,是循環

補全解決「下一行寫什麼」。Coding Agent 解決「這個目標怎麼在真實工程裏做完」:讀上下文、選工具、改代碼、跑命令、看結果、再決策。

官方文檔裏的說法會換詞,形狀是同一套。Claude Code 把它寫成收集上下文 → 採取行動 → 驗證結果;Xcode 27 則是先計劃、再改文件、再用構建 / 測試 / Preview / 模擬器自我校驗。底層都是:

  1. 1
    觀察

    讀文件、搜符號、看 git 狀態、拉測試失敗日誌。沒有這一步,後面的補丁是猜的。

  2. 2
    決策

    模型在上下文裏選下一步:再讀、再搜、改一處、跑一條命令,或問你一句。

  3. 3
    執行

    harness 接到 tool call,按權限和沙箱真正去跑。模型此時不碰磁盤。

  4. 4
    回寫

    工具結果變成文本或 JSON,塞回上下文。模型根據新證據繼續,或宣佈做完。

你也在這個循環裏:打斷、改方向、批准高風險動作。模型負責推理;harness 負責工具、權限、會話和「怎樣算做完」。四家產品怎麼搶控制權,見

AI Coding Agent 已經不只是補全代碼:四家正在競爭什麼?

本文只拆「循環怎麼轉、JSON 在哪一跳出現」。技術棧分層可對照

2026 AI Agent 技術棧:LLM、MCP、Function Calling、JSON Schema

Tool Calling:參數就是 JSON

Tool Calling(也叫 Function Calling)不是「模型會寫代碼」的別名。它是一次結構化的函數調用:模型從你聲明的工具列表裏選一個名字,再生成符合參數契約的 JSON。

OpenAI 兼容接口裏,工具定義的 parameters 字段本身就是 JSON Schema:

工具定義(parameters = JSON Schema)
{
  "type": "function",
  "function": {
    "name": "run_tests",
    "description": "Run the project test suite and return a structured summary.",
    "parameters": {
      "type": "object",
      "properties": {
        "suite": { "type": "string", "enum": ["unit", "integration", "e2e"] },
        "path": { "type": "string", "minLength": 1 }
      },
      "required": ["suite"],
      "additionalProperties": false
    }
  }
}

模型返回時,arguments 經常是字符串,不是已經 parse 好的對象:

模型返回的 tool_call(arguments 是字符串)
{
  "id": "call_8f21",
  "type": "function",
  "function": {
    "name": "run_tests",
    "arguments": "{\"suite\":\"unit\",\"path\":\"src/auth\"}"
  }
}

所以業務層至少做兩件事:先把字符串解析成合法 JSON,再按你聲明的 schema 校驗字段、類型和枚舉。缺引號、多逗號、多寫未聲明鍵,都發生在這一跳,不發生在「模型看起來很聰明」那一層。

完整一圈是:請求帶上 schema → 模型選工具並生成 arguments → 你解析並校驗 → 執行工具 → 把結果當 tool message 喂回去 → 模型繼續。schema 寫得好,第一次參數就對;寫得含糊,循環會空轉。

契約怎麼寫、JSON Mode 和 Strict Schema 差在哪,見

AI Agent 爲什麼需要 JSON Schema?從 Tool Calling 到 Structured Output

Claude Code:內置工具 + 擴展層

Claude Code 的官方說明把 Agent 拆成兩塊:負責推理的模型,和負責行動的工具。沒有工具,Claude 只能迴文字;有了工具,它才能讀倉庫、改文件、跑命令、搜網頁。

內置工具大致五類:文件操作(Read / Edit / Write)、搜索(Grep / Glob)、執行(Bash)、Web(WebSearch / WebFetch),以及需要插件的代碼智能(跳轉到定義、看類型錯誤)。子 Agent、向你提問,也是工具,只是編排用的。

一次「把失敗測試修掉」在循環裏可能是:

  1. 1
    Bash 跑測試

    先看哪條斷言炸了,而不是先改代碼。

  2. 2
    Grep / Read 定位源文件

    用錯誤棧和符號把上下文讀進窗口。

  3. 3
    Edit 做精確替換

    官方要求先讀再改:old_string → new_string,避免盲寫。

  4. 4
    再跑測試驗證

    結果回到上下文。失敗就再循環,而不是口頭說「應該好了」。

擴展層疊在這個循環上面,不替換它:

Claude Code 的工程妥協很清楚:概率性 Agent + 確定性鉤子。會話本身也會落成 JSONL,方便恢復和分叉——你調試的往往不是「一段聊天」,而是一串 tool 事件。

Codex:沙箱、審批與 JSONL

Codex 同樣走 Agent loop,但它把「模型生成的命令如何落地」當成產品中心。終端裏跑

Codex CLI時,你先選沙箱和審批,再讓模型行動。

開關 常見取值 它限制什麼
sandbox read-only / workspace-write / danger-full-access 命令能寫哪裏、能不能出網
approval-policy untrusted / on-request / never 升級權限或高風險動作要不要人點頭

自動化場景用codex exec --json。標準輸出變成 JSONL:thread / turn 起止、命令執行、文件變更、MCP 調用、計劃更新。CI 腳本消費的是事件流,不是一段散文。

codex exec --json 事件(示意)
{"type":"item.completed","item":{"id":"item_12","type":"command_execution","command":"npm test -- src/auth","exit_code":1,"aggregated_output":"FAIL src/auth/session.test.ts"}}
{"type":"item.completed","item":{"id":"item_13","type":"file_change","path":"src/auth/session.ts","kind":"update"}}
{"type":"turn.completed","usage":{"input_tokens":18420,"output_tokens":966}}

需要穩定字段給下游時,用--output-schema讓最終答覆符合 JSON Schema。這和 Tool Calling 的 parameters 是同一類契約,只是約束的是「任務結束時的那份 JSON」,不是每一步命令。

默認codex exec是隻讀沙箱。要改文件,顯式加--sandbox workspace-write。需要更多目錄時優先--add-dir,而不是一上來danger-full-access

Xcode 27 Agent:計劃、校驗、編輯器工具

Apple 在 WWDC 2026 把 Xcode 27 定位成「在 Apple 平臺上和 Agent 一起寫代碼的地方」。和終端 Agent 不同,它的工具箱長在 IDE 裏。

Apple 新聞稿

Xcode, agents, and you

What’s new in Xcode 27說清楚了幾件事:

WWDC 實驗室把 Chat 和 Agent 說成能力差,不是文案差:Chat 只有一小套固定工具;Agent 模式加上命令行和 Xcode 內部工具(構建、測試、Preview、模擬器)。默認安全模式是權限提示——Agent 能拿到任務需要的東西,但不能在磁盤上隨便逛。

對 JSON 開發者,Xcode 這一跳的要點是:校驗結果也是結構化回寫。構建失敗、測試摘要、Preview 產物,都會變成 Agent 下一步的輸入。你在後端看到的,往往仍是自己 API 的 JSON;在 IDE 裏,同一循環消費的是 Xcode 工具的輸出。

系統級 Siri AI 走的是 App Intents,不是這套編輯器 Agent。別把兩條線混成「Apple 只有一種 Agent」,見

Siri AI 會成爲 AI Agent 嗎?

三家對照:同一循環,不同工具箱

功能清單會越來越像。差別在默認工具、執行邊界、以及結果怎麼變成下一輪上下文。

Claude Code Codex Xcode 27 Agent
循環 觀察 → 行動 → 驗證 同一 loop + 事件流 計劃 → 改代碼 → IDE 校驗
默認工具 Read / Edit / Bash / Grep shell + MCP + plan 構建 / 測試 / Preview / 模擬器
擴展 Skills、MCP、Hooks MCP、Agents SDK、output-schema MCP 插件、ACP 外部 Agent
邊界 權限模式 + Hooks sandbox + approval-policy 工程權限提示 + 工作目錄
機器可讀出口 會話 JSONL、tool 結果 exec --json、--output-schema diff、產物、構建/測試輸出

選型可以很短:通用多語言倉庫和可複用 Skills,走 Claude Code;要在真實機器上跑、又要把權限寫進 CI,走 Codex;目標是 Apple 平臺、校驗必須經過 Xcode 工具鏈,走 Xcode 27。Xcode 的 ACP 讓後一種不必排斥前兩種——外部 Agent 可以進編輯器,但構建和 Preview 仍是 Xcode 的工具。

JSON 數據在哪一層、誰校驗

三家產品 UI 不同,JSON 出現的位置很穩:

位置 典型字段 誰硬校驗
工具聲明 parameters / inputSchema 你的 schema + SDK
模型出參 tool_calls.arguments 先 parse,再 schema
工具回寫 structuredContent / 日誌 JSON outputSchema 或你自己的校驗
最終答覆 response_format / output-schema Strict Schema + 業務層

關鍵一句:API 層 schema 引導模型生成;業務層 schema 拒絕髒數據。兩層不能互相替代。爲什麼 AI 輸出必須先有 schema,見

AI 爲什麼需要 JSON Schema?

一份給 Coding Agent 用的工具 schema,描述要寫清「何時調用、何時不要調用」,枚舉寫進 enum,而不是埋在 description 裏:

Coding Agent 工具 schema(可粘貼校驗)
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "required": ["action", "path"],
  "properties": {
    "action": { "type": "string", "enum": ["read", "edit", "test"] },
    "path": { "type": "string", "minLength": 1 },
    "suite": { "type": "string", "enum": ["unit", "integration"] },
    "old_string": { "type": "string" },
    "new_string": { "type": "string" }
  },
  "additionalProperties": false,
  "allOf": [
    {
      "if": { "properties": { "action": { "const": "edit" } } },
      "then": { "required": ["old_string", "new_string"] }
    },
    {
      "if": { "properties": { "action": { "const": "test" } } },
      "then": { "required": ["suite"] }
    }
  ]
}

模型若返回{"action":"edit","path":"src/a.ts"}卻沒有 old_string,schema 會在執行層攔住。這比事後看 diff 便宜。

用 JSONNote 調試 tool 參數

Agent 開發最慢的往往不是寫提示詞,而是對一次失敗的 tool call。JSONNote 在瀏覽器本地跑,密鑰和倉庫內容不用上傳。

  1. 1
    先看 arguments 能不能 parse

    把模型返回的字符串丟進JSON 格式化。缺引號、尾逗號、被聊天軟件截斷的 hash,這一步就現形。

  2. 2
    再按 schema 校驗

    工具定義和實際 arguments 一起放進JSON Schema。enum 寫錯、少 required、多 extra 字段,比讀模型「抱歉」有用。

  3. 3
    對比兩次調用

    改完 description 或加了 additionalProperties: false 之後,用JSON Diff看參數迴歸。

  4. 4
    分享調試現場

    URL Hash 分享把一份 tool JSON 嵌進鏈接。同事打開即可復現,數據不經過服務器。

常見問題

AI Coding Agent 和代碼補全有什麼本質區別?

補全只建議下一行。Coding Agent 能讀倉庫、改文件、跑命令、調外部工具,並在循環里根據工具結果繼續決策。差別不在文筆,而在它能不能行動。

模型會直接改我的磁盤文件嗎?

不會。模型只生成 tool call,通常是一段 JSON。真正寫文件、跑 shell、點模擬器的是本地 harness。沒有工具、權限被拒或參數校驗失敗,磁盤上什麼都不會發生。

Claude Code、Codex 和 Xcode 27 Agent 誰更好?

沒有統一冠軍。要通用倉庫與 Skills / MCP 選 Claude Code;要沙箱、審批和 CI 裏的 JSONL 事件選 Codex;要做 Apple 平臺、需要構建 / Preview / 模擬器校驗選 Xcode 27 Agent。Xcode 還可用 ACP 接入外部 Agent。

爲什麼還要自己校驗 JSON?模型不是已經按 schema 填了嗎?

模型填參是軟約束。arguments 經常是字符串,可能缺字段、類型錯、或多寫未聲明鍵。生產路徑仍要 parse + JSON Schema 校驗,再交給業務層。Codex 的 --output-schema 也只約束最終答覆,不替代你對每一步 tool 結果的檢查。

Xcode 27 的 Agent 是不是隻能用 Apple 自己的模型?

不是。Xcode 27 把 Anthropic、Google、OpenAI 的模型與 Agent 接到同一套編輯器工作流,也支持本地模型,並可用 ACP 接入外部 Agent、用 MCP 接入外部工具。變的是工具箱和校驗手段,不是循環本身。

小結

三家產品的界面會繼續長得像聊天。底下那句話沒有變:

Coding Agent = 模型決策 × Tool Calling × harness 執行。JSON 是工具參數和回寫結果的共同形狀。

先把循環看清楚,再選工具箱:Claude Code 強化通用 Agent,Codex 管沙箱與事件,Xcode 27 把構建和 Preview 變成校驗工具。schema 寫在聲明裏,校驗寫在執行層,調試可以留在瀏覽器本地。

下一步:把一次失敗的 tool call 粘進 JSONNote

← 返回博客