361 lines
15 KiB
Markdown
361 lines
15 KiB
Markdown
# NetaClaw 电商浏览器自动化平台设计文档
|
||
|
||
> **日期**: 2026-04-11
|
||
> **状态**: 设计阶段
|
||
> **范围**: Neta-monorepo 架构转型 — 从保险审核 AI 平台转为电商浏览器自动化运营平台
|
||
|
||
---
|
||
|
||
## 1. 项目定位
|
||
|
||
Neta 电商浏览器自动化运营平台,基于 OpenClaw Agent 架构(命名为 NetaClaw),结合 Playwright 浏览器自动化,实现电商平台的智能化运营操作(商品管理、订单处理、竞品监控、营销投流、文生图等)。
|
||
|
||
## 2. 核心决策
|
||
|
||
| 决策项 | 结论 | 理由 |
|
||
|--------|------|------|
|
||
| Agent 引擎 | NetaClaw(迁移自 OpenClaw) | 微内核+插件化,Skill 懒加载,比 LangChain 更适合工具驱动场景 |
|
||
| LangChain | 完全移除 | 不符合最终需求,OpenClaw 的 ReAct 循环更直接 |
|
||
| 浏览器自动化 | Playwright | 模拟真人操作,Node.js 生态最成熟,反检测插件丰富 |
|
||
| 架构模式 | 纯 B/S(去掉 Tauri) | 后端本地运行可直接操作文件系统,无需 Tauri IPC |
|
||
| 业务框架 | Midway.js(保留) | CRUD、TypeORM、权限系统继续使用 |
|
||
| 前端 | Vue 3 + Element Plus(保留) | 改造 UI 适配电商运营场景 |
|
||
| 桌面体验 | pkg 打包 .exe + NSIS 安装包 | 非技术用户双击启动,系统托盘图标 |
|
||
| 现有 Skill | 全部清理重建 | 旧 Skill 面向保险审核,与电商无关 |
|
||
| 目标平台 | 淘宝/天猫、拼多多、京东、抖音/快手 | 四大电商平台全覆盖 |
|
||
| 数据存储 | 本地文件 + MySQL + SQLite | 对话/图片存本地,业务数据存 MySQL,会话检查点存 SQLite |
|
||
|
||
## 3. 系统架构
|
||
|
||
```
|
||
┌─ 云端服务器 ─────────────────────────────────┐
|
||
│ 用户认证 / License 验证 / 共享配置 / 模型API代理 │
|
||
└──────────────────────┬───────────────────────┘
|
||
│ HTTPS
|
||
┌──────────────────────┴───────────────────────┐
|
||
│ 用户本地 (Neta.exe) │
|
||
│ │
|
||
│ ┌─── Vue 3 前端 (localhost:9001) ─────────┐ │
|
||
│ │ 操作面板 │ 任务监控 │ Agent对话 │ 数据看板 │ │
|
||
│ └────────────────┬────────────────────────┘ │
|
||
│ │ HTTP / WebSocket │
|
||
│ ┌────────────────┴────────────────────────┐ │
|
||
│ │ Midway.js 后端 (localhost:8003) │ │
|
||
│ │ │ │
|
||
│ │ ┌── NetaClaw Agent Engine ───────────┐ │ │
|
||
│ │ │ Gateway (WS) → Runtime (ReAct) │ │ │
|
||
│ │ │ → Tools → Plugins → Subagents │ │ │
|
||
│ │ └──────────────┬─────────────────────┘ │ │
|
||
│ │ │ │ │
|
||
│ │ ┌──────────────┴─────────────────────┐ │ │
|
||
│ │ │ Playwright Engine │ │ │
|
||
│ │ │ 反检测 │ 多店铺并发 │ 平台适配 │ │ │
|
||
│ │ └────────────────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ │ ┌─ Skills (SKILL.md) ────────────────┐ │ │
|
||
│ │ │ 商品管理│订单处理│竞品监控│营销投流 │ │ │
|
||
│ │ └────────────────────────────────────┘ │ │
|
||
│ │ │ │
|
||
│ │ ┌─ 存储 ─────────────────────────────┐ │ │
|
||
│ │ │ 本地文件 │ MySQL │ SQLite │ │ │
|
||
│ │ └────────────────────────────────────┘ │ │
|
||
│ └──────────────────────────────────────────┘ │
|
||
│ │
|
||
│ ┌─ 系统托盘 ─────────────────────────────┐ │
|
||
│ │ 状态指示 │ 打开面板 │ 设置 │ 退出 │ │
|
||
│ └─────────────────────────────────────────┘ │
|
||
└───────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 4. Monorepo 结构重组
|
||
|
||
### 移除
|
||
- `packages/desktop/` — 整个 Tauri 桌面端
|
||
- `packages/skills/` — 旧的 Python/Node skill 目录
|
||
- `packages/backend/src/modules/agent/` — 旧的 LangChain Agent 模块
|
||
- 所有 `@langchain/*` 依赖
|
||
|
||
### 保留
|
||
- `packages/backend/` — Midway.js 后端(base/dict/task/user/notification 等模块)
|
||
- `packages/frontend/` — Vue 3 前端(改造 UI)
|
||
- `packages/shared/` — 共享类型
|
||
|
||
### 新增
|
||
```
|
||
packages/
|
||
├── backend/
|
||
│ └── src/modules/
|
||
│ ├── netaclaw/ # ★ NetaClaw Agent 引擎(从 OpenClaw 迁移)
|
||
│ └── ... (保留的业务模块)
|
||
├── frontend/ # 改造 UI
|
||
├── shared/ # 共享类型
|
||
├── skills/ # ★ 电商 Skill 文档(SKILL.md 格式)
|
||
└── scripts/
|
||
├── build.ts # ★ pkg 打包脚本
|
||
└── installer/ # ★ NSIS 安装包配置
|
||
```
|
||
|
||
## 5. NetaClaw 模块设计
|
||
|
||
### 5.1 OpenClaw → NetaClaw 迁移映射
|
||
|
||
| OpenClaw 源码路径 | NetaClaw 目标路径 | 迁移策略 |
|
||
|-------------------|-------------------|----------|
|
||
| `src/gateway/server.impl.ts` | `netaclaw/gateway/server.ts` | 精简迁移,去掉 Channel 路由,保留 WS + 会话管理 |
|
||
| `src/gateway/session-utils.ts` | `netaclaw/gateway/session.ts` | 迁移会话 CRUD 和历史管理 |
|
||
| `src/gateway/net.ts` | `netaclaw/gateway/ws.ts` | 迁移 WebSocket 服务器 |
|
||
| `src/agents/pi-embedded-runner/` | `netaclaw/runtime/` | 核心迁移,保留 ReAct 循环、工具执行、模型调用 |
|
||
| `src/agents/pi-tools.ts` | `netaclaw/tools/common.ts` | 迁移 AgentTool 接口 + TypeBox Schema |
|
||
| `src/agents/bash-tools.ts` | `netaclaw/tools/builtin/bash.ts` | 迁移命令执行工具 |
|
||
| `src/agents/acp-spawn.ts` | `netaclaw/runtime/subagent.ts` | 迁移子代理生成(多店铺并行) |
|
||
| `src/agents/model-selection.ts` | `netaclaw/runtime/model_selection.ts` | 迁移模型选择与故障转移 |
|
||
| `src/agents/tool-policy.ts` | `netaclaw/tools/policy.ts` | 迁移工具访问控制 |
|
||
| `extensions/browser/` | `netaclaw/browser/` | 核心迁移,新增反检测和电商适配 |
|
||
| `src/plugin-sdk/` | `netaclaw/plugins/` | 精简迁移,保留工具工厂和钩子 |
|
||
| `src/config/` | 不迁移 | 使用 Midway.js 配置体系 |
|
||
| `src/channels/` | 不迁移 | 电商场景不需要 IM 渠道 |
|
||
| `skills/` | 不迁移内容 | 保留 SKILL.md 格式,内容全部替换 |
|
||
|
||
### 5.2 NetaClaw 目录结构
|
||
|
||
```
|
||
packages/backend/src/modules/netaclaw/
|
||
├── gateway/ # WebSocket Gateway
|
||
│ ├── server.ts # WS 服务器(精简版)
|
||
│ ├── session.ts # 会话管理
|
||
│ └── protocol.ts # 消息协议定义
|
||
│
|
||
├── runtime/ # Agent 运行时
|
||
│ ├── agent.ts # Agent 核心循环(ReAct loop)
|
||
│ ├── attempt.ts # 单次执行尝试
|
||
│ ├── model_selection.ts # 模型选择与故障转移
|
||
│ ├── subagent.ts # 子代理生成
|
||
│ └── thinking.ts # 思考级别控制
|
||
│
|
||
├── tools/ # 工具系统
|
||
│ ├── common.ts # AgentTool 接口 + TypeBox Schema
|
||
│ ├── policy.ts # 工具访问控制
|
||
│ ├── builtin/ # 内置工具
|
||
│ │ ├── bash.ts # 命令执行
|
||
│ │ ├── file.ts # 文件读写
|
||
│ │ └── web_search.ts # 网页搜索
|
||
│ ├── browser/ # 浏览器工具(迁移自 extensions/browser/)
|
||
│ │ ├── pw_tools_core.ts # Playwright 核心
|
||
│ │ ├── interactions.ts # 点击/输入/滚动
|
||
│ │ ├── snapshot.ts # 页面快照
|
||
│ │ └── stealth.ts # 反检测配置
|
||
│ └── ecommerce/ # 电商专用工具
|
||
│ ├── product.ts # 商品操作(上架/下架/改价)
|
||
│ ├── order.ts # 订单操作
|
||
│ └── data_collect.ts # 数据采集
|
||
│
|
||
├── plugins/ # 插件系统
|
||
│ ├── plugin_entry.ts # 插件定义接口
|
||
│ ├── plugin_api.ts # 插件 API
|
||
│ └── llm_providers/ # LLM 提供商
|
||
│ ├── openai.ts
|
||
│ ├── anthropic.ts
|
||
│ └── deepseek.ts
|
||
│
|
||
├── platforms/ # 电商平台适配层
|
||
│ ├── base_platform.ts # 平台基类(登录/反检测/选择器)
|
||
│ ├── taobao/ # 淘宝/天猫
|
||
│ │ ├── login.ts
|
||
│ │ ├── selectors.ts
|
||
│ │ └── actions.ts
|
||
│ ├── pdd/ # 拼多多
|
||
│ ├── jd/ # 京东
|
||
│ └── douyin/ # 抖音
|
||
│
|
||
├── config.ts # NetaClaw 配置(接入 Midway config)
|
||
└── module.ts # Midway.js 模块注册
|
||
```
|
||
|
||
### 5.3 核心接口设计
|
||
|
||
#### AgentTool 接口(迁移自 OpenClaw)
|
||
|
||
```typescript
|
||
import { Type, TSchema } from '@sinclair/typebox';
|
||
|
||
export type AgentTool<TParams extends TSchema, TResult> = {
|
||
name: string;
|
||
label: string;
|
||
description: string;
|
||
parameters: TParams;
|
||
execute(id: string, params: Static<TParams>): Promise<TResult>;
|
||
};
|
||
|
||
export type AgentToolWithMeta<TParams extends TSchema, TResult> =
|
||
AgentTool<TParams, TResult> & {
|
||
ownerOnly?: boolean;
|
||
displaySummary?: string;
|
||
};
|
||
```
|
||
|
||
#### Skill 格式(SKILL.md)
|
||
|
||
```yaml
|
||
---
|
||
name: product-listing
|
||
description: 电商平台商品上架自动化
|
||
metadata:
|
||
netaclaw:
|
||
platforms: [taobao, pdd, jd, douyin]
|
||
requires: { tools: [browser, file] }
|
||
---
|
||
|
||
# 商品上架 Skill
|
||
|
||
## 触发条件
|
||
用户要求上架商品、批量上架、商品发布
|
||
|
||
## 工作流程
|
||
1. 确认目标平台和商品信息
|
||
2. 打开平台卖家后台
|
||
3. 导航到商品发布页面
|
||
4. 填写商品信息(标题、价格、库存、描述)
|
||
5. 上传商品图片
|
||
6. 提交并确认发布状态
|
||
|
||
## 规则约束
|
||
- 操作前必须确认已登录目标平台
|
||
- 价格修改需要用户二次确认
|
||
- 批量操作间隔随机 3-8 秒,模拟人工节奏
|
||
```
|
||
|
||
#### 平台适配器基类
|
||
|
||
```typescript
|
||
export abstract class BasePlatform {
|
||
abstract name: string;
|
||
abstract loginUrl: string;
|
||
|
||
abstract login(page: Page, credentials: Credentials): Promise<void>;
|
||
abstract isLoggedIn(page: Page): Promise<boolean>;
|
||
abstract getSelectors(): PlatformSelectors;
|
||
|
||
// 反检测配置
|
||
getStealthConfig(): StealthConfig {
|
||
return { humanDelay: [100, 300], randomMouseMove: true };
|
||
}
|
||
}
|
||
```
|
||
|
||
## 6. Playwright 浏览器引擎
|
||
|
||
### 6.1 反检测策略
|
||
|
||
| 策略 | 实现方式 |
|
||
|------|----------|
|
||
| 指纹伪装 | playwright-extra + stealth plugin |
|
||
| 人工延迟 | 随机间隔 100-500ms,高斯分布 |
|
||
| 鼠标轨迹 | 贝塞尔曲线模拟真人移动 |
|
||
| 键盘输入 | 逐字输入,随机打字速度 |
|
||
| 浏览器指纹 | 使用用户已安装的 Chrome(`channel: 'chrome'`) |
|
||
| WebDriver 标志 | 移除 `navigator.webdriver` 等自动化特征 |
|
||
| 行为模式 | 随机滚动、页面停留、Tab 切换 |
|
||
|
||
### 6.2 多店铺并发
|
||
|
||
```typescript
|
||
// 浏览器实例池
|
||
export class BrowserPool {
|
||
private contexts: Map<string, BrowserContext> = new Map();
|
||
|
||
// 每个店铺一个独立的 BrowserContext(隔离 Cookie/Storage)
|
||
async getContext(shopId: string): Promise<BrowserContext>;
|
||
|
||
// 并发控制(信号量,默认 max=3)
|
||
async executeWithLimit<T>(shopId: string, fn: (page: Page) => Promise<T>): Promise<T>;
|
||
}
|
||
```
|
||
|
||
## 7. 数据存储
|
||
|
||
| 数据类型 | 存储位置 | 说明 |
|
||
|----------|----------|------|
|
||
| Agent 对话记录 | 本地文件 (`~/.neta/sessions/`) | 默认本地,用户可选同步到 MySQL |
|
||
| 生成的图片 | 本地文件 (`~/.neta/workspace/`) | 文生图等产出物 |
|
||
| 业务数据 | MySQL (`neta_ecommerce`) | 店铺配置、任务记录、操作日志 |
|
||
| 会话检查点 | SQLite (`~/.neta/checkpoints.sqlite`) | Agent 会话持久化 |
|
||
| 浏览器状态 | 本地文件 (`~/.neta/browser/`) | Cookie、Storage、登录态 |
|
||
|
||
## 8. 打包与分发
|
||
|
||
### 8.1 pkg 打包
|
||
|
||
```bash
|
||
# 构建
|
||
pnpm build
|
||
|
||
# 打包为 .exe
|
||
pkg dist/bootstrap.js \
|
||
--targets node20-win-x64 \
|
||
--output Neta.exe \
|
||
--assets "skills/**/*"
|
||
```
|
||
|
||
### 8.2 启动流程
|
||
|
||
```
|
||
Neta.exe 双击启动
|
||
→ 启动 Midway.js 后端 (localhost:8003)
|
||
→ 启动系统托盘图标
|
||
→ 自动打开默认浏览器到 localhost:9001
|
||
→ 前端加载,连接后端 WebSocket
|
||
→ 用户开始使用
|
||
```
|
||
|
||
### 8.3 NSIS 安装包
|
||
|
||
- 安装 Neta.exe 到 Program Files
|
||
- 创建桌面快捷方式和开始菜单项
|
||
- 捆绑 Playwright Chromium(可选,或首次启动时下载)
|
||
- 注册开机自启(可选)
|
||
|
||
## 9. 电商 Skill 清单(首批)
|
||
|
||
| Skill | 描述 | 目标平台 |
|
||
|-------|------|----------|
|
||
| `product-listing` | 商品上架(单个/批量) | 全平台 |
|
||
| `product-delist` | 商品下架 | 全平台 |
|
||
| `price-update` | 价格修改 | 全平台 |
|
||
| `inventory-sync` | 库存同步 | 全平台 |
|
||
| `order-process` | 订单处理(发货/备注) | 全平台 |
|
||
| `customer-reply` | 客服自动回复 | 全平台 |
|
||
| `competitor-monitor` | 竞品价格/销量监控 | 全平台 |
|
||
| `ad-campaign` | 直通车/推广投流 | 淘宝/拼多多 |
|
||
| `image-gen` | 产品详情页文生图 | 不限平台 |
|
||
| `data-export` | 运营数据导出 | 全平台 |
|
||
|
||
## 10. 需要移除的依赖
|
||
|
||
```
|
||
@langchain/classic
|
||
@langchain/cohere
|
||
@langchain/community
|
||
@langchain/core
|
||
@langchain/deepseek
|
||
@langchain/langgraph
|
||
@langchain/langgraph-checkpoint
|
||
@langchain/mcp-adapters
|
||
@langchain/ollama
|
||
@langchain/openai
|
||
@langchain/textsplitters
|
||
langchain
|
||
```
|
||
|
||
## 11. 需要新增的依赖
|
||
|
||
```
|
||
playwright-core # 浏览器自动化
|
||
playwright-extra # 反检测插件框架
|
||
puppeteer-extra-plugin-stealth # 反检测插件(兼容 playwright-extra)
|
||
@sinclair/typebox # JSON Schema(AgentTool 参数定义)
|
||
@anthropic-ai/sdk # Anthropic Claude API
|
||
node-systray # 系统托盘图标
|
||
open # 自动打开浏览器
|
||
pkg # 打包为 .exe(devDependency)
|
||
```
|