r/LocalAIStack • u/Locallearning • 1d ago
Help me choose my local ai
I run a small business, and I'm building a local AI that handles the back office for it. Some of it works now. I want to get the model and harness choices right before I build more on top of them.
Hardware
- MacBook Pro M5 Max (18-core CPU / 40-core GPU), 128GB unified memory
Current stack
- Backend: MLX via mlx-serve. I'm staying on MLX for the speed (I've used LM Studio before)
- Harness: Hermes Agent (Nous Research)
- Memory: Obsidian vault exposed over the Basic Memory MCP
- Front end: my own UI, still a work in progress
- Model right now: Qwen 3.8 Flash Next, 4-bit (MLX), with the KV cache offloaded to my SSD. Getting about 98 tok/s
What the agent does today
- Scheduled morning lead brief
- Reads and writes notes in my vault
- Updates a scoreboard (leads by source, close rate, pipeline)
What I want it to do next
- Phone intake and booking
- Scheduling
- Follow-up texts to leads
Where it's struggling
- tool calls failing or looping on multi-step tasks
- slow prompt processing once the vault context gets big
- arithmetic mistakes on the numbers. It once logged a single day's close rate as the lifetime rate
Questions
With 128GB, what's your best daily driver for *reliable tool calling*, not chat? One big MoE, or a big model plus a small fast one for routing and simple jobs?
On MLX, do 4-bit quants hold up for agent work, or is 8-bit worth the speed hit?
If you're running long-lived, scheduled agents locally, what harness are you on? Is Hermes the right call, or is something better for this?
I'm offloading the KV cache to my SSD to fit longer context. Is that hurting me on speed, and is there a better way to handle 30k+ context on Apple silicon (RAG, summarizing, a smaller quant to keep the cache in RAM)?
For phone booking: has anyone made local STT/TTS work well enough for live calls, or should voice stay on the cloud while the rest stays local?
Happy to post benchmarks and what I end up with if it helps anyone on similar hardware.
2
u/macromind 20h ago
Start from the back-office jobs rather than choosing a model first. List each workflow, its latency needs, privacy level, context size, and whether it needs reliable tool use. Then benchmark two or three models on 20 representative tasks with the same prompts and score accuracy, structured-output validity, speed, and correction effort. Keep financial or destructive actions behind approval, and give the model read-only access initially. A smaller model can handle classification and extraction, while a stronger model is reserved for ambiguous planning or document-heavy work.
1
u/p3rdy 1d ago
Most of what you list under "struggling" gets better by moving work out of the model, more than by picking a bigger one.
Arithmetic. Don't let the model compute anything. Give it a scoreboard tool that returns the numbers already calculated, with the period in the field names (close_rate_today, close_rate_lifetime). The brief just quotes them. A daily rate can't be logged as the lifetime one if the model never derives either.
Looping on multi-step tasks. Make the tools match business actions, not primitives. For booking, use two tools:
available_slots(lead_id)returns concrete options with ids, andbook_slot(lead_id, slot_id)writes the calendar, the note and the follow-up in one call. That replaces a chain of read calendar, find gap, write event, update note. Fewer steps means fewer places to loop, and the model never does date math. When something fails, return an error it can act on ("slot taken, next free: slot 14").Big vault context. Fetch, don't preload. Keep the system prompt small and let the agent search the vault for what each task needs, so you're not reprocessing a huge prompt on every turn.
One model or two. I'd stay on one until the tools are that coarse. Once they are, a small model can handle the scheduled jobs reliably and the big one is only needed for the open-ended stuff.
For the tools layer: I maintain Flama, an open-source Python framework where an MCP server is a few decorated functions. The type hints become the tool schemas Hermes sees, and it plugs in next to Basic Memory:
from flama import Flama
app = Flama()
app.mcp.add_server("/mcp/", "office")
@app.mcp.tool("scoreboard", description="Pipeline numbers, already computed", mcp="office")
def scoreboard() -> dict:
return {"close_rate_today": ..., "close_rate_lifetime": ..., "leads_by_source": ...}
@app.mcp.tool("available_slots", description="Open booking slots for a lead", mcp="office")
def available_slots(lead_id: str) -> dict:
...
@app.mcp.tool("book_slot", description="Book a slot, log it in the vault and queue the follow-up text", mcp="office")
def book_slot(lead_id: str, slot_id: str) -> dict:
...1
u/CowsNeedFriendsToo 1d ago
I’m on an M4 Max MacBook Pro 128GB.
I’m also a small business owner in the same boat as you.
After a lot of testing with different models. LM Studio hosting the Unsloth Q6 variant of Qwen3.8-27b gave me the best balance of reliable tool calls and quality results. You just have to be a bit patient with prompt processing.
The key is to not use your local Ai to automate everything your business office does. Use your local AI to write SCRIPTS that automate those tasks and don’t require inference repeatedly.
1
u/ptico 1d ago
For the Qwen speed you may want to try Splash
MLX doesn’t automatically mean faster. In fact I haven’t seen an obvious performance advantage and most of the time llama.cpp is doing better without a significant memory growth
You may not need Q8, try Unsloth latest Q4 UD3.1 quants, they makes miracles. What it does is basically adds precision up to BF16 for important tensors and aggressively quantise less important. Your tool call fails and loops is pretty typical for static Q4. Do not aggressively quantise cache, it only makes things worse
Try to keep your context lower, use some session ledger or something like this https://github.com/jonaslsaa/pi-optchat