依据
MULTI_TENANT_MIGRATION_STRATEGY.md的风险地图,梳理当前 MaiMBot 仓库(branch: saas)已暂存的改动,并给出后续在maim_db侧的落地建议。本页已在 2025-12-09 更新磁盘迁移成果。
src/hippo_memorizer/chat_history_summarizer.py- 新增
HippoTopicCache、HippoBatchState模型后,主题缓存/批次读取与持久化完全走 DB(_load_topic_cache_from_db、_persist_topic_cache、_load_batch_from_db)。 - JSON 文件目录
data/hippo_memorizer停止写入,等待一次性历史导入脚本。
- 新增
src/manager/local_store_manager.py- 新的
RuntimeState表承载原data/local_store.json的键值,LocalStoreManagerAPI 向后兼容但内部改为 Peewee 读写。 - 统计/遥测调用通过
RuntimeState隔离租户,部署时不再创建全局 JSON 文件。
- 新的
src/common/utils/tenant_storage.py+src/chat/utils/utils_image.py+src/chat/emoji_system/emoji_manager.py+src/webui/emoji_routes.py- 引入
tenant_storage帮助函数,统一落盘根路径data/tenant_storage/<tenant>/<agent>/...。 - 图片、自动保存 emoji、WebUI/插件上传的注册目录全部改为租户路径,
Emoji/Images表存储 tenant-awarefull_path。 - 仍需把 Emoji 周期扫描迁入
AsyncTaskManager以便按租户调度。
- 引入
src/common/message/tenant_context.py- 引入基于
ContextVar的租户上下文,提供同步/异步 context manager 与便捷 getter(tenant_id/agent_id)。 - 用途:消息入口与后续后台任务可共享同一套上下文注入机制。
- 引入基于
src/common/message/runtime_config.py- 新增可缓存的租户配置运行时:按
tenant_id[:agent_id]生成键,TTL 60s;并发下用 asyncio 锁防抖。 - 通过
prepare_tenant_runtime/reset_tenant_runtime在 ContextVar 中挂载TenantConfigBundle,失败时回退默认配置并发出警告。 - 提供
GlobalConfigProxy/ModelConfigProxy,让配置读取自动透传当前租户 bundle,否则回退默认配置。
- 新增可缓存的租户配置运行时:按
src/config/config.pyglobal_config/model_config现改为上述 Proxy 包装,默认实例保留default_*供调试回退。- 配置加载/模板更新逻辑保持不变,Proxy 仅在访问时切换租户视图。
src/common/message/api.py- API Server 认证/路由层现在解析 API Key 获取
tenant_id/agent_id,带 300s 本地缓存。 message_handler在调用聊天处理前套tenant_context_async+prepare_tenant_runtime,处理完毕后reset_tenant_runtime,保证消息链路使用对应租户配置。- 解析失败时仍按默认上下文处理,记录 warning。
- API Server 认证/路由层现在解析 API Key 获取
src/hippo_memorizer/chat_history_summarizer.py- 替换磁盘 JSON,使用
HippoTopicCache/HippoBatchState表按(tenant_id, agent_id, chat_id)存储主题与批次缓存。 - 启动阶段即从 DB 恢复,运行中通过
_persist_topic_cache原子化写库。
- 替换磁盘 JSON,使用
src/manager/local_store_manager.py- 适配
RuntimeState表,实现键值到 DB 的透明过渡;旧data/local_store.json仅作为可选导入源。 StatisticOutputTask、在线时长等调用全部读写 DB,解决共享文件风险。
- 适配
src/common/utils/tenant_storage.py&src/chat/utils/utils_image.py&src/chat/emoji_system/emoji_manager.py&src/webui/emoji_routes.py- 新 helper 为图片/emoji/缓存提供租户目录;
ImageManager、emoji 自动保存、WebUI 上传、插件 API 全部写入 tenant-aware 路径。 Emoji、Images表的full_path/path字段现记录绝对路径,便于巡检。
- 新 helper 为图片/emoji/缓存提供租户目录;
- 消息入口 + 配置代理 + Hippo 缓存 + RuntimeState + 图片/emoji 目录已经租户化,核心磁盘 JSON 风险基本清零。
- 仍待纳入范围:AsyncTaskManager 的 per-tenant 派发、ChatManager 的缓存拆前缀、统计 HTML 的 per-tenant 输出。
- 配置加载依赖
config_merger.create_agent_global_config / create_agent_model_config,需要确保 maim_db 提供的租户配置数据完整可读;加载失败仍会回退默认配置。 - Emoji 周期扫描尚未套
tenant_context_async,需要等目录/数据库完全租户化后迁移调度器。
- 模型侧支撑:在
maim_db的核心表(ChatHistory, Messages, ThinkingBack, LLMUsage, Emoji, Expression, Jargon 等)补齐tenant_id字段与索引,便于 MaiMBot 侧挂接TenantModel。 - 任务/路由协同:为后续 MaiMBot
AsyncTaskManager拆租户准备配置/接口,确保 WebUI & API 请求能传递 tenant_id/agent_id(与当前 API Key 解析保持一致)。 - 验证与监控:补充租户切换的集成测试用例(消息入口 + 配置读取),并记录当租户配置缺失时的降级/告警策略,避免静默跑在默认租户。
- 文件/缓存规划:在 maim_db 侧同时记录媒体对象/缓存的租户元数据,方便未来跨仓排障;统计 HTML 可迁入 DB 或对象存储并提供租户查询接口。
- 历史数据迁移:提供一次性工具,把旧
data/hippo_memorizer与data/local_store.json的内容导入到新表,完成后可在部署脚本中加入自检。
- 将
TenantContext/配置 Proxy 引入后台任务调度与 ChatManager(防止无上下文的批处理)。 - 与
maim_db同步 schema 变更与配置读写接口,验证config_merger能返回按租户合成的配置。 - 将 Emoji 周期扫描、聊天流自动保存、统计输出等周期任务迁入
AsyncTaskManager,并在调度入口注入tenant_context_async。 - 为 Hippo/RuntimeState/媒体目录编写历史迁移与巡检脚本,纳入部署 checklist。
- 完成缓存前缀化与 ORM 租户化后,回归
MULTI_TENANT_MIGRATION_STRATEGY.md的风险表逐项验证,并新增针对媒体/缓存的测试用例。