Guider
Oppskrifter for deg som har satt opp en lokal modell. Er du ikke der ennå, start med oppsettet.
Oppsettet står i Lokal modell og decide. Den lokale modellen er alfa og av som standard.
Utsending krever opencode som klient. Der blir den lokale modellen en underagent som heter local-worker, og hovedagenten i skyen sender avgrensede oppgaver dit. nav-pilot legger inn local-worker selv hvis agentpakka ikke har den. Har pakka eller repoet en egen, brukes den. Copilot CLI har ingen slik underagent, så der kjører hele økten enten lokalt eller i skyen.
nav-pilot config get client # hvilken klient du kjører nav-pilot config set client opencode nav-pilot config set local_dispatch <nivå> # eller --local-dispatch <nivå> for én økt
off: hovedagenten får ingen lokal underagent. Vil du slå av alt lokalt, bruk nav-pilot alpha local off.conservative: bare store mekaniske endringer (minst 10 filer eller 20 kallsteder), og hovedagenten vurderer selv om det er verdt det.balanced (standard): mekaniske endringer på minst 5 filer eller 10 kallsteder. Redigerer hovedagenten selv en femte fil i samme tur, stopper nav-pilot redigeringen én gang og ber om at resten sendes til local-worker. Trenger endringen en vurdering per fil, går samme redigering gjennom andre gang.aggressive: en stoppet fil slipper gjennom først når den er sendt til local-worker. Nye filer, også tester, går dit først når modellen er godkjent for nye filer.Uansett nivå sendes bare oppgavetyper modellen er godkjent for. Stoppet ligger i en plugin for opencode, så det virker ikke hvis du starter opencode med --pure. Hvorfor nivåene finnes, og hva de gjør med hver modell, står i Hvorfor utsendingen er begrenset.
nav-pilot models viser modellene klienten kan bruke, med den du har valgt merket *. Lista er nav-pilots egen. Hva du faktisk får bruke, avhenger også av Copilot-abonnementet ditt.
nav-pilot models # alle, for klienten din nav-pilot models claude opus # bare de med disse ordene i navnet nav-pilot models --client opencode # for en annen klient nav-pilot config set model <id> # velg modell
nav-pilot alpha local models viser de lokale modellene: størrelse, kontekst, hva de er anbefalt til, om de er lastet ned eller kjører, og hvilken serveren laster (merket *). use skriver valget til local_model, men laster ikke ned og starter ikke noe.
nav-pilot alpha local models nav-pilot alpha local use qwen3.8-27b-optiq-4bit nav-pilot alpha local init # laster ned vektene hvis de mangler, og starter nav-pilot alpha local restart # hvis serveren allerede kjører en annen modell
Vektene til den nye modellen lastes ned én gang. Størrelsene står i tabellen over lokale modeller. Lista oppdateres når du kjører init eller start, ikke ved hver kommando. Første oppstart laster modellen inn i minnet. Ti målte oppstarter på seks maskiner lå alle under 50 sekunder, seks av dem under ti.
status viser hvilken modell som er valgt, og om den er valgt med local_model eller er standard. Kjører serveren en annen modell, gir status deg kommandoen for omstart. Krever modellen en nyere nav-pilot, sier status at den har falt tilbake til standard. Er modellen du har valgt, erstattet i manifestet, bruker nav-pilot den gamle til erstatningen er lastet ned.
purge fjerner Python-miljøet, den valgte modellen og modeller manifestet har erstattet. purge --all fjerner alle. Ingenting slettes før du legger til --yes.
nav-pilot config set local_autostart true
Da starter en vanlig nav-pilot serveren når den trengs, og venter til den er klar. To oppstarter samtidig gir ikke to servere. Den er av som standard fordi serveren bruker rundt 21 GB minne. En automatisk start ber aldri om passord. Er minnegrensen i macOS for lav, skriver den kommandoen du må kjøre i stedet.
Har du Linux, eller vil du bruke Ollama, llama-server eller LM Studio på Macen, kan nav-pilot bruke en server du kjører selv. Da laster nav-pilot ikke ned noe og starter ingenting. Løkkevakta, utsendingen og alpha decide går til serveren din. Koden din sendes dit, så nav-pilot godtar bare localhost og private IP-adresser, som 127.0.0.1 og 192.168.x.x.
Enklest er nav-pilot alpha local setup. Den finner servere som kjører på maskinen (Ollama, llama-server, LM Studio, vLLM), foreslår modellen som ligger nærmest vår egen og sjekker den. Mangler modellen i Ollama, eller er konteksten for liten, tilbyr den å hente modellen eller lage en kopi med 64k kontekst. Den spør først, og starter aldri en server selv. Uten terminal trenger den --pull, --fix-context og --yes. For hånd:
# Ollama OLLAMA_CONTEXT_LENGTH=65536 ollama serve ollama pull qwen3.6:35b nav-pilot config set local_endpoint http://127.0.0.1:11434/v1 nav-pilot config set local_endpoint_model qwen3.6:35b # llama-server (llama.cpp); legg til --n-cpu-moe 999 på en GPU med 8 GB llama-server --jinja -c 65536 --port 8080 -hf unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q4_K_XL nav-pilot config set local_endpoint http://127.0.0.1:8080/v1 nav-pilot config set local_endpoint_model unsloth/Qwen3.6-35B-A3B-GGUF:UD-Q4_K_XL nav-pilot alpha local init # sjekker serveren og skrur på utsending nav-pilot alpha local doctor # verktøykall, logprobs, kontekst og tid til første token
Vi anbefaler Qwen3.6-35B-A3B i dynamisk 4-bit (unsloth UD-Q4_K_XL). Det er den GGUF-varianten som ligger nærmest modellen vi har målt på Mac, men tallene våre gjelder ikke for den. Modell-id-en er det serveren lister på /v1/models, og doctor viser dem. Hovedagenten får den generelle instruksen om utsending, ikke den som er tilpasset modellen, og nav-pilot stopper ingen redigeringer.
På maskiner med under 24 GB grafikkminne gir Ollama modellen 4 096 tokens kontekst, og det kan ikke endres over /v1. En økt i Copilot starter med rundt 22 000 tokens, så resten blir borte. Start Ollama med OLLAMA_CONTEXT_LENGTH=65536, eller lag en egen modell med en Modelfile som har PARAMETER num_ctx 65536. doctor sender rundt 30 000 tokens og feiler hvis serveren kutter.
alpha decide trenger logprobs. Ollama fra v0.12.11, llama-server og vLLM gir dem, LM Studio gjør det ikke. Uten logprobs sier decide fra med en gang, mens utsendingen virker som før.
nav-pilot alpha decide stiller den lokale modellen ett flervalgsspørsmål og svarer med en sannsynlighet for hvert alternativ. Når serveren er varm, tar et svar under ett sekund, og spørsmålet forlater ikke maskinen. Bruk den til vurderinger en regel ikke klarer: om en commit-melding følger Conventional Commits, avgjør et regulært uttrykk, men om den forklarer hvorfor, må en modell vurdere. Med --threshold og --expect blir svaret kode 0 eller 1. Serveren må kjøre, for decide starter den ikke selv.
nav-pilot alpha decide \
"Does the commit message explain why?" \
--options yes,no --evidence msg.txt
# {"choice":"yes","p":{"yes":0.93,"no":0.07},…}Commit-hooken og etikettforslaget er målt. PR-sjekken er målt og svak, og loggsorteringen er ikke målt ennå. Alle advarer eller foreslår, ingen stopper noe. Tre råd når du skriver egne spørsmål:
yes først i alternativene.--eval på nøyaktig den ordlyden du skal bruke.«Ja»-svarene er stabile, men «nei»-svarene vipper mot «teksten er grei» når alternativene bytter plass eller spørsmålet snus. Standardmodellen svarte riktig på 85 % av spørsmålene i opprinnelig form og 58 % når de var snudd. Se målingen.
Lagre skriptet som scripts/commit-explains-why.sh. Det advarer når meldingen bare sier hva diffen viser, og slipper alltid commiten gjennom. Uten nav-pilot på maskinen gjør det ingenting.
#!/bin/sh
# Advarer når meldingen bare beskriver det diffen viser. Stopper aldri commiten.
command -v nav-pilot >/dev/null 2>&1 || exit 0
{
printf 'Commit message:\n-----\n'
grep -v '^#' "$1"
printf -- '-----\n\nDiff:\n-----\n'
git diff --cached | head -c 7500
printf -- '\n-----\n'
} | nav-pilot alpha decide \
"Does the commit message explain why the change was made, beyond describing what the diff already shows?" \
--options yes,no --evidence - --threshold 0.7 --expect no \
--timeout 3s >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "commit-msg: meldingen ser ut til å si hva som endret seg, men ikke hvorfor." >&2
fi
exit 0chmod +x scripts/commit-explains-why.sh
Med pre-commit legger du det inn som en lokal hook:
repos:
- repo: local
hooks:
- id: commit-explains-why
name: commit-meldingen forklarer hvorfor
entry: scripts/commit-explains-why.sh
language: script
stages: [commit-msg]pre-commit install --hook-type commit-msg
Med Lefthook er {1} fila git lagrer meldingen i:
commit-msg:
commands:
explains-why:
run: scripts/commit-explains-why.sh {1}Lag en JSONL-fil med eksempler fra repoet ditt der du vet svaret, ett per linje, og omtrent like mange av hvert svar. --eval viser treffsikkerhet, en forvekslingsmatrise, snittet av sannsynligheten for riktige og gale svar, og svartid. Er modellen like sikker når den tar feil som når den har rett, hjelper ingen terskel, og spørsmålet bør ikke inn i en hook.
{"question":"Does the commit message explain why ...?","options":["yes","no"],"evidence":"Commit message:\nfix: bump timeout to 30s\n\nDiff:\n...","expect":"no"}
{"question":"Does the commit message explain why ...?","options":["yes","no"],"evidence":"Commit message:\nfix: bump timeout to 30s\n\nThe batch job takes 20s on large tenants.\n\nDiff:\n...","expect":"yes"}nav-pilot alpha decide --eval cases.jsonl
PR-beskrivelser, issues og logger er skrevet av andre, og kan inneholde instrukser til modellen (prompt injection). La sjekker på slik tekst bare advare eller foreslå. Tallene under er fra målingene 25. september med standardmodellen.
Modellen valgte riktig mellom bug, feature og question på 95 av 105 issues (90 %). Når den bare fikk svare ved p ≥ 0,9, svarte den på omtrent to tredjedeler og hadde rett alle 71 gangene. Behold filteret: under 0,9 gir kommandoen ingen etikett, og da setter du den selv.
gh issue view N --json title,body -q '"Title: " + .title + "\n\n" + (.body // "")' \
| nav-pilot alpha decide \
"Is this GitHub issue a bug report (something does not work as intended), a feature request (new or changed functionality), or a question (something to clarify, investigate or decide)?" \
--options bug,feature,question --evidence - --json \
| jq -r 'select(.p[.choice] >= 0.9) | .choice'Den slapp gjennom alle de 24 beskrivelsene som forklarer hvorfor, men fant bare 3 av 12 der grunnen var fjernet. Et «no» er verdt å se på. Et «yes» betyr lite.
gh pr view N --json title,body \
-q '"Pull request title: " + .title + "\n-----\n"
+ (if (.body // "") == "" then "(empty)" else .body end) + "\n-----"' \
| nav-pilot alpha decide \
"Does this pull request description explain why the change is needed?" \
--options yes,no --evidence -tail -c 30000 holder grunnlaget under grensen på 32 KiB.
kubectl logs deploy/min-app --since=1h | tail -c 30000 \
| nav-pilot alpha decide \
"Do these logs show the app failing to reach a dependency?" \
--options yes,no --evidence -