Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
b507b05
Autopilot: the Agent's own view as the fourth tab
KBRASK Oct 13, 2026
e088887
Agent: the connected line says Connected to <agent>; the guide points…
KBRASK Oct 13, 2026
2822815
Install progress card names the step it is on
KBRASK Oct 13, 2026
6b3849f
Launcher keeps waiting while ComfyUI is still starting, up to ten min…
KBRASK Oct 13, 2026
cea3293
Agent job rows no longer repeat the agent's name
KBRASK Oct 13, 2026
1c4ba66
Agent: a conversation between the Autopilot view and the connected agent
KBRASK Oct 13, 2026
be16a6c
Agent guide: an empty wait is not the end of the conversation
KBRASK Oct 13, 2026
5d386d1
Autopilot is a conversation with the connected agent
KBRASK Oct 13, 2026
5ea9991
Agent conversation: short first line, named jobs, phase timing on cards
KBRASK Oct 13, 2026
596615c
Agent guide: the introduction does not end the turn
KBRASK Oct 13, 2026
cd9ba07
Agent guide: the example sends length and shape, a new ref per request
KBRASK Oct 13, 2026
6a85405
Agent chat: Chinese punctuation in what the agent says, the library b…
KBRASK Oct 13, 2026
56dee3c
Autopilot conversation: progress moves the way the creation panel's does
KBRASK Oct 13, 2026
360729e
Agent jobs list: the conversation's wording for the first step and th…
KBRASK Oct 13, 2026
c5689c3
Agent guide: a finished video does not end the turn, no summary in th…
KBRASK Oct 13, 2026
866c026
Agent interface: the answers to reading, cancelling and resuming a jo…
KBRASK Oct 13, 2026
2e3f047
Autopilot conversation: progress keeps rising while the model loads f…
KBRASK Oct 13, 2026
cd00ad1
Autopilot conversation: the card says what the engine is doing before…
KBRASK Oct 13, 2026
6a1cef5
Agent guide: say it first and wait after; each request's ref carries …
KBRASK Oct 13, 2026
329c5d8
Setup downloads: retry once with a longer wait when every source fail…
KBRASK Oct 13, 2026
beec13a
Sampling answers a video-memory budget cut inside a step
KBRASK Oct 13, 2026
73c4f17
Launcher: LAN access switch and any local listening address
KBRASK Oct 13, 2026
659fd3a
Start from install folders and user names the system code page cannot…
KBRASK Oct 13, 2026
d936e95
Launcher: a dialog offers to delete imported offline package ZIPs tha…
KBRASK Oct 13, 2026
10a4e11
Agent: subtitles edit operation and a listen job for automatic subtitles
KBRASK Oct 13, 2026
e65f005
Launcher asks before freeing video model files the engine no longer r…
KBRASK Oct 13, 2026
ad7d946
Runtime third-party notices name ComfyUI, comfy_aimdo and comfy_kitchen
KBRASK Oct 13, 2026
2a13bd6
0.4.0 release notes: LAN access, offline package archives and late fixes
KBRASK Oct 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ vendor/
downloads/
prepared/
kernel-cache/
# Dedicated compiler scratch files, also under engine in portable installations.
tmp/
wheels/
machine.json
prepared-cache.json
Expand All @@ -61,3 +63,4 @@ engine-gpu-*.lock
# Optional local prompt models, runtime binaries and private rewrite caches.
/optional/
*.gguf
/out/
53 changes: 39 additions & 14 deletions freevideo.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -92,27 +92,47 @@ try {
-EngineRoot $freevideoRoot -LogPath $bootstrapLog -GithubSources $routes `
-ProxyRoutes $proxyRoutes -OfficialOnly:$officialOnly
$env:UV_PYTHON_INSTALL_DIR = Join-Path $bootstrapRoot 'python'
$env:UV_HTTP_TIMEOUT = '20'
$env:UV_HTTP_RETRIES = '1'
$env:UV_NO_CONFIG = '1'
$installed = $false
$pythonRoutes = @($routes | ForEach-Object { "$_/astral-sh/python-build-standalone/releases/download" })
if (-not $officialOnly -and $freevideoSavedEnvironment['UV_PYTHON_INSTALL_MIRROR']) {
$pythonRoutes = @($freevideoSavedEnvironment['UV_PYTHON_INSTALL_MIRROR']) + $pythonRoutes
}
$attempt = 0
foreach ($route in $pythonRoutes) {
foreach ($proxyRoute in $proxyRoutes) {
if ($installed) { break }
$attempt++
$env:UV_PYTHON_INSTALL_MIRROR = $route
Write-Progress -Activity 'FreeVideo bootstrap' -Status ('Install isolated Python ' + $versions.python)
$pythonExit = Invoke-FreeVideoBootstrapCommand -Executable $uv `
-Arguments @('python', 'install', '--no-bin', '--no-registry', '--no-progress', '--color', 'never', $versions.python) `
-LogPath $bootstrapLog -Label ("Install Python $($versions.python), attempt $attempt ($proxyRoute connection)") `
-Direct:($proxyRoute -eq 'direct')
if ($pythonExit -eq 0) { $installed = $true; break }
Write-Host "Python install source $attempt returned exit code $pythonExit. Details retained in $bootstrapLog"
$allNetworkFailures = $true
# Keep these defaults and the notice in sync with network.py (CPU tests).
$pythonRetryProfiles = @(
@{Mode='fast'; UV_HTTP_TIMEOUT='20'; UV_HTTP_RETRIES='1'},
@{Mode='patient'; UV_HTTP_TIMEOUT='120'; UV_HTTP_RETRIES='5'}
)
foreach ($profile in $pythonRetryProfiles) {
if ($installed) { break }
if ($profile.Mode -eq 'patient') {
if (-not $allNetworkFailures) { break }
Write-Host 'The network is slow. Downloading again; this may take a while.'
}
foreach ($name in @('UV_HTTP_TIMEOUT', 'UV_HTTP_RETRIES')) {
$value = $freevideoSavedEnvironment[$name]
if ($null -eq $value) { $value = $profile[$name] }
[Environment]::SetEnvironmentVariable($name, $value, 'Process')
}
foreach ($route in $pythonRoutes) {
foreach ($proxyRoute in $proxyRoutes) {
if ($installed) { break }
$attempt++
$env:UV_PYTHON_INSTALL_MIRROR = $route
Write-Progress -Activity 'FreeVideo bootstrap' -Status ('Install isolated Python ' + $versions.python)
$pythonOutput = ''
$pythonLabel = "Install Python $($versions.python), attempt $attempt ($proxyRoute connection)"
if ($profile.Mode -eq 'patient') { $pythonLabel += ", $($profile.Mode)" }
$pythonExit = Invoke-FreeVideoBootstrapCommand -Executable $uv `
-Arguments @('python', 'install', '--no-bin', '--no-registry', '--no-progress', '--color', 'never', $versions.python) `
-LogPath $bootstrapLog -Label $pythonLabel `
-Direct:($proxyRoute -eq 'direct') -OutputTail ([ref]$pythonOutput)
if ($pythonExit -eq 0) { $installed = $true; break }
if (-not (Test-FreeVideoSlowDownloadFailure $pythonOutput)) { $allNetworkFailures = $false }
Write-Host "Python install source $attempt returned exit code $pythonExit. Details retained in $bootstrapLog"
}
}
}
if (-not $installed) { throw "Python installation failed (uv exit $pythonExit). Check your network or connection mode in Downloads. See $bootstrapLog and retry." }
Expand All @@ -123,6 +143,11 @@ try {
Write-Progress -Activity 'FreeVideo bootstrap' -Completed
}
}
# Restore only our download defaults before Python determines user overrides.
# A null saved value removes the variable from the child environment.
foreach ($name in @('UV_HTTP_TIMEOUT', 'UV_HTTP_RETRIES')) {
[Environment]::SetEnvironmentVariable($name, $freevideoSavedEnvironment[$name], 'Process')
}
& $freevideoPython @freevideoPythonPrefix -B -X utf8 -m freevideo_engine.managed @freevideoArguments
$freevideoExit = $LASTEXITCODE
} catch {
Expand Down
2 changes: 2 additions & 0 deletions freevideo_engine/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,7 @@
_build_version = _io_path(_build_version)
from .long_paths import start_process as _start_process
_start_process()
from .triton_compat import own_temporary_environment as _temporary_environment
_temporary_environment()
if _build_version.is_file():
__version__ = _build_version.read_text(encoding='utf-8').strip()
8 changes: 4 additions & 4 deletions freevideo_engine/access_proxy.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Token-protected access to a ComfyUI that listens on this computer only.

`freevideo server --listen ADDRESS` runs this in front of ComfyUI. The access
The launcher's LAN switch or `freevideo server --listen ADDRESS` runs this in front of ComfyUI. The access
link carries the token once; the page then keeps it in a cookie, and API
clients send it as a bearer token. Everything else gets 401, so ComfyUI is
never reachable from other computers without it, and not at all when this
Expand All @@ -27,9 +27,9 @@
<title>FreeVideo</title></head><body style="margin:0;min-height:100vh;display:grid;place-items:center;background:#10151e;
color:#e7edf7;font:15px/1.6 'Segoe UI','Noto Sans CJK SC','Noto Sans SC',system-ui,sans-serif"><main style="max-width:520px;
padding:28px 32px;border:1px solid #2a3443;border-radius:12px;background:#1a222e"><h1 style="margin:0 0 10px;font-size:19px">
This FreeVideo server opens from its access link</h1><p style="margin:0 0 18px;color:#a5b3c6">To show the link, run
<code>freevideo status</code> on the server.</p><h1 style="margin:0 0 10px;font-size:19px">请使用访问链接打开这台 FreeVideo 服务器</h1>
<p style="margin:0;color:#a5b3c6">在服务器上运行 <code>freevideo status</code> 即可查看链接。</p></main></body></html>"""
This FreeVideo server opens from its access link</h1><p style="margin:0 0 18px;color:#a5b3c6">Copy the link in the launcher under Settings → Preferences → Local network. On a Linux server, run
<code>freevideo status</code> to see it.</p><h1 style="margin:0 0 10px;font-size:19px">请使用访问链接打开这台 FreeVideo 服务器</h1>
<p style="margin:0;color:#a5b3c6">请在启动器的“设置 → 偏好 → 局域网”中复制链接。Linux 服务器上运行 <code>freevideo status</code> 可以看到链接。</p></main></body></html>"""


def matches(value, token):
Expand Down
Loading