wecom-tool-result-hotfix-20261102.md 5.4 KB

企微身份工具返回格式定向修复

实际故障:Hermes工具框架只接受字符串或特定_multimodal字典,已安装的两个handler返回普通dict,工具调用后结果被框架拒收。此前测试仅调用handler并验证dict内容,没有覆盖真实返回值归一化;这是本次测试遗漏,不能把旧隔离测试通过当成实际工具契约通过。

两文件改动

  • workshop_registration.py:现有处理逻辑保留为内部函数,唯一对外注册函数统一json.dumps(..., ensure_ascii=False),成功、参数拒绝、上下文失败、配置异常、worker失败及通用异常全部输出字符串。
  • identity_bridge.py:只将注册到工具表的_handler改为JSON字符串;current_identity内部函数继续返回dict,供登记handler直接核验。不能把内部函数一并改字符串,否则会破坏登记入口。
  • 查询工具的零参数约束同步落实在handler;内部受控调用和当前消息ContextVar来源不变。

不修改registry.py/framework,不增加_multimodal伪信封,不改适配器、插件入口、配置、registration.json、Skill十文件、冻结r7或后台Function。

先纠正副作用口径

“模型没收到结果”不等于“没有执行”。框架返回值检查发生在handler执行之后,Node worker可能已经创建本地员工档案;也可能是错误dict被框架拒收。现阶段结论只能是“登记结果未能送达,档案状态待核实”。停止无意义重复调用,保留本地身份目录,不删档案、不换员工键、不造身份JSON恢复。

修复后新的真实消息若changed=false可能正常,表示之前已经落盘;不要求第一次拿到回执必须changed=true。以同员工同bot的profile.key稳定、currentMessageChecked=true和受控归属核对作为通过判据。已知这类异常可能有副作用,后续任何写工具出现结果交付失败都应先回读状态,不能直接认定没写。

运维执行步骤

  1. 停在身份登记验收,不继续业务写入/K轮。新包独立解压,校验FILES.sha256与HOTFIX.json两文件旧/新hash。旧v4包和其他包保持原件。
  2. 使用目标Python做语法检查。root运行python3 scripts/install-wecom-tool-result-hotfix.py为只读计划,目标固定/opt/hermes/plugins/platforms/wecom。只能识别HOTFIX.json声明旧版或本修复版,不修改指纹放行。
  3. root运行同一脚本 --apply --backup-dir /opt/data/已核实受控备份父目录/本次新目录。父目录须预先存在;备份目录必须不存在。脚本仅修改两个平台文件,备份旧内容、属主、权限,写前复核,原子替换并回读,失败按当前版本保护回退。不会自动重启或写身份状态。
  4. 重启前,用目标实际Python和hermes用户在独立临时目录跑随包test/workshop-registration.test.py。设置KSF_ADAPTER_REVIEW_ROOT为包内baseline,KSF_REQUIRE_REAL_TOOL_REGISTRY=1,目标/opt/hermes进入PYTHONPATH,让测试真正导入tools.registry并调用框架的返回值归一化方法;本测试只使用临时构造身份和Node档案,不发送企微消息,不读生产身份配置,不访问数据库。真实registry不可导入或接口不匹配就停并回报实际接口,不关闭开关冒充验证通过。
  5. 本包另有test/wecom-tool-result-install.test.py验证只读/安装/重复执行/失败回退/并发修改保留,KSF_TOOL_HOTFIX_BASELINE指包内baseline。运行其临时目录测试不会改生产文件。Skill路径与包内布局保持一致,Node须能找到。
  6. 静态/真实框架格式测试通过后,按已授权服务方式再重启一次:docker exec agent-node-u17879018108 /command/s6-svc -r /run/service/gateway-default。先记录当前PID,确认新PID、插件工具加载、企微订阅;失败停,不循环重启、不自动docker restart。三组此前已停止预览不重建,不动其它容器。
  7. 恢复后通知用户向王刚001发一条新的真实消息,调用ksf_register_current_employee({})。只回脱敏回执,不让模型调用查询工具再转述原身份。成功再用第二条新消息确认同键复用changed=false。归属核对通过后才继续原完整业务验收。

真实框架测试命令示意

以hermes用户执行,<解压绝对目录>替换为真实路径;HOME/HERMES_HOME=/opt/data。不要把实际身份/密钥写进环境变量。

PYTHONPATH=/opt/hermes KSF_ADAPTER_REVIEW_ROOT=<解压绝对目录>/baseline KSF_REQUIRE_REAL_TOOL_REGISTRY=1 /opt/hermes/.venv/bin/python3 <解压绝对目录>/test/workshop-registration.test.py

本地9项登记与组合工具测试通过、3项安装器测试通过;本地没有Hermes真实registry,因此本地结果仅证明输出为str且可解析、原身份边界及Node复用行为保留,真实框架与真实企微仍须目标验证。不要再将“隔离加载注册2个工具”当“返回值已被真实框架接收”。

回退与后续

回退按此次备份只恢复这两文件,恢复前核当前仍为本次新hash;并发外部版本不覆盖。代码回退不删除已登记员工档案,也不恢复已暴露凭据。回退如需服务生效按受控恢复处理,不在失败后盲目多次重启。

新的两文件及完整指纹留存到既定持久化重放材料中。仅重放原v4会恢复dict故障,容器重建时应先核基线→原v4→本返回格式修复→最后核新hash。原包清单不改,本补丁独立留档。