Skip to content

v1.12.1

Latest

Choose a tag to compare

@inureyes inureyes released this 18 Aug 04:20
· 2 commits to main since this release

The app now records which provider you picked for a model and asks the router to honor it, every container runs through one execution layer, and Linux x86_64 CUDA engines ship for the first time.

Backend.AI GO v1.12.1

73 commits since v1.12.0. (74,437 lines added, 14,500 lines deleted)

New Features

Provider selection (epic). When two registered providers serve the same model id, the picker now lists one row per provider instead of collapsing them into a single row labelled with whichever provider was written last . The pick is persisted as a cloud:<providerId>:<modelId> composite whose scheme has exactly one owner, replacing four TypeScript parsers that disagreed on malformed input , and sent to continuum-router as the x-backend header . The header is feature-detected through backend_preference_header_v1, so no router version literal enters the codebase, and it is a preference rather than a pin: the router falls through to normal selection on a name it cannot honor.

  • The shared Rust LLM client carries the same preference on all six of its request-building branches, Unix socket, Windows named pipe and HTTP, streaming and non-streaming each, with a source-scan test that fails if a seventh branch is added without it .
  • Plugin model settings , squad agent models , and the Canvas image picker each record and honor the pick. Canvas sends the header only on /v1/images/generations, where the router narrows the named backend to the backends serving the requested model.
  • The Management API inference proxy forwards the preference, so web and headless clients keep it across local TCP, Unix-socket and remote-node forwarding, and across failover retries .
    Linux x86_64 CUDA engines . The one hole in the engine build matrix is filled. Upstream publishes no Linux x86_64 CUDA release asset and hosted runners have neither a GPU nor a CUDA toolkit, so these engines build inside an nvidia/cuda devel container against the stub libcuda that image ships. The CUDA runtime ships as its own .bairuntime package, matching Windows, and library deduplication across every source-built Linux package cut the cuda13 engine from 535 MB to 144 MB. Linux ARM64 is deliberately excluded: GB10 and GH200 engines build against the system CUDA on those machines.
    Data Wiki continuation builds . A library larger than one build's budget could never be fully covered, because the planner truncated to 40 pages and re-planned the same top clusters every run. Continue drafts the still-unwritten clusters and converges over repeated runs. The page cap rises to 80, the wiki gets its own 20,000-document scan ceiling, and per-run coverage is persisted so the Continue button can show the remaining count.
    Data Library query-scoped bulk selection . A filtered view can now be acted on in full, not just the part that fits on one page. The selection carries the query rather than an id list or a count, and the server re-resolves it inside the transaction that acts on it.
    Redesigned update-ready indicator . The sidebar footer's version line reserves its row height whether or not an update exists, so nothing shifts when one arrives, and gains a tinted chip carrying the version relationship in its tooltip. The header badge's separate dot is gone: it sat beside the notification count dot, so the cluster carried two competing badge idioms.

Improvements

  • Exact Active, Failed and Trash counts replace 500+ in the Data Library, and a pager reaches documents past the newest 500 in a scope, which browsing could not reach at all before .
  • Gap and margin declarations moved onto the margin token ladder, and the remaining hardcoded orange literals and --token-* fallback literals were removed from CSS and documentation .
  • Wiki citation rewriting runs over an mdast parse instead of a code-region scanner .
  • Citation chips are compact with hover titles, and the wiki reading column is wider .
  • The Data Library row Restore action is icon-only, giving the row back the horizontal budget a repeated label consumed , and the wiki empty-state build controls lay out as a label/control grid .
  • The job progress strip moved to page level and reports wiki runs .
  • The router backend name is derived once, in Rust, and never re-derived in TypeScript .
  • The duplicated build_default_settings is unified into manifest.rs as the single definition .

Bug Fixes

Models and providers

  • Under an enterprise policy approving two or more model ids, startup auto-select could make an unapproved model the active selection, and that id then reached the router. The candidate list is narrowed once where availableModels is built, so the "nothing available", "selection still valid", "restore persisted" and "first available" reads all judge the same approved set .
  • The two model-selector value vocabularies converged .
  • A plugin selection whose provider was deleted was sent whole and answered with MODEL_NOT_FOUND. It now de-qualifies to its bare model id when the router catalog is populated and holds no exact match, so a genuine cloud:-prefixed router model id still survives .
    Engines and diffusion
  • The saved Diffusion Config reaches sd-server at model load. SdLoadModelRequest has 35 fields and the frontend sent 2, so 33 load-time settings took their serde defaults: a LoRA directory or VAE override never applied, the CPU offload flags never took effect, and a chosen weight type was ignored .
  • --qwen-image-zero-cond-t is gated on the resolved engine's upstream commit count, with an exact boundary at 765. stable-diffusion.cpp removed the flag in master-765-bb84971 and sd-server treats an unknown argument as a fatal parse error, so a launch with the toggle on failed to start outright against sd-cpp 26.8.17 .
  • The sd-cpp Windows build follows upstream's collapse of the per-ISA CPU archives into one bin-win-cpu-x64 archive. The old lookup found nothing, fell through to a source build, and failed on a runner with no toolchain for it .
    Containers
  • Docker's removing state is handled as terminal. It was the one of seven documented State.Status values not enumerated, so a status inspect that raced container removal took the catch-all arm and reported an ordinary teardown as an infrastructure failure .
  • The container sidecar is codesigned and its image references normalized .
    Data Hub
  • Wiki citations the renderer draws as code are no longer counted, so the Sources panel, the byline and the rendered body agree on how many sources a page delivers .
  • A code region no longer leaks a rewritten wiki citation as literal characters .
  • A failed wiki run keeps its coverage and skipped-cluster list , a no-change update records coverage so Continue stays reachable , and the Continue button stays present when the backlog is zero .
    Squad
  • Workspace Explorer file names were truncated to their first few characters by hidden metadata, so artifacts sharing a prefix could not be told apart without opening each one .
  • A workspace search hit lost the file name and line number to an end-ellipsis, which are the two things a hit exists to convey. The ellipsis now lands among the leading directories and the row carries the complete path:line as a tooltip .
    Accessibility, theming and other
  • Every focus indicator routes through the contrast-corrected ring token, including the 128 border-based rings .
  • The dark-theme border on the highlighted structure flow stage is restored .
  • Two byte-index truncations missed by route through text_utils, so a Calendar API error body carrying non-ASCII text no longer panics on the normal error path . A third, in the enterprise feature-gate source scan, is latent rather than live and was fixed the same way .
  • The companion's robot avatar is the default everywhere. The default persona preset carried characterStyle: "default" and flipped a fresh install back to the human face on first selection, and all seven locales labelled that option "Default" .
  • The site download section and hero button list only desktop builds .

CI/CD Improvements

  • A live Docker integration suite exercises the shared container backend against a real daemon . One of its assertions sampled container status immediately after stop_container, racing Docker's removing window, which is why it passed alone and failed under full-suite load; it now waits for teardown to settle .
  • check-design-tokens.mjs gains three CSS drift checks .
  • The ViewModeToggle storage degradation tests bite instead of passing vacuously .
  • MIN_ROUTER_VERSION tracks the download-time pin .
  • update-dep-version knows the CUDA toolkit versions .

Technical Details

One container execution layer (epic). Every container the app runs goes through src-tauri/src/container/backend/. Four argv dialects, three launch-spec types and three image-pull implementations converged into a ContainerBackend trait with one SubprocessBackend driving both docker and aigo-container-cli, one ImageService, one validating ContainerLaunchSpec builder, and two lifecycles: BatchExecution runs a container to completion, ServiceSession starts, health-checks, supervises and stops one. Squad and cowork batch runs, containerized inference engines, the Hermes gateway and the OpenClaw gateway are all consumers. A source-scan guard fails the build on a new direct docker invocation outside that directory, and a consumer-matrix contract test asserts all four consumers build their spec through the validating builder .

  • 51 English and Korean manual pairs were audited against the current routes, settings, APIs, container flows and engine support. The legacy MLX serving narrative is replaced with the MLXcel-first lifecycle, Logs and Audit Log get dedicated manuals, and 82 WebP screenshots (38 new, 44 refreshed) were generated through the Make and Playwright workflow, occupying 1,129,672 fewer bytes than the 44 assets they replace .
  • A Data Hub GA evidence harness records the measurements behind the GA gate .
  • A design document for the goindol standalone platform, and a technical report for the sd-cpp Windows asset rename .

Dependencies

  • continuum-router v1.21.1 to v1.22.0.
  • mlxcel v0.5.0 to v0.5.2.

Breaking Changes

None.

Known Issues

  • The provider preference is not sent on /v1/images/edits or /v1/images/variations. continuum-router applies no candidate check on those two paths, so a name it cannot honor fails the request instead of falling through, and the app cannot establish candidacy from what it receives .
  • Upstream stable-diffusion.cpp has deprecated --clip-on-cpu and --vae-on-cpu in favor of --backend te=cpu and --backend vae=cpu. Nothing is broken today; the mitigation is recorded so it is not re-derived when upstream removes them .
  • .xls and .xlsb are recognized but not converted. Re-save as .xlsx to ingest them .

Full Changelog