decision-toolkit 0.2.1__tar.gz → 0.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/CHANGELOG.md +27 -1
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/PKG-INFO +7 -4
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/README.md +6 -3
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/bench/suites/smoke.jsonl +3 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/BENCH.md +9 -0
- decision_toolkit-0.3.1/docs/CATALOG_PROPOSAL.md +122 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/CLI.md +9 -4
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/RELEASE.md +10 -8
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/ROADMAP.md +7 -9
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/VARIANTS.md +26 -15
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/index.md +1 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/models/README.md +3 -0
- decision_toolkit-0.3.1/docs/models/laya-multilingual.md +83 -0
- decision_toolkit-0.3.1/docs/models/open-jev-deberta-v3-large.md +84 -0
- decision_toolkit-0.3.1/docs/models/strands-decider-2b.md +91 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/pyproject.toml +1 -1
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/__init__.py +1 -1
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/adapters/__init__.py +18 -1
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/adapters/laya.py +48 -26
- decision_toolkit-0.3.1/src/decision_toolkit/adapters/openjev.py +183 -0
- decision_toolkit-0.3.1/src/decision_toolkit/adapters/strands_decider.py +181 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/catalog.py +262 -1
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/cli.py +34 -22
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_adapters_laya.py +40 -0
- decision_toolkit-0.3.1/tests/test_adapters_openjev.py +83 -0
- decision_toolkit-0.3.1/tests/test_adapters_strands.py +78 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_catalog.py +10 -1
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_cli.py +16 -6
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/uv.lock +1 -1
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/.github/workflows/ci.yml +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/.github/workflows/docs.yml +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/.github/workflows/release.yml +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/.gitignore +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/CONTRIBUTING.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/LICENSE +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/SECURITY.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/THIRD_PARTY_NOTICES.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/bench/README.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/bench/__init__.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/bench/load.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/bench/results/2026-10-20-calibration.json +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/bench/results/2026-10-20-load.json +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/bench/results/2026-10-20-smoke.json +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/bench/run.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/bench/suites/calibration.jsonl +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/CORE.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/EXAMPLES.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/OPERATIONS.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/REST.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/models/gliner2.5-decide.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/models/gliner2.5-multi.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/models/julia-1.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/models/laya.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/docs/models/opendecider-nano.md +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/__main__.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/adapters/base.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/adapters/gliner2.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/adapters/gliner2_decide.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/adapters/julia.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/adapters/opendecider.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/calibration.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/config.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/contracts/__init__.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/contracts/common.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/contracts/mapping.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/contracts/openai_decisions_beta.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/contracts/systemone_v1.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/decision_model.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/engine/__init__.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/errors.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/limits.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/metrics.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/models.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/observability.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/py.typed +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/registry.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/results.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/schema.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/server.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/src/decision_toolkit/tracing.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/__init__.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/conftest.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_adapters_gliner2.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_adapters_gliner2_decide.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_adapters_julia.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_adapters_opendecider.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_bench.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_config.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_contracts_conformance.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_core_phase1.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_decision_model.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_fuzz_rest.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_integration_gliner2.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_models.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_operations.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_results.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_schema.py +0 -0
- {decision_toolkit-0.2.1 → decision_toolkit-0.3.1}/tests/test_server.py +0 -0
|
@@ -1,8 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
All notable changes to this project are documented here. Version `0.
|
|
3
|
+
All notable changes to this project are documented here. Version `0.3.1` is
|
|
4
4
|
published on PyPI.
|
|
5
5
|
|
|
6
|
+
## [0.3.1] — 2026-10-21
|
|
7
|
+
|
|
8
|
+
Catalog UX patch: `dtk models list` now prints one row per variant, with
|
|
9
|
+
`variant`, quantization, role, size, cache state and the exact download/select
|
|
10
|
+
commands. `dtk models variants` prints both commands for every variant. No
|
|
11
|
+
model, adapter or REST contract changes.
|
|
12
|
+
|
|
13
|
+
## [0.3.0] — 2026-10-21
|
|
14
|
+
|
|
15
|
+
Catalog expansion: three verified ONNX decision models and eight variants.
|
|
16
|
+
Laya multilingual, Open-Jev DeBERTa v3 large and Strands Decider 2B are now
|
|
17
|
+
available through the library, CLI and REST projection.
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- `laya-multilingual` with fused Laya ONNX support (`fp16` default, `fp32`).
|
|
22
|
+
- `open-jev-deberta-v3-large` with a span-pooling adapter (`fp16` default,
|
|
23
|
+
`fp32`, `q4`, `q4f16`).
|
|
24
|
+
- `strands-decider-2b` with a pointer-head adapter (`q4f16` default, `q8`).
|
|
25
|
+
- New `open-jev` and `strands-decider` adapters and a fused branch in `laya`.
|
|
26
|
+
- Model cards, benchmark cases, a catalog proposal and documentation for every
|
|
27
|
+
added variant.
|
|
28
|
+
- All 15 catalogued variants verified for SHA256, files and ONNX sessions.
|
|
29
|
+
|
|
6
30
|
## [0.2.1] — 2026-10-20
|
|
7
31
|
|
|
8
32
|
Metadata-only release: this project's documentation and project URLs now point
|
|
@@ -168,6 +192,8 @@ README correction. No code or model behavior changed.
|
|
|
168
192
|
- Typed `DecisionModel` API with lifecycle, batching, async, usage, warnings,
|
|
169
193
|
normalized confidence, capabilities, structured events and atomic model store.
|
|
170
194
|
|
|
195
|
+
[0.3.1]: https://pypi.org/project/decision-toolkit/0.3.1/
|
|
196
|
+
[0.3.0]: https://pypi.org/project/decision-toolkit/0.3.0/
|
|
171
197
|
[0.2.1]: https://pypi.org/project/decision-toolkit/0.2.1/
|
|
172
198
|
[0.2.0]: https://pypi.org/project/decision-toolkit/0.2.0/
|
|
173
199
|
[0.1.7]: https://pypi.org/project/decision-toolkit/0.1.7/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: decision-toolkit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Local-first toolkit for open-weights decision models: one ONNX engine, one adapter per model contract, typed choice/yes-no/score decisions with probabilities on CPU.
|
|
5
5
|
Project-URL: Homepage, https://github.com/gia-uh/decision-toolkit
|
|
6
6
|
Project-URL: Repository, https://github.com/gia-uh/decision-toolkit
|
|
@@ -59,7 +59,7 @@ and CLI. `dtk --help` and every subcommand help also include runnable examples.
|
|
|
59
59
|
## Installation
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
|
-
uv pip install decision-toolkit # library + CLI (0.
|
|
62
|
+
uv pip install decision-toolkit # library + CLI (0.3.1 on PyPI)
|
|
63
63
|
uv pip install "decision-toolkit[onnx]" # + onnxruntime, tokenizers (the model runtime)
|
|
64
64
|
uv pip install "decision-toolkit[server]" # + REST server (FastAPI)
|
|
65
65
|
```
|
|
@@ -67,7 +67,7 @@ uv pip install "decision-toolkit[server]" # + REST server (FastAPI)
|
|
|
67
67
|
The project is managed with [uv](https://docs.astral.sh/uv/) and ships a committed `uv.lock`. Published
|
|
68
68
|
wheels remain compatible with `pip` for environments that do not use uv.
|
|
69
69
|
|
|
70
|
-
PyPI: <https://pypi.org/project/decision-toolkit/0.
|
|
70
|
+
PyPI: <https://pypi.org/project/decision-toolkit/0.3.1/>. See
|
|
71
71
|
[docs/RELEASE.md](https://github.com/gia-uh/decision-toolkit/blob/main/docs/RELEASE.md)
|
|
72
72
|
for the Trusted Publishing flow and clean-install checks.
|
|
73
73
|
|
|
@@ -207,6 +207,9 @@ adapters (there is no generic "any ONNX" adapter).
|
|
|
207
207
|
| `laya` | `laya` | **m0** — verified against torch (Δp ≤ 0.005) | `q8`* (528 MB) |
|
|
208
208
|
| `julia-1` | `julia` | **m0** — verified: 100/100 argmax parity, 329 ms | `fp32`* (618 MB) |
|
|
209
209
|
| `opendecider-nano` | `opendecider` | **m0** — official build; prompt ported from pinned code (530 ms) | `q8f16`* (469 MB); `fp16` (792 MB) |
|
|
210
|
+
| `laya-multilingual` | `laya` | **m0** — fused ONNX; upstream parity (37 ms) | `fp16`* (682 MB); `fp32` (1326 MB) |
|
|
211
|
+
| `open-jev-deberta-v3-large` | `open-jev` | **m0** — Open-Jev DeBERTa v3 large repro; 0.854 in-domain (241 ms) | `fp16`* (884 MB); `fp32` (1758 MB); `q4` (487 MB); `q4f16` (357 MB) |
|
|
212
|
+
| `strands-decider-2b` | `strands-decider` | **m0** — reference fixture match (719 ms) | `q4f16`* (1114 MB); `q8` (1821 MB) |
|
|
210
213
|
|
|
211
214
|
**Only `m0` models are in the catalog.** Researched-but-unavailable models
|
|
212
215
|
(planned, conversion pending, broken exports) are listed in
|
|
@@ -222,7 +225,7 @@ own repo files, size and role. A `*` in the table above marks the default.
|
|
|
222
225
|
`dtk models list` always shows every catalogued variant and what is cached:
|
|
223
226
|
|
|
224
227
|
```bash
|
|
225
|
-
dtk models list #
|
|
228
|
+
dtk models list # one row per variant; * = default
|
|
226
229
|
dtk models list --quant # add the quantization labels
|
|
227
230
|
dtk models variants gliner2.5-multi # full details for one model
|
|
228
231
|
```
|
|
@@ -21,7 +21,7 @@ and CLI. `dtk --help` and every subcommand help also include runnable examples.
|
|
|
21
21
|
## Installation
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
|
-
uv pip install decision-toolkit # library + CLI (0.
|
|
24
|
+
uv pip install decision-toolkit # library + CLI (0.3.1 on PyPI)
|
|
25
25
|
uv pip install "decision-toolkit[onnx]" # + onnxruntime, tokenizers (the model runtime)
|
|
26
26
|
uv pip install "decision-toolkit[server]" # + REST server (FastAPI)
|
|
27
27
|
```
|
|
@@ -29,7 +29,7 @@ uv pip install "decision-toolkit[server]" # + REST server (FastAPI)
|
|
|
29
29
|
The project is managed with [uv](https://docs.astral.sh/uv/) and ships a committed `uv.lock`. Published
|
|
30
30
|
wheels remain compatible with `pip` for environments that do not use uv.
|
|
31
31
|
|
|
32
|
-
PyPI: <https://pypi.org/project/decision-toolkit/0.
|
|
32
|
+
PyPI: <https://pypi.org/project/decision-toolkit/0.3.1/>. See
|
|
33
33
|
[docs/RELEASE.md](https://github.com/gia-uh/decision-toolkit/blob/main/docs/RELEASE.md)
|
|
34
34
|
for the Trusted Publishing flow and clean-install checks.
|
|
35
35
|
|
|
@@ -169,6 +169,9 @@ adapters (there is no generic "any ONNX" adapter).
|
|
|
169
169
|
| `laya` | `laya` | **m0** — verified against torch (Δp ≤ 0.005) | `q8`* (528 MB) |
|
|
170
170
|
| `julia-1` | `julia` | **m0** — verified: 100/100 argmax parity, 329 ms | `fp32`* (618 MB) |
|
|
171
171
|
| `opendecider-nano` | `opendecider` | **m0** — official build; prompt ported from pinned code (530 ms) | `q8f16`* (469 MB); `fp16` (792 MB) |
|
|
172
|
+
| `laya-multilingual` | `laya` | **m0** — fused ONNX; upstream parity (37 ms) | `fp16`* (682 MB); `fp32` (1326 MB) |
|
|
173
|
+
| `open-jev-deberta-v3-large` | `open-jev` | **m0** — Open-Jev DeBERTa v3 large repro; 0.854 in-domain (241 ms) | `fp16`* (884 MB); `fp32` (1758 MB); `q4` (487 MB); `q4f16` (357 MB) |
|
|
174
|
+
| `strands-decider-2b` | `strands-decider` | **m0** — reference fixture match (719 ms) | `q4f16`* (1114 MB); `q8` (1821 MB) |
|
|
172
175
|
|
|
173
176
|
**Only `m0` models are in the catalog.** Researched-but-unavailable models
|
|
174
177
|
(planned, conversion pending, broken exports) are listed in
|
|
@@ -184,7 +187,7 @@ own repo files, size and role. A `*` in the table above marks the default.
|
|
|
184
187
|
`dtk models list` always shows every catalogued variant and what is cached:
|
|
185
188
|
|
|
186
189
|
```bash
|
|
187
|
-
dtk models list #
|
|
190
|
+
dtk models list # one row per variant; * = default
|
|
188
191
|
dtk models list --quant # add the quantization labels
|
|
189
192
|
dtk models variants gliner2.5-multi # full details for one model
|
|
190
193
|
```
|
|
@@ -3,3 +3,6 @@
|
|
|
3
3
|
{"id":"laya-billing","model":"laya","state":"I was charged twice for my order last week and nobody replied.","questions":{"team":{"type":"choice","instructions":"Which team should handle this?","criteria":{"billing":"payments and refunds","technical":"bugs and errors"}}},"expected":{"team":"billing"}}
|
|
4
4
|
{"id":"julia-billing","model":"julia-1","state":"I was charged twice for my order last week and nobody replied.","questions":{"team":{"type":"choice","instructions":"Which team should handle this?","criteria":{"billing":"payments and refunds","technical":"bugs and errors"}}},"expected":{"team":"billing"}}
|
|
5
5
|
{"id":"opendecider-billing","model":"opendecider-nano","state":"I was charged twice for my order last week and nobody replied.","questions":{"team":{"type":"choice","instructions":"Which team should handle this?","criteria":{"billing":"payments and refunds","technical":"bugs and errors"}}},"expected":{"team":"billing"}}
|
|
6
|
+
{"id":"laya-multilingual-billing","model":"laya-multilingual","state":"I was charged twice for my order last week and nobody replied.","questions":{"team":{"type":"choice","instructions":"Which team should handle this?","criteria":{"billing":"payments and refunds","technical":"bugs and errors"}}},"expected":{"team":"billing"}}
|
|
7
|
+
{"id":"open-jev-billing","model":"open-jev-deberta-v3-large","state":"I was charged twice for my order last week and nobody replied.","questions":{"team":{"type":"choice","instructions":"Which team should handle this?","criteria":{"billing":"payments and refunds","technical":"bugs and errors"}}},"expected":{"team":"billing"}}
|
|
8
|
+
{"id":"strands-decider-billing","model":"strands-decider-2b","state":"Help! My payouts have been failing for 3 days!","questions":{"team":{"type":"choice","instructions":"Which team should handle this?","criteria":{"billing":"payments and refunds","sales":"pricing","retail":"retail"}}},"expected":{"team":"billing"}}
|
|
@@ -47,6 +47,15 @@ Environment: Python 3.12.7, ONNX Runtime 1.23.2, tokenizers 0.22.1, numpy
|
|
|
47
47
|
Calibration smoke (`gliner2.5-multi`, 10 synthetic routing cases): accuracy
|
|
48
48
|
`0.60`, Brier `0.173`, ECE `0.247`.
|
|
49
49
|
|
|
50
|
+
2026-10-21 audit of the three added models (Python 3.13.2, ONNX Runtime
|
|
51
|
+
1.31.0, post-warmup, one smoke case):
|
|
52
|
+
|
|
53
|
+
| Model | Variant | p50 ms | Parity |
|
|
54
|
+
|---|---|---:|---:|
|
|
55
|
+
| `laya-multilingual` | fp16 | 37.4 | 1/1 |
|
|
56
|
+
| `open-jev-deberta-v3-large` | fp16 | 241.2 | 1/1 |
|
|
57
|
+
| `strands-decider-2b` | q4f16 | 719.3 | 1/1 |
|
|
58
|
+
|
|
50
59
|
Full evidence, per-case answers and environment metadata:
|
|
51
60
|
[`bench/results/2026-10-20-smoke.json`](https://github.com/gia-uh/decision-toolkit/blob/main/bench/results/2026-10-20-smoke.json)
|
|
52
61
|
and
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Catalog proposal: three ONNX decision models
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-10-21
|
|
4
|
+
**Status:** published in `0.3.0`
|
|
5
|
+
**Scope:** add Laya multilingual, Open-Jev DeBERTa v3 large and Strands Decider 2B
|
|
6
|
+
**Release:** <https://pypi.org/project/decision-toolkit/0.3.0/>
|
|
7
|
+
|
|
8
|
+
## Executive summary
|
|
9
|
+
|
|
10
|
+
Three public ONNX decision models meet the catalog gates for this iteration:
|
|
11
|
+
|
|
12
|
+
| Model | License | Adapter | Variants | Default |
|
|
13
|
+
|---|---|---|---|---:|
|
|
14
|
+
| Laya multilingual | Apache-2.0 | existing `laya` + fused branch | fp16, fp32 | fp16 |
|
|
15
|
+
| Open-Jev DeBERTa v3 large | Apache-2.0 | new `open-jev` | fp16, fp32, q4, q4f16 | fp16 |
|
|
16
|
+
| Strands Decider 2B | Apache-2.0 | new `strands-decider` | q4f16, q8 | q4f16 |
|
|
17
|
+
|
|
18
|
+
They have a real public ONNX export, complete external-data files, a pinned
|
|
19
|
+
revision and a known prompt contract. The local machine verified every file
|
|
20
|
+
hash and opened every ONNX session. No speculative or unavailable model was
|
|
21
|
+
added.
|
|
22
|
+
|
|
23
|
+
## Why these three
|
|
24
|
+
|
|
25
|
+
- **Laya multilingual** closes the multilingual gap in the existing Laya
|
|
26
|
+
family. The ONNX export is fused, but the prompt and calibrated temperatures
|
|
27
|
+
are the same as the split Laya contract. It needed one adapter branch, not a
|
|
28
|
+
new model family.
|
|
29
|
+
- **Open-Jev DeBERTa v3 large** is an independent, open reproduction of the
|
|
30
|
+
typed-decision shape. It has a complete fp16/fp32/q4/q4f16 family and a
|
|
31
|
+
documented span-pooling graph.
|
|
32
|
+
- **Strands Decider 2B** is the first larger decision model in the catalog. It
|
|
33
|
+
has a published reference fixture and a clear pointer-head graph. It is more
|
|
34
|
+
expensive on CPU, so it is marked as a quality/agentic option rather than a
|
|
35
|
+
replacement for the small models.
|
|
36
|
+
|
|
37
|
+
`gliner2.5-multi-decide` is **not** in this batch. Its ONNX export is real, but
|
|
38
|
+
the prompt uses `[L]` markers instead of the existing GLiNER2 `[C]` layout; it
|
|
39
|
+
needs a separate prompt adapter and its own parity run.
|
|
40
|
+
|
|
41
|
+
## Verification performed
|
|
42
|
+
|
|
43
|
+
- `dtk models verify --all --json`: **15/15 variants OK** (SHA256, files and
|
|
44
|
+
ONNX sessions).
|
|
45
|
+
- Real inference for every new variant, using `choice`, `noul` and `score`.
|
|
46
|
+
- Smoke parity suite: all added cases matched their expected labels.
|
|
47
|
+
- `dtk models variants` exposes all variants and install commands.
|
|
48
|
+
- Full test suite: **247 passed, 1 deselected**.
|
|
49
|
+
- Ruff and MkDocs `--strict`: clean.
|
|
50
|
+
- Python 3.12/3.13 CI matrix and wheel clean-install job: green.
|
|
51
|
+
|
|
52
|
+
### Measured CPU latency
|
|
53
|
+
|
|
54
|
+
Post-warmup p50, one simple choice question, audit machine (Python 3.13.2,
|
|
55
|
+
ONNX Runtime 1.31.0, CPU):
|
|
56
|
+
|
|
57
|
+
| Model | Variant | p50 |
|
|
58
|
+
|---|---|---:|
|
|
59
|
+
| Laya multilingual | fp16 | 37.4 ms |
|
|
60
|
+
| Laya multilingual | fp32 | 34.1 ms |
|
|
61
|
+
| Open-Jev DeBERTa v3 large | fp16 | 241.2 ms |
|
|
62
|
+
| Open-Jev DeBERTa v3 large | fp32 | 78.2 ms |
|
|
63
|
+
| Open-Jev DeBERTa v3 large | q4 | 56.0 ms |
|
|
64
|
+
| Open-Jev DeBERTa v3 large | q4f16 | 219.4 ms |
|
|
65
|
+
| Strands Decider 2B | q4f16 | 719.3 ms |
|
|
66
|
+
| Strands Decider 2B | q8 | 1467.2 ms |
|
|
67
|
+
|
|
68
|
+
The Open-Jev DeBERTa v3 large 4-bit paths are size/edge choices; they are not assumed to be
|
|
69
|
+
faster or more accurate. Strands is a 2B model and is intentionally slower
|
|
70
|
+
than the other catalog entries.
|
|
71
|
+
|
|
72
|
+
### Evidence / parity
|
|
73
|
+
|
|
74
|
+
- **Laya multilingual:** upstream conversion reports fp32 max |Δp| 1e-4 and
|
|
75
|
+
fp16 0.035 against PyTorch; local fp16/fp32 agree on the audit answers.
|
|
76
|
+
- **Open-Jev DeBERTa v3 large:** upstream reports 0.854 in-domain and 0.690 OOD accuracy, plus
|
|
77
|
+
0.022 in-domain ECE. Local fp16/fp32 agree on the published example; q4
|
|
78
|
+
variants are explicitly edge builds.
|
|
79
|
+
- **Strands Decider 2B:** reference fixture matches within 0.018 max
|
|
80
|
+
probability delta; q8 is closer to the reference on most fields.
|
|
81
|
+
|
|
82
|
+
These are upstream parity claims plus local runtime/answer checks, not an
|
|
83
|
+
independent reproduction of the full upstream training evaluation.
|
|
84
|
+
|
|
85
|
+
## Quantization policy
|
|
86
|
+
|
|
87
|
+
- Default variants are chosen for a balance of quality, size and CPU latency:
|
|
88
|
+
Laya fp16, Open-Jev DeBERTa v3 large fp16, Strands q4f16.
|
|
89
|
+
- `fp32` remains a quality variant where published.
|
|
90
|
+
- `q4`/`q4f16`/`q8` are exposed, but their thresholds must be validated on the
|
|
91
|
+
user's data; no silent fallback exists.
|
|
92
|
+
- `variant` remains a **decision-toolkit extension** in REST, not a TypeSafe or
|
|
93
|
+
OpenAI field.
|
|
94
|
+
|
|
95
|
+
## Risks and limitations
|
|
96
|
+
|
|
97
|
+
1. **Upstream evidence vs local evidence.** Full PyTorch parity was not
|
|
98
|
+
re-run for these three models; the catalog records upstream parity and local
|
|
99
|
+
runtime checks. A larger acceptance run is still desirable.
|
|
100
|
+
2. **Strands CPU cost.** q8 takes ~1.5 s per simple question; this is suitable
|
|
101
|
+
for local/agentic workflows, not high-throughput serving.
|
|
102
|
+
3. **Quantization drift.** Open-Jev DeBERTa v3 large q4 and Strands q4f16 can move near-ties;
|
|
103
|
+
the model cards call this out.
|
|
104
|
+
4. **Coverage.** Laya multilingual is weak on low-resource languages;
|
|
105
|
+
Open-Jev DeBERTa v3 large is English-only and weak on unseen score scales;
|
|
106
|
+
Strands is a 2B model with
|
|
107
|
+
its own upstream limitations.
|
|
108
|
+
5. **No image/box support.** The catalog remains text-only.
|
|
109
|
+
|
|
110
|
+
## Recommendation
|
|
111
|
+
|
|
112
|
+
Accept the three models as `m0` entries with the variants listed above. Keep
|
|
113
|
+
`gliner2.5-multi-decide` in the roadmap until its `[L]` adapter is implemented
|
|
114
|
+
and parity is measured. The next model batch should prioritize either that
|
|
115
|
+
adapter or a larger calibration/parity run for the new entries.
|
|
116
|
+
|
|
117
|
+
## Related documentation
|
|
118
|
+
|
|
119
|
+
- [Model cards](models/README.md)
|
|
120
|
+
- [Variants and quantization](VARIANTS.md)
|
|
121
|
+
- [Benchmarks](BENCH.md)
|
|
122
|
+
- [REST](REST.md)
|
|
@@ -147,6 +147,9 @@ are already downloaded.
|
|
|
147
147
|
| `laya` | `q8`* | int8 | 527.9 MB |
|
|
148
148
|
| `julia-1` | `fp32`* | fp32 | 618.2 MB |
|
|
149
149
|
| `opendecider-nano` | `q8f16`*, `fp16` | int8/fp16 / fp16 | 468.8 / 791.9 MB |
|
|
150
|
+
| `laya-multilingual` | `fp16`*, `fp32` | fp16 / fp32 | 681.8 / 1325.6 MB |
|
|
151
|
+
| `open-jev-deberta-v3-large` | `fp16`*, `fp32`, `q4`, `q4f16` | fp16 / fp32 / q4 / q4-fp16 | 883.5 / 1757.9 / 486.7 / 357.0 MB |
|
|
152
|
+
| `strands-decider-2b` | `q4f16`*, `q8` | q4-fp16 / int8 | 1113.6 / 1821.4 MB |
|
|
150
153
|
|
|
151
154
|
```bash
|
|
152
155
|
# inspect, including the exact download command for each variant
|
|
@@ -181,10 +184,12 @@ classification or serve command overrides it for that command. If `--variant`
|
|
|
181
184
|
is omitted, the catalog default is used unless `dtk models use` selected another
|
|
182
185
|
one.
|
|
183
186
|
|
|
184
|
-
`models list
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
187
|
+
`models list` text output has **one row per variant**, with `id`, `variant`,
|
|
188
|
+
`quant`, `role`, `size` and `cached`, followed by the exact download/select
|
|
189
|
+
commands. `--license` and `--adapter` add catalog columns; `--quant` is accepted
|
|
190
|
+
for compatibility because quantization is always shown. `--json` returns the
|
|
191
|
+
nested model tree: one object per model, each with its `variants` and
|
|
192
|
+
`cached_variants`.
|
|
188
193
|
|
|
189
194
|
See [Variants and quantization](VARIANTS.md) for the full table and cache
|
|
190
195
|
layout.
|
|
@@ -9,7 +9,8 @@ fixed TestPyPI verification for uv; `0.1.6` added complete variant visibility
|
|
|
9
9
|
and selection in the CLI and documentation; `0.1.7` aligned variant selection
|
|
10
10
|
across the library, CLI and REST API; `0.2.0` corrected the REST conformance
|
|
11
11
|
claims and wire shapes to the published TypeSafe and OpenAI schemas; `0.2.1`
|
|
12
|
-
changed the public documentation URLs to this repository's Pages site.
|
|
12
|
+
changed the public documentation URLs to this repository's Pages site; `0.3.0`
|
|
13
|
+
added the Laya multilingual, Open-Jev DeBERTa v3 large and Strands Decider ONNX models; `0.3.1` made the catalog list one row per variant with exact commands.
|
|
13
14
|
|
|
14
15
|
## Local build and verification
|
|
15
16
|
|
|
@@ -36,7 +37,7 @@ Clean install test (no `PYTHONPATH`):
|
|
|
36
37
|
```bash
|
|
37
38
|
uv venv --python 3.12 /tmp/dtk-wheel
|
|
38
39
|
uv pip install --python /tmp/dtk-wheel/bin/python \
|
|
39
|
-
dist/decision_toolkit-0.
|
|
40
|
+
dist/decision_toolkit-0.3.1-py3-none-any.whl
|
|
40
41
|
uv pip check --python /tmp/dtk-wheel/bin/python
|
|
41
42
|
/tmp/dtk-wheel/bin/dtk --version
|
|
42
43
|
/tmp/dtk-wheel/bin/dtk models list --json
|
|
@@ -47,7 +48,7 @@ With inference and server extras:
|
|
|
47
48
|
|
|
48
49
|
```bash
|
|
49
50
|
uv pip install --python /tmp/dtk-wheel/bin/python \
|
|
50
|
-
"dist/decision_toolkit-0.
|
|
51
|
+
"dist/decision_toolkit-0.3.1-py3-none-any.whl[onnx,server,tracing]"
|
|
51
52
|
/tmp/dtk-wheel/bin/dtk decide --model gliner2.5-decide ...
|
|
52
53
|
/tmp/dtk-wheel/bin/dtk serve --model gliner2.5-decide --warmup --port 8016
|
|
53
54
|
curl -s http://127.0.0.1:8016/health
|
|
@@ -81,8 +82,8 @@ No long-lived PyPI token is needed; the workflow uses GitHub OIDC
|
|
|
81
82
|
4. Create and push an annotated tag:
|
|
82
83
|
|
|
83
84
|
```bash
|
|
84
|
-
git tag -a v0.
|
|
85
|
-
git push origin v0.
|
|
85
|
+
git tag -a v0.3.1 -m "decision-toolkit 0.3.1"
|
|
86
|
+
git push origin v0.3.1
|
|
86
87
|
```
|
|
87
88
|
|
|
88
89
|
5. `.github/workflows/release.yml` builds once, publishes to **TestPyPI**, then
|
|
@@ -131,9 +132,9 @@ to TestPyPI without publishing to PyPI or creating a GitHub release.
|
|
|
131
132
|
|
|
132
133
|
## Published release
|
|
133
134
|
|
|
134
|
-
`0.
|
|
135
|
+
`0.3.1` is published through Trusted Publishing on 2026-10-21:
|
|
135
136
|
|
|
136
|
-
<https://pypi.org/project/decision-toolkit/0.
|
|
137
|
+
<https://pypi.org/project/decision-toolkit/0.3.1/>
|
|
137
138
|
|
|
138
139
|
`0.1.0` was the first release; `0.1.1` refreshed the PyPI description; `0.1.2`
|
|
139
140
|
validated the OIDC TestPyPI → PyPI flow; `0.1.3` added post-publish install
|
|
@@ -142,7 +143,8 @@ development, build, CI, release and documentation environments to uv but was
|
|
|
142
143
|
published to TestPyPI only; `0.1.5` fixed TestPyPI resolution; `0.1.6` added
|
|
143
144
|
complete variant/quantization visibility and CLI selection; `0.1.7` aligned
|
|
144
145
|
selection across library, CLI and REST; `0.2.0` corrected the REST conformance
|
|
145
|
-
claims and wire shapes; `0.2.1` changed the public documentation URLs.
|
|
146
|
+
claims and wire shapes; `0.2.1` changed the public documentation URLs; `0.3.0`
|
|
147
|
+
added the three new ONNX decision models; `0.3.1` made the catalog list one row per variant.
|
|
146
148
|
|
|
147
149
|
The tag-triggered workflow remains the preferred path for future releases once
|
|
148
150
|
the TestPyPI/PyPI trusted publishers and protected environments are configured.
|
|
@@ -7,19 +7,17 @@ They are deliberately absent from `CATALOG`, `dtk models list` and `/v1/models`.
|
|
|
7
7
|
|
|
8
8
|
| id | status | reason |
|
|
9
9
|
|---|---|---|
|
|
10
|
-
| `gliner2.5-multi-decide` | planned |
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
| `kev-0.8b` | phase2 | No ONNX published; conversion planned |
|
|
10
|
+
| `gliner2.5-multi-decide` | planned | ONNX split export exists (`DanKau/gliner2.5-multi-decide-onnx`), but the `[L]` prompt layout needs an adapter |
|
|
11
|
+
| `intern-decision-0.8b` | planned | ONNX exists (`Wortou/Intern-Decision-0.8B-ONNX-FP16`), but it is split and needs the upstream prompt compiler; `parityVerified: false` |
|
|
12
|
+
| `d3-lite` | phase2 | Web ONNX torso/readout files exist, but the repo declares no license/README; not eligible |
|
|
13
|
+
| `kev-0.8b` | phase2 | ONNX exists (`midudev/kev-0.8b-ONNX`) but external data is missing and it uses custom ops |
|
|
15
14
|
| `sieve-0.8b` | phase2 | No ONNX published; conversion planned |
|
|
16
|
-
| `strands-decider-2b` | phase2 | No ONNX published; conversion planned |
|
|
17
15
|
| `thx-01` | phase2 | No ONNX published; conversion planned |
|
|
18
16
|
| `jevk5-lite` | waitlist | Export references external `.onnx.data` files that are not published |
|
|
19
17
|
| `bosun-0.6b` | waitlist | No ONNX yet |
|
|
20
|
-
| `d3-edge` | waitlist |
|
|
21
|
-
| `tev1-0.8b` | waitlist |
|
|
22
|
-
| `d1-omni-600m` | waitlist | LFM Open License
|
|
18
|
+
| `d3-edge` | waitlist | Web ONNX files exist, but no license/README; not eligible |
|
|
19
|
+
| `tev1-0.8b` | waitlist | ONNX exists, but the upstream licence is `other` and needs review |
|
|
20
|
+
| `d1-omni-600m` | waitlist | ONNX exists, but the LFM Open License needs review and it is multimodal |
|
|
23
21
|
| `bekko-400m` | waitlist | License pending |
|
|
24
22
|
|
|
25
23
|
## How a model moves into the catalog
|
|
@@ -18,15 +18,23 @@ have not passed the catalog gates are not exposed as variants.
|
|
|
18
18
|
A `*` marks the default variant. It is used when `--variant` is omitted and no
|
|
19
19
|
other variant was selected with `dtk models use`.
|
|
20
20
|
|
|
21
|
-
| Model | Variant | Quantization | Size | Role |
|
|
22
|
-
| --- | --- | --- | ---: | --- |
|
|
23
|
-
| `gliner2.5-multi` | `fp16` * | fp16 encoder + fp32 classifier | 577.1 MB | default |
|
|
24
|
-
| `gliner2.5-multi` | `fp32` | fp32 encoder + fp32 classifier | 1131.9 MB | quality |
|
|
25
|
-
| `gliner2.5-decide` | `q4f16` * | q4/fp16 | 523.5 MB | default |
|
|
26
|
-
| `laya` | `q8` * | int8 | 527.9 MB | default |
|
|
27
|
-
| `julia-1` | `fp32` * | fp32 | 618.2 MB | default |
|
|
28
|
-
| `opendecider-nano` | `q8f16` * | int8/fp16 | 468.8 MB | default |
|
|
29
|
-
| `opendecider-nano` | `fp16` | fp16 | 791.9 MB | quality |
|
|
21
|
+
| Model | Variant | Quantization | Size | Role | Download |
|
|
22
|
+
| --- | --- | --- | ---: | --- | --- |
|
|
23
|
+
| `gliner2.5-multi` | `fp16` * | fp16 encoder + fp32 classifier | 577.1 MB | default | `dtk models download gliner2.5-multi --variant fp16` |
|
|
24
|
+
| `gliner2.5-multi` | `fp32` | fp32 encoder + fp32 classifier | 1131.9 MB | quality | `dtk models download gliner2.5-multi --variant fp32` |
|
|
25
|
+
| `gliner2.5-decide` | `q4f16` * | q4/fp16 | 523.5 MB | default | `dtk models download gliner2.5-decide --variant q4f16` |
|
|
26
|
+
| `laya` | `q8` * | int8 | 527.9 MB | default | `dtk models download laya --variant q8` |
|
|
27
|
+
| `julia-1` | `fp32` * | fp32 | 618.2 MB | default | `dtk models download julia-1 --variant fp32` |
|
|
28
|
+
| `opendecider-nano` | `q8f16` * | int8/fp16 | 468.8 MB | default | `dtk models download opendecider-nano --variant q8f16` |
|
|
29
|
+
| `opendecider-nano` | `fp16` | fp16 | 791.9 MB | quality | `dtk models download opendecider-nano --variant fp16` |
|
|
30
|
+
| `laya-multilingual` | `fp16` * | fp16 | 681.8 MB | default | `dtk models download laya-multilingual --variant fp16` |
|
|
31
|
+
| `laya-multilingual` | `fp32` | fp32 | 1325.6 MB | quality | `dtk models download laya-multilingual --variant fp32` |
|
|
32
|
+
| `open-jev-deberta-v3-large` | `fp16` * | fp16 | 883.5 MB | default | `dtk models download open-jev-deberta-v3-large --variant fp16` |
|
|
33
|
+
| `open-jev-deberta-v3-large` | `fp32` | fp32 | 1757.9 MB | quality | `dtk models download open-jev-deberta-v3-large --variant fp32` |
|
|
34
|
+
| `open-jev-deberta-v3-large` | `q4` | q4 | 486.7 MB | edge | `dtk models download open-jev-deberta-v3-large --variant q4` |
|
|
35
|
+
| `open-jev-deberta-v3-large` | `q4f16` | q4/fp16 | 357.0 MB | edge | `dtk models download open-jev-deberta-v3-large --variant q4f16` |
|
|
36
|
+
| `strands-decider-2b` | `q4f16` * | q4/fp16 | 1113.6 MB | default | `dtk models download strands-decider-2b --variant q4f16` |
|
|
37
|
+
| `strands-decider-2b` | `q8` | int8 | 1821.4 MB | quality | `dtk models download strands-decider-2b --variant q8` |
|
|
30
38
|
|
|
31
39
|
Models with a single row have only one catalogued, verified build. That does
|
|
32
40
|
not mean other conversions do not exist upstream; it means they have not passed
|
|
@@ -79,12 +87,15 @@ dtk models variants opendecider-nano --json
|
|
|
79
87
|
Example:
|
|
80
88
|
|
|
81
89
|
```text
|
|
82
|
-
id
|
|
83
|
-
gliner2.5-multi fp16
|
|
84
|
-
gliner2.5-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
90
|
+
id variant quant role size cached
|
|
91
|
+
gliner2.5-multi fp16* fp16 default 577.1 MB ✓
|
|
92
|
+
gliner2.5-multi fp32 fp32 quality 1131.9 MB ✓
|
|
93
|
+
gliner2.5-decide q4f16* q4/fp16 default 523.5 MB ✓
|
|
94
|
+
laya q8* int8 default 527.9 MB ✓
|
|
95
|
+
|
|
96
|
+
* default variant.
|
|
97
|
+
download: dtk models download <id> --variant <name>
|
|
98
|
+
select: dtk models use <id> --variant <name>
|
|
88
99
|
```
|
|
89
100
|
|
|
90
101
|
## Download a different quantization
|
|
@@ -24,6 +24,7 @@ PyPI: <https://pypi.org/project/decision-toolkit/>
|
|
|
24
24
|
- [Operations](OPERATIONS.md) — rate limits, metrics, tracing and runbook.
|
|
25
25
|
- [Benchmarks](BENCH.md) — reproducible latency/parity/calibration.
|
|
26
26
|
- [Models](models/README.md) — the curated catalog.
|
|
27
|
+
- [Catalog proposal](CATALOG_PROPOSAL.md) — analysis and evidence for the latest model additions.
|
|
27
28
|
- [Release](RELEASE.md) — build, TestPyPI/PyPI and Trusted Publishing.
|
|
28
29
|
|
|
29
30
|
## One example
|
|
@@ -11,6 +11,9 @@ card on purpose: they are not part of the curated library yet.
|
|
|
11
11
|
| [Laya (English)](laya.md) | `laya` | q8* · 528 MB | `cccc9a01` | 514 ms | torch parity: Δp ≤ 0.005 |
|
|
12
12
|
| [Julia 1](julia-1.md) | `julia` | fp32* · 618 MB | `82a2fadf` | 329 ms | 100/100 argmax; 8.5e-05 max logit error |
|
|
13
13
|
| [OpenDecider nano](opendecider-nano.md) | `opendecider` | q8f16* · 469 MB; fp16 · 792 MB | `5137ae7b` | 530 ms | official build; prompt ported from pinned code |
|
|
14
|
+
| [Laya multilingual](laya-multilingual.md) | `laya` | fp16* · 682 MB; fp32 · 1326 MB | `46b77bbf` | 37 ms | fused ONNX; upstream Δp ≤ 0.035 |
|
|
15
|
+
| [Open-Jev DeBERTa v3 large](open-jev-deberta-v3-large.md) | `open-jev` | fp16* · 884 MB; fp32 · 1758 MB; q4 · 487 MB; q4f16 · 357 MB | `7c79f25b` | 241 ms | 0.854 in-domain; 0.690 OOD (upstream) |
|
|
16
|
+
| [Strands Decider 2B](strands-decider-2b.md) | `strands-decider` | q4f16* · 1114 MB; q8 · 1821 MB | `31a83e02` | 719 ms | reference fixture max Δp 0.018 |
|
|
14
17
|
|
|
15
18
|
A `*` marks the default. To inspect sizes, hashes and exact commands, run
|
|
16
19
|
`dtk models variants <id>` or read [Variants and quantization](../VARIANTS.md).
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Laya multilingual
|
|
2
|
+
|
|
3
|
+
- **Status:** `m0` (fused ONNX export verified end-to-end)
|
|
4
|
+
- **Adapter:** `laya` — fused encoder + decision head, `marker_pos` / `qtype`, calibrated temperatures
|
|
5
|
+
- **License:** Apache-2.0
|
|
6
|
+
- **Parameters:** 322M · **Architecture:** mmBERT-base · **Languages:** 100+ languages
|
|
7
|
+
- **Context:** 1,024 tokens in this export (the upstream checkpoint supports up to 8,192)
|
|
8
|
+
|
|
9
|
+
## Default variant
|
|
10
|
+
|
|
11
|
+
| | |
|
|
12
|
+
|---|---|
|
|
13
|
+
| Repo | `onnx-community/laya-multilingual-ONNX` |
|
|
14
|
+
| Files | `onnx/model_fp16.onnx` + `.onnx_data`, `tokenizer.json`, `config.json` |
|
|
15
|
+
| Quantization | fp16 weights and activations, fp32 inputs/outputs |
|
|
16
|
+
| Download | 682 MB |
|
|
17
|
+
| Role | default |
|
|
18
|
+
|
|
19
|
+
## Variants
|
|
20
|
+
|
|
21
|
+
| Variant | Quantization | Size | Role | Install |
|
|
22
|
+
| --- | --- | ---: | --- | --- |
|
|
23
|
+
| `fp16` * | fp16 | 681.8 MB | default | `dtk models download laya-multilingual --variant fp16` |
|
|
24
|
+
| `fp32` | fp32 | 1.33 GB | quality | `dtk models download laya-multilingual --variant fp32` |
|
|
25
|
+
|
|
26
|
+
`dtk models download laya-multilingual` gets `fp16`; `--variant fp32` downloads
|
|
27
|
+
the full-precision build. Select one with
|
|
28
|
+
`dtk models use laya-multilingual --variant <name>`. See
|
|
29
|
+
[Variants and quantization](../VARIANTS.md).
|
|
30
|
+
|
|
31
|
+
## Reproducibility
|
|
32
|
+
|
|
33
|
+
- **Revision:** `46b77bbf5642fec5f14e540570228a8cbe8ab81f`
|
|
34
|
+
- **Default file hashes (SHA256):**
|
|
35
|
+
- `onnx/model_fp16.onnx` — `81f641e21289ddb2cd8ac774c1cddebfdb0fa7e4b183e49ad476d2faee46d98a`
|
|
36
|
+
- `onnx/model_fp16.onnx_data` — `3c9eb52f5f795f76d7a681197228131fac7e92c3e5a4c90b68ec4065699ee4cf`
|
|
37
|
+
- `tokenizer.json` — `609d8f4c067cd3950f88594c5a802616cea245823836ef5848ee4fc40aab5b6f`
|
|
38
|
+
- `config.json` — `cc32109b1fded91ec6734127ffb1827f80cdcf8ffdd4eeda75a1b0f4d3687dcc`
|
|
39
|
+
- **Verify:** `dtk models verify laya-multilingual --variant fp16`
|
|
40
|
+
- **Bench:** `uv run python bench/run.py --suite bench/suites/smoke.jsonl --models laya-multilingual`
|
|
41
|
+
- The `fp32` variant hashes live in `catalog.py`.
|
|
42
|
+
|
|
43
|
+
## Evidence (2026-10-21)
|
|
44
|
+
|
|
45
|
+
- CPU p50: **37.4 ms** fp16, **34.1 ms** fp32 on the audit machine after warmup.
|
|
46
|
+
- Local example (`Help! My payouts have been failing for 3 days!`):
|
|
47
|
+
team **billing 1.00**, urgency 0.756, frustration 1.26.
|
|
48
|
+
- The upstream conversion reports max |Δp| **1e-4** fp32 and **0.035** fp16
|
|
49
|
+
against the PyTorch checkpoint on typed-decision sequences.
|
|
50
|
+
- fp16 and fp32 agree on the answers in the local smoke/audit cases.
|
|
51
|
+
|
|
52
|
+
## Contract notes
|
|
53
|
+
|
|
54
|
+
- Sequence: `[CLS] <type> question: <instructions> [SEP] ([MASK] option) … [SEP] state [SEP]`.
|
|
55
|
+
- One fused graph: `input_ids`, `attention_mask`, `marker_pos`, `marker_mask`, `qtype`
|
|
56
|
+
→ `logits` per option + `act_logits`.
|
|
57
|
+
- Temperatures come from the `laya` section of `config.json` and are clamped to
|
|
58
|
+
`[0.5, 5]`, matching the reference runtime.
|
|
59
|
+
- The adapter also supports the split `encoder` + `head` Laya layout; the
|
|
60
|
+
multilingual export is the fused layout.
|
|
61
|
+
|
|
62
|
+
## Known limitations
|
|
63
|
+
|
|
64
|
+
- Low-resource languages remain weak in the upstream checkpoint; validate
|
|
65
|
+
your language and label set before relying on calibrated confidence.
|
|
66
|
+
- This export's `max_len` is 1,024; the upstream checkpoint supports 8,192 with
|
|
67
|
+
a larger setting, but the pinned export config uses 1,024.
|
|
68
|
+
- The adapter uses the fused graph path; the English split checkpoint remains a
|
|
69
|
+
separate catalog entry (`laya`).
|
|
70
|
+
|
|
71
|
+
## Usage
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
dtk models download laya-multilingual
|
|
75
|
+
dtk decide --model laya-multilingual --state "Help! My payouts have been failing for 3 days!" \
|
|
76
|
+
--q team='choice:billing=refunds|technical=bugs|sales=pricing' \
|
|
77
|
+
--q urgent='noul:Does this convey urgency?'
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Provenance
|
|
81
|
+
|
|
82
|
+
Converted by `onnx-community` from `convaiinnovations/laya-multilingual`;
|
|
83
|
+
the upstream model is the multilingual Laya checkpoint. Apache-2.0.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Open-Jev DeBERTa v3 large
|
|
2
|
+
|
|
3
|
+
- **Status:** `m0` (ONNX export verified end-to-end)
|
|
4
|
+
- **Adapter:** `open-jev` — one sequence, span-pooled option scoring
|
|
5
|
+
- **License:** Apache-2.0
|
|
6
|
+
- **Parameters:** ~435M · **Architecture:** DeBERTa-v3-large + span head
|
|
7
|
+
- **Language:** English · **Context:** 512 tokens
|
|
8
|
+
|
|
9
|
+
## Default variant
|
|
10
|
+
|
|
11
|
+
| | |
|
|
12
|
+
|---|---|
|
|
13
|
+
| Repo | `onnx-community/open-jev-deberta-v3-large-ONNX` |
|
|
14
|
+
| Files | `onnx/model_fp16.onnx` + `.onnx_data`, `tokenizer.json`, `config.json` |
|
|
15
|
+
| Quantization | fp16 |
|
|
16
|
+
| Download | 884 MB |
|
|
17
|
+
| Role | default |
|
|
18
|
+
|
|
19
|
+
## Variants
|
|
20
|
+
|
|
21
|
+
| Variant | Quantization | Size | Role | Install |
|
|
22
|
+
| --- | --- | ---: | --- | --- |
|
|
23
|
+
| `fp16` * | fp16 | 883.5 MB | default | `dtk models download open-jev-deberta-v3-large --variant fp16` |
|
|
24
|
+
| `fp32` | fp32 | 1.76 GB | quality | `dtk models download open-jev-deberta-v3-large --variant fp32` |
|
|
25
|
+
| `q4` | 4-bit | 486.7 MB | edge | `dtk models download open-jev-deberta-v3-large --variant q4` |
|
|
26
|
+
| `q4f16` | 4-bit + fp16 | 357.0 MB | edge | `dtk models download open-jev-deberta-v3-large --variant q4f16` |
|
|
27
|
+
|
|
28
|
+
Start with `fp16`; use `q4`/`q4f16` when download size or CPU work matters,
|
|
29
|
+
and re-check thresholds. See [Variants and quantization](../VARIANTS.md).
|
|
30
|
+
|
|
31
|
+
## Reproducibility
|
|
32
|
+
|
|
33
|
+
- **Revision:** `7c79f25b5ac496089f448a969c801872ad59d31c`
|
|
34
|
+
- **Default file hashes (SHA256):**
|
|
35
|
+
- `onnx/model_fp16.onnx` — `2fd22c68fef1c74ac8d4541ea4cbcfbd38553c15552a7bd0a09280c196662e9b`
|
|
36
|
+
- `onnx/model_fp16.onnx_data` — `f5cc34a4e6cc82483fbaa8bac85f38b008758b13c4dfbb2ac1b637a92da3fd14`
|
|
37
|
+
- `tokenizer.json` — `cd119378b0160677b7a1e561ba29ada83918c1d420b326516a585382e83d9d39`
|
|
38
|
+
- `config.json` — `2ec35432332ee6b5880509eefe44e6279fd9d3543f6ba96098119ffe0b0c2d5e`
|
|
39
|
+
- **Verify:** `dtk models verify open-jev-deberta-v3-large --variant fp16`
|
|
40
|
+
- **Bench:** `uv run python bench/run.py --suite bench/suites/smoke.jsonl --models open-jev-deberta-v3-large`
|
|
41
|
+
- Hashes for the other variants live in `catalog.py`.
|
|
42
|
+
|
|
43
|
+
## Evidence (2026-10-21)
|
|
44
|
+
|
|
45
|
+
- CPU p50 after warmup: **241.2 ms** fp16, **78.2 ms** fp32, **56.0 ms** q4,
|
|
46
|
+
**219.4 ms** q4f16. The 4-bit paths are size/edge choices, not automatic wins.
|
|
47
|
+
- Published example (`I was charged twice…`): product area **fees & charges**
|
|
48
|
+
(0.70), sentiment **0.819**, refund **0.941** with fp16/fp32.
|
|
49
|
+
- The upstream model card reports **0.854** in-domain accuracy, **0.690** on its
|
|
50
|
+
OOD question/option set, and ECE **0.022** in-domain.
|
|
51
|
+
- Local fp16 and fp32 agree on the published example; q4 variants are lossy and
|
|
52
|
+
should be validated against your thresholds.
|
|
53
|
+
|
|
54
|
+
## Contract notes
|
|
55
|
+
|
|
56
|
+
- Sequence: `[CLS] [STATE] state [Q] instructions [OPT] option … [SEP]`.
|
|
57
|
+
- Graph inputs: `input_ids`, `attention_mask`, `seg`, `pair_q`, `pair_opt`.
|
|
58
|
+
- One forward pass scores every option; softmax is per question group with the
|
|
59
|
+
checkpoint temperature (`1.05`).
|
|
60
|
+
- The state is capped to 256 tokens and the full sequence to 512.
|
|
61
|
+
|
|
62
|
+
## Known limitations
|
|
63
|
+
|
|
64
|
+
- English only; 512-token context; it reads the question only partially
|
|
65
|
+
(upstream in-domain 0.85 vs OOD 0.69).
|
|
66
|
+
- Score on unseen level sets is weak in the upstream evaluation.
|
|
67
|
+
- It chooses among supplied options; it cannot generate explanations.
|
|
68
|
+
- This is an independent Open-Jev DeBERTa v3 large reproduction, not an official TypeSafe model.
|
|
69
|
+
|
|
70
|
+
## Usage
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
dtk models download open-jev-deberta-v3-large
|
|
74
|
+
dtk decide --model open-jev-deberta-v3-large \
|
|
75
|
+
--state "I was charged twice and want a refund." \
|
|
76
|
+
--q team='choice:billing=payments|technical=bugs|other=anything else' \
|
|
77
|
+
--q refund='noul:Is the customer asking for a refund?'
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Provenance
|
|
81
|
+
|
|
82
|
+
ONNX conversion by `onnx-community` of
|
|
83
|
+
`com-kotobalabs/open-jev-deberta-v3-large`, an independent open reproduction of
|
|
84
|
+
the Jev-shaped typed-decision contract. Apache-2.0.
|