Files
sundynix-agentix/ARCHITECTURE_DESIGN.md
Blizzard 6a258fc884 docs: 架构设计文档 ARCHITECTURE_DESIGN.md(当前完整版)
描述当前架构设计:分层总览/各组件/NATS 总线(5类通信)/Eino 编排引擎/
LLM接入(failover+熔断)/数据存储/关键数据流/安全治理/可观测/前端/部署配置/
当前能力矩阵(已建·进行中·规划)/技术栈。与 ARCHITECTURE_REVIEW(评审) 互补。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 10:25:42 +08:00

240 lines
17 KiB
Markdown
Raw Permalink 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.
# sundynix-agentix · 架构设计文档(当前完整版)
> 版本:2026-07-02(反映 T0T2 全量 + T4.B/E 完成 + T4.F 部分后的现状)
> 定位:**事件驱动的 AI Agent 平台**。以 NATS 为统一总线,服务经契约解耦,Eino 为编排核心,控制面热切换。
> 配套文档:`ARCHITECTURE_REVIEW.md`(架构评审:优缺点/技术债)、`DEPTH_ROADMAP.md`(路线图)、`EINO_ADOPTION.md`Eino 采纳)。
---
## 1. 系统概述
sundynix-agentix 把「用户在画布上编排 Agent 图 → 平台调度执行 → 实时回流结果」做成一套可运维、可观测、可扩展的平台。核心特征:
- **图编排执行**:前端画布导出 DSL(节点+连线),后端编译为可执行图,支持分支、并行、多智能体、人工审批。
- **工具即服务**:能力(RAG/记忆/历史/报告/沙箱)以独立 MCP 服务经 NATS 暴露,加工具零改调度代码。
- **分层韧性**:模型 failover + 熔断 + 预算 + 输入护栏 + 输出脱敏 + 自动评测纠偏(「恒温器」治理层)。
- **控制面热切换**:模型配置、提示词经 NATS 广播热下发,不重启即生效。
- **流式原生**:token 流与执行轨迹经 NATS→Redis Stream→SSE 实时回流,支持断点重放。
---
## 2. 分层架构总览
```
┌── 客户端层 ───────────────────────────────────────────────┐
│ 桌面端 Wails(:5173,用户工作产品) 管理端 React(:5174,运维控制台) │
└──────────────┬───────────────────────────┬────────────────┘
│ HTTP / SSE │ HTTP
┌── 接入层 ─────┴───────────────────────────┴────────────────┐
│ gateway (gin, :8080) │
│ JWT鉴权 · 路由 · 输入护栏 · 限流(按用户) · 审计 · SSE回流 · 导出 │
└──────────────────────────┬─────────────────────────────────┘
┌── 总线层 ─────────────────┴─────────────────────────────────┐
│ NATS + JetStream ——「万物总线」 │
│ 任务 · 工具RPC · token流 · 执行轨迹 · 控制面广播 · 心跳 · 持久队列 │
└──┬──────────────────────┬──────────────────────┬────────────┘
│ │ │
┌──┴────────┐ ┌────────┴────────┐ ┌────────┴────────┐
│ dispatcher │ │ mcp-go │ │ mcp-py │
│ 编排核心 │ │ Go I/O 工具服务 │ │ Python 算法工具 │
│ Eino+harness│ │ RAG/记忆/历史/报告│ │ 沙箱/解析 │
└──┬────────┘ └────────┬────────┘ └─────────────────┘
│ LLM providers │
│ (OpenAI 兼容) │
┌──┴────────────────────────┴─────────────────────────────────┐
│ 数据层:PostgreSQL(关系) · Redis(缓存/流/限流) · Milvus(向量) │
│ Neo4j(图谱) · MinIO(对象/正文) · Jaeger(OTel 追踪) │
└──────────────────────────────────────────────────────────────┘
```
**分层原则**:服务间**互不 import**,只依赖 `shared/contract`(数据契约)+ `shared/bus`(NATS 封装)。任何跨服务通信都过 NATS。
---
## 3. 组件详细设计
### 3.1 gateway(接入层,gin
唯一对外 HTTP 入口,不含业务编排。职责:
- **鉴权**JWT 无状态(`owner` = 雪花 user.id);`RequireAuth`(登录)/ `RequireAdmin`(管理面,白名单 `ADMIN_USER_IDS`)。
- **中间件链**(顺序):Recovery → OTel → RequestID → Observe(指标+日志) → CORS → **Auth****RateLimit(按 uid,未认证按 IP)****Guardrail(输入护栏+命中落库)**
- **DSL 拓扑校验**`ParseAndAssemble` 前置拦截重复/空节点 id、悬挂边(防坏图进编排后被 compose 静默跳过)。
- **SSE 回流**`/tasks/:id/stream`(token 流)、`/tasks/:id/exec`(执行轨迹)、`/kb/ingest/:id/stream`(入库进度);优先读 Redis Stream(可断点续传),降级 live NATS。
- **报告导出**`/reports/:id/export?format=docx|md` → 经 NATS 调 mcp-go 现渲染 → `c.File` 流回。
- **控制面 API**`/admin/*`RequireAdmin):模型 CRUD、计价、系统状态探活、系统聚合 overview、审计流、护栏事件流。
- **审计**`middleware.Audit(db)` 对变更类请求(POST/PUT/DELETEbest-effort 落库。
### 3.2 dispatcher(编排核心)
消费 NATS 任务,用 Eino 执行编排图 + harness 治理。详见 §5、§6。
### 3.3 mcp-goGo 工具服务)
MCP 协议端点,订阅 `sundynix.tools.go.>`queue group `mcp-go-workers`)。工具注册表是**单一事实源**(每工具声明 `cn/desc/agent/params/inject/handler`):
- **RAG**`kb_search`(三路混合) / `wiki_search` / `kb_graph` / `kb_ingest` / `kb_delete`(级联删)。三路 = Milvus 向量 + Bleve 全文(落盘) + Neo4j 图谱,RRF 融合 + rerank。
- **记忆**`memory_get/upsert/delete/list`(用户长期偏好,软删)。
- **历史**`history_get/append`(会话历史,Redis)。
- **报告**`report_store`(存源) / `report_render`(渲染 docx 落盘) / `report_export`(按需导出)。
- **元工具**`list_tools`(自省,供 dispatcher 动态发现) / `health`(Milvus/Neo4j 就绪)。
### 3.4 mcp-pyPython 算法工具)
订阅 `sundynix.tools.py.>`。承载 CPU 密集/生态依赖的算法:沙箱代码执行、文档解析等。**注:算法层目前为桩,调用链路已做真。**
### 3.5 shared(跨服务共享库)
- **bus**NATS/JetStream 封装(Publish/Subscribe/Request-Reply、控制面广播、心跳、持久队列)。
- **contract**Task/ToolCall/ToolResult/ModelConfig/报告路径 等跨服务契约。
- **prompts**:提示词注册表(内置默认 + 运行期覆盖)。
- **secrets**API Key AES-256-GCM 端到端加密(`SUNDYNIX_SECRET_KEY` 三服务须一致)。
- **otel**OTel 初始化(NATS 跨总线传播 traceparent)。
---
## 4. NATS 总线设计(架构中枢)
NATS 不只是消息队列,而是承载 **5 类通信**
| 类型 | 模式 | Subject / 机制 | 用途 |
|---|---|---|---|
| 任务提交 | Publish | `sundynix.tasks.*` | gateway → dispatcher |
| 工具调用 | Request-Reply | `sundynix.tools.go.<tool>` / `.py.<tool>` | dispatcher/gateway → mcp-*queue group 负载均衡) |
| token 流 | Publish/Sub | `sundynix.streams.<task_id>` | dispatcher → gateway → SSE |
| 执行轨迹 | Publish/Sub | exec 事件 | 运行·观测面板 |
| 控制面广播 | Publish | 模型配置 / 提示词激活集 | 热下发 dispatcher/mcp-go(不重启) |
| 心跳探活 | Request-Reply | `sundynix.health.dispatcher` 等 | 管理端服务状态 |
| 持久队列 | JetStream | 入库工作队列(durable consumer | 崩溃重投 / 幂等 / 背压 / AckWait 续租 |
**⚠️ 运维要点**:单点 NATS(集群为 T3);本地开发禁止同时开 `devnats` 与 docker NATS(会脑裂)。
---
## 5. 编排引擎设计(Eino compose
**Eino 只在 dispatcher 里用,是编排引擎地基。**
### 5.1 DSL → compose 图
前端画布导出 `{version, nodes[{id,kind,label,config}], edges[{source,target,sourceHandle}]}`dispatcher 编译为 Eino `compose.Graph``compose_compiler.go`),支持拓扑 + 连线 + 分支剪枝 + DAG 并行调度。**自研 graph.go 解释器已退役,单 compose 引擎。**
### 5.2 节点类型(执行器)
- `input`:用户输入
- `retriever`RAG 检索(Eino Retriever 包 mcp-go `kb_search`
- `agent`:模型流式推理(拼消息 → token 流)
- `tool`:调 MCP 工具(编排直连 NATS)
- `branch`:条件路由(true/false 边标签 + **default/else 兜底** + 未匹配收口 END
- `map`:并行 fan-out(有界并发撰写;**子项失败传播 + 全失败置 fatalErr**
- `coordinator`:多智能体(专家=agent-as-tool,lead 分解→定制简报→并行派发→综合;**专家超时跳过**)
- `approval`:HITL 人工审批中断(暂停→waiting→批准回 running / 拒绝 rejectedcheckpoint 落盘)
### 5.3 ReAct 自主调用(`agent:true` 工具)
`agentTools()``list_tools` 动态发现 mcp 工具 → 包成 Eino `InvokableTool``mcpTool`)→ 模型 function-calling → ToolsNode 分发 → `InvokableRun` 转 NATS RPC。运行时注入 `user_id/session_id/kb`(不暴露给模型)。**加工具只改 mcp-go 注册表,dispatcher 零改动。**
### 5.4 harness 治理层(「恒温器」)
- **评测**:综合分(规则+LLM质量+RAG忠实度)+ 分级(ok/warn/poor),低分**自动纠偏**重生成。
- **输入护栏**:注入检测(网关 Tier1+ LLM 分类器(dispatcher Tier2 灰区裁决)。
- **输出脱敏**:有状态流式脱敏(跨分片缓冲,杜绝密钥被切断漏检)。
- **预算**:单任务 token 计量 + 封顶(默认 `TASK_TOKEN_BUDGET`,触顶中止全图)。
- **熔断**:后端连续失败→断开→冷却半开探测→恢复(编排层门控 + **model 层每模型熔断**)。
---
## 6. LLM 接入设计
- **接入策略**:开发期接第三方在线 API(OpenAI 兼容),不拉本地 Ollama(但支持 Ollama/vLLM 占位 key)。
- **LLM Pool**`llm/pool.go`):经 Eino ChatModel 组件;配置热更新、降级桩(未配置时)。
- **Failover 链**`llm/failover.go`):active=主 + 其余=按序备用,串成 `ToolCallingChatModel`compose/ReAct/Chat 全路径透明。**每模型带熔断器**:主持续失败→熔断→跳过主直连备用;冷却半开探测自动恢复;`WithTools` 重包共享 breakers。
- **输出缓存**`llm/cache.go`):包在 failover 外层,缓存 Generate(非流式),键=模型+工具+消息哈希。
- **控制面热切换**admin 改模型 → gateway 写 DB → NATS 广播 → dispatcher `SetConfig` 热重建 pool。
---
## 7. 数据存储设计
| 存储 | 角色 | 关键内容 |
|---|---|---|
| **PostgreSQL** | 关系事实源 | 用户/任务/评测/模型/计价/提示词/知识库元/文档/双链/编排/审计/护栏事件(表名 `sundynix_` 前缀,AutoMigrate |
| **Redis** | 缓存/流/限流 | token 用量计数、限流、会话历史、Redis Streamtoken/exec 回放) |
| **Milvus** | 向量库 | 文档向量(语义检索),键 file_id |
| **Neo4j** | 图数据库 | 知识图谱三元组(实体 kb+name 共享,关系打 file_id |
| **MinIO** | 对象存储 | 文档正文(大文件正文一律落 MinIO) |
| **Jaeger** | 追踪 | OTel span(节点/工具/LLMNATS 跨总线传播) |
**大文件入库生产化**:正文 MinIO + 切片 + 向量并发分批 + 图谱窗口化 + **JetStream 持久工作队列**(崩溃重投/幂等/背压),全 live 验证。
---
## 8. 关键数据流
**① 任务生命周期**:桌面端 POST DSL → gateway 解析+拓扑校验 → NATS `tasks.*` → dispatcher 编译 compose 图执行 → token 流 + 轨迹经 NATS→Redis Stream→SSE 回流 → FSM 状态机落库(submitted/running/done/failed/timeout/waiting/rejected)。
**② 工具调用(两条路)**
- 编排直连:`o.tools.CallTool()` 直接 NATS→mcp-go(报告写文件走这条,**绕开 Eino**)。
- Eino ReAct:模型 function-call → ToolsNode → `mcpTool.InvokableRun` → NATS→mcp-go。
- 真正执行永远在 mcp-*;**Eino 把工具当黑盒(吃 JSON→吐字符串),不碰文件系统**。
**③ 控制面热切换**admin 改配置 → gateway 写 DB → NATS 广播激活集 → dispatcher/mcp-go `ApplyOverrides` 热更新。
**④ 报告导出/写文件**:mcp-go `report_render` `os.WriteFile``SUNDYNIX_REPORTS_DIR`(默认 `$TMPDIR/sundynix-reports/{id}.docx`) → gateway `c.File(路径)` 流回 → 桌面端 Wails `SaveReportAs` 原生另存为落盘。**mcp-go 写、gateway 读须共享该目录。** PDF 目前靠前端打印(无后端 PDF 渲染)。
---
## 9. 安全与治理
- **鉴权**JWT 无状态;owner 隔离(`owner_id`,单租户假设)。
- **API Key 加密**AES-256-GCM 端到端密文(PG + NATS 均密文)。
- **输入护栏**:Tier1 正则/黑名单(网关,命中即拦 + 落库 `guardrail_event`+ Tier2 LLM 分类(dispatcher 灰区)。
- **审计**:敏感操作(改模型/密钥/激活 prompt/审批)经 `audit_log` 留痕,`/admin/audit` 可查。
- **限流**:按登录用户(未认证按 IP),Redis 会话级。
- **CORS**:开发 `*`,生产未显式配置则不放行任意源。
---
## 10. 可观测性
- **OTel 全链路**:节点/工具/LLM spanNATS 跨总线传播 traceparentJaeger:16686)看瀑布。
- **执行轨迹**ExecEvent → 前端"运行·观测"面板(工具/专家调用、分支决策、审批等)。
- **管理端**`/status`(基建+服务探活+MCP 工具注册)、`/dashboard`(系统级 overview)、`/audit`(审计+安全事件)。
- **缺口(待补)**failover/熔断的**运行时态**只在日志、admin UI 不可见(T4.F 🔴)。
---
## 11. 前端设计
**双前端,严格独立、绝不合并**
- **桌面端**Wails 原生窗口 + React):用户工作产品——画布编排/任务运行/知识库/报告/记忆。含 Wails Go 绑定(`app.go`)提供原生能力:另存为/系统应用打开/文件读写/通知。
- **管理端**(React,Vite):运维控制台——模型/计价/数据源/提示词/服务状态/评测/租户/护栏/审计。已接 vitest。
---
## 12. 部署形态与配置
- **基建**docker composePG/Redis/NATS/Milvus+etcd+MinIO/Neo4j/Jaeger)。
- **应用**:Go 服务本地编译二进制 / `go run`;启动序 = gateway → dispatcher/mcp-gomcp-go 必须在 Milvus 后)→ mcp-py。
- **关键配置对齐**(多进程/多机须一致):`SUNDYNIX_SECRET_KEY``NATS_URL``POSTGRES_DSN``SUNDYNIX_REPORTS_DIR``ADMIN_USER_IDS``CORS_ALLOW_ORIGIN`(生产)、`TASK_TOKEN_BUDGET``RATE_LIMIT_PER_MIN` 等。
---
## 13. 当前能力矩阵(干到哪一步)
**✅ 已建(live 验证)**
编排引擎(compose 单引擎,分支/并行/HITL)· 多智能体协调 · RAG 三路混合 + 评测台 · 大文件入库生产化(MinIO+JetStream)· 模型 failover + 每模型熔断 · 输出缓存 · 评测纠偏闭环 · 输入护栏 + 输出脱敏 + 预算 · prompt 版本化 + DB 控制面热切换 · API Key 加密 · OTel 全链路 · **审计可溯源(audit_log + guardrail_event + admin 审计页)** · **系统级 admin overview** · **DSL 拓扑校验** · admin 控制台(含 vitest
**🔶 进行中(T4.F 健壮性收口)**
拆残骸/CORS/限流已做;**剩** KB 级联删事务化 · 关键 DB 写失败上浮 5xx · 审批 checkpoint 落盘重试 · 🔴模型健康/熔断态上 admin · 分页 · 配置化
**⬜ 规划(未动)**
T4.A 多租户/RBAC(无 tenant_idL)· T4.C 真实计费(L)· T4.D AI 核心(记忆 Consolidate / prompt 灰度% / mcp-py 算法去桩 / 报告原生 PDF)· T3 生产硬化 ⏸(NATS 集群 / DB HA / K8s / TLS / 备份 DR,等真实流量)
---
## 14. 技术栈
| 层 | 技术 |
|---|---|
| 编排/后端 | Go · gin · **Eino(cloudwego)** · NATS/JetStream · gorm |
| LLM | OpenAI 兼容 APIDeepSeek 等)· eino-ext openai 组件 |
| 工具服务 | Go(mcp-go) · Python(mcp-py) |
| 前端 | React 19 · Vite · Tailwind · Wails(桌面端) · vitest |
| 数据 | PostgreSQL · Redis · Milvus · Neo4j · MinIO |
| 可观测 | OpenTelemetry · Jaeger · Prometheus 指标 |
---
*本文档描述当前架构的「设计」;对该设计的优缺点评价、技术债与生产化建议见 `ARCHITECTURE_REVIEW.md`。*