Repository navigation
Releases: AgenticsWorld/VideoAgents
Release list
v1.0.42
Removed
- ComfyUI video templates: the two Seedance 2.x Comfy Cloud reference-to-video templates (2026-10-23).
comfy/video-seedance2_5_r2v-cloud-only.jsonandcomfy/video-seedance2_0_r2v-cloud-only.json, with their.mddocs, no longer ship, so they are gone from the ComfyUI workflow list on the 生成模型 page. The handling for workflows built onByteDance2ReferenceNodeis unchanged, so a Comfy Cloud workflow you export yourself still works the same way. A setting that still points at one of the removed paths needs a workflow file of your own.
Changed
- 工作流预览: spent time and per-task time now come from the service's run records (2026-10-23, #134). A task's time used to come only from its
runs/<task>/meta.jsonor the finalresultevent of itsrun_idsession log. So most tasks showed no time (many DAG nodes have norun_id), runs that ended in an error counted as 0, a re-run overwrote the earlier time, batch tasks sharing one run counted it once per group, and oldmeta.jsonfiles from an earlier version stood in for later re-runs. A task's time is now the sum of the run records (started → ended, kept inruntime.sqlite3) that belong to it. A run belongs to a task when the node lists it inrun_id/prev_run_id/restyle_run_id, or when the first line of the dispatch message names the node ID. If the named node is a fanned-out parent and that line listsgrpNNNorgrpNNN–grpMMM, the run goes to those instances; a change-order suffix such as-B11Rgoes to the base node. A run that belongs to k tasks is split k ways. Producer sessions are not counted toward any task.meta.jsonand the session log are only used when no run is found. 已花费 is now the union of all the project's run periods (including the producer, re-runs and runs that ended in an error), so parallel runs count once. A fanned-out parent's own time counts toward its family, and the detail panel shows how many runs a task had. All 11 UI dictionaries are covered. On one real project, tasks with a recorded time went from 36 to 107 and 已花费 went from 9.3 h to 61.8 h. - Volcengine and BytePlus model lists: retired models removed, Seedream 5.0 Flash added (2026-10-23). Checked against Ark's online model list. Seedance 1.5 Pro (
doubao-seedance-1-5-pro-251215) was shut down on 2026-09-21 and now fails withClosedEndpoint. Seedance 1.0 Pro / 1.0 Pro Fast and Seedream 5.0 / 5.0 Lite / 4.5 / 4.0 (-250828) are in Ark's tenth retirement batch: no new activations since 2026-09-24, shut down on 2026-11-24. All seven are gone from the Volcengine video and image lists on the 生成模型 page, the storyboard and canvas pickers, and the episode / group video-model choices. The Volcengine image list addsdoubao-seedream-5-0-flash-260915(same features as 5.0 Pro, faster and cheaper) anddoubao-seedream-4-0-20260415(Ark's replacement for Seedream 4.0). A setting that already uses a removed model keeps working: the page shows it under 自定义…, and accounts that activated the retiring ones before 2026-09-24 can call them until 2026-11-24. For 4.0 (20260415), the largest image size (4096×4096) was measured. For 5.0 Flash, the size range is taken from Ark's docs and is the same as 5.0 Pro; it has not been tried, because neither test account has Flash activated. On BytePlus, Seedance 1.5 Pro (seedance-1-5-pro-251215) is in the fourth retirement batch: no new endpoints since 2026-09-15, shut down at 17:00 on 2026-11-11 (UTC+8). It is gone from the BytePlus video list, and accounts that already use it can call it until then. The BytePlus image list addsdola-seedream-5-0-flash-260915. Every other BytePlus model in the lists still works, including Seedance 1.0 Pro / 1.0 Pro Fast, which Volcengine is retiring.seedream-4-0-20260415is not added on BytePlus, because BytePlus is not retiringseedream-4-0-250828.
Fixed
- Engine CLIs: the fallback install paths for Kimi Code, OpenCode, Grok and Antigravity now work on Windows, and a failed launch shows the system's error (2026-10-23). When a CLI is not on the service's
PATH, the service looks in the engine's default install location. For these four engines that location was written without.exe(e.g.~/.kimi-code/bin/kimi), so on Windows it never matched, and the error only showed the bare command name. The fallbacks now come from the same default install locations that one-click install uses, with.exeon Windows and several candidates for some engines. When starting a CLI fails with "file not found", the "not installed" message now adds the error the system returned, so a transient failure (for example an antivirus scan holding a freshly downloaded runtime) can be told apart from a missing install. Paths on macOS and Linux are unchanged. Not exercised: the antivirus case itself. - Image generation no longer gives up after 10 minutes (2026-10-23, #134). The shared wait limit for cloud image channels (Agentics, Volcengine Ark, OpenRouter, Fal, MiniMax and RunningHub standard models) rises from 600 s to 1800 s, the same as video and ComfyUI. An Agentics FLUX.2 image-to-image run with a 10-image reference chain took about 706 s and was cancelled before it finished. The four image subprocesses the service starts (sketch generation, storyboard sketches, grid sketches and hand-drawing AI refinement) now wait up to 2100 s instead of 900 / 1200 s. They used to kill genmedia while it was still waiting, which left the remote task running and saved nothing.
- Agentics TTS Voice Design now sends the voice description as
instruction(2026-10-23, #134). On 2026-10-14 the Agentics service madeinstructionthe official name of the TTS voice-description parameter. The client only recognisedinstruct/voice_instruction/voice_description/instructions. It treated a profile that declaresinstructionas having no description parameter, fell back to Voice Clone and could not produce the first voice sample.instructionis now checked first, and the old names still work for profiles imported earlier. This only takes effect once the Voice Design profile on the service is re-imported, or mapsinstruction. - Agentics digital human: inputs now follow the service's digital-human contract (2026-10-23, #136). Digital-human profiles (media type 5) used to be checked against the video parameter and attachment list. The avatar image was sent as
first_frame/reference_imagesand the speech asreference_audios. The avatar image now goes toavatar_imageand the speech todriving_audios, checked against the digital-human contract's own parameters (e.g.audio_mode,audio_strength,audio_guidance_scale,fps,background_color) and attachments (avatar_video,dialogue_audio,speaker_masks,background_image/background_video, …). A profile with only attachment mappings is accepted and the prompt may be empty. When the profile requiresduration, it is now the exact audio length in seconds, no longer rounded up.code/check_digitalhuman.pyalso acceptsagenticsas a clip ledger's provider, so finished Agentics lip-sync clips no longer fail the check as "渠道非法". - Audio transcription now says which Python it ran on (2026-10-23, #136). When
faster-whispercannot be imported,modules/transcription.pyand itsdoctorcommand now name the interpreter (sys.executable) and give the import error, instead of only asking for a reinstall.doctoralso reportspython_executable/python_prefix. The desktop app now lists the selected Python runtime's folder ahead of the login-shell and system paths in the web service'sPATH, sopython3in commands finds the app's runtime. The desktop part takes effect after the desktop app is rebuilt. - macOS desktop: Agentics runs no longer add an
execicon to the Dock for each running agent (2026-10-23). The built-in pi ran on the app's main executable in Node mode. pi sets its process title at start-up, and on macOS that registers the process with the system using the app's own settings, so every running agent showed up in the Dock as a separate app with a genericexecicon until it finished. The desktop app now runs pi on its Electron helper (VideoAgents Helper), which is marked as a background app, so agent runs stay out of the Dock. Windows and the source version are unchanged. Takes effect after the desktop app is rebuilt. - Burned-in subtitles, whitebox reel subtitles and animatic captions now follow the requested font size on machines without a Chinese font (2026-10-23). When neither
data/fonts/nor the system has a Chinese font (typical on a Linux server), the subtitle renderer fell back to PIL's built-in font at a fixed 10 px, whatever the size the layout asked for. A 1920×1080 subtitle came out at about 1% of the frame height, and shrinking an over-long cue to fit two lines did nothing. The fallback now loads PIL's built-in font at the requested size. It has no Chinese glyphs, so Chinese text still needs a Chinese font installed, but English subtitles render at the right size. The subtitle burn ledger recordsPIL 默认字体as the font in that case.
v1.0.41
Added
- A host check for each speaker's voice pitch in dialogue groups:
python3 code/voice_f0_check.py --project <slug> --ep <ep> --group <grp>(2026-10-22, #148). The video-generation role notes and WORKFLOW.md required a per-speaker acoustic check (voice_f0_check) on every dialogue group, but no such script ever shipped, so agents either wrote their own copy into each project'scode/(five different versions) or marked the check as not run. The new command splits the group clip by speaker (from the clip'sboundary_mapand the shot list's on-screen lines), compares each speaker's median pitch with that speaker's own voice sample from the group prompt'saudio_refs, and reports PASS (within 20%), WARN (20–70%, noted in the hand-off only) or FAIL (over 70%, or two speakers each closer to the other's sample), with per-speaker and per-segment detail;--jsongives machine-readable output. It only judges a group whoseaudio_planisdialogue, whose project has 对白配音 = 视频原声 and whose prompt hasaudio_refs; otherwise it reports SKIP and exits 0. A FAIL sends the group to the re-roll flow, limited by the 重跑次数 setting. The single-clip form agents were used to,<clip> --seg <start>:<end>:<character-id>, also works. The FAIL line was planned at 35%; on 263 real dialogue groups that failed 32% of them, mostly because of steady gaps between a character's sample and the way the model voices that character, which a re-roll does not fix, so it was raised to 70%, roughly the gap between a male and a female voice (8% of those groups fail at that line, about 9% with the swapped-speakers rule). - A host check for the Bible skeleton:
python3 code/check_bible_skeleton.py --project <slug>(2026-10-22). The Bible set-up task (p0-bible-init) was accepted on "skeleton schema complete", but nothing in the program checked that, so each project's memory-bible agent proved it with its own one-off check and the criteria differed from project to project. The new command reports PASS / FAIL / WARN item by item: the Bible files and folders listed inagents/WORKFLOW.md§2 exist and parse; the paths and top-level keys the program itself reads are present, with empty containers accepted (characters/index.json#characters,creatures/index.json#creatures,scenes/index.json#scenes,props.json#props,costumes.json#costumes, the top-levelstyle_fragment_en/style_fragment_uistrings instyle.json, andcolor_script.json#episodes, plus the alternative keys the program also reads); every file and folder name underbible/is ASCII; and the change logbible/changelog.mdexists. Spellings that only some parts of the program read give a warning instead of a failure. Any failure exits non-zero;--jsongives machine-readable output.p0-bible-initinagents/workflow.yamlnow listsbible_skeleton_okandascii_filename, and the memory-bible role notes andagents/WORKFLOW.mdsay what the skeleton must contain and name the command. Existing projects are not changed; projects started before the creature registry, the two style strings or the colour-script format was introduced report those parts as failing. - Whitebox layout check: a scene's aspect-ratio check can be waived with a defect the user signed off (2026-10-22).
code/whitebox_layout_check.pyfails a scene whosedimensions_mX:Z differs from the top-view image by more than 2%. When the top view is a generated sketch the user has accepted as out of proportion (the model is built to the set card instead), that check failed on every run with no way to record the waiver. A scene'swhitebox.jsoncan now carrylayout_check_waiver: {"defect_id": "DEF-…", "items": ["aspect"]}. The check readsqa/defects/<defect_id>.jsonand counts the aspect item as waived only when that defect iswaived(orwaived_by_user), itswaiver.signed_byis the user (an agent orfull-autodoes not count) and itsscene_idis this scene. The report then lists the item underwaivedwith the defect ID, and the scene passes unless something else fails. Onlyaspectcan be waived; geometry outside the image still fails. When the conditions are not met, the aspect item still fails and says why the waiver was not accepted. The key is not compiled into the scene and does not count toward the reviewed-camera fingerprints, so adding it does not make reviewed shots or exported videos stale. The scene-modeling role notes anddocs/whitebox.mddescribe it for scenes whose aspect deviation the user has signed off (#154). - 全自动模式: a per-project checkbox on the 工作流预览 page that removes manual sign-off (2026-10-22). The summary row (the one with ✏️ 修改) gains a 全自动模式 checkbox on the right, off by default, with an i button explaining it. When checked (
POST /api/v1/projects/<project>/full-auto {enabled}, stored per project instate.json#full_auto), every sign-off card of that project is answered 签字 by the service as soon as it is created, and every other confirmation card gets its default option, with no pop-up or desktop notification; the producer is then woken with a full-auto sign-off receipt and reviews the gate as usual (gate JSON signerfull-auto). The existing pre-sign-off checks still apply (H3V missing prompts, H3W blocking whitebox issues, H3P dispatched prescriptions / post_ok FAIL): a blocked card stays open with the reason shown on it,dispatch.py --confirm … --signprints自动签字未通过:<reason>instead of waiting, and when no task is waiting on the card the producer is told to fix it and raise the sign-off again. Agent prompts get a 全自动模式 section only while the box is checked: wherever the spec says to ask or escalate to the user, the agent decides by the standard of getting the film finished (keep finalized settings and assets, safest option with least rework, report what it chose and why); the retry count setting still applies, and once retries run out the best existing version is kept and major/minor defects are waived (signed_by: full-auto); content-safety and copyright blockers are never waived, and the mode never changes settings, turns on paid options, races agents or switches engines. Checking the box immediately answers the cards already waiting, creates and signs any unlocked gate that has no card yet, and, if that did not wake the producer, asks it to check whether it is waiting on a user decision. Unchecking restores manual sign-off; automatic sign-offs already made stay. It does not replace 🤖 自动运行, which still decides whether an idle pipeline is resumed. - Ctrl+Enter adds a message to the task an agent is already running (2026-10-22). In the console, Enter still sends a new task (queued behind the agent's running one); Ctrl+Enter (⌘+Enter on macOS) sends the message into the running task instead (
POST /api/v1/runs/steer), where it reaches the model after the current tool call finishes. This works on the Claude Code, Pi, Agentics and OpenCode 2 engines: Claude Code runs now take their prompt on stdin (--input-format stream-json --replay-user-messages), Pi and Agentics runs use--mode rpc(added messages are sent assteerprompts), and OpenCode 2 receives them through the session inbox (opencode api --standalone,delivery: "steer"). On the other engines (Codex, Kimi Code, Grok Build, Antigravity, OpenCode 1.x) the message is merged into the agent's queued task, or sent as a new task if none is queued. A message sent while the task is still queued or starting is added to its prompt, and one that was not delivered before the task ended is sent as a new task (a task stopped by hand only gets a note). The chat marks each such message with where it went, and the input placeholder mentions the shortcut in all interface languages. - Auto backup on sign-off, on the 版本管理 page (2026-10-22). A new 💾 自动备份 card (off by default) takes a backup folder; when on, every sign-off (answering 签字 on any sign-off card, from the console, a preview page or Feishu) zips the whole project folder into that folder in the background as
<project>-<YYYYMMDD-HHMMSS>.zip. The zip wraps the project in a<project>/folder, so it can be restored with › 导入项目…. The setting is global (state.json#auto_backup, APIGET/POST /api/v1/config/auto-backup); the folder must be an absolute path outsidedata/projectsand is test-written on save. The card shows the last backup (or its error) and how many backups of the current project the folder holds; a failed backup also raises a system notification. Already-compressed media (video, images, audio) is stored without recompression; a sign-off during a running backup queues one more backup; old backups are never deleted automatically. 📁 选择… next to the folder field opens the system folder picker and saves the chosen folder: the desktop app uses its own dialog (pickDirectory, after the desktop app is rebuilt); otherwise the service opens it on its own computer (POST /api/v1/config/auto-backup/pick-dir: macOSchoose folder, WindowsFolderBrowserDialog, Linux zenity / kdialog). The button only appears when the page is opened from the same computer (localhost/127.0.0.1) and not on a desktop app connected to a remote service, so the dialog never pops up on another machine.
Changed
- Whitebox: applying the pending decisions accepted at the H3W sign-off no longer asks for a second sign-off (2026-10-22). Signing H3W (白模确认) accepts the recommended option, or the default, for each pending whitebox decision the user has not answered (recorded
by=sign:g6w). The producer's role notes anddocs/whitebox.mdsent the whitebox agent straight on to export after applying those, but the whitebox agent's own notes said to get H3W signed again first, so the two agents disagreed. All three now agree: decisions already on record at sign-off (accepted by signing, or answered before it) are applied and go straight to export. H3W is signed again only when the user makes a new decisio...
v1.0.40
Added
- New projects start by choosing a project type — 影视剧 (default), 音频配画, 数字人 or 混剪 — and the three former VideoAgents-Plugins workflows are merged into the main program (2026-10-20). The first step of the new-project wizard is now 项目类型, with icon cards and a short description of the selected type: 🎬 影视剧 (the novel-to-video workflow, unchanged and the default), 🎙️ 音频配画 (a narration recording plus its script gets AI-generated pictures cut to the audio's measured length; gates AVH1–AVH5), 🧑💼 数字人 (an audio master plus character photos becomes a lip-synced talking-head video; no sign-off gates) and ✂️ 混剪 (a script plus a local footage library, with optional narration audio, is illustrated with clips cut from the library; gates MH1–MH3); a fifth card, 🖥️ 演示视频, is described below. The last three were the audio-to-video / digital-human / mashup plugins and no longer need to be installed or enabled: the registry
services/runtime/project_types.pykeeps those names as type ids (filmis the default), their members move intoagents/15-audio-video,agents/16-mashup,agents/17-digital-humanandagents/11-qa/{av-sync-qa,mashup-qa,digital-human-sync-qa}(built-in agents 94 → 113), and their DAGs and guides intoagents/workflows/, which ships with the desktop app. The type is stored insettings.json#project({type, footage_libraries}), written at creation and locked afterwards; existing projects without it are inferred from what the plugin era left behind (av/audio_map.json→ 音频配画;audio_map/footage_source/beat_trackundermashup/→ 混剪;digital-human/input_manifest.json→ 数字人; otherwise 影视剧) and written back the next time project settings are saved. Project creation acceptsproject_typeandfootage_libraries(unknown type or missing library: 400) anddefer_init. Non-film projects force off narration, dialogue voices, sound split, NPC staging, whitebox, long takes and intro / outro, use minimal transitions with no episode close and auto episode length — those switches serve the novel-to-video workflow or conflict with "the master is the final soundtrack, never re-encoded". The script goes torefs/text/transcript.txt(for 混剪 alsonovel/original.txtas the p0 input). Withdefer_initthe wizard first uploads audio and photos intorefs/and then calls the newPOST /api/v1/projects/<p>/init(one-shot; a second call returns 409). For the new types the initialization message lists the materials found and what is missing, and the orchestrator reports and waits for the user to say start before dispatching along the type's DAG; its run prompt gets a 项目类型 section (authoritative DAG, inputs, footage libraries, dedicated members, main-DAG nodes to skip, gates), and built-in members reused by a type are told that the work order and DAG notes override the main workflow's defaults. Wizard steps differ by type (影视剧 5; 音频配画 4, without 视频节奏; 数字人 / 混剪 3), fields follow the type (narration audio / audio master, character photos, a footage-library multi-select listing only fully segmented libraries), and film-only output settings are hidden. The console's left panel lists only shared members and the current type's team; the 参考文件 page gains a 讲述音频 category (refs/audio/, audio files only; first in non-film projects, hidden in film projects when empty); the workflow preview page givesav/mx/dhnodes andga/gmgates their own lanes. On the 插件 page a package with one of these names is marked 已并入主程序, registers no members and has no enable / disable switch, and uploading one returns 400.agents/WORKFLOW.mdgains §11 on project types; newtests/test_project_types.py. The three types' complete workflows have not yet been run end to end in their merged form. - New project type 演示视频 (code-video): a language model writes the film as a web page rendered frame by frame, with no video-generation model; 代码作曲 and 代码音效 are added as the first-listed, new-install default music and sound-effect providers (2026-10-21). Meant for product launches, explainers, data stories and brand shorts (30–60 s works best): the user gives a topic or script, a style and a few settings; the team writes
codevideo/index.html, whosewindow.render(t)draws any frame (Canvas 2D / WebGL / three.js), and the host captures it in a headless browser (the desktop app's bundled Playwright Chromium) and encodes with ffmpeg. Narration uses TTS, music is composed in code and sound effects are synthesized at the frame of each on-screen event, so only TTS (and a music model, if chosen) costs money, and a change means editing code and re-rendering only the changed sections. Method and styles come from lemo-opuscar (github.com/lemomo-ai/lemo-opuscar, MIT), synced at a pinned commit byscripts/sync_lemo_opuscar.py: page library, audio tools, OFL font subsets, three.js r170 and 43 full styles; sample-instrument packs, HDRIs, textures and style demo sources download on demand. Host toolchainmodules/codevideo/+code/codevideo.py:codevideo/timeline.jsonis the single source of truth (section = scene = group) and is exported as a shot list and storyboard so the storyboard page, storyboard preview and post page show it as is;renderfingerprints each section (shared inputs, its file and imports, frame range, size, library version) so editing one section re-renders only that one;boardrenders key frames with the real drawing code;masterjoins sections with two-pass loudnorm (−14 LUFS, true peak −1.2) intoedit/ep01/final.mp4with subtitles, poster andbuild.sh;checkrequires deterministic frames (the same moment captured in forward and reverse order must match), no external requests and no page errors, and checks timeline, clips, loudness and credits; a style's demo source is released only afterTREATMENT.mdis written.settings.json#projectgainscode_style(required),storyboard_review(default on),narration,subtitles,length_s,fpsandmusic_source(codedefault |model|library). The DAGagents/workflows/codevideo.yaml(gates CVH1 storyboard, skipped when 先审故事板 is off, and CVH2 final) runs with a new team18-code-video/{film-director,scene-coder,code-composer,sound-designer}+11-qa/code-video-qa(118 built-in agents in 17 departments); the Reviser can editcodevideoobjects. The wizard's fifth card has 4 steps (项目类型 → 基础信息, optional assets filed into reference categories → 风格 → 输出设置). The style step offers 完整风格(43) (9 categories, 2D / 3D marks, online demos) and 轻量风格 · OPUSCAR 98(98), the style prompts of lemo-opuscar's OPUSCAR 98 (o98-01…o98-98, filtered by 10 decade chapters), each paired with 3 related full styles as technique references; the prompt is invariant, the director completes the rest inTREATMENT.md, and the original film's characters, plot and title are off limits. New 🖥️ 代码预览 page (/preview/code; top-bar icon only in these projects) plays the film page from a sidecar static server onWEB_PORT+2(another origin, CSP, sandboxed iframe) with scrubbing, section / shot / hit markers, the beat grid with BPM and line-arrow frame-step buttons; timestamped notes are assigned to section and shot and 📨 提交注释 sends them to the Reviser, and sections re-render as background jobs. In these projects the storyboard page keeps only notes, the post page allows only 音效与声音 recipes (picture recipes and clip editing return 400), and notes from the storyboard page and storyboard preview go to the code Reviser as timestamps. Withmusic_sourcemodelorlibrary, the music is beat-aligned:modules/codevideo/beats.py(numpy / scipy only) tracks tempo, beats and downbeats;codevideo.py music-fit(--track MUS-NNNNfrom the project music library, or--file) cuts a film-length piece starting on a downbeat (looping between downbeats with a 30 ms crossfade when short), writes a cue with its license toassets/audio/bgm/ep01/cue_sheet.jsonand reconciles the music library;snapmoves section boundaries to downbeats and cuts and hits to beats without changing the length (new nodecv2-beatsync, check stagebeats). New genconfigmusic.code(auto_fetchon) andsfx.codeare first-listed and the new-install defaults (sections already saved keep their provider);genmedia music|sfx --provider code --script <file>runs an agent-written script and writes.meta.jsonand.credits.json(sample attributions), free of charge. The 代码作曲 tab manages the five sample packs (auto-download switch, demo to audition); 代码音效 has an audition. New endpoints/api/v1/codevideo/packs…and/api/v1/codevideo/audio-demo/{kind}; the desktop runtime adds soundfile 0.13.1 and soxr 1.0.0;THIRD_PARTY_NOTICES.mdcredits lemo-opuscar, three.js, the fonts and OPUSCAR 98; guideagents/workflows/codevideo.md. A full agent run through the workflow and Windows rendering are not yet exercised. - 数字人 projects can use cloned voices instead of a recording (2026-10-20). Digital-human projects gain a 声音来源 setting (
settings.json#project.voice_source): 原始录音 (recording, the default and the behaviour of existing projects: a recorded conversation is the master) or 克隆声音 (clone: with no recording, upload one voice sample per speaker and write a script, and each line is synthesized in that speaker's sampled voice before the digital humans are made). The 参考文件 page gains a 克隆声音 category (refs/voices/, mp3 / wav / flac / m4a / aac / ogg only), asking for one clean 5–30 s recording per speaker with only that person talking, and only your own voice or voices you are authorized to use.modules/genmedia.py ttsgains--clone-from <sample>, which zero-shot clones the sample's timbre and ignores--voice/--character/ voiceprint cards. Agentics (a Voice Clone model whose profile acceptsreference_audios), ComfyUI (the Voice Clone workflow) and Volcengine Doubao Audio Generation 1.0 can clone;...
v1.0.39
Added
- Canvas (画板,
/preview/canvas), phase 1: circle-select editing, upscaling and crop / flip / rotate / scale of an existing image, with every version kept and one set as final (2026-10-10). A more precise way to change an image than ✏️ 修改: circle the places to change, write what to change, attach reference images the text can name with@图N, and pick the image provider and model for this page only. A 🖌 画板 button now follows ✏️ 修改 on scene images and shot plates (scene preview page), character and costume images, creature and prop images and storyboard sketches, and sits under the cover on 成片发布. The rule: edits, upscales and adjustments only enter that image's own history (assets/canvas/<flattened original path>.<sha8>/, which stations neither read nor write), and production is touched only by 设为最终版. An edit is sent in one of three ways: through an agent (default) — the new on-demand station 「画板修图师」 (agents/06-art/image-retouch, Smart Assignment low tier) looks at the image, writes the selections and the note into one English prompt and submits it withcode/canvas_edit.py submit; 直接发送 — the host fills a fixed English template with the text and generates without an agent; 发送前先看提示词 — the job waits, the prompt can be edited on the page, and the host generates once it is confirmed. 圈外锁定 (on by default when there is a selection) pastes only the selected area, expanded and feathered, back onto the base image; when the mean difference outside it exceeds 0.06 the version is tagged 「圈外漂移」, and 改用整图 saves the model's whole image as another version. Upscaling is run by the host without an agent, as 重绘放大 (an image model redraws from the base image as its only reference, with a fixed prompt) or 保真超分 (local Lanczos interpolation, or Fal's SeedVR2 / Topaz Precision / Real-ESRGAN / AuraSR / Bria upscalers); a model result that is not larger than the base counts as failed and is not padded by interpolation. Crop to selection, flips, rotate and scale are recorded as versions too. 设为最终版 lands by kind of image: a fixed-path image (character, costume, creature, prop, scene image, cover) has the version written back to its original path; a storyboard sketch also has its ledger entry set tomode=canvas; a shot plate keeps its original image and library entry, the version is registered as<key>_revN, and the shots that used the original (or an earlier canvas version) are repointed and their group prompts synced — registering without replacing is possible, and choosing the original version points the shots back. Before applying, the page lists the impact: which shots or group prompts use the image, and what follows (videos already generated do not change; the portrait library needs re-registering; the animatic needs re-rendering; the cover inside a publish package is a copy). Nothing downstream is re-run — a change recordruns/revisions/canvas-*.jsonis written when the image is in use and the version really changed — and ticking 「把这次改动发给修改师」 has the reviser update the setting text only. Because the canvas flips images, the ⇋ 翻转 button under each shot plate on the scene preview page is removed (the backend flip endpoint stays, with no page calling it). Spec:docs/image_canvas.md. Not exercised for real: no image was generated, so how well models follow the circled image, the 0.06 drift threshold, redraw-upscale sizes and the five Fal upscalers are untested; the retouch agent was never dispatched and the desktop app was not tried. Not done: true mask inpainting, outpainting, multiple candidates, entry buttons on the storyboard preview page (分镜预览) and on panoramas; a registered_revNcarries no master / grid9 mark, so episodes run later still auto-select the original plate. Restart the service to get the page (the buttons appear on refresh but lead to a 404 until then). - Scene links, phases 1 + 2: match cuts and relays between scenes are drafted at the script stage, disposed of one by one by the director, registered into the shot list by the host and written into both sides' group prompts (2026-10-10). A match cut needs the last image of one scene and the first image of the next designed as a pair, and both are decided by the script; by the storyboard stage they can only be forced together. Until now script transition lines were a bare
CUT TOor free text, nothing reconciled the director's transition list with them (of 8 script match cuts that mapped onto a shot-list boundary, 3 survived asmatch_cut), andmatch_cutwas a label with no matching sentence in either prompt. Phase 1: the scene-end transition line staysCUT TOby default; only when both ends are really written in the scene text, the link is one of seven whitelisted kinds (shape, action, same camera position, motion, sound, dialogue line, contrast; shape and action are trial kinds) and it joins the adjacent next scene does the line end with{衔接: 类型, 出: …, 入: …}(English anchors{link, out, in}).modules/scene_links.pyis the single parser for script transition lines (across all project copies, transition design now reads the transition line of 2,536 scenes instead of 241), and the checkscene_link_validincode/check_screenplay_events.pyfails on, among others, an unknown kind, a missing out or in, a link that is not to the adjacent next scene, andMATCH CUT/SMASH CUTwithout braces. The director's transition list must dispose of every link in one line, 「剧本衔接 Sxx→Syy:采纳 | 修改 | 弃用」 — adopt and modify name the transition type the link lands on (onlyhard_cut/match_cut/smash_cut/dissolve), drop and modify give a reason — checked by the newcode/check_scene_links.py(script_links_disposed;--listlists the links). The script preview page shows the kind, this scene's ending and the next scene's opening, with a 「试验」 tag on the trial kinds. Phase 2:transition_design.proposeregisters each adopted or modified link on the first group of the later scene astransition_in.link {kind, out, in, out_shot, in_shot, note, trial?, device?}and applies it toshot_listat once; a withdrawn link is removed at the next propose, a boundary already ruled on in the transition card stays as set (「剧本衔接(导演采纳)」 remains a candidate), and in minimal mode the H3A sign-off hook registers the links instead. In cinematic mode a motion relay automatically brings amotion_pair(not with whitebox on) and a sound or line relay a Jsound_bridge; classic and custom only offer them as candidates.code/sync_scene_links.py --writewrites one 「【场间衔接】」 sentence (Scene link:when the interface is not Chinese) into the previous group's last Shot paragraph and one into this group's Shot 1 paragraph, from a fixed sentence pair per kind; each sentence describes only its own shot, because the two videos are generated separately. New checks:transition_link_valid(part oftransition_ok),scene_link_bound(p7-prompt acceptance) andscript_links_landed(fails when an adopted link is missing from the shot list, its type differs, the registration is stale or a dropped link is left over). The transition card on the storyboard preview page (分镜预览) shows 「🔗 类型」, the director's disposition and a 「📜 剧本衔接」 tag. Existing projects: screenplays whosegenerated_atis before 2026-10-10 only get WARNs fromscene_link_valid(240 existing screenplays: 0 FAIL), and re-running the proposal on seven real episodes changed no shot list. Spec:docs/scene_links.md. Not done or verified: phase 3 (whitebox check by screen position, the previous group's last frame as a composition reference, picking the best-matching pair near the cut in editing); the screenwriter, director and prompt stations have not been dispatched for real under the new rules, and the effect of the link sentences on generated video is untested; the sound bridge that cinematic mode now adds has not been verified in a real project's final cut. Restart the service for the preview pages, the transition card and the H3A fallback; the check and sync CLIs work immediately. - NPC staging: nameless background people and foreground objects give scenes depth (2026-10-09). Shots can now be filled out with nameless NPC elements — passers-by, foreground objects — so that a scene has a foreground, a midground and a background. The switch sits on the scene: the script stage judges it, the storyboard places the NPCs shot by shot, and composition, whitebox and prompt only carry it out. The project-level master switch
output.npc_staging(auto= judged per scene, the default;off= all off) is a new NPC 参与构图 row in 输出设置 and in the new-project wizard. Inp5-breakdown, timeline-story writesscenes[].npc {on, density: sparse|medium|dense|null, reason}intoscript_breakdown.jsonfor every scene (new checknpc_judged, part ofcode/check_script_breakdown.py: skipped when the master switch is off, WARN only for breakdowns produced before 2026-10-09). On the script preview page and the storyboard page each scene header has a 🚶 chip to set 自动 / 开 / 关 and the density (POST /projects/<p>/episodes/<ep>/npc, stored in the host-ownedstory/episodes/<ep>/scene_npc.json, which re-analysis does not overwrite). The effective value is: master switch off > the user's value > the automatic judgment > not judged, which counts as off — so existing projects behave as before. Downstream: storyboard draft shots carrynpc[{layer: fg|mg|bg, what}]and each scene block annpc_appliedreceipt (checknpc_staging_applied; a scene whose receipt disagrees with the effective value is flagged 「分镜未按此设定」 on the storyboard page — changing the switch does not redo downstream work), and sketch prompts include the NPCs automatically; the shot list copiesnpc[](npc_shots_consistent); composition names the NPCs in the matchinglayers(npc_layers_bound); whitebox usesEXTRA-NPC-xxextras with the legend `anonymous NPC passer-by, not a named charact...
v1.0.38
Added
- Music library: themes, variations and a reuse quota (2026-10-07). With the library in place the music station had started scoring whole episodes by reuse alone: in one project episodes 7 and 8 took every cue from episode 6's ten tracks, one track was used five times, two tracks twice in the same episode, a 28-second opening cue was clipped to 6 seconds for a build-up beat, and not one reuse carried a reason. The rule said "reuse when something fits" and only new music had to be justified, so nothing was ever generated. The library is now two-tiered: a track with a
theme_idis a season theme (a motif that runs through the season, registered in the library's theme table with a name, what it stands for and an English motif description) and may be reused as is across episodes; a track without one is a one-off cue and stays in its episode. Each cue is now one of three things: reuse as is (use), a theme variation (variant --trackshows the base track's motif and prompt; the station regenerates the same motif with a different tempo, instrumentation, intensity or length, and the cue recordsvariant_of; the new track inherits the theme), or new music. A per-episode quota is enforced bymusic_library_synced: at most 40% of cues reused as is (at least one allowed), at least 30% new or variations, a track at most once per episode and in at most three episodes, theme tracks only, a reused cue at least 60% of the track's length, and the cue's intensity (the 0–1 figures inmoodorintensity) within 0.25 of the track's; reuse, variations and new music all need a reason inmusic_library_report.userefuses a one-off track, a track already reused in three episodes, or (with--need-duration) a cue shorter than 60% of the track, with exit code 2. New CLI commandstheme(list /--add),variant, andannotate --theme / --variant-of;search --theme. The 音乐库 page gains a 主题 column, a 复用集数 column (n/3, red when full), a variation badge, a theme filter and the quota in the toolbar. Episodes delivered before this change fail the check as they stand (episodes 7 and 8 of the project above); rescoring them is the user's call. Music SOUL, WORKFLOW Phase 8,workflow.yaml,code/README.mdand all 11 dictionaries updated; tests cover the quota rules. Restart the service for the page data. - Fal model discovery (2026-10-06). 生成模型 › 图像 / 视频 › Fal gains a 搜索 Fal 模型 box. It searches Fal's public model catalog by keyword (empty lists the popular ones), merges a model's task endpoints (text-to-video, image-to-video, reference-to-video, edit…) into one row, and 选用 fills the model field: models already in the built-in list are selected, others go into 自定义. Until now a model outside the built-in list was sent a fixed set of field names, which most endpoints reject (Veo 3.1 wants
duration: "8s", Kling 2.5 wants"5"andtail_image_url).genmedianow reads that endpoint's parameter list from the catalog and builds the request from it: only fields it accepts are sent, duration, resolution and aspect ratio use its closest allowed value (logged), the endpoint is chosen by input (including a separate first-last-frame endpoint when there is an end frame), and an input it cannot take (end frame, reference images, video or audio) fails with a clear error instead of being dropped. Models with a built-in mapping are unchanged; an endpoint the catalog does not list (a private app) or an unreachable catalog falls back to the old generic mapping. The catalog needs no key but rate-limits anonymous use, so the Fal key is sent when one is configured; endpoint lookups are cached for 24 hours. New modulemodules/fal_models.py, endpointGET /api/v1/providers/fal/models. Request shapes were checked against the live catalog; no paid generation was run with a discovered model. Restart the service to get the endpoint. - Fal jobs survive an interrupted run (2026-10-06). A Fal image, video or sound-effect job used to be lost if the
genmedia.pyprocess was killed while waiting (tool timeout, agent lifetime): the request id only went to the log, and running the command again submitted and billed a second job. The request id and its status/result URLs are now written todata/.videoagents/pending_tasks/as soon as the job is created, before polling starts, and removed once the result is downloaded. Running the same command again picks the unfinished job up instead of submitting a new one. "Same" means same output path, endpoint and request body; the seed and the signature part of presigned URLs are ignored, and a changed prompt or reference submits a new job. If the old job can no longer be queried, or is still unfinished six hours after submission, it is dropped and a new one is submitted.genmedia.py reclaim --output <path>now also works for Fal video jobs without--task-id; it only queries and downloads. Other channels are unchanged. Covered by tests with a fake queue; not yet run against the real Fal service. - Sound effect generation:
genmedia.py sfx(2026-10-06). The sound-effect and ambience stations were told to make a fallback patch when a defect ticket asks for one, but there was no way to generate it.python3 modules/genmedia.py sfx --prompt "<sound description>" --output <file.wav> [--duration s] [--loop] [--count 1-4]now produces it with ElevenLabs Sound Effects v2. There is no new settings tab: it uses the ElevenLabs key already entered for music or TTS (direct API, 0.5–30 s), and otherwise the Fal key entered for image or video (hosted endpoint, 0.5–22 s);--providerforces one.--loopreturns a seamlessly looping bed and leaves it untouched. Other sounds have leading and trailing silence trimmed (pauses in the middle are kept) and the peak normalised to -3 dBFS; this needs ffmpeg. Each file gets a.meta.jsonwith the source, the prompt and the measured duration and levels. Agents only call it when a defect ticket asks for a patch. Not yet run against a paid account. Restart the service for the agent instructions to pick it up. - Post page: letterbox bars to a final output aspect ratio (2026-10-06). 后期处理 → 包装 gains a 上下黑边 card under 花字: tick it and pick a final output aspect ratio (16:9, 9:16, 4:3, 3:4, 1:1;
output.letterbox_enabled/output.letterbox_aspect, off by default). When the final is rendered,finalize_episode.py assemblescales the picture to fit and pads it with black bars to that ratio, so a 2.35:1 film can ship as 16:9 and a 16:9 film as 9:16. The canvas keeps the cut's short side (2520×1080 becomes 1920×1080; 1920×1080 becomes 1080×1920). Production stays at the project aspect ratio: group clips and cuts never carry bars. The layout is recorded infinal_layout.json#letterbox,finalize_episode.py checkgainsletterbox_applied(fails when the setting changed and the final was not rendered again), and the fancy-text final sizes and anchors its captions to the picture area instead of the bars. Render the final again after changing the setting. - Output settings: cinema aspect ratio (2.35:1) (2026-10-06). 输出设置 → 输出画幅 (and the new-project wizard) gain a third preset, 电影画幅(2.35:1) (
output.aspect_preset: "cinema"). Image and video models only accept a fixed list of ratios, and their widescreen entry is 21:9 (≈2.33:1), so the project is produced at 21:9 end to end: agents pass--aspect 21:9, whitebox renders at 952×408, the 1080p master is 2520×1080, and newly generated anchor images use 2968×1272. Also fixes transition insert-clip first frames, which read a settings key that never existed and so were always 1920×1080 regardless of the project aspect (portrait projects now get 1080×1920). - Director's console: bulk approve and bulk answer from the top bar (2026-10-05). The "✓ Approved n/N" pill is now a menu with Approve all, which approves every group in the episode that has been through whitebox staging and is not yet approved (or whose approval went stale); groups still on an auto-inferred draft are skipped and reported. A new "⚠ Questions a/N" pill next to it shows how many of the episode's Agent questions have an answer (chosen, applied, or accepted with a group approval) out of the total; its menu has Pick recommended for all, which answers every unanswered question — blocking and advisory alike — with the Agent's recommended option, falling back to the provisional choice where no option is recommended, and leaving questions with neither for you to answer one by one. Answers you already gave are not overwritten, and the picks are applied when the episode is submitted, like any other answer. Note that approving a group accepts its whitebox as it stands, so answers that have not been applied yet give way to the approval — pick and submit first if you want the recommended options carried out. New endpoints:
POST /director/<ep>/approve-all,POST /whitebox/<ep>/issues/recommended. - Video prompt sign-off (H3V, DAG gate
g7p, per episode). Once every generation group's video prompt in an episode is written (p7-prompt), the pipeline now stops for a user sign-off before any anchor pack (p7-image) or group video (p7-video) is produced. Review the prompts (text plus reference images / videos / audio) on the Shot preview page; the episode row shows the sign-off state with "Sign off / Hold" buttons that answer the same card as the console. The host enforces it twice: signing is refused (409) while any group still has no video prompt, andgenmedia.py videorefuses to writeassets/clips/<ep>/grpNNN*.mp4while the episode'sg7pnode exists in the DAG and is not passed (video_prompt_signed,modules/prompt_gate.py). The sign-off releases the first run rather than freezing the prompts: rewriting individual groups afterwards (your own edits, the reviser, defect rework) does not require signing again — the page only notes how many groups changed since sign-off (`assets/prompts//prompt_signoff.j...
v1.0.37
Added
-
codex model dropdowns follow the official catalog. The codex model lists (top bar and per-agent model dialog) are now read from
codex debug modelsvia the newGET /api/v1/engines/codex/models(models withvisibility=list, sorted by official priority, cached for 5 minutes), so newly released codex models appear automatically once the installed codex CLI is new enough to receive them. If the CLI is missing or the call fails, the dropdown falls back to a built-in list and its tooltip shows the error. Smart Assignment tiers are unchanged and still set by hand. -
Checked fancy-text types are now expected to appear. In manual caption mode a checked type used to mean "allowed, not required", so the caption agent could silently drop a whole type (fengshen3 ep07: a creature appeared on screen but no creature name card was made although 「生物 / 妖兽名牌」 was checked). Now every checked type that has matching content in the episode (a creature's first appearance, a prop's first reveal, a faction's first showing, …) is expected to get at least one caption; if a type is left out, the reason must be written per type in the new top-level
type_skipsfield ofcaptions.json(e.g.{"creature_card": "no creature appears in this episode"}). A missing template is not a valid reason: the agent creates one or reuses a similar template. New design-stage machine checkcaption_types_covered(manual mode only; types unavailable for the project are not counted). The caption SOUL, the caption-styling skill, WORKFLOW §9A and the injected caption prompt are updated. Existing episodes are not re-run and will fail this check until their caption design is redone. -
Insert-friendly numbering for new projects. Projects created from now on number scenes, generation groups and shots in steps of ten —
S010,S020… /grp0010,grp0020… /sh0010,sh0020… — so a scene, group or shot can later be inserted between two existing ones (S011,grp0011,sh0011) without renumbering anything downstream. The scheme is stamped into the project'ssettings.json#numbering(step: 10) at creation and cannot be changed afterwards; the host injects a 「编号制:预留插入位」 section into every agent's run prompt for these projects only,genmedia'sgrpsh_id_3digitscheck expects four digits there, andcheck_generation_groups.py --proposenumbers its draft groups accordingly (newmodules/id_scheme.py). Existing projects have nonumberingblock and keepS01/grp001/sh001unchanged. -
Project music library. Every project now keeps a library of its score under
assets/audio/library/music/(index.json+MUS-NNNN.<ext>, newmodules/music_library.py). When the music workstation (09-audio/music,p8-music) delivers an episode, the tracks it added — newly generated ones and the user-provided ones it picked — are copied into the library together with their data (mood, genre, tempo, instruments, duration, generation prompt, license chain), and each cue of the episode is recorded as a use of its track (episode, cue, in/out, scene). Later episodes look in the library first: the workstation lists / searches it with the new host CLIcode/music_library.py(list,search,use,sync,annotate,add,check), reuses a fitting track withuse(the cue's license becomessource: library+track_idand carries the original license chain) and generates new music only when nothing fits, stating the reason per cue in the cue sheet'smusic_library_report. Selection order is now user music inrefs/music/→ project library → new generation. A track its source episode no longer uses after a rework is marked replaced and is not offered any more (the file stays). New machine checkmusic_library_syncedonp8-music; episodes delivered before this feature are backfilled and only get a reminder. Project settings → 「音乐库」 opens the new/music-librarypage: all tracks with playback, their data, source episode and the episodes / cues using them, filters by episode, source and keyword, and 「同步入库」 to backfill projects that already have scores (nothing is generated). New endpointsGET /api/v1/projects/{project}/previews/music-libraryandPOST /api/v1/projects/{project}/music-library/sync({ep?}); music and copyright SOULs, WORKFLOW Phase 8 andworkflow.yamlupdated; UI strings translated in all 11 dictionaries. Requires a service restart and a hard refresh. -
「+」attachment button on the console chat box and the preview pages' 「修改」 popup. A round 「+」 at the top-right corner of the input (the voice-input microphone, when enabled, sits below it at the bottom-right) (
apps/web/static/file-attach.js, shared byindex.htmlandedit-popup.js) lets the user pick local files to send along with the message. Nothing is uploaded: the agent runs on the same machine as the browser, so only the absolute paths are appended to the message as a trailing 「附件(本机文件绝对路径,请直接读取):\n- /abs/path」 paragraph (header follows the UI language) and the agent reads the files itself. Paths come from ① the desktop client's native open dialog (videoagentsDesktop.pickFiles, newdesktop:pick-filesIPC), ② in the browser, a native dialog opened by the web server on the host (POST /actions/pick-files: macOS osascript, Windows PowerShell, Linux zenity/kdialog; 409 while one is open, 501 when no dialog is available), or ③ a manual paste box (one absolute path per line; also via Shift+click, and used automatically for a remote backend or when no dialog can be shown). Selected files show as removable chips above the input; the console keeps them with the draft (localStoragewebui_draft_files) and hands them back if sending fails; the popup clears them on every open. Requires a service restart (new web-server endpoint) and a hard refresh; the desktop bridge takes effect with the next desktop build. -
Script preview: 「🗒 注释」 buttons and 「📨 提交注释」. Every 「✏️ 反馈」 button on the script preview page (whole episode, scene, each action / dialogue / narration / transition block, narration entries, hooks, event cards, pacing, trim suggestions, episode plan) now has a 「🗒 注释」 button next to it that opens the same note dialog as the storyboard page; notes are stored in
story/episodes/epNN/script_notes.jsonkeyed by a stable object id (*,S01,S01/b3,nar:ID,hook:ID,event:ID,pacing:S01,trim:S01/n,plan) together with the button's location text (object description + file path), shown in yellow next to the object and in the button tooltip. 「📨 提交注释」 at the right end of the episode row sends all of the episode's notes to the reviser as one revision order (kind=script, files = the episode's screenplay / narration / hooks / pacing / breakdown plusstory/events.json/story/episode_plan.jsonwhen referenced) and clears the file once the run is dispatched. New endpointsPOST /api/v1/projects/{project}/script/{ep}/notes({key, text, label?}, empty text deletes) andPOST …/script/{ep}/notes/submit; the reviser SOUL lists the file as must-read for script-layer objects. Requires a service restart and a hard refresh. -
Storyboard page and storyboard preview: 「📨 提交注释」 submits every note of the episode to the reviser in one go. A new button at the right end of the episode row (both pages) collects all of the episode's notes — the storyboard page's whole-episode / scene / draft-shot notes from
directing/epNN/storyboard_notes.json, or the storyboard preview's per-group director notes fromassets/notes/epNN/<grp>.json— and the host composes a single revision order for the reviser (kind=storyboardorkind=group), listing each note together with the object it is attached to (scene number / location / scene id; draft shot order, content summary and final shot ids; for groups: scene, shot ids, duration, beat and the group-prompt path; stale notes whose object is gone are marked as such). Once the run is dispatched the notes are cleared: the storyboard notes file is deleted and each group note is removed the same way as 「清空保存」 (its injectedDirector's notesentence leaves thevideo_prompt). The button shows the note count, is disabled when the episode has none, asks for confirmation, and the order text follows the UI language (Chinese / English). New endpointsPOST /api/v1/projects/{project}/board/{ep}/notes/submitandPOST /api/v1/storyboard/notes/submit({project, ep}); reviser SOUL and WORKFLOW §5 updated. Requires a service restart and a hard refresh. -
Transition design stage 2: the
07-directing/transition-designworkstation and generated establishing shots. A new per-episode DAG nodep6-transition-design(conditiontransition_design_enabled= effective transition mode ≠ minimal; after shot-planning / continuity / plates, feeding the H3A gate) runs the host CLIcode/transition_design.py proposeand then reviews every group boundary: it checks the change class against the director's transition list and the screenplay's 「转场:」 lines, fixes inferred card text withcard, and picks between candidates with the newdesign --alt N | --design '<json>' --note …verb — proposals stayproposed; accepting is the user's decision on the storyboard preview's transition cards, and signing H3A now accepts every remaining proposal intoshot_list(the sign card shows the pending count, same precedent as H3W). Boundaries decided by the user or the director's list are locked against the workstation (feedbackonly), and re-runningproposeno longer overwrites a workstation design. When the mode allows generative transitions (cinematic / custom), 「换场景 → 定场空镜 + 叠地点字幕」 is now a real image-to-video establishing clip (source.mode = i2v): the host renders the first-frame still from the scene panorama anchor or the first shot's plate (clips --prepare) and composes the prompt; because this involves video generation, the clip itself is produced in Phase 7 by the new per-episode node `...
v1.0.36
Added
-
Transition design between shot groups (
docs/transition_design.md, WORKFLOW §9C "过场设计"). Group boundaries become first-class objects: a per-episode design ledgerdirecting/epNN/transition_design.jsondiagnoses every boundary (scene change / time jump / cast / lighting / narrative-block edge, the screenplay's转场:line, the director's packaging notes), proposes a design per the project's transition mode and keeps the user's decisions;shot_list.transition_instays the single final field and is only written back by the host (code/transition_design.py apply).transition_ingainsjoin.style(a controlled xfade style family for dissolves: wipe / blur_through / zoom_through / iris / pixelize / fadegrays),inserts[](boundary insert segments:title_card,establishingfrom the scene panorama (yaw sweep) or the master plate (Ken Burns),timelapsebetween two lighting schemes of the same anchor,bridgefor a generated clip; 0.5–4 s each, ≤ 6 s per boundary, per-segmentjoin_outseam and audio policy) andoverlay_card(location/time text over the first seconds of the incoming group, no length change).render_transitions.pygainsbuild(renders the segments and overlay PNGs by design+asset fingerprint intoedit/epNN/transitions/<B-from-to>/) andpreview(boundary preview clip: 2 s + transition + 2 s through the same filter chain as the final cut); inserts ride the existing pad path (inserted at the boundary, film lengthens by the sum, sametimemaptable for audio/subtitles) and the check gainsinsert_budget_ok,inserts_builtandinsert_frames_verified. The storyboard page shows a transition card between every two groups (collapsed to a thin line when nothing changes and it is a hard cut): diagnosis tags, the design chain (previous tail frame → seam → inserts → seam → next head frame), preview, accept / candidates / keep hard cut / edit text / feedback, plus a summary bar with the episode-level mode dropdown and the insert budget. Transition mode lives in the Video Rhythm dialog and the new-project wizard (settings.json#transitions):minimal(status quo),classic(default for new projects; existing projects without the section areminimal),cinematic,custom(the four sub-options — explanatory cards, time budget %, generative transitions, establishing first shot — are only shown for custom; presets derive them). The mode takes precedence over prose statements such as "no title cards" in the director's plan. The post page transition recipe acceptsfade_whiteand a dissolve seam style and keeps inserts accepted on the storyboard page. All 11 language dictionaries updated. -
Audio mix follows adopted post-production versions (
code/mix_basis.py,modules/mix_manifest.py, WORKFLOW §8B ④).p8-mixused to read only the v0 master clips, so cut-outs / slow motion / inserted holds adopted on the Post page could only be applied afterwards by hard-slicing the finished mix along the timemap (BGM jumping at cut points, narration lines cut mid-sentence, music slowed together with slow motion). The mixing agent now takes its per-group sources frommix_basis.py sources(the group's current adopted version, otherwise the master; with measured durations, post-edit start times and the version'stime_ops) and stampsassets/audio/final/epNN.mix.jsonon delivery.post_apply.py checkgainsmix_basis_currentandfinalize_episode.pyconsults the manifest: when it matches the current adopted pointers thepost_versionstimemap layer is no longer applied to the audio track / subtitles (boundary pads still are); a stale manifest whose mix already carries post-edit timing failspost_ok(H3P refuses to sign) and refuses to assemble untilp8-mixis re-run; projects without a manifest keep the previous remap behaviour. -
Unified upscale settings (
genconfig.upscale, Generation Models page → "🔍 Upscale" tab under Digital Human): the upscale provider is now chosen explicitly and no longer follows the video provider. Providers:ffmpeg(built-in non-AI interpolation, default; filter / crf / preset),volcengine(Seedance 2.5 Draft mode: when active, Ark Seedance 2.5 groups generated at 480p are submitted withdraft=trueand the draft task id is recorded ingrpNNN.meta.json#draft_task; upscaling then asks Ark to render the 1080p final from that id — 7-day validity, final resolution must be 1080p),minimax(Regenerate-2K with its own region / API key on the tab, model fixed to Regenerate-2K, applicability conditions listed on the tab),comfyui(SeedVR2-class workflows with their own connection andcomfy/scale-*templates; the bundled template was renamedcomfy/scale-seedvr2-api.json). There is deliberately no fallback: when the chosen provider fails preflight or errors, the upscale task fails and is reported to the user (selectingffmpegis the explicit way to ask for interpolation).genmedia.py upscaleroutes on this section only, auto-rescales 2K/1080p outputs to the delivery size, and merges anupscale{provider, method, params, source, target…}block into the clip's meta.json. -
Final resolution 2K option in Output Settings (project settings and the new-project wizard).
-
Host artifact check for upscales (
code/check_upscale_artifacts.py): interpolation outputs are judged by round-trip halo / smear / flicker; generative outputs (SeedVR2 / MiniMax / Draft-mode finals) by flicker + downsample-to-source SSIM, so real super-resolution is no longer failed by the halo detector. -
Publish page (
/preview/videos) now lists every group clip with its upscale method tag (interpolated / AI upscale / not upscaled) read from meta.json.
Changed
-
codex / pi engines gain
gpt-6-solandgpt-6-luna. Both appear at the top of the codex model dropdowns (top bar and per-agent model dialog); the pi dropdown keeps listing whateverpi --list-modelsreturns. Smart Assignment for both engines now resolves the high tier togpt-6-soland the low tier togpt-6-luna(codex: wasgpt-6-astra/gpt-5.6-terra; pi: wasopenai-codex/gpt-5.6-sol/openai-codex/gpt-5.6-terra). The tier is resolved at dispatch time, so existing installs on a smart policy pick it up after a restart; the top-bar tooltips and all 11 i18n dictionaries are updated. -
Post page: groups with new versions pending review are now obvious. The left group list shows a yellow
v{n} pending reviewbadge (plus a yellow edge bar) on any group that has a shot-editing / import / insert-hold version newer than its current pointer, a new Pending review filter lists them, and the defect / dispatched dots moved from the second line to the group-id line so they are no longer clipped by the status box. The right column gets a highlighted bar above Shot editing withCompare v{n}(A|B against the current version) and a yellowSet v{n} currentbutton, so adopting a cut no longer requires opening the collapsed Shot editing panel. All 11 language dictionaries updated. -
Output Settings: "Generate dialogue speech" is mandatory in post-production dubbing mode. In the project Output Settings dialog and the new-project wizard, choosing Post-production dubbing for Dialogue voice ticks Generate dialogue speech and locks it (a note says it is required in this mode); switching back to Native video audio unlocks it. The server normalises the setting on save (
output.dialogue_voice=dubbingalways storesoutput.dialogue_tts=true, including API calls and re-saved legacy projects),modules/dialogue_tts.enabled()treats dubbing projects as enabled even before they are re-saved, and the agent role prompt no longer describes a dubbing-without-library branch. All 11 language dictionaries updated. -
Agents no longer run local speech recognition on their own. Only the transcription workstations (
09-audio/audio-transcription, captionspeech-align, digital-humandh0-transcribe, mashup alignment) may call faster-whisper /modules/transcription.py; every other agent is denied by thePreToolUsehook (.claude/hooks/orchestrator_guard.py) and by the shared runtime discipline, so a video-generation agent can no longer download Whisper weights just to "verify the dialogue track" after a clip is rendered. Explicit user requests go through the transcription agent (or a host-levelVIDEOAGENTS_ALLOW_ASR=1). -
The upscale agent SOUL and WORKFLOW §7B gain a hard rule: upscaling is only allowed through
modules/genmedia.py upscale; agents must not hand-write ffmpeg scaling, bypass the routing, or reuse legacy per-project upscale scripts. The MiniMax Regenerate-2K skill injection was retired (the skill file becameagents/08-video-gen/upscale/docs/minimax-regenerate-2k.md); selectingminimaxon the Upscale tab is the only switch. -
Shot timing in video prompts (
shot_timing_bound,code/sync_shot_timing.py): each shot'sduration_sfromshot_list.jsonis now written into the group video prompt in the effective model's official form. Seedance 2.5 / Wan 3.0 get continuous integer-second segments (0-2秒:, sub-second cuts merged as8-10秒(Shot 5–Shot 8):;0-2s:on non-Chinese UIs) on the first shot of each segment; MiniMax H3 gets official cut timestampsAt MM:SS.mmm,on Shot 2+; Seedance 2.0 stays untagged per its official guide (stale tags are stripped). The sync is idempotent (--write, original prompt backed up once) and the check enforces presence, continuity, the last segment ending atround(total_duration_s), andΣ duration_s == total_duration_s. Wired into the p7-prompt validation list and the prompt agent's SOUL/runtime contract. -
Long take › Join method (
duration.long_take_mode, shown in the new-project wizard and the Duration Settings dialog only while Long take is on):last_frame(default) chains every same-scene group boundary on the previous group's last-frame screenshot;tail_videochains on t...
v1.0.35
Added
- Project dropdown › Import Project… (above "New Project…"): pick a
.zipof a project folder (either the folder itself or its contents at the zip root); the host streams it to disk, extracts it intodata/projects/<name>/(name = the zip's top-level folder, else the file name; a clashing name gets a-2/-3suffix; path-traversal entries and__MACOSX/.DS_Storenoise are rejected or dropped) and the console switches to the new project.POST /api/v1/projects/import?filename=…&name=…with the raw zip as the body. - Output settings › Background plate mode (
output.plate_mode, shown only when whitebox is on; in the new-project wizard and in project settings):pano(default) keeps the existing flow — panorama anchors planned from whitebox camera positions, panoramas re-projected per shot direction and regenerated;worldlets you pick the anchor yourself on the scene preview page, generate a world model (World Labs Marble) from that panorama, andrender_shot_plates.pythen screenshots the world model per master-camera direction (modules/worldlabs.py#render_world_views, headless Chromium + Spark) as the reference for the regenerated plate. Per-scene override in the scene preview "Shot background plates" panel (POST /projects/<p>/scenes/<sid>/plates/plate-mode, stored inplates/index.json#mode). Scenes in world mode without a world model stop the chain with exit code 4[world_missing]; the world model is never generated automatically. The "World model" panel now sits above "Shot background plates" on the scene preview page. - Settings › Advanced › Diagnostic Data › Issue feedback (on by default): when an agent confirms during a run that a problem is a defect in the host code, or that the host needs a new feature, it files an issue with
code/report_issue.py; the host scrubs it (paths, project names, keys), de-duplicates it by signature and lists it in the dialog, where Submit in browser opens a pre-filled GitHub "new issue" page for you to confirm (GitHub does not accept anonymous issues, so nothing is posted without you). The Diagnostic Data menu item shows the number of issues waiting. Headless setups can set the environment variableVIDEOAGENTS_GITHUB_TOKEN(classic token,public_repo) to let the host publish directly. - Scene preview: 360° panorama viewer — clicking a rendered panorama now opens a draggable 360° view (toggle back to the flat image); the anchor map drawn on the top view can be zoomed and panned.
- Storyboard preview: 📍 "View set" button per shot (whitebox on): jumps that group's whitebox timeline to the shot's start without playing; shown only for shots that have a whitebox camera.
- Live page: local ComfyUI channel next to Fal — a prompt is required and reference images are not used on ComfyUI; new
FastH3 VSA T2VAworkflow template and model catalogue. The list of linking modes (last-frame linking, no linking, …) now follows the selected model. - Scene panoramas:
render_scene_panos.py --adoptalso accepts.redo-*archives (the previous official panorama archived by--redo), so a worse re-render can be rolled back without paying for a new one.
Removed
- Diagnostic Data: local event collection, lesson cards (
runs/<task_id>/lesson.md) and the diagnostic bundle export (modules/diagnostics.py, the/diagnostics*endpoints, thediagnostics_enabledsetting). The Debug mode switch is kept. Existing files underdata/.videoagents/telemetry/are no longer read and can be deleted.
Changed
- Desktop: the default language-model engine on first launch is now Claude (model = smart allocation), the same as the web console; it used to be DeepAgents / Agentics.
- Host-generated text follows the UI language: gate / guard messages, agent receipts, whitebox issue text, engine status, the digital-human panel, the scene image panel and the background-plate machine sentences are Chinese on a Chinese UI and English on every other language; the 11 UI dictionaries were completed for these areas.
- Scene preview page is laid out in sections (panorama, world model, background plates, whitebox, …).
- Storyboard preview: the whitebox issues panel is collapsed by default and keeps the open state once you expand it.
- Scene panoramas: anchor placement and coverage — the anchor height is now the standing surface plus eye height (anchors on raised whitebox blocks no longer end up inside solid volumes, anchors over water are handled); the service radius is scaled from the top-view width and relaxed per indoor / outdoor anchor (mixed scenes included); each anchor is classified indoor / outdoor so an indoor anchor no longer renders as an outdoor / sky-visible panorama; open exteriors get panorama projection cues; a parent anchor whose whitebox-consistency check is WARN is not used as the chained reference.
Fixed
- "Hold" on a sign-off card could be treated as a sign-off when the UI language was not Chinese. The host, the waiting
dispatch.pyand the producer's rules all compare the raw answer with the Chinese keys签字/暂缓; when the producer built a sign-off card with translated buttons (--options "Sign off,Hold") the answerHoldmatched neither and was read as approval. The host now normalizes options, defaults and answers back to the canonical keys (all 11 UI dictionaries plus common synonyms:Sign off/Hold,Rerun/Skip,Freigeben/Zurückstellen,承認/保留, …) on card creation and on every answer path (console popup, storyboard / post / director pages, Feishu cards), an empty sign-off answer is rejected instead of defaulting to签字, and the producer rules state that only an exact签字counts as approval. - Screenplay / dialogue / narration files written in a non-Chinese output language no longer parse as empty. The host parsers (script breakdown, dialogue fit, INT/EXT registry check, event-treatment check, storyboard narration placement) keyed on Chinese labels such as
[事件]/[出场]/[时长],动作:,转场:,旁白候选,本场无对白,定稿. A fixed anchor contract (docs/screenplay_anchors.md) now defines an English canonical form for every anchor ([EVENTS]/[CAST]/[DURATION],ACTION:,TRANSITION:or a bareCUT TO:,TIME:/SOUND:/SFX:/MUSIC:,[NARRATION (…)]:,[NO DIALOGUE],[NO NARRATION],- **final**:,INT./EXT./INTERIOR/EXTERIOR,scene start/end of scene), the scene heading's last field is read as the time of day by position in any language, English speaker names may contain spaces, and the writing agents' rules tell them to use exactly this form when the output language is not Chinese. Existing Chinese screenplays parse as before. - Seedance 2.5 background-plate machine sentences now follow the UI language. The host-written
【场景】slot block and the per-shot "场景激活:/本镜画内…/构图层次:" sentences thatsync_shot_plates.py --writeinjects intovideo_promptwere always Chinese, even inside an English prompt; they are now written in English (【Scene】 … reference [Image N],Scene activation: use Scene A ([Image 2]); do not use …,In frame left to right:,Composition layers:) whenever the UI language is not Chinese. Both wordings are recognised byshot_plate_bound, both are stripped and rewritten on the next--writeso switching the UI language leaves no leftovers, and aShot N|title.heading ending in an English period is now accepted as a shot heading. - Other host checks and parsers that assumed Chinese text (found in the same audit): the reviser's
## 变更记录report section is now recognised under its English and other UI-language headings (## Change log, …), so downstream dirty-marking and stale-signature rebuilds no longer silently drop when the report is written in English; the Seedance 2.5 structure check accepts a fixed English label set (【Characters】/【Action & sound】/Use:/Not used:/【Unused assets】/【Consistency】) next to the official Chinese labels, and the prompt rules list them; sign-off cards bind to the right DAG gate from an English question (H3W … (ep06)) even when several episodes' gates are open; gate episode numbers, screenplay narration anchors (scene start/end of scene),dialogue.md**final**lines and table headers, voice-card negations (avoid …), and publishing lint values with half-width parentheses are read in English as well. On the web UI, the storyboard prompt editor and the copy button now use the storedvideo_promptinstead of reading back page text the UI dictionary may have rewritten, screenplay cells on the script preview are excluded from dictionary translation so key-point anchors keep the original text, edit buttons carry the episode indata-epinstead of scraping it from a translated label, director-console note targets store the id rather than a translated label, and the storyboard redraw marker is no longer part of a translatable string. - Run-log progress line and tool receipts were always Chinese regardless of the UI language ("💭 思考中…", "⚙ 执行工具中…", "⏳ 等待模型下一步…", "✗ 工具报错" …). These are host status strings pushed by the runtime over the
progress/toolSSE events; they now have entries in all 11 UI dictionaries, and the variable parts (tool name, argument size, thinking-token estimate) are placed after the fixed text so the prefix rule translates the whole line. - Scene panoramas: the column ↔ yaw formula was inverted (panoramas came out facing the wrong way), panoramas were sometimes rendered outside the set, and a mis-classified panorama could pass the check.
- Background plates: people appeared in empty-set plates (Ark merges the negative prompt into the positive text) — person words are filtered from plate prompts; the layout PNG no longer grows too large after a direction change; a plate prompt rejected by Ark's text pre-check as sensitive content (two style sentences becoming adjacent once the subject clause is removed) is rewritten.
- **Director console:...
v1.0.34
Added
- Generation-model settings › TTS › Agentics: separate Voice Design and Voice Clone profiles (
tts.agentics.design, defaultqwen3tts-voicedesign;tts.agentics.clone, defaultqwen3tts-clone), mirroring the ComfyUI TTS channel's two workflows and the image channel's text-to-image / image-to-image pair.genmedia ttsuses the Voice Design profile when the output is a voice sample (*_voiceprint.*), sending a voice description assembled from the character'svoice.json(narrator: voice card /--instructions) as the new contract parameterinstruct— the same name as the description input of the Qwen3-TTS VoiceDesign node that the RunningHub direct-binding targets (voice_instruction/voice_description/instructionsare accepted as aliases; whichever the profile declares is sent); every other line uses the Voice Clone profile, whose reference audio now prefers the project's frozen sampleassets/audio/voice/refs/<CHAR>[_<variant>]_voiceprint.mp3before the TimbreModel auto-pick. A Voice Design profile that declares no description parameter falls back to Voice Clone with a stderr note. A legacy singleprofile_codeis migrated to both sides; an empty value falls back to the defaults.genmedia infoprints both sides for the two-profile Agentics channels. - Generation-model settings › TTS › ComfyUI: two workflows — Voice Design and Voice Clone (mirrors the image channel's text-to-image / image-to-image pair). The main workflow (
workflow/rh_workflow_id) is now labelled Voice Clone (voice sample + dialogue text → speech); a new second selector (design_workflow/rh_design_workflow_id) is Voice Design (a text description of the voice → a voice sample, no reference audio).genmedia ttschooses by purpose: an output file named*_voiceprint.*(a character / narrator voice sample) uses Voice Design with a description assembled from the character'svoice.jsonacoustic fields (narrator: voice card /--instructions), everything else uses Voice Clone with the project's frozen sampleassets/audio/voice/refs/<CHAR>[_<variant>]_voiceprint.mp3as the reference, falling back to the TimbreModel auto-pick (with a stderr hint) when the project has no sample yet. With no Voice Design workflow configured the behaviour is unchanged. RunningHub workflows without placeholders are bound directly (dialogue text,instruct/voice_instructiondescription slot, seed; a wiredLoadAudioin a design workflow is rejected); local / Comfy Cloud templates use the new{{VOICE_DESC}}placeholder. The TTS direct-binding also acceptstarget_textas the dialogue slot (Qwen3-TTS clone node). - ComfyUI templates for local / Comfy Cloud: Krea 2 Turbo, Qwen-Image-Edit 2511, Ideogram 4, InfiniteTalk fp8 —
comfy/image-krea2-turbo-api.json(text-to-image),comfy/image-krea2-turbo-styleref-api.json(1–3 style references, needs the officialkrea2_style_referenceLoRA; does not preserve identity),comfy/image-qwen-image-edit-2511-ref3-api.json(1–3 identity / layout references, Lightning 4 steps),comfy/image-ideogram4-int8-api.json(text-to-image, Quality preset; non-commercial weights; may return a model-drawn "blocked by safety filter" card while the job succeeds) andcomfy/digitalhuman-infinitetalk-fp8-lightx2v-api.json(single speaker, fp8 + lightx2v 4-step LoRA, portrait aspect kept), each with a bilingual.md. New image placeholders{{GEN_WIDTH}}/{{GEN_HEIGHT}}: the requested aspect ratio scaled down to at most 1.6 MP (multiples of 16), for models whose native resolution is below the 2560×1440 platform spec — templates generate atGEN_*and upscale toWIDTH×HEIGHTwith a finalImageScale, the same policy the RunningHub direct-binding already applied. - ComfyUI templates for local / Comfy Cloud: MiniMax Music 3 and Qwen3-TTS —
comfy/music-minimax-music3-api.json(native ComfyUI nodes, Apache 2.0 weights; the requested duration is an upper bound and the piece may come back shorter),comfy/tts-qwen3tts-clone-api.json(Voice Clone slot) andcomfy/tts-qwen3tts-voicedesign-api.json(Voice Design slot, new{{VOICE_DESC}}placeholder; both need theflybirdxx/ComfyUI-Qwen-TTSnode pack), each with a bilingual.md. - ComfyUI image channel: FLUX.2 [dev] templates for local / Comfy Cloud —
comfy/image-flux2-dev-fp8-api.json(text-to-image) andcomfy/image-flux2-dev-fp8-ref10-api.json(1–10 reference images via a chainedReferenceLatentrow per image), each with a bilingual.md.genmedia imagenow accepts several--refon local / Comfy Cloud when the reference workflow has more than oneLoadImage: references are bound in order and every unused slot is removed as a whole chain (the same logic now also covers RunningHub workflows built this way, which used to fail unless all slots were filled). Single-image img2img templates keep the one---reflimit. The storyboard-sketch reference capacity follows the template'sLoadImagecount in all three run modes. FLUX.2 [dev] weights are non-commercial — confirm the licence before commercial use. - Defect tickets page (Project settings › Defect tickets,
/defects): defect tickets moved out of the release page into their own page; "Handle" dispatches the ticket to the executive producer through the edit popup. - Hand-drawn canvas: "✨ AI refine" checkbox (on by default, shared by storyboard sketches and storyboard reference images): checked, the drawing is redrawn by the image model (falling back to the original on failure); unchecked, the original drawing is used as is.
- Storyboard sketches: every image channel can use character reference images — sketches pass character sheets whenever the configured image-to-image profile / workflow accepts reference images (capacity follows the template), instead of only on selected channels.
- Scene preview: top-view option for the whitebox viewer (11 languages); the whitebox preview now opens in the orbiting view by default.
- Desktop: Window › New Window.
Changed
- Generation-model settings › Image › Agentics: the default profiles are now
flux2-dev-t2i(text-to-image, wasideogram-4-t2i) andflux2-dev-i2i-10ref(image-to-image with up to 10 reference images, wasqwen-image-i2i). - Generation-model settings › Language model / DeepAgents › Agentics: the default model is now
z-ai/glm-5.3(wasz-ai/glm-5.3-flash). - Generation-model settings › Music › Agentics: default profile is now
minimax-music-3(was empty, i.e. the first music profile in the service catalogue). A saved config whose Agentics music profile was never picked (empty) falls back to this default. Note that MiniMax Music 3 treats the requested duration as an upper bound and may return a shorter piece. - Agentics image channel: negative prompts on profiles without a
negative_promptparameter are merged into the positive prompt asExclude from the image: …(same wording as the RunningHub channel), with a stderr note, instead of being dropped. - RunningHub image-to-image templates:
LoadImagenodes are bound in reference order ("which reference image"), not node-id order. - Director console: layout rework; clicking an object in the left list or the viewport now updates the object of the pending edit in "My changes" consistently; approving a group waives that group's unanswered whitebox issues, so the pipeline no longer stops on them.
- Whitebox identity colours: creatures and mounts get their own fixed colour for the whole episode instead of sharing one with a registered character or their rider.
- Post-processing page: the left panel groups shot groups by scene.
Fixed
- Director console › edit queue: answering an agent question no longer reloads the page on every click.
v1.0.33
Changed
- Groups without a whitebox plan no longer auto-play a whitebox draft: in the director console, scene preview and storyboard preview an unplanned group shows a placeholder instead of silently playing a host-derived draft; drafts stay view-only with a watermark.
Fixed
- Director console no longer fails to open when the first episode has no data: an episode without a shot list now shows a "no shot list" notice and lets you switch to an episode that has one (11 languages).
- Desktop: Generation Models → Image model → Agentics raised an error on save: the empty-model check read a single select that no longer exists now that Agentics image has separate text-to-image / image-to-image profiles.
- Desktop: the DeepAgents engine (the desktop default, Agentics channel) failed to start with "DeepAgents Python runtime not found …
backend/.venv-deepagents/bin/python": the bundled Python runtime did not ship thedeepagentsstack, so the interpreter lookup fell through to a project-root venv that never exists inside the app bundle.apps/desktop/runtime-requirements.innow pinsdeepagents,langchain-openaiandlanggraph-checkpoint-sqlite(lock regenerated — pure additions, no existing pin changed; about +135 MB unpacked), andbuild_runtime.pyimport-checks them. The desktop app picks the new runtime up automatically on launch (lock hash mismatch → runtime update).