专题篇章 · 拆开一只生产级 Coding Agent

ToolKind 提供默认只读语义

从枚举与 is_read_only() 追踪只读默认值和能力过滤边界

本页解决的问题

先给结论

「ToolKind 提供默认只读语义」要解决的关键问题是什么?

从枚举与 is_read_only() 追踪只读默认值和能力过滤边界

判断标准

让这个结论先证明自己值得留下。 把这一页当成决策工具,而不是需要背下来的定义。把概念连到一个真实任务、一个可观察结果,以及一个能改变你判断的失败上。

下一步

写下一个问题:试完这个方法后,你能用什么证据回答它?

常见误区

结论听起来很完整,却没有检查最关键的假设。

课程目标准确识别真实 ToolKind 分支,记住 Task 返回 false、源码中没有 TaskOutput 这个 kind,并能解释只读分类与完整权限决策的边界。
核心视觉 · 教学化决策图
ToolKind语义分类 is_read_only()种类默认值 工具级覆盖ToolMetadata 环境控制规则 · 沙箱 · Hook 用户控制交互批准 最终执行决策允许 · 拒绝 · 询问
教学化决策图:表达多层控制关系,不代表单一函数调用链。
真实分类分支

is_read_only() == true

ReadSearchLspListDirListMemorySearchMemoryGetWebSearchWebFetchEnterPlanExitPlanAskUser

这些 kind 的种类默认值为只读。具体工具仍可通过自己的元数据覆盖默认结果。

is_read_only() == false

EditDeleteWriteMoveExecutePlanTaskSkillSearchToolUseToolMonitorGoalUpdate

此处还包含后台任务、媒体生成、部署等种类。Task 明确位于 false 分支。

边界提醒:is_read_only 描述默认副作用语义,不能单独推出「自动执行」或「必须弹窗」。命令规则、工作区权限、沙箱、Hook 与用户批准都会影响最终结果。显示层中 Execute 的标签是 Run Command
真实源码证据
crates/codegen/xai-grok-tools/src/tool_taxonomy.rs · 第 37 至 113 行节选
pub fn presentation_name(self) -> &'static str {
    match self {
        ToolKind::Execute => "Run Command",
        /* 其他 presentation_name 分支省略 */
    }
}

pub fn is_read_only(self) -> bool {
    match self {
        ToolKind::Read
        | ToolKind::Search
        | ToolKind::Lsp
        | ToolKind::ListDir
        | ToolKind::List
        | ToolKind::MemorySearch
        | ToolKind::MemoryGet
        | ToolKind::WebSearch
        | ToolKind::WebFetch
        | ToolKind::EnterPlan
        | ToolKind::ExitPlan
        | ToolKind::AskUser => true,
        ToolKind::Edit
        | ToolKind::Delete
        | ToolKind::Write
        | ToolKind::Move
        | ToolKind::Execute
        | ToolKind::Plan
        | ToolKind::BackgroundTaskAction
        | ToolKind::WaitTasksAction
        | ToolKind::KillTaskAction
        | ToolKind::Skill
        | ToolKind::Task
        | ToolKind::ImageGen
        | ToolKind::VideoGen
        | ToolKind::ImageToVideo
        | ToolKind::ReferenceToVideo
        | ToolKind::DeployApp
        | ToolKind::SearchTool
        | ToolKind::UseTool
        | ToolKind::Monitor
        | ToolKind::GoalUpdate
        | ToolKind::Other => false,
    }
}
源码快照说明:依据本地仓库 grok-build-maincrates/codegen/xai-grok-tools/src/types/tool.rstool_taxonomy.rs,核对日期 2026-07-17。节选中的注释明确标出了省略范围。
课堂练习
02

判断分类,再补齐权限上下文

分别分析 TaskExecuteWebFetch。先写出 kind 默认只读值与显示标签,再列出最终执行前还需要检查的四类控制信号。

Takeaway:ToolKind::is_read_only() 给出可复用的种类默认值。Task 为 false,源码没有 TaskOutput kind,Execute 的统一标签为 Run Command。完整权限判断需要继续读取运行环境与用户控制信号。

「核心视觉 · 教学化决策图」里的风险边界在哪里

「这些 kind 的种类默认值为只读。具体工具仍可通过自己的元数据覆盖默认结果」把安全问题从一句“请模型不要犯错”拉回到权限、数据和环境。真正需要保护的是:模型即使判断失误,系统也不能让错误变成不可逆的结果。

把模型建议和实际权限分开

在「此处还包含后台任务、媒体生成、部署等种类。」涉及的流程中,要分别检查用户能要求什么、模型能建议什么、工具实际允许什么,以及谁有权批准写入或发送。网页、文档和工具返回值都可能携带不可信指令,不能因为它们看起来像说明就自动提升权限。

安全设计必须包含失败和恢复

结合「分别分析 Task 、 Execute 、 WebFetch 。先写出 kind 默认只读值与显示标签,再列出最终执行前还需要检查的四类控制信号」做一次反向演练:加入错误输入、缺失凭证或迟迟不到的审批,确认系统会拒绝、暂停并留下可追踪信息,而不是继续执行到底。

从「核心视觉 · 教学化决策图」走到「is_read_only() == true」

「核心视觉 · 教学化决策图」先把问题落在「ToolKind 语义分类 is_read_only() 种类默认值 工具级覆盖 ToolMetadata 环境控制 规则 · 沙箱 · Hook 用户控制 交互批准 最终执行决策 允许 · 拒绝 · 询问 教学化决策图:表达多层控制关系,不代表单一函数调用链」上;到了「is_read_only() == true」,讨论继续推进到「这些 kind 的种类默认值为只读。具体工具仍可通过自己的元数据覆盖默认结果」。两段连起来,重点就不只是记住一个结论,而是看清它成立所依赖的条件。

把这条判断带到下一个场景

做安全判断时,把“模型想做什么”和“系统允许做什么”分开,逐个检查数据边界、工具权限、人工确认和失败后的恢复路径。

  • 「核心视觉 · 教学化决策图」:ToolKind 语义分类 is_read_only() 种类默认值 工具级覆盖 ToolMetadata 环境控制 规则 · 沙箱 · Hook 用户控制 交互批准 最终执行决策 允许 · 拒绝 · 询问 教学化决策图:表达多层控制关系,不代表单一函数调用链
  • 「is_read_only() == true」:这些 kind 的种类默认值为只读。具体工具仍可通过自己的元数据覆盖默认结果
  • 「判断分类,再补齐权限上下文」:分别分析 Task 、 Execute 、 WebFetch 。先写出 kind 默认只读值与显示标签,再列出最终执行前还需要检查的四类控制信号

最后的「判断分类,再补齐权限上下文」把讨论落到「分别分析 Task 、 Execute 、 WebFetch 。先写出 kind 默认只读值与显示标签,再列出最终执行前还需要检查的四类控制信号」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。

标记为已学完 阅读进度会自动记录
← 上一篇下一篇 →

继续阅读

同一条线上的下一篇。

文章讨论

读到这里,留下一个判断。

把刚想明白的地方、还没想通的问题,留给下一位一起学习的人。

正在讨论 ToolKind 提供默认只读语义 拆开一只生产级 Coding Agent
3条讨论文章讨论 · 与共学社区同步
在共学社区查看
AM
Asha Morgan内容编辑
观点实践记录

我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。

文章讨论7 有帮助
LH
Lin Harper独立开发者
观点观点

读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。

文章讨论5 有帮助
KM
Kiki Moore产品运营
问题问题

如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。

文章讨论4 有帮助