AIDive

Ich ließ Claude Code lokal laufen: 1 von 2 Aufgaben klappte

Von AIDive · Veröffentlicht am

Coding-AgentsKI-Modelle

Intro

Claude Code auf einem Laptop-Modell hat eine unserer zwei echten Aufgaben bestanden. Die meisten Demos für dieses Setup hören bei „hello“ auf. Wir haben einem kleinen lokalen Modell zwei Aufgaben in einem Python-Paket gegeben und berichten, was passiert ist, samt dem Alias und der Regel, die wir behalten haben.

Das Setup ist einfach. Wenn mitten in einer Aufgabe dein Plan-Limit erreicht ist, wartest du entweder auf den Reset oder übergibst die Aufgabe an dasselbe Claude Code, das gegen ein Modell auf deinem eigenen Rechner läuft. Bei der Aufgabe, die mehrere Dateien betraf, meldete das lokale Modell, alle Tests seien bestanden, obwohl die Umbenennung einen Import kaputt gemacht hatte. Ein einziges Flag, --bare, machte aus einem lokalen Lauf ohne jede Änderung einen sauberen Durchlauf derselben Aufgabe.

Dieser Artikel behandelt den Alias, das Flag, das es repariert, die Falle mit dem Context Window, die Aufgabe über mehrere Dateien und die Regel, welche Aufgaben lokal laufen und welche auf deinen Plan warten.

Claude Code auf deinem eigenen Modell

Claude Code besteht aus zwei Teilen. Das Harness ist das Programm in deinem Terminal, das deine Dateien liest, deine Befehle ausführt und die Änderungen macht. Das Modell entscheidet, was als Nächstes passiert. Standardmäßig läuft es auf den Servern von Anthropic und zählt gegen deinen Plan.

Eine einzige Einstellung, die Base-URL, sagt dem Harness, wohin es seine Anfragen schickt. Ollama ist ein Programm, das offene Modelle herunterlädt und unter einer Adresse auf deinem eigenen Rechner bereitstellt. An Claude Code ändert sich nichts, nur die Adresse, mit der es spricht, deshalb reicht eine Zeile in deiner Shell. Es ist ein bisschen so, als würdest du deine App auf eine lokale Datenbank statt auf die Produktion zeigen lassen.

Zum Einrichten installierst du Ollama mit Homebrew und lädst dann ein Modell, das in deinen Speicher passt. Unseres war qwen3.5:9b, 7,6 GB, auf einem MacBook Pro M1 Pro mit 16 GB. Die größeren Versionen desselben Modells passten gar nicht hinein. Vergleiche die Größe des Modells mit deinem Speicher, bevor du etwas lädst, denn das ganze Modell muss neben allem anderen, was du offen hast, darin Platz finden.

Ein Vorbehalt aus der Dokumentation von Anthropic selbst: Das Routing von Claude Code auf Modelle, die nicht von Claude stammen, wird nicht unterstützt. Wenn bei diesem Setup etwas kaputtgeht, bist du auf dich allein gestellt, und das Modell, das du betreibst, ist weit kleiner als das, das dir dein Plan gibt.

Der Alias claude-alt

Ein Alias ist ein kurzer Name, den deine Shell zu einem längeren Befehl erweitert. Wenn du den ganzen Wechsel in einen Alias packst, nutzt dein alltägliches claude weiter deinen Plan, denn die Einstellungen gelten nur, wenn du den Alias aufrufst.

Die Einstellungen liefert die eigene Anleitung von Ollama: die lokale Adresse, ein Platzhalter-Token und einen API-Key. Der Key verdient Aufmerksamkeit. Laut der Dokumentation von Claude Code wird ein gesetzter Key anstelle deines Abos verwendet, selbst wenn du angemeldet bist. Deshalb steht er nur in der Alias-Zeile. Du öffnest deine Shell-Datei, fügst den Alias mit dem Modellnamen am Ende ein und lädst die Datei neu.

alias claude-alt='CLAUDE_CODE_ATTRIBUTION_HEADER=0 ANTHROPIC_AUTH_TOKEN=ollama ANTHROPIC_API_KEY=ollama ANTHROPIC_BASE_URL=http://localhost:11434 claude --bare --model qwen3.5:9b'

Das ist die endgültige Version, --bare ist schon enthalten (der nächste Abschnitt erklärt, warum). CLAUDE_CODE_ATTRIBUTION_HEADER=0 ist eine Einstellung, die Anleitungen für lokale Modelle empfehlen. Wir haben nie gemessen, was sie bewirkt, behandle sie also als optional.

Wir haben ohne --bare angefangen. Die erste echte Aufgabe in einem kleinen Python-Paket, das wir für diesen Test geschrieben haben, lautete: eine Option zu einer Datei hinzufügen und ausführen. Claude Code startete, warnte, dass es dieses Modell nicht kennt, und arbeitete weiter, während die Uhr lief. Nach 15 Minuten hatte es keine einzige Zeile geändert, also brachen wir ab, und die Option existierte nicht.

Wenn du den Alias so ausprobierst, siehst du wahrscheinlich dasselbe: eine Sitzung, die weiterarbeitet, und eine Datei, die sich nie ändert. Der Alias richtet Claude Code auf dein Modell, aber bei einem kleinen Modell reicht das nicht, um die Aufgabe zu erledigen.

Das Flag, das für Antworten sorgt: --bare

Jede Claude-Code-Sitzung beginnt mit einem langen Satz an Anweisungen: deine Memory-Datei und deine Tools. Für Claude ist das in Ordnung, für ein kleines Modell auf einem Laptop ist es schwer. Das Flag --bare ist der Minimalmodus von Claude Code. Es überspringt Hooks, Plugins, Memory und die Projektdatei, sodass das Modell eine kurze Seite statt eines Handbuchs bekommt.

Du hängst --bare ans Ende des Alias und trägst das Wort ollama in ANTHROPIC_API_KEY ein, weil Claude Code im Minimalmodus seinen Key nur von dort liest. Mit derselben Anfrage, demselben kleinen Modell und demselben kleinen Context Window las der Lauf die Datei, bearbeitete sie und führte den Befehl aus. Er war in 93 Sekunden fertig, mit einer geänderten Datei, und der Befehl gab den Slug mit dem Präfix davor aus, genau wie verlangt: blog-hello-world.

Du prüfst es so, wie du die Änderung eines Kollegen prüfen würdest: Lies einen kleinen Diff und führe den Befehl selbst aus.

Die Kosten sind real. Der Minimalmodus lässt auch deine Hooks und deine Projektregeln weg, das lokale Modell sieht also nie die Konventionen, die du aufgeschrieben hast. Wenn dein Projekt auf einen Hook angewiesen ist, um etwas Gefährliches zu blockieren, lass diese Aufgabe auf dem Plan, wo deine Hooks tatsächlich laufen.

Die 4k-Falle und die 64k-Lösung

Die zweite Falle ist leicht zu übersehen, weil Ollama die Größe des Modellgedächtnisses für dich wählt. Dieses Gedächtnis ist das Context Window, also wie viel vom Gespräch das Modell auf einmal im Blick behalten kann. Laut Ollama-Doku ist das Standardfenster auf einer Maschine wie unserer klein, 4k Tokens unter 24 GiB VRAM, weit unter den 64.000, die sie für Coding-Tools empfehlen. Alle unsere ersten Läufe nutzten diesen Standard, und du merkst es nicht, solange du nicht nachsiehst.

Zur Behebung stoppst du Ollama und startest es neu, mit der Context-Länge auf 64.000 (OLLAMA_CONTEXT_LENGTH=65536), dann führst du ollama ps aus und liest die Spalte CONTEXT. Du musst das bei jedem Start des Servers setzen, und ollama ps ist die einzige Stelle, die zeigt, dass es gegriffen hat. Die Spalte ging von 4096 auf 65536, und das Modell brauchte kaum mehr Speicher: 7,6 GB vorher, 7,7 GB nachher.

Lauf Context --bare Ergebnis Zeit
a-4k-nobare (Alias ohne --bare) 4096 nein FAIL: beim 15-Minuten-Limit abgebrochen, null Änderungen, keine Antwort 900 s
a-4k (Alias) 4096 ja PASS, blog-hello-world 93 s
a-64k (Alias) 65536 ja PASS, blog-hello-world 35 s

Die Aufgabe in einer Datei war in 35 Sekunden bestanden, deutlich schneller als mit dem kleinen Fenster. Auch die Aufgabe über mehrere Dateien, die als Nächstes kommt, sank von mehreren Minuten auf ein paar. Der kleine Standard begrenzt nicht nur den Speicher, er macht jeden Zug langsamer, und du würdest das Modell beschuldigen, obwohl die Einstellung schuld ist.

Claude Code gibt außerdem eine Warnung aus, dass es dieses Modell nicht kennt und für Auto-Compact ein Fenster von 200k Tokens annimmt, viel mehr, als Ollama bereitstellt. CLAUDE_CODE_MAX_CONTEXT_TOKENS setzt den echten Wert. Die Abweichung hat bei unseren kurzen Aufgaben nicht geschadet, und wir haben sie in einer langen Sitzung nicht getestet. Die Grenze ist der Speicher, denn ein größeres Fenster braucht mehr davon, und auf einem Laptop mit 16 GB ist das ungefähr das Maximum.

Die Aufgabe über mehrere Dateien: grüne Tests, kaputter Code

Weil das lokale Modell schnell antwortet, ist die Versuchung groß, ihm echte Arbeit zu geben. Also gaben wir ihm eine Aufgabe über mehrere Dateien: smart_truncate im ganzen Paket in truncate_words umbenennen und smart_truncate als Alias in slugkit/truncate.py behalten. Ein Alias im Code ist der alte Name, der als Verweis auf die neue Funktion erhalten bleibt, sodass jeder Code, der noch den alten Namen nutzt, weiterläuft.

Das lokale Modell arbeitete ein paar Minuten, bearbeitete die Dateien, führte die Tests aus, und jeder Test bestand. Dann meldete es die Aufgabe als erledigt.

Lauf Context --bare Ergebnis Zeit
b-plan (Plan, Claude) n/a nein PASS: 12 Tests OK, alter und neuer Import funktionieren, Tests umbenannt 38 s
b-4k (Alias) 4096 ja BROKE: „All 12 unit tests pass“, aber from slugkit import truncate_words liefert ImportError; die Tests rufen weiter smart_truncate über import truncate_words as smart_truncate auf 464 s
b-64k (Alias) 65536 ja BROKE: 12 Tests OK, als erledigt gemeldet, aber der Alias landete in __init__.py, daher liefert from slugkit.truncate import smart_truncate ImportError (die Anweisung lautete truncate.py) 142 s

Als wir den alten Namen so importierten, wie es alter Code tun würde, lehnte Python ab. Das Modell hatte den Alias in die Startdatei des Pakets gelegt statt in das Modul, das wir verlangt hatten, also war der alte Importpfad weg. Mit dem kleinen Fenster brach dieselbe Aufgabe anders: Der neue Name wurde nie exportiert, und die Tests riefen weiter den alten auf.

Wie können alle Tests grün sein, während der Code kaputt ist? Die Tests prüfen nur, was sie prüfen, und niemand hatte einen Test für den alten Import geschrieben. Ein grüner Lauf des lokalen Modells sagt dir, dass nichts kaputtgegangen ist, was die Tests abdecken, und nichts über das, was sie nicht abdecken.

Auf dem Plan erledigte Claude dieselbe Aufgabe in 38 Sekunden, benannte auch die Tests um, und sowohl der alte als auch der neue Import funktionierten. Fairerweise verdient auch die Arbeit des Plans eine Prüfung, aber hier hat das lokale Modell die Aufgabe über mehrere Dateien beide Male falsch gelöst. Lies nach jedem lokalen Lauf den Diff selbst und importiere die alten Namen von Hand, bevor du einem grünen Testlauf vertraust. Diese Prüfung dauert kürzer als der Lauf, und sie verhindert, dass ein kaputter Import in deinen Main-Branch gelangt.

Die Wechselregel

Wenn dein Limit erreicht ist, hast du ein paar Sekunden, um zu entscheiden, ob eine Aufgabe lokal läuft oder wartet. Eine Wechselregel sind ein paar Zeilen, die du neben dem Alias aufbewahrst, damit die Entscheidung fällt, bevor du in Eile bist. Öffne deine Shell-Datei und schreibe drei Kommentare über den Alias:

# claude-alt: one-file jobs I can check in a glance
# plan: anything across files, or that I can't check by reading the diff
# always: read the diff before committing

Das lokale Modell bekommt Aufgaben in einer Datei, die du auf einen Blick prüfen kannst, etwa eine Option hinzufügen, eine Funktion erklären oder eine Funktion testen. Alles, was mehrere Dateien betrifft oder was du nicht durch Lesen des Diffs prüfen kannst, wartet auf deinen Plan. Egal welches Modell den Code geschrieben hat, du liest den Diff, bevor du committest.

Die Regel folgt direkt aus unserem Lauf: Die Aufgabe in einer Datei bestand beide Male, die Umbenennung über mehrere Dateien brach beide Male. Das Muster ergibt Sinn, sobald du es scheitern gesehen hast, denn eine Aufgabe in einer Datei hält alles, was das Modell braucht, direkt vor seinen Augen.

Dieses Setup hat auch Grenzen, die Ollama in der eigenen Doku auflistet. Es gibt kein Prompt Caching, bei dem der Server den Anfang des Gesprächs bereithält, sodass in einer langen Sitzung jeder Zug alles neu liest und dich ausbremst. Es kann das Modell nicht zwingen, ein bestimmtes Tool zu benutzen. Und Anthropic unterstützt Claude Code nicht mit Modellen, die nicht von Claude stammen. Unsere Regel stammt aus zwei Aufgaben an einem kleinen Paket, behandle sie also als Ausgangspunkt und erweitere sie mit deinen eigenen Läufen.

Fazit

Wenn dein Plan-Limit mitten in einer Aufgabe erreicht ist, führt ein Alias dasselbe Claude Code auf einem Modell auf deinem Laptop aus. In unserem Test bestand es die Aufgabe in einer Datei und scheiterte an der über mehrere Dateien. Der gescheiterte Lauf ist der gefährliche, denn er meldete alle Tests grün, während ein Import fehlschlug.

Nutze es, wenn du blockiert bist, die Aufgabe in eine Datei passt und du den ganzen Diff lesen kannst, bevor du committest. Nutze es nicht für alles, was mehrere Dateien betrifft, für lange Sitzungen oder für Arbeit, die du nicht prüfen wirst, denn dort scheitert es leise.

Auf dem Plan dauerte jede Aufgabe unter 40 Sekunden (21 s und 38 s), wenn dein Reset also nah ist, ist Warten oft die schnellere Wahl. Der Alias ist kein Ersatz für deinen Plan. Er hält dich bei kleinen Aufgaben am Laufen, während du auf dessen Rückkehr wartest, und wenn du ihn heute einrichtest, ist er beim nächsten Mal bereit, wenn dein Limit erreicht ist.

Die Regel zum Merken: Das lokale Modell ist für Aufgaben, die du auf einen Blick prüfen kannst.

Kostenlose Ressourcen

Quellen

Häufige Fragen

Kann man Claude Code mit einem lokalen Ollama-Modell betreiben?
Ja. Setze die Base-URL auf deine Ollama-Adresse, ein Platzhalter-Token und einen API-Key und übergib einen Modellnamen. Anthropic unterstützt das Routing von Claude Code auf Modelle, die nicht von Claude stammen, nicht, du bist also auf dich allein gestellt, wenn etwas kaputtgeht.
Was macht das Flag --bare in Claude Code?
`--bare` ist der Minimalmodus von Claude Code. Es überspringt Hooks, Plugins, Memory und die Projektdatei, sodass ein kleines Modell einen kurzen Prompt bekommt. In unserem Lauf wurde aus einer 15-minütigen Sitzung ohne Änderungen ein Durchlauf in 93 Sekunden.
Warum ist mein lokales Modell in Claude Code mit Ollama langsam?
Ollama nutzt unter 24 GiB VRAM standardmäßig ein Context Window von 4k. Starte den Server mit `OLLAMA_CONTEXT_LENGTH=65536` und prüfe die Spalte `CONTEXT` in `ollama ps`. Unsere Aufgabe in einer Datei sank auf 35 Sekunden.
Reicht ein lokales Modell, um Claude Code auf meinem Plan zu ersetzen?
Nein. In unserem Test bestand es eine Aufgabe in einer Datei, scheiterte aber an einer Umbenennung über mehrere Dateien und meldete dabei alle 12 Tests grün. Nutze es für Aufgaben, die du in einem Diff prüfen kannst, und lass Arbeit über mehrere Dateien auf deinem Plan.
Was sollte ich prüfen, nachdem ein lokales Modell eine Aufgabe beendet hat?
Lies den Diff und importiere die alten Namen von Hand. Grüne Tests decken nur ab, was die Tests prüfen, und niemand hatte den alten Import getestet, den die Umbenennung kaputt gemacht hat.
Was unterstützt der Anthropic-Endpunkt von Ollama nicht?
Die Ollama-Doku listet kein Prompt Caching und keine erzwungene Tool-Wahl auf. Ohne Caching liest jeder Zug einer langen Sitzung das ganze Gespräch neu, was dich ausbremst.

Ähnliche Videos