当AI编码Agent被"焊死"在产品里,怎么把它的核心引擎拆出来?
你有没有碰到过这种情况——公司想在自己的后端服务里嵌入AI编码能力,结果发现Claude Code只认CLI、Cursor焊死在VSCode分叉里、Copilot只能当编辑器插件用?推理能力就在那,但你就是摸不着。
更头疼的是,想换个模型做私有化部署?不行。想让同一个引擎同时服务IDE、Web应用和消息机器人?得从头造三遍轮子。
这不是个别产品的锅,是整个AI编码Agent领域的结构性问题——核心推理逻辑和交付形式死死耦合在一起。
美的AIRC团队最近发了一篇论文,叫Sema Code,干了一件挺有想法的事:把AI编码Agent从"应用"变成"引擎"。就像SQLite能嵌入数十亿设备、Chromium能驱动从浏览器到Electron的一切,Sema Code的目标是让"驱动一个AI编码Agent"变得跟"连个数据库"一样简单。
核心判断:这不是又造一个编码助手,而是把现有Agent的"大脑"做成可插拔的npm包——同一个推理内核,VSCode扩展和多通道消息网关共用,零引擎修改。工程整合的成分大于算法突破,但解耦思路在当前Agent生态里确实稀缺,值得关注。
论文信息
- 标题:Sema Code: Decoupling AI Coding Agents into Programmable, Embeddable Infrastructure
- 作者:Huacan Wang, Jie Zhou, Ningyan Zhu, Shuo Zhang, Feiyu Chen, Jiarou Wu, Ge Chen, Chen Liu, Wangyi Chen, Xiaofeng Mou, Yi Xu(共11位)
- 机构:美的 AIRC(Midea AI Research Center)
- 提交日期:2026年4月13日
- 开源地址:sema-code-core | VSCode插件
- 论文链接:arXiv:2604.11045
问题:AI编码Agent的"能力锁定"

Figure 1:左侧是传统单体架构——推理能力被锁死在特定产品形态里,想换个壳就得从头来;右侧是Sema Code的思路——透明、解耦、可扩展的AI引擎,一次开发多端交付
论文把现有AI编码工具的痛点归结为一个词:能力锁定(Capability Lock-in)。
Claude Code的Agent循环和CLI层一体化发布,Cursor的智能引擎焊在VSCode分叉上,GitHub Copilot的功能边界由编辑器插件形态决定。你看到的AI编码能力,被"焊死"在特定的交付形式里。
这造成的系统性障碍很具体:
- 嵌入难——想把自主代码生成、多步推理这些能力嵌入后端服务?没门,因为推理逻辑和UI代码混在一起
- 换模型难——想用私有化部署的模型替换Claude/GPT?需要从产品层一路改到推理层
- 多通道服务难——想用同一个引擎同时跑IDE、Web应用和消息机器人?相当于要开发三套独立的系统
说实话,这三个痛点在工业界是真实存在的。我自己在做Agent相关项目的时候,就碰到过"想在后端服务里复用编码Agent能力,结果发现推理逻辑和VSCode API缠在一起根本拆不出来"的尴尬。这不是伪需求。
架构:三层分离 + 事件驱动

Figure 2:Sema Code三层架构。核心引擎层不含任何UI代码,作为独立npm包发布。客户端层仅通过事件驱动的公共API与引擎交互
Sema Code的架构核心是一个很清晰的三层分离:
| 层级 | 职责 | 关键约束 |
|---|---|---|
| 客户端层 | UI渲染、通道转发 | 不碰推理逻辑 |
| 核心引擎层 | 推理、工具调用、状态管理 | 零UI代码、零运行时假设 |
| 服务层 | 跨语言接口(WebSocket/gRPC) | 适配非Node.js运行时 |
关键决策:事件驱动架构,而非RPC优先。
为什么?因为Agent任务产生的输出太杂了——文本片段、工具结果、权限请求、进度更新,这些东西天然就是异构且交错的。事件流天然适配这种场景:客户端只需要订阅引擎的事件流,各取所需。
引擎作为独立npm包发布,任何Node.js运行时都可以直接 npm install sema-core 然后编程式驱动。跨语言的场景,通过WebSocket和gRPC接口暴露——客户端建立会话拿一个不透明令牌,然后通过流式接口消费异构事件。
你想想看,这跟传统数据库的嵌入模式很像:SQLite不需要你知道它的存储引擎细节,你只需要调API。Sema Code想做的是编码Agent领域的SQLite。
八大机制:把复杂引擎变成可共享核心
架构图画起来容易,但真要把一个复杂的Agent引擎做成可共享、可编程的核心,工程上的坑太多了。其实吧,这也是我一开始最怀疑的地方——解耦谁都会画,但落到代码层面,状态隔离怎么做?上下文压缩后推理质量怎么保证?论文列了八个关键机制,逐个看看。
1. 多租户引擎隔离
单进程里跑多个Agent实例,状态空间共享会出问题——对话历史泄露、中断信号串台。Sema Code利用Node.js原生的 AsyncLocalStorage(ALS)做异步上下文跟踪:每个引擎实例绑定专属资源包(内部事件总线、状态管理器、工具编排器、租户配置),ALS确保异步调用自动关联到本地资源,不需要显式传参。
这是Node.js生态里比较地道的做法,比手动维护全局Map加锁要干净得多。
2. 分层状态划分
单实例内主代理和子代理并发工作时,状态空间严格分两层:
- 代理本地状态 \(\mathcal{S}_{\text{local}}(a_i) = \langle e_i, H_i, T_i, F_i \rangle\):执行状态、对话历史、任务列表、文件读取时间戳——各代理互不干扰
- 会话全局状态 \(\mathcal{S}_{\text{global}}\):全局权限标志 + 集中式中止控制器 \(\mathcal{C}_{\text{abort}}\)
这个设计的关键洞察:子代理之间完全不共享对话历史和工具结果,唯一共享的是中止控制器。这避免了"子代理A的操作污染子代理B的上下文"的问题,同时保证用户取消信号能可靠传播到所有子代理。
3. FIFO输入队列 + 安全会话重建
多通道部署时,用户经常在引擎计算时连续发消息,甚至直接切换项目。处理不好就是状态混乱。
FIFO调度策略很直觉:
有意思的是语义批处理:如果队首是普通文本,引擎会急切地把后续的非命令消息合并成一个统一提示;但系统命令(/ 前缀)严格单独出列执行。这在消息机器人的场景里很实用——用户连发几条消息,引擎不会把它们拆成独立请求,而是理解为一个连贯的意图。
安全会话重建处理的是切换项目的场景:新会话ID暂存为 pendingSession,向活跃控制器发中止信号;中止任务的 finally 块检测待处理标志,完全清除当前本地状态并初始化新会话,保证零状态残留。
4. 自适应上下文压缩
长运行Agent任务的一个致命问题:对话历史无限增长,迟早吃满LLM上下文窗口。
Sema Code的压缩策略有几个值得注意的工程细节:
- 零成本追踪:利用API返回的
input_tokens字段做 \(O(1)\) 监控,不是每轮 \(O(k)\) 重算——这个选择很务实 - 75%阈值触发:有效上下文超过模型最大上下文的75%就触发压缩,留25%安全余量
- 双路径降级:主路径是LLM语义摘要,保留关键实体(文件路径、函数签名、修改历史),激进丢弃冗长工具输出;如果摘要失败或超时,降级到安全截断——找最早能将上下文降到窗口一半的助手消息进行截断
有个细节很讲究:摘要后会执行三项确定性状态修正——剥离内部思考块、重新校准累积使用指标、重新注入核心规则和Todo提醒。这不是简单的"让LLM压缩一下",而是把压缩当成一个需要后处理的状态转换操作。
5. 多代理协作调度
单代理串行处理所有子任务有两个致命问题:技能提示污染后续子任务的系统提示,子任务历史累积加速压缩触发。坦率的讲,这个问题我在实际项目里也踩过——一个Agent处理完代码审查任务后,审查的system prompt残留在上下文里,导致后续的代码生成任务也带着审查的偏好。
Sema Code的方案是隔离状态空间 + 共享中断控制,前面已经提到了。补充几个设计约束:
- 单级委托:主代理可创建子代理,子代理不可再创建子代理。限制调用深度,防止Agent链式膨胀
- 三阶段生命周期:创建(分配会话ID + 专属系统提示 + 受限工具集)→ 执行(私有状态边界内完整评估)→ 清理(原子清除本地化状态 + 聚合遥测 + 仅返回最终结果给父代理)
6. 基于Todo的智能过程管理
这个机制解决的是一个很"小"但很实际的问题:LLM更新任务列表时的措辞变化导致UI闪烁。
方案是确定性任务跟踪状态机:每个任务项通过唯一标识符和离散生命周期状态跟踪。关键规则——新列表仅含已注册ID时,只修改生命周期状态,保留原始描述文本,消除闪烁。出现未知ID时才做全量替换。
这个细节很小,但只有真正做过Agent产品的人才知道闪烁有多影响用户体验。LLM每次返回的任务描述措辞都不一样,如果不做确定性约束,任务面板就像在抖动。
7. 四层异步权限控制
| 层级 | 操作类型 | 快速通过 | 审批触发 |
|---|---|---|---|
| L1 | 文件编辑 | 编辑标志已开启 | 首次编辑请求 |
| L2 | Shell命令 | 命令前缀在白名单 | 不在白名单/疑似注入 |
| L3 | Skill调用 | Skill已授权 | 首次调用 |
| L4 | MCP操作 | 名称已授权 | 首次调用 |
Shell命令(L2)的两阶段评估比较有意思:
第一阶段是确定性白名单检查——拆解Shell组合操作符(|、&&、;)后,每个子命令头部独立匹配白名单 \(\mathcal{W}\)。
第二阶段是LLM辅助静态分析——针对白名单外的命令,分解子命令前缀,识别已知注入模式(反引号替换、进程替换 $(...)、链式破坏性操作)。识别为注入风险的,附加安全警告或直接拒绝。
权限审批是异步的——引擎发出授权请求后挂起执行上下文,任意客户端(IDE对话框、消息机器人)原生处理用户交互,不阻塞推理循环。四种解析路径:临时批准、持久授权、明确拒绝、用户引导修正。
8. 后台任务执行
长时间运行的Shell操作(编译、测试套件)阻塞Agent同步推理循环,这是实际使用中的高频痛点。
Sema Code的做法是执行与观察分离:长任务卸载到后台管理器,主对话循环立即恢复用户交互。触发有两条路径:
- 主动路由:Agent显式标记异步处理 → 立即生成隔离系统进程并返回跟踪ID
- 反应接管路由:操作意外超过执行阈值 → 引擎动态分离活跃Shell会话及临时文件描述符,移交后台管理器,干净重置主Shell单例
输出管理用双写策略(内存+磁盘),低延迟流式传输 + 持久快照。完成后引擎向主代理上下文注入结构化通知作为唤醒信号。
运行时全景

Figure 3:Agent运行时三大核心——(a)后台任务系统,异步管理长时间Bash和Agent进程;(b)多代理协调框架,隔离状态空间 + 严格生命周期管理 + 共享中止信号;(c)自适应上下文压缩,达到75%阈值时触发双路径token缩减
三层生态:MCP + Skill + Plugin
论文还设计了一个三层市场生态:
| 层级 | 粒度 | 做什么 | 典型示例 |
|---|---|---|---|
| MCP服务 | 基础设施 | 封装外部系统为标准化协议,暴露粗粒度工具 | 数据库、浏览器、API网关 |
| Skill | 行为 | Markdown文档 + YAML前置元数据,重塑Agent推理方式 | 代码审查、测试生成、安全分析 |
| Plugin | 工作流 | 挂钩引擎命令和生命周期系统,编排多步骤流程 | 代码审查管道、部署门控 |
说到MCP——Model Context Protocol,Anthropic 2025年开源的协议,解决AI助手与外部数据源/工具之间的标准化连接问题。Sema Code把MCP作为生态的底层基础设施层来集成,这跟当前Agent领域的主流趋势一致。
Skill层的设计挺巧:不是代码,而是Markdown + YAML。这意味着Skill的开发门槛极低——会写文档的人就能定义一个Skill。Agent在运行时根据Skill的内容重塑自己的推理方式,相当于用自然语言"编程"Agent的行为模式。
回到这块,我觉得论文最值钱的地方不是某个单独的机制,而是把八个机制组合在一起的工程完整度。每个机制单独拿出来都不是什么惊天动地的创新,但凑在一起解决了"复杂Agent引擎如何变成可共享核心"这个系统性问题。
部署验证:同一个引擎,两种产品
论文用两个实际产品验证架构:
VSCode扩展
直接npm导入Sema Core,在VSCode扩展宿主进程内运行(无CLI子进程开销)。功能包括实时差异预览与一键回滚、Todo任务板、后台任务面板、会话历史管理、运行时模型热切换。发布在Open VSX市场。
运行的机制:自适应上下文压缩、四层权限系统、后台任务执行、MCP/Skill/Plugin生态。
未运行:多租户隔离(单用户模式不需要)。
多通道代理平台 SemaClaw
导入相同npm包版本,添加Telegram、飞书等消息通道访问和Web UI管理界面。作为服务端Node.js进程服务多个并发用户。
运行的机制:多租户隔离、FIFO输入队列、异步审批协议(适配内联消息按钮而非模态对话框)。
关键观察
- 零引擎修改:两个产品无需更改Sema Core代码库,所有行为差异在客户端层实现
- 互补机制覆盖:VSCode扩展测试长单用户会话中的压缩和后台任务;SemaClaw测试并发多用户负载下的多租户隔离和输入队列。同一引擎二进制文件无需特性标志即可正确运行
- 客户端集成成本低:客户端开发者仅需与公共API和类型化事件流交互,无需理解引擎内部状态管理、压缩逻辑或权限机制
说实话,这个验证结果还是蛮有说服力的。同一个npm包,一个跑在IDE进程里做单用户助手,一个跑在服务端做多通道消息网关,引擎代码零修改——这至少证明了解耦架构不是纸上谈兵。
我的判断
亮点
解耦思路在当前Agent生态里确实稀缺。 现有的AI编码工具都在拼命做产品——更炫的UI、更流畅的交互、更深的编辑器集成——但很少有人从"基础设施"的角度思考Agent引擎的可复用性。Sema Code把这个方向走通了,而且开源了核心代码,这一点值得肯定。
工程细节扎实。 从多租户ALS隔离到FIFO语义批处理,从上下文压缩的三项状态修正到Todo的确定性状态机——这些不是宏大的架构宣言,而是解决实际问题的工程方案。看得出团队是真正在产品中踩过坑的。
三层生态设计有想象力。 MCP基础设施 + Skill行为层 + Plugin工作流层,这个分层比单纯的"工具市场"要精致得多,尤其是Skill用Markdown定义的方式降低了扩展门槛。
疑问
没有定量实验。 这篇论文是纯系统设计论文,没有任何性能基准测试——吞吐量、延迟、并发用户数、上下文压缩的质量评估……统统没有。你可以说系统论文不需要刷SOTA,但至少得给一些工程指标:100并发用户下引擎的内存占用是多少?上下文压缩后任务成功率下降了多少?这些数据对评估方案的实用性很重要。
验证面偏窄。 只验证了两种产品形态(VSCode扩展和SemaClaw),论文自己也承认CI/CD集成、Jupyter笔记本嵌入等场景还没验证。更关键的是,没有做大规模压力测试——数百并发用户可能暴露性能瓶颈,但论文没有数据。
上下文压缩的质量依赖LLM摘要能力。 论文承认"高技术性对话可能丢失关键细节",这个问题其实挺严重的。在代码场景下,丢失一个关键函数签名或者文件路径就可能导致Agent后续操作完全跑偏。摘要质量的量化评估是缺失的。
单进程部署的天花板。 当前部署都是单进程,多实例水平扩展的状态同步挑战未解决。对于想拿它做企业级服务的团队来说,这是个硬伤。
定位
Sema Code的核心价值不是算法突破,而是架构思路——把AI编码Agent从"应用"变成"引擎"。这个定位跟SQLite、Chromium这类嵌入式基础设施一脉相承。如果你在做Agent相关的产品,并且碰到过"推理逻辑和交付形式耦合"的问题,这篇论文的设计方案可以直接参考。
但如果期待它在Agent性能上有质的飞跃,那这篇论文给不了你。它解决的是"如何把Agent引擎做得可复用",而不是"如何让Agent更聪明"。
与其他方案的对比
| 维度 | Claude Code | Cursor | GitHub Copilot | Sema Code |
|---|---|---|---|---|
| 交付形式 | CLI | VSCode分叉 | 编辑器插件 | 可嵌入npm包 |
| 引擎与UI | 一体化 | 焊死 | 一体化 | 完全解耦 |
| 多模型支持 | 仅Claude | 多模型 | 仅GPT | 可接入任意模型 |
| 多通道服务 | 不支持 | 不支持 | 不支持 | 原生支持 |
| 多租户 | 不支持 | 不支持 | 不支持 | 原生支持 |
| 开源 | 否 | 否 | 否 | 核心引擎开源 |
这个对比表能看出Sema Code的差异化定位:它不是在跟Claude Code/Cursor/GitHub Copilot竞争用户体验,而是在提供一个它们都不提供的基础设施层能力。
当然,Claude Code在2026年也开放了部分API能力,MCP协议本身也在推动Agent与工具的标准化连接。Sema Code不是唯一在解这个问题的方案,但它在"引擎与UI完全解耦"这个方向上走得更彻底。
工程启发
如果你也在做Agent相关的产品,几个可以借鉴的点:
- 事件驱动而非RPC——Agent的输出天然是异构事件流,事件驱动比请求-响应模型更适合
- ALS做异步上下文隔离——Node.js生态里做多租户,
AsyncLocalStorage比手动维护全局状态优雅得多 - 确定性状态机消除LLM不确定性——Todo的状态更新用ID匹配而非文本匹配,这个思路可以推广到其他LLM输出需要确定性约束的场景
- 上下文压缩不是一次性操作——压缩后的三项状态修正(剥离思考块、校准指标、重注入规则)才是保证后续推理质量的关键
Sema Code把AI编码Agent从"用不了"变成了"拿来用"——这可能是Agent走向基础设施化的第一步。但单进程的天花板和缺失的量化评估,也让这一步走得还不够远。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我