Turn context into a clear choice.
Model: OpenBuddy/OpenChoice-4B-v1 · Project
OpenChoice-4B-v1 is a system-1 choice model for decisions expressed in natural language. Supply a state, a question, and 2–16 candidates. Get a selected candidate ID and a probability distribution in one forward pass.
Use it for task routing, policy decisions, evidence-based selection, and choosing the next action from a supplied set.
| Model | apus-frozen80 · choice | openbuddy-choice128 v1 |
|---|---|---|
| OpenChoice-4B-v1 | 67/80 | 112/128 |
| Laya multilingual | 37/80 | 42/128 |
| APUS-4B | 66/80 | 101/128 |
| APUS-9B | 70/80 | 107/128 |
Measured with fixed tasks, gold answers, and candidate orders. Frozen80 uses the unified choice interface. APUS runs at high effort with the full head; Laya uses its multilingual checkpoint with a full-input adapter.
Use a CUDA GPU with BF16 support and a CUDA-enabled PyTorch installation. The reference runtime uses Transformers 5.3.0, FlashAttention 2, and the Qwen3.5 linear-attention kernels. Install the pinned dependencies in an environment with a compatible CUDA toolkit; CUDA extensions may require compilation.
pip install -r requirements.txt
hf download OpenBuddy/OpenChoice-4B-v1 --local-dir models/OpenChoice-4B-v1
python inference/infer.py --model-dir models/OpenChoice-4B-v1 < examples/request.jsonlEach input line is a JSON request:
{"state":"Standard delivery takes three days. Express arrives tomorrow and is within budget.","question":"Which option meets tomorrow's deadline?","options":[{"id":"standard","text":"Standard delivery"},{"id":"express","text":"Express delivery"}]}Selected response fields (illustrative probabilities):
{"option_id":"express","probabilities":{"standard":0.08,"express":0.92}}The full response also includes the position label (A–P). Probabilities are normalized candidate scores (uncalibrated).
For Python applications:
from inference.infer import ChoiceModel
model = ChoiceModel("models/OpenChoice-4B-v1")
result = model.decide({
"state": "The customer wants a refund for a duplicate charge.",
"question": "Which team should handle this request?",
"options": [
{"id": "billing", "text": "Billing support"},
{"id": "technical", "text": "Technical support"},
],
})
print(result["option_id"], result["probabilities"])The provided loader scores the dedicated decision head and applies the prompt template with its fixed English thinking prefill. It accepts text inputs up to 8,960 tokens, including the template.
python -m evaluations.evaluate --model-dir models/OpenChoice-4B-v1 --output evaluation-outputThe GPU evaluator runs both panels in their fixed order and saves per-question predictions and accuracy. Errors count as incorrect answers.
- openbuddy-choice128 v1: 128 English/Chinese decision and reasoning cases. Candidate order was shuffled once with seed
20260928128and frozen before the reported evaluation. - apus-frozen80: 80 cases covering browser actions, condition checking, reading comprehension, entailment, and attribute detection. Original candidate order is preserved; all cases use the general choice interface.
Frozen80 comes from APUS-OpenJev-Eval-Frozen80. See the source provenance and upstream license notices, including its pending redistribution review.