- Vue 49.4%
- JavaScript 29.5%
- Java 19.7%
- SCSS 1.1%
- HTML 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| backend-reference | ||
| hermes_chat_uniapp_api | ||
| hermes_chat_uniapp_ui | ||
| spa-reference | ||
| README.md | ||
| WIN11-更新说明.md | ||
Win10 小程序开发交接包(Cursor 直接使用)
本目录由 YuanZhou 仓库对话整理导出,供 Windows 10 Cursor 继续开发
hermes_chat_uniapp_*。
文中路径均为相对路径(相对本交接包或相对 monorepo 根),不含本机绝对路径。
Win11 端后续联调 / 体验版更新(必读): 见同目录 WIN11-更新说明.md。
本包内 hermes_chat_uniapp_* 为较早源码快照;以 monorepo 根目录最新工程为准,不要用快照覆盖最新代码。
1. 本包目录结构
win10-miniprogram-handoff/
├── README.md ← 本文件(必读)
├── WIN11-更新说明.md ← Win11 联调后增量说明(无完整源码)
├── hermes_chat_uniapp_api/ ← 小程序 BFF 快照(可能落后于仓库)
├── hermes_chat_uniapp_ui/ ← uni-app Vue3 快照(可能落后于仓库)
├── spa-reference/ ← Web SPA 关键实现(对齐功能时对照)
│ ├── api/ dashboardAuth / dashboardAudio
│ ├── components/ ChatMessageList / ChatComposer / SessionHistoryList
│ ├── utils/ tuiGateway / assistantDisplay / attachFiles / holdToTalk
│ └── views/ ChatView.vue(会话/流式/新建/删除核心)
└── backend-reference/ ← 能碳侧角色→profile 与 handoff 参考 Java
├── HermesChatRoleSupport.java
├── HermesSpaController.java
└── HermesSpaHandoffServiceImpl.java
在 Win10 上建议:直接在 YuanZhou monorepo 里打开最新的
hermes_chat_uniapp_api + hermes_chat_uniapp_ui;本包主要用于文档、SPA 参考与历史快照对照。
2. 产品目标(小程序)
| 项 | 约定 |
|---|---|
| 工程名 | hermes_chat_uniapp_api(Spring Boot)、hermes_chat_uniapp_ui(uni-app Vue3) |
| 功能对齐 | 先对齐 Web SPA(登录、profile、会话列表、发消息、流式、语音转写代理) |
| 前端职责 | 只做页面;鉴权/Hermes HTTP 走 BFF;会话与流式走 TUI WebSocket(同 SPA) |
| 数据库 | 暂无库;平台用户写在 application.yml 的 app.users |
| 不走 Telegram | Telegram/企微等是 Messaging Gateway「挂在对方 App」;小程序是自研 UI,应对齐 SPA 的 BFF + TUI |
3. 架构与数据流(必懂)
3.1 两条 Hermes 通道(不要混)
| 通道 | 用途 | 小程序是否用 |
|---|---|---|
| Messaging Gateway(Telegram / Weixin / 企微…) | Hermes 当 bot 挂在第三方 IM | 否(不是小程序架构) |
TUI Gateway(Dashboard /api/ws + JSON-RPC) |
SPA / 大屏 / 小程序自研聊天壳 | 是(与 SPA 同协议) |
OpenAI 兼容 /p/{profile}/v1/chat/completions |
能碳旧 SSE BFF | 小程序当前骨架未主用;管理端 SPA 已转 TUI |
3.2 小程序登录与 Hermes 校验(BFF)
1) 用户在小程序输入账号密码
2) POST /api/auth/login
- 查 app.users(YAML):未命中 → 「用户未注册,请先注册」
- 命中后按 hermes.* 代登 Dashboard(password-login)
- 再调 /api/auth/me 校验 Dashboard 会话
- 签发平台 token(内存 SessionStore),服务端保存 Hermes Cookie
3) 后续请求:Authorization: Bearer <token>
4) GET /api/hermes/profiles → 代理 Dashboard profile 列表
5) POST /api/hermes/ws-handoff → 返回 { wsUrl, ticket, ttlSeconds }
6) 小程序 uni.connectSocket(wsUrl?ticket=...) → TUI JSON-RPC
- session.list / session.create / session.resume / session.delete
- prompt.submit + 事件 message.delta / message.complete
7) POST /api/hermes/audio/transcribe → 语音转写代理(Cookie 在 BFF)
重要: hermes.dashboard-base-url 不要用会 HTTP→HTTPS 301 的 SPA 域名 :80。
BFF 代登应直连 Hermes 主机(如 hermes-prod... 或本机 Dashboard :9119)。
浏览器/小程序侧 WS 用 hermes.public-ws-url(须 wss,常经 SPA 同源 /__hermes/)。
3.3 能碳管理端嵌入 SPA(对照,非小程序本体)
- 能碳登录后 iframe:
VUE_APP_HERMES_CHAT_SPA_URL/VITE_HERMES_CHAT_SPA_URL - BFF:
POST /business/hermes/spa/ws-handoff→ ticket + lockedProfile + wsUrl - 角色 → profile(已定稿):
| 能碳角色 | Hermes profile |
|---|---|
超级管理员 / role_key superadmin / admin / manager |
<项目名>-admin |
| 其它普通用户 | <项目名>-user |
| 大屏 unicode handoff | <项目名>-user(不是 admin) |
参考实现:backend-reference/HermesChatRoleSupport.java
勿只用 SysUser.isAdmin()(若依常仅 userId=1),否则 manager 会错锁到 user。
中华六建已同步同类逻辑;管理端嵌的是远程 SPA 域名,气泡/结论过滤改的是 SPA 工程,需重新构建发布 SPA 才生效。
4. SPA 消息渲染逻辑(空白气泡 /「结论」)
复杂任务时 Hermes 会多次 message.delta / message.complete(工具轮、中间帧)。
4.1 旧问题
- 空 delta / 无正文 complete 仍建「助手」气泡 → 堆空白框
- 列表曾放行
streaming空气泡
4.2 现行产品规则(已写入 SPA 参考代码)
界面只渲染从「结论」起的助手正文;中间过程一律不显示。
关键文件:
spa-reference/utils/assistantDisplay.js—extractConclusionContent/hasConclusionContentspa-reference/views/ChatView.vue— 事件处理、rawContentvscontent、prunespa-reference/components/ChatMessageList.vue—visibleMessages过滤
标记识别(节选):结论、结论:、**结论**、# 结论、## 结论。
小程序应对齐同一展示规则(可直接移植 assistantDisplay.js)。
4.3 「新建」会话坑
删除会话后往往会自动补建 live session;「新建」若再走 ensureLiveSession 的 early-return(已有 sessionId 直接 return)会无反应。
SPA 已改为强制 session.close(若有)→ session.create。见 ChatView.vue 的 createNewSession。
5. 已落地的小程序工程说明
5.1 hermes_chat_uniapp_api(本包内完整源码)
- Spring Boot 2.7,风格对齐能碳(
R/ 包结构),未整仓拷贝 qlcloud 多模块(避免强依赖库) - 端口默认 8088
- 演示用户(
application.yml):demo/demo123、admin/admin123 - 主要接口:
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/auth/login |
平台用户 + Hermes 代登 |
| POST | /api/auth/logout |
退出 |
| GET | /api/auth/me |
平台用户信息 |
| GET | /api/hermes/profiles |
profiles |
| POST | /api/hermes/ws-handoff |
wsUrl + ticket |
| POST | /api/hermes/audio/transcribe |
语音 |
| GET | /api/hermes/files/download?path= |
文件 |
配置项前缀:app.users、hermes.dashboard-base-url、hermes.public-ws-url、hermes.dashboard-username/password 等。
启动(Win10):
cd hermes_chat_uniapp_api
mvn spring-boot:run
5.2 hermes_chat_uniapp_ui(本包内完整源码)
- uni-app Vue3 + Vite 模板改版
- 页面:
pages/login/login、pages/chat/chat - 环境变量:
.env.development中VITE_API_BASE=http://127.0.0.1:8088 - TUI 客户端:
src/utils/tuiGateway.js(uni.connectSocket) - RPC:
session.list/session.create/session.resume/prompt.submit
本地启动:
cd hermes_chat_uniapp_ui
npm install
npm run dev:h5
微信:
npm run dev:mp-weixin
用微信开发者工具打开:hermes_chat_uniapp_ui/dist/dev/mp-weixin,开发期勾选「不校验合法域名」。
5.3 小程序功能进度(已被 Win11 更新说明覆盖)
下列项在 monorepo 最新工程 中多数已完成,细节见 WIN11-更新说明.md:
- 助手展示仅「结论」起
- 附件上传(25MB,
image.attach_bytes/file.attach) - 按住说话 UI + BFF 转写
- Markdown / echarts(导出为图片进列表)
- DeepSeek 风格 UI;侧栏 profile+刷新
- 微信合法域名与体验版上传(代码质量已通过一轮)
- 删除会话后强制「新建」是否与 SPA 完全一致(建议再对一下)
发体验版:npm run build:mp-weixin → 导入 dist/build/mp-weixin(勿用 dist/dev)。
6. SPA 参考要点速查
| 能力 | 参考文件 |
|---|---|
| 密码登录 / profiles / ws-ticket | spa-reference/api/dashboardAuth.js |
| 语音转写 | spa-reference/api/dashboardAudio.js |
| WS JSON-RPC | spa-reference/utils/tuiGateway.js |
| 附件体积 25MB | spa-reference/utils/attachFiles.js → MAX_ATTACH_BYTES |
| 流式与会话 | spa-reference/views/ChatView.vue |
| 结论过滤展示 | spa-reference/utils/assistantDisplay.js |
常见 RPC:
session.list{ profile, limit }session.create{ title, source: 'web', profile }session.resume{ session_id, profile }session.close/session.deleteprompt.submit{ session_id, text }- 事件:
message.delta/message.complete/gateway.ready
发消息:prompt.submit(不是 chat.send)。
7. 给 Win10 Cursor 的执行提示(可直接粘贴)
你在开发 Hermes 小程序:后端 hermes_chat_uniapp_api,前端 hermes_chat_uniapp_ui。
功能对齐 Web SPA(本交接包 spa-reference),前端只做页面。
硬约束:
1) 平台用户在 application.yml 的 app.users,无数据库;未注册提示「用户未注册,请先注册」;登录后必须 Hermes Dashboard 代登校验。
2) 会话/流式走 TUI Gateway(ws-handoff 的 wss + ticket),不要用 Telegram Messaging 路径。
3) 助手气泡只展示从「结论」开始的内容;中间轮不展示(见 spa-reference/utils/assistantDisplay.js)。
4) 附件单文件上限 25MB(对齐 SPA)。
5) 修改时先读本包 README.md 与 spa-reference,再改 uniapp 工程。
当前优先:以 monorepo 最新 uniapp 工程为准;先读 WIN11-更新说明.md;剩余可对 SPA「删除后强制新建」、线上 nginx/frpc 与体验版真机回归。
8. 相关 monorepo 工程(在完整仓库中的相对路径)
若 Win10 克隆了完整 YuanZhou 仓库,除本交接包外还可对照:
| 相对路径 | 说明 |
|---|---|
hermes_chat_spa/ |
正式 SPA 源码(生产发布对象) |
hermes_chat_uniapp_api/ |
小程序 BFF(以这里为准) |
hermes_chat_uniapp_ui/ |
小程序前端(以这里为准) |
win10-miniprogram-handoff/WIN11-更新说明.md |
Win11 联调增量文档 |
yuanzhou_api/.../HermesChatRoleSupport.java |
角色→profile |
yuanzhou_api/.../HermesSpaHandoffServiceImpl.java |
SPA/大屏 handoff |
yuanzhou_ui/.../agentChat/ |
管理端 iframe 嵌 SPA |
zhonghualiujian_*(若旁挂) |
中华六建已嵌 SPA;角色映射已同步 |
9. 已知生产注意
- BFF
dashboard-base-url打到 SPA 域名:80会 301,代登失败;应打 Hermes/Dashboard HTTP 口。 - HTTPS 小程序/页面禁止
ws://,必须用wss://.../__hermes/api/ws一类配置。 - 中华六建嵌远程 SPA:改气泡逻辑后必须 重新发布 SPA 静态资源,只发能碳 jar 不够。
- SPA 单附件默认上限 25MB。
- 小程序公网 BFF 示例域名:
https://uniappApi.bingjun360.com;socket:wss://spa.bingjun360.com。内网 nginx 示例见WIN11-更新说明.md§7。
10. 版本与日期
- 交接包初版整理:2026-09-16
- Win11 增量文档:同日下午(联调 + 体验版上传后)→
WIN11-更新说明.md - 快照范围:初版导出的 uniapp 双工程 + SPA/能碳关键参考;功能以仓库最新提交为准
- 本包用于 Win10 旁路启动上下文与文档,不替代 monorepo 源码