feat(*): 生图与视频工作台 - 新增独立生成流程并整合平台配置

This commit is contained in:
ddcat666
2026-10-13 08:54:53 +08:00
parent 4c1d2b4012
commit 1f3f2c6020
69 changed files with 7108 additions and 87 deletions

View File

@@ -45,7 +45,9 @@ Schema 45 新增 `upload_reservations`:`id`、`user_id`、`size`、`day`、`ex
`auth_sessions.reauthenticated_at` 记录当前会话的 Linux.do 重新核验时间,有效 5 分钟;`o_auth_states.reauth_user_id/reauth_session_id` 绑定发起重新核验的账号及会话。重新核验只允许原绑定的第三方身份,不创建账号或新登录会话。`auth_verifications.session_id/credential_hash` 将 `profile_email` 用途的验证码绑定到当前用户、当前会话和密码状态。密码、邮箱修改及旧会话撤销在同一事务提交;登录会话签发同时检查账号凭据,阻止并发旧密码登录在撤销之后再创建会话。升级执行 `migrate-schema up` / `verify`,禁止手工修改既有迁移记录。
当前结构版本为 53;版本 53 新增独立登录日志表 `login_logs`,详见本页“用户登录日志”。版本 50 新增 `canvas_mutation_receipts`,按 `(user_id, canvas_id, mutation_id)` 唯一记录画布 operations 请求摘要、确定性结果和提交 revision,供响应丢失后的幂等重放使用;receipt 与画布内容、revision 在同一事务提交。版本 49 `banner_sort_order` 为 `banner_announcements` 增加可配置的 `sort_order` 展示顺序;版本 48 `channel_proxy_url` 为 `model_channels` 增加渠道级出站代理地址 `proxy_url`,支持 `socks5://`、`http://`、`https://`;留空时沿用全局代理。代理地址只返回管理员视图,普通用户目录不暴露渠道代理或其中的认证信息。版本 42 `cloud_agent_pi_sessions` 新增 `cloud_agent_pi_sessions` 表,按运行 ID 保存 Pi 原生 JSONL 会话快照、用户 ID、乐观并发 revision 和更新时间;会话正文由 Agent runtime 管理,Go 只将其作为不透明快照读写,不替代有界控制检查点、事件日志或任务记录。版本 41 `resource_thumbnail` 为 `resources` 增加缩略图元数据。版本 40 `builtin_skill_tombstones` 新增内置技能删除记录,管理员删除平台技能后,后续启动同步不会重新创建该技能;版本 39 `skill_library_categories` 新增 `skill_library_categories` 表,并为 `user_skill_states` 增加 `library_category_id`,保存个人技能库分类及每个用户对技能的归类;分类不改变 `skills.tag` 的技能广场共享分类。版本 38 `prefixed_id_sequence_reconcile` 创建(若缺失)并校准 `id_sequences`:`CHANNEL`、`MODEL`、`PTIER`、`ATTEMPT`、`LMODEL`、`REVISION`、`ROUTE` 按对应业务表的最大有效 ID 前移,包含软删除记录,不回退已有序列、不重写业务 ID。分配新 ID 时再次校准并检查冲突;SQLite → PostgreSQL 迁移完成后也校准序列。 `cloud_agent_gemini_cache` 创建 `cloud_agent_gemini_caches`,保存用户范围内的官方 Gemini 缓存元数据;版本 37 `cloud_agent_gemini_cache_identity` 将缓存标识约束修正为 `(user_id, cache_key)`,移除旧的全局 cache_key 唯一索引。版本 35 `auth_notifications` 为认证通知与组合验证补齐 `auth_verifications`、`notification_quotas`、`sms_channels`、`sms_records` 四张表,并为 `users` 增加 `phone`、`email_verified_at`、`phone_verified_at`,为 `email_verification_codes` 增加 `attempts`;同时创建非空手机号唯一索引。版本 34 `task_media_recovery` 为 `tasks` 增加 `media_recovery_json`(text)和 `media_stage`(最长 24 字)。版本 33 `oauth_state_accepted_terms` 为 `o_auth_states` 增加非空布尔列 `accepted_terms`,默认 `false`,不替历史流程补造同意记录。
当前结构版本为 54;版本 53 新增独立登录日志表 `login_logs`,详见本页“用户登录日志”。版本 50 新增 `canvas_mutation_receipts`,按 `(user_id, canvas_id, mutation_id)` 唯一记录画布 operations 请求摘要、确定性结果和提交 revision,供响应丢失后的幂等重放使用;receipt 与画布内容、revision 在同一事务提交。版本 49 `banner_sort_order` 为 `banner_announcements` 增加可配置的 `sort_order` 展示顺序;版本 48 `channel_proxy_url` 为 `model_channels` 增加渠道级出站代理地址 `proxy_url`,支持 `socks5://`、`http://`、`https://`;留空时沿用全局代理。代理地址只返回管理员视图,普通用户目录不暴露渠道代理或其中的认证信息。版本 42 `cloud_agent_pi_sessions` 新增 `cloud_agent_pi_sessions` 表,按运行 ID 保存 Pi 原生 JSONL 会话快照、用户 ID、乐观并发 revision 和更新时间;会话正文由 Agent runtime 管理,Go 只将其作为不透明快照读写,不替代有界控制检查点、事件日志或任务记录。版本 41 `resource_thumbnail` 为 `resources` 增加缩略图元数据。版本 40 `builtin_skill_tombstones` 新增内置技能删除记录,管理员删除平台技能后,后续启动同步不会重新创建该技能;版本 39 `skill_library_categories` 新增 `skill_library_categories` 表,并为 `user_skill_states` 增加 `library_category_id`,保存个人技能库分类及每个用户对技能的归类;分类不改变 `skills.tag` 的技能广场共享分类。版本 38 `prefixed_id_sequence_reconcile` 创建(若缺失)并校准 `id_sequences`:`CHANNEL`、`MODEL`、`PTIER`、`ATTEMPT`、`LMODEL`、`REVISION`、`ROUTE` 按对应业务表的最大有效 ID 前移,包含软删除记录,不回退已有序列、不重写业务 ID。分配新 ID 时再次校准并检查冲突;SQLite → PostgreSQL 迁移完成后也校准序列。 `cloud_agent_gemini_cache` 创建 `cloud_agent_gemini_caches`,保存用户范围内的官方 Gemini 缓存元数据;版本 37 `cloud_agent_gemini_cache_identity` 将缓存标识约束修正为 `(user_id, cache_key)`,移除旧的全局 cache_key 唯一索引。版本 35 `auth_notifications` 为认证通知与组合验证补齐 `auth_verifications`、`notification_quotas`、`sms_channels`、`sms_records` 四张表,并为 `users` 增加 `phone`、`email_verified_at`、`phone_verified_at`,为 `email_verification_codes` 增加 `attempts`;同时创建非空手机号唯一索引。版本 34 `task_media_recovery` 为 `tasks` 增加 `media_recovery_json`(text)和 `media_stage`(最长 24 字)。版本 33 `oauth_state_accepted_terms` 为 `o_auth_states` 增加非空布尔列 `accepted_terms`,默认 `false`,不替历史流程补造同意记录。
版本 54 `workbench_tools_and_presets` 新增 `workbench_tools` 与 `workbench_presets`:工具记录生图/视频类型、分类、名称、说明、资源 ID、排序、能力/指南 JSON、启用状态、版本和操作人;预设记录工具外键、名称、说明、提示词模板、默认参数 JSON、排序、启用状态、版本和操作人。普通用户目录只返回启用工具与预设;管理写入均做管理员校验和审计。工具图标/封面必须引用管理员名下就绪图片资源,发布后的引用进入资源删除保护;用户目录通过服务端授权的短期 display 资源地址展示,不放宽资源所有者访问边界。工作台任务使用专属 DTO,由服务端确认工具/预设仍启用、参考资源归属与媒体类型,并从逻辑模型目录解析执行配置后复用现有任务 admission、计费和队列。`imageWorkbenchEnabled` 与 `videoWorkbenchEnabled` 位于 `feature_availability` JSON,默认关闭;分别保护目录读取和新任务提交。版本 48 `channel_proxy_url` 为 `model_channels` 增加渠道级出站代理地址 `proxy_url`,支持 `socks5://`、`http://`、`https://`;留空时沿用全局代理。代理地址只返回管理员视图,普通用户目录不暴露渠道代理或其中的认证信息。版本 42 `cloud_agent_pi_sessions` 新增 `cloud_agent_pi_sessions` 表,按运行 ID 保存 Pi 原生 JSONL 会话快照、用户 ID、乐观并发 revision 和更新时间;会话正文由 Agent runtime 管理,Go 只将其作为不透明快照读写,不替代有界控制检查点、事件日志或任务记录。版本 41 `resource_thumbnail` 为 `resources` 增加缩略图元数据。版本 40 `builtin_skill_tombstones` 新增内置技能删除记录,管理员删除平台技能后,后续启动同步不会重新创建该技能;版本 39 `skill_library_categories` 新增 `skill_library_categories` 表,并为 `user_skill_states` 增加 `library_category_id`,保存个人技能库分类及每个用户对技能的归类;分类不改变 `skills.tag` 的技能广场共享分类。版本 38 `prefixed_id_sequence_reconcile` 创建(若缺失)并校准 `id_sequences`:`CHANNEL`、`MODEL`、`PTIER`、`ATTEMPT`、`LMODEL`、`REVISION`、`ROUTE` 按对应业务表的最大有效 ID 前移,包含软删除记录,不回退已有序列、不重写业务 ID。分配新 ID 时再次校准并检查冲突;SQLite → PostgreSQL 迁移完成后也校准序列。 `cloud_agent_gemini_cache` 创建 `cloud_agent_gemini_caches`,保存用户范围内的官方 Gemini 缓存元数据;版本 37 `cloud_agent_gemini_cache_identity` 将缓存标识约束修正为 `(user_id, cache_key)`,移除旧的全局 cache_key 唯一索引。版本 35 `auth_notifications` 为认证通知与组合验证补齐 `auth_verifications`、`notification_quotas`、`sms_channels`、`sms_records` 四张表,并为 `users` 增加 `phone`、`email_verified_at`、`phone_verified_at`,为 `email_verification_codes` 增加 `attempts`;同时创建非空手机号唯一索引。版本 34 `task_media_recovery` 为 `tasks` 增加 `media_recovery_json`(text)和 `media_stage`(最长 24 字)。版本 33 `oauth_state_accepted_terms` 为 `o_auth_states` 增加非空布尔列 `accepted_terms`,默认 `false`,不替历史流程补造同意记录。
升级前备份,按既有流程执行 `migrate-schema up` 和 `verify` 后再启动新后端。旧版本二进制不支持版本 42,回退需恢复匹配的数据库备份,并评估备份之后的新写入;不能只切回旧镜像。关闭自动迁移的生产环境必须运行正式迁移;手工改表不能更新 `schema_migrations` 的版本与校验和记录。

View File

@@ -15,6 +15,12 @@ description: 当前项目已实现的核心工作台能力与使用入口
“账户与设置”新增“个人信息”,展示账号名称与绑定邮箱状态。用户可预览并保存个人头像或恢复系统默认头像,顶栏、侧栏、账户卡片与创作消息同步更新。密码修改与邮箱更换分别保存;修改密码需要当前密码,邮箱更换还需要新邮箱验证码,成功后退出所有登录会话。纯 Linux.do 账号可重新授权核验身份后设置本地密码或更换邮箱。沿用现有设置页、表单、按钮反馈与主题,未增加昵称、用户名或角色编辑。
## 生图与视频工作台
普通用户可分别使用生图、视频工作台。通过工具卡片选择场景,套用预设提示词,按所选模型能力配置参数和参考素材;生成结果、运行任务及历史详情在同一页面查看。管理员在「工作台工具」维护分类、图标/封面、预设、使用说明与示例素材,并在「功能开放」分别控制两个入口。新入口默认关闭;工作台任务经过统一任务与计费服务创建。
详见[生图与视频工作台](./workbench)。
## 可美 KM Seedream 图片
`km-kemei-seedream` 声明式插件接入 Seedream 5.0 Pro / Flash 的文生图与参考图编辑,支持 URL / Base64 响应并由宿主统一保存图片。精确模型 ID 与扩展参数见插件包内 `docs/interface.md`。

View File

@@ -0,0 +1,246 @@
# 生图与视频方案
## 1. 目标与范围
为普通用户提供两个独立入口:
- **生图**:面向文生图、图生图和工具化的图像编辑任务。
- **视频**:面向文生视频、图生视频,以及模型支持的视频/音频参考输入。
后台提供“工作台工具管理”,维护生图和视频工具目录、分类、预设提示词、图标/封面、使用说明及示例媒体;“功能开放”增加两个独立开关,由管理员控制对应用户入口和后端写入能力。
这不是新的模型协议实现。模型选择、能力判断、任务排队、计费、取消、媒体落库、资源访问与任务恢复均复用现有生成链路。工具目录负责组织场景、注入经过校验的预设内容和展示指南,不直接保存供应商密钥或任意上游请求配置。
## 2. 调研结论
### 外部页面
已访问:
- https://maolong.da-ai.cc/toolbox/image-generation
- https://maolong.da-ai.cc/toolbox/video-generation
页面可正常返回,但当前无登录会话的页面抓取只得到产品导航、页面标题和路由入口,生成区由前端/登录态驱动的内容没有暴露。因此可确认该产品将 AI 图片、AI 视频作为独立一级工作区;不能据此断言其具体参数布局、任务列表或交互细节。后续如需逐项视觉对标,应在可登录浏览器会话中再做实页观察。
### 仓库现状
- 路由由 `web/src/router.tsx` 管理;普通用户导航在 `workspace-sidebar-nav.tsx` 组合,并从用户会话读取 `FeatureAvailability`。
- 已有 `/tasks` 创作历史,可显示图片/视频任务、状态、预览和详情;任务详情数据包含输入、输出、开始/完成时间及账单摘要。
- `web/src/services/api/generation-task.ts` 的 `runBackendGenerationTask` / `submitBackendGenerationTask` 负责把前端配置、模型能力和参考媒体转换为统一任务请求。页面不应直接请求供应商。
- 后端 `CreateTask` 会重新解析模型/渠道/路由、能力、用户配额与账单;`POST /api/tasks` 是标准模型任务入口。媒体必须先保存为资源,再以资源引用提交,不能在任务 JSON 中长期持有 data URL。
- 当前 `FeatureAvailability` 使用系统设置持久化,管理员更新有审计;前端 `RequireFeature` 只适合路由层,开放状态不能仅靠隐藏导航实现。任务写接口需在后端创建工作台任务时做强校验。
- 后台已有系统设置、管理页面、素材上传和提示词版本管理模式,可作为工具管理 UI 的相邻实现参考;但创作工具预设与现有面向系统提示策略的模板语义不同,不建议强行共用同一数据实体。
## 3. 信息架构与页面布局
### 导航和路由
- 一级入口名称固定为“生图”“视频”,建议路径分别为 `/toolbox/image`、`/toolbox/video`。
- 两个入口分别绑定 `imageWorkbenchEnabled`、`videoWorkbenchEnabled`。未开放时侧栏不显示;直接访问路由显示统一的“暂未开放”状态并返回创作台。
- 工具、分类和预设使用可分享的 URL 查询参数:`tool=<toolId>`、`preset=<presetId>`。切换工具时更新 URL,刷新和复制链接可恢复上下文;草稿提示词和本地临时文件不写 URL。
- 任务历史可以直接作为右侧面板内的历史记录查看,不新增重复的全屏历史入口。现有 `/tasks` 保持全局创作历史职责。
### 桌面布局
在可用内容宽度足够时使用三列工作台,按用户给定比例作为基线而非固定像素:左侧约 40%,中间约 30%,右侧约 30%。三列之间用细边界和间距分区,避免卡片套卡片。建议主区最小可用宽度约 1200px;列宽使用 `minmax()` 并为右栏任务行预留稳定宽度。
**左侧:工具与生成输入**
1. 顶部工具选择器显示当前工具图标、名称、副标题、下拉入口及“新建/切换工具”操作。
2. 打开选择器后使用用户提供的参考图方向:标题/搜索/分类标签/工具卡片网格。卡片包括图标或缩略图、名称、简短用途和选中状态;分类可搜索,键盘可浏览及选中。没有搜索结果时提供清除搜索入口。
3. 选中工具后,工具配置表单按工具支持项显示模型、生成参数、提示词、参考图/视频/音频。未被模型能力支持的项隐藏或解释为不可用,不能显示无效控件。
4. 工具预设以可发现的弹窗/Popover 选择,点选后把模板内容填入提示词草稿;如果模板定义了参数默认值,只填充未被用户手动修改的字段。不能静默覆盖用户输入。
5. 提示词支持字数提示、清空、必要的优化入口和生成前校验。参考媒体支持预览、删除、排序、模型数量/类型限制、上传进度和失败重试。界面明确区分“已保存资源”与“尚在上传”。
6. 生成按钮显示当前模型/配置下可获得的预估积分;报价不可用时不猜测价格,提交后按服务端结果显示实际账单。
**中间:生成结果与工具说明**
上下两区各约占中间栏可视高度的一半:
- 上区是当前选中任务结果。未提交显示空态;排队/生成中显示带进度语义的骨架和低强度流动高光;成功后显示图片画廊或视频播放器;失败显示原因、重试/查看任务操作。动效尊重 `prefers-reduced-motion`,不影响页面滚动或结果尺寸。
- 多结果图片以稳定网格/轮播浏览,图片保持原比例并可放大、下载、保存到资产。视频结果显示封面、时长、播放控件和下载/保存操作。
- 下区展示当前工具的说明、适用模型/模式、参数指南、注意事项和示例图/视频。说明来自后台受控 Markdown/结构化内容;禁止直接渲染未经清理的 HTML。
- 没有工具或说明加载失败时分别显示选择工具提示/可重试错误,不用空白区占位。
**右侧:运行中任务与历史**
- 上半区为正在排队/执行的工作台任务,按最近更新排序,显示缩略图、工具/模型、提示词截断、进度/阶段、已耗时及取消入口(仅在后端允许时)。状态来自后端任务服务,离开页面后仍可恢复。
- 下半区为历史生成记录,支持图片/视频过滤、时间倒序及增量分页。条目显示缩略图、成功/失败/取消状态、工具名、模型、创建时间。
- 点击一条历史打开详情弹窗:左侧显示图片/视频结果,右侧显示完整提示词、工具与模型、生成配置、参考素材、耗时、积分账单和状态/错误。详情以任务记录为准;不可访问或过期的媒体显示明确状态,不暴露上游 URL 或内部错误字段。
- 右侧两区各自滚动,桌面下不跟随左侧参数表单滚动;内容区边界清晰,列表项使用紧凑行,不以重复的大型装饰卡片占据空间。
### 响应式退化
- ≥1440px:采用完整三栏,按 40/30/30 比例动态分配。
- 1024–1439px:左侧输入区与中间结果区并列,右侧任务/历史收为可切换抽屉或窄栏,默认展示输入和结果。
- <1024px:单列工作区,顶部以“生成 / 结果 / 任务”Tab 或分段控件切换;生成表单不能被常驻任务栏挤压。弹窗变为全屏或底部抽屉。
- 不允许在窄屏强行保持三栏导致横向滚动。拖放上传在触屏场景提供等价文件选择操作。
## 4. 用户核心流程
1. 用户从导航进入图片或视频;前端确认功能开放状态。
2. 用户通过工具选择弹窗选定场景工具,页面加载该工具可用预设和说明。
3. 用户选择当前会话模型;前端根据模型目录能力显示对应参数和参考媒体类型,不支持的组合及时阻止提交。
4. 用户选用预设提示词并修改,上传参考媒体到资源服务,检查报价/配额提示后提交。
5. 前端调用现有统一任务服务创建任务;任务 ID 纳入页面状态。右栏立即出现任务,中间显示处理中状态。
6. 订阅/轮询任务状态。成功后中间展示结果并更新右栏历史;失败、取消、过期或结果回存失败均提供相应恢复路径。
7. 用户点击历史条目,在详情弹窗检查结果、参数、耗时和服务端账单。
重试必须创建新的尝试并保留原任务关联,不在客户端伪造任务状态;取消以服务端返回为准。刷新页面后根据后端任务重新构建运行中任务列表。
## 5. 功能模块边界
### 前端
- 新增两个工作台路由页面和共享工作台框架,工具选择器、配置表单、结果区、任务/历史区作为页面私有组件起步;只有图片与视频确实共享交互合同后,再抽成跨页面组件。
- 模型参数和媒体能力统一由已有模型 capability/profile 数据驱动,避免工具配置复制一份参数协议。
- 页面负责协调选择、表单草稿和展示;API service 负责工具目录读写、上传引用和任务调用;纯映射/校验留在 `lib`。
- 用户端工具目录响应不包含后台草稿、隐藏工具、内部存储地址或管理员审计内容。
### 后端工具管理
建议在管理后台新增“工作台工具”运营入口,包含工具列表、预览、创建/编辑、排序、上线/下线、版本历史;左右分区按“生图工具 / 视频工具”筛选。
工具清单建议字段:
- `id`:稳定 ID,不以展示名称作为外键。
- `kind`:`image` 或 `video`。
- `categoryId`、`name`、`subtitle`、`description`。
- `iconResourceId` / `coverResourceId`:引用平台资源,不保存任意 URL。
- `sortOrder`、`enabled`、`createdAt`、`updatedAt`、`updatedBy`、`version`。
- `supportedModes` / `capabilityRequirements`:受限的能力声明,表达文生图、图生图、图生视频、首尾帧、音频参考等 UI 需求;不能用于指定协议 URL。
- 可选展示指南/示例媒体资源引用。
预设提示词建议独立实体,以便版本和启用状态独立维护:`id`、`toolId`、`name`、`summary`、`promptTemplate`、受限的 `defaultParameters`、`sortOrder`、`enabled`、审计字段。模板变量使用显式白名单和 schema 校验,不支持服务端代码执行或任意插值函数。删除被任务历史引用的工具/预设时采用下线/软删除,历史记录仍显示任务创建时保存的工具快照名称。
分类是导航元数据,可以做独立表或受校验的配置项;首版建议分类资源和排序统一由后台管理,内置系统分类 ID 保持稳定。工具预设中的默认参数仅可填入普通生成参数,不能覆盖用户模型凭证、渠道、资源归属、计费值、任务类型或服务端路由字段。
### 图片/视频资源
图标、工具封面和示例媒体走现有资源上传/访问能力,后台只保存资源 ID。按资源归属检查管理员上传、引用和删除;被工具引用的媒体不可直接物理删除。用户生成结果使用现有任务结果及资源访问接口,避免复制二进制到新表。
## 6. 功能开放与权限/安全
### 开放控制
- 在 `FeatureAvailability` 增加 `imageWorkbenchEnabled` 与 `videoWorkbenchEnabled`,并沿用 `/admin/settings/features` 的管理员即时变更和审计约定。
- 公共登录后会话或 `/features` 返回两个字段;旧配置缺字段按明确的安全默认值补齐。建议新能力初始关闭,避免代码部署后用户入口意外曝光;该默认值需与上线策略一并确认。
- 前端侧栏和路由读取该字段,用户直接打开关闭的页面时显示未开放状态。
- 后端对工作台目录的普通用户读取、任务创建入口分别检查对应开关。至少对 `POST /tasks` 增加按任务 `metadata.source`/规范化模式识别工作台来源并校验,但不可只信客户端传入的 `source`;必须同时由后端根据任务媒体模式和工作台专属入口/签名字段建立可验证边界。
- 更推荐新增受开关保护的工作台任务创建 API,由服务端注入 `workbenchKind`、工具 ID 和预设 ID,再调用现有 `CreateTask` admission 服务;不要依赖通用 `/tasks` 的自由客户端 metadata 来区分是否属于工作台。内部 Agent、画布及短剧流程继续使用原任务入口,不因关闭新工作台而误停。
- 关闭开关只阻止新目录访问和新任务创建,不应丢失或隐藏用户已有历史任务、资源、账单及正在执行任务。是否阻止关闭后访问工作台历史需保持与现有任务中心政策一致。
### 数据与执行安全
- 工具/预设管理接口必须管理员授权;用户查询只返回启用版本。更新、下线和排序均审计操作人、前后值或版本号。
- 所有查询和写入按当前用户、资源归属及任务归属检查;任何详情 API 不允许跨用户读取。
- 请求体只提交资源 ID、表单参数和提示词,不含第三方 API Key、Cookie、远端媒体 URL或 inline data URL。参考素材先进入资源服务,再由服务端转为受控 Provider 输入。
- 后端基于所选模型能力重新校验图像/视频/音频参考数量、类型、尺寸、时长、比例、分辨率和工具要求;前端校验仅改善反馈。
- 计费、配额、并发限制及积分预占/退款由现有任务与账单服务负责。管理工具表不保存积分价格,详情账单直接取服务端任务/订单摘要。
- 提示词作为用户输入按现有安全策略处理,不执行模板内容;说明 Markdown 输出需经过白名单渲染和链接协议过滤。
## 7. API 草案
以现有 `/api` 风格为准,路径最终以 OpenAPI 更新为准:
**用户端**
- `GET /api/workbench/tools?kind=image|video`:返回启用工具、分类、启用预设、资源预览引用与说明。
- `GET /api/workbench/tools/:toolId`:返回单个工具的公开详情。
- `POST /api/workbench/tasks`:携带 `toolId`、`presetId?`、`kind`、用户提示词、模型选择意图、生成参数及资源 ID;服务端加载工具/预设快照、校验开关/模型能力后转入标准任务 admission 与账单流程。
- `GET /api/workbench/tasks?kind=&activeOnly=&cursor=`:可选的工作台筛选任务查询;若现有 `/tasks` 查询可通过可信的服务端元数据过滤并且分页性能合格,则可以复用而不增加重复 API。
- 历史详情优先复用 `GET /api/tasks/:id` 及资源访问 API,保证同一归属校验。
**管理端**
- `GET /api/admin/workbench/tools?kind=`
- `POST /api/admin/workbench/tools`
- `PATCH /api/admin/workbench/tools/:id`
- `POST /api/admin/workbench/tools/:id/publish` / `unpublish`
- `POST /api/admin/workbench/tools/:id/presets`
- `PATCH /api/admin/workbench/presets/:id`
- `POST /api/admin/workbench/presets/:id/activate` / `unpublish`
- 资源继续走现有上传/资源访问接口。
管理端写接口应采用明确 DTO 和字段白名单,不能直接反序列化到数据库实体;启用或发布动作校验必填内容、资源引用、模板 schema 和分类归属。
## 8. 数据存储和迁移建议
- 建议新增 `workbench_tools`、`workbench_tool_presets` 两张表;工具与预设使用稳定 ID、状态和排序字段,工具删除采用软删除或下线。预设可支持版本表,首版如要缩小范围可采用更新时新增版本记录、始终只有一个 active 版本。
- 若说明与示例内容较小且必须随工具原子发布,可放工具 JSON 文档字段;资源本身仍只保存资源 ID。不要把图片二进制或短期 CDN 签名地址写入数据库。
- 任务创建时在受控任务元数据中记录工具 ID、工具名称/版本、预设 ID/版本、工作台类型和展示所需配置快照,保证工具下线、重命名后历史详情仍可解释。快照不能覆盖 `Task.InputJSON` 中现有凭证保护/敏感信息规则。
- 数据表变更需更新 `docs/content/docs/backend/backend-database.mdx`。API 变化同步 OpenAPI 与 HTTP API 专题文档。
## 9. 后台管理交互
工具列表优先,顶部提供“生图 / 视频”过滤、搜索、状态筛选和新建入口。行内展示图标、名称、分类、预设数量、状态、排序和更新时间;常用的预览/编辑/上下线操作直接可见,删除作为谨慎操作并在有引用时禁用或提示下线代替。
工具编辑采用全屏抽屉或较宽编辑台,分为:基础信息、图标/封面、能力需求与 UI 字段、使用说明/示例、预设提示词。右侧或预览模式展示用户端工具卡与说明区预览。预设编辑器提供模板文本、变量白名单、默认参数 JSON schema 表单化编辑、启用状态及版本说明。发布前校验名称、分类、图像资源、提示词长度、默认参数和说明内容;保存成功后用户端目录按版本更新。
“功能开放”增加两项开关,并明确影响:关闭后隐藏入口并禁止新工作台任务;已有任务记录保留。工具本身的上线状态与全局功能开放是两层状态,用户端有效状态为两者皆开放。
## 10. 一次性交付范围
本功能按完整闭环一次性交付,不拆成先做生图、后补视频或先上工具目录、后补后台的阶段。交付范围同时包含用户端两个工作台、后台工具管理、功能开放控制、后端目录/任务接口、数据迁移、权限审计、文档和验收。
上线前必须同时具备可配置的生图与视频工具、预设、说明和示例素材;两个用户入口及对应服务端开关;模型能力驱动的参数表单;资源上传;异步任务恢复;任务取消/重试;结果预览;右侧运行中任务与历史;详情中的提示词、配置、耗时和实际积分;完整管理端编辑/预览/上下线能力。若任何一个闭环部分未完成,不视为该功能已交付。
建议以一个完整功能分支和统一发布窗口落地;数据迁移保持向前兼容,首次发布默认关闭两个新入口,完成线上工具配置和冒烟后由管理员开启。可以在开发过程中按模块并行实现,但这只是工程组织方式,不改变“一次完整交付”的产品验收边界。
## 11. UI 交互与视觉设计
### 工具选择弹窗(参考图 1)
- 当前工具以一行紧凑的图标/缩略图、名称、副说明和下拉箭头呈现;右侧“新建”是清晰命令按钮。点击整行或箭头打开工具选择弹窗,弹窗从当前工作台上下文打开并保留滚动位置。
- 弹窗顶部使用“你想创作什么?”作为标题,旁边一行短说明;右侧提供“清除选择”。下方是“推荐 / 人物 / 商品 / 场景 / 增强”等后台可配置分类标签,分类行末尾放搜索输入框。小屏时搜索移到分类下方,不能挤压标签。
- 工具以两列图文卡片展示,每张卡片固定最小高度并采用左侧方形缩略图、右侧名称和最多两行简介。选中卡片使用清晰的深色边缘与右上角勾选标记,不选中仅用柔和表面差异和轻微悬停抬升表达;状态不能只靠颜色区分。
- 点卡片立即选中并关闭弹窗,切换工具前若提示词或参考素材有未提交修改,不清空内容:同类别工具保留输入草稿;不兼容字段保留在草稿中但暂不提交,回切工具时恢复。只有用户明确选择“新建/清空”才重置。
- 弹窗支持搜索工具名、简介和分类;搜索与分类可组合。点击清除选择后回到工具未选状态,但不清除生成草稿。Escape 关闭且焦点返回触发按钮;方向键和 Tab 可遍历卡片,Enter/Space 选择。弹窗内滚动,不滚动背景页面。
- “更多技能持续上线中”作为可选的目录尾部说明,不伪装成禁用工具卡;后台没有配置更多项时不显示。
### 生成输入页(参考图 2)
- 顶部保留工具摘要与“新建”命令。生图页面中央以宽阔、低干扰的提示词编辑区为主,而不是把输入项切成许多小卡片:左上显示已添加参考图数量与上限,右上放上传/排列视图/展开等图标按钮;中间提供上传占位缩略图和提示词编辑区;底部显示字符数与语音输入入口(若当前产品语音能力可复用)。
- 参考素材槽采用轻量缩略图,未上传时展示线稿占位与“添加图片/视频/音频”入口;上传后可排序、替换、删除和放大预览。每个素材显式显示上传状态、类型和失败重试,不以头像或素材缩略图暗示上传成功。
- 提示词区域内提供预设入口,选择预设后把文本插入光标处或替换空草稿;若草稿已有内容,弹出轻量选项“替换 / 追加 / 返回”,不直接覆盖。模板变量由用户填写或保留可读占位符,未完成必填变量时生成按钮禁用并定位到变量。
- 提示词下方把“模型”和“生成设置”做成并排的紧凑摘要选择器。点击模型项打开模型选择层,搜索、来源/能力标签与不可用原因可查;点击生成设置打开按当前模型能力生成的参数面板。图片示例中的“自适应 · 1K 高 · PNG”是设置摘要,不应在不同模型下固定显示这些选项。
- 视频沿用同一输入骨架,但根据能力将素材槽扩展为首帧、尾帧、角色/场景参考、视频参考和音频参考,并把时长、画幅、分辨率、音频等配置放在生成设置层。首尾帧与普通参考媒体使用不同槽位和类型标记。
- 底部主按钮横向填满输入列,按钮主文案明确媒体类型(“立即生成图片”/“立即生成视频”),旁边显示“预估 X 积分”或“预计 -- 积分”。正在上传、必填校验失败、模型不可用、配额不足时明确说明阻塞原因;提交后按钮显示排队/生成状态,但允许用户继续编辑下一条草稿(除非当前模型/流程限制同一输入)。
- 长提示词时输入区自然扩展或内部滚动,底部模型/设置选择器和生成按钮保持可见;键盘快捷提交需避开 IME composition,Enter 不应意外发送多行提示词。
### 视觉语言与 Aceternity 使用
- 以参考截图的浅色中性表面和柔和边界为基准,减少连续硬描边:大区块通过相邻表面、留白、浅层阴影和标题层级区分;仅选中、键盘焦点、分隔和危险状态使用更明确的边界。避免每个字段都包装成卡片,也避免卡片套卡片。
- 保持三栏工作台本身克制、适合长时间创作;颜色来自现有语义 token,不大面积铺单一紫蓝渐变或装饰光斑。工具封面、生成结果和真实示例承担主要视觉色彩。
- 可复用 Aceternity `SpotlightSurface` 作为工具选择卡片/结果区域的轻量悬停光照,使用低对比 spotlight 并尊重减少动态偏好;`HoverBorderGradient` 仅用于主要生成按钮或确有焦点引导价值的单一主操作,不用于所有卡片边框;`CometCard` 可用于工具封面卡的轻微悬停视差,但只在指针设备开启,触屏和减少动态时静态呈现。生成中骨架的流动高光优先采用本地 CSS 动画和语义状态,不为此叠加重型背景组件。
- 不在工作区主背景使用 `BackgroundBeams`、Meteors 或无语义粒子;生成面板不能因装饰动效影响媒体可辨识度、对比度、可读性和性能。所有动效支持 `prefers-reduced-motion`,键盘焦点始终清晰。
- Aceternity 组件以现有仓库组件实现为准,先核对组件包体积、SSR/懒加载和 reduced-motion 行为;缺少必要行为时优先扩展已有包装,不为视觉效果新增重复动画库。
## 12. 验收标准
- 两个开放开关分别控制各自导航、用户目录和后端新建任务;关闭其中一项不影响另一项,也不影响画布、短剧或 Agent 的既有生成。
- 管理员可创建、修改、排序、发布和下线两类工具及预设;未启用内容对普通用户不可见,历史快照仍可读。
- 工具卡片包含名称、说明、图标/封面、分类、搜索和明确选中状态;键盘操作可完成搜索、选择和关闭弹窗。
- 图片与视频参数根据真实模型能力展示;服务端拒绝不匹配参数、越权资源和已下线工具请求。
- 任务创建后中间区立即呈现占位,右栏任务可持续更新;刷新后仍能看到运行任务。任务结束后可展示媒体、状态和真实账单;所有失败路径有可恢复反馈。
- 任务详情展示服务端记录的提示词、参数、工具/预设版本、模型、耗时和积分;媒体访问始终经过资源授权机制。
- 不把密钥、Cookie、inline media data、内部上游地址或短期签名地址写入工具目录、任务快照、URL 或日志。
- 三栏在宽屏无重叠;中等宽度和移动端退化为有序单列/标签切换,无页面级横向溢出;减少动态效果时骨架动画关闭或静态化。
## 13. 待决策项
1. 新增功能开关的默认值是否初始关闭,建议默认关闭,待首批工具和权限路径完整后由管理员开放。
2. 模型来源范围:首版只允许后台配置的系统/逻辑模型,还是也允许用户自己的模型配置。当前任务链路已能承接多种模型来源,但开放范围会影响报价、配置校验、用户体验和支持成本。
3. 用户提交提示词是否允许为空(例如纯参考图编辑),按具体模型能力决定,建议由 operation/profile 声明而不是工作台写死。
4. 预设提示词是否需要版本历史与灰度发布;建议保留版本号/历史快照,首版可不做复杂灰度。
5. 右侧历史是否只筛选“工作台任务”,以及 `/tasks` 是否仍作为全局任务历史。建议两者并存,工作台只展示由工作台创建的任务。
6. 用户提供参考图展示了 6 个工具卡和“更多技能持续上线中”,实际首发的工具目录、图标与示例媒体需产品侧提供或由运营配置。
## 14. 参考与代码依据
- 外部参考:https://maolong.da-ai.cc/toolbox/image-generation、https://maolong.da-ai.cc/toolbox/video-generation。当前抓取只确认独立图片/视频入口,主体 UI 未能读取。
- 用户提供的工具选择截图:工具选择弹窗、分类/搜索、图文卡片与选中反馈作为直接视觉参考。
- 路由与导航:`web/src/router.tsx`、`web/src/components/layout/workspace-sidebar-nav.tsx`、`web/src/stores/use-user-store.ts`。
- 功能开放:`backend/internal/platform/feature_availability.go`、`backend/internal/handler/feature_availability.go`、`web/src/pages/admin/components/feature-availability-panel.tsx`。
- 生成与任务:`web/src/services/api/generation-task.ts`、`web/src/services/api/task-center.ts`、`backend/internal/handler/routes.go`、`backend/internal/app/task_creation.go`、`backend/internal/model/models_task.go`。
- 管理端参考:`web/src/pages/admin/storyboard-prompts/storyboard-prompts-page.tsx` 及现有资源上传/访问服务。