再工程化:DI×Scope 引擎与 REST/WS 服务器
30 秒导读: 前四章讲的是 v1 那套「一个
Agent类拎起一切」的引擎(见 02-agent.md)。 这一章讲 Kimi Code 的第二代内核:把那个巨型类拆成上百个小 Service,用一台 VS Code 式的 依赖注入(DI)容器装配起来;再给每个 Service 打上 App / Session / Agent 三级作用域标签, 让容器自动按作用域建树、按作用域拆树。拆完之后,再套一层服务化外壳——kap-server把整棵服务树反射式地暴露成 REST + WebSocket,klient在客户端把同一棵树用契约复刻回来。 v1 与 v2 目前并存:v1 经node-sdk交付(稳定),v2 经kap-server + klient交付(实验)。
本章只讲架构演进与服务化,不讲前端如何消费这套 API(那是 06-surfaces.md)。
1. 这章要解决的问题:巨型 Agent 类为什么撑不住
先看 v1 的形态,才懂 v2 为什么要重来一遍。
v1 的核心是一个类:Agent(packages/agent-core/src/agent/index.ts:107)。它的构造函数亲手
new 出十几到二十几个「管理器」——上下文、压缩、权限、技能、工具、计划、目标、后台任务、
用量记录……全塞进一个类里。从它的 import 头就能数出来:
BackgroundManager · FullCompaction · MicroCompaction · CronManager · ConfigState
ContextMemory · GoalMode · HookEngine · InjectionManager · PermissionManager
PlanMode · AgentRecords · ReplayBuilder · SkillManager · SwarmMode · ToolManager
TurnFlow · UsageRecorder · KosongLLM · LlmRequestLogger · LlmRequestRecorder ...
依据:packages/agent-core/src/agent/index.ts:26-62(这些 manager 的 import 与实例化)。
这种写法的三个痛点,决定了 v2 的方向:
| 痛点 | 具体表现 | v2 的回应 |
|---|---|---|
| 装配写死 | 谁依赖谁,靠构造函数里手写 new 的顺序;加一个能力要改中心类 | 依赖注入:声明依赖,容器负责装配 |
| 生命周期混一锅 | "全局只有一份"的东西(配置、模型目录)和"每个会话一份""每个 agent 一份"的东西混在同一层 | 三级作用域:每样东西显式声明活在哪一层 |
| 难以远程暴露 | 一个大类,方法散落,没有统一的"每个能力=一个可寻址端点"结构 | 每个能力=一个 Service=一个可反射调用的通道 |
v1 并非没有 DI——它已经有一台完整的 VS Code 式容器(
packages/agent-core/src/di/), 服务层也已按IXxxService规范切好(packages/agent-core/src/services/)。v2 的真正跃迁不是 "引入 DI",而是给 DI 加一个作用域维度,并把整个 Agent 能力面彻底 Service 化。