Skip to content

✨ feature: Write/Update 工具增加占位内容校验(防御模型生成退化,非 bug) #227

Description

@likeghee2025-sys

提交前确认 / Preflight

  • 我已搜索过 issues,没有重复 / I searched existing issues and found no duplicate

想解决什么问题 / What problem does this solve

动机

agent 调用 Write 工具时,content 参数偶尔不是实际文件内容,而是工具调用的结果确认文本:

[已写入 E:\...\xxx.go,732 字节/30 行;需要内容用 Read 查看]

服务端原样写入 → 文件被错误内容覆盖,且返回 Success=true,静默失败——用户和模型都以为写成功了,直到 Read 才发现内容不对。

触发条件(经验观察)

  • 长会话(上下文大)或单次大 content 输出时更易出现
  • 表现为把"调用后返回的确认信息"当成"要写入的内容"——生成侧行为退化

现状

  1. WriteFile(tools/write_file.go)对 content 无任何校验,原样 os.WriteFile
  2. 模型在特定上下文状态下,content 生成退化为元描述(占位),工具无法区分"真内容"与"占位"。
  3. 静默成功 → 错误内容落盘且不可察觉,污染工作区。

期望的方案 / Proposed solution

建议实现

服务端在写入前做占位检测,命中即拒绝并报错,把"静默失败"变成"响亮失败":

// isPlaceholderText:拒绝 "[已写入" 前缀(覆盖所有变体:字节数/行数/分号等)+ 精确正则
func isPlaceholderText(s string) bool {
    t := strings.TrimSpace(s)
    if t == "" {
        return false
    }
    return strings.HasPrefix(t, "[已写入") || placeholderRe.MatchString(t)
}
  • WriteFile:空/空白 content 一并拒绝("空占位符"场景)
  • EditFile:new_string 走同一检测(不拒绝空串——删除操作合法)
  • 正常代码/文档几乎不可能以 [已写入 开头,误伤概率≈0

备选方案 / Alternatives

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions