Skip to content

feat: 为 Dashboard v2 接入真实 MemOS 服务与项目管理后端 - #5

Open
JavaLyHn wants to merge 2 commits into
hugegraph:dashboard-v2from
JavaLyHn:feat/dashboard-backend
Open

JavaLyHn wants to merge 2 commits into
hugegraph:dashboard-v2from
JavaLyHn:feat/dashboard-backend

Conversation

@JavaLyHn

@JavaLyHn JavaLyHn commented Oct 27, 2026 •

Copy link
Copy Markdown

背景与目标

关联 #3。

本 PR 为 dashboard-v2 增加独立 FastAPI 后端,将现有控制台接入真实 MemOS 服务与 MCP 网关审计数据,替代页面对 Mock 的依赖。

以 openapi.json 为规格,保持前端 src/、shared/ 和 server/mock/ 不变。适配、鉴权、项目隔离、字段投影、日志索引及持久化均由后端完成。

设计架构

flowchart TB
    Browser["Dashboard 浏览器"] --> Proxy["前端同源代理"] --> Backend["Dashboard FastAPI 后端"]
    Backend -->|"会话、角色与项目范围校验"| Store[("SQLite:账号、会话、项目、成员、邀请与审计索引")]
    Backend -->|"记忆、Prompt、图谱与模型"| MemOS["上游 MemOS REST"]
    MemOS --> Neo4j[("Neo4j")]
    MemOS --> Qdrant[("Qdrant")]
    Client["使用项目密钥的客户端"] --> Gateway["MCP 网关"] --> MemOS
    Gateway --> Audit["calls-*.jsonl"]
    Audit -->|"增量导入"| Store
    Store -->|"日志查询与每日用量"| Backend
    Backend -->|"发布密钥配置"| Config["共享配置文件"]
    Config -->|"下一次鉴权请求检测并重载"| Gateway
Loading

真实数据与记忆生命周期

后端根据当前会话的授权项目确定对应 cube,读取上游实际数据,再按规格筛选、分页与投影,避免透传上游大对象。

删除通过上游生命周期能力执行:普通记忆检查图与向量状态,画像字段按字段状态处理;提供恢复、失败重试、操作回执与补偿。

网关调用写入审计 JSONL,Dashboard 增量导入本地索引。日志列表、详情与每日用量复用同一索引,保持查询与统计口径一致。

控制面与权限

账号、会话、项目、成员与邀请持久化到 SQLite。平台账号管理要求平台管理员;项目操作按 viewer/editor/owner 授权。普通项目 owner 不获得全站账号管理权限,不能管理其他项目。

最后有效管理员与最后有效 owner 受事务内约束保护。浏览器写操作保留 Origin/CSRF 校验。各接口权限已在 OpenAPI 中标注。

网关密钥自动重载

项目密钥变更发布到共享配置文件。网关在后续鉴权请求中检测并重载,新增、撤销密钥无需手动重启;首次部署网关代码或修改环境变量仍需重启。已完成鉴权的执行中请求不因后续撤销而取消。

项目隔离与存储职责

flowchart LR
    Request["请求与会话 Cookie"] --> Identity["有效账号与会话校验"]
    Identity --> Role["目标项目可见性与角色校验"]
    Role --> Mapping["服务端 projectId → cube 映射"]
    Mapping --> Native["限定 cube 访问上游"]
    Native --> Projection["类型过滤、计数、分页与响应投影"]
Loading

项目映射由后端解析,不直接信任客户端传入的上游范围。列表使用目标项目,详情结合当前选中项目校验资源归属;控制面成员、邀请和密钥操作同样校验目标项目权限。认证和角色检查后,仍执行项目状态及最后 owner 等业务约束。

SQLite 不保存记忆主体作为权威数据源。 它保存账号、会话、项目、成员、邀请等控制面数据、生命周期操作回执与审计索引。记忆主体、画像及其图/向量状态由上游负责;SQLite 审计索引用于查询和聚合,不代替上游记忆存储。

删除、恢复与一致性确认

flowchart TB
    Action["删除 / 恢复请求"] --> Check["角色、项目、类型及当前状态校验"]
    Check --> Receipt["持久化 operationId 与逐项操作状态"]
    Receipt --> Kind{"记忆种类"}
    Kind -->|普通记忆| Graph["上游状态转换:图与向量确认"]
    Kind -->|画像字段| Profile["上游画像字段状态转换"]
    Graph --> Result{"校验上游回执"}
    Profile --> Result
    Result -->|已确认| Confirmed["保存 confirmed 并返回"]
    Result -->|失败或尚未确认| Pending["保存 pending 与可重试结果"]
    Pending --> Retry["按 operationId 查询 / 重试"]
    Retry --> Kind
Loading

批量操作先检查目标记忆,再持久化操作记录;重试跳过已确认项,复用每项操作 ID。同一个批次 ID 不能用于不同请求。后端校验回执的记忆 ID、操作 ID、目标状态与种类;普通记忆还校验向量确认状态。画像字段不套用普通记忆的向量确认要求。

超时或部分失败不返回“全部成功”,保留 pending 回执供查询与重试。上游配套生命周期能力负责实际状态转换与补偿;Dashboard 负责持久化回执、验证结果和重试入口,不将跨 Neo4j/Qdrant 操作描述成单一数据库事务。

审计索引与用量聚合

flowchart LR
    Files["网关 / 控制台 JSONL"] --> Cursor["文件标识、偏移与变化检查"]
    Cursor --> Normalize["增量读取、字段兼容与敏感字段脱敏"]
    Normalize --> Scope["可信项目归属检查"]
    Scope --> Correlation["有调用标识时关联请求与终态记录"]
    Correlation --> Index[("SQLite 审计索引")]
    Index --> Logs["日志筛选、分页与详情"]
    Index --> Usage["同一授权范围按日聚合"]
Loading

读取位置持久化,处理文件截断、替换及未完成行;不能可靠归属项目的记录隔离,不归入任意项目。异步关联仅使用已采集到的调用标识,并限定来源与项目范围,不根据相近时间猜测。请求与终态合并后形成查询记录;日志与用量读取同一索引,并分别应用授权范围、筛选及日期边界。

部署边界

组件 所属与职责 连接/共享方式
前端及同源代理 dashboard-v2 既有页面,前端源码不改 /api/*、/admin/* 和会话表单转发到后端
Dashboard FastAPI 后端 本 PR 的 server/backend/ REST 访问上游,本地持久化控制面、回执与索引
MemOS、Neo4j、Qdrant deployment-v2 与本 PR 提供的上游配套补丁 受信网络中的上游 REST;图/向量状态由上游管理
MCP 网关 deployment-v2 配套网关及补丁 项目客户端使用项目密钥调用
审计 JSONL 目录 网关写入,Dashboard 读取 两服务使用同一目录或对应挂载路径
网关密钥配置 Dashboard 发布,网关检测并重载 两服务指向同一共享配置文件,发布需支持锁与原子替换

上图为逻辑部署,不要求服务位于同一进程。当前实现采用 SQLite 和共享文件配置,部署时必须正确配置持久化目录与读写权限。首次初始化管理员与运行后端应使用相同数据目录;上游模型凭据在上游配置,前端不直接连接无鉴权的上游服务。

实现内容

模块 实现内容
P0 运行信息 独立后端、统一响应与错误、上游连接检查、/api/meta
P0 记忆读取 六标签列表/详情、字段映射、项目范围、筛选分页、响应投影
P0 记忆生命周期 普通记忆与画像字段软删除、恢复、同步确认、重试与操作回执
P0 调用日志 JSONL 增量导入、列表/详情、历史缺字段兼容、来源与查询筛选、异步关联
P1 用量 同一审计索引按天聚合、时间边界、授权范围与 Token 默认值
P1 项目 列表、创建、更新、选中、停用、归档、恢复及重启持久化
P1 账号 登录/注册/登出、管理员权限、更新、禁用/启用、删除及最后有效管理员约束
P1 成员 角色权限、候选搜索、添加、变更、移除、退出及最后 owner 约束
P1 邀请 创建、角色变更、撤销、过期、单次使用及独立会话接受流程
P2 Prompt 读取、保存、生成候选、重置、调试及真实写入生效
P2 图谱与模型 真实只读接口、投影、大小限制/截断、权限与配置脱敏
P3 密钥 列表、创建、改名、撤销、配置发布与网关自动重载
P3 属性树模板 上游能力与接口已接入;原前端仍为占位页
知识库(部分) 保留实体 CRUD、项目关联、文件上传/列表/下载/删除;记忆列表未实现
约定固定数据 额度、订阅及 skillMD 按 Issue 返回固定数据

接口契约与数据处理

  • 统一返回 { code, data, message },业务成功以 code === 0 为准。
  • 保留各接口的 records、logs、memListItemResponseList、list;分页使用 pageNum/pageSize。
  • 日志 requestBody/responseBody 返回 JSON 字符串;密钥接口保持规格形状,展示由现有前端处理。
  • 记忆先按授权项目、类型与条件筛选计数,再分页;不透传 embedding、sources、history,列表正文限制长度,详情保留全文。
  • 数量统计限定授权项目及筛选范围内的激活记忆,不含归档/删除数据;画像按有效字段计数。
  • 展示时间固定 UTC+8,存储与机器查询不被覆盖;日期筛选按 UTC 日边界。
  • 无法可靠归属项目的审计记录隔离处理,不猜测租户归属。

验收摘要

以下为开发阶段已执行结果,不是本次 PR 正文更新重新执行的全量测试;不同批次数量不相加。

检查范围 已记录结果
后端完整测试 318 passed
后续授权策略回归 23 passed
网关自动重载 / 后端密钥回归 56 passed / 27 passed
打包与交付检查 12 passed
pnpm verify 通过
Redocly 0 错误、4 警告:四个表单成功返回 303
前端保护范围 src/、shared/、server/mock/ 相对基线零改动
上游完整补丁 干净基线应用检查与已应用工作树反向检查通过

数据确实来自上游

  • 停止 Mock 后页面仍可读取,/api/meta 为 mode: live。
  • 经项目密钥写入唯一标记记忆,控制台可搜索;同 ID 上游 REST 正文与详情一致。
  • 删除后控制台与上游原生读取均不可见;恢复后按同 ID 验证。
  • 网关调用与 JSONL 的事件、时间、耗时对应;项目切换后记忆范围相应变化。

性能与健壮性

场景 已记录结果
至少 1 万行审计日志冷首屏 本机三次 805.350 / 779.142 / 795.091 ms,均小于 1 秒
10 条记忆列表响应 3,688 字节,小于 200 KB;仅代表所测样本
上游停止 页面显示错误提示,未白屏
历史日志缺字段 列表与详情仍可渲染
服务重启 项目及相关控制面数据持久化验证通过
生命周期失败 已覆盖失败重试与故障回归
权限负例 已覆盖跨项目与角色不足拒绝

真实页面

精选 9 张真实截图;详细页面折叠展示。属性树模板与知识库不展示。图片托管于独立资源分支,不增加本 PR 实现分支的文件。

记忆列表

06-memory-list

记忆详情与原始 ID 07-memory-detail

图谱可视化

真实节点、会话分组与已有关系,不生成上游不存在的连线。图例中 ProfileMemory 的原前端翻译键按真实页面保留。

09-memory-graph

调用日志与每日用量

真实网关请求详情:

12-log-request-detail

每日写入与检索统计:

14-usage
Prompt 真实抽取调试

使用服务端保存的模板调试,返回候选而不直接写入记忆。

15-prompt-debug
用户管理、项目成员与邀请接受页面

用户管理:平台管理员标识、账号状态与管理操作。

用户管理

项目成员与 owner 约束:

03-members

1027-test-lyhn 项目的独立会话邀请详情(用户提供的真实截图,仅裁去留白;不含邀请令牌):

27-invite-detail

部署与人工复核

启动、配置、权限矩阵、测试命令及人工审核步骤集中在 后端 README。

本 PR 依赖 deployment-v2 配套修改:完整上游补丁,基线:

8d6e231d7d95ea29b6a2716c9c34837644d3e7f6

补丁包含记忆生命周期、画像字段状态、Prompt 运行时、模型兼容及网关配置发布/重载。仅部署 Dashboard 后端、不应用上游配套修改,无法复现全部功能。

建议审核顺序:

  1. 按 README 启动上游、网关、后端与前端代理,停止 Mock。
  2. 检查 /api/meta 与登录会话。
  3. 在隔离项目写入唯一标记记忆,对照控制台与上游同 ID 数据。
  4. 对照同一 JSONL 检查日志与每日用量。
  5. 验证项目隔离、角色、邀请与密钥变更。
  6. 在可控环境复核删除/恢复、重启持久化与上游故障。

@coderabbitai

coderabbitai Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 2d9978d9-8f59-4d26-be4a-8737cfb5d9b4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@JavaLyHn JavaLyHn changed the title feat: implement live Dashboard v2 backend feat: 为 Dashboard v2 接入真实 MemOS 服务与项目管理后端 Oct 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant