Files
bisheng/docs
LineWalker eee2d68570 feat(F022): LLM 系统模型默认配置按租户隔离
5 类系统级 LLM 默认选择(knowledge_llm / assistant_llm / evaluation_llm
/ workflow_llm / linsight_llm)从全局唯一的 config 表行升级为按租户隔离
存储于新表 tenant_system_model_config + Root 共享 fallback。修订 F020
AD-07 / AC-11 决策。

后端核心:
- 新表 + ORM/DAO(5 fallback 分支:own / Root-share-on / Root-share-off
  / 缺失),单一 with bypass_tenant_filter 块覆盖跨 scope 读
- alembic F034:dialect-aware(MySQL INSERT IGNORE / sqlite INSERT OR
  IGNORE + LONGTEXT.with_variant)+ INSERT IGNORE 幂等 backfill;
  downgrade 仅 DROP 新表,旧 config 5 行作为 rollback 锚点保留
- 共享 alembic_helpers.online.{table_exists, column_exists}(F033/F034 共用)
- LLMService 5 类 get/aget/sync_get/update + 5 个 _with_meta 变体(保单值
  BC + 仅 router 用 envelope),全部 thin delegate 到 _aget_typed_with_meta
  / _get_typed_sync 私有 helper;_resolve_tenant_id 统一 explicit > ContextVar
  > Root 优先级,Celery worker fallback warn log + 监控指标
- Router 5 POST 端点 _assert_can_write_system_config 防御性 FGA 校验 +
  _read_before_snapshot + _audit_system_config_update(复用 JsonFieldMasker
  脱敏);5 GET 端点统一 envelope 包装;19803 Msg 修订为"Cross-tenant
  write forbidden"

消费侧 INV-T18 落地:
- Workflow → GraphEngine → BaseNode tenant_id 透传链;tasks.py 一次解析
  Flow.tenant_id 同时透传 RedisCallback + Workflow
- 资源场景按 owner 显式注入 tenant_id:knowledge_imp / knowledge_utils /
  abstract+file_encoding transformer / evaluation / linsight task_exec /
  4 workflow 节点 共 14 处
- SOP 全局共享 collection(col_linsight_sop)防御性锚到 ROOT_TENANT_ID
  防止跨 tenant embedding 错乱(4 处,加注释)
- 删 dead code decide_knowledge_llm / async_decide_knowledge_llm
- 新模块注册到 _TENANT_AWARE_MODEL_MODULES 启用全局 tenant filter

前端:
- finetune.ts 5 envelope getters + legacy unwrap(滚动部署 BC 兜底)
- 新 SystemConfigBanners 共享组件(ScopeBanner 3 状态 + Inherited Badge
  + FallbackBlocked Banner);新 useSystemConfigEnvelope hook 4 简单 Tab
  共用;WorkbenchModel 用 useQuery(独立模式不动)
- SystemModelConfig.tsx 接 useAdminScope + isGlobalSuperUser 渲染顶部 banner
- 6 个 i18n key × 3 语言(en-US / ja / zh-Hans)

新增不变量:
- INV-T17:跨 tenant 写系统配置返 403 + 19803
- INV-T18:消费侧 tenant 解析规则(owner 优先 / ContextVar fallback /
  Celery 必须显式带 tenant_id)

测试:
- 109 passed(含新 47 项 + F020 regression 全绿):DAO 8 / Service 12 /
  Router 14 / Consumers 16(源码契约静态验证)/ F034 migration 9 / shared
  alembic_helpers 2 / F020 LLM regression 48
- F034 fresh DB upgrade 9 场景全覆盖:fresh-install / backfill exact 5 keys
  / NULL/空值跳过 / 幂等 / 不覆盖编辑值 / downgrade 保留 config 锚点 /
  upgrade-downgrade-upgrade 收敛 / SQLModel.create_all 抢先建表跳过
  create_table

文档:
- F022 spec.md(新建)+ F020 spec.md AC-11/AD-07/19803 三处修订
- release-contract.md INV-T17/T18 + F022 行 + 变更历史
- 升级迁移方案 §3.7.1 新增 F022 段落 + 运维手册 §6 19803 描述更新 +
  §8.3 迁移列表 21→22 + F034 行

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 16:39:18 +08:00
..