Files
kefu/deploy/agents-deployed.md
T
2026-09-21 10:34:06 +08:00

83 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 智能体(角色与规则)已部署
2026-09-15 已更新服务器 192.168.110.111 的 /opt/im-admin。管理 API 与模型网关均 healthy,重启计数均为 0,容器日志无 error/traceback。
全程走内网:开发机到服务器的 SSH 把源地址绑在有线网卡(192.168.123.43 → 192.168.110.111),绕开本机 Clash 的 TUN 默认路由;验证只用服务器本机 127.0.0.1 和内网 http://192.168.110.111:8369,没有经过公网域名。
## 这次发了什么
后台新增「AI 模型 → 智能体」:一个智能体 = 人设 + 一组规则(guide 补充指令 / forbid 禁止措辞 / reply 固定口径),支持单角色切换与多角色协作。客户端随配置下发即可生效,不用发版。
同时修掉了线上那条错误回复:客户发来血糖值「13」,模型回"这串像系统编码"。提示词、会话指令、出口兜底三处都加了拦截,最后一道关不掉也不依赖配置。
变更文件:`agent_rules.py`(新增)、`admin_api.py`、`admin_backend.py`、`ai_chat.py`、`ai_config.py`、`rbac.py`,以及两个测试文件。本地 → 服务器磁盘 → 运行镜像三处 md5 一致。
## 数据库
`migrate()` 自动建了 `agents` / `agent_plan` 两张表,并播种了「健康顾问」「客户经理」两个角色,默认协作上岗(主答健康顾问)。没有改动任何既有表。
迁移后抽查:archive_message 412776、archive_conversation 12151、archive_person 30111、archive_source_account 14、desktop_accounts 15、model_providers 3、users 1;`PRAGMA quick_check` = ok。配置版本 18、角色编排 v3(shadow)均未受影响。
## 验证
- `/api/v2/health` 200、网关 `/health` 200
- `/api/v2/agents`、`/api/v2/agents/plan` 未登录返回 401(路由存在且鉴权生效,不是 404)
- 前端新页面分片 `js/agents-Bc3MTwV9.js` 200,index.html 200
- 镜像内跑 `test_agent_rules` + `test_admin_api.AgentApiTest`,36 个用例全过
- 用生产库核对:智能体 2 个、方案 collaborate、桌面端下发的 config 里带 `AI_AGENTS` 和 `AI_AGENT_PLAN`
## 备份与回退
- 源码备份:`/home/ps/agents-20260915-104843/source-before`(wechat_rpa + admin-web)
- 数据库与密钥备份:`/opt/im-admin/deploy/im-admin/data/backups/agents-20260915`(3.2G,停机状态下复制,一致)
- 原镜像标签:`zyt/wecom-admin:before-agents-20260915`(b91db70dfc15)
- 新镜像:`zyt/wecom-admin:agents-20260915` = `:current`(195d6399b550)
回退:
```bash
cd /opt/im-admin/deploy/im-admin
docker tag zyt/wecom-admin:before-agents-20260915 zyt/wecom-admin:current
docker compose up -d --no-build api gateway
```
新表是纯新增,旧代码不读它们,所以回退不用恢复数据库——恢复反而会丢掉发布后新增的聊天。要连源码一起回退时,把 `source-before` 拷回 `/opt/im-admin`。
## 构建方式
前端在服务器上用 Node 24.18 + pnpm 11.16(corepack,装在 `~/bin`,npm 源已是 npmmirror)构建;镜像从独立暂存目录 `/home/ps/agents-20260915-104843/build-ctx` 构建,避开 `/opt/im-admin/backups` 的 root 私有目录导致 ps 账号无法遍历的问题——这条沿用上次发布的做法。构建完已删掉 node_modules,暂存目录现在 32M。
## 补一刀:权限码刷新(同日第二次发布)
页面上线后发现所有写操作按钮都是灰的、下拉框点不动,但菜单能看见。不是权限没配,是前端的 bug:
`roles`(路由按它过滤)每次刷新页面都会重新拉一次 `/me`,而 `accessCodes`(按钮显隐按它判)只在**登录那一次**写过,并持久化在 localStorage 里。两份数据同源却不同步,所以后端新增一个权限码之后,已经登录的浏览器里就是"菜单看得见、按钮点不动、刷新多少次都不好、只有退出重登才好"。
修法是在 `store/auth.ts` 的 `fetchUserInfo()` 里把 `accessCodes` 一起刷新——两份数据同源,就该在同一处更新。这个坑对以后每一个新增权限码都成立,不只是智能体。
新镜像:`zyt/wecom-admin:agents-20260915b` = `:current`。回滚标签仍是 `before-agents-20260915`。新的前端分片:`agents-CBQknC0u.js`、`store-y5EHvASf.js`。
## 再补一刀:账号下拉框默认「全部」(同日第三次发布)
原来六个页面(调用统计、归档概览、会话与消息、导出中心、人员唯一标识、COS 存储)右上角的账号下拉框只能选一个具体账号,进页面先看到的是"某一个人"。现在多了一档「全部账号」,并且是默认值。
范围有三档,翻译成 SQL 的地方只有一处(`archive_store.TenantScope` / `admin_backend.tenant_filter`)——这段条件要拼进十来条 SQL,每条的表别名还不一样,散着写漏掉一处就是安静地多给几行别人的数据:
| 选择 | 传给后端 | 含义 |
| --- | --- | --- |
| 全部账号 | `account_id=-1` | 有 `desktop-account:all` 的 → 不限租户;只被授权到若干账号的 → 只看这几个 |
| 旧版未归属数据 | `account_id=0` | `tenant_id` 为空或 `default` 的老记录 |
| 某个账号 | 账号 id | 那个账号的租户,先过授权检查 |
**看数据可以跨账号,写不行**:新建导出、绑定人员标识、关联/解除患者都必须落到一个确定的账号名下,「全部」下会明确报错并说清楚该怎么做(前端也各挡了一道,不用等一次往返)。
前端换了 localStorage 的 key(`wecom-archive-account-id` → `wecom-archive-account-scope`)。不换的话,所有老浏览器里都存着一个具体账号,升级后第一眼看到的还是"只有某一个人"。
新镜像:`zyt/wecom-admin:allscope-20260915` = `:current`。
线上实测(3.5G 库、41 万条消息,容器内直连):归档概览 91ms、会话列表 15ms、人员列表 18ms、素材列表 99ms、导出任务 1ms。调用统计约 1.2 秒——但那是它本来就这样,单账号 1196ms、全部 1184ms,和这次改动无关(`model_calls` 才 2629 行,慢在别处,另案)。
## 待办
`agent:read` / `agent:write` 是新权限码。管理员在重启时由 `rbac.seed` 自动补齐;**配置员和只读用户需要在「角色权限」里手动勾选**,否则看不到这个菜单。
管理员浏览器按 Ctrl+F5 刷新一次即可看到新页面,桌面客户端不用重装。