Repository navigation
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景与目标
关联 #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真实数据与记忆生命周期
后端根据当前会话的授权项目确定对应 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["类型过滤、计数、分页与响应投影"]项目映射由后端解析,不直接信任客户端传入的上游范围。列表使用目标项目,详情结合当前选中项目校验资源归属;控制面成员、邀请和密钥操作同样校验目标项目权限。认证和角色检查后,仍执行项目状态及最后 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批量操作先检查目标记忆,再持久化操作记录;重试跳过已确认项,复用每项操作 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["同一授权范围按日聚合"]读取位置持久化,处理文件截断、替换及未完成行;不能可靠归属项目的记录隔离,不归入任意项目。异步关联仅使用已采集到的调用标识,并限定来源与项目范围,不根据相近时间猜测。请求与终态合并后形成查询记录;日志与用量读取同一索引,并分别应用授权范围、筛选及日期边界。
部署边界
dashboard-v2既有页面,前端源码不改/api/*、/admin/*和会话表单转发到后端server/backend/deployment-v2与本 PR 提供的上游配套补丁deployment-v2配套网关及补丁上图为逻辑部署,不要求服务位于同一进程。当前实现采用 SQLite 和共享文件配置,部署时必须正确配置持久化目录与读写权限。首次初始化管理员与运行后端应使用相同数据目录;上游模型凭据在上游配置,前端不直接连接无鉴权的上游服务。
实现内容
/api/meta接口契约与数据处理
{ code, data, message },业务成功以code === 0为准。records、logs、memListItemResponseList、list;分页使用pageNum/pageSize。requestBody/responseBody返回 JSON 字符串;密钥接口保持规格形状,展示由现有前端处理。验收摘要
以下为开发阶段已执行结果,不是本次 PR 正文更新重新执行的全量测试;不同批次数量不相加。
pnpm verifysrc/、shared/、server/mock/相对基线零改动数据确实来自上游
/api/meta为mode: live。性能与健壮性
真实页面
精选 9 张真实截图;详细页面折叠展示。属性树模板与知识库不展示。图片托管于独立资源分支,不增加本 PR 实现分支的文件。
记忆列表
记忆详情与原始 ID
图谱可视化
真实节点、会话分组与已有关系,不生成上游不存在的连线。图例中
ProfileMemory的原前端翻译键按真实页面保留。调用日志与每日用量
真实网关请求详情:
每日写入与检索统计:
Prompt 真实抽取调试
使用服务端保存的模板调试,返回候选而不直接写入记忆。
用户管理、项目成员与邀请接受页面
用户管理:平台管理员标识、账号状态与管理操作。
项目成员与 owner 约束:
1027-test-lyhn项目的独立会话邀请详情(用户提供的真实截图,仅裁去留白;不含邀请令牌):部署与人工复核
启动、配置、权限矩阵、测试命令及人工审核步骤集中在 后端 README。
本 PR 依赖
deployment-v2配套修改:完整上游补丁,基线:补丁包含记忆生命周期、画像字段状态、Prompt 运行时、模型兼容及网关配置发布/重载。仅部署 Dashboard 后端、不应用上游配套修改,无法复现全部功能。
建议审核顺序:
/api/meta与登录会话。