Files
2026-08-07 13:36:56 +08:00

12 KiB
Raw Permalink Blame History

LineUp App Server — 项目设计文档

版本:0.1(提案)
日期:2026-07-30
状态:待确认
目标:精简的蓝牙应用服务端,帮助用户与远端 Agent 服务建立连接,实现互相通信


1. 项目定位

1.1 与唐僧叨叨的关系

唐僧叨叨是一个完整的 IM 业务系统(用户/群组/文件/朋友圈/工作台/推送...),模块众多、功能庞大。LineUp App Server 不是唐僧叨叨的副本,而是:

唐僧叨叨:消费级 IM 全栈(群聊、朋友圈、文件、搜索...
LineUp App Server:只做两件事 ——
  ① 用户认证身份 → 接入通讯网络
  ② 消息路由   → 连接用户与 Agent

所以我们不是在唐僧叨叨上改,而是从它那里取经:

  • 复用它的 WuKongIM 集成模式(怎么调用 API、怎么写 Webhook
  • 复用它的 HTTP 路由注册方式(gin 框架 + module 自注册)
  • 复用它的 Webhook 消息处理逻辑(msg.notify、msg.offline 等事件)
  • 丢弃所有跟业务无关的模块(群聊、文件、推送、朋友圈...)

1.2 LineUp App Server 的定义

LineUp App Server 是一个轻量级的通讯网关。 它的唯一职责是:让一个通过蓝牙/WiFi 连接的移动客户端,能够接入 WuKongIM 3.0 通讯网络,并与远端的 Agent 服务进行消息交换。

它不是什么:

  • 不是社交平台(不处理好友、朋友圈、群聊)
  • 不是文件存储(不处理文件上传/下载)
  • 不是推送网关(不处理 APNS/HMS/Mi Push
  • 不是管理后台(不处理统计、审核、工作台)
  • 不是机器人平台(不处理自定义机器人接入)

2. 核心概念

2.1 三种参与者

┌──────────┐     ┌─────────────────┐     ┌──────────┐
│ 用户 Client │ ◄─► │ LineUp App Server │ ◄─► │ Agent 服务 │
│ (手机 App)  │     │   (通讯网关)      │     │ (远端 LLM) │
└──────────┘     └────────┬────────┘     └──────────┘
                          │
                   ┌──────▼──────┐
                   │ WuKongIM 3.0 │
                   │  (消息管道)   │
                   └──────────────┘
  • 用户 Client:运行在手机上的 App,通过蓝牙/WiFi 与 App Server 通信
  • Agent 服务:远端的 AI Agent(如 Hermes),有自己的 WuKongIM 客户端连接
  • WuKongIM 3.0:消息传输管道,负责可靠投递
  • LineUp App Server:通讯网关,负责身份认证 + 消息路由

2.2 消息流转模型

用户发送消息 "帮我查天气"

  ① Client → App Server
     用户 App 通过 HTTP/WS 发送消息到 App Server

  ② App Server → WuKongIM
     App Server 调用 WuKongIM API 将消息投递到 Agent 所在的频道

  ③ WuKongIM → Agent Service
     WuKongIM 将消息推送到 Agent 的 WebSocket 连接

  ④ Agent Service 处理
     Agent 处理请求(可能调用外部工具)

  ⑤ Agent Service → WuKongIM
     Agent 回复消息,发送到 WuKongIM

  ⑥ WuKongIM → App Server (Webhook)
     WuKongIM 通过 Webhook 通知 App Server 有新消息

  ⑦ App Server → Client
     App Server 将消息推送给用户 Client

3. 通信协议分层

┌─────────────────────────────────────────┐
│         LineUp 自定义消息协议             │  ← 业务层
│  (text, choice, progress, canvas...)     │
├─────────────────────────────────────────┤
│         唐僧叨叨消息模型                  │  ← 适配层
│  (Message, Channel, Conversation)        │
├──────────────────┬──────────────────────┤
│  WKProto WebSocket│  HTTP API + Webhook  │  ← WuKongIM 3.0
│  (双向实时, 15200) │  (管理面, 15001)     │
│                  │  (通知面, callback)   │
└──────────────────┴──────────────────────┘

WuKongIM 3.0 的三层能力:

协议 端口 方向 用途
数据面 WKProto WebSocket / TCP 15200 / 15100 双向全双工 客户端收发消息
管理面 HTTP REST API 15001 App Server → WK 用户/频道/消息管理
通知面 HTTP Webhook Callback WK → App Server 事件通知(新消息/离线/在线)

客户端直连 WuKongIM 的 WebSocket (15200),所有实时消息都在这个管道里跑。 App Server 只做两件事: ① 通过 HTTP API 做管理; ② 通过 Webhook 接收事件推送给 Client。


4. 架构设计

4.1 服务端口

LineUp App Server:
  - HTTP API:     :8090     (客户端 REST API)
  - WebSocket:    :8090/ws  (客户端实时推送)
  - Webhook:      :8090/v1/webhook  (接收 WuKongIM 回调)

WuKongIM 3.0: (已部署)
  - API:          :15001    (管理 API: /route, /channel, /message/send...)
  - TCP:          :15100    (WKProto TCP)
  - WebSocket:    :15200    (WKProto WebSocket)
  - Manager:      :15301    (管理后台)

4.2 模块划分

lineup-app-server/
├── main.go                  # 入口:加载配置 → 注册模块 → 启动 HTTP
├── go.mod / go.sum
├── configs/
│   └── lineup.yaml          # 配置:WuKongIM 地址、Token、端口
├── internal/
│   ├── app.go               # App 生命周期:Init → Start → Stop
│   ├── config.go            # 配置结构体
│   └── db.go                # 数据库(轻量,仅存储用户/Token)
└── modules/
    ├── user/                # 用户模块:登录/注册/Token管理
    │   ├── module.go        #   → 模块自注册
    │   ├── api.go           #   → REST: POST /login, POST /register
    │   ├── db.go            #   → 用户数据存储
    │   └── service.go       #   → 业务逻辑
    ├── channel/             # 频道模块:创建Agent对话频道
    │   ├── module.go
    │   ├── api.go           #   → REST: POST /channels, GET /channels
    │   └── service.go       #   → 调用 WuKongIM Channel API
    ├── message/             # 消息模块:收发消息
    │   ├── module.go
    │   ├── api.go           #   → REST: POST /messages, GET /messages/sync
    │   └── service.go       #   → 调用 WuKongIM Message API
    ├── webhook/             # Webhook模块:接收WuKongIM回调
    │   ├── module.go
    │   ├── handler.go       #   → HTTP: POST /v1/webhook
    │   └── event.go         #   → 事件分发:msg.notify → 推送Client
    └── client/              # 客户端连接模块(蓝牙/WS网关)
        ├── module.go
        ├── ws.go            #   → WebSocket: /ws (向Client实时推送)
        └── push.go          #   → 消息推送:把WuKongIM消息推给客户端

只有 6 个模块(vs 唐僧叨叨的 15 个),代码量预计减少 70%+。

4.3 数据库设计(最简方案)

选项 A(推荐起步): 不使用关系数据库,用文件/内存存储

// 用户注册本质上就是向WuKongIM申请一个token
// agent的对话频道和消息都存储在WuKongIM内部
// App Server 本身不需要持久化存储

选项 B(如果需要持久化): SQLite / PebbleDB

-- 极简表设计
CREATE TABLE users (
    uid      TEXT PRIMARY KEY,   -- 用户ID(与WuKongIM一致)
    token    TEXT,               -- WuKongIM Token
    name     TEXT,               -- 显示名称
    created  INTEGER             -- 创建时间
);

5. 核心通讯流程

5.1 用户上线流程

Step 1: Client 通过 HTTP POST /login
  → App Server 验证用户凭证
  → App Server 调用 WuKongIM API 获取 Route 信息
  → 返回 {token, route} 给 Client

Step 2: Client 使用 token 和 route 直连 WuKongIM WebSocket
  → WuKongIM WebSocket: ws://host:15200?token=xxx
  → 这一步完全绕开 App ServerClient 自己跟 WuKongIM 通信

Step 3: Client 同时连接 App Server WebSocket
  → ws://app-server:8090/ws?token=xxx
  → 用于接收实时推送(Webhook 转发过来的消息)

关键设计决策:客户端直连 WuKongIMApp Server 只作为 Webhook 中转。

5.2 发送消息流程

Client → WuKongIM WebSocket (直连)
  → 消息直接写入 WuKongIM,不经过 App Server
  → App Server 通过 Webhook 收到通知后,可以通过 WebSocket 推送给对端

5.3 Agent 连接方式

Agent Service 有两种接入方式:

方式 A(推荐):直接作为 WuKongIM 客户端
  - Agent 用 Go/Python SDK 连接 WuKongIM
  - 收发消息走 WuKongIM 原生协议
  - App Server 完全透明,只做 Webhook 中转

方式 B:通过 App Server API
  - Agent 注册为 App Server 的"特殊用户"
  - 消息通过 App Server 的 HTTP API 中转
  - 适合 Agent 无法直连 WuKongIM 的场景

6. WuKongIM 3.0 集成清单

6.1 调用的 WuKongIM API

API 用途 代码位置
POST /user/token 生成用户 Token modules/user/service.go
GET /route?uid= 获取连接地址 modules/user/service.go
POST /channel 创建 Agent 对话频道 modules/channel/service.go
POST /channel/messagesync 同步频道消息 modules/message/service.go
POST /message/send 发送消息(App Server 代发) modules/message/service.go

6.2 接收的 Webhook 事件

事件 含义 处理方式
msg.notify 新消息通知 推送给对应的 Client WebSocket
msg.offline 离线消息 推送给刚上线的 Client
user.onlinestatus 用户在线状态变化 更新 Agent 在线状态

6.3 v3 兼容性对照(已有验证结论)

功能 状态 备注
Token 生成 API 兼容
Route 查询 格式兼容(uid参数在v3被忽略但不影响)
Channel 管理 API 兼容
Message Send API 兼容
Message Sync v3 使用 channel/messagesync
Webhook 事件名 msg.notify/msg.offline/user.onlinestatus 完全一致
Webhook HTTP v3 原生 HTTP Webhook(不需要改 gRPC 适配)
Message Search 不需要 精简版不做消息搜索
文件上传 不需要 精简版不做文件服务

7. 实施计划

Phase 1: 最小骨架(1-2 天)

目标:Go 项目编译通过,HTTP 服务启动,能连接 WuKongIM 3.0

  □ 创建 go.mod,引入唐僧叨叨的 server/config 和 wkhttp
  □ 实现 main.go:加载配置 + 启动 gin HTTP 服务
  □ 实现 user 模块:POST /login(调 WuKongIM /user/token
  □ 实现 webhook 模块:POST /v1/webhook(接收并打印事件日志)
  □ 手工测试:curl /login → 拿到 token → 用 token 连 WuKongIM

Phase 2: 消息通路(2-3 天)

目标:用户和 Agent 能通过 App Server + WuKongIM 互相发消息

  □ 实现 channel 模块:创建/查询频道
  □ 实现 message 模块:发送消息、同步消息
  □ 实现 client WebSocket:向 Client 实时推送消息
  □ 端到端测试:用户发消息 → Agent 收到 → Agent 回复 → 用户收到

Phase 3: 蓝牙/本地通信适配(2-3 天)

目标:手机 App 通过本地网络连接 App Server

  □ 实现蓝牙发现 / 局域网发现协议
  □ App Server 暴露本地 HTTP 服务(mDNS 广播)
  □ 安全认证:设备配对 Token

Phase 4: 稳定与优化(1-2 天)

  □ 连接断开重连
  □ 消息确认与去重
  □ 监控与日志
  □ 性能调优

8. 参考资料

  • WuKongIM 3.0 源码:wukongim/
  • WuKongIM 3.0 本地环境:infra/wukongim-v3/
  • 兼容性验证:项目状态记录.md §六-§八
  • LineUp App 层架构方案:设计/02.正式方案/lineup-app-layer-architecture.md

本文档为项目设计提案,待确认后进入 Phase 1 实现。