# Bloobability v2.0.0

> Two separately trained tiers, instant and full, that decide any natural-language policy against a conversation and return a calibrated probability and a separate numeric answerable estimate.

Source: https://blooio.com/inference/bloobability-v2-0-0

## Tiers and scope

Every request names a tier with `tier`. Nothing routes between tiers or falls back from one to the other, and the response echoes the tier you asked for.

| Tier | Built on | Parameters | Best for |
| --- | --- | ---: | --- |
| `full` | Qwen/Qwen3.5-4B-Base | 4.206B frozen + 34.4M trained | Reversals, conditions, several speakers, long threads, and conversations that may be missing a fact. Use it when unsure. |
| `instant` | Qwen/Qwen3.5-0.8B-Base | 752.4M frozen + 11.6M trained | Short, explicit questions whose deciding facts are stated. Its `answerable` does not reliably detect missing information. |

Choose by how hard each question is, not by how many you ask. These are research measurements on inspected and fresh public panels, not an audited customer error rate or a production latency guarantee. Neither tier is a gate-qualified general release under Blooio's release scorecard; the failed gates are listed under Limitations.

## What these models make possible

You write the things you care about in plain language, send a conversation, and get two numbers back for each one: how likely it holds, and whether the conversation could tell. One conversation becomes a decision; across many conversations, the same probabilities average into a rate you can watch. Three examples, each sent to the tier that fits it (requests only; neither tier has scored these exact conversations):

- **Return, `full`.** A late, cracked delivery and a refund request, with policies `delivery_delay`, `damaged_item` and `refund_request`. Nobody says "delivery delay" or "damaged item"; the late arrival has to be read from Tuesday and Friday. A support tool can tag the ticket and start the return. Anything that moves money belongs on the full tier (88.8% vs 77.9% on 900 fresh public questions).
- **Class, `instant`.** A gym member books Thursday sparring, with policies `existing_member`, `sparring_session` and `class_booking`. Every deciding fact is stated outright, which is what instant is for, at 2.6 to 3.6 times the full tier's speed. A policy that might depend on a fact nobody gave (a signed waiver, say) belongs on the full tier, because instant's `answerable` barely moves when a fact is missing.
- **Opt-out, `full`.** The customer says stop, says they never opted in, and asks to cancel a Friday reminder, with policies `opt_out`, `never_opted_in` and `cancel_reminder`, each scored independently. A compliance tool can honor the opt-out and cancel the reminder. If the customer had only said "stop", `never_opted_in` could not be decided; the full tier's low `answerable` lets the tool route that question to a person instead of reading it as a no (116 of 134 missing facts flagged, 8 of 514 answerable ones wrongly flagged).

## Architecture

Both tiers share one design and differ in size. A hybrid decoder that mixes Gated DeltaNet and full-attention layers reads the conversation once. Each policy then continues from a private copy of the attention, recurrent and convolution state, so policies cannot see one another. A pointer head reads the decision and a separately trained head estimates answerability. Neither tier generates text or runs a full-vocabulary output projection; code assembles the response. Probabilities are not normalized across policies, and policy IDs never reach the model. Renaming, reordering or adding policies left every other result exactly unchanged in both tiers' isolation checks.

| | Full | Instant |
| --- | --- | --- |
| Trained by Blooio | 32.5M LoRA, 1.31M decision pointer, 661K answerability head | 10.8M LoRA, 525K decision pointer, 265K answerability head |
| A low answerable | Means the fact is likely missing; route the policy to a person or ask | Rarely happens even when a fact is missing; send those policies to full |
| Peak GPU memory allocated | 13.61 GiB | 3.63 GiB |

## Calibration

Each tier has one generic decision map and one answerability map, fitted on data kept apart from training and evaluation and frozen. No policy-specific offsets. On the 900 public questions seven of the full tier's ten reliability bins fall below the diagonal, so it leans toward yes where it is most confident: in the top bin it stated 0.96 on average and was right 0.90 of the time. Check calibration on your own traffic before treating averaged probabilities as exact rates.

## Benchmarks

### 900 fresh public questions

300 rows each from HANS train, BoolQ train and SNLI validation, none used in training or calibration. Familiar public tasks, not unseen policy families.

| Measure | Instant | Full |
| --- | ---: | ---: |
| Correct at 0.5, of 900 | 701 (77.9%) | 799 (88.8%) |
| Log loss (lower is better) | 0.574 | 0.330 |
| Brier score (lower is better) | 0.176 | 0.094 |
| AUROC | 0.814 | 0.929 |
| 10-bin ECE | 0.130 | 0.049 |
| Wrong among answers ≥ 90% confident | 88 of 388 | 47 of 666 |
| HANS (300) | 62.0%, log loss 0.985 | 82.3%, log loss 0.523 |
| BoolQ (300) | 80.0%, log loss 0.494 | 89.3%, log loss 0.298 |
| SNLI (300) | 91.7%, log loss 0.244 | 94.7%, log loss 0.170 |

### Missing-information screen

240 short AI-labeled rows, intentionally easy: 180 with a stated answer and 60 asking about a value never given.

| Measure | Instant | Full |
| --- | ---: | ---: |
| Known answers correct, of 180 | 180 | 180 |
| Log loss on known answers | 0.070 | 0.033 |
| Missing-value cases flagged, of 60 | 0 | 60 |
| Answerable cases wrongly flagged, of 180 | 0 | 2 |

### Development panels

Inspected synthetic references, not untouched final tests.

| Panel | Instant | Full |
| --- | ---: | ---: |
| Broad synthetic, 4,316 known | 87.1%, log loss 0.310 | 93.8%, log loss 0.172 |
| Supplied rules, 300 known | 60.3%, log loss 0.813 | 93.0%, log loss 0.177 |
| Composed policies, 214 known | 69.6%, log loss 0.689 | 88.8%, log loss 0.237 |
| Reversals, 32 (all negative) | 12 of 32 | 32 of 32 |

Full-tier answerability on a broader annotated set: 116 of 134 unknowns flagged, 8 of 514 answerable cases wrongly flagged.

## Latency

Matched served latency on one RTX 4090, p50 / p95, through the serving gateway over loopback HTTP on the GPU host with both tiers resident. Same conversations and policies for both tiers; warm models, no cached inputs, one request at a time, five warm-ups per cell, then 120 observations per cell across three blocks with the tier order alternated. Includes authentication, validation, inference, calibration and serialization; excludes the internet and the public API. The tiers share one GPU and take turns on it, so under mixed traffic a request can also wait for the other tier's work. No production load, sustained throughput or p99 guarantee was measured.

| Workload | Instant | Full |
| --- | ---: | ---: |
| Short (4 messages), 1 policy | 8.23 / 8.36 ms | 25.81 / 25.90 ms |
| Short, 3 policies | 15.01 / 15.14 ms | 49.36 / 49.48 ms |
| Short, 6 policies | 24.91 / 25.01 ms | 83.90 / 84.03 ms |
| Medium (16 messages), 1 policy | 14.19 / 14.44 ms | 51.56 / 51.83 ms |
| Medium, 3 policies | 21.79 / 21.89 ms | 76.41 / 76.69 ms |
| Medium, 6 policies | 32.72 / 32.84 ms | 112.74 / 113.04 ms |
| Long (33 messages), 1 policy | 31.34 / 32.04 ms | 81.65 / 82.29 ms |
| Long, 3 policies | 39.75 / 40.19 ms | 108.01 / 108.61 ms |
| Long, 6 policies | 52.33 / 52.97 ms | 146.95 / 147.29 ms |

Instant is 2.6 to 3.6 times faster across these cells.

## Training

Both tiers are built on pretrained Qwen3.5 base models, with Blooio's task training on top: LoRA adapters on a frozen base, the decision pointer and a new answerability head.

- **Full** went through broad task adaptation and a logical-relevance and hard-negative stage, then a final logical-operator stage: 256 updates over 4,096 forwards, 512 of them matched contrast examples on operators and wording and the rest replaying earlier stages; 1.12M tokens, seed 29, 764 seconds on one RTX 4090.
- **Instant** went through project adaptation, semantic coverage, wording-diversity and natural-text stages, then a joint-rule curriculum: 256 updates, 4,096 forwards, seed 29, 508 seconds on one RTX 4090.

References are synthetic and executable scenario labels, annotations verified by an independent AI model rather than by people, and native public training labels. No private customer data was used. Unanswerable cases supervise answerability; their decision labels are masked, never set to 0.5. Calibration partitions and evaluation sets are kept apart from training. One seed per model limits generalization claims.

## API

`POST https://api.blooio.com/v4/ai/bloobability/v2/decide`

```json
{
  "tier": "full",
  "messages": [
    { "id": "m1", "role": "customer", "speaker_id": "customer-1", "text": "The package arrived three days late. The screen is cracked." },
    { "id": "m2", "role": "agent", "speaker_id": "support-1", "text": "I can send a replacement." },
    { "id": "m3", "role": "customer", "speaker_id": "customer-1", "text": "Actually, I want a full refund instead." }
  ],
  "policies": [
    { "id": "delivery_delay", "definition": "The delivered order arrived later than promised." },
    { "id": "refund_request", "definition": "The customer currently asks for money back." }
  ]
}
```

Response: `{ "tier", "model_version", "policies": [{ "id", "probability", "answerable" }] }`, one result per policy in request order.

- `tier` is required: `full` or `instant`. There is no `auto`.
- `messages[]` need a unique `id` and non-blank `text`. `role`, `speaker_id` and RFC 3339 `timestamp` (with an offset, non-decreasing) are optional; send them only when real.
- `policies[]` need a unique `id` and a `definition`. The definition is the whole policy.
- `assessment_time` is an optional "now" for time-relative policies.
- `probability` is the calibrated probability the policy holds. `answerable` is a separate number from 0 to 1 estimating whether the conversation holds enough to judge it; it never changes the probability. No verdict or threshold fields.
- Limits: 1–128 policies, 1–2,048 messages, 1 MiB. Unknown fields, null, blank strings, duplicate keys and duplicate IDs are rejected with 400. Context overflow is a 422, never truncated. 429 and 503 `model_unavailable` mean retry with backoff; 503 `inference_timeout` or `gpu_memory_exhausted` means shorten the request. Errors use `{ "error": { "code", "message", "details" } }`; 5xx errors carry no `details`.

## Side-by-side example

Served outputs from the deployed versions (`bloobability-v2-full-392ad04431a8`, `bloobability-v2-instant-66ed0aa9ceb4`) for one deliberately easy conversation (customer: "The packing colour for reference case 0 is blue."; agent: "The supplied value is recorded. No other attributes are provided."), each policy sent in its own request under an opaque ID:

| Policy | Full probability / answerable | Instant probability / answerable |
| --- | ---: | ---: |
| The packing colour is blue. | 0.988 / 0.988 | 0.935 / 0.984 |
| The packing colour is green. | 0.013 / 0.997 | 0.112 / 0.986 |
| The supplied value of the packing colour equals blue. | 0.979 / 0.985 | 0.935 / 0.984 |
| The required account balance is greater than 100 dollars. The balance is necessary and was not given. | 0.165 / 0.070 | 0.056 / 0.844 |

The full tier flags the missing balance with a low answerable; instant does not.

## Limitations

The full tier misses two gates set before testing, each relative to instant's results:

| Gate | Full tier measured | Limit |
| --- | --- | --- |
| Scoped policies, 160 known | 95.0% correct; log loss 0.171, Brier 0.044 | Log loss ≤ 0.113, Brier ≤ 0.040 |
| Conditional policies, 40 known | 1 answerable case flagged as unanswerable | 0 of 40 |

On the conditional slice the full tier also flags only 5 of the 8 unanswerable cases.

- Instant's `answerable` does not reliably detect missing information; do not use it as a safety filter. Instant got 12 of 32 reversals right.
- Built for English, text-only customer conversations. Attachments are not read.
- Scores reflect a model's judgment of your definition, not human-verified ground truth. Rewording a definition, or renaming things inside a conversation that should not matter, can move a probability.

## Specifications

- Full base: Qwen/Qwen3.5-4B-Base @ 1001bb4
- Instant base: Qwen/Qwen3.5-0.8B-Base @ dc7cdfe
- Precision: BF16 merged backbone; FP32 decision and answerability heads
- Runtime: PyTorch 2.8.0 + CUDA 12.8; Transformers 5.17.0; measured on NVIDIA RTX 4090
- Decoding: none; calibration: one decision and one answerability map per tier; no thresholds in the response
- Model versions: `bloobability-v2-full-392ad04431a8` · `bloobability-v2-instant-66ed0aa9ceb4`
- Language: English

## Links

- HTML page: https://blooio.com/inference/bloobability-v2-0-0
- Benchmark summary and source hashes: https://blooio.com/benchmarks/bloobability-v2-0-0.json
- API guide: https://docs.blooio.com/guides/conversation-insights
- Inference catalog: https://blooio.com/inference.md
