Commit Graph
7 Commits
Author SHA1 Message Date
seaislee1209andClaude Opus 4.8 be4bc1c8f4 feat(pipeline): 未生成的人物/场景卡可点进详情(先立绘后三视图)+ 卡内提示词框固定5行
- seed(未生成·来自脚本)卡:缩略图/名字可点 → 进资产详情弹窗(保留卡上内联「AI 生成」快捷,
  两条路都能生成,A 方案)。详情弹窗支持「还没生成组」的空壳实体(用脚本名+提示词兜底),
  生成立绘后刷新按同名 key 自动切回真实体。
- 顺序限制(本就在详情里,现对 seed 也生效):没立绘时「AI 生成三视图」禁用 + 提示
  「请先生成左侧立绘」;立绘按钮首次显示「生成立绘」(非「重跑」),替换走 seed 路由。
- 卡内提示词框(.prompt-box,外层人物/场景卡)固定 5 行高、超长框内滚动,不再被长提示词撑高。

自检:复用现成详情弹窗与 .btn/.prompt-box 共享类,无裸色值/无重写共享类;单橙锚点不变。
验证:tsc + vite build 绿;无头(独立 sqlite 栈)真点 seed 卡 → 详情打开、三视图禁用+提示、
立绘按钮「生成立绘」、提示词框 115px 固定且超长可滚动、0 控制台错误(截图存档)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 02:07:46 +08:00
seaislee1209andClaude Opus 4.8 e5b3833ba5 fix(pipeline): 基础资产页去掉重复「重新提取」按钮 + 留存的升二级(守单橙锚点)
- 删顶栏右上浮动「重新提取」(pipeline-reextract,JSX + CSS)—— 它与左侧「重新提取角色/场景」
  提取后同时出现、点的是同一动作(runExtract only),重复。
- 留左侧那个(上下文更贴、文案更清),并按 design.md §3 从三级 ghost 升二级(btn btn-sm,
  白底+inside-border)—— 比 ghost 显眼一档,又不抢橙(单橙锚点仍归 生成三视图/确认资产)。

自检:用共享 .btn 类、无裸色值/无新阴影/未重写共享类;tsc 绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 01:43:38 +08:00
seaislee1209andClaude Opus 4.8 a24dbb868a refactor(extract): 写死契约瘦身为纯结构,craft 全交给 skill(消除重复/漂移、不降质)
承上轮讨论(商业级质量考量):写死的 _EXTRACT_OUTPUT_CONTRACT 原先掺了 craft 规则
(穿搭/空手/字数/visual_prompt 写法),与 skill 正文重复 → 有漂移、稀释质量之虞。
现只留「格式骨架」(JSON 形状 / character|scene 两类 / 不提商品 / id 规则 / segments
覆盖每镜 / 只输出 JSON);所有创作细则一律以 skill 正文为准。定位不变:skill 丢了也
保证出 JSON 不塌(流水线硬底线),质量则 100% 由 skill 单点驱动。

验证(全在瘦身版上):
- 完整 Django 套件 152/152 全绿。
- 真调豆包「瘦身前 vs 瘦身后」对比:角色/场景/segments 一致,visual_prompt 仍守住
  空手/不提商品/空镜/字数(craft 由 skill 驱动)—— 质量零退步。
- 本地起后端(sqlite+eager+真ARK)+前端+无头 chromium 真点提取按钮:闸门→提取→
  角色(女主/室友)场景(学生宿舍/大学教室)落库、entities_extracted=True、
  任务 succeeded、system_chars=7482(非空)、0 控制台错误。

可回退:tag extract-ok-baseline(66778fa)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 00:47:01 +08:00
seaislee1209andClaude Opus 4.8 66778fa2d3 harden(extract): 提取加写死的 JSON 输出契约兜底,消除"过度依赖 skill 文件"脆点
承上次定位:脚本生成空 skill 也能出 JSON,是因其 system 带写死的 _OUTPUT_PROTOCOL(进镜像、
永远在);提取没有这层兜底,只靠 skill 文件 → skill 一空就吐散文解析失败。本次对齐脚本做法:
给提取也加 _EXTRACT_OUTPUT_CONTRACT(写死的 entities/segments JSON 契约 + 不提商品等铁律),
拼在 skill 正文之后。即便将来 skill 再丢,提取也仍收到「只输出 JSON」硬指令,不会再退化。

真验证:用 dev 库里那条真实失败脚本,system 仅留写死契约(模拟 skill 全空)真调豆包 →
仍稳定出 JSON(角色/场景齐、商品不提)。

测试:152/152 全绿(新增契约兜底单测)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 00:24:29 +08:00
seaislee1209andClaude Opus 4.8 8dab8b4921 fix(skills): skills 随后端打进镜像,根治线上提取「未返回有效 JSON」(系统提示词为空)
真因(查 dev 库 + 重放真实失败请求 + 真调 ARK 定位):线上提取的 system 提示词长度=0。
core-api 镜像由 `./core/backend` 构建,而 skills/ 在仓库根、不在构建上下文 → 镜像里没有
→ _load_skill_system_prompt 返回空串 → 模型收不到「只输出 JSON」铁律 → 吐 markdown/散文
→ 正则抽不到 {} → 「提取结果解析失败(模型未返回有效 JSON)」。本地有 skills 故一直没复现。
(脚本生成同样受影响,只是它有退化兜底提示词,质量打折但不报错。)

验证:用 dev 库里你那条失败请求的真实脚本重放——空 system→无 JSON;补上 skill 提示词
→ 立即出 JSON(角色/场景齐、商品不提)。

改动:
- skills/ → core/backend/skills/(git mv,进构建上下文,Dockerfile `COPY . .` 自动打包)。
- services._skills_root()/script_agent._skill_dir():优先 BASE_DIR/skills,回落仓库根(双兜底)。
- worker 失败时也落 response_payload(含 content / reasoning 预览 / system_chars),
  以后再坏一眼就能定位(本次正是因为失败没存返回,白绕一圈)。
- 回归测试 2 条:skills 必须在 BASE_DIR 内(随镜像走)+ 提取提示词非空且含 JSON 铁律。
- CLAUDE.md 标注 skills 必须放 core/backend 内的原因。

验收:完整 Django 套件 151/151 全绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-23 00:12:46 +08:00
seaislee1209andClaude Opus 4.8 c8cb6d3d51 fix(extract): 实体提取改异步(worker+轮询),根治 502 + 刷新丢 loading + 重复扣费
问题:进资产页点"提取人物/场景"——同步死等豆包思考模型(数十秒)→ 撞网关超时
502;"提取中"loading 是纯前端内存态,刷新即丢;且无幂等,刷新后重点会重复扣费。

改动(对齐全站异步三件套:出图/三视图/故事板同款):
- 后端 submit_extract_entities:Web 只建 RESERVED 任务 + 预留额度秒回(不再 502);
  已有在途提取则复用,绝不二次预扣(防刷新后重点 / 并发重复扣费)。
- 后端 run_extract_entities_task(Celery worker):流式调豆包 + 解析 + 落库 + 扣费;
  失败退费并把可读错误记进 task.error_message。
- 新增 AITask.Type.entity_extraction(迁移 0011)+ extract-status 端点(轮询进度/成败)。
- 前端 runExtract 改提交+轮询;进资产页自动认领在途提取,刷新后 loading 自己回来。

验收:完整 Django 套件 149/149 全绿(含新增 4 测:异步落库+计费一次 / content空
回退 reasoning / 在途防重复扣费 / 状态端点成败透出);tsc + vite build 全绿;
makemigrations --check 无遗漏。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 23:15:11 +08:00
seaislee1209andClaude Opus 4.8 71af0ae166 fix(extract): 实体提取改走流式通道 + 锁定豆包2.0Pro,根治"未返回有效JSON"
问题:进资产阶段点"提取人物/场景"间歇报「提取结果解析失败(模型未返回有效
JSON)」。根因——提取走非流式只读 content,而默认文本模型是会思考的推理模型
(豆包2.0Pro think:True),思考期常把内容留在 reasoning_content、content 返空 →
正则抽不到 JSON。脚本生成不犯此病是因其走流式、早已分离思考/正文。

改动:
- 锁模型:提取固定用 doubao-seed-2-0-pro-260215(_resolve_extract_model_config),
  取不到再回落默认,不再受各环境 DB 创建序漂移影响路由。
- 根治:提取复用与脚本生成同一条已验证稳定的流式通道(_collect_extract_text)——
  丢弃 reasoning 事件、只收正文 delta;正文为空时兜底回退 reasoning 里的 JSON。
  response_payload 改存精简流式存档(streamed/model/content/had_reasoning)。
- 测试:提取步原零测试,新增 2 个——流式正文JSON正确落库+计费一次、content空→
  回退reasoning。其余链路(脚本生成/单镜重跑)未动。

验收:本机 Python3.9 跑不了 Django5 全套,核心逻辑(事件过滤/回退/JSON抽取)已
独立验证通过;py_compile 绿;完整套件由 CI 跑。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 20:12:11 +08:00