Files
hunjing/docs/architecture/lingtai-engine.md
T
chenxin 42513d13c6 📝 docs: 建立魂镜完整 1.0 设计文档体系
- 产品层:产品宪章与永久禁域、产品定义、完整 1.0 范围与发布门、道家文化语言体系、指标与反指标
- 研究层:参考项目研究(deepseek-harness、pi、MemOS、模型网关)、灵台原生引擎研究(业界原生引擎架构理念与道家文化出处)
- 架构层:系统、Agent 运行时(周天体系)、插件系统、灵台引擎(C++ 双形态)、媒体与设备、社区协作市场、前端富内容渲染、数据、记忆与知识
- 契约层:协议与稳定标识、API 总体约定、Native API、兼容网关、实时与 Webhook、内部端口、统一 ContentBlock 与流式(含分支对话交互态)、灵台 C ABI 与 gRPC Service、API 表面、HTTP 与事件、运行观测
- 决策:ADR-001 至 ADR-023(模块化单体、每 attempt 持久化、候选记忆、OAuth 2.1、灵台引擎、双形态部署、大周天演化、宪章、三界作用域、私箧与保全态、叩心、周天统一等)
- 交付:WP-01 至 WP-15 实施 TODO 与设计阶段交接文档
- 工程:AGENTS.md 工程规则(含 C++/灵台规范)、CLAUDE.md 引用、.gitignore
2026-09-09 21:07:14 +08:00

120 lines
11 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.
# 灵台引擎架构
> 决策依据:[ADR-016](../decisions/README.md#adr-016灵台引擎采用-c-核心与稳定-c-abi)、[ADR-017](../decisions/README.md#adr-017灵台引擎双形态部署)。ABI 稳定值登记于 [Lingtai C ABI](../contracts/lingtai-ffi.md),独立服务契约见 [Lingtai Service](../contracts/lingtai-service.md)。文化名见[文化语言体系](../product/cultural-language.md)。
## 1. 定位与不变量
灵台引擎(Lingtai Engine / `libhunjing`)是 C++ 实现的确定性计算库,支持进程内嵌入与独立服务两种部署形态,为 Python、Rust、Go 宿主提供同一份核心实现:
- **无权威状态**:角色、消息、记忆、订单等权威数据只在关系数据库与对象存储;引擎持有的一切中间产物可丢弃重建。崩溃或版本更换后,宿主从权威数据重放即可恢复。
- **最小 I/O**:除显式传入的只读索引文件(`hj_recall` 以只读方式 mmap)外,引擎不打开文件、不发起网络、不连接数据库;输入输出全部经调用参数。独立服务形态下,网络端点由服务壳承担,核心计算仍不做自主 I/O。
- **单一核心、双形态**:进程内嵌入与 gRPC 独立服务是同一核心的两种壳;任何能力的语义在两种形态下必须一致(同一 golden 测试集约束),形态选择是部署决策而非代码分叉。
- **Core 的一部分**:灵台引擎实现治理内核中的确定性判定部分,属于不可插件化边界;插件不直接链接引擎,只能经宿主 Runtime 间接获得能力。
- **fail closed**:引擎缺失、初始化失败、ABI 不匹配或服务不可达时,依赖该能力的宿主路径必须显式失败;禁止在宿主语言内维护第二份实现作为降级。
## 2. 灵台六模块子系统
| 文化名 | 稳定模块 | 职责 | 禁止承担 |
| --- | --- | --- | --- |
| 太一 | `hj_core` | 单一稳定入口:ABI/服务版本协商、句柄生命周期、跨形态统一路由、Run/Turn 状态转换合法性校验、事件 `sequence` 分配、跨模块错误上下文 | 持久化状态、业务裁决 |
| 小周天 | `hj_stream` | ContentBlock 流事件编码、`delta_index` 维护、`(block_id, delta_index)` 去重键、节流与背压计算、重放缓冲 | 发起网络 I/O、持久化流历史 |
| 洛书 | `hj_plan` | 计划 DAG 校验与拓扑排序、RunBudget 核算、Context Manifest 的 token 预算裁剪与优先级排序 | 调用模型、执行工具、创建子 Run |
| 河图 | `hj_recall` | 端侧与离线场景的只读混合检索索引、重排打分、多路检索合并 | 成为服务端权威检索(PostgreSQL 仍为权威)、写入索引 |
| 陶钧 | `hj_transform` | Markdown → canonical ContentBlock 确定性解析、数学定界符与 Mermaid fenced 提取、parser version 标注、导出重建 | 执行 HTML、请求网络资源 |
| 烛照 | `hj_policy` | JSON Schema 子集结构校验、路径 canonicalize 与根目录约束、URL scheme/host 校验、HMAC 验签、幂等键规范化、分层递进的决策表评估 | 发起用户审批交互、执行副作用 |
"太一出两仪":`hj_core`(太一)是唯一对外总入口(单一稳定入口理念),承载版本协商、句柄与跨形态路由;其余五模块的会话句柄都从 `HjEngine` 派生并在其中登记,统一计数、统一回收——诸枢皆居灵台之内。烛照的判定按"结构 → 路径/URL → 签名 → 预算"分层递进,单层拒绝即短路返回,对应纵深防御理念。
```mermaid
flowchart TB
API[hj_ C ABI and gRPC service face] --> CORE[hj_core]
CORE --> STREAM[hj_stream]
CORE --> PLAN[hj_plan]
CORE --> RECALL[hj_recall]
CORE --> TRANSFORM[hj_transform]
CORE --> POLICY[hj_policy]
RECALL --> RO[(read-only index files)]
```
## 3. 部署形态
```mermaid
flowchart LR
subgraph Embedded
PY[FastAPI host] --> B1[nanobind binding]
RS[Tauri Rust host] --> B2[bindgen wrapper]
GO2[Go gateway host] --> B3[cgo binding]
B1 & B2 & B3 --> ABIL[stable C ABI hj_]
end
subgraph Standalone
ANY[any host in deployment] --> GRPC[gRPC over mTLS]
end
ABIL --> ENGINE[Lingtai core]
GRPC --> SRV[hunjing-lingtai-server]
SRV --> ENGINE
```
### 3.1 进程内嵌入(默认)
- 宿主经 C ABI 链接 `libhunjing`;绑定层是薄封装:类型转换、内存托管(RAII/GC 挂钩)、错误映射为各语言惯用错误类型;不复制业务语义,不缓存权威状态。
- 适用:模块化单体部署的全部计算路径、Tauri 桌面/移动端(含离线)、对延迟敏感的调用(每请求同步计算)。
- 宿主负责一切 I/O 编排:数据库读写、模型调用、SSE/WebSocket 传输、审批交互。引擎只回答"计算结果是什么",不回答"接下来做什么"。
### 3.2 独立服务(按需启用)
- `hunjing-lingtai-server` 链接同一核心,以 gRPC 暴露能力;契约(proto、方法、流语义、错误映射)见 [Lingtai Service](../contracts/lingtai-service.md)。
- 适用:重型解析/检索需要独立扩缩容与资源隔离;同一部署内多宿主(API、Worker、网关)共享引擎容量;引擎需独立升级发布;跨机器集中计算。
- 服务只在部署内部网络监听,经 mTLS/工作负载身份认证;不进入公共 API 分面,不经网关对外暴露。
- 启用标准沿用[系统架构](system-architecture.md)的服务拆分标准;不满足标准时保持嵌入形态。
### 3.3 形态选择与演化
- 默认嵌入;满足独立扩缩容、故障域、资源隔离或多宿主共享证据时切换或混用(例如服务端用服务形态、端侧用嵌入形态)。
- 客户端代码面向"引擎 Port"编程(进程内与服务两个实现),切换形态不改业务语义,只改部署配置;Port 定义见[内部端口](../contracts/internal-api.md)的组织方式。
- 前端 Web(TypeScript)不经 C ABI;如需复用解析逻辑,WebAssembly 编译目标与"经服务形态远程消费"作为 1.0 后评估项,不在本架构承诺内。
### 3.4 真实调用点
| 宿主路径 | 使用子系统 | 对应工作包 |
| --- | --- | --- |
| 消息创建:用户 Markdown 规范化为 canonical ContentBlock | `hj_transform` | WP-03 |
| Run SSE:事件 envelope 编码、增量去重与节流 | `hj_stream` | WP-03/WP-05 |
| Tool input Schema 校验、工具路径/URL 约束判定 | `hj_policy` | WP-06 |
| Webhook 验签与幂等键规范化 | `hj_policy` | WP-13 |
| 计划 DAG 校验与 RunBudget 核算 | `hj_plan` | WP-06 |
| Tauri 移动端加密离线缓存的本地检索与重排 | `hj_recall`(仅嵌入形态) | WP-10 |
| Run/Turn 状态转换合法性校验 | `hj_core` | WP-05/WP-06 |
## 4. 内存、线程与错误模型
- **所有权**:引擎分配的缓冲区只能交还 `hj_buffer_free` 释放;宿主内存以 `const` 指针加长度只读传入,引擎不得持有调用返回后的宿主指针。
- **字符串**:一律 UTF-8;输入可为 NUL 结尾或指针加长度,输出始终为指针加长度。
- **句柄**:`HjEngine` 线程安全,可被多线程并发调用;`hj_stream` 等会话级句柄单线程亲和,由创建线程使用。句柄关闭两次返回 `HJ_ERR_HANDLE_INVALID`,不崩溃。
- **回调**:流式回调在调用线程同步触发;回调内部禁止再调用引擎 API,违规以 `HJ_ERR_REENTRANCY` 尽力检测。
- **异常与崩溃**:C++ 异常不得跨越 ABI;引擎入口捕获一切异常并转换为 `HjStatus`。任何输入都不得导致引擎 `abort`/未定义行为——解析失败返回 `HJ_ERR_PARSE_FAILED`,超限返回 `HJ_ERR_LIMIT_EXCEEDED`。
- **错误传递**:`HjStatus` 携带稳定码;`hj_last_error` 提供该线程最近一次错误的消息缓冲(不含敏感正文),绑定层映射为宿主异常/`Result`/`error`,服务层再映射为 HTTP 错误契约。
## 5. 与既有架构的关系
- **内容契约不变**:`hj_transform` 的输入输出即 [统一富内容与流式协议](../contracts/content-blocks-and-streaming.md) 定义的 Block 与事件 JSON Schema;引擎输出 canonical JSON(键序确定),供 hash 与跨端一致性测试。
- **状态机权威不变**:Run/Turn/ModelCall 的持久化与恢复遵循 [Agent 运行时](agent-runtime.md);`hj_core` 只校验状态迁移合法性并分配 `sequence`,不存储权威状态。
- **检索分工**:服务端权威检索仍是 PostgreSQL 全文与 pgvector([记忆与知识架构](memory-and-knowledge.md));`hj_recall` 服务于端侧离线与重排计算,索引是可重建投影,删除与授权变化随宿主重建传播。
- **策略归属**:审批流、用户确认与 Policy 最终裁决遵循 [安全与诊断访问](../security/security-and-diagnostics.md);`hj_policy` 提供确定性判定原语与高速规则评估,不发起 I/O、不绕过审批。
- **插件边界**:[插件系统](plugin-system.md) 的 Manifest、Snapshot、双轨执行不变;插件经宿主间接消费引擎能力,Run 快照记录引擎与 parser 版本。
## 6. 构建、分发与平台
- 语言标准 C++23,CMake + Ninja;符号默认隐藏,仅导出 `hj_*`(API 卫生,非对抗手段)。
- 产物:动态库 `libhunjing`(`.so`/`.dylib`/`.dll`)与静态库;独立服务二进制 `hunjing-lingtai-server`;单一公共头 `include/hunjing/lingtai.h` 与服务 proto(见 [Lingtai Service](../contracts/lingtai-service.md))。
- 平台矩阵:Linux x86_64/aarch64、macOS aarch64、Windows x86_64、iOS/Android arm64(服务态);iOS/Android 仅嵌入形态,不交付服务二进制。
- CI 产出带版本号的预编译产物并做签名与哈希公示;自托管者可从源码构建,构建须可重现。
- 依赖最小化:第三方库进入前按工程规则评估官方文档、许可与维护状态;ANN/分词/gRPC 栈等实现选型在实现期以补充 ADR 登记,本文不预设。
## 7. 安全与测试边界
- 引擎的全部输入(用户 Markdown、模型输出、工具参数、检索查询、Webhook 原始字节)按不可信输入处理:长度与深度硬上限、资源限额由配置发布且 Schema 有上界。
- 持续测试门槛:`hj_transform`/`hj_policy` 为 fuzz 必测目标(libFuzzer);每次提交跑 ASan/UBSan,线程路径跑 TSan;ABI 快照测试保证符号与布局不发生未声明变更。
- 双形态一致性:同一组 canonical 输入在 Python/Rust/Go 绑定与 gRPC 服务路径下的输出字节一致(golden 测试覆盖进程内与服务两种形态),防止绑定或服务壳漂移。
- 服务形态额外要求:mTLS 双向认证、每方法超时与并发上限、背压与限流、调用审计(不含正文);服务不可达时宿主 fail closed。
- 引擎产物进入诊断或日志前遵守脱敏规则;错误消息不包含请求正文、密钥或凭据。