Tool-Aufrufe unter OpenCode reparieren

Der Open-Source AI-Coding-Agent OpenCode lässt sich nicht nur mit den üblichen Cloud-Anbietern, sondern auch mit lokalen bzw. selbst gehosteten Sprachmodellen nutzen. Dazu kann beispielsweise Ollama über dessen OpenAI-kompatible API angebunden werden.

OpenCode Desktop unter macOS

In Verbindung mit bestimmten Modellen wie dem qwen3-coder:30b zeigte sich allerdings ein interessantes Problem. Tool-Aufrufe funktionieren nicht, da sie oft als Klartext ausgeben und nicht korrekt interpretiert werden. Probleme mit Tool-Aufrufen sind im OpenCode-Projekt bereits länger bekannt und diskutiert.

Ob das verwendete Modell grundsätzlich Tool-Aufrufe unterstützt, lässt sich mit:

ollama show qwen3-coder:30b

überprüfen. Unter Capabilities sollte hierbei unter anderem:

tools

aufgeführt sein. Ist dies der Fall und funktionieren die Werkzeuge in OpenCode trotzdem nicht zuverlässig, kann die Ursache im von Ollama verwendeten Kontextfenster liegen.

OpenCode benötigt für agentisches Arbeiten vergleichsweise viel Kontext. Neben der eigentlichen Unterhaltung befinden sich dort unter anderem der System-Prompt und die Beschreibungen der zur Verfügung stehenden Werkzeuge. Ist das Kontextfenster zu klein, können Tool-Aufrufe dadurch nicht mehr zuverlässig funktionieren. Auch die OpenCode-Dokumentation weist bei Problemen mit Tool Calls in Verbindung mit Ollama darauf hin, num_ctx zu erhöhen.

Wird Ollama allerdings über die OpenAI-kompatible Schnittstelle von OpenCode angesprochen, lässt sich num_ctx nicht ohne Weiteres zuverlässig über die OpenCode-Konfiguration setzen. Als Workaround kann deshalb ein eigenes Ollama-Modell mit fest eingestellter Kontextgröße angelegt werden. Dazu wird das gewünschte Modell zunächst gestartet:

ollama run qwen3-coder:30b

Anschließend wird die Kontextgröße gesetzt:

/set parameter num_ctx 131072

und die Konfiguration unter einem neuen Modellnamen gespeichert:

/save qwen3-coder:30b-128k
/bye

Damit existiert neben dem ursprünglichen Modell nun eine Variante, bei welcher das größere Kontextfenster fest hinterlegt ist. Die Größe muss nicht zwangsläufig 128K betragen. Für Tool-Aufrufe empfiehlt OpenCode eine Erhöhung in den Bereich von 16K bis 32K. Bei entsprechend verfügbarem Speicher kann für längere Coding-Sitzungen allerdings auch ein deutlich größeres Kontextfenster sinnvoll sein. In OpenCode muss anschließend das neu angelegte Modell konfiguriert werden:

nano ~/.config/opencode/opencode.json

Eine entsprechende Konfiguration kann beispielsweise wie folgt aussehen:

{
  "$schema": "https://opencode.ai/config.json",

  "provider": {
    "remote-ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Remote Ollama",

      "options": {
        "baseURL": "https://example.org/ollama/v1",

        "headers": {
          "Authorization": "Bearer secret-token-123"
        }
      },

      "models": {
        "qwen3-coder:30b-128k": {
          "name": "Qwen3 Coder 30B 128K",
          "tools": true,
          "limit": {
            "context": 131072,
            "output": 16384
          }
        }
      }
    }
  },

  "model": "remote-ollama/qwen3-coder:30b-128k"
}

Wichtig ist hierbei die Unterscheidung zwischen den beiden Konfigurationen. Mit:

"limit": {
  "context": 131072,
  "output": 16384
}

wird OpenCode mitgeteilt, welche Grenzen das Modell besitzt. Dadurch wird allerdings nicht die tatsächliche Kontextgröße gesetzt, diese wurde stattdessen im neuen Modell angelegt. Nach einem Neustart von OpenCode kann das Tooling beispielsweise mit:

Erstelle eine Datei todo.md mit exakt dem Inhalt ‚hello world‘.

getestet werden. Wird die Datei tatsächlich über die OpenCode-Werkzeuge angelegt, funktionieren die Tool-Aufrufe. Da sich OpenCode und die Anbindung lokaler Modelle derzeit schnell weiterentwickeln, kann es allerdings auch mit dieser Konfiguration zu Problemen mit Tool-Aufrufen kommen, die andere Ursachen haben.

Rosetta-Probleme unter macOS 27

Mit dem Umstieg von Intel-Prozessoren auf Apple Silicon führte Apple im Jahr 2020 Rosetta 2 ein. Die Übersetzungsschicht ermöglicht es, für Intel-Prozessoren kompilierte Anwendungen auch auf Macs mit Apple Silicon auszuführen. Auch unter macOS 27 ist Rosetta noch vorhanden. Nach dem Update auf macOS 27 kann es allerdings passieren, dass eine zuvor funktionierende Intel-Anwendung plötzlich nicht mehr startet, so z. B. Spiele unter Steam.

Das Spiel lässt sich unter macOS nach einem Update nicht mehr starten

In einem solchen Fall kann es helfen, Rosetta erneut zu installieren. Dies ist über das Terminal möglich:

softwareupdate --install-rosetta --agree-to-license

Nach der erneuten Installation lassen sich die betroffenen Anwendungen meist wieder wie gewohnt starten. Interessant wird dies vor allem deshalb, weil Rosetta langsam seinem Ende entgegengeht. macOS 27 ist die letzte macOS-Version, in der Rosetta als allgemeine Kompatibilitätsschicht für Intel-Anwendungen zur Verfügung steht. Ab macOS 28 sollen gewöhnliche Intel-Anwendungen nicht mehr über Rosetta ausgeführt werden können.

Ganz verschwinden wird die Technik allerdings zunächst nicht. Apple möchte einen Teil der Rosetta-Funktionalität für ältere, nicht mehr gepflegte Spiele erhalten. Apple spricht allerdings ausdrücklich nur von einem Teil der Rosetta-Funktionalität für solche Spiele. Daraus lässt sich nicht ableiten, dass jedes derzeit über Rosetta laufende Spiel auch unter macOS 28 weiterhin funktionieren wird.

Homebrew-Pakete übertragen

Wer auf einem Mac viele Applikationen über Homebrew installiert hat und diese ebenfalls auf einem anderen Rechner installieren möchte, kann hierfür ebenfalls Homebrew nutzen:

brew bundle dump

Damit wird ein Brewfile angelegt. Dieses enthält die installierten Formulae und Casks. Auf einem neuen oder frisch installierten System können die Pakete anschließend mit:

brew bundle

wieder installiert werden. Damit lässt sich die Homebrew-Umgebung eines Macs mit wenig Aufwand reproduzieren.

Breitenschach

Beim regelmäßigen Schachspiel in größerem Kreis entstand im Laufe der letzten Jahre eine Schachvariante, die wir Breitenschach getauft haben. Dabei werden zwei vollständige Schachbretter nebeneinandergelegt und mit zwei vollständigen Figurensätzen pro Spieler bespielt. Dadurch entsteht ein Spielfeld mit der doppelten Breite und deutlich mehr Raum für ungewöhnliche Züge und neue Strategien.

Breitenschach wird mit zwei Schachbrettern gespielt

Grundsätzlich gelten die normalen Schachregeln. Ergänzt werden sie durch drei besondere Mechaniken: den Brettabwurf, die erweiterte Rochade und die Königsfusion. Hinzu kommen besondere Regeln für den Umgang mit den beiden Königen.

Das Spielfeld

Die beiden Schachbretter werden direkt nebeneinandergelegt und bilden ein zusammenhängendes Spielfeld. Die Grenze zwischen den Brettern besitzt für die Figuren keine besondere Bedeutung.

Alle Figuren bewegen sich nach ihren normalen Regeln über das gesamte Spielfeld. Ein Turm kann somit vom einen auf das andere Brett ziehen, während ein Läufer seine Diagonale über die Brettgrenze hinweg fortsetzen kann. Gleiches gilt für Dame, König und Springer.

Brettabwurf

Sobald sich auf einem der beiden Bretter keine Figur eines Spielers mehr befindet, kommt es zum Brettabwurf. Dabei spielt es keine Rolle, ob und wie viele Figuren des Gegners sich noch auf diesem Brett befinden.

Das betreffende Brett wird aus dem Spiel entfernt. Alle darauf verbliebenen Figuren verschwinden ebenfalls aus der Partie. Dies gilt auch für Könige. Verliert ein Spieler dadurch einen seiner beiden Könige, spielt er mit dem verbliebenen König weiter. Verliert ein Spieler durch den Brettabwurf beide Könige, hat er die Partie verloren.

Erweiterte Rochade

Die Rochade funktioniert im Breitenschach nach demselben Grundprinzip wie im klassischen Schach, allerdings über eine beliebige Entfernung.

Jeder König kann mit jedem eigenen Turm rochieren, sofern beide Figuren zuvor noch nicht gezogen wurden. Bei der Rochade zieht der König in Richtung des gewählten Turms und bleibt auf dem letzten freien Feld vor diesem stehen. Anschließend zieht der Turm über den König hinweg auf das direkt angrenzende Feld auf der anderen Seite des Königs. König und Turm stehen danach direkt nebeneinander.

Alle Felder zwischen König und Turm müssen vor der Rochade frei sein. Außerdem darf der König zu Beginn der Rochade nicht im Schach stehen und während seines gesamten Weges kein bedrohtes Feld betreten oder überqueren. Auch sein Zielfeld darf nicht bedroht sein.

Königsfusion

Abweichend von den normalen Zugregeln darf ein König auf das Feld des anderen eigenen Königs ziehen. Geschieht dies, kommt es zur Königsfusion und beide Figuren werden zu einem einzigen fusionierten König.

Dieser kann sich wie ein normaler König in jede Richtung bewegen, allerdings bis zu drei Felder weit. Dabei darf er keine anderen Figuren überspringen.

Keines der Felder, über die sich der fusionierte König während seines Zuges bewegt, darf durch eine gegnerische Figur bedroht sein. Dies gilt sowohl für sein Zielfeld als auch für alle dazwischenliegenden Felder.

Schachmatt

Obwohl jeder Spieler zu Beginn über zwei Könige verfügt, müssen beide geschützt werden. Wird einer der beiden Könige ins Schach gesetzt, muss dieses Schach wie im klassischen Schach unmittelbar abgewehrt werden. Dabei spielt es keine Rolle, ob der zweite König bedroht ist oder nicht.

Es reicht aus, einen der beiden Könige schachmatt zu setzen, um die Partie zu gewinnen. Ein noch frei beweglicher zweiter König verhindert das Schachmatt nicht.

Nach einer Königsfusion gibt es nur noch einen König, dessen Schachmatt die Partie beendet.

Weiteres

Abgesehen von den beschriebenen Besonderheiten gelten die Regeln des klassischen Schachs. Die Figuren behalten ihre normalen Bewegungsmöglichkeiten, gegnerische Figuren werden regulär geschlagen und ein König darf nicht auf ein bedrohtes Feld ziehen.

Durch die doppelte Breite entstehen Situationen, die im klassischen Schach nicht vorkommen. Läufer, Türme und Damen können über enorme Entfernungen wirken, Figuren zwischen beiden Brettern wechseln und eine Partie kann sich durch einen Brettabwurf schlagartig auf die Hälfte des ursprünglichen Spielfeldes verkleinern.

Breitenschach bleibt damit im Kern Schach, ist aber breiter, unberechenbarer und bietet strategische Möglichkeiten, die auf einem normalen Schachbrett schlicht nicht existieren.

Raspberry Pi Imager

Wer ein Betriebssystem für einen Raspberry Pi auf eine SD-Karte oder einen anderen Datenträger schreiben möchte, kann hierfür den offiziellen Raspberry Pi Imager nutzen. Die Anwendung übernimmt dabei nicht nur das Schreiben des Images, sondern vereinfacht auch die Auswahl und Vorkonfiguration des gewünschten Systems.

Der Raspberry Pi Imager

Nach dem Start wird im ersten Schritt das verwendete Raspberry Pi-Modell ausgewählt. Anschließend kann das gewünschte Betriebssystem festgelegt werden. Neben den unterschiedlichen Varianten von Raspberry Pi OS stehen dort auch eine Reihe weiterer Systeme zur Verfügung. Alternativ kann über die Option Use Custom ein bereits heruntergeladenes Image ausgewählt werden.

Im letzten Schritt muss der Zieldatenträger, beispielsweise eine SD-Karte oder ein USB-Datenträger, ausgewählt werden. Vor dem eigentlichen Schreiben bietet der Imager bei unterstützten Betriebssystemen zusätzliche Möglichkeiten zur Konfiguration.

So können unter anderem Hostname, Benutzername und Passwort, Zeitzone und Tastaturlayout sowie die WLAN-Verbindung bereits vor dem ersten Start festgelegt werden. Daneben können SSH und Raspberry Pi Connect aktiviert werden. Für SSH kann neben der Anmeldung mittels Passwort auch direkt ein öffentlicher SSH-Schlüssel hinterlegt werden.

Das geschriebene Image wird verifiziert

Damit eignet sich der Imager, insbesondere für sogenannte Headless-Installationen. Ein Raspberry Pi kann damit vorbereitet werden, ohne ihn für die Ersteinrichtung zunächst an Bildschirm und Tastatur anschließen zu müssen. Nach dem Schreiben der SD-Karte reicht es im Idealfall aus, diese einzulegen und den Raspberry Pi zu starten. Anschließend ist das System bereits über das Netzwerk erreichbar.

Der Raspberry Pi Imager steht für macOS, Linux und Windows zur Verfügung. Der Raspberry Pi Imager ist freie Software unter der Apache License.