在线客服系统方案 Per-biz OpenClaw × Cloudflare edge · 版本 3.0 · 2026-04-24

多业务通用 每 biz 独立 OpenClaw workspace OpenClaw 承担全工作流 Cloudflare 薄边缘壳 Phase 1 首业务 5 周

v3.0 一句话目标:每个业务(ytk / bizN)各自拥有一套独立训练的 OpenClaw workspace(Agent + Skills + Memory + Sessions + Channels 全独立)。OpenClaw 承担完整客服工作流:首轮接待 / RAG / 情绪 / 升级判断 / 订单查询 / VIP 校验 / 审批流 / 多渠道路由。Cloudflare 只做边缘接入与前端托管(Pages + Workers + 一个薄 DO 做 WS 终结 + 一张精简 D1 存管理台 CRUD)。
v2.0 → v3.0 关键变化:
  • v2.0 是「单一 OpenClaw workspace + biz 字段隔离 + Cloudflare 做业务层(SessionDO 做状态机、Queue 做事件、KV 做路由规则)」。
  • v3.0 业务逻辑全部下沉到 OpenClaw Agent 的提示词 / Skills / Approvals 中;每业务一套独立 workspace,各自训练、各自迭代、不互相影响。Cloudflare 侧基本是一层 TLS + 鉴权 + WS 转发,代码量从 ~6000 行降到 ~1500 行。
  • 这样做的好处:① 业务增长不会污染 Agent 语料;② 训练可以按 biz 独立节奏(ytk 可能已经 Phase 2,bizN 还在 Phase 1);③ 核心业务决策在可版本化的 SOUL.md / skills/ 里,写提示词就是写业务;④ 后期可以把某个 biz 的 workspace 整体迁到独立机器而无需动其他业务。

0. v3.0 重大调整(相对 v2.0)

0.1 架构定位转变

维度v2.0 CF-nativev3.0 Per-biz OpenClaw
OpenClaw 实例数1 个 workspace,biz 字段隔离N 个 workspace,每 biz 一个目录 + 独立 Agent
业务工作流实现SessionDO 状态机 + KV 路由规则 + Queue 事件OpenClaw Agent SOUL.md + Skills(Agent 内部决策)
RAG 向量检索Cloudflare VectorizeOpenClaw Memory 原生语义检索
业务 API 调用Worker 内硬编码 + QueueOpenClaw Skills / MCP(订单、VIP、房间)
会话 / 消息持久化D1 cs_sessions / cs_messagesOpenClaw Sessions(D1 只留指针 + 业务标签)
升级规则KV JSON 配置 + Worker 执行Agent SOUL.md 决策树 + Approvals 触发
人审 AI 草稿自建 approval 状态OpenClaw Approvals 原生
多渠道仅自建 Web widget每 biz workspace 独立开 Telegram / WhatsApp / Discord channels
Cloudflare 用途完整业务后端薄边缘壳(Pages / Workers / 1 个 DO / 精简 D1 / R2 / Access / Turnstile / Tunnel / Email Routing)
首业务 Phase 1 工期6 周5 周(业务逻辑写提示词比写代码快)
新业务接入配置 biz + FAQ 导入,约 2 人日fork workspace 模板 + 训练 SOUL.md + 灌语料,约 3~5 人日(含训练时间)

0.2 为什么这样改

✓ 训练独立,语料纯净

一同看的「VIP 权益」和 BizN 的「课程退费」决策逻辑完全不同,放一个 Agent 里训练会互相干扰。分 workspace 后每个 biz 的 Memory / few-shot 都是自己的业务语料,训练质量显著高。

✓ 业务逻辑 = 可版本化的文本

升级规则、话术、业务决策不再是散落在 Worker 代码 + KV JSON + routing.yaml 的状态,全部写到 SOUL.md 里,git diff 就能看业务演进。非技术运营也能贡献。

✓ OpenClaw 的原生能力被充分利用

Approvals / Memory / Sessions / Channels / Skills / MCP 这些是 OpenClaw 设计初衷就有的;v2.0 在 CF 侧造了很多轮子,v3.0 回归 OpenClaw 生态,代码量和出 bug 面都大幅降低。

✓ 多业务隔离天然,放权灵活

BizN 上线时只需 fork 一份 workspace 模板、填自己的 SOP、接自己的业务 API skills,零代码。业务方的客服主管可以直接改 SOUL.md 灰度上线话术。


1. 方案概览

1.1 为什么现在做

1.2 核心思路(三条)

P1Per-biz 独立训练

每 biz 一套 workspace,Agent 用本业务语料迭代;ytk 成熟后,BizN 可单独继续 Phase 1,不受影响。

P0OpenClaw 全流程

客服决策全写在 SOUL.md + skills/,Cloudflare 只是边缘接入;新增业务逻辑 = 改 .md 而不是改代码。

P2灰度切换

Phase 1 混合(AI + Approvals 人工审批),Phase 2 全 AI;每业务独立达标独立切换,不一刀切。

1.3 范围边界

  • 文字 + 图片 + 附件客服;多渠道(Web Widget / Telegram / WhatsApp / Discord)
  • 不做电话 / 视频客服
  • 不做独立工单系统(高难度诉求由 Agent 通过 skill 推送到飞书 / Slack / 邮箱)
  • 不做独立账号体系:沿用主站 user_id 或游客 visitor_id
  • 不做自研大模型:OpenClaw 作为唯一 AI 引擎;Agent 提供方优先 Anthropic Claude 4.6 / Opus 4.7 + OpenAI Codex 备

2. 目标与阶段

2.1 Phase 1(首业务 5 周,每新增 biz 3~5 人日)

目标可量化指标验收
客服入口上线(per biz)主站浮窗 + App 内入口灰度 10% 可见
AI 首答P95 ≤ 3s1000 条会话抽样
Approvals 人工兜底升级触发 ≤ 30s 接入后台看板
数据沉淀(per biz)≥ 3000 条有标签对话每周 OpenClaw sessions 导出
Agent 语料覆盖TOP 30 问题写入 skills/faq/灰度期间迭代

2.2 Phase 2(per-biz 独立门禁)

目标硬指标不达标则不切
AI 自助解决率≥ 75%继续 P1 补语料
👎 差评率≤ 3%超标回滚混合
敏感话题兜底100%一次漏判熔断
人工保留1 质检 + 1 兜底角色转型
per-biz 阶段独立:ytk workspace 可能已经 Phase 2 全 AI,而 bizN workspace 还在 Phase 1 人审阶段,两者互不影响。管理后台「workspace 总览」逐个 biz 展示阶段状态。

3. 总体架构(v3.0 per-biz OpenClaw)

3.1 逻辑分层

┌───────────────────── 接入层 (CF Pages / Workers) ──────────────────────┐ │ Web Widget Android WebView 管理后台 (Access + TOTP) │ │ (cs-widget) (cs-console) │ └──────────┬───────────────────┬───────────────────┬─────────────────────┘ │ WSS/REST │ WebView │ HTTPS ▼ ▼ ▼ ┌───────────────── Cloudflare 薄边缘(仅做 TLS / 鉴权 / 桥接)──────────┐ │ cs-api Worker │ │ · 鉴权(主站 JWT / Access JWT / Turnstile) │ │ · biz 路由(URL 或 header 决定打到哪个 workspace tunnel) │ │ · WS 终结在 BridgeDO(薄 Durable Object,只转发不带业务状态) │ │ Persistence(精简) │ │ · D1 (ytk-cs-db) FAQ 草稿 / 坐席档案 / 训练标注 / 审计 / workspace │ │ · R2 (cs-assets) 附件 / 训练导出 / 备份 / 日志 │ │ · Access / Turnstile / Email Routing / Logpush / AE │ └─────┬──────────────┬──────────────┬──────────────┬─────────────────────┘ │ Tunnel │ Tunnel │ Tunnel │ Tunnel │ ytk.* │ bizN.* │ bizX.* │ ... ▼ ▼ ▼ ▼ ┌────────────── OpenClaw Workspaces(每 biz 一个,独立训练)────────────┐ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │ ytk workspace │ │ bizN workspace │ │ bizX workspace │… │ │ │ IDENTITY.md │ │ IDENTITY.md │ │ ... │ │ │ │ SOUL.md (业务 SOP)│ │ SOUL.md │ │ │ │ │ │ AGENTS.md │ │ AGENTS.md │ │ │ │ │ │ skills/ │ │ skills/ │ │ │ │ │ │ · faq/ │ │ · lesson/ │ │ │ │ │ │ · orders/ │ │ · refund/ │ │ │ │ │ │ · vip/ │ │ · ... │ │ │ │ │ │ memory/ (向量) │ │ memory/ │ │ │ │ │ │ sessions/ │ │ sessions/ │ │ │ │ │ │ approvals (原生) │ │ approvals │ │ │ │ │ │ channels: │ │ channels: │ │ │ │ │ │ · web-bridge │ │ · web-bridge │ │ │ │ │ │ · telegram │ │ · whatsapp │ │ │ │ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ │ 所有 workspace 共享同一 OpenClaw Gateway 进程(端口 18789), │ │ 通过 --workspace 参数切换;或未来按业务独立 Gateway 实例 │ └────────────────────────────────────────────────────────────────────────┘

3.2 关键组件

组件职责产品 / 位置
cs-widgetWeb/H5 浮窗Pages cs.yitongcs.com
cs-console坐席 + 管理后台(含 Workspace 管理)Pages cs-console.yitongcs.com + Access
cs-api Worker鉴权 / biz 路由 / RESTWorkers
BridgeDOWidget WS 终结 + ACP client(无业务状态)Durable Object(单 class,instance key = session_uuid)
AgentPresenceDO坐席在线 / 抢单(仍需要,因为跨 biz)Durable Object(instance key = biz)
D1 ytk-cs-dbFAQ 草稿 + 坐席 + 训练标注 + 审计 + workspace 元数据Cloudflare D1
R2 cs-assets附件 / 训练导出 / 备份 / 日志Cloudflare R2
Access / Turnstile / Email Routing / AE / LogpushSSO / 防刷 / 告警 / 指标 / 日志Cloudflare
OpenClaw workspace × N每 biz 一套:Agent / Skills / Memory / Sessions / Approvals / Channels/opt/openclaw/workspaces/{biz}/
OpenClaw Gateway统一入口,--workspace 参数切换127.0.0.1:18789
Cloudflare Tunnel每 biz 一条 ingress 规则:ytk-cs.int.yitongcs.com / bizN-cs.int.yitongcs.comcloudflared on 69.30.251.10

3.3 与 v2.0 的代码量对比

模块v2.0 代码量v3.0 代码量说明
Worker 业务逻辑~3500 行~800 行升级规则 / 路由 / 熔断 全部下沉到 Agent SOUL.md
Durable Objects~1500 行(SessionDO + AgentPresenceDO)~400 行(BridgeDO 薄转发 + AgentPresenceDO)会话状态机归 OpenClaw Sessions
D1 表数量65(去掉 sessions/messages)会话 / 消息 → OpenClaw Sessions API 查
向量库Vectorize(独立服务)—(OpenClaw Memory 原生)少一个服务
Queue consumer~600 行~200 行事件流由 OpenClaw 原生触发
Agent 提示词 / Skill单一 SOUL.mdN 套 SOUL.md + N 套 skills/(业务提示词指数增长)训练成果
总代码~6000 行 TS~1500 行 TS + N 份 .md / skill 脚本-75%

4. OpenClaw Workspace 规范(per-biz)

4.1 目录结构(每业务一套)

/opt/openclaw/workspaces/ytk/
├── IDENTITY.md             # 我是谁(一同看官方客服)
├── SOUL.md                 # 语气 + 决策树 + 升级规则 + 何时启动哪个 workflow
├── AGENTS.md               # 可调用的 skills / workflows / channels 白名单
├── skills/                 # 原子能力(单次调用)
│   ├── faq/                #   FAQ 条目(Memory 自动嵌入)
│   │   ├── index.md
│   │   └── entries/
│   ├── orders/query.ts     #   查订单(调业务 API)
│   ├── account/lookup.ts   #   查账户信息
│   ├── vip/check.ts        #   VIP 权益
│   ├── domain/backup.ts    #   查备用域名
│   ├── tickets/create.ts   #   建工单
│   └── escalate/notify.ts  #   转人工通知
├── workflows/              # ★ 多步有序流程(状态机)
│   ├── refund.yaml         #   退款流程
│   ├── account-query.yaml  #   账户查询
│   ├── complaint.yaml      #   投诉处理
│   └── _runtime/           #   每 session 的流程状态(OpenClaw 管理)
├── integrations/           # ★ 声明式业务 API 对接
│   ├── ytk-api.yaml        #   一同看主站 API(订单/用户/房间)
│   ├── ticket-system.yaml  #   工单系统 API
│   └── dns-admin.yaml      #   备用域名管理 API
├── memory/                 # OpenClaw 自动维护向量 + 记忆
├── sessions/               # OpenClaw 自动维护的会话持久化
├── approvals/              # Approvals 配置 + 待审队列
├── channels.yaml           # 本 workspace 开启哪些 channels
├── tests/
│   ├── soul.test.yaml      # Agent 行为断言
│   └── flows/              # 每个 workflow 的端到端回放测试
├── training/
│   ├── few-shot.json
│   └── exports/
└── .git/                   # 整个 workspace 版本化(workflow/integration 改动走 PR)

4.2 workspace git 版本化

每个 workspace 是一个独立 git 仓库,推到 github.com/yitongkan/openclaw-ws-{biz} 私有仓。改 SOUL.md / 增 FAQ / 改 skill 都走 PR,上线前灰度。

4.3 workspace 生命周期

阶段状态触发条件
bootstrappedfork 自模板 openclaw-ws-template,仅填了 IDENTITY新 biz 首次创建
training灌入首批 FAQ + 业务 API,有内部员工在 Telegram 内测SOP 草稿完成
phase-1开放生产流量,Approvals 人工审核内测通过
phase-2-ready指标达标,等双签4 周指标达标
phase-2全 AI,少量人工兜底双签通过
paused暂停(出错回滚)熔断触发

5. OpenClaw 承担的工作流

v3.0 的精神是「让 OpenClaw Agent 做全部决策」,Cloudflare 只负责把用户输入送到 Agent 门口。下面是 Agent 内部的完整流程。

5.1 单次用户消息的完整处理链

[用户发消息] │ ▼ cs-api Worker ── 鉴权 + 识别 biz ──▶ 对应 Tunnel ──▶ OpenClaw Gateway (--workspace={biz}) │ ▼ ┌─── 载入 SOUL.md 决策树 ───┐ │ │ ┌────────────────────────────────────┼───────────── 按 SOUL.md ───┤ │ │ │ ▼ ▼ ▼ [memory search] [意图分类 + 情绪] [敏感词扫] 向量库取 top-5 相关记忆 识别问题类型 命中 → 强制 approvals + FAQ 条目 + 情绪 (angry? neutral?) + 固定话术 │ │ │ └────────────────────────────────────┴────────────────────────────┘ ▼ [调用 Skills / MCP(如需)] · orders/query → 一同看订单 API · vip/check → VIP 权益 · escalate/... → 通知人工 │ ▼ [生成答复草稿] │ ┌──────────────────┼────────────────────┐ │ │ confidence ≥ 0.7 且 confidence < 0.7 或 escalate 非敏感 非 escalate 命中升级规则 │ │ ▼ ▼ [直接回复] [OpenClaw Approvals] 推送待审到坐席台 │ ┌────────┴────────┐ ▼ ▼ [坐席采用] [坐席改写 / 重写] │ │ └────────┬────────┘ ▼ [通过 channel 发送] │ ▼ [写 sessions + memory + training/exports]

5.2 SOUL.md 决策树示例片段

# 一同看客服 Agent · SOUL.md
## 角色
你是一同看官方客服 AI,面向 VIP + 游客,目标:快速解决充值/房间/VIP/退款问题。

## 决策规则(必须执行)
### 1. 敏感话题(强制 approvals)
任何以下关键词命中,**必须把草稿送 approvals**,不自动发:
- 投诉 / 举报 / 退款 / 封号 / 律师 / 未成年 / 自杀

### 2. 业务 Skill 调用
- 用户提订单号(`YTK\d{17}`)→ 必须先调 `skills/orders/query` 核实,不凭空回答金额
- 提 VIP 是否到期 → 调 `skills/vip/check`
- 提「换房间」「房间满员」→ 调 `skills/room/status`

### 3. 置信度低时
若记忆检索 top-5 相关度均 < 0.5,或无法匹配任何 FAQ,直接回复「正在为您转接人工」并送 approvals。

### 4. 情绪识别
用户语气强烈(!、多感叹号、脏话)→ 即便问题可答也送 approvals,由人工安抚后发送。

## 语气
简体中文、礼貌、简洁、不超过 200 字,必要时用编号列表。

## 兜底
OpenClaw 自身出错或 Skill 超时 → 回复「系统繁忙,已为您接入人工,稍候」。

5A. 业务流程编排 & API 集成

为什么不让 Agent 「自由发挥」?SOUL.md 文字描述能让 Agent 处理简单问答,但像退款这种「多步有序 + 外部 API 校验 + 用户确认 + 落工单」的流程,自由发挥会漏步骤、跳过确认、或者编造 API 返回。所以把这类操作抽成显式 workflows(多步流程)+ integrations(声明式 API),两者都在 workspace 里,走 git 管控。

5A.1 两层抽象

文件位置作用举例
Skills(原子)skills/单次调用的能力orders/querytickets/createaccount/lookupdomain/backup
Workflows(多步)workflows/有序 / 带用户确认 / 可分支的流程refund(收集资料 → 查单 → 确认 → 建工单 → 返工单号)
Integrations(声明式)integrations/外部 API 对接(base_url / auth / endpoints),供 skills 共享复用ytk-api(主站)、ticket-system(工单)、dns-admin(备用域名)

5A.2 退款流程样例(workflows/refund.yaml

id: refund
name: 退款流程
version: 1
trigger:
  # SOUL.md 中 Agent 识别到这些意图会启动本流程
  intents: [退款, 申请退款, 想退款, 退钱]
timeout: 30m         # 用户 30 分钟无响应自动取消

steps:
  # ----- 1. 收集身份 -----
  - id: collect_identity
    type: ask
    prompt: "为了核实您的账户,请提供以下任一:注册手机号、注册邮箱"
    validate:
      any_of:
        - regex: '^1[3-9]\d{9}$'       # 手机号
        - regex: '^[^@]+@[^@]+\.[^@]+$' # 邮箱
    retry_on_invalid: 2
    store_as: user_contact

  - id: verify_identity
    type: call_skill
    skill: account/lookup
    integration: ytk-api
    params: { contact: "{{user_contact}}" }
    on_result:
      store_as: user_account
      branch:
        - if: "{{result.status}} == 'active'"
          goto: collect_order
        - if: "{{result.status}} == 'not_found'"
          say: "抱歉,该账户未找到,请确认输入。"
          goto: collect_identity
        - if: "{{result.status}} == 'banned'"
          goto: escalate   # 封禁账户直接转人工

  # ----- 2. 收集订单 -----
  - id: collect_order
    type: ask
    prompt: "请提供需要退款的订单号(格式 YTK 开头的 17 位数字)或支付凭证图片"
    accept:
      - regex: '^YTK\d{17}$'
        store_as: order_id
      - type: image
        via_skill: ocr/extract_order_id  # 从图片 OCR 出订单号
        store_as: order_id
    retry_on_invalid: 2

  - id: query_order
    type: call_skill
    skill: orders/query
    integration: ytk-api
    params:
      order_id: "{{order_id}}"
      user_id: "{{user_account.id}}"
    on_result:
      store_as: order_info
      branch:
        - if: "{{result.refundable}} == true"
          goto: ask_reason
        - if: "{{result.status}} == 'already_refunded'"
          say: "订单 {{order_id}} 已于 {{result.refunded_at}} 退款,金额 ¥{{result.refund_amount}} 已原路返回。"
          goto: done_already_refunded
        - default:
          say: "该订单不可退款({{result.reason}})。"
          goto: escalate

  # ----- 3. 收集退款原因 -----
  - id: ask_reason
    type: ask
    prompt: "请简述退款原因(≥ 5 字)"
    validate: { min_length: 5, max_length: 200 }
    store_as: refund_reason

  # ----- 4. 用户确认 -----
  - id: confirm
    type: confirm
    prompt: |
      已为您核实:
      · 账户:{{user_account.masked_phone}}
      · 订单:{{order_id}} · ¥{{order_info.amount}} · {{order_info.product}}
      · 原因:{{refund_reason}}
      确认提交退款申请吗?(回复「确认」继续,「取消」终止)
    expect_yes: [确认, 是, 对, 提交, ok]
    expect_no: [取消, 否, 不, 算了]
    on_no:
      goto: on_cancel

  # ----- 5. 建工单 -----
  - id: create_ticket
    type: call_skill
    skill: tickets/create
    integration: ticket-system
    params:
      type: refund
      user_id: "{{user_account.id}}"
      order_id: "{{order_id}}"
      amount: "{{order_info.amount}}"
      reason: "{{refund_reason}}"
      source: "cs:{{biz}}"
    on_result:
      store_as: ticket
      on_error:
        escalate: true
        say: "抱歉系统异常,已为您接入人工。"

  # ----- 6. 完成 -----
  - id: done
    type: say
    message: |
      已为您提交退款工单 #{{ticket.id}}
      预计 1-3 个工作日内审核,结果将通过短信 {{user_account.masked_phone}} 通知。
      查询工单进度:{{ticket.tracking_url}}

  - id: done_already_refunded
    type: end

on_cancel:
  type: say
  message: "好的,退款申请已取消。还需要其他帮助吗?"

on_escalate:
  type: approval       # 创建 OpenClaw approval 转人工
  reason: "refund 流程异常"
  attach_context: [user_account, order_info, refund_reason]

5A.3 Agent 如何使用 workflow

SOUL.md 中只需一句:

## 3A. 流程触发
当用户意图命中 `workflows/*.yaml` 中任一 `trigger.intents`,立刻启动对应 workflow,
不要自己凭空回答。流程进行中,所有与本流程无关的用户输入视为打断,先确认
「您当前正在退款流程中,要继续吗?(继续 / 取消)」。

5A.4 流程运行时(OpenClaw 侧)

5A.5 API 集成样例(integrations/ytk-api.yaml

id: ytk-api
name: 一同看主站 API
base_url: https://api.yitongcs.com
auth:
  type: bearer
  token_env: YTK_API_TOKEN      # OpenClaw 从 vault 读
timeout_ms: 5000
retry: { max: 2, backoff_ms: 500 }
rate_limit: { qps: 20, burst: 40 }

endpoints:
  # 被 skills/orders/query.ts 调用
  orders.get:
    method: GET
    path: /v1/orders/{order_id}
    query: { user_id: required }
    response_schema:
      amount: number
      product: string
      status: string    # paid / refunding / refunded / ...
      refundable: boolean

  # 被 skills/account/lookup.ts 调用
  accounts.lookup:
    method: GET
    path: /v1/users/lookup
    query: { contact: required }
    response_schema:
      id: number
      status: string
      masked_phone: string

  # 被 skills/vip/check.ts 调用
  vip.status:
    method: GET
    path: /v1/users/{user_id}/vip
    response_schema:
      active: boolean
      expires_at: string

pii_scrub:
  request:
    redact_body_fields: [password, id_card]
  response:
    # 回传给 LLM 时先脱敏
    redact_fields: [phone, email, id_card]
    keep_masked: [masked_phone, masked_email]

再看一个「备用域名」查询集成(运维后台客服类场景):

# integrations/dns-admin.yaml
id: dns-admin
name: 备用域名管理 API
base_url: https://dns-admin.internal.yitongcs.com
auth:
  type: mtls                # 双向 TLS
  cert_ref: dns-admin-client
endpoints:
  domains.backup.list:
    method: GET
    path: /v1/domains/backup
    query: { biz: required }
  domains.backup.activate:
    method: POST
    path: /v1/domains/backup/{domain}/activate
    confirm_required: true  # 危险操作:flow runner 必须走 confirm step

上层 skills/domain/backup.ts 只做业务参数映射:

// skills/domain/backup.ts
import { call } from "@openclaw/integration";

export const list = async ({ biz }: { biz: string }) => {
  const r = await call("dns-admin", "domains.backup.list", { biz });
  return { domains: r.domains, count: r.domains.length };
};

export const activate = async ({ domain }: { domain: string }) => {
  // confirm_required=true 意味着 flow runner 必须先跑 confirm step,否则这里会直接 throw
  return call("dns-admin", "domains.backup.activate", { domain });
};

5A.6 流程 vs 单 skill · 什么时候用哪个?

场景推荐
单次查询("我的订单什么状态?")Skill 直调
一问一答 FAQ("VIP 有什么权益")Memory 语义检索(不用 skill)
> 1 步收集 + 用户确认(退款 / 账号注销 / 改绑手机)Workflow
调 API 有副作用(写操作、可回滚 / 不可回滚)Workflow(强制 confirm)
多数据源拼装答复(账号信息 + 订单历史 + VIP)Skill(并行拉取后组装)
危险 / 合规敏感操作Workflow + Approvals(既有 confirm 也要人审)

5A.7 可观察 / 可测试


6. 部署拓扑

6.1 OpenClaw 侧(69.30.251.10

/opt/openclaw/
├── bin/                          # openclaw CLI(2026.4.22+)
├── gateway/                      # Gateway 配置 + systemd
└── workspaces/
    ├── _template/                # workspace 模板(新业务 fork 它)
    ├── ytk/                      # 一同看
    ├── bizdemo/                  # 演示业务
    └── bizN/                     # 其他

/opt/cloudflared/
├── config.yml                    # Tunnel ingress(每 biz 一条规则)
└── credentials.json

6.2 Cloudflare Tunnel ingress(每 biz 一个 hostname)

# /opt/cloudflared/config.yml
tunnel: openclaw-tunnel
credentials-file: /opt/cloudflared/credentials.json
ingress:
  - hostname: ytk-cs.int.yitongcs.com
    service: http://127.0.0.1:18789
    originRequest:
      httpHostHeader: ytk-cs
      # Worker fetch 时带 header X-OpenClaw-Workspace: ytk
  - hostname: bizdemo-cs.int.yitongcs.com
    service: http://127.0.0.1:18789
    originRequest:
      httpHostHeader: bizdemo-cs
  - service: http_status:404

6.3 Cloudflare 资源(账户 81541697879f371ae0cf2ca2912d4cab

资源命名说明
Pagescs-widget / cs-console前端
Workerscs-api唯一 Worker(合并了 v2.0 的 edge/api/training)
DO classBridgeDO / AgentPresenceDOBridge 无状态转发,Presence 抢单
D1ytk-cs-db5 张表(workspaces / knowledge / agents / training_samples / audit_log)
KVcs-runtime短期 token / 坐席 online 快照
R2cs-assets附件 / 导出 / 日志 / 备份
Access appcs-console(坐席 + 管理员,按 group 分策略)SSO + TOTP + Step-Up
Tunnelopenclaw-tunnelper-biz ingress
Email Routingsupport@ / alerts@ / ops@兜底 / 告警 / 运维
Analytics Enginecs_metrics业务指标
Logpush→ R2 logs/全量结构化日志
Turnstilesite keyWidget 防刷

6.4 域名规划

域名用途
cs.yitongcs.comWidget 静态(Pages)
cs-api.yitongcs.comREST + WS(Workers)
cs-console.yitongcs.com坐席 + 管理后台(Pages + Access)
{biz}-cs.int.yitongcs.comOpenClaw 该 biz workspace 的 Tunnel hostname(内部,Service Token)

7. 技术栈

选型理由
Widget 前端TS + Web Component≤ 50KB gzip,Shadow DOM 隔离宿主
坐席 + 管理后台Angular(复用主站)→ PagesWorkspace 管理是新增模块
APIWorkers + Hono(TypeScript)唯一 Worker cs-api
WS 终结Durable Object (BridgeDO)WS Hibernation;只转发不存业务状态
坐席抢单Durable Object (AgentPresenceDO)per biz 一实例,原子 claim
D15 张表仅管理台 CRUD 数据
对象存储R2附件 + 训练导出 + 备份 + 日志归档
AI 引擎OpenClaw(N 个 workspace)核心
LLM providerAnthropic Claude 4.6(主)+ OpenAI Codex(备)双源降低单点
鉴权Cloudflare Access + Turnstile无自建 JWT
TunnelcloudflaredOpenClaw 不开公网端口
指标 / 日志Analytics Engine + Logpush → R2CF 原生
EmailEmail Routing + Email Workers告警 / 留言

8. 数据模型(D1 精简)

v3.0 D1 只存「管理台需要 CRUD 的」数据。会话和消息内容归 OpenClaw Sessions(通过 API 查)。D1 仅 5 张表。

8.1 cs_workspaces — biz workspace 元数据

CREATE TABLE cs_workspaces (
  biz             TEXT PRIMARY KEY,               -- 'ytk' / 'bizdemo' / ...
  display_name    TEXT NOT NULL,                   -- "一同看"
  workspace_path  TEXT NOT NULL,                   -- '/opt/openclaw/workspaces/ytk'
  tunnel_host     TEXT NOT NULL,                   -- 'ytk-cs.int.yitongcs.com'
  stage           TEXT NOT NULL,                   -- bootstrapped/training/phase-1/phase-2-ready/phase-2/paused
  agent_version   TEXT,                            -- SOUL.md 版本 hash
  llm_provider    TEXT,                            -- 'anthropic' / 'openai'
  channels        TEXT,                            -- JSON: ['web','telegram']
  created_at      INTEGER NOT NULL,
  updated_at      INTEGER NOT NULL
);

8.2 cs_knowledge — FAQ 编辑视图(真实向量在 OpenClaw Memory)

CREATE TABLE cs_knowledge (
  id              INTEGER PRIMARY KEY AUTOINCREMENT,
  biz             TEXT NOT NULL,
  question        TEXT NOT NULL,
  answer          TEXT NOT NULL,
  tags            TEXT,                            -- JSON
  status          TEXT NOT NULL DEFAULT 'draft',   -- draft/published/archived
  synced_at       INTEGER,                          -- 上次同步到 OpenClaw workspace 时间
  sync_error      TEXT,                             -- 同步失败原因
  updated_by      TEXT,                             -- Access email
  updated_at      INTEGER NOT NULL
);
CREATE INDEX idx_cs_know_biz ON cs_knowledge(biz, status);

8.3 cs_agents — 坐席

CREATE TABLE cs_agents (
  id              INTEGER PRIMARY KEY AUTOINCREMENT,
  access_email    TEXT NOT NULL UNIQUE,
  nickname        TEXT NOT NULL,
  role            TEXT NOT NULL,                   -- agent/supervisor/qa/trainer
  biz_scope       TEXT NOT NULL,                   -- JSON 可服务 biz
  max_concurrent  INTEGER NOT NULL DEFAULT 5,
  status          TEXT NOT NULL,
  last_heartbeat  INTEGER,
  created_at      INTEGER NOT NULL
);

8.4 cs_training_samples — 人工标注队列(针对 Phase 2 门禁)

CREATE TABLE cs_training_samples (
  id              INTEGER PRIMARY KEY AUTOINCREMENT,
  biz             TEXT NOT NULL,
  source_session  TEXT NOT NULL,                   -- OpenClaw session id
  question        TEXT NOT NULL,
  ai_answer       TEXT,
  final_answer    TEXT NOT NULL,
  diff_score      REAL,
  label           TEXT,                            -- good_ai / bad_ai / need_sop
  reviewed_by     TEXT,
  reviewed_at     INTEGER,
  exported_at     INTEGER
);
CREATE INDEX idx_train_biz_label ON cs_training_samples(biz, label);

8.5 cs_workflow_runs — 流程运行审计(轻量,只存最终态 + 关键字段)

CREATE TABLE cs_workflow_runs (
  id              INTEGER PRIMARY KEY AUTOINCREMENT,
  biz             TEXT NOT NULL,
  session_uuid    TEXT NOT NULL,
  flow_id         TEXT NOT NULL,           -- 'refund' / 'account-query' / ...
  flow_version    TEXT NOT NULL,           -- yaml 版本
  status          TEXT NOT NULL,           -- running / completed / cancelled / escalated / failed
  started_at      INTEGER NOT NULL,
  ended_at        INTEGER,
  ticket_id       TEXT,                    -- 若流程产生工单
  api_calls       INTEGER DEFAULT 0,       -- 调用 integration 次数
  escalated       INTEGER DEFAULT 0,       -- 是否转人工
  summary         TEXT                     -- JSON: {collected: {...}, last_step: 'confirm', error?: '...'}
);
CREATE INDEX idx_flow_biz_status ON cs_workflow_runs(biz, status, started_at);
CREATE INDEX idx_flow_session ON cs_workflow_runs(session_uuid);

8.6 cs_audit_log — 审计

CREATE TABLE cs_audit_log (
  id          INTEGER PRIMARY KEY AUTOINCREMENT,
  biz         TEXT,
  actor_email TEXT NOT NULL,
  action      TEXT NOT NULL,                      -- workspace.update / soul.edit / skill.add / faq.* / ...
  target      TEXT,
  before      TEXT,                                -- JSON
  after       TEXT,
  ip          TEXT,
  ts          INTEGER NOT NULL
);

8.7 非关系型 / 外部

内容存储
会话 / 消息内容OpenClaw Sessions(通过 API 查)
向量 / 语义记忆OpenClaw Memory
待审批草稿OpenClaw Approvals
流程运行态workspace workflows/_runtime/{session_uuid}.json(完成后归档到 D1 cs_workflow_runs
Integration 密钥OpenClaw vault(workspace 内加密存储,或通过环境变量注入)
坐席在线AgentPresenceDO(per biz)+ KV 快照
附件 / 训练导出R2 cs-assets
敏感词 / 路由规则SOUL.md(Agent 理解并执行)

9. API 设计

9.1 用户侧(cs-api.yitongcs.com

方法路径用途
POST/cs/{biz}/session创建/恢复会话,返 WS token(URL 中 biz 决定打哪个 workspace)
GET/cs/{biz}/session/{uuid}/messages拉历史(底层调 OpenClaw sessions API)
POST/cs/{biz}/session/{uuid}/messagesREST 发消息(WS 降级)
POST/cs/{biz}/session/{uuid}/rate👍 / 👎 + 文字
POST/cs/{biz}/upload附件 presigned URL
WSwss://cs-api.../ws?token=...双向消息(BridgeDO 终结)

9.2 坐席侧(Access JWT)

方法路径用途
GET/agent/meprofile(可服务哪些 biz)
POST/agent/heartbeat心跳
GET/agent/queue?biz=...该 biz 的 Approvals 待审(透传 OpenClaw approvals list)
POST/agent/approval/{approval_id}/approve采用 AI 草稿
POST/agent/approval/{approval_id}/modify改写后发送(body 带新内容)
POST/agent/approval/{approval_id}/reject完全重写(body 带新内容,标 bad_ai)
POST/agent/session/{uuid}/claim人工介入
POST/agent/session/{uuid}/close结束并打标签

9.3 管理端(Access + Step-Up)

方法路径用途
GET / POST / PUT / DELETE/admin/workspaces[/{biz}]Workspace 元数据 CRUD(含阶段切换、LLM provider 切换)
POST/admin/workspaces/{biz}/sync同步 D1 cs_knowledge 到 OpenClaw workspace 的 skills/faq/entries/ + 触发 memory 重嵌入
GET / PUT/admin/workspaces/{biz}/soul读 / 写 SOUL.md(写操作自动 git commit + 审计)
GET/admin/workspaces/{biz}/metricsper-biz 指标:AI 解决率 / 差评率 / approvals 采用率 / 改写率
POST/admin/workspaces/{biz}/rollback回滚到上一版 SOUL.md(git checkout)
POST/admin/workspaces/{biz}/stage阶段切换(bootstrapped → phase-1 → phase-2,带双签)
其它/admin/knowledge / /admin/training-samples / /admin/agents同 v2.0 但所有接口含 biz 参数

9.4 WS 协议(BridgeDO 转发)

// 客户端 → BridgeDO → OpenClaw
{"type":"msg","content":"我充值没到账","content_type":"text"}

// OpenClaw → BridgeDO → 客户端
{"type":"msg","seq":12,"sender":"ai","content":"...","meta":{"workspace":"ytk","matched_faq":"faq/entries/charge-failed.md"}}
{"type":"status","status":"queued","queue_pos":3,"approval_id":"apr_..."}
{"type":"status","status":"human","agent":"小李"}

10. 前端嵌入

10.1 Web Widget

<script src="https://cs.yitongcs.com/widget.js"
        data-biz="ytk"
        data-theme="auto"
        async></script>

data-biz 决定走哪个 OpenClaw workspace;BizN 嵌入时改 data-biz="bizN" 即可。

10.2 Android WebView

方案 A(推荐):WebView 打开 https://cs.yitongcs.com/?biz=ytk&channel=android&token=...;方案 B(Phase 2):原生 SDK。

10.3 多渠道

Telegram / WhatsApp / Discord 是 OpenClaw workspace 的原生 channel,在 channels.yaml 里开关。用户通过 Telegram 发消息时,OpenClaw 直接接收并在同一 Agent 下处理,消息回流到管理台也走同一条审计路径。


11. 坐席工作台

坐席打开 cs-console.yitongcs.com,通过 Access SSO。工作台本质上是 OpenClaw Approvals 的 UI 客户端

11.1 三栏布局

┌────────────────┬──────────────────────┬────────────────┐ │ Approvals 队列 │ 当前待审消息流 │ 用户信息 │ │ (per biz) │ │ · VIP / 订单 │ │ [卡片×N] │ [用户]: ... │ · 历史 │ │ · biz 标签 │ [AI 草稿]: ... │ · 标签 │ │ · 排队时长 │ [采用] [改写] [重写]│ │ │ · 置信度 │ [坐席答复]: ... │ Memory 搜索 │ │ │ │ [搜索] [插入] │ │ 我的进行中 │ [输入框] │ │ │ [会话×M] │ │ │ └────────────────┴──────────────────────┴────────────────┘

11.2 三种处理姿态

  1. 采用 AI 草稿(approve):一键发送 → 记录 good_ai
  2. 改写后发送(modify):编辑后发 → 原草稿保存到 ai_meta → cs_training_samples 待复核
  3. 完全重写(reject + 新答复):标记 bad_ai,进 Phase 2 训练重点池

11.3 跨 biz 服务

坐席可被分配多个 biz(cs_agents.biz_scope JSON)。队列按 biz 分 tab,避免上下文切换混乱。


12. 管理后台(新增 Workspace 管理模块)

模块功能面向角色
全局仪表盘所有 biz 的 KPI 对比(解决率 / 差评率 / 会话量)主管
Workspace 列表per-biz 卡片:阶段 / 版本 / 渠道 / 在线坐席 / 最新指标 / 快捷跳转主管 + Trainer
Workspace 详情SOUL.md 在线编辑器(带 diff + git 版本) / Skills / Workflows / Integrations / Channels / Memory 搜索 / Approvals 实时 / 指标 / 阶段切换Trainer
Workflows 视图列出该 workspace 所有 workflows/*.yaml;支持在线编辑 + 可视化 DAG(step 节点 + 跳转)+ 端到端测试回放 + 最近运行监控(漏斗、转化、错误率)Trainer
Integrations 视图列出 integrations/*.yaml;健康检查(每 1 分钟 ping 各 endpoint);密钥引用状态(不展示明文);QPS / 错误率看板Trainer + 运维
知识库(per biz)FAQ CRUD / 批量导入 / 一键同步到 workspace(触发 memory 重嵌入)运营 + Trainer
训练语料(per biz)待复核 AI 差答 / 改写对比 / 标注 / 导出 JSONL → R2Trainer
坐席管理账号 / 角色 / biz_scope / 并发上限 / 排班主管
对话审计按 biz / session / 用户 / 标签 / 评价 回看(底层调 OpenClaw sessions API)主管 + QA
系统健康Tunnel 每 biz ingress / Gateway / 各 workspace LLM 费用 / D1 / Queue / 熔断状态运维
审计日志所有管理端操作(尤其 SOUL.md 改动、阶段切换)合规

13. 训练闭环(per-biz)

[用户对话] │ ▼ [OpenClaw Sessions + Memory](自动维护,无需搬运) │ ▼ [管理台定时同步] 每日 03:00 · 读 sessions 找有改写 / bad_ai 的 · 自动 diff_score · 写 cs_training_samples(按 biz 分组) │ ▼ [Trainer 复核] 每周 per biz ≥ 100 条 · 标注 good_ai / bad_ai / need_sop · 若 need_sop → 手动编辑该 workspace 的 SOUL.md 或新增 FAQ · 提 PR 到 openclaw-ws-{biz} git 仓 │ ▼ [灰度发布] Trainer 合并 PR · workspace 自动 git pull · 调 OpenClaw memory reindex · version.md 递增版本号 │ ▼ [per-biz 门禁评估] 每 4 周 · AI 解决率连续 4 周 ≥ 75% · 差评率 ≤ 3% · 敏感话题 0 漏判 │ ▼ [Phase 2 双签切换] Trainer + 主管

关键差异(相对 v2.0):训练成果不是 D1 里的数据行,而是 workspace git 仓里的 SOUL.md 提交历史 + skills/faq/entries/*.md。任何人看 PR 就能理解业务演进,回滚就是 git revert。


14. 新业务(BizN)接入 SOP

BizN 从「想做客服」到「生产可用」的标准步骤,3~5 人日

  1. (0.5 天)运维:创建 workspace · 在服务器跑 openclaw ws clone _template bizN;在 CF 创建 Tunnel ingress bizN-cs.int.yitongcs.com;D1 cs_workspaces 插入记录;git init 并推 openclaw-ws-bizN
  2. (1 天)Trainer:填 IDENTITY + SOUL · 写 IDENTITY.md(角色)+ SOUL.md(业务 SOP + 升级规则)+ AGENTS.md(允许 skill 清单)
  3. (1 天)开发:接业务 API · 把 BizN 关键 API(订单 / 用户 / 退款)封装为 skills/ 下的 TS 文件或 MCP server
  4. (1 天)运营:灌首批 FAQ · 导出过往工单 TOP 30 问答,从管理台批量导入 → 一键同步到 workspace(触发 memory 嵌入)
  5. (0.5 天)内测 · 先开 Telegram channel,内部员工 Demo;调 SOUL.md 直到 Approvals 命中率合理
  6. (0.5 天)开通生产 · 阶段 = phase-1;Widget 嵌入 data-biz="bizN";灰度 10%
  7. (后续)进入 Phase 1 稳定期 → 训练闭环 → Phase 2 门禁

15. 安全与合规


16. 运维与监控

16.1 指标(Analytics Engine,tag 含 biz

指标tag告警
cs_openclaw_latency_p95biz / workspace> 5s 持续 3 分钟
cs_ai_resolve_ratebiz< target 连续 3 天
cs_approval_rewrite_ratebiz> 50% 持续 1 周(训练质量差)
cs_bad_rating_rate_1hbiz> 10%(触发熔断)
cs_tunnel_healthbizdisconnected 立即
cs_llm_cost_dailybiz / provider> 预算 80%

16.2 日志 / 备份

16.3 常用命令

# Cloudflare 侧
wrangler deploy --env production
wrangler d1 execute ytk-cs-db --command "SELECT biz,stage FROM cs_workspaces"
wrangler tail cs-api --format pretty

# OpenClaw 侧(yitongkan@69.30.251.10)
openclaw workspaces list
openclaw run --workspace ytk --prompt "测试"
openclaw approvals list --workspace ytk
openclaw memory reindex --workspace ytk
cd /opt/openclaw/workspaces/ytk && git log --oneline SOUL.md

# Tunnel
cloudflared tunnel info openclaw-tunnel
systemctl status cloudflared

17. 里程碑

17.1 Phase 1(ytk 首业务 5 周)

产出验收
W1OpenClaw token 修复 + ytk workspace 创建 + Tunnel ingress + D1 schema + cs-api Worker 骨架Worker 通过 Tunnel 调 openclaw run --workspace ytk 得到回复;D1 5 表就绪
W2BridgeDO + Widget MVP + ytk SOUL.md v0.1 + orders/vip skillsdev 环境 Widget → Worker → BridgeDO → OpenClaw ytk 端到端一条对话
W3AgentPresenceDO + 坐席台(Approvals 视图)+ 三姿态回执坐席能采用/改写/重写并正确写入 training_samples
W4管理后台(Workspace 管理 + SOUL 编辑 + 指标)+ R2 附件 + Turnstile + Email Routing在后台改 SOUL.md → 审计 + git commit + 实时生效
W5监控告警 + Logpush + Android WebView + 文档培训全量 100% 上线;AE 看板稳定 ≥ 24h

17.2 BizN 并行接入

从 W3 起,其他业务可以按 §14 SOP 并行进入;每 biz 3~5 人日,互不阻塞。


18. 风险

风险等级缓解
OpenClaw 单机 N 个 workspace 互相抢资源监控每 workspace LLM 调用 QPS + Gateway CPU;超阈值迁独立 VM(workspace 目录迁移零业务改动)
SOUL.md 写得不好 → 不按规则走版本化 + 灰度 + 每次改完跑自动化测试用例(一组标准对话对 Agent 行为断言)
N 个 workspace 训练资源分配不公per-biz LLM 配额 + 费用看板 + 预算告警
Tunnel 配置错误导致 biz 互串ingress 规则单测;cs-api 做 host header 二次校验
workspace git 冲突 / 误操作改动强制走 PR + CI;管理台不允许直接改生产 SOUL.md,必须先 PR
OpenClaw 版本升级破坏 N 个 workspace升级前跑全 workspace 回归测试;蓝绿升级
Approvals 堆积(所有业务同用坐席)每 biz 独立队列 + 优先级;坐席台按 biz 分 tab
敏感话题漏判 / 合规SOUL.md 强制规则 + Worker 出站二次扫描 + 每周抽样审计
LLM provider 单点(当前 Codex token 401)立即修复;加 Anthropic Claude 作第二 provider;per workspace 配置 fallback
customer 用户无法访问 yitongkan-companyOpenClaw 侧统一 yitongkan 用户;CF 侧与 OpenClaw 侧完全解耦

19. 附录

19.1 workspace 模板(_template/)初始内容

# IDENTITY.md
你是 {BIZ_DISPLAY_NAME} 的官方客服 AI。
职责:解答 {BIZ_DOMAIN} 相关问题;不回答其他话题。

# SOUL.md(最小可用)
## 语气
简体中文、礼貌、简洁、≤ 200 字。

## 强制升级(approvals)
以下命中必须送 approvals:
- 投诉 / 举报 / 退款 / 封号 / 律师 / 未成年 / 自杀 / 违法

## 技能调用
在调用 skill 前简述意图;返回结果后简要转述,不原样贴 JSON。

## 兜底
置信度低 / skill 超时 → "正在为您接入人工"。

# AGENTS.md
允许调用:
- skills/faq/*
- skills/escalate/notify
禁止调用:
- 未在此列出的任何 skill

19.2 per-biz Agent 测试集示例(_template/tests/soul.test.yaml

cases:
  - name: 投诉必须升级
    input: 我要投诉你们
    expect: { status: queued, must_contain: [转接, 人工] }
  - name: 订单问题必须调 skill
    input: 我订单 YTK2026... 没到账
    expect: { must_call_skill: orders/query }
  - name: 游客闲聊限制
    input: 今天天气怎么样
    expect: { must_contain: [业务相关, 抱歉] }

19.3 相关文档