← Blog
· OLAV Team

OLAV Quick Start: Your Network In, Answers Out — on a Local Model

A hands-on 15-minute quick start. Install OLAV, get your fleet in two ways (live SSH collection with Nornir, or an offline backup import), take a fresh snapshot, then ask in plain English, draw the topology, draft a validated change, and run a morning audit — all on a local ~30B model, nothing leaving your network.

Quick Start NetOps Local LLM Nornir Batfish

This is the tight cut: the handful of steps that take you from a clean machine to a validated network change, on a local ~30B model — no cloud, and (if you want) no SSH to production at all. Everything below runs from one machine and was verified end-to-end on gemma4-31b.

The model: use gemma4-31b

Every step here was run on gemma4-31b — a local, vision-capable ~30B model (QAT Q4 quant). This is the model we recommend, and right now we recommend only it: smaller “flash”/tiny models flail on the agentic beats (in testing one made 146 tool calls where gemma4 made 16 on the same task). Use gemma4-31b — nothing smaller.

Serve it locally behind an OpenAI-compatible endpoint. The context configuration we verified against (llama.cpp server) is a 64K window with a quantized KV cache so it fits in VRAM:

# gemma4-31b-it-qat — verified server flags
--ctx-size 65536          # 64K usable context (trained up to 256K)
--cache-type-k q8_0       # quantized KV cache so 64K fits in VRAM
--cache-type-v q8_0
--batch-size 1024
--ubatch-size 256
# speculative decoding for throughput (recommended):
--model-draft gemma-4-31B-it-qat-assistant.gguf
--spec-type draft-mtp --spec-draft-n-max 3

Point OLAV at it in .olav/config/api.json:

{
  "llm": {
    "provider": "openai",
    "model": "gemma4-31b-it-qat",
    "base_url": "http://<your-host>:11433/v1",
    "api_key": "local",
    "timeout": 600
  }
}

Step 1 — Install and self-check

mkdir ~/olav && cd ~/olav
python3 -m venv .venv && source .venv/bin/activate
pip install olav "olav-netops[sim]"   # [sim] pulls pybatfish, used later for change validation
olav agent install olav-netops        # deploys the network agents; first run asks once for your LLM key
olav doctor                           # 9 zero-LLM checks — all ✓

olav doctor proves the whole stack is wired — agents, sub-agents, tools, memory, recall, workspace integrity — before you ask it anything. An ops person trusts a tool that self-diagnoses.

Step 2 — Get your fleet in (two ways)

OLAV needs your network’s state in its snapshot database. There are two ways to put it there — pick whichever fits your environment.

Option A — Live collection over SSH (Nornir)

Point OLAV at your devices and let it collect. First declare the inventory:

cp .olav/workspace/netops/collector/config/nornir/hosts.yaml.example \
   .olav/workspace/netops/collector/config/nornir/hosts.yaml
cp .olav/workspace/netops/collector/config/nornir/defaults.yaml.example \
   .olav/workspace/netops/collector/config/nornir/defaults.yaml
chmod 600 .olav/workspace/netops/collector/config/nornir/defaults.yaml

hosts.yaml — your device inventory:

R1:
  hostname: 192.168.100.101
  platform: juniper_junos
  groups: [border, juniper_junos]

R2:
  hostname: 192.168.100.102
  platform: cisco_ios
  groups: [core, cisco_ios]

defaults.yaml — SSH credentials (gitignored — never commit it):

username: your_ssh_username
password: your_ssh_password
port: 22

Then run the initialization pipeline (validate first with --dry-run):

olav --agent netops "/netops_init --dry-run"   # env + inventory check, no SSH
olav --agent netops "/netops_init"             # SSH collect → ingest → ETL → topology

/netops_init runs platform-aware commands (IOS gets show ip interface brief, show cdp neighbors detail, …; Junos gets show interfaces terse, show lldp neighbors, …), parses them, and builds the topology from CDP/LLDP automatically.

Option B — Offline import (no device access)

No SSH to prod? Hand OLAV a collector dump or backup archive and it does the rest:

olav --agent netops "Import the network backup at <path-to-archive>.tar.gz"

The importer extracts, normalises, parses (TextFSM), and builds the topology — hundreds of devices land in the database with zero device access, which makes it safe to run against a production backup.

Step 3 — Take a fresh snapshot

State goes stale. To re-capture live data on demand, launch the TUI and ask the collector for a fresh snapshot:

olav          # launch the interactive TUI
Take a fresh snapshot of R1 and R2

The collector runs the show commands in parallel (Nornir), validates them against the command allow-list, and writes the results to the snapshot store. Every question you ask afterward reads from that fresh state.

Step 4 — Ask in plain English, get a CSV

Type straight into the TUI — the default orchestrator routes it:

How many devices and what platforms did we import?
List every device with its model and mgmt IP, and export it to CSV

The natural-language question becomes SQL over the parsed inventory and drops a real exports/*.csv. No query language to learn, and the data is exact — not hallucinated.

Step 5 — Draw the core topology

Draw the core network topology as a draw.io diagram

Open the resulting exports/diagrams/core_topology_*.drawio in diagrams.net — a scoped, correct topology (real adjacencies, vendor stencils) ready for a Confluence page.

Step 6 — Draft a change, then formally validate it

First stand up the validation engine, then ask netops to draft and validate — all inside the TUI via /workspace:

/workspace services
Deploy batfish/allinone, ports 9996 9997
/workspace netops
Write a change plan to <describe your change here>

Replace <describe your change here> with your actual request — for example a new BGP peer, a VLAN, an interface, or a redundant uplink. Keep config-layer validation to BGP/OSPF-style changes, which Batfish models well.

That single request fans out into three stacked, verified sections:

An AI that writes a change and then formally proves it out from one sentence is a different category of tool.

Step 7 — The morning audit inspection

/workspace audit
Run the interface_health audit profile and give me the findings

A Profile — a YAML file of SQL health checks with severity rules — is executed deterministically against the state DB, returning an executive summary plus a saved report (exports/audit_reports/*.md + a findings JSON). Profiles are plain, versioned files: engineers review and extend them, and schedule them with olav cron — the same inspection your NOC runs every morning, as an auditable artifact.

That’s the tour

Local 30B model. Your fleet in — over SSH or from a backup — and out came answers, a CSV, a diagram, a validated change, and a morning NOC inspection. No cloud, no babysitting.

OLAV is open source under BSL-1.1 — github.com/james-olavai/olav.