83 lines
6.3 KiB
Markdown
83 lines
6.3 KiB
Markdown
# 智能体(角色与规则)已部署
|
||
|
||
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 刷新一次即可看到新页面,桌面客户端不用重装。
|