94、【Agent】【OpenCode】edit 工具提示词(参数内容)
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【Agent】【OpenCode】edit 工具提示词(二)
分析了 Edit 工具剩下的提示词,最小化破坏原则,优先编辑现有文件,保护项目架构完整性,防止代码库中出现大量冗余,碎片化的文件,破坏原本清晰的目录结构,强制 AI 必须先去理解现有代码的逻辑,进行增量更新,保持纯净,除非明确要求,否则禁用 Emoji,精准匹配机制,字符串内所有字符都必须一一对应,找到多个匹配项会失败,防止误伤,如果提供的 oldString 太短,或缺乏特征,Edit 工具为避免改错地方,会直接拒绝执行,批量处理策略,replaceAll参数项可以进行全局替换,接着分析了 Edit 工具的参数内容,filePath(目标文件的绝对路径),oldString(文件里的锚点位置)等,下面继续分析
OpenCode
继续看 Edit 工具剩下的参数内容
newString(必选):要替换的新内容,注意这里进行了防御性校验,如果 AI 提交的newString和oldString一模一样,说明 AI 产生了幻觉,或者在做无用功,OpenCode 客户端会直接拦截这种无意义的请求
此外,newString不需要去匹配原文件的任何东西,但仍要保持和代码风格一致,AI 在生成newString时,必须把该有的缩进(tabs/spaces)和换行符补齐,比如如果oldString前面有 4 个空格,如果newString顶格去写,替换进去就会导致代码缩进崩坏(尤其在 Python 中会直接引发 IndentationError)
replaceAll(全局替换,可选):正常情况下,oldString在文件中必须是唯一的,但如果 AI 想要把整个文件里的变量名批量进行重命名,此时可以把replaceAll设置为true,Edit 工具就会自动忽略【多匹配报错】,直接把文件里所有匹配到的地方一键替换
其中,replaceAll的默认值为false,因为绝大多数的代码修改都是局部精准的
OK,下面看下一个 Write 工具
其提示词路径在opencode/packages/opencode/src/tool/write.txt
这个 Write 工具和前面介绍的 Edit 工具很像,都是用来编辑,把内容存进文件的,但在底层的执行逻辑,性能消耗,以及对代码库的安全性上,Write 和 Edit 工具有着很大不同,下面来详细看下
- Edit(局部替换):该工具的底层逻辑是 diff(差分),比如 AI 只需告诉告诉系统【把文件中第 10 行的 A 换成 B】,OpenCode 就会拿着这个微小的改动,精准地将文件里对应位置替换完毕,而 AI 不需要知道文件的第 100 行是什么,也不关心文件开头有没有变化,属于精准打击
- Write(全量重写):其底层逻辑是 overwrite(全盘覆盖),AI 必须把整个文件从头到尾的完整内容重新生成一遍,然后把硬盘上原来的那个文件(如果存在的话)彻底抹除,用生成的内容取而代之,哪怕用户只想改一个标点符号,Write 工具也会把整个几万行的文件重新搬运一遍
再对比个 Write 和 Edit 在实际使用最直观的:Token 效率与性能,对于 Edit 工具来说,假如要在一个 1000 行的文件里,改两行代码,用 Edit 工具,AI 只需要输出这两行代码的上下文(可能总共才 10 行文本),消耗的 Token 极少,响应速度飞快,而对比 Write 工具,同样的场景,如果用 Write 工具,AI 必须把这 1000 行代码原封不动地生成出来,再加上那两行的修改,这不仅会瞬间消耗了上千个 Token,而且还会让 AI 的生成时间大幅延长,甚至可能因输出太长而触发截断报错
OK,本篇先,到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
