Egy éve költöztem a Himalája lábaihoz, és bár élvezem a nyugalmat, a helyi életmódhoz gyakran hozzátartoznak a hálózati és áramkimaradások. Mint Thomson Reutersnél dolgozó Principal Engineer, a mindennapi munkám nagy részét kódolás és kollégák kódjának átnézése teszi ki. Már korábban is használtam kódoló ügynököket a munkafolyamataimban, ezért kíváncsi voltam, milyen mértékben tarthatók meg ezek az eszközök internetkapcsolat nélkül.
Ez a cikk bemutatja, hogyan futtattam egy kódoló ügynököt teljes egészében a saját laptopomon, offline környezetben: mit lehet elvégezni, milyen eszközökre van szükség, és milyen korlátokra kell figyelni.
Mit lehet offline elvégezni?
A helyi gépen már meglévő projekt sok támpontot ad: egy ügynök képes lehet elmagyarázni egy ismeretlen függvényt, nyomozni egy sikertelen teszt után, refaktorálni kisebb kódrészt vagy segíteni egy funkció befejezésében — feltéve, hogy a modellt, a projekt függőségeit és a teszt eszközöket előre letöltöttük. Új csomag beszerzése vagy valami webes információ lekérése továbbra is internetet igényel.
Milyen eszközöket használtam?
- OpenCode: egy nyílt forráskódú kódoló ügynök, amely projektfájlok olvasására, módosításra és parancsok futtatására képes (például tesztek). A beállításban engedélyezési promptokkal hagyja jóvá a parancsokat és szerkesztéseket.
- Ollama: a helyi modellszolgáltató, amely a modellt futtatja a gépen. OpenCode a modellkéréseket Ollama helyi API-jára küldi.
- Qwen3.5 9B: egy nyílt súlyú (open-weight) nyelvi modell, amely le tud töltődni és helyben futtatható. Ebben a próbában ezt a modellt használtam.
A választás azért esett Qwen3.5 9B-re, mert a Qwen modellek több méretben elérhetők, és a 9B verzió publikus teljesítménymutatói jobb eredményeket mutattak, mint a kisebb 4B verzió a beépített kódgenerálási és eszközhívási teszteken.
Publikált eredmények és modellek méretei
A Qwen modellkártyája szerint LiveCodeBench v6 és BFCL‑V4 metrikák (maguk a számok a forrásmodellek model cardjáról származnak):
- Qwen3.5 4B: LiveCodeBench v6 = 55.8, BFCL‑V4 = 50.3
- Qwen3.5 9B (használt): LiveCodeBench v6 = 65.6, BFCL‑V4 = 66.1
- gpt-oss-20b: LiveCodeBench v6 = 74.6 (BFCL‑V4 nem szerepelt)
A modellek letöltési méretei (megközelítő értékek):
- Qwen3.5 4B: ~3.3–4.0 GB
- Qwen3.5 9B: ~6.6–7.6 GB
- Qwen3.5 27B: ~17–20 GB
A letöltési méret nem egyenlő a RAM‑követelménnyel; a Voltti költségvetés például 12–16 GB memóriát javasol egy 6.6 GB‑os Qwen3.5 9B buildhez. Nálam az OpenCode 64k‑tokenes konfigurációja miatt további memóriaterületre lehet szükség.
OpenCode benchmarkok és további megfontolások
A "The Scaffold Effect in Coding Agents" című preprint összehasonlította az OpenCode‑ot, Goose‑t és OpenHands‑SDK‑t 50 Terminal‑Bench Pro feladaton két felhőmodellen. Az OpenCode pass rate értékei például 50% [36–64%] és 46% [32–60%] két különböző cloud modell esetén (a zárójelek 95% konfidencia intervallumok). A szerzők felhívják a figyelmet, hogy a különbségek többsége statisztikailag nem egyértelmű.
A tanulmány azt is megjegyezte, hogy az OpenCode jóval több token‑felhasználást produkált (körülbelül 40× Goose tokenjeihez képest) a felhőalapú kísérletekben. Ezek a megfigyelések viszont a mi helyi Qwen3.5 9B futtatásunkról nem feltétlenül jóslanak pontos eredményt.
Kezdeti beállítás — amit online kell megtenni
Mielőtt offline módba váltanánk, a projektet és az eszközöket teljesen be kell állítani az internetkapcsolat mellett. Követtem a GitHub README utasításait: telepítettem a szükséges eszközöket, letöltöttem a projektet és telepítettem az OpenCode 1.19.4‑et. A projekt tartalmaz példákat, teszteket és konfigurációt a helyi Qwen használathoz.
Az opencode.json fájl a projekt konfigurációja: nálam mind a model, mind a small_model Qwen3.5 9B‑re mutatott, és a baseURL Ollama helyi címére (http://127.0.0.1:11434/v1). A konfiguráció letiltotta a webes eszközöket és rákérdezést kért szerkesztések és shellparancsok előtt.
Futtatási elrendezés:
- Terminal A: OpenCode és a tesztek futtatása a projekt mappájából.
- Terminal B: Ollama indítása úgy, hogy a szolgáltatás a localhoston maradjon és a felhő funkciók le legyenek tiltva:
OLLAMA_HOST=127.0.0.1:11434 OLLAMA_NO_CLOUD=1 OLLAMA_CONTEXT_LENGTH=65536 ollama serve
Majd a modell letöltése: ollama pull qwen3.5:9b
Ezek után ellenőriztem, hogy az ügynök válaszol, mielőtt leválasztottam volna az internetet.
Példa: hibajavítás egy költség‑összesítő programban
A mellékelt példa öt tételt ad hozzá (egy visszatérítéssel), a helyes összeg 25.50. A kezdő program azonban 8.00‑t nyomtatott; a függvény minden iterációnál felülírta az összesítést.
A projekt beépített tesztjeit futtatva három teszt bukott: decimális műveletek, visszatérítések és a példa tételek. Ezek a tesztek konkrét célt adtak az ügynöknek, illetve független ellenőrzést nyújtottak.
Mielőtt leválasztottam az internetet, OpenCode‑ot elindítva diagnosztikai parancsra megkértem, hogy olvassa el az expense_total.py‑t, futtassa a teszteket és magyarázza el a hibát. Az ügynök megtalálta a teszteket és tesztparancs futtatását kérte — az engedélykérés lehetőséget adott a parancs ellenőrzésére. Az ügynök kezdetben a pytest‑et javasolta, bár a projekt a beépített unittest‑et használta; emiatt célszerű pontosan megadni a tesztparancsot (python3 -m unittest -v).
Internet kikapcsolása és ellenőrzés
Wi‑Fi kikapcsolva, minden külső kapcsolat megszakítva, localhoston az Ollama továbbra is válaszolt:
curl --noproxy '*' --fail http://127.0.0.1:11434/api/tags
A külső címekre irányuló kérések viszont megbuktak (Could not resolve host), ami igazolta, hogy a futtatás tényleg offline történt.
A hibajavítás offline
OpenCode újraindítása után megkértem az ügynököt: „Fix the bug in expense_total.py so the existing tests pass. Don't change the tests or install anything. Run the tests and explain your fix.” A modell egy egyszerű, egy soros javaslattal tért vissza:
- Eredeti sor: total = Decimal(amount)
- Javasolt sor: total += Decimal(amount)
Az ügynök engedélyt kért a szerkesztésre, lefuttatta a teszteket és öt sikeres tesztet jelentett. A saját terminálomban is lefuttattam a python3 -m unittest -v parancsot, és az összes teszt átment. A mintaprogram most 25.50‑et ad vissza.
További gyakorlatok a projektben
A kísérő projektben két további feladat is található: egy CSV riport és egy napló‑elemző. Ezeket még nem futtottam végig offline az ügynökkel, ezért a fenti eredmények az expense példa futtatásából származnak.
- CSV riport: a feladat sorok csoportosítása termék szerint, mennyiségek és bevételek számolása; 7 teszt lefedi a csoportosítást, decimális műveleteket, rendezést és üres bemenetet.
- Log analyzer: hibák számlálása és a leglassabb kérés kiválasztása; 7 teszt foglalkozik hibás sorokkal és üres inputtal.
Mindkét gyakorlat README‑je tartalmazza a pontos tesztparancsokat és a várt eredményeket.
Mi segít, ha nincs internet?
- Előre készítsd elő a projektet és töltsd le a függőségeket, dokumentációt és a modellt.
- Indítsd el ugyanazt a helyi konfigurációt egyszer online, hogy mindent ellenőrizhess.
- Add meg az ügynöknek a pontos tesztparancsot (például python3 -m unittest -v), hogy ne térjen el feleslegesen.
- Tartsd a feladatot kicsiben és önállóan: egy kis, jól körülhatárolt hibajavítás vagy funkció jobb kiindulópont.
- Figyeld a memóriahasználatot: a modell letöltése csak a kezdete a memóriaszükségletnek; a nagy kontextus és más nyitott alkalmazások is teremtenek terhelést.
- Rögzítsd a próbálkozásokat: engedélykérések, újrapróbálkozások, és kudarcok is hasznosak később.
Mit tanultam?
A legfontosabb megállapítás: igen, egy kódoló ügynök képes helyi fájlokat olvasni, szerkeszteni és teszteket futtatni internetkapcsolat nélkül, feltéve hogy a modell és a projekt erőforrásai előre helyben vannak. Mindig átnézem a javasolt diffet és saját tesztekkel is ellenőrzöm az eredményt.
Praktikus megközelítés: kezdd kis, önálló feladatokkal egy gépen, amelyen a projekt és a modell minden szükséges összetevője rendelkezésre áll, majd haladj összetettebb példák felé (például a CSV riport), hogy kiderüljön, hogyan boldogul az ügynök bővebb munkával és ismeretlen kódbázissal.



