- stage-d: next-line / block-close / multi-line fixes, symbols format 2, TS errors in the header. Held-out: 0.426 exact / 0.700 edit sim (stage-c 0.405 / 0.689); block close 0.27 -> 0.79. - stage-e: next-edit (80% exact region rewrites, abstains on 100% of no-edit samples). - Manifest: nextEditModel (companion) and nextEditFormat (older extensions ignore it, so they never use next-edit with the empty-output deletion bug). - Daemon: next-edit served by the companion model in a second llama-server, started after the main model loads. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J39imRDT8L7xYbWzsVWd8A
Models
Q8_0 GGUF fill-in-the-middle models for the Local Autocomplete extension, fine-tuned from Qwen2.5-Coder-0.5B for TypeScript, Vue and Node.js.
| model | description | prompt order | context modes | size |
|---|---|---|---|---|
stage-d |
Suffix-first FIM with symbols (incl. namespace imports) + TS errors; better next-line, block closing and multi-line completions | spm | symbols, simple | 531 MB |
stage-e |
Next-edit prediction (rewrites a region around the cursor or answers "no edit"); also does FIM, slightly below stage-d | spm | symbols, simple | 531 MB |
stage-c |
Suffix-first FIM with repo/symbol-context headers (default) | spm | symbols, simple | 531 MB |
stage-b |
Suffix-first FIM without context headers (previous stage) | spm | raw | 531 MB |
The extension reads manifest.json, downloads the selected model once, verifies its SHA-256 and
runs it locally with llama.cpp. The files are stored with Git LFS; download links use Gitea's /media/ route:
https://git.harvmaster.com/Harvmaster/autocomplete-model/media/branch/main/models/<file>
Evaluation (612 held-out samples from private repos the model never saw, suffix-first prompts)
| exact match | edit similarity | still parses | |
|---|---|---|---|
| Qwen2.5-Coder-0.5B (base) | 0.270 | 0.506 | 0.783 |
| Qwen2.5-Coder-1.5B (base) | 0.366 | 0.623 | 0.882 |
stage-b |
0.391 | 0.689 | 0.952 |
stage-c (with symbol context) |
0.397 | 0.681 | 0.954 |
stage-c + token healing (daemon default) |
0.405 | 0.689 | |
stage-d (symbols + TS errors, healed) |
0.426 | 0.700 | 0.954 |
stage-e (symbols + TS errors, healed) |
0.412 | 0.691 | 0.962 |
New behaviours (886 further held-out samples), exact match, stage-c → stage-d: closing a block 0.27 → 0.79, next line 0.01 → 0.18, rest of block 0.08 → 0.11, member access 0.63 → 0.66.
Next-edit (stage-e, 445 held-out samples): 80% exact region rewrites (edit similarity 0.99) where an edit
was due, and "no edit" on 100% of samples where none was. stage-d uses stage-e as its next-edit companion
(nextEditModel in the manifest): the extension downloads both and the daemon runs it in a second llama-server.
The base models were evaluated in their native prefix-first order (they can't do suffix-first). Suffix-first prompts let the editor reuse the KV cache while typing: about 2 tokens re-processed per keystroke, ~90–100 ms end-to-end on a laptop CPU.
Using the files directly
Any llama.cpp-based runtime works, but the prompt must match the training layout. The
daemon and shared/prompt.ts are the reference.
Suffix-first (spm) order:
<|fim_prefix|><|fim_suffix|>{suffix}<|fim_middle|>{prefix} → model generates the middle, then <|endoftext|>
stage-c additionally expects a repo-level header: <|repo_name|>{repo}\n<|file_sep|>{path}\n, optionally with a
__symbols__.d.ts pseudo-file of available symbols before it.
Training data
Fine-tuned on permissively licensed open-source repositories (below, pinned commits) and on the publisher's own code (not published). Secrets were scrubbed from all training data; held-out evaluation repos were never trained on.
License
Apache-2.0 (LICENSE, NOTICE), as a derivative of Qwen2.5-Coder.