Repository navigation
feat: add Colibri as a managed inference engine - #197
Open
ihebChaaraoui wants to merge 3 commits into
Open
ihebChaaraoui wants to merge 3 commits into
ihebChaaraoui wants to merge 3 commits into
Conversation
ihebChaaraoui
marked this pull request as ready for review
November 5, 2026 11:07
Colibri (github.com/JustVugg/colibri, Apache-2.0) runs large
mixture-of-experts models on consumer hardware by streaming experts from
disk. Add it as a fourth engine beside Ollama, LM Studio and llama.cpp:
- shared: the colibri engine entry (facade 8000, engine 8001) and the
"co" discovery key.
- engine-manager: a manifest pinned to the v2.1.0 release archives, each
checked against its published sha256, and generic primitives for an
engine that keeps each model as a directory and serves one per
process: a scan_dir listing, launch_model (persist the launch model
and restart onto it), hf_snapshot pulls of open Hugging Face
repositories (resumable, free-space checked, moved into place only
when complete), the {model} launch placeholder, a manifest catalog of
models listed by repository with their download rules, and
model_types, the config.json model_type values the engine runs.
- engine:catalog lists the models of Colibri's own setup list first,
then the colibri-tagged repositories whose model_type Colibri runs,
leaving out builds made for ports of Colibri.
- proxy, broker, TUI and inference-dispatcher: the Colibri facade,
engine profile, model wires and backend name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Iheb Chaaraoui <i.chaaraoui.takolor@gmail.com>
Add Colibri to the engine identity, proxy identity and capability tables. It has no eject, since a running server serves one model, and its downloads work while the engine is stopped. Its model hub is searchable, which is now a capability rather than a llama.cpp check. It gets its own icon, and the welcome screen leaves it unselected, because its models run to hundreds of gigabytes and its launcher needs Python. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Iheb Chaaraoui <i.chaaraoui.takolor@gmail.com>
Cover Colibri wherever the engines are listed. Describe its directory model store, Hugging Face snapshot downloads and manifest catalog, the new manifest fields and action kinds, and the facade and discovery key. Note that it needs Python 3.10 or newer, that it serves one model per process, and which architectures it ships for. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Iheb Chaaraoui <i.chaaraoui.takolor@gmail.com>
ihebChaaraoui
force-pushed
the
feat/colibri-engine
branch
from
November 10, 2026 10:10
a1ed3a2 to
2ef3f1c
Compare
ihebChaaraoui
marked this pull request as draft
November 10, 2026 10:11
ihebChaaraoui
marked this pull request as ready for review
November 10, 2026 10:28
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changelog title
Colibri: run large mixture-of-experts models
Changelog body
colibri, filtered to the architectures Colibri v2.1.0 can run.~/colibri-models, check free disk space first, resume after an interruption, and appear in the list only once complete.Bumps
Description
Colibri is an Apache-2.0
mixture-of-experts inference engine that streams expert weights from disk. It
makes a class of models usable on a single machine that PAIR could not serve
before: 20 GB to more than 1.5 TB checkpoints whose experts do not fit in memory
at once. This PR adds it as a fourth managed engine beside Ollama, LM Studio,
and llama.cpp.
A user can install Colibri from Engine settings, open Add model, pick one
of Colibri's own setup models or an open Hugging Face repository tagged
colibri, and let PAIR download it into~/colibri-models. Load persiststhe chosen model and restarts the server onto it; Delete removes that model
directory. Colibri serves one model per process, so the UI offers no Eject.
The engine listens on loopback
8001behind PAIR's proxy facade on8000, andthe proxy, broker, TUI, and inference dispatcher know its OpenAI and Anthropic
surfaces.
Most of the engine-manager work is generic rather than Colibri-specific: a
scan_dirmodel inventory for engines that keep one directory per model,hf_snapshotdownloads of open Hugging Face repositories with resume and afree-space check, a
{model}launch placeholder for single-model engines, amanifest
catalogwith per-repository download rules,after_downloadsteps,and
model_typesso only architectures the pinned engine release runs areoffered. Colibri is the first manifest to use them.
Dependencies and Integrations
Current requirement. Ollama, LM Studio, and llama.cpp all need the model
weights to fit in RAM or VRAM. Colibri targets the models users ask for when
they do not: mixture-of-experts checkpoints whose inactive experts can stay on
NVMe. Without it, PAIR cannot install, list, download, or route to such a model
at all. No new Go or npm dependency is introduced; the engine is a JSON manifest
plus generic engine-manager primitives, and every download is performed by PAIR
itself.
License. Colibri and its release archives are Apache-2.0. Model
repositories keep their own licenses, which Hugging Face reports and the user
accepts there; PAIR only downloads repositories that are explicitly open.
Supported-version policy. The manifest pins Colibri v2.1.0 for each
platform that has a release: Windows x64 (base archive plus the CUDA archive),
Linux x64 (Vulkan), and macOS arm64 (Metal). Every archive is pinned by URL and
SHA-256 in
manifests/colibri.json; PAIR verifies the hash before unpacking andnever upgrades an engine on its own. The manifest's
model_typeslists theconfig.jsonvalues understood by that release's engine registry and must bere-derived whenever the pinned release changes. Platforms without a v2.1.0
archive report Colibri as unavailable rather than falling back to a build from
source.
Validation boundary. Unit tests cover manifest validation, catalog
filtering, snapshot planning and resume, discard of unsafe paths, free-space
refusal, after-download steps, launch-model persistence, proxying, and the
desktop identity/capability tables, all against fake Hugging Face and process
fixtures; the suite makes no live download and starts no real engine. A real
install, download, and generation was not part of CI: it needs a machine with
enough NVMe for the chosen model and, for CUDA, a supported GPU. No performance,
quality, or hardware-compatibility claim is made here.
Maintenance plan. The engine is data, not code: a new Colibri release is a
manifest update (URLs, SHA-256 values,
model_types, and any catalog changes) inone reviewable PR, followed by the engine-manager suite. The
colibritag andmodel_typefields on Hugging Face are the discovery contract; if upstreamrenames or drops them, only the Colibri catalog source changes. If upstream
abandons the project, deleting
manifests/colibri.json, the enum entry, and thecatalog source removes the engine without touching the other three.
Security implications. Install artifacts are pinned and hash-verified, and
only user-scoped installs are performed. Downloads only accept repositories
whose
privateandgatedfields are explicitly false; no Hugging Face tokenor credential is read or stored.
after_downloadscripts are resolved inside thefrozen install directory, run with the model directory as their only argument,
and are bounded in time. Repository file names are rejected if they are
absolute, contain
.., or would land outside the model directory. The enginebinds
127.0.0.1on its own port and is reached through PAIR's proxy; modelprompts and responses are not logged.
Scope
Included: the Colibri manifest and catalog, the shared engine entry and
discovery key, the engine-manager model-store and download primitives, proxy,
broker, TUI, and inference-dispatcher support, the desktop engine identity,
capabilities, icon, welcome and model-hub handling, and the documentation and
rule updates that list the engines.
Excluded: the local sandbox/routing work in progress and the broker's
loopback-port fix; neither is part of this branch.
services/versions.jsonandCHANGELOG.mdare untouched, as required.Validation
Go 1.27.0, Windows x64, in a checkout of this branch:
All pass. In
services/nvpair-engine-manager, the same commands pass except fortwo pre-existing Windows-only issues unrelated to this change:
TestRemoveTreePreserving_ReportsUndeletableEntriesAndRemovesOthersfailsbecause the test cannot make a file undeletable on this filesystem, and
go vetreports a
lostcancelininstall_artifacts_test.go, a file this PR does notmodify.
Desktop, from
desktop/:typecheck:node,typecheck:web,lint,service-contracts:check, andverify:build-scriptspass. The unit suite reports 283 passed and 2 skipped,including
engine-identity,proxy-engine-identity,model-catalog, andmatch-downloaded-model. Its 15 failures are all in upstream'smac-privilege-service.test.ts, which reports the macOS helper as unsupportedwhen the suite runs on Windows; that file is not touched by this PR. SPDX
reports 1103 files checked, 0 missing. Two local checks were inconclusive
because the checkout's
node_modulesdid not matchpackage-lock.json(a newerVitest and knip were installed): the test-project
tscpass anddead-code:check. CI installs from the lockfile, where both are part of thenormal gate.
The cross-process
services/testssuite was also run. It reached one failure,TestWorkloadManager_BroadcastsLocalEventsToPeers, where the supervisedworkload-manager could not bind its fixed port
14320; the test is unchangedhere and fails the same way when run alone. The other cross-process tests
passed.
The pull-request description validates with:
Risk
and SHA-256 verification, user-scoped install, and explicit Python 3.10+
probing before unpacking.
partial files, and only renames a complete
.partialdirectory into place, soan interrupted pull never appears as a usable model.
ignore the unknown key, and the existing engines keep their ports and
behavior; Colibri reserves
8000/8001.actionable message when it is missing, and the welcome screen does not
preselect the engine.
loads; this is scoped to Colibri's manifest.
Checklist
git commit -s), certifying the Developer Certificate of Origin.services/versions.jsonis written by automation; I did not edit it by hand.🤖 Generated with Claude Code