在线客服系统方案 Per-biz OpenClaw × Cloudflare edge · 版本 3.0 · 2026-04-24
多业务通用 每 biz 独立 OpenClaw workspace OpenClaw 承担全工作流 Cloudflare 薄边缘壳 Phase 1 首业务 5 周
ytk / bizN)各自拥有一套独立训练的 OpenClaw workspace(Agent + Skills + Memory + Sessions + Channels 全独立)。OpenClaw 承担完整客服工作流:首轮接待 / RAG / 情绪 / 升级判断 / 订单查询 / VIP 校验 / 审批流 / 多渠道路由。Cloudflare 只做边缘接入与前端托管(Pages + Workers + 一个薄 DO 做 WS 终结 + 一张精简 D1 存管理台 CRUD)。
- 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-native | v3.0 Per-biz OpenClaw |
|---|---|---|
| OpenClaw 实例数 | 1 个 workspace,biz 字段隔离 | N 个 workspace,每 biz 一个目录 + 独立 Agent |
| 业务工作流实现 | SessionDO 状态机 + KV 路由规则 + Queue 事件 | OpenClaw Agent SOUL.md + Skills(Agent 内部决策) |
| RAG 向量检索 | Cloudflare Vectorize | OpenClaw Memory 原生语义检索 |
| 业务 API 调用 | Worker 内硬编码 + Queue | OpenClaw Skills / MCP(订单、VIP、房间) |
| 会话 / 消息持久化 | D1 cs_sessions / cs_messages | OpenClaw 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 为什么现在做
- 一同看主站(ytk.yitongcs.com)已在 Cloudflare 生产环境运行,用户侧缺一个承接咨询、投诉、VIP 售后的入口。
- 后续 BizN 业务陆续上线,期望有一个开箱即用、又能各自独立训练 Agent 的客服平台。
- OpenClaw 已部署在
69.30.251.10:/opt/yitongkan-company/(作为ytk的 workspace),具备完整 Agent 编排能力。
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 ≤ 3s | 1000 条会话抽样 |
| 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 兜底 | 角色转型 |
ytk workspace 可能已经 Phase 2 全 AI,而 bizN workspace 还在 Phase 1 人审阶段,两者互不影响。管理后台「workspace 总览」逐个 biz 展示阶段状态。
3. 总体架构(v3.0 per-biz OpenClaw)
3.1 逻辑分层
--workspace 参数切换;或未来按业务独立 Gateway 实例 │
└────────────────────────────────────────────────────────────────────────┘
3.2 关键组件
| 组件 | 职责 | 产品 / 位置 |
|---|---|---|
cs-widget | Web/H5 浮窗 | Pages cs.yitongcs.com |
cs-console | 坐席 + 管理后台(含 Workspace 管理) | Pages cs-console.yitongcs.com + Access |
cs-api Worker | 鉴权 / biz 路由 / REST | Workers |
BridgeDO | Widget WS 终结 + ACP client(无业务状态) | Durable Object(单 class,instance key = session_uuid) |
AgentPresenceDO | 坐席在线 / 抢单(仍需要,因为跨 biz) | Durable Object(instance key = biz) |
D1 ytk-cs-db | FAQ 草稿 + 坐席 + 训练标注 + 审计 + workspace 元数据 | Cloudflare D1 |
R2 cs-assets | 附件 / 训练导出 / 备份 / 日志 | Cloudflare R2 |
| Access / Turnstile / Email Routing / AE / Logpush | SSO / 防刷 / 告警 / 指标 / 日志 | 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.com | cloudflared 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 表数量 | 6 | 5(去掉 sessions/messages) | 会话 / 消息 → OpenClaw Sessions API 查 |
| 向量库 | Vectorize(独立服务) | —(OpenClaw Memory 原生) | 少一个服务 |
| Queue consumer | ~600 行 | ~200 行 | 事件流由 OpenClaw 原生触发 |
| Agent 提示词 / Skill | 单一 SOUL.md | N 套 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 生命周期
| 阶段 | 状态 | 触发条件 |
|---|---|---|
| bootstrapped | fork 自模板 openclaw-ws-template,仅填了 IDENTITY | 新 biz 首次创建 |
| training | 灌入首批 FAQ + 业务 API,有内部员工在 Telegram 内测 | SOP 草稿完成 |
| phase-1 | 开放生产流量,Approvals 人工审核 | 内测通过 |
| phase-2-ready | 指标达标,等双签 | 4 周指标达标 |
| phase-2 | 全 AI,少量人工兜底 | 双签通过 |
| paused | 暂停(出错回滚) | 熔断触发 |
5. OpenClaw 承担的工作流
5.1 单次用户消息的完整处理链
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 集成
5A.1 两层抽象
| 层 | 文件位置 | 作用 | 举例 |
|---|---|---|---|
| Skills(原子) | skills/ | 单次调用的能力 | orders/query、tickets/create、account/lookup、domain/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 侧)
- 状态持久化:每个 session 启动 workflow 时在
workflows/_runtime/{session_uuid}.json记录{flow_id, current_step, collected: {user_contact, order_id, ...}, history} - 单次推进:用户每发一条消息 → flow runner 读状态 → 校验当前 step 的 input → 执行(ask / call_skill / confirm / say) → 写回状态 → 回传 Agent 组织语言回复用户
- 兜底:skill 失败 / 外部 API 超时 / 用户重复错 2 次 → 按 yaml 的
on_error/retry_on_invalid/escalate策略处理 - 可回放:
tests/flows/refund.test.yaml写一组固定用户输入 + 预期 API 响应 + 期望最终 ticket;CI 每次 SOUL / workflow 改动都跑一遍 - 可见性:坐席台展示「当前流程 · 第 3/6 步 · 等待用户确认」,一目了然
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 可观察 / 可测试
- 埋点:每次 workflow 步骤前后 / skill 调 / integration HTTP 都写 Analytics Engine;可以看「refund 流程 30% 用户在 collect_order 步骤流失」之类的漏斗
- 审计:每次 workflow run 汇总到
cs_audit_log:触发时间 / 最终状态 / 创建的 ticket_id / 调用的 integrations - CI 测试:
tests/flows/refund.test.yaml写 mock API 响应 + 用户输入序列 + 期望最终调用,每次 PR 必跑
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)
| 资源 | 命名 | 说明 |
|---|---|---|
| Pages | cs-widget / cs-console | 前端 |
| Workers | cs-api | 唯一 Worker(合并了 v2.0 的 edge/api/training) |
| DO class | BridgeDO / AgentPresenceDO | Bridge 无状态转发,Presence 抢单 |
| D1 | ytk-cs-db | 5 张表(workspaces / knowledge / agents / training_samples / audit_log) |
| KV | cs-runtime | 短期 token / 坐席 online 快照 |
| R2 | cs-assets | 附件 / 导出 / 日志 / 备份 |
| Access app | cs-console(坐席 + 管理员,按 group 分策略) | SSO + TOTP + Step-Up |
| Tunnel | openclaw-tunnel | per-biz ingress |
| Email Routing | support@ / alerts@ / ops@ | 兜底 / 告警 / 运维 |
| Analytics Engine | cs_metrics | 业务指标 |
| Logpush | → R2 logs/ | 全量结构化日志 |
| Turnstile | site key | Widget 防刷 |
6.4 域名规划
| 域名 | 用途 |
|---|---|
cs.yitongcs.com | Widget 静态(Pages) |
cs-api.yitongcs.com | REST + WS(Workers) |
cs-console.yitongcs.com | 坐席 + 管理后台(Pages + Access) |
{biz}-cs.int.yitongcs.com | OpenClaw 该 biz workspace 的 Tunnel hostname(内部,Service Token) |
7. 技术栈
| 层 | 选型 | 理由 |
|---|---|---|
| Widget 前端 | TS + Web Component | ≤ 50KB gzip,Shadow DOM 隔离宿主 |
| 坐席 + 管理后台 | Angular(复用主站)→ Pages | Workspace 管理是新增模块 |
| API | Workers + Hono(TypeScript) | 唯一 Worker cs-api |
| WS 终结 | Durable Object (BridgeDO) | WS Hibernation;只转发不存业务状态 |
| 坐席抢单 | Durable Object (AgentPresenceDO) | per biz 一实例,原子 claim |
| D1 | 5 张表 | 仅管理台 CRUD 数据 |
| 对象存储 | R2 | 附件 + 训练导出 + 备份 + 日志归档 |
| AI 引擎 | OpenClaw(N 个 workspace) | 核心 |
| LLM provider | Anthropic Claude 4.6(主)+ OpenAI Codex(备) | 双源降低单点 |
| 鉴权 | Cloudflare Access + Turnstile | 无自建 JWT |
| Tunnel | cloudflared | OpenClaw 不开公网端口 |
| 指标 / 日志 | Analytics Engine + Logpush → R2 | CF 原生 |
| Email Routing + Email Workers | 告警 / 留言 |
8. 数据模型(D1 精简)
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}/messages | REST 发消息(WS 降级) |
| POST | /cs/{biz}/session/{uuid}/rate | 👍 / 👎 + 文字 |
| POST | /cs/{biz}/upload | 附件 presigned URL |
| WS | wss://cs-api.../ws?token=... | 双向消息(BridgeDO 终结) |
9.2 坐席侧(Access JWT)
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /agent/me | profile(可服务哪些 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}/metrics | per-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 三栏布局
11.2 三种处理姿态
- 采用 AI 草稿(approve):一键发送 → 记录
good_ai - 改写后发送(modify):编辑后发 → 原草稿保存到 ai_meta →
cs_training_samples待复核 - 完全重写(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 → R2 | Trainer |
| 坐席管理 | 账号 / 角色 / biz_scope / 并发上限 / 排班 | 主管 |
| 对话审计 | 按 biz / session / 用户 / 标签 / 评价 回看(底层调 OpenClaw sessions API) | 主管 + QA |
| 系统健康 | Tunnel 每 biz ingress / Gateway / 各 workspace LLM 费用 / D1 / Queue / 熔断状态 | 运维 |
| 审计日志 | 所有管理端操作(尤其 SOUL.md 改动、阶段切换) | 合规 |
13. 训练闭环(per-biz)
关键差异(相对 v2.0):训练成果不是 D1 里的数据行,而是 workspace git 仓里的 SOUL.md 提交历史 + skills/faq/entries/*.md。任何人看 PR 就能理解业务演进,回滚就是 git revert。
14. 新业务(BizN)接入 SOP
BizN 从「想做客服」到「生产可用」的标准步骤,3~5 人日:
- (0.5 天)运维:创建 workspace · 在服务器跑
openclaw ws clone _template bizN;在 CF 创建 Tunnel ingressbizN-cs.int.yitongcs.com;D1cs_workspaces插入记录;git init 并推openclaw-ws-bizN - (1 天)Trainer:填 IDENTITY + SOUL · 写 IDENTITY.md(角色)+ SOUL.md(业务 SOP + 升级规则)+ AGENTS.md(允许 skill 清单)
- (1 天)开发:接业务 API · 把 BizN 关键 API(订单 / 用户 / 退款)封装为 skills/ 下的 TS 文件或 MCP server
- (1 天)运营:灌首批 FAQ · 导出过往工单 TOP 30 问答,从管理台批量导入 → 一键同步到 workspace(触发 memory 嵌入)
- (0.5 天)内测 · 先开 Telegram channel,内部员工 Demo;调 SOUL.md 直到 Approvals 命中率合理
- (0.5 天)开通生产 · 阶段 = phase-1;Widget 嵌入
data-biz="bizN";灰度 10% - (后续)进入 Phase 1 稳定期 → 训练闭环 → Phase 2 门禁
15. 安全与合规
- 鉴权:用户侧主站 JWT + Turnstile;坐席 / 管理端 Cloudflare Access SSO + TOTP;敏感操作(SOUL.md 改写、阶段切换、删会话、导训练集)Step-Up
- OpenClaw 访问:per-biz Tunnel + Service Token;无公网端口
- 数据保护:TLS 1.3;附件 R2 presigned 15min;OpenClaw Sessions 保留 180 天(workspace-level 配置);训练样本入 D1 前二次脱敏
- Per-biz 隔离:workspace 文件系统权限
0700;D1 所有查询强制biz=?;坐席biz_scope双重校验(Worker + DO) - 内容合规:敏感话题规则写在 每 biz 的 SOUL.md,Agent 自己判定转人工;出站再由 Worker 对 channel 层做敏感词二次扫描兜底
- 审计:管理端 CRUD 全记
cs_audit_log;SOUL.md 改动额外有 git 历史;OpenClaw Sessions 本身就是完整对话审计
16. 运维与监控
16.1 指标(Analytics Engine,tag 含 biz)
| 指标 | tag | 告警 |
|---|---|---|
cs_openclaw_latency_p95 | biz / workspace | > 5s 持续 3 分钟 |
cs_ai_resolve_rate | biz | < target 连续 3 天 |
cs_approval_rewrite_rate | biz | > 50% 持续 1 周(训练质量差) |
cs_bad_rating_rate_1h | biz | > 10%(触发熔断) |
cs_tunnel_health | biz | disconnected 立即 |
cs_llm_cost_daily | biz / provider | > 预算 80% |
16.2 日志 / 备份
- Workers → Logpush → R2
logs/{yyyy-mm-dd}/ - OpenClaw Sessions 自带持久化;per-biz 每日
openclaw ws export --workspace=ytk快照 → R2backups/workspaces/ytk/{yyyy-mm-dd}.tar.gz - D1 每日
wrangler d1 export→ R2backups/d1/;保留 30 天 - 每个 workspace git 仓 mirror 到 github,失陷时可重建
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 周)
| 周 | 产出 | 验收 |
|---|---|---|
| W1 | OpenClaw token 修复 + ytk workspace 创建 + Tunnel ingress + D1 schema + cs-api Worker 骨架 | Worker 通过 Tunnel 调 openclaw run --workspace ytk 得到回复;D1 5 表就绪 |
| W2 | BridgeDO + Widget MVP + ytk SOUL.md v0.1 + orders/vip skills | dev 环境 Widget → Worker → BridgeDO → OpenClaw ytk 端到端一条对话 |
| W3 | AgentPresenceDO + 坐席台(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-company | 中 | OpenClaw 侧统一 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 相关文档
- customer-service-tasks.html — Agent 执行任务清单 v3.0
- prototype.html — 交互原型 v3.0
- 配置.md — 服务器 / CF 凭据