- 2026-09-10 (P6) — chathome mock 占位清理 + 媒体资产 v5 文档补写:
Phase A — chathome mock 占位清理:
-
A1 PromptEditor voice 按钮接
useEndpointProbe('/api/stt/transcribe'):ready 后自动 enabled,未 ready 显示「后端 STT 联调后自动启用」徽标 +data-probe-state属性;真实 STT 联调由handleVoiceClick接入(本期 console.info 占位) -
A2 PromptToolbar auto toggle 接
useEndpointProbe('/api/chat/auto-pick'):ready 后 toggle 启用,未 ready 显示「即将上线」badge;新增autoEnabledstate +handleAutoToggleChangecallback;tooltip 切换readyHint/pendingHint文案 -
A3 ChatSidebar hover 3-dot menu: 鼠标 hover 单个 session 项浮出「···」按钮;点击展开 rename / delete menu(
onRename调window.prompt+sessionApi.renameSession,onDelete调window.confirm+sessionApi.deleteSession+router.replace('/home/chat'));ChatSessionWorkspace 透传 2 个新 props -
A4 ChatHomeWorkspace
PLACEHOLDERS+SUBMIT_LABELS字面量 i18n 化(messages/chat-session.jsontoolbar.greeting.zh/en+ hook order 调整) -
A5 ChatSidebar 5 个
LOCALE_FALLBACK_*常量全部 i18n 化(session.sidebar.{defaultGroup,recentTitle,empty,hoverRename,hoverDelete,hoverMore,sessionActions}= 7 keys) -
A6 ChatTopBar 头像 dropdown 验证 4 个 action(profile / settings / logout)全部接真实跳转,logout 走
/auth/logout(本期 window.location.href 不影响 typecheck) -
2026-09-10 (P8) — chat home 真实用户测试报告 v2 (TEST-REPORT.md) 缺陷修复:
- P8-1 textarea placeholder/rows 7 mode 不切换: 修复 v1 修复未生效的根因 — ChatHomeWorkspace / ChatSessionWorkspace 把固定 placeholder 通过 props 传给 PromptEditor,父级 placeholder 非空导致内部
placeholder || modePlaceholder选父级、屏蔽 modePlaceholder。新实现:两个 workspace 不再传 placeholder 给 PromptEditor,由 PromptEditor 内部按 mode 读取toolbar.placeholder.{mode}(即梦 jimeng-web 对齐文案:动作模仿「上传图片后,选择模板即可生成」、数字人「请输入你希望角色说出的内容」、音乐生成「Las Vegas、美式复古爵士…」) - P8-2 /zh/assets 路由 404: 新增
app/[locale]/assets/page.tsx做 server-side redirect →/workspace/asset-hub(next-intl middleware 自动注入 locale prefix)。解决从 chat 引用面板点”去资产中心创建”链接全断的问题 - P8-3 admin/ai-models/providers/capability-models 数据缺失 / 路由 404: 新增
app/[locale]/admin/capability-models/page.tsx复用AdminModelsPageClient(同一张 GlobalModel 表,按 mediaType 维度过滤)。AdminModelsPageClient 内部providerPayload.items.length直接来自prisma.aiProvider.findMany/prisma.globalModel.findMany,dev DB 已有 22 个 provider + 29 个 global_model + 34 个 model_revision,登录态 admin 页面应有数据 - P8-4 数字人/动作模仿/音频 mode-aware 上传(多块 / 语义):
ImageUploadStack重构成支持多 slot (UploadSlot[]):- 数字人 mode:2 块(角色图 image/* + 音色 audio/*)
- 动作模仿 mode:2 块(角色图 image/* + 动作模板 video/,image/)
- 音频 mode:1 块(音色 audio/*,语义不是”上传图片”)
- 其他 mode:1 块通用参考图(向后兼容)
- 单 slot mode 走
images / onImagesChangeprops(向后兼容),多 slot mode 走uploadSlotsprops(每 slot 独立 accept / value / onChange / labelKey) - 新增
chat-upload-slots.ts暴露buildUploadSlotsForMode(mode, slotState, handlers)helper,ChatHomeWorkspace + ChatSessionWorkspace 各自挂 5 个 useState 管理 character/voice/motionTemplate/voiceReference/images
- P8-5 PromptEditor.placeholder 改可选: 不传 placeholder 时 PromptEditor 内部按 mode 读取;保留
placeholderprop 作为外部覆盖通道(向后兼容) - 测试同步:
chat-home.test.tsx (d-1)新增断言「默认 mode=‘general’ 时 textarea placeholder 是『输入创意灵感,Dramagon 帮你落地成片…』、rows=3」;typecheck 0 errors,chat-session 关键 tests 120/120 PASS - 遗留未修(后续 commit 处理): 数字人 mode 加”快速模式”chip(P1 即梦对齐 chip 差异);send 按钮 fillPrompt 后 disabled 状态(疑似 onChange 异步问题);console IntlError 26 个 FORMATTING_ERROR(i18n key 缺)
- P8-1 textarea placeholder/rows 7 mode 不切换: 修复 v1 修复未生效的根因 — ChatHomeWorkspace / ChatSessionWorkspace 把固定 placeholder 通过 props 传给 PromptEditor,父级 placeholder 非空导致内部
-
2026-09-10 (P7) — chat home 真实用户测试报告 (TEST-REPORT.md) 缺陷修复 8 项:
- P0-1 SSE 401 鉴权(致命): EventSource 不允许设自定义 header,导致 100% 任务失败。修复:
src/lib/api-auth.ts导出getSupabaseAuthSessionFromHeaders(headers),SSE handler 接受?access_token=query 并注入x-query-access-tokenheader 兜底;客户端useChatSession通过getCachedAccessToken()拿到 supabase access_token 拼到 query。仅 SSE handler 接受该 query,其他接口不影响 - P0-2 chat 控件 7 mode 差异化: PromptEditor 读取
messages/{zh,en}/chat-session.jsontoolbar.placeholder.{mode}和toolbar.rows.{mode}—— 切到音乐/数字人/动作模仿等 mode 时,placeholder 文案 + textarea rows 全部按即梦 jimeng-web 对齐 (音乐=1 行「Las Vegas…」, 数字人=4 行「请输入你希望角色说出的内容」, 动作模仿=3 行「上传图片后,选择模板即可生成」) - P0-3 i18n key 泄露:
ChatStream.tsx的useTranslations('chatSession')错配为useTranslations('chatSession.toolbar'),导致greetingFallback/greetingTemplate解析失败,屏幕直接渲染chatSession.toolbar.greetingTemplate字符串 - P1-1 图片拖拽上传 / 多图堆叠控件: 新增
ImageUploadStack组件(src/app/[locale]/home/chat/_components/ImageUploadStack.tsx),挂在 PromptEditor textarea 上方。CSS 含多图堆叠 + dragover 边框变色 + hover 扑克牌展开 (nth-child 不同 rotation)。仅 mode ∈ {image, video, audio, digital-human, motion-copy} 时显示。即梦对应 mode 都有 - P1-2 技能下拉 6 项:
creative-skills.ts从 3 项扩到 6 项 (poster / storyboard / character / digital-human / motion-copy / background-music),与即梦 jimeng-web 官方 6 项对齐 - P2-1 5 维参数 metadata 按 mode schema 裁剪:
ParamsPanel.tsx新增sanitizeMetadataForMode(mode, raw)—— music 不带 aspect/count/resolution,digital-human 不带 resolution 等;decodeAndSanitizeFromQuery也在 decode 后立即 sanitize;ChatSessionWorkspace 在handleSubmitPrompt/handleNextStepAction('regenerate')/handleRegenerate三处统一调用 - 测试同步:
tests/unit/chat-session/chat-home.test.tsxskill card 数量从 3 改为 6,新增 ‘数字人 / 动作模仿 / 背景音乐’ 3 个 zh 标题断言;typecheck 0 errors
- P0-1 SSE 401 鉴权(致命): EventSource 不允许设自定义 header,导致 100% 任务失败。修复:
Phase B — 媒体资产 v5 文档补写 (media-asset-and-workshop.md §7 待闭环):
- B1
content/{zh,en}/assets/index.mdxv5 文档重写:单页双栏 + 4 kind chip + 主体 sub-chip + TimelineGroup + scope 段 + 文件目录树;zh 4543 chars,en 7966 chars - B2
content/{zh,en}/assets/asset-detail.mdx新建:左 60% 主预览 + 右 40% 元数据 + 历史版本时间线 + API 4 表 union + 字段展平(previewUrl/mimeType/width/height/durationMs/fileName) - B3
content/{zh,en}/assets/_meta.ts加asset-detail导航项 +index改名为「媒体资产中心」/「Media asset hub」 - B4 同步本地 docs test 契约:
## Before you begin(en)/## 操作步骤(zh) +## Steps章节,内部链接./canvas/asset-folders等对齐 nextra 路由
Phase C — 测试 + commit:
- C1 新增 endpoint probe 测试(
useEndpointProbehook 返回{ ready, loading, error }形状) - C2 ChatSidebar hover 3-dot menu 测试(
onRename/onDeleteprops 契约) - C3 typecheck 0 errors,chat-session 关键 tests 24/24 PASS,docs tests 11/11 PASS
- 2026-09-10 (P5) — chat-session mode-specific placeholder 控件(digital-human / motion-copy / music 上传与风格选择):
- P5-1 新建 GlassUploadPlaceholder primitive (
src/components/ui/primitives/GlassUploadPlaceholder.tsx): 轻量级 upload placeholder 组件,与 GlassAspectRatioGrid / GlassCountPicker 平级;字段标题 + 「即将上线」徽标 + dashed-border upload 区 + 接受 mime 类型 + lucide-style SVG icon;当前 disabled + console.info 留痕,真实上传联调等对应后端 worker 接入后由父级 onSelect 回调接入 - P5-2 ParamsPanel 按 mode 渲染不同 placeholder section:
- digital-human: 「数字人 · 上传参考」section,角色图片上传(accept=image/) + 音色文件上传(accept=audio/)
- motion-copy: 「动作模仿 · 上传参考」section,角色图片上传 + 动作模板选择
- music: 「音乐生成 · 风格」section,7 个音乐风格 chip placeholder(流行 / 电子 / 民谣 / 摇滚 / 古风 / 爵士 / R&B)
- P5-3 i18n
messages/{zh,en}/chat-session.json:params.digital-human.{title,characterLabel,characterDesc,voiceLabel,voiceDesc,speechLabel,speechDesc}+params.motion-copy.{title,characterLabel,characterDesc,templateLabel,templateDesc}+params.music.{title,styleLabel,styleDesc} - 测试: 扩展
tests/unit/chat-session/chat-p3-visual.test.tsx到 16/16 PASS — digital-human / motion-copy / music 三 mode placeholder section 渲染验证 + image mode 不渲染 placeholder + GlassUploadPlaceholder disabled + accept 透传;typecheck 0 errors
- P5-1 新建 GlassUploadPlaceholder primitive (
- 2026-09-10 (P4) — chat-session 编排 7 mode(用户反馈:目前项目这几个基础类型最小也需要支持,即梦 7 mode 对齐):
- P4-1 ChatMode 枚举扩展: 从 3 个 (general/storyboard/character) 扩展到 9 个 (+ image / video / music / audio / digital-human / motion-copy);DB 列写入留待 schema 变更,本期仅作为前端 chip + API 入参透传
- P4-2 chat-models.ts 加 6 张新 catalog — IMAGE_MODELS (3 个) / VIDEO_MODELS (3 个) / MUSIC_MODELS (2 个) / AUDIO_MODELS (2 个) / DIGITAL_HUMAN_MODELS (2 个) / MOTION_COPY_MODELS (2 个): 占位 model key(后续后端 worker 接入后逐步替换);每个 entry 含 name / nameEn / provider / desc / descEn / badge / multiplier / iconPath
- P4-3 PromptToolbar dropdown 改为 7 项(综合创作 / 图片生成 / 视频生成 / 音乐生成 / 音频生成 / 数字人 / 动作模仿): 仿即梦 dropdown 原版结构,每项带专属 lucide iconPath;i18n 走
toolbar.mode.\{general,image,video,music,audio,digital-human,motion-copy\} - P4-4 ParamsPanel 按 mode 动态显示控件 —
getModeControlVisibility(mode): 即梦对应 mode 有不同参数面板,PROTOTYPE-PERSPECTIVE.md §5 决策表:- image: aspect + resolution + count + dimension (无 duration)
- video / storyboard / character: + duration
- music / audio: 仅 model + duration (无 aspect / resolution / count / dimension)
- digital-human: model + aspect + count + duration
- motion-copy: model + aspect + count (无 duration / resolution / dimension)
- general: aspect + resolution + count + dimension (无 duration)
- P4-5 i18n:
messages/{zh,en}/chat-session.json加 6 个新 mode key(zh:图片生成/视频生成/音乐生成/音频生成/数字人/动作模仿;en:Image/Video/Music/Audio/Digital human/Motion copy),session.mode.*和toolbar.mode.*都更新;params.\{image,video,music,audio,digital-human,motion-copy\}.title占位 - P4-6 ChatSessionWorkspace mode init 接受 9 个值: URL
?mode=非法值 fallback 到 ‘general’ - 测试: 扩展
tests/unit/chat-session/chat-p3-visual.test.tsx到 10/10 PASS —getModeControlVisibility9 mode 单元覆盖 +modelsForMode9 catalog 检查 +findModelByKey跨 9 catalog 查找;typecheck 0 errors,chat-session 关键 tests 31/31 PASS
- 2026-09-10 — chat-session 中间区”很多框”清理(用户反馈:和即梦 web 差太多):
- P3-1 ChatRecord 去外框: 取消
.chatRecord的 background / border / 大 padding(改为 4px 0);用户消息靠border-left: 2px solid var(--dramagon-primary)+padding-left: 14px轻量区分流;AI 消息完全无外框,纯流式布局。同时移除 header 顶部的双 actions(重新编辑 / 再次生成 / ···),只保留 role + 时间 + running 状态;footer 的 actions 仍然保留(用户主要的操作入口)。仿即梦 chat 流”消息直接展示,无外框”的设计语汇 - P3-2 NextStepPlaceholder loading/error 不渲染骨架卡: 移除 v1 静态 3 张占位卡(每张只有”·“占位文本),loading/error 状态直接返回 null;只有 success(API 返回真实建议)才渲染,避免”假的”下一步建议框占用中间区
- P3-3 ParamsPanel collapsed 整个不渲染: collapsed=true 时直接返回 null(原来还渲染
<section>+ “参数设置” header + “展开”按钮),由 ChatSessionWorkspace 自行决定何时展开;避免”参数设置”显眼 header 占用主区 - 附带: 修复 pre-existing typecheck 错误(
PromptEditorPropsinterface 缺autoAspect / onAutoAspectChange / activeSkill / onRemoveActiveSkill4 字段 +tToolbaruseTranslations 缺失 + ChatSessionWorkspace 重复skills={CREATIVE_SKILLS}属性 + onAutoAspectChange 的 aspect 类型 cast) - 测试: 新增
tests/unit/chat-session/chat-p3-visual.test.tsx(4/4 PASS)— 用 renderToStaticMarkup 静态契约验证:NextStepPlaceholder loading→空、ParamsPanel collapsed=true→空、ParamsPanel collapsed=false→完整 5 维控件渲染。typecheck 0 errors,chat-session 关键 tests 21/21 PASS - 设计意图: 仿即梦 jimeng.jianying.com/ai-tool/home 中央 chat 编辑器语汇——消息直接展示(无外框),操作紧贴内容底部,无”参数设置”显眼的 section header,无 loading 状态的”假”占位卡
- P3-1 ChatRecord 去外框: 取消
title: AIGC 中央 chat 工作台 description: AIGC 中央 chat 工作台 —— Hero chat 编辑器 + 4 chip 工具栏 + 会话历史侧栏 + 资产库面板,对话式生产创作入口。
AIGC 中央 chat 工作台
配图占位
- 页面:chat 工作台(空态 / 渲染态 / 流式响应态)
- 状态:4 列布局、Topbar breadcrumb、ChatSidebar 会话列表、Hero + ChatRecord 消息卡片、底部编辑器、右侧资产库
- 重点区域:56px Topbar / 239px 会话列表 / 1100px 居中编辑器 / 4 chip 工具栏 / 36×36 提交按钮 / 320px 资产库(折叠 52px)
- 脱敏要求:隐藏用户名、会话标题正文、消息原文、模型名称、附件 URL 和任务 ID
用途
AIGC 中央 chat 工作台是登录后的对话式创作入口,承担三类任务:
- 发起新对话 —— 在 Hero 区输入创意 prompt,自动创建空 session 后立即跳转;4 个 toolbar chip 辅助选择创作模式。
- 回看与继续 —— 左侧会话列表按
updatedAt desc展示最近 20 条会话;点选后跳转到对应/home/chat/[sessionId]渲染消息流。 - 状态追踪 —— assistant 消息按
pending / running / completed / failed四态渲染;运行中状态每 3 秒轮询最新进度。
页面布局遵循玻璃拟态(Glassmorphism)暗色主题,对齐 .design/dramagon-redesign/pages/chat-home.html 与 chat-session.html 两份设计稿。
使用前准备
- 必须登录:未登录访问
/home/chat或/home/chat/[sessionId]都会被中间件重定向到/auth/login。 - 账号已配置默认生成模型:未配置时「+ 新对话」按钮可点击,但消息提交后 assistant 端会返回失败状态(pending → failed);需要先去设置中心配置默认模型。
- 浏览器支持 ES2022:chat 路由使用
dynamic = 'force-dynamic',需要浏览器能解析顶层 await 与可选链。 - 可选 projectId:如果当前对话要绑定到具体项目,从项目页进入 chat;通用 chat 不依赖 project,可直接通过
/home/chat进入。
操作步骤
页面分区(4 列布局)
页面从上到下、从左到右分为 4 个区。
顶部 56px Topbar(<ChatTopBar />)
与首页 / AI 工作流 / 画布一致:左侧 logo + brand,中部 breadcrumb(生成 › 新对话 或 session 标题),右侧 〔+ 新对话〕按钮 + 🔍(跳转 /skills 技能市场搜索)+ 🔔⁽³⁾(点击跳转 /notifications 消息中心,显示未读数)+ 头像菜单(点击展开 dropdown:顶部用户名 / 「个人主页」跳转 /profile / 「设置」跳转 /settings / 「退出」跳转 /auth/logout)。
左侧 239px 会话列表(<ChatSidebar />)
- 默认创作(折叠分组)+ 最近会话列表(按
updatedAt desc,最多 20 条,来自useChatSessions()) - 底部固定〔+ 新对话〕按钮:点击后 POST
/api/chat/sessions创建空 session,再router.replace跳转到/home/chat/[newSessionId] - 单条会话 hover 显示「···」菜单,弹出「重命名 / 删除」操作
- 列表右侧显示
messageCount气泡(来自冗余计数字段)
中央主区(<ChatStream /> + <ChatRecord /> + <PromptEditor />)
主区按当前状态切换三种视图:
- 空态(首次进入
/home/chat):Hero 区显示「你好,用户名,想创作什么?」 + 3 张技能推荐卡(短剧海报 / 创作分镜 / 角色视频)+ 底部编辑器 - 渲染态(
/home/chat/[sessionId]):顶部 session toolbar(重命名 / 新对话 / ··· + breadcrumb)+ ChatStream 消息流 + 底部编辑器 - 流式响应态:任意 assistant 消息处于
pending或running时,ChatRecord 显示「任务响应中…」+ 闪烁 cursor;useChatSession 每 3s 重新拉取 session
右侧 320px 资产库(<AssetPanel />)
- 折叠态 52px(默认):竖排 toggle「资产库」按钮
- 展开态 320px:主体空态 + 创建主体 CTA
底部编辑器(<PromptEditor />)
1100px 居中卡片,包含:
- textarea:3 行高度,受控输入;按
Cmd/Ctrl + Enter也可触发提交 - 4 chip 工具栏(
PromptToolbar):- 综合创作 ▾:真实 dropdown,3-mode 切换(综合创作 / 分镜视频 / 角色视频),选中项打 check mark
- 自动:真实偏好浮层,含 GlassAspectRatioGrid 9-比例选择 + auto toggle(toggle disabled + 「即将上线」徽标,因为后端 auto-pick LLM 尚未接入)。点击比例后立即写入 params.aspect,下次提交优先使用
- 技能:真实 popover,列出 3 个官方创作入口(短剧海报 / 创作分镜 / 角色视频)+ 「管理我的技能」跳转
/skills;选中后切 mode 并把 prefill 追加到 textarea - @ 引用:真实 popover,打开时拉取
/api/asset-hub/subjects真实主体列表(loading / success / empty / error 4 态)。选中具体主体后写入 snippet(如「@主体: 林深」);底部「去资产中心创建」按钮跳转/workspace/asset-hub。如果 API 失败或为空,按钮重试或引导用户去资产中心创建
- 36×36 提交按钮(红橙渐变
var(--dramagon-submit-grad)):点击触发useChatSession().sendMessage()
核心流程
- 用户访问
/home/chat→ ChatHomeWorkspace 自动 POST/api/chat/sessions(body 空)→ 拿到session.id→router.replace('/home/chat/[id]') - 进入
/home/chat/[sessionId]→ ChatSessionWorkspace 调用useChatSession(sessionId)拉取 session + messages → 渲染 ChatStream - 在底部编辑器输入创意 → 点击提交按钮 →
useChatSession.sendMessage({ role: 'user', content })走POST /api/chat/sessions/[id]/messages→ user 消息直接completed,同时创建 assistant 消息(默认pending) - useChatSession 检测到
pending/running状态 → 启动 3s polling → worker 端持续 PATCH/api/chat/sessions/[id]/messages更新状态为completed或failed - 用户在 ChatStream 中看到完整消息(含 4 attachment grid + 模型 / 比例 / 分辨率 / 数量 / 时长 / 技能 meta)
- 用户点击「再次生成」(ChatRecord.MetaRow 内的 regenerate 按钮,已接 sendMessage role=‘assistant’ + regeneratedFromMessageId)或「重新编辑」(ChatRecord 同位置的 reedit 按钮,已接拷 message.content 到 textarea)。chat-session sub-toolbar 的「重命名」按钮接 inline edit:breadcrumb 替换为 input,Enter 提交 / Escape 取消,调用
useChatSession.renameSession(title) - 用户在 ChatSidebar hover 显示「···」→ 点击删除 → 乐观更新 +
DELETE /api/chat/sessions/[id],Prisma 级联删除 messages。chat-session sub-toolbar 的「更多」按钮接 dropdown:含「重命名」「复制会话 ID」「删除」三个 menu item;「删除」触发 window.confirm + deleteSession + router.replace(‘/home/chat’)
结果与状态
- 空态视图:Hero + 3 张技能卡 + 底部编辑器,提示用户输入 prompt
- 渲染态视图:顶部 toolbar + ChatStream(按时间顺序展示 user / assistant 消息)+ 底部编辑器
- 消息 4 状态:
pending(等待中)/running(任务响应中)/completed(已完成)/failed(失败 + errorMessage) - Markdown 渲染:
react-markdown + remark-gfm白名单(p / ol / li / strong / code / h3),防 XSS - 4 attachment grid:自动识别
kind === 'image'渲染<img>,kind === 'video'渲染<video> - 模型 / 比例 / 分辨率 / 数量 / 时长 / 技能 meta:ChatRecord.MetaRow 读取 message.metadata 后展示;model 通过
chat-models.ts单源解析成展示名(如seeddream-5.0-pro→ 「图片 5.0 Pro」),skill 通过creative-skills.ts单源解析成中文标题。比例与数量由 PromptToolbar 自动 popover 写入;技能由技能 popover 写入;参考资产由@ 引用popover 写入(待 params.assetIds 接入后透传) - NextStep 3 张占位卡:标题分别「继续生成同主题 / 调整参数再试 / 导出当前对话」,全部带「推荐 by AI — 即将上线」徽标;LLM 建议接口尚未实现
- 3s polling 间隔:检测到 assistant
pending/running状态时启动;状态转为终态后自动停止
权限和边界
- 必须登录:所有
/api/chat/sessions*路由通过requireUserAuth()校验,未登录返回 401 - 会话隔离:每个用户只能看到自己的 sessions(service 内部
userId校验,跨用户访问返回 403) - 项目可选:
session.projectId可空;通用 chat 不依赖项目上下文,项目级 chat 通过 projectId 关联 - 删除级联:删除 session 时依赖 Prisma
onDelete: Cascade,自动删除所有关联 messages - 流式响应:本期简化为 polling(3s 间隔查 status),真实 SSE 待
task.runId → chat.messageId映射落地后切换 - title 长度:
session.title限制 1-100 字符(trim 后),由parseCreateBody/parseRenameBody校验 - message role 白名单:
user / assistant / system;user消息直接completed,assistant默认pending - message status 白名单:
pending / running / completed / failed,PATCH 时显式覆盖 - session 默认 title:
"新对话",worker 完成后可 PATCH 重命名 - 缺失功能(TODO):NextStep 真实 LLM 建议接口;4 chip 中「自动 / 技能 / @ 引用」点击行为;「再次生成」按钮触发 PATCH messages;「重新编辑」按钮触发 PATCH session 标题
常见问题
为什么进入 /home/chat 会自动跳转到带 sessionId 的 URL?
chat 是有状态工作流,所有消息必须挂在某个 session 下;自动创建空 session 让用户立即开始对话,避免先看到空白页再点按钮。
为什么 NextStep 区域显示「即将上线」?
NextStepChips 真实 LLM 建议生成接口尚未实现,本期为静态占位(详见 .learnings/FEATURE_REQUESTS.md 跟踪条目)。后续 FEAT-P1 落地后会自动接入。
为什么 chat 流式响应有 3 秒延迟?
本期简化为 polling(每 3s 重新拉取 session),未接 /api/sse task 流;切换到真实 SSE 后延迟可降到毫秒级。
toolbar 4 chip 中哪些已经接真实交互?
4 个 chip 全部接上真实交互:
综合创作 ▾:3-mode dropdown(综合创作 / 分镜视频 / 角色视频)自动:偏好浮层含 GlassAspectRatioGrid 9-比例选择(auto toggle 后端未接,保持 disabled)技能:3 个官方创作入口 popover + 「管理我的技能」跳转/skills@ 引用:fetch/api/asset-hub/subjects真实主体列表(4 态 loading / success / empty / error),选中写 snippet;底部按钮跳转资产中心
技能选中的 prefill 会塞进 textarea 但不会自动提交——用户 review 后再点发送。
为什么 assistant 消息有时直接显示「失败」?
常见原因:账号未配置默认生成模型;worker 端网络异常;模型侧限流。当前失败状态会带上 errorCode 与 errorMessage 字段,可在 ChatRecord 错误卡片中查看。
中英文切换后 chat 历史标题没变?
session.title 是单语字段(Prisma String);多语言标题待后续加 session.title_zh / title_en 字段后支持。
为什么删除会话后侧栏列表不立即更新?
删除走乐观更新 + 后端 DELETE;如果网络失败会回滚(侧栏列表恢复显示被删项);通常情况下 200ms 内可见列表更新。
相关文档
- 页面路由:
src/app/[locale]/home/chat/page.tsx+src/app/[locale]/home/chat/[sessionId]/page.tsx - 工作区组件:
src/app/[locale]/home/chat/_components/ChatHomeWorkspace.tsx+ChatSessionWorkspace.tsx - 子组件:
ChatTopBar.tsx/ChatSidebar.tsx/ChatStream.tsx/ChatRecord.tsx/PromptEditor.tsx/AssetPanel.tsx/NextStepPlaceholder.tsx - 数据 hooks:
src/app/[locale]/home/chat/_hooks/useChatSession.ts+useChatSessions.ts - API 路由:
src/app/api/chat/sessions/route.ts+[sessionId]/route.ts+[sessionId]/messages/route.ts - Service:
src/lib/chat-session/service.ts(createChatSession / listChatSessions / getChatSession / renameChatSession / deleteChatSession / appendMessage / updateMessageStatus) - 类型:
src/lib/chat-session/types.ts - Prisma:
prisma/schema.prismaChatSession(line 2533) +ChatMessage(line 2559) - i18n:
messages/{zh,en}/chat-session.json(24 keys:session.{title|empty|newChat|rename|delete|deleteConfirm|more|copySessionId|assetPanel}/message.*/toolbar.*/params.*/nextStep.*) - 设计稿:
.design/dramagon-redesign/pages/chat-home.html+chat-session.html;SSOT:.design/dramagon-redesign/docs/reference/jimeng-web/DESIGNER-BRIEF.md§6 B-06 - 后端能力升级草案:
.learnings/FEATURE_REQUESTS.md(FEAT-P1 NextStep LLM 建议)
更新记录
- 2026-09-10 (P6) — chathome mock 占位清理 + 媒体资产 v5 文档补写(见上方)
- 2026-09-10 (P8) — chat home 真实用户测试报告 v2 (TEST-REPORT.md) 缺陷修复(见上方)
- 2026-09-10 (P7) — chat home 真实用户测试报告 (TEST-REPORT.md) 缺陷修复 8 项(见上方)
- 2026-09-10 (P5) — chat-session mode-specific placeholder 控件(见上方)
- 2026-09-10 (P4) — chat-session 编排 7 mode(见上方)
- 2026-09-10 — chat-session 中间区”很多框”清理(见上方)
- 2026-09-09 —— chat 工作台迭代:
-
抽取
@/lib/creative-skills.ts单源(chathome hero 卡片 / chat-session 技能 chip 共用) -
ChatRecord.MetaRow 解析 model key → 展示名(接
findModelByKey/resolveModelDisplayName) -
ChatRecord.MetaRow 解析 skill id → 标题(接
findCreativeSkill),新增message.skillMetai18n key -
PromptToolbar 接 3-mode dropdown / 技能 popover / @ 引用 popover(chip 已不再是静态占位)
-
P0-b:自动 popover 接 GlassAspectRatioGrid 9-比例选择(auto toggle 保留 disabled 占位);
@ 引用popover fetch/api/asset-hub/subjects真实主体列表 4 态(loading/success/empty/error);ChatSessionWorkspace 透传autoAspect+onAutoAspectChange给 PromptEditor -
P0-c:chat-session sub-toolbar 「重命名」按钮接 inline edit(breadcrumb 替换为 input,Enter 提交 / Escape 取消 / onBlur 提交,调
useChatSession.renameSession(title));「更多」按钮接 dropdown menu(重命名 / 复制会话 ID / 删除,删除走 window.confirm + deleteSession + router.replace);新增 i18n:session.more / session.copySessionId -
P0-d:ChatTopBar 「搜索」接 router.push(‘/skills’);「消息」接 router.push(‘/notifications’);头像接 click dropdown menu(用户名 / 个人主页 / 设置 / 退出,前三项 router.push 对应路径,退出走 /auth/logout)
-
P1-1:NextStepPlaceholder 卡片点击接
onNextStepAction:regenerate调useChatSession.sendMessage({ role: 'assistant', regeneratedFromMessageId });openParams展开 ParamsPanel;export把最后 20 条消息写到剪贴板 -
P1-2:左侧 ChatSidebar 每条会话显示三段:title + lastMessage 预览(11px 灰字,> 28 字截断) + messageCount badge(> 99 显示 99+,count=0 不显示)
-
P1-3:右侧 AssetPanel 默认折叠(保留 test 契约),但 fetch
/api/asset-hub/subjects成功且 items.length > 0 时自动展开;用户手动 toggle 后 userToggledRef 标 true,不再 auto-expand -
P1-4:chathome hero skill 卡片的「官方」红章文案走 i18n(
session.officialBadge),不再硬编码 zh/en -
P1-5:ChatSidebar 每条会话显示 messageCount pill(> 99 → 99+,count=0 不渲染),aria-label 跟随 locale(zh:「X 条消息」 / en:「X messages」)
-
P1-6:ChatTopBar 的 GlassSkillTag 状态从
used改为official,让 chathome hero skill 选中后顶部红章与 hero 卡的「官方」红章视觉呼应 -
P1-7:PromptEditor 在 textarea 上方新增红色 pill chip(「使用中技能: skill_title ×」),与顶部 ChatTopBar 红章呼应,点 × 清 params.skill(两端同步消失)
-
P2-2:PromptToolbar 内 2 处
window.location.href改为router.push(技能 popover「管理我的技能」→ /skills + 引用 popover「去资产中心创建」→ /workspace/asset-hub),避免整页 reload,改为 SPA 内导航 -
P2-3:chat-session sub-toolbar breadcrumb 旁新增灰色 meta
<span>显示「更新时间 · 用户轮数」(locale 格式化 + user messages 计数),data-testid=chat-session-toolbar-meta -
P2-4:chat-session sub-toolbar 新增 mode indicator pill(灰底边框小标签,显示当前 ChatMode 中文名:综合创作 / 分镜视频 / 角色视频)
-
P2-5:P2-4 的 mode pill 文案走 i18n(
session.mode.{general,storyboard,character}),不再硬编码 zh/en -
P2-6:右侧 AssetPanel 的 5 处文案(折叠 toggle 标题 / 空态主标题 / 空态描述 / 创建主体按钮 / 「全部」tab)全部走 i18n(
session.assetPanel.*),删除 5 个 LOCALE_FALLBACK_* 常量 -
P2-8:ChatStream 空态(无消息时)在 greeting + subtitle 下方增加 3 列 grid 渲染 skill 卡片(复用
heroSkillCard等现有 CSS class),用户进入 chat-session 但还没发消息时可直接选 skill 起手,点击触发 setMode + insert prefill(不自动发送,等用户 review) -
P2-9:PromptEditor activeSkill chip 的 hardcoded zh/en(「使用中技能」/「移除技能上下文」/「Active skill」/「Remove skill context」)改走 i18n(
toolbar.activeSkillLabel+toolbar.activeSkillRemove),删除 P1-7 残留的硬编码 -
P2-11:清扫残余 hardcoded zh/en:ChatSidebar messageCount badge 的 aria-label 走
session.messagesCount;ChatStream greeting fallback / template 走toolbar.greetingFallback+toolbar.greetingTemplate({name}占位符在 JS 端.replace替换),让屏幕阅读器在 zh/en 切换下读出对应单语文案
-
- 2026-09-08 —— chat 工作台首次落地(commit
bdfa47a6),包含 PrismaChatSession / ChatMessage模型、service 7 个方法、API 7 条路由、4 列布局工作台、底部编辑器、NextStep 占位、useChatSession 3s polling。