93、【Agent】【OpenCode】edit 工具提示词(二)
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Agent】【OpenCode】edit 工具提示词
继续分析了 Edit 工具提示词,其中提到冒号和空格之后的内容,才是文件里真实存在的东西,AI 在进行字符串匹配时,须完全无视前缀,提取空格之后的内容,并且不能在编辑的文件里带上类似1:这样的行号前缀格式,Edit 工具检测到会直接报错,然后举了个 Python 文件的例子,可能有三种情况:错误的 oldString(带了行号前缀),半吊子的 oldString(去掉了冒号后面的所有空格),完美的 oldString(只去掉了冒号和后面的一个空格,完美保留后面的原始缩进)。然后介绍了 oldString 和 newString 的区别,其中 oldString 是原本要替换的旧代码,newString 是即将要换上去的新代码,下面继续分析
OpenCode
下面继续看剩下的提示词
- 最小化破坏(优先编辑现有文件):保护项目架构完整性,AI 在生成代码时,有时候很容易因为图省事儿而直接创建一个新文件,而不是去修改现有的模块,这不仅会导致代码库中出现大量冗余,碎片化的文件,还会破坏原本清晰的目录结构,这里强制 AI 必须先去理解现有代码的逻辑,进行增量更新,而不是盲目地另起炉灶
- 保持纯净(除非明确要求,否则禁用 Emoji):AI 模型在训练时接触了大量的社交媒体,有时会在注释或打印语句中自动加入类似 🚀、✨、🔥 等表情符号,这在严肃的工程代码中不仅显得极不专业,还可能导致源文件编码报错,或者让后续的代码解析工具崩溃
- 精准匹配机制(唯一的锚点才能定位):Edit 工具需要精确字符串匹配,这里不是模糊搜索,也不是语义替换,而是需要像 Ctrl + F 一样每个字符都去比对(包括空格,换行符,缩进等),只要 AI 提交的 oldString 和文件里的内容有一个标点符号对不上,操作就会立刻终止,所以第一个规则强调了,AI 必须先用 Read 工具拿到最新快照,再进行提取,避免记忆偏差
- 找到多个匹配项会失败:这是为了防止误伤,如果 AI 提供的 oldString 太短,或缺乏特征,比如只提供了一个通用的
return;,文件里可能有几十个地方都符合条件,Edit 工具为了避免改错地方,会直接拒绝执行,并抛出错误,这其实也是在逼迫 AI 扩大上下文范围,用户必须把目标代码的前后几行也包含进 oldString 里,形成一个独一无二的指纹,这样工具才能精准锁定唯一的那个位置
当然,提示词这里最后也提供了批量处理策略(全局替换):当 AI 需要重命名一个变量(比如把userId改成user_id),或者统一修改某个函数名时,可以用replaceAll这个参数进行全局替换,该参数会绕过唯一性校验的限制,直接在当前文件中,把所有匹配的 oldString 一次性全部替换成 newString,可以极大提升重构效率,避免 AI 为了改名而反复调用十几次普通 Edit 工具的笨拙行为
OK,下面来看 Edit 工具的参数内容
filePath:目标文件的绝对路径,在复杂的工程环境中,相对路径非常容易因为当前工作目录(CWD)的切换而失效,强制要求绝对路径,相当于给提供了绝对坐标,防止编辑到错误文件,同时,filePath也是必填项,没有明确的目标文件,就什么也编辑不了
oldString(文件里的锚点位置):也是必填项,上篇 blog 里已经简单介绍过,这里要被替换的字符串需要满足两个条件
- 剥离了行号前缀的真实代码
- 包含足够的上下文缩进,确保在文件中是唯一匹配的
如果oldString提取错误(比如带了行号,丢了缩进),工具会直接报错【oldString not found】;而如果写得太短,导致多处匹配,也同样会报错【Found multiple mathces】
OK,本篇先,到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Agent】【OpenCode】edit 工具提示词(参数内容)
