56eee90705
修 5 处事实硬伤(原分析靠文件名/印象、且写于近期改动之前): - 桌面端 UI:shadcn/ui → 自建 UI 原语(src/ui) - Word 渲染:UniOffice → 自建零依赖 OOXML(unioffice.go 注释明确不用商业库) - CORS:「未见配置」→ 实有 cors() + CORS_ALLOW_ORIGIN - 限流:「实现程度不明」→ 实有 Redis 滑动窗口按 IP 限流 - CI/CD:「无」→ 已加 ci.yml + release.yml 另:安全沙箱被误判为「桩」→ 实已可用(run_code 已接入自主 agent)。 补录近期新增功能:Token 流可回放+断点续传(Redis Stream)、 GitHub Releases 分发 + 桌面端自动检查更新。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
15 KiB
15 KiB
sundynix-agentix 项目全面分析
一、项目定位
分层式 AI Agent 平台,采用 Monolith First → Microservices (Morph B) 演进策略。
目标是构建一个集 Agent 可视化编排、知识库 RAG、报告生成、用户记忆 于一体的企业级 AI 工作站。
二、技术栈总览
| 层级 | 模块 | 语言/框架 | 核心依赖 |
|---|---|---|---|
| 1. 客户端 | sundynix-desktop |
Wails + React 19 + TypeScript | @xyflow/react (React Flow), 自建 UI 原语(src/ui,非 shadcn), TailwindCSS 3, lucide-react, react-force-graph-2d, Vite 5 |
| 1b. 运维控制台 | sundynix-admin |
React 19 + TS + Vite | react-router-dom 7, TailwindCSS |
| 2. 网关 | sundynix-gateway |
Go · Gin | GORM + PostgreSQL 16, Redis 7, NATS JetStream, 雪花 ID, bcrypt 鉴权 |
| 3. 消息总线 | NATS Server | Go | NATS 2 (Alpine), JetStream 持久化 |
| 4. 调度器 | sundynix-dispatcher |
Go · CloudWeGo Eino | eino (图编排/ReAct Agent), nats.go, 熔断器, LLM 自动化评测 |
| 5a. MCP 工具 (I/O) | sundynix-mcp-go |
Go | Milvus SDK, Bleve, Neo4j Driver, 自建零依赖 OOXML(.docx,刻意不用商业授权的 UniOffice), Snowflake ID, GORM |
| 5b. MCP 工具 (算法) | sundynix-mcp-py |
Python ≥3.11 | nats-py, python-docx, openpyxl, pypdf, docker (沙箱) |
| 共享层 | sundynix-shared |
Go | nats.go, JetStream, 内嵌 NATS (devnats) |
| 基础设施 | Docker Compose | - | NATS, PostgreSQL 16, Redis 7, Milvus 2.4, Neo4j 5, MinIO |
构建工具链
- Go 工作区:
go.work管理 4 个后端模块(gateway/dispatcher/mcp-go/shared) - 前端: Vite 5 + TypeScript 5 + PostCSS + TailwindCSS
- 桌面端: Wails v2(Go 后端 + WebView 前端,
GOWORK=off独立构建) - Makefile: 统一的
make命令编排所有服务启动、测试、构建
三、已实现功能
3.1 Agent 可视化编排 (Studio)
- React Flow 画布:拖拽式节点编排,支持 10+ 节点类型:
input/output/memory/retriever/tool/agent/aggregate/render/branch/map
- DSL 导出:画布编排导出 JSON DSL,经网关发布到 NATS 任务队列
- 图执行引擎:按拓扑序遍历节点、沿连线传播活性、branch 条件剪枝
- 多 Agent 协作:agent 节点产出通过黑板(board)接力传递给下游 agent
- ReAct 自主 Agent:基于 CloudWeGo Eino 的 ReAct 循环,模型自主选工具(最多 8 步)
- Eino Compose Graph (可选):环境变量
EINO_COMPOSE=1可切换到 Eino 原生 compose.Graph 编排
3.2 知识库 RAG
- 三路混合检索:
- 向量路: Embedding → Milvus 向量搜索
- 全文路: Bleve 倒排索引
- 图谱路: Neo4j 知识图谱(LLM 自动抽取实体三元组)
- RRF 融合 + 可选 Rerank:三路结果经 Reciprocal Rank Fusion 融合,可接 Rerank 模型精排
- 入库流水线:文档解析 → 语义切块(递归+句界+重叠+rune 安全)→ 分批向量化 → 写 Milvus/Bleve → LLM 抽三元组 → 写 Neo4j
- 实时入库监控:
IngestEvent逐阶段回流进度给 UI(切块/向量化/写库/抽实体) - 文档格式支持:.docx (python-docx) / .xlsx (openpyxl) / .pdf (pypdf)
- 知识图谱可视化:react-force-graph-2d 渲染三元组图谱
3.3 报告生成
- 多步编排:规划大纲 → 各章节并行(有界并发=4)→ RAG 检索 + LLM 撰写 → 汇聚渲染
- Word 渲染:自建零依赖 OOXML 渲染 .docx 文档(不引第三方 Office 库),一键下载
- 流式进度:规划/撰写进度实时流回客户端
- 报告源持久化:title + sections 持久存储,支持导出 Word/PDF/Markdown
3.4 用户记忆系统
- 常驻画像 (Always-on Memory):
- Postgres 存储 key-value 偏好,GORM 软删 + 雪花 ID
- Generative Agents 打分:
Score = 0.4·Recency + 0.6·Importance - 指数衰减 Recency(每天衰减 0.98)+ LLM 评分 Importance (1-10)
- 读取时 Top-30 截断控 context + 自然遗忘
- 短期多轮历史:经 MCP history_get/history_append 工具存取
- 记忆对账 (Consolidate):每 3 轮攒批一次,LLM 将近期对话与已有画像对账归纳
3.5 执行可视化 (运行·观测)
- ExecEvent 轨迹:每个节点的生命周期事件(start/end/error/info)+ 耗时
- 双流并行:Token 流 (
sundynix.streams.<id>) + 执行事件流 (sundynix.exec.<id>) 分离 - 实时节点点亮:前端 SSE 订阅轨迹,逐节点展示执行状态
- Token 流可回放 + 断点续传:网关把 Token 流落 Redis Stream,SSE 带
Last-Event-ID,连晚/刷新/网络抖动重连均不丢 token(Redis 降级时回退 live NATS)
3.6 安全与工程化护栏
- 熔断降级 (
CircuitBreaker):连续失败触发熔断,快速拒绝新任务 + 友好提示 - 输出护栏 (
RedactSecrets):流式脱敏疑似密钥/令牌 - LLM 自动化评测 (
Evaluator):规则 + LLM-as-judge 异步打分 - Python 安全沙箱:gVisor / KataVM 静态代码守卫 + Docker 隔离解释器
- 任务生命周期状态机:submitted → running → done / failed / timeout
3.7 鉴权与管理
- JWT 鉴权:登录/注册 + bcrypt 密码 + Token 校验
- 运维控制台 (admin):模型/数据源登记激活、服务健康监控、用户计费
- NATS 热更新:模型配置变更经 NATS 广播到各消费方(dispatcher/mcp-go)
3.8 桌面端
- Wails 原生应用:macOS/Windows/Linux 跨平台桌面端
- Go/TS 强绑定:前端调用 Go 后端(本地文件 I/O 等)
- 命令面板:⌘K / Ctrl+K 全局命令面板(键盘优先工作站)
- GitHub Releases 分发 + 自动检查更新:打
vX.Y.Z标签经 release workflow 自动构建 mac/win 安装包发布到 Releases;桌面端启动查releases/latest,有新版弹横幅引导下载
四、核心数据流
客户端 → POST /api/v1/tasks → Gateway (DSL 解析/鉴权/计费)
→ NATS JetStream (sundynix.tasks.<id>)
→ Dispatcher (Eino 图编排, 记忆/历史召回)
→ NATS request-reply → MCP Tools (Go I/O + Python 算法)
→ Token Stream (sundynix.streams.<id>) 零拷贝回流
→ Gateway SSE → 客户端逐 token 渲染
五、优势与亮点 ✅
架构设计
| 优势 | 说明 |
|---|---|
| 分层解耦清晰 | 5 层 + NATS 消息总线,各层职责边界分明,适合团队分工和独立演进 |
| NATS 零拷贝骨干网 | Queue(任务分发) + Stream(Token 回流) + Request-Reply(工具调用/配置) 三模式精准匹配场景,低延迟高吞吐 |
| 优雅降级设计 | 各依赖(Milvus/Neo4j/Rerank/Memory/Python MCP)不可用时自动降级,核心链路不阻断 |
| Monolith First 策略 | 先单体验证核心价值,预埋微服务拆分点(MCP 工具已经独立为 Go/Python 两个微服务) |
| Eino 生态 | 基于 CloudWeGo Eino 的 ReAct Agent + Compose Graph,复用字节生态的模型抽象和工具适配 |
功能实现
| 优势 | 说明 |
|---|---|
| 三路混合 RAG | 向量 + 全文 + 知识图谱 RRF 融合 → 召回质量显著优于纯向量检索 |
| Generative Agents 记忆 | Recency + Importance 双维打分 + 自然遗忘,远超简单的"全量注入"记忆方案 |
| 可视化 Agent 编排 | React Flow 画布低代码拖拽,支持 branch/map/aggregate 等复杂流控,降低使用门槛 |
| 执行可视化 | Token 流与执行轨迹分流,运行时逐节点点亮,工具调用入参/产出透明可观测 |
| 动态工具发现 | ReAct agent 通过 list_tools 自描述发现可用工具,新增工具只需在 MCP 注册,无需改 dispatcher |
| 报告并行生成 | 大纲规划 → 多章有界并发撰写 → 真实 Word 渲染,端到端闭环 |
工程化
| 优势 | 说明 |
|---|---|
| Monorepo 统一管理 | go.work + Makefile 一键启动,make demo 零 Docker 即可验证全链路 |
| 内嵌 NATS (devnats) | 开发/测试无需外部 NATS,降低环境搭建成本 |
| 完善的 E2E 测试 | 任务流/工具调用/Token 流 三场景端到端覆盖 |
| 雪花 ID 规约 | 全局统一的字符串雪花 ID 主键 + GORM 软删,数据规约一致 |
| 零配置启动 | docker-compose 对齐默认配置,clone 后只需填 API key |
| NATS 配置热更新 | 模型配置变更无需重启服务,broadcast + subscribe 实时生效 |
六、不足与改进建议 ⚠️
6.1 架构层面
| 问题 | 现状 | 建议 |
|---|---|---|
| 缺少 API 网关/服务网格 | Gateway 承担了鉴权/限流/DSL 解析/SSE 推送/管理等过多职责 | 考虑分离 BFF (面向前端) 与核心 Gateway,或引入 Kong/Traefik 负责横切关注点 |
| 配置管理未集中 | 各服务 config/ 独立管理,NATS 热更新仅覆盖模型配置 | 引入统一配置中心(Consul/etcd 或 NATS KV),覆盖全部运行时配置 |
| 缺少链路追踪 | 日志为主要观测手段(log.Printf),无结构化 trace |
接入 OpenTelemetry (tracing + metrics),NATS 消息头透传 trace ID |
| 无服务注册发现 | 服务端点硬编码于配置 | 基于 NATS 已有能力做简单服务注册,或引入 Consul/etcd |
| 单点瓶颈风险 | NATS 单节点(docker-compose)、Milvus standalone | 生产环境需 NATS 集群 + Milvus 分布式模式 |
6.2 代码质量
| 问题 | 现状 | 建议 |
|---|---|---|
| Dispatcher graph.go 过大 | 单文件 492 行,混合了图执行、各节点实现、条件求值 | 拆分为 node_agent.go / node_retriever.go / node_branch.go 等,每类节点独立文件 |
| 日志标准化不足 | 使用标准 log.Printf,无结构化字段和级别控制 |
引入 slog(Go 1.21 标准库)或 zap,统一 JSON 格式 + 日志级别 |
| 错误处理不够严谨 | 多处 _ = msg.Respond(data) / _ = m.Respond(data) 忽略错误 |
关键路径的响应失败应记录日志 |
| 魔法字符串 | 节点 Kind ("agent", "retriever") 为裸字符串 |
定义 const 枚举或使用 iota,消除散落的字符串匹配 |
| 部分 Python 代码为桩 | MinerU (PaddleOCR)、MCP 协议真实实现标注为 TODO | 核心功能保持占位可接受,但应有明确的迭代计划和 issue 跟踪 |
6.3 前端
| 问题 | 现状 | 建议 |
|---|---|---|
| 状态管理原始 | 纯 useState + props drilling,无全局状态管理 |
随功能增长,考虑引入 Zustand 或 Jotai 管理全局状态(当前/会话/运行态) |
| 路由为自研视图切换 | view state + 条件渲染,无 URL 路由 |
引入 React Router,支持 URL 直达、浏览器前进后退 |
| 类型安全不完整 | 部分 API 响应缺 TypeScript 类型定义 | 考虑 API 契约生成(OpenAPI → TypeScript types),前后端类型一致 |
| KbView.tsx 过大 | 单文件 31944 字节 | 拆分为子组件(搜索面板 / 文档列表 / 图谱面板 / 入库面板) |
| 无单元测试 | 前端零测试覆盖 | 引入 Vitest + React Testing Library,优先覆盖核心交互 |
6.4 安全
| 问题 | 现状 | 建议 |
|---|---|---|
| API Key 明文传输/存储 | ModelConfig 中 api_key 明文存 PG、经 NATS 广播 |
API Key 加密存储(AES-256),NATS 传输走 TLS |
| CORS 收紧 | 已有显式 cors() + CORS_ALLOW_ORIGIN(缺省 * 仅供开发) |
生产环境把 CORS_ALLOW_ORIGIN 设为具体源 |
| Rate Limiting | 已实现:Redis 滑动窗口、按客户端 IP 每分钟限流(middleware.RateLimit + store.Allow) |
可对登录/任务提交等关键 API 单独配更严阈值 |
| 依赖安全审计 | 无 dependabot / 漏洞扫描 | 启用 GitHub Dependabot + go vet / govulncheck CI |
6.5 运维与部署
| 问题 | 现状 | 建议 |
|---|---|---|
| CI/CD(部分完成) | ✅ 已加 ci.yml(go build+vet+test / 前端 tsc / mcp-py 守卫)+ release.yml(tag 触发构建发布到 GitHub Releases) |
后续补:自动部署、govulncheck/Dependabot 安全扫描 |
| 无 Kubernetes 部署 | 仅 docker-compose(开发环境) | 补充 Helm Chart 或 Kustomize,面向生产集群 |
| 健康检查不统一 | dispatcher 走 NATS ping,其它走 HTTP | 统一为 Kubernetes 标准的 liveness/readiness probe |
| 无数据备份策略 | PG/Milvus/Neo4j 数据卷无备份配置 | 配置 pg_dump 定时备份 + 对象存储归档 |
七、技术选型评价
| 选型 | 评分 | 评语 |
|---|---|---|
| Go + NATS | ⭐⭐⭐⭐⭐ | 高性能、低延迟、零拷贝,完美适配 AI 推理 Token 流场景 |
| Eino (CloudWeGo) | ⭐⭐⭐⭐ | 字节生态,ReAct/Compose Graph 成熟;但社区生态不如 LangChain/LlamaIndex |
| Wails | ⭐⭐⭐⭐ | Go+WebView 跨平台桌面端,避免 Electron 臃肿;但 WebView 兼容性不如 Electron |
| Milvus + Bleve + Neo4j | ⭐⭐⭐⭐ | 三路 RAG 架构领先;但三套存储的运维复杂度高 |
| React Flow | ⭐⭐⭐⭐⭐ | 低代码编排标配,生态成熟,@xyflow/react v12 性能好 |
| Python MCP 层 | ⭐⭐⭐ | 算法型工具用 Python 合理;代码沙箱已可用,但 MinerU 多模态解析仍为桩 |
八、代码量统计(估算)
| 模块 | Go 代码 | TS/TSX 代码 | Python 代码 | 说明 |
|---|---|---|---|---|
sundynix-shared |
~1,500 行 | - | - | 契约 + NATS 总线 |
sundynix-gateway |
~6,000 行 | - | - | 鉴权/DSL/存储/路由/SSE |
sundynix-dispatcher |
~8,000 行 | - | - | Eino 编排/ReAct/报告/评测/熔断 |
sundynix-mcp-go |
~5,000 行 | - | - | RAG 三路/记忆/Office/MCP |
sundynix-mcp-py |
- | - | ~1,500 行 | 沙箱/解析/解释器/MCP |
sundynix-desktop |
~300 行(Go) | ~8,000 行 | - | Wails 绑定 + React 全套 |
sundynix-admin |
- | ~3,000 行 | - | 运维控制台 |
| 合计 | ~21,000 行 | ~11,000 行 | ~1,500 行 | ~33,500 行 |
九、总体评价
sundynix-agentix 是一个架构设计水准较高、功能相当完整的 AI Agent 平台原型。
核心竞争力在于:
- NATS 零拷贝骨干网 — 贯穿全栈的消息总线设计,比 HTTP 微服务更适合 AI 场景
- 三路混合 RAG — 向量+全文+图谱的 RRF 融合,业界领先
- 可视化编排 + ReAct — 低代码画布 + 自主 Agent 双模式,兼顾不同用户群
- Generative Agents 记忆 — 带打分的自然遗忘记忆系统,超越大部分同类项目
主要风险在于:
- 基础设施复杂度高(6 个存储组件),运维压力大
- 前端缺少测试和路由,随功能增长技术债务会快速累积
- Python MCP 层较薄:MinerU/PaddleOCR 多模态解析仍为桩(代码执行沙箱已实现可用,run_code 已接入自主 agent)
- 链路追踪、集中配置、k8s 部署、API Key 加密等生产级工程化设施待补(CI/CD 已具备)
项目成熟度:处于 高完成度 MVP 阶段,核心数据流和关键功能闭环已通,具备向生产环境演进的基础。