IM Webhook Bridge 使用文档(当前系统版)

多租户 IM 消息桥接系统 — 配置与操作指南。本页与 v2.1.x 实现对齐:RBAC v2、通知中心、运营策略与队列、在线客服(WebSocket + /agent/ 工作台)、租户侧 AI 与知识库、管理端「系统排障助手」(与客服 AI 隔离)、会话质检与 KPI 报表、企微语音 ASR 等。环境变量 AI_ENABLED=false 时仍会执行 initAI(app) 注册 AI 管理路由;该变量在 app.js 中目前仅区分启动日志文案,ai-intercept 等路径做统一短路——实际是否自动回复以 ai_switches 及租户配置为准。反向代理后建议配合 TRUST_PROXY=1。顶部导航中 Agent Beta 对应超级管理员「AI 中心」早期测试入口;客服工作台 打开 /agent/

1. 系统概述

IM Webhook Bridge 是一个多租户的 IM 消息桥接系统,支持企业微信和飞书两大平台。系统提供以下核心能力:

系统支持两种应用模式:

2. 部署与启动

环境要求

安装与启动

cd im-bridge
npm install
node server.js

服务默认监听 3001 端口。建议使用 Nginx 反向代理配置 HTTPS。

持久化配置目录(避免升级覆盖)

租户、套件、管理员密码等主配置由 lib/config-store.js 读写;企微/飞书 suite_ticketlib/suite-store.js 持久化。当前默认路径为应用目录的上一级下的独立目录(与代码分离,同步代码时不会覆盖):

推荐使用项目内 scripts/safe-deploy.sh 做发布:默认先备份上述关键文件,再用 rsync 同步代码并排除 node_modulesdata/ 等,降低误覆盖风险。

Nginx 配置示例

参考项目中的 aiops-nginx.conf 文件进行配置,确保:

健康探针(负载均衡 / 容器编排 / 监控)

管理后台顶栏「存活」「就绪」打开的是 /admin/health-live.html/admin/health-ready.html(页内 fetch 调用 JSON 接口),避免在浏览器地址栏直接打开 /health/ready 时因 HTTP 503 被浏览器当成「整页错误」而看不到 JSON 中的 reason。自动化探活仍请直接请求 GET /health/liveGET /health/ready。所有 HTTP 响应(含错误)会带上 X-Request-Id;客户端也可传入合法的 X-Request-IdX-Trace-Id(字母数字与 ._@-,最长 128 字符)以贯通日志与审计。

运维相关环境变量(可选)

3. 首次登录与密码设置

  1. 浏览器访问 https://你的域名/admin/
  2. 首次打开时显示 "首次使用,请设置管理密码" 提示
  3. 输入管理密码(不少于4位字符),点击 "设置密码并登录"
  4. 密码使用 bcrypt 加密存储,后续登录需输入相同密码
注意: 密码设置后无法通过界面修改。如需重置,需手动编辑持久化目录中的 config.json(默认 im-bridge-data/config.json),删除其中的 adminPassword 字段。

4. 自建应用模式配置

适用场景:客户在自己的企微/飞书后台已有应用,或只需为单个企业配置。

步骤 1: 创建租户

  1. 登录管理后台,点击左侧侧边栏的 "+" 按钮
  2. 填写以下信息:
    • 租户名称: 客户公司名或项目名
    • URL标识 (slug): 可留空自动生成随机标识,也可手动填写(仅限小写字母/数字/连字符)
  3. 确认"启用"开关打开,点击 "保存"

步骤 2: 添加渠道并配置凭证

  1. 进入租户详情 → 渠道管理 Tab → 点击 "+ 添加渠道"
  2. 选择渠道类型(企业微信/飞书),应用模式选 "自建应用"
  3. 填写平台凭证:
    • 企业微信: 企业ID (CorpID)、应用AgentId、应用Secret
    • 飞书: App ID、App Secret
  4. 点击 "保存凭证"

步骤 2: 配置企微后台(企业微信自建应用)

  1. 登录企微管理后台 > 应用管理 > 找到对应应用
  2. 在"网页授权及JS-SDK"中设置可信域名为你的系统域名
  3. 在"企业可信IP"中添加你服务器的公网 IP
  4. 在应用主页设置 H5 页面地址(可选,后续在页面管理中获取具体链接)

5. 代开发/ISV 模式配置

适用场景:作为服务商,一个应用模板供多个客户企业授权使用。

前置条件

步骤 1: 配置全局服务商凭证

重要: 此步骤必须在创建 ISV 租户之前完成!
  1. 登录管理后台,点击左侧侧边栏的 齿轮图标 (全局配置)
  2. 在"企业微信 服务商配置"卡片中填写:
    • Suite ID: 代开发模板ID(dk开头)或第三方应用套件ID(ww开头)
    • Suite Secret: 应用的 Secret(注意:不是 ProviderSecret)
    • Suite Token: 自定义字符串,后续需填入服务商后台
    • Suite EncodingAESKey: 43位字符,自定义或随机生成
    • 服务商 CorpID (代开发必填): 服务商企业的 CorpID
    • ProviderSecret (代开发必填): 在服务商后台 > 服务商信息中获取
  3. 点击 "保存全局配置"

步骤 2: 在服务商后台配置回调 URL

重要: 必须先完成步骤 1 保存配置后,再执行此步骤!
  1. 登录企业微信服务商后台
  2. 进入 应用管理 > 找到代开发应用模板
  3. "数据回调URL" 处填入: https://你的域名/api/suite/wechat/callback
  4. 填入与步骤 1 相同的 Token 和 EncodingAESKey
  5. 点击"保存"进行验证

步骤 3: 等待 suite_ticket 推送

  1. 回调 URL 验证通过后,企微服务器会每 10 分钟 推送一次 suite_ticket
  2. 在全局配置页面中观察状态徽章
  3. 状态变为绿色 "Ticket 已就绪" 后,即可进行后续操作
注意: 首次配置可能需要等待最多 10 分钟。suite_ticket 已做磁盘持久化,服务重启后会自动恢复。

步骤 4: 创建 ISV 租户

  1. 点击左侧 "+" 按钮创建新租户
  2. 进入租户详情 → 渠道管理 Tab → 添加企微渠道
  3. 应用模式选择 "代开发/ISV"(凭证由授权回调自动填入)

6. 客户授权流程

前置条件: 已完成第 5 节的步骤 1-4,且 Ticket 状态为"已就绪"

步骤 1: 生成授权链接

  1. 在管理后台中选中 ISV 租户
  2. 进入 渠道管理 Tab,找到企微渠道卡片(需已选择 ISV 模式)
  3. 点击渠道卡片中的 "生成授权链接" 按钮
  4. 点击 "复制" 按钮复制链接

步骤 2: 客户扫码授权

  1. 将授权链接发送给客户的企业微信管理员
  2. 客户管理员在 企业微信 中打开此链接(或电脑端扫码)
  3. 客户确认授权信息后,点击 "同意授权"
  4. 授权完成后系统自动:接收回调 > 交换永久授权码 > 填充凭证 > 状态变为"已授权"

步骤 3: 验证授权结果

  1. 刷新管理后台页面
  2. 查看租户详情:ISV 授权状态显示 "已授权",凭证已自动填充
  3. 如果授权状态未更新,检查服务器日志中 [suite-callback] 相关错误

7. 页面与菜单管理

创建 H5 页面

  1. 选中目标租户,切换到 "页面管理" 标签页
  2. 点击 "+ 新建页面"
  3. 填写页面名称、URL标识 (slug)、图标、是否启用
  4. 保存后,页面卡片上会显示 H5 链接: https://域名/t/{租户slug}/h5/{页面slug}
  5. 将此链接配置到企微应用的"工作台主页"或"自定义菜单"中

创建菜单

  1. 展开目标页面卡片,点击 "+ 新建菜单"
  2. 填写菜单信息:
    • 菜单名称: H5 页面中显示的按钮名称
    • 类型: 直接触发(点击即执行)/ 表单提交(需填写表单)
    • Webhook URL: 用户操作后系统 POST 请求的目标地址
    • 表单字段 (表单模式): text/textarea/number/date/select/checkbox
    • 固定参数: JSON 格式,每次请求自动附带
    • 自定义请求头: JSON 格式,附加到 HTTP 头

8. 推送消息 API

用于让外部系统(如影刀 RPA)向 IM 用户推送消息。

步骤 1: 生成 API Key

  1. 选中租户 → 渠道管理 Tab
  2. 找到目标 IM 渠道卡片(企微/飞书)
  3. 在卡片底部的 "推送消息 API" 区域,点击 "生成 API Key"
注意: 推送 API Key 是渠道级别的,每个 IM 渠道独立管理自己的 Key。Web/APP 渠道不支持推送 API。

步骤 2: 调用推送 API

完整 API (推荐):

curl -X POST 'https://域名/api/push/{slug}/message' \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -d '{
    "toUser": "用户ID",
    "msgType": "text",
    "content": {"text": "你好,这是一条推送消息"}
  }'

简易 Webhook (适合不支持自定义 Header 的场景):

curl -X POST 'https://域名/api/push/{slug}/webhook?key=YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"content": "消息内容"}'

简易 Webhook 默认发送给 @all(全员)

消息类型

msgTypecontent 字段说明
text{"text": "消息内容"}纯文本消息
markdown{"markdown": "**粗体**内容"}Markdown 消息
textcard{"title":"标题","description":"描述","url":"链接","btntxt":"按钮"}卡片消息

toUser 格式: 单个用户 "userId123",多个用户 ["userId1","userId2"],全员 "@all"

9. 接收消息回调

用于接收企微/飞书中用户发送的消息,并转发到你的服务。回调配置位于 IM 渠道卡片内。

自建应用模式

  1. 选中租户 → 渠道管理 Tab → 找到目标 IM 渠道卡片(企微/飞书)
  2. 在卡片底部的 "接收消息回调配置" 区域:
    • 复制 回调 URL: https://域名/api/callback/{slug}
    • 设置 TokenEncodingAESKey(需与企微/飞书后台一致)
    • 设置 消息转发 Webhook URL(可选,用于将消息转发到你的服务)
  3. 点击 "保存回调配置"
  4. 然后到企微管理后台 > 应用 > "接收消息服务器配置" 中填入相同的 URL、Token 和 AESKey 并验证
重要: 必须先在 IM Bridge 中保存配置,再到企微后台验证。回调配置是渠道级别的,每个 IM 渠道独立管理。

ISV/代开发模式

ISV/代开发模式下,消息通过套件回调接收(suite-callback.js),无需在渠道卡片中配置回调地址。渠道卡片中会显示提示信息:"ISV/代开发模式下,消息通过套件回调接收,无需配置此处的回调地址"。

10. Webhook 请求格式

用户在 H5 页面触发菜单操作时,系统向 Webhook URL 发送 POST 请求:

{
  "source": "im-bridge",
  "tenant": { "id": "租户ID", "name": "租户名称", "slug": "slug", "platform": "wechat" },
  "page":   { "id": "页面ID", "name": "页面名称", "slug": "页面slug" },
  "user":   { "userId": "企微用户ID", "name": "用户姓名", "department": "部门" },
  "menu":   { "id": "菜单ID", "name": "菜单名称", "type": "direct/form" },
  "data":   { "固定参数key": "value", "表单字段key": "用户填写的值" },
  "timestamp": "2024-01-01T00:00:00.000Z"
}

data 字段包含菜单固定参数和用户表单数据的合并结果。

11. 常见问题排查

配置 suite_ticket 收不到 / Ticket 未就绪
  • 确认回调 URL 配置正确且可被公网访问(HTTPS)
  • 确认 Token 和 EncodingAESKey 两端一致
  • 首次配置后需等待最多 10 分钟
  • 查看服务器日志中是否有 [suite-callback] 相关信息
  • 确认 Suite ID 和 Suite Secret 填写正确
授权 授权链接生成失败
  • 确认全局配置中 Suite ID、Suite Secret 已正确填写
  • 代开发模式(dk开头)需额外填写 服务商 CorpIDProviderSecret
  • 确认 Ticket 状态为"已就绪"(首次需等待约10分钟)
  • 代开发应用模板需要已上线发布
授权 客户扫码后授权状态未更新
  • 检查服务器日志中 [suite-callback] create_auth 相关信息
  • 确认回调 URL 可被企微服务器正常访问
  • 可使用 POST /api/admin/suite/exchange-auth/:tenantId 接口手动交换授权码
  • 确认租户创建时选择了正确的平台和 ISV 模式
错误码 发送消息报错 48002 (API Forbidden)
  • 代开发模式下系统使用 gettoken 接口获取 access_token(corpid + permanentCode)
  • 确认应用模板已上线发布,且客户已完成授权
  • 确认应用在服务商后台已配置相应的 API 权限
  • 如果是新授权的企业,可能需要等待几分钟权限同步
错误码 发送消息报错 81013 (无效的UserID)
  • 确认目标 userId 是企业通讯录中的真实用户ID
  • 可先尝试发送给 @all 验证消息通道是否正常
  • H5 Webhook 回调中的 user.userId 字段即为可用的用户 ID
  • 注意 userId 区分大小写
错误 OAuth 授权失败 / H5 页面打不开
  • 确认应用的"网页授权及JS-SDK"中已添加系统域名为可信域名
  • 确认 H5 页面链接格式正确: https://域名/t/{slug}/h5/{pageSlug}
  • 自建应用模式检查 CorpID、AgentId、Secret 是否正确
  • ISV 模式检查授权状态是否为"已授权"
  • 检查应用是否在企微管理后台中处于启用状态
API API Key 推送消息失败
  • 确认 X-API-Key 头或 ?key= 参数值正确
  • 确认租户已启用且 API Key 未被撤销
  • 检查请求 Body 格式是否正确(需要 Content-Type: application/json
  • 如使用简易 Webhook,API Key 通过 URL 参数 ?key=xxx 传递
配置 接收消息回调验证失败
  • 确认先在 IM Bridge 中保存了回调配置,再到企微后台验证
  • 确认 Token 和 EncodingAESKey 两端完全一致(注意前后空格)
  • 确认回调 URL 格式正确: https://域名/api/callback/{slug}
  • 确认服务器 HTTPS 证书有效且可被外网访问
错误码 报错 40001/41001 (invalid credential)
  • 自建应用模式:检查 CorpID 和 Secret 是否匹配,Secret 是否为对应应用的 Secret
  • ISV 模式:检查永久授权码是否有效,可能需要客户重新授权
  • 确认企业可信 IP 中包含了服务器的公网 IP
  • 注意不同应用的 Secret 不能混用
错误码 报错 842002 (模板未发布)
  • 代开发应用模板需要先在服务商后台提交审核并上线发布
  • 确认模板的开发配置已完成(包括回调URL、权限等)
  • 新模板发布后可能需要几分钟生效
排障 「系统排障助手」和在线客服 AI 有什么区别?
  • 服务对象不同:排障助手给内部同事用(查租户、渠道、权限、看板);在线客服 AI 给终端用户用。
  • 数据隔离:排障历史与评分在 ops_assistant_* 集合;客服会话在 ai_conversations 等,二者不混用。
  • 纯寒暄(如「你好啊」)只会短回复,不会出现准确率评分卡片;真实排障问题会有结构化建议、导出与打分。
  • 入口:管理后台顶部排障助手;与客服工作台/agent/)、Agent Beta(AI 中心)不是同一功能。
没有找到匹配的问题,请尝试其他关键词

12. 系统排障助手(内部 AI · 机制)

系统排障助手是面向内部人员(管理员、运营、客服主管等)的独立 AI 能力:帮助快速理解「配置、租户、渠道、工作台、权限」等问题,并给出可在管理后台内操作的排查步骤。它与租户侧在线客服 AI(拦截用户消息、知识库 RAG、会话)在代码路径、Mongo 集合、检索索引与反馈数据上完全隔离,避免与终端用户对话数据混用。

12.1 从哪里进入、和哪些功能并列

12.2 与「在线客服 AI」对照

维度在线客服 AI系统排障助手
服务对象终端用户(访客/租户用户)内部运维、管理员、客服主管等
典型问题订单、活动、产品咨询、投诉、转人工租户选错、渠道未回、登录与权限、看板与队列、配置路径
知识来源租户知识库 embedding、运营策略等本地系统知识索引实时代码片段命中高分历史问答样本
持久化ai_conversations 等客服域集合ops_assistant_messagesops_assistant_feedback
大模型调用AI 核心链路仅经 lib/ops-assistant/llm.js → 与主系统共用 OpenAI 兼容网关(如 DashScope)

12.3 交互分类:寒暄 vs 排障咨询

服务端在调用大模型前会做轻量规则分类(无额外 LLM):

12.4 请求处理流程(从提问到回复)

flowchart TD U["内部用户提问
管理后台 / 客服台排障入口"] --> API["HTTP /api/.../ops-assistant/ask"] API --> KIND{"寒暄 or 排障?"} KIND -->|smalltalk| ST["固定友好回复
无评分卡片"] KIND -->|troubleshooting| CTX["注入上下文
角色/租户/页面/时间窗"] CTX --> HIS["最近多轮历史
ops_assistant_messages"] CTX --> KB["system-kb
系统知识索引 + 实时代码命中"] CTX --> LR["高分样本检索
feedback + messages"] LR --> VW["版本窗口
当前版 + 上一版"] VW --> TIER["100 优先于 75"] KB --> PROMPT["合成用户提示词
证据优先"] HIS --> PROMPT TIER --> PROMPT CTX --> PROMPT PROMPT --> LLM["大模型网关"] LLM --> NORM["JSON 解析与兜底"] NORM --> SAVE["写入 ops_assistant_messages"] SAVE --> UI["短文 + 导出报告 + 评分卡片"]

12.5 检索与证据(回答依据)

12.6 结构化输出、导出与反馈

12.7 评分与自学习规则

12.8 版本窗口(示意图)

版本号来自管理端前端配置的 APP_VERSION(与排障助手展示版本一致)。

flowchart LR V["样本版本"] --> C{"是否在窗口内?
当前版本 or 上一版本"} C -- 否 --> EX["不参与检索"] C -- 是 --> Q{"评分等级"} Q -- "100" --> P1["高优先级候选"] Q -- "75" --> P2["次优先级候选"] Q -- "0/50" --> DROP["仅存档"]

12.9 数据集合与代码路径

类型集合 / 位置说明
排障消息ops_assistant_messages多轮上下文、导出内容来源
排障反馈ops_assistant_feedback评分与自学习筛选
编排与分类lib/ops-assistant/service.js寒暄/排障分流、检索编排、showFeedback
LLM 唯一入口lib/ops-assistant/llm.js转发 ai/lib/llm-client
系统知识 + 代码命中lib/ops-assistant/system-kb.js非租户 RAG,排障专用
持久化 / 学习lib/ops-assistant/store.jslearning.jsrelease-version.js消息存储、样本检索、版本窗口
HTTProutes/admin-ops-assistant.jsroutes/agent-api.js管理端与客服台排障 API

13. 配置项索引(通用说明 & 影响面)

本节按真实配置来源归纳高信号项,便于审计与排障。未列出的字段不代表不存在(可能为低频或仅内部使用);若需全量字段语义,以代码读取路径为准。涉及历史数据形状变更时,须按仓库数据兼容规则走迁移脚本、双读等流程,本文不给出破坏性操作指引。

13.1 config.jsonlib/config-store.js

默认位于数据目录(见上文「持久化配置目录」),可通过 IM_BRIDGE_DATA_DIR 重定向。HTTP API 前缀以 app.js 挂载为准:管理端 /api/admin/*

名称(键 / 界面)通用说明影响面相关文件 / 接口(节选)
adminPassword / 首次设置管理密码bcrypt 哈希;删除该字段可触发重新设置流程全站管理后台登录lib/config-store.jsroutes/admin-auth.js
suiteConfig.wechat[] / 全局套件(齿轮)企微代开发/服务商套件 SuiteId、Secret、Token、AESKey、Provider 等ISV 授权、/api/suite 回调验签routes/admin-suite.jsroutes/suite-callback.js
suiteConfig.feishu[]飞书多套件配置骨架(与企微并列)飞书渠道与回调platforms/feishu.js、回调路由
tenants[] / 租户与渠道卡片租户元数据、各渠道凭证(自建/ISV)、推送 Key、Webhook、页面树等推送 API、IM 回调转发、H5、多渠道路由routes/admin-tenant.jsroutes/callback.jsroutes/push-api.js
operationsConfig / 运营策略(管理端「运营」类配置)派发、队列、SLA、质检阈值、外部系统等嵌套对象;可与 Mongo 合并运营引擎、客服队列、质检与集成lib/operations-config-store.jsroutes/admin-operations.jslib/ops-engine.js

13.2 环境变量

下列变量由 app.jsserver.js 或业务库直接读取。.env.example 仅覆盖部分场景(如阿里云语音),运行实例请以实际 .env 与代码为准。

名称通用说明(默认值)影响面相关文件(节选)
MONGODB_URIMongo 连接串(默认 mongodb://localhost:27017/im-bridge全站持久化;就绪探针lib/db.jsGET /health/ready
PORTHTTP 端口(默认 3001监听与部署健康检查server.js
IM_BRIDGE_DATA_DIR外置数据根目录config.json、套件票证等路径解析lib/config-store.jslib/suite-store.js
CONFIG_SOURCE_MODEhybrid(默认)/ mongo / fileoperations_configconfig.json 中运营配置的合并策略lib/runtime-config-gateway.jslib/operations-config-store.js
AI_ENABLEDfalse 时仍注册 AI 路由;当前仅影响 app.js 启动日志,不单独关闭拦截器排障时可作「期望关停」的线索,实际以开关集合为准app.js;对比 ai/lib/switch-manager.js
TRUST_PROXY1 时启用 Express trust proxy限流 IP、访问日志中的客户端地址app.js
JSON_BODY_LIMITJSON/urlencoded 上限(默认 2mb大 JSON 请求体app.js
REDIS_URL可选;设置后纳入就绪检查GET /health/ready、分布式锁等(若使用)app.js 健康路由
METRICS_ENABLED=1开启 Prometheus 指标GET /metricsapp.js
STRUCTURED_ACCESS_LOG=1结构化访问日志日志与排障app.js
RATE_LIMIT_ENABLED、各类 RATE_LIMIT_*公网接口限流开关与阈值推送、Web 渠道、租户登录等(平台回调不限流)lib/rate-limit.jsapp.js
OPS_LOOP_INTERVAL_MS 等循环变量见 §2「调度循环间隔」运营/KPI/通知/KB/QC 后台任务server.js
TENCENT_SECRET_ID / TENCENT_SECRET_KEY腾讯云 ASR企微语音转写后进入 AI/人工链路lib/tencent-asr.js

13.3 MongoDB 文档型配置(代码显式读取的集合)

以下为当前代码路径中直接 getCollection(...) 读取、且承担配置/开关职责的集合(不含纯业务流水表全枚举)。

集合通用说明影响面相关文件(节选)
ai_tenant_config每租户一条:人设、规则、RAG、转人工、意图、情感、置信度、LLM 路由、营业时间、语音存储等AI 拦截、LLM、知识库上下文、工单式语音列表ai/routes/ai-admin.jsai/middleware/ai-intercept.jslib/voice-storage.js
ai_system_config全局单例类文档:系统级 LLM/Embedding 密钥与模型参数全租户默认模型、Embedding、部分质检/反馈ai/lib/llm-client.jsai/lib/embedding-client.js
ai_switches租户/渠道维度 AI 开关缓存是否走 AI、按渠道灰度ai/lib/switch-manager.jsai/index.js(索引)
ai_conversationsAI 会话状态与轮次(索引由 AI 模块创建)多轮对话、AI 侧会话列表ai/lib/conversation-manager.jsai/index.js
operations_config文档 _id: 'global',字段 config 与文件内 operationsConfig 归并运营策略、队列 SLA、外部系统钩子lib/operations-config-store.js
agent_config客服侧坐席、技能组、邀评等配置工作台 /api/agent、部分运营调度routes/agent-api.jsai/routes/ai-cs-admin.jslib/ops-engine.js
会话集合并存说明:统一客服会话存储等路径还使用集合 conversations(见 lib/conversation-store.js),与 ai_conversations 职责不同;若排障时发现「列表/队列 ID 对不上」,需分别核对两条链路的读写集合,任何合并或迁移须在专项迁移与双读方案下进行。

13.4 管理后台界面与落库/接口(简述)

界面区域主要落库 / 配置典型 API 前缀
主控制台(租户、渠道、页面)config.jsontenants、套件/api/admin/tenants/api/admin/suite
运营 / 通知 / KPIoperations_config + Mongo 业务集合/api/admin/operations/api/admin/notifications
超级管理员「AI 中心」(/admin/ai/ai_tenant_configai_system_configai_switches、KB chunk 集合等/api/admin/ai/api/admin/ai/kb/api/admin/ai/cs
客服工作台静态页 /agent/会话与坐席 API 依赖 agent_config、业务会话集合/api/agent(经 routes/agent-auth.js
Web 聊天 /chat/WebSocket /ws/chat + /api/channel、租户认证routes/web-channel.jsroutes/tenant-auth.js
对外 OpenAPI(若启用)租户密钥与配额读 ai_tenant_config/api/aiai/routes/ai-external.js

13.5 界面存在但 API 未实现或未消费 runtime 的配置(核实截至当前仓库)

下列项在 AI 中心前端 public/admin/ai/ai-admin.js 中有请求,但 ai/routes/ai-admin.js 未注册对应路由,面板会收到 404 或非预期响应,属「界面预留 / 待接通」:

已落库但拦截链未使用:ai_tenant_config.businessHoursPUT /api/admin/ai/tenant/:tenantId/config 写入并在 GET 中返回,但 ai/middleware/ai-intercept.js 未引用该字段——非工作时间话术不会在当前 AI 拦截路径自动生效,除非后续版本在拦截器中接入。

13.6 延伸阅读(仓库内)

架构细化、数据流与探活约定见本页下文「系统架构」各节及 docs/ARCHITECTURE.md(若部署包含该文件)。

附录: 代开发 ISV 配置完整流程

按照以下顺序操作(顺序很重要):

阶段一: 服务商准备(一次性)

  1. 服务商后台 创建代开发应用模板(dk 开头)或第三方应用(ww 开头)→ 开发配置 → 提交上线
  2. IM Bridge 点击左侧 齿轮图标 进入全局配置 → 填写 Suite ID / Secret / Token / AESKey → 代开发另填 ProviderCorpId / ProviderSecret → 保存
  3. 服务商后台 应用管理 → 数据回调 URL → 填入 https://域名/api/suite/wechat/callback 及相同的 Token / AESKey → 保存验证
  4. 等待 约 10 分钟,IM Bridge 全局配置页面状态变为 "Ticket 已就绪"

阶段二: 为客户创建租户和渠道

  1. IM Bridge 点击 "+" 创建新租户(填写名称,slug 可留空自动生成随机标识)
  2. IM Bridge 进入租户详情 → 渠道管理 Tab → "+ 添加渠道" → 选择企业微信 → 应用模式选 "代开发/ISV"(凭证区域留空,授权后自动填入)

阶段三: 客户授权

  1. IM Bridge 渠道管理 → 企微渠道卡片 → 点击 "生成授权链接" → 复制链接
  2. 客户操作 企业微信管理员在企微中打开授权链接 → 确认信息 → 同意授权
  3. 自动完成 系统接收回调 → 交换永久授权码 → 凭证自动填入渠道卡片 → 状态变为"已授权"

阶段四: 业务配置

  1. IM Bridge 渠道管理 → 企微渠道卡片 → 按需配置 推送消息 API(生成 API Key)
  2. IM Bridge 页面管理 Tab → 新建 H5 页面和菜单 → 复制 H5 链接
  3. 客户企微 将 H5 链接配置到应用主页或自定义菜单
注意: ISV 模式下消息通过套件回调(suite-callback.js)自动接收,渠道卡片中无需配置接收消息回调。推送 API Key 在渠道卡片内独立管理。

系统架构

可视化系统架构图 — 由 Mermaid 实时渲染

A1. 系统总览

展示从客户端(企微/飞书/Web/APP)经接入层、AI处理层、回复路由层到人工客服系统和管理后台的完整数据流,包含租户用户认证体系:

graph TD WX["企业微信用户"] -->|Webhook| WXCb["suite-callback.js\n企微回调"] FS["飞书用户"] -->|Webhook| FSCb["feishu-callback.js\n飞书回调"] WebUser["Web/APP 用户"] -->|WebSocket| WSSrv["server.js\nWebSocket Server"] WebUser -->|REST| WebCh["web-channel.js\nWeb渠道API"] WebUser -->|登录/改密| TAuth["tenant-auth.js\n租户用户认证"] TAuth --> TUModel["tenant-user-model.js\nMongoDB用户模型"] TUModel --> DB WXCb --> AI["ai-intercept.js\ntryProcess()"] FSCb --> AI WSSrv --> AI WebCh --> AI AI --> Switch["switch-manager.js\nAI开关"] AI --> KB["knowledge-base.js\n向量知识库"] KB --> Embed["embedding.js\ntext-embedding-v3"] AI --> LLM["llm-client.js\nqwen-plus"] AI -->|转人工| Transfer["handleTransferToHuman()"] AI -->|"sendReply(channelType)"| Router["platforms/index.js\n平台路由"] Router --> WXA["wechat.js"] -->|企微API| WX Router --> FSA["feishu.js"] -->|飞书API| FS Router --> WebA["webapp.js"] --> WSMgr["ws-manager.js"] WSMgr -->|WebSocket push| WebUser Transfer --> Online["hasAnyOnlineAgent()\n心跳校验1min"] Online -->|有人在线| Assign["assignAgent()"] Online -->|无人在线| AI Assign --> AgentUI["客服工作台"] AgentUI -->|轮询| AgentAPI["agent-api.js"] AgentAPI -->|touchHeartbeat| Session["session-store.js\n4h TTL"] AdminUI["管理后台"] --> TenantAPI["admin-tenant.js\n租户+渠道CRUD"] AdminUI --> TUAdmin["admin-tenant-users.js\n租户用户管理"] AdminUI --> AIConf["ai-config.js"] AdminUI --> CSConf["ai-cs-admin.js\n客服配置"] TUAdmin --> TUModel TenantAPI --> Config[("im-bridge-data/config.json\n租户+套件+渠道凭证")] AI --> DB[("MongoDB")] AgentAPI --> DB Session -->|过期清理| DB style WX fill:#f6ffed,stroke:#52c41a style FS fill:#f0f5ff,stroke:#2f54eb style WebUser fill:#f9f0ff,stroke:#722ed1 style AI fill:#fff7e6,stroke:#fa8c16 style Transfer fill:#fff1f0,stroke:#ff4d4f style TAuth fill:#e6fffb,stroke:#13c2c2 style TUModel fill:#e6fffb,stroke:#13c2c2 style TUAdmin fill:#e6fffb,stroke:#13c2c2 style DB fill:#f5f5f5,stroke:#8c8c8c style Config fill:#f5f5f5,stroke:#8c8c8c style AdminUI fill:#f0f5ff,stroke:#2f54eb

A2. 多渠道消息流转时序

展示一条用户消息从发送到 AI 回复(或转人工)的完整处理链路:

sequenceDiagram participant U as 用户 participant CH as 渠道接入层 participant AI as AI拦截器 participant KB as 知识库 participant LLM as 大模型 participant PA as 平台适配器 participant HD as 人工客服 U->>CH: 发送消息(企微/飞书/Web) CH->>AI: tryProcess(tenant, userId, msg, channelType) AI->>AI: 检查AI开关(switch-manager) alt AI关闭 AI-->>CH: 静默跳过 else AI开启 AI->>KB: 知识库检索(embedding+向量匹配) KB-->>AI: 匹配知识片段 top-3 AI->>LLM: system prompt + context + 用户消息 LLM-->>AI: AI回复文本 alt 检测到转人工意图 AI->>AI: hasAnyOnlineAgent(tenantId) alt 有客服在线(心跳1min内) AI->>HD: assignAgent() 分配会话 AI->>PA: sendReply(正在转接人工客服) else 无客服在线 AI->>PA: sendReply(暂无在线客服) end else 正常AI回复 AI->>PA: sendReply(tenant, userId, text, channelType) end PA->>U: 按channelType路由回复 end

A3. 目录结构与模块职责

各目录和模块的分层关系:

graph LR subgraph Server["server.js 入口"] HTTP["HTTP Server :3001"] WS["WebSocket /ws/chat"] end subgraph Routes["routes/ 路由层"] R1["suite-callback.js"] R2["feishu-callback.js"] R3["web-channel.js"] R4["admin-auth.js"] R5["admin-tenant.js"] R6["admin-tenant-users.js"] R7["agent-auth.js"] R8["agent-api.js"] R9["tenant-auth.js"] R10["push-api.js"] R11["callback.js"] end subgraph AI["ai/ AI模块"] A1["ai-intercept.js"] A2["llm-client.js"] A3["embedding.js"] A4["knowledge-base.js"] A5["switch-manager.js"] A6["ai-config.js"] A7["ai-cs-admin.js"] end subgraph Platform["platforms/ 平台适配"] P0["index.js 注册表"] P2["wechat.js"] P3["feishu.js"] P4["webapp.js"] end subgraph Lib["lib/ 公共库"] L1["db.js"] L2["config-store.js"] L3["user-model.js"] L4["session-store.js"] L5["ws-manager.js"] L6["tenant-user-model.js"] end subgraph Frontend["public/ 前端"] F1["admin/ 管理后台"] F2["agent/ 客服工作台"] F3["chat/ Web聊天(匿名/登录)"] end Server --> Routes Server --> AI Routes --> Platform AI --> Platform Routes --> Lib AI --> Lib style Server fill:#e6f7ff,stroke:#1890ff style Routes fill:#f6ffed,stroke:#52c41a style AI fill:#fff7e6,stroke:#fa8c16 style Platform fill:#f9f0ff,stroke:#722ed1 style Lib fill:#f5f5f5,stroke:#8c8c8c style Frontend fill:#f0f5ff,stroke:#2f54eb

A4. 数据架构 (ER图)

核心数据实体及其关系(含租户用户体系和渠道级配置):

erDiagram TENANT ||--o{ CHANNEL : "channels[]" TENANT { string id PK string name string slug "随机8位hex或自定义" string platform "主渠道平台-同步" boolean enabled } CHANNEL { string type "wechat-feishu-web-app" string mode "self-built-isv" boolean enabled boolean isPrimary object credentials "IM凭证" string callbackToken "回调Token-IM" string callbackAESKey "回调密钥-IM" string callbackWebhookUrl "消息转发-IM" string apiKey "推送API-Key-IM" object config "Web-APP配置" } TENANT ||--o{ TENANT_USER : tenantId TENANT_USER { ObjectId _id PK string tenantId FK string username string passwordHash "bcrypt-10rounds" string displayName boolean enabled boolean mustChangePassword } TENANT ||--o{ CONVERSATION : tenantId CONVERSATION { ObjectId _id PK string tenantId FK string userId string userName string channel "wechat-feishu-web-app" string status string assignedAgentId } CONVERSATION ||--o{ MESSAGE : "messages[]" MESSAGE { string role string msgType string content date timestamp } USER { ObjectId _id PK string username string role "superadmin-admin-agent" string onlineStatus date lastHeartbeat } AGENT_CONFIG { string tenantId FK string assignStrategy int maxConcurrentPerAgent array agents array schedules } AI_TENANT_CONFIG { string tenantId FK boolean enabled string systemPrompt object transfer } KNOWLEDGE_CHUNK { string tenantId FK string docId string content array vector "1024-dim embedding" }

A5. 客服在线检测与心跳机制

客服在线状态的完整生命周期,包括心跳超时自动离线(1分钟):

stateDiagram-v2 [*] --> Offline: 初始状态 Offline --> Online: 客服登录\nagent-auth.js Online --> Online: 每次API请求\ntouchHeartbeat() Online --> StaleOnline: 关闭浏览器\n(无显式登出) Online --> Away: 手动切换 Away --> Online: 手动切换 Online --> Offline: 主动登出 Away --> Offline: 主动登出 StaleOnline --> Offline: 心跳超时1min\nhasAnyOnlineAgent() StaleOnline --> Offline: Session过期4h\nsession-store cleanup note right of StaleOnline DB中onlineStatus仍为online 但lastHeartbeat已过期 系统自动修正为offline end note

A6. 平台适配器模式

所有平台实现统一的 sendMessage() 接口,新增平台只需注册新适配器:

classDiagram class BasePlatform { <<abstract>> +sendMessage(tenant, userId, msgType, payload)* +validateConfig(config)* } class WechatPlatform { +sendMessage() -getAccessToken(corpId) -callWechatAPI(url, data) } class FeishuPlatform { +sendMessage() -getAppAccessToken() -callFeishuAPI(url, data) } class WebappPlatform { +sendMessage() -wsManager: WSManager } class WSManager { -connections: Map +add(ws, tenantId, userId) +remove(ws) +send(tenantId, userId, payload) +countByTenant(tenantId) } class PlatformRegistry { -platforms: Map +get(name) BasePlatform +list() string[] } BasePlatform <|-- WechatPlatform BasePlatform <|-- FeishuPlatform BasePlatform <|-- WebappPlatform WebappPlatform --> WSManager : uses PlatformRegistry --> BasePlatform : manages

A7. 部署架构

生产环境的物理部署拓扑:

graph TB subgraph Internet["公网"] WXServer["企业微信服务器"] FSServer["飞书服务器"] Browser["浏览器/Web客户端"] ALI["阿里云\nDashScope API\nOSS + 语音识别"] end subgraph Server["服务器"] subgraph Nginx["Nginx 反向代理"] N80["HTTP :80 - HTTPS :443"] NProxy["proxy_pass :3001"] NWS["WebSocket upgrade"] end subgraph App["Node.js (PM2)"] Express["Express HTTP :3001"] WSS["WebSocket Server"] end subgraph DB["MongoDB"] Collections["users | conversations\ntenant_config | agent_config\nknowledge_chunks"] end subgraph Files["外置数据目录"] ConfigJSON["im-bridge-data/config.json\n租户+套件+渠道"] SuiteTk["im-bridge-data/.suite-tickets.json\nsuite_ticket 持久化"] end end WXServer -->|Webhook| NProxy FSServer -->|Webhook| NProxy Browser -->|HTTPS| N80 Browser -->|WSS| NWS NProxy --> Express NWS --> WSS Express --> DB Express --> Files Express -->|LLM/Embedding| ALI style Internet fill:#e6f7ff,stroke:#1890ff style Nginx fill:#f6ffed,stroke:#52c41a style App fill:#fff7e6,stroke:#fa8c16 style DB fill:#f5f5f5,stroke:#8c8c8c

A8. 前端页面结构

页面路径用途访问角色
管理后台/admin/租户管理、AI配置、知识库、客服配置、渠道管理、交互日志superadmin / admin
客服工作台/agent/实时会话接待、快捷回复、客户信息、团队管理(主管)helpdesk_agent / supervisor
Web聊天页/chat/?slug=xxx面向终端用户的 Web 在线客服入口公开访问
使用文档/admin/docs.html操作指南与架构文档(原版)管理员
使用文档(当前版)/admin/docsv1.html与当前系统一致的修订版说明与对标分析管理员
KPI 看板/admin/kpi.html客服绩效数据统计管理员 / 主管

A9. 多渠道配置说明

每个租户支持同时接入多个通讯渠道。IM 渠道(企微/飞书)独立管理凭证、回调配置和推送 API Key;Web/APP 渠道管理聊天页面配置。

graph LR subgraph Tenant["租户"] T["id: c4d2ff92\nslug: a3f7b1e2 (随机生成)\nplatform: wechat (主渠道同步)"] end subgraph Channels["channels[]"] C1["type: wechat ⭐主渠道\nmode: isv\ncredentials: authCorpId/permanentCode\ncallbackToken / callbackAESKey\napiKey: e76259f4..."] C2["type: web\nconfig: title/welcome/placeholder"] end T --> C1 T --> C2 C1 -->|ISV回调| SuiteCb["suite-callback.js"] C1 -->|自建回调| Cb["callback.js\n/api/callback/:slug"] C1 -->|推送| Push["push-api.js\n/api/push/:slug/message"] C2 -->|消息| WSChat["WebSocket /ws/chat\nREST /api/channel/:slug"] style Tenant fill:#f0f5ff,stroke:#2f54eb style Channels fill:#f9f0ff,stroke:#722ed1

渠道类型与功能矩阵

功能企微 (wechat)飞书 (feishu)WebAPP
应用模式自建/ISV自建/ISV--
凭证管理CorpId/Secret/AgentId 或 AuthCorpId/PermanentCodeAppId/AppSecret--
接收消息回调自建模式需配置 Token/AESKey自建模式需配置--
ISV 回调提示ISV 走套件回调,无需配置同左--
推送 API Key渠道级生成渠道级生成--
聊天页面配置--标题/欢迎语/占位符同 Web
租户用户登录--支持(可选)支持(可选)

链接防枚举 (随机 Slug)

新建租户时,若不手动指定 slug,系统自动生成 8 位随机 hex(如 a3f7b1e2),使每个租户的聊天链接无法被推测。已有租户的自定义 slug 保持不变。

租户用户认证体系

每个租户可配置独立的用户账户体系(tenant-user-model.js),用于 Web/APP 渠道的登录认证:

主渠道与向后兼容

标记为"主渠道"的 IM 渠道,其 credentialsmodecallbackTokenapiKey 会自动同步到租户顶层字段。这保证了 callback.jspush-api.jssuite-callback.js 等仍通过 tenant.credentials 读取凭证的代码能正常工作。

配置持久化路径

多租户主配置默认写入 外置数据目录下的 config.json(见上文「持久化配置目录」),不再依赖应用根目录内的同名文件,以便升级同步代码时不被覆盖。

自动迁移机制

系统启动时 config-store.jsbackfillDefaults() 自动执行:

渠道管理操作

在管理后台 → 租户详情 → 渠道管理 Tab 中可进行:

A10. 租户用户认证体系

Web/APP 渠道支持可选的租户用户认证,认证流程如下:

sequenceDiagram participant U as Web/APP用户 participant Chat as 聊天页面 participant Auth as tenant-auth.js participant WS as WebSocket Server participant AI as AI拦截器 Chat->>Chat: 加载 /api/channel/:slug/config Chat->>Chat: 检查 requireLogin 标志 alt 租户无用户账户 (requireLogin=false) U->>Chat: 输入昵称 Chat->>WS: 匿名连接 WebSocket else 租户有用户账户 (requireLogin=true) U->>Chat: 输入用户名+密码 Chat->>Auth: POST /api/chat/auth/login Auth-->>Chat: token + userInfo + mustChangePassword alt 首次登录需改密 Chat->>Chat: 显示改密表单 U->>Chat: 输入新密码 Chat->>Auth: POST /api/chat/auth/change-password end Chat->>WS: 连接 WebSocket (带 token) WS->>Auth: getSession(token) 验证 end WS->>AI: tryProcess(tenant, userId, msg, channelType) AI-->>WS: AI回复 WS-->>U: 推送消息

管理端操作

在管理后台 → 租户详情 → 用户管理 Tab 中:

A11. 健康探针、请求 ID 与业务事件

与「可观测性、排障、发布」相关的 HTTP 行为与数据落库;与业务功能章节正交。

探针与关联头

路径用途依赖
/health/live进程存活
/health/ready依赖就绪MongoDB;可选 Redis(REDIS_URL
/metricsPrometheus 文本指标METRICS_ENABLED=1

请求级 X-Request-Id / X-Trace-Id 与 AI、回调、推送等路径对齐。

业务事件查询

GET /api/admin/business-events(参数 tenantIdtypetraceIdsourcestartDateendDatepagelimit)或页面 /admin/business-events.html

典型 typepush_message_sentai_message_receivedai_reply_sentai_transfer_humanai_llm_failedcallback_channel_inboundcallback_channel_rejectcallback_webhook_forward_failedsuite_wechat_inboundsuite_wechat_post_errorsuite_feishu_callback_error 等(以代码为准)。

进程信号

SIGTERM / SIGINT:停止通知 Worker → 关闭 WebSocket → 关闭 HTTP → 关闭 Mongo 连接。

本地自检:node scripts/verify-ops-health.js;发布树检查:node scripts/verify-release-tree.js

版本更新日志

按时间倒序记录系统重大功能迭代

2026-03-29
健康探针、全链路请求 ID、business_events 与优雅关闭架构
  • HTTPGET /health/liveGET /health/ready;全局 X-Request-Id / 可选入站 X-Trace-IdJSON_BODY_LIMIT 限制 JSON 体大小
  • MongoDBbusiness_events 集合与索引;AI / 推送 / IM 回调关键路径异步打点;可选 BUSINESS_EVENTS_TTL_DAYS
  • 运行时SIGTERM/SIGINT 优雅关闭(通知 Worker、WebSocket、HTTP、数据库);ai_logs 支持 traceId 字段
  • 管理端:顶栏「存活」「就绪」「业务事件」;业务事件页/API 支持普通管理员按授权租户查询(须选租户)、超级管理员可查全库
  • 可选REDIS_URL 纳入 ready;METRICS_ENABLED=1 暴露 Prometheus 风格 /metrics(uptime、内存、HTTP 计数);scripts/verify-release-tree.js 与 GitHub Actions CI
2026-03-28
系统排障助手体验 & 管理端导航 & 文档对齐产品
  • 排障助手:寒暄与排障分流(含语气词变体)、排障场景下准确率反馈卡片与导出报告;与客服 AI 数据面隔离策略文档化
  • 管理后台导航:保留单一「排障助手」入口(顶部右侧);Agent Beta 指向 AI 中心测试;客服工作台 指向 /agent/;账号区视觉分隔
  • 客服台:登录页品牌 Logo 与文档入口一致性
  • 质量保障:Playwright E2E(Web 渠道多用户并发 + AI 回复、可选 globalSetup 临时坐席)纳入 npm run test:ui:e2e
  • docs.html:本章更新排障助手专节、版本日志与竞品对标表
2026-03-25
文档修订 docsv1 & 配置外置文档
  • docsv1.html: 与当前实现对齐的使用说明与「功能对标分析」修订版
  • 配置外置: 默认 im-bridge-data/ 存放 config.json.suite-tickets.json,支持 IM_BRIDGE_DATA_DIR
  • 安全部署: 新增 scripts/safe-deploy.sh(备份关键文件 + rsync 排除项 + 健康检查)
2026-03-23
渠道级配置架构 & 系统文档架构
  • 回调配置迁移至渠道级: 接收消息回调的 Token/AESKey/WebhookUrl 从租户级移入 IM 渠道卡片内管理,自建模式显示配置表单,ISV 模式提示无需配置
  • 推送 API Key 迁移至渠道级: 每个 IM 渠道独立生成和管理 API Key
  • 聊天链接防枚举: 新建租户自动生成 8 位随机 hex slug(如 a3f7b1e2),防止链接被猜测遍历
  • 系统使用文档: 新增 /admin/docs.html 页面,包含操作指南、Mermaid 架构图、FAQ 搜索
  • 自动数据迁移: 启动时自动将旧租户级回调/Key 配置迁移到主 IM 渠道,并保持向后兼容同步
2026-03-22 (晚)
Web/APP 渠道 & 租户用户认证重大
  • Web/APP 聊天渠道: 新增 WebSocket 实时聊天通道(/ws/chat),支持匿名和登录两种模式
  • 多渠道架构: 租户支持 channels[] 数组,可同时接入企微、飞书、Web、APP 四种渠道类型
  • 租户用户认证体系: 新增 tenant-user-model.js,支持为每个租户配置独立用户账户(bcrypt 加密),单个创建/批量生成/CSV 导入
  • 租户用户登录: Web/APP 渠道检测到租户有用户时自动切换为登录模式,支持首次登录强制改密
  • KPI 看板: 新增 /admin/kpi.html 客服绩效数据统计页面
2026-03-22 (下午)
人工客服工作台重大
  • 客服工作台: 新增 /agent/ 独立客服接待界面,支持实时会话、快捷回复、客户信息查看
  • AI 转人工: AI 对话中检测到转人工意图时,自动检查在线客服并分配会话
  • 心跳在线检测: 客服每次 API 请求触发心跳,超过 1 分钟无心跳自动标记离线
  • 会话管理: Session Store 支持 4 小时 TTL 自动过期清理
  • RBAC 权限体系: 用户角色分为 superadmin / admin / helpdesk_agent / helpdesk_supervisor
2026-03-20 ~ 03-22
AI 智能客服系统重大
  • AI 消息拦截: ai-intercept.js 统一拦截所有渠道消息,支持开关控制、业务时间、阻止词过滤
  • 知识库系统: 支持多格式文档上传(PDF/Word/HTML),embedding 向量化存储,语义检索 top-3 匹配
  • LLM 大模型集成: 对接阿里云 DashScope(qwen-plus),system prompt + 知识库上下文 + 多轮对话
  • 意图分类: 自动识别用户意图(闲聊/咨询/投诉/转人工等),按意图路由处理
  • 情感分析 & 反馈: 检测用户情绪,收集满意度评分,用于服务质量改进
  • AI 管理界面: 独立 AI 配置页面,管理 prompt、知识库、路由规则
2026-03-19
语音消息处理 & 部署优化功能
  • 语音转文字: 集成腾讯云 ASR,自动将企微语音消息(AMR 格式)转为文字后交 AI 处理
  • 语音文件下载: 从 IM 平台下载语音文件并临时存储,支持自动过期清理
  • PM2 进程管理: 新增 ecosystem.config.js,支持 PM2 守护进程部署
  • 部署脚本优化: deploy.sh 支持 .deployignore 排除敏感文件
2026-03-18 ~ 03-19
MongoDB 数据持久化架构
  • MongoDB 集成: 引入 MongoDB 替代纯文件存储,db.js 统一管理数据库连接
  • 交互日志: 所有 H5 用户操作(菜单点击、表单提交)持久化记录到 MongoDB
  • 日志查询: 管理后台支持按租户、时间范围、操作类型查询和统计交互日志
2026-03-16 ~ 03-17
ISV/代开发模式 & 管理员认证功能
  • ISV 授权流程: 完整实现企微代开发/第三方应用授权链路(suite_ticket → 授权链接 → 永久授权码)
  • 全局服务商配置: Suite ID / Secret / Token / AESKey / ProviderCorpId / ProviderSecret 统一管理
  • suite_ticket 持久化: ticket 存储到磁盘文件,服务重启自动恢复
  • 管理员密码认证: 首次访问设置 bcrypt 加密管理密码,后续登录验证
  • 飞书加密模块: 新增 feishu-crypto.js,支持飞书消息验签和解密
2026-03-12 ~ 03-16
系统初版发布初始
  • 多租户架构: 基于外置 config.json(默认 im-bridge-data/config.json)的多租户配置管理,每个租户独立 slug 标识
  • 企业微信支持: 自建应用模式消息收发,OAuth 网页授权,JS-SDK 鉴权
  • 飞书支持: 飞书平台适配器,消息发送和事件回调
  • H5 操作面板: 可配置菜单(直接触发/表单提交),用户操作后 POST 到指定 Webhook
  • 消息推送 API: /api/push/:slug/message 支持 text/markdown/textcard 消息类型
  • 消息回调转发: /api/callback/:slug 接收平台事件并转发到 Webhook URL
  • 管理后台: 租户管理、页面管理、菜单管理界面
  • 客服与权限体系: Agent Beta 工作台 + RBAC v2(统一账号、角色与成员、数据范围、技能组)
  • 运营与通知: 运营策略中心 + 通知中心(邮件/短信队列、重试、日志)
  • 会话与语音: 会话统一到 V2 conversations,支持企微语音 ASR 转文字后交 AI 处理

功能对标分析

IM Bridge 与主流商业客服系统(网易七鱼、沃丰 UDESK)的能力对比 — 本表已按当前系统实现修订(2026-03-28)

一、核心功能对比

功能模块七鱼 / UDESKIM Bridge差距难度AI 编程可行性
渠道接入
企业微信支持支持(自建 + ISV)持平--
企微服务商多套件多应用模板常见支持多套(如 Suit A / B,独立回调与 ticket)优势--
飞书支持支持持平--
微信公众号 / 小程序支持不支持缺失M高 — 已有 wechat adapter 模板,公众号 API 结构类似
网页 / APP 内嵌支持(SDK)支持(WebSocket)持平--
电话语音(呼叫中心)完整 IVR + 云呼叫不支持缺失-话务相关,不做考虑
邮件通知支持支持(通知中心 SMTP + 队列 + 重试 + 日志)持平--
短信通知支持支持(通知中心云短信 + 队列 + 重试 + 日志)持平--
抖音 / 小红书 / 微博支持不支持缺失H中 — 每个平台 API 不同,需逐个对接调试
在线客服
多坐席在线接待支持支持(基础)有差距--
智能路由 / 排队分配按技能组 / 负载 / VIP 优先级运营配置 + 调度引擎(可配置策略,持续演进中)有差距M高 — 在现有 ops/dispatch 上继续细化规则与 UI
排队等候(队列管理)完整队列 + 等待提示运营侧队列配置与超时动作(与商业产品完整排队 UX 仍有差距)有差距M高 — WebSocket 等待位提示与前端体验需补强
会话转接 / 协助转接 + 三方会话 + 内部协助支持会话转接与分配;三方协助能力部分支持有差距M中 — 继续补强协助态与可视化操作即可
快捷回复 / 话术库分组管理 + 搜索支持(MongoDB quick_replies,客服 API 拉取)有差距S中 — 管理端分组/搜索体验可继续对齐七鱼
富媒体消息图文 / 卡片 / 商品 / 订单text / markdown / textcard + 推送侧扩展与幂等有差距M中 — 复杂卡片与订单类消息需按平台继续扩展
客户信息面板(CRM)完整客户画像 + 历史轨迹客户标签 + 画像字段(customer_tags / customer_profiles有差距H中 — 全链路画像与轨迹聚合仍需产品化
满意度评价自动邀评 + 多维度支持提交与存储(satisfaction_ratings),可配 Webhook 外发有差距S中 — 邀评时机与多维度模板可对齐商业产品
工单系统
工单创建 / 流转完整工单引擎无独立工单产品;支持外部系统回调与运营编排衔接有差距H中高 — 标准工单模块仍可分阶段建设
SLA 时效管理支持运营配置中含 SLA 策略与超时动作(与专用工单 SLA 仍有差距)有差距M高 — 与工单闭环打通后价值更高
跨部门协作支持依赖外部 ITSM/编排;系统内跨部门工单协作弱有差距M中 — 需工单或外部系统深度集成
AI 智能客服
AI 机器人自动回复支持支持持平--
知识库管理结构化 + 非结构化 + 网页抓取文档上传/批量导入 + 内容去重(hash)+ URL 抓取入库 + 定时刷新 + 检索命中解释基本持平--
LLM 大模型集成自研 / 接入多家大模型支持 OpenAI 兼容网关(当前常用 DashScope)有差距S高 — 增加模型/路由配置可继续扩展
意图识别98%+ 准确率基础分类有差距M中 — 用 LLM few-shot 替代规则可显著提升
多轮对话任务型 + 闲聊上下文对话有差距M高 — 在 conversation-manager 上增加槽位追踪
人机协同(AI 辅助坐席)AI 建议回复 + 实时推荐不支持缺失H中 — 异步调 LLM 生成建议推送到工作台
AI 转人工支持支持持平--
情感分析支持支持(基础)有差距--
语音转文字支持支持(腾讯 ASR)持平--
数据与质检
实时监控大屏完整不支持专用大屏缺失H中 — 后端简单,前端大屏布局工作量大
会话质检(自动)AI 全量质检运营侧质检:规则命中 + LLM 评分合并、报表(分布/风险 Top/趋势)、低分/高风险告警(通知中心);与头部「全量无差别质检 + 成熟报表矩阵」仍有差距有差距M持续迭代报表维度与抽检策略
数据报表(多维)几十种报表模板KPI / 运营统计 + AI 侧部分报表有差距H中 — 模板化报表矩阵仍需建设
客户满意度统计完整 CSAT / NPS有评价数据与接口基础,管理侧统计可继续增强有差距S高 — 聚合与可视化对齐 CSAT/NPS 模型
管理功能
坐席管理 / 权限完善RBAC v2(统一账号、自定义角色、Membership、self/team/tenant 三级范围、技能组与渠道隔离)有差距--
多租户 / 多品牌支持支持持平--
ISV / 代开发部分支持完整支持优势--
开放 API / Webhook完善支持(推送 / 回调 / 运营回调);部分接口支持幂等与审计有差距--
审计与合规完善管理操作审计日志(含归档查询)有差距--
内部运维与交付(非终端客服)
内部排障 / 交付助手多数商业 SaaS 不提供或仅文档系统排障助手:独立模块 lib/ops-assistant/,系统知识 + 代码命中 + 高分样本自学习,管理端与客服主管侧可用差异化能力-持续扩充 system-kb 与发布版本治理即可

难度评级: S 简单(1-2 文件) M 中等(3-5 文件) H 较难(多模块联动) X 极难(大量 UI 工程)。已持平项和话务相关项不标注。

二、AI 个性化控制能力对比

AI 维度七鱼 / UDESKIM Bridge差距难度AI 编程可行性
Prompt 自定义可视化编排 + 模板支持(代码级配置)功能持平,易用性有差距--
知识库 RAG结构化 QA + 文档 + 网页抓取,自动知识挖掘文档/URL 入库 + embedding 检索(TopK)+ 命中解释(chunk/score/source)有差距S高 — 主要差距在自动知识挖掘、命中治理与灰度/A-B
多机器人 / 多场景不同业务线配不同机器人和话术按租户/运营策略维度配置(含路由与策略),非完整多机器人产品形态有差距M高 — 多机器人编排和版本治理仍需产品化
意图流程编排可视化流程画布,按意图分支处理代码级意图分类 + 路由差距大X低 — 拖拽式画布需专业前端框架,AI 编程效率低
个性化回复风格可调语气 / 角色 / 人设system prompt 控制基本持平--
业务系统对接(AI Agent)AI Agent 调用外部 API / 查订单 / 查库存不支持(仅知识库)差距大H中高 — LLM function calling + 工具定义,核心可行
对话变量 / 槽位填充表单收集 + 变量传递不支持缺失M高 — 对话上下文维护 slots 对象,LLM 提取实体
A/B 测试支持多策略对比不支持缺失M中 — 按比例分流 + 对比指标,后端不难
AI 自学习未解决问题自动入库,持续优化客服侧:反馈与运营处理;排障助手侧:75/100 样本自动进入检索池(版本窗口内)有差距M客服侧可继续做「未命中入待审核」闭环
大模型选择多模型切换(通义 / 文心 / GPT)支持 OpenAI 兼容接口切换(默认 DashScope)有差距S高 — 增加模型池和路由策略可对齐商业产品

难度评级: S 简单 M 中等 H 较难 X 极难。已持平项不标注。

三、总结

IM Bridge 的核心优势

  • 私有部署、完全可控 — 无坐席费用,数据不出企业
  • 企微 ISV/代开发流程完整 — 从授权到消息收发一站打通;支持多套服务商套件并行(独立回调与 ticket)
  • 轻量灵活 — 单 Node 进程 + MongoDB,适合快速定制和二次开发
  • 配置外置与可回滚 — 主配置与 suite_ticket 与代码目录分离,配合备份脚本降低升级覆盖风险
  • 内部排障助手 — 面向实施与运维的 AI + 本地证据链,降低「查文档、猜配置」成本,与租户客服数据隔离

与主流产品的主要差距(按优先级,已结合当前实现)

  • P0-1. 智能路由 / 排队体验 — 已具备技能组、队列与运营策略,但等待态体验(排队提示/催单/预估等待)与高级策略(VIP/优先级/负载)仍弱于头部产品
  • P0-2. 会话质检 & 模板化多维报表 — KPI/告警已上线,但自动质检(抽检/全量评分/违规识别)与报表矩阵(模板、对比、钻取)仍需补齐
  • P0-3. AI Agent 工具调用闭环 — 当前以知识库 + 转人工为主;“查订单/查物流/改地址/建工单”等可执行动作与权限/审计仍需建设
  • P1. 标准工单产品 — 仍无开箱即用工单引擎;当前以 Webhook 外挂系统为主
  • P2. 可视化流程编排 — 主要依赖配置与代码,暂未建设完整流程画布
  • P2. 渠道覆盖 — 缺少电话、公众号、社交媒体等增量渠道

AI 个性化方面

  • 核心的 Prompt 控制、知识库 RAG、情感分析、转人工等基础能力已具备
  • 主要差距在 AI Agent(工具调用 / 业务系统对接)可视化编排,这是当前主流产品的核心差异化方向

四、推荐实施路径

按「投入产出比」排序,优先做 AI 编程能高效完成且业务价值大的功能。约 60-70% 的差距功能可通过 AI 编程达到接近主流产品的水平,主要瓶颈在复杂前端交互(可视化编排、监控大屏、CRM 面板)。

第一梯队: 简单高回报(部分已落地,可继续打磨)

  1. 快捷回复 / 话术库 S — 已有后端与客服拉取;可加强管理端分组/搜索/导入导出
  2. 满意度评价 + 统计 S — 已有提交与存储;可加强邀评策略与管理报表
  3. 多模型切换 S — llm-client 加配置项(仍值得做)
  4. 通知中心体验打磨 S — 邮件/短信已上线,可继续优化模板与策略联动

第二梯队: 中等难度,AI 拆步骤可完成

  1. 智能路由 / 排队分配 M — 在现有运营调度上扩展规则、监控与坐席侧体验
  2. 会话转接 M — WebSocket 会话路由修改
  3. 会话质检 (LLM 自动评分) M — 异步调 LLM 对会话评分
  4. AI Agent 工具调用 H — function calling + 业务工具定义
  5. 意图识别提升 M — LLM few-shot 替代规则
  6. 知识库治理(未命中回收 / 去重 / 命中解释 / 刷新策略) M — 基础入库已具备,继续补齐治理闭环与可观测性
  7. SLA 时效管理 M — 与工单或会话闭环深度绑定 + 告警产品化

第三梯队: 较大工程量,需分阶段推进

  1. 工单系统 H — 状态机 + 分配规则 + UI,可拆 3-4 步
  2. 客户信息面板 H — 在标签/画像基础上做全链路轨迹与 UI 深化
  3. 数据报表 H — MongoDB aggregation + 前端图表
  4. 微信公众号适配 M — 新增 platform adapter

暂不建议

  • 可视化流程编排 X — 拖拽式画布需专业前端框架,投入产出不合理
  • 实时监控大屏 H — 锦上添花,非核心刚需
  • 抖音/小红书/微博 H — 平台 API 调试周期长,按业务需求决定
  • 电话语音 - — 话务相关,不做考虑

在线客服 KPI 对标(七鱼 / UDESK)

面向当前系统(RBAC v2、队列与运营策略、通知中心、会话质检与 KPI 看板、管理端 AI 中心「Agent Beta」入口、/agent/ 客服工作台)给出的 KPI 产品能力清单与实施优先级。

一、P0(必须上线)

KPI 分类七鱼 / UDESK 常见能力IM Bridge 目标形态指标示例
会话规模实时会话看板 + 趋势多租户/渠道/技能组实时聚合总会话数、接入数、排队数、转人工数
响应时效FRT/AHT/SLA 全链路会话事件化打点 + 超时告警首次响应时长、平均响应时长、平均处理时长、超时率
服务质量解决率 + 放弃率 + 升级率队列与转接事件统一统计一次解决率(FCR)、排队放弃率、升级率
满意度CSAT 评价与追踪评价采集 + 趋势与分组分析满意率、差评率、评价覆盖率
坐席效率人效与在线状态分析Agent 状态 + 接待行为统计人均接待量、并发会话、在线时长、忙闲占比
队列健康等待体验与积压预警排队时长分布 + 阈值通知平均等待时长、最长等待时长、积压会话数

二、P1(对齐商业产品体验)

三、P2(高阶运营能力)

四、指标口径(建议统一)

指标推荐口径统计粒度
首次响应时长(FRT)会话创建到坐席首条回复的时间会话 / 坐席 / 技能组 / 租户
平均处理时长(AHT)会话关闭时间 - 会话创建时间(可剔除排队段)日 / 周 / 月
一次解决率(FCR)24h/72h 内未再次开启同类问题会话的占比租户 / 业务线
排队放弃率进入队列后未接入坐席即离开的会话占比技能组 / 时段
满意率(CSAT)满意评价数 / 总评价数坐席 / 团队 / 渠道
SLA 达成率在设定响应或处理时限内完成的会话占比策略 / 技能组 / 租户

五、当前系统实施建议(可直接排期)

  1. 先做 P0 仪表盘:优先上线 FRT/AHT/CSAT/排队/SLA 5 组核心指标。
  2. 打通告警链路:与通知中心联动,支持超阈值自动告警。
  3. 增加多维筛选:优先支持“租户 + 渠道 + 技能组 + 坐席 + 时间”。
  4. 补齐 AI 协同指标:新增 AI 命中/转人工/建议采纳率统计。