慢慢来、按“真实执行路径”拆解,重点放在 Claude Code 配置 GLM 之后,在一次任务执行过程中,它是如何一步步和「大模型接口」交互的,而不是停留在“概念层”。

⚠️ 默认理解

  • Claude Code 指的是 CLI / IDE 插件那套 Agent Runtime
  • GLM 指 智谱 GLM-4 / 4.5 / 4.7 等兼容 OpenAI-style API 的模型
  • 场景是:执行一个真实任务(如改代码 / 分析项目 / 多步操作)

一、先给你一张“全景结构图”(脑内模型)

Claude Code + GLM 的情况下,真实结构是这样的:

你(用户)
  ↓
Claude Code UI(CLI / IDE)
  ↓
Agent Runtime(调度器 + 状态机)
  ↓
Model Adapter(OpenAI-compatible / GLM Adapter)
  ↓
HTTP(S) API 调用
  ↓
GLM 大模型

关键点
👉 Claude Code 并不知道自己在用 GLM
👉 它只认一种东西:“可对话的大模型接口”


二、Claude Code 执行一次「任务」的完整生命周期

下面我用 “执行一个真实任务” 为主线,而不是 API 文档式解释。


阶段 0:配置阶段(只发生一次)

你配置 GLM 时,实际上做了 3 件事(无论你意识到没有):

1️⃣ 告诉 Claude Code「模型是谁」

{
  "provider": "openai-compatible",
  "model": "glm-4.7"
}

👉 Claude Code 内部没有 glm 这个分支
👉 统一走 OpenAI-compatible adapter


2️⃣ 告诉它「去哪请求」

{
  "base_url": "https://open.bigmodel.cn/api/paas/v4"
}

👉 这会被拼成:

POST /chat/completions

或(新协议)

POST /responses

3️⃣ 告诉它「怎么鉴权」

{
  "api_key": "xxxx"
}

👉 最终变成:

Authorization: Bearer xxxxx

⚠️ 到这里为止,还没有任何任务执行
只是把 Model Adapter 准备好了。


三、任务真正开始:从「你按下 Enter」那一刻说起


阶段 1:User Input → Agent State 初始化

你输入:

“帮我重构这个 PHP Service”

Claude Code 内部不会直接发给模型,而是先做 结构化封装

内部状态大概是这样(伪结构):

AgentState {
  goal: "重构 PHP Service",
  history: [],
  workspace_snapshot: {...},
  rules: [...],
  tools: [...]
}

👉 注意
这一步 完全没有调用大模型


阶段 2:构造「第一次 Prompt」(极其关键)

这是第一个真正发给 GLM 的请求。

Claude Code 会拼一个非常长的 Prompt

它由 6 个部分组成(顺序很重要):


① System Prompt(Agent 灵魂)

包含:

  • 你是一个 coding agent
  • 可以调用哪些工具
  • 必须遵守哪些规则
  • 输出必须是 JSON / action

👉 这部分几乎每轮都在


② Developer Prompt(Claude Code 内置)

例如:

  • 如何一步步拆任务
  • 如何在不确定时继续思考
  • 何时调用工具

👉 这就是 Claude Code 的“秘诀”


③ Workspace Context(项目上下文)

  • 当前目录结构
  • 已读取的文件内容
  • Git 状态
  • IDE 提供的 symbol 信息

👉 这是 Claude Code 比普通 Chat 强的根本原因


④ Tool Schema(函数调用定义)

类似:

{
  "name": "read_file",
  "parameters": {...}
}

👉 GLM 会被当成“支持 function calling 的模型”


⑤ Conversation History

到目前为止的历史(第一次通常为空)


⑥ User Message

就是你刚才输入的那句话。


阶段 3:真正的「模型 API 调用」

现在,Claude Code 才会发出 HTTP 请求。

真实请求形态(抽象)

POST /chat/completions
Host: open.bigmodel.cn
Authorization: Bearer xxx
Content-Type: application/json
{
  "model": "glm-4.7",
  "messages": [
    { "role": "system", "content": "..." },
    { "role": "user", "content": "..." }
  ],
  "temperature": 0.2,
  "tools": [...],
  "tool_choice": "auto"
}

👉 Claude Code 不关心这是 GLM
👉 它只关心:返回结构是不是 OpenAI 风格


阶段 4:GLM 返回的不是“答案”,而是「意图」

这是很多人误解的地方。

GLM 返回的通常是三种之一:

情况 A:纯文本思考 + 计划

{
  "role": "assistant",
  "content": "我需要先读取 Service 文件..."
}

情况 B:工具调用(最常见)

{
  "tool_calls": [
    {
      "name": "read_file",
      "arguments": { "path": "app/Service/UserService.php" }
    }
  ]
}

👉 Claude Code 不会显示这一步
👉 它会立刻执行工具


情况 C:多工具 + Chain-of-Thought(隐式)

GLM 实际在“多步思考”,
但 Claude Code 只吃结果,不吃思考过程


阶段 5:Claude Code 执行工具(关键分水岭)

一旦收到 tool_call:

executeTool("read_file", args)
  • 读取文件
  • 结果写回 AgentState
  • 追加一条 tool_result message

例如:

{
  "role": "tool",
  "name": "read_file",
  "content": "class UserService {...}"
}

⚠️ 这里还没结束


阶段 6:进入「循环式模型交互」(while-loop)

从现在开始,进入你非常关心的阶段 👇

真实逻辑几乎一定是:

while (!taskDone) {
  response = callModel(state)
  if (response.tool_call) {
    runTool()
    updateState()
  } else {
    applyChangesOrAskUser()
  }
}

👉 一次任务 ≠ 一次模型调用
👉 常见是 5~30 次模型 API 调用


阶段 7:GLM 在这个循环里的“真实角色”

GLM 在 Claude Code 里并不是:

❌「一次性写完代码的 ChatGPT」
而是:

决策器 + 推理器 + 工具调度脑

它每一轮只负责回答一个问题:

“下一步我该干嘛?”


阶段 8:任务收敛与结束

当 GLM 返回:

  • 不再调用工具
  • 给出明确的 final answer
  • 或 Claude Code 判断目标已完成

Agent Runtime 才会:

  • 输出给用户
  • 结束 loop
  • 持久化状态

四、一个关键但少有人讲清的点(很重要)

❗ Claude Code 不会信任模型

它对 GLM:

  • 不信它“说任务完成了”
  • 不信它“说代码已写好”
  • 只信 文件系统 / diff / tool result

👉 这也是为什么:

  • 模型换成 GLM 后
  • 成功率主要取决于 tool-calling 稳定性

五、后面可以追问的 3 个“高级点”

我先帮你把路铺好:

1️⃣ GLM 的 function calling 和 Claude Code 的 tool schema 是否 100% 对齐?
2️⃣ 多模型时,Claude Code 如何做 model routing?
3️⃣ Claude Code 如何做上下文压缩,对 GLM 有什么坑?

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐