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

6.3 KiB
Raw Blame History

智能体(角色与规则)已部署

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)

回退:

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 刷新一次即可看到新页面,桌面客户端不用重装。