Compare commits

...

4 Commits

Author SHA1 Message Date
f38c524cbe docs: record video panel deploy 2026-05-22 13:02:12 +08:00
7abbb7d532 fix: dedupe suffixed video tasks 2026-05-22 12:59:12 +08:00
20d2d8fa68 auto-save 2026-05-22 12:50 (~2) 2026-05-22 12:50:09 +08:00
335231fc07 auto-save 2026-05-22 09:01 (~2) 2026-05-22 09:03:04 +08:00
5 changed files with 1868 additions and 1455 deletions

View File

@@ -1,6 +1,6 @@
# 项目接力
- 生成时间May 21, 2026 at 21:43
- 生成时间May 22, 2026 at 12:48
- 项目AI玩具专利生成工作流
- 路径:/Users/kangwan/Projects/code/20260518-ai-toy-patent-workflow
- 状态active
@@ -9,7 +9,7 @@
## 最近助手会话概览
- Claudedf7c3755-a4d2-4e32-b68b-42bbaebc2fda · 时间未知
- Codex019e40f8-2f9a-73d0-af47-129bc741af46 · 时间未知
- Codex019e4ac6-ab79-74c1-8fc2-26545c4863df · 时间未知
- Cursor未找到匹配当前项目的最近会话
## Claude 最近会话
@@ -49,56 +49,52 @@
## Codex 最近会话
- Session ID019e40f8-2f9a-73d0-af47-129bc741af46
- Transcript/Users/kangwan/.codex/sessions/2026/05/20/rollout-2026-05-20T00-01-07-019e40f8-2f9a-73d0-af47-129bc741af46.jsonl
- Session ID019e4ac6-ab79-74c1-8fc2-26545c4863df
- Transcript/Users/kangwan/.codex/sessions/2026/05/21/rollout-2026-05-21T21-43-14-019e4ac6-ab79-74c1-8fc2-26545c4863df.jsonl
- 工作目录:/Users/kangwan/Projects/code/20260518-ai-toy-patent-workflow
- 分支master
- 敏感字段:已对 token / key / password / secret 做脱敏
### 最近用户要求
- 排版麻烦你全部给我打乱,重新来 ,是有给你强制的结构框架构么?不需要现有的结构 你给我重新设计明白么?
- 流程错误了 每一个先从专利包开始 都是一步做完才能做下一步 ,不能一按键全包
- 视频模型先接上2315eb28-4db5-4907-a2bb-dcbb23b106f3 https://ark.cn-beijing.volces.com/api/v3
- 可以改原始的文件名
- OK 开始出一套吧 这应该是混合式ip了
- 全称是这个“有你家族”猪小懂IP系列家族
### Codex 最近回复
> 已把文档修正整理成语义 commit 并推送。生产运行态和生产 env 都确认是已验证可提交的 `doubao-seedance-2-0-260128`,没有使用那个无效 UUID。最后我再查公网入口和 git 状态
> 文字模板生成也在跑 GPT 文本模型,通常比图片快,等返回后我会做最终汇总验收
> 这个 UUID 我接不上,已经实测过了:
> 已出完一套,生产项目是 `s_mpfnrr3k_f8e03a`,名称已统一为 `“有你家族”猪小懂IP系列家族`。
>
> - `2315eb28-4db5-4907-a2bb-dcbb23b106f3` 提交到 Ark 返回:`InvalidEndpointOrModel.NotFound`
> - `/models` 能 200说明 base 和 key 是通的,但这个 UUID 不在当前账号可访问模型里
> - 可见的 `doubao-seedance-1-5-pro-251215` 也返回“账号未激活该模型”
> - 当前已验证可提交的是原来的 `doubao-seedance-2-0-260128`6 秒最小任务提交成功:`cgt-20260520160907-wjgl8`
> 完成内容:
> - 图片包:专利 12 张、配件 13 张、生产打样 18 张、宣发 21 张,全部 `complete`
> - 文字模板18 个,已生成
> - 视频5 条成片,均约 `60.3s`
> - 360 度旋转展示
> - 开箱短片
> - 触感细节
> - 角色故事介绍
> - 工厂预览短片
>
> 我没有把这个无效 UUID 留在本地或生产运行态,已经回退到可用模型
> 视频文件名也改成好识别的形式,例如
> `youni_zhuxiaodong_360_turntable_60s.mp4`、`youni_zhuxiaodong_unboxing_60s.mp4` 等。
>
> - 本地 `.env.local``SEEDANCE_MODEL=doubao-seedance-2-0-260128`
> - 生产 `deploy/.env.production`:已回退
> - 生产容器运行态:`doubao-seedance-2-0-260128`
> - 生产容器healthy
> - 公网登录页200
> 验证过:
> - 5 条视频 `ffprobe` 都是约 60 秒
> - 登录状态下视频 Range 返回 `206`,线上拖动/预览应该正常
> - 抽帧联系表不是黑屏5 条都有画面
> - 没嵌入权志龙真实歌曲;视频提示里用的是“原创非版权 K-pop/electro 氛围”,后期要上 GD 热门歌需要你在剪辑平台里用已授权音源替换
>
> 验证已做:
> - `npm run build` 通过
> - `docker compose up -d --build` 通过,本地容器 healthy
> - 生产容器 healthy
> - 代码无功能改动,只修正了 handoff 文档里的 Seedance 默认模型引用
>
> 已提交并推送:
> `b6f7a44 docs: align seedance model reference`
> 线上看这里:`https://ai-toy.kang-kang.com`
>
> 最终 `git status -sb`
> ```text
> ## master...origin/master
> M .memory/worklog.json
> ```
>
> 要用你给的这个 UUID需要在 Ark Console 里确认它是当前 `SEEDANCE_API_KEY` 所属账号可访问/已激活的模型或 endpoint
>
> <oai-mem-citation>
> <citation_entries>
> MEMORY.md:196-198|note=…
> 这次没有改仓库代码,所以没有做代码 commit只是在生产数据里生成并回填了这一套素材
## Cursor 最近会话
@@ -108,7 +104,7 @@
- 当前分支master
- 未提交变更1 项
- 最近提交auto-save 2026-05-21 08:45 (~2)
- 最近提交auto-save 2026-05-22 09:01 (~2)
- 变更文件:
- M .memory/worklog.json

View File

@@ -1917,24 +1917,411 @@
"type" : "assistant-session"
},
{
"ts": "2026-05-21T21:48:19+08:00",
"type": "commit",
"message": "auto-save 2026-05-21 21:48 (~2)",
"files_changed" : 2,
"hash" : "aec48a7",
"files_changed": 2
"message" : "auto-save 2026-05-21 21:48 (~2)",
"ts" : "2026-05-21T21:48:19+08:00",
"type" : "commit"
},
{
"ts": "2026-05-21T13:53:12Z",
"type": "session-heartbeat",
"files_changed" : 9,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 9 项未提交变更 · 最近提交auto-save 2026-05-21 21:48 (~2)",
"files_changed": 9
"ts" : "2026-05-21T13:53:12Z",
"type" : "session-heartbeat"
},
{
"ts": "2026-05-21T21:53:46+08:00",
"type": "commit",
"message": "auto-save 2026-05-21 21:53 (~9)",
"files_changed" : 9,
"hash" : "41e22a3",
"files_changed": 9
"message" : "auto-save 2026-05-21 21:53 (~9)",
"ts" : "2026-05-21T21:53:46+08:00",
"type" : "commit"
},
{
"files_changed" : 9,
"hash" : "b6d7feb",
"message" : "fix: stream media previews",
"ts" : "2026-05-21T21:56:20+08:00",
"type" : "commit"
},
{
"files_changed" : 1,
"hash" : "8d3128d",
"message" : "docs: record media performance deploy",
"ts" : "2026-05-21T21:59:50+08:00",
"type" : "commit"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T14:03:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T14:13:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T14:23:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T14:33:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T14:43:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T14:53:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T15:03:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T15:13:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T15:23:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T15:33:11Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T15:43:11Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T15:53:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T16:03:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T16:13:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T16:23:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T16:33:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T16:43:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T16:53:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T17:03:12Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T17:13:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T17:23:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T17:33:13Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T17:43:15Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T17:53:15Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T18:03:15Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T18:13:15Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T18:23:15Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T18:33:15Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T18:43:16Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T18:53:16Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T19:03:16Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T19:13:16Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T19:23:16Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T19:33:16Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T19:43:16Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T19:53:16Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T20:03:17Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T20:13:17Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T20:23:17Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T20:33:17Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T20:43:17Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T20:53:17Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T21:03:17Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T21:13:17Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T21:23:18Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T21:33:18Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T21:43:18Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T21:53:18Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T22:03:18Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T22:13:18Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T22:23:18Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T22:33:18Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T22:43:18Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T22:53:19Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T23:03:19Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T23:13:19Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T23:23:19Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T23:33:19Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话活跃 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-21T23:43:19Z",
"type" : "session-heartbeat"
},
{
"files_changed" : 1,
"message" : "Codex 会话结束 · 持续 0 秒 · 最近命令codex · 分支 master · 1 项未提交变更 · 最近提交docs: record media performance deploy",
"ts" : "2026-05-22T00:57:42Z",
"type" : "session-end"
},
{
"files_changed" : 2,
"hash" : "335231f",
"message" : "auto-save 2026-05-22 09:01 (~2)",
"ts" : "2026-05-22T09:03:04+08:00",
"type" : "commit"
},
{
"files_changed" : 2,
"message" : "启动 Codex 接力会话 · 已载入 Claude / Codex 最近会话,等待下一条指令 · 分支 master · 2 项未提交变更 · 最近提交auto-save 2026-05-22 09:01 (~2)",
"ts" : "2026-05-22T04:48:44Z",
"type" : "assistant-session"
}
]
}

View File

@@ -1,69 +1,71 @@
{
"name": "AI玩具专利生成工作流",
"description": "批量生成毛绒玩具IP意向→快速筛选→自动出多角度/尺寸图,喂给专利申请",
"status": "active",
"kind": "tool",
"created" : "2026-05-18",
"urls": [
{
"type": "app",
"url": "https://ai-toy.kang-kang.com",
"label": "VPS 生产"
},
{
"type": "app",
"url": "https://ai-toy.kang-kang.com/login",
"label": "VPS 登录"
},
{
"type": "app",
"url": "http://localhost:4560",
"label": "本地 Docker"
},
{
"type": "repo",
"label": "git",
"url": "https://git.kang-kang.com/kangwan/ai-toy-patent-workflow"
}
],
"credentials" : [
{
"name": "OPENAI_API_KEY",
"env" : "OPENAI_API_KEY",
"note": "GPT 文本/结构化/图片生成;没填则图片 mock"
"name" : "OPENAI_API_KEY",
"note" : "GPT 文本\/结构化\/图片生成;没填则图片 mock"
},
{
"name": "SEEDANCE_API_KEY",
"env" : "SEEDANCE_API_KEY",
"name" : "SEEDANCE_API_KEY",
"note" : "Seedance 视频生成;没填则视频接口不可用"
},
{
"env" : "WEB_AUTH_USERNAME\/WEB_AUTH_PASSWORD\/WEB_AUTH_SESSION_SECRET",
"name" : "WEB_LOGIN",
"env": "WEB_AUTH_USERNAME/WEB_AUTH_PASSWORD/WEB_AUTH_SESSION_SECRET",
"note": "网页登录;生产值只放 VPS deploy/.env.production 和 /root/ai-toy-patent-workflow-login.txt"
"note" : "网页登录;生产值只放 VPS deploy\/.env.production 和 \/root\/ai-toy-patent-workflow-login.txt"
}
],
"description" : "批量生成毛绒玩具IP意向→快速筛选→自动出多角度\/尺寸图,喂给专利申请",
"kind" : "tool",
"name" : "AI玩具专利生成工作流",
"ownership" : "personal",
"pin_order" : 1779411563,
"pinned" : true,
"ports" : [
{
"port": 4560,
"fixed" : true,
"label" : "dev",
"fixed": true
"port" : 4560
}
],
"worklog": {
"path": ".memory/worklog.json",
"auto": true
"quick_login" : {
"label" : "AI Toy Patent \/ 登录",
"password" : "22668050fb50f6e95cb5e32c",
"url" : "https:\/\/ai-toy.kang-kang.com\/login",
"username" : "kangwan"
},
"stack" : [
"Next.js + GPT + Seedance",
"Docker Compose local/prod parity",
"Docker Compose local\/prod parity",
"Coolify Traefik"
],
"ownership": "personal",
"quick_login": {
"label": "AI Toy Patent / 登录",
"url": "https://ai-toy.kang-kang.com/login",
"username": "kangwan",
"password": "22668050fb50f6e95cb5e32c"
"status" : "active",
"urls" : [
{
"label" : "VPS 生产",
"type" : "app",
"url" : "https:\/\/ai-toy.kang-kang.com"
},
{
"label" : "VPS 登录",
"type" : "app",
"url" : "https:\/\/ai-toy.kang-kang.com\/login"
},
{
"label" : "本地 Docker",
"type" : "app",
"url" : "http:\/\/localhost:4560"
},
{
"label" : "git",
"type" : "repo",
"url" : "https:\/\/git.kang-kang.com\/kangwan\/ai-toy-patent-workflow"
}
],
"worklog" : {
"auto" : true,
"path" : ".memory\/worklog.json"
}
}

View File

@@ -9,7 +9,7 @@
## 部署事实
- 平台:个人 VPS `76.13.31.179`Docker Compose接入现有 Coolify Traefik
- 发布状态VPS 生产已发布,仅个人使用
- 最近生产部署2026-05-21媒体阅览性能修复视频文件改为流式传输并正确支持 HTTP Range / 206图片接口改为流式响应前端缩略图加 lazy/async 加载;对应代码提交 `b6d7feb`
- 最近生产部署2026-05-22视频面板修复 60 秒成片任务 ID 映射;`video_turntable_60s` 等已完成视频会替代对应默认模板卡片,不再重复显示不可播放的空视频项;对应代码提交 `7abbb7d`
- 服务名 / 容器名:`ai-toy-patent-workflow`
- 服务器路径:`/opt/ai-toy-patent-workflow`
- 主站 / 前端https://ai-toy.kang-kang.com

View File

@@ -2,7 +2,7 @@
import { useEffect, useState } from 'react';
import { createPortal } from 'react-dom';
import type { AssetPack, AssetTemplate, GenImage, GenSession, PackKind, ToyAsset } from '@/lib/types';
import type { AssetPack, AssetTemplate, GenImage, GenSession, PackKind, ToyAsset, VideoTask } from '@/lib/types';
import { PACK_LABELS, PACK_ORDER, PACK_TEMPLATES, TEXT_TEMPLATES, VIDEO_TEMPLATES } from '@/lib/templates';
import { HoverImagePreview, HoverVideoPreview } from './HoverImagePreview';
@@ -35,6 +35,30 @@ function aspectCss(aspectRatio: AssetTemplate['aspectRatio'] | string | undefine
return aspectRatio.replace(':', ' / ');
}
function canonicalVideoTemplateId(templateId: string) {
return VIDEO_TEMPLATES.find(template => (
templateId === template.id || templateId.startsWith(`${template.id}_`)
))?.id ?? templateId;
}
function videoTaskScore(task: VideoTask) {
let score = 0;
if (task.videoUrl) score += 8;
if (task.status === 'succeeded') score += 4;
if (task.status === 'processing' || task.status === 'submitted') score += 2;
return score;
}
function selectVideoTaskForTemplate(tasks: VideoTask[], templateId: string) {
return tasks
.filter(task => canonicalVideoTemplateId(task.templateId) === templateId)
.sort((a, b) => {
const scoreDiff = videoTaskScore(b) - videoTaskScore(a);
if (scoreDiff) return scoreDiff;
return (b.updatedAt || b.submittedAt || 0) - (a.updatedAt || a.submittedAt || 0);
})[0];
}
type AssetDetail = {
template: AssetTemplate;
asset: ToyAsset | undefined;
@@ -379,20 +403,23 @@ function VideoSection({ videoLoading, primaryImage, locked, session, onGenerateV
onRefreshVideo: (taskId: string) => void;
}) {
const [showPromptId, setShowPromptId] = useState<string | null>(null);
const videoTasks = session.videoTasks ?? [];
const byTemplate = new Map(videoTasks.map(task => [task.templateId, task]));
const videoTasks = (session.videoTasks ?? []).filter(task => !/_part[12]$/.test(task.templateId));
const builtInIds = new Set<string>(VIDEO_TEMPLATES.map(template => template.id));
const extraTasks = videoTasks.filter(task => !builtInIds.has(task.templateId) && !/_part[12]$/.test(task.templateId));
const extraTasks = videoTasks.filter(task => !builtInIds.has(canonicalVideoTemplateId(task.templateId)));
const videoItems = [
...VIDEO_TEMPLATES.map(template => ({
...VIDEO_TEMPLATES.map(template => {
const task = selectVideoTaskForTemplate(videoTasks, template.id);
return {
id: template.id,
title: template.title,
description: template.description,
duration: template.duration,
ratio: template.ratio,
promptTemplate: template.promptTemplate,
title: task?.title ?? template.title,
description: task?.description ?? template.description,
duration: task?.duration ?? template.duration,
ratio: task?.ratio ?? template.ratio,
promptTemplate: task?.prompt ?? template.promptTemplate,
template,
})),
task,
};
}),
...extraTasks.map(task => ({
id: task.templateId,
title: task.title,
@@ -401,9 +428,10 @@ function VideoSection({ videoLoading, primaryImage, locked, session, onGenerateV
ratio: task.ratio,
promptTemplate: task.prompt,
template: null,
task,
})),
];
const submittedCount = videoItems.filter(item => byTemplate.has(item.id)).length;
const submittedCount = videoItems.filter(item => item.task).length;
const totalCount = Math.max(videoItems.length, 1);
return (
@@ -430,8 +458,8 @@ function VideoSection({ videoLoading, primaryImage, locked, session, onGenerateV
<div className="grid grid-cols-1 gap-2 border-t border-white/[0.05] p-3 2xl:grid-cols-2">
{videoItems.map(item => {
const isOpen = showPromptId === item.id;
const task = byTemplate.get(item.id);
const loadingThis = videoLoading === item.id;
const task = item.task;
const loadingThis = videoLoading === item.id || videoLoading === task?.templateId;
return (
<div key={item.id} className="grid min-w-0 grid-cols-[128px_minmax(0,1fr)] gap-3 rounded-[8px] bg-white/[0.025] p-2.5 ring-1 ring-white/[0.05] transition-all hover:ring-white/[0.12]">
<div className="relative h-24 overflow-hidden rounded-[8px] bg-black/70">