Argos, my CRM, calls an LLM from about ten background jobs: summarizing email attachments, matching an email or a Granola meeting note to the right deal, enriching a prospect record, extracting companies from the Finistère chamber of commerce directory. Until 14 October, every call went to a paid API, Mistral Medium on Scaleway or Claude Haiku on Anthropic. From 12 to 14 October the Anthropic account ran out of credit and 21 document summaries sat waiting. My Claude Max subscription was already running on my Mac for Hermès, my automation tool.
A task table in Argos, a daemon on the Mac
Argos runs on a server and cannot reach my Mac, which moves around, sleeps and changes networks, so the Mac pulls the work instead. Argos writes each call to an llm_tasks table, with the messages, the attachments and a deadline, and a daemon on the Mac claims them through Argos’ MCP server, the one I already use to drive the CRM. It exposes three tools, claim_llm_task, complete_llm_task and fail_llm_task. A claim takes a ten-minute lease, and attachments come as signed URLs that also expire after ten minutes.
The daemon, llm-worker, is a Hermès agent started by launchd. It claims a task, hands it to claude -p and sends the answer back.
Each Argos service declares a tier, fast or careful, which the Mac maps to Haiku or Sonnet. When a local model runs on a Mac Studio, that line of configuration is the only thing that changes.
Falling back to the API
Each family of calls waits a bounded time for the Mac, then Argos runs the call itself with the API it used before. Summaries can wait six hours, and their job reschedules itself in the meantime. Ingestion (attributing emails and meeting notes, enrichment) waits 60 seconds inside the job. A failure reported by the Mac triggers the fallback at once.
Every family ships switched off (delegate: false) and is only turned on after a bench run in production. Summaries passed theirs on 14 October: 10 documents, 4 to 9 seconds each, as good as the API ones. Ingestion failed its first bench run. The JSON was valid 20 times out of 20, but 3 of 5 email summaries came back in English for French emails, and the rationales ran 50 to 70 words against a 40-word limit. The prompt was written in English and named no language, and Mistral had answered in French. Comparing the two, I also found that Mistral scored 249 of its 259 attribution suggestions at 0.8 or higher, just above the auto-attribution threshold, and the prompt gave it no scale. The language, the length and the scale are now spelled out in the prompts, for both providers, and ingestion moved to the Mac after a second bench run.
Thirteen days in production
From 14 to 27 October the Mac handled 332 calls, 243 for ingestion and 89 summaries, with a median of 4 seconds and a 90th percentile of 9. Over the same period:
- 9 ingestion answers arrived after the 60 seconds, with runs of up to 147 seconds; Argos refused them, since the call had already gone to Scaleway;
- on the evening of 16 October I hit the subscription’s weekly limit, and 3 tasks failed within a second and went to the API. The daemon was supposed to pause for five minutes and did not:
claude -psaid “weekly limit”, wording my list of patterns did not know.
What still runs on the API
Prospection, which scores how well a prospect fits, and Reach, which writes my outreach drafts, still run on Scaleway. For the first, I will compare Mistral’s and Claude’s rankings on the same set of prospects. For Reach, I will read 20 regenerated drafts before switching anything on, because the writing style changes from one model to the next. The 60-second budget for ingestion is still tight for the slow claude -p calls. The local provider is waiting for the Mac Studio to arrive.