📦liulangjietou / customer_work
← 返回首页
…
⚖️ NOASSERTION📅 创建于 2026-06-13🔄 更新于 2026-10-20

📄 仓库 README

在 GitHub 查看 ↗
来自 GitHub 仓库自述文件 · 版权归原作者所有

customer-work · 基于 AgentScope Java 的企业级智能客服与 Agent 平台

CI Release License Java AgentScope Spring Boot MyBatis-Plus Sa-Token Vue Element Plus Vant MySQL Redis MinIO Nacos XXL-JOB PaddleOCR OpenTelemetry

🚀 第一次使用:快速开始 → 新人必读
📚 查功能、配置和接口:功能与配置全量参考 · 生产接口使用手册 · 部署手册
🛡️ 评估生产边界:企业级 AI 智能体能力与运维边界

作品演示

作品演示

开源贡献

RichardFyoung(liulangjietou)· AgentScope Java PR 贡献者 · PR #2546 已合并

我也是 AgentScope Java 的 PR 贡献者:PR #2546 已于 2026 年 9 月 21 日合并到 main,修复 HITL 人工拒绝工具调用时缺失工具结果事件的问题,并支持自定义拒绝原因。

导航

一、项目定位

customer-work 把典型客服流程落成一套可运行的 Java Agent 系统:从接入与身份校验、会话恢复、知识与工具调用, 到退款审批、转人工工单、CSAT,再到模型发布、评测门禁、FinOps、SLO 与多租户治理。它既能作为可运行的 客服产品参考实现,也能只引入 customer-work-starter,把 Agent 基础设施嵌入已有 Spring Boot 应用; 默认启动成功不等于已经完成真实业务、身份、数据主权与生产环境集成。

  • 技术基线:项目版本 2.4.0,JDK 17、Spring Boot 3.2.5、AgentScope Java 2.0.3;默认模型为 阿里云百炼,同时已接入 OpenAI、Anthropic、Gemini 与 Ollama 模型扩展。
  • 两套产品面:用户侧客服系统(H5 / HTTP / SSE / WebSocket / 工单)与运营控制台(模型、Agent、MCP、 渠道、评测、发布、账单、工单与 AI 编码助手)。
  • 可替换业务后端:工具 Schema 与业务实现分离,订单、售后、知识、商品、会员、投诉等能力通过 tool.backend.* SPI 接入真实系统;用法见全量参考 §6.9。
  • SaaS 与治理:共享库 tenant_id 行级隔离、角色数据范围、主体/租户配额、配置版本、灰度发布、 访问 epoch 撤权、ModelOps / EvalOps / FinOps 与审计链路均已有代码和自动化测试。
  • 默认值有明确边界:客服端租户隔离默认关闭,后台租户隔离与数据范围默认开启;starter 的语义缓存默认关闭, 示例 app 已显式开启;Nacos 热更新、OTel、合成健康巡检仍需显式配置。默认关闭不等于未实现。

1.1 成熟度口径

标记 含义
✅ 已交付 源码、接口/迁移契约和自动化测试均已落地
🟡 可选能力 已实现,但默认关闭或需要 MySQL、Redis、Nacos、模型凭据等外部条件
🧪 有限实现 主链路可用,但存在文档明确列出的能力或生产边界
⏳ 规划中 当前没有可直接启用的完整实现,Roadmap 只描述目标与验收出口

“企业级 / 生产级”描述的是代码中的治理目标与交付能力,不代表任意部署已经自动通过生产验收。 真实 Nacos 往返、多 Pod ACK、生产模型凭据、网络出站策略和浏览器端到端验证仍需在目标环境留证。

1.2 核心术语

术语 本项目中的含义
主体(subject) 已验签用户、匿名 IP、API Key 或后台用户,是配额、记忆与审计的身份边界
access epoch 租户 / 用户访问版本号;冻结、退租或撤权时递增,让旧 JWT / WebSocket 快照失效
fencing 发布 Worker 的单调令牌;旧 Worker 即使恢复,也不能覆盖新 Worker 已发布的配置
contentHash / 缓存代际 配置内容指纹及其对应缓存版本,用来拒绝错配 ACK 和旧请求回写
Outbox 业务事务内先落事件,再异步至少一次投递;消费者必须按稳定事件 ID 幂等
SecretRef 只保存凭据引用和版本,不在业务表、接口或配置载荷中回显明文
AG-UI / A2A 前者是 Agent 与 UI 的事件协议;后者是 Agent 之间的发现与调用协议,两者不等同于模型 API

二、模块与运行边界

模块 默认端口 职责 主要依赖
customer-work-starter — 可复用 Agent 基础设施:模型、会话、记忆、RAG、工具 SPI、治理中间件、审批与工单 AgentScope Java、Spring Boot AutoConfiguration
customer-work-app-server 8080 客服运行面:HTTP / SSE / WebSocket、用户工单与健康检查 customer-work-starter、MySQL;Redis / 对象存储按能力启用
customer-channel 8081 协议与渠道适配:chat-completions、AG-UI、Studio、钉钉 / 飞书 / 企业微信;另含钉钉与微信公众号生产接入 customer-work-starter、渠道连接器
customer-admin-server 8082 运营控制面:模型、Agent、MCP、评测、发布、账单、坐席工作台与 AI 编码助手;可选只读 Git 仓库检索 MCP 端点(admin.gittools.enabled,默认关闭) customer-work-starter、独立 customer_admin 库
customer-work-gateway 8888 可选统一入口,通过 Nacos 发现并路由 app / admin Spring Cloud Gateway、Nacos
customer-admin-web 5174 Vue 3 运营后台 8082 API
customer-work-app 5175 Vue 3 用户 H5:登录、聊天、工单、CSAT 8080 API / WebSocket
flowchart LR
    subgraph CLIENT["客户端与渠道"]
        H5["用户 H5 · 5175"]
        OPEN["HTTP / SSE 调用方"]
        IM["IM 渠道"]
        ADMINWEB["运营后台 · 5174"]
    end

    subgraph RUNTIME["运行面"]
        GW["可选网关 · 8888"]
        APP["app-server · 8080"]
        CHANNEL["channel · 8081"]
        STARTER["starter<br/>Agent 基础设施"]
    end

    subgraph CONTROL["控制面"]
        ADMIN["admin-server · 8082"]
    end

    subgraph STATE["状态与配置"]
        CWDB[("agent_scope_customer_work<br/>业务表")]
        ADMINDB[("customer_admin<br/>管理表")]
        REDIS[("Redis")]
        MINIO[("MinIO")]
        NACOS[("Nacos")]
    end

    H5 --> APP
    OPEN --> GW --> APP
    IM --> CHANNEL
    ADMINWEB --> ADMIN
    APP --> STARTER
    CHANNEL --> STARTER
    ADMIN --> STARTER
    APP --> CWDB & REDIS & MINIO
    GW -. "可选 admin 路由" .-> ADMIN
    ADMIN --> ADMINDB
    ADMIN -. "CustomerWorkFacade 受控访问" .-> CWDB
    ADMIN --> NACOS
    NACOS -. "租户专属运行时配置" .-> APP
  • 根目录 docker-compose.yml 只编排 app-server 与 Redis、MySQL、MinIO、Nacos、XXL-JOB、PaddleOCR, 不包含 admin-server、channel、gateway、两个前端和监控栈。
  • app 业务表与 admin 管理表分库治理;admin 对业务库的跨边界访问必须经 CustomerWorkFacade,不能直接复用管理库 Mapper。
  • Nacos 热更新默认关闭,且是“控制面发布、运行面消费”的单向配置链;租户配置缺失时保留最后安全值,不跨租户回退。
  • deploy/k8s/ 只提供 app / admin 的工作负载、Service、HPA、PDB 和探针,基础设施、Ingress、 网关与前端需由部署环境另行提供。

应用默认暴露 Prometheus 指标;显式开启 OTel 后可导出 agent / model / tool / HTTP span。 独立监控栈 提供 Prometheus、Grafana、Alertmanager、Tempo 与钉钉告警, 启动前需先运行业务服务并配置监控栈自己的 .env。详细配置见 全量参考 §6.13c。

三、架构图与核心流程

3.1 企业智能客服与 Agent 平台全景架构

customer-work 全景架构:触点与输入、接入与上下文、Agent 运行、受控执行、运营控制及反馈闭环

查看可编辑 SVG · 查看高清 PNG(4096 × 3072)

图示按 2026-09-16 的 efc2f159 源码快照绘制。蓝色箭头表示请求与调用,橙色表示运行配置,绿色表示 结果与反馈;虚线框表示可选能力或独立入口。五栏按职责组织,具体入口之间的依赖关系见上一节模块图。

  • 运行面:H5 / HTTP / SSE 对话通过 ChatTurnService 复用单一客服 ReActAgent;/consult 多 Agent、 Harness、渠道和网关分别按入口或配置启用。
  • 受控执行:Agent 经 Toolkit、业务后端 SPI 或 MCP 调用工具;退款申请先经人工决策,再交已配置的执行器。 审批状态与执行状态分别记录,真实支付仍需对接业务系统。
  • 控制与反馈:控制面管理模型、Agent、知识和工具资产,经发布门禁与 Nacos 下发运行配置,实例 ACK 汇总生效状态; 消息证据、工单事件、CSAT、Badcase 与知识候选进入运营改进流程。
  • 数据与部署:MySQL 业务库 / 管理库、Redis、MinIO、Nacos 与 XXL-JOB 各负其责;根 Compose、独立监控栈和 Kubernetes 清单的覆盖范围见上节,生产启用条件见部署手册。

图中关键实现:ChatTurnService、 CustomerServiceAgentFactory、 AgentGovernanceAssembler、 PendingApprovalService、 RuntimePublishWorker。

维护图源与导出 PNG SVG 保留可编辑文字、分组、节点与连线,不嵌入位图或外部资源。修改 SVG 后,使用 librsvg 的 `rsvg-convert` 重新生成 PNG;导出环境需安装中文字体(例如 Hiragino Sans GB、Noto Sans CJK SC 或 Microsoft YaHei)。
rsvg-convert --width 4096 --height 3072 \
  --output docs/assets/architecture-overview.png docs/assets/architecture-overview.svg
两份图稿一并更新,并检查中文缺字、文字越界、连线和源码边界。

3.2 H5 对话、转人工与 CSAT 闭环

H5 的逐消息主链路是单一客服 ReActAgent。多 Agent 编排是独立能力,不在 WebSocket 每条消息中隐式执行。

```mermaid flowchart TD H5["H5 Chat.vue"] -->|"创建会话"| SESSION["POST /api/customer/user/sessions
创建 AI_SERVING 工单"] H5 -->|"WS /ws/user?token=JWT"| UWS["UserChatWebSocketHandler
JWT、租户、accessEpoch 校验"] UWS -->|"chat 帧"| DISPATCH["ChatDispatchService
归属校验、主体配额、用户消息落库"]

DISPATCH --> KEYWORD{"命中转人工关键词?"}
KEYWORD -->|是| HANDOFF["TicketService.requestHandoff<br/>AI_SERVING → WAITING_AGENT"]
KEYWORD -->|否| STATUS{"工单状态"}
STATUS -->|AI_SERVING| TURN["ChatTurnService.stream<br/>统一对话编排"]
TURN --> CHAT["CustomerServiceService.chatStream"]
STATUS -->|PROCESSING / ON_HOLD| AGENTWS["转发给已受理坐席 /ws/agent"]
STATUS -->|WAITING_AGENT / WAITING_CONFIRM| NOTICE["返回排队或待确认提示"]

CHAT --> CACHE{"语义缓存命中?<br/>安全意图 + 租户分区 + 配置代际"}
CACHE -->|命中| REFILTER["缓存答案切片<br/>重新执行出站敏感词过滤"]
CACHE -->|未命中| FACTORY["CustomerServiceAgentFactory<br/>构建主 ReActAgent"]
FACTORY --> GOV["AgentGovernanceA

📈 近 7 天 Star 趋势

每日新增 Star(柱)与累计 Star(线)· 数据来自 GitHub

🏆 排名变化趋势

在各榜单中的排名历史(数字越小越靠前)

📋 历史上榜记录

每次快照的详细数据
日期 榜单 排名 周期新增 总 STAR