- Create docs/README.md as documentation index - Add WORK_SUMMARY_2026-03-16.md for today's work - Move test reports to docs/test-reports/ - Move completed plans to docs/archive/completed-plans/ - Move research reports to docs/archive/research-reports/ - Move technical reference to docs/knowledge-base/ - Move all plans from root plans/ to docs/plans/ New structure: docs/ ├── README.md # Documentation index ├── DEVELOPMENT.md # Development guide ├── OPENVIKING_INTEGRATION.md # OpenViking integration ├── USER_MANUAL.md # User manual ├── ZCLAW_AGENT_INTELLIGENCE_EVOLUTION.md ├── archive/ # Archived documents ├── knowledge-base/ # Technical knowledge ├── plans/ # Execution plans └── test-reports/ # Test reports Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
14 KiB
14 KiB
ZClaw: 从 OpenClaw 迁移到 OpenFang 可行性方案
规划日期: 2026-03-13 目标: 制定从 OpenClaw 到 OpenFang 的渐进式迁移策略,实现平稳过渡
一、背景与动机
1.1 当前架构 (OpenClaw)
┌─────────────────────────────────────────────────────────────────┐
│ ZClaw Desktop (当前) │
├─────────────────────────────────────────────────────────────────┤
│ React 19 UI → Zustand Store → GatewayClient → OpenClaw │
│ 技术栈: Tauri 2.0 + TypeScript + Node.js Gateway │
│ 内存: >1GB | 启动: 2-5s | 安装: 500MB │
└─────────────────────────────────────────────────────────────────┘
1.2 目标架构 (OpenFang)
┌─────────────────────────────────────────────────────────────────┐
│ ZClaw Desktop (OpenFang) │
├─────────────────────────────────────────────────────────────────┤
│ React 19 UI → Zustand Store → OpenFangClient → OpenFang │
│ 技术栈: Tauri 2.0 + TypeScript + Rust Gateway │
│ 内存: ~40MB | 启动: 180ms | 安装: 32MB │
└─────────────────────────────────────────────────────────────────┘
1.3 迁移动机
| 维度 | OpenClaw | OpenFang | 提升 |
|---|---|---|---|
| 启动速度 | 5.98s | 180ms | 33x 更快 |
| 内存占用 | 394MB | 40MB | 90% 更少 |
| 安装大小 | 500MB | 32MB | 94% 更小 |
| 安全防护 | 3 层 | 16 层 | 企业级安全 |
| 通道支持 | 20+ | 40+ | 覆盖更广 |
| 自主能力 | 无 | 7 Hands | 从被动到主动 |
二、核心差异分析
2.1 协议差异
| 方面 | OpenClaw | OpenFang |
|---|---|---|
| WebSocket URL | ws://127.0.0.1:18789 |
ws://127.0.0.1:4200/ws |
| 协议格式 | 自定义 JSON 帧 | 标准 JSON + gRPC |
| 认证方式 | Ed25519 设备签名 | Ed25519 + JWT |
2.2 配置差异
| 方面 | OpenClaw | OpenFang |
|---|---|---|
| 配置目录 | ~/.openclaw/ |
~/.openfang/ |
| 配置格式 | YAML/JSON | TOML |
| 插件系统 | TypeScript (index.ts) |
SKILL.md + WASM |
2.3 API 差异
| 功能 | OpenClaw RPC | OpenFang API |
|---|---|---|
| 发送消息 | agent |
chat / /api/chat |
| 列出 Agent | zclaw.clones.list |
GET /api/agents |
| 获取配置 | config.get |
GET /api/config |
| 触发技能 | 插件系统 | skill_trigger |
| Hand 自动化 | ❌ 无 | hand_trigger |
| Workflow | ❌ 基础 | workflow_execute |
三、迁移策略:渐进式双轨
3.1 策略原则
- 双版本并行: 保持 OpenClaw 可用,同时开发 OpenFang
- 适配层抽象: 通过接口隔离后端差异
- 功能对等优先: 先保证核心功能,再添加新特性
- 灰度发布: Beta 测试验证后全面切换
3.2 迁移阶段
Phase 1 (2周): 基础设施 ──────────────────────────────────────────►
Phase 2 (2周): 客户端实现 ────────────────────────────────────────►
Phase 3 (2周): 状态迁移 ──────────────────────────────────────────►
Phase 4 (3周): 插件迁移 ──────────────────────────────────────────►
Phase 5 (2周): Tauri 后端 ────────────────────────────────────────►
Phase 6 (3周): UI 增强 ───────────────────────────────────────────►
Phase 7 (2周): 测试验证 ──────────────────────────────────────────►
────────────────────────────────────────────────────────────────────
总工期: 16 周 (约 4 个月)
四、详细实施计划
Phase 1: 基础设施 (Week 1-2)
目标: 建立迁移基础架构
关键任务:
- 创建
GatewayBackend接口抽象 - 创建
OpenFangClient骨架 - 配置双后端切换机制
- 设置 OpenFang 开发环境
交付物:
desktop/src/lib/types/gateway-backend.ts- 接口定义desktop/src/lib/openfang-client.ts- 客户端骨架desktop/src/lib/backend-factory.ts- 后端工厂
Phase 2: 客户端实现 (Week 3-4)
目标: 完整实现 OpenFang 客户端
关键文件: gateway-client.ts
修改内容:
// 1. 抽取接口
interface GatewayBackend {
connect(): Promise<void>;
disconnect(): void;
chat(message: string, opts?: ChatOptions): Promise<{runId: string}>;
onStream(callback: StreamCallback): () => void;
// ... 其他方法
}
// 2. OpenClaw 实现 (现有代码重构)
class OpenClawBackend implements GatewayBackend { ... }
// 3. OpenFang 实现 (新建)
class OpenFangBackend implements GatewayBackend {
private ws: WebSocket;
private url = 'ws://127.0.0.1:4200/ws';
async connect(): Promise<void> {
// OpenFang 认证协议
}
async chat(message: string, opts?: ChatOptions): Promise<{runId: string}> {
// OpenFang chat 格式
}
}
Phase 3: 状态迁移 (Week 5-6)
目标: 更新状态管理层支持双后端
关键文件: gatewayStore.ts
修改内容:
interface GatewayStore {
// 新增
backendType: 'openclaw' | 'openfang';
switchBackend(type: 'openclaw' | 'openfang'): void;
// 修改 connect 方法
connect: async (url?, token?) => {
const backend = getBackendFactory().create(get().backendType);
await backend.connect(url, token);
}
}
Phase 4: 插件迁移 (Week 7-9)
目标: 迁移现有插件到 OpenFang 格式
| 插件 | 当前格式 | 目标格式 | 复杂度 |
|---|---|---|---|
zclaw-chinese-models |
TypeScript | TOML 配置 | 中 |
zclaw-feishu |
TypeScript | Rust/WASM | 高 |
zclaw-ui |
TypeScript RPC | REST API | 高 |
迁移方案:
plugins/
├── zclaw-chinese-models/
│ ├── openclaw.plugin.json → 删除
│ └── index.ts → 转换为 providers.toml
│
├── zclaw-feishu/
│ └── index.ts → 迁移到 OpenFang channels
│
└── zclaw-ui/
└── index.ts → 拆分为 REST 端点
Phase 5: Tauri 后端 (Week 10-11)
目标: 更新 Rust 后端支持 OpenFang
关键文件: lib.rs
修改内容:
// 新增 OpenFang 命令
#[tauri::command]
async fn openfang_status() -> Result<OpenFangStatus, String> { ... }
#[tauri::command]
async fn openfang_start() -> Result<(), String> { ... }
#[tauri::command]
async fn openfang_stop() -> Result<(), String> { ... }
// 新增配置迁移命令
#[tauri::command]
async fn migrate_to_openfang() -> Result<MigrationResult, String> { ... }
Phase 6: UI 增强 (Week 12-14)
目标: 添加 OpenFang 特有的 UI 功能
新增组件:
HandsPanel.tsx- Hands 管理界面WorkflowEditor.tsx- 工作流编辑器TriggerManager.tsx- 触发器管理AuditLogs.tsx- 审计日志查看
修改组件:
SettingsLayout.tsx- 添加后端切换选项General.tsx- 添加 OpenFang 配置项
Phase 7: 测试验证 (Week 15-16)
目标: 全面测试和验证
测试范围:
- 单元测试: 新客户端、适配层
- 集成测试: 端到端消息流
- 性能测试: 启动时间、内存占用
- 迁移测试: 配置迁移正确性
五、风险评估与缓解
5.1 技术风险
| 风险 | 级别 | 缓解措施 |
|---|---|---|
| 协议不兼容 | 高 | 创建适配层,保持双后端 |
| 插件迁移复杂 | 高 | 分阶段迁移,保持 TypeScript 桥接 |
| OpenFang 不成熟 | 中 | 持续关注上游,建立社区联系 |
| 配置格式差异 | 中 | 构建自动迁移工具 |
5.2 运营风险
| 风险 | 级别 | 缓解措施 |
|---|---|---|
| 用户困惑 | 中 | 清晰文档,渐进发布 |
| 数据丢失 | 高 | 自动备份,非破坏性迁移 |
| 支持负担 | 中 | FAQ,故障排除指南 |
5.3 回滚策略
// 环境变量切换
const USE_OPENFANG = process.env.ZCLAW_USE_OPENFANG === 'true';
// localStorage 切换
const backendType = localStorage.getItem('zclaw-backend') || 'openclaw';
// 一键回滚
function rollbackToOpenClaw() {
localStorage.setItem('zclaw-backend', 'openclaw');
window.location.reload();
}
六、验证方案
6.1 功能验证清单
核心功能:
- WebSocket 连接和认证
- 消息发送和流式接收
- Agent/Clone CRUD 操作
- 频道管理 (飞书)
- 技能加载和执行
- 使用统计
- 配置管理
OpenFang 新特性:
- Hand 触发 (Clip, Lead, Researcher 等)
- Workflow 执行
- 16 层安全验证
- 审计日志访问
6.2 性能基准
| 指标 | OpenClaw 基线 | OpenFang 目标 |
|---|---|---|
| 冷启动 | 5.98s | < 500ms |
| 空闲内存 | 394MB | < 100MB |
| 聊天延迟 | 100ms | < 50ms |
| 安装大小 | 500MB | < 100MB |
七、关键文件清单
| 文件 | 修改类型 | 说明 |
|---|---|---|
| gateway-client.ts | 重构 | 抽取接口,创建 OpenFang 实现 |
| gatewayStore.ts | 修改 | 添加后端切换逻辑 |
| chatStore.ts | 修改 | 适配新事件格式 |
| lib.rs | 扩展 | 添加 OpenFang 管理命令 |
| zclaw-ui/index.ts | 迁移 | 转换为 REST API |
| zclaw-chinese-models/index.ts | 迁移 | 转换为 TOML 配置 |
| zclaw-feishu/index.ts | 迁移 | 使用 OpenFang channel |
八、时间线总结
| 阶段 | 周期 | 开始 | 结束 | 关键交付物 |
|---|---|---|---|---|
| Phase 1 | 2周 | Week 1 | Week 2 | OpenFangClient 骨架 |
| Phase 2 | 2周 | Week 3 | Week 4 | 完整客户端 + 流式处理 |
| Phase 3 | 2周 | Week 5 | Week 6 | 更新后的 stores |
| Phase 4 | 3周 | Week 7 | Week 9 | 迁移后的插件 |
| Phase 5 | 2周 | Week 10 | Week 11 | Rust OpenFang 支持 |
| Phase 6 | 3周 | Week 12 | Week 14 | Hands/Workflow UI |
| Phase 7 | 2周 | Week 15 | Week 16 | 测试套件,验证报告 |
总工期: 16 周 (约 4 个月)
九、结论与建议
9.1 核心价值
┌─────────────────────────────────────────────────────────────────┐
│ │
│ 🚀 性能:33x 启动速度 + 90% 内存节省 │
│ │
│ 🔒 安全:16 层纵深防御 + 金融级合规 │
│ │
│ 🤖 智能:Hands 自主系统 + Workflow 引擎 │
│ │
│ 📈 商业:企业市场拓展 + 定价提升空间 │
│ │
│ ⚠️ 成本:16 周 (4个月) 迁移周期 │
│ │
└─────────────────────────────────────────────────────────────────┘
9.2 决策建议
| 目标 | 建议 |
|---|---|
| 追求企业市场 | ✅ 强烈建议迁移 |
| 追求差异化竞争 | ✅ 建议迁移 |
| 目标是内容创作者/销售 | ✅ 强烈建议迁移 |
| 资源有限 | ⚠️ 渐进评估 |
| 追求快速迭代 | ⚠️ 保持 OpenClaw,关注 OpenFang |
9.3 下一步行动
- 立即: 确认迁移决策,分配资源
- Week 1: 创建
GatewayBackend接口 - Week 2: 搭建 OpenFang 开发环境
- Week 3-4: 实现
OpenFangClient
规划日期: 2026-03-13 版本: v1.0