alexwengg commited on
Commit
dbe0ec7
·
verified ·
1 Parent(s): bbe0af9

Add verified Verdict Core ML L128 FP16

Browse files
README.md ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ library_name: coreml
4
+ pipeline_tag: text-classification
5
+ base_model: heman10x/rlcd-modernbert-151m
6
+ tags:
7
+ - coreml
8
+ - apple-silicon
9
+ - decision-model
10
+ - verdict
11
+ ---
12
+
13
+ # Verdict Core ML (L128 FP16)
14
+
15
+ This is a Core ML conversion of the **trained Verdict checkpoint** [`heman10x/rlcd-modernbert-151m`](https://huggingface.co/heman10x/rlcd-modernbert-151m), pinned at `8af2496eb63c7fa66d7d234e1f62629380030eb4`. It has 151,378,177 parameters and retains the full encoder plus trained decision head. The `verdict_fp16_L128_candidates25.mlpackage` file is 303,210,832 bytes and targets iOS 17 / macOS 14 or newer.
16
+
17
+ Inputs are `input_ids` and `attention_mask` of shape `[1,128]`, and `class_marker_map` of shape `[1,25,128]`. The graph returns raw logits and an uncalibrated softmax. For a native Verdict decision, render the request with `native_reference.py`, append the `__insufficient_evidence__` candidate, and apply `calibrator.json` to raw logits. This means at most **24 substantive candidates**. The released calibrator has a separate temperature for several candidate counts. Calling the graph with arbitrary labels or treating `probabilities` as calibrated changes the model's behavior.
18
+
19
+ Verified on Apple M5 Pro/macOS 27.0 against the pinned PyTorch model: 3/3 choice, noul and score smoke decisions agreed, with worst calibrated probability difference 0.00341. The 20-iteration `coreml-cli` median was 3.627 ms CPU+GPU, 3.710 ms CPU+ANE, 3.915 ms automatic, and 11.721 ms CPU only. These are model call times; rendering and tokenization add time. The `verification-L128.json` and `profile-L128.json` files include the details.
20
+
21
+ The public Decision Index tracker reports Verdict at 13.38. Its historical checkpoint and renderer have not been authenticated against this pinned release, so this artifact does **not** claim to reproduce that score. Only the L128 bucket has been verified; larger inputs require a separately exported and tested bucket. Unsupported requests must not be truncated to 128 tokens without stating that behavior.
22
+
23
+ The Hub repo includes the runtime renderer, calibration helper, tokenizer, verification report and SHA-256 asset lock. Conversion source is maintained in [FluidInference/mobius](https://github.com/FluidInference/mobius). Upstream model and code: [Verdict model](https://huggingface.co/heman10x/rlcd-modernbert-151m), [Verdict source](https://github.com/Heman10x-NGU/Verdict-open-jev), Apache-2.0. Base architecture: [`knowledgator/gliclass-modern-base-v2.0`](https://huggingface.co/knowledgator/gliclass-modern-base-v2.0).
assets.lock.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "source_repo": "heman10x/rlcd-modernbert-151m",
3
+ "source_revision": "8af2496eb63c7fa66d7d234e1f62629380030eb4",
4
+ "source_code": "Heman10x-NGU/Verdict-open-jev",
5
+ "source_code_revision_audited": "30f15564821626ca5c1ad5b2638c4eb7078787dd",
6
+ "license": "Apache-2.0",
7
+ "historical_tracker_checkpoint_verified": false,
8
+ "files": {
9
+ "model.safetensors": "d252823994d47a7933217fc86449493299643af6a0c0d83d6bd5a7666d3253ef",
10
+ "config.json": "303f8eef1009cfdcb0cfba3e653247e625f16a4501e2351bad1a633f1f644695",
11
+ "tokenizer.json": "8bb449eb0c037aae44115b65905bb339b8f3f74eb37067c19127feb3c0755723",
12
+ "tokenizer_config.json": "fb54f027372062b2ca52282efb04d178a8b57167a00cd8f4e816515823a2c016",
13
+ "calibrator.json": "af2a876993148efa0726b6ccf710fe2303897d20c0ce8c7c9036eb50f64d23de"
14
+ }
15
+ }
calibrator.json ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_id": "openjev-modernbert-151.4m",
3
+ "temperature": 2.8039,
4
+ "log_temperature": 1.0309995577626943,
5
+ "scope": "open_domain_calibrated_v1",
6
+ "per_k": {
7
+ "2": 5.0069,
8
+ "3": 5.0069,
9
+ "4": 4.0314,
10
+ "5": 3.0560,
11
+ "6": 2.3898,
12
+ "7": 2.3898,
13
+ "9": 1.6668,
14
+ "11": 3.3919,
15
+ "17": 1.7200,
16
+ "25": 1.5144
17
+ },
18
+ "artifact_hash": "b4742a033bce3fb4707e78d910dc89d53c30656d028b1836a992ba87e0766324",
19
+ "format_version": "rlcd-calibrator-v1",
20
+ "provenance": {
21
+ "fitted_on": [
22
+ "data/real_banking_cal.jsonl",
23
+ "data/synthetic_calibration.jsonl",
24
+ "data/slice_cardinality_k3.jsonl",
25
+ "data/slice_cardinality_k5.jsonl",
26
+ "data/slice_cardinality_k9.jsonl",
27
+ "data/slice_cardinality_k17.jsonl",
28
+ "data/slice_cardinality_k25.jsonl",
29
+ "data/slice_distant_oos.jsonl",
30
+ "data/slice_missing_option.jsonl",
31
+ "data/gen/T01.jsonl",
32
+ "data/gen/T02.jsonl",
33
+ "data/gen/T03.jsonl",
34
+ "data/gen/T07.jsonl",
35
+ "data/gen/T12.jsonl"
36
+ ],
37
+ "total_calibration_items": 1753,
38
+ "date": "2026-09-20T14:00:00Z",
39
+ "notes": "Honest stratified temperature scaling fitted strictly via NLL minimization on held-out calibration data. Zero fitting on JevBench evaluation tasks."
40
+ }
41
+ }
native_reference.py ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Verdict's pinned formatting, calibration and typed output contract.
2
+
3
+ The rendering and decoding match Verdict-open-jev/core/{formatting,engine_encoder}.py
4
+ at 30f15564821626ca5c1ad5b2638c4eb7078787dd. The encoder is loaded from
5
+ heman10x/rlcd-modernbert-151m at the revision in assets.lock.json.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import math
12
+ from dataclasses import dataclass
13
+ from pathlib import Path
14
+ from typing import Any
15
+
16
+ import numpy as np
17
+
18
+ ABSTAIN_ID = "__insufficient_evidence__"
19
+ ABSTAIN_DESCRIPTION = "insufficient evidence"
20
+ MAX_SUBSTANTIVE_OPTIONS = 24
21
+ MAX_CANDIDATES = 25
22
+
23
+
24
+ @dataclass(frozen=True)
25
+ class Request:
26
+ kind: str
27
+ text: str
28
+ labels: tuple[str, ...]
29
+ ids: tuple[str, ...]
30
+ values: tuple[float, ...] = ()
31
+
32
+
33
+ def build_request(context: str, question: dict[str, Any]) -> Request:
34
+ """Render one native typed query without dropping trained abstention."""
35
+ kind = question["type"]
36
+ if kind == "choice":
37
+ options = question["options"]
38
+ if not 1 <= len(options) <= MAX_SUBSTANTIVE_OPTIONS:
39
+ raise ValueError("Verdict supports 1 to 24 substantive choice options")
40
+ labels = tuple(f"It is {option['description']}" for option in options)
41
+ ids = tuple(option["id"] for option in options)
42
+ query = question["question"]
43
+ text = f"Question: {query}\n\nContext:\n{context}"
44
+ values: tuple[float, ...] = ()
45
+ elif kind == "score":
46
+ levels = question["levels"]
47
+ if not 1 <= len(levels) <= MAX_SUBSTANTIVE_OPTIONS:
48
+ raise ValueError("Verdict supports 1 to 24 substantive score levels")
49
+ labels = tuple(f"{level['description']} (Value: {level['value']})" for level in levels)
50
+ ids = tuple(level["id"] for level in levels)
51
+ values = tuple(float(level["value"]) for level in levels)
52
+ query = question["question"]
53
+ text = f"Question: {query}\n\nContext:\n{context}"
54
+ elif kind == "noul":
55
+ proposition = question["proposition"]
56
+ labels = (f"true: {proposition}", f"false: not {proposition}")
57
+ ids = ("true", "false")
58
+ values = ()
59
+ text = f"Context:\n{context}\n\nEvaluate proposition: {proposition}"
60
+ query = ""
61
+ else:
62
+ raise ValueError(f"unknown Verdict question type: {kind}")
63
+ labels += (ABSTAIN_DESCRIPTION,)
64
+ ids += (ABSTAIN_ID,)
65
+ prefix = "".join(f"<<LABEL>>{label}" for label in labels)
66
+ return Request(kind, f"{prefix}<<SEP>>{text}", labels, ids, values)
67
+
68
+
69
+ def temperature(calibrator: dict[str, Any], count: int) -> float:
70
+ per_k = calibrator.get("per_k", {})
71
+ value = float(per_k.get(str(count), calibrator["temperature"]))
72
+ if not math.isfinite(value) or value <= 0:
73
+ raise ValueError("invalid trained temperature")
74
+ return value
75
+
76
+
77
+ def decode(logits: np.ndarray, request: Request, calibrator: dict[str, Any]) -> dict[str, Any]:
78
+ """Apply the released per-K calibration and preserve native abstention."""
79
+ k = len(request.ids)
80
+ z = np.asarray(logits, dtype=np.float64).reshape(-1)[:k]
81
+ if len(z) != k or not np.isfinite(z).all():
82
+ raise ValueError("invalid Verdict logits")
83
+ z = z / temperature(calibrator, k)
84
+ p = np.exp(z - z.max())
85
+ p /= p.sum()
86
+ distribution = dict(zip(request.ids, map(float, p)))
87
+ selected_id = request.ids[int(p.argmax())]
88
+ abstained = selected_id == ABSTAIN_ID
89
+ result: dict[str, Any] = {
90
+ "type": request.kind,
91
+ "selected_id": selected_id,
92
+ "probabilities": distribution,
93
+ "is_abstention": abstained,
94
+ "p_abstain": distribution[ABSTAIN_ID],
95
+ "calibration_status": "calibrated_for_scope",
96
+ }
97
+ if request.kind == "choice":
98
+ result["choice"] = selected_id
99
+ elif request.kind == "noul":
100
+ substantive = distribution["true"] + distribution["false"]
101
+ result["noul"] = distribution["true"] / substantive if substantive and not abstained else None
102
+ else:
103
+ substantive = sum(distribution[key] for key in request.ids[:-1])
104
+ result["score"] = (
105
+ sum(value * distribution[key] / substantive for key, value in zip(request.ids[:-1], request.values))
106
+ if substantive and not abstained
107
+ else None
108
+ )
109
+ return result
110
+
111
+
112
+ def load_calibrator(source: Path) -> dict[str, Any]:
113
+ return json.loads((source / "calibrator.json").read_text())
preprocessing.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Tensorize Verdict's native rendered text for one fixed Core ML bucket."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import numpy as np
6
+
7
+
8
+ def prepare(tokenizer, model, rendered: str, length: int, max_candidates: int) -> dict[str, np.ndarray]:
9
+ full = tokenizer(rendered, truncation=False)
10
+ if len(full["input_ids"]) > length:
11
+ raise ValueError(f"Verdict prompt needs {len(full['input_ids'])} tokens; L{length} has no room")
12
+ encoded = tokenizer(rendered, truncation=False, padding="max_length", max_length=length, return_tensors="np")
13
+ ids = encoded["input_ids"].astype(np.int32)
14
+ positions = np.flatnonzero(ids[0] == model.config.class_token_index)
15
+ if len(positions) > max_candidates:
16
+ raise ValueError("candidate markers exceed exported head capacity")
17
+ markers = np.zeros((1, max_candidates, length), dtype=np.float32)
18
+ for row, position in enumerate(positions):
19
+ markers[0, row, position] = 1.0
20
+ return {
21
+ "input_ids": ids,
22
+ "attention_mask": encoded["attention_mask"].astype(np.int32),
23
+ "class_marker_map": markers,
24
+ }
profile-L128.json ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "hardware": {
3
+ "device": "arm64",
4
+ "chip": "Apple M5 Pro",
5
+ "ram": "24GB",
6
+ "os_version": "macOS 27.0",
7
+ "timestamp": "2026-09-22T20:35:07.289343+00:00"
8
+ },
9
+ "models": [
10
+ {
11
+ "model_path": "/var/folders/hg/l0263vy543b3r7rfwgxkt_680000gn/T/verdict_fp16_L128_candidates25.mlmodelc",
12
+ "model_name": "verdict_fp16_L128_candidates25",
13
+ "metadata": {
14
+ "description": "Verdict decision logits; use abstention and per-K calibration in host",
15
+ "author": "Heman10x-NGU (Verdict weights); Fluid Inference (Core ML conversion)",
16
+ "license": "Apache-2.0"
17
+ },
18
+ "cold_compile_ms": 4181.106,
19
+ "results": [
20
+ {
21
+ "compute_units": "all",
22
+ "summary": {
23
+ "cpu_percent": 31.73,
24
+ "gpu_percent": 0.0,
25
+ "ane_percent": 68.27
26
+ },
27
+ "latency": {
28
+ "compile_ms": 28.336,
29
+ "median_ms": 3.915,
30
+ "mean_ms": 4.016,
31
+ "min_ms": 3.701,
32
+ "max_ms": 5.103,
33
+ "std_ms": 0.331,
34
+ "iterations": 20
35
+ }
36
+ },
37
+ {
38
+ "compute_units": "cpu_only",
39
+ "summary": {
40
+ "cpu_percent": 100.0,
41
+ "gpu_percent": 0.0,
42
+ "ane_percent": 0.0
43
+ },
44
+ "latency": {
45
+ "compile_ms": 0.414,
46
+ "median_ms": 11.721,
47
+ "mean_ms": 11.715,
48
+ "min_ms": 11.541,
49
+ "max_ms": 11.985,
50
+ "std_ms": 0.104,
51
+ "iterations": 20
52
+ }
53
+ },
54
+ {
55
+ "compute_units": "cpu_and_gpu",
56
+ "summary": {
57
+ "cpu_percent": 0.0,
58
+ "gpu_percent": 100.0,
59
+ "ane_percent": 0.0
60
+ },
61
+ "latency": {
62
+ "compile_ms": 1.007,
63
+ "median_ms": 3.627,
64
+ "mean_ms": 3.651,
65
+ "min_ms": 3.502,
66
+ "max_ms": 3.896,
67
+ "std_ms": 0.116,
68
+ "iterations": 20
69
+ }
70
+ },
71
+ {
72
+ "compute_units": "cpu_and_neural_engine",
73
+ "summary": {
74
+ "cpu_percent": 31.73,
75
+ "gpu_percent": 0.0,
76
+ "ane_percent": 68.27
77
+ },
78
+ "latency": {
79
+ "compile_ms": 23.874,
80
+ "median_ms": 3.71,
81
+ "mean_ms": 3.739,
82
+ "min_ms": 3.574,
83
+ "max_ms": 4.226,
84
+ "std_ms": 0.153,
85
+ "iterations": 20
86
+ }
87
+ }
88
+ ]
89
+ }
90
+ ]
91
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "backend": "tokenizers",
3
+ "clean_up_tokenization_spaces": true,
4
+ "cls_token": "[CLS]",
5
+ "is_local": false,
6
+ "local_files_only": false,
7
+ "mask_token": "[MASK]",
8
+ "model_input_names": [
9
+ "input_ids",
10
+ "attention_mask"
11
+ ],
12
+ "model_max_length": 8192,
13
+ "pad_token": "[PAD]",
14
+ "sep_token": "[SEP]",
15
+ "tokenizer_class": "TokenizersBackend",
16
+ "unk_token": "[UNK]"
17
+ }
verdict_fp16_L128_candidates25.conversion.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "package": "verdict_fp16_L128_candidates25.mlpackage",
3
+ "source_repo": "heman10x/rlcd-modernbert-151m",
4
+ "source_revision": "8af2496eb63c7fa66d7d234e1f62629380030eb4",
5
+ "source_weight_sha256": "d252823994d47a7933217fc86449493299643af6a0c0d83d6bd5a7666d3253ef",
6
+ "parameters": 151378177,
7
+ "wrapper_max_logit_error": 1.9073486328125e-06,
8
+ "conversion_seconds": 5.913961540965829,
9
+ "package_bytes": 303210832,
10
+ "package_files_sha256": {
11
+ "Manifest.json": "fc5d31df174a9f450bfb9ba406307c379c30fabba5cad38fcaf8717b806c69a8",
12
+ "Data/com.apple.CoreML/model.mlmodel": "6cc079930a63c1069a7a2c259f4c086879981021047767f2bb4d68b6d1f02b00",
13
+ "Data/com.apple.CoreML/weights/weight.bin": "a982e14147982df9abb99a3637075a0193835c6b99edc396a52c1a43c2a4854a"
14
+ }
15
+ }
verdict_fp16_L128_candidates25.mlpackage/Data/com.apple.CoreML/model.mlmodel ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6cc079930a63c1069a7a2c259f4c086879981021047767f2bb4d68b6d1f02b00
3
+ size 306983
verdict_fp16_L128_candidates25.mlpackage/Data/com.apple.CoreML/weights/weight.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a982e14147982df9abb99a3637075a0193835c6b99edc396a52c1a43c2a4854a
3
+ size 302903232
verdict_fp16_L128_candidates25.mlpackage/Manifest.json ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "fileFormatVersion": "1.0.0",
3
+ "itemInfoEntries": {
4
+ "82619DAC-DE6A-49C3-BFE9-4510CA1EB9B1": {
5
+ "author": "com.apple.CoreML",
6
+ "description": "CoreML Model Weights",
7
+ "name": "weights",
8
+ "path": "com.apple.CoreML/weights"
9
+ },
10
+ "D522AC1C-3AF7-4ADE-936E-9D7D8A090D98": {
11
+ "author": "com.apple.CoreML",
12
+ "description": "CoreML Model Specification",
13
+ "name": "model.mlmodel",
14
+ "path": "com.apple.CoreML/model.mlmodel"
15
+ }
16
+ },
17
+ "rootModelIdentifier": "D522AC1C-3AF7-4ADE-936E-9D7D8A090D98"
18
+ }
verification-L128.json ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "source_repo": "heman10x/rlcd-modernbert-151m",
3
+ "source_revision": "8af2496eb63c7fa66d7d234e1f62629380030eb4",
4
+ "package": "/Users/hanweng/Documents/mobius-verdict-laya/models/computer-use/verdict/coreml/build/verdict_fp16_L128_candidates25.mlpackage",
5
+ "chip": "arm",
6
+ "macos": "27.0",
7
+ "max_calibrated_probability_error": 0.003407791923494219,
8
+ "selected_id_agreements": 3,
9
+ "questions": 3,
10
+ "rows": [
11
+ {
12
+ "name": "lost card",
13
+ "type": "choice",
14
+ "tokens": 53,
15
+ "candidates_including_abstention": 3,
16
+ "native": {
17
+ "type": "choice",
18
+ "selected_id": "card_lost",
19
+ "probabilities": {
20
+ "card_lost": 0.627995456676331,
21
+ "pin_reset": 0.12699368118294335,
22
+ "__insufficient_evidence__": 0.2450108621407256
23
+ },
24
+ "is_abstention": false,
25
+ "p_abstain": 0.2450108621407256,
26
+ "calibration_status": "calibrated_for_scope",
27
+ "choice": "card_lost"
28
+ },
29
+ "coreml": {
30
+ "type": "choice",
31
+ "selected_id": "card_lost",
32
+ "probabilities": {
33
+ "card_lost": 0.6283802556009165,
34
+ "pin_reset": 0.1261597182435837,
35
+ "__insufficient_evidence__": 0.24546002615549983
36
+ },
37
+ "is_abstention": false,
38
+ "p_abstain": 0.24546002615549983,
39
+ "calibration_status": "calibrated_for_scope",
40
+ "choice": "card_lost"
41
+ },
42
+ "max_calibrated_probability_error": 0.0008339629393596393,
43
+ "selected_id_agrees": true,
44
+ "median_model_call_ms": 3.475604491541162
45
+ },
46
+ {
47
+ "name": "binary inquiry",
48
+ "type": "noul",
49
+ "tokens": 50,
50
+ "candidates_including_abstention": 3,
51
+ "native": {
52
+ "type": "noul",
53
+ "selected_id": "true",
54
+ "probabilities": {
55
+ "true": 0.46928461522757403,
56
+ "false": 0.24040802067067693,
57
+ "__insufficient_evidence__": 0.29030736410174907
58
+ },
59
+ "is_abstention": false,
60
+ "p_abstain": 0.29030736410174907,
61
+ "calibration_status": "calibrated_for_scope",
62
+ "noul": 0.6612505068952915
63
+ },
64
+ "coreml": {
65
+ "type": "noul",
66
+ "selected_id": "true",
67
+ "probabilities": {
68
+ "true": 0.4658768233040798,
69
+ "false": 0.2409705632084786,
70
+ "__insufficient_evidence__": 0.29315261348744165
71
+ },
72
+ "is_abstention": false,
73
+ "p_abstain": 0.29315261348744165,
74
+ "calibration_status": "calibrated_for_scope",
75
+ "noul": 0.6590911025400003
76
+ },
77
+ "max_calibrated_probability_error": 0.003407791923494219,
78
+ "selected_id_agrees": true,
79
+ "median_model_call_ms": 3.5811454872600734
80
+ },
81
+ {
82
+ "name": "urgency score",
83
+ "type": "score",
84
+ "tokens": 55,
85
+ "candidates_including_abstention": 4,
86
+ "native": {
87
+ "type": "score",
88
+ "selected_id": "__insufficient_evidence__",
89
+ "probabilities": {
90
+ "low": 0.1979320574725608,
91
+ "medium": 0.289823573347529,
92
+ "high": 0.18632966270420953,
93
+ "__insufficient_evidence__": 0.3259147064757007
94
+ },
95
+ "is_abstention": true,
96
+ "p_abstain": 0.3259147064757007,
97
+ "calibration_status": "calibrated_for_scope",
98
+ "score": null
99
+ },
100
+ "coreml": {
101
+ "type": "score",
102
+ "selected_id": "__insufficient_evidence__",
103
+ "probabilities": {
104
+ "low": 0.19782407464261623,
105
+ "medium": 0.2888377991986832,
106
+ "high": 0.18659805748489713,
107
+ "__insufficient_evidence__": 0.32674006867380345
108
+ },
109
+ "is_abstention": true,
110
+ "p_abstain": 0.32674006867380345,
111
+ "calibration_status": "calibrated_for_scope",
112
+ "score": null
113
+ },
114
+ "max_calibrated_probability_error": 0.0009857741488458194,
115
+ "selected_id_agrees": true,
116
+ "median_model_call_ms": 3.4559165069367737
117
+ }
118
+ ],
119
+ "passed": true
120
+ }