---
title: My CRM's LLM calls now run on my Mac
description: Argos, my CRM, queues its LLM calls and my Mac drains the queue on my
  Claude subscription. The paid API is now only the fallback.
url: https://sxnlabs.com/en/ai/2026/10/27/appels-llm-du-crm-sur-mon-mac/
lang: en
date: '2026-10-27T13:00:00+01:00'
tags:
- AI
- LLM
- Claude
- Rails
---

# My CRM's LLM calls now run on my Mac

[Argos](https://sxnlabs.com/en/ai/2026/10/25/crm-sans-formulaires-pilote-par-mcp/), 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](https://sxnlabs.com/en/ai/2026/06/07/hermes-assistant-personnel/), 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.

<figure class="schema">
  <img width="1000" height="470" src="/images/posts/llm-delegation/file-et-bascule.en.svg" alt="An Argos job queues the call in the llm_tasks table. The llm-worker daemon on the Mac claims it over MCP, runs it with claude -p (Haiku for fast, Sonnet for careful) and returns the answer. Once the family's wait is over, or when the Mac reports a failure, Argos runs the call itself through the Scaleway or Anthropic API." />
  <figcaption>The Mac pulls the tasks and Argos never contacts it; once the wait is over, the API takes the call back.</figcaption>
</figure>

## 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 -p` said "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.
