Hanno-Labs/bosun-v3.1-1.7b
Bosun 3.1 1.7B
Copyright 2026 Clause Logic Inc. Licensed under the Apache License, Version 2.0. See LICENSE and NOTICE.
GGUF weights: Bosun v3.1 1.7B GGUF (F16, Q80, Q5K_M).
A small, calibrated model for typed decisions. Give Bosun state, criteria, and a set of valid choices; it returns a probability distribution over those choices instead of generating an unconstrained answer. Through the Bosun runtime, the same decision-token contract supports choice, score, and noul questions.
Bosun 3.1 1.7B is a LoRA fine-tune of `Qwen/Qwen3-1.7B` at pinned revision 70d244cc86ccca08cf5af4e1e306ecf908b1ad5e. The base model has 2,031,739,904 parameters. The model uses stable decision slots, supports up to 255 runtime choices plus a null slot, and exposes the full candidate logits so applications can use the probabilities rather than only the winning choice.
DecisionBench results
Bosun was evaluated on the complete frozen 23,900-row DecisionBench suite with 23,900 successful responses, zero errors, and 100% coverage.
The comparison uses the pinned Jev and Luna records in the `decision-bench-results` repository. The raw Bosun artifact is content-addressed and includes every model input, output, probability distribution, decision, and per-row result.
The model was trained on examples from task families represented in this DecisionBench release. These results measure frozen held-out rows from seen task families; they are not evidence of unseen-task OOD generalization.
Inference contract
The repository includes a Transformers model class that loads the complete Bosun package. Install transformers, peft, safetensors, and accelerate, then opt into the repository's typed-decision code:
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"Hanno-Labs/bosun-v3.1-1.7b",
trust_remote_code=True,
dtype="auto",
device_map="auto",
)
choice = model.predict(
state={"request": "Customer cannot access their account."},
instructions="Choose the best support route.",
decision_type="choice",
row_id="example-1",
candidates=[
{"id": "billing", "label": "Billing", "description": "Payment issue"},
{"id": "access", "label": "Account access", "description": "Login issue"},
],
)
score = model.predict(
state={"ticket": "Duplicate charge; customer cannot buy groceries."},
instructions="Rate the support urgency.",
decision_type="score",
row_id="example-2",
candidates=[
{"id": "0", "label": "Low"},
{"id": "1", "label": "Medium"},
{"id": "2", "label": "High"},
],
)
noul = model.predict(
state={"ticket": "The bank confirmed a duplicate charge."},
instructions="Was the duplicate charge confirmed?",
decision_type="noul",
row_id="example-3",
candidates=[
{"id": "yes", "label": "Yes"},
{"id": "no", "label": "No"},
],
)
print(choice["probabilities"])
print(score["probabilities"])
print(noul["probabilities"])trust_remote_code=True is required because Bosun's typed-decision readout is not part of stock Transformers. model.forward(...) remains compatible with the underlying causal LM; model.decision_logits(...) returns all 256 stable slot logits, and model.predict(...) renders the verified prompt contract, masks unused slots, and maps probabilities back to the caller's candidate order.
serving.json remains the authoritative contract. The loader reconstructs all four model components together:
- the pinned Qwen base model;
- the PEFT adapter in
adapter/; - the tokenizer snapshot in
tokenizer/; - the trained decision-token rows in
decision_embeddings.safetensors.
Treat serving.json as the authoritative contract. It defines the prompt schema, pinned base revision, stable-slot assignment, decision-token IDs, maximum choice count, null slot, selected epoch, and checkpoint metrics. Do not infer the meaning of a decision token from its numeric order; candidate meaning comes from the stable presented_slot mapping constructed for each request.
For a choice question, the runtime places each presented candidate in a stable slot, reads the corresponding decision-token logits, masks unused slots, and normalizes the remaining logits into a probability distribution. Score and noul questions use the same typed decision surface rather than free-form text parsing.
Training
- Training rows: 130,000 (80,000 original plus 50,000 ecosystem)
- Epochs completed: 3
- Selected epoch: 2
- Selection metric: macro-family accuracy
- Training-heldout accuracy: 89.80%
- Training-heldout macro-family accuracy: 89.80%
- Batch size: 32 with 2 gradient-accumulation steps
- LoRA rank / alpha: 16 / 32
- Seed: 20260918
The training-heldout metrics above are checkpoint-selection metrics and are separate from the DecisionBench result.
Files
Links
- DecisionBench results — Hanno-Labs/decision-bench-results
- Base model — Qwen/Qwen3-1.7B
- Hanno Labs — hannolabs.ai
