You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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_sourcemodel 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; Volcengine Seed-TTS 2.0, OpenRouter, MiniMax and ElevenLabs fail with a message naming the channels that work instead of passing off a library voice as a clone (--dry-run prints the verdict and exits 2 when unsupported). New host CLI code/dialogue_clone.py: plan parses the script (one Speaker: line per line, Chinese or English colon, name optional with a single speaker; timestamps, blank lines and # comments dropped), matches speakers to samples (digital-human/voice_cast.json or --voice, automatic when a sample is named after its speaker), checks sample length (under 2 s blocked, outside 5–30 s a warning) and whether the channel can clone; synth synthesizes line by line (only new or changed lines are redone; --force redoes all), trims edge silence and joins the master assets/audio/master/<ep>.mp3 sample-accurately (0.4 s between lines, --gap), with the timed transcript digital-human/transcript_cloned.txt covering it contiguously and the ledger digital-human/voice_clone.json; nothing is joined while any line failed, and a master it did not produce (such as an uploaded recording) is never overwritten without --force; check runs voice_clone_ok. The new node dh0-voice (09-audio/voice-generation, condition voice_source_clone, skipped for 原始录音) precedes dh0-ingest, which then only verifies the master's fingerprint and treats the cloned transcript as the user's script, so dh0-transcribe is not dispatched. In the wizard, 克隆声音 replaces the audio-master upload with sample uploads into refs/voices/, makes the 台词稿 required, and shows a yellow note when the current TTS channel cannot clone. New tests/test_dialogue_clone.py. Cloned synthesis has not yet been run on a real channel.
Style library: all 916 visual styles of Flick's Flickpedia are merged in, growing the library from 152 to 1034 styles (2026-10-21). The library behind the console's 画面风格 picker (apps/web/static/styles/style_library.json) now includes every visual style of the Flickpedia gallery (https://flick.art/flickpedia/visual-styles). 34 existing styles matched one to one (by text first, then by comparing covers; styles that only share a broad genre were not merged) keep their name and category, take Flick's image as their cover (styleNNN.webp replaced in place) and get a rewritten prompt that combines Flick's description with what still held in the old one, cleaned of English prefixes, trailing 「,2D / ,3D」, work titles and content descriptions. 882 new styles (style153–style1034.webp, appended in Flick's "Recommended" order) get a Chinese name, a category and a one-paragraph Chinese prompt in the library's existing manner, describing rendering only (technique, colour, light, texture, compositional tendency, mood) with no characters, work titles, AI terms, parameters or aspect ratios; where Flick's description did not match its image (about 80 styles) or was missing (65), the prompt and the category follow the image. The three categories are kept: 2D 597 / 真人 348 / 3D 89. Covers are 640 px wide WebP (quality 78, about 30 KB on average) and ship with the repository. All 11 translations (styles/i18n/<lang>.json) cover the new entries and rewritten prompts, and Arabic's duplicate names for s042 / s049 are fixed. Entries taken from Flick carry "source": "flick.art" and the original Flick name in source_name, and THIRD_PARTY_NOTICES.md records the source and states that these images and descriptions remain subject to Flick's terms. apps/web/check.py now expects 1034 covers and 1034 entries, each with its cover present. Because /static files are served without Cache-Control, browsers kept the old library, translations and same-name covers even after a hard refresh; index.html now appends STYLE_LIB_V (20261021) to every library, translation and cover URL (the Canvas style picker uses the same value), and it must be bumped whenever anything under styles/ changes.
World models can now be generated on your own GPU: a new HunyuanWorld channel backed by a remote worker (2026-10-21). The 🌍 世界模型 card on the 生成模型 page gains a HunyuanWorld tab next to World Labs, made active with the card's 生效渠道 dropdown (genconfig.json#world.provider: marble, the default, or hunyuan). It drives a small worker service from a separate repository, AgenticsWorld/VideoAgents-hunyuan-rpc, which you deploy on any reachable Windows or Linux host with a 24 GB card (verified on an RTX 3090; its README is the deployment guide). The scene preview's 「生成世界模型」 button then builds the world on that host in about 20–40 minutes instead of spending Marble credits: HunyuanWorld-1.0 layered 3D reconstruction of the scene anchor panorama (bf16 with sequential offload), a bounded multi-view render around the panorama camera (32 views at 1600×900 by default) and 3DGS training with gsplat (MCMC, up to 1 M Gaussians, 8000 steps by default, with scale regularization against needle-like Gaussians at depth edges). Output lands in the same contract as Marble — world/worlds/<key>/world.json (provider: "hunyuan", model: hunyuanworld-1.0+gsplat) plus splats_*.spz, collider.glb and preview images, in the Marble coordinate convention with the same scale calibration (camera_height / fitted ground offset) — so the fullscreen viewer, alignment tweaks, default-world selection, the Director's console world view and the 「世界模型」 shot-plate mode work unchanged. The tab takes the worker address and token (world.hunyuan.base_url / token, sent as X-Worker-Token; HUNYUAN_WORKER_URL / HUNYUAN_WORKER_TOKEN override them) and optional advanced values views / gs_steps / fp8 (empty = 32 / 8000 / off; FP8 is off by default and not recommended on Windows); 验证 (POST /api/v1/providers/hunyuan/test) calls the worker's GET /health and shows the GPU, busy / idle state and free disk, or the self-checks that failed. The CLI code/hunyuan_world.py mirrors the Marble one, plus --resume <job_id> for interrupted downloads, --check and --smoke (4 views / 200 steps) to verify a fresh deployment end to end. The worker runs one job at a time (409 while busy), resumes from stage markers and deletes jobs after 7 days. Limits: sharpness is capped by the training-view resolution; the world only covers the panorama's envelope and degrades away from the camera position; splats are DC-only, so highlights are weaker than Marble's; the first run downloads about 60 GB of weights. All 11 UI dictionaries are covered. HunyuanWorld-1.0 weights are under Tencent's community license (not valid in the EU, UK and South Korea; products above 1 M MAU need a commercial license from Tencent); this repository ships only the client, never the weights. Feature doc: docs/hunyuan_world.md. (#145)
Canvas: a new 动图 tab turns the version being viewed into a video, from a reference image or from first / last frames, and a new on-demand station 「画板动图师」 only writes the prompt while the host renders the video (2026-10-21). A 动图 tab to the right of 信息 in the Canvas side panel generates a short video from the version being viewed (an edited version works too); results go only into that image's list 本图的动图 and never touch 设为最终版 or production. 生成方式: 参考图 (default) submits in multi-reference mode — the viewed version is @Image 1, and 参考图 2 can add another version as @Image 2 — which is what reference workflows such as ComfyUI's MiniMax-H3 Ref2VA accept; 首尾帧 uses the viewed version as the first frame and another version picked under 尾帧 as the last, and needs a model that supports first / last frames (Seedance on Volcano Engine / BytePlus, Kling on Fal, an H3 FL2VA workflow in ComfyUI). With ComfyUI as the active video provider the request is pre-checked by workflow type (motion_channel_problem: H3 Ref2VA and the Seedance cloud reference templates take reference images only, LTX-2.5 both, the rest first / last frames only) and rejected with a 400 at once instead of failing minutes later. The provider / model dropdowns share the storyboard preview's episode-level list (default 跟随全局, remembered in the browser, global settings untouched; the server accepts only configured providers and their listed or saved models). Length 2–30 s (default 15), resolution 480p / 720p / 1080p (default 480p), sound on by default; the aspect ratio is the common ratio nearest the image. genmedia.generate_video gains explicit provider / model (no episode or group override) and resolution_gate=False, so the resolution picked on the page is not pushed down to draft grade. 🎲 让语言模型看图写一段 has the agent write a prompt into the box, taking any text already there as the idea. 直接发给视频模型,不经 Agent 整理 (on by default) sends the prompt as written, prefixing an English reference-image sentence in 参考图 mode when it names no @Image N; 发送前先看提示词 holds the job for editing and confirmation; unticked, 「画板动图师」 (agents/08-video-gen/canvas-motion, Smart Assignment low tier) looks at the image(s) and submits one prompt with code/canvas_edit.py motion within seconds, and the host renders the video in a subprocess after the agent's turn ends (90-minute timeout). With the toolbar 🔞 active, the NSFW fallback video provider and language model are used and 直接发给视频模型 is ticked automatically. Videos are saved as assets/canvas/<canvas folder>/motion/mNNN.mp4 with a poster frame, ffprobe-measured specs and the exact prompt sent in history.jsonmotions[]; the list plays them in the page, shows and copies that prompt, and offers 用这段提示词, download and delete (moved to trash/). Each image now has three independent job lanes (edit / upscale, video, prompt writing), so editing continues while a video renders. New endpoints POST /api/v1/projects/<p>/canvas/motion and …/canvas/motion/delete; spec in docs/image_canvas.md.
Canvas edit: 「🎨 选择风格库」 tries a style from the style library on one image without changing the project's visual style (2026-10-21). A 🎨 选择风格库 button to the right of the 整体说明 heading on the Canvas 编辑 tab opens the same style library as the console's 画面风格 picker (style_library.json plus the interface language's translations, 1034 styles; 全部 / 真人 / 3D / 2D filters, search, 🔍 zoom). Picking a style writes 「整体改成「<style name>」画面风格(只换画风,构图、人物、物件和位置保持不变):<style prompt>」 into the overall instruction (in the interface language); picking another replaces that sentence rather than adding a second one, and a hint under the box says this is a style test for this edit only. The request carries style: {id, name} only while that sentence is still in the overall instruction, so deleting it sends a normal edit. With a style, compose_prompt in modules/image_canvas.py no longer opens by asking to keep the lighting, colour and style of [Image 1], which would cancel the change; it asks to keep the framing, composition, camera angle, subjects and their positions and to change the visual style as instructed. The retouch work order gains a 「风格测试」 line, and the 「画板修图师」 SOUL has the agent carry over only the medium, brushwork, palette and lighting of the style description, not its composition, shot size or lens. Jobs, versions and 改用整图 copies record style, and the history marks such versions 「🎨 <style name>」. The Canvas page keeps its own STYLE_LIB_V, which a test holds equal to index.html's. 5 new strings in all 11 dictionaries.
Reference files: images on the 参考文件 page open in Canvas (2026-10-20). PNG / JPG / WebP files on the 参考文件 page get a 🖌 画板 button to the right of the file name (GIF / BMP / TIFF get none, since Canvas only takes .png / .jpg / .jpeg / .webp), so an uploaded reference image can be edited, upscaled, adjusted, style-tested or animated like any production image. modules/image_canvas.locate treats every path under refs/ as the new kind ref with fixed-path storage, whatever kind the page passes: 设为最终版 writes the version back to the original path, so agents read the adopted image from then on, and the file's note (refs/annotations.json / refs/NOTES.md, keyed by path) stays attached. A reference has no setting card, so the option to send the change to the reviser is not offered. When returning from Canvas with 「<」 the reference list is fetched again (cache: 'no-store', and again on a pageshow restored from the back-forward cache), so the thumbnail shows the adopted version. Canvas labels the kind 参考图.
Canvas: a 🔞 NSFW toggle in the toolbar routes an image's edits to the NSFW fallback models, and turning it on ticks 「直接发给图像模型」 so edits skip the retouch agent (2026-10-21). In NSFW mode a Canvas edit refused by the language model never moved to a fallback model: the refusal was often not a stock phrase, Canvas work orders carry no task_id and every re-send is a new job, so the rule "re-dispatch the same task_id on the fallback language model" could not apply. Canvas now has an explicit switch instead. A 🔞 NSFW button at the right end of the toolbar, shown only while NSFW mode is on, turns yellow when on; its state is remembered per image in the browser (localStoragecanvas_nsfw_<project>|<file>). While it is on, edits and 重绘放大 of that image follow NSFW routing: with a fallback image provider configured the server replaces the job's provider / model with it (the edit and upscale model dropdowns grey out and name it, and the upscale size cap follows it), otherwise the selected model is used; an agent dispatch carries nsfw, so 「画板修图师」 runs on the fallback language model (the current engine when none is set) and its work order gains an nsfw: true line; every image subprocess, the agent's as well as the host's direct, confirmed and upscale runs, gets VIDEOAGENTS_NSFW=1, and genmedia records nsfw_route. Jobs and versions (including 改用整图 copies) record nsfw: true and are marked 🔞 in the job box and the history. 保真超分 is unaffected, and a request carrying nsfw while NSFW mode is off returns 400. Whenever 🔞 becomes active — switched on, remembered as on when the page loads, or NSFW mode turned on in the console before returning to the page — the edit tab's direct-send checkbox, renamed from 直接发送 to 「直接发给图像模型,不经 Agent 整理(快,适合小改)」, is ticked automatically, so the host fills the fixed English template and no language model is involved; the send hint says it was ticked automatically, and unticking it sends through the agent on the fallback language model. When 🔞 becomes inactive only that automatic tick is undone; a tick changed by hand is left as it is. The Canvas state now includes nsfw_mode {enabled, text, image, video}.
NSFW mode: refusals worded in plain language can be judged by a moderation model, TypeSafe's Jev decision model on OpenRouter (2026-10-21). In NSFW mode a language-model refusal is not switched in-process: the host marks the run nsfw_suspect and the next dispatch of the same task_id uses the fallback language model. That mark relied on stock refusal phrases only (_LLM_REFUSAL_RE), so a refusal in natural wording (「这单我没有提交……我不做这种编辑」) was missed and the fallback never kicked in. A new cost switch, 拒绝判定用审核模型, in the NSFW mode dialog (设置 → 高级 → 「NSFW 模式」; state.jsonnsfw.judge, default off) adds a second stage. A stock-phrase hit still counts directly; otherwise a zero-cost pre-screen selects only runs that look like "ended without a deliverable" — the run finished normally, its reply is non-empty and under 4,000 characters, and either a Canvas agent's job is still waiting for its prompt or the work order has a task_id and the run wrote no files — and only those have their final reply judged once. modules/refusal_judge.py calls OpenRouter's Decisions API (POST https://openrouter.ai/api/alpha/decisions) with only the last 1,500 characters of the reply (never the original request or images) and one choice question over policy / missing_input / clarification / done / other; only policy counts as a refusal. A failed call is only recorded and the run falls back to phrase matching, and runs already on the fallback model are not marked. nsfw_suspect records by: regex|judge, and the run record carries refusal_judge (verdict, confidence, probabilities, snapshot, cost). A refused Canvas job is marked failed (refused: regex|judge) with a yellow hint to turn on 🔞 in the toolbar and send again, or to configure a fallback language model first; it is never re-sent automatically, and the page's polling waits while the judgment runs. The model is set on a new 🛡 审核模型 card on the 🎨 生成模型 page, stored in the moderation section of the generation config: a single OpenRouter tab with an API key (falling back to OPENROUTER_API_KEY) and the model, typesafe/jev-1.13 (default) or typesafe/jev-1.14. 测试 (POST /api/v1/providers/moderation/test) judges a naturally worded refusal sample once (billed, about $0.00003) and shows the verdict, confidence, snapshot name, cost and latency. The switch cannot be turned on while the card has no key (POST /config/nsfw returns 400), and the dialog's status line names the model in use. All 🔞 controls and markers on the Canvas page (toolbar toggle, job and version markers, the 🔞 suggestion in refusal hints) now appear only while NSFW mode is on, as the storyboard preview's group-card 🔞 already did, and both pages re-read GET /config/nsfw when brought back to the foreground, so switching the mode needs no manual refresh. New cases in tests/test_nsfw_mode.py and tests/test_image_canvas.py.
New execution engine: Antigravity CLI (antigravity, command agy) (2026-10-20). Google's Antigravity CLI can now run agents: it appears as Antigravity CLI in the top-bar and per-agent engine menus, the executable can be overridden with AGY_BIN, and Smart Assignment gets a smart_antigravity strategy (high tier gemini-4-argon-high, low tier gemini-3.8-flash-medium). Dispatch runs agy --output-format stream-json --dangerously-skip-permissions --print-timeout 0 [--add-dir <data dir>] [--model] [--effort] [--conversation <id>] -p <prompt>: the skip-permissions flag is required (without it, shell commands are soft-refused in print mode while the exit code stays 0); as with codex / kimi / opencode the role brief goes into the first turn's prompt and later turns resume with --conversation; the host run timeout replaces a turn cap; thinking depth maps to --effort. handle_antigravity_event parses init / step_update / result events and maps tool names (write_to_file → Write, replace_file_content → Edit, view_file → Read, run_command → Bash, grep_search → Grep, find_by_name → Glob and so on) and PascalCase parameters to the Claude vocabulary, so output files, activity and the prompt-skill read check work as usual; only result.status=SUCCESS counts as success. When --conversation names a session that no longer exists, agy silently starts a new one with exit code 0, which would leave a resumed turn working without its role: the host compares the init conversation id with the one it resumed, kills the process before any tool call and reruns once with the full role brief. Token usage comes from the cumulative result usage, or is summed per call when a log has no final event. GET /api/v1/engines/antigravity/models parses agy models (30 s cache; six static Gemini entries as fallback). 一键安装 runs the official antigravity.google/cli/install.sh (install.ps1 on Windows; installs to ~/.local/bin/agy or %LOCALAPPDATA%\agy\bin, both of which the desktop app searches); agy has no login subcommand, so 登录 opens a terminal running agy with a hint to sign in with a Google account and then type /exit; sign-in is probed with agy models (no quota used), and a set GEMINI_API_KEY counts as signed in. The footage library's AI shot analysis does not support this engine. Not yet exercised in a real dispatch: the write / edit tools' parameter names are inferred, and if they differ the output-file list stays empty (activity is still logged).
Sound effects get their own model setting on the 生成模型 page: Openverse search, ElevenLabs or Fal (2026-10-20). A new 🔊 音效模型 card (config section genconfig.sfx) sets the channel that genmedia.py sfx uses for sound-effect and ambience patches, instead of it following whichever key happens to be configured. Openverse does not generate: it searches the CC-licensed and public-domain audio indexed by Openverse (https://api.openverse.org/v1/) with 2–3 English keywords and downloads a ready-made file. Its tab sets the license range (CC0 / public domain only by default, optionally plus CC BY, which requires attribution; CC BY-SA, non-commercial and no-derivatives licenses are never accepted), the sources (Freesound by default, optionally plus Wikimedia Commons) and an optional Client ID / Client Secret (empty = anonymous access, 20 requests a minute and 200 a day; the token is cached in data/.videoagents/openverse_token.json), and offers a 搜索测试 (POST /api/v1/providers/openverse/search) that plays results in the page with duration, license, source and author, tags CC BY items 「须署名」 and shows the remaining quota. The ElevenLabs and Fal tabs generate with ElevenLabs Sound Effects v2 (eleven_text_to_sound_v2 / fal-ai/elevenlabs/sound-effects/v2); an empty API key falls back to the ElevenLabs key of the music / TTS sections or the Fal key of the image / video sections. In genmedia.py sfx, --provider overrides the card per call and the new --query gives the Openverse keywords (extracted from --prompt when omitted, dropping words step by step when nothing matches). Openverse picks material by length (clips of up to 15 s first for one-shots; a loop bed must cover --duration plus the crossfade), skips broken, oversized or unusable files, and --count takes different items; one-shots are trimmed of edge silence, peak-normalized and cut to --duration with a 30 ms fade, and --loop crossfades the overhang back onto the start for a seamless loop. The .meta.json records the license, attribution_required and the author, page and attribution text. Specs: the sound-effect and ambience stations change keywords and retry when Openverse finds nothing, then report it rather than switching to a paid channel on their own; the copyright reviewer checks patch provenance when an episode has patches, and a CC BY item whose attribution is missing from the end credits is a major defect. Behaviour change: an ElevenLabs key alone no longer routes sound effects to ElevenLabs — select ElevenLabs in the card's 生效渠道 dropdown to keep that. All 11 UI dictionaries are updated.
ComfyUI local templates for Qwen Image 2.1 bf16, text-to-image and multi-reference image-to-image, that need no custom nodes; the Qwen Image 2.1 GGUF templates are now tested locally (2026-10-20). New comfy/image-qwen-image-2.1-bf16-api.json (text-to-image) and comfy/image-qwen-image-2.1-bf16-ref10-api.json (image-to-image, 1–10 reference images), each with a Chinese / English description, listed automatically in the 「文生图API」 / 「图生图API」 dropdowns on the 生成模型 page. They are the GGUF templates from 1.0.39 with node 1 replaced by the core UNETLoader (qwen_image_2.1_bf16.safetensors) and their own output prefixes (videoagents/qwen-image-2.1-bf16, videoagents/qwen-image-2.1-bf16-ref); sampling, sizes, negative handling and positional reference binding are unchanged, so they run on a stock ComfyUI 0.37.0 or later without ComfyUI-GGUF. The model files come from Comfy-Org/Qwen-Image-2.1: diffusion model 14.2 GB, text encoder qwen3vl_8b_bf16 17.5 GB, VAE 0.7 GB (the smaller int8_convrot files, 7.3 / 9.4 GB, are an untested alternative). Comfy Cloud cannot run them as is: the node graph is supported, but its shared model catalog lacks qwen_image_2.1_bf16 and qwen_image_2.1_vae_bf16, so a submission fails validation unless the account has both files. The GGUF description's "Without the GGUF node" section now links to these templates. Tested on Windows with ComfyUI 0.42.1 and an RTX 4080 SUPER with 32 GB of system RAM: bf16 text-to-image took about 105 s for 1024×1024 including the first model load and about 20 s for 1280×720; the two GGUF templates, run with the same prompts and seeds, took about 93 s and 23 s for text-to-image and about 38 s for image-to-image with two references, with nearly identical images. The bf16 image-to-image template produced a correct image but took about 750 s, and ComfyUI stopped answering HTTP for minutes at a time while it ran, so genmedia.py gave up polling and reported a failure although the job finished — on such a card, prefer the Q8_0 GGUF companion for reference images. 3–10 references were not run. The model is under the Qwen Research License, non-commercial use only.
Project picker: the top-bar project dropdown becomes a dialog with new / import, two sort orders, folded backups and per-project status (2026-10-21). Clicking the project name in the top bar now opens a 项目 dialog with + 新建项目… and › 导入项目… (the existing wizard and zip import), a 按项目名称 / 按最新更新 switch (remembered in the browser) and 10 projects per page. Columns: 项目, 类型 (icon and name from the new-project wizard's type cards), 自动 (🤖 when auto-run is on), 运行 (running agents, plus the number queued), 备份 and 磁盘. Backups are no longer listed on their own: a project named <source>-YYYYMMDD, with an optional suffix (the default name of a copied project, including -1 or a hand-edited suffix), is folded under its source while that source exists; the 备份 column shows the count, with a green dot when one of them is running, and clicking it expands the backups, which open like any project. A backup whose source was deleted is listed normally. Sorting by latest update ranks a source by the newest update across its whole group. The current project is highlighted and the dialog opens on its page (expanding its source when it is a backup); running-state and auto-run changes refresh the dialog live; Esc or a click on the backdrop closes it, and rows can be reached with Tab and opened with Enter. Two new endpoints back it: GET /api/v1/projects/overview (type from settings.json#project.type, inferred from outputs for older projects; auto-run switch; running / queued runs; latest update, from the project folder's first- and second-level entries and run times; backup_of) and GET /api/v1/projects/disk?names=… (folder size without following symlinks, up to 60 projects per request, cached for 10 minutes, fetched only for the rows on the current page because scanning every project is slow). The 版本管理 page drops its own project dropdown and shows the current project's name in its header. The new strings are in all 11 UI dictionaries.
Changed
生成模型 page: tabs are only for viewing and editing, and each card's active provider is chosen in a 「生效渠道」 dropdown in its title bar (2026-10-21). Until now the selected tab was the active provider, so changing, say, a ComfyUI workflow while another provider was in use meant switching to the ComfyUI tab, editing and switching back. All ten cards — 图像 / 视频 / TTS / 音乐 / 音效 / 数字人 / 超分 / 世界模型 / 语言模型 / 审核模型 — now have a 生效渠道 dropdown at the right of the title bar: clicking a tab only changes which provider's panel is shown, ✅ always marks the active provider's tab, changing the dropdown also switches to that provider's tab, and the provider written to the config always comes from the dropdown. Providers hidden in the UI (MiniMax for image and video) stay hidden in both the tabs and the dropdown unless they are the active one. The explanatory text in the card title bars is removed (the dropdown's tooltip explains the split), and the TTS card now sits above the music card. One shared controller in apps/web/static/models.html replaces each card's own tab logic; docs and specs that said the provider is picked by its tab (docs/hunyuan_world.md, docs/worldlabs_world.md, agents/WORKFLOW.md, the upscale SOUL) now refer to 生效渠道. The 文件托管 settings page still activates a provider by its tab. All 11 UI dictionaries are updated.
生成模型 page saves automatically, and the 「保存设置」 button is gone (2026-10-21). Every change on the page saves the whole configuration with the request the button used (POST /api/v1/config/generation): text, password and number fields when they lose focus or on Enter, dropdowns (including 生效渠道) and checkboxes as soon as they change. Values set by buttons are saved too — Fal 「选用」 (its hint now reads 「已填入 {id}」), adding or removing a RunningHub workflow with 「验证并添加」 / 「移除」, and the model list refreshed by the deepagents 「测试连接」 — while search and test inputs (Fal search, the Openverse 搜索测试, the pending RunningHub ID and note) never trigger a save, and choosing 「自定义…」 waits until the custom field is filled in. Nothing is sent when the content equals what was last saved, so opening the page writes nothing; saves run one at a time and a change made during a save is saved right after it; requests use keepalive, so clicking a link such as 「控制台」 right after typing still saves, and the field being edited is saved when the page is hidden or closed. The save status moved to the top bar (「修改即自动保存」, 「保存中…」, 「✓ 已自动保存」, 「✗ 保存失败」), with the RunningHub cache sync result appended as before. As with the button, each save syncs the selected RunningHub workflows' cache, now more often; after changing a template on RunningHub, run 「验证并添加」 on that workflow again (or change any setting) to refresh it, and the RunningHub skill says so. The AgenticsLLM check before saving now matches the server: only categories newly switched to agentics are checked (the whole config used to be checked, and since the browser version's TTS and deepagents defaults are agentics, every save there was blocked with 「仅支持桌面客户端」); when the check fails, those categories go back to their saved provider with the reason shown in the top bar, and the other changes are saved. All 11 UI dictionaries are updated.
Smart Assignment: creative members of the new project types default to the high tier, every 11-qa review agent — including each type's final review — to the low tier (2026-10-21). Under a smart strategy (智能分配) an agent's default model comes from its tier. AM_CATEGORY_TIERS in services/runtime/core.py now marks 15-audio-video, 16-mashup, 17-digital-human and 18-code-video as high, so all 20 creative members of 音频配画 / 混剪 / 数字人 / 演示视频 get the high-tier model (opus under smart_claude); previously these categories were unlisted and fell to low, apart from two high exceptions, 15-audio-video/era-researcher and 15-audio-video/visual-scripter, which are now covered by the category. 11-qa stays low as a whole with no exceptions, so all 12 review agents, including the final reviews av-sync-qa, mashup-qa, digital-human-sync-qa and code-video-qa, get the low-tier model (sonnet under smart_claude). A model set by hand for an agent still takes precedence. A new case in tests/test_project_types.py checks that every project-type member outside 11-qa is high and all of 11-qa low.
First install: the default execution engine follows the UI language — Kimi Code for Chinese, Claude Code otherwise (2026-10-21). When neither the browser's saved preferences nor the server's ui-prefs hold an engine (a first install), restorePrefs in apps/web/static/index.html picks the top-bar engine from the UI language: Chinese → kimicode, any other language → claudecode. The existing logic then takes over: the language model shows 智能分配, the assignment strategy is aligned to smart_kimi (K3 / K2.7 Coding), the choice is saved to the server copy, and the startup CLI check looks for kimi and, if it is missing or not signed in, opens the one-click install / sign-in dialog for Kimi Code rather than Claude Code. Installations that already saved an engine are unaffected, and changing the UI language later does not change the engine. In the desktop app, initializeFirstLoginDefaults (apps/desktop/src/main.ts) no longer seeds ui_prefs / global_model (hard-coded to claude) into the first-login state.json, so the desktop first run behaves like the web one; the file is still written only when it does not exist.
Agentics' default language model is now deepseek/deepseek-v4.1-flash-1017 (2026-10-20). On 生成模型 › 🧩 语言模型/DeepAgents › Agentics, the default model (DEFAULT_GENCONFIGdeepagents.agentics.model in services/runtime/core.py) changes from z-ai/glm-5.3 to deepseek/deepseek-v4.1-flash-1017. Saved configurations that never picked an Agentics model (empty value) fall back to the new default; an explicitly chosen model is kept.
English line-duration estimates are calibrated on 63 real syntheses: the default word rate goes from 130 to 160 wpm, narration estimates are computed by the host, and the post-render dialogue check merges inter-sentence pauses (2026-10-20). The 130 wpm default introduced in 1.0.39 was a deliberately conservative guess. The new tool code/calibrate_time_cost.py collects English lines (corpus), synthesizes each with the character's frozen voice at natural speed and measures it after the dialogue voice library's silence trimming (synth), and solves the default rate under the time scale's current structure, 0.7 s onset + words ÷ rate + 0.4 s × in-line pauses (fit). The 63-line corpus (41 lines from two English-language projects, 22 written to cover numbers, times, initialisms, abbreviations, long words, fragments, dashes and shouting) was synthesized with Volcengine seed-audio-1.0; corpus, durations and fit report are in docs/time_cost_calibration/. Without a voice-card rate, 130 wpm estimated about 16 % too long (median actual / estimate 0.86, mean error 1.42 s); 160 wpm gives 0.99 and 1.09 s. DEFAULT_WPM in modules/time_cost.py is now 160, so cards with only a Chinese-style speed_cpm (converted at × 160/252) also get faster; the speed_wpm path was already unbiased and is untouched. Counting syllables or splitting pause types did not beat counting words (long polysyllabic words are spoken fast), so both remain diagnostics only. Narration: the new code/narration_est.py sets each narration.md entry's est_duration_s to the time-scale line_est (medium) × a project factor — the 80th percentile of measured / line_est over the project's other episodes' unretimed narrator segments (at least 5, clamped to 0.8–1.5), or 1.15 with no history; across 484 segments in 16 Chinese projects, hand-written estimates ran 1.72 s long on average, while an unbiased estimate would overflow the downstream window in 44 % of segments; the factor brings that to 10 % in a per-episode holdout. --write rewrites only the numbers in entry headers; check-only mode is the new machine check narration_est_consistent (tolerance max(0.25 s, 10 %)) on p5-narration, and the narration station no longer estimates by hand. code/check_dialogue_audible.py now merges voiced runs separated by ≤ 0.8 s (--merge-gap, was 0.5 s): English lines are often several short sentences, and in one English episode 4 false FAILs among 7 dialogue shots became 0 FAIL / 3 WARN, while a genuinely dropped line elsewhere still fails. modules/live_stream.py estimates word-counted lines with the time scale (its old 14 characters per second ran about 38 % short). Chinese and other non-English lines are unchanged. Stored estimates in existing English projects are not rewritten; check_dialogue_fit --write-est refreshes them if line_est_consistent reports a mismatch.
版本管理: 「复制项目」 now returns to the source project's console instead of switching to the copy (2026-10-21). When a copy started from 📋 复制项目 on the 🧬 版本管理 page finishes, the saved top-bar project (webui_prefs.project) and the redirect both point to the project that was copied (/?project=<source>, landing on the orchestrator as before), not to the new one; a copy that was still running when the page was reloaded behaves the same when it completes. The card now says the new project can be opened from the top bar's project picker, and the completion notice reads 「✓ 复制完成,正在返回当前项目控制台…」 (both strings re-keyed and retranslated in the 11 UI languages).
README rewritten, with screenshots and a 30-second intro video (2026-10-12).README.md and README.zh-CN.md are restructured: a one-line pitch with navigation and badges, a Storyboard preview hero image, a 30-second silent intro video, a three-step overview, the supported execution engines and providers as listed on the settings pages, who it is for, features, a nine-screenshot tour, the problems it solves, a quickstart (desktop download or running from source), related repositories (plugins, skills, samples) and community links. Figures were corrected against the code (now 118 agents in 17 departments, up to 12 human sign-off gates, 12 UI languages). Desktop development, packaging, release and integration notes moved to docs/DEVELOPMENT.md / docs/DEVELOPMENT.zh-CN.md; the images and the video master are in docs/assets/readme/.
Fixed
Untranslated Chinese in English and other non-Chinese interfaces: Director's console, post-production, storyboard preview and input placeholders (2026-10-12). On the 导演台 (Director's console), the object categories in the 「对象」 dropdown and in note entries, and the station names in the 「发给」 dropdown, come from the server as Chinese constants and were joined into the option text before the dictionary lookup, so they never matched; they are now translated first and joined afterwards. Version labels the host writes in a fixed form (「提交前基线」, 「批次 B-NNNN」) now appear in the UI language in the version dropdown, the version list and the viewport version badge. On 后期处理, the group filters 「有草稿 / 有缺陷 / 未动过」 gained dictionary entries, and the A / B monitor badges use the existing 「母本 v0」 entry (so the Chinese badge now reads 「母本 v0」, matching the version dropdown). On the storyboard preview (分镜预览), the placeholders of the transition title card's three line inputs were assembled at run time from 「第」 + number + 「行」 and are now one parameterized entry, 「第 {n} 行」. In the dictionary runtime (apps/web/static/i18n/i18n.js), data-no-i18n on an element itself also blocked its placeholder, so the placeholders of the note boxes on the script and storyboard pages and of the NSFW custom-model input stayed Chinese although the dictionaries had translations; now only an ancestor's marker blocks the placeholder, while the element's own marker still protects the value the user typed (title / alt follow the old rule). Five entries were added to each of the 11 dictionaries.