lm-studio-tier
LM Studio's own skills, MCP servers and plugins are confirmed invisible to any
API client — they fire only on the GUI's Send button or the native /api/v1/chat
endpoint. A session bridged to LM Studio, or a script calling it directly, sees
none of that. The only two things that actually reach /v1/chat/completions are
the model and the preset (system prompt + sampling params) — everything
below routes through those two levers only.
Lanes, models, presets
| Lane | Model | Preset file |
|---|---|---|
mechanical-edit |
qwen2.5-coder-7b-instruct |
mechanical-edit.preset.json |
classify |
qwen2.5-coder-7b-instruct |
classify.preset.json |
vision-describe |
google/gemma-3-12b |
vision-describe.preset.json |
bulk-summarize |
mistralai/mistral-nemo-instruct-2407 |
bulk-summarize.preset.json |
Assignment is measured, not guessed — see Documents/Local Model Roster.md.
bulk-summarize's model is the one exception: provisional, chosen only to avoid
the reasoning-budget failure qwen3.5-9b hit on the classify task, not itself
benchmarked yet.
Presets live in ~/.lmstudio/config-presets/<lane>.preset.json — real LM Studio
preset format (operation.fields keyed llm.prediction.*), so they're also
visible from LM Studio's own GUI, not just from scripts.
Two ways to use this tier
Interactive session — Tools/local-tier/claude-local.ps1:
. .\claude-local.ps1
Start-LocalTier # idempotent, reuses server + model if already up
claude --bare --strict-mcp-config # required, see below
Batch job — Tools/local-tier/lms-batch.ps1, for a list of items instead of a
conversation:
pwsh .\lms-batch.ps1 -Preset classify -JobFile .\jobs\nodes.json -OutDir .\out\nodes
3-attempt cap per item, resumable (skips items already written), never marks an item done before its output file is confirmed on disk.
--bare --strict-mcp-config is required, not optional
Confirmed by reproduction (2026-08-20): running with the vault's full MCP config —
roblox-studio's user_mouse_input tool schema in particular — breaks LM
Studio's llama.cpp grammar compiler outright: Failed to initialize samplers: failed to parse grammar, a hard 400, not a slowdown. Both flags together, always.
Copy data into the isolated workspace — never --add-dir
claude-local.ps1 always cds into Tools/local-tier/workspace/ before starting
the session. Work from inside that workspace; copy in whatever files the task
needs rather than reaching out to the rest of the vault with --add-dir. The
point of the isolated workspace is that nothing outside it can reintroduce the
MCP-schema crash above or leak unrelated project context into a model with no
judgment to filter it.
The honest latency ceiling
Local inference is slow, not fast — this is the tradeoff for zero token cost, not
a bug to fix. Measured: qwen2.5-coder-7b-instruct at 7.90s for a short
classification; gemma-3-12b at 47s for one image description; a 17GB MoE model
at over 5 minutes just to load. Fine for a batch job left running in the
background; wrong fit for anything wanting a quick turnaround or a back-and-forth
conversation. Between runs, lms unload --all, and never retry a timed-out call
without checking lms ps first — a killed call can end up competing with its own
retry for the same compute.
What this tier cannot do
No tool use beyond what a model's own tool_use capability supports (check
GET /api/v0/models, never assume from the model name —
qwen2.5-coder-7b-instruct has none despite being a coder model). No MCP, no
subagents, no vault memory, no multi-turn task tracking. If the job needs any of
that, it stays on Claude Code proper.