llm-to-agent/docs/architecture.md
2026-08-04 17:41:28 +08:00

95 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 架构总览
## 目标
llm-to-agent 是个人使用、本地优先的 Agent。架构优先级是
```text
简单易懂 > 容易扩展和修改 > 架构完整 > 通用性
```
Runtime 长期保持:
```text
Kernel + Extensions
```
Kernel 管 Extension 怎样连接和运行Extension 管系统具体能做什么。
## Kernel
Kernel 只提供所有 Extension 共用的运行机制:
- 按顺序装入 Extension
- 依次执行 `setup``start`,停止时倒序执行 `stop`
- 通过命名抓手提供和取得能力;
- 通过命名事件发布和监听事实。
Kernel 不认识 Workspace、Agent、模型、Tool 或其他业务概念。
## Extensions
Extension 是 Runtime 的独立装配单位,分为三类:
- 共享能力:拥有明确状态、资源或业务流程;
- Provider接入可替换的模型、协议或外部系统
- 产品入口:处理 CLI、Web、Desktop 的输入、输出和平台资源。
规划可以列出尚未实现的 Extension源码、Catalog 和产品装配只包含已经开始实现的部分。Extension 内部文件和目录不设统一结构。
最终能力归属见 [Extension 规划](extensions.md)。
## 配置
Runtime 启动时读取全局和当前 Workspace 的可选配置Workspace 配置按字段覆盖全局配置。产品装配向 Kernel 提供 Extension 工厂函数,每个工厂函数用自身的静态 `id` 表明身份:
```ts
createDeepSeekExtension.id = ExtensionId.DeepSeek;
```
`kernel.use(createDeepSeekExtension)` 根据这个 `id` 取得对应配置,调用 `createDeepSeekExtension(options)`,再保存创建出的 Extension 实例。配置文件位置、作用域和合并规则都不进入 Kernel。
Extension 负责解释和校验自己的片段。第一版配置只在启动时读取,不创建缺失文件、不写入默认值,也不支持热更新。
## 扩展点
多个实现向能力所有者登记,不再为扩展点增加新的架构层:
```text
models.providers
tools.providers
agent.contextContributors
automation.triggers
security.approvalChannels
health.checks
```
模型 Provider 由 `models` 选择,具体 Tool 由 `tools` 统一执行,上下文来源由 `agent` 组合。
## 协作
- 控制流程使用明确调用;
- 事件只表示已经发生的事实;
- Extension 只依赖其他 Extension 的公开契约;
- Provider 向扩展点注册实现,能力所有者不引用 Provider 实现;
- Tool 是能力 Extension 暴露给 Agent 的操作,不是新的 Extension
- 高风险操作统一经过 `security`,凭据统一通过 `secrets` 的受控引用取得。
事件不能承担顺序、返回值、审批、事务或回滚。
## Runtime 与产品
Runtime 持有一套 Kernel、Extension 实例和本地数据。CLI、Web、Desktop 是不同产品入口,共用共享能力和数据。
版本切换、进程守护、离线恢复和失败回退由 Runtime 外的 Supervisor 负责。
## 长期约束
- 保持单用户、本地优先和单 Runtime
- 保持一个 TypeScript package直到出现独立构建、发布或进程边界
- 使用静态装配,不提前建设插件平台、热加载或依赖图;
- 规划高风险边界但不创建占位目录、文件、ID 或 Hook
- 普通函数、页面、命令、Parser、Prompt 和单个 Tool 不拆成 Extension
- 新增 Kernel 机制必须有多个具体使用者;
- 不提前建设 Command Bus、Middleware、事件溯源或分布式状态。