Hanno-Labs/bosun-xs-GGUF overview
Running Bosun locally GGUF These are GGUF builds of Bosun XS 0.6B for CPU / Apple Silicon / edge inference with llama.cpp https://github.com/ggml org/llama.cpp…
Runs locally from ~378.1 MB disk (4 GB VRAM class GPUs with llama.cpp / guIDE).
Repository Files & Downloads
Model Details
| Model ID | Hanno-Labs/bosun-xs-GGUF |
|---|---|
| Author | Hanno-Labs |
| Pipeline | — |
| License | apache-2.0 |
| Base model | Qwen/Qwen3-Reranker-0.6B |
| Last modified | 2026-06-18T13:50:26.000Z |
Model README
---
license: apache-2.0
base_model: Qwen/Qwen3-Reranker-0.6B
tags:
- gguf
- llama.cpp
- reranker
- instruction-following
---
Running Bosun locally (GGUF)
These are GGUF builds of Bosun-XS (0.6B) for CPU / Apple-Silicon / edge inference with
llama.cpp. The full model and the LoRA source live at
⚠️ Do NOT use llama.cpp's --rerank mode
Bosun is a programmable judge: the instruction is the rubric, supplied per request. The GGUF
carries the generative Qwen3 chat template, so llama.cpp's --rerank endpoint **silently discards
your <Instruct>** and returns degenerate scores (~1e-12; opposite rules score identically). It
looks like it works — it does not. (Thanks to Frederick Wood for the careful report.)
Use the completion + logits path instead.
The contract
Build the prompt from serving.json and read two logits at the final token:
prompt = prefix
+ "<Instruct>: <your rule>\n<Query>: <query>\n<Document>: <document>"
+ suffix # suffix already contains the empty "<think>\n\n</think>" block
score = sigmoid( logit[yes_id] - logit[no_id] ) # at the last position
For Bosun-XS: yes_id = 9693, no_id = 2152, max_len = 3072.
Python (llama-cpp-python)
import json, math
from llama_cpp import Llama
cfg = json.load(open("serving.json"))
llm = Llama("Bosun-XS-Q8_0.gguf", n_ctx=cfg["max_len"], logits_all=True, verbose=False)
def score(instruct, query, document):
body = f"<Instruct>: {instruct}\n<Query>: {query}\n<Document>: {document}"
prompt = cfg["prefix"] + body + cfg["suffix"]
toks = llm.tokenize(prompt.encode(), add_bos=False, special=True)
llm.reset(); llm.eval(toks)
lg = llm.scores[len(toks) - 1]
return 1.0 / (1.0 + math.exp(-(lg[cfg["yes_id"]] - lg[cfg["no_id"]])))
# the document is an ORDERED pair — FINDING A then FINDING B (direction matters)
doc = "FINDING A:\nMercury set up its own bank charter.\n\nFINDING B:\nKlar bought a small bank."
print(score("Connected only if both findings are about the same broad topic.",
"These two findings share the specified relationship.", doc))
Files & fidelity
Validated per-pair against the published transformers inference (logits_to_keep=1) on a fixture
spanning the default rubric, instruction steering, and dedup. **Mean / max absolute score difference
vs that reference:**
| file | size | mean abs diff | max abs diff |
|---|---|---|---|
| Bosun-XS-f16.gguf | 1198 MB | 0.0005 | 0.002 |
| Bosun-XS-Q8_0.gguf | 639 MB | 0.0092 | 0.028 |
| Bosun-XS-Q4_K_M.gguf | 396 MB | 0.0449 | 0.1121 |
Pick by use case: f16 is reference-grade; Q8_0 is recommended (calibrated scores intact
at ~half the size). Q4_K_M is smallest — its absolute scores drift, so re-threshold rather than trusting calibrated probabilities (ranking and steering still hold).
All builds preserve steering (scores flip when the rule flips) and ranking order.
Run Hanno-Labs/bosun-xs-GGUF with guIDE
Download guIDE — the AI-native code editor with local LLM inference and 69 built-in tools.
Source: Hugging Face · Compare models