# 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 ` 执行管理操作,与 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 ` 镜像所有 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 COLUMN,NULL 表示未分配部门的全局用户) - **假设**: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 配置管理(含 YAML→DB 迁移) 3. **批次 3**:Skill 与 KB 管理(按部门绑定/隔离) 4. **批次 4**:用量仪表盘 + 配额(依赖前 3 批的 department_id 埋点) 每批次独立可交付、可测试、可合并。