Vorschau

OpenCode mit EnigmaNet

OpenCode ist ein Coding-Agent für das Terminal: Er liest dein Projekt, ändert Dateien und führt Befehle aus. Mit EnigmaNet als Backend kommen die Antworten aus dem Netz der Provider-Knoten. OpenCode kennt dabei nur das Modell auto — welches Modell tatsächlich antwortet, entscheidet EnigmaNet.

Was du brauchst

Schnellstart mit Docker

Wechsle in das Projektverzeichnis, an dem der Agent arbeiten soll, und starte:

Linux und macOS

docker run -it --rm \
  -u "$(id -u):$(id -g)" \
  -v "$PWD:/workspace" \
  -v enigma-opencode:/home/opencode/.local/share/opencode \
  server.enigmanet.eu/enigma-opencode

Windows (PowerShell)

docker run -it --rm `
  -v "${PWD}:/workspace" `
  -v enigma-opencode:/home/opencode/.local/share/opencode `
  server.enigmanet.eu/enigma-opencode

Eine einzelne Aufgabe ohne Rückfragen, zum Beispiel aus einem Skript:

docker run --rm \
  -u "$(id -u):$(id -g)" \
  -e ENIGMANET_API_KEY=enk_… \
  -v "$PWD:/workspace" \
  -v enigma-opencode:/home/opencode/.local/share/opencode \
  server.enigmanet.eu/enigma-opencode run --auto "Behebe den fehlschlagenden Test und erkläre die Änderung"

--auto erlaubt dem Agenten Shell-Befehle ohne Nachfrage. Lies vorher den Abschnitt Sicherheit. Den gemerkten Key vergisst der Container mit dem Befehl logout anstelle von run ….

Web-Apps im Browser testen

Baut der Agent eine Website oder Web-App, kannst du sie auf deinem Rechner im Browser ansehen. Dafür muss der Port beim Start des Containers freigegeben werden — nachträglich geht das nicht. Hänge je Port ein -p an:

Linux und macOS

docker run -it --rm \
  -u "$(id -u):$(id -g)" \
  -p 127.0.0.1:3000:3000 \
  -v "$PWD:/workspace" \
  -v enigma-opencode:/home/opencode/.local/share/opencode \
  server.enigmanet.eu/enigma-opencode

Windows (PowerShell)

docker run -it --rm `
  -p 127.0.0.1:3000:3000 `
  -v "${PWD}:/workspace" `
  -v enigma-opencode:/home/opencode/.local/share/opencode `
  server.enigmanet.eu/enigma-opencode

Die Schreibweise ist Adresse:Port am Rechner:Port im Container. Mit 127.0.0.1 davor ist die App nur von deinem eigenen Rechner aus erreichbar. Sag dem Agenten dann, wie er die Seite starten soll:

Starte die Website auf Port 3000 und binde den Server an 0.0.0.0, nicht an localhost.
Starte ihn im Hintergrund, damit du weiterarbeiten kannst, und schreibe die Ausgabe in
server.log. Prüfe danach mit curl http://localhost:3000, ob die Seite antwortet.

Danach im Browser http://localhost:3000 öffnen. Ist der Port am Rechner belegt, nimm links eine andere Zahl, etwa -p 127.0.0.1:3001:3000.

Mehrere Arbeiter parallel

Eine große Aufgabe mit unabhängigen Teilen — etwa mehreren Modulen — kann der Agent auf mehrere Rechner im Netz verteilen. Du gibst nur die Zahl der Arbeiter an und schreibst die Aufgabe wie gewohnt:

-e ENIGMANET_WORKERS=2

Der Agent legt dann zuerst fest, was die Teile gemeinsam haben, übergibt sie den Arbeitern und fügt am Ende zusammen. Welcher Rechner welchen Arbeiter bedient, entscheidet EnigmaNet: beim ersten Schritt auf verschiedene freie Rechner, danach bleibt jeder Arbeiter bei seinem Rechner und Modell.

Welche OpenCode-Version läuft

Das Image enthält ein getestetes OpenCode und startet damit sofort. Bei jedem Start fragt der Container EnigmaNet nach der freigegebenen Version — aktuell 1.18.34 — und lädt sie einmalig nach, falls sie neuer ist. So bekommst du Updates ohne neues Image, aber nur solche, die mit EnigmaNet geprüft sind. Schlägt das Nachladen fehl, läuft die eingebaute Version weiter.

Selbst einrichten, ohne Docker

Wenn OpenCode bei dir schon installiert ist (Anleitung), brauchst du nur eine Konfigurationsdatei. Lege sie als opencode.json in dein Projekt oder nach ~/.config/opencode/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "model": "enigmanet/auto",
  "small_model": "enigmanet/enigma-small",
  "agent": {
    "compaction": { "model": "enigmanet/enigma-direct" },
    "summary":    { "model": "enigmanet/enigma-direct" }
  },
  "provider": {
    "enigmanet": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "EnigmaNet",
      "options": {
        "baseURL": "https://enigmanet.eu/v1",
        "apiKey": "{env:ENIGMANET_API_KEY}"
      },
      "models": {
        "auto":          { "name": "EnigmaNet (auto)",   "tool_call": true, "limit": { "context": 32768, "output": 8192 } },
        "enigma-small":  { "name": "EnigmaNet (small)",  "tool_call": true, "limit": { "context": 32768, "output": 8192 } },
        "enigma-direct": { "name": "EnigmaNet (direct)", "tool_call": true, "limit": { "context": 32768, "output": 8192 } }
      }
    }
  }
}

Dann den Key als Umgebungsvariable setzen und OpenCode im Projekt starten:

export ENIGMANET_API_KEY=enk_…      # Windows PowerShell:  $env:ENIGMANET_API_KEY = "enk_…"
opencode

Was die Einträge tun:

Ohne Docker läuft der Agent direkt auf deinem Rechner und mit deinen Rechten. Die Abgrenzung auf ein Verzeichnis, die der Container bietet, entfällt.

Selbst einrichten, mit eigenem Docker-Image

Wer dem fertigen Image nicht trauen möchte oder es anpassen will, baut sich in zwei Dateien ein eigenes. Lege die opencode.json von oben in ein leeres Verzeichnis und daneben dieses Dockerfile:

FROM node:22-bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
      ca-certificates curl git ripgrep python3 make && rm -rf /var/lib/apt/lists/*
RUN npm install -g opencode-ai@1.18.34
ENV HOME=/home/opencode
RUN mkdir -p $HOME/.config/opencode $HOME/.local/share/opencode /workspace && chmod -R 0777 $HOME /workspace
COPY opencode.json /home/opencode/.config/opencode/opencode.json
WORKDIR /workspace
ENTRYPOINT ["opencode"]

Bauen und in deinem Projektverzeichnis starten:

docker build -t mein-opencode .
docker run -it --rm \
  -u "$(id -u):$(id -g)" \
  -e ENIGMANET_API_KEY=enk_… \
  -v "$PWD:/workspace" \
  mein-opencode

Diese Minimalfassung fragt nicht nach dem Key, prüft die Verbindung nicht und lädt keine Versionen nach — das sind die Zusätze des fertigen Images. Für unbeaufsichtigte Läufe (opencode run ohne Terminal) hänge </dev/null an den Befehl: OpenCode wartet sonst auf das Ende der Standardeingabe.

Einstellungen des fertigen Images

Alle sind optional und werden mit -e NAME=wert übergeben.

Kosten

Abgerechnet wird wie bei jeder API-Anfrage in OTH nach Tokens. Ein Agent arbeitet in vielen Schritten, und jeder Schritt schickt seinen Systemprompt, die Werkzeugbeschreibungen und den bisherigen Verlauf mit — rund 6.000 bis 8.000 Eingabe-Tokens, bevor er überhaupt etwas tut. Eine kleine Korrektur braucht eine Handvoll Schritte, ein kleines Programm mit Tests einige Dutzend. Behalte dein Guthaben im Profil im Blick; ist es aufgebraucht, antwortet EnigmaNet mit „Insufficient OTH balance“.

Sicherheit: Die Antworten kommen von Provider-Knoten, die du nicht kontrollierst, und der Agent handelt nach ihnen. Lass ihn nur in Verzeichnissen arbeiten, deren Inhalt das Netz sehen darf, und halte Zugangsdaten (.env, Schlüssel) heraus. Mit --auto kann eine fehlerhafte oder böswillige Antwort beliebige Befehle im Container ausführen und alles im gemounteten Verzeichnis lesen und verschicken. Der API-Key ist im Container lesbar — nimm für OpenCode einen eigenen Key, den du bei Bedarf im Profil widerrufst.

Was heute geht und was nicht

Wenn etwas nicht geht

Ob Endpunkt und Key grundsätzlich funktionieren, zeigt ein direkter Aufruf — in der Antwort steht ein tool_calls-Eintrag:

curl https://enigmanet.eu/v1/chat/completions \
  -H "Authorization: Bearer $ENIGMANET_API_KEY" -H "Content-Type: application/json" \
  -d '{"model":"auto","messages":[{"role":"user","content":"Wie ist das Wetter in Berlin? Nutze das Werkzeug."}],
       "tools":[{"type":"function","function":{"name":"get_weather","description":"Aktuelles Wetter einer Stadt",
         "parameters":{"type":"object","properties":{"city":{"type":"string"}},"required":["city"]}}}]}'

Volle Referenz der Schnittstelle: API-Doku.