decision-toolkit 0.4.0__tar.gz → 0.4.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.
Files changed (98) hide show
  1. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/CHANGELOG.md +9 -1
  2. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/PKG-INFO +6 -3
  3. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/README.md +5 -2
  4. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/CLI.md +3 -0
  5. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/RELEASE.md +8 -7
  6. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/VARIANTS.md +17 -17
  7. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/models/gliner2.5-decide.md +34 -0
  8. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/models/gliner2.5-multi.md +63 -0
  9. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/models/julia-1.md +34 -0
  10. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/models/laya-multilingual.md +63 -0
  11. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/models/laya.md +34 -0
  12. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/models/open-jev-deberta-v3-large.md +121 -0
  13. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/models/opendecider-nano.md +63 -0
  14. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/models/strands-decider-2b.md +63 -0
  15. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/pyproject.toml +1 -1
  16. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/__init__.py +1 -1
  17. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/catalog.py +1 -0
  18. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/cli.py +4 -1
  19. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_cli.py +3 -0
  20. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/uv.lock +1 -1
  21. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/.github/workflows/ci.yml +0 -0
  22. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/.github/workflows/docs.yml +0 -0
  23. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/.github/workflows/release.yml +0 -0
  24. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/.gitignore +0 -0
  25. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/CONTRIBUTING.md +0 -0
  26. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/LICENSE +0 -0
  27. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/SECURITY.md +0 -0
  28. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/THIRD_PARTY_NOTICES.md +0 -0
  29. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/bench/README.md +0 -0
  30. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/bench/__init__.py +0 -0
  31. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/bench/load.py +0 -0
  32. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/bench/results/2026-10-20-calibration.json +0 -0
  33. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/bench/results/2026-10-20-load.json +0 -0
  34. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/bench/results/2026-10-20-smoke.json +0 -0
  35. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/bench/run.py +0 -0
  36. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/bench/suites/calibration.jsonl +0 -0
  37. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/bench/suites/smoke.jsonl +0 -0
  38. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/BENCH.md +0 -0
  39. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/CATALOG_PROPOSAL.md +0 -0
  40. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/CORE.md +0 -0
  41. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/EXAMPLES.md +0 -0
  42. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/OPERATIONS.md +0 -0
  43. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/REST.md +0 -0
  44. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/ROADMAP.md +0 -0
  45. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/index.md +0 -0
  46. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/docs/models/README.md +0 -0
  47. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/__main__.py +0 -0
  48. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/adapters/__init__.py +0 -0
  49. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/adapters/base.py +0 -0
  50. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/adapters/gliner2.py +0 -0
  51. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/adapters/gliner2_decide.py +0 -0
  52. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/adapters/julia.py +0 -0
  53. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/adapters/laya.py +0 -0
  54. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/adapters/opendecider.py +0 -0
  55. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/adapters/openjev.py +0 -0
  56. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/adapters/strands_decider.py +0 -0
  57. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/calibration.py +0 -0
  58. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/config.py +0 -0
  59. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/contracts/__init__.py +0 -0
  60. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/contracts/common.py +0 -0
  61. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/contracts/mapping.py +0 -0
  62. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/contracts/openai_decisions_beta.py +0 -0
  63. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/contracts/systemone_v1.py +0 -0
  64. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/decision_model.py +0 -0
  65. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/engine/__init__.py +0 -0
  66. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/errors.py +0 -0
  67. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/limits.py +0 -0
  68. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/metrics.py +0 -0
  69. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/models.py +0 -0
  70. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/observability.py +0 -0
  71. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/py.typed +0 -0
  72. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/registry.py +0 -0
  73. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/results.py +0 -0
  74. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/schema.py +0 -0
  75. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/server.py +0 -0
  76. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/src/decision_toolkit/tracing.py +0 -0
  77. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/__init__.py +0 -0
  78. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/conftest.py +0 -0
  79. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_adapters_gliner2.py +0 -0
  80. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_adapters_gliner2_decide.py +0 -0
  81. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_adapters_julia.py +0 -0
  82. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_adapters_laya.py +0 -0
  83. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_adapters_opendecider.py +0 -0
  84. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_adapters_openjev.py +0 -0
  85. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_adapters_strands.py +0 -0
  86. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_bench.py +0 -0
  87. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_catalog.py +0 -0
  88. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_config.py +0 -0
  89. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_contracts_conformance.py +0 -0
  90. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_core_phase1.py +0 -0
  91. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_decision_model.py +0 -0
  92. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_fuzz_rest.py +0 -0
  93. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_integration_gliner2.py +0 -0
  94. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_models.py +0 -0
  95. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_operations.py +0 -0
  96. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_results.py +0 -0
  97. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_schema.py +0 -0
  98. {decision_toolkit-0.4.0 → decision_toolkit-0.4.1}/tests/test_server.py +0 -0
@@ -1,8 +1,15 @@
1
1
  # Changelog
2
2
 
3
- All notable changes to this project are documented here. Version `0.4.0` is
3
+ All notable changes to this project are documented here. Version `0.4.1` is
4
4
  published on PyPI.
5
5
 
6
+ ## [0.4.1] — 2026-10-21
7
+
8
+ Catalog presentation patch: every variant now carries its REST alias
9
+ (`id@variant`) in `dtk models list`, `--json` and `dtk models variants`. Model
10
+ cards include copy-paste loading examples for library, CLI and REST for every
11
+ variant. No model or runtime changes.
12
+
6
13
  ## [0.4.0] — 2026-10-21
7
14
 
8
15
  REST variant-selection correction. Quantizations are selected through standard
@@ -209,6 +216,7 @@ README correction. No code or model behavior changed.
209
216
  - Typed `DecisionModel` API with lifecycle, batching, async, usage, warnings,
210
217
  normalized confidence, capabilities, structured events and atomic model store.
211
218
 
219
+ [0.4.1]: https://pypi.org/project/decision-toolkit/0.4.1/
212
220
  [0.4.0]: https://pypi.org/project/decision-toolkit/0.4.0/
213
221
  [0.3.1]: https://pypi.org/project/decision-toolkit/0.3.1/
214
222
  [0.3.0]: https://pypi.org/project/decision-toolkit/0.3.0/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: decision-toolkit
3
- Version: 0.4.0
3
+ Version: 0.4.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.4.0 on PyPI)
62
+ uv pip install decision-toolkit # library + CLI (0.4.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.4.0/>. See
70
+ PyPI: <https://pypi.org/project/decision-toolkit/0.4.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
 
@@ -211,6 +211,9 @@ adapters (there is no generic "any ONNX" adapter).
211
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
212
  | `strands-decider-2b` | `strands-decider` | **m0** — reference fixture match (719 ms) | `q4f16`* (1114 MB); `q8` (1821 MB) |
213
213
 
214
+ Each variant has a REST alias in the form `id@variant`; `dtk models list` prints
215
+ the alias next to every variant.
216
+
214
217
  **Only `m0` models are in the catalog.** Researched-but-unavailable models
215
218
  (planned, conversion pending, broken exports) are listed in
216
219
  [docs/ROADMAP.md](https://github.com/gia-uh/decision-toolkit/blob/main/docs/ROADMAP.md) and are not downloadable through the toolkit.
@@ -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.4.0 on PyPI)
24
+ uv pip install decision-toolkit # library + CLI (0.4.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.4.0/>. See
32
+ PyPI: <https://pypi.org/project/decision-toolkit/0.4.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
 
@@ -173,6 +173,9 @@ adapters (there is no generic "any ONNX" adapter).
173
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
174
  | `strands-decider-2b` | `strands-decider` | **m0** — reference fixture match (719 ms) | `q4f16`* (1114 MB); `q8` (1821 MB) |
175
175
 
176
+ Each variant has a REST alias in the form `id@variant`; `dtk models list` prints
177
+ the alias next to every variant.
178
+
176
179
  **Only `m0` models are in the catalog.** Researched-but-unavailable models
177
180
  (planned, conversion pending, broken exports) are listed in
178
181
  [docs/ROADMAP.md](https://github.com/gia-uh/decision-toolkit/blob/main/docs/ROADMAP.md) and are not downloadable through the toolkit.
@@ -151,6 +151,9 @@ are already downloaded.
151
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
152
  | `strands-decider-2b` | `q4f16`*, `q8` | q4-fp16 / int8 | 1113.6 / 1821.4 MB |
153
153
 
154
+ Each row is also addressable over REST as `model = "<id>@<variant>"`; the alias
155
+ is printed by `dtk models list` and by `dtk models variants <id>`.
156
+
154
157
  ```bash
155
158
  # inspect, including the exact download command for each variant
156
159
  dtk models list --quant
@@ -39,7 +39,7 @@ Clean install test (no `PYTHONPATH`):
39
39
  ```bash
40
40
  uv venv --python 3.12 /tmp/dtk-wheel
41
41
  uv pip install --python /tmp/dtk-wheel/bin/python \
42
- dist/decision_toolkit-0.4.0-py3-none-any.whl
42
+ dist/decision_toolkit-0.4.1-py3-none-any.whl
43
43
  uv pip check --python /tmp/dtk-wheel/bin/python
44
44
  /tmp/dtk-wheel/bin/dtk --version
45
45
  /tmp/dtk-wheel/bin/dtk models list --json
@@ -50,7 +50,7 @@ With inference and server extras:
50
50
 
51
51
  ```bash
52
52
  uv pip install --python /tmp/dtk-wheel/bin/python \
53
- "dist/decision_toolkit-0.4.0-py3-none-any.whl[onnx,server,tracing]"
53
+ "dist/decision_toolkit-0.4.1-py3-none-any.whl[onnx,server,tracing]"
54
54
  /tmp/dtk-wheel/bin/dtk decide --model gliner2.5-decide ...
55
55
  /tmp/dtk-wheel/bin/dtk serve --model gliner2.5-decide --warmup --port 8016
56
56
  curl -s http://127.0.0.1:8016/health
@@ -84,8 +84,8 @@ No long-lived PyPI token is needed; the workflow uses GitHub OIDC
84
84
  4. Create and push an annotated tag:
85
85
 
86
86
  ```bash
87
- git tag -a v0.4.0 -m "decision-toolkit 0.4.0"
88
- git push origin v0.4.0
87
+ git tag -a v0.4.1 -m "decision-toolkit 0.4.1"
88
+ git push origin v0.4.1
89
89
  ```
90
90
 
91
91
  5. `.github/workflows/release.yml` builds once, publishes to **TestPyPI**, then
@@ -134,9 +134,9 @@ to TestPyPI without publishing to PyPI or creating a GitHub release.
134
134
 
135
135
  ## Published release
136
136
 
137
- `0.4.0` is published through Trusted Publishing on 2026-10-21:
137
+ `0.4.1` is published through Trusted Publishing on 2026-10-21:
138
138
 
139
- <https://pypi.org/project/decision-toolkit/0.4.0/>
139
+ <https://pypi.org/project/decision-toolkit/0.4.1/>
140
140
 
141
141
  `0.1.0` was the first release; `0.1.1` refreshed the PyPI description; `0.1.2`
142
142
  validated the OIDC TestPyPI → PyPI flow; `0.1.3` added post-publish install
@@ -147,7 +147,8 @@ complete variant/quantization visibility and CLI selection; `0.1.7` aligned
147
147
  selection across library, CLI and REST; `0.2.0` corrected the REST conformance
148
148
  claims and wire shapes; `0.2.1` changed the public documentation URLs; `0.3.0`
149
149
  added the three new ONNX decision models; `0.3.1` made the catalog list one row per variant; `0.4.0` moved REST variant
150
- selection to standard model aliases.
150
+ selection to standard model aliases; `0.4.1` exposed aliases in the catalog and
151
+ per-variant loading examples in every model card.
151
152
 
152
153
  The tag-triggered workflow remains the preferred path for future releases once
153
154
  the TestPyPI/PyPI trusted publishers and protected environments are configured.
@@ -18,23 +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 | 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` |
21
+ | Model | Variant | REST alias | Quantization | Size | Role | Download |
22
+ | --- | --- | --- | --- | ---: | --- | --- |
23
+ | `gliner2.5-multi` | `fp16` * | `gliner2.5-multi@fp16` | fp16 | 577.1 MB | default | `dtk models download gliner2.5-multi --variant fp16` |
24
+ | `gliner2.5-multi` | `fp32` | `gliner2.5-multi@fp32` | fp32 | 1131.9 MB | quality | `dtk models download gliner2.5-multi --variant fp32` |
25
+ | `gliner2.5-decide` | `q4f16` * | `gliner2.5-decide@q4f16` | q4/fp16 | 523.5 MB | default | `dtk models download gliner2.5-decide --variant q4f16` |
26
+ | `laya` | `q8` * | `laya@q8` | int8 | 527.9 MB | default | `dtk models download laya --variant q8` |
27
+ | `julia-1` | `fp32` * | `julia-1@fp32` | fp32 | 618.2 MB | default | `dtk models download julia-1 --variant fp32` |
28
+ | `opendecider-nano` | `q8f16` * | `opendecider-nano@q8f16` | int8/fp16 | 468.8 MB | default | `dtk models download opendecider-nano --variant q8f16` |
29
+ | `opendecider-nano` | `fp16` | `opendecider-nano@fp16` | fp16 | 791.9 MB | quality | `dtk models download opendecider-nano --variant fp16` |
30
+ | `laya-multilingual` | `fp16` * | `laya-multilingual@fp16` | fp16 | 681.8 MB | default | `dtk models download laya-multilingual --variant fp16` |
31
+ | `laya-multilingual` | `fp32` | `laya-multilingual@fp32` | fp32 | 1325.6 MB | quality | `dtk models download laya-multilingual --variant fp32` |
32
+ | `open-jev-deberta-v3-large` | `q4f16` | `open-jev-deberta-v3-large@q4f16` | q4/fp16 | 357.0 MB | edge | `dtk models download open-jev-deberta-v3-large --variant q4f16` |
33
+ | `open-jev-deberta-v3-large` | `fp16` * | `open-jev-deberta-v3-large@fp16` | fp16 | 883.5 MB | default | `dtk models download open-jev-deberta-v3-large --variant fp16` |
34
+ | `open-jev-deberta-v3-large` | `q4` | `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` | `fp32` | `open-jev-deberta-v3-large@fp32` | fp32 | 1757.9 MB | quality | `dtk models download open-jev-deberta-v3-large --variant fp32` |
36
+ | `strands-decider-2b` | `q4f16` * | `strands-decider-2b@q4f16` | q4/fp16 | 1113.6 MB | default | `dtk models download strands-decider-2b --variant q4f16` |
37
+ | `strands-decider-2b` | `q8` | `strands-decider-2b@q8` | int8 | 1821.4 MB | quality | `dtk models download strands-decider-2b --variant q8` |
38
38
 
39
39
  Models with a single row have only one catalogued, verified build. That does
40
40
  not mean other conversions do not exist upstream; it means they have not passed
@@ -54,6 +54,40 @@ in the toolkit; see [Variants and quantization](../VARIANTS.md).
54
54
  - Quantized q4f16; the fp16/fp32 builds may resolve the sentiment example differently.
55
55
  - The model card's examples are "potential outputs", not guarantees; validate on your data.
56
56
 
57
+ ## Loading each variant
58
+
59
+ REST selects the quantization through the standard `model` field using the
60
+ alias `gliner2.5-decide@variant`; there is no `variant` field in the request body.
61
+
62
+ ### `q4f16` (q4/fp16, default)
63
+
64
+ **Library**
65
+
66
+ ```python
67
+ from decision_toolkit import DecisionModel
68
+
69
+ model = DecisionModel("gliner2.5-decide", variant="q4f16")
70
+ ```
71
+
72
+ **CLI**
73
+
74
+ ```bash
75
+ dtk models download gliner2.5-decide --variant q4f16
76
+ dtk models use gliner2.5-decide --variant q4f16
77
+ dtk decide --model gliner2.5-decide --variant q4f16 \
78
+ --state "..." --q 'urgent=noul:Is this urgent?'
79
+ ```
80
+
81
+ **REST**
82
+
83
+ ```bash
84
+ curl -s http://127.0.0.1:8000/v1/systemone \
85
+ -H "Content-Type: application/json" \
86
+ -d '{"model": "gliner2.5-decide@q4f16", "state": "...",
87
+ "questions": {"urgent": {"type": "noul",
88
+ "instructions": "Is this urgent?"}}}}'
89
+ ```
90
+
57
91
  ## Usage
58
92
 
59
93
  ```bash
@@ -55,6 +55,69 @@ makes it persistent. See [Variants and quantization](../VARIANTS.md).
55
55
  - English/multilingual tokenizer fallback: the run above used the raw `tokenizers` fallback; a `transformers` tokenizer may change scores slightly.
56
56
  - Benchmarked on a synthetic Spanish routing set; validate on your own data.
57
57
 
58
+ ## Loading each variant
59
+
60
+ REST selects the quantization through the standard `model` field using the
61
+ alias `gliner2.5-multi@variant`; there is no `variant` field in the request body.
62
+
63
+ ### `fp16` (fp16, default)
64
+
65
+ **Library**
66
+
67
+ ```python
68
+ from decision_toolkit import DecisionModel
69
+
70
+ model = DecisionModel("gliner2.5-multi", variant="fp16")
71
+ ```
72
+
73
+ **CLI**
74
+
75
+ ```bash
76
+ dtk models download gliner2.5-multi --variant fp16
77
+ dtk models use gliner2.5-multi --variant fp16
78
+ dtk decide --model gliner2.5-multi --variant fp16 \
79
+ --state "..." --q 'urgent=noul:Is this urgent?'
80
+ ```
81
+
82
+ **REST**
83
+
84
+ ```bash
85
+ curl -s http://127.0.0.1:8000/v1/systemone \
86
+ -H "Content-Type: application/json" \
87
+ -d '{"model": "gliner2.5-multi@fp16", "state": "...",
88
+ "questions": {"urgent": {"type": "noul",
89
+ "instructions": "Is this urgent?"}}}}'
90
+ ```
91
+
92
+ ### `fp32` (fp32, quality)
93
+
94
+ **Library**
95
+
96
+ ```python
97
+ from decision_toolkit import DecisionModel
98
+
99
+ model = DecisionModel("gliner2.5-multi", variant="fp32")
100
+ ```
101
+
102
+ **CLI**
103
+
104
+ ```bash
105
+ dtk models download gliner2.5-multi --variant fp32
106
+ dtk models use gliner2.5-multi --variant fp32
107
+ dtk decide --model gliner2.5-multi --variant fp32 \
108
+ --state "..." --q 'urgent=noul:Is this urgent?'
109
+ ```
110
+
111
+ **REST**
112
+
113
+ ```bash
114
+ curl -s http://127.0.0.1:8000/v1/systemone \
115
+ -H "Content-Type: application/json" \
116
+ -d '{"model": "gliner2.5-multi@fp32", "state": "...",
117
+ "questions": {"urgent": {"type": "noul",
118
+ "instructions": "Is this urgent?"}}}}'
119
+ ```
120
+
58
121
  ## Usage
59
122
 
60
123
  ```bash
@@ -55,6 +55,40 @@ exists but was not validated and is not catalogued; see
55
55
  - Historical benchmarks used 1024 tokens; accuracy at 8k is not established by the export.
56
56
  - The tokenizer uses `<mask>/<bos>/<eos>`; both conventions are handled, but this checkpoint's tokenizer is the `<...>` one.
57
57
 
58
+ ## Loading each variant
59
+
60
+ REST selects the quantization through the standard `model` field using the
61
+ alias `julia-1@variant`; there is no `variant` field in the request body.
62
+
63
+ ### `fp32` (fp32, default)
64
+
65
+ **Library**
66
+
67
+ ```python
68
+ from decision_toolkit import DecisionModel
69
+
70
+ model = DecisionModel("julia-1", variant="fp32")
71
+ ```
72
+
73
+ **CLI**
74
+
75
+ ```bash
76
+ dtk models download julia-1 --variant fp32
77
+ dtk models use julia-1 --variant fp32
78
+ dtk decide --model julia-1 --variant fp32 \
79
+ --state "..." --q 'urgent=noul:Is this urgent?'
80
+ ```
81
+
82
+ **REST**
83
+
84
+ ```bash
85
+ curl -s http://127.0.0.1:8000/v1/systemone \
86
+ -H "Content-Type: application/json" \
87
+ -d '{"model": "julia-1@fp32", "state": "...",
88
+ "questions": {"urgent": {"type": "noul",
89
+ "instructions": "Is this urgent?"}}}}'
90
+ ```
91
+
58
92
  ## Usage
59
93
 
60
94
  ```bash
@@ -68,6 +68,69 @@ the full-precision build. Select one with
68
68
  - The adapter uses the fused graph path; the English split checkpoint remains a
69
69
  separate catalog entry (`laya`).
70
70
 
71
+ ## Loading each variant
72
+
73
+ REST selects the quantization through the standard `model` field using the
74
+ alias `laya-multilingual@variant`; there is no `variant` field in the request body.
75
+
76
+ ### `fp16` (fp16, default)
77
+
78
+ **Library**
79
+
80
+ ```python
81
+ from decision_toolkit import DecisionModel
82
+
83
+ model = DecisionModel("laya-multilingual", variant="fp16")
84
+ ```
85
+
86
+ **CLI**
87
+
88
+ ```bash
89
+ dtk models download laya-multilingual --variant fp16
90
+ dtk models use laya-multilingual --variant fp16
91
+ dtk decide --model laya-multilingual --variant fp16 \
92
+ --state "..." --q 'urgent=noul:Is this urgent?'
93
+ ```
94
+
95
+ **REST**
96
+
97
+ ```bash
98
+ curl -s http://127.0.0.1:8000/v1/systemone \
99
+ -H "Content-Type: application/json" \
100
+ -d '{"model": "laya-multilingual@fp16", "state": "...",
101
+ "questions": {"urgent": {"type": "noul",
102
+ "instructions": "Is this urgent?"}}}}'
103
+ ```
104
+
105
+ ### `fp32` (fp32, quality)
106
+
107
+ **Library**
108
+
109
+ ```python
110
+ from decision_toolkit import DecisionModel
111
+
112
+ model = DecisionModel("laya-multilingual", variant="fp32")
113
+ ```
114
+
115
+ **CLI**
116
+
117
+ ```bash
118
+ dtk models download laya-multilingual --variant fp32
119
+ dtk models use laya-multilingual --variant fp32
120
+ dtk decide --model laya-multilingual --variant fp32 \
121
+ --state "..." --q 'urgent=noul:Is this urgent?'
122
+ ```
123
+
124
+ **REST**
125
+
126
+ ```bash
127
+ curl -s http://127.0.0.1:8000/v1/systemone \
128
+ -H "Content-Type: application/json" \
129
+ -d '{"model": "laya-multilingual@fp32", "state": "...",
130
+ "questions": {"urgent": {"type": "noul",
131
+ "instructions": "Is this urgent?"}}}}'
132
+ ```
133
+
71
134
  ## Usage
72
135
 
73
136
  ```bash
@@ -61,6 +61,40 @@ fp32 build; see [Variants and quantization](../VARIANTS.md).
61
61
  - **English checkpoint.** The multilingual checkpoint is a different model (mmBERT-base) and has no split public export yet.
62
62
  - q8 quantization; the fp32 build was not published in this repo.
63
63
 
64
+ ## Loading each variant
65
+
66
+ REST selects the quantization through the standard `model` field using the
67
+ alias `laya@variant`; there is no `variant` field in the request body.
68
+
69
+ ### `q8` (int8, default)
70
+
71
+ **Library**
72
+
73
+ ```python
74
+ from decision_toolkit import DecisionModel
75
+
76
+ model = DecisionModel("laya", variant="q8")
77
+ ```
78
+
79
+ **CLI**
80
+
81
+ ```bash
82
+ dtk models download laya --variant q8
83
+ dtk models use laya --variant q8
84
+ dtk decide --model laya --variant q8 \
85
+ --state "..." --q 'urgent=noul:Is this urgent?'
86
+ ```
87
+
88
+ **REST**
89
+
90
+ ```bash
91
+ curl -s http://127.0.0.1:8000/v1/systemone \
92
+ -H "Content-Type: application/json" \
93
+ -d '{"model": "laya@q8", "state": "...",
94
+ "questions": {"urgent": {"type": "noul",
95
+ "instructions": "Is this urgent?"}}}}'
96
+ ```
97
+
64
98
  ## Usage
65
99
 
66
100
  ```bash
@@ -67,6 +67,127 @@ and re-check thresholds. See [Variants and quantization](../VARIANTS.md).
67
67
  - It chooses among supplied options; it cannot generate explanations.
68
68
  - This is an independent Open-Jev DeBERTa v3 large reproduction, not an official TypeSafe model.
69
69
 
70
+ ## Loading each variant
71
+
72
+ REST selects the quantization through the standard `model` field using the
73
+ alias `open-jev-deberta-v3-large@variant`; there is no `variant` field in the request body.
74
+
75
+ ### `q4f16` (q4/fp16, edge)
76
+
77
+ **Library**
78
+
79
+ ```python
80
+ from decision_toolkit import DecisionModel
81
+
82
+ model = DecisionModel("open-jev-deberta-v3-large", variant="q4f16")
83
+ ```
84
+
85
+ **CLI**
86
+
87
+ ```bash
88
+ dtk models download open-jev-deberta-v3-large --variant q4f16
89
+ dtk models use open-jev-deberta-v3-large --variant q4f16
90
+ dtk decide --model open-jev-deberta-v3-large --variant q4f16 \
91
+ --state "..." --q 'urgent=noul:Is this urgent?'
92
+ ```
93
+
94
+ **REST**
95
+
96
+ ```bash
97
+ curl -s http://127.0.0.1:8000/v1/systemone \
98
+ -H "Content-Type: application/json" \
99
+ -d '{"model": "open-jev-deberta-v3-large@q4f16", "state": "...",
100
+ "questions": {"urgent": {"type": "noul",
101
+ "instructions": "Is this urgent?"}}}}'
102
+ ```
103
+
104
+ ### `fp16` (fp16, default)
105
+
106
+ **Library**
107
+
108
+ ```python
109
+ from decision_toolkit import DecisionModel
110
+
111
+ model = DecisionModel("open-jev-deberta-v3-large", variant="fp16")
112
+ ```
113
+
114
+ **CLI**
115
+
116
+ ```bash
117
+ dtk models download open-jev-deberta-v3-large --variant fp16
118
+ dtk models use open-jev-deberta-v3-large --variant fp16
119
+ dtk decide --model open-jev-deberta-v3-large --variant fp16 \
120
+ --state "..." --q 'urgent=noul:Is this urgent?'
121
+ ```
122
+
123
+ **REST**
124
+
125
+ ```bash
126
+ curl -s http://127.0.0.1:8000/v1/systemone \
127
+ -H "Content-Type: application/json" \
128
+ -d '{"model": "open-jev-deberta-v3-large@fp16", "state": "...",
129
+ "questions": {"urgent": {"type": "noul",
130
+ "instructions": "Is this urgent?"}}}}'
131
+ ```
132
+
133
+ ### `q4` (q4, edge)
134
+
135
+ **Library**
136
+
137
+ ```python
138
+ from decision_toolkit import DecisionModel
139
+
140
+ model = DecisionModel("open-jev-deberta-v3-large", variant="q4")
141
+ ```
142
+
143
+ **CLI**
144
+
145
+ ```bash
146
+ dtk models download open-jev-deberta-v3-large --variant q4
147
+ dtk models use open-jev-deberta-v3-large --variant q4
148
+ dtk decide --model open-jev-deberta-v3-large --variant q4 \
149
+ --state "..." --q 'urgent=noul:Is this urgent?'
150
+ ```
151
+
152
+ **REST**
153
+
154
+ ```bash
155
+ curl -s http://127.0.0.1:8000/v1/systemone \
156
+ -H "Content-Type: application/json" \
157
+ -d '{"model": "open-jev-deberta-v3-large@q4", "state": "...",
158
+ "questions": {"urgent": {"type": "noul",
159
+ "instructions": "Is this urgent?"}}}}'
160
+ ```
161
+
162
+ ### `fp32` (fp32, quality)
163
+
164
+ **Library**
165
+
166
+ ```python
167
+ from decision_toolkit import DecisionModel
168
+
169
+ model = DecisionModel("open-jev-deberta-v3-large", variant="fp32")
170
+ ```
171
+
172
+ **CLI**
173
+
174
+ ```bash
175
+ dtk models download open-jev-deberta-v3-large --variant fp32
176
+ dtk models use open-jev-deberta-v3-large --variant fp32
177
+ dtk decide --model open-jev-deberta-v3-large --variant fp32 \
178
+ --state "..." --q 'urgent=noul:Is this urgent?'
179
+ ```
180
+
181
+ **REST**
182
+
183
+ ```bash
184
+ curl -s http://127.0.0.1:8000/v1/systemone \
185
+ -H "Content-Type: application/json" \
186
+ -d '{"model": "open-jev-deberta-v3-large@fp32", "state": "...",
187
+ "questions": {"urgent": {"type": "noul",
188
+ "instructions": "Is this urgent?"}}}}'
189
+ ```
190
+
70
191
  ## Usage
71
192
 
72
193
  ```bash
@@ -57,6 +57,69 @@ the quality build. Select one with
57
57
  - No independent parity dataset (the official benchmark inputs are hashed).
58
58
  - The export's tokenizer is a web tokenizer (`tokenizer.web.json`), loaded through the `tokenizers` fallback.
59
59
 
60
+ ## Loading each variant
61
+
62
+ REST selects the quantization through the standard `model` field using the
63
+ alias `opendecider-nano@variant`; there is no `variant` field in the request body.
64
+
65
+ ### `q8f16` (int8/fp16, default)
66
+
67
+ **Library**
68
+
69
+ ```python
70
+ from decision_toolkit import DecisionModel
71
+
72
+ model = DecisionModel("opendecider-nano", variant="q8f16")
73
+ ```
74
+
75
+ **CLI**
76
+
77
+ ```bash
78
+ dtk models download opendecider-nano --variant q8f16
79
+ dtk models use opendecider-nano --variant q8f16
80
+ dtk decide --model opendecider-nano --variant q8f16 \
81
+ --state "..." --q 'urgent=noul:Is this urgent?'
82
+ ```
83
+
84
+ **REST**
85
+
86
+ ```bash
87
+ curl -s http://127.0.0.1:8000/v1/systemone \
88
+ -H "Content-Type: application/json" \
89
+ -d '{"model": "opendecider-nano@q8f16", "state": "...",
90
+ "questions": {"urgent": {"type": "noul",
91
+ "instructions": "Is this urgent?"}}}}'
92
+ ```
93
+
94
+ ### `fp16` (fp16, quality)
95
+
96
+ **Library**
97
+
98
+ ```python
99
+ from decision_toolkit import DecisionModel
100
+
101
+ model = DecisionModel("opendecider-nano", variant="fp16")
102
+ ```
103
+
104
+ **CLI**
105
+
106
+ ```bash
107
+ dtk models download opendecider-nano --variant fp16
108
+ dtk models use opendecider-nano --variant fp16
109
+ dtk decide --model opendecider-nano --variant fp16 \
110
+ --state "..." --q 'urgent=noul:Is this urgent?'
111
+ ```
112
+
113
+ **REST**
114
+
115
+ ```bash
116
+ curl -s http://127.0.0.1:8000/v1/systemone \
117
+ -H "Content-Type: application/json" \
118
+ -d '{"model": "opendecider-nano@fp16", "state": "...",
119
+ "questions": {"urgent": {"type": "noul",
120
+ "instructions": "Is this urgent?"}}}}'
121
+ ```
122
+
60
123
  ## Usage
61
124
 
62
125
  ```bash
@@ -73,6 +73,69 @@ for 3 days!`):
73
73
  probabilities need to be closest to the reference.
74
74
  - No image/audio support in this text-only projection.
75
75
 
76
+ ## Loading each variant
77
+
78
+ REST selects the quantization through the standard `model` field using the
79
+ alias `strands-decider-2b@variant`; there is no `variant` field in the request body.
80
+
81
+ ### `q4f16` (q4/fp16, default)
82
+
83
+ **Library**
84
+
85
+ ```python
86
+ from decision_toolkit import DecisionModel
87
+
88
+ model = DecisionModel("strands-decider-2b", variant="q4f16")
89
+ ```
90
+
91
+ **CLI**
92
+
93
+ ```bash
94
+ dtk models download strands-decider-2b --variant q4f16
95
+ dtk models use strands-decider-2b --variant q4f16
96
+ dtk decide --model strands-decider-2b --variant q4f16 \
97
+ --state "..." --q 'urgent=noul:Is this urgent?'
98
+ ```
99
+
100
+ **REST**
101
+
102
+ ```bash
103
+ curl -s http://127.0.0.1:8000/v1/systemone \
104
+ -H "Content-Type: application/json" \
105
+ -d '{"model": "strands-decider-2b@q4f16", "state": "...",
106
+ "questions": {"urgent": {"type": "noul",
107
+ "instructions": "Is this urgent?"}}}}'
108
+ ```
109
+
110
+ ### `q8` (int8, quality)
111
+
112
+ **Library**
113
+
114
+ ```python
115
+ from decision_toolkit import DecisionModel
116
+
117
+ model = DecisionModel("strands-decider-2b", variant="q8")
118
+ ```
119
+
120
+ **CLI**
121
+
122
+ ```bash
123
+ dtk models download strands-decider-2b --variant q8
124
+ dtk models use strands-decider-2b --variant q8
125
+ dtk decide --model strands-decider-2b --variant q8 \
126
+ --state "..." --q 'urgent=noul:Is this urgent?'
127
+ ```
128
+
129
+ **REST**
130
+
131
+ ```bash
132
+ curl -s http://127.0.0.1:8000/v1/systemone \
133
+ -H "Content-Type: application/json" \
134
+ -d '{"model": "strands-decider-2b@q8", "state": "...",
135
+ "questions": {"urgent": {"type": "noul",
136
+ "instructions": "Is this urgent?"}}}}'
137
+ ```
138
+
76
139
  ## Usage
77
140
 
78
141
  ```bash
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "decision-toolkit"
7
- version = "0.4.0"
7
+ version = "0.4.1"
8
8
  description = "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."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -7,7 +7,7 @@ questions with a calibrated probability for every option, on CPU.
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
- __version__ = "0.4.0"
10
+ __version__ = "0.4.1"
11
11
 
12
12
  from .adapters import register_adapter
13
13
  from .calibration import brier_score, expected_calibration_error, threshold_sweep
@@ -158,6 +158,7 @@ class ModelInfo:
158
158
  "variants": [
159
159
  {
160
160
  "name": variant.name,
161
+ "alias": f"{self.id}@{variant.name}",
161
162
  "quant": variant.quant,
162
163
  "size_mb": variant.size_mb,
163
164
  "role": variant.role,
@@ -592,6 +592,7 @@ def _catalog_payload(
592
592
  def _variant_payload(variant: catalog.Variant, cached: set[tuple[str, str]], model_id: str) -> dict[str, Any]:
593
593
  return {
594
594
  "name": variant.name,
595
+ "alias": f"{model_id}@{variant.name}",
595
596
  "quant": variant.quant,
596
597
  "size_mb": variant.size_mb,
597
598
  "role": variant.role,
@@ -709,7 +710,7 @@ def _cmd_models(args: argparse.Namespace) -> int:
709
710
  if as_json:
710
711
  _json_out(payloads)
711
712
  return EXIT_OK
712
- headers = ["", "id", "variant", "quant", "role", "size", "cached"]
713
+ headers = ["", "id", "variant", "alias", "quant", "role", "size", "cached"]
713
714
  if args.show_adapter:
714
715
  headers.insert(2, "adapter")
715
716
  if args.show_license:
@@ -732,6 +733,7 @@ def _cmd_models(args: argparse.Namespace) -> int:
732
733
  "★" if is_current else "",
733
734
  model.id,
734
735
  label,
736
+ f"{model.id}@{variant.name}",
735
737
  variant.quant,
736
738
  variant.role,
737
739
  f"{variant.size_mb:.1f} MB",
@@ -781,6 +783,7 @@ def _cmd_models(args: argparse.Namespace) -> int:
781
783
  if variant.parity:
782
784
  summary = ", ".join(f"{key}={value}" for key, value in variant.parity.items())
783
785
  print(f" parity: {summary}")
786
+ print(f" alias: {model.id}@{variant.name}")
784
787
  print(
785
788
  f" download: dtk models download {model.id} "
786
789
  f"--variant {variant.name}"
@@ -220,6 +220,7 @@ def test_models_list_json_and_columns(home, capsys):
220
220
  assert entry["license"] == "apache-2.0"
221
221
  assert entry["default_variant"] == "fp16"
222
222
  assert entry["current_variant"] is None
223
+ assert entry["variants"][0]["alias"] == "gliner2.5-multi@fp16"
223
224
  assert entry["variants"][0]["quant"] == "fp16"
224
225
 
225
226
  assert cli.main(
@@ -242,6 +243,7 @@ def test_models_variants_text_and_json(home, capsys):
242
243
  assert "577.1" in text and "1131.9" in text
243
244
  assert "latency p50" in text
244
245
  assert "parity:" in text and "baseline=" in text
246
+ assert "alias: gliner2.5-multi@fp32" in text
245
247
  assert "download: dtk models download gliner2.5-multi --variant fp32" in text
246
248
  assert "selected variant: dtk models use gliner2.5-multi" in text
247
249
 
@@ -251,6 +253,7 @@ def test_models_variants_text_and_json(home, capsys):
251
253
  payload = json.loads(_out(capsys))
252
254
  assert payload["adapter"] == "gliner2"
253
255
  assert payload["default_variant"] == "fp16"
256
+ assert payload["variants"][0]["alias"] == "gliner2.5-multi@fp16"
254
257
  assert {variant["name"] for variant in payload["variants"]} == {"fp16", "fp32"}
255
258
  assert payload["variants"][0]["revision"]
256
259
  assert payload["variants"][0]["sha256"]
@@ -349,7 +349,7 @@ wheels = [
349
349
 
350
350
  [[package]]
351
351
  name = "decision-toolkit"
352
- version = "0.4.0"
352
+ version = "0.4.1"
353
353
  source = { editable = "." }
354
354
  dependencies = [
355
355
  { name = "huggingface-hub" },