SpyBara
Go Premium

Documentation 2026-10-24 22:59 UTC to 2026-10-25 23:58 UTC

54 files changed +884 −389. View all changes and history on the product overview
2026
Fri 30 23:01 Thu 29 23:57 Wed 28 23:57 Tue 27 22:59 Mon 26 22:57 Sun 25 23:58 Sat 24 22:59 Fri 23 22:59 Thu 22 22:58 Wed 21 23:02 Tue 20 23:00 Mon 19 23:58 Sat 17 23:57 Fri 16 22:59 Thu 15 23:58 Wed 14 22:58 Tue 13 23:57 Sun 11 23:57 Sat 10 23:01 Fri 9 23:02 Thu 8 22:58 Wed 7 23:59 Tue 6 23:59 Mon 5 23:58 Sun 4 23:58 Sat 3 23:57 Fri 2 22:59 Thu 1 23:59
Details

771 771 

772当回调超过其超时时间时,Claude Code 会取消它并丢弃其输出,会话继续而不是挂起。接下来发生的情况取决于事件:772当回调超过其超时时间时,Claude Code 会取消它并丢弃其输出,会话继续而不是挂起。接下来发生的情况取决于事件:

773 773 

774* `PreToolUse`: Claude Code 阻止该工具调用。作为替代,Claude 收到一个工具结果,说明 hook 未在超时前响应,轮次继续。在 v2.1.210 之前,Claude Code 将超时报告给 Claude 作为用户拒绝,这使得无人值守会话停止并等待输入。774* `PreToolUse`: Claude Code 阻止该工具调用。如果其他所有 hook 均未返回任何内容或仅返回 `allow` 决定,工具结果会告知 Claude 该 hook 未在超时前响应,轮次继续。如果您的另一个 hook 已拒绝该调用,其拒绝仍会传达给 Claude:工具结果包含该 hook 的原因,超时文本可能跟在其后。

775 

776 在 v2.1.210 之前,Claude Code 将超时报告给 Claude 作为用户拒绝,这使得无人值守会话停止并等待输入。

775* `PostToolUse` 和 `PostToolUseFailure`:Claude Code 保留工具结果,轮次继续。777* `PostToolUse` 和 `PostToolUseFailure`:Claude Code 保留工具结果,轮次继续。

776* `UserPromptSubmit` 和 [`UserPromptExpansion`](https://code.claude.com/docs/zh-CN/hooks#userpromptexpansion):Claude Code 使用指明 hook 和超时的消息阻止该提示词,会话继续。在 v2.1.208 之前,当这些事件上的回调超时时,Claude Code 以 `error_during_execution` 结束查询。778* `UserPromptSubmit` 和 [`UserPromptExpansion`](https://code.claude.com/docs/zh-CN/hooks#userpromptexpansion):Claude Code 使用指明 hook 和超时的消息阻止该提示词,会话继续。在 v2.1.208 之前,当这些事件上的回调超时时,Claude Code 以 `error_during_execution` 结束查询。

777* `Stop` 和 `SubagentStop`:超时的回调计为不返回任何决定。Agent 或子代理停止,就像该回调已允许它一样,您在该事件上的其他 hook 的决定仍然适用。在 Claude Code v2.1.273 之前,超时的 `Stop` 或 `SubagentStop` 回调计为失败的 hook 运行,Claude Code 丢弃了您在该事件上的其他 hook 的决定。779* `Stop` 和 `SubagentStop`:超时的回调计为不返回任何决定。Agent 或子代理停止,就像该回调已允许它一样,您在该事件上的其他 hook 的决定仍然适用。在 Claude Code v2.1.273 之前,超时的 `Stop` 或 `SubagentStop` 回调计为失败的 hook 运行,Claude Code 丢弃了您在该事件上的其他 hook 的决定。

Details

60 60 

61### `query()`61### `query()`

62 62 

63与 Claude Code 交互的主要函数。创建一个异步生成器,在消息到达时流式传输消息。63与 Claude Code 交互的主要函数。创建一个异步生成器,在消息到达时以流式方式输出消息。

64 64 

65```typescript theme={null}65```typescript theme={null}

66function query({66function query({


76 76 

77| 参数 | 类型 | 描述 |77| 参数 | 类型 | 描述 |

78| :- | :- | :- |78| :- | :- | :- |

79| `prompt` | `string \| AsyncIterable<`[`SDKUserMessage`](#sdkusermessage)`>` | 输入提示,可以是字符串或异步可迭代对象(用于流式模式) |79| `prompt` | `string \| AsyncIterable<`[`SDKUserMessage`](#sdkusermessage)`>` | 输入提示词,可以是字符串,也可以是用于流式模式的异步可迭代对象 |

80| `options` | [`Options`](#options) | 可选配置对象(请参阅下面的 Options 类型) |80| `options` | [`Options`](#options) | 可选的配置对象(参见下文的 Options 类型) |

81 81 

82#### 返回值82#### 返回值

83 83 

84返回一个 [`Query`](#query-object) 对象,该对象扩展 `AsyncGenerator<`[`SDKMessage`](#sdkmessage)`, void>`,并具有其他方法。84返回一个 [`Query`](#query-object) 对象,该对象扩展了 `AsyncGenerator<`[`SDKMessage`](#sdkmessage)`, void>` 并提供了额外的方法。

85 85 

86### `startup()`86### `startup()`

87 87 

88通过生成 CLI 子进程并在提示可用之前完成初始化握手来预热 CLI 子进程。返回的 [`WarmQuery`](#warmquery) 句柄稍后接受提示并将其写入已准备好的进程,因此第一个 `query()` 调用解析时无需支付子进程生成和初始化成本。如果您还不知道会话的工作目录,请改用 [`prewarm()`](#prewarm)。88在提示词可用之前,通过启动 CLI 子进程并完成初始化握手来预热该子进程。返回的 [`WarmQuery`](#warmquery) 句柄可在稍后接收提示词,并将其写入已就绪的进程,因此第一次 `query()` 调用在解析时无需在调用路径中承担子进程启动和初始化的开销。如果您尚不知道会话的工作目录,请改用 [`prewarm()`](#prewarm)。

89 89 

90```typescript theme={null}90```typescript theme={null}

91function startup(params?: {91function startup(params?: {


98 98 

99| 参数 | 类型 | 描述 |99| 参数 | 类型 | 描述 |

100| :- | :- | :- |100| :- | :- | :- |

101| `options` | [`Options`](#options) | 可选配置对象。与 `query()` 的 `options` 参数相同 |101| `options` | [`Options`](#options) | 可选的配置对象。与 `query()` 的 `options` 参数相同 |

102| `initializeTimeoutMs` | `number` | 等待子进程初始化的最长时间(毫秒)。默认为 `60000`。如果初始化未在规定时间内完成,promise 将以超时错误拒绝 |102| `initializeTimeoutMs` | `number` | 等待子进程初始化的最长时间(毫秒)。默认为 `60000`。如果初始化未能在此时间内完成,promise 将以超时错误被拒绝 |

103 103 

104#### 返回值104#### 返回值

105 105 

106返回一个 `Promise<`[`WarmQuery`](#warmquery)`>`,在子进程生成并完成其初始化握手后解析。106返回一个 `Promise<`[`WarmQuery`](#warmquery)`>`,在子进程启动并完成初始化握手后解析。

107 107 

108#### 示例108#### 示例

109 109 

110早期调用 `startup()`,例如在应用程序启动时,然后在提示准备好后在返回的句柄上调用 `.query()`。这会将子进程生成和初始化移出关键路径。110尽早调用 `startup()`(例如在应用程序启动时),然后在提示词就绪后对返回的句柄调用 `.query()`。这样可以将子进程的启动和初始化移出关键路径。

111 111 

112```typescript theme={null}112```typescript theme={null}

113import { startup } from "@anthropic-ai/claude-agent-sdk";113import { startup } from "@anthropic-ai/claude-agent-sdk";

114 114 

115// 提前支付启动成本115// Pay startup cost upfront

116const warm = await startup({ options: { maxTurns: 3 } });116const warm = await startup({ options: { maxTurns: 3 } });

117 117 

118// 稍后,当提示准备好时,这是立即的118// Later, when a prompt is ready, this is immediate

119for await (const message of warm.query("What files are here?")) {119for await (const message of warm.query("What files are here?")) {

120 console.log(message);120 console.log(message);

121}121}


123 123 

124### `prewarm()`124### `prewarm()`

125 125 

126*Alpha。* 在您知道它将服务哪个会话之前启动 Claude Code 进程作为备用,以便您稍后可以使用 [`claim()`](#spareprocess) 将其绑定到会话。在应用程序启动之前用户选择文件夹的应用程序中使用它。需要 TypeScript Agent SDK v0.3.282 或更高版本。126*Alpha。* 在您知道某个 Claude Code 进程将服务于哪个会话之前,先将其作为备用进程启动,以便稍后通过 [`claim()`](#spareprocess) 将其绑定到会话。适用于在用户选择文件夹之前就已启动的应用程序。需要 TypeScript Agent SDK v0.3.282 或更高版本。

127 127 

128`prewarm()` 完成与 [`startup()`](#startup) 相同的初始化握手,当您设置 `options.cwd` 时进程在其中等待,否则在 Claude Code 配置目录下的私有临时目录中等待。会话的工作目录、其 `SessionStart` hooks、其 stdio MCP 服务器以及其 CLAUDE.md 和 git 上下文等待声明。备用进程在等待时占用大约 230 到 260 MB 的内存。如果您的 [`spawnClaudeCodeProcess`](#options) 在另一台机器或容器中运行 Claude Code,请将 `options.cwd` 设置为存在于那里的目录,以便备用进程在其中等待。128`prewarm()` 完成与 [`startup()`](#startup) 相同的初始化握手;如果您设置了 `options.cwd`,进程将在该目录中等待,否则将在您的 Claude Code 配置目录下的一个私有临时目录中等待。会话的工作目录、其 `SessionStart` hook、其 stdio MCP 服务器以及其 CLAUDE.md 和 git 上下文都要等到认领时才会确定。备用进程在等待期间大约占用 230 到 260 MB 内存。如果您的 [`spawnClaudeCodeProcess`](#options) 在另一台机器或容器中运行 Claude Code,请将 `options.cwd` 设置为该环境中存在的目录,供备用进程在其中等待。

129 129 

130```typescript theme={null}130```typescript theme={null}

131function prewarm(params?: {131function prewarm(params?: {


134}): Promise<SpareProcess>;134}): Promise<SpareProcess>;

135```135```

136 136 

137`options` 和 `initializeTimeoutMs` 的含义与 `startup()` 相同,除了 `options.cwd` 仅设置备用进程等待的目录。promise 在进程完成其初始化握手后使用 [`SpareProcess`](#spareprocess) 解析。如果 `options` 设置 `resume`、`continue` 或 `forkSession`,`prewarm()` 会抛出错误,因为备用进程还没有会话。声明无法设置的所有内容,例如 `mcpServers`、`hooks`、`canUseTool`、`settingSources`、`systemPrompt` 和 `plugins`,在备用进程的生命周期内是固定的,因此为每个不同的选项集保留一个备用进程,并在它们更改时再次预热。137`options` 和 `initializeTimeoutMs` 的含义与 `startup()` 中相同,只是 `options.cwd` 仅设置备用进程等待所在的目录。进程完成初始化握手后,promise 将解析为一个 [`SpareProcess`](#spareprocess)。如果 `options` 设置了 `resume`、`continue` 或 `forkSession`,`prewarm()` 会抛出错误,因为备用进程尚无会话。认领时无法设置的所有内容,例如 `mcpServers`、`hooks`、`canUseTool`、`settingSources`、`systemPrompt` 和 `plugins`,在备用进程的整个生命周期内都是固定的,因此请为每组不同的此类选项保留一个备用进程,并在这些选项发生变化时重新预热。

138 138 

139#### 示例139#### 示例

140 140 

141在应用程序启动时预热,然后在用户启动会话时声明备用进程:141在应用程序启动时预热,然后在用户开始会话时认领备用进程:

142 142 

143```typescript theme={null}143```typescript theme={null}

144import { prewarm } from "@anthropic-ai/claude-agent-sdk";144import { prewarm } from "@anthropic-ai/claude-agent-sdk";

145 145 

146// 在应用程序启动时,在会话的文件夹已知之前146// On application boot, before the session's folder is known

147const spare = await prewarm({ options: { maxTurns: 3 } });147const spare = await prewarm({ options: { maxTurns: 3 } });

148 148 

149// 稍后,当用户在文件夹中启动会话时149// Later, when the user starts a session in a folder

150const claimedQuery = spare.claim({150const claimedQuery = spare.claim({

151 prompt: "What files are here?",151 prompt: "What files are here?",

152 options: { cwd: "/path/to/project" },152 options: { cwd: "/path/to/project" },

153});153});

154 154 

155spare.claimed.catch((error: Error) => {155spare.claimed.catch((error: Error) => {

156 // 除非消息以 "option_not_applied" 开头,否则提示未运行:156 // Unless the message starts with "option_not_applied", the prompt didn't run:

157 // 改为使用 query() 启动此会话157 // start this session with query() instead

158 console.error("Claim failed:", error.message);158 console.error("Claim failed:", error.message);

159});159});

160 160 


163 console.log(message);163 console.log(message);

164 }164 }

165} catch (error) {165} catch (error) {

166 // 声明被拒绝后,已声明的查询在产出错误结果后会抛出异常166 // After a refused claim, the claimed query throws once it has yielded the error result

167 console.error(`Session ended with an error: ${error}`);167 console.error(`Session ended with an error: ${error}`);

168}168}

169```169```

170 170 

171### `tool()`171### `tool()`

172 172 

173为与 SDK MCP 服务器一起使用创建类型安全的 MCP 工具定义。173创建类型安全的 MCP 工具定义,供 SDK MCP 服务器使用。

174 174 

175```typescript theme={null}175```typescript theme={null}

176function tool<Schema extends AnyZodRawShape>(176function tool<Schema extends AnyZodRawShape>(


187| 参数 | 类型 | 描述 |187| 参数 | 类型 | 描述 |

188| :- | :- | :- |188| :- | :- | :- |

189| `name` | `string` | 工具的名称 |189| `name` | `string` | 工具的名称 |

190| `description` | `string` | 工具功能的描述 |190| `description` | `string` | 对工具功能的描述 |

191| `inputSchema` | `Schema extends AnyZodRawShape` | 定义工具输入参数的 Zod schema(支持 Zod 3 和 Zod 4) |191| `inputSchema` | `Schema extends AnyZodRawShape` | 定义工具输入参数的 Zod schema(同时支持 Zod 3 和 Zod 4) |

192| `handler` | `(args, extra) => Promise<`[`CallToolResult`](#calltoolresult)`>` | 执行工具逻辑的异步函数 |192| `handler` | `(args, extra) => Promise<`[`CallToolResult`](#calltoolresult)`>` | 执行工具逻辑的异步函数 |

193| `extras` | `{ annotations?: `[`ToolAnnotations`](#toolannotations)`; searchHint?: string; alwaysLoad?: boolean }` | 可选的 extras。`annotations` 为客户端提供 MCP 行为提示。`searchHint` 是当[工具搜索](https://code.claude.com/docs/zh-CN/agent-sdk/tool-search.md)处于活动状态时在延迟工具列表中显示的单行功能短语。`alwaysLoad: true` 将此工具的完整 schema 保留在初始提示中,而不是延迟它 |193| `extras` | `{ annotations?: `[`ToolAnnotations`](#toolannotations)`; searchHint?: string; alwaysLoad?: boolean }` | 可选的附加项。`annotations` 为客户端提供 MCP 行为提示。`searchHint` 是一个单行的能力描述短语,在启用 [工具搜索](https://code.claude.com/docs/zh-CN/agent-sdk/tool-search.md) 时显示在延迟加载工具列表中。`alwaysLoad: true` 会将此工具的完整 schema 保留在初始提示词中,而不是延迟加载 |

194 194 

195#### `ToolAnnotations`195#### `ToolAnnotations`

196 196 

197在 `@modelcontextprotocol/sdk/types.js` 中定义。所有字段都是可选提示;客户端不应依赖它们做出安全决策。197定义于 `@modelcontextprotocol/sdk/types.js`。所有字段都是可选的提示;客户端不应依赖它们做出安全决策。

198 198 

199| 字段 | 类型 | 默认值 | 描述 |199| 字段 | 类型 | 默认值 | 描述 |

200| :- | :- | :- | :- |200| :- | :- | :- | :- |

201| `title` | `string` | `undefined` | 工具的人类可读标题 |201| `title` | `string` | `undefined` | 工具的人类可读标题 |

202| `readOnlyHint` | `boolean` | `false` | 如果为 `true`,工具不会修改其环境 |202| `readOnlyHint` | `boolean` | `false` | 如果为 `true`,则该工具不会修改其环境 |

203| `destructiveHint` | `boolean` | `true` | 如果为 `true`,工具可能执行破坏性更新(仅在 `readOnlyHint` 为 `false` 时有意义) |203| `destructiveHint` | `boolean` | `true` | 如果为 `true`,则该工具可能执行破坏性更新(仅当 `readOnlyHint` 为 `false` 时有意义) |

204| `idempotentHint` | `boolean` | `false` | 如果为 `true`,使用相同参数的重复调用没有额外效果(仅在 `readOnlyHint` 为 `false` 时有意义) |204| `idempotentHint` | `boolean` | `false` | 如果为 `true`,则使用相同参数重复调用不会产生额外效果(仅当 `readOnlyHint` 为 `false` 时有意义) |

205| `openWorldHint` | `boolean` | `true` | 如果为 `true`,工具与外部实体交互(例如,网络搜索)。如果为 `false`,工具的域是封闭的(例如,记忆工具) |205| `openWorldHint` | `boolean` | `true` | 如果为 `true`,则该工具会与外部实体交互(例如网络搜索)。如果为 `false`,则该工具的作用域是封闭的(例如记忆工具) |

206 206 

207```typescript theme={null}207```typescript theme={null}

208import { tool } from "@anthropic-ai/claude-agent-sdk";208import { tool } from "@anthropic-ai/claude-agent-sdk";


221 221 

222### `createSdkMcpServer()`222### `createSdkMcpServer()`

223 223 

224创建在与应用程序相同的进程中运行的 MCP 服务器实例。224创建一个与您的应用程序在同一进程中运行的 MCP 服务器实例。

225 225 

226```typescript theme={null}226```typescript theme={null}

227function createSdkMcpServer(options: {227function createSdkMcpServer(options: {


239| 参数 | 类型 | 描述 |239| 参数 | 类型 | 描述 |

240| :- | :- | :- |240| :- | :- | :- |

241| `options.name` | `string` | MCP 服务器的名称 |241| `options.name` | `string` | MCP 服务器的名称 |

242| `options.version` | `string` | 可选版本字符串 |242| `options.version` | `string` | 可选的版本字符串 |

243| `options.instructions` | `string` | 可选服务器说明,从 `initialize` 返回并作为 MCP 说明块呈现给模型 |243| `options.instructions` | `string` | 可选的服务器指令,由 `initialize` 返回,并作为 MCP 指令块呈现给模型 |

244| `options.tools` | `Array<SdkMcpToolDefinition>` | 使用 [`tool()`](#tool) 创建的工具定义数组 |244| `options.tools` | `Array<SdkMcpToolDefinition>` | 使用 [`tool()`](#tool) 创建的工具定义数组 |

245| `options.alwaysLoad` | `boolean` | 当为 `true` 时,此服务器的工具保留在初始提示词中,而不是被延迟到[工具搜索](https://code.claude.com/docs/zh-CN/agent-sdk/tool-search.md)之后。与 [`tool()`](#tool) 中的每个工具 `alwaysLoad` 结合 |245| `options.alwaysLoad` | `boolean` | 为 `true` 时,此服务器的工具会保留在初始提示词中,而不会延迟到 [工具搜索](https://code.claude.com/docs/zh-CN/agent-sdk/tool-search.md) 之后加载。可与 [`tool()`](#tool) 中针对单个工具的 `alwaysLoad` 组合使用 |

246| `options.timeout` | `number` | 此服务器的工具调用超时时间(毫秒)。Claude Code 将其应用于此服务器以代替 [`MCP_TOOL_TIMEOUT`](https://code.claude.com/docs/zh-CN/env-vars)。传递至少 1000 的整数。Claude Code 忽略其他值。需要 TypeScript Agent SDK v0.3.248 或更高版本 |246| `options.timeout` | `number` | 此服务器工具调用的超时时间(毫秒)。Claude Code 会将其应用于此服务器,以取代 [`MCP_TOOL_TIMEOUT`](https://code.claude.com/docs/zh-CN/env-vars)。请传入不小于 1000 的整数。Claude Code 会忽略其他值。需要 TypeScript Agent SDK v0.3.248 或更高版本 |

247 247 

248### `listSessions()`248### `listSessions()`

249 249 

250发现并列出具有轻量级元数据的过去会话。按项目目录筛选或列出所有项目中的会话。250发现并列出过去的会话及其轻量元数据。可按项目目录筛选,或列出所有项目中的会话。

251 251 

252```typescript theme={null}252```typescript theme={null}

253function listSessions(options?: ListSessionsOptions): Promise<SDKSessionInfo[]>;253function listSessions(options?: ListSessionsOptions): Promise<SDKSessionInfo[]>;


257 257 

258| 参数 | 类型 | 默认值 | 描述 |258| 参数 | 类型 | 默认值 | 描述 |

259| :- | :- | :- | :- |259| :- | :- | :- | :- |

260| `options.dir` | `string` | `undefined` | 列出会话的目录。省略时,返回所有项目中的会话 |260| `options.dir` | `string` | `undefined` | 要列出会话的目录。省略时返回所有项目中的会话 |

261| `options.limit` | `number` | `undefined` | 要返回的最大会话数 |261| `options.limit` | `number` | `undefined` | 要返回的最大会话数 |

262| `options.includeWorktrees` | `boolean` | `true` | 当 `dir` 在 git 仓库内时,包括来自所有 worktree 路径的会话 |262| `options.includeWorktrees` | `boolean` | `true` | 当 `dir` 位于 git 仓库内时,包含来自所有 worktree 路径的会话 |

263 263 

264#### 返回类型:`SDKSessionInfo`264#### 返回类型:`SDKSessionInfo`

265 265 

266| 属性 | 类型 | 描述 |266| 属性 | 类型 | 描述 |

267| :- | :- | :- |267| :- | :- | :- |

268| `sessionId` | `string` | 唯一会话标识符 (UUID) |268| `sessionId` | `string` | 唯一会话标识符(UUID) |

269| `summary` | `string` | 显示标题:自定义标题、最近的提示、自动生成的摘要或第一个提示 |269| `summary` | `string` | 显示标题:自定义标题、最近的提示词、自动生成的摘要或第一个提示词 |

270| `lastModified` | `number` | 上次修改时间(自纪元以来的毫秒数) |270| `lastModified` | `number` | 最后修改时间,自纪元以来的毫秒数 |

271| `fileSize` | `number \| undefined` | 会话文件大小(字节)。仅对本地 JSONL 存储进行填充 |271| `fileSize` | `number \| undefined` | 会话文件大小(字节)。仅在本地 JSONL 存储时填充 |

272| `customTitle` | `string \| undefined` | 会话的自定义标题(当设置了一个时),例如通过 `--name`、`/rename`、hook 的 `sessionTitle` 输出或 [`renameSession()`](#renamesession)。否则为 AI 生成的会话标题(如果会话有的话) |272| `customTitle` | `string \| undefined` | 会话已设置的自定义标题,例如通过 `--name`、`/rename`、hook 的 `sessionTitle` 输出或 [`renameSession()`](#renamesession) 设置的标题。否则为 AI 生成的会话标题(如果会话有的话) |

273| `firstPrompt` | `string \| undefined` | 会话中的第一个有意义的用户提示 |273| `firstPrompt` | `string \| undefined` | 会话中第一个有意义的用户提示词 |

274| `gitBranch` | `string \| undefined` | 会话结束时的 git 分支 |274| `gitBranch` | `string \| undefined` | 会话结束时的 Git 分支 |

275| `cwd` | `string \| undefined` | 会话的工作目录 |275| `cwd` | `string \| undefined` | 会话的工作目录 |

276| `tag` | `string \| undefined` | 用户设置的会话标签(请参阅 [`tagSession()`](#tagsession)) |276| `tag` | `string \| undefined` | 用户设置的会话标签(参见 [`tagSession()`](#tagsession)) |

277| `createdAt` | `number \| undefined` | 创建时间(自纪元以来的毫秒数),来自第一个条目的时间戳 |277| `createdAt` | `number \| undefined` | 创建时间,自纪元以来的毫秒数,取自第一个条目的时间戳 |

278 278 

279#### 示例279#### 示例

280 280 

281打印项目的 10 个最近会话。结果按 `lastModified` 降序排序,因此第一项是最新的。省略 `dir` 以搜索所有项目。281打印某个项目最近的 10 个会话。结果按 `lastModified` 降序排列,因此第一项是最新的。省略 `dir` 可在所有项目中搜索。

282 282 

283```typescript theme={null}283```typescript theme={null}

284import { listSessions } from "@anthropic-ai/claude-agent-sdk";284import { listSessions } from "@anthropic-ai/claude-agent-sdk";


305 305 

306| 参数 | 类型 | 默认值 | 描述 |306| 参数 | 类型 | 默认值 | 描述 |

307| :- | :- | :- | :- |307| :- | :- | :- | :- |

308| `sessionId` | `string` | 必需 | 要读取的会话 UUID(请参阅 `listSessions()`) |308| `sessionId` | `string` | 必需 | 要读取的会话 UUID(参见 `listSessions()`) |

309| `options.dir` | `string` | `undefined` | 查找会话的项目目录。省略时,搜索所有项目 |309| `options.dir` | `string` | `undefined` | 用于查找会话的项目目录。省略时搜索所有项目 |

310| `options.limit` | `number` | `undefined` | 要返回的最大消息数 |310| `options.limit` | `number` | `undefined` | 要返回的最大消息数 |

311| `options.offset` | `number` | `undefined` | 从开始跳过的消息数 |311| `options.offset` | `number` | `undefined` | 从开头跳过的消息数 |

312| `options.includeSystemMessages` | `boolean` | `false` | 为 `true` 时,除用户和助手消息外,还返回系统消息,例如压缩边界 |

312 313 

313#### 返回类型:`SessionMessage`314#### 返回类型:`SessionMessage`

314 315 

315| 属性 | 类型 | 描述 |316| 属性 | 类型 | 描述 |

316| :- | :- | :- |317| :- | :- | :- |

317| `type` | `"user" \| "assistant"` | 消息角色 |318| `type` | `"user" \| "assistant" \| "system"` | 消息角色。仅当 `options.includeSystemMessages` 为 `true` 时才会出现 `"system"` |

318| `uuid` | `string` | 唯一消息标识符 |319| `uuid` | `string` | 唯一消息标识符 |

319| `session_id` | `string` | 此消息所属的会话 |320| `session_id` | `string` | 此消息所属的会话 |

320| `message` | `unknown` | 来自会话记录的原始消息负载 |321| `message` | `unknown` | 来自会话记录的原始消息负载 |

321| `parent_tool_use_id` | `string \| null` | 对于子代理消息,启动该子代理的 `Agent` 或 `Skill` 工具调用的 `tool_use_id`。对于主会话消息和较旧的会话为 `null` |322| `parent_tool_use_id` | `string \| null` | 对于子代理消息,为启动该子代理的 `Agent` 或 `Skill` 工具调用的 `tool_use_id`。对于主会话消息和较旧的会话为 `null` |

322| `parent_agent_id` | `string \| null` | 对于来自[嵌套子代理](https://code.claude.com/docs/zh-CN/sub-agents.md#let-subagents-spawn-their-own-subagents)的消息,为启动该嵌套子代理的子代理的 `agentId`。对于主会话消息、来自顶级子代理的消息和较旧的会话为 `null`。需要 Claude Code v2.1.202 或更高版本 |323| `parent_agent_id` | `string \| null` | 对于来自 [嵌套子代理](https://code.claude.com/docs/zh-CN/sub-agents.md#let-subagents-spawn-their-own-subagents) 的消息,为生成它的子代理的 `agentId`。对于主会话消息、来自顶层子代理的消息以及较旧的会话为 `null`。需要 Claude Code v2.1.202 或更高版本 |

323 324 

324#### 示例325#### 示例

325 326 


342 343 

343### `getSessionInfo()`344### `getSessionInfo()`

344 345 

345按 ID 读取单个会话的元数据,无需扫描完整项目目录。346按 ID 读取单个会话的元数据,无需扫描整个项目目录。

346 347 

347```typescript theme={null}348```typescript theme={null}

348function getSessionInfo(349function getSessionInfo(


355 356 

356| 参数 | 类型 | 默认值 | 描述 |357| 参数 | 类型 | 默认值 | 描述 |

357| :- | :- | :- | :- |358| :- | :- | :- | :- |

358| `sessionId` | `string` | 必需 | 要查找的会话 UUID |359| `sessionId` | `string` | 必需 | 要查找的会话的 UUID |

359| `options.dir` | `string` | `undefined` | 项目目录路径。省略时,搜索所有项目目录 |360| `options.dir` | `string` | `undefined` | 项目目录路径。省略时搜索所有项目目录 |

360 361 

361返回 [`SDKSessionInfo`](#return-type-sdksessioninfo),如果找不到会话,则返回 `undefined`。362返回 [`SDKSessionInfo`](#return-type-sdksessioninfo),如果未找到会话则返回 `undefined`。

362 363 

363### `renameSession()`364### `renameSession()`

364 365 

365通过附加自定义标题条目来重命名会话。重复调用是安全的;以最新的标题为准。366通过追加一个自定义标题条目来重命名会话。重复调用是安全的;以最近的标题为准。

366 367 

367```typescript theme={null}368```typescript theme={null}

368function renameSession(369function renameSession(


376 377 

377| 参数 | 类型 | 默认值 | 描述 |378| 参数 | 类型 | 默认值 | 描述 |

378| :- | :- | :- | :- |379| :- | :- | :- | :- |

379| `sessionId` | `string` | 必需 | 要重命名的会话 UUID |380| `sessionId` | `string` | 必需 | 要重命名的会话的 UUID |

380| `title` | `string` | 必需 | 新标题。修剪空格后必须非空 |381| `title` | `string` | 必需 | 新标题。去除首尾空白后不得为空 |

381| `options.dir` | `string` | `undefined` | 项目目录路径。省略时,搜索所有项目目录 |382| `options.dir` | `string` | `undefined` | 项目目录路径。省略时搜索所有项目目录 |

382 383 

383### `tagSession()`384### `tagSession()`

384 385 

385标记会话。传递 `null` 以清除标签。重复调用是安全的;以最新的标签为准。386为会话添加标签。传入 `null` 可清除标签。重复调用是安全的;以最近的标签为准。

386 387 

387```typescript theme={null}388```typescript theme={null}

388function tagSession(389function tagSession(


396 397 

397| 参数 | 类型 | 默认值 | 描述 |398| 参数 | 类型 | 默认值 | 描述 |

398| :- | :- | :- | :- |399| :- | :- | :- | :- |

399| `sessionId` | `string` | 必需 | 要标记的会话 UUID |400| `sessionId` | `string` | 必需 | 要添加标签的会话的 UUID |

400| `tag` | `string \| null` | 必需 | 标签字符串,或 `null` 以清除 |401| `tag` | `string \| null` | 必需 | 标签字符串,或传入 `null` 以清除 |

401| `options.dir` | `string` | `undefined` | 项目目录路径。省略时,搜索所有项目目录 |402| `options.dir` | `string` | `undefined` | 项目目录路径。省略时搜索所有项目目录 |

402 403 

403### `forkSession()`404### `forkSession()`

404 405 

405将会话的会话记录复制到新会话中,以便您可以将对话引向另一个方向,同时保持原始会话不变。要从对话中较早的某个点分支,请传递 `upToMessageId`。406将会话的会话记录复制到一个新会话中,以便您在保持原始会话不变的同时,将对话引向另一个方向。要从对话中较早的某个位置分叉,请传入 `upToMessageId`。

406 407 

407```typescript theme={null}408```typescript theme={null}

408function forkSession(409function forkSession(


415 416 

416| 参数 | 类型 | 默认值 | 描述 |417| 参数 | 类型 | 默认值 | 描述 |

417| :- | :- | :- | :- |418| :- | :- | :- | :- |

418| `sessionId` | `string` | 必需 | 要分叉的会话 UUID |419| `sessionId` | `string` | 必需 | 要分叉的会话的 UUID |

419| `options.dir` | `string` | `undefined` | 项目目录路径。省略时,搜索所有项目目录 |420| `options.dir` | `string` | `undefined` | 项目目录路径。省略时搜索所有项目目录 |

420| `options.upToMessageId` | `string` | `undefined` | 复制会话记录,直到并包括具有此 `uuid` 的消息:该值来自 [`getSessionMessages()`](#getsessionmessages),或是您在流式传输的 [`SDKUserMessage`](#sdkusermessage) 上设置的 `uuid`。省略时,复制整个会话记录 |421| `options.upToMessageId` | `string` | `undefined` | 复制会话记录,直到并包括具有此 `uuid` 的消息:该值可以来自 [`getSessionMessages()`](#getsessionmessages),也可以是您在流式传入的 [`SDKUserMessage`](#sdkusermessage) 上设置的 `uuid`。省略时复制整个会话记录 |

421| `options.title` | `string` | `undefined` | 分叉的标题。省略时,SDK 从原始会话派生一个标题,后跟 `(fork)` |422| `options.title` | `string` | `undefined` | 分叉的标题。省略时,SDK 会根据原始会话生成一个标题,并在其后附加 `(fork)` |

422 423 

423返回 `{ sessionId }`,即新会话的 UUID。将其作为 [`resume`](#options) 传递以继续该分叉。分叉不包括原始会话的[文件检查点](https://code.claude.com/docs/zh-CN/agent-sdk/file-checkpointing.md),因此您无法将其回退到分叉之前捕获的检查点。424返回 `{ sessionId }`,即新会话的 UUID。将其作为 [`resume`](#options) 传入即可继续该分叉。分叉不包含原始会话的 [文件检查点](https://code.claude.com/docs/zh-CN/agent-sdk/file-checkpointing.md),因此您无法将其回退到分叉之前捕获的检查点。

424 425 

425`forkSession()` 在以下情况下会抛出错误:426在以下情况下,`forkSession()` 会抛出错误:

426 427 

427* `sessionId` 不是 UUID428* `sessionId` 不是 UUID

428* 找不到会话,或会话没有消息429* 找不到该会话,或该会话没有消息

429* `upToMessageId` 与会话记录中的任何消息都不匹配430* `upToMessageId` 与会话记录中的任何消息都不匹配

430 431 

431### `resolveSettings()`432### `resolveSettings()`

432 433 

433使用与 CLI 相同的合并引擎为给定目录解析有效的 Claude Code 设置,无需生成 Claude CLI。在调用 `query()` 之前使用它来检查 `query()` 调用将看到的配置。434使用与 CLI 相同的合并引擎,解析给定目录的有效 Claude Code 设置,而无需启动 Claude CLI。可在调用 `query()` 之前,用它检查该调用将会看到哪些配置。

434 435 

435> [!NOTE]436> [!NOTE]

436>437>

437> 此函数处于 alpha 阶段,其 API 在稳定之前可能会更改。438> 此函数处于 alpha 阶段,其 API 在稳定之前可能会发生变化。

438 439 

439快照与实时 `query()` 会话应用的内容不同:440该快照与实时 `query()` 会话实际应用的内容存在以下差异:

440 441 

441* **`policyHelper`**:`resolveSettings()` 读取 MDM 源,包括 macOS plist 和 Windows HKLM/HKCU,但不执行管理员配置的 `policyHelper` 子进程。442* **`policyHelper`**:`resolveSettings()` 会读取 MDM 来源,包括 macOS plist 和 Windows HKLM/HKCU,但不会执行管理员配置的 `policyHelper` 子进程。

442* **服务器管理的设置**:`resolveSettings()` 不获取[服务器管理的设置](https://code.claude.com/docs/zh-CN/server-managed-settings.md#fetch-and-caching-behavior)。将它们作为 `options.serverManagedSettings` 传递以包含它们。443* **服务器托管设置**:`resolveSettings()` 不会获取 [服务器托管设置](https://code.claude.com/docs/zh-CN/server-managed-settings.md#fetch-and-caching-behavior)。如需包含这些设置,请将其作为 `options.serverManagedSettings` 传入。

443* **`defaultMode`**:快照从每个层级按原样返回 `permissions.defaultMode`,因此它可以包括项目和本地设置中的 `'auto'` 和 `'bypassPermissions'` 值,[实时会话忽略](https://code.claude.com/docs/zh-CN/permission-modes.md#which-mode-a-session-starts-in)这些值。444* **`defaultMode`**:快照会按原样返回每个层级中的 `permissions.defaultMode`,因此其中可能包含来自项目设置和本地设置的 `'auto'` 和 `'bypassPermissions'` 值,而 [实时会话会忽略这些值](https://code.claude.com/docs/zh-CN/permission-modes.md#which-mode-a-session-starts-in)。

444 445 

445```typescript theme={null}446```typescript theme={null}

446function resolveSettings(447function resolveSettings(


454 455 

455| 参数 | 类型 | 默认值 | 描述 |456| 参数 | 类型 | 默认值 | 描述 |

456| :- | :- | :- | :- |457| :- | :- | :- | :- |

457| `options.cwd` | `string` | `process.cwd()` | 用于解析项目和本地设置的相对目录 |458| `options.cwd` | `string` | `process.cwd()` | 解析项目设置和本地设置时所相对的目录 |

458| `options.settingSources` | [`SettingSource`](#settingsource)`[]` | 所有源 | 要加载的文件系统源。传递 `[]` 以跳过用户、项目和本地设置。[端点管理的策略](https://code.claude.com/docs/zh-CN/managed-settings.md#delivery-mechanisms)在所有情况下都会加载。`resolveSettings()` 仅当您传递 `options.serverManagedSettings` 时才包括服务器管理的设置 |459| `options.settingSources` | [`SettingSource`](#settingsource)`[]` | 所有来源 | 要加载哪些文件系统来源。传入 `[]` 可跳过用户设置、项目设置和本地设置。[端点托管策略](https://code.claude.com/docs/zh-CN/managed-settings.md#delivery-mechanisms) 在所有情况下都会加载。仅当您传入 `options.serverManagedSettings` 时,`resolveSettings()` 才会包含服务器托管设置 |

459| `options.managedSettings` | `Settings` | `undefined` | 由嵌入主机提供的策略层设置。遵循与 [`managedSettings` in `Options`](#options) 相同的规则,除了 `resolveSettings()` 不执行配置的 [`policyHelper`](https://code.claude.com/docs/zh-CN/settings-reference#policyhelper),因此快照可以包括实时会话删除的设置 |460| `options.managedSettings` | `Settings` | `undefined` | 由嵌入宿主提供的策略层级设置。遵循与 [`Options` 中的 `managedSettings`](#options) 相同的规则,不同之处在于 `resolveSettings()` 不会执行已配置的 [`policyHelper`](https://code.claude.com/docs/zh-CN/settings-reference#policyhelper),因此快照中可能包含实时会话会丢弃的设置 |

460| `options.serverManagedSettings` | `Settings` | `undefined` | 来自 `/api/claude_code/settings` 的服务器管理设置负载。非限制性键不经过滤地通过 |461| `options.serverManagedSettings` | `Settings` | `undefined` | 来自 `/api/claude_code/settings` 的服务器托管设置负载。非限制性键将不经过滤直接传递 |

461 462 

462#### 返回类型:`ResolvedSettings`463#### 返回类型:`ResolvedSettings`

463 464 

464`resolveSettings()` 返回一个对象,描述合并的设置和为每个键提供值的源。465`resolveSettings()` 返回一个对象,描述合并后的设置以及提供每个键的来源。

465 466 

466| 属性 | 类型 | 描述 |467| 属性 | 类型 | 描述 |

467| :- | :- | :- |468| :- | :- | :- |

468| `effective` | `Settings` | 在按优先级顺序应用所有启用的源后合并的设置 |469| `effective` | `Settings` | 按优先级顺序应用所有已启用来源后的合并设置 |

469| `provenance` | `Partial<Record<keyof Settings, ProvenanceEntry>>` | 对于 `effective` 中的每个顶级键,哪个源提供了该值 |470| `provenance` | `Partial<Record<keyof Settings, ProvenanceEntry>>` | 对于 `effective` 中的每个顶层键,指明由哪个来源提供了该值 |

470| `sources` | `Array<{ source, settings, path?, policyOrigin? }>` | 每个源的原始设置,按从最低到最高优先级排序 |471| `sources` | `Array<{ source, settings, path?, policyOrigin? }>` | 每个来源的原始设置,按优先级从低到高排列 |

471 472 

472#### 示例473#### 示例

473 474 

474下面的示例为项目目录解析设置并打印控制清理周期的源。在没有设置文件设置 `cleanupPeriodDays` 的机器上,两条打印的行都显示 `undefined` 作为值,这是预期的输出而不是错误。475下面的示例解析某个项目目录的设置,并打印控制清理周期的来源。在没有任何设置文件设置 `cleanupPeriodDays` 的机器上,打印的两行中该值都显示为 `undefined`,这是预期的输出,而不是错误。

475 476 

476```typescript theme={null}477```typescript theme={null}

477import { resolveSettings } from "@anthropic-ai/claude-agent-sdk";478import { resolveSettings } from "@anthropic-ai/claude-agent-sdk";


632 }): Promise<SDKControlReloadPluginsResponse>;633 }): Promise<SDKControlReloadPluginsResponse>;

633 reloadSkills(): Promise<SDKControlReloadSkillsResponse>;634 reloadSkills(): Promise<SDKControlReloadSkillsResponse>;

634 reloadOutputStyles(): Promise<SDKControlReloadOutputStylesResponse>;635 reloadOutputStyles(): Promise<SDKControlReloadOutputStylesResponse>;

636 seedReadState(path: string, mtime: number): Promise<void>;

635 accountInfo(): Promise<AccountInfo>;637 accountInfo(): Promise<AccountInfo>;

636 reconnectMcpServer(serverName: string): Promise<void>;638 reconnectMcpServer(serverName: string): Promise<void>;

637 toggleMcpServer(serverName: string, enabled: boolean): Promise<void>;639 toggleMcpServer(serverName: string, enabled: boolean): Promise<void>;

638 setMcpServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;640 setMcpServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;

641 setMcpPermissionModeOverride(

642 serverName: string,

643 mode: 'default' | 'auto' | null

644 ): Promise<{ warning?: string }>;

639 readMcpResource(serverName: string, uri: string): Promise<SDKControlMcpReadResourceResponse>;645 readMcpResource(serverName: string, uri: string): Promise<SDKControlMcpReadResourceResponse>;

640 streamInput(stream: AsyncIterable<SDKUserMessage>): Promise<void>;646 streamInput(stream: AsyncIterable<SDKUserMessage>): Promise<void>;

641 stopTask(taskId: string): Promise<void>;647 stopTask(taskId: string): Promise<void>;

648 backgroundTasks(toolUseId?: string): Promise<boolean>;

642 close(): void;649 close(): void;

643}650}

644```651```


665| `reloadPlugins(options?)` | 从磁盘重新加载插件,使您在会话中途安装或编辑的插件作用于正在运行的会话。以 [`SDKControlReloadPluginsResponse`](#sdkcontrolreloadpluginsresponse) 完成,其中列出会话的命令、子代理、插件和 MCP 服务器状态。需要 Agent SDK v0.2.85 或更高版本。[`holdOnCacheImpact` 选项](#sdkcontrolreloadpluginsresponse)需要 Agent SDK v0.3.268 或更高版本 |672| `reloadPlugins(options?)` | 从磁盘重新加载插件,使您在会话中途安装或编辑的插件作用于正在运行的会话。以 [`SDKControlReloadPluginsResponse`](#sdkcontrolreloadpluginsresponse) 完成,其中列出会话的命令、子代理、插件和 MCP 服务器状态。需要 Agent SDK v0.2.85 或更高版本。[`holdOnCacheImpact` 选项](#sdkcontrolreloadpluginsresponse)需要 Agent SDK v0.3.268 或更高版本 |

666| `reloadSkills()` | 从磁盘重新加载 skill,使您在会话中途添加或编辑的 skill 可供正在运行的会话使用。以 [`SDKControlReloadSkillsResponse`](#sdkcontrolreloadskillsresponse) 完成,其中列出重新加载后可用的 skill。需要 Agent SDK v0.3.163 或更高版本 |673| `reloadSkills()` | 从磁盘重新加载 skill,使您在会话中途添加或编辑的 skill 可供正在运行的会话使用。以 [`SDKControlReloadSkillsResponse`](#sdkcontrolreloadskillsresponse) 完成,其中列出重新加载后可用的 skill。需要 Agent SDK v0.3.163 或更高版本 |

667| `reloadOutputStyles()` | 从磁盘重新读取[输出样式](https://code.claude.com/docs/zh-CN/output-styles.md),使您在会话中途添加或编辑的样式文件可供正在运行的会话使用。以 [`SDKControlReloadOutputStylesResponse`](#sdkcontrolreloadoutputstylesresponse) 完成,其中列出重新加载后可用的样式名称。需要 Agent SDK v0.3.261 或更高版本 |674| `reloadOutputStyles()` | 从磁盘重新读取[输出样式](https://code.claude.com/docs/zh-CN/output-styles.md),使您在会话中途添加或编辑的样式文件可供正在运行的会话使用。以 [`SDKControlReloadOutputStylesResponse`](#sdkcontrolreloadoutputstylesresponse) 完成,其中列出重新加载后可用的样式名称。需要 Agent SDK v0.3.261 或更高版本 |

675| `seedReadState(path, mtime)` | 将文件标记为已读取,使之后的 Edit 不会因 `File has not been read yet` 而失败。请参阅 [`seedReadState()`](#seedreadstate)。需要 TypeScript SDK v0.2.83 或更高版本 |

668| `accountInfo()` | 返回账户信息 |676| `accountInfo()` | 返回账户信息 |

669| `reconnectMcpServer(serverName)` | 按名称重新连接 MCP 服务器。如果该名称同时匹配 `.mcp.json` 或 `~/.claude.json` 等设置文件中的条目,Claude Code 会重新连接您通过 [`mcpServers`](#options) 或 `setMcpServers()` 配置的服务器,而不是设置文件中的条目。该解析顺序需要 Claude Code v2.1.257 或更高版本 |677| `reconnectMcpServer(serverName)` | 按名称重新连接 MCP 服务器。如果该名称同时匹配 `.mcp.json` 或 `~/.claude.json` 等设置文件中的条目,Claude Code 会重新连接您通过 [`mcpServers`](#options) 或 `setMcpServers()` 配置的服务器,而不是设置文件中的条目。该解析顺序需要 Claude Code v2.1.257 或更高版本 |

670| `toggleMcpServer(serverName, enabled)` | 按名称启用或禁用 MCP 服务器,名称解析方式与 `reconnectMcpServer()` 相同。禁用服务器会断开其连接并移除其工具。有关每种服务器所需的 Claude Code 版本,请参阅 [`toggleMcpServer()`](#togglemcpserver) |678| `toggleMcpServer(serverName, enabled)` | 按名称启用或禁用 MCP 服务器,名称解析方式与 `reconnectMcpServer()` 相同。禁用服务器会断开其连接并移除其工具。有关每种服务器所需的 Claude Code 版本,请参阅 [`toggleMcpServer()`](#togglemcpserver) |

671| `setMcpServers(servers)` | 替换此方法管理的 MCP 服务器:通过此方法添加的服务器以及[进程内 SDK 服务器](#createsdkmcpserver)。以 [`McpSetServersResult`](#mcpsetserversresult) 完成,其中指明添加和移除了哪些服务器以及任何错误;该部分说明了哪些其他服务器会保持连接 |679| `setMcpServers(servers)` | 替换此方法管理的 MCP 服务器:通过此方法添加的服务器以及[进程内 SDK 服务器](#createsdkmcpserver)。以 [`McpSetServersResult`](#mcpsetserversresult) 完成,其中指明添加和移除了哪些服务器以及任何错误;该部分说明了哪些其他服务器会保持连接 |

680| `setMcpPermissionModeOverride(serverName, mode)` | 用比会话更严格的模式覆盖某个 MCP 服务器工具的权限模式,或使用 `null` 清除覆盖。仅在流式输入模式下可用。请参阅 [`setMcpPermissionModeOverride()`](#setmcppermissionmodeoverride)。需要 TypeScript SDK v0.3.187 或更高版本 |

672| `readMcpResource(serverName, uri)` | *Alpha。* 从已连接的 MCP 服务器读取一个 MCP Apps `ui://` 资源,以便您的应用渲染工具的小组件。以 [`SDKControlMcpReadResourceResponse`](#sdkcontrolmcpreadresourceresponse) 完成。需要 TypeScript Agent SDK v0.3.280 或更高版本 |681| `readMcpResource(serverName, uri)` | *Alpha。* 从已连接的 MCP 服务器读取一个 MCP Apps `ui://` 资源,以便您的应用渲染工具的小组件。以 [`SDKControlMcpReadResourceResponse`](#sdkcontrolmcpreadresourceresponse) 完成。需要 TypeScript Agent SDK v0.3.280 或更高版本 |

673| `streamInput(stream)` | 向查询流式传输输入消息,用于多轮对话 |682| `streamInput(stream)` | 向查询流式传输输入消息,用于多轮对话 |

674| `stopTask(taskId)` | 按 ID 停止正在运行的后台任务 |683| `stopTask(taskId)` | 按 ID 停止正在运行的后台任务 |

684| `backgroundTasks(toolUseId?)` | 将当前轮次正在等待的运行中 Bash 命令和子代理移到后台,效果与在交互式终端中按 Ctrl+B 相同。请参阅 [`backgroundTasks()`](#backgroundtasks)。需要 TypeScript SDK v0.2.139 或更高版本 |

675| `close()` | 关闭查询并终止底层进程。强制结束查询并清理所有资源 |685| `close()` | 关闭查询并终止底层进程。强制结束查询并清理所有资源 |

676 686 

687#### `setMcpPermissionModeOverride()`

688 

689用比会话更严格的模式覆盖某个 MCP 服务器工具的权限模式,或使用 `null` 清除覆盖。当会话运行在跳过逐项操作提示的模式下,但某个服务器的工具仍应经过审查时,请使用它。需要 TypeScript SDK v0.3.187 或更高版本。

690 

691将以下三个值之一作为 `mode` 传递:

692 

693* `'default'`:Claude Code 以 [Manual 模式](https://code.claude.com/docs/zh-CN/permission-modes.md#available-modes)的方式评估该服务器的工具调用。

694* `'auto'`:Claude Code 将该服务器的工具调用交由[自动模式](https://code.claude.com/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)分类器处理。当该分类器对会话不可用时,Claude Code 会拒绝此值。

695* `null`:清除覆盖。

696 

697覆盖仅在会话处于跳过逐项操作提示的模式(`bypassPermissions` 或 `auto`)时生效。在任何其他会话模式下,Claude Code 会忽略该覆盖,因此它永远不会放宽会话允许的范围。

698 

699当尚不知道有该名称的服务器时,promise 会以 `{ warning }` 解析。Claude Code 仍会存储该覆盖,并在具有该确切名称的服务器连接后应用它,因此该警告只是拼写检查,而不是失败。

700 

701仅在流式输入模式下可用,与 `setModel()` 和 `setPermissionMode()` 的限制相同。

702 

703#### `seedReadState()`

704 

705将文件标记为已读取,使之后的 Edit 不会因 `File has not been read yet` 而失败。当您的应用已从对话上下文中丢弃了先前的 `Read` 结果,而 Claude 接下来要编辑该文件时,请使用它。需要 TypeScript SDK v0.2.83 或更高版本。

706 

707将 `mtime` 传递为先前那次读取时文件的修改时间,以自纪元起的整毫秒数表示,例如 `Math.floor(stat.mtimeMs)`。如果磁盘上的文件在该时间之后发生了变化,Claude Code 会跳过标记。

708 

709无论文件是否被标记,promise 都会解析,因此 promise 解析并不能告诉您实际发生了哪种情况。

710 

711#### `backgroundTasks()`

712 

713将当前轮次正在等待的运行中 Bash 命令和子代理移到后台,效果与在交互式终端中按 Ctrl+B 相同。传递某个工具调用的 `toolUseId` 可仅将该调用启动的 Bash 命令或子代理移到后台,省略它则将所有前台任务移到后台。需要 TypeScript SDK v0.2.139 或更高版本。

714 

715每个被移到后台的工具调用会立即向 Claude 返回一个"正在后台运行"的结果,当前轮次继续进行,并且在任务完成时 Claude Code 会发出一个 [`SDKTaskNotificationMessage`](#sdktasknotificationmessage)。

716 

717在启用了后台任务的会话中,promise 会解析为一个布尔值:

718 

719* **`true`**:有任务被移到后台,或者您省略了 `toolUseId`。

720* **`false`**:您传递的 `toolUseId` 未匹配任何前台任务。

721 

722如果会话禁用了后台任务(例如通过 [`CLAUDE_CODE_DISABLE_BACKGROUND_TASKS`](https://code.claude.com/docs/zh-CN/env-vars)),promise 会被拒绝,并且不会有任何任务被移到后台。

723 

677#### `applyFlagSettings()`724#### `applyFlagSettings()`

678 725 

679在不重启查询的情况下更改正在运行的会话的[设置](https://code.claude.com/docs/zh-CN/settings.md)。当某个没有专用设置方法的设置需要在会话中途更改时使用它,例如在 Agent 读取不受信任的输入后收紧 `permissions`。`setModel()` 和 `setPermissionMode()` 是针对这两个键的专用设置方法;`applyFlagSettings()` 是通用形式,接受设置键的任意子集,在此处传递 `model` 的行为与 `setModel()` 相同。726在不重启查询的情况下更改正在运行的会话的[设置](https://code.claude.com/docs/zh-CN/settings.md)。当某个没有专用设置方法的设置需要在会话中途更改时使用它,例如在 Agent 读取不受信任的输入后收紧 `permissions`。`setModel()` 和 `setPermissionMode()` 是针对这两个键的专用设置方法;`applyFlagSettings()` 是通用形式,接受设置键的任意子集,在此处传递 `model` 的行为与 `setModel()` 相同。


1472 | SDKPermissionDeniedMessage1519 | SDKPermissionDeniedMessage

1473 | SDKPromptSuggestionMessage1520 | SDKPromptSuggestionMessage

1474 | SDKAPIRetryMessage1521 | SDKAPIRetryMessage

1522 | SDKControlRequestProgressMessage

1523 | SDKModelRefusalFallbackMessage

1524 | SDKModelRefusalNoFallbackMessage

1475 | SDKMirrorErrorMessage1525 | SDKMirrorErrorMessage

1476 | SDKInformationalMessage1526 | SDKInformationalMessage

1477 | SDKConversationResetMessage;1527 | SDKConversationResetMessage;

1478```1528```

1479 1529 

1530此联合类型中有三种消息用于报告控制请求进度和模型拒绝。它们都带有 `type: "system"`,因此请根据各自列出的 `subtype` 加以区分:

1531 

1532* `SDKControlRequestProgressMessage`,`subtype: "control_request_progress"`:报告客户端发送的长时间运行的控制请求的进度。`request_id` 将该消息与对应请求关联,`status` 为 `"started"` 或 `"api_retry"`。需要 Agent SDK v0.3.203 或更高版本。

1533* `SDKModelRefusalFallbackMessage`,`subtype: "model_refusal_fallback"`:当模型以拒绝结束流式输出,且该轮次在备用模型上重试时发出。携带 `original_model` 和 `fallback_model`。需要 Agent SDK v0.3.170 或更高版本。

1534* `SDKModelRefusalNoFallbackMessage`,`subtype: "model_refusal_no_fallback"`:当模型以拒绝结束流式输出且未进行重试时发出,例如因为未配置备用模型。携带 `original_model`。需要 Agent SDK v0.3.193 或更高版本。

1535 

1480### `SDKAssistantMessage`1536### `SDKAssistantMessage`

1481 1537 

1482助手响应消息。1538助手响应消息。


1636 stop_reason: string | null;1692 stop_reason: string | null;

1637 ttft_ms?: number;1693 ttft_ms?: number;

1638 ttft_stream_ms?: number;1694 ttft_stream_ms?: number;

1695 time_to_request_ms?: number;

1639 user_message_uuid?: string;1696 user_message_uuid?: string;

1640 user_message_uuids?: string[];1697 user_message_uuids?: string[];

1641 resume_reason?: string;1698 resume_reason?: string;


1701* `api_error_status`:终止对话的 API 错误的 HTTP 状态码。当轮在没有 API 错误的情况下结束时不存在或为 `null`。1758* `api_error_status`:终止对话的 API 错误的 HTTP 状态码。当轮在没有 API 错误的情况下结束时不存在或为 `null`。

1702* `ttft_ms`:首个 token 的时间(毫秒),在第一条完整助手消息到达时测量。仅在成功分支上存在。1759* `ttft_ms`:首个 token 的时间(毫秒),在第一条完整助手消息到达时测量。仅在成功分支上存在。

1703* `ttft_stream_ms`:直到第一个 `message_start` 流事件(响应流打开时)的时间(毫秒)。低于 `ttft_ms`;两者之间的差距是流式传输第一条消息所花费的时间。仅在成功分支上存在。1760* `ttft_stream_ms`:直到第一个 `message_start` 流事件(响应流打开时)的时间(毫秒)。低于 `ttft_ms`;两者之间的差距是流式传输第一条消息所花费的时间。仅在成功分支上存在。

1761* `time_to_request_ms`:从轮次开始到 Claude Code 发送 API 请求的时间(毫秒)。仅在成功分支上存在。需要 Claude Code v2.1.162 或更高版本。

1704* `user_message_uuid`:您发送的消息的 `uuid`,该轮回答了该消息。请参阅 [`user_message_uuid`](#user_message_uuid) 了解哪些结果携带它。1762* `user_message_uuid`:您发送的消息的 `uuid`,该轮回答了该消息。请参阅 [`user_message_uuid`](#user_message_uuid) 了解哪些结果携带它。

1705* `user_message_uuids`:您发送的每条消息的 `uuid`,Claude Code 在该轮中回答了这些消息。请参阅 [`user_message_uuids`](#user_message_uuids)。1763* `user_message_uuids`:您发送的每条消息的 `uuid`,Claude Code 在该轮中回答了这些消息。请参阅 [`user_message_uuids`](#user_message_uuids)。

1706* `resume_reason`:本轮次为何是继续一个被重启中断的轮次。在两个分支上都存在。请参阅 [`resume_reason`](#resume_reason)。1764* `resume_reason`:本轮次为何是继续一个被重启中断的轮次。在两个分支上都存在。请参阅 [`resume_reason`](#resume_reason)。


1772* 不回答您任何消息的轮,或回答您发送的没有 `uuid` 的消息的轮1830* 不回答您任何消息的轮,或回答您发送的没有 `uuid` 的消息的轮

1773* 不回答您发送的任何消息的结果,例如崩溃的工作进程后的零化结果1831* 不回答您发送的任何消息的结果,例如崩溃的工作进程后的零化结果

1774 1832 

1833当 [`UserPromptSubmit`](https://code.claude.com/docs/zh-CN/hooks#userpromptsubmit) hook 阻止了一条开启自身轮次的消息,或以 `continue: false` 停止它时,您仍会收到该消息的结果。它是 `is_error: false` 且 `num_turns: 0` 的成功结果,其 `result` 为[阻止消息](https://code.claude.com/docs/zh-CN/hooks.md#what-a-blocked-prompt-leaves-behind)或[停止消息](https://code.claude.com/docs/zh-CN/hooks.md#json-output),并按照与其他结果相同的规则回显该消息的 `uuid`。该结果没有 `terminal_reason`,除 `result` 文本外,结果上没有任何内容表明是 hook 结束了该轮次。在另一个轮次运行期间被 hook 阻止的消息可能不会得到结果:请参阅 [`user_message_uuids`](#user_message_uuids)。

1834 

1775#### `user_message_uuids`1835#### `user_message_uuids`

1776 1836 

1777Claude Code 在该轮中回答的您发送的每条消息的 `uuid`。当您一起发送多条消息时,Claude Code 可以将它们合并为一轮,`user_message_uuid` 然后仅命名其中的最后一个。要将回复与任何合并的消息匹配,在此列表中的任何位置查找该消息的 `uuid`。需要 Agent SDK v0.3.259 或更高版本。1837Claude Code 在该轮中回答的您发送的每条消息的 `uuid`。当您一起发送多条消息时,Claude Code 可以将它们合并为一轮,`user_message_uuid` 然后仅命名其中的最后一个。要将回复与任何合并的消息匹配,在此列表中的任何位置查找该消息的 `uuid`。需要 Agent SDK v0.3.259 或更高版本。

1778 1838 

1779Claude Code 在携带 `user_message_uuid` 的每个回复帧和结果上,与该字段一起设置此列表。有关回显所回答消息 `uuid` 的完整轮帧集合以及每种帧所需的版本,请参阅 [`user_message_uuid`](#user_message_uuid)。列表始终包含 `user_message_uuid` 并最多包含 64 个条目。1839Claude Code 在携带 `user_message_uuid` 的每个回复帧和结果上,与该字段一起设置此列表。有关回显所回答消息 `uuid` 的完整轮帧集合以及每种帧所需的版本,请参阅 [`user_message_uuid`](#user_message_uuid)。列表始终包含 `user_message_uuid` 并最多包含 64 个条目。

1780 1840 

1781当 Claude Code 在轮运行时拾取您发送的常规消息时,它将该消息的 `uuid` 添加到结果的列表中。1841当 Claude Code 接收您在轮次运行期间发送的常规消息时,会将该消息的 `uuid` 添加到结果的列表中。当 [`UserPromptSubmit`](https://code.claude.com/docs/zh-CN/hooks#userpromptsubmit) hook 在接收时阻止了该消息,Claude Code 会改为丢弃它:该消息永远不会到达 Claude,也不会为后续轮次保留。您不会收到它的结果,它的 `uuid` 也不会出现在任何结果的列表中。如果 hook 可能阻止消息,请为等待列出您在轮次运行期间所发送消息的结果设置超时。

1842 

1843以上情况适用于 hook 的输出仅为阻止时。如果输出设置了 `continue: false`(即使同时带有 `decision: "block"`),或者该 hook 是一个回答 [`ok: false`](https://code.claude.com/docs/zh-CN/hooks#response-schema) 且未设置 `continueOnBlock: true` 的提示词 hook,Claude Code 会停止该消息而不是丢弃它。该消息会等待自己的轮次,您会收到它的结果,其文本保留在对话中,因此 Claude 会在下一轮次看到它。

1782 1844 

1783当第一个回复或结果携带 `user_message_uuid` 而没有列表时,它来自早期的 Claude Code 版本,因此回退到单个字段。1845当第一个回复或结果携带 `user_message_uuid` 而没有列表时,它来自早期的 Claude Code 版本,因此回退到单个字段。

1784 1846 

Details

581}581}

582```582```

583 583 

584不完全匹配预期格式的远程回复以两种方式之一失败,在两种情况下对话都保持打开:584如果远程回复没有任何效果,且本地终端对话保持打开,请检查以下原因:

585 585 

586* **不同格式**:您的入站处理程序的正则表达式无法匹配,因此 `approve it` 或 `yes` 之类的文本(没有 ID)会作为正常消息落入 Claude。586* **格式错误**:您的入站处理程序的正则表达式无法匹配,因此 `approve it` 或 `yes` 之类的文本(没有 ID)会作为正常消息落入 Claude。

587* **正确格式,错误的 ID**:您的服务器发出判决,但 Claude Code 找不到具有该 ID 的开放请求并静默删除它。587* **ID 错误**:您的服务器发出判决,但 Claude Code 找不到具有该 ID 的开放请求并静默删除它。

588* **该 ID 已被较早的提示使用**:您的服务器使用请求中的 ID 发出判决,但会话中较早的提示具有相同的 ID。一旦 ID 重复,Claude Code 会删除携带该 ID 的任何频道判决,以便针对一个提示的回复无法批准另一个提示。ID 是五个随机字母,因此重复很少见。请改为在终端中回答。

588 589 

589### 完整示例590### 完整示例

590 591 

Details

90 90 

91### 中途发送的消息未检查点91### 中途发送的消息未检查点

92 92 

93在回溯菜单中,您[在 Claude 仍在工作时输入的](https://code.claude.com/docs/zh-CN/interactive-mode.md#queue-messages-while-claude-works)消息可能会被标记为 **No code restore**。Claude 在其轮次结束之前读取了该消息。[检查点是为启动轮次的提示词创建的](#how-checkpoints-work),因此该消息没有属于自己的检查点。Claude 在读取该消息之后所做的编辑会计入启动该轮次的提示词。93在回溯菜单中,您[在 Claude 仍在工作时输入的](https://code.claude.com/docs/zh-CN/interactive-mode.md#queue-messages-while-claude-works)消息可能会被标记为 **No code restore**。被标记的消息没有属于自己的[检查点](#how-checkpoints-work)。

94 94 

95您无需对该消息本身做任何处理。要撤销会话中那部分的文件更改,请选择启动该轮次的提示词,然后选择 **Restore code** 或 **Restore code and conversation**。这会还原 Claude 在整个轮次中所做的文件编辑,包括您的消息到达之前所做的编辑。选择被标记的消息时仍会提供 **Restore conversation**,它会将对话回溯到该消息,并保持您的文件不变。95要撤销 Claude 在该消息之后所做的文件编辑,请选择启动该轮次的提示词,然后选择 **Restore code** 或 **Restore code and conversation**。这会还原 Claude 在整个轮次中所做的文件编辑,包括您的消息到达之前所做的编辑。

96 96 

97### 符号链接和硬链接路径未恢复97### 符号链接和硬链接路径未恢复

98 98 

Details

98 98 

99警告和百分比来自 `anthropic-ratelimit-unified-*` 标头,网关会将这些标头添加到具有上限的开发者的每个成功 `/v1/messages` 响应中。标头始终描述开发者自己的上限:网关会剥离上游提供商的速率限制标头(这些标头描述您的共享配额),从不转发它们。99警告和百分比来自 `anthropic-ratelimit-unified-*` 标头,网关会将这些标头添加到具有上限的开发者的每个成功 `/v1/messages` 响应中。标头始终描述开发者自己的上限:网关会剥离上游提供商的速率限制标头(这些标头描述您的共享配额),从不转发它们。

100 100 

101开发者看到的支出是网关自身的[估计值](#how-requests-are-priced),即网关用于执行上限的同一数值,而不是来自您的提供商账单的金额。Claude Code 通过向网关发送单独的请求来读取美元金额。如果您按照 [Compliance posture](https://code.claude.com/docs/zh-CN/claude-apps-gateway-deploy.md#compliance-posture) 的建议在开发者的机器上设置了 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`,Claude Code 会跳过该请求。设置了该变量时,或者网关服务器版本早于 v2.1.284 时,该栏和状态栏仅显示百分比。101开发者看到的支出是网关自身的[估计值](#how-requests-are-priced),即网关用于执行上限的同一数值,而不是来自您的提供商账单的金额。Claude Code 通过向网关发送单独的请求来读取美元金额,即使您在开发者的机器上设置了 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`,它也会发送该请求。在 v2.1.295 之前,设置了该变量时 Claude Code 会跳过该请求,`/usage` 和状态栏仅显示百分比和重置日期,不显示美元金额。

102 102 

103## Admin API 参考103## Admin API 参考

104 104 

Details

18 18 

19* **浏览器**:[claude.ai/code](https://claude.ai/code),也称为网络上的 Claude Code19* **浏览器**:[claude.ai/code](https://claude.ai/code),也称为网络上的 Claude Code

20* **移动设备**:[Claude 应用](https://code.claude.com/docs/zh-CN/mobile.md)中的 **Code** 标签页20* **移动设备**:[Claude 应用](https://code.claude.com/docs/zh-CN/mobile.md)中的 **Code** 标签页

21* **桌面应用**:当你[启动会话](https://code.claude.com/docs/zh-CN/desktop.md#run-long-running-tasks-in-the-cloud)时,选择 **Cloud** 而不是 **Local**21* **桌面应用**:在[启动会话](https://code.claude.com/docs/zh-CN/desktop.md#run-long-running-tasks-in-the-cloud)时,在环境选择器中选择 **Cloud** 下的某个环境

22* **终端**:[`claude --cloud`](#from-terminal-to-cloud)22* **终端**:[`claude --cloud`](#from-terminal-to-cloud)

23* **云端定时任务**:[定时运行和触发运行](https://code.claude.com/docs/zh-CN/routines.md)每次都作为云端会话运行23* **云端定时任务**:[定时运行和触发运行](https://code.claude.com/docs/zh-CN/routines.md)每次都作为云端会话运行

24 24 


247 247 

248### 审查更改248### 审查更改

249 249 

250每个会话都会显示一个 diff 指示器,标示添加和删除的行数,例如 `+42 -18`。选择它即可打开 diff 视图,在特定行上添加内联评论,并随下一条消息将这些评论发送给 Claude。250Claude 将其更改推送到分支后,聊天旁面板中的 **Changes** 卡片会显示添加和删除的行数,例如 `+42 -18`。点击 **Changes** 卡片上的行数即可打开 diff 视图。

251 251 

252diff 视图默认将会话的更改与其基础分支进行比较。要与仓库中的任何其他分支进行比较,请选择 **Compare against** 并选择一个分支。252* 您也可以点击会话标题栏中的 **Changes**,或标题栏 **⋮** 菜单中的该选项。

253* 面板隐藏时,要显示面板,请点击会话标题栏中的 **Show session rail** 图标,或标题栏 **⋮** 菜单中的该选项。

254 

255在 diff 视图中,您可以对行添加评论,并与其他分支进行比较:

256 

257* **评论**:在特定行上留下内联评论,然后随下一条消息将这些评论发送给 Claude

258* **比较**:diff 视图默认将会话的更改与其基础分支进行比较。要与仓库中的任何其他分支进行比较,请选择 **Compare against** 并选择一个分支

253 259 

254Claude Code 根据原始 git blob 内容计算这些 diff,因此仓库中配置的 diff 驱动程序和 `textconv` 过滤器不适用。260Claude Code 根据原始 git blob 内容计算这些 diff,因此仓库中配置的 diff 驱动程序和 `textconv` 过滤器不适用。

255 261 


313 319 

314### 归档会话320### 归档会话

315 321 

316你可以归档会话以保持你的会话列表有序。归档的会话从默认会话列表中隐藏,但可以通过筛选已归档会话来查看。322归档会话可将其从侧边栏的会话列表中移除。要归档会话,请在侧边栏中将鼠标悬停在该会话上,打开其 **⋯** 菜单,然后选择 **Archive**。

317 323 

318要归档会话,请在侧边栏中悬停在会话上并选择归档图标。324#### 查找已归档的会话

325 

326要查看已归档的会话,请前往 [claude.ai/code/sessions](https://claude.ai/code/sessions) 并打开 **Archived** 标签页。要将某个会话放回侧边栏的会话列表,请在该标签页上将鼠标悬停在该会话上,打开其 **⋮** 菜单,然后选择 **Unarchive**。

319 327 

320### 删除会话328### 删除会话

321 329 

322删除会话会永久删除会话及其数据。此操作无法撤销。你可以通过两种方式删除会话:330删除会话会永久删除会话及其数据。此操作无法撤销。您可以从侧边栏、会话菜单删除会话;如果会话已归档,也可以从 **Archived** 标签页删除:

323 331 

324* **从侧边栏**:筛选已归档会话,然后悬停在你想删除的会话上并选择删除图标332* **从侧边栏**:将鼠标悬停在会话上,打开其 **⋯** 菜单,然后选择 **Delete**

325* **从会话菜单**:打开会话,选择会话标题旁的下拉菜单,然后选择**删除**333* **从会话菜单**:打开会话,选择会话标题旁的下拉菜单,然后选择**删除**

334* **从 Archived 标签页**:在 [**Archived** 标签页](#find-an-archived-session)上将鼠标悬停在会话上,打开其 **⋮** 菜单,然后选择 **Delete**

326 335 

327删除会话前会要求你确认。336删除会话前会要求你确认。

328 337 


336 345 

337根据 PR 来自何处以及你使用的设备,有几种方法可以打开自动修复:346根据 PR 来自何处以及你使用的设备,有几种方法可以打开自动修复:

338 347 

339* **在云会话中创建的 PR**:打开 claude.ai/code 处的会话,打开 CI 状态栏,并选择**自动修复**348* **在云端会话中创建的 PR**:打开 claude.ai/code 处的会话,在 [**Changes** 卡片](#review-changes)中找到该拉取请求。打开拉取请求标题旁边的 **⋮** 菜单并启用 **Auto-fix**

340* **从终端**:在 PR 的分支上运行 [`/autofix-pr`](https://code.claude.com/docs/zh-CN/commands)。Claude Code 使用 `gh` 检测打开的 PR,生成云会话,并一步启用自动修复349* **从终端**:在 PR 的分支上运行 [`/autofix-pr`](https://code.claude.com/docs/zh-CN/commands)。Claude Code 使用 `gh` 检测打开的 PR,生成云会话,并一步启用自动修复

341* **从移动应用**:告诉 Claude 自动修复 PR,例如"watch this PR and fix any CI failures or review comments"350* **从移动应用**:告诉 Claude 自动修复 PR,例如"watch this PR and fix any CI failures or review comments"

342* **任何现有 PR**:将 PR URL 粘贴到会话中并告诉 Claude 自动修复它351* **任何现有 PR**:将 PR URL 粘贴到会话中并告诉 Claude 自动修复它

343 352 

344自动修复是按 PR 的切换开关。要停止监视,请在 claude.ai/code 处的会话中打开 CI 状态栏并清除**自动修复**切换,或告诉 Claude 停止监视 PR。353要停止监视,请在会话的 [**Changes** 卡片](#review-changes)中,通过拉取请求的 **⋮** 菜单关闭 **Auto-fix**,或告诉 Claude 停止监视该 PR。

345 354 

346### Claude 如何响应 PR 活动355### Claude 如何响应 PR 活动

347 356 


381* 一分钟后重试,因为容量是按需配置的390* 一分钟后重试,因为容量是按需配置的

382* 通过遵循[连接 GitHub 后没有存储库出现](https://code.claude.com/docs/zh-CN/web-quickstart.md#no-repositories-appear-after-connecting-github)来确认你的 GitHub 连接可以访问存储库391* 通过遵循[连接 GitHub 后没有存储库出现](https://code.claude.com/docs/zh-CN/web-quickstart.md#no-repositories-appear-after-connecting-github)来确认你的 GitHub 连接可以访问存储库

383 392 

393### Your new session couldn't start

394 

395您的提示词已返回到您发送它时所用的输入框中。

396 

397* **连接中断**:请检查您的网络连接以及您使用的任何 VPN 或代理,然后重新发送您的提示词

398* **服务器错误**:请稍等片刻,然后重新发送您的提示词。如果该通知再次出现,请检查 [status.claude.com](https://status.claude.com)

399 

400### Can't rewind to this message

401 

402当您的会话在 Claude Code 版本早于 v2.1.246 的[自托管运行器](https://code.claude.com/docs/zh-CN/self-hosted-environments)上运行时,对除最新消息之外的任何消息执行 **Rewind to here** 都会因此错误而失败。请让负责运行您组织运行器的人员[升级它们](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#pin-the-version)。

403 

384### 无法获取组织 UUID404### 无法获取组织 UUID

385 405 

386`claude --cloud` 和 `claude --teleport` 需要使用 claude.ai 账户登录。如果您使用 API 密钥进行身份验证,或者存储的账户详情已过期,您会看到以下情况之一:406`claude --cloud` 和 `claude --teleport` 需要使用 claude.ai 账户登录。如果您使用 API 密钥进行身份验证,或者存储的账户详情已过期,您会看到以下情况之一:

Details

111 111 

112项目现在在侧边栏的 **Projects** 下列出,其对话已打开。[您的第一批](#your-first-batch)涵盖了在您向其发送工作之前要设置的内容。112项目现在在侧边栏的 **Projects** 下列出,其对话已打开。[您的第一批](#your-first-batch)涵盖了在您向其发送工作之前要设置的内容。

113 113 

114### 从现有云会话启动114### 从现有会话启动

115 115 

116如果您自己启动的某个云端会话正在进行属于项目的工作,请打开其侧边栏菜单并选择 **Move to project**,然后从子菜单中选择:116如果您自己启动的某个云端会话正在进行属于项目的工作,请打开其侧边栏菜单并选择 **Move to project**,然后从子菜单中选择:

117 117 


120 120 

121云端会话的消息框上方也可能出现 **Set up project** 横幅。如果您使用它而不是 **Continue as new project**,结果是相同的,只是会话正在运行的轮次会在项目打开后停止。121云端会话的消息框上方也可能出现 **Set up project** 横幅。如果您使用它而不是 **Continue as new project**,结果是相同的,只是会话正在运行的轮次会在项目打开后停止。

122 122 

123本地会话没有这些选项。要在项目中继续其工作,请在项目对话中描述工作,或推送其分支,将该代码库添加到项目,并在任务中命名分支。123您自己机器上的会话通过 [Remote Control](https://code.claude.com/docs/zh-CN/remote-control.md#start-a-remote-control-session) 连接后,在 claude.ai/code 也会获得相同的侧边栏菜单。如果某个会话是在您的账户开启了 [**Require trusted devices**](https://code.claude.com/docs/zh-CN/remote-control.md#trusted-devices) 时连接的,Claude 无法从项目中读取该会话的会话记录。如果该设置处于关闭状态:

124 

1251. 如果会话尚未连接,请在其中运行 `/remote-control`。如果它是在该设置开启时连接的,请先断开连接,然后重新连接。

1262. 在浏览器中,在 [claude.ai/code](https://claude.ai/code) 的侧边栏中找到该会话所在的行,打开其菜单,然后从同一子菜单中选择。

127 

128如果 **Require trusted devices** 已开启,或者您不使用 Remote Control,请自己在项目对话中描述工作。或者推送该会话的分支,将其仓库添加到项目,并告诉 Claude 分支名称。

124 129 

125### 设置 GitHub 访问130### 设置 GitHub 访问

126 131 


425* **云端会话**:每个线程都是一个[云端会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md),除非您要求 Claude 在您的机器上运行它。无论哪种方式,Claude 启动和跟踪它而不是您。您还可以将自己启动的云端会话的工作带入项目:在该会话的侧边栏菜单中选择 [**Move to project**](#start-from-an-existing-cloud-session)。430* **云端会话**:每个线程都是一个[云端会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md),除非您要求 Claude 在您的机器上运行它。无论哪种方式,Claude 启动和跟踪它而不是您。您还可以将自己启动的云端会话的工作带入项目:在该会话的侧边栏菜单中选择 [**Move to project**](#start-from-an-existing-cloud-session)。

426* **定时任务**:当您在项目中请求定时工作时,Claude 会创建一个[云端定时任务](https://code.claude.com/docs/zh-CN/routines.md),它作为该项目中的线程运行,并显示在项目的 **Scheduled tasks** 标签页上。您在项目之外创建的定时任务会继续独立运行。431* **定时任务**:当您在项目中请求定时工作时,Claude 会创建一个[云端定时任务](https://code.claude.com/docs/zh-CN/routines.md),它作为该项目中的线程运行,并显示在项目的 **Scheduled tasks** 标签页上。您在项目之外创建的定时任务会继续独立运行。

427* **Remote Control**:[Remote Control](https://code.claude.com/docs/zh-CN/remote-control.md) 连接 claude.ai 到在您的机器上运行的 Claude Code 会话。当您在项目中要求 Claude 在您的计算机上运行线程时,项目[使用 Remote Control 来执行](#run-a-thread-on-your-own-computer)。432* **Remote Control**:[Remote Control](https://code.claude.com/docs/zh-CN/remote-control.md) 连接 claude.ai 到在您的机器上运行的 Claude Code 会话。当您在项目中要求 Claude 在您的计算机上运行线程时,项目[使用 Remote Control 来执行](#run-a-thread-on-your-own-computer)。

428* **本地会话和代理视图**:您在终端、IDE 或桌面应用的本地环境中启动的会话不能添加到项目中。[代理视图](https://code.claude.com/docs/zh-CN/agent-view.md)是用于跟踪多个本地会话并排的屏幕,您仍然启动每个会话并自己给它分配任务。433* **本地会话和 Agent 视图**:您自己在终端、IDE 或桌面应用的本地环境中启动的会话不属于您的项目,但您可以[将其工作带入某个项目](#start-from-an-existing-cloud-session)。[Agent 视图](https://code.claude.com/docs/zh-CN/agent-view.md)是用于并排跟踪多个本地会话的屏幕,您仍然需要自己启动每个会话并为其分配任务。

429* **Worktrees**:一个 [worktree](https://code.claude.com/docs/zh-CN/worktrees.md) 为每个本地会话提供其自己的仓库工作副本。云线程不需要它们:每个线程将其仓库克隆到其自己的云沙箱中,并在其自己的分支上工作。434* **Worktrees**:一个 [worktree](https://code.claude.com/docs/zh-CN/worktrees.md) 为每个本地会话提供其自己的仓库工作副本。云线程不需要它们:每个线程将其仓库克隆到其自己的云沙箱中,并在其自己的分支上工作。

430* **代理团队**:一个[代理团队](https://code.claude.com/docs/zh-CN/agent-teams.md)是一个会话,为单个任务启动队友会话,在您的机器上或在云会话内,并以该任务结束。435* **代理团队**:一个[代理团队](https://code.claude.com/docs/zh-CN/agent-teams.md)是一个会话,为单个任务启动队友会话,在您的机器上或在云会话内,并以该任务结束。

431* **Subagents**:一个[subagent](https://code.claude.com/docs/zh-CN/sub-agents.md)在一个会话内运行,在其自己的上下文窗口中执行一个辅助任务,并向该会话返回摘要。项目的线程是 Claude 启动的整个会话,向项目对话报告,一个线程仍然可以为其自己的辅助任务使用 subagents。436* **Subagents**:一个[subagent](https://code.claude.com/docs/zh-CN/sub-agents.md)在一个会话内运行,在其自己的上下文窗口中执行一个辅助任务,并向该会话返回摘要。项目的线程是 Claude 启动的整个会话,向项目对话报告,一个线程仍然可以为其自己的辅助任务使用 subagents。


437 442 

438* Projects 在 claude.ai/code、桌面应用和 Claude 移动应用中可用,不在终端 CLI、VS Code 扩展或 JetBrains 插件中,也不通过 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry。443* Projects 在 claude.ai/code、桌面应用和 Claude 移动应用中可用,不在终端 CLI、VS Code 扩展或 JetBrains 插件中,也不通过 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry。

439* 项目线程是[云会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md),或通过[远程控制](https://code.claude.com/docs/zh-CN/remote-control.md)在您自己的机器上的会话,两种情况下 Anthropic 都是模型提供者。[安全](https://code.claude.com/docs/zh-CN/security.md)和[数据使用](https://code.claude.com/docs/zh-CN/data-usage.md)涵盖了云会话如何隔离以及保留什么,[连接和安全](https://code.claude.com/docs/zh-CN/remote-control.md#connection-and-security)涵盖了您机器上的线程如何连接以及存储什么。444* 项目线程是[云会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md),或通过[远程控制](https://code.claude.com/docs/zh-CN/remote-control.md)在您自己的机器上的会话,两种情况下 Anthropic 都是模型提供者。[安全](https://code.claude.com/docs/zh-CN/security.md)和[数据使用](https://code.claude.com/docs/zh-CN/data-usage.md)涵盖了云会话如何隔离以及保留什么,[连接和安全](https://code.claude.com/docs/zh-CN/remote-control.md#connection-and-security)涵盖了您机器上的线程如何连接以及存储什么。

440* 您不能将自己在机器上启动的会话添加到项目中。项目仅通过[在您自己的计算机上通过远程控制运行线程](#run-a-thread-on-your-own-computer)到达您的机器,该部分列出了它需要什么。445* 您不能将自己在机器上启动的会话添加到项目中,但可以[将其工作带入项目](#start-from-an-existing-cloud-session)。项目通过[在您自己的计算机上通过 Remote Control 运行线程](#run-a-thread-on-your-own-computer)到达您的机器,该部分列出了它需要什么。

441* 云线程的沙箱在轮之间暂停,并在线程继续时恢复。如果沙箱无法恢复,线程从新克隆继续,因此未提交的更改可能会丢失。在长任务上,要求 Claude 提交和推送进行中的工作。446* 云线程的沙箱在轮之间暂停,并在线程继续时恢复。如果沙箱无法恢复,线程从新克隆继续,因此未提交的更改可能会丢失。在长任务上,要求 Claude 提交和推送进行中的工作。

442* 项目属于一个用户。您不能与另一个用户共享项目或其线程,线程记录没有其他云会话具有的共享选项。在测试版期间没有项目的组织级控制。447* 项目属于一个用户。您不能与另一个用户共享项目或其线程,线程记录没有其他云会话具有的共享选项。在测试版期间没有项目的组织级控制。

443* 线程属于启动它的一个项目。您不能将线程移动或复制到另一个项目,或将其移出以独立存在。[**Move to project**](#start-from-an-existing-cloud-session)仅以另一种方式进行:它将云会话的工作带入项目。您不能将两个项目合并为一个。448* 线程属于启动它的一个项目。您不能将线程移动或复制到另一个项目,或将其移出以独立存在。[**Move to project**](#start-from-an-existing-cloud-session)仅以另一种方式进行:它将云会话的工作带入项目。您不能将两个项目合并为一个。

code-review.md +1 −1

Details

67 67 

68* **发现**:相关代码行上的内联评论,并在审查正文中附带摘要68* **发现**:相关代码行上的内联评论,并在审查正文中附带摘要

69* **检查运行**:名为 **Claude Code Review**,其[详细信息](https://code.claude.com/docs/zh-CN/code-review-pull-requests.md#check-run-output)中列出了各项发现。检查运行不会以失败结束。69* **检查运行**:名为 **Claude Code Review**,其[详细信息](https://code.claude.com/docs/zh-CN/code-review-pull-requests.md#check-run-output)中列出了各项发现。检查运行不会以失败结束。

70* **未发现问题时**:检查运行的标题显示 **Code review found no issues**,Claude 也会在 Pull Request 上发布相同的简短说明70* **代替发现的说明**:当检查运行的标题显示 **Code review found no issues** 时发布

71 71 

72Code Review 会选择运行审查所用的 Claude 模型,其管理设置中不提供模型选择。要让审查更深入或更轻量,请更改[审查级别](#review-levels)。72Code Review 会选择运行审查所用的 Claude 模型,其管理设置中不提供模型选择。要让审查更深入或更轻量,请更改[审查级别](#review-levels)。

73 73 

Details

152 152 

153### 后续审查涵盖的内容153### 后续审查涵盖的内容

154 154 

155自行启动的后续审查(例如推送后)会侧重于自上次审查以来的更改,并发布较少的 nit 和已存在问题的发现。其摘要会统计被省略的内容,相应行以 "found and not posted" 或 "outside the scope of this re-review and not posted." 结尾。155自行启动的后续审查(例如推送后)会侧重于自上次审查以来的更改,并发布较少的 [nit 和已存在问题的发现](#severity-levels)。要了解它是否因此省略了某些发现,请在审查正文中查找统计这些发现的句子:

156 

157* **针对自上次审查以来未更改代码的发现**:该句以 "outside the scope of this re-review and not posted" 结尾

158* **nit 和已存在问题的发现**:该句以 "found and not posted" 结尾

156 159 

157要获得不省略任何这些内容的审查,请评论 [`@claude review`](#comment-commands)。它会再次涵盖整个 Pull Request。160要获得不省略任何这些内容的审查,请评论 [`@claude review`](#comment-commands)。它会再次涵盖整个 Pull Request。

158 161 

Details

15| 检查运行标题 | 含义 | 处理方法 |15| 检查运行标题 | 含义 | 处理方法 |

16| :- | :- | :- |16| :- | :- | :- |

17| **Code review queued...** 或 **Code review in progress...** | 审查尚未完成 | 等待标题变化 |17| **Code review queued...** 或 **Code review in progress...** | 审查尚未完成 | 等待标题变化 |

18| **Code review found no issues** | 审查已完成,未发现需要标记的问题 | 无需操作 |18| **Code review found no issues** | 审查已完成,未发布任何发现项 | 如果这不是该 Pull Request 的首次审查,请在审查正文中查看[审查未包含的发现项](https://code.claude.com/docs/zh-CN/code-review-pull-requests.md#what-a-later-review-covers)的数量。否则无需操作 |

19| 表示发现了问题的标题 | 审查已完成并有发现项 | 如果在 diff 上看不到这些发现项,请参阅[查找未显示为内联评论的问题](#find-issues-that-aren’t-showing-as-inline-comments) |19| 表示发现了问题的标题 | 审查已完成并有发现项 | 如果在 diff 上看不到这些发现项,请参阅[查找未显示为内联评论的问题](#find-issues-that-aren’t-showing-as-inline-comments) |

20| **Code review skipped — no new changes** | 自动审查未在您最新的推送上运行 | 如果仍想获得审查,请评论 `@claude review` |20| **Code review skipped — no new changes** | 自动审查未在您最新的推送上运行 | 如果仍想获得审查,请评论 `@claude review` |

21| **Code review not repeated — earlier findings still open** | 自动审查未在您最新的推送上运行,且之前审查中的 Important 发现项仍未解决 | 推送修复;如果仍想获得审查,请评论 `@claude review`。请参阅[推送保留之前结果的情况](https://code.claude.com/docs/zh-CN/code-review-pull-requests.md#when-a-push-keeps-the-earlier-result) |21| **Code review not repeated — earlier findings still open** | 自动审查未在您最新的推送上运行,且之前审查中的 Important 发现项仍未解决 | 推送修复;如果仍想获得审查,请评论 `@claude review`。请参阅[推送保留之前结果的情况](https://code.claude.com/docs/zh-CN/code-review-pull-requests.md#when-a-push-keeps-the-earlier-result) |

desktop.md +48 −17

Details

223 223 

224#### 隐藏或显示会话详细信息面板224#### 隐藏或显示会话详细信息面板

225 225 

226要隐藏或显示该面板,请点击会话标题栏中的 **Hide session rail** 或 **Show session rail**;窗口较窄时,则在标题栏的 **⋮** 菜单中点击。如果仍然看不到该面板,请[检查您使用的是哪种 Code 选项卡布局](#check-which-layout-you-have)。226要隐藏或显示该面板,请点击会话标题栏中或标题栏 **⋮** 菜单中的 **Hide session rail** 或 **Show session rail**。如果仍然看不到该面板,请[检查您使用的是哪种 Code 选项卡布局](#check-which-layout-you-have)。

227 227 

228### 在终端中运行命令228### 在终端中运行命令

229 229 


984 984 

985* **系统**:x86\_64 或 arm64 处理器。该计算机还必须满足 Claude Code 的[系统要求](https://code.claude.com/docs/zh-CN/setup.md#system-requirements)。在 Linux 上,Claude Code 需要 glibc 2.17 或更高版本,或 musl。若要查看该计算机使用的是哪一种,请在其上运行 `ldd --version`。在 Alpine Linux 等基于 musl 的发行版上,还需安装 [Claude Code 所需的软件包](https://code.claude.com/docs/zh-CN/setup.md#alpine-linux-and-musl-based-distributions)。985* **系统**:x86\_64 或 arm64 处理器。该计算机还必须满足 Claude Code 的[系统要求](https://code.claude.com/docs/zh-CN/setup.md#system-requirements)。在 Linux 上,Claude Code 需要 glibc 2.17 或更高版本,或 musl。若要查看该计算机使用的是哪一种,请在其上运行 `ldd --version`。在 Alpine Linux 等基于 musl 的发行版上,还需安装 [Claude Code 所需的软件包](https://code.claude.com/docs/zh-CN/setup.md#alpine-linux-and-musl-based-distributions)。

986* **SFTP**:SSH 服务器必须提供 SFTP 子系统,该子系统通过其 `sshd_config` 中的 `Subsystem sftp` 行启用。若要检查,请在您计算机上的终端中使用 `sftp` 连接到相同的主机和端口。正常工作的服务器会显示 `sftp>` 提示符。986* **SFTP**:SSH 服务器必须提供 SFTP 子系统,该子系统通过其 `sshd_config` 中的 `Subsystem sftp` 行启用。若要检查,请在您计算机上的终端中使用 `sftp` 连接到相同的主机和端口。正常工作的服务器会显示 `sftp>` 提示符。

987* **每个连接的会话数**:macOS 和 Linux 上的 Desktop 会在一个 SSH 连接上打开多个会话。如果服务器的 `sshd_config` 设置了 `MaxSessions 1`,请将其调高,例如调到 OpenSSH 的默认值 10。987* **服务器上的 `MaxSessions 1`**:要连接到其 `sshd_config` 设置了 `MaxSessions 1` 的服务器,请执行以下操作之一:

988 * **您的计算机运行 macOS 或 Linux**:更新到 Claude Desktop v3.1623.0 或更高版本

989 * **您的计算机运行 Windows**:确保 Desktop [通过 OpenSSH 客户端连接](#use-your-ssh-configuration),因为 Desktop 的内置 SSH 客户端无法连接到该服务器

990 * **您可以更改服务器**:调高 `MaxSessions`,例如调到 OpenSSH 的默认值 10

991* **使用 `MaxSessions 1` 时的登录**:使用无需提示即可完成的登录方式,例如由您的 SSH agent 持有的密钥。Desktop 每次连接或重新连接时至少登录两次。每个[终端](#run-commands-in-the-terminal)选项卡,以及您在其中运行以 `!` 开头的命令的每个 Desktop 会话,预计还需至少再登录一次。Claude 运行的命令则不需要额外登录。

992* **使用 `MaxSessions 1` 时的一次性验证码**:如果每次登录都会提示您(例如使用一次性验证码时),`!` 命令会失败。请改为在终端选项卡中运行这些命令,终端选项卡会在其自己的窗格中提示。

988* **安装文件夹**:Desktop 会在您主目录下的 `~/.claude/remote/` 中安装一个辅助程序和 Claude Code。它从该位置运行这些程序,因此该文件夹不能位于以 `noexec` 挂载的文件系统上。请在每个连接用户的主目录中预留约 1 GB 的磁盘空间。有关该文件夹包含的内容,请参阅[远程计算机上的文件和进程](#files-and-processes-on-the-remote-machine)。993* **安装文件夹**:Desktop 会在您主目录下的 `~/.claude/remote/` 中安装一个辅助程序和 Claude Code。它从该位置运行这些程序,因此该文件夹不能位于以 `noexec` 挂载的文件系统上。请在每个连接用户的主目录中预留约 1 GB 的磁盘空间。有关该文件夹包含的内容,请参阅[远程计算机上的文件和进程](#files-and-processes-on-the-remote-machine)。

989* **Shell**:远程计算机上为您的账户设置的 shell 必须能运行通过 SSH 发送的命令,Bash、Zsh 和 `sh` 均可994* **Shell**:远程计算机上为您的账户设置的 shell 必须能运行通过 SSH 发送的命令,Bash、Zsh 和 `sh` 均可

990* **网络**:Claude Code 在远程计算机上运行,并从那里发出网络请求,因此该计算机需要具备 [Claude Code 所需的网络访问](https://code.claude.com/docs/zh-CN/network-config.md#network-access-requirements)。如果该计算机无法下载 Claude Code,Desktop 会在您的计算机上下载并上传它。Claude Code 的其他请求仍从远程计算机发出。在 Linux 远程计算机上,如果这些请求需要代理,请[为 SSH 会话设置代理](#set-a-proxy-or-a-ca-certificate-for-ssh-sessions)。995* **网络**:Claude Code 在远程计算机上运行,并从那里发出网络请求,因此该计算机需要具备 [Claude Code 所需的网络访问](https://code.claude.com/docs/zh-CN/network-config.md#network-access-requirements)。如果该计算机无法下载 Claude Code,Desktop 会在您的计算机上下载并上传它。Claude Code 的其他请求仍从远程计算机发出。在 Linux 远程计算机上,如果这些请求需要代理,请[为 SSH 会话设置代理](#set-a-proxy-or-a-ca-certificate-for-ssh-sessions)。


993 998 

994如果 Linux 远程计算机通过代理访问互联网或需要 CA 证书,请在该计算机上的 `~/.claude/settings.json` 中的 `env` 下添加[代理和 CA 变量](https://code.claude.com/docs/zh-CN/network-config.md)。即使您已在该计算机上的 `~/.profile`、`~/.bash_profile`、`~/.zprofile` 或 `~/.zshrc` 中导出它们,也要添加。999如果 Linux 远程计算机通过代理访问互联网或需要 CA 证书,请在该计算机上的 `~/.claude/settings.json` 中的 `env` 下添加[代理和 CA 变量](https://code.claude.com/docs/zh-CN/network-config.md)。即使您已在该计算机上的 `~/.profile`、`~/.bash_profile`、`~/.zprofile` 或 `~/.zshrc` 中导出它们,也要添加。

995 1000 

996SSH 会话不会从这些文件中获取它们,即使在该计算机终端中运行的 `claude` 可以获取。此时会话可能会挂起,或显示 **The connection from … to the API failed** 或 **Authentication failed**,且重新登录也无济于事。1001在 SSH 会话中,Claude Code 不会从这些文件中获取变量,即使在该机器终端中运行的 `claude` 能获取到。此时会话可能会挂起,或显示 **The connection from … to the API failed** 或 **Authentication failed**,且重新登录也无济于事。

997 1002 

998**1. 添加变量**1003**1. 添加变量**

999 1004 


1028 1033 

1029重启远程计算机,或退出 Desktop 并结束辅助程序的进程,如[移除辅助程序](#files-and-processes-on-the-remote-machine)的前两个步骤所述。请在没有任务运行时执行此操作,因为任一方式都会中断 Claude 的工作。1034重启远程计算机,或退出 Desktop 并结束辅助程序的进程,如[移除辅助程序](#files-and-processes-on-the-remote-machine)的前两个步骤所述。请在没有任务运行时执行此操作,因为任一方式都会中断 Claude 的工作。

1030 1035 

1031#### 在 macOS 和 Linux 上使用您的 SSH 配置1036#### 使用您的 SSH 配置

1032 1037 

1033在 macOS 和 Linux 上,Desktop 通过在您的计算机上运行 OpenSSH 客户端进行连接,因此会使用您的 `~/.ssh/config`。通过 OpenSSH 客户端连接需要 Claude Desktop v1.37937.0 或更高版本。在 **SSH host** 字段中输入该文件中的 `Host` 名称,即可使用其条目中的设置,例如 `HostName`、`User`、`IdentityFile`、`CertificateFile`、`ProxyJump` 和 `ProxyCommand`。1038当 Desktop 通过您计算机上的 OpenSSH 客户端连接时,您可以在 macOS、Linux 和 Windows 上使用您的 SSH 配置:

1039 

1040* **macOS 和 Linux**:Desktop 通过运行您计算机上的 OpenSSH 客户端进行连接,因此会使用您的 `~/.ssh/config`。通过 OpenSSH 客户端连接需要 Claude Desktop v1.37937.0 或更高版本。

1041* **Windows**:当 Desktop 通过 OpenSSH 客户端连接时,它会使用您的 `%USERPROFILE%\.ssh\config`。如果您使用的是 Claude 账户而不是第三方提供商,则通过 OpenSSH 客户端连接需要满足以下所有条件:

1042 

1043 * Claude Desktop v2.2553.0 或更高版本。要查找您的版本,请参阅[检查您的版本](#check-your-version)。

1044 * Microsoft 的 OpenSSH 9.4 或更高版本

1045 * 使用本页顶部的下载按钮安装的 Desktop,因为来自 Microsoft Store 的 Desktop 不会通过 OpenSSH 客户端连接

1046 

1047 如果您无法满足这些要求,或者您使用的是第三方提供商,请参阅[在 Windows 上不使用 OpenSSH 客户端进行连接](#connect-on-windows-without-the-openssh-client)。

1048 

1049使用 OpenSSH 客户端时,请在 **SSH host** 字段中输入配置文件中的 `Host` 名称。随后 Desktop 会使用该 `Host` 条目中的设置,例如 `HostName`、`User`、`IdentityFile`、`CertificateFile`、`ProxyJump` 和 `ProxyCommand`。

1034 1050 

1035添加连接之前,请在您计算机上的终端中检查客户端和条目:1051添加连接之前,请在您计算机上的终端中检查客户端和条目:

1036 1052 

1037* **客户端版本**:运行 `ssh -V`。客户端必须是 OpenSSH 7.6 或更高版本。1053* **macOS 和 Linux 上的客户端版本**:运行 `ssh -V`。客户端必须是 OpenSSH 7.6 或更高版本。

1038* **条目**:使用 `Host` 名称运行 `ssh`,例如 `ssh devbox`。如果失败,请先修复该条目。1054* **Windows 上的客户端版本**:Desktop 会首先尝试 `PATH` 上的 `ssh`,因此请运行 `ssh -V`。如果输出显示 `OpenSSH_for_Windows_` 且版本为 9.4 或更高,则该客户端符合要求。如果不符合,请检查 Desktop 接下来会尝试的两个文件夹:先在 `C:\Windows\System32\OpenSSH` 中运行 `.\ssh.exe -V`,然后在 `C:\Program Files\OpenSSH` 中运行。

1055* **Windows 上没有符合要求的客户端**:在 Windows 中添加 **OpenSSH Client** 可选功能并安装待处理的 Windows 更新,或者安装 [Microsoft 的较新构建版本](https://learn.microsoft.com/en-us/troubleshoot/windows-server/system-management-components/upgrade-in-box-openssh-to-latest-openssh-release)。然后退出并重新打开 Desktop。要查看 Desktop 是否找到了可用的 OpenSSH 客户端,请在 [`ssh.log`](#get-desktops-logs-for-an-ssh-problem) 中查找 `Windows OpenSSH client:` 及版本号,或查找 `no usable Windows OpenSSH client`。

1056* **条目**:在 Windows 上,请使用通过了版本检查的客户端。使用 `Host` 名称运行 `ssh`,例如 `ssh devbox`。如果失败,请先修复该条目。

1039 1057 

1040您可以将 **SSH port** 和 **SSH key (optional)** 字段留空。如果填写其中之一,Desktop 会将其与条目一起使用:1058您可以将 **SSH port** 和 **SSH key (optional)** 字段留空。如果填写其中之一,Desktop 会将其与条目一起使用:

1041 1059 

1042* **SSH port**:此处的值会覆盖条目的 `Port`1060* **SSH port**:此处的值会覆盖条目的 `Port`

1043* **SSH key (optional)**:除条目的 `IdentityFile` 和您 SSH agent 中的密钥外,Desktop 还会提供您选择的密钥文件1061* **SSH key (optional)**:使用 OpenSSH 客户端时,除了条目的 `IdentityFile` 和 SSH agent 中的密钥外,Desktop 还会提供您选择的密钥文件。在 Windows 上,请选择 OpenSSH 格式的密钥,因为 `ssh` 无法读取 PuTTY `.ppk` 文件。

1062 

1063##### 在 Windows 上不使用 OpenSSH 客户端进行连接

1064 

1065在 Windows 上,如果您的计算机不满足 [OpenSSH 客户端的要求](#use-your-ssh-configuration),您将通过 Desktop 的内置 SSH 客户端进行连接。使用第三方提供商时,默认通过内置客户端连接,您的管理员可以更改此设置。有关该设置,请参阅 [SSH remote sessions in Claude Desktop on 3P](https://claude.com/docs/third-party/claude-desktop/ssh-remote-sessions)。

1066 

1067使用内置客户端时,如果您的 `PATH` 中有 `ssh` 命令,您仍可以在 **SSH host** 字段中输入 SSH 配置中的 `Host` 名称,但有以下限制:

1068 

1069* **条目中的设置**:Desktop 会采用 `HostName`、`User`、`Port` 和 `IdentityFile`。如果您的 `PATH` 上有 `sh` shell,它还会采用 `ProxyCommand`。

1070* **SSH key (optional)**:将此字段留空以保留条目的 `IdentityFile`,因为您在此处选择的密钥文件会替换 `IdentityFile`

1071* **`CertificateFile` 和 `ProxyJump`**:Desktop 会忽略 `CertificateFile`,如果条目设置了 `ProxyJump`,连接会失败。要使用其中任一设置,请[通过 OpenSSH 客户端连接](#use-your-ssh-configuration)。

1044 1072 

1045##### 访问跳板机后面的计算机1073##### 访问跳板机后面的计算机

1046 1074 


1095 1123 

1096##### 在 `ProxyCommand` 中使用来自 shell 的变量1124##### 在 `ProxyCommand` 中使用来自 shell 的变量

1097 1125 

1098若要在 `ProxyCommand` 或 `Match exec` 命令中使用您自己的环境变量,请在 shell 启动文件(例如 `~/.zshrc`)中导出它,然后退出并重新打开 Desktop。Desktop 启动时会读取您的登录 shell 导出的内容,并在您退出之前一直保留这些值。1126在 macOS 和 Linux 上,要在 `ProxyCommand` 或 `Match exec` 命令中使用您自己的环境变量,请在 shell 启动文件(例如 `~/.zshrc`)中导出它。然后退出并重新打开 Desktop。Desktop 启动时会读取您的登录 shell 导出的内容,并在您退出之前一直保留这些值。

1099 1127 

1100这需要 Claude Desktop v2.37337.0 或更高版本,以及一个接受 `-0` 的 `env` 命令,您可以在计算机上的终端中运行 `env -0` 进行检查。1128这需要 Claude Desktop v2.37337.0 或更高版本,以及一个接受 `-0` 的 `env` 命令,您可以在计算机上的终端中运行 `env -0` 进行检查。

1101 1129 


1103>1131>

1104> 如果您的 shell 设置了临时 AWS 凭据,请[为 AWS CLI 提供一个 profile](#use-aws-credentials-in-a-proxycommand),而不是导出 `AWS_*` 变量。1132> 如果您的 shell 设置了临时 AWS 凭据,请[为 AWS CLI 提供一个 profile](#use-aws-credentials-in-a-proxycommand),而不是导出 `AWS_*` 变量。

1105 1133 

1106##### 在 `ProxyCommand` 中使用 AWS 凭据1134##### 在 macOS 和 Linux 上的 `ProxyCommand` 中使用 AWS 凭据

1107 1135 

1108如果您在 shell 启动文件中设置了临时 AWS 凭据,运行 AWS CLI 的 `ProxyCommand` 可能在终端中能够连接,而在 Desktop 中失败。当您的 shell 导出 `AWS_SESSION_TOKEN`、`AWS_SECURITY_TOKEN` 或 `AWS_CREDENTIAL_EXPIRATION` 时,Desktop 中的 `ssh` 和您的 `ProxyCommand` 不会获得 shell 的 AWS 凭据、`AWS_REGION` 或 `AWS_PROFILE`。1136如果您在 shell 启动文件中设置了临时 AWS 凭据,运行 AWS CLI 的 `ProxyCommand` 可能在终端中能够连接,而在 Desktop 中失败。当您的 shell 导出 `AWS_SESSION_TOKEN`、`AWS_SECURITY_TOKEN` 或 `AWS_CREDENTIAL_EXPIRATION` 时,Desktop 中的 `ssh` 和您的 `ProxyCommand` 不会获得 shell 的 AWS 凭据、`AWS_REGION` 或 `AWS_PROFILE`。

1109 1137 


1242 1270 

1243##### 准备长时间任务1271##### 准备长时间任务

1244 1272 

1245* **先更新**:在开始长时间任务之前更新 Desktop。在 macOS 和 Windows 上,Desktop 可能会自行重启以安装已下载的更新。当 Claude 正在处理 SSH 任务时,该重启会等待。在使用 Claude 账户的 macOS 上,默认情况下,更新等待 72 小时后,重启仍可能进行。1273* **先更新**:在开始长时间任务之前更新 Desktop。在 macOS 和 Windows 上,Desktop 可能会自行重启以安装已下载的更新。当 Claude 正在处理 SSH 任务时,该重启会等待。默认情况下,一旦更新已等待 72 小时,如果 Desktop 之后能够[重新加入该任务](#reopen-a-session-after-you-quit-desktop),重启就可能在任务期间进行。

1246* **在 Windows 上,或在 v2.42304.0 之前使用第三方提供商时,不要退出**:在这些情况下,退出后您会失去正在运行的任务,因此请在任务期间保持 Desktop 打开。在其他任何情况下,退出之前请查看[您能找回什么](#reopen-a-session-after-you-quit-desktop)。1274* **退出前检查**:退出或重启后,您不一定能重新获得正在运行的任务,例如在某些 Desktop 更新之后。有关具体情况,请参阅[退出 Desktop 后重新打开会话](#reopen-a-session-after-you-quit-desktop)。

1275* **使用旧版本时,保持 Desktop 打开**:在 Windows 上使用 v3.1623.0 之前的 Claude Desktop 时,Desktop 退出或重启后,您无法重新获得正在运行的任务。在 macOS 或 Linux 上使用 v2.42304.0 之前版本的第三方提供商时也是如此。在这两种情况下,请在任务期间保持 Desktop 打开。要查找您的版本,请参阅[检查您的版本](#check-your-version)。

1247* **减少请求**:选择[让任务更少等待您](#handle-requests-that-arrive-while-you-are-away)的权限模式、规则或 hook1276* **减少请求**:选择[让任务更少等待您](#handle-requests-that-arrive-while-you-are-away)的权限模式、规则或 hook

1248* **检查跳板机**:如果您的跳板机要求登录(例如向手机发送推送),请改用无需提示即可工作的登录方式。否则,Desktop 每次尝试重新连接时都可能发送另一条推送。1277* **检查跳板机**:如果您的跳板机要求登录(例如向手机发送推送),请改用无需提示即可工作的登录方式。否则,Desktop 每次尝试重新连接时都可能发送另一条推送。

1249* **测试远程计算机**:启动一个短任务,在任务仍在运行时退出 Desktop,并在任务应该完成很久之后再次打开会话。如果任务尚未完成且会话未显示身份验证错误,请检查远程计算机上[可能结束任务的因素](#limits-while-desktop-is-disconnected)。1278* **测试远程计算机**:启动一个短任务,在任务仍在运行时退出 Desktop,并在任务应该完成很久之后再次打开会话。如果任务尚未完成且会话未显示身份验证错误,请检查远程计算机上[可能结束任务的因素](#limits-while-desktop-is-disconnected)。


1320 1349 

1321退出 Desktop 后,任务会在远程机器上继续运行,但除非 Desktop 能重新接入其进程,否则会话再次打开时任务会停止。在 Desktop 关闭期间,任务会一直运行,直到完成、需要您介入或达到某项[限制](#limits-while-desktop-is-disconnected)。1350退出 Desktop 后,任务会在远程机器上继续运行,但除非 Desktop 能重新接入其进程,否则会话再次打开时任务会停止。在 Desktop 关闭期间,任务会一直运行,直到完成、需要您介入或达到某项[限制](#limits-while-desktop-is-disconnected)。

1322 1351 

1323* **Windows 上的 Desktop**:您无法找回正在运行的任务,因为 Desktop 在退出后从不重新接入。请仅在您预计任务已完成时再次启动 Desktop,因为会话可能会在 Desktop 启动时打开。1352* **Windows 上的 Desktop,任务在 v3.1623.0 之前的版本中启动**:即使 Desktop 此后已更新,您也无法重新获得该任务。请仅在您预计任务已完成时再次启动 Desktop,因为会话可能会在 Desktop 启动时打开,而会话打开时任务会停止。如果您不知道任务是在哪个版本中启动的,也请等到您预计任务已完成时再启动。

1324* **第三方提供商,来自较早版本的任务**:如果您在 v2.42304.0 之前的 Desktop 版本中启动了任务,在 macOS 或 Linux 上也无法找回它。请仅在您预计任务已完成时再次启动 Desktop。1353* **macOS 或 Linux 上的第三方提供商,任务在 v2.42304.0 之前的版本中启动**:您无法重新获得该任务。请仅在您预计任务已完成时再次启动 Desktop。

1325* **其他任何任务,在 macOS 或 Linux 上的 Desktop 中**:启动 Desktop 并打开会话,如果 Desktop 重新接入,任务就会继续。它并不总能重新接入,例如在某些 Desktop 更新之后,因此请[在长时间任务之前更新](#prepare-a-long-task)。1354* **任何其他任务**:启动 Desktop 并打开会话,如果 Desktop 重新加入,任务就会继续。它并不总能重新加入,例如在某些 Desktop 更新之后,因此请[在长时间任务之前更新](#prepare-a-long-task)。

1326 1355 

1327当 Desktop 无法重新接入时,您也会失去任何正在等待您的批准或问题。如果任务没有自行继续,请发送消息,Claude 会根据对话保存的历史记录继续。1356当任务停止时,会话可能会在 Desktop 启动新进程期间显示 `Restarting Claude Code on <host>…`。您还会失去任何正在等待您的批准或问题。如果 Claude 没有自行继续,请发送消息,Claude 会根据对话保存的历史记录继续。

1328 1357 

1329有关第三方部署,请参阅 [3P 上 Claude Desktop 中的 SSH 远程会话](https://claude.com/docs/third-party/claude-desktop/ssh-remote-sessions)。1358有关第三方部署,请参阅 [3P 上 Claude Desktop 中的 SSH 远程会话](https://claude.com/docs/third-party/claude-desktop/ssh-remote-sessions)。

1330 1359 


1411 1440 

1412若要了解谁连接了远程计算机,请读取该计算机上 SSH 服务器的日志,其中来自 Desktop 的登录与来自终端的登录看起来相同。在 macOS 或 Linux 上的 Desktop 中,每次 Desktop 连接都会产生一条记录,而不是每个会话一条。1441若要了解谁连接了远程计算机,请读取该计算机上 SSH 服务器的日志,其中来自 Desktop 的登录与来自终端的登录看起来相同。在 macOS 或 Linux 上的 Desktop 中,每次 Desktop 连接都会产生一条记录,而不是每个会话一条。

1413 1442 

1443如果服务器设置了 `MaxSessions 1`,则每次 Desktop 连接或重新连接时至少会有两条记录。每个终端标签页,以及每个运行以 `!` 开头的命令的 Desktop 会话,还会至少再产生一条记录。

1444 

1414您不会在 Claude Code 的[指标和事件](https://code.claude.com/docs/zh-CN/monitoring-usage.md#available-metrics-and-events)中找到 Desktop 的 SSH 连接。要从中了解某个 SSH 会话在哪台远程机器上运行,请参阅[将遥测归因于 Desktop SSH 会话](https://code.claude.com/docs/zh-CN/monitoring-usage.md#attribute-telemetry-to-desktop-ssh-sessions)。有关 Desktop 自身的连接记录,请参阅[获取 Desktop 针对 SSH 问题的日志](#get-desktops-logs-for-an-ssh-problem)。1445您不会在 Claude Code 的[指标和事件](https://code.claude.com/docs/zh-CN/monitoring-usage.md#available-metrics-and-events)中找到 Desktop 的 SSH 连接。要从中了解某个 SSH 会话在哪台远程机器上运行,请参阅[将遥测归因于 Desktop SSH 会话](https://code.claude.com/docs/zh-CN/monitoring-usage.md#attribute-telemetry-to-desktop-ssh-sessions)。有关 Desktop 自身的连接记录,请参阅[获取 Desktop 针对 SSH 问题的日志](#get-desktops-logs-for-an-ssh-problem)。

1415 1446 

1416#### 在登录前关闭的连接1447#### 在登录前关闭的连接


2112| - | - | - |2143| - | - | - |

2113| `<host>'s SSH server has SFTP turned off` | `[SFTP_UNAVAILABLE]` | 在服务器的 `sshd_config` 中启用 SFTP,如[远程机器要求](#remote-machine-requirements-for-ssh-sessions)中所述 |2144| `<host>'s SSH server has SFTP turned off` | `[SFTP_UNAVAILABLE]` | 在服务器的 `sshd_config` 中启用 SFTP,如[远程机器要求](#remote-machine-requirements-for-ssh-sessions)中所述 |

2114| `SFTP doesn't start on <host>` | `[SFTP_NOT_STARTED]` | 在您计算机的终端中使用 `sftp` 连接到同一主机,查看是什么阻止了它启动,然后检查 Desktop 消息中提到的设置和文件 |2145| `SFTP doesn't start on <host>` | `[SFTP_NOT_STARTED]` | 在您计算机的终端中使用 `sftp` 连接到同一主机,查看是什么阻止了它启动,然后检查 Desktop 消息中提到的设置和文件 |

2115| `<host> allows too few SSH sessions per connection` | `[SESSION_LIMIT]` | 提高服务器 `sshd_config` 中的 `MaxSessions`,例如设为 OpenSSH 的默认值 10 |2146| `<host> allows too few SSH sessions per connection` | `[SESSION_LIMIT]` | 更新到 Claude Desktop v3.1623.0 或更高版本,或提高服务器 `sshd_config` 中的 `MaxSessions`,例如设为 OpenSSH 的默认值 10 |

2116| `<host> is out of disk space` | `[ENOSPC]` 或 `[EDQUOT]` | 在远程机器上的主目录或 `/tmp` 中释放空间或配额 |2147| `<host> is out of disk space` | `[ENOSPC]` 或 `[EDQUOT]` | 在远程机器上的主目录或 `/tmp` 中释放空间或配额 |

2117| `Free up disk space on this computer` | `[ENOSPC]` 或 `[EDQUOT]`,出现在以 `Couldn't prepare the deploy locally` 开头的消息中 | 释放您计算机上的空间 |2148| `Free up disk space on this computer` | `[ENOSPC]` 或 `[EDQUOT]`,出现在以 `Couldn't prepare the deploy locally` 开头的消息中 | 释放您计算机上的空间 |

2118| `Claude Code won't start on <host>` | `[CLI_UNRESPONSIVE]` | 等待一分钟,然后重试。如果仍然失败,请在远程机器上运行消息中提到的命令,查看 Claude Code 在那里是否有响应。 |2149| `Claude Code won't start on <host>` | `[CLI_UNRESPONSIVE]` | 等待一分钟,然后重试。如果仍然失败,请在远程机器上运行消息中提到的命令,查看 Claude Code 在那里是否有响应。 |

errors.md +2 −0

Details

327| `Cannot read this as an image: <path> is a pipe or a device` | [工具错误](#file-is-too-large-to-read-as-an-image) |327| `Cannot read this as an image: <path> is a pipe or a device` | [工具错误](#file-is-too-large-to-read-as-an-image) |

328| `subagent_type is required: the general-purpose agent is not available in this session` | [工具错误](#subagent-type-is-required) |328| `subagent_type is required: the general-purpose agent is not available in this session` | [工具错误](#subagent-type-is-required) |

329| `Error: this write left the memory index at MEMORY.md at ..., over its ... read limit` | [工具错误](#memory-index-is-over-its-read-limit) |329| `Error: this write left the memory index at MEMORY.md at ..., over its ... read limit` | [工具错误](#memory-index-is-over-its-read-limit) |

330| `Sandbox is required but failed to initialize: <reason>` | [沙箱隔离故障排除](https://code.claude.com/docs/zh-CN/sandboxing.md#commands-refused-with-sandbox-is-required) |

331| `Sandbox is required (sandbox.failIfUnavailable) and stopped being available in this session: <reason>` | [沙箱隔离故障排除](https://code.claude.com/docs/zh-CN/sandboxing.md#commands-refused-with-sandbox-is-required) |

330| `pkill: refusing to run` | [工具错误](#pkill-pattern-matches-the-claude-code-process) |332| `pkill: refusing to run` | [工具错误](#pkill-pattern-matches-the-claude-code-process) |

331| `Failed to write to <name>'s inbox — nothing was sent` | [工具错误](#failed-to-write-to-a-teammate-inbox) |333| `Failed to write to <name>'s inbox — nothing was sent` | [工具错误](#failed-to-write-to-a-teammate-inbox) |

332| `Failed to write the plan approval request to the lead's inbox — plan not submitted` | [工具错误](#failed-to-write-to-a-teammate-inbox) |334| `Failed to write the plan approval request to the lead's inbox — plan not submitted` | [工具错误](#failed-to-write-to-a-teammate-inbox) |

fast-mode.md +2 −2

Details

80 80 

81快速模式定价在整个 1M 令牌上下文窗口中是固定的。有关要比较的标准 Opus 费率,请参阅 [Claude 定价参考](https://platform.claude.com/docs/zh-CN/about-claude/pricing)。81快速模式定价在整个 1M 令牌上下文窗口中是固定的。有关要比较的标准 Opus 费率,请参阅 [Claude 定价参考](https://platform.claude.com/docs/zh-CN/about-claude/pricing)。

82 82 

83在对话中首次启用快速模式时,您需要为整个对话上下文支付完整的快速模式未缓存输入 token 价格。对话进行得越深入,成本就越高,因此在对话开始时启用快速模式的费用最低。该成本每个对话只应用一次,因此稍后关闭快速模式再打开不会重复收费。有关机制,请参阅 [快速模式如何与提示缓存交互](https://code.claude.com/docs/zh-CN/prompt-caching.md#turning-on-fast-mode)。83在对话中首次启用快速模式时,您需要为整个对话上下文支付完整的快速模式未缓存输入 token 价格。对话进行得越深入,成本就越高,因此在对话开始时启用快速模式的费用最低。快速模式和标准速度使用[各自独立的缓存](https://code.claude.com/docs/zh-CN/prompt-caching.md#turning-on-fast-mode),因此之后的每次切换都会再次以未缓存方式读取部分或全部对话。

84 84 

85### 查看快速模式支出出现的位置85### 查看快速模式支出出现的位置

86 86 


167 167 

168在网关后面时,请检查是否存在以下配置,在这些配置中 Claude Code 不会发送可用性检查,且没有缓存之前的成功检查:168在网关后面时,请检查是否存在以下配置,在这些配置中 Claude Code 不会发送可用性检查,且没有缓存之前的成功检查:

169 169 

170* 您将 `ANTHROPIC_BASE_URL` 指向您的网关,并将 [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential) 设置为网关颁发的、不符合 Anthropic API 密钥格式的密钥。Claude Code 不会将此类密钥发送到 `api.anthropic.com`。170* 您将 `ANTHROPIC_BASE_URL` 指向您的网关,并将 [`ANTHROPIC_API_KEY`](https://code.claude.com/docs/zh-CN/llm-gateway-connect#set-the-base-url-and-credential) 设置为网关颁发的、不符合 Anthropic API 密钥格式的密钥。

171* 您设置了 [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/zh-CN/env-vars),因此 Claude Code 会跳过该检查。171* 您设置了 [`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/zh-CN/env-vars),因此 Claude Code 会跳过该检查。

172 172 

173要在上述任一配置中恢复快速模式,请设置 `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`。173要在上述任一配置中恢复快速模式,请设置 `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`。

Details

262 262 

263**上下文成本:** 低,直到使用。仅用户 skills 在调用前成本为零。263**上下文成本:** 低,直到使用。仅用户 skills 在调用前成本为零。

264 264 

265**在 subagents 中:** Skills 在 subagents 中的工作方式不同。不是按需加载,而是在 subagent 的 `skills` 字段中列出的 skills 在启动时完全预加载到其上下文中。Subagents 仍然可以通过 Skill 工具发现和调用未列出的项目、用户和插件 skills。265**在子代理中:** 子代理的 `skills` 字段中列出的 skill 的完整内容会[在启动时加载到其上下文中](https://code.claude.com/docs/zh-CN/sub-agents.md#preload-skills-into-subagents),而不是按需加载。子代理仍然可以通过 Skill 工具发现和调用未列出的项目、用户和插件 skill。

266 266 

267> [!TIP]267> [!TIP]

268>268>

glossary.md +2 −2

Details

120 120 

121### Compaction121### Compaction

122 122 

123当 [context window](#context-window) 接近其限制时,自动总结您的对话。首先清除较旧的工具输出,然后总结对话。Project-root CLAUDE.md 和 auto memory 在 compaction 期间保留并从磁盘重新加载;仅在对话中给出的指令可能会丢失。运行 `/compact` 手动触发,可选择使用焦点,如 `/compact focus on the API changes`。123当[上下文窗口](#context-window)接近其限制时,自动总结您的对话。项目根目录的 CLAUDE.md 和自动记忆在压缩后仍会保留,但仅在对话中给出的指令可能不会保留。运行 `/compact` 手动触发,可选择指定焦点,如 `/compact focus on the API changes`。

124 124 

125了解更多:[What survives compaction](https://code.claude.com/docs/zh-CN/context-window.md#what-survives-compaction) · [When context fills up](https://code.claude.com/docs/zh-CN/how-claude-code-works.md#when-context-fills-up)125了解更多:[压缩后保留的内容](https://code.claude.com/docs/zh-CN/context-window.md#what-survives-compaction) · [上下文填满时](https://code.claude.com/docs/zh-CN/how-claude-code-works.md#when-context-fills-up) · [Claude Code 何时压缩您闲置的对话](https://code.claude.com/docs/zh-CN/settings-reference.md#idlecompaction)

126 126 

127### Connector127### Connector

128 128 

hooks.md +15 −5

Details

1426 1426 

1427Setup hook 无法阻止;无论退出码是什么,执行都会继续。对于任何退出码,Claude Code 都会丢弃 Setup hook 的 [JSON 输出字段](#json-output),例如 `systemMessage`、`continue` 和 `hookSpecificOutput.additionalContext`。使用 `-p` 时,只有当您使用 `--output-format stream-json --verbose` 启动时,Setup hook 的 stdout、stderr 和退出码才会作为 [`hook_response` 事件](https://code.claude.com/docs/zh-CN/headless#read-session-metadata)出现在运行输出中。1427Setup hook 无法阻止;无论退出码是什么,执行都会继续。对于任何退出码,Claude Code 都会丢弃 Setup hook 的 [JSON 输出字段](#json-output),例如 `systemMessage`、`continue` 和 `hookSpecificOutput.additionalContext`。使用 `-p` 时,只有当您使用 `--output-format stream-json --verbose` 启动时,Setup hook 的 stdout、stderr 和退出码才会作为 [`hook_response` 事件](https://code.claude.com/docs/zh-CN/headless#read-session-metadata)出现在运行输出中。

1428 1428 

1429Setup hook 可以访问 `CLAUDE_ENV_FILE`。写入该文件的变量会持久化到会话后续的 Bash 命令中,与 [SessionStart hook](#persist-environment-variables) 相同。`Setup` 上只运行 `type: "command"` hook。`Setup` 上的 `type: "mcp_tool"` hook 始终会被跳过,如 [MCP 工具 hook 字段](#mcp-tool-hook-fields)中所述。1429Setup hook 可以访问 `CLAUDE_ENV_FILE`。如果您的 hook 向该文件写入变量,这些变量会持久保留到该会话后续的 Bash 命令中,与 [SessionStart hook](#persist-environment-variables) 相同。`Setup` 上只运行 `type: "command"` hook。`Setup` 上的 `type: "mcp_tool"` hook 总是会被跳过,如 [MCP 工具 hook 字段](#mcp-tool-hook-fields)中所述。

1430 1430 

1431### InstructionsLoaded1431### InstructionsLoaded

1432 1432 


1483 1483 

1484`UserPromptSubmit` 上的 [Agent SDK 回调 hook](https://code.claude.com/docs/zh-CN/agent-sdk/hooks.md) 达到超时时,会以一条指明该 hook 和超时的消息阻止提示词,因为此处的回调可能充当策略关卡,不能在失败时放行。会话会继续。1484`UserPromptSubmit` 上的 [Agent SDK 回调 hook](https://code.claude.com/docs/zh-CN/agent-sdk/hooks.md) 达到超时时,会以一条指明该 hook 和超时的消息阻止提示词,因为此处的回调可能充当策略关卡,不能在失败时放行。会话会继续。

1485 1485 

1486#### 提示词检查期间按 `Esc`

1487 

1488如果您在 hook 仍在检查提示词时按 `Esc` 或中断会话,检查会停止,提示词不会传达给 Claude。您在终端输入的文本会返回到输入框,重新发送时 hook 会再次检查它。

1489 

1490hook 可能恰好在您中断的同一时刻阻止该提示词。此时提示词保持被阻止状态:您会看到该 hook 的[阻止消息](#what-a-blocked-prompt-leaves-behind),文本不会返回到输入框。

1491 

1486#### UserPromptSubmit 输入1492#### UserPromptSubmit 输入

1487 1493 

1488除[通用输入字段](#common-input-fields)外,UserPromptSubmit hook 还会接收包含所提交文本的 `prompt` 字段。折叠为 `[Pasted text #N]` 占位符的粘贴内容会在原位展开后传入。在 Claude Code [为 Claude 标记粘贴文本](https://code.claude.com/docs/zh-CN/terminal-config.md#how-claude-treats-pasted-text)的会话中,展开的内容位于 `<pasted_content id="…">` 行和 `</pasted_content id="…">` 行之间,因此如果您的 hook 解析提示词,请考虑这些行。1494除[通用输入字段](#common-input-fields)外,UserPromptSubmit hook 还会接收包含所提交文本的 `prompt` 字段。折叠为 `[Pasted text #N]` 占位符的粘贴内容会在原位展开后传入。在 Claude Code [为 Claude 标记粘贴文本](https://code.claude.com/docs/zh-CN/terminal-config.md#how-claude-treats-pasted-text)的会话中,展开的内容位于 `<pasted_content id="…">` 行和 `</pasted_content id="…">` 行之间,因此如果您的 hook 解析提示词,请考虑这些行。


1741 1747 

1742使用 [PreToolUse 决策控制](#pretooluse-decision-control)来允许、拒绝、询问或延迟工具调用。1748使用 [PreToolUse 决策控制](#pretooluse-decision-control)来允许、拒绝、询问或延迟工具调用。

1743 1749 

1744`PreToolUse` 上的 [Agent SDK 回调 hook](https://code.claude.com/docs/zh-CN/agent-sdk/hooks.md) 超过其超时时间时,会阻止工具调用,Claude 会收到一个注明该超时的错误结果。1750`PreToolUse` 上的 [Agent SDK 回调 hook](https://code.claude.com/docs/zh-CN/agent-sdk/hooks.md#hook-timeout) 超时后会阻止该工具调用。

1745 1751 

1746#### PreToolUse 输入1752#### PreToolUse 输入

1747 1753 


2969 2975 

2970当主对话中的 shell 命令更改工作目录时运行,例如 Claude 执行 `cd` 命令时。可用于响应目录更改:重新加载环境变量、激活项目特定的工具链,或自动运行设置脚本。可与 [FileChanged](#filechanged) 搭配使用,以支持 [direnv](https://direnv.net/) 等按目录管理环境的工具。2976当主对话中的 shell 命令更改工作目录时运行,例如 Claude 执行 `cd` 命令时。可用于响应目录更改:重新加载环境变量、激活项目特定的工具链,或自动运行设置脚本。可与 [FileChanged](#filechanged) 搭配使用,以支持 [direnv](https://direnv.net/) 等按目录管理环境的工具。

2971 2977 

2972CwdChanged hook 可以访问 [`CLAUDE_ENV_FILE`](#persist-environment-variables)。写入该文件的变量会持续作用于后续的 Bash 命令,直到下一个 CwdChanged 事件发生时由 Claude Code 清除。2978CwdChanged hook 可以访问 [`CLAUDE_ENV_FILE`](#persist-environment-variables)。如果您的 hook 将变量写入该文件,这些变量会在后续 Bash 命令中持续存在,直到下一个 CwdChanged 事件,届时 Claude Code 会清除它们。

2973 2979 

2974CwdChanged 不支持匹配器,每次发生时都会触发。2980CwdChanged 不支持匹配器,每次发生时都会触发。

2975 2981 


3134* Claude Code 将[后台会话](https://code.claude.com/docs/zh-CN/agent-view.md#how-file-edits-are-isolated)隔离在其自己的 worktree 中3140* Claude Code 将[后台会话](https://code.claude.com/docs/zh-CN/agent-view.md#how-file-edits-are-isolated)隔离在其自己的 worktree 中

3135* 处于 `worktree` 模式的 [`claude remote-control`](https://code.claude.com/docs/zh-CN/remote-control#start-a-remote-control-session) 在其自己的 worktree 中启动会话3141* 处于 `worktree` 模式的 [`claude remote-control`](https://code.claude.com/docs/zh-CN/remote-control#start-a-remote-control-session) 在其自己的 worktree 中启动会话

3136 3142 

3137当 Claude 通过 Bash 工具运行 `git worktree add` 而不是调用 `EnterWorktree` 时,您的 WorktreeCreate hook 不会运行。要检查或阻止该命令,请添加一个使用 `Bash` 匹配器的 [`PreToolUse`](#pretooluse) hook。3143对于 Claude 通过 Bash 添加的 worktree,WorktreeCreate hook 不会运行;对于使用 `--worktree` 和 [`--tmux`](https://code.claude.com/docs/zh-CN/cli-reference#cli-flags) 启动时创建的 worktree,插件的 hook 也不会运行:

3144 

3145* **通过 Bash 执行 `git worktree add`**:要检查或阻止该命令,请添加一个使用 `Bash` 匹配器的 [`PreToolUse`](#pretooluse) hook。

3146* **`--worktree` 与 `--tmux` 同时使用**:Claude Code 在加载插件之前创建 worktree,因此来自插件的 WorktreeCreate hook 不会运行。要让您的 hook 在同时使用这两个标志时运行,请改为在[设置文件](#configuration)中定义它。在 v2.1.300 之前,仅使用 `--worktree` 时插件的 WorktreeCreate hook 也不会运行。

3138 3147 

3139默认情况下,Claude Code 使用 `git worktree` 创建隔离的工作副本。配置 WorktreeCreate hook 会替换该默认的 git 行为,使您可以使用其他版本控制系统,例如 SVN、Perforce 或 Mercurial。3148默认情况下,Claude Code 使用 `git worktree` 创建隔离的工作副本。配置 WorktreeCreate hook 会替换该默认的 git 行为,使您可以使用其他版本控制系统,例如 SVN、Perforce 或 Mercurial。

3140 3149 


4075 4084 

4076当异步 hook 触发时,Claude Code 启动 hook 进程并立即继续,不等待其完成。Hook 通过 stdin 接收与同步 hook 相同的 JSON 输入。4085当异步 hook 触发时,Claude Code 启动 hook 进程并立即继续,不等待其完成。Hook 通过 stdin 接收与同步 hook 相同的 JSON 输入。

4077 4086 

4078后台进程退出后,Claude Code 从 hook 的 JSON 响应中传递 `additionalContext` 和 `systemMessage` 字段给 Claude 在下一个对话轮次。与同步 hook 的 `systemMessage` 不同,这两个字段都不会显示给你。4087后台进程退出后,Claude Code 会在下一个对话轮次将 hook 的 JSON 响应中的 `additionalContext` 和 `systemMessage` 字段传递给 Claude,但[重复的 `SessionStart` 输出](#limitations)除外。与同步 hook 的 `systemMessage` 不同,这两个字段都不会显示给您。

4079 4088 

4080将 JSON 响应单独输出到 stdout,或单独输出在一行上:4089将 JSON 响应单独输出到 stdout,或单独输出在一行上:

4081 4090 


4143 4152 

4144* Hook 输出在下一个对话轮次传递。如果会话空闲,响应等待直到下一个用户交互。例外:退出代码为 2 的 `asyncRewake` hook 即使在会话空闲时也会立即唤醒 Claude。4153* Hook 输出在下一个对话轮次传递。如果会话空闲,响应等待直到下一个用户交互。例外:退出代码为 2 的 `asyncRewake` hook 即使在会话空闲时也会立即唤醒 Claude。

4145* 每次执行创建一个单独的后台进程。4154* 每次执行创建一个单独的后台进程。

4155* 异步 `SessionStart` hook 在每次事件触发时都会运行。当 `additionalContext` 和 `systemMessage` 文本与 Claude 上次从该 hook 收到的内容相同时,Claude Code 会跳过该 hook 的输出,除非此后有同步 `SessionStart` hook 添加了其他文本。当文本发生变化时,Claude Code 会传递该文本;在压缩或 `/clear` 之后该 hook 下次运行时,也会再次传递。在 v2.1.295 之前,Claude Code 会在每次恢复时将相同的文本再次添加到对话中。

4146 4156 

4147## 安全考虑4157## 安全考虑

4148 4158 

hooks-guide.md +1 −1

Details

954* `PostToolUse` hooks 无法撤销操作,因为工具已经执行。954* `PostToolUse` hooks 无法撤销操作,因为工具已经执行。

955* [`PermissionRequest`](https://code.claude.com/docs/zh-CN/hooks#permissionrequest) hook 在 Claude Code 即将向您请求权限时触发,或在它原本会自动拒绝无法显示提示的调用时触发。在带 `-p` 标志的[非交互模式](https://code.claude.com/docs/zh-CN/headless.md)中,它们在 [`dontAsk` 模式](https://code.claude.com/docs/zh-CN/permission-modes#allow-only-pre-approved-tools-with-dontask-mode)之外仍会运行,而没有 hook 做出决策且无其他方式可以应答的调用会被拒绝。955* [`PermissionRequest`](https://code.claude.com/docs/zh-CN/hooks#permissionrequest) hook 在 Claude Code 即将向您请求权限时触发,或在它原本会自动拒绝无法显示提示的调用时触发。在带 `-p` 标志的[非交互模式](https://code.claude.com/docs/zh-CN/headless.md)中,它们在 [`dontAsk` 模式](https://code.claude.com/docs/zh-CN/permission-modes#allow-only-pre-approved-tools-with-dontask-mode)之外仍会运行,而没有 hook 做出决策且无其他方式可以应答的调用会被拒绝。

956* `Stop` hooks 在 Claude 完成响应时触发,而不仅仅在任务完成时。它们不在用户中断时触发。API 错误触发 [StopFailure](https://code.claude.com/docs/zh-CN/hooks.md#stopfailure) 代替。956* `Stop` hooks 在 Claude 完成响应时触发,而不仅仅在任务完成时。它们不在用户中断时触发。API 错误触发 [StopFailure](https://code.claude.com/docs/zh-CN/hooks.md#stopfailure) 代替。

957* 当多个 `PreToolUse` hooks 返回 [`updatedInput`](https://code.claude.com/docs/zh-CN/hooks#pretooluse) 来重写工具的参数时,最后完成的获胜。由于 hooks 并行运行,顺序是非确定性的。避免有多个 hook 修改同一工具的输入。957* 当多个 `PreToolUse` hook 返回 [`updatedInput`](https://code.claude.com/docs/zh-CN/hooks#pretooluse) 来改写工具的输入时,Claude Code 不会合并这些改写,也不保证工具使用哪一个改写运行。避免让多个 hook 改写同一工具的输入。

958 958 

959### Hooks 和权限模式959### Hooks 和权限模式

960 960 

Details

131 131 

132#### 当上下文填满时132#### 当上下文填满时

133 133 

134Claude Code 在您接近限制时自动管理上下文。它首先清除较旧的工具输出,然后在需要时总结对话。您的请求和关键代码片段被保留;对话早期的详细说明可能会丢失。将持久规则放在 CLAUDE.md 中,而不是依赖对话历史。134Claude Code 在您接近限制时自动管理上下文。它会将对话压缩为摘要。摘要会保留您的请求和关键代码片段,但对话早期的详细说明可能会丢失。将持久规则放在 CLAUDE.md 中,而不是依赖对话历史。

135 135 

136要控制在压缩期间保留的内容,请在 CLAUDE.md 中添加"Compact Instructions"部分或使用焦点运行 `/compact`(如 `/compact focus on the API changes`)。136要控制在压缩期间保留的内容,请在 CLAUDE.md 中添加"Compact Instructions"部分或使用焦点运行 `/compact`(如 `/compact focus on the API changes`)。

137 137 

Details

659 659 

660要重新绑定用于滚动文件列表或更改比较内容的快捷键,请参阅 [Diff panel actions](https://code.claude.com/docs/zh-CN/keybindings.md#diff-panel-actions)。660要重新绑定用于滚动文件列表或更改比较内容的快捷键,请参阅 [Diff panel actions](https://code.claude.com/docs/zh-CN/keybindings.md#diff-panel-actions)。

661 661 

662在未完成的合并、rebase、cherry-pick 或 revert 期间,面板会继续显示它上次从 git 读取的更改,因此不会被该操作传入的更改填满。操作结束后,面板会在第一次刷新时更新,例如在 Claude 下次编辑文件时。

663 

662### Diff dialog664### Diff dialog

663 665 

664diff 对话框以带边框的区块形式在输入框上方打开,列出您更改的文件及其添加和删除的行数。它将这些文件与 `HEAD` 进行比较,或者与您上次为此仓库[在 diff 面板中选择](#diff-panel)的内容进行比较。666diff 对话框以带边框的区块形式在输入框上方打开,列出您更改的文件及其添加和删除的行数。它将这些文件与 `HEAD` 进行比较,或者与您上次为此仓库[在 diff 面板中选择](#diff-panel)的内容进行比较。

keybindings.md +4 −4

Details

678 678 

679## Vim 模式交互679## Vim 模式交互

680 680 

681启用 vim 模式(通过 `/config` → 编辑器模式)时,快捷键和 vim 模式独立运行:681当您通过 `/config` 中的编辑器模式设置启用 vim 模式时,快捷键和 vim 模式独立运行:

682 682 

683* **Vim 模式**在文本输入级别处理输入(光标移动、模式、动作)683* **Vim 模式**在文本输入级别处理输入:光标移动、模式和动作

684* **快捷键**在组件级别处理操作(切换待办事项、提交等)684* **快捷键**在组件级别处理操作,例如切换待办事项或提交消息

685* vim 模式中的 Escape 键从 INSERT 切换到 NORMAL 模式;它不触发 `chat:cancel`685* 在 vim 模式下,Escape 键会将 INSERT 模式切换为 NORMAL 模式,而不会触发 `chat:cancel`

686* 大多数 Ctrl+key 快捷键通过 vim 模式传递到快捷键系统686* 大多数 Ctrl+key 快捷键通过 vim 模式传递到快捷键系统

687* Vim 键不能通过快捷键文件重新映射。要映射两键 INSERT 模式序列(如 `jj`)到 Escape,请使用 [`vimInsertModeRemaps`](https://code.claude.com/docs/zh-CN/interactive-mode#remap-insert-mode-key-sequences) 设置687* Vim 键不能通过快捷键文件重新映射。要映射两键 INSERT 模式序列(如 `jj`)到 Escape,请使用 [`vimInsertModeRemaps`](https://code.claude.com/docs/zh-CN/interactive-mode#remap-insert-mode-key-sequences) 设置

688* 在 vim NORMAL 模式中,`?` 显示帮助菜单(vim 行为)688* 在 vim NORMAL 模式中,`?` 显示帮助菜单(vim 行为)

Details

306 306 

307## 添加按目录 skills307## 添加按目录 skills

308 308 

309任何子目录都可以定义[skills](https://code.claude.com/docs/zh-CN/skills.md)范围限于其自己的堆栈。skill 在 Claude 确定其相关时按需加载,所以 API 特定的工具在前端工作期间不会消耗上下文。309任何子目录都可以定义范围限于其自己技术栈的 [skill](https://code.claude.com/docs/zh-CN/skills.md)。skill 在 Claude 确定其相关时按需加载。

310 310 

311Skills 位于目录内的 `.claude/skills/` 下。将它们与该区域的代码一起提交,以便克隆存储库的任何人都能获得它们。在 monorepo 中,这可以是每个包一套 skills。在大型单树代码库中,它是每个子系统一套,例如 `src/db/.claude/skills/`。311Skills 位于目录内的 `.claude/skills/` 下。将它们与该区域的代码一起提交,以便克隆存储库的任何人都能获得它们。在 monorepo 中,这可以是每个包一套 skills。在大型单树代码库中,它是每个子系统一套,例如 `src/db/.claude/skills/`。

312 312 


347- 在 `src/__tests__/mocks/` 中模拟外部服务347- 在 `src/__tests__/mocks/` 中模拟外部服务

348```348```

349 349 

350不同的子目录以相同的方式保存不同的 skills:`packages/web/.claude/skills/component-patterns/` 描述前端的组件约定而不是测试。当 Claude 处理 `packages/api/` 中的文件时,它加载 api-testing skill。当它在 `packages/web/` 中工作时,它加载 component-patterns 代替。在另一个的任务期间,两个目录的 skills 都不加载。350不同的子目录以相同的方式保存不同的 skill:`packages/web/.claude/skills/component-patterns/` 描述前端的组件约定而不是测试。当 Claude 处理 `packages/api/` 中的文件时,它加载 api-testing skill。当它在 `packages/web/` 中工作时,它加载 component-patterns。

351 351 

352您也可以按文件模式而不是按放置位置来限定 skill 的范围。[`paths` frontmatter 字段](https://code.claude.com/docs/zh-CN/skills#frontmatter-reference)采用 glob 模式,Claude 仅在处理匹配文件时自动加载 skill。对于位于仓库根目录的 `.claude/skills/` 中但仅适用于某些文件的 skill,可使用此功能,例如限定于 `**/migrations/**` 的数据库迁移 skill。352您也可以按文件模式而不是按放置位置来限定 skill 的范围。[`paths` frontmatter 字段](https://code.claude.com/docs/zh-CN/skills#frontmatter-reference)采用 glob 模式,Claude 仅在处理匹配文件时自动加载 skill。对于位于仓库根目录的 `.claude/skills/` 中但仅适用于某些文件的 skill,可使用此功能,例如限定于 `**/migrations/**` 的数据库迁移 skill。

353 353 

Details

520| `400` 错误在每个请求上,在网关自己的措辞中拒绝无法识别的工具类型,例如 `Input tag 'advisor_20260301'`,在 Claude Code v2.1.275 上 | 在该版本的逐步推出中,即使关闭了 advisor,请求也会携带 [advisor 工具](https://code.claude.com/docs/zh-CN/advisor.md)条目。Anthropic API 接受它,但验证工具类型的网关或上游拒绝整个请求;一个[按原样转发请求正文字段](https://code.claude.com/docs/zh-CN/llm-gateway-protocol.md#forward-as-open-lists)的网关不受影响地通过它。该条目是一个不携带任何对话内容的声明 | 更新到 v2.1.276 或更高版本,除非您打开 advisor,否则它不会在 `ANTHROPIC_BASE_URL` 网关后面发送该条目。在 v2.1.275 上,设置 [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/zh-CN/env-vars),这会从请求中删除该条目 |520| `400` 错误在每个请求上,在网关自己的措辞中拒绝无法识别的工具类型,例如 `Input tag 'advisor_20260301'`,在 Claude Code v2.1.275 上 | 在该版本的逐步推出中,即使关闭了 advisor,请求也会携带 [advisor 工具](https://code.claude.com/docs/zh-CN/advisor.md)条目。Anthropic API 接受它,但验证工具类型的网关或上游拒绝整个请求;一个[按原样转发请求正文字段](https://code.claude.com/docs/zh-CN/llm-gateway-protocol.md#forward-as-open-lists)的网关不受影响地通过它。该条目是一个不携带任何对话内容的声明 | 更新到 v2.1.276 或更高版本,除非您打开 advisor,否则它不会在 `ANTHROPIC_BASE_URL` 网关后面发送该条目。在 v2.1.275 上,设置 [`CLAUDE_CODE_DISABLE_ADVISOR_TOOL=1`](https://code.claude.com/docs/zh-CN/env-vars),这会从请求中删除该条目 |

521| 模型从 `/model` 选择器中缺失 | 网关模型名称不在 Claude Code 的内置列表中,或 Claude Code 显示替换内置选项的 [`modelPicker`](https://code.claude.com/docs/zh-CN/settings-reference#modelpicker) 阵容 | 启用[网关模型发现](#add-gateway-models-to-the-model-picker)或使用[模型配置](https://code.claude.com/docs/zh-CN/model-config.md)变量添加名称。如果 Claude Code 显示替换 `modelPicker` 阵容,请将网关模型添加到其中,或在托管设置提供时要求您的管理员添加它们 |521| 模型从 `/model` 选择器中缺失 | 网关模型名称不在 Claude Code 的内置列表中,或 Claude Code 显示替换内置选项的 [`modelPicker`](https://code.claude.com/docs/zh-CN/settings-reference#modelpicker) 阵容 | 启用[网关模型发现](#add-gateway-models-to-the-model-picker)或使用[模型配置](https://code.claude.com/docs/zh-CN/model-config.md)变量添加名称。如果 Claude Code 显示替换 `modelPicker` 阵容,请将网关模型添加到其中,或在托管设置提供时要求您的管理员添加它们 |

522| `/fast` 报告 `Fast mode unavailable due to network connectivity issues`,而推理请求有效 | [快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)可用性检查直接转到 `api.anthropic.com`,不遵循 `ANTHROPIC_BASE_URL`,因此阻止的直接出口会导致检查失败 | 如果出口被阻止,请将 `api.anthropic.com` 加入允许列表,或设置跳过变量。请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |522| `/fast` 报告 `Fast mode unavailable due to network connectivity issues`,而推理请求有效 | [快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)可用性检查直接转到 `api.anthropic.com`,不遵循 `ANTHROPIC_BASE_URL`,因此阻止的直接出口会导致检查失败 | 如果出口被阻止,请将 `api.anthropic.com` 加入允许列表,或设置跳过变量。请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

523| `/fast` 在使用 `ANTHROPIC_API_KEY` 中网关颁发的密钥进行身份验证的会话中报告 `Fast mode is currently unavailable` | 当 `ANTHROPIC_BASE_URL` 指向您的网关时,Claude Code 不会将不符合 Anthropic API 密钥格式的密钥发送到 `api.anthropic.com`。因此[快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)可用性检查不会被发送,并且在没有缓存先前成功检查结果的情况下,Claude Code 会将快速模式视为不可用 | 设置 `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`;请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |523| `/fast` 在使用 `ANTHROPIC_API_KEY` 中网关颁发的密钥进行身份验证的会话中报告 `Fast mode is currently unavailable` | 当 `ANTHROPIC_BASE_URL` 指向您的网关且密钥不符合 Anthropic API 密钥的格式时,Claude Code 不会发送[快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)可用性检查。在没有缓存先前成功检查结果的情况下,它会将快速模式视为不可用 | 设置 `CLAUDE_CODE_SKIP_FAST_MODE_NETWORK_ERRORS=1`;请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

524| `/fast` 在使用 `ANTHROPIC_AUTH_TOKEN` 进行身份验证的会话中报告 `Fast mode has been disabled by your organization`,即使组织已启用快速模式 | 可用性检查需要 claude.ai 登录或 API 密钥;仅使用持有者令牌,Claude Code 会将快速模式视为已禁用,而不发送检查 | 设置 `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`;请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |524| `/fast` 在使用 `ANTHROPIC_AUTH_TOKEN` 进行身份验证的会话中报告 `Fast mode has been disabled by your organization`,即使组织已启用快速模式 | 可用性检查需要 claude.ai 登录或 API 密钥;仅使用持有者令牌,Claude Code 会将快速模式视为已禁用,而不发送检查 | 设置 `CLAUDE_CODE_SKIP_FAST_MODE_ORG_CHECK=1`;请参阅[在代理和 LLM 网关后面使用快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md#use-fast-mode-behind-proxies-and-llm-gateways) |

525| Claude Code 要求您登录,即使 [curl 测试](#verify-the-connection)成功 | CLI 没有自己的凭证:可达的基础 URL 不是一个,在交互会话中,项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `env` 块仅在首次运行向导和[信任提示](https://code.claude.com/docs/zh-CN/permissions.md#what-runs-before-you-trust-a-folder)之后应用 | 在 Claude Code 在首次运行设置之前读取的某处设置 `ANTHROPIC_AUTH_TOKEN`:shell 导出、`~/.claude/settings.json` 中的 `env` 块或托管设置 |525| Claude Code 要求您登录,即使 [curl 测试](#verify-the-connection)成功 | CLI 没有自己的凭证:可达的基础 URL 不是一个,在交互会话中,项目的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `env` 块仅在首次运行向导和[信任提示](https://code.claude.com/docs/zh-CN/permissions.md#what-runs-before-you-trust-a-folder)之后应用 | 在 Claude Code 在首次运行设置之前读取的某处设置 `ANTHROPIC_AUTH_TOKEN`:shell 导出、`~/.claude/settings.json` 中的 `env` 块或托管设置 |

526| `ANTHROPIC_API_KEY` 已设置但被忽略,没有提示 | 密钥需要在交互会话中进行一次性批准,之前拒绝的密钥被忽略而不再询问 | 在 `/config` 下使用 `Use custom API key` 选项启用它 |526| `ANTHROPIC_API_KEY` 已设置但被忽略,没有提示 | 密钥需要在交互会话中进行一次性批准,之前拒绝的密钥被忽略而不再询问 | 在 `/config` 下使用 `Use custom API key` 选项启用它 |

Details

113* **上下文窗口**:Claude Code 假设 200K,或当 ID 包含 `[1m]` 时为 1M。要声明真实窗口,请参阅 [为网关或自定义模型 ID 更正窗口](https://code.claude.com/docs/zh-CN/model-config.md#correct-the-window-for-a-gateway-or-custom-model-id)113* **上下文窗口**:Claude Code 假设 200K,或当 ID 包含 `[1m]` 时为 1M。要声明真实窗口,请参阅 [为网关或自定义模型 ID 更正窗口](https://code.claude.com/docs/zh-CN/model-config.md#correct-the-window-for-a-gateway-or-custom-model-id)

114* **能力**:要给网关别名赋予其后面模型的能力,请使用您分发的设置中的 [`modelOverrides`](https://code.claude.com/docs/zh-CN/errors#unrecognized-model-id-on-a-request) 条目将该模型的 Anthropic ID 映射到您的别名。有关 `ANTHROPIC_DEFAULT_*_MODEL_SUPPORTED_CAPABILITIES` 变量适用的位置,请参阅 [功能传递](#feature-pass-through)114* **能力**:要给网关别名赋予其后面模型的能力,请使用您分发的设置中的 [`modelOverrides`](https://code.claude.com/docs/zh-CN/errors#unrecognized-model-id-on-a-request) 条目将该模型的 Anthropic ID 映射到您的别名。有关 `ANTHROPIC_DEFAULT_*_MODEL_SUPPORTED_CAPABILITIES` 变量适用的位置,请参阅 [功能传递](#feature-pass-through)

115 115 

116## 请求头116## 请求标头

117 117 

118Claude Code 在 API 请求中包含这些头。头名称在网络上不区分大小写。转发 `anthropic-version` 和 `anthropic-beta` 不变,以及当上游是 [AWS 上的 Claude Platform](https://code.claude.com/docs/zh-CN/claude-platform-on-aws.md) 时的 `anthropic-workspace-id`;其余的网关可能会用于路由、归属和追踪,不需要转发。118Claude Code 会在 API 请求中包含以下标头。标头名称在传输时不区分大小写。请原样转发 `anthropic-version` 和 `anthropic-beta`,当上游为 [Claude Platform on AWS](https://code.claude.com/docs/zh-CN/claude-platform-on-aws.md) 时还需转发 `anthropic-workspace-id`;其余标头网关可用于路由、归因和追踪,无需转发。

119 119 

120| 头 | 描述 |120| 标头 | 描述 |

121| :- | :- |121| :- | :- |

122| `Authorization`, `x-api-key` | 开发者的网关凭证,根据他们设置的 [凭证变量](https://code.claude.com/docs/zh-CN/llm-gateway-connect.md#set-the-credential-variable) 在一个或两个头中 |122| `Authorization`、`x-api-key` | 开发者的网关凭据,根据开发者设置的[凭据变量](https://code.claude.com/docs/zh-CN/llm-gateway-connect.md#set-the-credential-variable),出现在其中一个或两个标头中 |

123| `anthropic-version` | API 版本,目前为 `2023-06-01`。Amazon Bedrock 和 Google Cloud 的 Agent Platform 格式请求也在 `anthropic_version` 请求体字段中携带,其值是提供商方言字符串,而不是此头的值 |123| `anthropic-version` | API 版本,当前为 `2023-06-01`。Amazon Bedrock 格式和 Google Cloud's Agent Platform 格式的请求还会携带 `anthropic_version` 请求体字段,其值为提供商的方言字符串,而不是此标头的值 |

124| `anthropic-beta` | 请求的逗号分隔的能力值。逐字转发该头;不要对单个值进行白名单,因为该集合随 Claude Code 版本而变化。当开发者使用 claude.ai 登录进行身份验证时(当设置 `ANTHROPIC_BASE_URL` 而没有网关凭证变量时可能),此头也会携带上游所需的 OAuth 能力,删除它会导致这些请求失败并返回 `401` |124| `anthropic-beta` | 请求的以逗号分隔的功能值。请原样转发此标头;不要对单个值设置允许列表,因为该集合会随 Claude Code 版本发布而变化。当开发者使用 claude.ai 登录进行身份验证时(在设置了 `ANTHROPIC_BASE_URL` 但未设置网关凭据变量的情况下可能出现),此标头还会携带上游所需的 OAuth 功能值,将其移除会导致这些请求以 `401` 失败 |

125| `x-claude-code-session-id` | 当前 Claude Code 会话的唯一标识符。使用它来聚合来自一个会话的所有请求,无需解析请求体 |125| `x-claude-code-session-id` | 当前 Claude Code 会话的唯一标识符。可用它汇总来自同一会话的所有请求,而无需解析请求体 |

126| `x-claude-code-agent-id` | 发出请求的 [子代理](https://code.claude.com/docs/zh-CN/sub-agents.md) 的标识符,仅在来自代理在会话内生成的 Claude Code 的请求上存在。将其与会话 ID 一起使用以将成本归属于并行代理 |126| `x-claude-code-agent-id` | 发出请求的[子代理](https://code.claude.com/docs/zh-CN/sub-agents.md)的标识符,仅出现在由 Claude Code 在会话内生成的 Agent 所发出的请求中。将其与会话 ID 结合使用,可将成本归因到并行运行的各个 Agent |

127| `x-claude-code-parent-agent-id` | 生成请求代理的代理的标识符,仅对嵌套代理存在 |127| `x-claude-code-parent-agent-id` | 生成发出请求的 Agent 的那个 Agent 的标识符,仅在嵌套 Agent 时出现 |

128 128 

129子代理 ID 在每次 Claude Code 生成子代理时都会生成新的。队友代理是 [代理团队](https://code.claude.com/docs/zh-CN/agent-teams.md) 的命名成员,在重新连接时重用基于名称的稳定 ID。在两种情况下,ID 都标识一个代理,而不是一个人或设备,因此不要将代理 ID 头视为用户标识符。129每次 Claude Code 生成子代理时,都会重新生成子代理 ID。队友 Agent(即 [agent team](https://code.claude.com/docs/zh-CN/agent-teams.md) 中的具名成员)在重新连接时会复用一个基于名称的稳定 ID。在这两种情况下,ID 标识的都是 Agent,而不是人员或设备,因此请勿将 Agent ID 标头视为用户标识符。

130 130 

131如果您的开发者设置了 `ANTHROPIC_CUSTOM_HEADERS`,这些头也会出现在请求上。131如果您的开发者设置了 `ANTHROPIC_CUSTOM_HEADERS`,这些标头也会出现在请求中。

132 132 

133### 网关提示头133### 网关提示标头

134 134 

135Claude Code 也可以发送路由提示:网关或路由器可以用来调度、缓存或归属请求的每个请求事实。需要 Claude Code v2.1.273 或更高版本。135Claude Code 还可以发送路由提示:即网关或路由器可用于调度、缓存或归因请求的每个请求的相关信息。需要 Claude Code v2.1.273 或更高版本。

136 136 

137请求是否携带它们取决于 Claude Code 将其发送到何处:137请求是否携带这些标头,取决于 Claude Code 将请求发送到何处:

138 138 

139* 直接连接到 Anthropic API:默认发送139* 直接连接 Anthropic API:默认发送

140* 自定义基础 URL:默认关闭,因为拒绝未知头的代理会导致请求失败。要接收它们,请为您的开发者设置 [`CLAUDE_CODE_GATEWAY_HINT_HEADERS=1`](https://code.claude.com/docs/zh-CN/env-vars),例如在 [托管设置](https://code.claude.com/docs/zh-CN/managed-settings.md) 的 `env` 块中140* 自定义基础 URL:默认关闭,因为拒绝未知标头的代理会导致请求失败。如需接收这些标头,请为您的开发者设置 [`CLAUDE_CODE_GATEWAY_HINT_HEADERS=1`](https://code.claude.com/docs/zh-CN/env-vars),例如在[托管设置](https://code.claude.com/docs/zh-CN/managed-settings.md)的 `env` 块中设置

141* 任何其他后端,包括 Amazon Bedrock、Google Cloud 的 Agent Platform、Microsoft Foundry 和 AWS 上的 Claude Platform:仅当设置 `CLAUDE_CODE_GATEWAY_HINT_HEADERS=1` 时发送141* 任何其他后端,包括 Amazon Bedrock、Google Cloud's Agent Platform、Microsoft Foundry 和 Claude Platform on AWS:仅在设置了 `CLAUDE_CODE_GATEWAY_HINT_HEADERS=1` 时发送

142 142 

143将 `CLAUDE_CODE_GATEWAY_HINT_HEADERS` 设置为 `0` 会在每个连接上停止这些头。143将 `CLAUDE_CODE_GATEWAY_HINT_HEADERS` 设置为 `0` 会在所有连接上停止发送这些标头。

144 144 

145这些头仅携带下面行列出的内容:固定词汇、工具名称、持续时间和随机提示标识符,从不携带提示文本或文件内容。每个值都是可打印的 ASCII。145这些标头仅携带下表所列的内容:固定词汇、工具名称、时长以及一个随机的提示词标识符,绝不包含提示词文本或文件内容。所有值均为可打印 ASCII 字符。

146 146 

147| 头 | 描述 |147| 标头 | 描述 |

148| :- | :- |148| :- | :- |

149| `x-claude-code-request-class` | 这是什么类型的请求:`main` 用于主对话的一个回合,`subagent` 用于 [子代理](https://code.claude.com/docs/zh-CN/sub-agents.md) 的一个回合,`workflow` 用于在工作流内运行的代理,`compaction` 用于压缩对话的总结请求,或 `auxiliary` 用于侧面请求,如会话标题、分类器和摘要。在每个请求上发送 |149| `x-claude-code-request-class` | 请求的类型:`main` 表示主对话的一个轮次,`subagent` 表示[子代理](https://code.claude.com/docs/zh-CN/sub-agents.md)的一个轮次,`workflow` 表示在工作流中运行的 Agent,`compaction` 表示用于压缩对话的摘要请求,`auxiliary` 表示辅助请求,例如会话标题、分类器和摘要。每个请求都会发送 |

150| `x-claude-code-agent-type` | 发出请求的子代理的类型:内置代理类型名称,如 `Explore`、`Plan` 或 `general-purpose`,或 `custom` 用于用户定义的代理,`teammate` 用于在主导的进程中运行的 [代理团队](https://code.claude.com/docs/zh-CN/agent-teams.md) 成员,或 `fork` 用于 [分叉](https://code.claude.com/docs/zh-CN/sub-agents.md#fork-the-current-conversation)。仅在子代理自己的回合上存在;子代理的压缩或侧面请求保留代理 ID 但不携带类型。用户选择的代理名称永远不会被发送 |150| `x-claude-code-agent-type` | 发出请求的子代理类型:内置 Agent 类型名称,例如 `Explore`、`Plan` 或 `general-purpose`;`custom` 表示用户定义的 Agent;`teammate` 表示在主导者进程中运行的 [agent team](https://code.claude.com/docs/zh-CN/agent-teams.md) 成员;`fork` 表示[分叉](https://code.claude.com/docs/zh-CN/sub-agents.md#fork-the-current-conversation)。仅出现在子代理自身的轮次中;子代理的压缩请求或辅助请求保留 Agent ID,但不携带类型。用户选择的 Agent 名称绝不会被发送 |

151| `x-claude-code-compaction` | 在 [压缩](https://code.claude.com/docs/zh-CN/prompt-caching.md#compacting-the-conversation) 期间总结对话的请求上存在。该值说明触发了什么:`auto` 当上下文窗口接近容量时,`manual` 用于 `/compact`,或 `reactive` 当 API 拒绝请求过长时。对于 [空闲压缩](https://code.claude.com/docs/zh-CN/settings-reference.md#idlecompaction),该值也为 `auto`。在所有其他请求上不存在 |151| `x-claude-code-compaction` | 出现在[上下文压缩](https://code.claude.com/docs/zh-CN/prompt-caching.md#compacting-the-conversation)期间对对话进行摘要的请求中。其值表示触发原因:`auto` 表示上下文窗口接近容量上限,`manual` 表示 `/compact`,`reactive` 表示 API 因请求过长而拒绝了请求。在交互式终端会话中进行的[空闲压缩](https://code.claude.com/docs/zh-CN/settings-reference.md#idlecompaction),其值也为 `auto`。其他所有请求中均不出现,包括在压缩之前于后台写入摘要的请求 |

152| `x-claude-code-context-compacted` | 在压缩后的第一个主对话请求上存在一次,具有与 `x-claude-code-compaction` 相同的值。此请求之前的对话前缀不再使用,因此可以删除以其为键的缓存 |152| `x-claude-code-context-compacted` | 在压缩后的第一个主对话请求中出现一次,取值与 `x-claude-code-compaction` 相同。此请求之前的对话前缀将不再使用,因此以其为键的缓存可以丢弃 |

153| `x-claude-code-prev-tool-durations` | 此请求携带其结果的工具调用的测量运行时间,格式为 `<name>=<ms>;<name>=<ms>`,例如 `Bash=742;Read=9`。在同一对话的下一个请求之后发送,来自主会话或子代理的一批工具调用 |153| `x-claude-code-prev-tool-durations` | 此请求所携带结果对应的工具调用的实测运行时间,格式为 `<name>=<ms>;<name>=<ms>`,例如 `Bash=742;Read=9`。在一批工具调用之后,于同一对话的下一个请求中发送,适用于主会话或子代理 |

154| `x-claude-code-prompt-id` | 标识请求所服务的用户提示的随机 UUID。服务一个提示的请求共享该值,包括提示启动的子代理的回合。未归属于提示的请求省略它。使用它按提示对会话的请求进行分组。需要 Claude Code v2.1.283 或更高版本 |154| `x-claude-code-prompt-id` | 随机 UUID,用于标识请求所服务的用户提示词。服务于同一提示词的请求共享该值,包括该提示词所启动的子代理的轮次。未归属于某个提示词的请求不包含此标头。可用它按提示词对会话中的请求进行分组。需要 Claude Code v2.1.283 或更高版本 |

155 155 

156在解析 `x-claude-code-prev-tool-durations` 之前,检查 Claude Code 如何构建该值以及它遗漏了什么:156在解析 `x-claude-code-prev-tool-durations` 之前,请了解 Claude Code 如何构建该值以及它会省略哪些内容:

157 157 

158* 条目:每个运行的工具调用一个,按其结果被收集的顺序,以整毫秒为单位158* 条目:每个已运行的工具调用对应一个条目,按其结果被收集的顺序排列,以整毫秒为单位

159* 上限:Claude Code 最多发送 32 个条目和 4 KB,保留第一个条目159* 上限:Claude Code 最多发送 32 个条目和 4 KB,保留最前面的条目

160* 编码:工具名称是百分比编码的,涵盖 `%`、`;`、`=`、逗号、空格和任何可打印 ASCII 之外的字符160* 编码:工具名称采用百分号编码,涵盖 `%`、`;`、`=`、逗号、空格以及可打印 ASCII 范围之外的任何字符

161* 解析:在 `;` 上分割,然后在 `=` 上分割,并解码每个名称161* 解析:先按 `;` 拆分,再按 `=` 拆分,然后解码每个名称

162* 缺失:压缩调用、侧面请求和新提示的第一个请求永远不会携带它。不要将缺失的头读作运行无工具的回合162* 缺失:压缩调用、辅助请求以及新提示词的第一个请求绝不会携带此标头。不要将缺失该标头理解为某个轮次未运行任何工具

163* 时间:每个都排除权限提示和钩子,并行工具调用各自报告自己的时间,因此条目不会加起来等于请求之间的间隙163* 时间:每个时间都不包括权限提示和 hook 的耗时,并行的工具调用各自报告自己的时间,因此各条目之和并不等于请求之间的间隔

164 164 

165### 作为开放列表转发165### 作为开放列表转发

166 166 

167将头和请求体字段视为开放列表,而不是封闭列表。Claude Code 在版本中获得能力,它们作为新的 `anthropic-beta` 值、新的请求体字段,以及偶尔新的 `anthropic-*` 或 `x-claude-code-*` 头到达。167请将标头和请求体字段视为开放列表,而非封闭列表。Claude Code 会随着版本发布获得新功能,这些功能会以新的 `anthropic-beta` 值、新的请求体字段,偶尔也会以新的 `anthropic-*` 或 `x-claude-code-*` 标头的形式出现。

168 168 

169转发到 Anthropic 格式上游时,通过 `anthropic-*` 请求头和请求体字段不变,而不是对您今天看到的进行白名单。固定在观察列表上的网关会删除下一个能力的头或字段,并在引入它的版本上破坏它。169转发到 Anthropic 格式的上游时,请原样传递 `anthropic-*` 请求标头和请求体字段,而不是为当前看到的那些设置允许列表。固定于已观察到的列表的网关会移除下一个功能的标头或字段,并在引入该功能的版本中导致其失效。

170 170 

171例外是非 Anthropic 上游,如 Amazon Bedrock 或 Google Cloud 的 Agent Platform,其中桥接模式差异是网关的工作;请参阅 [功能传递](#feature-pass-through)。171例外情况是非 Anthropic 上游,例如 Amazon Bedrock 或 Google Cloud's Agent Platform,在这种情况下,弥合 schema 差异是网关的职责;请参阅[功能透传](#feature-pass-through)。

172 172 

173## 响应头173## 响应头

174 174 


238* 当上游仅拒绝对话中途系统消息上的 `cache_control` 标记时,Claude Code 会保留系统消息,并在移动该标记后重试一次。该标记会放在 `messages` 中最后一个非系统消息的条目上,在该次重试以及 Claude Code 退出之前的后续请求中均是如此238* 当上游仅拒绝对话中途系统消息上的 `cache_control` 标记时,Claude Code 会保留系统消息,并在移动该标记后重试一次。该标记会放在 `messages` 中最后一个非系统消息的条目上,在该次重试以及 Claude Code 退出之前的后续请求中均是如此

239* 当上游拒绝[思考签名](https://platform.claude.com/docs/en/build-with-claude/extended-thinking)时,包括带有 `400` 的拒绝,其消息说该块被 `bound to a different conversation`,Claude Code 会从请求中删除早期思考块,重试,并将其排除在每个后续请求之外。新响应仍然包括思考239* 当上游拒绝[思考签名](https://platform.claude.com/docs/en/build-with-claude/extended-thinking)时,包括带有 `400` 的拒绝,其消息说该块被 `bound to a different conversation`,Claude Code 会从请求中删除早期思考块,重试,并将其排除在每个后续请求之外。新响应仍然包括思考

240* 当 gateway 或其上游将[顾问工具](https://code.claude.com/docs/zh-CN/advisor.md)条目在 `tools` 中拒绝为无法识别的工具类型时,Claude Code 会重试一次请求,不包含该条目及其 `anthropic-beta` 值。对该基础 URL 的后续请求会将顾问排除在外,直到 Claude Code 退出,在该时间内 `/advisor` 对开发者不可用。Claude Code 通过 `400` 或 `422` 响应识别此拒绝,其消息在 `Input tag` 之后命名工具类型,例如 `Input tag 'advisor_20260301'`。在 v2.1.280 之前,Claude Code 没有重试此拒绝240* 当 gateway 或其上游将[顾问工具](https://code.claude.com/docs/zh-CN/advisor.md)条目在 `tools` 中拒绝为无法识别的工具类型时,Claude Code 会重试一次请求,不包含该条目及其 `anthropic-beta` 值。对该基础 URL 的后续请求会将顾问排除在外,直到 Claude Code 退出,在该时间内 `/advisor` 对开发者不可用。Claude Code 通过 `400` 或 `422` 响应识别此拒绝,其消息在 `Input tag` 之后命名工具类型,例如 `Input tag 'advisor_20260301'`。在 v2.1.280 之前,Claude Code 没有重试此拒绝

241* 当上游拒绝 `output_config.effort` 时,Claude Code 会在不带努力的情况下重试请求,并在 Claude Code 退出之前,在发往该模型的后续请求中省略它。Claude Code 通过 `400` 响应识别此拒绝,其消息同时命名 `output_config.effort` 和 `Extra inputs are not permitted`,或说明该模型不支持 effort 参数241* 当上游拒绝 `output_config.effort` 或其 `anthropic-beta` 值时,Claude Code 会重试,并在 Claude Code 退出之前,不再向发往该模型的请求中添加这两者。如果您的网关原封不动地转发上游的 `400`,且其消息满足以下条件之一,则网关无需任何更改:

242 * 同时命名 `output_config.effort` 和 `Extra inputs are not permitted`

243 * 说明该模型不支持 effort 参数

244 * 以 `Unexpected value(s)` 开头,并针对 `anthropic-beta` 请求头列出 `effort-2025-11-24`。需要 v2.1.310 或更高版本。如果开发者的 [`ANTHROPIC_BETAS`](https://code.claude.com/docs/zh-CN/env-vars) 中列出了该值,他们会继续发送该值并收到 `400`,因此请让他们移除该条目

242* 当上游拒绝 `context_management` 字段或其 `anthropic-beta` 值时,网关会再次收到不带它们的该请求。如果网关在后续请求中再次看到它们且上游再次拒绝,则会进行同样的重试。Claude Code 通过消息识别此拒绝,例如包含 `context_management: Extra inputs are not permitted` 的消息。在 v2.1.304 之前,Claude Code 没有重试此拒绝245* 当上游拒绝 `context_management` 字段或其 `anthropic-beta` 值时,网关会再次收到不带它们的该请求。如果网关在后续请求中再次看到它们且上游再次拒绝,则会进行同样的重试。Claude Code 通过消息识别此拒绝,例如包含 `context_management: Extra inputs are not permitted` 的消息。在 v2.1.304 之前,Claude Code 没有重试此拒绝

243* 当上游拒绝 `defer_loading` 以外的 beta 工具字段(例如 `strict`)时,`400` 会到达开发者。在此之前,网关可能会再次收到[不带工具搜索字段](#retry-without-tool-search)的该请求。若要停止发送此类字段,请让开发者设置 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`](#disable-pre-release-capabilities)246* 当上游拒绝 `defer_loading` 以外的 beta 工具字段(例如 `strict`)时,`400` 会到达开发者。在此之前,网关可能会再次收到[不带工具搜索字段](#retry-without-tool-search)的该请求。若要停止发送此类字段,请让开发者设置 [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`](#disable-pre-release-capabilities)

244 247 

Details

470如果名称没有到达,请检查是否存在以下原因之一:470如果名称没有到达,请检查是否存在以下原因之一:

471 471 

472* **您在运行 Desktop 的计算机上设置了它**:Desktop 不会将您在那里设置的值传递给 SSH 会话472* **您在运行 Desktop 的计算机上设置了它**:Desktop 不会将您在那里设置的值传递给 SSH 会话

473* **您在登录文件中导出了它**:只有登录 shell 会读取 `/etc/profile` 之类的文件。您在其中 `export` 的值会传递给从登录 shell 启动的 Claude Code。它不会传递到 Desktop SSH 会话,因为 Desktop 不通过登录 shell 启动 Claude Code。473* **您在 `/etc/profile` 或其他只有登录 shell 才会读取的文件中导出了它**:从登录 shell 运行 `claude` 时名称会到达,但在 Desktop SSH 会话中不会。Desktop 不通过登录 shell 启动 Claude Code。请改为在远程机器上的[托管设置文件](https://code.claude.com/docs/zh-CN/desktop.md#managed-settings)中的 `env` 下设置该变量。

474* **某个值内部包含空格**:此时 Claude Code 不会将任何键复制到事件或数据点上,也不会报告错误。[从值中去掉空格](#multi-team-organization-support)。474* **某个值内部包含空格**:此时 Claude Code 不会将任何键复制到事件或数据点上,也不会报告错误。[从值中去掉空格](#multi-team-organization-support)。

475* **其他来源已经设置了该变量**:在桌面应用启动的会话中,启动环境中已设置的变量[优先于设置文件](https://code.claude.com/docs/zh-CN/settings-reference.md#how-env-values-interact-with-your-shell)。[调试日志](https://code.claude.com/docs/zh-CN/debug-your-config.md)会列出每个被忽略的变量。当第三方 Desktop 部署在其提供的环境中[指定 OTLP 端点](#how-managed-settings-lock-the-otlp-destination)时,该环境会带有 Desktop 自己的 `OTEL_RESOURCE_ATTRIBUTES`。475* **其他来源已经设置了该变量**:在桌面应用启动的会话中,启动环境中已设置的变量[优先于设置文件](https://code.claude.com/docs/zh-CN/settings-reference.md#how-env-values-interact-with-your-shell)。[调试日志](https://code.claude.com/docs/zh-CN/debug-your-config.md)会列出每个被忽略的变量。当第三方 Desktop 部署在其提供的环境中[指定 OTLP 端点](#how-managed-settings-lock-the-otlp-destination)时,该环境会带有 Desktop 自己的 `OTEL_RESOURCE_ATTRIBUTES`。

476 476 


1403* `pre_tokens`:压缩前的大致 token 数量1403* `pre_tokens`:压缩前的大致 token 数量

1404* `post_tokens`:压缩后的大致 token 数量1404* `post_tokens`:压缩后的大致 token 数量

1405* `error`:压缩失败时的错误消息1405* `error`:压缩失败时的错误消息

1406* `precompute_reuse`:仅在 `trigger` 为 `"manual"` 时,或针对[空闲压缩](https://code.claude.com/docs/zh-CN/settings-reference.md#idlecompaction)(其 `trigger` 报告为 `"auto"`)时设置。自动压缩可以在上下文窗口填满之前在后台准备摘要,此属性记录压缩是否重用了该预先准备的摘要。`"hit"` 表示已重用;`"miss_custom_instructions"`、`"miss_hook"` 和 `"miss_not_ready"` 给出改为重新计算摘要的原因1406* `precompute_reuse`:仅在 `trigger` 为 `"manual"` 时设置,或在交互式终端会话中进行[空闲压缩](https://code.claude.com/docs/zh-CN/settings-reference.md#idlecompaction)且 `trigger` 为 `"auto"` 时设置。自动压缩可以在上下文窗口填满之前在后台预先准备摘要,此属性记录压缩是否复用了该预先准备的摘要。`"hit"` 表示已复用;`"miss_custom_instructions"`、`"miss_hook"` 和 `"miss_not_ready"` 给出改为重新计算摘要的原因

1407 1407 

1408#### 子代理完成事件1408#### 子代理完成事件

1409 1409 

Details

248 248 

249**Web and mobile**249**Web and mobile**

250 250 

251在 [claude.ai/code](https://claude.ai/code) 上,使用输入框旁边的模式下拉菜单。在移动应用中,点击输入框中的 **+** 按钮,然后点击 **Permission**。云端会话和 Remote Control 会话提供不同的权限模式:251在 [claude.ai/code](https://claude.ai/code) 上,使用输入框下方那一行中的模式下拉菜单。在移动应用中,点击输入框中的 **+** 按钮,然后点击 **Permission**。云端会话和 Remote Control 会话提供不同的权限模式:

252 252 

253* **[云端会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md)**:Accept edits、Plan 和 Auto。Accept edits 对应于 `default` 模式:云端会话预先批准文件编辑,无论模式如何,因此下拉菜单显示 Accept edits 而不是 Manual。云端会话仍然遵守设置中的 `defaultMode: "acceptEdits"`。Auto 模式仅在您的组织允许且所选模型支持时出现。Bypass permissions 不可用。253* **[云端会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md)**:Accept edits、Plan 和 Auto。Accept edits 对应于 `default` 模式:云端会话预先批准文件编辑,无论模式如何,因此下拉菜单显示 Accept edits 而不是 Manual。云端会话仍然遵守设置中的 `defaultMode: "acceptEdits"`。Auto 模式仅在您的组织允许且所选模型支持时出现。Bypass permissions 不可用。

254* 您本地机器上的 **[Remote Control](https://code.claude.com/docs/zh-CN/remote-control.md) 会话**:Manual、Accept edits、Plan 和 Auto(对于您自己启动的会话),您无法从应用中选择 Bypass permissions。要使用 Auto,会话必须满足自动模式的[可用性要求](#eliminate-prompts-with-auto-mode)。对于在您的计算机上运行的项目线程,请参阅[在您自己的计算机上运行线程](https://code.claude.com/docs/zh-CN/claude-projects.md#run-a-thread-on-your-own-computer)。254* 您本地机器上的 **[Remote Control](https://code.claude.com/docs/zh-CN/remote-control.md) 会话**:Manual、Accept edits、Plan 和 Auto(对于您自己启动的会话),您无法从应用中选择 Bypass permissions。要使用 Auto,会话必须满足自动模式的[可用性要求](#eliminate-prompts-with-auto-mode)。对于在您的计算机上运行的项目线程,请参阅[在您自己的计算机上运行线程](https://code.claude.com/docs/zh-CN/claude-projects.md#run-a-thread-on-your-own-computer)。

permissions.md +1 −1

Details

79| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp` |79| `acceptEdits` | 自动接受工作目录或 `additionalDirectories` 中路径的文件编辑和常见文件系统命令,例如 `mkdir`、`touch`、`mv` 和 `cp` |

80| `plan` | Claude 读取文件并运行只读 shell 命令来探索,但不编辑您的源文件;在[自动模式](https://code.claude.com/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)可用的情况下,分类器批准的命令也会运行。在 CLI 和 VS Code 扩展中标记为 Plan |80| `plan` | Claude 读取文件并运行只读 shell 命令来探索,但不编辑您的源文件;在[自动模式](https://code.claude.com/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)可用的情况下,分类器批准的命令也会运行。在 CLI 和 VS Code 扩展中标记为 Plan |

81| `auto` | 无需常规提示即可运行;在 shell 命令和网络请求等操作运行之前,后台[分类器](https://code.claude.com/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)会检查它们是否与您的请求一致 |81| `auto` | 无需常规提示即可运行;在 shell 命令和网络请求等操作运行之前,后台[分类器](https://code.claude.com/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)会检查它们是否与您的请求一致 |

82| `dontAsk` | 自动拒绝每个会导致提示的调用,但您安装的 [mod](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md) 仍可以批准其中的部分调用。您的工作目录中的文件读取和其他不需要批准的操作仍会运行,通过 `/permissions` 或 `permissions.allow` 规则预先批准的工具也会运行。`AskUserQuestion`、标记为 [`requiresUserInteraction`](https://code.claude.com/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、[从网络路径读取](#network-paths),以及[您的组织设置为 `ask`](https://code.claude.com/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具,在该设置到达 Claude Code 的会话中即使您已允许它们也会被拒绝 |82| `dontAsk` | 自动拒绝每个会导致提示的调用,但您安装的 [mod](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md) 仍可以批准其中的部分调用。您的工作目录中的文件读取和其他不需要批准的操作仍会运行,通过 `/permissions` 或 `permissions.allow` 规则预先批准的工具也会运行。`AskUserQuestion`、标记为 [`requiresUserInteraction`](https://code.claude.com/docs/zh-CN/mcp#require-approval-for-a-specific-tool) 的 MCP 工具、[从网络路径读取](#network-paths),以及在该设置到达 Claude Code 的会话中[您的组织设置为 `ask`](https://code.claude.com/docs/zh-CN/mcp#organization-controls-on-connector-tools) 的连接器工具,即使您已允许它们也会被拒绝 |

83| `bypassPermissions` | 跳过权限提示,除了[任何模式都不会自动批准的操作](https://code.claude.com/docs/zh-CN/permission-modes.md#actions-no-mode-auto-approves) |83| `bypassPermissions` | 跳过权限提示,除了[任何模式都不会自动批准的操作](https://code.claude.com/docs/zh-CN/permission-modes.md#actions-no-mode-auto-approves) |

84 84 

85> [!WARNING]85> [!WARNING]

Details

584 584 

585monitor 的命令在其启动位置和可以引用的内容方面受到限制:585monitor 的命令在其启动位置和可以引用的内容方面受到限制:

586 586 

587* **仅限交互式会话**:插件 monitor 在交互式会话中启动,从不在使用 `-p` 标志的非交互模式中启动。在 API 提供商或遥测设置导致 [Monitor 工具](https://code.claude.com/docs/zh-CN/tools-reference.md#monitor-tool) 不可用的会话中,它们也不会启动587* **交互式会话**:插件 monitor 不会在使用 `-p` 标志的非交互模式中启动

588* **最低版本**:在 Amazon Bedrock、Claude Platform on AWS、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上,或设置了 `DISABLE_TELEMETRY` 或 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 时,monitor 需要 Claude Code v2.1.310 或更高版本。该要求在 [功能标志获取](https://code.claude.com/docs/zh-CN/env-vars.md#features-that-need-feature-flag-fetching) 关闭时适用

588* **无用户配置**:`command` 从环境中获取 [路径变量](#path-variables-and-persistent-data) 和 `${ENV_VAR}`,但从不获取 `${user_config.*}`。引用一个的 monitor 不启动,monitor 进程也不接收 `CLAUDE_PLUGIN_OPTION_<KEY>`589* **无用户配置**:`command` 从环境中获取 [路径变量](#path-variables-and-persistent-data) 和 `${ENV_VAR}`,但从不获取 `${user_config.*}`。引用一个的 monitor 不启动,monitor 进程也不接收 `CLAUDE_PLUGIN_OPTION_<KEY>`

589* **会话中期禁用**:如果你在会话中期禁用插件,Claude Code 不会停止已经运行的 monitors。它们在会话结束时停止590* **会话中期禁用**:如果你在会话中期禁用插件,Claude Code 不会停止已经运行的 monitors。它们在会话结束时停止

590 591 


647 648 

648在数据目录路径中,`<id>` 是插件标识符,每个字符除了字母、数字、`_` 和 `-` 被替换为 `-`,所以 `my-plugin@my-marketplace` 变成 `my-plugin-my-marketplace`。649在数据目录路径中,`<id>` 是插件标识符,每个字符除了字母、数字、`_` 和 `-` 被替换为 `-`,所以 `my-plugin@my-marketplace` 变成 `my-plugin-my-marketplace`。

649 650 

650在 Windows 上,替换的路径使用正斜杠,所以 shell 不将反斜杠读取为转义。651在 Windows 上,大多数替换的路径使用正斜杠,例如 `C:/Users/you/...`。在 [exec 形式的 hook](https://code.claude.com/docs/zh-CN/hooks.md#exec-form-and-shell-form) 以及通过 PowerShell 运行的 hook 中,它们保留原生的反斜杠;在未安装 Git Bash 时,PowerShell 是 Windows 上的默认 shell。

651 652 

652### 将依赖项安装到数据目录653### 将依赖项安装到数据目录

653 654 

Details

148 148 

149当两个名称不同且有人按清单名称安装时,Claude Code 报告 `Plugin "<manifest-name>" not found in marketplace "<marketplace>"`。保持两个名称相同。有关 Claude Code 如何使用这两个名称的更多信息,请参阅[Plugin 加载参考](https://code.claude.com/docs/zh-CN/plugins/loading.md#find-where-a-plugin-came-from)。149当两个名称不同且有人按清单名称安装时,Claude Code 报告 `Plugin "<manifest-name>" not found in marketplace "<marketplace>"`。保持两个名称相同。有关 Claude Code 如何使用这两个名称的更多信息,请参阅[Plugin 加载参考](https://code.claude.com/docs/zh-CN/plugins/loading.md#find-where-a-plugin-came-from)。

150 150 

151### 避免将未使用的子模块拉入克隆

152 

153当有人添加您的市场时,Claude Code 会克隆该仓库,并且只获取包含插件文件的 git 子模块。需要 Claude Code v2.1.295 或更高版本。

154 

155您可以通过每个插件的放置位置来决定 Claude Code 获取哪些子模块:

156 

157* **位于子目录中的插件**:Claude Code 会获取插件目录内的子模块,以及包含该插件的子模块。将插件需要的子模块放在插件目录内,并将不需要的子模块放在目录外

158* **位于市场根目录的插件**:只要插件的某个文件引用了任一子模块内的路径,Claude Code 就会获取仓库中的所有子模块。如果您的仓库中有一个仅供构建使用的大型子模块,请将插件移到子目录中

159 

160如果位于根目录的插件运行来自子模块的文件,请在插件的 hook 或服务器配置中完整写出该文件的路径,例如 `${CLAUDE_PLUGIN_ROOT}/vendor/tool/run.sh`。Claude Code 会读取这些路径来判断插件是否需要这些子模块。它无法识别脚本在运行时拼接出的路径。

161 

162有关完整规则,请参阅[市场仓库中的 Git 子模块](https://code.claude.com/docs/zh-CN/plugins/marketplace-reference.md#git-submodules-in-the-marketplace-repository)。

163 

151## 选择 plugin 源164## 选择 plugin 源

152 165 

153`marketplace.json` 中的每个 plugin 条目都有一个 `source`,告诉 Claude Code 从哪里获取那个 plugin。根据 plugin 文件的存储位置选择源。该表列出了大多数 marketplace 所有者使用的源。166`marketplace.json` 中的每个 plugin 条目都有一个 `source`,告诉 Claude Code 从哪里获取那个 plugin。根据 plugin 文件的存储位置选择源。该表列出了大多数 marketplace 所有者使用的源。

Details

111告诉用户每个协议在他们的机器上需要什么:111告诉用户每个协议在他们的机器上需要什么:

112 112 

113* **SSH**:密钥必须在没有密码提示的情况下工作,例如因为它被加载到 `ssh-agent` 中。主机必须已经在 `known_hosts` 中。113* **SSH**:密钥必须在没有密码提示的情况下工作,例如因为它被加载到 `ssh-agent` 中。主机必须已经在 `known_hosts` 中。

114* **HTTPS**:Claude Code 保持用户的 git 凭证助手启用,但禁止它提示。助手已经存储的凭证有效;它必须要求的凭证失败。在 GitHub 上,`gh auth login` 后跟 `gh auth setup-git` 存储一个。114* **HTTPS**:Claude Code 会保持用户的 git 凭据助手处于启用状态,但禁止其进行提示,并且不会运行 askpass 程序,例如在 `GIT_ASKPASS` 中设置的程序。助手已存储的凭据可以正常使用;需要助手询问才能获得的凭据则会失败。在 GitHub 上,先运行 `gh auth login`,再运行 `gh auth setup-git`,即可存储凭据。

115 115 

116对于 GitHub Enterprise Server 主机,用户需要从他们的机器访问该主机的 git 访问权限。有关每个 Claude Code 表面需要到达 GHES 托管的 marketplace 的内容,请参阅 [GHES 上的插件 marketplace](https://code.claude.com/docs/zh-CN/github-enterprise-server.md#plugin-marketplaces-on-ghes)。116对于 GitHub Enterprise Server 主机,用户需要从他们的机器访问该主机的 git 访问权限。有关每个 Claude Code 表面需要到达 GHES 托管的 marketplace 的内容,请参阅 [GHES 上的插件 marketplace](https://code.claude.com/docs/zh-CN/github-enterprise-server.md#plugin-marketplaces-on-ghes)。

117 117 

Details

238 238 

239私有市场是您需要凭证才能克隆的存储库中的市场,在 GitHub 或任何其他 git 主机上。您使用与公共市场相同的 `/plugin marketplace add` 或 `claude plugin marketplace add` 命令添加它。Claude Code 使用已在您的机器上的 git 凭证克隆它,从不提示,因此每种连接方式都有要求:239私有市场是您需要凭证才能克隆的存储库中的市场,在 GitHub 或任何其他 git 主机上。您使用与公共市场相同的 `/plugin marketplace add` 或 `claude plugin marketplace add` 命令添加它。Claude Code 使用已在您的机器上的 git 凭证克隆它,从不提示,因此每种连接方式都有要求:

240 240 

241* **HTTPS**:您的 git 凭证助手适用,因此您使用 `gh auth login`、macOS Keychain 或 `git-credential-store` 设置的访问权限有效。交互式提示被抑制,因此您从未认证过的主机失败而不是要求密码。241* **HTTPS**:您的 git 凭据助手适用,因此您使用 `gh auth login`、macOS Keychain 或 `git-credential-store` 设置的访问权限有效。git 的提示和 askpass 程序均被关闭,包括在 `GIT_ASKPASS` 中设置的程序,因此当 git 需要询问凭据时,克隆会直接失败而不是提示。

242* **SSH**:主机必须已在您的 `known_hosts` 文件中,密钥必须在没有密码短语提示的情况下工作。如果您的 git 设置在 `GIT_SSH_COMMAND`、`GIT_SSH` 或您的 git 配置的 `core.sshCommand` 中命名 SSH 程序,Claude Code 运行该程序。242* **SSH**:主机必须已在您的 `known_hosts` 文件中,密钥必须在没有密码短语提示的情况下工作。如果您的 git 设置在 `GIT_SSH_COMMAND`、`GIT_SSH` 或您的 git 配置的 `core.sshCommand` 中命名 SSH 程序,Claude Code 运行该程序。

243* **GitHub `owner/repo` shorthand**:Claude Code 检查您的 SSH 密钥是否向 `github.com` 认证,如果认证则通过 SSH 克隆,如果不认证则通过 HTTPS 克隆。设置 [`CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`](https://code.claude.com/docs/zh-CN/env-vars#variables) 以跳过该检查并始终通过 HTTPS 克隆。243* **GitHub `owner/repo` shorthand**:Claude Code 检查您的 SSH 密钥是否向 `github.com` 认证,如果认证则通过 SSH 克隆,如果不认证则通过 HTTPS 克隆。设置 [`CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`](https://code.claude.com/docs/zh-CN/env-vars#variables) 以跳过该检查并始终通过 HTTPS 克隆。

244 244 

Details

41* **设置声明但 `known_marketplaces.json` 缺少的市场**:Claude Code 克隆它,然后重新加载插件并下载未缓存的已启用插件41* **设置声明但 `known_marketplaces.json` 缺少的市场**:Claude Code 克隆它,然后重新加载插件并下载未缓存的已启用插件

42* **声明的市场其源在设置中更改**:Claude Code 从新源重新获取它并显示 `Plugins changed. Run /reload-plugins to activate.`42* **声明的市场其源在设置中更改**:Claude Code 从新源重新获取它并显示 `Plugins changed. Run /reload-plugins to activate.`

43 43 

44既未被任何路径获取且没有可用缓存目录的已启用插件在 `/plugin` **Errors** 选项卡中显示 `Plugin "<name>" not cached at <path>`,`claude plugin list` 在同一行添加 `— run /plugin to refresh`。有关修复,请参阅[`Plugin "<name>" not cached at <path>`](https://code.claude.com/docs/zh-CN/plugins/troubleshooting#plugin-not-cached-at)。44既未被任何路径获取且没有可用缓存目录的已启用插件会在 `/plugin` **Errors** 选项卡中显示 `Plugin "<name>" not cached at <path>`。有关修复,请参阅[`Plugin "<name>" not cached at <path>`](https://code.claude.com/docs/zh-CN/plugins/troubleshooting#plugin-not-cached-at)。

45 45 

46## 查找插件的来源46## 查找插件的来源

47 47 

Details

155| `workflows` | Path, or array of paths | [Workflow](https://code.claude.com/docs/zh-CN/workflows.md#distribute-a-workflow-in-a-plugin) `.js` 文件或目录。替换默认 `workflows/` 扫描 |155| `workflows` | Path, or array of paths | [Workflow](https://code.claude.com/docs/zh-CN/workflows.md#distribute-a-workflow-in-a-plugin) `.js` 文件或目录。替换默认 `workflows/` 扫描 |

156| `experimental` | Object | `themes`、`monitors` 和 `evals` 的容器,其 manifest 形式可能仍会改变 |156| `experimental` | Object | `themes`、`monitors` 和 `evals` 的容器,其 manifest 形式可能仍会改变 |

157| `experimental.themes` | Path, or array of paths | 主题文件或目录。替换默认 `themes/` 扫描。顶级 `themes` 键仍然加载,带有 `claude plugin validate` 警告 |157| `experimental.themes` | Path, or array of paths | 主题文件或目录。替换默认 `themes/` 扫描。顶级 `themes` 键仍然加载,带有 `claude plugin validate` 警告 |

158| [`experimental.monitors`](#monitors) | Path, or inline array | 包含 monitors 数组的 `.json` 文件,或数组本身。默认为 `monitors/monitors.json`。顶级 `monitors` 键仍然加载,带有 `claude plugin validate` 警告。Monitors 仅在交互式会话中运行,不在 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上运行 |158| [`experimental.monitors`](#monitors) | Path, or inline array | 包含 monitors 数组的 `.json` 文件,或数组本身。默认为 `monitors/monitors.json`。顶级 `monitors` 键仍然加载,带有 `claude plugin validate` 警告。Monitors [在使用 `-p` 标志时不会启动](https://code.claude.com/docs/zh-CN/plugins/components#monitors) |

159| `experimental.evals` | Path, or array of paths | 当不是默认 `evals/` 时,保存 plugin 的[评估案例](https://code.claude.com/docs/zh-CN/plugin-evals.md#use-a-different-eval-directory)的目录。`claude plugin eval --eval-dir` 覆盖它 |159| `experimental.evals` | Path, or array of paths | 当不是默认 `evals/` 时,保存 plugin 的[评估案例](https://code.claude.com/docs/zh-CN/plugin-evals.md#use-a-different-eval-directory)的目录。`claude plugin eval --eval-dir` 覆盖它 |

160 160 

161在"类型"列中,路径是相对于 plugin 根目录的字符串,例如 `"./custom/commands"`。161在"类型"列中,路径是相对于 plugin 根目录的字符串,例如 `"./custom/commands"`。


606}606}

607```607```

608 608 

609在 Windows 上,替换的路径使用正斜杠,因此 shell 不会将反斜杠读取为转义。609在 Windows 上,大多数替换的路径使用正斜杠,例如 `C:/Users/you/...`。在 [exec 形式 hook](https://code.claude.com/docs/zh-CN/hooks.md#exec-form-and-shell-form) 以及通过 PowerShell 运行的 hook 中,它们会保留原生的反斜杠;未安装 Git Bash 时,PowerShell 是 Windows 上的默认 shell。

610 610 

611## 标准布局611## 标准布局

612 612 

Details

172* **`url`**:Claude Code 仅获取 `marketplace.json`,所以相对路径无法解析。给每个插件一个对象源,如 `github` 或 `git-subdir`。172* **`url`**:Claude Code 仅获取 `marketplace.json`,所以相对路径无法解析。给每个插件一个对象源,如 `github` 或 `git-subdir`。

173* **`settings`**:相对路径被直接拒绝。173* **`settings`**:相对路径被直接拒绝。

174 174 

175#### Git submodules in the marketplace repository

176 

177当 Claude Code 克隆市场仓库时,它只获取包含插件文件的 git 子模块。需要 Claude Code v2.1.295 或更高版本。

178 

179早期版本会获取所有子模块,包括嵌套的子模块。如果仓库中有大型子模块,Claude Code 在获取它时可能会超出[克隆超时](https://code.claude.com/docs/zh-CN/plugins/troubleshooting.md#git-clone-timed-out-after-120s)。

180 

181对于位于子目录中的插件(如 `./plugins/formatter`),Claude Code 在以下情况下获取子模块:

182 

183* **插件位于子模块内**:子模块是插件的目录或其上级目录

184* **子模块位于插件内**:子模块位于插件目录下的任意位置

185* **符号链接指向子模块内部**:提交到仓库的链接的目标位于子模块中

186 

187位于市场根目录的插件(`"source": "./"`)要么获取仓库中的所有子模块,要么一个都不获取。当以下任一项指向任何子模块内部时,Claude Code 获取所有子模块:

188 

189* **组件目录**:根目录下存放插件组件的目录,如 `skills/`、`hooks/` 或 `bin/`

190* **插件配置中的路径**:插件的市场条目、其 `plugin.json` 或配置文件(如 `.mcp.json` 或 `hooks/hooks.json`)中的路径

191* **符号链接**:提交到仓库的链接

192* **插件文件中的文本**:写在配置文件中或组件目录下某个文件中的子模块路径,如 `vendor/tool`

193 

194当以上各项都不指向子模块时,Claude Code 不为该插件获取任何子模块。既是项目又是插件的仓库通常含有仅供项目构建使用的子模块,此规则会将它们排除在外。

195 

196在无法判断哪些子模块包含插件文件时,Claude Code 也会获取所有子模块,例如:

197 

198* **根目录下的 `SKILL.md`**:此时整个仓库就是一个 skill 的目录

199* **Claude Code 无法读取的文件**:市场文件、插件的某个配置文件或 `.gitmodules`

200 

201如果您使用 `--sparse` 添加市场,或其源设置了 `sparsePaths`,Claude Code 只检出其中指定的目录,不获取任何子模块。早期版本也是如此。

202 

203要将插件未使用的子模块排除在克隆之外,请参阅[将未使用的子模块排除在克隆之外](https://code.claude.com/docs/zh-CN/plugins/create-marketplace.md#keep-unused-submodules-out-of-the-clone)。

204 

175#### Bare names under pluginRoot205#### Bare names under pluginRoot

176 206 

177裸名是一个没有 `/` 的单个目录名,如 `"formatter"`。要写裸名而不是 `./` 路径,设置 [`metadata.pluginRoot`](#top-level-fields) 为它们解析的目录。使用 `"pluginRoot": "./plugins"`,`"source": "formatter"` 解析为 `./plugins/formatter`。需要 Claude Code v2.1.239 或更高版本。207裸名是一个没有 `/` 的单个目录名,如 `"formatter"`。要写裸名而不是 `./` 路径,设置 [`metadata.pluginRoot`](#top-level-fields) 为它们解析的目录。使用 `"pluginRoot": "./plugins"`,`"source": "formatter"` 解析为 `./plugins/formatter`。需要 Claude Code v2.1.239 或更高版本。

Details

313 313 

314#### 被拒绝的调用返回什么314#### 被拒绝的调用返回什么

315 315 

316在结果中,`<reason>` 代表 `the session was stopped and nobody has sent input since`:316在结果中,`<reason>` 代表调用被拒绝的原因。在中断之后,该原因为 `the session was stopped and nobody has sent input since`。有关其他原因,请参阅[在 `claude -p` 运行和 Agent SDK 会话中被拒绝的调用](#calls-refused-in-non-interactive-runs)。

317 317 

318| 部分被拒绝的调用 | 用户下一次输入之前的结果 |318| 部分被拒绝的调用 | 结果 |

319| :- | :- |319| :- | :- |

320| `$.prompt.submit` | 解析为 `{ drop: '<reason>' }`,且不会将任何提示词排队 |320| `$.prompt.submit` | 解析为 `{ drop: '<reason>' }`,且不会将任何提示词排队 |

321| `$.command.run` | 以一个消息以 `<reason>` 结尾的错误 reject |321| `$.command.run` | 以一个消息以 `<reason>` 结尾的错误 reject |


324| 向 [agent team](https://code.claude.com/docs/zh-CN/agent-teams.md) 队友调用 `$.session.send` | 解析为 `{ isDelivered: false, reason: 'Teammate "<name>" was not messaged: <reason>.' }`,其中 `<name>` 是队友的名称 |324| 向 [agent team](https://code.claude.com/docs/zh-CN/agent-teams.md) 队友调用 `$.session.send` | 解析为 `{ isDelivered: false, reason: 'Teammate "<name>" was not messaged: <reason>.' }`,其中 `<name>` 是队友的名称 |

325| 对带有 `run_in_background: true` 的 Bash、Monitor 或 CronCreate 调用 [`$.tool.call`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#mods-api-methods) | 解析为 `{ deny: '<tool> was not run: it starts background work, a schedule or a goal, and <reason>' }`,其中 `<tool>` 是工具的名称 |325| 对带有 `run_in_background: true` 的 Bash、Monitor 或 CronCreate 调用 [`$.tool.call`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#mods-api-methods) | 解析为 `{ deny: '<tool> was not run: it starts background work, a schedule or a goal, and <reason>' }`,其中 `<tool>` 是工具的名称 |

326 326 

327伴随这些 `$.session.send` 和 `$.tool.call` 结果,用户可能会看到 [`Stopped:` toast](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot#stopped-type-a-message-to-continue)。327当这些 `$.session.send` 或 `$.tool.call` 调用之一在交互式会话中因中断而被拒绝时,用户可能会看到 [`Stopped:` toast](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot#stopped-type-a-message-to-continue)。

328 328 

329#### 您的 mod 在中断前启动的工作329#### 您的 mod 在中断前启动的工作

330 330 


341 341 

342当计划作业到期或监视器在用户下一次输入之前触发事件时,用户可能会看到 [`Stopped:` toast](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot#stopped-type-a-message-to-continue)。342当计划作业到期或监视器在用户下一次输入之前触发事件时,用户可能会看到 [`Stopped:` toast](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot#stopped-type-a-message-to-continue)。

343 343 

344### 在 `claude -p` 运行和 Agent SDK 会话中被拒绝的调用

345 

346在 `claude -p` 运行或 [Agent SDK](https://code.claude.com/docs/zh-CN/agent-sdk/overview.md) 会话中,诸如 `{ drop: 'the run reached its --max-turns limit' }` 这样的结果表示该运行拒绝了您的 mod 的调用。

347 

348被拒绝的 `$.prompt.submit` 解析为 `{ drop: '<reason>' }`。其他被拒绝的调用,例如 `$.command.run` 和 `$.agent.spawn`,会给出[被拒绝的调用返回什么](#what-refused-calls-return)中所示的结果,其中 `<reason>` 替换为相应的原因。在下方找到您的 `<reason>`,了解如何处理:

349 

350* **`the run reached its --max-turns limit`**:来自您的 mod 的提示词以及它生成的子代理所产生的轮次都会计入 [`--max-turns`](https://code.claude.com/docs/zh-CN/cli-reference#cli-flags) 或 Agent SDK 的[轮次限制](https://code.claude.com/docs/zh-CN/agent-sdk/configuration.md#limit-turns-and-spend)。如需更多轮次,请使用更高的限制启动运行。如果无法这样做,请让您的 mod 停止发起被拒绝的调用。如果运行从用户或 SDK 应用程序接收到另一个提示词,轮次计数会重置,运行会再次接受调用。

351* **`the run is past its --max-budget-usd limit`**:使用更高的 `--max-budget-usd` 启动运行,或提高 Agent SDK 的[花费限制](https://code.claude.com/docs/zh-CN/agent-sdk/configuration.md#limit-turns-and-spend)。如果无法这样做,请让您的 mod 停止发起被拒绝的调用。该限制适用于运行到目前为止的总花费。当运行接收到另一个提示词时,该总额会继续累加,因此重试会返回相同的原因。

352* **`the host has ended its input`**:例如,SDK 应用程序结束了其[流式输入](https://code.claude.com/docs/zh-CN/agent-sdk/streaming-vs-single-mode.md),或者使用 [`--input-format stream-json`](https://code.claude.com/docs/zh-CN/cli-reference#cli-flags) 启动的运行的 stdin 已关闭。运行正在结束,不再接受任何输入,因此重试会返回相同的原因。请让您的 mod 停止发起被拒绝的调用。如果运行由您自己启动,下次请保持该输入打开,直到您的 mod 不再需要发起调用。

353* **`the session was stopped and nobody has sent input since`**:运行被[中断](#calls-and-background-work-after-the-user-interrupts-a-turn),例如通过 Agent SDK 的 [`interrupt()`](https://code.claude.com/docs/zh-CN/agent-sdk/typescript#query-object)。要在用户或 SDK 应用程序的下一条消息之后再次发起调用,请按照[重试被拒绝或被丢弃的调用](#retry-a-refused-or-dropped-call)操作。

354 

355### 加载您的 mod 的 `claude -p` 运行永不退出

356 

357如果您的 mod 在每个轮次结束时都提交一个提示词,则每个提示词都会启动另一个轮次。如果没有 [`--max-turns`](https://code.claude.com/docs/zh-CN/cli-reference#cli-flags) 或 `--max-budget-usd`,加载该 mod 的 `claude -p` 运行会一直持续,直到您自己将其停止。

358 

359要让运行自行结束,请在 shell 中为命令添加其中任一标志。如果由其他人启动运行,请让您的 mod 在完成工作后停止提交提示词。以下命令添加了 `--max-turns`:

360 

361```bash theme={null}

362claude -p "find the TODOs" --max-turns 5

363```

364 

365一旦运行达到该限制,mod 的下一个提示词会被[拒绝](#calls-refused-in-non-interactive-runs)而不是启动轮次,运行随之结束。

366 

367如果运行仍然超出限制,请在 shell 中运行 `claude --version`,如果您的版本低于 v2.1.304,请[更新 Claude Code](https://code.claude.com/docs/zh-CN/setup.md#update-claude-code)。从 v2.1.299 起,mod 的提示词会在达到限制时被拒绝。如果您的 mod 生成子代理,从 v2.1.304 起,它们的轮次会计入 `--max-turns`。

368 

344## 在会话之间发送和接收消息369## 在会话之间发送和接收消息

345 370 

346mod 可以向您的另一个会话、此会话的子代理之一或其 [agent team](https://code.claude.com/docs/zh-CN/agent-teams.md) 中的队友发送纯文本消息,还可以观察到达和离开的消息。371mod 可以向您的另一个会话、此会话的子代理之一或其 [agent team](https://code.claude.com/docs/zh-CN/agent-teams.md) 中的队友发送纯文本消息,还可以观察到达和离开的消息。


390| `$.http` | `fetch(url, init)` 通过 `http` 或 `https`。它在读取体后解析为 `{ status, ok, headers, text }`。 |415| `$.http` | `fetch(url, init)` 通过 `http` 或 `https`。它在读取体后解析为 `{ status, ok, headers, text }`。 |

391| `$.store` | 您的插件自己的 JSON 键值存储,在会话之间保留 |416| `$.store` | 您的插件自己的 JSON 键值存储,在会话之间保留 |

392| `$.env` | `get` 和 `set` 环境变量。将名称写为文字字符串。 |417| `$.env` | `get` 和 `set` 环境变量。将名称写为文字字符串。 |

393| `$.settings` | `read` 设置文件和托管策略持有的内容 |418| `$.settings` | `read()` 解析为合并成一个对象的全部设置。传入 `{ source }` 或 `{ key }` 时,它改为解析为[单个来源的设置或单个键的值](#read-one-source-or-one-key)。 |

394| `$.session` | `messages()` 将会话记录作为 `{ role, text, toolUses }` 列表返回。还有工作目录、模型等。[`usage()`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#mods-api-methods) 返回上下文窗口使用和计划限制。 |419| `$.session` | `messages()` 将会话记录作为 `{ role, text, toolUses }` 列表返回。还有工作目录、模型等。[`usage()`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#mods-api-methods) 返回上下文窗口使用和计划限制。 |

395| `$.mcp` | `call` 连接的 MCP 服务器上的工具 |420| `$.mcp` | `call` 连接的 MCP 服务器上的工具 |

396 421 


408* **`$.process.spawn started, and a plugin withheld its result:`**:拒绝方 mod 尚未将命令的输出读取到末尾。如果命令仍在运行,Claude Code 会将其停止。433* **`$.process.spawn started, and a plugin withheld its result:`**:拒绝方 mod 尚未将命令的输出读取到末尾。如果命令仍在运行,Claude Code 会将其停止。

409* **`$.process.spawn ran, and a plugin withheld its result:`**:拒绝方 mod 已将命令的输出读取到末尾,因此命令已经退出434* **`$.process.spawn ran, and a plugin withheld its result:`**:拒绝方 mod 已将命令的输出读取到末尾,因此命令已经退出

410 435 

436### 读取全部设置、单个来源或单个键

437 

438`$.settings.read()` 解析为一个对象,其中包含所有正在使用的来源的设置,按[优先级](https://code.claude.com/docs/zh-CN/settings.md#settings-precedence)合并。传入 `{ source }` 可改为读取单个来源,传入 `{ key }` 可读取单个键,也可以同时传入两者:

439 

440| 调用 | 解析为 |

441| :- | :- |

442| `$.settings.read()` | 合并后的设置,作为一个对象。其顶层键与 `settings.json` 文件的顶层键相同,例如 `permissions` 和 `hooks`。 |

443| `$.settings.read({ source: 'policy' })` | 该单个来源的设置,作为一个对象;当该来源不包含任何设置时为 `{}` |

444| `$.settings.read({ key: 'spinnerTipsEnabled' })` | 该键在合并后设置中的值;当该键未设置时为 `undefined` |

445| `$.settings.read({ key: 'spinnerTipsEnabled', source: 'user' })` | 该键在该单个来源中的值;当该来源未设置它时为 `undefined` |

446 

447对于 `source`,传入要读取的单个设置来源的名称:

448 

449* **`user`**:`~/.claude/settings.json`

450* **`project`**:`.claude/settings.json`

451* **`local`**:`.claude/settings.local.json`

452* **`flag`**:通过 `--settings` 传入的内容,以及 SDK 的内联设置

453* **`policy`**:[托管设置](https://code.claude.com/docs/zh-CN/managed-settings.md#how-claude-code-combines-managed-sources)

454 

455对于 `key`,传入单个顶层键的确切名称,而不是指向嵌套对象内部的点分路径。`key` 参数需要 Claude Code v2.1.304 或更高版本。

456 

411## 后续步骤457## 后续步骤

412 458 

413* [对事件做出反应](https://code.claude.com/docs/zh-CN/plugins/mods/events.md):hook 工具调用、提示和轮次459* [对事件做出反应](https://code.claude.com/docs/zh-CN/plugins/mods/events.md):hook 工具调用、提示和轮次

Details

46 46 

47**4. 尝试 mod**47**4. 尝试 mod**

48 48 

49使用你请求的内容。对于示例提示,当前分支名称出现在提示框上方。如果 mod 没有做你想要的,告诉 Claude 要改变什么。mod 在每个更改其文件的转折结束时重新加载,所以你可以在 Claude 完成后立即尝试更改。49使用您请求的功能。对于示例提示词,当前分支名称会显示在输入框上方。如果 mod 没有按您的预期工作,请告诉 Claude 需要更改什么。mod 会在每个更改其文件的轮次结束时重新加载,因此 Claude 完成后您就可以立即尝试该更改。

50 

51如果会话记录中以该 mod 名称开头的某一行显示[更改未加载](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot.md#this-mods-change-didnt-load),请在向 Claude 请求修复时将该行粘贴到您的下一条消息中。除非您粘贴,否则 Claude 看不到该行。

50 52 

51### 在其他会话中使用 mod53### 在其他会话中使用 mod

52 54 

Details

93 93 

94## 对 Claude 正在执行的操作设置 hook94## 对 Claude 正在执行的操作设置 hook

95 95 

96处理这些事件,可以在工具调用、提示词或轮次发生时查看或更改它们。有关每个事件以及 hook 可以返回的内容,请参阅[事件参考](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#events)。96处理这些事件,可以在工具调用、提示词、轮次或设置读取发生时查看或更改它们。有关每个事件以及 hook 可以返回的内容,请参阅[事件参考](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#events)。

97 97 

98### 拦截或更改工具调用98### 拦截或更改工具调用

99 99 


115 115 

116当 Claude 尝试执行 `git push --force` 时,该命令不会运行,也不会出现权限提示,因为该 hook 从未调用 `next`。Claude 会将 `deny` 文本作为工具的结果读取,因此请将其写成 Claude 可以据此采取行动的指令。其他所有 Bash 命令的运行方式与没有该 mod 时相同。116当 Claude 尝试执行 `git push --force` 时,该命令不会运行,也不会出现权限提示,因为该 hook 从未调用 `next`。Claude 会将 `deny` 文本作为工具的结果读取,因此请将其写成 Claude 可以据此采取行动的指令。其他所有 Bash 命令的运行方式与没有该 mod 时相同。

117 117 

118如果此 hook 抛出异常或超时,Claude Code 会跳过它,命令会像没有该 mod 时一样继续执行。若要改为拒绝该命令,请为该 hook [添加 `.catch` 处理程序](#handle-a-hook-that-fails)。

119 

118要在工具运行之后执行操作,请 `await next(e)`,完成您的工作,然后返回 `next` 给您的结果。以下 hook 使用 [`$.ui.log`](https://code.claude.com/docs/zh-CN/plugins/mods/api#show-something-without-starting-a-turn) 记录 Claude 更改的每个 `.mdx` 文件,该方法会在会话记录中添加一行 Claude 不会读取的暗色文本:120要在工具运行之后执行操作,请 `await next(e)`,完成您的工作,然后返回 `next` 给您的结果。以下 hook 使用 [`$.ui.log`](https://code.claude.com/docs/zh-CN/plugins/mods/api#show-something-without-starting-a-turn) 记录 Claude 更改的每个 `.mdx` 文件,该方法会在会话记录中添加一行 Claude 不会读取的暗色文本:

119 121 

120```javascript theme={null}122```javascript theme={null}


177* **用户输入答案**:`$.ui.ask` 解析为输入的文本。hook 会将其与 `Run it` 比较,因此任何其他文本都会拒绝该命令。179* **用户输入答案**:`$.ui.ask` 解析为输入的文本。hook 会将其与 `Run it` 比较,因此任何其他文本都会拒绝该命令。

178* **无人回答**:当用户关闭问题或选择 **Chat about this** 时,以及在 `claude -p` 运行中,`$.ui.ask` 会 reject,因此 `catch` 块会将答案保留为 `Refuse`180* **无人回答**:当用户关闭问题或选择 **Chat about this** 时,以及在 `claude -p` 运行中,`$.ui.ask` 会 reject,因此 `catch` 块会将答案保留为 `Refuse`

179 181 

180请将等待保持在诸如 `$.ui.ask` 之类的 mods API 调用内部,因为这段时间不计入 hook 的[时间限制](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#limits)。等待您自己的 promise 所花费的时间则会计入。Claude Code 会跳过超时的 hook,因此被暂缓的命令将会运行。182请将等待保持在诸如 `$.ui.ask` 之类的 mods API 调用内部,因为这段时间不计入 hook 的[时间限制](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#limits)。等待您自己的 promise 所花费的时间则会计入。

183 

184Claude Code 会跳过超时的 hook,因此被暂缓的命令将会运行。若要改为拒绝该命令,请在 `on` 返回的注册对象上链式添加[一个 `.catch` 处理程序](#handle-a-hook-that-fails)。该处理程序与 hook 内部的 `catch` 块是分开的。

181 185 

182#### 在询问用户之前批准或拒绝工具调用186#### 在询问用户之前批准或拒绝工具调用

183 187 


207 211 

208* **在 `main` 上**:即使有规则允许 `git push`,该 hook 也会返回 `deny`212* **在 `main` 上**:即使有规则允许 `git push`,该 hook 也会返回 `deny`

209* **在其他分支上以及对于其他命令**:调用会得到与没有该 mod 时相同的决定213* **在其他分支上以及对于其他命令**:调用会得到与没有该 mod 时相同的决定

214* **hook 抛出异常或超时**:调用同样会得到与没有该 mod 时相同的决定。若要改为拒绝该调用,请[添加一个 `.catch` 处理程序](#handle-a-hook-that-fails),使其返回 `{ decision: 'deny', reason: 'the reason' }`。

210 215 

211该 hook 匹配的是命令文本,因此请将其视为对 Claude 的提醒。要为所有人阻止向 `main` 推送,请在您的 Git 托管平台上保护该分支。216该 hook 匹配的是命令文本,因此请将其视为对 Claude 的提醒。要为所有人阻止向 `main` 推送,请在您的 Git 托管平台上保护该分支。

212 217 


269 274 

270当您发送诸如 `open a PR for this change` 之类的提示词时,您的消息在会话记录中看起来不变,而 Claude 还会在其后读取诸如 `Current branch: feature/auth` 的一行。未提及 Pull Request 的提示词会原样通过,且不会运行 `git`。275当您发送诸如 `open a PR for this change` 之类的提示词时,您的消息在会话记录中看起来不变,而 Claude 还会在其后读取诸如 `Current branch: feature/auth` 的一行。未提及 Pull Request 的提示词会原样通过,且不会运行 `git`。

271 276 

272要阻止提示词,请在不调用 `next` 的情况下返回 `{ drop: 'the reason' }`。文本会返回到用户的提示词输入框中,用户会看到 `Prompt dropped by a hook:` 后跟您的原因,因此请以用户为对象撰写原因。如果您的 hook 在其 `next(e)` 调用已放行提示词之后返回 `drop`,轮次仍会运行,并且该 hook 会[失败](#handle-a-hook-that-fails),错误消息中包含 `a drop after its next() was answered`。277要阻止提示词,请在不调用 `next` 的情况下返回 `{ drop: 'the reason' }`。文本会返回到用户的提示词输入框中,用户会看到 `Prompt dropped by a hook:` 后跟您的原因,因此请以用户为对象撰写原因。在以下情况下,提示词仍会被发送:

278 

279* **您的 hook 在其 `next(e)` 调用已放行提示词之后返回 `drop`**:轮次仍会运行,并且该 hook 会[失败](#handle-a-hook-that-fails),错误消息中包含 `a drop after its next() was answered`

280* **您的 hook 抛出异常或超时**:Claude Code 会跳过它并发送提示词。请[添加 `.catch` 处理程序](#handle-a-hook-that-fails),以免失败时发送了本应被该 hook 阻止的提示词。

273 281 

274[其他事件](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#prompts-and-what-claude-reads)涵盖了 Claude 读取的其余内容:`prompt.section` 用于系统提示词的每个部分,`prompt.context` 用于随第一条消息发送的上下文,`skill.prompt` 用于 skill 的文本。这些 hook 产生的文本如果在请求之间发生变化,会[使提示缓存失效](https://code.claude.com/docs/zh-CN/prompt-caching.md)。在 `skill.prompt` hook 中,您还可以读取[该 skill 来自哪个插件或文件](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#skill-prompt-fields)。282[其他事件](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#prompts-and-what-claude-reads)涵盖了 Claude 读取的其余内容:`prompt.section` 用于系统提示词的每个部分,`prompt.context` 用于随第一条消息发送的上下文,`skill.prompt` 用于 skill 的文本。这些 hook 产生的文本如果在请求之间发生变化,会[使提示缓存失效](https://code.claude.com/docs/zh-CN/prompt-caching.md)。在 `skill.prompt` hook 中,您还可以读取[该 skill 来自哪个插件或文件](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#skill-prompt-fields)。

275 283 


305 313 

306要查看 API 在请求期间自行运行的工具调用(例如对 [advisor 工具](https://code.claude.com/docs/zh-CN/advisor.md)的调用),请读取 `result.serverToolUses`。Claude Code 不会运行这些调用,因此不会为它们触发任何 `tool.call` 或 `tool.check` hook。当响应中没有此类调用时,该字段不存在;该字段需要 Claude Code v2.1.290 或更高版本。314要查看 API 在请求期间自行运行的工具调用(例如对 [advisor 工具](https://code.claude.com/docs/zh-CN/advisor.md)的调用),请读取 `result.serverToolUses`。Claude Code 不会运行这些调用,因此不会为它们触发任何 `tool.call` 或 `tool.check` hook。当响应中没有此类调用时,该字段不存在;该字段需要 Claude Code v2.1.290 或更高版本。

307 315 

316### 更改或拒绝设置读取

317 

318`settings.read` hook 会在 mod 的读取和 Claude Code 自身的读取时运行:

319 

320* **mod 的读取**:某个 mod 调用 [`$.settings.read`](https://code.claude.com/docs/zh-CN/plugins/mods/api#read-one-source-or-one-key)。

321* **Claude Code 自身的读取**:Claude Code 构建会话的合并设置。当设置或已加载的插件发生变化时,此读取会再次进行。

322 

323在依赖任一读取之前,请检查守卫和您的版本:

324 

325* **内置守卫**:存在托管设置时,或者以 Team 或 Enterprise [`/login`](https://code.claude.com/docs/zh-CN/authentication#authentication-precedence) 作为会话的凭据时,[内置守卫](https://code.claude.com/docs/zh-CN/plugins/mods/admin.md#know-what-happens-by-default)可能会跳过您安装或通过 `--plugin-dir` 加载的 mod 中的此 hook。要进行检查,请在[调试日志](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot.md#read-the-debug-log)中搜索 `settings.read bypassed by cc-plugin-sec-default`。如果包含该文本的行指明了您的 mod,请让您组织的管理员[将该 mod 安装为组织的 mod 之一](https://code.claude.com/docs/zh-CN/plugins/mods/admin.md#install-your-organizations-mods)。

326* **版本**:该事件在 Claude Code 自身的读取上触发,以及 `e.layers` 字段,都需要 Claude Code v2.1.304 或更高版本。

327 

328#### `settings.read` hook 接收的内容

329 

330| 字段 | 类型 | 保存的内容 |

331| :- | :- | :- |

332| `e.layers` | array | 每个正在使用且包含设置的来源对应一个 `{ source, settings }` 对象,[优先级](https://code.claude.com/docs/zh-CN/settings.md#settings-precedence)最低的排在最前:`plugin`、`user`、`project`、`local`、`flag`、`policy`。在 `claude plugin test` 中为空。 |

333| `e.source` | string | mod 请求的单个来源,例如 `$.settings.read({ source: 'policy' })`。此时 `e.layers` 仅包含该层。在 Claude Code 自身的读取以及任何其他对合并设置的读取中不存在。 |

334 

335在 `e.layers` 中,`plugin` 保存已启用插件提供的设置,它只是一个层名称,而不是可以传给 `$.settings.read` 的 `source`。`flag` 保存通过 `--settings` 传入的设置,`policy` 保存托管设置。

336 

337#### 区分 Claude Code 自身的读取与 mod 的读取

338 

339在 [Claude Code 自身的读取](#settings-read-hook)中,[`next.origin`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#the-hook-function) 为 `{ plugin: 'engine', tier: 'core' }`;在 mod 的读取中,`next.origin.plugin` 为发起调用的 mod 的名称。

340 

341#### `settings.read` hook 可以返回的内容

342 

343您的 hook 可以原样返回 [`next(e)`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#the-hook-function) 的结果、返回自己的 `{ value }`,或返回 `{ deny: reason }`。在 [Claude Code 自身的读取](#settings-read-hook)和 mod 的读取中,`{ value }` 会替换读取所给出的内容,`{ deny: reason }` 会拒绝该读取:

344 

345| 返回 | 在 Claude Code 自身的读取中 | 在 mod 的读取中 |

346| :- | :- | :- |

347| `{ value }` | 对于您更改的每个键,如果您返回的内容[符合该键的 schema](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot.md#settings-read-key-refused),它会替换会话合并设置中该键的整个值 | 该 mod 的调用会解析为您的 `value`,或解析为从您的 `value` 中取出的、它所请求的 `key`,因此请返回一个完整的对象,而不是数组 |

348| `{ deny: reason }` | 会话保留在任何 hook 作出响应之前合并得到的设置,并且[调试日志会记录您的 `reason`](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot#settings-read-refused) | 该 mod 的调用会以 `<calling mod>: $.settings.read: <reason>` reject |

349 

350在 Claude Code 自身的读取中,请基于 [`next(e)` 的 `value`](#settings-read-next) 构建您的 `{ value }`,因为您遗漏的键会变为未设置。对于 Claude Code 从每个来源分别读取的键(例如 `env`),在您的 `value` 中更改它[不会产生效果](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot.md#settings-read-key-no-effect)。

351 

352#### `next(e)` 提供给 `settings.read` hook 的内容

353 

354`next(e)` 会解析为 `{ value }` 或 `{ deny }`:

355 

356* **`{ value }`**:`value` 是合并后的设置;当设置了 [`e.source`](#settings-read-receives) 时,则是单个来源的设置。如果[在您的 hook 之后运行](#the-order-mods-run-in)的某个 hook 返回了自己的 `{ value }`,您得到的将是该 hook 的 `value`。

357* **`{ deny }`**:在您的 hook 之后运行的某个 hook 拒绝了该读取。请原样返回该 `{ deny }`。

358 

359#### 从 `settings.read` hook 更改一项设置

360 

361首先检查[哪些 mod 会收到此事件,以及从哪个版本开始](#settings-read-hook)。

362 

363要更改一个键,请展开 [`next(e)`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#the-hook-function) 中的 `value` 并设置该键,如下面这个针对 [`spinnerTipsEnabled`](https://code.claude.com/docs/zh-CN/settings-reference#spinnertipsenabled) 的 hook 所示。该 hook 不检查 [`next.origin`](#settings-read-origin),因此它会在 [Claude Code 自身的读取](#settings-read-hook)和 mod 对合并设置的读取中同样更改该键:

364 

365```javascript theme={null}

366on('settings.read', async ($, e, next) => {

367 const read = await next(e)

368 // Pass through a read of one source, so that only the merged settings change.

369 // Pass through a { deny } from a later hook too: it has no value.

370 if (e.source || !read.value) return read

371 // Keep every other key and change this one

372 return { value: { ...read.value, spinnerTipsEnabled: false } }

373})

374```

375 

376在 Claude Code 自身的读取中,如果您的 hook 返回了超出该键 schema 的值(例如字符串),则仅该键会保留在任何 hook 作出响应之前合并得到的值。调试日志随后会显示 [`the answer for <key> is no value the key can hold`](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot#settings-read-key-refused)。如果您的值符合要求但该键仍未更改,请参阅[返回的键为何不产生效果](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot.md#settings-read-key-no-effect)。

377 

308### 处理设置 hook 事件378### 处理设置 hook 事件

309 379 

310设置 hook 是您在设置文件中配置的命令、HTTP、提示词和 Agent hook。每个[设置 hook 事件](https://code.claude.com/docs/zh-CN/hooks.md#hook-events)(例如 `Stop`、`SessionEnd` 或 `PostToolUse`)同时也是一个名为 `classic.` 后跟该设置 hook 事件名称的事件,例如 `classic.Stop`。`e` 是设置 hook 在 stdin 上接收的 JSON,包括 `transcript_path`。380设置 hook 是您在设置文件中配置的命令、HTTP、提示词和 Agent hook。每个[设置 hook 事件](https://code.claude.com/docs/zh-CN/hooks.md#hook-events)(例如 `Stop`、`SessionEnd` 或 `PostToolUse`)同时也是一个名为 `classic.` 后跟该设置 hook 事件名称的事件,例如 `classic.Stop`。`e` 是设置 hook 在 stdin 上接收的 JSON,包括 `transcript_path`。

Details

508* **`Input`**:接受 `onSubmit(value)` 和 `onInput(value)`508* **`Input`**:接受 `onSubmit(value)` 和 `onInput(value)`

509* **`Select`**:接受 `onSelect(value)`,其选项在 `options` 中,这是一个至少包含一个选项且值唯一的列表,例如 `[{ value: 'sm', label: 'Small' }, { value: 'lg', label: 'Large' }]`509* **`Select`**:接受 `onSelect(value)`,其选项在 `options` 中,这是一个至少包含一个选项且值唯一的列表,例如 `[{ value: 'sm', label: 'Small' }, { value: 'lg', label: 'Large' }]`

510 510 

511测试通过控件的 `key` 按下控件或向其输入,因此请为每个控件指定一个。控件的每次使用也会触发 [`ui.press`、`ui.input` 或 `ui.select`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#interface),其中 `key` 在 `e.element` 中,另一个 mod 可以处理这些事件。其 hook 在您的回调之前运行,因此它能看到用户输入到您的 `Input` 中的内容,可以更改它或代替您的回调作出响应。mod API 没有按下另一个 mod 的按钮的方法。511### 哪些控件需要 `key`

512 

513请为每个 `Input` 和 `Select` 指定一个 `key` prop,例如 `key: 'size'`。当 `Button` 具有 `label` prop 或单个字符串子元素时,可以不指定 `key`。此时其键为 `label` 的值或该字符串。

514 

515测试和其他 mod 通过键来识别控件:

516 

517* **测试**:[测试](https://code.claude.com/docs/zh-CN/plugins/mods/test.md#test-a-drawing)通过键按下控件或向其输入。

518* **其他 mod**:Claude Code 在运行控件的回调之前,会触发 [`ui.press`、`ui.input` 或 `ui.select`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#interface),并在 `e.element` 中带上控件的键。另一个 mod 针对该事件的 hook 能看到用户输入到您的 `Input` 中的内容,可以更改该文本或阻止您的回调运行。mod API 没有为该 mod 提供按下您的按钮的方法。

519 

520如果消息显示 `needs a key` 或 `is drawn twice`,请[根据该消息查找原因](https://code.claude.com/docs/zh-CN/plugins/mods/troubleshoot.md#needs-a-key)。

512 521 

513### 键盘焦点和快捷键522### 键盘焦点和快捷键

514 523 

Details

21| `.claude-plugin/plugin.json` | 是 | 插件[清单](https://code.claude.com/docs/zh-CN/plugins/manifest-reference.md)。mod 不会添加任何必需字段。 |21| `.claude-plugin/plugin.json` | 是 | 插件[清单](https://code.claude.com/docs/zh-CN/plugins/manifest-reference.md)。mod 不会添加任何必需字段。 |

22| `hooks/hooks.json` | 是 | `modules`:一个数组,包含一个指向 hook 模块的路径(相对于此文件),如 `"modules": ["./register.js"]`。也可以在 `hooks` 下包含[设置 hook](https://code.claude.com/docs/zh-CN/hooks.md)。 |22| `hooks/hooks.json` | 是 | `modules`:一个数组,包含一个指向 hook 模块的路径(相对于此文件),如 `"modules": ["./register.js"]`。也可以在 `hooks` 下包含[设置 hook](https://code.claude.com/docs/zh-CN/hooks.md)。 |

23| hook 模块,例如 [`hooks/register.js`](https://code.claude.com/docs/zh-CN/plugins/mods/create#write-a-mod-yourself) | 是 | mod 的入口点。导出 `register(on, options)`。文件名以 `.js`、`.mjs`、`.cjs`、`.jsx`、`.ts`、`.mts`、`.cts` 或 `.tsx` 结尾。是一个 ES 模块。 |23| hook 模块,例如 [`hooks/register.js`](https://code.claude.com/docs/zh-CN/plugins/mods/create#write-a-mod-yourself) | 是 | mod 的入口点。导出 `register(on, options)`。文件名以 `.js`、`.mjs`、`.cjs`、`.jsx`、`.ts`、`.mts`、`.cts` 或 `.tsx` 结尾。是一个 ES 模块。 |

24| [`types/index.d.ts`](https://code.claude.com/docs/zh-CN/plugins/mods/interface#declare-the-values),由清单中的 `types` 指定 | 当 mod 使用 `$.state` 或向 mods API 添加命名空间时 | 声明 `PluginState` 值以及 mod 添加的任何命名空间 |24| [`types/index.d.ts`](https://code.claude.com/docs/zh-CN/plugins/mods/interface#declare-the-values),除非清单中的 `types` 指定了其他路径 | 当 mod 使用 `$.state` 或向 mods API 添加命名空间时 | 声明 `PluginState` 值以及 mod 添加的任何命名空间。要在清单中省略 `types`,需要 v2.1.299 或更高版本。 |

25| 名称以 `.test.ts` 或 `.test.tsx` 结尾的文件 | 否 | [`claude plugin test`](https://code.claude.com/docs/zh-CN/plugins/mods/test#write-a-test) 运行的测试 |25| 名称以 `.test.ts` 或 `.test.tsx` 结尾的文件 | 否 | [`claude plugin test`](https://code.claude.com/docs/zh-CN/plugins/mods/test#write-a-test) 运行的测试 |

26 26 

27`register` 接收 `on` 和 `options`。`options` 包含清单所声明的 [`userConfig`](https://code.claude.com/docs/zh-CN/plugins/components#user-configuration) 字段的值,并已填入默认值。27`register` 接收 `on` 和 `options`。`options` 包含清单所声明的 [`userConfig`](https://code.claude.com/docs/zh-CN/plugins/components#user-configuration) 字段的值,并已填入默认值。


110 110 

111### 命令和配置111### 命令和配置

112 112 

113命令和配置事件在命令运行或被列出时,以及 `/config` 行显示或更改时触发:113命令和配置事件在命令运行或被列出时、`/config` 行显示或更改时,以及读取设置时触发:

114 114 

115| 事件 | 触发时机 | hook 可以返回 |115| 事件 | 触发时机 | hook 可以返回 |

116| :- | :- | :- |116| :- | :- | :- |


118| `command.describe` | 每个命令一次,用于命令列表 | `{ description, argumentHint, isHidden }` |118| `command.describe` | 每个命令一次,用于命令列表 | `{ description, argumentHint, isHidden }` |

119| `config.set` | `/config` 行即将更改 | `next({ ...e, value })` 或 `{ deny: reason }` |119| `config.set` | `/config` 行即将更改 | `next({ ...e, value })` 或 `{ deny: reason }` |

120| `config.describe` | 每个 `/config` 行一次 | `{ label, description, isHidden }` |120| `config.describe` | 每个 `/config` 行一次 | `{ label, description, isHidden }` |

121| [`settings.read`](https://code.claude.com/docs/zh-CN/plugins/mods/events#settings-read-hook) | mod 调用 [`$.settings.read`](https://code.claude.com/docs/zh-CN/plugins/mods/api#reach-files-processes-and-the-network),或 Claude Code 构建会话的合并设置时 | `next(e)`、`{ value }` 或 `{ deny: reason }` |

122 

123#### `settings.read` 上的 `e.layers` 和 `e.source`

124 

125* **`e.layers`**:每个正在使用且包含设置的来源对应一个 `{ source, settings }` 对象,[优先级](https://code.claude.com/docs/zh-CN/settings.md#settings-precedence)最低的排在最前。请参阅[`settings.read` hook 接收的内容](https://code.claude.com/docs/zh-CN/plugins/mods/events#settings-read-receives)。

126* **`e.source`**:mod 所请求的那一个来源,如 `$.settings.read({ source: 'policy' })`。在 Claude Code 自身的读取以及任何其他对合并设置的读取中不存在

127 

128在 `settings.read` 上,该事件在 Claude Code 自身读取时触发以及 `e.layers` 字段需要 Claude Code v2.1.304 或更高版本。有关该 hook 的运行时机以及它可以返回的内容(附示例),请参阅[更改或拒绝设置读取](https://code.claude.com/docs/zh-CN/plugins/mods/events.md#settings-read-hook)。

121 129 

122### 轮次130### 轮次

123 131 

Details

168 168 

169在 v2.1.292 之前,该调用会再运行一次,因此提示词会被提交两次、命令会被运行两次,或子代理会被启动两次。169在 v2.1.292 之前,该调用会再运行一次,因此提示词会被提交两次、命令会被运行两次,或子代理会被启动两次。

170 170 

171### `This mod's change didn't load` 或 `the earlier version is no longer running`

172 

173对[Claude 在本会话中编写的 mod](https://code.claude.com/docs/zh-CN/plugins/mods/create.md#ask-claude-for-a-mod) 所做的更改无法加载。会话记录中的该行以 mod 的名称开头,以原因结尾:

174 

175* `This mod's change didn't load, so the earlier version is still running: <reason>.`

176* `This mod didn't load, and the earlier version is no longer running: <reason>.`

177 

178Claude 看不到此行,因此在请求 Claude 修复时,请将其粘贴到您的下一条消息中。

179 

171### `$.agent.register refused: the hooks module that made the call is no longer loaded`180### `$.agent.register refused: the hooks module that made the call is no longer loaded`

172 181 

173该行以您的 mod 名称开头,如 `first-mod: $.agent.register refused: the hooks module that made the call is no longer loaded (it was reloaded or removed)`,且该 Agent 未被注册。您的 mod 在该调用之前被重新加载或卸载。重新加载会加载 hook 模块的新副本,而此调用来自仍在旧副本中运行的代码,例如尚未返回的 hook。182该行以您的 mod 名称开头,如 `first-mod: $.agent.register refused: the hooks module that made the call is no longer loaded (it was reloaded or removed)`,且该 Agent 未被注册。您的 mod 在该调用之前被重新加载或卸载。重新加载会加载 hook 模块的新副本,而此调用来自仍在旧副本中运行的代码,例如尚未返回的 hook。


225 234 

226读取该行上的原因。常见原因是元素不接受的 prop 和应用没有的元素。235读取该行上的原因。常见原因是元素不接受的 prop 和应用没有的元素。

227 236 

237### `needs a key`、`is drawn twice` 或 `key each once`

238 

239您的 `ui.render` hook 返回的树中,某个元素没有有效的 [`key`](https://code.claude.com/docs/zh-CN/plugins/mods/interface#which-controls-need-a-key),或两个元素共用同一个 key。请找到您收到的消息:

240 

241* **`<Input> needs a key` 或 `<Select> needs a key`**:该元素没有 `key` prop,或其 `key` 为空或不是字符串,如 `key: 3`。请为其提供一个非空字符串作为 `key`。

242* **`<Button> needs a key`**:为该按钮提供一个非空字符串作为其 `key`

243* **`is drawn twice; each takes its own key`**:消息所指明类型的两个元素具有相同的 `key`,如 `Input "size" is drawn twice; each takes its own key`。请为每个元素提供各自的 `key`。

244* **[测试](https://code.claude.com/docs/zh-CN/plugins/mods/test.md#test-a-drawing)中 `press` 报告的 `key each once`**:绘图中有多个按钮使用您传入的 key。标签相同且没有 `key` prop 的按钮会共用该标签作为其 key。请为每个按钮提供各自的 `key`。

245 

228### `ui.render` 行显示 `threw while drawn`246### `ui.render` 行显示 `threw while drawn`

229 247 

230该行会指明[渲染位置](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#render-sites),然后显示 `threw while drawn:` 及错误,如 `first-mod: ui.render (ToolUse) threw while drawn: <error>; the engine drew its own`。Claude Code 在绘制您的 [`ui.render`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#interface) hook 返回的树时,或在根据[您的 hook 传递给 `next` 的 `props`](https://code.claude.com/docs/zh-CN/plugins/mods/interface#change-what-claude-code-already-draws) 绘制该位置时,遇到了该错误。结尾的 `the engine drew its own` 表示该位置显示 Claude Code 的常规内容。248该行会指明[渲染位置](https://code.claude.com/docs/zh-CN/plugins/mods/reference.md#render-sites),然后显示 `threw while drawn:` 及错误,如 `first-mod: ui.render (ToolUse) threw while drawn: <error>; the engine drew its own`。Claude Code 在绘制您的 [`ui.render`](https://code.claude.com/docs/zh-CN/plugins/mods/reference#interface) hook 返回的树时,或在根据[您的 hook 传递给 `next` 的 `props`](https://code.claude.com/docs/zh-CN/plugins/mods/interface#change-what-claude-code-already-draws) 绘制该位置时,遇到了该错误。结尾的 `the engine drew its own` 表示该位置显示 Claude Code 的常规内容。


303 321 

304[在 `classic.SessionStart` hook 中再次加载保存的值](https://code.claude.com/docs/zh-CN/plugins/mods/interface#load-a-saved-value-again-after-clear)。322[在 `classic.SessionStart` hook 中再次加载保存的值](https://code.claude.com/docs/zh-CN/plugins/mods/interface#load-a-saved-value-again-after-clear)。

305 323 

324### `settings.read` hook 返回的某个键不生效

325 

326返回的 `env` 条目不会成为环境变量。返回的 `allow`、`ask` 和 `deny` 规则不会在工具调用时被检查。请在[设置文件](https://code.claude.com/docs/zh-CN/settings.md)中设置这些内容,或对环境变量调用 [`$.env.set`](https://code.claude.com/docs/zh-CN/plugins/mods/api#reach-files-processes-and-the-network)。

327 

328对于其他键,请查看[哪些 mod 会收到 `settings.read` 以及从哪个版本开始](https://code.claude.com/docs/zh-CN/plugins/mods/events#settings-read-hook),然后在[调试日志](#read-the-debug-log)中搜索 `settings.read`,并查找以下某一行:

329 

330| 日志行 | 含义和步骤 |

331| :- | :- |

332| `settings.read hook skipped`,位于您的 mod 名称之后 | 您的 hook 失败。[修复该行报告的错误](#hook-skipped)。 |

333| `settings.read bypassed by cc-plugin-sec-default`,所在行在其前面列出了您的 mod | [内置守卫](https://code.claude.com/docs/zh-CN/plugins/mods/admin.md#know-what-happens-by-default)跳过了您的 hook。请让您组织的管理员[将该 mod 安装为组织的 mod 之一](https://code.claude.com/docs/zh-CN/plugins/mods/admin.md#install-your-organizations-mods)。 |

334| `settings.read: the answer for <key> is no value the key can hold` | 返回的值不符合该键的 schema。[返回一个它允许的值](#settings-read-key-refused)。 |

335| `settings.read: the merge never settles for <key>` | 该行列出的键保留设置来源中的值。请在设置文件中设置它们。 |

336| `answered settings.read without next()`,位于某个 mod 名称之后 | 仅当该 mod [在您的 mod 之前运行](https://code.claude.com/docs/zh-CN/plugins/mods/events.md#the-order-mods-run-in)时才相关。此时您的 hook 在该次读取中未运行。[关闭该 mod](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md#turn-mods-on-or-off),或者如果它是由您的组织部署的,请让其管理员关闭。 |

337| `settings.read: refused to the engine` | 读取被拒绝,因此没有任何 hook 的 `{ value }` 生效。[找出拒绝它的原因](#settings-read-refused)。 |

338 

339如果没有任何一行能解释该键,请检查在您的 mod 之前运行的 mod 中是否有[更改该键](https://code.claude.com/docs/zh-CN/plugins/mods/events.md#settings-read-example)的 `settings.read` hook。关闭该 mod,或让您组织的管理员关闭。如果没有 hook 更改该键,请在设置文件中设置该键。

340 

341### `the answer for <key> is no value the key can hold`

342 

343此[调试日志](#read-the-debug-log)行表示 Claude Code 拒绝了您的 [`settings.read`](https://code.claude.com/docs/zh-CN/plugins/mods/events#settings-read-hook) hook 为所列键返回的值,且仅针对该键:

344 

345```text theme={null}

346settings.read: the answer for <key> is no value the key can hold; the settings' own value stands

347```

348 

349您为所列键返回的值不符合该键的 schema,例如类型或范围不符。请返回该键的[设置参考](https://code.claude.com/docs/zh-CN/settings-reference.md)条目所允许的值。在您的值不符合要求期间,该键保留在任何 hook 应答之前从设置来源合并得到的值。该行将其称为设置自身的值。

350 

351### `settings.read: refused to the engine`

352 

353此[调试日志](#read-the-debug-log)行表示 [Claude Code 自身的读取](https://code.claude.com/docs/zh-CN/plugins/mods/events.md#settings-read-hook)被拒绝,因此没有任何 hook 的 `{ value }` 生效,包括您的 hook。当某个 `settings.read` hook 使用 [`{ deny: reason }`](https://code.claude.com/docs/zh-CN/plugins/mods/events#settings-read-returns) 拒绝该读取时,该行会带有该 hook 的原因:

354 

355```text theme={null}

356settings.read: refused to the engine (engine: $.settings.read: <reason>); the settings' own values stand

357```

358 

359在您自己的 hook 代码中搜索 `<reason>` 文本:

360 

361* **您的代码中有该文本**:您的 hook 拒绝了读取。当 [`next.origin`](https://code.claude.com/docs/zh-CN/plugins/mods/events#settings-read-origin) 显示为 Claude Code 自身的读取时,让它返回 `{ value }`。

362* **您的代码中没有该文本**:逐个[关闭](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md#turn-mods-on-or-off)您的其他 mod。每关闭一个后,从 shell 重新运行本会话的命令,并使用一个指向新路径的 `--debug-file`,然后在该文件中搜索 `refused to the engine`。如果该行存在,则关闭下一个 mod。如果不存在,则说明您最后关闭的 mod 拒绝了读取,请保持其关闭状态。

363 

364如果已没有其他 mod,请对您的 hook 返回的键使用[设置文件](https://code.claude.com/docs/zh-CN/settings.md)。在读取被拒绝期间,其中的值仍然有效。

365 

306## 阅读调试日志366## 阅读调试日志

307 367 

308调试日志对 Claude Code 加载或拒绝的每个模块、每个失败的 hook 以及它拒绝的每个结果都有一行,因此当会话记录中没有任何显示时,这是查看的地方。要写入一个,在您的 shell 中使用 `--debug` 启动 Claude Code,或使用 `--debug-file <path>` 选择它的位置:368调试日志对 Claude Code 加载或拒绝的每个模块、每个失败的 hook 以及它拒绝的每个结果都有一行,因此当会话记录中没有任何显示时,这是查看的地方。要写入一个,在您的 shell 中使用 `--debug` 启动 Claude Code,或使用 `--debug-file <path>` 选择它的位置:

Details

251 251 

252首先检查存储库本身:拼写错误的 `owner/repo`、不存在的存储库或您看不到的私有存储库也以此消息结尾。在浏览器中打开存储库 URL,或在终端中运行 `git ls-remote <url>`,以确认它存在且您有权访问。252首先检查存储库本身:拼写错误的 `owner/repo`、不存在的存储库或您看不到的私有存储库也以此消息结尾。在浏览器中打开存储库 URL,或在终端中运行 `git ls-remote <url>`,以确认它存在且您有权访问。

253 253 

254如果存储库是正确的,原因是凭证。Claude Code 运行 git 时禁用了交互式提示,因此它无法像您的终端那样要求您输入密码、密钥密码或凭证。如果 git 需要提示,您会看到 `fatal: Cannot prompt because user interactivity has been disabled` 或 `terminal prompts disabled` 在原始错误中。只有已经非交互式工作的凭证才会成功:254如果仓库是正确的,原因是凭据。Claude Code 会关闭 git 的提示和 askpass 程序(包括在 `GIT_ASKPASS` 中设置的程序),并以批处理模式运行 SSH。当 git 需要提示时,克隆的错误中会包含 `fatal: Cannot prompt because user interactivity has been disabled`、`terminal prompts disabled` 或 `fatal: unable to get password from user`。只有 git 无需提示或 askpass 程序即可获取的凭据才会成功:

255 255 

256* **SSH**:`ssh -T git@<host>` 必须成功而不提示密码,主机必须已在 `known_hosts` 中256* **SSH**:`ssh -T git@<host>` 必须成功而不提示密码,主机必须已在 `known_hosts` 中

257* **HTTPS**:您的凭证助手必须为主机保存令牌。对于 GitHub,运行 `gh auth login` 和 `gh auth setup-git`。对于另一个主机,在您的 git 凭证助手中存储个人访问令牌。使用 `git ls-remote <url>` 测试257* **HTTPS**:您的凭据助手必须为主机保存令牌。对于 GitHub,运行 `gh auth login` 和 `gh auth setup-git`。对于另一个主机,在您的 git 凭据助手中存储个人访问令牌。要进行测试,请在终端中取消设置 `GIT_ASKPASS` 并运行 `git -c core.askPass= ls-remote <url>`。

258 258 

259一旦 `git ls-remote` 在您的终端中成功而不提示,再次运行添加或更新。成功的添加打印 `Successfully added marketplace: <name>`。成功的更新从您的 shell 打印 `Successfully updated marketplace: <name>`,或在会话中打印 `✔ Updated 1 marketplace`。259一旦针对您所用协议的检查成功且未出现提示,再次运行添加或更新。成功的添加打印 `Successfully added marketplace: <name>`。成功的更新从您的 shell 打印 `Successfully updated marketplace: <name>`,或在会话中打印 `✔ Updated 1 marketplace`。

260 260 

261要使 Claude Code 为 GitHub `owner/repo` 源跳过 SSH,请设置 `CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`。没有它,当 `github.com` 的 SSH 密钥看起来已配置时,Claude Code 通过 SSH 克隆这些源,当 SSH 克隆失败时回退到 HTTPS。261要使 Claude Code 为 GitHub `owner/repo` 源跳过 SSH,请设置 `CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1`。没有它,当 `github.com` 的 SSH 密钥看起来已配置时,Claude Code 通过 SSH 克隆这些源,当 SSH 克隆失败时回退到 HTTPS。

262 262 


318 318 

319如果存储库是 monorepo,使用 `claude plugin marketplace add <source> --sparse <paths>` 限制检出到您命名的目录。319如果存储库是 monorepo,使用 `claude plugin marketplace add <source> --sparse <paths>` 限制检出到您命名的目录。

320 320 

321如果仓库包含大型 git 子模块,请更新 Claude Code。在 v2.1.295 及更高版本中,Claude Code 仅获取[包含插件文件的子模块](https://code.claude.com/docs/zh-CN/plugins/marketplace-reference.md#git-submodules-in-the-marketplace-repository)。早期版本会获取所有子模块,仅此一项就可能耗尽这 120 秒。

322 

321### 市场更新在离线时持续失败323### 市场更新在离线时持续失败

322 324 

323您在市场的 git 主机无法访问的环境中工作,每个会话都在后台重复失败的刷新。您现有的市场检出保持原位,启动不会延迟。325您在市场的 git 主机无法访问的环境中工作,每个会话都在后台重复失败的刷新。您现有的市场检出保持原位,启动不会延迟。


609| `<Plugin or Dependency> "<name>" has conflicting version requirements` | 没有版本满足每个引脚它的范围。消息列出范围。 | 卸载或更新其中一个冲突的插件,或要求上游作者扩大其约束。 |611| `<Plugin or Dependency> "<name>" has conflicting version requirements` | 没有版本满足每个引脚它的范围。消息列出范围。 | 卸载或更新其中一个冲突的插件,或要求上游作者扩大其约束。 |

610| `... has version requirements too complex to intersect` 或 `has an invalid version requirement` | 范围不是有效的 semver,或组合范围无法相交。 | 修复无效范围或简化长 `\|\|` 链。 |612| `... has version requirements too complex to intersect` 或 `has an invalid version requirement` | 范围不是有效的 semver,或组合范围无法相交。 | 修复无效范围或简化长 `\|\|` 链。 |

611| `... has no git tag satisfying <range>` | 依赖项的仓库在范围内没有 `<name>--v*` 标签。 | 检查上游是否使用该约定标记发布,或放宽范围。 |613| `... has no git tag satisfying <range>` | 依赖项的仓库在范围内没有 `<name>--v*` 标签。 | 检查上游是否使用该约定标记发布,或放宽范围。 |

612| `Dependency "<dep>" (required by <plugin>) is in <marketplace>, which is not in the allowlist` | 依赖项在不同的市场中,默认情况下跨市场解析已关闭。 | 自己在相同的作用域安装依赖项,在您的 shell 中使用 `claude plugin install <dep>@<marketplace>` 加上您安装插件的 `--scope`,然后重试。 |614| `Dependency "<dep>" (required by <plugin>) is in marketplace "<marketplace>", which is not in the allowlist` | 依赖项在不同的市场中,默认情况下跨市场解析已关闭。 | 自己在相同的作用域安装依赖项,在您的 shell 中使用 `claude plugin install <dep>@<marketplace>` 加上您安装插件的 `--scope`,然后重试。 |

613 615 

614要以编程方式查看这些,请在您的 shell 中运行 `claude plugin list --json`。有问题的插件携带带有消息的 `errors` 字段和带有每个 `type` 的 `errorDetails` 字段:前三行是 `dependency-unsatisfied`,第四行是 `dependency-version-unsatisfied`。616要以编程方式查看这些,请在您的 shell 中运行 `claude plugin list --json`。有问题的插件携带带有消息的 `errors` 字段和带有每个 `type` 的 `errorDetails` 字段:前三行是 `dependency-unsatisfied`,第四行是 `dependency-version-unsatisfied`。

615 617 


979 981 

980### `${CLAUDE_PLUGIN_ROOT}` 在 Windows 上显示正斜杠982### `${CLAUDE_PLUGIN_ROOT}` 在 Windows 上显示正斜杠

981 983 

982在 Windows 上,插件 hook 接收到的 `${CLAUDE_PLUGIN_ROOT}` 为 `C:/Users/you/...` 而不是 `C:\Users\you\...`,期望反斜杠的脚本因此出错。984在 Windows 上,通过 Git Bash 运行的插件 hook 接收到的 `${CLAUDE_PLUGIN_ROOT}` 为 `C:/Users/you/...` 而不是 `C:\Users\you\...`,期望反斜杠的脚本因此出错。

983 985 

984Claude Code 在 Windows 上通过 Git Bash 运行 shell 形式的 hook,并有意以正斜杠 Win32 形式替换插件根目录。Bash 内置命令、MSYS 工具和本机 Windows 二进制文件都接受该形式。986安装了 Git Bash 时,[shell 形式的 hook](https://code.claude.com/docs/zh-CN/hooks.md#exec-form-and-shell-form) 默认通过 Git Bash 运行。对于通过 Git Bash 运行的 hook,Claude Code 以正斜杠形式传递路径,以免 Bash 将反斜杠解读为转义符。Bash 内置命令、MSYS 工具和本机 Windows 二进制文件都接受该形式。

985 987 

986如果您的脚本需要反斜杠,请将 hook 切换到保留本机路径的形式之一,如[执行形式和 shell 形式](https://code.claude.com/docs/zh-CN/hooks.md#exec-form-and-shell-form)下所述:988如果您的脚本需要反斜杠,请将 hook 切换到保留本机路径的形式之一,如[执行形式和 shell 形式](https://code.claude.com/docs/zh-CN/hooks.md#exec-form-and-shell-form)下所述:

987 989 


1090 1092 

1091或者,在 git 存储库中托管市场并告诉用户使用存储库 URL 添加它。对于 git 源,Claude Code 克隆整个存储库,因此相对路径解析。源类型在 [市场参考](https://code.claude.com/docs/zh-CN/plugins/marketplace-reference.md) 上。1093或者,在 git 存储库中托管市场并告诉用户使用存储库 URL 添加它。对于 git 源,Claude Code 克隆整个存储库,因此相对路径解析。源类型在 [市场参考](https://code.claude.com/docs/zh-CN/plugins/marketplace-reference.md) 上。

1092 1094 

1095### 安装后根插件来自 git 子模块的文件缺失

1096 

1097您的插件位于市场根目录,并运行或读取来自仓库 git 子模块的文件。安装后,子模块的目录为空。在 v2.1.295 之前,Claude Code 会获取每个子模块,因此该目录中有内容。

1098 

1099当 Claude Code 克隆您的市场时,它仅获取[包含插件文件的子模块](https://code.claude.com/docs/zh-CN/plugins/marketplace-reference.md#git-submodules-in-the-marketplace-repository)。对于位于根目录的插件,它通过读取插件配置中的路径以及插件文件的文本来做出判断。它无法看到脚本在运行时构建的路径。

1100 

1101请将指向子模块的路径完整写在 Claude Code 能够读取的位置,例如 hook 命令中的 `${CLAUDE_PLUGIN_ROOT}/vendor/tool/run.sh`。这样 Claude Code 就会为该插件获取仓库中的每个子模块。

1102 

1093### 市场验证错误1103### 市场验证错误

1094 1104 

1095您从市场目录运行了 `claude plugin validate .`,它在市场文件本身上报告了错误或警告。1105您从市场目录运行了 `claude plugin validate .`,它在市场文件本身上报告了错误或警告。


1121 1131 

1122### `Marketplace source '<source>' is blocked by enterprise policy`1132### `Marketplace source '<source>' is blocked by enterprise policy`

1123 1133 

1124您运行了 `/plugin marketplace add`、`update` 或安装,Claude Code 拒绝了此行。对于 GitHub 或 git 源,主机跟随括号中的源,如 `'github:owner/repo' (github.com)`。1134您运行了 `/plugin marketplace add`、`update` 或安装,Claude Code 拒绝并显示此行。

1125 1135 

1126您的管理员在托管设置中设置了 `blockedMarketplaces` 或 `strictKnownMarketplaces`,此源不被允许。要求您的管理员允许源,或添加消息列出的允许源之一。1136您的管理员在托管设置中设置了 `blockedMarketplaces` 或 `strictKnownMarketplaces`,此源不被允许。要求您的管理员允许源,或添加消息列出的允许源之一。

1127 1137 

Details

100 100 

101### 启用快速模式101### 启用快速模式

102 102 

103启用[快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)会添加一个请求标头,该标头是缓存键的一部分,因此 Claude Code 在启用快速模式后发送的第一个请求会读取整个对话历史记录而没有缓存命中。Claude Code 在轮次开始时设置该标头一次,并在整个轮次中保持它,因此当您在 Claude 工作时启用快速模式,标头导致的缓存未命中会发生在您下一轮次的第一个请求上。这些未缓存的输入 token 按[快速模式费率](https://code.claude.com/docs/zh-CN/fast-mode.md#understand-the-cost-tradeoff)计费,这就是为什么在会话开始时启用它比在长会话的后段启用它成本更低。如果您当前的模型不支持快速模式,启用快速模式也会[切换您的模型](#switching-models),该切换本身会从当前运行轮次中的下一个请求开始启动新的缓存。103[快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md)和标准速度各自保留独立的缓存,因此在您启用或关闭快速模式后,下一个请求无法使用另一种速度所缓存的内容。在一个对话中第一次启用快速模式时,下一个请求会以未缓存的方式读取到目前为止的整个对话,并按[快速模式费率](https://code.claude.com/docs/zh-CN/fast-mode.md#understand-the-cost-tradeoff)计费。为了使该成本保持较小,请在会话开始时启用它。

104 104 

105该成本每个对话只产生一次。在第一个快速模式轮次之后,Claude Code 会继续发送该标头,仅改变请求的速度设置,而速度设置不是缓存键的一部分。关闭快速模式、[速率限制后自动回退到标准速度](https://code.claude.com/docs/zh-CN/fast-mode.md#handle-rate-limits)以及稍后重新启用它都会保持缓存。如果您在会话中途[用完使用额度](https://code.claude.com/docs/zh-CN/fast-mode.md#handle-rate-limits),Claude Code 会以相同的方式在标准速度下重试每个被拒绝的快速模式请求,因此此回退也会保持缓存。`/clear` 和 `/compact` 会重置此状态,因为它们无论如何都会在这些时间点重建缓存。105* 如果您在 Claude 工作时启用它,该轮次会以标准速度完成,任何未缓存读取的费用会在您下一轮次的第一个请求上产生。

106* 如果您当前的模型不支持快速模式,启用快速模式也会[将您切换到 Opus](https://code.claude.com/docs/zh-CN/fast-mode.md#toggle-fast-mode)。该[模型切换](#switching-models)本身会从当前运行轮次中的下一个请求开始启动新的缓存。

107 

108之后的每次切换都会以未缓存的方式读取您所切换到的速度尚未缓存的内容。Claude Code 自行进行的速度更改,例如[速率限制后回退到标准速度](https://code.claude.com/docs/zh-CN/fast-mode.md#handle-rate-limits)以及稍后返回快速模式,也算作切换。

106 109 

107### 连接或移除 MCP 服务器110### 连接或移除 MCP 服务器

108 111 


184>187>

185> 当您丢弃的上下文是您不再需要的内容时,压缩对您有利。要选择其开销发生的时间,请在工作中的自然间歇处(例如任务之间)运行 `/compact`,而不是等待自动压缩在任务中途触发。如果您走上了一条想要完全放弃的路径,请改用 [`/rewind`](#rewinding-the-conversation) 回退到较早的轮次。回退会截断回到一个已缓存的前缀,而不是像压缩那样构建新的前缀。188> 当您丢弃的上下文是您不再需要的内容时,压缩对您有利。要选择其开销发生的时间,请在工作中的自然间歇处(例如任务之间)运行 `/compact`,而不是等待自动压缩在任务中途触发。如果您走上了一条想要完全放弃的路径,请改用 [`/rewind`](#rewinding-the-conversation) 回退到较早的轮次。回退会截断回到一个已缓存的前缀,而不是像压缩那样构建新的前缀。

186 189 

187如果您在终端会话中让一个长对话处于空闲状态,且该对话使用的是[一小时 TTL](#which-ttl-each-request-gets),Claude Code 可能会在缓存过期前不久对其进行压缩。要关闭空闲压缩,请将 [`idleCompaction`](https://code.claude.com/docs/zh-CN/settings-reference#idlecompaction) 设置为 `false`,这需要 Claude Code v2.1.290 或更高版本。190如果您让一个长对话处于空闲状态,且该对话使用的是[一小时 TTL](#which-ttl-each-request-gets),Claude Code 可能会对其进行压缩。要关闭空闲压缩,请将 [`idleCompaction`](https://code.claude.com/docs/zh-CN/settings-reference#idlecompaction) 设置为 `false`,这需要 Claude Code v2.1.290 或更高版本。

188 191 

189### 积累许多图像192### 积累许多图像

190 193 


309 312 

310在 Claude Code 中,缓存有效地限定在一台机器和目录。系统提示嵌入了您的自动内存路径,对话以工作目录、平台、shell 和 OS 版本的公告开始。因此,两个不同目录中的会话构建不同的前缀并错过彼此的缓存。313在 Claude Code 中,缓存有效地限定在一台机器和目录。系统提示嵌入了您的自动内存路径,对话以工作目录、平台、shell 和 OS 版本的公告开始。因此,两个不同目录中的会话构建不同的前缀并错过彼此的缓存。

311 314 

312您在同一目录中并行运行的会话构建匹配的前缀并读取彼此的缓存。顺序会话仅当启动时的 git 状态快照匹配时才共享前缀,因为每个对话也携带该快照中的分支和最近的提交。315* 您在同一目录中并行运行的会话会构建匹配的前缀,并且可以读取彼此的缓存。

316* 顺序会话仅当启动时的 git 状态快照匹配时才共享前缀,因为每个对话也携带该快照中的分支和最近的提交。

317 

318底层 API 缓存更广泛。缓存在组织之间隔离,在某些提供商上,[在组织内的工作区之间隔离](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-storage-and-sharing)。在这些边界内,只有当两个请求的模型、[速度](#turning-on-fast-mode)和前缀都匹配时,它们才会共享缓存。

313 319 

314底层 API 缓存更广泛。缓存在组织之间隔离,在某些提供商上,[在组织内的工作区之间隔离](https://platform.claude.com/docs/en/build-with-claude/prompt-caching#cache-storage-and-sharing)。在这些边界内,任何两个具有相同模型和前缀的请求读取相同的缓存。对于运行自动化流程队列的 Agent SDK 调用者,请参阅[改进跨用户和机器的 prompt caching](https://code.claude.com/docs/zh-CN/agent-sdk/modifying-system-prompts.md#improve-prompt-caching-across-users-and-machines)以将自动内存位置移出系统提示并跨用户和机器共享系统提示的缓存条目。320对于运行自动化流程队列的 Agent SDK 调用者,请参阅[改进跨用户和机器的提示缓存](https://code.claude.com/docs/zh-CN/agent-sdk/modifying-system-prompts.md#improve-prompt-caching-across-users-and-machines),以将自动记忆位置移出系统提示词。

315 321 

316## 检查缓存性能322## 检查缓存性能

317 323 

Details

179* **您的更改的差异**:当会话的目录在 git 存储库中时,连接的设备的差异窗格显示您的更改。在具有超过存储库默认分支的提交的分支上,窗格显示自分支从它分离以来的更改,包括您未提交的编辑。在默认分支本身上,或在不超过它的分支上,窗格仅显示您未提交的更改。179* **您的更改的差异**:当会话的目录在 git 存储库中时,连接的设备的差异窗格显示您的更改。在具有超过存储库默认分支的提交的分支上,窗格显示自分支从它分离以来的更改,包括您未提交的编辑。在默认分支本身上,或在不超过它的分支上,窗格仅显示您未提交的更改。

180* **模型**:当您从连接的设备选择[模型](https://code.claude.com/docs/zh-CN/model-config.md)时,Claude Code 在该模型上运行会话。需要 Claude Code v2.1.238 或更高版本。您从设备的模型控制中选择的模型仅适用于当前会话。当您从设备向交互式会话发送 `/model <name>` 时,Claude Code 也会为新会话设置您的默认值。180* **模型**:当您从连接的设备选择[模型](https://code.claude.com/docs/zh-CN/model-config.md)时,Claude Code 在该模型上运行会话。需要 Claude Code v2.1.238 或更高版本。您从设备的模型控制中选择的模型仅适用于当前会话。当您从设备向交互式会话发送 `/model <name>` 时,Claude Code 也会为新会话设置您的默认值。

181* **努力级别**:当您从连接的设备设置[努力级别](https://code.claude.com/docs/zh-CN/model-config.md#adjust-effort-level)时,使用 `/effort` 或设备的努力控制,Claude Code 将其应用于您机器上的会话。如果您使用 `CLAUDE_CODE_EFFORT_LEVEL` 固定了一个级别,会话保持该级别,Claude Code 拒绝从努力控制中选择不同的级别。从努力控制中选择级别需要您机器上的 Claude Code v2.1.234 或更高版本。181* **努力级别**:当您从连接的设备设置[努力级别](https://code.claude.com/docs/zh-CN/model-config.md#adjust-effort-level)时,使用 `/effort` 或设备的努力控制,Claude Code 将其应用于您机器上的会话。如果您使用 `CLAUDE_CODE_EFFORT_LEVEL` 固定了一个级别,会话保持该级别,Claude Code 拒绝从努力控制中选择不同的级别。从努力控制中选择级别需要您机器上的 Claude Code v2.1.234 或更高版本。

182* **连接失败后重新连接**:运行 `/remote-control` 以重新连接。如果压缩重写了对话或您在此期间使用 `/resume` 切换了对话,Claude Code 会存档它正在使用的服务器会话,而不是将其留在会话列表中。您仍然可以通过[过滤存档的会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md#archive-sessions)找到它。在设备仍然连接时切换对话不会存档会话。182* **连接失败后重新连接**:运行 `/remote-control` 以重新连接。如果压缩重写了对话或您在此期间使用 `/resume` 切换了对话,Claude Code 会存档它正在使用的服务器会话,而不是将其留在会话列表中。您仍然可以在 claude.ai/code 的[已存档会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md#find-an-archived-session)中找到该会话。在设备仍然连接时切换对话不会存档会话。

183 183 

184### 为所有会话启用远程控制184### 为所有会话启用远程控制

185 185 


401 401 

402## 故障排除402## 故障排除

403 403 

404### "Remote Control disconnected" or "Can't reach"

405 

406在 [claude.ai/code](https://claude.ai/code) 或 Desktop 应用中,**Remote Control disconnected** 或 **Can't reach** 消息表示您的浏览器或应用与您计算机上的 Claude Code 失去了联系。这两条消息都无法告诉您 Claude 或您正在查看的子代理是否仍在您的计算机上工作。在该计算机上,检查 Claude Code 所处的状态,并按照相应的步骤重新连接:

407 

408* **交互式会话显示 `Remote Control disconnected`**:按照[该行给出的原因所对应的重新连接步骤](#session-ended-elsewhere)操作

409* **Claude Code 正在运行且未显示任何故障**:一旦计算机处于唤醒状态并已联网,交互式会话会自动重新连接,因此您无需执行任何操作。如果您使用的是 `claude remote-control`,请参阅[限制](#limitations)下的 **长时间网络中断**

410* **Claude Code 未在运行**:[重新启动它并恢复会话](#resume-sessions-after-stopping-the-server)

411 

404### "Remote Control requires a claude.ai subscription"412### "Remote Control requires a claude.ai subscription"

405 413 

406您未使用 claude.ai 账户登录,或者其他凭据优先于您的登录。该消息采用以下形式之一:414您未使用 claude.ai 账户登录,或者其他凭据优先于您的登录。该消息采用以下形式之一:


463* **使用 `/remote-control`、`claude --remote-control` 或[自动连接](#enable-remote-control-for-all-sessions)**:会话继续运行但不再使用 Remote Control,Claude Code 会在 claude.ai 上将其归档471* **使用 `/remote-control`、`claude --remote-control` 或[自动连接](#enable-remote-control-for-all-sessions)**:会话继续运行但不再使用 Remote Control,Claude Code 会在 claude.ai 上将其归档

464* **使用 `claude remote-control`**:服务器停止并归档其所服务的会话,然后退出472* **使用 `claude remote-control`**:服务器停止并归档其所服务的会话,然后退出

465 473 

466您仍然可以通过[筛选已归档的会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md#archive-sessions)找到已归档的会话。474要再次找到这些会话之一,请在 claude.ai/code 打开您的[已归档会话](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md#find-an-archived-session)。

467 475 

468Remote Control 不会自动重新连接。要在您的组织重新允许后再次启用它,请在会话中运行 `/remote-control`,或在 shell 中运行 `claude remote-control`。在此计算机上的 Claude Code 获取到已更改的策略之前,这两个命令都会失败并显示 [`Remote Control is disabled by your organization's policy`](#remote-control-is-disabled-by-your-organizations-policy)。打开的会话大约每小时获取一次策略。要找出阻止 Remote Control 的原因,请将命令输出的完整文本与该条目进行对照。476Remote Control 不会自动重新连接。要在您的组织重新允许后再次启用它,请在会话中运行 `/remote-control`,或在 shell 中运行 `claude remote-control`。在此计算机上的 Claude Code 获取到已更改的策略之前,这两个命令都会失败并显示 [`Remote Control is disabled by your organization's policy`](#remote-control-is-disabled-by-your-organizations-policy)。打开的会话大约每小时获取一次策略。要找出阻止 Remote Control 的原因,请将命令输出的完整文本与该条目进行对照。

469 477 

routines.md +24 −4

Details

293 293 

294#### 支持的事件294#### 支持的事件

295 295 

296GitHub 触发器可以订阅以下任一事件类别。在每个类别中,您可以选择特定操作(例如 `pull_request.opened`),也可以响应该类别中的所有操作。296从以下任一类别中选择一个事件。在每个类别中,您可以选择特定操作(例如 `pull_request.opened`),也可以响应该类别中的所有操作。

297 297 

298| 事件 | 触发时机 |298| 事件 | 触发时机 |

299| :- | :- |299| :- | :- |

300| Pull request | PR 被打开、关闭、分配、添加标签、同步或以其他方式更新 |300| Pull request | PR 被打开、关闭、分配、添加标签、同步或以其他方式更新 |

301| Release | 发布被创建、发布、编辑或删除 |301| Release | 发布被创建、发布、编辑或删除 |

302| Issue | Issue 被打开、编辑、关闭、重新打开、添加标签、分配或以其他方式更新 |

302 303 

303#### 筛选 Pull Request304#### 筛选 Pull Request

304 305 


333 334 

334点击任意运行即可将其作为完整会话打开。在那里,您可以查看 Claude 执行了哪些操作、审查更改、创建 Pull Request 或继续对话。每个运行会话的用法与其他会话相同:使用会话标题旁边的下拉菜单对其进行重命名、归档或删除。335点击任意运行即可将其作为完整会话打开。在那里,您可以查看 Claude 执行了哪些操作、审查更改、创建 Pull Request 或继续对话。每个运行会话的用法与其他会话相同:使用会话标题旁边的下拉菜单对其进行重命名、归档或删除。

335 336 

336> [!NOTE]337在任务详情页的 **History** 下,每个已结束运行所在行的末尾会显示其结果:运行失败时显示 **Error**,运行被取消时显示 **Cancelled**,运行成功时则两者都不显示。**Status** 筛选器将这三种结果分别称为 **Failed**、**Cancelled** 和 **Succeeded**。这些结果表示会话是如何结束的,而不表示 Claude 是否完成了提示词中描述的工作,因此请打开该运行并阅读其会话记录,以了解实际发生了什么。

337>338 

338> 运行列表中的绿色状态表示会话已启动并退出,且没有出现基础设施错误。这并不表示提示词中描述的工作已成功完成。请打开该运行阅读会话记录,确认 Claude 实际执行了哪些操作。被阻止的网络请求、缺失的连接器工具以及工作本身的失败都会显示在会话记录中,而不会体现在状态指示器中。339* **Succeeded**:会话结束时 Claude Code 未报告失败。被阻止的网络请求、缺失的连接器工具以及 Claude 未能完成的工作会显示在会话记录中,而不会体现在该行上

340* **Failed**:会话未正常结束。例如,它意外停止、因错误而结束,或在运行开始之前就已被归档

341* **Cancelled**:运行并未失败,但其会话已被归档。如果您归档了一个成功运行的会话,该运行会变为 **Cancelled**。任务本身无需做任何更改

342 

343如果 **History** 下出现警告,请参阅[“The last run”警告](#the-last-run-didnt-start)。

339 344 

340### 编辑和控制定时任务345### 编辑和控制定时任务

341 346 


499 504 

500您 Team 或 Enterprise 组织中的 Owner 可能已在 [**Organization settings > Capabilities > Remote sessions**](https://claude.ai/admin-settings/capabilities) 关闭了 **Scheduled tasks (Was Routines)** 开关。在 Claude Code v2.1.227 或更高版本中,同一开关还会在 CLI 中隐藏 `/schedule`。这是一项服务器端的组织设置,因此无法通过您的本地配置覆盖。请联系 Owner 为您的组织重新启用定时任务。505您 Team 或 Enterprise 组织中的 Owner 可能已在 [**Organization settings > Capabilities > Remote sessions**](https://claude.ai/admin-settings/capabilities) 关闭了 **Scheduled tasks (Was Routines)** 开关。在 Claude Code v2.1.227 或更高版本中,同一开关还会在 CLI 中隐藏 `/schedule`。这是一项服务器端的组织设置,因此无法通过您的本地配置覆盖。请联系 Owner 为您的组织重新启用定时任务。

501 506 

507### "The last run" 警告

508 

509当 **History** 下的警告以 "The last run" 开头时,请在第一列中找到该警告,并按照其所在行的说明操作。之后的某次运行启动后,该警告即会清除。

510 

511| 警告 | 处理方法 |

512| :- | :- |

513| "The last run didn't start because your organization had reached its limit on cloud sessions running at once." | 该任务无需更改。稍后点击 **Run now**,或等待下一次运行 |

514| "The last run didn't start because its cloud environment couldn't be found or used." | 在任务的详情页面上,打开其名称旁边的菜单,选择 **Edit**,然后找到[云环境选择器](#environments-and-network-access)。如果其中显示 **Unavailable environment**,说明该环境已被归档或您的账户已无法再使用该环境,请在此处选择另一个环境并保存更改。否则,请在详情页面上使用 **Run now** 重试,或在选择器中选择另一个环境并保存更改 |

515| "The last run was blocked because it couldn't access something it needs, or your organization's policy doesn't allow it." | 检查您的 [GitHub 访问权限](#repositories-and-branch-permissions)是否涵盖该任务的仓库。如果已涵盖,请询问您 Claude 组织的 [Owner](https://code.claude.com/docs/zh-CN/server-managed-settings.md#access-control) 是否有策略阻止了该任务 |

516| "The last run didn't start because of a problem that's usually temporary." | 点击 **Run now** 重试,或等待下一次运行 |

517| "The last run didn't start because its repository or branch wasn't available." | 在 GitHub 上检查任务中的每个仓库是否都有[运行所基于的分支](#repositories-and-branch-permissions)。同时检查您的 [GitHub 访问权限](#repositories-and-branch-permissions)是否涵盖每个仓库,如果连接已过期,请重新连接 GitHub |

518| "The last run didn't start because some of its settings weren't accepted." | 在任务的详情页面上,打开其名称旁边的菜单并选择 **Edit**。该对话框不会标明哪项设置未被接受,因此请在其中逐一检查每项设置,包括任务的名称、提示词、模型、仓库、环境、连接器和触发器 |

519| "The last run stopped because a usage limit was reached." | 关于达到用量限制后任务何时可以再次开始运行,请参阅[用量和限制](#usage-and-limits) |

520| "The last run failed." | 点击 **Run now** 重试,或等待下一次运行。失败的运行没有可打开的会话 |

521 

502## 相关资源522## 相关资源

503 523 

504* [`/loop` 和会话内调度](https://code.claude.com/docs/zh-CN/scheduled-tasks):在打开的 CLI 会话中安排本地任务524* [`/loop` 和会话内调度](https://code.claude.com/docs/zh-CN/scheduled-tasks):在打开的 CLI 会话中安排本地任务

Details

171 171 

172个别开发人员可以选择本页面上的任何沙箱方法。组织可以强制实施什么,以及使用哪些工具,取决于该方法:172个别开发人员可以选择本页面上的任何沙箱方法。组织可以强制实施什么,以及使用哪些工具,取决于该方法:

173 173 

174* **Built-in Bash sandbox**:Claude Code 强制实施的唯一方法。通过 [managed settings](https://code.claude.com/docs/zh-CN/managed-settings.md#delivery-mechanisms) 传递 `sandbox` 设置密钥,可以是由您的 MDM 管理的文件,也可以通过 Claude.ai 上的 [server-managed settings](https://code.claude.com/docs/zh-CN/server-managed-settings.md)。有关要部署的密钥以及如何防止开发人员扩大策略,请参阅 [Enforce sandboxing with managed settings](https://code.claude.com/docs/zh-CN/sandboxing.md#enforce-sandboxing-with-managed-settings)。174* **Built-in Bash sandbox**:Claude Code 强制实施的唯一方法。通过 [managed settings](https://code.claude.com/docs/zh-CN/managed-settings.md#delivery-mechanisms) 传递 `sandbox` 设置键,可以是由您的 MDM 管理的文件,也可以通过 Claude.ai 上的 [server-managed settings](https://code.claude.com/docs/zh-CN/server-managed-settings.md)。有关要部署的键以及如何防止开发人员扩大策略,请参阅 [Enforce sandboxing with managed settings](https://code.claude.com/docs/zh-CN/sandboxing.md#enforce-sandboxing-with-managed-settings)。

175* **Dev containers**:将 [example dev container](https://code.claude.com/docs/zh-CN/devcontainer.md) 提交到您的存储库以在团队中标准化环境。这是一个约定而不是强制边界,因为 Claude Code 不需要容器。如果开发人员不应该能够在其外部运行 Claude Code,请使用您组织的设备管理或软件允许列表工具强制实施。175* **Dev containers**:将 [example dev container](https://code.claude.com/docs/zh-CN/devcontainer.md) 提交到您的存储库以在团队中标准化环境。这是一个约定而不是强制边界,因为 Claude Code 不需要容器。如果开发人员不应该能够在其外部运行 Claude Code,请使用您组织的设备管理或软件允许列表工具强制实施。

176* **Custom containers and VMs**:通过批准的镜像分发 Claude Code,并使用您组织的设备管理或软件允许列表工具防止在其外部安装。176* **Custom containers and VMs**:通过批准的镜像分发 Claude Code,并使用您组织的设备管理或软件允许列表工具防止在其外部安装。

177 177 


181 181 

182* [Sandboxing](https://code.claude.com/docs/zh-CN/sandboxing.md):配置内置沙箱化 Bash 工具182* [Sandboxing](https://code.claude.com/docs/zh-CN/sandboxing.md):配置内置沙箱化 Bash 工具

183* [Dev container](https://code.claude.com/docs/zh-CN/devcontainer.md):预配置的 Docker 开发容器183* [Dev container](https://code.claude.com/docs/zh-CN/devcontainer.md):预配置的 Docker 开发容器

184* [Security](https://code.claude.com/docs/zh-CN/security.md):完整的 Claude Code 安全模型184* [安全性](https://code.claude.com/docs/zh-CN/security.md):完整的 Claude Code 安全模型

185* [Secure deployment](https://code.claude.com/docs/zh-CN/agent-sdk/secure-deployment.md):Agent SDK 应用程序的隔离指导185* [安全部署](https://code.claude.com/docs/zh-CN/agent-sdk/secure-deployment.md):Agent SDK 应用程序的隔离指导

186* [Settings](https://code.claude.com/docs/zh-CN/settings-reference.md#sandbox-settings):所有沙箱配置密钥,包括托管设置传递186* [设置](https://code.claude.com/docs/zh-CN/settings-reference.md#sandbox-settings):所有沙箱配置键,包括托管设置传递

sandboxing.md +26 −2

Details

223* **针对该参数的询问规则**:为 `Bash(dangerouslyDisableSandbox:true)` 添加[询问规则](https://code.claude.com/docs/zh-CN/permissions.md#match-by-input-parameter),即可在 Bash 重试时收到提示。在自动模式和 `bypassPermissions` 模式下您也会收到提示,并且该规则优先于匹配的允许规则223* **针对该参数的询问规则**:为 `Bash(dangerouslyDisableSandbox:true)` 添加[询问规则](https://code.claude.com/docs/zh-CN/permissions.md#match-by-input-parameter),即可在 Bash 重试时收到提示。在自动模式和 `bypassPermissions` 模式下您也会收到提示,并且该规则优先于匹配的允许规则

224* **[`permissions.blockReadsOutsideWorkingDirectories`](https://code.claude.com/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories)**:[任何模式都不会自动批准的操作](https://code.claude.com/docs/zh-CN/permission-modes.md#actions-no-mode-auto-approves)介绍了在启用该设置时会提示的重试224* **[`permissions.blockReadsOutsideWorkingDirectories`](https://code.claude.com/docs/zh-CN/settings-reference#permissions-blockreadsoutsideworkingdirectories)**:[任何模式都不会自动批准的操作](https://code.claude.com/docs/zh-CN/permission-modes.md#actions-no-mode-auto-approves)介绍了在启用该设置时会提示的重试

225 225 

226当命令因 [`Sandbox is required` 消息](#commands-refused-with-sandbox-is-required)而被拒绝时,Claude Code 会忽略 `dangerouslyDisableSandbox` 参数,并同样拒绝该重试。

227 

226#### 使用严格沙箱模式关闭重试228#### 使用严格沙箱模式关闭重试

227 229 

228您可以在[沙箱设置](https://code.claude.com/docs/zh-CN/settings-reference.md#sandbox-settings)中设置 `"allowUnsandboxedCommands": false` 来禁用沙箱外重试。禁用重试后,Claude Code 会忽略 `dangerouslyDisableSandbox` 参数。此后,在沙箱运行期间,Claude 运行的命令都会在沙箱中执行,除非它们匹配 `excludedCommands` 条目。要防止 Claude Code 在沙箱无法启动时在沙箱外运行命令,还需设置 [`failIfUnavailable`](https://code.claude.com/docs/zh-CN/settings-reference#sandbox-failifunavailable)。`/sandbox` 的 **Overrides** 选项卡将此设置显示为 **Strict sandbox mode**。230您可以在[沙箱设置](https://code.claude.com/docs/zh-CN/settings-reference.md#sandbox-settings)中设置 `"allowUnsandboxedCommands": false` 来禁用沙箱外重试。禁用重试后,Claude Code 会忽略 `dangerouslyDisableSandbox` 参数。此后,在沙箱运行期间,Claude 运行的命令都会在沙箱中执行,除非它们匹配 `excludedCommands` 条目。要防止 Claude Code 在沙箱无法启动时在沙箱外运行命令,还需设置 [`failIfUnavailable`](https://code.claude.com/docs/zh-CN/settings-reference#sandbox-failifunavailable)。`/sandbox` 的 **Overrides** 选项卡将此设置显示为 **Strict sandbox mode**。


899 901 

900### 0 字节只读文件出现在 `.claude` 设置路径中,且"是的,不要再问"无法保存902### 0 字节只读文件出现在 `.claude` 设置路径中,且"是的,不要再问"无法保存

901 903 

902在 Linux 和 WSL2 上,沙箱化命令运行期间,沙箱通过在尚不存在的文件位置创建 0 字节只读占位符来保持对该文件的写入拒绝。沙箱随后会移除占位符。如果会话在清理运行之前被终止,例如通过 SIGKILL,占位符就会残留下来。后续会话每次启动时都会再次将这些占位符以只读方式绑定,因此在占位符所在的位置,设置写入(如保存权限选择)会失败。904在 Linux 和 WSL2 上,沙箱化命令运行期间,沙箱通过在尚不存在的文件位置创建 0 字节只读占位符来保持对该文件的写入拒绝。沙箱随后会移除占位符。

905 

906在以下情况下,占位符会残留下来:

907 

908* 会话在清理运行之前被终止,例如通过 SIGKILL

909* 会话在沙箱化命令仍在运行时退出,例如后台命令

903 910 

904在终端中运行 `claude doctor` 以列出残留的占位符文件。[`Sandbox mask files left behind at write-deny paths`](https://code.claude.com/docs/zh-CN/errors#stale-sandbox-mask-files-left-by-a-killed-session) 警告会列出其中部分文件的名称,并统计其余文件的数量。在该项目中没有其他 Claude Code 会话运行时,使用 `rm` 删除每个文件。在 v2.1.257 之前,Claude Code 会留下相同的占位符而不对其进行标记。911后续会话每次启动时都会再次将这些占位符以只读方式绑定,因此在占位符所在的位置,设置写入(如保存权限选择)会失败。

912 

913在终端中运行 `claude doctor` 以列出残留的占位符文件。[`Sandbox mask files left behind at write-deny paths`](https://code.claude.com/docs/zh-CN/errors#stale-sandbox-mask-files-left-by-a-killed-session) 警告会列出其中部分文件的名称,并统计其余文件的数量。在该项目中没有其他 Claude Code 会话运行时,使用 `rm` 删除每个文件。在 v2.1.257 之前,会话被终止时 Claude Code 会留下相同的占位符,而不对其进行标记。

905 914 

906### 启用沙箱时通过 SSH 使用 `git` 失败915### 启用沙箱时通过 SSH 使用 `git` 失败

907 916 


1000 1009 

1001在 v2.1.284 之前,代理会连接到允许的主机名所解析到的任何地址。1010在 v2.1.284 之前,代理会连接到允许的主机名所解析到的任何地址。

1002 1011 

1012### 命令因 `Sandbox is required` 被拒绝

1013 

1014如果您通过 [`sandbox.failIfUnavailable`](https://code.claude.com/docs/zh-CN/settings-reference#sandbox-failifunavailable) 要求使用沙箱,而沙箱在 Claude Code 启动后以下列方式之一失败,则 Claude 运行的每条沙箱化命令都会被拒绝,并显示相应的消息。会话会继续运行,被拒绝的命令不会在沙箱外运行:

1015 

1016* **`Sandbox is required but failed to initialize: <reason>`**:Claude Code 已启动,但沙箱随后初始化失败。请执行消息中给出的步骤:`Restart to retry.` 或 `Fix the sandbox settings to retry`。

1017* **`Sandbox is required (sandbox.failIfUnavailable) and stopped being available in this session: <reason>`**:在 Linux 或 WSL2 上,沙箱已启动,但 Claude Code 随后发现缺少某个依赖项。请修复原因中指出的问题,例如[安装缺失的依赖项](#set-up-linux-and-wsl2),然后重新启动 Claude Code。

1018 

1019被排除的命令和您自行输入的命令会继续运行,且 Claude 无法在沙箱外重试被拒绝的命令:

1020 

1021* **被排除的命令**:匹配 [`excludedCommands`](#run-commands-outside-the-sandbox-with-excludedcommands) 条目的命令会继续在沙箱外运行。当其中某条命令写入您工作目录之外的 [`filesystem.allowWrite`](https://code.claude.com/docs/zh-CN/settings-reference#sandbox-filesystem-allowwrite) 路径时,该写入会经过常规权限流程。在[管理员强制要求的沙箱](#repository-settings-under-an-admin-required-sandbox)下,Claude Code 会忽略来自仓库设置的条目

1022* **您在 [`!` shell 模式提示符](https://code.claude.com/docs/zh-CN/interactive-mode#shell-mode-with-prefix)处输入的命令**:继续在沙箱外运行。在[后台会话](https://code.claude.com/docs/zh-CN/agent-view.md)中,它们也会被拒绝

1023* **在沙箱外重试**:Claude Code 会忽略[在沙箱外重试](#the-unsandboxed-retry-escape-hatch)的 `dangerouslyDisableSandbox` 参数

1024 

1025在设置了 `CLAUDE_CODE_SUBPROCESS_ENV_SCRUB` 的 Linux 会话中,每条命令都在沙箱中运行,因此被排除的命令和您输入的命令也会被拒绝。

1026 

1003### `/sandbox` 因 `Sandbox settings are overridden by a higher-priority configuration` 失败1027### `/sandbox` 因 `Sandbox settings are overridden by a higher-priority configuration` 失败

1004 1028 

1005当更高的[设置级别](https://code.claude.com/docs/zh-CN/settings.md#settings-precedence)设置了 `sandbox.enabled`、`sandbox.autoAllowBashIfSandboxed` 或 `sandbox.allowUnsandboxedCommands` 时,`/sandbox` 会打印 `Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally.`,而不是打开其面板。该面板会将您的选择保存到 `.claude/settings.local.json`,而保存在那里的值无法覆盖这些级别。1029当更高的[设置级别](https://code.claude.com/docs/zh-CN/settings.md#settings-precedence)设置了 `sandbox.enabled`、`sandbox.autoAllowBashIfSandboxed` 或 `sandbox.allowUnsandboxedCommands` 时,`/sandbox` 会打印 `Error: Sandbox settings are overridden by a higher-priority configuration and cannot be changed locally.`,而不是打开其面板。该面板会将您的选择保存到 `.claude/settings.local.json`,而保存在那里的值无法覆盖这些级别。

Details

783 783 

784有关这些来源的应用顺序,请参阅[设置优先级](https://code.claude.com/docs/zh-CN/settings.md#settings-precedence)。784有关这些来源的应用顺序,请参阅[设置优先级](https://code.claude.com/docs/zh-CN/settings.md#settings-precedence)。

785 785 

786当 Anthropic 的控制平面为会话提供 [Claude Code hook](https://code.claude.com/docs/zh-CN/hooks.md) 时,运行器会将它们与您自己的配置并行安装,而不是覆盖您的配置。需要 Claude Code v2.1.229 或更高版本。786当 Anthropic 的控制平面为会话提供 [Claude Code hook](https://code.claude.com/docs/zh-CN/hooks.md) 时,运行器会将它们与您自己的配置并行安装,而不是覆盖您的配置。需要 Claude Code v2.1.229 或更高版本;较旧的运行器会忽略所提供的 hook。所提供的 hook 会运行 `python3`,因此请在您的[运行器镜像](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#build-the-runner-image)中安装 `python3`。

787 787 

788* **安装位置**:运行器将提供的每个 hook 脚本写入会话配置目录中保留的 `hooks/.ccr-launcher/` 子目录,并在一个单独的设置文件中注册这些脚本,该文件通过 `--settings` 传递给会话,从而使初始填充的 `settings.json` 以及您位于 `hooks/<name>` 的脚本保持不变。运行器会为每个会话重新创建该保留子目录,并且不会将主机上 `~/.claude/hooks/.ccr-launcher/` 中的内容填充到会话中。788* **安装位置**:运行器将提供的每个 hook 脚本写入会话配置目录中保留的 `hooks/.ccr-launcher/` 子目录,并在一个单独的设置文件中注册这些脚本,该文件通过 `--settings` 传递给会话,从而使初始填充的 `settings.json` 以及您位于 `hooks/<name>` 的脚本保持不变。运行器会为每个会话重新创建该保留子目录,并且不会将主机上 `~/.claude/hooks/.ccr-launcher/` 中的内容填充到会话中。

789* **编写者**:控制平面使用其自身部署中的固定常量填充这些脚本,绝不使用按会话或第三方的输入。789* **编写者**:控制平面使用其自身部署中的固定常量填充这些脚本,绝不使用按会话或第三方的输入。

Details

348 348 

349下面的配方使用 `--capacity 4`,所以一个容器为来自同一锁定所有者的最多四个并发会话服务。这不提供[加固部分](#harden-your-deployment)中的按会话容器隔离:在将环境连接到生产系统之前,要么以 `--capacity 1` 运行配方,每个会话一个容器,要么使用[按需运行器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners),它也将环境密钥保持在会话运行主机之外。如果您将[Anthropic git 代理](#use-the-anthropic-git-proxy)添加到这些配方之一,也要将 `--capacity` 更改为 `1`。349下面的配方使用 `--capacity 4`,所以一个容器为来自同一锁定所有者的最多四个并发会话服务。这不提供[加固部分](#harden-your-deployment)中的按会话容器隔离:在将环境连接到生产系统之前,要么以 `--capacity 1` 运行配方,每个会话一个容器,要么使用[按需运行器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners),它也将环境密钥保持在会话运行主机之外。如果您将[Anthropic git 代理](#use-the-anthropic-git-proxy)添加到这些配方之一,也要将 `--capacity` 更改为 `1`。

350 350 

351这个 Dockerfile 是一个最小的起点:351这个 Dockerfile 是一个最小的起点。它安装了 `python3`,因为 [Anthropic 控制平面提供](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#how-each-session’s-config-is-assembled)给 Claude Tag 会话的 hook(包括让 Claude 在 Slack 中发布回复的那个 hook)会运行 `python3`。在任何为 Claude Tag 会话提供服务的镜像中,请确保 `python3` 位于 `PATH` 中:

352 352 

353```dockerfile theme={null}353```dockerfile theme={null}

354FROM debian:bookworm-slim354FROM debian:bookworm-slim

355ARG CLAUDE_CODE_VERSION355ARG CLAUDE_CODE_VERSION

356RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates openssh-client jq \356RUN apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates openssh-client jq python3 \

357 && rm -rf /var/lib/apt/lists/*357 && rm -rf /var/lib/apt/lists/*

358RUN curl -fsSL "https://downloads.claude.ai/claude-code-releases/${CLAUDE_CODE_VERSION:?set with --build-arg CLAUDE_CODE_VERSION}/linux-x64/claude" \358RUN curl -fsSL "https://downloads.claude.ai/claude-code-releases/${CLAUDE_CODE_VERSION:?set with --build-arg CLAUDE_CODE_VERSION}/linux-x64/claude" \

359 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude359 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude


363ENTRYPOINT ["claude"]363ENTRYPOINT ["claude"]

364```364```

365 365 

366如果您的节点是 ARM,将 `linux-x64` 交换为 `linux-arm64`,或在 Alpine 等 musl 基础镜像上交换为 `linux-x64-musl` 或 `linux-arm64-musl`;请参阅 [Alpine Linux 设置](https://code.claude.com/docs/zh-CN/setup.md#alpine-linux-and-musl-based-distributions)了解 musl 镜像需要的额外包。URL 是标准 Claude Code 发布位置,因此您可以根据[二进制完整性和代码签名](https://code.claude.com/docs/zh-CN/setup.md#binary-integrity-and-code-signing)中描述的发布的已签名清单验证下载的二进制文件。运行器需要 Claude Code 版本 2.1.224 或更高版本。构建镜像,然后将其推送到您的注册表并在下面的配方中引用它:366如果您的节点是 ARM,将 `linux-x64` 交换为 `linux-arm64`,或在 Alpine 等 musl 基础镜像上交换为 `linux-x64-musl` 或 `linux-arm64-musl`;请参阅 [Alpine Linux 设置](https://code.claude.com/docs/zh-CN/setup.md#alpine-linux-and-musl-based-distributions)了解 musl 镜像需要的额外包。URL 是标准 Claude Code 发布位置,因此您可以根据[二进制完整性和代码签名](https://code.claude.com/docs/zh-CN/setup.md#binary-integrity-and-code-signing)中描述的发布的已签名清单验证下载的二进制文件。运行器需要 Claude Code 版本 2.1.224 或更高版本;若要为 Claude Tag 会话提供服务,则需要 2.1.229 或更高版本。构建镜像,然后将其推送到您的注册表并在下面的配方中引用它:

367 367 

368```bash theme={null}368```bash theme={null}

369docker build \369docker build \


768 * **使用 `checkout` hook 时**:通过 [`checkout` 生命周期 hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#checkout) 检出的仓库不会被推送。请改为从 [`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 对其进行快照。768 * **使用 `checkout` hook 时**:通过 [`checkout` 生命周期 hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#checkout) 检出的仓库不会被推送。请改为从 [`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 对其进行快照。

769 * **启用该标志之前**:限制谁可以推送到源远程上的 `claude/*` refs。在恢复时,运行器会获取之前推送的分支,而不验证是谁推送的。769 * **启用该标志之前**:限制谁可以推送到源远程上的 `claude/*` refs。在恢复时,运行器会获取之前推送的分支,而不验证是谁推送的。

770 * **未提交的更改仍会丢失**:要提示 Claude 在完成响应时提交并推送,请参阅[提示会话推送其工作](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)770 * **未提交的更改仍会丢失**:要提示 Claude 在完成响应时提交并推送,请参阅[提示会话推送其工作](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)

771* **因运行器丢失而中断的命令可能会再次运行**:当会话在另一个运行器上恢复时,Claude 会看到被中断的工具调用,其结果表明该调用的执行结果未知。

771* **会话中途添加的仓库可能无法克隆**:Claude 通过 HTTPS 使用 `git clone` 克隆它。在未启用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的运行器上,如果主机上没有任何内容能够读取该仓库,克隆会因 git 身份验证错误而失败。如有可能,请在创建会话时选择会话所需的每个仓库。772* **会话中途添加的仓库可能无法克隆**:Claude 通过 HTTPS 使用 `git clone` 克隆它。在未启用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) 的运行器上,如果主机上没有任何内容能够读取该仓库,克隆会因 git 身份验证错误而失败。如有可能,请在创建会话时选择会话所需的每个仓库。

772* **某些连接器不出现在自托管会话中**:您在 claude.ai Settings 中尚未连接的连接器不在自托管会话中列出,会话不会提示您连接它。首先在 Settings 中连接它,然后启动新会话。向已运行的会话添加连接器也不会使其工具对 Claude 可用;启动新会话以获取新添加的连接器。773* **某些连接器不出现在自托管会话中**:您在 claude.ai Settings 中尚未连接的连接器不在自托管会话中列出,会话不会提示您连接它。首先在 Settings 中连接它,然后启动新会话。向已运行的会话添加连接器也不会使其工具对 Claude 可用;启动新会话以获取新添加的连接器。

773* **当有人归档或删除会话,或从会话菜单中释放其运行器时**:不要依赖 [`--push-outcome-on-release`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 的推送。要在这些情况下保存提交,请从 [`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 将 `HEAD` 推送到一个救援分支。如果您以那里的示例为基础,请让它在没有任何未提交内容时也执行推送,因为该示例仅在创建快照提交之后才推送。774* **当有人归档或删除会话,或从会话菜单中释放其运行器时**:不要依赖 [`--push-outcome-on-release`](https://code.claude.com/docs/zh-CN/self-hosted-environments-reference#runner-cli-flags) 的推送。要在这些情况下保存提交,请从 [`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 将 `HEAD` 推送到一个救援分支。如果您以那里的示例为基础,请让它在没有任何未提交内容时也执行推送,因为该示例仅在创建快照提交之后才推送。


824 升级运行器或修复原因后,请重试该会话或启动新会话。如果这些检查都未能找到原因,请[报告问题](#report-an-issue)。825 升级运行器或修复原因后,请重试该会话或启动新会话。如果这些检查都未能找到原因,请[报告问题](#report-an-issue)。

825 826 

826 对于会话推送结果的源,删除的分支会导致会话失败。对于会话仅从中读取的 git 源,运行器跳过该源并继续处理其余源。当跳过会导致会话完全没有仓库时,运行器会使会话失败。在 v2.1.228 之前,这样的会话在空目录中启动。827 对于会话推送结果的源,删除的分支会导致会话失败。对于会话仅从中读取的 git 源,运行器跳过该源并继续处理其余源。当跳过会导致会话完全没有仓库时,运行器会使会话失败。在 v2.1.228 之前,这样的会话在空目录中启动。

828* **Claude Tag 有时不在 Slack 中发布其回复**:回复提醒是一个[由控制平面提供的 hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#how-each-session’s-config-is-assembled)。请使用 `claude --version` 确认运行器为 Claude Code v2.1.229 或更高版本,因为较旧的运行器会忽略所提供的 hook;确认 `python3 --version` 在运行器镜像中能够成功执行,因为这些 hook 会运行 `python3`;并确认没有任何设置文件关闭了 hook,无论是 `managed-settings.json`、运行器用户的 `~/.claude/settings.json`、仓库的 `.claude/settings.json` 或 `.claude/settings.local.json` 中的 `disableAllHooks`,还是托管设置中的 `allowManagedHooksOnly` 或涵盖 hook 的 [`strictPluginOnlyCustomization`](https://code.claude.com/docs/zh-CN/settings-reference#strictpluginonlycustomization)。

827* **会话启动时缺少其中一个存储库**:在没有 [`checkout` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#checkout) 的运行器上,git 主机可能会拒绝运行器对会话仅从中读取的存储库的访问检查。运行器随后跳过该存储库,记录一条 `[runner:warn] could not access context source` 行,命名拒绝,并在其余存储库上启动会话。829* **会话启动时缺少其中一个存储库**:在没有 [`checkout` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#checkout) 的运行器上,git 主机可能会拒绝运行器对会话仅从中读取的存储库的访问检查。运行器随后跳过该存储库,记录一条 `[runner:warn] could not access context source` 行,命名拒绝,并在其余存储库上启动会话。

828 830 

829 运行器仅跳过明确的拒绝:主机回答存储库未找到,git 找不到主机的凭证,或身份验证失败。网络故障、超时或 HTTP `403` 仍会导致会话启动失败,对于会话推送结果的存储库的拒绝也是如此。运行器仍会失败一个会话,跳过会导致它完全没有存储库。使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy),运行器仅跳过 git 代理本身拒绝的存储库。831 运行器仅跳过明确的拒绝:主机回答存储库未找到,git 找不到主机的凭证,或身份验证失败。网络故障、超时或 HTTP `403` 仍会导致会话启动失败,对于会话推送结果的存储库的拒绝也是如此。运行器仍会失败一个会话,跳过会导致它完全没有存储库。使用 [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy),运行器仅跳过 git 代理本身拒绝的存储库。

Details

35 35 

36在启动之前在主机上安装:36在启动之前在主机上安装:

37 37 

38* **Claude Code v2.1.224 或更高版本**,使用任何[标准安装方法](https://code.claude.com/docs/zh-CN/setup.md)。运行器是标准 `claude` 二进制文件的一部分,较早的版本不识别 `self-hosted-runner` 子命令。要固定您的主机集群运行的确切版本,请参阅[安装特定版本](https://code.claude.com/docs/zh-CN/setup.md#install-a-specific-version)。对于容器镜像,请参阅[部署到生产环境](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#build-the-runner-image)中的 Dockerfile。38* **Claude Code v2.1.224 或更高版本**,使用任何[标准安装方法](https://code.claude.com/docs/zh-CN/setup.md)。运行器是标准 `claude` 二进制文件的一部分,较早的版本不识别 `self-hosted-runner` 子命令。为 Claude Tag 会话提供服务的运行器需要 v2.1.229 或更高版本,并且其 `PATH` 上需要有 `python3`,因为[控制平面提供的 hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#how-each-session’s-config-is-assembled) 会为这些会话运行 `python3`。要固定您的主机集群运行的确切版本,请参阅[安装特定版本](https://code.claude.com/docs/zh-CN/setup.md#install-a-specific-version)。对于容器镜像,请参阅[部署到生产环境](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#build-the-runner-image)中的 Dockerfile。

39* **Git 2.24 或更高版本**。部署页面上的某些 git 选项需要更高版本;[配置 git](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#configure-git)说明了每个下限。39* **Git 2.24 或更高版本**。部署页面上的某些 git 选项需要更高版本;[配置 git](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#configure-git)说明了每个下限。

40 40 

41确认主机已准备好:41确认主机已准备好:

Details

16 16 

17## Runner CLI 标志17## Runner CLI 标志

18 18 

19大多数标志都有相应的环境变量。当两者都设置时,标志优先。持续时间标志在 CLI 上采用分钟或秒,但配对的环境变量始终以毫秒为单位,由 `_MS` 后缀表示,默认列显示标志的单位:`--exit-if-unused-min 10` 等同于 `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000`,而 Helm 值如 `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15"` 表示 15 毫秒,而不是 15 分钟的默认值。19大多数标志都有对应的环境变量。两者同时设置时,标志优先。时长类标志在 CLI 中以分钟或秒为单位,但对应的环境变量始终以毫秒为单位(由 `_MS` 后缀表示),而“默认值”列显示的是标志的单位:`--exit-if-unused-min 10` 等同于 `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000`,而像 `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15"` 这样的 Helm 值表示 15 毫秒,而不是默认的 15 分钟。

20 20 

21| 标志 | 环境变量 | 默认值 | 描述 |21| 标志 | 环境变量 | 默认值 | 描述 |

22| :- | :- | :- | :- |22| :- | :- | :- | :- |

23| `--api-url <url>` | 无 | `https://api.anthropic.com` | API 基础 URL。仅为测试覆盖。 |23| `--api-url <url>` | 无 | `https://api.anthropic.com` | API 基础 URL。仅在测试时覆盖。 |

24| `--base-dir <path>` | `SELF_HOSTED_RUNNER_BASE_DIR` | `/workspace`;Windows 上无 | 用于存储库检出和每个会话工作目录的目录。运行器需要对此路径或其父路径的写入访问权限。运行器在启动时创建目录,当无法创建或写入时以 `cannot create or write to base directory` 退出。在 v2.1.225 之前,运行器在第一个会话启动时创建目录,因此不可用的路径会导致会话失败而不是启动失败。在 Windows 上(不是受支持的运行器主机),没有默认值:除非您传递标志或设置变量,否则运行器在启动时退出。在环境中的每个运行器上使用相同的值。请参阅[在运行器之间保持基础目录和容量相同](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#keep-the-base-directory-and-capacity-identical-across-runners)。 |24| `--base-dir <path>` | `SELF_HOSTED_RUNNER_BASE_DIR` | `/workspace`;在 Windows 上无默认值 | 用于仓库检出和每个会话工作目录的目录。runner 需要对此路径或其父目录具有写入权限。runner 在启动时创建该目录,若无法创建或写入该目录,则以 `cannot create or write to base directory` 退出。在 v2.1.225 之前,runner 在第一个会话启动时才创建该目录,因此不可用的路径会导致会话失败,而不是启动失败。在 Windows 上(Windows 不是受支持的 runner 主机)没有默认值:除非您传入该标志或设置该变量,否则 runner 会在启动时退出。在同一环境中的每个 runner 上使用相同的值。请参阅[在各 runner 之间保持基础目录和容量一致](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#keep-the-base-directory-and-capacity-identical-across-runners)。 |

25| `--capacity <n>` | 无 | `1` | 此运行器处理的最大并发会话数。所有会话都属于同一个锁定的[所有者](https://code.claude.com/docs/zh-CN/self-hosted-environments#key-concepts)。在环境中的每个运行器上使用相同的值;请参阅[在运行器之间保持基础目录和容量相同](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#keep-the-base-directory-and-capacity-identical-across-runners)。 |25| `--capacity <n>` | 无 | `1` | 此 runner 处理的最大并发会话数。所有会话都属于同一个已锁定的[所有者](https://code.claude.com/docs/zh-CN/self-hosted-environments#key-concepts)。在同一环境中的每个 runner 上使用相同的值;请参阅[在各 runner 之间保持基础目录和容量一致](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#keep-the-base-directory-and-capacity-identical-across-runners)。 |

26| `--client-label <label>` | `SELF_HOSTED_RUNNER_CLIENT_LABEL` | 主机的主机名 | 运行器注册时发送的标签。运行器还将其报告为 [`claude_code_self_hosted_runner_info`](#prometheus-metrics) 的 `client_label` 标签。需要 Claude Code v2.1.248 或更高版本。 |26| `--client-label <label>` | `SELF_HOSTED_RUNNER_CLIENT_LABEL` | 主机的主机名 | runner 注册时发送的标签。runner 还会将其作为 [`claude_code_self_hosted_runner_info`](#prometheus-metrics) 的 `client_label` 标签进行报告。需要 Claude Code v2.1.248 或更高版本。 |

27| `--configure-git` | `SELF_HOSTED_RUNNER_CONFIGURE_GIT=1` | 关闭 | 在启动时,写入全局 git 身份,启用 Anthropic 提交签名,打开 git push 协商,并安装追加 `Co-authored-by:` 预告片的提交钩子。Push 协商需要 Claude Code v2.1.257 或更高版本。请参阅[配置 git](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#configure-git)。 |27| `--configure-git` | `SELF_HOSTED_RUNNER_CONFIGURE_GIT=1` | 关闭 | 在启动时写入全局 git 身份、启用 Anthropic 提交签名、打开 git push 协商,并安装用于追加 `Co-authored-by:` 尾注的提交钩子。push 协商需要 Claude Code v2.1.257 或更高版本。请参阅[配置 git](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#configure-git)。 |

28| `--confine-repo-settings <mode>` | `SELF_HOSTED_RUNNER_CONFINE_REPO_SETTINGS` | `warn` | 设置保护的模式,当存储库的已提交设置尝试授予对该会话自己的工作区之外的写入或读取访问权限、设置环境变量或覆盖操作员的沙箱或钩子姿态(例如 `sandbox.enabled: false` 或 `disableAllHooks`)时标记会话。默认 `warn` 记录违规并仍然启动会话,`enforce` 拒绝会话,`off` 禁用扫描。请参阅[加强您的部署](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#harden-your-deployment)。 |28| `--confine-repo-settings <mode>` | `SELF_HOSTED_RUNNER_CONFINE_REPO_SETTINGS` | `warn` | 设置防护机制的模式:当仓库中已提交的设置试图授予该会话自身工作区之外的写入或读取权限、设置环境变量,或覆盖运维人员的沙箱或 hook 策略(例如 `sandbox.enabled: false` 或 `disableAllHooks`)时,该防护机制会标记该会话。默认值 `warn` 会记录违规并仍然启动会话,`enforce` 会拒绝该会话,`off` 则禁用扫描。请参阅[加固您的部署](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#harden-your-deployment)。 |

29| `--debug-token-dir <path>` | `SELF_HOSTED_RUNNER_DEBUG_TOKEN_DIR` | 未设置 | 将实时令牌写入磁盘以供检查。仅用于调试;不要在生产中使用。 |29| `--debug-token-dir <path>` | `SELF_HOSTED_RUNNER_DEBUG_TOKEN_DIR` | 未设置 | 将有效令牌写入磁盘以供检查。仅用于调试;请勿在生产环境中使用。 |

30| `--defer-shutdown-max-min <n>` | `SELF_HOSTED_RUNNER_DEFER_SHUTDOWN_MAX_MS` | `0` | 在第一个 `SIGTERM` 或 `SIGINT` 上,继续为已附加的会话提供服务而不是排空它们,然后在 N 分钟后释放仍然附加的任何内容并退出。在设置此值之前提高主机的停止超时。请参阅[将排空推迟到第一个信号之后](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#defer-the-drain-past-the-first-signal)。`0` 禁用。需要 Claude Code v2.1.238 或更高版本。 |30| `--defer-shutdown-max-min <n>` | `SELF_HOSTED_RUNNER_DEFER_SHUTDOWN_MAX_MS` | `0` | 收到第一个 `SIGTERM` 或 `SIGINT` 时,继续为已附加的会话提供服务而不是排空它们,然后在 N 分钟后释放仍附加的所有会话并退出。设置此项之前,请先调高主机的停止超时时间。请参阅[将排空推迟到第一个信号之后](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#defer-the-drain-past-the-first-signal)。`0` 表示禁用。需要 Claude Code v2.1.238 或更高版本。 |

31| `--drain-grace-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_GRACE_MS` | `0` | 在运行器接收到关闭信号或达到其退休时间之前,控制运行器在其活跃会话完成后何时退出:`0` 立即退出而不轮询更多内容,正值使运行器保持活跃并首先重新轮询锁定所有者的队列那么多秒,代价是[加强部分](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#harden-your-deployment)中描述的每个会话容器隔离。在您使用 [`--defer-shutdown-max-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 推迟的第一个信号之后,运行器在不持有任何会话时立即退出,无论您在此处设置什么。 |31| `--drain-grace-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_GRACE_MS` | `0` | 在 runner 收到关闭信号或到达其退役时间之前,控制 runner 在其活动会话结束后何时退出:`0` 表示立即退出而不再轮询更多工作;正值则使 runner 保持存活,并先在该秒数内重新轮询已锁定所有者的队列,代价是失去[加固部分](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#harden-your-deployment)中所述的每会话容器隔离。如果您使用 [`--defer-shutdown-max-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 推迟了第一个信号,则无论此处如何设置,runner 都会在不再持有任何会话时立即退出。 |

32| `--drain-marker-file <path>` | `SELF_HOSTED_RUNNER_DRAIN_MARKER_FILE` | 未设置 | 标记文件,您的主机写入该文件以在发送 `SIGTERM` 之前宣布优雅排空。当文件在排空开始时存在时,运行器将其退出报告给 Anthropic 作为主机排空而不是普通关闭信号。排空本身(包括 `--drain-wait-sec` 保持)的运行方式与没有标志相同。在会话无法写入的本地文件系统上命名路径。需要 Claude Code v2.1.271 或更高版本。 |32| `--drain-marker-file <path>` | `SELF_HOSTED_RUNNER_DRAIN_MARKER_FILE` | 未设置 | 标记文件,由您的主机在发送 `SIGTERM` 之前写入,以通告一次正常排空。如果排空开始时该文件存在,runner 会向 Anthropic 报告其退出原因为主机排空,而不是普通的关闭信号。排空过程本身(包括 `--drain-wait-sec` 的等待)与不使用该标志时相同。请指定本地文件系统上会话无法写入的路径。需要 Claude Code v2.1.271 或更高版本。 |

33| `--drain-wait-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_WAIT_MS` | `0` | 一旦排空开始(在 `SIGTERM` 上,除非您设置 [`--defer-shutdown-max-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal)),等待最多 N 秒以完成每个会话的进行中的轮次和后台任务,然后终止子进程。在此等待期间,运行器将刚刚完成的后台任务计为仍在运行,直到读取其结果的后续轮次开始,最多为 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 窗口。[同时提高您的停止超时时间](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#let-running-turns-finish-before-a-restart)。 |33| `--drain-wait-sec <n>` | `SELF_HOSTED_RUNNER_DRAIN_WAIT_MS` | `0` | 排空开始后(除非您设置了 [`--defer-shutdown-max-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal),否则排空在收到 `SIGTERM` 时开始),最多等待 N 秒,让每个会话正在进行的轮次和后台任务完成,然后再终止子进程。在此等待期间,runner 会将刚刚完成的后台任务视为仍在运行,直到读取其结果的后续轮次开始为止,最长不超过 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 窗口。[同时调高您的停止超时时间](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#let-running-turns-finish-before-a-restart)。 |

34| `--environment-secret-file <path>` | `SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET` | 必需 | 包含环境密钥的文件的路径,或对于由[编排器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners)生成的运行器,单次使用的工作订单 JWT。`SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET` 直接携带密钥值,而不是文件路径。较旧的 `--pool-secret-file` 标志和 `SELF_HOSTED_RUNNER_POOL_SECRET` 变量仍然有效并向 stderr 打印弃用通知;早于 2.1.216 的预览程序运行器构建仅识别这些较旧的名称。 |34| `--environment-secret-file <path>` | `SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET` | 必需 | 包含环境密钥的文件路径;对于由[编排器](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#on-demand-runners)生成的 runner,则为一次性工作单 JWT 的文件路径。`SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET` 直接携带密钥值,而不是文件路径。旧的 `--pool-secret-file` 标志和 `SELF_HOSTED_RUNNER_POOL_SECRET` 变量仍然有效,并会向 stderr 打印弃用通知;早于 2.1.216 的预览计划 runner 构建版本只识别这些旧名称。 |

35| `--exec-path <path>` | `SELF_HOSTED_RUNNER_EXEC_PATH` | 自己的二进制文件 | 为每个会话生成的二进制文件或包装脚本。请参阅[包装脚本](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#wrapper-scripts)。 |35| `--exec-path <path>` | `SELF_HOSTED_RUNNER_EXEC_PATH` | 自身二进制文件 | 为每个会话生成的二进制文件或包装脚本。请参阅[包装脚本](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#wrapper-scripts)。 |

36| `--exit-if-unused-min <n>` | `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS` | `0` | 在 N 分钟的轮询后退出,没有任何工作被分配,用于自动扩展器缩小。`0` 禁用。 |36| `--exit-if-unused-min <n>` | `SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS` | `0` | 在轮询 N 分钟且从未分配到任何工作后退出,用于自动扩缩器缩容。`0` 表示禁用。 |

37| `--git-host-rewrite <from>=<to>` | 无 | 未设置 | 在克隆之前将 `https://<from>/...` 源 URL 重写为 `https://<to>/...`,用于分割视界 DNS。可重复;仅标志。 |37| `--git-host-rewrite <from>=<to>` | 无 | 未设置 | 在克隆之前将 `https://<from>/...` 源 URL 改写为 `https://<to>/...`,用于拆分视图 DNS。可重复使用;仅限标志。 |

38| `--git-ssh-rewrite <host>` | 无 | 未设置 | 在克隆之前将 `https://<host>/...` 源 URL 重写为 `git@<host>:...`,用于仅 SSH git 主机。可重复;仅标志。 |38| `--git-ssh-rewrite <host>` | 无 | 未设置 | 在克隆之前将 `https://<host>/...` 源 URL 改写为 `git@<host>:...`,用于仅支持 SSH 的 git 主机。可重复使用;仅限标志。 |

39| `--health-port <port>` | `SELF_HOSTED_RUNNER_HEALTH_PORT` | `8080` | `/healthz` 和 `/metrics` 侦听器的端口。设置 `0` 以禁用。 |39| `--health-port <port>` | `SELF_HOSTED_RUNNER_HEALTH_PORT` | `8080` | `/healthz` 和 `/metrics` 监听器的端口。设置为 `0` 可禁用。 |

40| `--hooks-dir <path>` | `SELF_HOSTED_RUNNER_HOOKS_DIR` | 未设置 | 生命周期钩子脚本的目录。请参阅[生命周期钩子](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#lifecycle-hooks)。 |40| `--hooks-dir <path>` | `SELF_HOSTED_RUNNER_HOOKS_DIR` | 未设置 | 生命周期 hook 脚本所在的目录。请参阅[生命周期 hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#lifecycle-hooks)。 |

41| `--host-config-snapshot <mode>` | `SELF_HOSTED_RUNNER_HOST_CONFIG_SNAPSHOT` | `disk` | 运行器保持[主机配置目录](#environment-variable-only-settings)启动快照的位置,它从该快照为每个会话播种。`disk` 将快照复制到 `--base-dir` 下的运行器拥有的目录中,并在每个会话启动时,验证每个文件与内存中的摘要。如果副本中的文件已被修改,会话失败,运行器拒绝会话,直到您重新启动它。`memory` 在堆上保持整个快照,上限为 64 MiB;超过上限,会话启动时没有主机配置,并显示说明这一点的通知。当运行器无法写入磁盘快照时,它记录失败并为该运行使用 `memory`。需要 Claude Code v2.1.271 或更高版本。 |41| `--host-config-snapshot <mode>` | `SELF_HOSTED_RUNNER_HOST_CONFIG_SNAPSHOT` | `disk` | runner 保存[主机配置目录](#environment-variable-only-settings)启动快照的位置,runner 以该快照为每个会话提供初始内容。`disk` 会将快照复制到 `--base-dir` 下由 runner 拥有的目录中,并在每次会话启动时根据内存中的摘要校验每个文件。如果副本中的某个文件已被修改,该会话会失败,并且 runner 会拒绝会话,直到您重启它。`memory` 将整个快照保存在堆上,上限为 64 MiB;超过上限时,会话将在没有主机配置的情况下启动,并显示相应通知。当 runner 无法写入磁盘快照时,它会记录该失败,并在本次运行中使用 `memory`。需要 Claude Code v2.1.271 或更高版本。 |

42| `--kill-session-after-min <n>` | `SELF_HOSTED_RUNNER_MAX_LIFETIME_MS` | `0` | 将会话限制为 N 分钟的挂钟时间,作为卡住会话的安全限制。在 v2.1.260 或更高版本上,运行器释放达到限制的会话,以便它可以在其用户的下一条消息上恢复,仅当它在 [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) 宽限期结束时仍在运行器上时才终止它。在 v2.1.260 之前,运行器在限制处终止会话。请参阅[某些会话不计为空闲](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#some-sessions-don%E2%80%99t-count-as-idle)了解详情以及如何选择值。`0` 禁用。 |42| `--kill-session-after-min <n>` | `SELF_HOSTED_RUNNER_MAX_LIFETIME_MS` | `0` | 将会话的挂钟时间限制为 N 分钟,作为针对卡住会话的安全限制。在 v2.1.260 或更高版本中,runner 会释放达到该限制的会话,以便其在用户发送下一条消息时恢复;只有当 [`SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS`](#environment-variable-only-settings) 宽限窗口结束时该会话仍在 runner 上,才会将其终止。在 v2.1.260 之前,runner 会在达到限制时终止会话。有关详细信息以及如何选择取值,请参阅[某些会话不计为空闲](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#some-sessions-don’t-count-as-idle)。`0` 表示禁用。 |

43| `--lock-to-account <id>` | `SELF_HOSTED_RUNNER_LOCK_TO_ACCOUNT` | 未设置 | 在启动时将运行器预锁定到特定帐户,而不是在第一个会话上锁定。接受环境组织中的电子邮件地址或 `user_...` ID。预锁定的运行器永远不会拾取 Claude Tag 频道会话,这些会话没有帐户。 |43| `--lock-to-account <id>` | `SELF_HOSTED_RUNNER_LOCK_TO_ACCOUNT` | 未设置 | 在启动时将 runner 预先锁定到特定账户,而不是在第一个会话时锁定。接受该环境所属组织中的电子邮件地址或 `user_...` ID。预先锁定的 runner 永远不会接收 Claude Tag 频道会话,因为这些会话没有账户。 |

44| `--log-file <path>` | `SELF_HOSTED_RUNNER_LOG_FILE` | 未设置 | 除了 stdout 和 stderr 之外,还将运行器日志镜像到文件,使用 `0600` 权限创建。`self-hosted-runner doctor` 需要在本地尾部日志。 |44| `--log-file <path>` | `SELF_HOSTED_RUNNER_LOG_FILE` | 未设置 | 除 stdout 和 stderr 外,还将 runner 日志镜像写入一个文件,该文件以 `0600` 权限创建。`self-hosted-runner doctor` 要在本地跟踪日志,必须设置此项。 |

45| `--log-level <level>` | 无 | `info` | `info` 或 `debug` |45| `--log-level <level>` | 无 | `info` | `info` 或 `debug` |

46| `--post-session-hook-timeout-sec <n>` | `SELF_HOSTED_RUNNER_POST_SESSION_HOOK_TIMEOUT_MS` | `60` | 每个会话结束(包括运行器关闭)时 [`post-session` 钩子](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session)的预算 |46| `--post-session-hook-timeout-sec <n>` | `SELF_HOSTED_RUNNER_POST_SESSION_HOOK_TIMEOUT_MS` | `60` | 每次会话结束时(包括 runner 关闭时)[`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 的时间预算 |

47| `--proxy-authorization-command <command>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_COMMAND` | 未设置 | 运行器为每个到您的出口代理的连接运行的 shell 命令,使用其修剪的 stdout 作为 `Proxy-Authorization` 标头值。需要 `HTTPS_PROXY` 或 `HTTP_PROXY`,不能与 `--proxy-authorization-file` 结合。请参阅[向出口代理进行身份验证](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy)。需要 Claude Code v2.1.238 或更高版本。 |47| `--proxy-authorization-command <command>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_COMMAND` | 未设置 | runner 在每次连接您的出口代理时运行的 shell 命令,其去除首尾空白后的 stdout 用作 `Proxy-Authorization` 标头值。需要 `HTTPS_PROXY` 或 `HTTP_PROXY`,且不能与 `--proxy-authorization-file` 同时使用。请参阅[向出口代理进行身份验证](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy)。需要 Claude Code v2.1.238 或更高版本。 |

48| `--proxy-authorization-file <path>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_FILE` | 未设置 | 运行器为每个到您的出口代理的连接读取的文件,使用其修剪的内容作为 `Proxy-Authorization` 标头值。对另一个进程轮换到位的令牌使用此标志。与 `--proxy-authorization-command` 具有相同的要求,不能与其结合。请参阅[向出口代理进行身份验证](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy)。需要 Claude Code v2.1.238 或更高版本。 |48| `--proxy-authorization-file <path>` | `SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_FILE` | 未设置 | runner 在每次连接您的出口代理时读取的文件,其去除首尾空白后的内容用作 `Proxy-Authorization` 标头值。对于由其他进程原地轮换的令牌,请使用此标志。要求与 `--proxy-authorization-command` 相同,且不能与其同时使用。请参阅[向出口代理进行身份验证](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#authenticate-to-an-egress-proxy)。需要 Claude Code v2.1.238 或更高版本。 |

49| `--push-outcome-on-release` | `SELF_HOSTED_RUNNER_PUSH_OUTCOME_ON_RELEASE` | 关闭 | 在运行器启动的会话结束(例如排空或空闲释放)时,在删除工作区之前将跟踪的结果分支推送到 `origin`,以便进行中的提交在重新启动后存活。尽力而为;向关闭预算添加 30 秒,需要 git 2.29 或更高版本以从推送的分支恢复。在启用之前限制对 `claude/*` refs 的推送访问;请参阅[恢复的会话丢失未推送的工作](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#additional-limitations)。通过 `checkout` 生命周期钩子检出的存储库不会被推送;改为从 [`post-session` 钩子](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session)快照这些。 |49| `--push-outcome-on-release` | `SELF_HOSTED_RUNNER_PUSH_OUTCOME_ON_RELEASE` | 关闭 | 在由 runner 发起的会话结束(例如排空或空闲释放)时,在删除工作区之前将跟踪的结果分支推送到 `origin`,以便进行中的提交在重启后得以保留。尽力而为;会为关闭预算增加 30 秒,且需要 git 2.29 或更高版本才能从推送的分支恢复。启用前请将推送权限限制为 `claude/*` 引用;请参阅[恢复的会话会丢失未推送的工作](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#additional-limitations)。通过 `checkout` 生命周期 hook 检出的仓库不会被推送;请改为在 [`post-session` hook](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration#post-session) 中为其创建快照。 |

50| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | 在轮次完成或会话等待用户操作后,在 N 分钟的不活动后释放会话槽。仍在进行中的会话(包括持有永不完成的后台任务或从运行的工具调用内部请求的批准的会话)不计为空闲;与 `--kill-session-after-min` 配对作为硬后挡。在会话的后台任务完成后,运行器认为会话繁忙,直到读取结果的后续轮次开始,最多为 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 窗口。在运行器接收到关闭信号或达到其退休时间之前,留下运行器没有活跃会话的释放启动与正常排空相同的退出路径,由 `--drain-grace-sec` 管理。在您使用 [`--defer-shutdown-max-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 推迟的第一个信号之后,运行器在释放使其不持有任何会话时立即退出。`0` 禁用。 |50| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | 在轮次结束或会话等待用户操作后,若不活动达 N 分钟,则释放会话槽位。仍处于轮次中的会话(包括持有永不结束的后台任务的会话,或在正在运行的工具调用内部请求了批准的会话)不计为空闲;请搭配 `--kill-session-after-min` 作为硬性兜底。会话的后台任务完成后,runner 会将该会话视为忙碌,直到读取结果的后续轮次开始为止,最长不超过 [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings) 窗口。在 runner 收到关闭信号或到达其退役时间之前,如果一次释放使 runner 不再有活动会话,则会启动与正常排空相同的退出流程,由 `--drain-grace-sec` 控制。如果您使用 [`--defer-shutdown-max-min`](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal) 推迟了第一个信号,则一旦某次释放使 runner 不再持有任何会话,runner 就会立即退出。`0` 表示禁用。 |

51| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | 关闭 | 当会话在此运行器上结束时,删除 `<base-dir>/_sessions/` 下的会话的每个会话目录,无论结果如何。[重用预热的检出](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout)描述它们保存的内容以及当它们保留时谁可以读取它们。删除是尽力而为:当运行器被杀死或在清理运行之前达到其排空截止时间时,每个会话目录保持到位。启用标志后,失败或中断的会话的调试日志不会保留在磁盘上。需要 Claude Code v2.1.268 或更高版本。 |51| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | 关闭 | 当会话在此 runner 上结束时,无论结果如何,都删除该会话在 `<base-dir>/_sessions/` 下的每会话目录。[复用预热的检出](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#reuse-a-pre-warmed-checkout)介绍了这些目录保存的内容,以及它们保留时谁可以读取。删除是尽力而为的:如果 runner 在清理运行之前被终止或到达其排空截止时间,每会话目录将保留原位。启用该标志后,失败或中断的会话的调试日志不会保留在磁盘上。需要 Claude Code v2.1.268 或更高版本。 |

52| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | 未设置 | 在绝对 Unix 时间戳(以秒为单位)处退休运行器,用于在已知时间杀死运行器的基础设施;[运行器生命周期](https://code.claude.com/docs/zh-CN/self-hosted-environments#runner-lifecycle)描述释放序列以及如何调整边距。2001 年之前或 5138 年之后的值被标志拒绝,被环境变量忽略。 |52| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | 未设置 | 在以秒为单位的绝对 Unix 时间戳处让 runner 退役,适用于会在已知时间终止 runner 的基础设施;[Runner 生命周期](https://code.claude.com/docs/zh-CN/self-hosted-environments#runner-lifecycle)介绍了释放顺序以及如何确定余量。早于 2001 年或晚于 5138 年的值会被该标志拒绝,并被该环境变量忽略。 |

53| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | 控制平面随会话发送的[自动模式](https://code.claude.com/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)分类器规则列表中,哪些可以到达该会话:`all`、`no-allow` 或 `none`。请参阅[自动模式规则列表](#auto-mode-rule-lists)了解每个值应用的内容。无效值会使运行器在启动时停止。需要 Claude Code v2.1.295 或更高版本。 |53| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | 控制平面随会话发送的[自动模式](https://code.claude.com/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)分类器规则列表中,哪些可以作用于该会话:`all`、`no-allow` 或 `none`。有关每个值应用的内容,请参阅[自动模式规则列表](#auto-mode-rule-lists)。无效值会使 runner 在启动时停止。需要 Claude Code v2.1.295 或更高版本。 |

54| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | 会话结束后等待 Claude 进程干净退出的时间,然后强制杀死它。如果子进程自己的 `SessionEnd` 钩子需要更多时间,请提高该值。 |54| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | 会话结束后,在强制终止 Claude 进程之前等待其正常退出的时长。如果子进程自身的 `SessionEnd` hook 需要更多时间,请调高此值。 |

55| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | 如果子进程在 N 分钟内未在[活动频道](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#keep-stdin-and-file-descriptor-3-attached)上发出已完成初始化的信号,则释放会话槽。这 N 分钟从生成(克隆之后)开始计时,并在子进程完成初始化或报告其状态之前每发出一条 `user` 或 `assistant` 消息时重新开始计时。在 v2.1.299 之前,此超时在会话出现第一条此类消息时即不再适用。有关初始化信号之后的释放,请参阅 `--release-idle-session-min`。`0` 禁用。 |55| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | 在释放会话槽位之前,等待尚未初始化的子进程的时长。有关计时从何处开始以及哪些会话会继续运行,请参阅[会话启动超时](#session-startup-timeout)。`0` 表示禁用超时。 |

56| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | 开启 | 为每个会话的存储库路径播种持久化信任,以便遵守存储库提交的 `permissions.allow` 和 `additionalDirectories`。设置 `false` 以删除存储库提交的权限授予,并在主机配置的 `settings.json` 中配置允许规则;无论如何,存储库提交的 `sandbox.*` 设置仍然适用,这就是为什么[存储库设置保护](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#harden-your-deployment)无论此标志如何都扫描它们。 |56| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | 开启 | 为每个会话的仓库路径预置持久化信任,以便遵循仓库中已提交的 `permissions.allow` 和 `additionalDirectories`。设置为 `false` 可丢弃仓库中已提交的权限授予,并改为在主机配置的 `settings.json` 中配置允许规则;无论哪种方式,仓库中已提交的 `sandbox.*` 设置仍然适用,这也是[仓库设置防护机制](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#harden-your-deployment)无论此标志如何都会扫描它们的原因。 |

57| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | 关闭 | 通过 [Anthropic git 代理](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#use-the-anthropic-git-proxy)而不是客户管理的 git 身份验证克隆 github.com 上的仓库。需要 `--capacity 1` 和 git 2.32 或更高版本;运行器否则拒绝启动。取代重写标志。 |57| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | 关闭 | 通过 [Anthropic git 代理](https://code.claude.com/docs/zh-CN/self-hosted-environments-deploy.md#use-the-anthropic-git-proxy)克隆 github.com 上的仓库,而不是使用客户自管的 git 身份验证。需要 `--capacity 1` 和 git 2.32 或更高版本,否则 runner 会拒绝启动。此标志取代改写类标志。 |

58 58 

59大多数持续时间标志都有最大值,选择以将每个超时保持在运行时的 32 位计时器上限内,大约 24.85 天。`--*-min` 标志上限为 10080 分钟,7 天;`--drain-grace-sec` 为 604800 秒,也是 7 天;`--drain-wait-sec` 为 86400 秒,24 小时。`--session-stop-grace-sec` 和 `--post-session-hook-timeout-sec` 无上限。超过上限的行为因表面而异:59大多数时长类标志都有上限,其选择是为了使每个超时都保持在运行时约 24.85 天的 32 位计时器上限之内。`--*-min` 标志的上限为 10080 分钟,即 7 天;`--drain-grace-sec` 为 604800 秒,同样是 7 天;`--drain-wait-sec` 为 86400 秒,即 24 小时。`--session-stop-grace-sec` 和 `--post-session-hook-timeout-sec` 没有上限。超出上限时,不同使用方式的行为有所不同:

60 60 

61* **标志**:启动失败并出现错误。61* **标志**:启动失败并报错。

62* **环境变量**:运行器将值夹紧到计时器上限,而不是拒绝它。62* **环境变量**:runner 将该值截断为计时器上限,而不是拒绝它。

63 

64### 会话启动超时

65 

66如果会话在 `/code-review` 等轮次中丢失了槽位,请将 runner 和子进程二进制文件更新到 v2.1.309 或更高版本。在 v2.1.299 至 v2.1.308 中,一旦启动超时已过且没有 `user` 或 `assistant` 消息,runner 就会释放会话,即使该会话正处于轮次中。

67 

68使用 `--startup-timeout-min <n>` 时,如果会话的子进程在克隆后 `<n>` 分钟内未完成初始化,runner 会释放该会话的槽位。在子进程初始化之前开始的轮次中,会话会保留其槽位,直到子进程的[活动通道](https://code.claude.com/docs/zh-CN/self-hosted-environments-configuration.md#keep-stdin-and-file-descriptor-3-attached)上连续 `<n>` 分钟没有任何输出行为止。子进程初始化后,runner 会清除该计时,改由 `--release-idle-session-min` 控制释放。要限制子进程仍存活但已卡住的会话,请设置 `--kill-session-after-min`。

63 69 

64### 自动模式规则列表70### 自动模式规则列表

65 71 

66`--server-auto-mode-lists` 让您决定来自运行器外部的哪些[自动模式](https://code.claude.com/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)分类器规则可以到达您的运行器上的会话。Anthropic 的控制平面可以随会话发送规则列表,并要求运行器应用它们。其中某些条目可能是您组织的管理员编写的规则。这些列表是 `environment`、`soft_deny` 和 `allow`:72`--server-auto-mode-lists` 让您决定来自 runner 外部的哪些[自动模式](https://code.claude.com/docs/zh-CN/permission-modes.md#eliminate-prompts-with-auto-mode)分类器规则可以作用于您的 runner 上的会话。Anthropic 的控制平面可以随会话发送规则列表,并请求 runner 应用它们。其中一些条目可能是您组织的管理员编写的规则。这些列表是 `environment`、`soft_deny` 和 `allow`:

67 73 

68* **`environment`**:条目既可以让分类器允许更多操作,也可以让其允许更少操作。74* **`environment`**:其中的条目既可以让分类器允许更多操作,也可以让其允许更少操作。

69* **`soft_deny`**:条目会阻止某个操作,除非用户明确要求执行该操作,或者适用某个 `allow` 例外。75* **`soft_deny`**:其中的条目会阻止某项操作,除非用户明确要求执行该操作,或适用某个 `allow` 例外。

70* **`allow`**:`soft_deny` 条目的例外。76* **`allow`**:`soft_deny` 条目的例外。

71 77 

72标志的值决定运行器应用哪些列表:78该标志的值决定 runner 应用哪些列表:

73 79 

74* **`no-allow`**:默认值。应用 `environment` 和 `soft_deny`,不应用 `allow`。`environment` 条目仍然可以让分类器允许更多操作,因此默认值并不能排除所有放宽。80* **`no-allow`**:默认值。应用 `environment` 和 `soft_deny`,不应用 `allow`。`environment` 条目仍可能让分类器允许更多操作,因此默认值并不能排除所有放宽。

75* **`all`**:应用全部三个列表。81* **`all`**:应用全部三个列表。

76* **`none`**:不应用其中任何列表。选择 `none` 可排除来自这些列表的所有放宽。它也会丢弃 `soft_deny` 限制。82* **`none`**:一个都不应用。若要排除来自这些列表的所有放宽,请选择 `none`。这也会去掉 `soft_deny` 的限制。

77 83 

78没有任何运行器设置能让控制平面要求运行器应用这些列表。当控制平面没有提出要求时,无论您如何设置,会话都不会收到任何列表。要查看发生了哪种情况,请使用 `--log-level debug` 启动运行器。随后,运行器会为每个会话记录一行包含 `the server asked this runner to apply` 的日志,或一行包含 `the server did not ask this runner to apply the auto mode lists it sends` 的日志。84没有任何 runner 设置能让控制平面请求 runner 应用这些列表。当控制平面未发出请求时,无论您如何设置,会话都不会收到任何列表。要查看实际情况,请使用 `--log-level debug` 启动 runner。随后,runner 会为每个会话记录一行日志,其中包含 `the server asked this runner to apply`,或包含 `the server did not ask this runner to apply the auto mode lists it sends`。

79 85 

80## Orchestrator CLI 标志86## Orchestrator CLI 标志

81 87 


372 378 

373#### 将会话的指标与运行器的指标关联379#### 将会话的指标与运行器的指标关联

374 380 

375要将会话自身的指标与 `claude_code_self_hosted_runner_session_idle_seconds` 放在一起,请基于运行器的 `session_id` 进行关联:381要查看空闲会话产生了多少成本,请基于 `ccr_session_id` 将运行器的 `claude_code_self_hosted_runner_session_idle_seconds` 与 Claude Code 的成本指标关联。运行器的指标不携带该标签,因此请使用 `label_replace` 为其添加一个,如以下查询所示:

382 

383```text theme={null}

384sum by (ccr_session_id) (claude_code_cost_usage_total)

385and on (ccr_session_id)

386label_replace(

387 claude_code_self_hosted_runner_session_idle_seconds > 600,

388 "ccr_session_id", "cse_$1", "session_id", "session_(.*)"

389)

390```

391 

392该查询为每个空闲超过十分钟的会话返回一个结果:即其 Claude Code 进程迄今为止统计的以美元计的成本。要关联其他 Claude Code 指标,请替换查询中的 `claude_code_cost_usage_total`。该查询在任何 `--capacity` 下都有效。

376 393 

377* **在 `--capacity` 高于 1 时**:直接关联。在运行器的 `/metrics` 上,会话的系列携带与该指标相同的 `session_id`,采用 `session_...` 形式。394* **`session_id`**:在端口 9464 上,Claude Code 指标上的该标签保存的是 Claude Code 自己的 [`session.id`](https://code.claude.com/docs/zh-CN/monitoring-usage#standard-attributes),它不与任何运行器系列匹配。基于它进行关联不会返回任何结果,因此请基于 `ccr_session_id` 进行关联。

378* **在 `--capacity 1` 时**:基于转换后的 `ccr_session_id` 进行关联。默认情况下,端口 9464 上的每个 Claude Code 指标都携带该标签,其中保存 `cse_...` 形式的会话 ID。在一个新标签中,将其 `cse_` 前缀替换为 `session_`,即可得到运行器的 `session_id`。该指标自身的 `session_id` 保存的是 Claude Code 自己的 [`session.id`](https://code.claude.com/docs/zh-CN/monitoring-usage#standard-attributes),它不与任何运行器系列匹配。395* **Claude Code 指标没有 `ccr_session_id`**:请检查 [`OTEL_METRICS_INCLUDE_SESSION_ID`](https://code.claude.com/docs/zh-CN/monitoring-usage#metrics-cardinality-control) 是否被设置为 `false`

379 396 

380### 会话生命周期计数器语义397### 会话生命周期计数器语义

381 398 

Details

117| [`gcpAuthRefresh`](#gcpauthrefresh) | 使用您自己的命令刷新 [Google Cloud 凭据](https://code.claude.com/docs/zh-CN/google-vertex-ai.md#advanced-credential-configuration) | 身份验证与提供商 | 任意文件 |117| [`gcpAuthRefresh`](#gcpauthrefresh) | 使用您自己的命令刷新 [Google Cloud 凭据](https://code.claude.com/docs/zh-CN/google-vertex-ai.md#advanced-credential-configuration) | 身份验证与提供商 | 任意文件 |

118| [`hooks`](#hooks) | 在 Claude Code 生命周期的各个节点以 [hook](https://code.claude.com/docs/zh-CN/hooks.md) 形式运行您自己的命令 | hook 与自动化 | 任意文件 |118| [`hooks`](#hooks) | 在 Claude Code 生命周期的各个节点以 [hook](https://code.claude.com/docs/zh-CN/hooks.md) 形式运行您自己的命令 | hook 与自动化 | 任意文件 |

119| [`httpHookAllowedEnvVars`](#httphookallowedenvvars) | 限制 [HTTP hook](https://code.claude.com/docs/zh-CN/hooks.md) 可以放入请求头的环境变量 | hook 与自动化 | 任意文件 |119| [`httpHookAllowedEnvVars`](#httphookallowedenvvars) | 限制 [HTTP hook](https://code.claude.com/docs/zh-CN/hooks.md) 可以放入请求头的环境变量 | hook 与自动化 | 任意文件 |

120| [`idleCompaction`](#idlecompaction) | 阻止 Claude Code 在终端会话空闲时压缩较长的对话 | 记忆与上下文 | 任意文件 |120| [`idleCompaction`](#idlecompaction) | 阻止 Claude Code 压缩您已离开的较长对话 | 记忆与上下文 | 任意文件 |

121| [`includeCoAuthoredBy`](#includecoauthoredby) | 已弃用;请使用 `attribution` 隐藏或更改提交和 PR 署名 | Git 与署名 | 任意文件 |121| [`includeCoAuthoredBy`](#includecoauthoredby) | 已弃用;请使用 `attribution` 隐藏或更改提交和 PR 署名 | Git 与署名 | 任意文件 |

122| [`includeGitInstructions`](#includegitinstructions) | 从 Claude 的上下文中移除内置的提交和 PR 指令 | Git 与署名 | 任意文件 |122| [`includeGitInstructions`](#includegitinstructions) | 从 Claude 的上下文中移除内置的提交和 PR 指令 | Git 与署名 | 任意文件 |

123| [`inputNeededNotifEnabled`](#inputneedednotifenabled) | 在 Claude 等待您操作时收到[推送通知](https://code.claude.com/docs/zh-CN/remote-control.md#mobile-push-notifications) | 远程、桌面与通知 | 任意文件 |123| [`inputNeededNotifEnabled`](#inputneedednotifenabled) | 在 Claude 等待您操作时收到[推送通知](https://code.claude.com/docs/zh-CN/remote-control.md#mobile-push-notifications) | 远程、桌面与通知 | 任意文件 |


1230 1230 

1231* **作用域**:[`Any file`](#scopes),[对项目设置和本地设置有限制](https://code.claude.com/docs/zh-CN/sandboxing.md#repository-settings-under-an-admin-required-sandbox)1231* **作用域**:[`Any file`](#scopes),[对项目设置和本地设置有限制](https://code.claude.com/docs/zh-CN/sandboxing.md#repository-settings-under-an-admin-required-sandbox)

1232* **类型**:布尔值1232* **类型**:布尔值

1233 * `true`:当 `sandbox.enabled` 为 `true` 但沙箱无法启动时,Claude Code 在启动时报错退出1233 * `true`:当 `sandbox.enabled` 为 `true` 但沙箱无法启动时,Claude Code 在启动时报错退出。如果沙箱通过了该检查但随后初始化失败,会话将继续运行,而 Claude Code 会[拒绝每个沙箱命令](https://code.claude.com/docs/zh-CN/sandboxing.md#commands-refused-with-sandbox-is-required)

1234 * `false`:当沙箱无法启动时,Claude Code 在沙箱外运行命令1234 * `false`:当沙箱无法启动时,Claude Code 在沙箱外运行命令

1235* **默认值**:`false`1235* **默认值**:`false`

1236 1236 

1237以下配置使每台受管机器要么对命令进行沙箱隔离,要么拒绝启动:1237以下配置为托管计算机启用沙箱,并将 `failIfUnavailable` 设置为 `true`:

1238 1238 

1239```json managed-settings.json theme={null}1239```json managed-settings.json theme={null}

1240{1240{


2415 2415 

2416### `idleCompaction`2416### `idleCompaction`

2417 2417 

2418空闲压缩会在您离开的长对话的提示缓存过期前不久对其进行[压缩](https://code.claude.com/docs/zh-CN/context-window.md#what-survives-compaction)。这样,您的下一条消息发送的将是摘要,而不是整个对话。当您回来时,对话中会显示一行以 `Compacted while idle, before the prompt cache expired` 开头的内容。2418空闲压缩会对您离开的长对话进行[压缩](https://code.claude.com/docs/zh-CN/context-window.md#what-survives-compaction)。这样,您的下一条消息发送的将是摘要,而不是整个对话。压缩完成后,对话中会显示一条通知:

2419 

2420* **终端**:一行以 `Compacted while idle, before the prompt cache expired` 开头的内容

2421* **[VS Code 聊天面板](#idle-compaction-in-vs-code-and-the-desktop-app)**:一条包含 `a summary written while you were away` 的通知

2422* **[桌面应用](#idle-compaction-in-vs-code-and-the-desktop-app)**:同样的通知,位于标签包含 `Claude Code notice` 的行中。如果您看不到该行或其文本,请切换到 [Verbose 视图模式](https://code.claude.com/docs/zh-CN/desktop.md#switch-view-modes)。

2419 2423 

2420对于满足以下所有条件的对话,空闲压缩默认开启:2424对于满足以下所有条件的对话,空闲压缩默认开启:

2421 2425 

2422* **会话**:您处于交互式终端会话中2426* **会话**:您处于交互式终端会话中,或者在 [Anthropic 选定的账户](#idle-compaction-in-vs-code-and-the-desktop-app)上使用 VS Code 扩展的聊天面板或桌面应用的 Code 标签页

2423* **自动压缩**:[`autoCompactEnabled`](#autocompactenabled) 已开启2427* **自动压缩**:[`autoCompactEnabled`](#autocompactenabled) 已开启

2424* **提示缓存**:该对话使用[一小时提示缓存 TTL](https://code.claude.com/docs/zh-CN/prompt-caching.md#which-ttl-each-request-gets)2428* **提示缓存**:该对话使用[一小时提示缓存 TTL](https://code.claude.com/docs/zh-CN/prompt-caching.md#which-ttl-each-request-gets)

2425* **功能标志**:Claude Code 可以[从 Anthropic 获取功能标志](https://code.claude.com/docs/zh-CN/env-vars.md#features-that-need-feature-flag-fetching)2429* **功能标志**:Claude Code 可以[从 Anthropic 获取功能标志](https://code.claude.com/docs/zh-CN/env-vars.md#features-that-need-feature-flag-fetching)


2441}2445}

2442```2446```

2443 2447 

2444要在会话中开启或关闭空闲压缩,请运行 `/config` 并更改 **Idle compaction** 行。您的选择会保存到用户设置中并立即生效。该行需要 Claude Code v2.1.302 或更高版本。如果您使用的是这些版本之一,但 `/config` 中未显示该行,请检查以下原因:2448要在终端会话中开启或关闭空闲压缩,请运行 `/config` 并更改 **Idle compaction** 行。您的选择会保存到用户设置中并立即生效。该行需要 Claude Code v2.1.302 或更高版本。如果您使用的是这些版本之一,但 `/config` 中未显示该行,请检查以下原因:

2445 2449 

2446* **其他设置来源设置了此键**:托管设置、`--settings` 标志或项目或本地设置文件中的值覆盖了您的用户设置。请改为在该来源中更改此键2450* **其他设置来源设置了此键**:托管设置、`--settings` 标志或项目或本地设置文件中的值覆盖了您的用户设置。请改为在该来源中更改此键

2447* **功能标志不可用**:当 Claude Code 无法[从 Anthropic 获取功能标志](https://code.claude.com/docs/zh-CN/env-vars.md#features-that-need-feature-flag-fetching)时,空闲压缩不会运行,因此没有需要关闭的内容2451* **功能标志不可用**:当 Claude Code 无法[从 Anthropic 获取功能标志](https://code.claude.com/docs/zh-CN/env-vars.md#features-that-need-feature-flag-fetching)时,空闲压缩不会运行,因此没有需要关闭的内容


2462}2466}

2463```2467```

2464 2468 

2469#### VS Code 和桌面应用中的空闲压缩

2470 

2471类似下面这样的通知表示 Claude Code 已[用摘要替换了您之前的对话](https://code.claude.com/docs/zh-CN/context-window.md#what-survives-compaction),Claude 现在基于该摘要继续工作:

2472 

2473```text theme={null}

2474Compacted using a summary written while you were away · turn off with "idleCompaction": false in settings.json

2475```

2476 

2477您无需执行任何操作。要关闭空闲压缩,请在 `~/.claude/settings.json` 或其他[设置文件](https://code.claude.com/docs/zh-CN/settings.md#settings-files-and-who-they-affect)中将 `idleCompaction` 设置为 `false`。

2478 

2479在 VS Code 扩展的聊天面板和桌面应用的 Code 标签页中,空闲压缩会为 Anthropic 选定的账户运行。Claude Code 会在您离开期间编写摘要,然后仅当您的下一条消息距上次请求一小时或更久时,才使用该摘要进行压缩。

2480 

2465### `plansDirectory`2481### `plansDirectory`

2466 2482 

2467选择 Claude Code 存储其在[计划模式](https://code.claude.com/docs/zh-CN/permission-modes.md#analyze-before-you-edit-with-plan-mode)中编写的计划文件的位置。Claude Code 会相对于项目根目录解析该路径。2483选择 Claude Code 存储其在[计划模式](https://code.claude.com/docs/zh-CN/permission-modes.md#analyze-before-you-edit-with-plan-mode)中编写的计划文件的位置。Claude Code 会相对于项目根目录解析该路径。


3522 3538 

3523* **托管 hook 和 SDK hook 会运行**:来自托管设置的 hook,以及 [Agent SDK](https://code.claude.com/docs/zh-CN/agent-sdk/overview.md) 在进程内注册的 hook3539* **托管 hook 和 SDK hook 会运行**:来自托管设置的 hook,以及 [Agent SDK](https://code.claude.com/docs/zh-CN/agent-sdk/overview.md) 在进程内注册的 hook

3524* **强制启用的插件 hook 会运行**:来自托管设置通过 [`enabledPlugins`](#enabledplugins) 强制启用的插件中的 hook。Claude Code 会按完整的 `plugin@marketplace` ID 进行匹配,因此来自其他市场的同名插件仍会被阻止。这样,您可以通过组织市场分发经过审核的 hook,同时阻止其他所有内容。此类插件中的 [mod](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md) 仅在[被视为您组织的 mod](https://code.claude.com/docs/zh-CN/plugins/mods/admin.md#install-your-organizations-mods) 时才会加载3540* **强制启用的插件 hook 会运行**:来自托管设置通过 [`enabledPlugins`](#enabledplugins) 强制启用的插件中的 hook。Claude Code 会按完整的 `plugin@marketplace` ID 进行匹配,因此来自其他市场的同名插件仍会被阻止。这样,您可以通过组织市场分发经过审核的 hook,同时阻止其他所有内容。此类插件中的 [mod](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md) 仅在[被视为您组织的 mod](https://code.claude.com/docs/zh-CN/plugins/mods/admin.md#install-your-organizations-mods) 时才会加载

3541* **其他插件中的监视器会被阻止**:除非插件被强制启用,否则插件的[监视器](https://code.claude.com/docs/zh-CN/plugins/components.md#monitors)不会启动。需要 Claude Code v2.1.310 或更高版本

3525* **其他所有内容都会被阻止**:用户、项目和本地 hook,其他已安装插件中的 hook 和 mod,以及在 Agent frontmatter 中声明的 hook。[Claude Code 内置的 mod](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md#mods-built-into-claude-code) 会继续运行。如果只想阻止用户的 mod,请改为设置 [`allowManagedModsOnly`](https://code.claude.com/docs/zh-CN/plugins/mods/admin#set-options-on-the-built-in-guard)。3542* **其他所有内容都会被阻止**:用户、项目和本地 hook,其他已安装插件中的 hook 和 mod,以及在 Agent frontmatter 中声明的 hook。[Claude Code 内置的 mod](https://code.claude.com/docs/zh-CN/plugins/mods/overview.md#mods-built-into-claude-code) 会继续运行。如果只想阻止用户的 mod,请改为设置 [`allowManagedModsOnly`](https://code.claude.com/docs/zh-CN/plugins/mods/admin#set-options-on-the-built-in-guard)。

3526* **命令来源的插件会被禁用**:Claude Code 还会禁用具有 [`command` 来源](https://code.claude.com/docs/zh-CN/plugins/marketplace-reference#command-plugin-source)的插件,包括在托管 `enabledPlugins` 中强制启用的插件,除非您显式将 [`disableCommandPluginSources`](#disablecommandpluginsources) 设置为 `false`3543* **命令来源的插件会被禁用**:Claude Code 还会禁用具有 [`command` 来源](https://code.claude.com/docs/zh-CN/plugins/marketplace-reference#command-plugin-source)的插件,包括在托管 `enabledPlugins` 中强制启用的插件,除非您显式将 [`disableCommandPluginSources`](#disablecommandpluginsources) 设置为 `false`

3527* **市场的 `headersHelper` 命令会被阻止**:Claude Code 还会阻止市场的 [`headersHelper` 命令](https://code.claude.com/docs/zh-CN/plugins/host-marketplace#authenticate-archive-downloads),除非显式将 [`disableCommandPluginSources`](#disablecommandpluginsources) 设置为 `false`,但由托管设置本身声明的市场除外。需要 Claude Code v2.1.238 或更高版本3544* **市场的 `headersHelper` 命令会被阻止**:Claude Code 还会阻止市场的 [`headersHelper` 命令](https://code.claude.com/docs/zh-CN/plugins/host-marketplace#authenticate-archive-downloads),除非显式将 [`disableCommandPluginSources`](#disablecommandpluginsources) 设置为 `false`,但由托管设置本身声明的市场除外。需要 Claude Code v2.1.238 或更高版本

statusline.md +91 −91

Details

167 167 

168## 可用数据168## 可用数据

169 169 

170Claude Code 通过 stdin 向你的脚本发送以下 JSON 字段:170Claude Code 通过 stdin 向您的脚本发送以下 JSON 字段:

171 171 

172| 字段 | 描述 |172| 字段 | 描述 |

173| - | - |173| - | - |

174| `model.id`, `model.display_name` | 当前模型标识符和显示名称 |174| `model.id`、`model.display_name` | 当前模型标识符和显示名称 |

175| `cwd`, `workspace.current_dir` | 当前工作目录。两个字段包含相同的值;为了与 `workspace.project_dir` 保持一致,首选 `workspace.current_dir`。 |175| `cwd`、`workspace.current_dir` | 当前工作目录。两个字段包含相同的值;建议使用 `workspace.current_dir`,以便与 `workspace.project_dir` 保持一致。 |

176| `workspace.project_dir` | 启动 Claude Code 的目录,如果在会话期间工作目录更改,可能与 `cwd` 不同 |176| `workspace.project_dir` | 启动 Claude Code 时所在的目录,如果会话期间工作目录发生变化,该值可能与 `cwd` 不同 |

177| `workspace.added_dirs` | 通过 `/add-dir` 或 `--add-dir` 添加的其他目录。如果未添加任何目录,则为空数组 |177| `workspace.added_dirs` | 通过 `/add-dir` 或 `--add-dir` 添加的其他目录。如果未添加任何目录,则为空数组 |

178| `workspace.git_worktree` | 当前目录在使用 `git worktree add` 创建的链接 worktree 内时的 Git worktree 名称。在主工作树中不存在。对于任何 git worktree 都会填充,不同于仅在 [worktree 会话](https://code.claude.com/docs/zh-CN/worktrees.md) 期间出现的 `worktree.*` |178| `workspace.git_worktree` | 当前目录位于通过 `git worktree add` 创建的链接 worktree 中时的 Git worktree 名称。在主工作树中不存在。该字段对任何 git worktree 都会填充,这与 `worktree.*` 不同,后者仅在会话处于 [worktree 会话](https://code.claude.com/docs/zh-CN/worktrees.md)时存在 |

179| `workspace.repo.host`, `workspace.repo.owner`, `workspace.repo.name` | 从 `origin` 远程解析的存储库标识,例如 `"github.com"`、`"anthropics"`、`"claude-code"`。在 git 存储库外或未配置 `origin` 远程时不存在。对于嵌套在子组中的 gitlab.com 项目,`owner` 是带有斜杠的完整命名空间路径,例如 `"group/subgroup"`。在 v2.1.260 之前,这些项目的 `workspace.repo` 不存在 |179| `workspace.repo.host`、`workspace.repo.owner`、`workspace.repo.name` | 从 `origin` 远程解析出的仓库标识,例如 `"github.com"`、`"anthropics"`、`"claude-code"`。在 git 仓库之外或未配置 `origin` 远程时不存在。对于嵌套在子组中的 gitlab.com 项目,`owner` 是带斜杠的完整命名空间路径,例如 `"group/subgroup"`。在 v2.1.260 之前,这些项目不存在 `workspace.repo` |

180| `cost.total_cost_usd` | 以美元计的估计会话成本,在客户端按列表价格计算,除非有 [`modelPricing`](https://code.claude.com/docs/zh-CN/settings-reference#modelpricing) 表生效。可能与您的实际账单不同。当 `/clear` 启动新会话时重置为 \$0 |180| `cost.total_cost_usd` | 以美元计的预估会话费用,除非有 [`modelPricing`](https://code.claude.com/docs/zh-CN/settings-reference#modelpricing) 表生效,否则在客户端按标价计算。可能与您的实际账单不同。当 `/clear` 开始新会话时重置为 \$0 |

181| `cost.total_duration_ms` | 自会话开始以来的总挂钟时间(毫秒) |181| `cost.total_duration_ms` | 会话已运行的总挂钟时间,以毫秒为单位。该值在多次恢复会话之间累计,且不包括会话未运行期间的时间 |

182| `cost.total_api_duration_ms` | 等待 API 响应的总时间(毫秒) |182| `cost.total_api_duration_ms` | 等待 API 响应所花费的总时间,以毫秒为单位 |

183| `cost.total_lines_added`, `cost.total_lines_removed` | 更改的代码行数 |183| `cost.total_lines_added`、`cost.total_lines_removed` | 更改的代码行数 |

184| `context_window.total_input_tokens`, `context_window.total_output_tokens` | 当前在上下文窗口中的令牌计数,来自最近的 API 响应。输入包括缓存读取和写入 |184| `context_window.total_input_tokens`、`context_window.total_output_tokens` | 当前上下文窗口中的 token 数,来自最近一次 API 响应。输入包括缓存读取和写入 |

185| `context_window.context_window_size` | 最大上下文窗口大小(令牌)。默认为 200000,或对于具有扩展上下文的模型为 1000000。 |185| `context_window.context_window_size` | 最大上下文窗口大小(以 token 为单位)。默认为 200000,对于具有扩展上下文的模型为 1000000。 |

186| `context_window.used_percentage` | 预计算的已使用上下文窗口百分比 |186| `context_window.used_percentage` | 预先计算的上下文窗口已用百分比 |

187| `context_window.remaining_percentage` | 预计算的剩余上下文窗口百分比 |187| `context_window.remaining_percentage` | 预先计算的上下文窗口剩余百分比 |

188| `context_window.current_usage` | 来自最后一次 API 调用的令牌计数,在 [上下文窗口字段](#context-window-fields) 中描述 |188| `context_window.current_usage` | 上一次 API 调用的 token 数,详见[上下文窗口字段](#context-window-fields) |

189| `exceeds_200k_tokens` | 最近一次 API 响应中的总令牌计数(输入、缓存和输出令牌合并)是否超过 200k。这是一个固定阈值,与实际上下文窗口大小无关。 |189| `exceeds_200k_tokens` | 最近一次 API 响应的 token 总数(输入、缓存和输出 token 之和)是否超过 200k。这是一个固定阈值,与实际上下文窗口大小无关。 |

190| `fast_mode` | 是否为会话启用了 [快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md) |190| `fast_mode` | 会话是否启用了[快速模式](https://code.claude.com/docs/zh-CN/fast-mode.md) |

191| `effort.level` | 当前推理工作量(`low`、`medium`、`high`、`xhigh` 或 `max`)。反映实时会话值,包括中途 `/effort` 更改。当当前模型不支持工作量参数时不存在 |191| `effort.level` | 当前推理努力程度(`low`、`medium`、`high`、`xhigh` 或 `max`)。反映会话的实时值,包括会话中途通过 `/effort` 进行的更改。当前模型不支持 effort 参数时不存在 |

192| `thinking.enabled` | 是否为会话启用了扩展思考 |192| `thinking.enabled` | 会话是否启用了扩展思考 |

193| `rate_limits.five_hour.used_percentage`, `rate_limits.seven_day.used_percentage` | 消耗的 5 小时或 7 天速率限制的百分比,从 0 到 100 |193| `rate_limits.five_hour.used_percentage`、`rate_limits.seven_day.used_percentage` | 5 小时或 7 天速率限制的已用百分比,范围为 0 到 100 |

194| `rate_limits.five_hour.resets_at`, `rate_limits.seven_day.resets_at` | Unix 纪元秒,当 5 小时或 7 天速率限制窗口重置时 |194| `rate_limits.five_hour.resets_at`、`rate_limits.seven_day.resets_at` | 5 小时或 7 天速率限制窗口重置的时间(Unix 纪元秒) |

195| `rate_limits.spend_limit.used_percentage`, `rate_limits.spend_limit.resets_at` | 在 Claude apps gateway 后面,您已使用的支出限制额度以及其周期何时重置。请参阅 [支出限制字段](#spend-limit-fields)。需要 Claude Code v2.1.251 或更高版本 |195| `rate_limits.spend_limit.used_percentage`、`rate_limits.spend_limit.resets_at` | 在 Claude apps 网关后方时,您已使用的支出限额比例及其周期重置时间。请参阅[支出限额字段](#spend-limit-fields)。需要 Claude Code v2.1.251 或更高版本 |

196| `rate_limits.spend_limit.used_usd`, `rate_limits.spend_limit.limit_usd`, `rate_limits.spend_limit.period` | 您以美元计的估计支出和限额,以及该限制的周期。这些字段可能不存在。请参阅 [支出限制字段](#spend-limit-fields)。Claude Code 和网关均需要 v2.1.284 或更高版本 |196| `rate_limits.spend_limit.used_usd`、`rate_limits.spend_limit.limit_usd`、`rate_limits.spend_limit.period` | 以美元计的预估支出和限额,以及限额的周期。这些字段可能不存在。请参阅[支出限额字段](#spend-limit-fields)。Claude Code 和网关均需 v2.1.284 或更高版本 |

197| `prompt_cache` | 会话的主对话的 [prompt cache](https://code.claude.com/docs/zh-CN/prompt-caching.md) 统计信息:命中率、未命中次数以及缓存是否预热。有关每个字段,请参阅 [prompt cache 字段](#prompt-cache-fields)。在主对话的第一次 API 响应之前不存在。需要 Claude Code v2.1.251 或更高版本 |197| `prompt_cache` | 会话主对话的[提示缓存](https://code.claude.com/docs/zh-CN/prompt-caching.md)统计信息:命中率、未命中次数以及缓存是否处于热状态。有关所有字段,请参阅[提示缓存字段](#prompt-cache-fields)。在主对话的第一次 API 响应之前不存在。需要 Claude Code v2.1.251 或更高版本 |

198| `session_id` | 唯一的会话标识符 |198| `session_id` | 唯一会话标识符 |

199| `session_name` | 会话名称。使用使用 `--name` 标志或 `/rename` 设置的自定义名称(如果存在),否则使用 AI 生成的会话标题。[默认显示名称](https://code.claude.com/docs/zh-CN/sessions.md#name-your-sessions)(例如 `my-app-3f`)不会填充此字段。当会话既没有自定义名称也没有 AI 生成的标题时不存在 |199| `session_name` | 会话名称。如果存在通过 `--name` 标志或 `/rename` 设置的自定义名称,则使用该名称,否则使用 AI 生成的会话标题。[默认显示名称](https://code.claude.com/docs/zh-CN/sessions.md#name-your-sessions)(例如 `my-app-3f`)不会填充此字段。当会话既没有自定义名称也没有 AI 生成的标题时不存在 |

200| `prompt_id` | 标识当前正在处理的用户提示词的 UUID。与 OpenTelemetry 事件上的 [`prompt.id` 属性](https://code.claude.com/docs/zh-CN/monitoring-usage#event-correlation-attributes) 匹配。在第一次用户输入之前不存在 |200| `prompt_id` | 标识当前正在处理的用户提示词的 UUID。与 [OpenTelemetry 事件上的 `prompt.id` 属性](https://code.claude.com/docs/zh-CN/monitoring-usage#event-correlation-attributes)相匹配。在第一次用户输入之前不存在 |

201| `transcript_path` | 对话记录文件的路径 |201| `transcript_path` | 对话会话记录文件的路径 |

202| `version` | Claude Code 版本 |202| `version` | Claude Code 版本 |

203| `output_style.name` | 当前输出样式的名称 |203| `output_style.name` | 当前输出样式的名称 |

204| `vim.mode` | 启用 [vim 模式](https://code.claude.com/docs/zh-CN/interactive-mode.md#vim-editor-mode) 时的当前 vim 模式(`NORMAL`、`INSERT`、`VISUAL` 或 `VISUAL LINE`) |204| `vim.mode` | 启用 [vim 模式](https://code.claude.com/docs/zh-CN/interactive-mode.md#vim-editor-mode)时的当前 vim 模式(`NORMAL`、`INSERT`、`VISUAL` 或 `VISUAL LINE`) |

205| `agent.name` | 使用 `--agent` 标志或配置的代理设置运行时的代理名称 |205| `agent.name` | 使用 `--agent` 标志运行或配置了 Agent 设置时的 Agent 名称 |

206| `pr.number`, `pr.url` | 当前分支的开放拉取请求。镜像底部状态栏中的 PR 徽章。在具有 GitLab 远程的存储库中,Claude Code 从分支的开放 [merge request](https://code.claude.com/docs/zh-CN/interactive-mode.md#gitlab-merge-requests) 填充这些字段,因此 `pr.number` 是 merge request 编号。Merge request 数据需要 Claude Code v2.1.234 或更高版本。当不在 git 存储库中、找到拉取请求或 merge request 之前,或一旦它合并或关闭后不存在 |206| `pr.number`、`pr.url` | 当前分支的已打开 Pull Request。与页脚中的 PR 徽章一致。在具有 GitLab 远程的仓库中,Claude Code 会改用该分支已打开的 [merge request](https://code.claude.com/docs/zh-CN/interactive-mode.md#gitlab-merge-requests) 来填充这些字段,因此 `pr.number` 是 merge request 编号。merge request 数据需要 Claude Code v2.1.234 或更高版本。不在 git 仓库中时、在找到 Pull Request 或 merge request 之前,或者在其合并或关闭之后,此字段不存在 |

207| `pr.review_state` | 开放 PR 的审查状态:`approved`、`pending`、`changes_requested` 或 `draft`。即使 `pr` 存在,也可能独立不存在 |207| `pr.review_state` | 已打开 PR 的审查状态:`approved`、`pending`、`changes_requested` 或 `draft`。即使存在 `pr`,此字段也可能单独缺失 |

208| `pr.kind` | 当 `pr` 描述 [GitLab merge request](https://code.claude.com/docs/zh-CN/interactive-mode.md#gitlab-merge-requests) 时为 `mr`。对于 GitHub 拉取请求不存在,因此在此字段之前编写的脚本继续工作。对于 merge request,当 GitLab 报告它可合并时,Claude Code 将 `review_state` 设置为 `approved`,对于任何其他开放状态设置为 `pending`,对于草稿设置为 `draft`。需要 Claude Code v2.1.234 或更高版本 |208| `pr.kind` | 当 `pr` 描述的是 [GitLab merge request](https://code.claude.com/docs/zh-CN/interactive-mode.md#gitlab-merge-requests) 时为 `mr`。对于 GitHub Pull Request 不存在,因此在此字段出现之前编写的脚本仍可正常工作。对于 merge request,当 GitLab 报告其可合并时,Claude Code 将 `review_state` 设置为 `approved`;任何其他打开状态设置为 `pending`;草稿设置为 `draft`。需要 Claude Code v2.1.234 或更高版本 |

209| `worktree.name` | 活跃 worktree 的名称。仅在 [worktree 会话](https://code.claude.com/docs/zh-CN/worktrees.md) 期间出现 |209| `worktree.name` | 活动 worktree 的名称。仅在会话处于 [worktree 会话](https://code.claude.com/docs/zh-CN/worktrees.md)时存在 |

210| `worktree.path` | worktree 目录的绝对路径 |210| `worktree.path` | worktree 目录的绝对路径 |

211| `worktree.branch` | worktree 的 Git 分支名称(例如,`"worktree-my-feature"`)。对于基于钩子的 worktree 不存在 |211| `worktree.branch` | worktree 的 Git 分支名称(例如 `"worktree-my-feature"`)。对于基于 hook 的 worktree 不存在 |

212| `worktree.original_cwd` | Claude 进入 worktree 之前所在的目录 |212| `worktree.original_cwd` | Claude 进入 worktree 之前所在的目录 |

213| `worktree.original_branch` | 进入 worktree 之前检出的 Git 分支。对于基于钩子的 worktree 不存在 |213| `worktree.original_branch` | 进入 worktree 之前检出的 Git 分支。对于基于 hook 的 worktree 不存在 |

214 214 

215> **完整 JSON 架构**215> **完整 JSON schema**

216>216>

217> 你的状态行命令通过 stdin 接收此 JSON 结构:217> 您的状态栏命令通过 stdin 接收以下 JSON 结构:

218>218>

219> ```json theme={null}219> ```json theme={null}

220> {220> {


330> }330> }

331> ```331> ```

332>332>

333> **可能不存在的字段**(不在 JSON 中):333> **可能不存在的字段**(不出现在 JSON 中):

334>334>

335> * `session_name`:当使用 `--name` 或 `/rename` 设置了自定义名称时出现,或一旦存在 AI 生成的会话标题。默认显示名称(例如 `my-app-3f`)不会填充它335> * `session_name`:在通过 `--name` 或 `/rename` 设置了自定义名称时,或者存在 AI 生成的会话标题后出现。默认显示名称(例如 `my-app-3f`)不会填充此字段

336> * `prompt_id`:仅在第一次用户输入后出现336> * `prompt_id`:仅在第一次用户输入之后出现

337> * `workspace.git_worktree`:仅当当前目录在链接的 git worktree 内时出现337> * `workspace.git_worktree`:仅当当前目录位于链接的 git worktree 中时出现

338> * `workspace.repo`:仅在 git 存储库内且配置了 `origin` 远程时出现338> * `workspace.repo`:仅在配置了 `origin` 远程的 git 仓库中出现

339> * `effort`:仅当当前模型支持推理工作量参数时出现339> * `effort`:仅当当前模型支持推理努力程度参数时出现

340> * `vim`:仅在启用 vim 模式时出现340> * `vim`:仅在启用 vim 模式时出现

341> * `agent`:仅在使用 `--agent` 标志或配置的代理设置运行时出现341> * `agent`:仅在使用 `--agent` 标志运行或配置了 Agent 设置时出现

342> * `pr`:仅在为当前分支找到开放 PR 或 GitLab merge request 时出现,一旦它合并或关闭就会被移除。`pr.review_state` 和 `pr.kind` 可能独立不存在342> * `pr`:仅在为当前分支找到已打开的 PR 或 GitLab merge request 时出现,并在其合并或关闭后移除。`pr.review_state` 和 `pr.kind` 可能单独缺失

343> * `worktree`:仅在 [worktree 会话](https://code.claude.com/docs/zh-CN/worktrees.md) 期间出现。当存在时,对于基于钩子的 worktree,`branch` 和 `original_branch` 也可能不存在343> * `worktree`:仅在会话处于 [worktree 会话](https://code.claude.com/docs/zh-CN/worktrees.md)时出现。存在时,对于基于 hook 的 worktree,`branch` 和 `original_branch` 也可能不存在

344> * `rate_limits`:仅对 Claude.ai Pro 和 Max 订阅者,或在为你设置支出限制的 Claude apps gateway 后面,以及仅在会话中第一次 API 响应后出现。每个窗口(`five_hour`、`seven_day`、`spend_limit`)可能独立不存在,Claude Code 在其 `resets_at` 时间过去后删除一个窗口。使用 `jq -r '.rate_limits.five_hour.used_percentage // empty'` 来优雅地处理缺失。344> * `rate_limits`:仅对 claude.ai Pro 和 Max 订阅用户,或在为您设置了支出限额的 Claude apps 网关后方时出现,并且仅在会话中第一次 API 响应之后出现。每个窗口(`five_hour`、`seven_day`、`spend_limit`)都可能单独缺失,并且一旦某个窗口的 `resets_at` 时间已过,Claude Code 就会移除该窗口。使用 `jq -r '.rate_limits.five_hour.used_percentage // empty'` 可以妥善处理字段缺失的情况。

345> * `prompt_cache`:在主对话的第一次 API 响应后出现。请参阅 [prompt cache 字段](#prompt-cache-fields)345> * `prompt_cache`:在主对话的第一次 API 响应之后出现。请参阅[提示缓存字段](#prompt-cache-fields)

346>346>

347> **可能为 `null` 的字段**:347> **可能为 `null` 的字段**:

348>348>

349> * `context_window.current_usage`:在会话中第一次 API 调用之前为 `null`,以及在 `/compact` 之后直到下一次 API 调用重新填充它为止为 `null`349> * `context_window.current_usage`:在会话中第一次 API 调用之前为 `null`,在 `/compact` 之后也会再次为 `null`,直到下一次 API 调用重新填充它

350> * `context_window.used_percentage`, `context_window.remaining_percentage`:在会话早期可能为 `null`350> * `context_window.used_percentage`、`context_window.remaining_percentage`:在会话早期可能为 `null`

351>351>

352> 在你的脚本中使用条件访问处理缺失字段,使用回退默认值处理 null 值。352> 在脚本中,请使用条件访问处理缺失字段,并使用备用默认值处理 null 值。

353 353 

354### 上下文窗口字段354### 上下文窗口字段

355 355 

356`context_window` 对象描述来自最近一次 API 响应的实时上下文窗口。356`context_window` 对象描述来自最近一次 API 响应的实时上下文窗口。

357 357 

358* **合并总计**(`total_input_tokens`, `total_output_tokens`):当前在上下文窗口中的令牌。`total_input_tokens` 是 `input_tokens`、`cache_creation_input_tokens` 和 `cache_read_input_tokens` 的总和;`total_output_tokens` 是最近一次响应中的输出令牌。在第一次 API 响应之前,两者都是 `0`。358* **合计总数**(`total_input_tokens`、`total_output_tokens`):当前上下文窗口中的 token。`total_input_tokens` 是 `input_tokens`、`cache_creation_input_tokens` 和 `cache_read_input_tokens` 之和;`total_output_tokens` 是最近一次响应的输出 token。在第一次 API 响应之前,两者均为 `0`。

359* **按组件使用情况**(`current_usage`):相同的令牌计数按类别分解。当你需要将缓存命中与新输入分开时,使用此选项。359* **按组成部分的用量**(`current_usage`):按类别拆分的相同 token 数。当您需要将缓存命中与新输入分开时,请使用此项。

360 360 

361`current_usage` 对象包含:361`current_usage` 对象包含:

362 362 

363* `input_tokens`:当前上下文中的输入令牌363* `input_tokens`:当前上下文中的输入 token

364* `output_tokens`:生成的输出令牌364* `output_tokens`:生成的输出 token

365* `cache_creation_input_tokens`:写入缓存的令牌365* `cache_creation_input_tokens`:写入缓存的 token

366* `cache_read_input_tokens`:从缓存读取的令牌366* `cache_read_input_tokens`:从缓存读取的 token

367 367 

368有关缓存字段的含义以及它们如何计费的信息,请参阅 [检查缓存性能](https://code.claude.com/docs/zh-CN/prompt-caching.md#check-cache-performance)。368有关缓存字段的含义及其计费方式,请参阅[检查缓存性能](https://code.claude.com/docs/zh-CN/prompt-caching.md#check-cache-performance)。

369 369 

370`used_percentage` 字段仅从输入令牌计算:`input_tokens + cache_creation_input_tokens + cache_read_input_tokens`。它不包括 `output_tokens`。370`used_percentage` 字段仅根据输入 token 计算:`input_tokens + cache_creation_input_tokens + cache_read_input_tokens`。它不包括 `output_tokens`。

371 371 

372如果你从 `current_usage` 手动计算上下文百分比,使用相同的仅输入公式来匹配 `used_percentage`。372如果您根据 `current_usage` 手动计算上下文百分比,请使用相同的仅输入公式,以与 `used_percentage` 保持一致。

373 373 

374`current_usage` 对象在会话中第一次 API 调用之前为 `null`,以及在 `/compact` 之后直到下一次 API 调用重新填充它为止再次为 `null`。374`current_usage` 对象在会话中第一次 API 调用之前为 `null`,并且在 `/compact` 之后会立即再次变为 `null`,直到下一次 API 调用重新填充它。

375 375 

376### 支出限制字段376### 支出限额字段

377 377 

378在 [设置了支出限制的 Claude apps gateway](https://code.claude.com/docs/zh-CN/claude-apps-gateway-spend-limits.md#usage-warnings-in-claude-code) 后面,`rate_limits.spend_limit` 对象描述适用于您的支出限制。它在会话的第一次 API 响应后出现,需要 Claude Code v2.1.251 或更高版本。您的脚本按不同的时间表接收其字段:378在[设有支出限额的 Claude apps 网关](https://code.claude.com/docs/zh-CN/claude-apps-gateway-spend-limits.md#usage-warnings-in-claude-code)后方时,`rate_limits.spend_limit` 对象描述适用于您的支出限额。它在会话的第一次 API 响应之后出现,需要 Claude Code v2.1.251 或更高版本。您的脚本会按不同的时间安排接收其各个字段:

379 379 

380* `used_percentage` 和 `resets_at`:随每个响应一起提供,因此只要 `spend_limit` 存在,它们就存在。`used_percentage` 的范围是 0 到 100,一旦您超过限制则会超过 100;`resets_at` 是该限制周期重置时的 Unix 纪元秒。380* `used_percentage` 和 `resets_at`:随每次响应一起提供,因此只要存在 `spend_limit`,它们就存在。`used_percentage` 的范围为 0 到 100,超出限额后会高于 100;`resets_at` 是限额周期重置的时间(Unix 纪元秒)。

381* `used_usd`、`limit_usd` 和 `period`:您迄今为止以美元计的估计支出和限额,以及该限制涵盖的周期,为 `daily`、`weekly` 或 `monthly` 之一。网关 [根据 token 计数计算 `used_usd`](https://code.claude.com/docs/zh-CN/claude-apps-gateway-spend-limits#how-requests-are-priced),因此它是一个估计值,而不是计费金额。Claude Code 通过单独的请求从网关读取这些字段,在您发送请求期间大约每五分钟一次。美元金额可能比 `used_percentage` 滞后约五分钟,因此两者可能会短暂不一致。Claude Code 和网关均需要 v2.1.284 或更高版本。381* `used_usd`、`limit_usd` 和 `period`:以美元计的迄今预估支出和限额,以及限额所覆盖的周期,取值为 `daily`、`weekly` 或 `monthly` 之一。网关[根据 token 数计算 `used_usd`](https://code.claude.com/docs/zh-CN/claude-apps-gateway-spend-limits#how-requests-are-priced),因此它是一个估算值,而不是计费金额。Claude Code 通过单独的请求从网关读取这些字段,在您发送请求期间大约每五分钟读取一次。美元金额可能比 `used_percentage` 滞后约五分钟,因此两者可能短暂不一致。Claude Code 和网关均需 v2.1.284 或更高版本。

382 382 

383即使 `spend_limit` 存在,也应将 `used_usd`、`limit_usd` 和 `period` 视为可选字段。您的脚本会先于它们收到百分比;如果您设置了 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`(它会关闭该请求),它们将始终不存在。请在脚本中为每个字段提供备用值来读取,例如 `jq -r '.rate_limits.spend_limit.used_usd // empty'`。383即使存在 `spend_limit`,也应将 `used_usd`、`limit_usd` 和 `period` 视为可选字段,因为您的脚本会先于它们收到百分比。请在脚本中为每个字段提供备用值进行读取,例如 `jq -r '.rate_limits.spend_limit.used_usd // empty'`。在 Claude Code v2.1.295 之前,如果您设置了 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`,这些字段会一直不存在,因为该设置会关闭那个请求。

384 384 

385### Prompt cache 字段385### 提示缓存字段

386 386 

387`prompt_cache` 对象总结了会话的主对话如何使用 [prompt cache](https://code.claude.com/docs/zh-CN/prompt-caching.md)。Claude Code 从 API 响应中的缓存令牌计数计算它,因此它适用于每个提供商。387`prompt_cache` 对象汇总了会话主对话使用[提示缓存](https://code.claude.com/docs/zh-CN/prompt-caching.md)的情况。Claude Code 根据 API 响应中的缓存 token 数计算该对象,因此它适用于所有提供商。

388 388 

389该对象在主对话的第一次 API 响应后出现。Claude Code 不计算这些统计信息中的子代理请求。需要 Claude Code v2.1.251 或更高版本。389该对象在主对话的第一次 API 响应之后出现。Claude Code 不会将子代理请求计入这些统计信息。需要 Claude Code v2.1.251 或更高版本。

390 390 

391该表列出了每个字段及其含义。时间戳是 Unix 纪元秒,与 `rate_limits.*.resets_at` 相同的单位。短状态行通常显示其中一个或两个;`warm` 和 `hit_ratio` 最直接地总结缓存状态。391下表列出了每个字段及其含义。时间戳为 Unix 纪元秒,与 `rate_limits.*.resets_at` 的单位相同。简短的状态栏通常只显示其中一两个字段;`warm` 和 `hit_ratio` 最直接地概括了缓存状态。

392 392 

393| 字段 | 描述 |393| 字段 | 描述 |

394| - | - |394| - | - |

395| `warm` | 缓存的前缀是否仍在其 TTL 内。当最后一次响应未报告缓存令牌时为 `false`,即使 `caching_observed` 为 `true` |395| `warm` | 缓存的前缀是否仍在其 TTL 内。当最后一次响应未报告缓存 token 时为 `false`,即使 `caching_observed` 为 `true` 也是如此 |

396| `caching_observed` | 此会话的任何响应是否报告了缓存令牌。`false` 意味着 prompt caching 已关闭,或你的提供商或网关不报告它 |396| `caching_observed` | 本次会话中是否有任何响应报告了缓存 token。`false` 表示提示缓存已关闭,或者您的提供商或网关不报告缓存信息 |

397| `ttl` | 当前缓存前缀的 [缓存生命周期](https://code.claude.com/docs/zh-CN/prompt-caching.md#cache-lifetime):`"5m"` 或 `"1h"` |397| `ttl` | 当前缓存前缀的[缓存生命周期](https://code.claude.com/docs/zh-CN/prompt-caching.md#cache-lifetime):`"5m"` 或 `"1h"` |

398| `expires_at` | 缓存的前缀离开其 TTL 并变冷时,以纪元秒为单位。当最后一次响应未报告缓存令牌时为 `null` |398| `expires_at` | 缓存前缀超出其 TTL 并变冷的时间,以纪元秒表示。当最后一次响应未报告缓存 token 时为 `null` |

399| `requests` | 为此会话的主对话记录的 API 请求 |399| `requests` | 本次会话中为主对话记录的 API 请求数 |

400| `misses` | 重新处理缓存已持有的内容的请求:超过 5% 且至少 2,000 个令牌的请求可以从缓存读取,没有压缩或清除旧工具结果来解释缓存读取的不足 |400| `misses` | 重新处理了缓存中已有内容的请求:超过该请求本可从缓存读取内容的 5% 且至少 2,000 个 token,并且没有压缩或工具结果清除可以解释缓存读取的不足 |

401| `expected_rebuilds` | 在压缩或清除旧工具结果后进行的缓存重建 |401| `expected_rebuilds` | 在压缩或清除旧工具结果之后发生的缓存重建次数 |

402| `hit_ratio` | 缓存读取令牌作为此会话所有输入令牌的分数,从 0 到 1。分母计算缓存读取、缓存写入和未缓存输入。当这些计数都为零时为 `null` |402| `hit_ratio` | 本次会话中缓存读取 token 占所有输入 token 的比例,范围为 0 到 1。分母包括缓存读取、缓存写入和未缓存的输入。当这些计数全部为零时为 `null` |

403| `cache_write_tokens` | 此会话中写入缓存的所有令牌,包括第一个请求的初始写入 |403| `cache_write_tokens` | 本次会话中写入缓存的所有 token,包括第一个请求的初始写入 |

404| `miss_recache_tokens` | 由计为未命中的请求写入缓存的令牌 |404| `miss_recache_tokens` | 被计为未命中的请求写入缓存的 token |

405| `last_miss_at` | 最后一次未命中发生时,以纪元秒为单位。当会话没有未命中时为 `null` |405| `last_miss_at` | 最后一次未命中发生的时间,以纪元秒表示。当会话中没有未命中时为 `null` |

406| `last_miss_cause` | Claude Code 识别为最后一次未命中可能原因的内容,在 [最后一次未命中原因](#last-miss-cause) 下描述。需要 Claude Code v2.1.260 或更高版本 |406| `last_miss_cause` | Claude Code 判定的最后一次未命中的可能原因,详见[最后一次未命中原因](#last-miss-cause)。需要 Claude Code v2.1.260 或更高版本 |

407| `miss_causes` | 此会话的诊断未命中中有多少具有每个原因,以与 `last_miss_cause` 相同的原因名称为键。需要 Claude Code v2.1.260 或更高版本 |407| `miss_causes` | 本次会话中已诊断的未命中按各原因分别有多少次,键名与 `last_miss_cause` 中的原因名称相同。需要 Claude Code v2.1.260 或更高版本 |

408| `recache_tokens_if_cold` | 如果缓存到那时已变冷,下一个请求重新缓存的令牌。在压缩或清除旧工具结果后为 `null`,直到下一个请求记录重写对话的大小 |408| `recache_tokens_if_cold` | 如果到下一个请求时缓存已变冷,该请求需要重新缓存的 token 数。在压缩或清除旧工具结果之后立即为 `null`,直到下一个请求记录重写后对话的大小 |

409 409 

410Claude Code 在终端上显示相同的统计信息,在 [`/usage` 命令的 `Prompt cache (main)` 行](https://code.claude.com/docs/zh-CN/costs#prompt-cache-statistics) 上。410Claude Code 在终端中的 [`/usage` 命令的 `Prompt cache (main)` 行](https://code.claude.com/docs/zh-CN/costs#prompt-cache-statistics)上显示相同的统计信息。

411 411 

412#### 最后一次未命中原因412#### 最后一次未命中原因

413 413 

414`last_miss_cause` 对象报告 Claude Code 识别为最近一次未命中可能原因的内容。其 `causes` 数组包含一个或多个原因名称,例如 `tools_changed`、`system_prompt_changed`、`ttl_expired_5m` 或 `likely_server_side`。该对象在会话的第一次未命中之前为 `null`,以及每当 Claude Code 无法识别最近一次未命中的原因时再次为 `null`。需要 Claude Code v2.1.260 或更高版本。414`last_miss_cause` 对象报告 Claude Code 判定的最近一次未命中的可能原因。其 `causes` 数组包含一个或多个原因名称,例如 `tools_changed`、`system_prompt_changed`、`ttl_expired_5m` 或 `likely_server_side`。在会话第一次未命中之前,该对象为 `null`;每当 Claude Code 无法确定最近一次未命中的原因时,也会再次为 `null`。需要 Claude Code v2.1.260 或更高版本。

415 415 

416两个原因向对象添加计数:416有两种原因会向该对象添加计数:

417 417 

418* `tools_added` 和 `tools_removed`:与 `tools_changed` 一起,有多少工具被添加到或从请求中移除418* `tools_added` 和 `tools_removed`:与 `tools_changed` 一起出现,表示向请求中添加或从请求中移除的工具数量

419* `system_char_delta`:与 `system_prompt_changed` 一起,系统提示长度的变化,以字符为单位419* `system_char_delta`:与 `system_prompt_changed` 一起出现,表示系统提示词长度的变化,以字符为单位

420 420 

421## 示例421## 示例

422 422 

Details

121* **后台会话**:[后台会话](https://code.claude.com/docs/zh-CN/agent-view.md)不会向您的终端报告其状态,即使您已连接到该会话也是如此。Agent 视图会改为显示其状态。121* **后台会话**:[后台会话](https://code.claude.com/docs/zh-CN/agent-view.md)不会向您的终端报告其状态,即使您已连接到该会话也是如此。Agent 视图会改为显示其状态。

122* **[`CLAUDE_CODE_DISABLE_TERMINAL_TITLE`](https://code.claude.com/docs/zh-CN/env-vars#variables)**:如果您将此变量设置为 `1`,Claude Code 将不会检查支持情况,也不会报告状态。请取消设置该变量。122* **[`CLAUDE_CODE_DISABLE_TERMINAL_TITLE`](https://code.claude.com/docs/zh-CN/env-vars#variables)**:如果您将此变量设置为 `1`,Claude Code 将不会检查支持情况,也不会报告状态。请取消设置该变量。

123 123 

124在报告支持该协议的终端中,标签页标题不会以状态符号开头。终端会自行显示会话的状态,因此 Claude Code 会省略其在其他终端中置于标题前面的符号。

125 

124## 配置 tmux126## 配置 tmux

125 127 

126当 Claude Code 在 tmux 中运行时,默认情况下 Shift+Enter 提交而不是插入换行符,桌面通知和[进度条](https://code.claude.com/docs/zh-CN/settings-reference.md#terminalprogressbarenabled)永远无法到达外部终端。将这些行添加到 `~/.tmux.conf`,然后运行 `tmux source-file ~/.tmux.conf` 将其应用到运行中的服务器:128当 Claude Code 在 tmux 中运行时,默认情况下 Shift+Enter 提交而不是插入换行符,桌面通知和[进度条](https://code.claude.com/docs/zh-CN/settings-reference.md#terminalprogressbarenabled)永远无法到达外部终端。将这些行添加到 `~/.tmux.conf`,然后运行 `tmux source-file ~/.tmux.conf` 将其应用到运行中的服务器:

Details

258 258 

259当 `old_string` 与当前内容完全匹配且明确无误,且 Claude Code 可以在不提示的情况下读取文件时,在 Claude 最后读取后在磁盘上更改的文件仍然可以编辑。针对文件的当前内容进行匹配可以保持安全,结果会注明该文件包含其他更改,以便 Claude 在依赖周围内容的编辑前重新读取它。在任何其他情况下,例如过时的 `old_string` 或在没有 `replace_all` 的情况下匹配多次的情况,Claude 在编辑前再次读取文件。259当 `old_string` 与当前内容完全匹配且明确无误,且 Claude Code 可以在不提示的情况下读取文件时,在 Claude 最后读取后在磁盘上更改的文件仍然可以编辑。针对文件的当前内容进行匹配可以保持安全,结果会注明该文件包含其他更改,以便 Claude 在依赖周围内容的编辑前重新读取它。在任何其他情况下,例如过时的 `old_string` 或在没有 `replace_all` 的情况下匹配多次的情况,Claude 在编辑前再次读取文件。

260 260 

261Claude 使用 `cat` 或 `grep` 等 Bash 命令查看文件后,也可以在不单独执行 Read 的情况下编辑该文件。这些命令是 `cat`、`nl`、`bat`、`batcat`、`head`、`tail`、`sed -n 'X,Yp'`、`grep`、`egrep`、`fgrep` 和 `rg`,且每个命令都需在单个文件上运行,没有管道或重定向。没有输出任何匹配的搜索不算作读取,此列表之外的任何命令也不算。261Claude 使用 `cat` 或 `grep` 等 Bash 命令查看文件后,也可以在不单独执行 Read 的情况下编辑该文件。这些命令是 `cat`、`nl`、`bat`、`batcat`、`head`、`tail`、`sed -n 'X,Yp'`、`grep`、`egrep`、`fgrep` 和 `rg`,且每个命令都需在单个文件上运行,没有管道或重定向。如果命令没有输出该文件的任何文本(例如搜索没有匹配到任何内容时),编辑前读取检查仍然适用。

262 262 

263当 Claude 以这种方式查看文件时,Claude Code 还会加载适用于该文件的任何[子目录 `CLAUDE.md`](https://code.claude.com/docs/zh-CN/memory#how-claude-md-files-load) 和[路径范围规则](https://code.claude.com/docs/zh-CN/memory.md#path-specific-rules)。请参阅 [Read 和 Edit 权限规则](https://code.claude.com/docs/zh-CN/permissions.md#read-and-edit),了解您的 `Read` 和 `Edit` 拒绝规则涵盖哪些 Bash 命令。263当 Claude 以这种方式查看文件时,Claude Code 还会加载适用于该文件的任何[子目录 `CLAUDE.md`](https://code.claude.com/docs/zh-CN/memory#how-claude-md-files-load) 和[路径范围规则](https://code.claude.com/docs/zh-CN/memory.md#path-specific-rules)。请参阅 [Read 和 Edit 权限规则](https://code.claude.com/docs/zh-CN/permissions.md#read-and-edit),了解您的 `Read` 和 `Edit` 拒绝规则涵盖哪些 Bash 命令。

264 264 


383 383 

384[WebSocket 源](#websocket-source) 有其自己的批准提示,分类器也在自动模式下决定。384[WebSocket 源](#websocket-source) 有其自己的批准提示,分类器也在自动模式下决定。

385 385 

386该工具在 Amazon Bedrock、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上不可用。当设置了 `DISABLE_TELEMETRY` 或 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 时,它也不可用。在 Windows 上,仅当安装了 [Git Bash](https://code.claude.com/docs/zh-CN/setup.md#set-up-on-windows) 时该工具才可用。386在以下情况下,Monitor 需要最低版本或 Git Bash:

387 

388* **最低版本**:在 Amazon Bedrock、Claude Platform on AWS、Google Cloud 的 Agent Platform 或 Microsoft Foundry 上,或者设置了 `DISABLE_TELEMETRY` 或 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 时,Monitor 需要 Claude Code v2.1.310 或更高版本。此要求在 [功能标志获取](https://code.claude.com/docs/zh-CN/env-vars.md#features-that-need-feature-flag-fetching) 关闭时适用

389* **Windows**:仅当安装了 [Git Bash](https://code.claude.com/docs/zh-CN/setup.md#set-up-on-windows) 时该工具才可用

387 390 

388插件可以声明在插件处于活动状态时自动启动的监视,而不是要求 Claude 启动它们。请参阅 [插件监视器](https://code.claude.com/docs/zh-CN/plugins/components.md#monitors)。391插件可以声明在插件处于活动状态时自动启动的监视,而不是要求 Claude 启动它们。请参阅 [插件监视器](https://code.claude.com/docs/zh-CN/plugins/components.md#monitors)。

389 392 

Details

177 177 

178**1. 打开差异视图**178**1. 打开差异视图**

179 179 

180差异指示器显示整个会话中添加和删除的行,例如 `+42 -18`。选择它以打开差异视图,左侧是文件列表,右侧是更改。180Claude 将其更改推送到分支后,聊天旁边面板中的 **Changes** 卡片会显示整个会话中添加和删除的行,例如 `+42 -18`。点击这些计数以打开差异视图。

181 

182* 您也可以点击会话标题栏中的 **Changes**,或标题栏 **⋮** 菜单中的该选项。

183* 若面板处于隐藏状态,要显示它,请点击会话标题栏中的 **Show session rail** 图标,或标题栏 **⋮** 菜单中的该选项。

181 184 

182差异默认将会话的更改与其基础分支进行比较。要与不同的分支进行比较,选择**Compare against**并选择一个。185差异默认将会话的更改与其基础分支进行比较。要与不同的分支进行比较,选择**Compare against**并选择一个。

183 186 


187 190 

188**3. 创建拉取请求**191**3. 创建拉取请求**

189 192 

190当差异看起来正确时,选择差异视图顶部的**Create PR**。您可以将其作为完整 PR、草稿打开,或跳转到 GitHub 的撰写页面,其中包含生成的标题和描述。193当 diff 看起来正确时,如果 **Changes** 卡片不在视图中,请[重新显示面板](https://code.claude.com/docs/zh-CN/claude-code-on-the-web.md#review-changes),然后从该卡片创建 Pull Request 或草稿:

194 

195* 点击 **Create PR**。Claude Code 会使用生成的标题和描述创建 Pull Request。

196* 若要改为打开草稿,请右键点击 **Create PR**,选择 **Create draft PR** 以更改该按钮的行为,然后点击该按钮

191 197 

192**4. 在 PR 后继续迭代**198**4. 在 PR 后继续迭代**

193 199