examples/openclaw-plugin/openclaw-multi-tenant-test-report.md
本轮测试围绕 examples/openclaw-plugin 的多租户与会话身份透传能力展开,重点验证以下目标:
api_key 与 trusted 两种服务认证模式下的请求头行为是否正确。viking://user/memories 与 viking://agent/memories 正确展开为 canonical URI。senderId / requesterSenderId 是否能够稳定映射为会话消息的 role_id。afterTurn 与 memory_store 两条写会话路径的身份语义是否一致。在 OpenClaw 之前,先通过 OpenViking HTTP API 直接验证服务端状态与数据面:
curl 调用 /health、/api/v1/system/status、/api/v1/search/findviking://user/default/memoriesviking://user/default/agent/main/memoriesviking://agent/main/memoriesviking://agent/main/user/default/memoriesreindex,确保召回验证基线可用通过真实 OpenClaw gateway 与 OpenViking 后端联调验证:
19950:用于 api_key 模式与命名空间矩阵验证19960:用于 trusted 模式与 role_id 验证before_prompt_buildfind POSTsession message POSTsession commit POST针对 role_id 透传行为,使用真实机器人私聊/群聊场景复核:
role_id 的稳定映射role_idmemory_store 路径是否能通过 requesterSenderId 写出 role_idapi_keytrustedtrusted + root_api_keyff:user 不按 agent 隔离,agent 不按 user 隔离tf:user 按 agent 隔离,agent 不按 user 隔离tt:user 按 agent 隔离,agent 按 user 隔离agentScopeMode=agentafterTurn.runtimeContext.senderId -> role_idmemory_store.requesterSenderId -> role_idrole_id| 维度 | case | 结果 | 说明 |
|---|---|---|---|
api_key | api_key_without_key_dev | 通过 | 不再合成 default/default 租户 header |
api_key | personal_token_default | 通过 | 命中 DEFAULT_USER_TOKEN_19950 |
api_key | agentid_prefix_worker | 通过 | 实际 agent 值为 worker_main |
| 兼容 | deprecated_agent_alias | 通过 | agentScopeMode=agent 兼容正常 |
| 覆盖优先级 | new_policy_overrides_deprecated | 通过 | 新 policy 覆盖旧 alias |
| namespace | ff_user_token | 通过 | user 共享空间命中正确 |
| namespace | ff_agent_token | 通过 | agent 共享空间命中正确 |
| namespace | tf_user_token | 通过 | user 按 agent 隔离命中正确 |
| namespace | tf_agent_token | 通过 | agent 共享空间命中正确 |
| namespace | tt_user_token | 通过 | user/agent 双隔离命中正确 |
| namespace | tt_agent_token | 通过 | agent/user 双隔离命中正确 |
trusted | trusted_without_key | 通过 | 无 key trusted 路径正常 |
trusted | trusted_with_key | 通过 | 带 key trusted 路径正常 |
trusted | trusted_root_key_required | 通过 | 不带 key 被服务侧拒绝 |
trusted | trusted_root_key_optional_ok | 通过 | 带 root key 正常 |
senderId -> role_id | senderid_trusted_user_msg | 通过 | telegram:12345 -> telegram_12345 |
senderId -> role_id | senderid_trusted_blank | 通过 | role_id:null |
senderId -> role_id | senderid_sanitize_symbols | 通过 | wx/user-01@abc -> wx_user-01_abc |
| 真实机器人 | 私聊 sender 映射 | 通过 | sender 稳定映射到真实 role_id |
| 真实机器人 | 群聊多成员 role_id | 通过 | 不同成员落不同 role_id |
memory_store | requesterSenderId -> role_id | 通过 | memory_store 已使用 requesterSenderId 写出真实 role_id |
| 项目 | 状态 | 说明 |
|---|---|---|
agent_token_main_default | 已打通 | 曾出现一次回答少 _19950,属于回答精度问题,不是链路问题 |
| 真实机器人最终回复 | 非插件问题 | 群聊/私聊中出现的 Something went wrong... 已定位在 OpenClaw 工具结果回填阶段,与 OpenViking 插件链路无关 |
role_id 透传能力已完成联调验证。afterTurn 路径可通过 runtimeContext.senderId 正确写出 role_id。memory_store 路径在工具上下文中无法直接读取 senderId,但可稳定通过 requesterSenderId 写出 role_id。role_id,且 assistant message 保持 role_id:null。api_key + USER 的 role_id 语义收紧,应补充一条显式兼容说明或服务端协同约束。memory_store 与 afterTurn 跨会话一致性复测