Files
sundynix-agentix/ARCHITECTURE_DESIGN.md
T
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

17 KiB
Raw Blame History

sundynix-agentix · 架构设计文档(当前完整版)

版本:2026-07-02(反映 T0T2 全量 + T4.B/E 完成 + T4.F 部分后的现状) 定位:事件驱动的 AI Agent 平台。以 NATS 为统一总线,服务经契约解耦,Eino 为编排核心,控制面热切换。 配套文档:ARCHITECTURE_REVIEW.md(架构评审:优缺点/技术债)、DEPTH_ROADMAP.md(路线图)、EINO_ADOPTION.mdEino 采纳)。


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 → AuthRateLimit(按 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):

  • RAGkb_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(跨服务共享库)

  • busNATS/JetStream 封装(Publish/Subscribe/Request-Reply、控制面广播、心跳、持久队列)。
  • contractTask/ToolCall/ToolResult/ModelConfig/报告路径 等跨服务契约。
  • prompts:提示词注册表(内置默认 + 运行期覆盖)。
  • secretsAPI 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.Graphcompose_compiler.go),支持拓扑 + 连线 + 分支剪枝 + DAG 并行调度。自研 graph.go 解释器已退役,单 compose 引擎。

5.2 节点类型(执行器)

  • input:用户输入
  • retrieverRAG 检索(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 InvokableToolmcpTool)→ 模型 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 Poolllm/pool.go):经 Eino ChatModel 组件;配置热更新、降级桩(未配置时)。
  • Failover 链llm/failover.go):active=主 + 其余=按序备用,串成 ToolCallingChatModelcompose/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.WriteFileSUNDYNIX_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_KEYNATS_URLPOSTGRES_DSNSUNDYNIX_REPORTS_DIRADMIN_USER_IDSCORS_ALLOW_ORIGIN(生产)、TASK_TOKEN_BUDGETRATE_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