auto-save 2026-05-21 15:20 (~2)

This commit is contained in:
2026-05-21 15:20:33 +08:00
parent 7bb4f3ea9f
commit b6fec10371
2 changed files with 47 additions and 20 deletions

View File

@@ -1,25 +1,5 @@
{ {
"entries": [ "entries": [
{
"files_changed": 2,
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交auto-save 2026-05-19 10:51 (~3)",
"ts": "2026-05-19T02:54:32Z",
"type": "session-heartbeat"
},
{
"files_changed": 2,
"hash": "3f716ea",
"message": "auto-save 2026-05-19 10:56 (~2)",
"ts": "2026-05-19T10:56:52+08:00",
"type": "commit"
},
{
"files_changed": 4,
"hash": "0ddc08c",
"message": "auto-save 2026-05-19 11:02 (~4)",
"ts": "2026-05-19T11:02:18+08:00",
"type": "commit"
},
{ {
"files_changed": 2, "files_changed": 2,
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交auto-save 2026-05-19 11:02 (~4)", "message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交auto-save 2026-05-19 11:02 (~4)",
@@ -3223,6 +3203,25 @@
"type": "session-heartbeat", "type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 1 项未提交变更 · 最近提交auto-save 2026-05-21 15:09 (+1, ~3)", "message": "Codex 会话活跃 · 最近命令codex · 分支 main · 1 项未提交变更 · 最近提交auto-save 2026-05-21 15:09 (+1, ~3)",
"files_changed": 1 "files_changed": 1
},
{
"ts": "2026-05-21T15:15:07+08:00",
"type": "commit",
"message": "auto-save 2026-05-21 15:15 (+2, ~3)",
"hash": "7bb4f3e",
"files_changed": 5
},
{
"ts": "2026-05-21T07:18:17Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交auto-save 2026-05-21 15:15 (+2, ~3)",
"files_changed": 2
},
{
"ts": "2026-05-21T07:20:24Z",
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交auto-save 2026-05-21 15:15 (+2, ~3)",
"files_changed": 2
} }
] ]
} }

View File

@@ -716,6 +716,21 @@ api/main.py
subject_agent: SubjectAgentState, subject_agent: SubjectAgentState,
storyboard_images?: StoryboardImage[], storyboard_images?: StoryboardImage[],
product_refs?: ProductRefStateItem[] product_refs?: ProductRefStateItem[]
}</pre>
</div>
<div class="card">
<h3>AgentRun</h3>
<p>一键出片终端的后台状态机。它不替代 <code>Job</code>,而是持有一个 <code>job_id</code> 并记录终端日志、阶段、生成视频 ID、审片图和最终 mp4。</p>
<pre>AgentRun {
id, job_id,
status: draft | queued | executing | reviewing | completed | failed,
stage, progress,
logs: AgentRunLog[],
video_ids: string[],
final_video_url,
contact_sheet_url,
error,
created_at, updated_at
}</pre> }</pre>
</div> </div>
<div class="card"> <div class="card">
@@ -994,6 +1009,7 @@ ProductRefStateItem {
<tr><td>运行配置 / 模型标注</td><td><code>GET /health</code></td><td><code>getRuntimeHealth</code><code>ModelTrace</code></td><td>返回 <code>models</code>ASR、<code>asr_language</code><code>asr_base_url</code><code>asr_remote_enabled</code><code>asr_local_fallback_enabled</code><code>asr_audio_fallback_enabled</code><code>faster_whisper</code>、本机 ASR、ASR fallback、翻译、GPT 改写、GPT 画面理解、产品视角识别 <code>product_view</code>、主图像模型 <code>gpt-image-2</code>、图片故障兜底 <code>image_fallbacks</code>、短时熔断状态 <code>image_circuit</code>、主体 6 视图模型链路、Azure OpenAI TTS、视频别名和 Seedance 服务商。当前 <code>REWRITE_MODEL</code><code>AUDIO_REWRITE_MODEL</code><code>VISION_MODEL</code> 默认使用 <code>gpt-4o</code>;如果旧环境变量仍写 <code>gemini-*</code>,后端会归一化回 <code>GPT_TEXT_MODEL</code> / <code>REWRITE_MODEL</code>。语音只走 Azure OpenAI TTS<code>models.voice_tts_paths</code> 会回传当前尝试的语音路径,方便区分路径错误和语音服务不可用。前端所有当前主路径里会调用模型的按钮旁显示模型名,点击弹出小窗口查看模型链路和输入输出逻辑;不返回 API Key 或敏感凭证。</td></tr> <tr><td>运行配置 / 模型标注</td><td><code>GET /health</code></td><td><code>getRuntimeHealth</code><code>ModelTrace</code></td><td>返回 <code>models</code>ASR、<code>asr_language</code><code>asr_base_url</code><code>asr_remote_enabled</code><code>asr_local_fallback_enabled</code><code>asr_audio_fallback_enabled</code><code>faster_whisper</code>、本机 ASR、ASR fallback、翻译、GPT 改写、GPT 画面理解、产品视角识别 <code>product_view</code>、主图像模型 <code>gpt-image-2</code>、图片故障兜底 <code>image_fallbacks</code>、短时熔断状态 <code>image_circuit</code>、主体 6 视图模型链路、Azure OpenAI TTS、视频别名和 Seedance 服务商。当前 <code>REWRITE_MODEL</code><code>AUDIO_REWRITE_MODEL</code><code>VISION_MODEL</code> 默认使用 <code>gpt-4o</code>;如果旧环境变量仍写 <code>gemini-*</code>,后端会归一化回 <code>GPT_TEXT_MODEL</code> / <code>REWRITE_MODEL</code>。语音只走 Azure OpenAI TTS<code>models.voice_tts_paths</code> 会回传当前尝试的语音路径,方便区分路径错误和语音服务不可用。前端所有当前主路径里会调用模型的按钮旁显示模型名,点击弹出小窗口查看模型链路和输入输出逻辑;不返回 API Key 或敏感凭证。</td></tr>
<tr><td>历史列表</td><td><code>GET /jobs</code></td><td><code>listJobs</code></td><td>所有 job 精简列表id/url/status/thumbnail/mtime…按 state.json mtime 倒序。前端 URL 无 <code>?job=</code> 时拉它回填全部历史;带 <code>limit</code> 可截断。</td></tr> <tr><td>历史列表</td><td><code>GET /jobs</code></td><td><code>listJobs</code></td><td>所有 job 精简列表id/url/status/thumbnail/mtime…按 state.json mtime 倒序。前端 URL 无 <code>?job=</code> 时拉它回填全部历史;带 <code>limit</code> 可截断。</td></tr>
<tr><td>创建任务</td><td><code>POST /jobs</code></td><td><code>createJob</code></td><td>提交 TK 链接,后台开始下载;前端“开始”队列会在 downloaded 后自动触发音频解析。下载阶段默认不带 cookies生产环境必须显式保持 <code>YTDLP_COOKIES_FILE=</code><code>YTDLP_COOKIES_FROM_BROWSER=</code> 为空,避免容器内误读被打进镜像的开发 <code>api/.env</code>。只有 TikTok 明确要求登录态时,才把宿主机 <code>./secrets/tiktok_cookies.txt</code> 挂载进容器并设置 <code>YTDLP_COOKIES_FILE=/run/secrets/tiktok_cookies.txt</code>。生产容器没有 Chrome cookies 数据库,不能配置 <code>YTDLP_COOKIES_FROM_BROWSER=chrome</code></td></tr> <tr><td>创建任务</td><td><code>POST /jobs</code></td><td><code>createJob</code></td><td>提交 TK 链接,后台开始下载;前端“开始”队列会在 downloaded 后自动触发音频解析。下载阶段默认不带 cookies生产环境必须显式保持 <code>YTDLP_COOKIES_FILE=</code><code>YTDLP_COOKIES_FROM_BROWSER=</code> 为空,避免容器内误读被打进镜像的开发 <code>api/.env</code>。只有 TikTok 明确要求登录态时,才把宿主机 <code>./secrets/tiktok_cookies.txt</code> 挂载进容器并设置 <code>YTDLP_COOKIES_FILE=/run/secrets/tiktok_cookies.txt</code>。生产容器没有 Chrome cookies 数据库,不能配置 <code>YTDLP_COOKIES_FROM_BROWSER=chrome</code></td></tr>
<tr><td>一键出片终端</td><td><code>POST /agent-runs</code><br><code>GET /agent-runs/{id}</code><br><code>GET /agent-runs/{id}/final.mp4</code><br><code>GET /agent-runs/{id}/contact.jpg</code></td><td><code>web/app/agent/page.tsx</code></td><td>快速出片页的唯一主接口。前端提交 TikTok 链接和最多 6 张产品图;后端创建 <code>Job</code><code>AgentRun</code>后台执行下载、产品图归一化、透明骨架主体参考复制、12 段镜头计划、视频生成、失败镜头自动重跑一次、审片接触表和 ffmpeg 最终合成。前端只轮询日志和结果,不直接拥有模型执行权。</td></tr>
<tr><td>重试下载</td><td><code>POST /jobs/{id}/download/retry</code></td><td><code>retryJobDownload</code></td><td>用于 TK 链接下载失败且没有 <code>video_url</code> 的素材;清空错误、重新进入下载状态,并在后台再次执行 <code>pipeline_download</code>。上传视频不能重下载,需要重新上传文件。</td></tr> <tr><td>重试下载</td><td><code>POST /jobs/{id}/download/retry</code></td><td><code>retryJobDownload</code></td><td>用于 TK 链接下载失败且没有 <code>video_url</code> 的素材;清空错误、重新进入下载状态,并在后台再次执行 <code>pipeline_download</code>。上传视频不能重下载,需要重新上传文件。</td></tr>
<tr><td>上传视频</td><td><code>POST /jobs/upload</code></td><td><code>uploadJob</code></td><td>保存 source.mp4然后同样进入下载完成状态当前上传后也加入第一步队列下载完成后自动解析音频。</td></tr> <tr><td>上传视频</td><td><code>POST /jobs/upload</code></td><td><code>uploadJob</code></td><td>保存 source.mp4然后同样进入下载完成状态当前上传后也加入第一步队列下载完成后自动解析音频。</td></tr>
<tr><td>删除输入视频</td><td><code>DELETE /jobs/{id}</code></td><td><code>deleteJob</code></td><td>从任务队列、URL 和磁盘 <code>jobs/&lt;id&gt;</code> 目录移除整个 job包括源视频、关键帧、元素提取图和生成视频。</td></tr> <tr><td>删除输入视频</td><td><code>DELETE /jobs/{id}</code></td><td><code>deleteJob</code></td><td>从任务队列、URL 和磁盘 <code>jobs/&lt;id&gt;</code> 目录移除整个 job包括源视频、关键帧、元素提取图和生成视频。</td></tr>
@@ -1139,6 +1155,18 @@ ProductRefStateItem {
<h2>变更记录</h2> <h2>变更记录</h2>
<p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p> <p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p>
<div class="changelog"> <div class="changelog">
<article class="change">
<header>
<h3>2026-05-21 · 新增一分钟二创出片终端</h3>
<span class="tag violet">Agent</span>
<span class="tag green">Pipeline</span>
</header>
<div class="body">
<p><strong>背景:</strong>用户希望默认不再进入多段人工链路,而是只提交 TikTok 链接和产品图,后台像 Codex 接管一样解决下载、规划、生成和合成问题,最终直接看成片。</p>
<p><strong>改动:</strong>新增 <code>web/app/agent/page.tsx</code> 快速出片页和 <code>api/main.py</code><code>AgentRun</code> 状态机。后台固定 12 段约 1 分钟策略,执行下载、产品素材、主体参考、抽帧、镜头规划、视频生成、失败重跑、审片接触图和最终 mp4 合成;前端只显示实时终端和成片播放器。</p>
<p><strong>影响:</strong>旧信息流复刻工作台仍保留给高级编辑;新页是“只看成品”的默认候选入口。后续描述该路径时应引用“一键出片终端 / AgentRun / agent-runs 接口”,不要再要求用户逐步处理关键帧、分镜和候选视频。</p>
</div>
</article>
<article class="change"> <article class="change">
<header> <header>
<h3>2026-05-21 · 工作台顶栏品牌文案调整</h3> <h3>2026-05-21 · 工作台顶栏品牌文案调整</h3>