用户反馈「UI 太乱」。数出来的:report/kb/memory 各 4 个入口、studio 5 个; 运行历史两套渲染。乱的机制是同一件事写了两遍,改一处另一处必然掉队。 **一份数据一个查法** - 工作台「最近任务」和运行页「运行历史」是同一批数据,却各查各的: 前者走 store.RecentTasks(),后者走 RecentRuns()。于是我给运行历史加的 topic 字段工作台完全没跟上,还在 mono 显示 report_<hex>;而且 RecentTasks 没有租户过滤,口径也不一致。现在统一走 RecentRuns,RecentTasks 删掉 (它只有那一个调用点)。前端 recent_runs 也改用 RunSummary 同一个类型。 **一个功能一个入口** - 工作台删掉「入库知识/生成报告/管理记忆」按钮排 —— 跳的目标和上面四张 能力卡片完全重合,同一页给两个入口。 - 「最近任务」现在点击直达运行页对应那条(App 加 goto(view, taskId) → RunsView focusTaskId),而不是只把页面切过去让用户自己再找一遍。 **报告归 RUN,只做启动器** - 报告是「执行」不是「构建」,从 BUILD 组移到 RUN。 - 报告页砍掉「执行轨迹」「报告正文」两个面板 —— 和运行页完全重复,而且 那套是组件本地 state,切页面就没。现在它只有主题输入框。 - 报告改走 App 的全局运行态(新增 onRunReport,与 onRun 同构、复用 attachRun): 提交 → 跳「运行 · 观测」→ 实时看轨迹/正文/导出。App 里 onRun 早就写着 「发起即跳运行页,观测统一收敛在此页」——这条方针一直在,只有报告没遵守。 **顺带清死代码** - 市场(规划中)从导航下架,ViewKey 里的 "market" 和 Boxes 图标一并删。 - PLACEHOLDERS 整块死代码:它列的 home/kb/report/runs 全都早已真实实现, market 是唯一还可能用到的、下架后那个 Placeholder 分支永远走不到 (tsc 报 "Spread types" 就是因为 PLACEHOLDERS[view] 已成 never)。 连同 views/Placeholder.tsx 一起删。 live 验证(真账号,桌面端实机):报告页输入主题 → 提交 → 自动跳运行页 → 顶部「当前运行 · live」→ 轨迹实时跑 → 报告正文流式出 + 导出按钮在位 → report_7a0110a10b534f90 落库带 topic「归口测试」,POST /api/v1/reports → 202。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
sundynix-agentix
分层式 AI Agent 平台 — Monolith First → Microservices (Morph B)。 架构总览见 architecture.md / architecture.png。
仓库结构(Monorepo)
| 目录 | 层 | 语言 / 技术栈 | 职责 |
|---|---|---|---|
sundynix-desktop/ |
1 · Client | Wails + React 19 + TS + shadcn/ui | 桌面端、React Flow Agent 编排、导出 JSON DSL、LLM Wiki 面板 |
sundynix-gateway/ |
2 · Gateway | Go · Gin | 统一接入、DSL 解析组装、计费、Guardrail、PgSQL + Redis |
deploy/nats/ |
3 · Message Bus | NATS (Go) | 零拷贝骨干网:Queue + Stream |
sundynix-dispatcher/ |
4 · Dispatcher | Go · Eino | 图编排、LLM Pool 调度、自动化评测、熔断降级 |
sundynix-mcp-go/ |
5a · MCP Tools (I/O) | Go | MCP 网关、Wiki 混合检索(Bleve/Milvus/Neo4j)、UniOffice、外部 API |
sundynix-mcp-py/ |
5b · MCP Tools (算法) | Python | MCP 网关、安全沙箱(gVisor/KataVM)、MinerU(PaddleOCR)、Docker 解释器 |
sundynix-shared/ |
共享契约 | Go | Task 数据契约、NATS subject 约定、JetStream 收发逻辑(bus)、内嵌 NATS(devnats) |
核心数据流
Gateway解析 DSL → Publishsundynix.tasks.*(NATS Queue)Dispatcher订阅任务 →Eino图编排 → 调用LLM Pool- 经 NATS request-reply 同步调用第 5 层
MCP Tools(sundynix.tools.go.*队列组负载均衡,工具不可用即降级) - 结果以零拷贝 Token Stream 经
sundynix.streams.task_id回流 → SSE/WS 推给Client
快速开始
生产 / 独立部署 — 一条命令拉起整套(应用 + 基建)
cp .env.example .env # 按提示填密钥(openssl rand -base64 32)
docker compose -f docker-compose.prod.yml up -d --build
# 控制台 http://<IP>:80 | 网关 http://<IP>:8080 | 链路 UI http://<IP>:16686
应用全部容器化(gateway / dispatcher / mcp-go / mcp-py / admin-nginx),经服务名互连,
基建端口不对外;模型 API key 部署后在控制台配(加密存库)。详见 DEPLOY.md、
备份恢复见 scripts/backup.sh。
无 Docker — 一键验证任务流(推荐先跑这个)
make demo # 内嵌NATS + Gateway + Dispatcher + MCP-Go,提交 DSL 任务,看任务流+工具调用+Token流闭环
make e2e # 仅跑共享 bus 的端到端测试(go test,内嵌 NATS):任务流 / 工具调用 / Token 流
make demo 实测输出:
Gateway: POST /api/v1/tasks → task_xxx → published (seq=1)
Dispatcher: [eino] task_xxx received → streaming tokens...
SSE 客户端: event:token data:已 event:token data:编 ... event:done ← 流式闭环打通
完整链路:HTTP POST → DSL 解析 → NATS 任务队列 → Dispatcher 消费 → LLM 流式推理
→ Token 经 sundynix.streams.<id> 回流 → Gateway SSE → 客户端逐 token 收到。
完整环境(git clone 后零配置直跑)
前置:Docker、Go ≥1.24、Node ≥20、Python ≥3.11。
跑真实桌面端还需:Wails CLI(go install github.com/wailsapp/wails/v2/cmd/wails@latest);macOS 再装 Xcode 命令行工具(xcode-select --install,webkit 编译用)。
各服务默认配置已对齐 docker-compose(NATS:4222 / PG sundynix@5432 / Redis:6379 / Milvus:19530 / Neo4j neo4j-sundynix@7687),clone 后无需改任何配置即可连上。
make infra # 1) 启动 NATS / Postgres / Redis / Milvus / Neo4j (docker-compose)
make gateway # 2) 各开一个终端运行后端
make dispatcher
make mcp-go
make mcp-py # 首次自动建 venv + 装解析依赖
make admin # 3) 运维控制台 (Vite :5174)
-
打开运维控制台(
:5174),在「模型 / 数据源」登记并激活:对话模型(chat) 与 Embedding 模型 (开发期填第三方在线 API:base_url + api_key + model,OpenAI 兼容)。激活后经 NATS 热更新到各服务。 — 这是唯一需要自己填的配置(API key),其余零配置。 -
启动客户端(任选其一):
make desktop # ★ 真实桌面端:Wails 原生窗口(热重载)——独立 App,非浏览器
# 或
make web # 浏览器预览版(Vite :5173,前端代码同上)
打包桌面端为可双击的原生应用:
make desktop-build # → sundynix-desktop/build/bin/sundynix_desktop.app
完成后即可:编排 Agent 图 → 运行(注入画像/历史,真实流式);知识库入库(docx/xlsx/pdf) → 三路混合检索(向量+全文+图谱);报告生成(「报告」页输入主题 → 规划大纲 → 各章并行检索+撰写 → 渲染真实 Word(.docx) → 一键下载)。桌面端是客户端,经 HTTP 连 Gateway:8080,需先起后端。
后端 4 模块用根
go.work串联;sundynix-shared经各 go.modreplace指向本地。 桌面端是自包含模块,make desktop/desktop-build用GOWORK=off独立构建(不入 go.work)。
NATS Subject 约定
| Subject | 类型 | 说明 |
|---|---|---|
sundynix.tasks.* |
Queue | 分布式任务队列 |
sundynix.streams.<task_id> |
Stream | 零拷贝 Token 字节管道 |
sundynix.tools.go.* |
Queue | Go MCP 工具调用 |
sundynix.tools.py.* |
Queue | Python MCP 工具调用 |