跳到主要内容

Continue — 架构与原理

30 秒导读: Continue 是一个开源编码 agent——你用自然语言说「帮我把这个函数改成异步的」,它调用大模型,模型回话里夹着「工具调用」(读文件、改文件、跑终端命令),Continue 把这些调用执行掉、把结果塞回对话、再让模型接着想,循环往复直到任务完成。它同一套核心(core/)跑在三个壳里:命令行 CLI、VS Code 扩展、JetBrains 插件。

注:上游已宣布 continuedev/continue 仓库只读、不再维护,做过最终 2.0.0 发布(见 README.md)。本文档讲的是这份代码的架构与原理。


1. 这是什么(零基础也能懂)

  • 一句话定义: Continue 是一个会读你代码、会改你文件、会跑命令的 AI 编程助手,提供 CLI、VS Code、JetBrains 三种形态。

  • 解决什么问题 / 给谁用: 假设你在一个大项目里,想让 AI 帮你完成「把日志库从 winston 换成 pino」这种跨多文件的活儿。你不想自己一个个文件复制粘贴模型给的代码片段——你希望 AI 直接动手:自己找文件、自己改、改完跑一下测试看通不通。Continue 给的就是这个:一个能自主操作你工作区的 agent。

  • 它能做什么:

    • 多轮对话式编程,模型可主动调用工具(读/写/编辑文件、跑终端命令、搜索代码、抓网页)。
    • IDE 内联补全:打字时给灰色「幽灵文本」建议(autocomplete),以及预测你下一处要改哪里(Next Edit)。
    • 权限与安全:每个工具调用都过一道权限策略;终端命令还要过一套专门的危险命令评估。
    • 上下文自动压缩:对话太长快撑爆模型上下文窗口时,自动把历史总结成一条摘要继续跑。
    • 子 agent:把一个子任务丢给一个隔离的子会话去做,做完只把结论带回来。
  • 用起来什么样: CLI 模式下大致是这样一段交互(示意):

$ cn "把 src/utils/log.ts 里的 console.log 全换成 logger.info"

● 我先读一下这个文件
⎿ Read src/utils/log.ts (42 lines)
● 找到 3 处 console.log,用 Edit 替换
⎿ Edit src/utils/log.ts
- console.log(`server started`)
+ logger.info(`server started`)
● 完成。已替换 3 处。

你说一句话,agent 自己决定先 ReadEdit,每一步你都看得到。

  • 一句话直觉/类比: 把它想成一个装了手脚的聊天机器人——大模型是大脑(决定做什么),工具(Read/Edit/Bash…)是手脚(真的去做),Continue 的核心代码就是把大脑的话翻译成手脚动作、再把动作结果汇报给大脑的那根脊髓。

2. 顶层全景(它大概怎么转)

2.1 仓库地图:一套核心,三个壳

Continue 是个 monorepo。最关键的两块是 core/(共享内核)和 extensions/(三个前端)。

目录干什么
core/共享内核:LLM 适配、自动补全、Next Edit、索引、工具定义、编辑应用算法
extensions/cli/命令行 agent(@continuedev/cli),agent 主循环活在这里
extensions/vscode/VS Code 扩展壳
extensions/intellij/JetBrains 插件壳
packages/可独立发布的小包:config-yamlopenai-adaptersterminal-security(终端安全评估)等
gui/扩展用的 React 聊天面板

一个关键的认知:agent 的「对话循环」逻辑主要在 CLI 里(extensions/cli/src/stream/),而**「怎么把编辑落到文件」「怎么补全」这类算法在 core/ 里**,被各端复用。

2.2 一次 agent 对话怎么流动

下面这张图是 CLI agent 处理你一句话的高层流向。从上往下读,中间那个圈是会重复的循环。

你的一句话


┌──────────────────────┐
│ 组装请求 │ 系统消息(含规则/AGENTS.md)
│ · system message │ + 工具定义(按权限过滤)
│ · 工具清单 │ + 对话历史
└──────────┬───────────┘

╭──────────▼───────────────────────────────╮
│ agent 主循环 (while true) │
│ │
│ ① 流式调用 LLM ──► 边收边解析 │
│ · 文本增量 → 显示 │
│ · tool_call 增量 → 拼装 │
│ │ │
│ ② 有工具调用? ─── 否 ──► 跳出循环,返回 │
│ │ 是 │
│ ▼ │
│ ③ 权限检查 + 执行工具(可并行) │
│ · Edit/Bash/Read… │
│ · 结果塞回历史 (tool_result) │
│ │ │
│ ④ 上下文超阈值? ── 是 ──► 压缩历史 │
│ │ │
│ └──────────┘ 回到 ① │
╰────────────────────────────────────────────╯

这张图对应的真实入口是 streamChatResponse()(extensions/cli/src/stream/streamChatResponse.ts:423)的 while (true) 循环。每一圈:重新取系统消息和工具(以便支持中途切模式)、调 LLM、处理工具、检查压缩。

2.3 部件一句话职责

部件干什么在哪个文件
主循环反复「调模型→执行工具→检查压缩」直到没有工具调用extensions/cli/src/stream/streamChatResponse.ts
流解析把流式 chunk 拆成文本增量 + 工具调用增量extensions/cli/src/stream/streamChatResponse.helpers.ts
工具处理把工具调用写进历史、预处理、执行、回填结果extensions/cli/src/stream/handleToolCalls.ts
工具实现每个工具(Edit/Bash/Read…)的参数、预处理、运行逻辑extensions/cli/src/tools/*.ts
权限检查决定一个工具调用是 allow / ask / excludeextensions/cli/src/permissions/permissionChecker.ts
终端安全对 Bash 命令做危险评估(rm -rf / 提权 / 混淆)packages/terminal-security/src/evaluateTerminalCommandSecurity.ts
编辑应用把模型给的 old/new 片段精确落到文件core/edit/searchAndReplace/
上下文压缩历史快撑爆时总结成摘要extensions/cli/src/compaction.ts
自动补全IDE 内联灰字补全core/autocomplete/CompletionProvider.ts
Next Edit预测下一处编辑core/nextEdit/NextEditProvider.ts

3. 阅读地图(建议顺序)

这个项目体量大,拆成了 5 章。按下面顺序读最顺:

  1. 01-agent-loop.md — 先搞懂 agent 主循环:一句话进来,怎么变成「调模型→拼工具调用→执行→续跑」。这是整个 agent 的心脏,先读这章。
  2. 02-edit-application.md — 编码 agent 的看家本领:怎么把模型说的「把这段换成那段」可靠地落到真实文件上。多级降级匹配是精华。
  3. 03-tool-permissions-security.md — 让 agent 动手是危险的。这章讲权限策略 + 终端命令的纵深防御——Continue 这块做得很扎实。
  4. 04-context-compaction.md — 长对话怎么不撑爆上下文:自动压缩 + 压缩后自动续跑的巧思。
  5. 05-autocomplete-nextedit.md — IDE 侧的两套补全机制,和 agent 循环是平行的另一条产品线。

如果你只想抓「这个 agent 哪里最值得学」:读 01(循环骨架)+ 02(降级匹配)+ 03(终端安全)三章即可。


4. 代码地图(导航索引)

主题文件符号名
agent 主循环extensions/cli/src/stream/streamChatResponse.tsstreamChatResponse
单次流式响应extensions/cli/src/stream/streamChatResponse.tsprocessStreamingResponse
工具调用处理extensions/cli/src/stream/handleToolCalls.tshandleToolCalls / getRequestTools
全部内置工具extensions/cli/src/tools/allBuiltIns.tsALL_BUILT_IN_TOOLS
编辑工具extensions/cli/src/tools/edit.tseditTool
降级匹配core/edit/searchAndReplace/findSearchMatch.tsfindSearchMatch / matchingStrategies
权限检查extensions/cli/src/permissions/permissionChecker.tscheckToolPermission
终端安全packages/terminal-security/src/evaluateTerminalCommandSecurity.tsevaluateTerminalCommandSecurity
上下文压缩extensions/cli/src/compaction.tscompactChatHistory / shouldAutoCompact
自动补全core/autocomplete/CompletionProvider.tsCompletionProvider.provideInlineCompletionItems
Next Editcore/nextEdit/NextEditProvider.tsNextEditProvider
子 agentextensions/cli/src/subagent/executor.tsexecuteSubAgent