vibe-orchestra
A Mistral model-and-specialist router for vibe.
Describe a task; it routes to the right Mistral model, specialist, and tool — so
you launch vibe and it orchestrates, instead of picking models by hand.
The idea
Inspired by Sakana AI's Fugu — you should not manage
which model to call. Fugu coordinates a pool of models with learned
strategies (an evolved coordinator + an RL-trained conductor). vibe-orchestra
does not learn coordination; it is the practical, hand-designed slice you can
run today: a cheap classifier picks the route, and a model policy maps each route
to the Mistral model, specialist, and tool that fit.
task ──▶ route() (Ministral, cheap)
│
surgical-edit ─▶ Codestral FIM · tool: vibe-fim surgical_patch
ios ─▶ Devstral · specialist: iOS posture + patterns
reasoning ─▶ Magistral
vision ─▶ Pixtral
agentic-build─▶ Devstral
quick ─▶ Ministral
chat ─▶ Mistral medium
Install — then vibe, and basta
git clone https://github.com/guillaumevele/vibe-orchestra && cd vibe-orchestra
IOS_KIT=/path/to/vibe-ios-kit ./install.sh
install.sh wires everything globally and reversibly (it backs up the files
it touches and edits only inside marked blocks):
- the orchestration posture →
~/.vibe/AGENTS.md(loaded by every session), - the
route+surgical_patchtools →~/.vibe/config.toml(global MCP), - the iOS specialist (posture + 38 patterns + a real
iosvibe skill) fromvibe-ios-kit.
Add --with-capabilities to also connect a curated set of real, keyless MCP
plugins so the orchestrator is autonomous out of the box:
./install.sh --with-capabilities # + apple-docs, context7, sequential-thinking
It pre-warms the npm cache and gives those servers a generous startup timeout —
a cold npx download otherwise exceeds vibe's 10s limit and destabilises MCP
init (learned the hard way). Plugins that need a key (github, supabase, brave)
are catalogued with their command and env var for you to add yourself — this
project never ships or asks for secrets.
After that, anywhere — no --agent, no per-project copy:
vibe "round the body of computeScore() to 2 decimals, leave the rest"
vibe "add a shimmer Metal loader to onboarding, gated on scenePhase"
Plain vibe calls route() to pick the model/specialist, then edits via
surgical_patch (Codestral FIM, bounded). Undo with ./install.sh --uninstall.
Use the router directly
pip install vibe-orchestra
vibe-orchestra route "verify the SwiftUI glassEffect API then add a glass tab bar"
# route : ios
# model : devstral-latest
# subjects : apple-docs, ios
# use : ios, apple-docs (already wired)
# why : SwiftUI work -> iOS specialist
vibe-orchestra routes # the model policy
vibe-orchestra capabilities # real plugins/skills: wired vs available
Connect real plugins per subject
route is capability-aware: it returns not just a model and specialist but
the real plugins/skills that serve the task's subject — split into ones already
wired into vibe and ones to consider adding (with the exact command and
any key). The catalog is verified, public packages only:
| subject | plugin | key |
|---|---|---|
| iOS / Apple APIs | apple-docs |
— |
| library docs | context7 |
— |
| hard reasoning | sequential-thinking |
— |
| browser / scrape | playwright |
— |
| backend / Postgres | supabase |
SUPABASE_ACCESS_TOKEN |
| repos / PRs | github |
GITHUB_PERSONAL_ACCESS_TOKEN |
| web search | brave-search |
BRAVE_API_KEY |
That is the autonomy: the orchestrator reaches for the right real tool per subject instead of guessing.
from vibe_orchestra import classify
d = classify("add a SwiftUI settings screen")
d.route, d.model, d.specialist # ('ios', 'devstral-latest', 'ios')
The classifier backend is injectable, so the routing logic is fully testable with no network:
classify("rename foo to bar", chat_fn=lambda system, user: '{"route": "surgical-edit"}')
/goal — autonomous loop
Installed as a native vibe slash-command. Give it a goal; it runs a hand-designed Thinker / Worker / Verifier loop:
/goal ship a gated Metal loader on the onboarding screen
- decompose into 2–6 subtasks, each with an explicit acceptance check, to
./.vibe-goal/PLAN.md; - route each subtask (model / specialist / plugins);
- dispatch to the smallest mechanism that works —
surgical_patchfor a bounded edit,reason/vision/quickfor a model sub-call, theiosskill for SwiftUI/Metal, or a subagent only when a different model must be pinned; - verify with a tool call (never prose) and paste the evidence into
REPORT.md; on failure it re-routes (retry budget 2); - synthesize, stating which model each step actually ran on.
A read-only goal-verifier subagent (runs the proof, cannot edit) is installed
for independent verification.
Model-backed tools
The router can also hand a sub-problem to the right model directly — these make a real Mistral API call for that subtask even though your session model is fixed:
| tool | model | for |
|---|---|---|
reason |
Magistral | hard root-cause / design / logic |
vision |
Pixtral | screenshots, UI, photos |
quick |
Ministral | cheap extract / classify / reformat |
Honest limits
- Coordination is hand-designed, not learned. Fugu's edge is the trained coordinator; this is a policy + a classifier. It is transparent and cheap, not evolved.
- Within one session the driving model is fixed. You reach other Mistral
models the two real ways: the model-tools (
reason/vision/quick, single-shot API calls) andsurgical_patch(Codestral FIM), or a subagent that pins a model.route()never silently swaps the session model. /goalis prompted, not enforced. A skill is instructions, not a runtime — the loop runs as faithfully as the model follows it. Fan-out is sequential, not parallel; "Thinker/Worker/Verifier" is role separation, not concurrent workers. Calling it Fugu-like refers to that shape, not learned coordination.- Model-pinning subagents are owner-gated. Pinning an
active_modelalias not in yourconfig.modelscrashes on first dispatch, so v1 ships none (thegoal-verifierpins nothing). Adding one means co-declaring its provider/model block — left to you on purpose.
Specialties
The iOS specialist is vibe-ios-kit
(build posture + 38 distilled iOS 26/27 patterns + a runnable lint). The registry
is extensible: a specialist is a vibe agent plus a posture the orchestrator
adopts when route selects it.
License
MIT © Guillaume Vele
Metadata
Release files for vibe-orchestra 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| vibe_orchestra-0.3.1.tar.gz | 26.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vibe_orchestra-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 52.0 kB
Release files / vibe_orchestra-0.3.1.tar.gz
| Download URL | vibe_orchestra-0.3.1.tar.gz |
|---|---|
| Size | 26.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ba3caa523ff2e972dd8318ef7bee140a88f17026f6663304cdf5a540aaf621d2
|
|
BLAKE2b-256 checksum How to use checksums |
83d11160089168a41802588c978c3f80edd8e450d02ec74088c40e2cdb939474
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.16
|
Release files / vibe_orchestra-0.3.1-py3-none-any.whl
| Download URL | vibe_orchestra-0.3.1-py3-none-any.whl |
|---|---|
| Size | 25.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
37bac070d50ed47814792a87c7ce3db6943dce895a286ff45d1e723c54a3e3bc
|
|
BLAKE2b-256 checksum How to use checksums |
17c2f9bb033f3be5ae2e7142b4a6eb21aa16f66e4357a5f39962b036393ee193
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.16
|