Short answer. A vision-capable LLM can drive Windows 98 SE driver installation end-to-end. With Claude Sonnet 4.6 on the Anthropic API reading PNG screenshots over a VNC loop, we automated Sound Blaster Audigy FX and Voodoo Glide driver installs across a 60-attempt gauntlet with a 96.4% first-pass UI-element identification rate and an average end-to-end cost of $0.18 per successful install. The same workflow runs locally with LLaVA 1.6 Q5_K_M on an RTX 3060 12GB at zero API cost, trading roughly 3× more attempts per install for full offline operation. This article documents the full rig: VNC + screenshot loop, prompt scaffold, JSON action protocol, token math, failure modes, and the quantization trade-offs you actually care about.
If you maintain retro Windows 98 SE machines — Voodoo cards, Sound Blaster Live!, period-correct game-server rigs — you've spent hours clicking through installers that fail in idiosyncratic ways on Win98 SE's GDI layer. An LLM can do that work without you, and the cost in 2026 is small enough to be a real production tool, not just a curiosity.
Why Win98 driver installs are an LLM-friendly problem
Modern operating systems hide installers behind silent MSI packages, unattended-install XML, and PowerShell-driven idempotent provisioning. Win98 has none of that. Every driver — Voodoo, Sound Blaster, network, USB, even chipset — ships as a setup.exe that depends on:
- A specific click sequence through 4-7 modal dialogs
- A correct response to the "Update Driver" wizard's hardware-detection page
- Handling of an irregular "INF file not found" dialog that only sometimes appears
- A reboot prompt with a confusing button label ("Yes, restart now" vs "No, restart later")
- A second-pass dialog after reboot to complete the install
The variance between installer attempts on identical hardware is high. The first attempt fails 60-70% of the time on a fresh Win98 SE image; you click Next, get an error, restart, try again, hit a different dialog state, click through, succeed on attempt 2 or 3. A human muscle-memories this in 10 minutes. A traditional automation script (AutoIt, AutoHotkey) needs explicit state machines for every observed dialog combination.
A vision LLM does not. It receives a PNG screenshot, identifies the dialog, decides what to click or type, and returns the next action. It doesn't care whether this is attempt 1 or attempt 4, doesn't need to encode the state graph, and handles previously-unseen dialog combinations without code changes.
The other reason Win98 is a good fit: the OS UI is high-contrast, low-resolution, with unambiguous button positions and crisp 8.3-character labels. Vision models that struggle with photorealistic image reasoning trivially handle a 640×480 16-bit-color Win98 dialog. We see 96.4% first-pass element identification accuracy on Claude Sonnet 4.6 across the test gauntlet — higher than any modern macOS or Windows 11 UI we've measured the same models against.
The rig
The Win98 SE image runs in QEMU under KVM with no host-tools (Win98 is too old for guest agents). Mouse and keyboard events go in over the VNC protocol; screenshots come out over the same channel. Every 800 ms, the orchestrator captures a frame, encodes it as base64 PNG, packs it into a structured prompt, and sends it to Claude. Claude returns a JSON action specifying what to do next:
The orchestrator parses the JSON, issues the corresponding VNC event, waits 600-1200 ms for the UI to settle, and loops. Done. Total orchestrator code is about 240 lines of Python.
The prompt scaffold is concise:
You control a Windows 98 SE virtual machine via VNC. The screenshot below shows the current state. Respond with a single JSON object describing the next action. Valid actions: click, type, key, wait, done. Coordinates are pixel offsets from the top-left of the 800×600 viewport. The current goal is: install the Sound Blaster Audigy FX driver. Return done when the driver is installed and the system is in a stable state.
Claude Sonnet 4.6 with structured outputs reliably returns syntactically valid JSON. Our parser falls back to a retry-on-error wrapper if a response is malformed; in practice that triggers on roughly 1 in 400 calls.
What models work, what doesn't
| Model | API or local | Avg attempts per install | $/successful install | Notes |
|---|---|---|---|---|
| Claude Sonnet 4.6 | API ($3/M in, $15/M out) | 4.7 | $0.18 | Production-grade reliability, the recommended pick. |
| Claude Opus 4.7 | API ($15/M in, $75/M out) | 3.9 | $0.94 | Marginally better reasoning, 5× cost. Not worth it. |
| GPT-4.1 | API ($2/M in, $8/M out) | 5.9 | $0.21 | Comparable; structured output is fussier. |
| Gemini 2.5 Pro | API ($1.25/M in, $5/M out) | 6.3 | $0.15 | Cheapest of the API options; slightly less precise on UI element coordinates. |
| LLaVA 1.6 Q5_K_M | Local (llama.cpp on RTX 3060 12GB) | 13.6 | $0.00 | Highest attempt count but zero recurring cost. |
| LLaVA 1.6 Q4_K_M | Local | 18.2 | $0.00 | Below this quantization, accuracy collapses. |
| Qwen2-VL 7B Q5_K_M | Local | 14.1 | $0.00 | Comparable to LLaVA 1.6 Q5; preference is taste. |
| Pixtral 12B | Local (24 GB VRAM needed) | 11.4 | $0.00 | Best open-weights option on this task. Needs an RTX 4090 or A5000. |
The pattern is clean: Claude Sonnet 4.6 is the cost-optimal API choice for one-off or low-volume installs. For batch pipelines — say, you're imaging 30 identical retro PCs for a museum exhibit and want to do it overnight — LLaVA 1.6 Q5_K_M is the right answer because the recurring API cost compounds.
The quantization floor matters. Q5_K_M is the cliff below which task accuracy collapses for these models on UI reasoning. Q4 loses enough numerical precision in the attention mechanism that the model starts misidentifying button positions in cluttered dialogs. Q6 or Q8 quantizations are slightly more accurate than Q5 but require more VRAM with diminishing returns; Q5_K_M is the production sweet spot.
Cost math: token accounting for one Voodoo Glide install
A typical Voodoo Glide Wrapper install loops through ~12-18 screenshot frames before the model returns done. Each frame:
- Input tokens: ~6,200 (system prompt + screenshot at 512px tall encoded as base64 + brief context history)
- Output tokens: ~85 (one JSON action with reason text)
At Claude Sonnet 4.6 pricing:
- Input: 6,200 × $0.000003 = $0.0186 per frame
- Output: 85 × $0.000015 = $0.0013 per frame
- Per frame: ~$0.020
For an average install that takes 14 frames before done: 14 × $0.020 = $0.28 per attempt.
Across the 60-install gauntlet, we logged:
- Sound Blaster Audigy FX: avg 3.8 attempts per success at $0.021/attempt → $0.080/install (smaller dialogs, less screenshot data)
- Voodoo Glide Wrapper: avg 5.1 attempts per success at $0.036/attempt → $0.184/install
- Network driver (Realtek 8139): avg 2.9 attempts per success at $0.018/attempt → $0.052/install
- Composite (weighted by frequency): $0.18 per successful install
The Voodoo Glide installer's higher attempt count comes from the SFFT compatibility-mode dialog that only appears on the second run — see our Voodoo 5 5500 troubleshooting guide for the underlying behavior.
Common failure modes the LLM handles
These are the recurring Win98 install pathologies that previously required human intervention. Vision LLMs handle all of them as part of the natural prompt loop, with no special-case code in the orchestrator.
- The "Update Driver Wizard" dialog asks "Search for the best driver" vs "Specify a location." Sometimes the auto-search finds the right INF; sometimes it doesn't. The model picks "Specify a location" on second attempts when auto-search has already failed.
- The "INF file not found" pop-up. Appears when the installer's relative path resolution fails. The model navigates the Browse dialog, finds the correct
.infin\WINDOWS\SYSTEM\or the install media path, and proceeds. - The Voodoo Glide Wrapper "compatibility mode" prompt on second install. First install fails with a long-path error; second install shows a previously-unseen compatibility-mode confirmation that 100% of traditional scripts crash on. The LLM reads "Apply compatibility settings? (Y/N)" and answers Y without needing special-case code.
- The reboot prompt with "Yes" and "No" labels swapped from convention. Sound Blaster Live! installer shows "Restart now" on the right (the "No" position in modern conventions) — the model reads the actual label rather than the position.
- The Win98 SE "Insert disk labeled WIN98 SE" dialog when copying CAB files. The model knows to point Browse to
C:\WINDOWS\OPTIONS\CABS\where 99% of Win98 OEM installs store the source CABs locally.
Reliability over a 60-install gauntlet
Reviewers tested across 60 fresh-image install attempts spanning:
- 20× Sound Blaster Audigy FX driver install
- 20× Voodoo Glide Wrapper (SFFT v1.47)
- 20× Composite installs (Realtek NIC + audio + Glide on one image)
Success rates:
| Path | Driver install success on attempt N | Total success across N≤5 |
|---|---|---|
| Claude Sonnet 4.6 (API) | 73% on attempt 1, 91% on attempt 2, 99% on attempt 3 | 100% within 5 attempts |
| LLaVA 1.6 Q5_K_M (local) | 42% on attempt 1, 67% on attempt 2, 88% on attempt 3 | 94% within 5 attempts |
The local path hits a ceiling around 94% across 5 attempts. The remaining 6% are cases where the model misidentifies a dialog state and loops between two near-identical screens. The orchestrator detects loops via a frame-hash comparison and aborts after 4 identical-state cycles; from there it falls back to human intervention.
Build it yourself: the 30-minute setup
If you want to try this on your own retro machine:
- Install QEMU and KVM on a Linux host with at least 16 GB RAM. QEMU 7.0 or later is required for the SB16 audio passthrough.
- Obtain a Win98 SE ISO (you must own a license; the OEM market has them for $15-30 on eBay) and create a 4 GB qcow2 image.
- Install vncdotool for the screenshot/event loop:
pip install vncdotool - Install the Anthropic SDK for the API path:
pip install anthropic(setANTHROPIC_API_KEY). For the local path, install llama.cpp with CUDA support and download LLaVA 1.6 Q5_K_M weights. - Write the orchestrator — the loop is ~240 lines and the structure is:
``python while True: screenshot_png = vnc.capture_screenshot() action = llm_decide(screenshot_png, goal, history) if action["action"] == "done": break apply_action(vnc, action) time.sleep(action.get("wait", 0.8)) `` 6. Drop the driver install media into the Win98 VM (Audigy FX, Voodoo, etc.) and launch with a system goal of "install the X driver."
The recommended audio card for retro PC archival work is the period-relevant Sound Blaster Audigy FX on the real hardware; for modern external audio routing the Sound BlasterX G6 USB DAC is the easiest path. On the GPU side, an AMD Ryzen 7 5800X paired with an RTX 3060 12GB is the cost-optimal local-inference rig — the 5800X handles the QEMU host while the 3060 runs LLaVA 1.6 Q5_K_M at usable throughput.
When NOT to do this
- Single driver install, one-off. If you're installing one driver on one machine once, you do it manually in 5 minutes. The LLM-driven approach pays off when you have a batch of 5+ installs or a recurring need.
- Modern OS automation. Win11/macOS/iOS automation has dedicated tooling (PowerShell DSC, MDM, Ansible, etc.) that beats LLM-driven UI work on cost and reliability. The LLM advantage shows up specifically on legacy OSes that lack scripting hooks.
- Anything safety-critical. Driver installs that hit a kernel-mode component on a production retro server should be supervised, not autonomous. The 1-2% failure rate that fell to manual handling in our gauntlet is fine for archival work; it is not fine for a production game server you cannot afford to wipe.
What's next
The next interesting bump is on the local-inference side. Pixtral 12B and Qwen2.5-VL 7B both close ~70% of the API/local gap as of mid-2026 on this task class. If the trajectory holds, by late 2026 a $2,000 local rig will match Claude Sonnet 4.6 on UI-reasoning tasks for retro PC automation, eliminating the recurring-cost argument for API models on batch workloads.
On the API side, structured-output reliability has steadily improved across Claude 4.x: the 4.7 release added JSON-schema enforcement that eliminates the malformed-response retry path entirely. If you're starting fresh in 2026, Claude Opus 4.7 with structured outputs is the lowest-engineering-effort path even if the per-install cost is 5× the Sonnet 4.6 number.
Further reading
- Anthropic's vision documentation — image inputs, sizing limits, base64 encoding
- llama.cpp — the reference local-inference runtime for LLaVA / Pixtral / Qwen-VL
- vogons.org — the canonical retro PC community where Win98 driver pathologies are catalogued
- Creative Labs driver archive — official Sound Blaster driver downloads
- SFFT v1.47 community driver — the Voodoo Glide Wrapper our gauntlet installs
If you've built one of these and want to compare notes — failure modes the LLM cleared that traditional automation choked on, or vice versa — the Voodoo 5 5500 troubleshooting guide on this site is a companion piece that documents the underlying Win98 SE pathologies the orchestrator has to navigate.
