-
_load_jobs() 里 status=='running' 的任务之前直接判 failed("无法恢复")。实测踩坑: 等当前任务跑完再重启,下一条排队任务在 worker 零延迟捞起的瞬间被判死——请求参数本身 完好,跟手动点"重跑"没区别,没理由不能自动重试。改成退回 queued 重新跑, Job.restart_recoveries 封顶 2 次,避免毒药请求无限重试拖垮队列。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SBpJTe8WfuYkKwjMaRSDg6
-
Q.qsize() 是底层 PriorityQueue 的原始元素数,取消一条排队中的任务只是把 JOBS 里的 status 标成 cancelled,不会把它从队列摘除,worker 要等真正 Q.get() 到它才跳过丢弃。堆量取消场景下 queued 数字会明显偏高(比如 "排队 253")。改成跟 running 同口径,直接数 JOBS 里 status=='queued' 的 条目。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SBpJTe8WfuYkKwjMaRSDg6
-
排查任务时经常要么去问 sqlite 里存的原始请求参数,要么去查 ComfyUI 自己的 /history 拿实际发给模型的完整 workflow graph——两者详情页都没有,只能手动 SSH 上去查。 - raylight/server.py 加 GET /v1/videos/{jid}/comfy_history,透传 ComfyUI 的 /history/{prompt_id}(这份数据在 ComfyUI 进程内存里,没有落盘,ComfyUI 重启后 查不到,接口会给出明确提示而不是裸错误)。 - h3-console/server.py 加对应代理。 - 详情页底部加两个默认折叠的区块:原始参数(req 原样 JSON,纯前端渲染,不用额外 请求)、ComfyUI History(懒加载,点开才去问后端,避免 queued/running 状态每次 轮询详情都多打一次 ComfyUI)。 - 顺带把生成结果视频从页面底部挪到状态/操作按钮那一行下面,不用再滚到底部看结果。 已在服务器重启验证:接口对已经清空 history 的任务(ComfyUI 重启后)正确返回明确 错误而不是裸 500;重启期间 14 条排队任务原样保留。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PA1AWh8e7wJ3vyhKBAEQux -
/v1/models 之前硬编码3个预设,模型文件名对应的是已删除的 api.py/gateway.py 那套旧 架构(minimax-h3-fl2va-nf4.safetensors 等),跟 raylight 现在实际加载的模型 (minimax_h3_fl2va_pruned_int8_convrot.safetensors 等)完全对不上,档位也只有3个, 跟前端下拉框实际支持的8个分辨率(RESOLUTION_CEILINGS)不一致——外部调这个接口查 "支持哪几档"拿到的是错的过期数据。 raylight/server.py 加 GET /v1/resolutions,返回 RESOLUTION_CEILINGS 的实时内容; h3-console 的 /v1/models 改成实时调这个接口拼 presets,顺带把 partitions 里的模型 文件名也换成当前实际使用的。 已在服务器上重启验证:/v1/resolutions 返回全部8档,h3-console /v1/models 端到端 拿到一致数据;重启过程中17条排队任务全部保留(用到了上一次改的排队恢复逻辑)。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PA1AWh8e7wJ3vyhKBAEQux
-
任务 f2de718e1e30(参考视频文件名带中文)秒失败:h3-console 上传时的文件名清洗用了 Python 3 默认的 Unicode \w,中文被当合法字符保留,资源 URL 里带着原始中文传给 urllib.request.urlopen,http.client 构造请求行要求纯 ASCII 直接炸了。改成请求前对 URL 的 path 部分 quote 一遍。 排查时发现 raylight 重启会把所有排队中的任务直接标记 cancelled(内存队列重启即清空, sqlite 里的 queued 记录没有任何路径被重新入队)。改成 Job 加 queue_seq、Q 换成 PriorityQueue,重启时排队任务原样保留、按序重新入队;顺带加了 POST /v1/videos/{jid}/prioritize 插队接口和对应的 h3-console 代理 + 前端"优先插队"按钮。 另外把 8月24日提交过、但实际从未部署到服务器的 ComfyUI 存活探测(_comfyui_alive) 重新加回,并解决了 raylight/server.py 和 raylight/scripts/server.py 长期分叉的问题。 已在服务器上验证:重启后 17 条排队任务原样保留、顺序不变;插队接口直接测试和通过 console 代理都验证通过;/health 的 comfy_alive 检查确认生效。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PA1AWh8e7wJ3vyhKBAEQux
-
/health 之前只读 STATE["model"](worker()线程启动时设一次"ready",之后再不更新), 一次OOM把ComfyUI(8188)进程本身搞崩溃退出后,server.py这层壳没死,/health继续骗人报 ready近20分钟,期间提交的任务全部秒失败(ConnectError)才被人工发现。改成每次/health都 真的探测一次8188(GET /system_stats,2秒超时,跟start.sh自己的就绪检测用同一个端点)。 不解决actor崩溃不自愈本身(上游代码问题),只是让崩溃能被更快发现。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>