百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比

wptr33 2025-10-02 09:05 30 浏览

前情回顾

前面两天我们重点调研了了一下 Cursor 的原理和 Cursor 中一个关键的工具 edit_file 的实现,但是其他 Coding Agent 也需要稍微摸一下底,看看有没有优秀之处,下面是调研的结果。

调研的 Coding Agent 列表

VSCode 插件

1. Cline

  • GitHub: https://github.com/cline/cline

  • Website: https://cline.bot/

2. GitHub Copilot

  • GitHub: https://github.com/microsoft/vscode-copilot-chat

  • Website: https://github.com/features/copilot

IDE

1. Cursor

  • GitHub: https://github.com/cursor/cursor

  • Website: https://cursor.sh/

Command Line

1. Claude Code

  • GitHub: https://github.com/anthropics/claude-code

  • Website: https://docs.anthropic.com/en/docs/claude-code/overview

2. Gemini CLI

  • GitHub: https://github.com/google-gemini/gemini-cli

  • Website: https://developers.google.com/gemini-code-assist/docs/gemini-cli

3. Aider

  • GitHub: https://github.com/Aider-AI/aider

  • Website: https://aider.chat/

4. OpenCode

  • GitHub: https://github.com/opencode-ai/opencode

Tools List

横向对比

Claude Code 的工具名和 Aider 很相似,有理由相信它一开始是基于 Aider 来开发的

Cursor

搜索与发现

  • codebase_search - 语义搜索代码库,基于内容理解进行智能搜索

  • grep_search - 使用正则表达式进行精准文本搜索

  • file_search - 模糊搜索文件路径,快速定位目标文件

  • web_search - 搜索网页信息,获取在线资源

  • list_dir - 列出目录内容,浏览文件结构

文件系统操作

  • read_file - 读取文件内容,支持各种文本格式

  • edit_file - 编辑或创建文件,支持多种编程语言

  • delete_file - 删除指定文件

  • reapply - 重新应用之前的编辑操作(当编辑失败时使用)

指令执行

  • run_terminal_cmd - 执行终端命令,运行脚本和程序

知识管理

  • update_memory - 存储或更新项目相关记忆,保持上下文连贯性

GitHub 集成

  • fetch_pull_request - 获取 Pull Request 或 Commit 详细信息

  • fetch_github_issue - 获取 GitHub Issue 信息和讨论内容

内容生成

  • create_diagram - 创建 Mermaid 图表,可视化流程和架构

Trae

  • search_codebase - 基于语义的代码搜索

  • search_by_regex - 正则表达式文本搜索

  • view_files - 查看多文件内容

  • list_dir - 列出目录结构

  • write_to_file - 创建/覆写文件

  • update_file - 块替换式文件编辑

  • edit_file_fast_apply - 快速代码片段修改

  • rename_file - 文件重命名/移动

  • delete_file - 删除文件

  • run_command - 执行系统命令

  • check_command_status - 命令状态检查

  • stop_command - 终止运行中命令

  • open_preview - 预览网页应用

  • web_search - 联网搜索

  • finish - 结束会话

Cline

  1. read - 读取文件内容

  2. write - 写入或创建文件

  3. edit - 对文件进行定向编辑

  4. ask_question - 向用户提出后续问题

  5. plan_mode_respond - 以计划模式进行响应

  6. bash - 执行命令行命令

  7. ls - 列出目录内容

  8. grep - 使用正则表达式搜索文件

  9. web_fetch - 获取网页内容


  10. list_code_definition_names - 列出代码定义名称

  11. use_mcp_tool - 使用 MCP 服务器工具

  12. access_mcp_resource - 访问 MCP 服务器资源

  13. load_mcp_documentation - 加载 MCP 文档

  14. new_task - 创建新任务

  15. attempt_completion - 展示最终结果

  16. browser_action - 浏览器自动化(取决于 supportsBrowserUse 设置)

Github Copilot

文件操作工具:

  • apply_patch - 应用代码补丁到文件

  • read_file - 读取文件内容

  • create_file - 创建新文件

  • insert_edit_into_file - 向现有文件插入编辑内容

  • replace_string_in_file - 替换文件中的字符串

  • list_dir - 列出目录内容

  • create_directory - 创建新目录

搜索和发现工具:

  • file_search - 按名称/模式查找文件

  • grep_search - 在文件中搜索文本内容

  • semantic_search - 语义代码库搜索

  • search_workspace_symbols - 搜索代码符号

  • list_code_usages - 查找代码使用引用

  • test_search - 查找测试文件

  • get_search_view_results - 获取搜索视图结果

项目结构工具:

  • read_project_structure - 读取整体项目结构

  • get_doc_info - 获取文档信息

开发工具:

  • run_tests - 执行测试套件

  • test_failure - 处理测试失败

  • get_errors - 获取编译/检查错误

  • run_vs_code_task - 运行 VSCode 任务

  • create_and_run_task - 创建并执行任务

版本控制工具:

  • get_changed_files - 获取 SCM 更改

终端和命令工具:

  • run_in_terminal - 执行终端命令

  • get_terminal_output - 获取终端输出

  • get_terminal_selection - 获取终端选择内容

  • get_terminal_last_command - 获取最后一个终端命令

  • run_vscode_command - 运行 VSCode 命令

扩展和环境工具:

  • install_extension - 安装 VSCode 扩展

  • get_vscode_api - 访问 VSCode API

  • update_user_preferences - 更新用户设置

笔记本工具:


  • create_new_jupyter_notebook - 创建 Jupyter 笔记本

  • edit_notebook_file - 编辑笔记本文件

  • run_notebook_cell - 执行笔记本单元格

  • read_notebook_cell_output - 读取单元格输出


  • copilot_getNotebookSummary - 获取笔记本摘要

工作区和项目工具:

  • create_new_workspace - 创建新工作区

  • get_project_setup_info - 获取项目设置信息

网络和外部工具:

  • fetch_webpage - 获取网页内容

  • github_repo - 访问 GitHub 仓库

  • open_simple_browser - 打开简单浏览器

实用工具:

  • think - 内部推理工具

Gemini CLI

  1. list_directory - 列出文件和目录

  2. read_file - 读取文件内容

  3. search_file_content - 使用正则表达式搜索文件内容

  4. glob - 查找匹配模式的文件

  5. replace - 编辑/替换文件内容

  6. write_file - 将内容写入文件

  7. web_fetch - 获取URL内容

  8. read_many_files - 一次读取多个文件

  9. run_shell_command - 执行shell命令

  10. save_memory - 保存到长期记忆

  11. google_web_search - 执行网络搜索

Claude Code

Bash - 执行shell命令

Read - 从文件系统读取文件

Write - 将文件写入文件系统

Edit - 编辑现有文件

MultiEdit - 对文件进行多处编辑

Glob - 文件模式匹配

Grep - 搜索文件内容

LS - 列出目录

WebSearch - 搜索网络

WebFetch - 获取网页内容

TodoRead - 读取待办事项列表

TodoWrite - 管理待办事项列表

NotebookRead - 读取Jupyter笔记本

NotebookEdit - 编辑Jupyter笔记本

exit_plan_mode - 退出规划模式

Aider

File Operations:

  1. Read - 读取文件系统中的文件(带行号)

  2. Edit - 在文件中进行精确的字符串替换

  3. MultiEdit - 对单个文件进行多处编辑

  4. Write - 写入/覆盖整个文件

  5. NotebookRead - 读取 Jupyter 笔记本(.ipynb 文件)

  6. NotebookEdit - 编辑 Jupyter 笔记本单元格

File Discovery & Search:

  1. Glob - 使用模式(如 **/*.js)查找文件

  2. Grep - 使用正则表达式搜索文件内容

  3. LS - 列出文件和目录

System Operations:

  1. Bash - 在持久化的shell会话中执行bash命令

Task Management:

  1. TodoRead - 读取当前待办事项列表

  2. TodoWrite - 创建和管理结构化任务列表

Web Operations:

  1. WebFetch - 获取并使用AI处理网页内容

  2. WebSearch - 搜索网络信息

Agent & Planning:

  1. Task - 启动专门的代理处理复杂搜索

  2. exit_plan_mode - 在展示实施计划后退出规划模式

OpenCode

  1. bash - 命令执行

  2. edit - 使用查找/替换进行文件编辑

  3. fetch - HTTP内容获取

  4. glob - 文件模式匹配

  5. grep - 使用正则表达式进行内容搜索

  6. ls - 目录列表

  7. sourcegraph - 公共代码仓库搜索

  8. view - 带行号的文件查看

  9. patch - 多文件补丁应用

  10. write - 文件创建/覆写

  11. agent - 子代理生成

  12. diagnostics (条件性) - 可用时的LSP诊断

Edit Tool 实现

Cline

参数

  • file_path (字符串): 要修改的文件的绝对路径

  • edits (数组): 编辑操作数组,每个操作包含:

    • old_string (字符串): 要替换的确切文本

    • new_string (字符串): 替换文本

输出格式

返回按顺序应用文件修改的结构化结果。支持:

  1. diff 格式的 SEARCH/REPLACE 块:

------- SEARCH
旧内容在这里
=======
新内容在这里
+++++++REPLACE
  1. 流式 JSON 替换 用于实时更新

  2. 工具使用接口 带有 type/name/params 结构

  3. 错误处理 具有特定错误类型和验证

工具映射:MultiEdit → replace_in_file 内部映射

核心字符串匹配层次结构

  1. 精确字符串匹配(主要方式)

constexactIndex = originalContent.indexOf(currentSearchContent,lastProcessedIndex)
  • 简单的 indexOf 子字符串搜索

  • 时间复杂度:O(n×m),其中 n=文件长度,m=搜索模式长度

  • 从 lastProcessedIndex 开始以保持顺序

  1. 行修剪回退匹配

functionlineTrimmedFallbackMatch(originalContent:string, searchContent:string, startIndex:number)
  • 将两个内容分割成行

  • 在 trim 后逐行比较以忽略空白字符

  • 时间复杂度:O(n×m×k),其中 k=平均行长度

  1. 块锚点匹配(仅限 3+ 行)

functionblockAnchorFallbackMatch(originalContent:string, searchContent:string, startIndex:number)
  • 使用第一行和最后一行作为"锚点"

  • 时间复杂度:O(n×2) - 仅检查首末行

  1. 全文件搜索(最后手段)

constfullFileIndex = originalContent.indexOf(currentSearchContent,0)
  • 从头开始搜索整个文件,用于乱序编辑

  • 忽略 lastProcessedIndex

字符串处理细节

正则表达式模式:

constSEARCH_BLOCK_START_REGEX =/^[-]{3,} SEARCH>?$/
constSEARCH_BLOCK_END_REGEX =/^[=]{3,}$/
constREPLACE_BLOCK_END_REGEX =/^[+]{3,} REPLACE>?$/

字符索引计算:

letmatchStartIndex = 0
for(letk = 0; k < lineNumber; k++) {
matchStartIndex += originalLines[k].length + 1 // +1for\n
}

算法复杂度

时间复杂度:

  • 最佳情况:O(n) - 单次精确匹配

  • 平均情况:O(n×m) - 精确字符串匹配

  • 最坏情况:O(n×m×k×4) - 所有回退策略失败

空间复杂度:

  • O(n + m) - 存储原始内容 + 搜索模式

  • O(L) 额外用于行数组,其中 L = 行数

关键特性

  1. 顺序处理:维护 lastProcessedIndex 确保编辑按文件顺序应用

  2. 贪婪匹配:取找到的第一个匹配,无回溯

  3. 无模糊匹配:仅精确字符串/修剪行匹配

  4. 基于锚点的优化:使用首末行减少大块的搜索空间

  5. 回退策略链:从最精确到最宽松的分层方法

Gemini CLI

参数

  • file_path (字符串,必需): 文件的绝对路径

  • old_string (字符串,必需): 要替换的文本

  • new_string (字符串,必需): 替换文本

  • expected_replacements(数字,可选): 预期替换次数 (默认: 1)

输出

  • 成功: "Successfully modified file: {path} ({count} replacements)" 或带有统一差异的 FileDiff 对象

  • 错误: 描述性消息如 "Failed to edit, could not find the string to replace"

实现原理

该工具不会重新生成整个文件,而是使用就地文本替换方式:

实现步骤

  1. 将现有文件内容读入内存 (fs.readFileSync)

  2. 使用 JavaScript 的 replaceAll 方法应用字符串替换 (第192行)

  3. 将修改后的内容写回磁盘 (fs.writeFileSync)

关键要点

  • 使用

    currentContent.replaceAll(oldString, newString)

    进行替换

  • 仅将修改后的内容写回磁盘

  • 对于新文件,直接写入 newString

  • 无需完整文件重新生成 - 仅进行目标文本替换

核心算法详解

  1. 基础字符串匹配 (JavaScript replaceAll)

currentContent.replaceAll(oldString, newString)
  • 使用 JavaScript 原生的 String.replaceAll方法

  • 时间复杂度:O(n×m),其中 n = 内容长度,m = 模式长度

  • 算法:V8 引擎中类似 Boyer-Moore 的实现

  1. 出现次数计算算法

functioncountOccurrences(str:string, substr:string):number{
letcount =0;
letpos = str.indexOf(substr);
while(pos !==-1) {
count++;
pos = str.indexOf(substr, pos + substr.length);
}
returncount;
}
  • 算法:防止重叠的朴素字符串搜索

  • 时间复杂度:O(n×m) 最坏情况

  • 空间复杂度:O(1)

  1. 智能纠正管道

阶段 1:直接匹配

  1. 尝试精确的 old_string 匹配 → 计算出现次数

  2. 如果匹配预期次数 → 继续进行

阶段 2:反转义纠正

javascript

unescapeStringForGeminiBug(inputString):
returninputString.replace(/\\+(n|t|r|'|"|`|\\|\n)/g, (match, char) => {
//转换 \\n → \n, \\" → ", 等
})
  • 正则表达式模式:/\\+(n|t|r|'|"||\|\n)/g`

  • 修复 LLM 生成的过度转义问题

阶段 3:AI 驱动的纠正

  • 使用 Gemini Flash 模型在文件中查找相似文本

  • 通过 LLM 语义理解进行模糊匹配

  • 尝试纠正 old_string 和 new_string

阶段 4:修剪优化

javascript

trimPairIfPossible// 如果能改善匹配,移除前导/尾随空白字符
  1. 缓存策略

  • LRU 缓存 (最大 50 个条目)

  • 缓存键:

    ${currentContent}---${originalParams.old_string}---${originalParams.new_string}
  • 避免冗余的 LLM 调用

算法特性

该算法主要基于精确字符串匹配,配备智能回退机制来处理常见的转义问题,并在精确匹配失败时使用 AI 驱动的模糊纠正。工具具有内存效率,仅加载/处理文件内容一次并执行直接字符串替换。

Claude Code

参数

必需参数:

  • file_path (字符串): 文件的绝对路径

  • old_string (字符串): 要替换的文本

  • new_string (字符串): 替换文本

可选参数:

  • replace_all (布尔值): 替换所有出现的位置 (默认: false)

输出格式

javascript

{
filePath:string,
oldString:string,
newString:string,
originalFile:string,
structuredPatch: object,
userModified: boolean,
replaceAll:boolean
}

实现原理

Edit 工具会重新生成整个文件。基于实现模式和工具接口,它:

  1. 将整个文件作为字符串读入内存

  2. 使用 JavaScript 的 .replace 方法执行字符串替换

  3. 将完整的新内容写回文件

核心实现模式

// 读取整个文件
constcontent = fs.readFileSync(filePath,'utf8');
// 替换字符串
constnewContent = replaceAll ?
content.replaceAll(oldString, newString) :
content.replace(oldString, newString);
// 写入整个新文件
fs.writeFileSync(filePath, newContent,'utf8');

它不进行就地编辑 - 而是在内存中处理完整的文件内容并写出整个修改后的版本。

核心算法详解

字符串替换算法

functioneditFile(content, oldString, newString, replaceAll) {
if(replaceAll) {
// 替换所有出现的位置
returncontent.replaceAll(oldString, newString);
}else{
// 仅替换第一个出现的位置
constindex = content.indexOf(oldString);
if(index ===-1)thrownewError("String not found");
// 检查唯一性
if(content.indexOf(oldString, index +1) !==-1) {
thrownewError("Multiple matches found, use replace_all or provide more context");
}
returncontent.replace(oldString, newString);
}
}

关键算法细节

  1. 字符串搜索

  • 使用 indexOf 对文件内容进行线性搜索

  • 时间复杂度:O(n×m),其中 n=文件大小,m=搜索字符串长度

  • 逐字节搜索 UTF-8 编码的文本

  1. 唯一性验证

  • 当 replace_all=false 时,检查多个匹配项

  • 扫描整个文件以计算出现次数

  • 如果 old_string 出现超过一次则失败

  1. 替换策略

  • 单次替换:

    string.replace(oldString, newString)

    - 替换第一个匹配项

  • 全部替换:

    string.replaceAll(oldString, newString)

    - 替换所有匹配项

  • 创建包含替换内容的新字符串

  1. 内存使用

  • 将整个文件作为单个字符串加载到内存中

  • 创建包含替换内容的新字符串 (写时复制)

  • 内存需求:操作期间约为文件大小的 2 倍

  1. 边界情况

  • 空的 old_string - 拒绝

  • old_string == new_string- 拒绝

  • 不存在的文件 - 错误

  • 二进制文件 - 可能损坏数据

  • 超大文件 - 内存限制

算法特性

该算法是直接的字符串操作,而非复杂的文本解析或基于 AST 的编辑。它主要基于精确字符串匹配,通过内存中的完整文件处理来实现文本替换。

感想

看了这么多工具,我个人感觉在工具使用层面,各个 Coding Agent 没有太本质的差异,我依然保持下面这些是 Coding Agent 关键能力的想法:

  1. 一个完整的文件系统,这是给「搜索与查找工具」和「文件操作工具」来使用的;

  2. 一个完整的 windows/unix 的沙箱,这是给「run_terminal_cmd」工具用的,因为这个工具会调用各种系统命令;

  3. 联网搜索的能力,包括基于搜索引擎搜索和 Github 相关的搜索。

  4. 高效的 edit_file:大模型生成完整的代码生成会很耗时,在修改场景,看起来只会生成部分片段,这个片段的格式不是典型的 git diff 格式,是一种很模糊的格式,edit_file 也有类似于 Prompt 的内容,推测它的实现也是基于模型的。

  5. 高效的语义化索引/搜索工具:看起来是需要基于 Embedding 模型和向量数据库构建语义化搜索工具。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...