fischer-agentkit/docs/brainstorms/2026-06-21-admin-console-re...

134 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Admin Console — Enterprise Department-Scoped Management
**Date**: 2026-06-21
**Status**: Draft (revised 2026-06-21 — SaaS multi-tenant → enterprise department-scoped)
**Branch**: `feat/admin-console`
**Author**: brainstorm session
## Outcome
为 Fischer AgentKit 构建统一的企业管理端,采用"嵌入主应用 `/admin` 路由组 + 架构预留拆分能力"方案。Web UI 和 CLI 双通道共享同一套 service 层。核心模型是**单企业部署 + 部门级权限隔离 + 能力按部门绑定**:人事部有人事 skill + 人事系统 DB 权限,研发部有编码 skill部门间资源隔离、用户可多部门权限并集。MVP 覆盖 5 个管理领域部门与用户、LLM 配置、Skill 与 KB、用量仪表盘与配额。
## Background
当前 AgentKit 没有统一管理端:
- 后端 admin 端点只有 4 个session 管理),无 user CRUD / LLM 配置 / 用量分用户
- 前端只有 1 个 admin 页面(`/admin/users`,仅会话管理)
- LLM 配置只在 `agentkit.yaml`,运行时不可改
- KB/Skill 有 CRUD API 但不是 admin-only无部门隔离
- 权限模型有 3 级member/operator/admin但实际使用率极低
- 管理工作流是"零散脚本不成体系"
## Actual Usage Scenario (revised)
单企业部署一套 AgentKit按部门/职能划分权限:
- 人事部:拥有人事专用 skill + 访问人事系统数据库的权限,无编码能力
- 研发部:拥有编码 skill + 代码仓库访问权限
- 财务部:拥有财务分析 skill + 财务系统访问权限
- 个人用户属于一个或多个部门(权限并集),如 CFO 可兼管财务和运营
- 管理员按部门分配能力,用户继承所属部门的能力
**这不是 SaaS 多租户**——不需要租户计费、跨租户数据隔离、租户 CRUD。核心是**部门(能力组)+ 用户多部门归属 + 能力按部门绑定**。
## Primary Actors
- **超级管理员**(企业 IT管理所有部门、全局 LLM 配置、跨部门用量监控、用户管理
- **部门管理员**(部门负责人):管理本部门成员、本部门 Skill/KB、本部门用量
- **普通用户**:属于一个或多个部门,继承部门能力,受部门配额约束
- **运维自动化**:通过 CLI `agentkit admin <domain> <action>` 执行管理操作,与 Web UI 等价
## Scope
### MVP第一期
1. **部门与用户管理**
- 部门 CRUD创建、列表、编辑、禁用/启用、删除(人事/研发/财务等)
- 部门能力绑定:每个部门可绑定专属 skill、KB、工具权限、LLM 配额
- 用户 CRUD创建、列表、编辑、禁用/启用、删除
- 用户多部门归属:一个用户可属于多个部门(`user_departments` 多对多表),权限取并集
- 角色管理:超级管理员 / 部门管理员 / 普通用户
- 密码重置:管理员重置任意用户密码
- 当前已有的会话管理revoke/list保留并集成
- 数据隔离所有资源表skills、kb_documents、llm_usage 等)加 `department_id` 列,用户访问时只能看到所属部门的资源(多部门取并集)
2. **LLM 配置管理**
- Provider/Model/API Key CRUD运行时增删改不重启服务
- Fallback 链配置:可视化编辑 provider fallback 顺序
- 按部门配额:每部门可配置独立的 provider/model 白名单和 token 上限
- 成本上限:按部门/用户设置日/月成本上限,超限硬拒绝(返回 429
- 配置从 `agentkit.yaml` 迁移到数据库,支持运行时热重载
- 向后兼容:首次启动时自动从 `agentkit.yaml` 导入现有配置
3. **Skill 与 KB 管理**
- Skill 启停/编辑/导入admin 可启用/禁用任意 skill编辑 skill 配置YAML 导入
- Skill 按部门绑定:人事 skill 只对人事部可见,编码 skill 只对研发部可见
- KB 文档 CRUD/同步/重建索引admin 可管理所有 KB 文档
- KB 按部门隔离:每部门有独立的 KB 资源池
4. **用量仪表盘 + 配额**
- 按部门/用户/时间维度查看 LLM token 用量、成本、调用次数
- 可视化图表:时间序列、按 provider/model 分桶、按用户排行
- 报表导出CSV/JSON
- 配额上限:按部门/用户设置 token/成本上限超限硬拒绝429
- 告警:配额达到 80%/100% 时触发MVP 只做日志告警)
### 产品形态
- **Web UI**`/admin/*` 路由组,独立 `AdminLayout` + 左侧导航 + 5 个管理页面
- **CLI**`agentkit admin <domain> <action>` 镜像所有 Web UI 操作
- **后端**:独立 `admin_router` APIRouter 实例,未来可拆分到独立 FastAPI 应用
- **认证**:共享现有 JWT 认证admin 端点要求 admin 角色
### 架构决策
- **部门隔离**:共享数据库 + `department_id` 列。`DepartmentContextMiddleware` 在请求级别注入用户所属部门列表,所有 repository 层强制按 `department_id IN (...)` 过滤(多部门取并集)。
- **配置存储**LLM 配置从 `agentkit.yaml` 迁移到数据库(`llm_providers` / `llm_models` / `llm_api_keys` 表),支持运行时热重载。首次启动自动从 YAML 导入。
- **CLI/Web 一致性**CLI 和 Web UI 调用同一套 service 层,避免双份业务逻辑。
- **预留拆分**`admin_router` 是独立 `APIRouter` 实例,`AdminLayout` 是独立路由树。未来需要独立部署时,把 `admin_router` 挂到独立 FastAPI 实例,前端 `AdminLayout` 独立构建即可。
## Success Criteria
- 超级管理员可在 Web UI 或 CLI 完成全部 4 个领域的管理操作,无需手动编辑 YAML 或操作数据库
- 部门隔离通过安全测试:人事部用户无法访问研发部的 skill/KB/用量数据(除非同时属于两个部门)
- LLM 配置可在运行时修改并立即生效,无需重启服务
- 用量仪表盘可按部门/用户/时间维度展示,数据延迟 < 1 分钟
- 配额超限时系统返回 429不会超支
- CLI Web UI 操作结果一致调用同一 service
- 用户多部门归属正确CFO 兼管财务和运营时可访问两个部门的所有资源
## Non-Goals
- **SaaS 多租户**外部多客户租户计费跨租户物理隔离)——本场景是单企业部署
- **物理隔离的独立数据库**部门数据隔离靠 `department_id` 不靠物理隔离
- **计费系统集成**只做用量采集和配额不做实际计费/扣款
- **审计日志**第二期
- **SLA 监控**第二期
- **独立管理应用部署**架构预留但不实现MVP 嵌入主应用
- **SSO/SAML 集成**第二期
## Dependencies / Assumptions
- **假设**现有 `users` / `auth_sessions` 表可平滑加 `department_id` SQLite ALTER TABLE 支持 ADD COLUMNNULL 表示未分配部门的全局用户
- **假设**LLM 配置从 YAML 迁移到数据库后`agentkit.yaml` 仍可作为首次导入源不破坏现有部署
- **依赖**现有 JWT 认证 + RBAC 权限模型3 可扩展支持部门管理员角色
- **依赖**现有 `agentkit` CLI 框架Typer支持新增 `admin` 命令组
- **风险**部门隔离 middleware 完整性是关键风险——任何遗漏 `department_id` 过滤的查询都是数据泄露漏洞通过 repository 层强制 `department_id IN (...)` 参数缓解但需要安全测试覆盖
- **风险**LLM 配置热重载需要处理并发修改冲突乐观锁或版本号
- **风险**用户多部门归属的权限并集计算可能产生意外权限提升如用户从 A 部门调离但未及时移除归属
## Open Questions (Resolved)
- ~~租户的粒度是"组织"还是"工作空间"~~ **已明确**单企业部署 + 部门级隔离不是 SaaS 多租户
- ~~跨租户用户的关系如何建模~~ **已明确**`user_departments` 多对多表权限取并集
- ~~配额超限时的行为硬拒绝还是软降级~~ **已明确**硬拒绝429
## Delivery Strategy
MVP 范围较大4 领域建议按领域分批交付
1. **批次 1**部门与用户管理部门 CRUD + 用户多部门归属 + 隔离 middleware其他领域依赖
2. **批次 2**LLM 配置管理 YAMLDB 迁移
3. **批次 3**Skill KB 管理按部门绑定/隔离
4. **批次 4**用量仪表盘 + 配额依赖前 3 批的 department_id 埋点
每批次独立可交付可测试可合并