IGNIS ASSET LIBRARY MVP
资产库第一版,先把创作素材沉淀下来。
这版不做完整 DAM。先让生成结果、对话产物、画布产物和上传素材有一个统一入口,能查、能看、能再次用到创作里。
MVP GOAL
第一版只解决四件事
1创作资产自动沉淀。
2资产能快速查找。
3资产能重新用于对话、生成和画布。
4团队空间区分个人资产和团队资产。
SCOPE
空间规则跟着 Ignis 现有结构走
个人空间
- 展示「个人资产」「我的上传」。
- 资产只对本人可见。
- 可复制到某个团队空间的个人资产。
团队空间
- 展示「个人资产」「团队资产」「我的上传」。
- 个人任务进入个人资产。
- 团队任务进入团队资产。
我的上传
- 不是新权限,只是上传来源视图。
- 承接对话、生成参考、画布里的手动上传。
- 正式接入要记录上传人、入口和空间。
MAIN PAGE
资产库首页:时间分组 + 资产墙
首页承载浏览和管理
- 个人资产、团队资产、我的上传用文字页签切换。
- 筛选器只做查找,不把页面变成管理后台。
- 批量操作和框选用于下载、收藏、删除和批量复用。
卡片只表达资产本身
- 图片和视频以缩略图墙呈现。
- 视频在左下角显示时长。
- 星标只代表资产级收藏。
DETAIL MODAL
详情弹窗:看清资产,也看清来源
字段按阅读顺序排
- 资产名必须是独立字段。
- 创意描述只放提示词和参考资产。
- 任务信息放模型、时间、来源、创建者。
- 基本信息放类型、比例、清晰度、大小、文件类型、所属范围。
操作按目的分组
- 继续创作:作为生成参考、添加到新对话。
- 操作:下载、删除、复制到团队。
- 收藏在右上角,不在底部重复。
PICKER
从任务页选择资产:一个通用弹窗
选择器不做完整管理
- 它只负责把资产加入当前上下文。
- 生成页按当前模式限制可选类型。
- 不可选类型在筛选器里置灰。
- 图片、视频、音频先进入生成和对话复用。
ENTRY POINTS
入口放在用户正在创作的地方
对话入口:沿用输入框「+」的心智。直接点还是本地上传,hover 菜单增加「从资产库选择」。
TEAM AND FAVORITE
收藏和团队复制不要混任务语义
| 规则 | 方案 | 原因 |
|---|---|---|
| 资产收藏 | 资产库只看资产级收藏;星标只操作当前资产。 | 避免用户把任务收藏和资产收藏混在一起理解。 |
| 任务收藏 | 仍留在生成任务、对话、画布列表。 | 用户看收藏任务时回到任务列表,不污染资产库筛选。 |
| 复制到团队 | 复制为独立副本,不移动原资产。 | 删除个人资产不影响团队副本,团队协作更稳。 |
| 删除 | 统一软删除,进入资产回收站。 | 避免误删破坏历史上下文。 |
BACKEND WORK
上线前要补齐资产记录,而不是继续堆页面
| 需要补齐 | 用途 | 首版口径 |
|---|---|---|
| 资产名称 | 标题、chip、下载文件名都要用它。 | 生成时写默认名,详情里可改名。 |
| 文件元数据 | 展示文件类型、大小、时长、分辨率。 | 入库写 MIME、size、width、height、duration、thumbnail。 |
| 来源定位 | 详情可跳回生成任务、对话消息或画布。 | 生成按 task,Agent 按消息 ID,画布按 canvas / task。 |
| 上传归属 | 支撑「我的上传」。 | 记录上传人、空间、入口、上下文、原始文件名。 |
| 非图片真实预览 | 文档、PDF、字幕需要真实内容调体验。 | 等画布和 Agent 资产接入统一资产表后再细调。 |
上线清理:现在资产库里用于演示音频、文档、字幕、3D 的 mock 资产,上线接真实资产表后要删掉。拖拽式资产浮窗也先不做,等画布复用诉求更明确再扩。
FULL REQUIREMENT DOC
完整资产库方案文档
上面是给团队快速对齐的可视化版本。这里附上当前仓库里的完整方案原文,便于开发评估字段、权限、入口和后端接入工作。
展开查看完整 Markdown 原文 来源:docs/asset-library-mvp-requirements.md · 693 行
# Ignis 资产库 MVP 需求草案
## 1. 背景
Ignis 当前已经有明确的工作空间逻辑:
- 个人空间
- 团队空间
- 我的草稿 / 个人任务
- 团队任务
资产库不能重新设计一套独立的空间概念,需要跟随现有工作空间和任务范围。第一版的目标不是做完整 DAM 系统,而是先把创作过程中产生和使用的资产沉淀下来,并让用户能在后续创作中快速复用。
## 2. MVP 目标
第一版只解决四件事:
1. 创作资产自动沉淀
2. 资产可以被快速查找
3. 资产可以被重新使用到对话、画布、生成模块
4. 团队空间下可以区分个人沉淀和团队共享
## 3. 核心概念
### 3.1 资产
资产指 Ignis 创作链路里可复用的文件或结果。
MVP 支持的资产类型:
| 类型 | 说明 |
| --- | --- |
| 图片 | 生成结果、参考图、画布图片 |
| 视频 | 生成结果、画布视频 |
| 音频 | 配音、音乐、参考音频 |
| 字幕 | SRT / ASS 等字幕文件 |
| 文档 | PDF、Doc、Markdown、Txt 等 |
| 3D | GLB、OBJ、FBX 等模型文件 |
### 3.2 资产范围
资产范围必须跟随 Ignis 当前空间。
个人空间:
```text
个人空间
├── 个人资产
└── 我的上传
```
团队空间:
```text
团队空间
├── 个人资产
└── 团队资产
└── 我的上传
```
含义:
| 范围 | 可见性 | 说明 |
| --- | --- | --- |
| 个人空间 / 个人资产 | 仅本人 | 个人空间中产生或上传的资产 |
| 团队空间 / 个人资产 | 仅本人 | 当前团队空间下,我在“我的草稿 / 个人任务”中产生或上传的资产 |
| 团队空间 / 团队资产 | 团队成员 | 当前团队空间下,团队任务中产生或被共享到团队的资产 |
「我的上传」不是第三种资产权限范围,而是一个上传来源视图:
- 只展示当前用户手动上传的资产。
- 包括对话输入中上传、生成任务参考中上传、画布中上传的参考素材。
- 上传资产第一版默认归属上传者的「个人资产」,即使上传发生在团队任务中,也先进入该团队空间下上传者自己的个人资产;后续是否允许上传时直接共享为团队资产另行设计。
- 「我的上传」只是按上传人和上传行为筛选,不是新的权限范围。
- 团队空间下,「我的上传」展示当前用户在当前团队空间上传过、归属当前用户个人资产的上传资产。
- 手动导入入口仅在「我的上传」页签展示;个人资产 / 团队资产页签不直接提供手动导入,因为它们主要承载自动沉淀的生成结果和复制共享后的资产。
- 后续如果要展示“团队成员上传”,应另做团队筛选,不混入「我的上传」默认视图。
## 4. 入口设计
### 4.1 独立资产库入口
入口位置:
- 左侧侧边栏「资产库」
- 首页
- 我的项目页
- 其他非任务页面
页面用途:
- 浏览资产
- 搜索资产
- 筛选资产
- 通过弹窗查看资产详情
- 管理收藏
- 处理资产共享
建议路由:
```text
/asset-library
```
### 4.2 任务内资产入口
入口位置:
- 任务详情页
- 画布页
- 生成模块
- 聊天输入框附近
用途:
- 快速选择资产
- 添加到当前对话
- 添加到当前画布
- 作为生成参考
任务内入口不承担完整资产管理职责,不做复杂整理、批量管理、分类管理。
## 5. 自动入库规则
### 5.1 自动入库来源
MVP 需要自动沉淀以下来源:
| 来源 | 示例 |
| --- | --- |
| 生成模块结果 | 图片生成、视频生成结果 |
| Agent 对话结果 | Agent 返回的图片、视频、文档等文件 |
| 画布操作结果 | 画布工具生成的新图片、视频、文档等 |
| 用户参考素材 | 用户上传到对话、画布、生成模块中的参考素材 |
### 5.2 入库位置
资产入库位置由“发起动作时”的空间和任务范围决定。
| 当前上下文 | 入库位置 |
| --- | --- |
| 个人空间 | 个人空间 / 个人资产 |
| 团队空间 + 我的草稿 / 个人任务 | 当前团队 / 个人资产 |
| 团队空间 + 团队任务 | 当前团队 / 团队资产 |
### 5.3 失败处理
自动入库失败不能影响原创作结果。
规则:
- 生成结果、画布结果、对话结果仍正常展示
- 资产库入库失败只提示用户
- 后续允许重新保存或手动补录
建议提示:
```text
保存到资产库失败,可稍后重试
```
## 6. 独立资产库页面
### 6.1 页面结构
个人空间:
```text
资产库
├── 个人资产
└── 我的上传
```
团队空间:
```text
资产库
├── 个人资产
├── 团队资产
└── 我的上传
```
### 6.2 列表能力
MVP 列表需要支持:
- 按时间分组展示资产
- 资产以连续缩略图墙呈现,避免传统信息卡片过重
- 搜索资产名
- 按资产类型下拉筛选
- 按日期下拉筛选
- 只看收藏
- 批量操作
- 按时间排序
- 空状态
- 加载失败状态
### 6.3 时间分组资产墙
独立资产库页面的主体不采用传统卡片式布局,而是采用类似生成历史的时间流资产墙。
示例结构:
```text
资产库
├── 第一行:个人资产 / 团队资产 / 我的上传文字页签、搜索
├── 第二行:资产类型筛选、日期筛选、批量操作、只看收藏
├── 5月6日
│ ├── 资产缩略图
│ ├── 资产缩略图
│ └── 资产缩略图
└── 4月9日
├── 资产缩略图
├── 资产缩略图
└── 资产缩略图
```
顶部范围切换规则:
- 不在资产库页面重复展示「个人空间 / 团队空间」标志,空间信息由全局导航栏承担。
- 个人空间展示「个人资产 / 我的上传」两个文字页签。
- 团队空间展示「个人资产 / 团队资产 / 我的上传」三个文字页签。
- 当前选中的页签用下划线表达,不使用胶囊按钮或 badge。
- 第一行右侧只保留搜索框,搜索框使用边框,无底色。
- 第一行不放「同步到剪映」。
筛选和操作规则:
- 第二行左侧放「资产类型」下拉筛选,默认「全部资产」。
- 第二行左侧放「日期」下拉筛选,默认「全部时间」。
- 资产类型和日期筛选样式参考生成模块筛选 Popover。
- 第二行右侧放「批量操作」和「只看收藏」,批量操作在左、只看收藏在右。
- 第二行筛选器和操作入口使用文字按钮,不使用边框按钮。
- 批量操作需要带多选语义图标。
- 第二行文字按钮 hover 时不出现底框,不增加左右边距,避免像普通按钮。
- 左侧筛选入口的选中态通过当前选项文字表达,例如显示「全部资产」「本月」。
- 日期筛选支持快捷时间和自定义日期范围;点击自定义日期输入里的年月日文案也需要展开系统日期选择器。
- 第二行文字颜色统一为弱灰色,右侧操作的选中或激活状态使用 Ignis 主色调橙色。
- 点击「批量操作」进入批量状态。
- 批量状态下所有资产缩略图左上角出现勾选框。
- 批量状态下点击资产切换选中,不打开详情。
- 批量状态下页面底部出现批量操作控制条。
- 批量操作控制条使用浅色底,适配明暗模式切换。
- 批量操作控制条第一版分为两类动作:
- 继续创作:添加到新对话、作为生成参考。
- 管理操作:全选、下载、收藏、删除、退出。
- 批量选中态使用 Ignis 主色调橙色。
- 支持在内容区拖拽框选资产;普通点击资产缩略图不能被框选逻辑拦截。
- 框选命中资产时,即便当前不在批量操作状态,也自动进入批量操作并选中命中的资产。
- 框选过程中不能触发浏览器原生文案选中或图片拖拽,日期分组、视频时长标签、占位文字等内容不应出现被选中的高亮。
缩略图块展示:
- 页面底色与「我的项目」保持一致,使用全局 `bg-background`。
- 第一行范围页签字体略大于普通筛选文字。
- 资产缩略图块使用 6px 圆角。
- 图片 / 视频优先展示真实缩略图,并使用 contain 展示,不放大裁剪。
- 视频不展示类型标签,只在左下角展示视频时长小标签;hover 展示资产名时,时长标签隐藏,避免与资产名重叠。
- 视频资产 hover 时自动静音播放预览,鼠标移出后暂停并回到开头。
- 音频、文档、字幕、3D 可展示类型图标或生成预览
- 收藏资产只展示五角星,不使用带底色的圆角方框。
- hover 时可显示资产名
- 点击缩略图打开资产详情弹窗
团队资产卡片需要展示创建者。个人资产中创建者可弱化展示。
## 7. 资产详情
资产详情使用弹窗形式,不在列表页面右侧常驻详情栏。
弹窗样式需要复用生成模块任务详情弹窗的布局范式,避免资产库单独形成一套详情样式。
弹窗结构:
```text
详情弹窗
├── 左侧:浅色背景媒体大预览
│ ├── 中间:图片 / 视频 / 文件类型预览
│ ├── 悬浮:下载、上一个、下一个
│ └── 底部:同组缩略图切换
└── 右侧:信息与操作面板
├── 顶部:资产类型、所属范围、时间、收藏
├── 中部:资产名、创意描述 / 参考资产、任务信息、基本信息
└── 底部:继续创作、操作
```
资产详情展示:
- 预览
- 资产名
- 创意描述 / 参考资产:复用生成模块详情里的提示词 + 参考图 / 视频 / 音频展示方式
- 任务信息:生成模型、生成时间、生成来源、创建者;一行一个字段展示
- 基本信息:类型、比例、清晰度、大小、文件类型、所属范围
字段来源说明:
- 生成模型、生成时间、生成来源、创建者来自生成任务和资产创建记录。
- 比例、清晰度来自生成任务 `request_payload`。
- 大小、文件类型优先来自 `Asset.file_size_bytes / mime_type`;文件类型只展示 `jpg / mp4 / webp` 这类具体类型,不展示 `image/`、`video/` 前缀。
- 当前原型兼容历史数据:如果 `mime_type` 缺失,会从 `storage_key / url / url query` 中推断扩展名;视频生成历史数据仍无法推断时,临时按常见生成视频容器展示 `mp4`。正式上线应以入库时写入的真实 MIME 为准。
- 如果现有资产写入链路没有填充对应 Asset 元数据,详情中展示 `-`,不使用资产类型或提示词做伪占位。
Asset 表上线前补齐清单:
当前 `Asset` 表已有但写入不完整的字段:
- `mime_type`:用于展示文件类型,例如 `jpg / mp4 / webp`。
- `file_size_bytes`:用于展示文件大小。
- `width / height`:用于展示图片或视频分辨率,也可辅助比例判断。
- `duration_ms`:用于展示视频 / 音频真实时长,不能只依赖生成参数里的 `durationSeconds`。
- `thumbnail_url`:图片已有一定基础,视频资产需要稳定写入封面帧地址。
- `storage_key`:用于下载、重新引用、CDN 缩略图转换和文件类型兜底判断。
正式资产库还需要补齐或稳定化的资产级能力:
- 资产名称:需要独立资产名字段,或稳定写入 `metadata.assetName / fileName / originalFileName`,不能长期用提示词兜底标题。
- 资产范围:需要明确 `asset_scope: PERSONAL | TEAM`,不要长期依赖 `GenerationTask.task_scope` 推导。
- 上传标记:需要记录上传人、上传时间、上传入口、上传发生空间、上传后资产归属和原始文件名,支撑「我的上传」。
- 来源定位:生成资产保留 `task_id / task_item_id`;Agent 对话资产后续保留具体消息 ID;画布资产保留画布 ID 或画布任务 ID。
- 资产收藏:需要新增资产级收藏能力;任务收藏和资产收藏保持独立,资产库只读取资产收藏。
- 删除状态:需要资产级软删除和删除权限判断,避免直接影响历史任务产物。
- 生成参数快照:模型、比例、清晰度、参考资产、创意描述等要能从来源任务稳定读取;如果生成任务结构调整,应同步维护资产库详情页读取口径。
- 下载文件名:下载接口或前端下载工具需要支持传入安全文件名,以资产名 + 原扩展名作为最终下载名。
非生成模块资产入库规范:
- Agent 对话资产、画布操作资产、音频、文档、字幕、3D 等当前可能已经以 `file_id / URL / canvas files / session_messages` 的形式存放在对象存储、对话消息或画布数据中,但这不等于已经进入统一 `assets` 表。
- 正式资产库需要把这些资产统一沉淀为 `Asset` 记录,至少补齐资产类型、URL / storage_key、缩略图、文件类型、创建者、所属工作空间、资产范围、来源模块、来源上下文和资产名称。
- Agent 对话资产应关联到具体 `session_id` 和消息 ID / turn ID;详情画廊按具体消息聚合,不按整场对话聚合。
- 画布操作资产应关联到 `canvas_id`,并尽量保留画布任务 ID、session ID、shape fileId 或产物 fileId,方便从资产库跳回画布上下文。
- 对话与画布工具结果中已经存在的 `title / name / prompt / script_name / analysis_title` 等语义名称,需要在入库时规范映射到资产名称字段或 `metadata.assetName`,不要只停留在消息展示层或 batchGroup 分组标题中。
资产名称规则:
- 资产名必须是资产自己的独立字段,不使用提示词摘要兜底。
- 生成资产入库时需要同步生成一个默认资产名,后续允许用户改名。
- 资产名允许重名;系统真实引用、下载去重和权限判断都以稳定资产 ID / file_id 为准,不能依赖资产名唯一。
- 资产改名入口放在资产详情弹窗的资产名称处,建议 hover 标题或标题右侧展示编辑图标,点击后进入行内编辑。
- MVP 中只有资产创建者 / 所有者可以改名;团队资产的普通成员只能查看资产名,不能改名。
- 改名只修改当前资产库 `Asset` 记录的资产名称,不回写历史生成任务、历史对话消息或历史画布记录中的原始展示文本。
- 原任务页面如果后续通过 `asset_id` 重新读取资产库记录,可以展示最新资产名;如果历史消息只保存了文件 ID / URL / 静态文本,则保持历史快照不变。
- 当前对话流里出现的 `6 位代码 + 文件后缀`,主要来自历史 `file_id / URL 文件名` 的展示兜底,不代表已经存在正式资产名。
- 从资产库引用为对话 chip 或生成参考时,应使用最新资产名作为 chip / 参考素材展示名,同时保留 `asset_id / file_id / url` 作为真实引用标识。
- 下载资产时应使用最新资产名作为下载文件名,保留原文件扩展名,并做文件名安全处理;如果资产名为空,再回退到原始文件名或 file_id。
- 现有 Asset 表第一版接入时如果拿不到资产名,只能展示“未命名图片 / 未命名视频”这类临时占位,不能把长提示词挪到标题位置。
- 提示词只展示在“创意描述 / 参考资产”字段里,避免和资产名重复或冲突。
- 画布中的媒体元素也需要有资产名称快照:
- 优先使用资产库 `Asset.name`。
- 其次使用 `metadata.assetName / fileName / originalFileName`。
- 再其次使用画布 shape 上的 `meta.title` 或 tldraw asset 的 `props.name`。
- 最后才使用 file_id / URL 文件名兜底。
- 画布保存 shape 时应尽量写入 `shape.meta.assetName` 或等价字段,避免只依赖分组标题 `batchTitle`。`batchTitle` 表示一批产物的分组名称,不等同于单个资产名称。
详情画廊规则:
- 左下角画廊展示同一来源任务内的资产,不展示当前资产库筛选结果里的全部资产。
- 生成模块资产按 `GenerationTask` 聚合,同一个生成任务产出的多张图片 / 多个视频在一个画廊里切换,行为参考生成模块任务详情弹窗。
- Agent 对话资产后续不按整场对话聚合,必须按具体消息 ID 聚合,例如同一条 Agent 消息返回的多张图 / 多个文件进入同一个画廊。
- 如果第一版只能拿到对话任务级别,也需要限制画廊最大宽度,并通过横向滚动承接,避免整场长对话资产过多导致弹窗失控。
- 上传类或无法定位来源任务的资产只展示当前资产本身,不强行拼接其它资产。
来源规则:
- 生成模块来源在详情中统一展示为“生成任务”,并支持点击跳转到生成模块任务详情。
- Agent 对话来源在详情中统一展示为“对话任务”,并支持点击跳转到对应对话上下文。
- 画布操作来源需要展示具体画布任务,并支持点击跳转到对应画布。
- 参考上传来源展示上传者、上传时间和上传位置;没有来源任务时不强行跳转。
非图片 / 视频资产详情预览:
- 音频:左侧预览区展示画布同款黑胶音频播放器,支持播放、进度、时长、音量和下载;前端抽成 `VinylAudioPlayer`,画布和资产详情共用。
- 文档:第一版按文件类型分层处理:
- Markdown / Txt 可用只读文本预览,Markdown 可复用现有 `MarkdownText`。
- PDF 可以使用浏览器原生 iframe / object 预览,无法预览时展示文件卡片和下载入口。
- Doc / Docx 第一版不做在线解析预览,展示文件卡片、文件类型、大小和下载入口;后续如需要再接文档转换服务。
- 画布内已有的 JSON 文档卡片属于工具结果文档,可复用 `JsonAttachmentCard` 或 document shape 模板做预览,但不能替代通用文件预览。
- 字幕:SRT / VTT / ASS 第一版展示文件卡片和下载入口;如内容可安全读取,可增加只读文本预览。现有字幕能力主要服务于视频字幕编辑,不是独立字幕资产详情预览组件。
- 3D:左侧预览区复用 `Model3DPreviewSurface / Model3DViewer`,保留自动旋转、下载模型、截图当前模型等控制。3D 当前版本暂不支持「添加到新对话」,因为对话任务暂不支持把 3D 作为参考内容。
- 其它无法预览的文件类型统一展示文件卡片、基础信息和下载入口,不展示继续创作入口。
资产详情操作:
| 分组 | 操作 | 说明 |
| --- | --- | --- |
| 继续创作 | 作为生成参考 | 新页面打开生成模块;图片资产主按钮默认走「参考生图」,hover / 下拉可选择「参考生图」「首尾帧」「全能参考」;视频 / 音频资产直接走「全能参考」 |
| 继续创作 | 添加到新对话 | 新页面打开新对话,并把当前资产作为附件或上下文引用 |
| 操作 | 下载 | 下载原文件 |
| 操作 | 删除 | 删除当前资产,仅创建者可操作 |
| 操作 | 复制到团队 | 根据当前空间执行复制:个人空间复制到目标团队的个人资产;团队空间个人资产复制到当前团队资产 |
收藏规则:
- 资产库只看资产级收藏,不展示、不筛选来源收藏。
- 星标永远只代表「资产级收藏」,收藏 / 取消收藏固定在详情弹窗右上角展示,不在底部操作区重复出现。
- 列表卡片右上角 hover 出现空心星;已收藏资产的实心黄星常驻。
- 详情页右上角星标只展示和操作当前资产是否收藏。
- 「只看收藏」是单一开关:关闭时展示当前范围全部资产,开启时仅展示用户明确点过资产星标的资产。
- 用户如果想查看已收藏生成任务、对话任务或画布任务,回到对应生成任务列表、对话 / 我的项目或画布列表查看。
任务页资产级收藏入口:
- 生成模块任务列表页保留原有任务收藏入口,同时在单个资产 hover 时提供资产级收藏入口;hover tips 固定使用「收藏当前资产 / 取消收藏当前资产」,避免和任务收藏入口混淆。生成模块列表的收藏筛选仍只筛选收藏任务,不受资产收藏影响。
- 生成模块任务详情弹窗需要增加单资产收藏入口,位置在左侧大预览当前资产的右上角,和下载入口同一层悬浮工具区。切换画廊资产时,星标状态随当前资产变化。
- 生成模块任务详情右侧如果保留任务收藏,需要明确它是“收藏任务”,不要和左侧当前资产收藏混用。
- Agent 对话列表 / 对话消息收藏继续保持消息或任务收藏语义,不在消息列表层塞多个单资产收藏按钮。
- Agent 单资产收藏入口放在消息附件预览、图片 / 视频大图预览、文件详情弹窗中。用户正在查看哪个资产,就收藏哪个资产。
- 画布列表 / 画布页任务收藏继续保持画布或画布任务收藏语义。
- 画布单资产收藏入口已进入前端原型,真实上线后需要替换为服务端资产收藏接口。
- 当前画布没有资产属性面板,也没有独立浮动工具条;画布内还包含大量非资产元素,例如文字、图形、画笔、箭头、frame、自定义 batchGroup 分组等,这些元素不展示资产名称,也不提供资产级收藏。
- 画布单资产收藏的展示对象以“能解析出稳定资产标识”为准,不只看 shape 类型名称:
- 可收藏:图片、视频、音频、文档、3D 等常见资产型元素。
- 不可收藏:文字、图形、画笔、箭头、frame、batchGroup 分组和其它无资产来源的辅助元素。
- 稳定资产标识优先从正式 `Asset.id` 获取;在画布历史数据里可临时从 `shape.meta.fileId`、`shape.props.assetId`、`TLAsset.props.src`、URL 文件名等字段兜底解析。
- 画布单资产收藏入口第一版放在“资产名称行”:
- hover 或选中图片 / 视频 / 音频 / 文档 / 3D 等资产时,在资产上方展示一行轻量名称。
- 名称行左侧展示资产名称,右侧展示星标按钮。
- 星标 hover tips 固定使用「收藏当前资产 / 取消收藏当前资产」,避免和画布或任务级收藏混淆。
- 点击星标只切换当前资产的资产级收藏,必须阻止事件冒泡,不能触发画布选中、拖拽、右键菜单或其它画布操作。
- 未收藏时星标默认弱化,仅 hover 名称行时明显可点;已收藏时星标高亮,资产标题文字颜色与未收藏状态保持一致。
- 名称行只跟随当前 hover 或选中的资产展示,不在画布上常驻覆盖,避免画布变得杂乱。
- 如果资产在 batchGroup 内,保留 batchGroup 分组标题;单资产名称行只跟随当前资产展示,不替代分组标题。
- 右键菜单保留“收藏资产 / 取消收藏资产”作为备用入口,与名称行右侧星标使用同一套资产级收藏状态。
- 画布资产级收藏需要与资产库同步:在画布收藏某个资产后,该资产应进入资产库「只看收藏」范围;在资产库取消资产收藏后,画布上的对应资产星标也应同步取消。
- 画布不做收藏筛选。画布是创作工作区,筛选会破坏空间完整性;收藏筛选只在资产库、任务列表等浏览型页面出现。
收藏数据建议:
```text
asset_favorites
├── id
├── user_id
├── asset_id
├── created_at
```
资产库收藏判断:
```text
is_asset_favorited = exists(asset_favorites where user_id = currentUserId and asset_id = asset.id)
show_in_favorites_filter = is_asset_favorited
```
关键约束:
- 资产级收藏只影响资产库和各任务详情里的单资产星标,不反向改变任务列表的收藏状态。
- 任务级收藏只影响对应任务列表,不进入资产库收藏筛选。
继续创作规则:
- 第一版仅图片、视频、音频资产展示继续创作;文档、字幕、3D 等类型暂不展示继续创作入口。
- 资产库详情里的继续创作只负责开启新上下文,不选择历史任务。
- 历史生成任务、历史对话、历史画布如果需要使用资产库资产,应在各自任务界面增加「从资产库选择」入口。
- 「从资产库选择」是当前任务页面里的选择器,不等同于从资产库打开新页面继续创作:
- 生成页:放在参考素材上传区域标题行右侧,用于把资产库资产加入当前表单的参考图片 / 参考视频 / 参考音频 / 首帧 / 尾帧槽位;首尾帧模式不再展示“可交换顺序”的右侧提示文案。
- 对话页:放在输入框附件「+」入口的 hover 菜单里;直接点击「+」仍保持本地文件上传,hover 菜单提供「本地文件」和「从资产库选择」两个选项。
- 画布页:入口放在画布底部中间工具栏,和原本本地媒体上传入口并列;工具栏按钮应按 tldraw 原生 toolbar item 方式接入,保留一致的底框、浅色 icon、hover title 和后续快捷键扩展能力。第一版复用同一个资产选择弹窗,选择后直接插入当前画布;暂不做可拖拽的资产库浮窗,避免和完整资产库入口心智混淆。
- 选择入口图标使用左侧悬浮菜单「资产库」同款图标,避免和创意库 / 通用资料库图标混淆。
- 选择器只返回用户明确选中的资产,不自动创建新任务,也不打开新对话。
- 统一资产选择弹窗:
- 支持个人资产 / 团队资产 / 我的上传范围切换,团队空间内可见团队资产,个人空间不展示团队资产。
- 我的上传沿用资产库页面语义,承载当前空间下由用户手动上传的资产;第一版可通过个人范围查询后按上传来源过滤实现。
- 弹窗不展示副标题,尺寸要能承载资产浏览;宽度不能被通用 Dialog 的小尺寸样式压缩。
- 卡片应复用资产库列表卡片的视觉和预览规则,包含视频 hover 静音播放、视频时长统一为 `00:08` 这类格式、图片/视频 contain 展示,以及音频、文档、字幕、3D 的同款预览。
- 原型实现需要抽出共享的资产卡片组件,资产库页面和选择弹窗都使用同一套组件,避免视频封面、音频唱片、文档/字幕文本预览、3D 封面等表现漂移。
- 支持搜索、资产类型、时间、只看收藏、单选 / 多选和按入口限制可选资产类型;当入口限制可选类型时,不单独展示说明行,而是在资产类型筛选器里体现限制。
- 原型实现需要抽出共享的筛选组件,资产库页面和选择弹窗都使用同一套资产类型筛选、快捷日期筛选和自定义日期范围。
- 资产类型筛选器即使存在入口限制也需要可点击展开;下拉中展示全部资产类型,当前入口不可选择的类型置灰禁用。
- 选择弹窗在 Dialog 内使用 Popover 时,需要保证下拉层级高于弹窗内容,避免类型筛选、时间筛选点击后看不到浮层。
- 生成页普通参考图入口只选图片,参考视频入口只选视频,参考音频入口只选音频。
- 生成页首尾帧入口只选图片;选择 1 张时填入第一个空槽,选择 2 张时按顺序填入首帧和尾帧。
- Seedance 全能参考入口可选图片、视频、音频,并按资产类型分别加入对应参考列表。
- 对话输入框第一版只承接图片、视频、音频资产,并渲染为当前输入框 chip。
- 画布第一版承接图片、视频、音频和 3D 资产;多选导入时同批资产横向排列在同一行;文档、字幕后续需要结合画布文档预览组件再接。
- 画布资产标题行:
- hover、选中和已收藏资产可以显示资产标题行。
- 标题行必须随画布 camera / viewport 移动,不允许在资产已经离开视窗后固定停留在视窗顶部或边缘。
- 画布相关复用先不放在资产库详情的继续创作入口中,避免和“编辑/加入当前画布”的后续承接混淆。
- 资产库里的继续创作入口需要在新页面打开,避免用户丢失当前资产浏览状态。
- 原型阶段通过前端 URL 参数 / 页面状态完成轻量承接即可:生成页直接把资产渲染到参考素材区,新对话输入框直接渲染资产 chip。
- 正式上线不要求“刷新后恢复未提交的承接状态”;用户点击资产库入口后的预期是在新页面看到对应 chip 或参考素材,完成一次前端模拟用户添加的操作即可。
- 资产库内已有资产发起复用时,不额外引入一套服务端拦截流程;类型、名称、缩略图等继续复用资产库已有读取口径。服务端需要补齐的是资产本身的统一入库、归属、可查询和可复用引用,而不是继续创作按钮的二次权限拦截。
- 单个资产详情里的继续创作每次打开一个新的创作上下文;不把资产添加到历史任务、历史对话或已经打开的窗口中。
- 批量添加需要先在资产库内容区多选资产,再通过底部批量操作条一次添加到一个新对话或一个新生成任务,不为每个资产分别打开窗口。
作为生成参考规则:
- 图片资产可选择「参考生图」「首尾帧」「全能参考」。
- 视频资产、音频资产只允许选择「全能参考」,因此不展示只有一项的下拉,点击后直接进入视频生成全能参考模式。
- 直接点击「作为生成参考」时,图片资产默认走「参考生图」,视频 / 音频资产默认走「全能参考」。
- 「参考生图」进入图片生成,并把资产放入参考图片。
- 「首尾帧」进入视频生成,并把图片资产放入首帧。
- 「全能参考」进入视频生成全能参考模式,并按资产类型放入图片 / 视频 / 音频参考区。
- 批量作为生成参考时:
- 仅图片资产可选择「参考生图」或「全能参考」。
- 图片 / 视频 / 音频混选时只提供「全能参考」。
- 「首尾帧」涉及首帧 / 尾帧槽位和顺序选择,MVP 批量入口暂不开放。
- 文档、字幕、3D 等暂不支持继续创作的资产会被自动排除,不参与批量添加。
- 当前原型已按上述混选规则处理:可创作资产只包含图片、视频、音频;混入文档、字幕、3D 时,这些资产不会进入继续创作承接。
- 生成模块从资产库选择资产时,应由生成模块沿用当前模型的参考素材校验逻辑,不绕过上传入口已有约束。
- Seedance 全能参考入口需要同步校验:
- 总数上限:图片、视频、音频合计最多 12 个。
- 视频:仅支持 mp4 / mov;单文件 50MB;视频总时长不超过 15.2s;像素需在 `[409600, 927408]` 区间内。
- 音频:仅支持 wav / mp3;单文件 15MB;音频总时长不超过 15s。
- 资产库选择入口不做视频压缩;如果已有视频资产超过像素或体积限制,直接提示用户不符合当前模式要求。
- 图片尺寸 / 比例等未来模型约束也应接入同一校验入口;当前代码未发现普通参考图存在明确尺寸 / 比例限制,因此不额外伪造规则。
## 8. 团队规则
### 8.1 个人空间复制到团队
规则:
```text
个人空间 / 个人资产
→ 复制到团队
→ 目标团队 / 个人资产
```
说明:
- 点击「复制到团队」后弹出选择团队空间的弹窗,交互参考「我的项目」复制到团队空间。
- 用户选择目标团队后,资产复制到该团队空间下当前用户自己的「个人资产」。
- 默认进入目标团队的「个人资产」,不直接进入「团队资产」。
- 原资产保留,复制后的资产归当前用户所有。
- 复制行为创建独立副本,副本有独立的资产 ID、资产名、收藏状态、删除状态和来源记录。
- 后续删除个人空间里的原资产,不影响已经复制到团队空间个人资产里的副本。
### 8.2 团队空间个人资产复制到团队资产
规则:
```text
团队空间 / 个人资产
→ 复制到团队
→ 团队空间 / 团队资产
```
说明:
- 该操作只在团队空间的「个人资产」中展示。
- 复制后团队成员可见。
- MVP 使用复制策略,不使用移动策略,避免影响个人草稿、个人任务和历史上下文。
- 原团队空间「个人资产」保留。
- 复制后的团队资产创建者为执行复制的用户。
- 团队成员只能把自己在该团队空间下的「个人资产」复制到「团队资产」,不能复制他人的个人资产。
- 复制行为创建独立副本,个人资产和团队资产后续的改名、收藏、删除互不影响。
### 8.3 团队资产权限
团队资产权限:
| 行为 | 创建者 | 团队成员 |
| --- | --- | --- |
| 查看 | 可以 | 可以 |
| 收藏 | 可以 | 可以 |
| 添加到对话 | 可以 | 可以 |
| 添加到画布 | 可以 | 可以 |
| 作为生成参考 | 可以 | 可以 |
| 下载 | 可以 | 可以 |
| 改名 | 可以 | 不可以 |
| 删除 | 可以 | 不可以 |
删除规则:
- 团队空间「个人资产」只允许资产所有者删除。
- 团队空间「团队资产」MVP 只允许该团队资产的创建者删除。
- 团队成员删除自己的个人资产,不影响已经复制到团队资产的副本。
- 团队资产被创建者删除后,对团队成员立即不可见。
- 资产删除统一采用软删除,进入资产回收站;回收站交互参考「我的任务」回收站。
- 删除个人资产只影响该资产本身,不影响复制到团队后的独立副本。
- 删除团队资产只影响团队资产副本,不反向删除个人资产原件。
- MVP 不做管理员 / Owner 代管他人资产。
### 8.4 当前代码支持度判断
当前 Ignis 已具备团队复制原型所需的部分基础能力:
- 前端工作空间上下文能区分个人空间和团队空间,并能拿到当前团队 ID。
- 资产库查询已按 `workspace_id = personal:{userId} / team:{teamId}` 区分空间。
- 团队空间访问已能校验当前用户是否是团队 owner 或 ACTIVE 成员。
- 生成资产当前可通过 `GenerationTask.task_scope = PERSONAL / TEAM` 临时推导个人资产或团队资产。
- 资产列表返回了 `ownedByCurrentUser`,可以支撑“只有创建者 / 所有者能删除、改名、复制自己的个人资产”的前端判断。
上线仍需要后端补齐:
- 资产级 `asset_scope: PERSONAL | TEAM`,不能长期依赖生成任务 `task_scope` 推导。
- 资产复制 mutation:复制原文件引用或生成新 storage 记录,写入目标 workspace、asset_scope、owner、source 和 metadata。
- 团队列表应复用真实 `team.listMine` 或等价接口,不使用原型假数据。
- 资产改名 mutation,且只更新资产库记录,不改历史任务消息。
- 资产软删除 / 恢复 / 彻底删除接口,以及资产回收站列表。
- 资产级权限判断需要放在服务端 mutation 内再次校验,前端判断只用于隐藏入口和减少误操作。
## 9. 数据模型建议
现有 `Asset` 表已有字段:
```text
workspace_id
owner_user_id
source_module
source_type
asset_type
url
storage_key
thumbnail_url
metadata
```
当前最小接入不改表结构,因此资产名称只能临时占位展示。正式资产库需要补充资产级名称能力,可以是独立字段 `name`,也可以先落在稳定的资产 metadata 中;关键约束是生成资产入库时就要生成默认名称,而不是在资产库页面用提示词截断临时拼出来。
为了支持「我的上传」稳定呈现,后续上传入库需要记录以下信息:
```text
uploaded_by_user_id 上传人
uploaded_at 上传时间
upload_workspace_id 上传发生的空间:personal:{userId} / team:{teamId}
upload_asset_scope 上传后资产归属:PERSONAL / TEAM
upload_entry_module 上传入口:CHAT / GENERATION_REFERENCE / CANVAS
upload_context_id 对话 ID / 消息 ID / 生成任务 ID / 画布 ID;如果只是完成上传但尚未发出任务,可以为空
original_file_name 用户本地文件名
```
如果短期不改表,可以先把这些字段写入 `metadata`,并把 `source_type` 扩展出 `UPLOADED`,或增加等价的上传标记字段。关键是不能只保存最终 URL,否则后续无法判断是谁上传、在哪个空间上传、应出现在「个人资产 / 团队资产 / 我的上传」中的哪个视图。
上传资产需要支持“未关联任务”的状态:
- 用户在对话输入框或生成模块参考表单里完成上传后,即使还没有发送消息或提交生成任务,文件也已经存在于对象存储。
- 这类资产不能因为没有任务 ID 就变成公共资产,也不能丢失归属;应按上传时所在工作空间和入口写入上传资产记录。
- 当用户后续发送消息或提交生成任务时,再把该上传资产追加关联到对应 session / message / generation task;没有后续任务时,仍可在「我的上传」里按上传人和空间找到。
- 上传资产默认进入上传者个人资产;团队任务中上传的参考素材也先归属于上传者在当前团队空间下的个人资产,不自动进入团队资产。
为了支持团队空间下「个人资产 / 团队资产」,建议新增资产范围字段:
```text
asset_scope: PERSONAL | TEAM
```
建议查询口径:
```text
个人空间 / 个人资产:
workspace_id = personal:{userId}
asset_scope = PERSONAL
owner_user_id = currentUserId
团队空间 / 个人资产:
workspace_id = team:{teamId}
asset_scope = PERSONAL
owner_user_id = currentUserId
团队空间 / 团队资产:
workspace_id = team:{teamId}
asset_scope = TEAM
```
### 9.1 原型最小接入策略
为了先验证资产库浏览体验,第一阶段不调整表结构,直接读取现有 `Asset` 表:
- 只接入 `source_module = GENERATION` 的生成资产。
- 只展示现有枚举已支持的 `IMAGE / VIDEO`。
- 资产名第一版优先取 `metadata` 中已有名称 / 原始文件名,其次取 `storage_key` 或 URL 最后一段文件名;都没有再展示未命名占位。
- 生成详情中的创意描述复用 `GenerationTask.prompt_text`,参考资产复用 `GenerationTask.request_payload` 中的 `referenceImages / referenceVideos / referenceAudios / firstFrame / lastFrame`。
- `个人资产 / 团队资产` 先通过关联的 `GenerationTask.task_scope` 推导:
- `task_scope = PERSONAL` 视为个人资产。
- `task_scope = TEAM` 视为团队资产。
- 个人资产仍按 `owner_user_id = currentUserId` 过滤。
- 团队资产不按 owner 过滤,但需要先校验当前用户是团队成员。
- 收藏状态原型阶段只模拟资产收藏;真实上线后接入 `asset_favorites`。
- 下载、删除、复制到团队、改名等管理动作先保留原型交互,不在本阶段直接写库。
- 大量资产场景需要后端配合实现分页 / 游标加载、按时间和类型的服务端筛选、缩略图地址生成、必要索引和计数能力;前端列表后续再结合虚拟列表或分段渲染,避免一次性拉取和渲染过多资产。
这个策略可以快速把页面从 mock 数据切到真实生成资产,但它不是最终资产库数据模型。后续如果要支持音频、文档、字幕、3D、资产级收藏、资产改名、软删除或非生成来源,需要再补充字段或表。
## 10. MVP 暂不包含
第一版不做:
- 自定义分类
- 多分类绑定
- 分类重命名
- 分类删除和资产回退
- 统计行
- 全屏弹窗
- 批量整理
- 管理员代删他人资产
- 团队资产复制回个人空间
- 跨团队转移
- 通用化的跨模型复杂参考规则配置后台;MVP 仅在前端复用当前生成模块已明确实现的模型约束
## 11. 待确认问题
1. 画布是否需要在后续版本升级为可拖拽资产浮窗,而不是第一版的选择弹窗。