coba
16 TagsUpdated Apache-2.0by Ollaya
Ollaya's own decision model: Laya's network on Ettin encoders, distilled from pplx-decider:flash. English. Full-precision 1b and 400m, and ternary sizes small enough for a browser.
ollaya run coba --preset triage "I was charged twice for my subscription this month and want a refund."curl http://localhost:11435/api/decide \
-H "Content-Type: application/json" \
-d '{
"model": "coba",
"state": "I was charged twice for my subscription this month and want a refund.",
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoices and refunds",
"technical": "Bugs, errors and outages",
"account": "Login, profile and settings"
}
},
"refund": {
"type": "noul",
"instructions": "Is the customer asking for a refund?"
}
}
}'# Already using a TypeSafe SDK? Set TYPESAFE_BASE_URL=http://localhost:11435 instead.
import requests
response = requests.post(
"http://localhost:11435/api/decide",
json={
"model": "coba",
"state": "I was charged twice for my subscription this month and want a refund.",
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoices and refunds",
"technical": "Bugs, errors and outages",
"account": "Login, profile and settings"
}
},
"refund": {
"type": "noul",
"instructions": "Is the customer asking for a refund?"
}
}
},
)
answers = response.json()["answers"]
print(answers["department"]["choice"], answers["refund"]["noul"])const response = await fetch("http://localhost:11435/api/decide", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: "coba",
state: "I was charged twice for my subscription this month and want a refund.",
questions: {
department: {
type: "choice",
instructions: "Which team should handle this?",
criteria: {
billing: "Payments, invoices and refunds",
technical: "Bugs, errors and outages",
account: "Login, profile and settings"
}
},
refund: {
type: "noul",
instructions: "Is the customer asking for a refund?"
}
}
}),
});
const { answers } = await response.json();
console.log(answers.department.choice, answers.refund.noul);Models
Every tag| Name | Accuracy | Latency | |||
|---|---|---|---|---|---|
| Most accurateHighest typed-decisions accuracy of the family. | |||||
| coba:1bThe most accurate size (Ettin 1B): 0.608 on typed decisions, zero-shot. | 0.608 | 21 ms | |||
| FasterFastest first; accuracy as measured on the bench. | |||||
| coba:68m-ternaryThe smallest: ternary Ettin 68M, in-domain. | 0.482 | 15 ms | |||
| coba:150m-ternaryTernary Ettin 150M, in-domain; the model the /try page runs in the browser (66 MB). | 0.535 | 17 ms | |||
| coba:400m-ternaryThe 400m with ternary weights, in-domain: trained on the train splits of ten public benchmark tasks. | 0.559 | 20 ms | |||
| coba:400mEttin 400M: 0.591 on typed decisions, zero-shot; 24 ms for five questions on an RTX 5090. | 0.591 | 24 ms | |||
| cobalatestSame as coba:400m. | 0.591 | 24 ms | |||
Accuracy: typed-decisions, argmax against the majority label on 400 states (left out for a tag trained on that data). Latency: the median five-question request on an RTX 5090, Ollaya Bench. Each model carries fp16 and fp32 graphs over one weights file, and loads fp16 on a CUDA GPU and fp32 on CPU.
Readme
Coba is Ollaya's own family of English decision models: Laya's decision network on the Ettin encoders, from 75M to 1.1B parameters, distilled from pplx-decider:flash on about 350,000 permissively licensed questions. It reads a state (a message, a ticket, a JSON object, an agent's next tool call) and typed questions, and returns calibrated probabilities for every question in one forward pass. It never generates text. The ternary tags also run in a web page, on the visitor's device: try one.
Models
| Tag | Weights | Params | Trained | Best for |
|---|---|---|---|---|
coba:1b | fp32 | 1.1B | zero-shot | The most accurate size, on a GPU |
coba:latest, coba:400m | fp32 | 421M | zero-shot | Close to the 1b at 40% of its size; fine on a CPU |
coba:400m-ternary | ternary | 421M | in-domain | The most accurate browser model (147 MB) |
coba:150m-ternary | ternary | 164M | in-domain | The browser default (try it): 66 MB |
coba:68m-ternary | ternary | 75M | in-domain | The smallest: 35 MB in a browser |
All tags read 512 tokens and English only. Each carries an fp16 and an fp32 graph over its own weights file: fp16 on a CUDA GPU, fp32 on the CPU and, through MLX, on the Apple GPU; the -fp16 and -fp32 tags pin one. A ternary tag's weights are −1, 0 or +1 times a scale per output row (as BitNet b1.58), stored as float32 for Ollaya; the 2-bit graph the browser runs is in the same Hugging Face repository.
Zero-shot tags trained without any of the public benchmark's datasets. In-domain tags also trained on the train splits of ten of its eleven datasets (never their test records), so their public-benchmark score is not a held-out measurement, and Ollaya Bench's edition score leaves those tasks out.
Usage
ollaya run coba --ask "Is the customer asking for a refund?" "I was charged twice for order A-104. Refund the duplicate today."Or call the local API with "model": "coba" (see the API). In a web page:
import { fromHub, load } from '@ollaya/web'
const model = await load(fromHub('ollaya-dev/coba-150m-ternary'))
const { answers } = await model.decide({ state, questions })Accuracy and speed
Measured by Ollaya on an RTX 5090: typed-decisions is the 400-row test split of LocalLLaMA/typed-decisions, which no tag trained on; the public benchmark is Bespoke Labs' 3,880 human-labeled questions (macro accuracy); speed is five questions through the HTTP API.
| Tag | typed-decisions | Public benchmark | GPU | CPU |
|---|---|---|---|---|
coba:1b | 0.608 | 0.561 zero-shot | 21 ms | 1530 ms |
coba:400m | 0.591 | 0.561 zero-shot | 24 ms | 919 ms |
coba:400m-ternary | 0.559 | 0.654 in-domain | 20 ms | 887 ms |
coba:150m-ternary | 0.535 | 0.622 in-domain | 17 ms | 496 ms |
coba:68m-ternary | 0.482 | 0.603 in-domain | 15 ms | 323 ms |
score questions are the weakest kind for every encoder of this size; read their probabilities, not only the expected level.
How it works
- Network. The same network as
laya(0.3.7): the question, a[MASK]before every option and the state go into one sequence, and a two-layer head scores each option at its[MASK], with one temperature per question type. - Training. Each question's gold answer where the data has one, mixed with the full probability distribution of
pplx-decider:flash(Apache-2.0), computed through Ollaya. Every data source and its license is listed in each repository'sDATA_SOURCES.tsv; datasets with a non-commercial or unknown license were dropped. - Ternary. Quantization-aware training from the fp model of the same size, distilled from it (logits, attention relations and every layer's hidden states).
- Parity. Ollaya's runtime matches laya's own loader on each checkpoint in fp32 on 2383 questions, on the CPU, on CUDA and on the Apple GPU: identical token ids and markers, the same decision on every question, probabilities within 2e-5. The fp16 graphs agree on 99.6 % to 99.8 % of decisions; the others are near-ties.
Limits
- English only. Other languages are not refused, but not measured.
- State. 512 tokens including the question: messages, tickets and small JSON states, not long documents.
/v1/systemoneanswers a longer state withSTATE_TRUNCATED;/api/decideanswers from its first tokens. - Calibration. Probabilities are calibrated on average, not per domain. Check them on your own data before acting on them automatically.
Weights and license
Apache-2.0, by Ollaya. The base encoders, Ettin by JHU CLSP, are MIT. Ollaya downloads the weights from ollaya-dev (coba-1b, coba-400m, coba-400m-ternary, coba-150m-ternary, coba-68m-ternary), each pinned to a commit and checked against sha256.
Badge
For the model card or a README. Day-0 support for a new model
[](https://ollaya.dev/library/coba)