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.
enk_…). Den Key legst du in deinem Profil an; er wird nur einmal angezeigt.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-v "$PWD:/workspace") — nicht dein Home-Verzeichnis und nichts anderes vom Rechner.-v ist ein Docker-Volume für den gemerkten Key, deine Sitzungen und nachgeladene OpenCode-Versionen. Ohne es wirst du bei jedem Start neu gefragt.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 ….
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-opencodeDie 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.
0.0.0.0 lauschen. Viele Entwicklungsserver binden sich nur an localhost — im Container ist das der Container selbst, und der Browser auf deinem Rechner erreicht die Seite nicht. Übliche Schalter: Vite --host 0.0.0.0, Next.js -H 0.0.0.0, Flask --host=0.0.0.0, Python python3 -m http.server 3000 --bind 0.0.0.0.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.
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.
ENIGMANET_WORKER_MODEL legt das Modell der Arbeiter fest; Vorgabe auto.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.
-e OPENCODE_VERSION=bundled — die Version im Image, ohne Nachfrage.-e OPENCODE_VERSION=latest — die neueste Veröffentlichung, ungeprüft und auf eigenes Risiko.-e OPENCODE_VERSION=x.y.z — genau diese Version.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:
model: auto — die eigentliche Arbeit. EnigmaNet wählt unter den Modellen, die Werkzeugaufrufe nachweislich beherrschen.small_model: enigma-small — Nebenanfragen wie der Sitzungstitel, auf dem schnellsten geeigneten Modell.agent.compaction / agent.summary: enigma-direct — das Zusammenfassen langer Sitzungen. Ohne diese Zeilen liefe es über auto.limit.output: 8192 — wird als max_tokens mitgeschickt und zählt das Nachdenken des Modells mit. OpenCode zieht den Wert außerdem vom Kontext ab, bevor es den Verlauf zusammenfasst: Ein zu großer Wert lässt zu wenig Platz für die Aufgabe, ein zu kleiner schneidet das Modell vor dem Werkzeugaufruf ab. 8192 bei 32768 Kontext ist der getestete Mittelweg.limit.context: 32768 — ab hier fasst OpenCode die Sitzung zusammen. Nicht höher setzen, als die Knoten wirklich bedienen.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.
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.
Alle sind optional und werden mit -e NAME=wert übergeben.
ENIGMANET_API_KEY — der Key, wenn du nicht gefragt werden willst (Skripte, CI).ENIGMANET_MODEL — Vorgabe auto. Ein konkreter Modellname legt das Modell fest.ENIGMANET_SMALL_MODEL — Vorgabe enigma-small.ENIGMANET_SUMMARY_MODEL — Vorgabe enigma-direct.ENIGMANET_CONTEXT_LIMIT / ENIGMANET_OUTPUT_LIMIT — Vorgabe 32768 / 8192.ENIGMANET_WORKERS — Zahl der parallelen Arbeiter, 0 bis 8; Vorgabe 0.ENIGMANET_BASE_URL — nur für eine eigene EnigmaNet-Instanz; Vorgabe https://enigmanet.eu/v1.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“.
.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.--continue fort.--print-logs hinter run siehst du den Fehler.ENIGMANET_MODEL ein anderes Modell festlegen.-u, Backtick statt Backslash am Zeilenende); in der Eingabeaufforderung %cd% statt $PWD und alles in eine Zeile.localhost statt auf 0.0.0.0.-u "$(id -u):$(id -g)" im Startbefehl fehlt.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.