# sundynix-agentix

分层式 AI Agent 平台 — **Monolith First → Microservices (Morph B)**。
架构总览见 [architecture.md](architecture.md) / [architecture.png](architecture.png)。

## 仓库结构（Monorepo）

| 目录 | 层 | 语言 / 技术栈 | 职责 |
|---|---|---|---|
| [`sundynix-desktop/`](sundynix-desktop) | 1 · Client | Wails + React 19 + TS + shadcn/ui | 桌面端、React Flow Agent 编排、导出 JSON DSL、LLM Wiki 面板 |
| [`sundynix-gateway/`](sundynix-gateway) | 2 · Gateway | Go · Gin | 统一接入、DSL 解析组装、计费、Guardrail、PgSQL + Redis |
| [`deploy/nats/`](deploy/nats) | 3 · Message Bus | NATS (Go) | 零拷贝骨干网：Queue + Stream |
| [`sundynix-dispatcher/`](sundynix-dispatcher) | 4 · Dispatcher | Go · Eino | 图编排、LLM Pool 调度、自动化评测、熔断降级 |
| [`sundynix-mcp-go/`](sundynix-mcp-go) | 5a · MCP Tools (I/O) | Go | MCP 网关、Wiki 混合检索(Bleve/Milvus/Neo4j)、UniOffice、外部 API |
| [`sundynix-mcp-py/`](sundynix-mcp-py) | 5b · MCP Tools (算法) | Python | MCP 网关、安全沙箱(gVisor/KataVM)、MinerU(PaddleOCR)、Docker 解释器 |
| [`sundynix-shared/`](sundynix-shared) | 共享契约 | Go | Task 数据契约、NATS subject 约定、JetStream 收发逻辑(bus)、内嵌 NATS(devnats) |

## 核心数据流

1. `Gateway` 解析 DSL → **Publish** `sundynix.tasks.*` (NATS Queue)
2. `Dispatcher` 订阅任务 → `Eino` 图编排 → 调用 `LLM Pool`
3. 经 NATS **request-reply** 同步调用第 5 层 `MCP Tools`（`sundynix.tools.go.*` 队列组负载均衡，工具不可用即降级）
4. 结果以零拷贝 Token Stream 经 `sundynix.streams.task_id` 回流 → SSE/WS 推给 `Client`

## 快速开始

### 生产 / 独立部署 — 一条命令拉起整套（应用 + 基建）

```bash
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](DEPLOY.md)**、
备份恢复见 `scripts/backup.sh`。

### 无 Docker — 一键验证任务流（推荐先跑这个）

```bash
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 v3 CLI（`go install github.com/wailsapp/wails/v3/cmd/wails3@v3.0.0-alpha2.117`，版本须与 `sundynix-desktop/go.mod` 一致）；macOS 再装 Xcode 命令行工具（`xcode-select --install`，webkit 编译用）。

> 各服务默认配置已对齐 docker-compose（NATS:4222 / PG sundynix\@5432 / Redis:6379 /
> Milvus:19530 / Neo4j neo4j-sundynix\@7687），**clone 后无需改任何配置**即可连上。

```bash
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)
make webface      # 3b) 薄 Web 面：租户自助注册/组织/团队/账单 (Vite :5175)
```

4) 打开运维控制台(`:5174`)，在「模型 / 数据源」登记并激活：**对话模型(chat)** 与 **Embedding 模型**
   （开发期填第三方在线 API：base_url + api_key + model，OpenAI 兼容）。激活后经 NATS 热更新到各服务。
   — 这是唯一需要自己填的配置（API key），其余零配置。

5) 启动客户端（任选其一）：

```bash
make desktop        # ★ 真实桌面端：Wails 原生窗口（热重载）——独立 App，非浏览器
# 或
make web            # 浏览器预览版（Vite :5173，前端代码同上）
```

打包桌面端为可双击的原生应用：

```bash
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.mod `replace` 指向本地。
> 桌面端是自包含模块，`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 工具调用 |
