开源项目
开源项目

context-mode 深拆:AI 编程代理的上下文窗口优化

mksglu/context-mode(23,324 星、TypeScript、Elastic License 2.0、2026-02-23 创建、最近 push 2026-09-16,数据截至 2026-09-18 GitHub API)定位"为 AI 编程代理做上下文窗口优化":以 MCP 层沙箱拦截与压缩上下文,配 SQLite/FTS5 知识库与会话连续性设计,覆盖 17 个客户端。核心判断:它切中了长会话膨胀、关键指令被稀释、token 成本随长度上涨三重痛点;但必须如实指出 ELv2 不是 OSI 认证开源,有"不得作托管服务、不得移除许可证声明"两条红线,个人使用无碍,公司引入前要过法务。

发布于 2026年9月18日8 分钟阅读
<!-- context-mode-resource | open-source | context-mode 深拆:AI 编程代理的上下文窗口优化 -->

一、上下文窗口:被忽视的"另一半问题"

过去一年里,编码 agent 成了开发者身边最忙的"数字劳动力"。它们开终端、跑命令、改文件、提 PR,一个人同时挂着 Claude Code、Codex、Cursor 已经不稀奇。但很少有人注意到,模型变聪明之后,真正的瓶颈悄悄从"模型够不够强"挪到了"上下文窗口装不下"。

context-mode 的官方定位是"上下文问题的另一半"。它想补的正是这一半:不是让模型更会写代码,而是让 agent 在长会话里别被自己的上下文撑爆、别在压缩时失忆、别把 token 浪费在搬运原始数据上。

痛点很具体。README 的数字来自真实场景:一次 Playwright 页面快照 56 KB,二十个 GitHub issue 合计 59 KB,一条访问日志 45 KB。三十分钟下来,你的上下文窗口里有 40% 是这种"搬运来的原始数据"。更糟的是,当 agent 为了腾地方做会话压缩(compact)时,它会把正在编辑的文件、进行中的任务、你上一句的要求一起忘掉。再加上 agent 自己会把输出 token 花在寒暄、废话和冗长解释上,上下文从两端一起被烧。

这正是 herdr 这类运行时项目 没碰到的那一层:herdr 管的是 agent 的终端与多机调度,context-mode 管的是 agent 脑内那块上下文内存。两者不是替代,是同一波浪潮在不同入口的落点,而上下文优化与会话编排两件事都得解决,这也正是本文要拆的核心。

二、context-mode 是什么:卡在 MCP 协议层的沙箱

context-mode 本质是一个 MCP server,用 TypeScript 写成,以 npm 包形式分发(包名 context-mode)。它的关键设计判断是:上下文优化应该发生在数据源头,而不是在一个按席位收费的云端看板后面。所以整个工具跑在你本机,没有遥测、没有云同步、不需要账号,你的代码、提示词、会话数据全在本地。

它在 MCP 协议层拦截工具调用:读大文件、跑海量输出命令、抓网页时,不把原始数据灌进上下文窗口,而是丢进隔离子进程沙箱处理,只把"结果"放回对话。README 的原话是:原始数据留在沙箱里,永远不进你的上下文窗口。

这个分层很值得一说。它不是简单的"CLI 输出过滤器",也不是把日志发到云上做分析的仪表盘。它是在模型真正看到数据之前,先做一次就地蒸馏。这一点也决定了它的许可证选择——后面第六节会专门谈 ELv2 意味着什么。

三、四大能力逐条拆

README 把 context-mode 解决的四个面拆得很清楚,我们逐条转述并加判断。

第一,上下文节省(Context Saving)。沙箱工具把原始数据拦在上下文窗口之外。README 给出的总账是:一次完整会话里 315 KB 原始输出被压成 5.4 KB,降幅 98%。它不靠模型自己"精简",而是从架构上就不让原始数据进来。

第二,会话连续性(Session Continuity)。每一次文件编辑、git 操作、任务、错误、用户决策都被记进 SQLite。当对话压缩时,context-mode 不把这些数据原样倒回上下文,而是用 FTS5 建立全文索引,再用 BM25 检索只把相关的那部分取回来。模型能精确接着你上次停的地方往下走。这里有个如实说明的边界:如果你不 --continue,上一会话的数据会被立即删除,干净起步。

第三,用代码思考(Think in Code)。LLM 应该"写程序去做分析",而不是"自己读数据去算"。与其把 50 个文件读进上下文去数函数,不如让 agent 写脚本去数,只 console.log 结果。一个脚本顶十个工具调用,省下 100 倍上下文。README 强调这是横跨全部 17 个客户端的强制范式:别把 LLM 当数据处理器,把它当代码生成器。

第四,不强加文风。context-mode 把原始数据挡在外面,但绝不规定模型最终答案怎么写;简练还是完整、什么格式,交给模型或你自己的 CLAUDE.md / AGENTS.md。README 还引用证据:过度简练的提示反而拉低编码与推理基准,所以路由块只管"数据去哪",不管"模型怎么说话"。

四、沙箱与知识库:怎么做到 315 KB 变 5.4 KB

光看卖点不够,落到实现才有说服力。context-mode 的两台引擎是"沙箱执行"和"SQLite 知识库",我们分头看。

沙箱侧,每一次 ctx_execute 调用都会拉起一个带独立进程边界的子进程,脚本之间互相碰不到对方的内存和状态。子进程跑你的代码、捕获 stdout,只有 stdout 进对话上下文,原始数据(日志、API 响应、快照)永远不离开沙箱。它支持 12 种语言运行时:JavaScript、TypeScript、Python、Shell、Ruby、Go、Rust、PHP、Perl、R、Elixir、C#;如果检测到 Bun,JS/TS 执行还能快 3 到 5 倍。已认证的 CLI(ghawsgcloudkubectldocker)通过凭据透传工作,继承环境变量和配置路径,但绝不明文暴露给对话。当输出超过 5 KB 且带了 intent 时,它切换到"意图驱动过滤":把完整输出建索引,只搜出和你意图相关的片段。

知识库侧,用的是 SQLite FTS5 全文检索表,底层自动选择:bun:sqlitenode:sqlite(Node 22.5+)或 better-sqlite3。检索用 BM25 排序,索引时做 Porter 词干还原("running""runs""ran"归一词干),标题权重是正文 5 倍。更进一步,它用 Reciprocal Rank Fusion 把"词干匹配"和"三元组子串匹配"两条策略的排名融合,再用邻近重排把多词查询里挨得近的结果顶上去,还用 Levenshtein 距离做拼写纠错("kuberntes"自动变为"kubernetes")。检索结果用智能片段而非截断,只回你查询词附近的窗口。

README 的基准表给了直观感受(以下数字均来自 README 的 Benchmarks 章节,未经我方复核):

场景原始进上下文节省
Playwright 快照56.2 KB299 B99%
二十个 GitHub issue58.9 KB1.1 KB98%
五百条访问日志45.1 KB155 B100%
五百分行分析 CSV85.5 KB222 B100%
一百五十三次 git log11.6 KB107 B99%
子代理仓库调研986 KB62 KB94%

单次会话维度,315 KB 原始输出压到 5.4 KB,会话时长从约 30 分钟拉长到约 3 小时。注意这些数字来自 README 自报基准,属于项目方口径,读者应自行验证后再作为采购依据。

五、会话连续性:压缩之后还能接得上

这是 context-mode 最容易被低估的一块。上下文窗口满了,agent 会做 compact 丢掉旧消息来腾地方;没有会话追踪,模型就忘了自己在改哪个文件、哪些任务在进行、哪些错误已解决、你最后要什么。

context-mode 的做法是:把会话里每一个有意义的事件都捕获下来,存进按项目隔离的 SQLite。压缩发生(或你用 --continue / --resume 续上)时,工作态自动重建,模型从你最后一句提示继续,不用你重复任何事。它靠 5 类 hook 协同工作:PreToolUse(执行前强制走沙箱)、PostToolUse(捕获每次工具调用后的事件)、UserPromptSubmit(捕获你的决策和纠正)、Stop(捕获助手轮次结尾态)、PreCompact(压缩前建快照)、SessionStart(压缩或续接后恢复状态)。

捕获的事件分了优先级,从文件、任务、计划、规则、用户提示、决策、git、错误、约束、阻塞、环境、子代理发现到迭代循环、延迟、MCP 工具、技能、外部引用,细到"同一个工具被相似输入调了 3 次以上"都算重试检测。压缩时按优先级分层建一个不超过 2 KB 的 XML 快照,预算紧就先丢低优先级,但活动文件、任务、规则、决策这些关键态永远保留。压缩后模型拿到的"会话指引"有 15 个类别:最后请求、任务清单、计划、关键决策、改动过的文件、未解决错误、约束、阻塞、git、项目规则、用过的 MCP 工具、子代理任务、技能、被拒方案、外部引用。

平台覆盖上,README 列出多达 17 个受支持客户端(Claude Code、Qwen Code、Gemini CLI、VS Code / JetBrains Copilot、GitHub Copilot CLI、Cursor、OpenCode、KiloCode、OpenClaw、Codex CLI、Kimi Code、Antigravity、Kiro、Zed、Pi、OMP 等)。但完整会话连续性(捕获加快照加恢复)只在 Claude Code、Gemini CLI、VS Code Copilot、JetBrains Copilot、OpenCode、KiloCode 这一档;Cursor 因为 sessionStart 被自家校验器拒掉,目前只能做到部分覆盖。如果你正在挑 agent,顺手看这篇 Claude Code 与 Cursor、Codex 的横评 会更有体感。

六、上手与用法:安装、路由强制、命令

安装分两类平台:支持 hook 的平台自动强制路由,不支持的就复制一次路由文件。以 Claude Code 为例,官方走插件市场,全自动:

bash
/plugin marketplace add mksglu/context-mode
/plugin install context-mode@context-mode

重启 Claude Code(或 /reload-plugins)后,跑 /context-mode:ctx-doctor,各项都应显示勾。它一次性注册了全部 6 个 hook 和 11 个 MCP 工具。Gemini CLI、VS Code Copilot、JetBrains Copilot、GitHub Copilot CLI、Cursor 走各自的配置文件加 hook,OpenCode / KiloCode 走 TypeScript 插件,Codex CLI 需要在配置里开 [features].hooks = true

路由这件事值得单独强调:hook 在程序层面拦截并改写工具调用,把危险、会灌数据的命令在执行前重定向进沙箱;纯指令文件只能"劝"模型,拦不住任何东西。README 对照很直接——开 hook 约省 98%,只靠指令文件约省 60%。一句话:平台支持 hook 就务必开。

日常命令很简单,在任意 AI 会话里直接打字,LLM 自动调对应 MCP 工具:

bash
ctx stats     # 上下文节省、调用次数、会话报告
ctx doctor    # 诊断运行时、hook、FTS5、版本
ctx index     # 把本地文件或目录建索引
ctx search    # 检索已索引内容
ctx upgrade    # 从 GitHub 拉最新、重建、迁移、修 hook
ctx purge     # 永久清空知识库已索引内容

一个最小可跑的例子,把"读 50 个文件数函数"换成"写脚本数":

js
// 之前:47 次 Read() = 700 KB。之后:1 次 ctx_execute() = 3.6 KB。
ctx_execute("javascript", `
  const files = fs.readdirSync('src').filter(f => f.endsWith('.ts'));
  files.forEach(f => console.log(f + ': ' + fs.readFileSync('src/'+f,'utf8').split('\\n').length + ' lines'));
`);

如果你关心各家 agent 的免费额度、以及哪家长会话更烧上下文,这篇 AI 编码工具免费额度横评 和这篇 Qoder 加 Qwen3-8 的热点解读 可以和本文互补着看。

七、许可证冷思考:ELv2 到底意味着什么

最后这段必须讲清楚,因为它是 context-mode 和"正宗开源"的分水岭,不能含糊带过。

context-mode 用的是 Elastic License 2.0(ELv2),README 自己写的是 "source-available"(源码可得)而不是 "open source"。截至 2026 年 9 月 18 日 GitHub API 核实,仓库 mksglu/context-mode 累计 23,324 颗星,TypeScript 实现,许可证为 ELv2,仓库创建于 2026-02-23,最近一次 push 在 2026-09-16,属于快速上升期的年轻项目。

ELv2 不是 OSI 认证的开源许可证。它允许你使用、fork、修改、分发;但有两条红线不能碰:第一,不能把它当作托管的、受管理的服务对外提供;第二,不能移除许可证声明。项目方在 README 里直说了选 ELv2 而非 MIT 的理由:MIT 允许别人把代码重新打包成一个竞争的闭源 SaaS,而 ELv2 在保留源码对所有人可得的同时,堵住了这条路。

对使用者这意味着什么,要分人来谈。对个人开发者,平时在自己机器上跑 agent、装 npm 包、接 Claude Code 这类客户端,ELv2 和 MIT 的体感几乎没差——你能用、能改、能学源码,没有费用,也不触发那两条红线。对在公司里用的人,绝大多数内部研发场景也安全,因为红线是"对外提供托管服务",内部使用、内部工具链集成都不算。真正要小心的有两类:其一,若你公司做"给客户的 AI 编码平台 / agent 托管服务",把 context-mode 当后端能力对外卖,就踩第一条红线;其二,二次分发须保留许可证声明,不能抹原作者署名与 ELv2 条款。

我的判断:把它当个人和小团队的生产力工具完全没问题,许可证不会挡你;但如果你打算基于它做商业化的托管产品,必须提前和法务确认 ELv2 的边界,或者走商业授权。源码可得但不自由,这是 ELv2 的诚实定位,也是选型评估表上要如实写的一行。

常见问题

问题一:context-mode 和直接让模型"精简输出"有什么区别?

A1:区别在于它在架构层拦数据,而不是靠提示词劝模型。模型自己精简是不可靠的,且 README 引用证据表明过度简练的提示反而拉低编码与推理基准。context-mode 用沙箱让原始数据根本不进上下文窗口,用 FTS5 加 BM25 做按需检索,用"写代码去分析"替代"读数据去算",从机制上把上下文占用压下来,不依赖模型自律。

问题二:会话压缩后我的工作状态真的能接上吗,会丢什么?

A2:在完整支持的平台(Claude Code、Gemini CLI、VS Code Copilot、JetBrains Copilot、OpenCode、KiloCode)上,它能捕获文件、任务、计划、规则、决策、git、错误、阻塞等关键事件,压缩前建不超过 2 KB 的优先级快照,压缩后重建 15 类"会话指引",模型从你最后一句提示继续,不用重复交代。但如果你不 --continue,上一会话数据会被立即删除,干净起步;而且 Cursor 等部分平台因 hook 限制,目前做不到压缩后恢复。

问题三:装上之后,我的密钥和安全规则还管用吗?

A3:管用,而且被延伸到了沙箱。你在 Claude Code 的 settings.json 里配的 deny / allow 规则,context-mode 会原样读到并应用到 ctx_execute 等执行工具上,挡 sudorm -rf 这类命令。沙箱还有项目边界 containment(越界路径直接拒绝)、网络抓取加固(挡云元数据、内网保留地址)、以及对 mcp__* 工具入参里的 token、密钥做脱敏再落库。权限规则里 deny 永远优先于 allow,项目级规则覆盖全局。

问题四:支持哪些编码 agent,我是 Codex / Cursor / Zed 用户能用吗?

A4:README 列出 17 个受支持客户端,覆盖 Claude Code、Qwen Code、Gemini CLI、VS Code Copilot、JetBrains Copilot、GitHub Copilot CLI、Cursor、OpenCode、KiloCode、OpenClaw、Codex CLI、Kimi Code、Antigravity、Kiro、Zed、Pi、OMP。能用,但体验分档:有 hook 的平台约省 98%,只靠指令文件的约省 60%;Zed 和 Antigravity 当前没有 hook 支持,需要手动复制路由文件,且压缩后恢复不可用。选平台时优先挑带 hook 的那一档。

问题五:ELv2 不是开源,我公司和我在个人项目里用有风险吗?

A5:对绝大多数人没风险。ELv2 允许你使用、fork、修改、分发,红线只有两条:不能把它当托管服务对外提供,不能移除许可证声明。个人机器上跑、公司内部研发集成都不踩线。真正要谨慎的是做商业化 AI 编码托管产品、把 context-mode 当后端能力对外卖的场景,那会触发第一条红线,需要和法务确认边界或拿商业授权。源码可得但不自由,这是选型时要如实写进评估表的一点。

本文由 AI 辅助生成,经人工审核编辑。最后更新:2026-09-18

常见问题

context-mode 和直接让模型"精简输出"有什么区别?
区别在于它在架构层拦数据,而不是靠提示词劝模型。模型自己精简是不可靠的,且 README 引用证据表明过度简练的提示反而拉低编码与推理基准。context-mode 用沙箱让原始数据根本不进上下文窗口,用 FTS5 加 BM25 做按需检索,用"写代码去分析"替代"读数据去算",从机制上把上下文占用压下来,不依赖模型自律。
会话压缩后我的工作状态真的能接上吗,会丢什么?
在完整支持的平台(Claude Code、Gemini CLI、VS Code Copilot、JetBrains Copilot、OpenCode、KiloCode)上,它能捕获文件、任务、计划、规则、决策、git、错误、阻塞等关键事件,压缩前建不超过 2 KB 的优先级快照,压缩后重建 15 类"会话指引",模型从你最后一句提示继续,不用重复交代。但如果你不 `--continue`,上一会话数据会被立即删除,干净起步;而且 Cursor 等部分平台因 hook 限制,目前做不到压缩后恢复。
装上之后,我的密钥和安全规则还管用吗?
管用,而且被延伸到了沙箱。你在 Claude Code 的 `settings.json` 里配的 deny / allow 规则,context-mode 会原样读到并应用到 `ctx_execute` 等执行工具上,挡 `sudo`、`rm -rf` 这类命令。沙箱还有项目边界 containment(越界路径直接拒绝)、网络抓取加固(挡云元数据、内网保留地址)、以及对 `mcp__*` 工具入参里的 token、密钥做脱敏再落库。权限规则里 deny 永远优先于 allow,项目级规则覆盖全局。
支持哪些编码 agent,我是 Codex / Cursor / Zed 用户能用吗?
README 列出 17 个受支持客户端,覆盖 Claude Code、Qwen Code、Gemini CLI、VS Code Copilot、JetBrains Copilot、GitHub Copilot CLI、Cursor、OpenCode、KiloCode、OpenClaw、Codex CLI、Kimi Code、Antigravity、Kiro、Zed、Pi、OMP。能用,但体验分档:有 hook 的平台约省 98%,只靠指令文件的约省 60%;Zed 和 Antigravity 当前没有 hook 支持,需要手动复制路由文件,且压缩后恢复不可用。选平台时优先挑带 hook 的那一档。
ELv2 不是开源,我公司和我在个人项目里用有风险吗?
对绝大多数人没风险。ELv2 允许你使用、fork、修改、分发,红线只有两条:不能把它当托管服务对外提供,不能移除许可证声明。个人机器上跑、公司内部研发集成都不踩线。真正要谨慎的是做商业化 AI 编码托管产品、把 context-mode 当后端能力对外卖的场景,那会触发第一条红线,需要和法务确认边界或拿商业授权。源码可得但不自由,这是选型时要如实写进评估表的一点。

相关文章

开源项目

herdr 深拆:AI 时代的 tmux,编码 agent 的运行时

herdrdev/herdr(39,133 星、Rust、Apache-2.0、2026-03-27 创建、周榜 20260914 期第 8 名周增 2,458 星)定位"编码 agent 运行住的运行时":断开连接后台继续跑、多机一窗聚合 agent 列表、每个面板标记 working/blocked/idle、通过 CLI 与 socket API 实现 agent 互相调用与等待、单 Rust 二进制无 Electron。核心判断:它卡的是 tmux 在 AI 时代的继任位置,agent-native 的 socket API 才是它区别于"套壳 tmux"的关键;但项目不足半岁,API 与存储格式未固化,建议先管开发机与实验性 agent,勿当生产关键链路唯一支柱。

2026年9月17日8 分钟阅读
开源项目

firecrawl:把全网网页变成 LLM 能直接吃的干净数据(GitHub 星 16.1 万)

firecrawl/firecrawl(★16.1万、TypeScript、AGPL-3.0、2024-04-15 创建、8/5 仍在 push)是开源的 web context API,search/scrape/interact 三件套把任意网页转成干净 Markdown 或结构化 JSON 喂给 LLM 和 Agent。官方称覆盖 96% 网页、P95 3.4s,一条命令接 Claude Code/MCP。云端起约 $16-19/月,自托管免费但部分能力仅云端。

2026年8月5日8 分钟阅读
开源项目

LobeHub:8万星的开源 AI Agent 调度台,凭什么

LobeHub(原 LobeChat)是 GitHub 上 8 万星的开源 AI Agent 调度框架,已从"聊天框平替"进化为"首席 Agent 调度员"。文章拆解其定位演变、与 OpenAI WebUI/Claude 官网的差异(自部署/多模型/数据主权)、自部署路径与门槛、10,000+ MCP 插件生态,并提醒其协议为 LobeHub Community License(非 MIT),衍生商用需购买商业许可。

2026年7月31日5 分钟阅读