cool-solution — dev.blog
Tecnologie

Claude Code Router: tutorial passo passo per orchestrare Ollama, Claude e Codex

Nel nostro confronto tra gli assistenti AI arriviamo sempre alla stessa conclusione: il team più produttivo non sceglie un modello, li combina. Ma come si fa, in pratica? La risposta è un orchestratore — un router di modelli che mette davanti a Claude Code una sola interfaccia e dietro più backend. In questo tutorial lo costruiamo insieme con il Claude Code Router: instradiamo i task semplici su Ollama in locale (a costo zero e senza far uscire i dati) e quelli difficili su Claude o OpenAI/Codex nel cloud. Si parte da zero, un comando alla volta.

Schema del Claude Code Router: il comando ccr code entra in un router che instrada i prompt verso Ollama in locale, Claude API e OpenAI/Codex nel cloud, palette Cool Solution.

🧭 Cos'è un orchestratore (router) di modelli

Un orchestratore (o router di modelli) è un piccolo programma che si mette tra il tuo strumento — qui Claude Code — e i vari provider di modelli. Riceve ogni richiesta e decide dove mandarla: a un modello che gira sul tuo computer o a un'API nel cloud.

Il principio è semplice: una sola interfaccia, più motori dietro. Cambi modello senza cambiare strumento e senza riscrivere niente — sposti l'ago tra costo, privacy e qualità a seconda del task. Lo schema qui sotto è la mappa mentale di tutto il tutorial.

Un router, più backend
Un prompt entra in un router (OpenRouter, LiteLLM, claude-code-router) che lo instrada verso Ollama in locale per i task semplici oppure verso Claude API e OpenAI/Codex nel cloud per i task complessi.

Il router sceglie il provider in base a costo, privacy e difficoltà del task.

✅ Prerequisiti: cosa ti serve prima di iniziare

Prima di partire servono quattro cose. Non spaventarti: si installano in pochi minuti e una — la chiave cloud — è opzionale se vuoi restare al 100% in locale.

  • Node.js 18+: i due strumenti si installano via npm. Verifica con `node -v`.
  • Claude Code: l'interfaccia da terminale di Anthropic (la installiamo al passo 2).
  • Ollama: il motore che fa girare i modelli in locale.
  • Una API key cloud (Anthropic e/o OpenAI): serve solo per i backend nel cloud.
Controlla gli strumenti di base
# Node.js deve essere installato (versione 18 o superiore)
$ node -v
v20.11.0

# questi due li installiamo al passo 1 e 2, poi verificherai con:
$ ollama --version
$ claude --version
Se manca Node, installalo prima di proseguire: è il requisito per i passi successivi.

1️⃣ Installare Ollama e scaricare un modello locale

Ollama è il motore che fa girare i modelli sul tuo computer. Si installa con un comando e poi si scarica un modello da coding che supporti le function call (servono a Claude Code per usare gli strumenti). Una buona scelta è qwen2.5-coder.

L'inferenza gira sul tuo hardware: zero token da pagare e dati che non escono dalla macchina. La resa dipende dalla RAM/GPU: con 16 GB giri comodo i modelli da 7-8B.

Installa Ollama e scarica il modello
# 1) installa Ollama (macOS/Linux). Su Windows usa l'installer dal sito
$ curl -fsSL https://ollama.com/install.sh | sh

# 2) scarica un modello da coding con tool calling
$ ollama pull qwen2.5-coder

# 3) avvia il server (di solito parte da solo)
$ ollama serve   # endpoint: http://localhost:11434

# 4) prova al volo
$ ollama run qwen2.5-coder "scrivi una funzione fizzbuzz in TypeScript"

Sito ufficiale · Ollama

qwen2.5-coder è un buon punto di partenza; più VRAM/RAM hai, più grande può essere il modello.

2️⃣ Installare Claude Code e il Claude Code Router

Ora i due pezzi software. Prima Claude Code (l'interfaccia di Anthropic), poi il Claude Code Router — il proxy della community, comando `ccr`, che intercetta le richieste e le instrada. Si installano entrambi con npm, a livello globale.

Installa entrambi via npm
# Claude Code (l'interfaccia da terminale di Anthropic)
$ npm install -g @anthropic-ai/claude-code

# Claude Code Router (il proxy che instrada le richieste)
$ npm install -g @musistudio/claude-code-router

# verifica che il comando 'ccr' sia disponibile
$ ccr -v

GitHub · claude-code-router

Da qui in poi userai 'ccr' al posto di 'claude' per passare dal router.

3️⃣ Creare e capire il config.json

Tutta la logica vive in un unico file: ~/.claude-code-router/config.json. Ha due sezioni che contano. Providers elenca i backend disponibili (Ollama in locale, Anthropic e OpenAI nel cloud), ognuno con il suo endpoint, la chiave e i modelli. Router decide quale provider usare per ogni tipo di task.

La regola d'oro sulle chiavi: non scriverle in chiaro. Il router supporta le variabili d'ambiente con la sintassi `$NOME_VARIABILE`, così i segreti restano fuori dal file. Lo schema qui sotto è il config annotato, punto per punto.

config.json: provider e regole, annotati
Il file config.json annotato: il provider Ollama in locale, il provider OpenAI/Codex con chiave da variabile d'ambiente, e la sezione Router che manda i task background su Ollama e i contesti lunghi su un modello cloud.

Quattro punti chiave: provider locale, provider cloud con chiave sicura, e due regole di routing.

📋 Il config.json completo (da copiare)

Ecco una configurazione minima ma completa con i tre backend del tutorial. Salvala in ~/.claude-code-router/config.json, sostituisci i modelli con quelli che hai scaricato/abilitato e ricordati di esportare le chiavi cloud come variabili d'ambiente.

~/.claude-code-router/config.json
{
  "Providers": [
    {
      "name": "ollama",
      "api_base_url": "http://localhost:11434/v1/chat/completions",
      "api_key": "ollama",
      "models": ["qwen2.5-coder:latest"]
    },
    {
      "name": "anthropic",
      "api_base_url": "https://api.anthropic.com/v1/messages",
      "api_key": "$ANTHROPIC_API_KEY",
      "models": ["claude-sonnet-4", "claude-opus-4-1"],
      "transformer": { "use": ["Anthropic"] }
    },
    {
      "name": "openai",
      "api_base_url": "https://api.openai.com/v1/chat/completions",
      "api_key": "$OPENAI_API_KEY",
      "models": ["gpt-5", "gpt-5-mini"]
    }
  ],
  "Router": {
    "background": "ollama,qwen2.5-coder:latest",
    "default": "anthropic,claude-sonnet-4",
    "think": "anthropic,claude-opus-4-1",
    "longContext": "openai,gpt-5",
    "longContextThreshold": 60000
  }
}

GitHub · esempio config.json

I nomi dei modelli sono indicativi: usa quelli realmente disponibili sul tuo account e in Ollama.

4️⃣ Le regole di routing: quale task a quale modello

La sezione Router è il cuore dell'orchestratore. A ogni tipo di richiesta assegni un provider e un modello, nella forma `provider,modello`. Claude Code etichetta da solo le richieste, e il router le smista.

La strategia che consigliamo: i task minori in locale, quelli difficili nel cloud. Così tieni basso il costo e proteggi i dati sui lavori ripetitivi, e chiami il cloud solo quando serve davvero la qualità.

  • background: task minori e in sottofondo → Ollama in locale, a costo zero.
  • default: il lavoro quotidiano → Claude Sonnet nel cloud (o locale, se preferisci).
  • think: ragionamento e Plan Mode → un modello forte come Claude Opus.
  • longContext: oltre ~60K token → un modello cloud con finestra ampia (qui gpt-5).
Dal tipo di task al backend giusto
Diagramma delle regole di routing: il router classifica la richiesta in background, default, think o longContext e la manda a Ollama in locale oppure alle API cloud di Claude e OpenAI/Codex.

Cambi una riga del config e sposti l'ago tra costo, privacy e qualità.

5️⃣ Avviare il router con ccr code

Tutto pronto: si parte. Invece di `claude`, lanci `ccr code` — apri Claude Code esattamente come sempre, ma ogni richiesta passa dal router (in ascolto su `127.0.0.1:3456`). La status line mostra quale modello sta lavorando in quel momento.

Due comandi utili: `ccr ui` apre un'interfaccia web per modificare il config senza toccare il JSON a mano, e `ccr restart` riavvia il servizio (serve dopo ogni modifica al file).

ccr code in azione
Una sessione avviata con ccr code: il router mostra che il task default è andato a Claude Sonnet nel cloud, poi con /model si passa a Ollama in locale e la status line indica costo sessione zero.

La status line tiene sotto controllo modello attivo, contesto e costo della sessione.

6️⃣ Aggiungere Codex / OpenAI (e usarlo come fallback)

Per avere anche OpenAI/Codex come backend basta il provider `openai` che hai già nel config. Esporti la chiave una volta (come variabile d'ambiente) e lo instradi dove vuoi: tipicamente sul contesto lungo o come fallback quando un altro provider non risponde.

Nota utile: anche la Codex CLI di OpenAI può fare il percorso inverso — puntarla a Ollama per girare in locale — impostando le sue variabili di base URL su un endpoint compatibile. Il principio dell'orchestratore vale in entrambe le direzioni.

Instrada i task su Codex / OpenAI
# 1) esporta la chiave una volta sola (mettila nel tuo ~/.zshrc)
$ export OPENAI_API_KEY="sk-..."

# 2) il provider openai è già nel config.json (modelli gpt-5)
#    nella sezione Router lo usi per longContext o come fallback

# 3) oppure forzalo al volo dentro Claude Code
$ ccr code
> /model openai,gpt-5

GitHub · provider e Router

Stessa interfaccia, un backend in più: Codex/OpenAI entra nella rotazione quando serve.

7️⃣ Cambiare modello al volo e verificare il routing

Dentro Claude Code puoi cambiare backend senza riavviare con il comando `/model provider,modello`. Per gestire provider e modelli da terminale c'è `ccr model`, mentre `ccr restart` applica le modifiche al config.

Per essere sicuro che le richieste vadano dove vuoi, tieni d'occhio il log del router: ci trovi le decisioni di instradamento, una per una.

Cambia e verifica
# cambia modello al volo dentro Claude Code
> /model ollama,qwen2.5-coder:latest   # locale, 0 token
> /model anthropic,claude-sonnet-4     # cloud, qualità

# gestione interattiva di provider e modelli
$ ccr model

# dopo ogni modifica al config, riavvia il servizio
$ ccr restart

# controlla dove sono finite le richieste
$ tail -f ~/.claude-code-router/claude-code-router.log

GitHub · comandi ccr

Il log è il modo più rapido per capire se la tua policy di routing funziona davvero.

🔁 Alternativa: LiteLLM come gateway

Il Claude Code Router è perfetto per restare dentro Claude Code. Se invece ti serve un gateway condiviso da più applicazioni — con load balancing, fallback automatico e log dei consumi — la scelta tipica è LiteLLM: un proxy open-source con interfaccia OpenAI-compatibile.

Il meccanismo è lo stesso: definisci i modelli (locali e cloud) in un file, avvii il proxy e punti i tuoi strumenti al suo endpoint. Con Claude Code basta impostare `ANTHROPIC_BASE_URL`.

LiteLLM: config.yaml minimale
# config.yaml di LiteLLM: stesso scopo, gateway OpenAI-compatibile
model_list:
  - model_name: local-coder
    litellm_params:
      model: ollama/qwen2.5-coder
      api_base: http://localhost:11434
  - model_name: cloud-claude
    litellm_params:
      model: anthropic/claude-sonnet-4

# avvia il proxy e punta Claude Code al suo endpoint
$ litellm --config config.yaml   # http://localhost:4000
$ export ANTHROPIC_BASE_URL=http://localhost:4000

Doc ufficiale · LiteLLM

Stessa idea di orchestrazione, scala diversa: un gateway per tutte le tue app.

⚖️ Quando conviene: costo, privacy, qualità

L'orchestratore non è un vezzo tecnico: è il modo per pagare il cloud solo quando serve e tenere in casa tutto il resto. Ecco come decidiamo noi cosa mandare dove.

Locale o cloud? Come decide il router

Tieni in locale (Ollama)

  • Task ripetitivi e in sottofondo
  • Codice o dati sensibili (non escono)
  • Lavoro offline o sperimentazione
  • Costo per richiesta: zero

Manda nel cloud (Claude / Codex)

  • Refactor difficili e ragionamento
  • Contesto molto lungo (oltre 60K token)
  • Quando serve la massima qualità
  • Quando il modello locale non basta

Nessun vincitore unico: vince la policy che bilancia costo, privacy e qualità.

🗓️ Bonus: schedulare i task pesanti negli orari di morbida

Un orchestratore dà il meglio quando lo abbini allo scheduling: i task pesanti e non urgenti — un refactor esteso, la generazione dei test su tutto il repo — puoi rimandarli alla notte, quando le API costano meno e nessuno aspetta la risposta. È lo stesso principio dei job pianificati a calendario.

Bastano un cron sul tuo computer o una GitHub Action che lancia `ccr code` in modalità non interattiva. Instradi quei job sul provider che preferisci — Ollama in locale a costo zero, oppure il cloud negli orari di morbida — e al mattino trovi il lavoro già fatto, pronto per la revisione umana.

  • Cron locale: `0 2 * * *` lancia il job alle 2:00, instradato dal router.
  • GitHub Actions: imposta `NON_INTERACTIVE_MODE: true` per gli ambienti CI/CD.
  • Off-peak: meno costo e nessuna coda; il merge resta sempre una decisione umana.
Task pianificati negli orari di morbida
Un calendario settimanale con i task pesanti (refactor, test suite) pianificati nella fascia notturna delle 2:00, lanciati da un cron locale e da una GitHub Action che eseguono ccr code negli orari di morbida.

Cron o GitHub Action lanciano il router di notte: meno costo, e al mattino il lavoro è pronto.

🧩 Checklist finale e prossimi passi

Ricapitoliamo il percorso in sette mosse. Se le hai seguite, ora hai un orchestratore funzionante che instrada i prompt tra locale e cloud — e puoi affinarlo quando vuoi cambiando una riga del config.

Il tutorial in 7 mosse
  1. 01
    Installa Ollama + modelloollama pull qwen2.5-coder
  2. 02
    Installa Claude Code + Routernpm i -g claude-code e claude-code-router
  3. 03
    Scrivi il config.jsonsezioni Providers e Router
  4. 04
    Definisci le regolebackground → locale, default → cloud
  5. 05
    Avvia ccr codeuna UX, più backend dietro
  6. 06
    Aggiungi Codex/OpenAIcontesto lungo e fallback
  7. 07
    Verifica e ottimizza/model, log e ccr restart

Da qui puoi aggiungere provider (OpenRouter, Gemini, DeepSeek) con la stessa logica.

Domande frequenti su Claude Code Router

Che cos'è il Claude Code Router?

È un proxy open-source della community (comando ccr) che instrada le richieste di Claude Code verso più provider — Ollama in locale, Anthropic, OpenAI, OpenRouter e altri — mantenendo l'interfaccia di Claude Code. Decidi tu, per tipo di task, dove inviare ogni richiesta.

Devo per forza usare Ollama in locale?

No. Puoi instradare solo verso provider cloud. Ollama serve se vuoi privacy massima e costo zero sui task semplici: l'inferenza gira sul tuo hardware e i dati non escono dalla macchina.

Posso usare Codex / OpenAI con il Claude Code Router?

Sì: aggiungi un provider openai con i modelli gpt-5 e instradalo per il contesto lungo o come fallback. In alternativa, la Codex CLI di OpenAI può puntare a Ollama per girare in locale, applicando lo stesso principio nell'altro verso.

Il Claude Code Router è gratuito? Consuma token?

Lo strumento è open-source e gratuito. I token li paghi solo quando instradi verso un'API cloud; in locale con Ollama il costo marginale per richiesta è zero (paghi solo hardware ed energia).

Qual è la differenza tra Claude Code Router e LiteLLM?

Il Claude Code Router è pensato per restare dentro Claude Code. LiteLLM è un gateway generico OpenAI-compatibile, adatto quando più applicazioni devono condividere modelli con load balancing, fallback e log dei consumi.

I miei dati restano privati con un modello locale?

Con un modello locale via Ollama i dati non lasciano la tua macchina. Se instradi una richiesta verso il cloud valgono i termini del provider: valuta un DPA e opzioni di zero-retention per i dati sensibili.

Parliamone

Se questo tema ti riguarda, scrivimi: confrontarsi su codice e AI è sempre tempo speso bene.

Altri articoli del blog

tips-claude-resume-luglio-2026.md10 luglio 2026claude-code-hooks-quality-gate-2026.md9 luglio 2026orchestrazione-agenti-ai-multi-agent-dotnet-2026.md8 luglio 2026