Skip to content

Releases: AgenticsWorld/VideoAgents

v1.0.42

Choose a tag to compare

@github-actions github-actions released this 23 Oct 01:10

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.json and comfy/video-seedance2_0_r2v-cloud-only.json, with their .md docs, no longer ship, so they are gone from the ComfyUI workflow list on the 生成模型 page. The handling for workflows built on ByteDance2ReferenceNode is 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.json or the final result event of its run_id session log. So most tasks showed no time (many DAG nodes have no run_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 old meta.json files 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 in runtime.sqlite3) that belong to it. A run belongs to a task when the node lists it in run_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 lists grpNNN or grpNNN–grpMMM, the run goes to those instances; a change-order suffix such as -B11R goes to the base node. A run that belongs to k tasks is split k ways. Producer sessions are not counted toward any task. meta.json and 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 with ClosedEndpoint. 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 adds doubao-seedream-5-0-flash-260915 (same features as 5.0 Pro, faster and cheaper) and doubao-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 adds dola-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-20260415 is not added on BytePlus, because BytePlus is not retiring seedream-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 .exe on 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 made instruction the official name of the TTS voice-description parameter. The client only recognised instruct / voice_instruction / voice_description / instructions. It treated a profile that declares instruction as having no description parameter, fell back to Voice Clone and could not produce the first voice sample. instruction is 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 maps instruction.
  • 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_images and the speech as reference_audios. The avatar image now goes to avatar_image and the speech to driving_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 requires duration, it is now the exact audio length in seconds, no longer rounded up. code/check_digitalhuman.py also accepts agentics as 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-whisper cannot be imported, modules/transcription.py and its doctor command now name the interpreter (sys.executable) and give the import error, instead of only asking for a reinstall. doctor also reports python_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's PATH, so python3 in 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 exec icon 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 generic exec icon 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 records PIL 默认字体 as the font in that case.

v1.0.41

Choose a tag to compare

@github-actions github-actions released this 22 Oct 15:44

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's code/ (five different versions) or marked the check as not run. The new command splits the group clip by speaker (from the clip's boundary_map and the shot list's on-screen lines), compares each speaker's median pitch with that speaker's own voice sample from the group prompt's audio_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; --json gives machine-readable output. It only judges a group whose audio_plan is dialogue, whose project has 对白配音 = 视频原声 and whose prompt has audio_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 in agents/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-level style_fragment_en / style_fragment_ui strings in style.json, and color_script.json#episodes, plus the alternative keys the program also reads); every file and folder name under bible/ is ASCII; and the change log bible/changelog.md exists. Spellings that only some parts of the program read give a warning instead of a failure. Any failure exits non-zero; --json gives machine-readable output. p0-bible-init in agents/workflow.yaml now lists bible_skeleton_ok and ascii_filename, and the memory-bible role notes and agents/WORKFLOW.md say 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.py fails a scene whose dimensions_m X: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's whitebox.json can now carry layout_check_waiver: {"defect_id": "DEF-…", "items": ["aspect"]}. The check reads qa/defects/<defect_id>.json and counts the aspect item as waived only when that defect is waived (or waived_by_user), its waiver.signed_by is the user (an agent or full-auto does not count) and its scene_id is this scene. The report then lists the item under waived with the defect ID, and the scene passes unless something else fails. Only aspect can 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 and docs/whitebox.md describe 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 in state.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 signer full-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 … --sign prints 自动签字未通过:<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 as steer prompts), 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, API GET/POST /api/v1/config/auto-backup); the folder must be an absolute path outside data/projects and 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: macOS choose folder, Windows FolderBrowserDialog, 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 and docs/whitebox.md sent 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...
Read more

v1.0.40

Choose a tag to compare

@github-actions github-actions released this 21 Oct 07:37

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.py keeps those names as type ids (film is the default), their members move into agents/15-audio-video, agents/16-mashup, agents/17-digital-human and agents/11-qa/{av-sync-qa,mashup-qa,digital-human-sync-qa} (built-in agents 94 → 113), and their DAGs and guides into agents/workflows/, which ships with the desktop app. The type is stored in settings.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_track under mashup/ → 混剪; digital-human/input_manifest.json → 数字人; otherwise 影视剧) and written back the next time project settings are saved. Project creation accepts project_type and footage_libraries (unknown type or missing library: 400) and defer_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 to refs/text/transcript.txt (for 混剪 also novel/original.txt as the p0 input). With defer_init the wizard first uploads audio and photos into refs/ and then calls the new POST /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 gives av / mx / dh nodes and ga / gm gates 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.md gains §11 on project types; new tests/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, whose window.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 by scripts/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 toolchain modules/codevideo/ + code/codevideo.py: codevideo/timeline.json is 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; render fingerprints each section (shared inputs, its file and imports, frame range, size, library version) so editing one section re-renders only that one; board renders key frames with the real drawing code; master joins sections with two-pass loudnorm (−14 LUFS, true peak −1.2) into edit/ep01/final.mp4 with subtitles, poster and build.sh; check requires 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 after TREATMENT.md is written. settings.json#project gains code_style (required), storyboard_review (default on), narration, subtitles, length_s, fps and music_source (code default | model | library). The DAG agents/workflows/codevideo.yaml (gates CVH1 storyboard, skipped when 先审故事板 is off, and CVH2 final) runs with a new team 18-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 edit codevideo objects. 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 in TREATMENT.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 on WEB_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. With music_source model or library, the music is beat-aligned: modules/codevideo/beats.py (numpy / scipy only) tracks tempo, beats and downbeats; codevideo.py music-fit (--track MUS-NNNN from 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 to assets/audio/bgm/ep01/cue_sheet.json and reconciles the music library; snap moves section boundaries to downbeats and cuts and hits to beats without changing the length (new node cv2-beatsync, check stage beats). New genconfig music.code (auto_fetch on) and sfx.code are 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.json and .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.md credits lemo-opuscar, three.js, the fonts and OPUSCAR 98; guide agents/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 tts gains --clone-from <sample>, which zero-shot clones the sample's timbre and ignores --voice / --character / voiceprint cards. Agentics (a Voice Clone model whose profile accepts reference_audios), ComfyUI (the Voice Clone workflow) and Volcengine Doubao Audio Generation 1.0 can clone;...
Read more

v1.0.39

Choose a tag to compare

@github-actions github-actions released this 10 Oct 07:46

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 with code/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 to mode=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 record runs/revisions/canvas-*.json is 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 _revN carries 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 TO or 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 as match_cut), and match_cut was a label with no matching sentence in either prompt. Phase 1: the scene-end transition line stays CUT TO by 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.py is 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 check scene_link_valid in code/check_screenplay_events.py fails on, among others, an unknown kind, a missing out or in, a link that is not to the adjacent next scene, and MATCH CUT / SMASH CUT without 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 (only hard_cut / match_cut / smash_cut / dissolve), drop and modify give a reason — checked by the new code/check_scene_links.py (script_links_disposed; --list lists 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.propose registers each adopted or modified link on the first group of the later scene as transition_in.link {kind, out, in, out_shot, in_shot, note, trial?, device?} and applies it to shot_list at 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 a motion_pair (not with whitebox on) and a sound or line relay a J sound_bridge; classic and custom only offer them as candidates. code/sync_scene_links.py --write writes 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 of transition_ok), scene_link_bound (p7-prompt acceptance) and script_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 whose generated_at is before 2026-10-10 only get WARNs from scene_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. In p5-breakdown, timeline-story writes scenes[].npc {on, density: sparse|medium|dense|null, reason} into script_breakdown.json for every scene (new check npc_judged, part of code/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-owned story/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 carry npc[{layer: fg|mg|bg, what}] and each scene block an npc_applied receipt (check npc_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 copies npc[] (npc_shots_consistent); composition names the NPCs in the matching layers (npc_layers_bound); whitebox uses EXTRA-NPC-xx extras with the legend `anonymous NPC passer-by, not a named charact...
Read more

v1.0.38

Choose a tag to compare

@github-actions github-actions released this 08 Oct 05:07

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_id is 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 --track shows the base track's motif and prompt; the station regenerates the same motif with a different tempo, instrumentation, intensity or length, and the cue records variant_of; the new track inherits the theme), or new music. A per-episode quota is enforced by music_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 in mood or intensity) within 0.25 of the track's; reuse, variations and new music all need a reason in music_library_report. use refuses 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 commands theme (list / --add), variant, and annotate --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.md and 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" and tail_image_url). genmedia now 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 module modules/fal_models.py, endpoint GET /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.py process 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 to data/.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); --provider forces one. --loop returns 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.json with 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 assemble scales 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 in final_layout.json#letterbox, finalize_episode.py check gains letterbox_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, and genmedia.py video refuses to write assets/clips/<ep>/grpNNN*.mp4 while the episode's g7p node 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...
Read more

v1.0.37

Choose a tag to compare

@github-actions github-actions released this 30 Sep 08:14

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 models via the new GET /api/v1/engines/codex/models (models with visibility=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_skips field of captions.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 check caption_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's settings.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's grpsh_id_3digits check expects four digits there, and check_generation_groups.py --propose numbers its draft groups accordingly (new modules/id_scheme.py). Existing projects have no numbering block and keep S01 / grp001 / sh001 unchanged.

  • Project music library. Every project now keeps a library of its score under assets/audio/library/music/ (index.json + MUS-NNNN.<ext>, new modules/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 CLI code/music_library.py (list, search, use, sync, annotate, add, check), reuses a fitting track with use (the cue's license becomes source: library + track_id and carries the original license chain) and generates new music only when nothing fits, stating the reason per cue in the cue sheet's music_library_report. Selection order is now user music in refs/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 check music_library_synced on p8-music; episodes delivered before this feature are backfilled and only get a reminder. Project settings → 「音乐库」 opens the new /music-library page: 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 endpoints GET /api/v1/projects/{project}/previews/music-library and POST /api/v1/projects/{project}/music-library/sync ({ep?}); music and copyright SOULs, WORKFLOW Phase 8 and workflow.yaml updated; 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 by index.html and edit-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, new desktop:pick-files IPC), ② 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 (localStorage webui_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.json keyed 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 plus story/events.json / story/episode_plan.json when referenced) and clears the file once the run is dispatched. New endpoints POST /api/v1/projects/{project}/script/{ep}/notes ({key, text, label?}, empty text deletes) and POST …/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 from assets/notes/epNN/<grp>.json — and the host composes a single revision order for the reviser (kind=storyboard or kind=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 injected Director's note sentence leaves the video_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 endpoints POST /api/v1/projects/{project}/board/{ep}/notes/submit and POST /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-design workstation and generated establishing shots. A new per-episode DAG node p6-transition-design (condition transition_design_enabled = effective transition mode ≠ minimal; after shot-planning / continuity / plates, feeding the H3A gate) runs the host CLI code/transition_design.py propose and 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 with card, and picks between candidates with the new design --alt N | --design '<json>' --note … verb — proposals stay proposed; accepting is the user's decision on the storyboard preview's transition cards, and signing H3A now accepts every remaining proposal into shot_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 (feedback only), and re-running propose no 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 `...

Read more

v1.0.36

Choose a tag to compare

@github-actions github-actions released this 24 Sep 04:49

Added

  • Transition design between shot groups (docs/transition_design.md, WORKFLOW §9C "过场设计"). Group boundaries become first-class objects: a per-episode design ledger directing/epNN/transition_design.json diagnoses 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_in stays the single final field and is only written back by the host (code/transition_design.py apply). transition_in gains join.style (a controlled xfade style family for dissolves: wipe / blur_through / zoom_through / iris / pixelize / fadegrays), inserts[] (boundary insert segments: title_card, establishing from the scene panorama (yaw sweep) or the master plate (Ken Burns), timelapse between two lighting schemes of the same anchor, bridge for a generated clip; 0.5–4 s each, ≤ 6 s per boundary, per-segment join_out seam and audio policy) and overlay_card (location/time text over the first seconds of the incoming group, no length change). render_transitions.py gains build (renders the segments and overlay PNGs by design+asset fingerprint into edit/epNN/transitions/<B-from-to>/) and preview (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, same timemap table for audio/subtitles) and the check gains insert_budget_ok, inserts_built and insert_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 are minimal), 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 accepts fade_white and 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-mix used 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 from mix_basis.py sources (the group's current adopted version, otherwise the master; with measured durations, post-edit start times and the version's time_ops) and stamps assets/audio/final/epNN.mix.json on delivery. post_apply.py check gains mix_basis_current and finalize_episode.py consults the manifest: when it matches the current adopted pointers the post_versions timemap layer is no longer applied to the audio track / subtitles (boundary pads still are); a stale manifest whose mix already carries post-edit timing fails post_ok (H3P refuses to sign) and refuses to assemble until p8-mix is 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 with draft=true and the draft task id is recorded in grpNNN.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 and comfy/scale-* templates; the bundled template was renamed comfy/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 (selecting ffmpeg is the explicit way to ask for interpolation). genmedia.py upscale routes on this section only, auto-rescales 2K/1080p outputs to the delivery size, and merges an upscale{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-sol and gpt-6-luna. Both appear at the top of the codex model dropdowns (top bar and per-agent model dialog); the pi dropdown keeps listing whatever pi --list-models returns. Smart Assignment for both engines now resolves the high tier to gpt-6-sol and the low tier to gpt-6-luna (codex: was gpt-6-astra / gpt-5.6-terra; pi: was openai-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 review badge (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 with Compare v{n} (A|B against the current version) and a yellow Set v{n} current button, 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=dubbing always stores output.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, caption speech-align, digital-human dh0-transcribe, mashup alignment) may call faster-whisper / modules/transcription.py; every other agent is denied by the PreToolUse hook (.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-level VIDEOAGENTS_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 became agents/08-video-gen/upscale/docs/minimax-regenerate-2k.md); selecting minimax on the Upscale tab is the only switch.

  • Shot timing in video prompts (shot_timing_bound, code/sync_shot_timing.py): each shot's duration_s from shot_list.json is 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 as 8-10秒(Shot 5–Shot 8):; 0-2s: on non-Chinese UIs) on the first shot of each segment; MiniMax H3 gets official cut timestamps At 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 at round(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_video chains on t...

Read more

v1.0.35

Choose a tag to compare

@github-actions github-actions released this 23 Sep 04:34

Added

  • Project dropdown › Import Project… (above "New Project…"): pick a .zip of a project folder (either the folder itself or its contents at the zip root); the host streams it to disk, extracts it into data/projects/<name>/ (name = the zip's top-level folder, else the file name; a clashing name gets a -2/-3 suffix; path-traversal entries and __MACOSX/.DS_Store noise 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; world lets you pick the anchor yourself on the scene preview page, generate a world model (World Labs Marble) from that panorama, and render_shot_plates.py then 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 in plates/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 variable VIDEOAGENTS_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 T2VA workflow 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 --adopt also 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, the diagnostics_enabled setting). The Debug mode switch is kept. Existing files under data/.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.py and 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 answer Hold matched 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 bare CUT 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 that sync_shot_plates.py --write injects into video_prompt were 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 by shot_plate_bound, both are stripped and rewritten on the next --write so switching the UI language leaves no leftovers, and a Shot 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 stored video_prompt instead 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 in data-ep instead 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 / tool SSE 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:...
Read more

v1.0.34

Choose a tag to compare

@github-actions github-actions released this 20 Sep 06:26

Added

  • Generation-model settings › TTS › Agentics: separate Voice Design and Voice Clone profiles (tts.agentics.design, default qwen3tts-voicedesign; tts.agentics.clone, default qwen3tts-clone), mirroring the ComfyUI TTS channel's two workflows and the image channel's text-to-image / image-to-image pair. genmedia tts uses the Voice Design profile when the output is a voice sample (*_voiceprint.*), sending a voice description assembled from the character's voice.json (narrator: voice card / --instructions) as the new contract parameter instruct — the same name as the description input of the Qwen3-TTS VoiceDesign node that the RunningHub direct-binding targets (voice_instruction / voice_description / instructions are 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 sample assets/audio/voice/refs/<CHAR>[_<variant>]_voiceprint.mp3 before the TimbreModel auto-pick. A Voice Design profile that declares no description parameter falls back to Voice Clone with a stderr note. A legacy single profile_code is migrated to both sides; an empty value falls back to the defaults. genmedia info prints 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 tts chooses by purpose: an output file named *_voiceprint.* (a character / narrator voice sample) uses Voice Design with a description assembled from the character's voice.json acoustic fields (narrator: voice card / --instructions), everything else uses Voice Clone with the project's frozen sample assets/audio/voice/refs/<CHAR>[_<variant>]_voiceprint.mp3 as 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_instruction description slot, seed; a wired LoadAudio in a design workflow is rejected); local / Comfy Cloud templates use the new {{VOICE_DESC}} placeholder. The TTS direct-binding also accepts target_text as 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 official krea2_style_reference LoRA; 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) and comfy/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 at GEN_* and upscale to WIDTH×HEIGHT with a final ImageScale, 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) and comfy/tts-qwen3tts-voicedesign-api.json (Voice Design slot, new {{VOICE_DESC}} placeholder; both need the flybirdxx/ComfyUI-Qwen-TTS node 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) and comfy/image-flux2-dev-fp8-ref10-api.json (1–10 reference images via a chained ReferenceLatent row per image), each with a bilingual .md. genmedia image now accepts several --ref on local / Comfy Cloud when the reference workflow has more than one LoadImage: 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---ref limit. The storyboard-sketch reference capacity follows the template's LoadImage count 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, was ideogram-4-t2i) and flux2-dev-i2i-10ref (image-to-image with up to 10 reference images, was qwen-image-i2i).
  • Generation-model settings › Language model / DeepAgents › Agentics: the default model is now z-ai/glm-5.3 (was z-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_prompt parameter are merged into the positive prompt as Exclude from the image: … (same wording as the RunningHub channel), with a stderr note, instead of being dropped.
  • RunningHub image-to-image templates: LoadImage nodes 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

Choose a tag to compare

@github-actions github-actions released this 18 Sep 08:09

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 the deepagents stack, so the interpreter lookup fell through to a project-root venv that never exists inside the app bundle. apps/desktop/runtime-requirements.in now pins deepagents, langchain-openai and langgraph-checkpoint-sqlite (lock regenerated — pure additions, no existing pin changed; about +135 MB unpacked), and build_runtime.py import-checks them. The desktop app picks the new runtime up automatically on launch (lock hash mismatch → runtime update).