decision-toolkit 0.1.2__tar.gz → 0.1.3__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 (88) hide show
  1. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/.github/workflows/ci.yml +26 -4
  2. decision_toolkit-0.1.3/.github/workflows/docs.yml +48 -0
  3. decision_toolkit-0.1.3/.github/workflows/release.yml +137 -0
  4. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/.gitignore +1 -0
  5. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/CHANGELOG.md +9 -1
  6. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/PKG-INFO +13 -6
  7. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/README.md +9 -4
  8. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/BENCH.md +3 -3
  9. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/RELEASE.md +9 -8
  10. decision_toolkit-0.1.3/docs/index.md +53 -0
  11. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/pyproject.toml +5 -2
  12. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/__init__.py +1 -1
  13. decision_toolkit-0.1.2/.github/workflows/release.yml +0 -85
  14. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/CONTRIBUTING.md +0 -0
  15. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/LICENSE +0 -0
  16. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/SECURITY.md +0 -0
  17. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/THIRD_PARTY_NOTICES.md +0 -0
  18. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/README.md +0 -0
  19. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/__init__.py +0 -0
  20. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/load.py +0 -0
  21. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/results/2026-10-20-calibration.json +0 -0
  22. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/results/2026-10-20-load.json +0 -0
  23. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/results/2026-10-20-smoke.json +0 -0
  24. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/run.py +0 -0
  25. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/suites/calibration.jsonl +0 -0
  26. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/suites/smoke.jsonl +0 -0
  27. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/CLI.md +0 -0
  28. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/CORE.md +0 -0
  29. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/EXAMPLES.md +0 -0
  30. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/OPERATIONS.md +0 -0
  31. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/REST.md +0 -0
  32. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/ROADMAP.md +0 -0
  33. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/README.md +0 -0
  34. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/gliner2.5-decide.md +0 -0
  35. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/gliner2.5-multi.md +0 -0
  36. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/julia-1.md +0 -0
  37. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/laya.md +0 -0
  38. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/opendecider-nano.md +0 -0
  39. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/__main__.py +0 -0
  40. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/__init__.py +0 -0
  41. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/base.py +0 -0
  42. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/gliner2.py +0 -0
  43. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/gliner2_decide.py +0 -0
  44. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/julia.py +0 -0
  45. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/laya.py +0 -0
  46. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/opendecider.py +0 -0
  47. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/calibration.py +0 -0
  48. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/catalog.py +0 -0
  49. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/cli.py +0 -0
  50. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/config.py +0 -0
  51. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/__init__.py +0 -0
  52. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/common.py +0 -0
  53. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/mapping.py +0 -0
  54. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/openai_decisions_beta.py +0 -0
  55. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/systemone_v1.py +0 -0
  56. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/decision_model.py +0 -0
  57. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/engine/__init__.py +0 -0
  58. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/errors.py +0 -0
  59. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/limits.py +0 -0
  60. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/metrics.py +0 -0
  61. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/models.py +0 -0
  62. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/observability.py +0 -0
  63. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/py.typed +0 -0
  64. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/registry.py +0 -0
  65. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/results.py +0 -0
  66. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/schema.py +0 -0
  67. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/server.py +0 -0
  68. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/tracing.py +0 -0
  69. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/__init__.py +0 -0
  70. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/conftest.py +0 -0
  71. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_gliner2.py +0 -0
  72. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_gliner2_decide.py +0 -0
  73. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_julia.py +0 -0
  74. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_laya.py +0 -0
  75. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_opendecider.py +0 -0
  76. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_bench.py +0 -0
  77. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_catalog.py +0 -0
  78. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_cli.py +0 -0
  79. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_config.py +0 -0
  80. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_core_phase1.py +0 -0
  81. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_decision_model.py +0 -0
  82. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_fuzz_rest.py +0 -0
  83. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_integration_gliner2.py +0 -0
  84. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_models.py +0 -0
  85. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_operations.py +0 -0
  86. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_results.py +0 -0
  87. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_schema.py +0 -0
  88. {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_server.py +0 -0
@@ -21,8 +21,8 @@ jobs:
21
21
  env:
22
22
  PYTHONPATH: src
23
23
  steps:
24
- - uses: actions/checkout@v4
25
- - uses: actions/setup-python@v5
24
+ - uses: actions/checkout@v5
25
+ - uses: actions/setup-python@v6
26
26
  with:
27
27
  python-version: ${{ matrix.python }}
28
28
  cache: pip
@@ -40,12 +40,34 @@ jobs:
40
40
  python -m decision_toolkit --version
41
41
  python -m decision_toolkit --home "$RUNNER_TEMP/dtk-home" doctor --json
42
42
 
43
+ package:
44
+ name: wheel build and clean install
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - uses: actions/checkout@v5
48
+ - uses: actions/setup-python@v6
49
+ with:
50
+ python-version: "3.12"
51
+ - name: Build and validate distributions
52
+ run: |
53
+ python -m pip install --upgrade build twine
54
+ python -m build
55
+ python -m twine check dist/*
56
+ - name: Install the wheel in a clean venv
57
+ run: |
58
+ python -m venv /tmp/dtk-wheel
59
+ /tmp/dtk-wheel/bin/pip install --upgrade pip
60
+ /tmp/dtk-wheel/bin/pip install dist/*.whl
61
+ /tmp/dtk-wheel/bin/pip check
62
+ /tmp/dtk-wheel/bin/dtk --version
63
+ /tmp/dtk-wheel/bin/dtk models list --json
64
+
43
65
  audit:
44
66
  name: dependency audit
45
67
  runs-on: ubuntu-latest
46
68
  steps:
47
- - uses: actions/checkout@v4
48
- - uses: actions/setup-python@v5
69
+ - uses: actions/checkout@v5
70
+ - uses: actions/setup-python@v6
49
71
  with:
50
72
  python-version: "3.13"
51
73
  - name: Install audit tool and runtime dependencies
@@ -0,0 +1,48 @@
1
+ name: docs
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ paths:
7
+ - "docs/**"
8
+ - "mkdocs.yml"
9
+ - ".github/workflows/docs.yml"
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+ pages: write
15
+ id-token: write
16
+
17
+ concurrency:
18
+ group: pages-${{ github.ref }}
19
+ cancel-in-progress: true
20
+
21
+ jobs:
22
+ build:
23
+ name: build MkDocs site
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - uses: actions/checkout@v5
27
+ - uses: actions/setup-python@v6
28
+ with:
29
+ python-version: "3.12"
30
+ - name: Install MkDocs Material
31
+ run: python -m pip install --upgrade mkdocs-material
32
+ - name: Build with strict link checking
33
+ run: mkdocs build --strict
34
+ - uses: actions/configure-pages@v6
35
+ - uses: actions/upload-pages-artifact@v5
36
+ with:
37
+ path: site
38
+
39
+ deploy:
40
+ name: deploy GitHub Pages
41
+ needs: build
42
+ runs-on: ubuntu-latest
43
+ environment:
44
+ name: github-pages
45
+ url: ${{ steps.deployment.outputs.page_url }}
46
+ steps:
47
+ - id: deployment
48
+ uses: actions/deploy-pages@v5
@@ -0,0 +1,137 @@
1
+ name: release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ workflow_dispatch:
8
+ inputs:
9
+ target:
10
+ description: "Publish target (tag pushes always publish TestPyPI then PyPI)"
11
+ type: choice
12
+ options: [testpypi]
13
+ default: testpypi
14
+
15
+ permissions:
16
+ contents: read
17
+
18
+ jobs:
19
+ build:
20
+ name: build distributions
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v5
24
+ - uses: actions/setup-python@v6
25
+ with:
26
+ python-version: "3.12"
27
+ - name: Build sdist and wheel
28
+ run: |
29
+ python -m pip install --upgrade build twine
30
+ python -m build
31
+ python -m twine check dist/*
32
+ - uses: actions/upload-artifact@v5
33
+ with:
34
+ name: distributions
35
+ path: dist/
36
+
37
+ publish-testpypi:
38
+ name: publish TestPyPI
39
+ if: startsWith(github.ref, 'refs/tags/v') || inputs.target == 'testpypi'
40
+ needs: build
41
+ runs-on: ubuntu-latest
42
+ environment: testpypi
43
+ permissions:
44
+ id-token: write
45
+ steps:
46
+ - uses: actions/download-artifact@v6
47
+ with:
48
+ name: distributions
49
+ path: dist/
50
+ - uses: pypa/gh-action-pypi-publish@release/v1
51
+ with:
52
+ repository-url: https://test.pypi.org/legacy/
53
+
54
+ verify-testpypi:
55
+ name: verify TestPyPI install
56
+ if: startsWith(github.ref, 'refs/tags/v') || inputs.target == 'testpypi'
57
+ needs: publish-testpypi
58
+ runs-on: ubuntu-latest
59
+ steps:
60
+ - uses: actions/checkout@v5
61
+ - uses: actions/setup-python@v6
62
+ with:
63
+ python-version: "3.12"
64
+ - name: Resolve version
65
+ run: |
66
+ python - <<'PY' >> "$GITHUB_ENV"
67
+ import tomllib
68
+ with open("pyproject.toml", "rb") as handle:
69
+ print("VERSION=" + tomllib.load(handle)["project"]["version"])
70
+ PY
71
+ - name: Install from TestPyPI and smoke test
72
+ run: |
73
+ python -m venv /tmp/dtk-testpypi
74
+ /tmp/dtk-testpypi/bin/pip install --upgrade pip
75
+ /tmp/dtk-testpypi/bin/pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple "decision-toolkit==$VERSION"
76
+ /tmp/dtk-testpypi/bin/pip check
77
+ /tmp/dtk-testpypi/bin/dtk --version
78
+ /tmp/dtk-testpypi/bin/dtk models list --json
79
+
80
+ publish-pypi:
81
+ name: publish PyPI
82
+ if: startsWith(github.ref, 'refs/tags/v')
83
+ needs: verify-testpypi
84
+ runs-on: ubuntu-latest
85
+ environment: pypi
86
+ permissions:
87
+ id-token: write
88
+ steps:
89
+ - uses: actions/download-artifact@v6
90
+ with:
91
+ name: distributions
92
+ path: dist/
93
+ - uses: pypa/gh-action-pypi-publish@release/v1
94
+
95
+ verify-pypi:
96
+ name: verify PyPI install
97
+ if: startsWith(github.ref, 'refs/tags/v')
98
+ needs: publish-pypi
99
+ runs-on: ubuntu-latest
100
+ steps:
101
+ - uses: actions/checkout@v5
102
+ - uses: actions/setup-python@v6
103
+ with:
104
+ python-version: "3.12"
105
+ - name: Resolve version
106
+ run: |
107
+ python - <<'PY' >> "$GITHUB_ENV"
108
+ import tomllib
109
+ with open("pyproject.toml", "rb") as handle:
110
+ print("VERSION=" + tomllib.load(handle)["project"]["version"])
111
+ PY
112
+ - name: Install from PyPI and smoke test
113
+ run: |
114
+ python -m venv /tmp/dtk-pypi
115
+ /tmp/dtk-pypi/bin/pip install --upgrade pip
116
+ /tmp/dtk-pypi/bin/pip install "decision-toolkit==$VERSION"
117
+ /tmp/dtk-pypi/bin/pip check
118
+ /tmp/dtk-pypi/bin/dtk --version
119
+ /tmp/dtk-pypi/bin/dtk models list --json
120
+
121
+ github-release:
122
+ name: GitHub release
123
+ if: startsWith(github.ref, 'refs/tags/v')
124
+ needs: verify-pypi
125
+ runs-on: ubuntu-latest
126
+ permissions:
127
+ contents: write
128
+ steps:
129
+ - uses: actions/checkout@v5
130
+ - uses: actions/download-artifact@v6
131
+ with:
132
+ name: distributions
133
+ path: dist/
134
+ - name: Create release
135
+ env:
136
+ GH_TOKEN: ${{ github.token }}
137
+ run: gh release create "$GITHUB_REF_NAME" dist/* --repo "$GITHUB_REPOSITORY" --generate-notes --verify-tag
@@ -20,6 +20,7 @@ htmlcov/
20
20
  .ruff_cache/
21
21
 
22
22
  # Local data
23
+ site/
23
24
  *.local
24
25
  home/
25
26
  /models/
@@ -1,8 +1,15 @@
1
1
  # Changelog
2
2
 
3
- All notable changes to this project are documented here. Version `0.1.2` is
3
+ All notable changes to this project are documented here. Version `0.1.3` is
4
4
  published on PyPI.
5
5
 
6
+ ## [0.1.3] — 2026-10-20
7
+
8
+ Infrastructure release: CI builds and clean-installs the wheel on every PR;
9
+ release verification installs from TestPyPI before PyPI and from PyPI before
10
+ the GitHub release; MkDocs documentation is published to GitHub Pages; PyPI
11
+ environment protection and updated GitHub Actions. No runtime or model changes.
12
+
6
13
  ## [0.1.2] — 2026-10-20
7
14
 
8
15
  Trusted Publishing validation release. No functional or model changes.
@@ -73,6 +80,7 @@ README correction. No code or model behavior changed.
73
80
  - Typed `DecisionModel` API with lifecycle, batching, async, usage, warnings,
74
81
  normalized confidence, capabilities, structured events and atomic model store.
75
82
 
83
+ [0.1.3]: https://pypi.org/project/decision-toolkit/0.1.3/
76
84
  [0.1.2]: https://pypi.org/project/decision-toolkit/0.1.2/
77
85
  [0.1.1]: https://pypi.org/project/decision-toolkit/0.1.1/
78
86
  [0.1.0]: https://pypi.org/project/decision-toolkit/0.1.0/
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: decision-toolkit
3
- Version: 0.1.2
3
+ Version: 0.1.3
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
7
7
  Project-URL: Issues, https://github.com/gia-uh/decision-toolkit/issues
8
- Project-URL: Documentation, https://github.com/gia-uh/decision-toolkit/tree/main/docs
8
+ Project-URL: Documentation, https://uhgia.org/decision-toolkit/
9
9
  Project-URL: Changelog, https://github.com/gia-uh/decision-toolkit/blob/main/CHANGELOG.md
10
10
  Author: Syalia S.R.L.
11
11
  Author-email: Yudivián Almeida Cruz <yudivian@gmail.com>
@@ -30,6 +30,8 @@ Requires-Dist: openai>=1.0; extra == 'dev'
30
30
  Requires-Dist: pip-audit>=2; extra == 'dev'
31
31
  Requires-Dist: pytest>=8; extra == 'dev'
32
32
  Requires-Dist: ruff>=0.6; extra == 'dev'
33
+ Provides-Extra: docs
34
+ Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
33
35
  Provides-Extra: onnx
34
36
  Requires-Dist: numpy>=1.26; extra == 'onnx'
35
37
  Requires-Dist: onnxruntime>=1.18; extra == 'onnx'
@@ -44,6 +46,10 @@ Description-Content-Type: text/markdown
44
46
 
45
47
  # decision-toolkit
46
48
 
49
+ [![PyPI](https://img.shields.io/pypi/v/decision-toolkit?style=flat-square)](https://pypi.org/project/decision-toolkit/)
50
+ [![CI](https://github.com/gia-uh/decision-toolkit/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/gia-uh/decision-toolkit/actions/workflows/ci.yml)
51
+ [![Docs](https://img.shields.io/badge/docs-online-blue?style=flat-square)](https://uhgia.org/decision-toolkit/)
52
+
47
53
  Local-first toolkit around **open-weights decision models**: typed **choice /
48
54
  yes-no (`noul`) / score** questions over a state (text or JSON), answered with a
49
55
  **calibrated probability for every option** — no generated text, no parsing.
@@ -54,18 +60,19 @@ contract** (how a model is fed and read). Three thin surfaces over the same API:
54
60
 
55
61
  Co-developed by [GIA-UH](https://github.com/gia-uh) and [Syalia S.R.L.](https://github.com/syalia-srl).
56
62
 
57
- **Examples:** [docs/EXAMPLES.md](https://github.com/gia-uh/decision-toolkit/blob/main/docs/EXAMPLES.md) covers the library, REST and
58
- CLI. `dtk --help` and every subcommand help also include runnable examples.
63
+ **Documentation:** <https://uhgia.org/decision-toolkit/>. Start with
64
+ [Examples](https://uhgia.org/decision-toolkit/EXAMPLES/) for the library, REST
65
+ and CLI. `dtk --help` and every subcommand help also include runnable examples.
59
66
 
60
67
  ## Installation
61
68
 
62
69
  ```bash
63
- pip install decision-toolkit # library + CLI (0.1.2 on PyPI)
70
+ pip install decision-toolkit # library + CLI (0.1.3 on PyPI)
64
71
  pip install "decision-toolkit[onnx]" # + onnxruntime, tokenizers (the model runtime)
65
72
  pip install "decision-toolkit[server]" # + REST server (FastAPI)
66
73
  ```
67
74
 
68
- PyPI: <https://pypi.org/project/decision-toolkit/0.1.2/>. See
75
+ PyPI: <https://pypi.org/project/decision-toolkit/0.1.3/>. See
69
76
  [docs/RELEASE.md](https://github.com/gia-uh/decision-toolkit/blob/main/docs/RELEASE.md)
70
77
  for the Trusted Publishing flow and clean-install checks.
71
78
 
@@ -1,5 +1,9 @@
1
1
  # decision-toolkit
2
2
 
3
+ [![PyPI](https://img.shields.io/pypi/v/decision-toolkit?style=flat-square)](https://pypi.org/project/decision-toolkit/)
4
+ [![CI](https://github.com/gia-uh/decision-toolkit/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/gia-uh/decision-toolkit/actions/workflows/ci.yml)
5
+ [![Docs](https://img.shields.io/badge/docs-online-blue?style=flat-square)](https://uhgia.org/decision-toolkit/)
6
+
3
7
  Local-first toolkit around **open-weights decision models**: typed **choice /
4
8
  yes-no (`noul`) / score** questions over a state (text or JSON), answered with a
5
9
  **calibrated probability for every option** — no generated text, no parsing.
@@ -10,18 +14,19 @@ contract** (how a model is fed and read). Three thin surfaces over the same API:
10
14
 
11
15
  Co-developed by [GIA-UH](https://github.com/gia-uh) and [Syalia S.R.L.](https://github.com/syalia-srl).
12
16
 
13
- **Examples:** [docs/EXAMPLES.md](https://github.com/gia-uh/decision-toolkit/blob/main/docs/EXAMPLES.md) covers the library, REST and
14
- CLI. `dtk --help` and every subcommand help also include runnable examples.
17
+ **Documentation:** <https://uhgia.org/decision-toolkit/>. Start with
18
+ [Examples](https://uhgia.org/decision-toolkit/EXAMPLES/) for the library, REST
19
+ and CLI. `dtk --help` and every subcommand help also include runnable examples.
15
20
 
16
21
  ## Installation
17
22
 
18
23
  ```bash
19
- pip install decision-toolkit # library + CLI (0.1.2 on PyPI)
24
+ pip install decision-toolkit # library + CLI (0.1.3 on PyPI)
20
25
  pip install "decision-toolkit[onnx]" # + onnxruntime, tokenizers (the model runtime)
21
26
  pip install "decision-toolkit[server]" # + REST server (FastAPI)
22
27
  ```
23
28
 
24
- PyPI: <https://pypi.org/project/decision-toolkit/0.1.2/>. See
29
+ PyPI: <https://pypi.org/project/decision-toolkit/0.1.3/>. See
25
30
  [docs/RELEASE.md](https://github.com/gia-uh/decision-toolkit/blob/main/docs/RELEASE.md)
26
31
  for the Trusted Publishing flow and clean-install checks.
27
32
 
@@ -1,6 +1,6 @@
1
1
  # Benchmarks and calibration
2
2
 
3
- The reproducible harness lives in [`bench/`](../bench/). It is intentionally
3
+ The reproducible harness lives in [`bench/`](https://github.com/gia-uh/decision-toolkit/tree/main/bench). It is intentionally
4
4
  outside the installed package.
5
5
 
6
6
  ## What it measures
@@ -48,9 +48,9 @@ Calibration smoke (`gliner2.5-multi`, 10 synthetic routing cases): accuracy
48
48
  `0.60`, Brier `0.173`, ECE `0.247`.
49
49
 
50
50
  Full evidence, per-case answers and environment metadata:
51
- [`bench/results/2026-10-20-smoke.json`](../bench/results/2026-10-20-smoke.json)
51
+ [`bench/results/2026-10-20-smoke.json`](https://github.com/gia-uh/decision-toolkit/blob/main/bench/results/2026-10-20-smoke.json)
52
52
  and
53
- [`bench/results/2026-10-20-calibration.json`](../bench/results/2026-10-20-calibration.json).
53
+ [`bench/results/2026-10-20-calibration.json`](https://github.com/gia-uh/decision-toolkit/blob/main/bench/results/2026-10-20-calibration.json).
54
54
 
55
55
  ## Interpreting latency
56
56
 
@@ -1,7 +1,7 @@
1
1
  # Release
2
2
 
3
3
  The package name is `decision-toolkit` (PyPI/TestPyPI returned 404 when this
4
- file was written, so the name was available). The first release was `0.1.0`; `0.1.1` was a metadata-only refresh; `0.1.2` validates Trusted Publishing end to end.
4
+ file was written, so the name was available). The first release was `0.1.0`; `0.1.1` was a metadata-only refresh; `0.1.2` validated Trusted Publishing; `0.1.3` adds release verification and docs publication.
5
5
 
6
6
  ## Local build and verification
7
7
 
@@ -24,7 +24,7 @@ Clean install test (no `PYTHONPATH`):
24
24
  ```bash
25
25
  python -m venv /tmp/dtk-wheel
26
26
  . /tmp/dtk-wheel/bin/activate
27
- pip install dist/decision_toolkit-0.1.2-py3-none-any.whl
27
+ pip install dist/decision_toolkit-0.1.3-py3-none-any.whl
28
28
  dtk --version
29
29
  dtk models list --json
30
30
  dtk doctor --json
@@ -33,7 +33,7 @@ dtk doctor --json
33
33
  With inference and server extras:
34
34
 
35
35
  ```bash
36
- pip install "decision_toolkit-0.1.2-py3-none-any.whl[onnx,server,tracing]"
36
+ pip install "decision_toolkit-0.1.3-py3-none-any.whl[onnx,server,tracing]"
37
37
  dtk decide --model gliner2.5-decide ...
38
38
  dtk serve --model gliner2.5-decide --warmup --port 8016
39
39
  curl -s http://127.0.0.1:8016/health
@@ -66,8 +66,8 @@ No long-lived PyPI token is needed; the workflow uses GitHub OIDC
66
66
  4. Create and push an annotated tag:
67
67
 
68
68
  ```bash
69
- git tag -a v0.1.2 -m "decision-toolkit 0.1.2"
70
- git push origin v0.1.2
69
+ git tag -a v0.1.3 -m "decision-toolkit 0.1.3"
70
+ git push origin v0.1.3
71
71
  ```
72
72
 
73
73
  5. `.github/workflows/release.yml` builds once, publishes to **TestPyPI**, then
@@ -111,12 +111,13 @@ to TestPyPI without publishing to PyPI or creating a GitHub release.
111
111
 
112
112
  ## Published release
113
113
 
114
- `0.1.2` was published through Trusted Publishing on 2026-10-20:
114
+ `0.1.3` is published through Trusted Publishing on 2026-10-20:
115
115
 
116
- <https://pypi.org/project/decision-toolkit/0.1.2/>
116
+ <https://pypi.org/project/decision-toolkit/0.1.3/>
117
117
 
118
118
  `0.1.0` was the first release; `0.1.1` refreshed the PyPI description; `0.1.2`
119
- validates the OIDC TestPyPI → PyPI flow end to end.
119
+ validated the OIDC TestPyPI → PyPI flow; `0.1.3` adds post-publish install
120
+ verification and the GitHub Pages documentation site.
120
121
 
121
122
  The tag-triggered workflow remains the preferred path for future releases once
122
123
  the TestPyPI/PyPI trusted publishers and protected environments are configured.
@@ -0,0 +1,53 @@
1
+ # decision-toolkit
2
+
3
+ Local-first toolkit for **open-weights decision models** on CPU: typed choice /
4
+ yes-no / score questions with calibrated probabilities, one ONNX engine and one
5
+ adapter per model contract.
6
+
7
+ ```bash
8
+ pip install decision-toolkit
9
+ pip install "decision-toolkit[onnx]" # model runtime
10
+ pip install "decision-toolkit[server]" # REST server
11
+ ```
12
+
13
+ PyPI: <https://pypi.org/project/decision-toolkit/>
14
+
15
+ ## Start here
16
+
17
+ - [Examples](EXAMPLES.md) — library, REST and CLI.
18
+ - [Core API](CORE.md) — the superset used by every surface.
19
+ - [REST](REST.md) — System One 1.14 + OpenAI Decisions beta.
20
+ - [CLI](CLI.md) — operational commands and batch workflows.
21
+ - [Operations](OPERATIONS.md) — rate limits, metrics, tracing and runbook.
22
+ - [Benchmarks](BENCH.md) — reproducible latency/parity/calibration.
23
+ - [Models](models/README.md) — the curated catalog.
24
+ - [Release](RELEASE.md) — build, TestPyPI/PyPI and Trusted Publishing.
25
+
26
+ ## One example
27
+
28
+ ```python
29
+ from decision_toolkit import DecisionModel, choice, noul
30
+
31
+ with DecisionModel("gliner2.5-multi") as model:
32
+ decision = model.decide(
33
+ "Meeting with Acme: 10% discount, sign next week.",
34
+ {
35
+ "cat": choice("What kind of record is this?", {
36
+ "meeting": "a meeting or call",
37
+ "tasks": "things to do",
38
+ "other": "anything else",
39
+ }),
40
+ "urgent": noul("Does it need a reply today?"),
41
+ },
42
+ )
43
+
44
+ decision["cat"].choice
45
+ decision["cat"].confidence
46
+ decision["urgent"].noul
47
+ decision.usage.to_dict()
48
+ ```
49
+
50
+ ## Trusted publishing
51
+
52
+ Every release from `0.1.2` onward is published through GitHub OIDC to TestPyPI
53
+ and PyPI. See [RELEASE.md](RELEASE.md).
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "decision-toolkit"
7
- version = "0.1.2"
7
+ version = "0.1.3"
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"
@@ -55,6 +55,9 @@ server = [
55
55
  tracing = [
56
56
  "opentelemetry-api>=1.25",
57
57
  ]
58
+ docs = [
59
+ "mkdocs-material>=9.5",
60
+ ]
58
61
  dev = [
59
62
  "pytest>=8",
60
63
  "ruff>=0.6",
@@ -67,7 +70,7 @@ dev = [
67
70
  Homepage = "https://github.com/gia-uh/decision-toolkit"
68
71
  Repository = "https://github.com/gia-uh/decision-toolkit"
69
72
  Issues = "https://github.com/gia-uh/decision-toolkit/issues"
70
- Documentation = "https://github.com/gia-uh/decision-toolkit/tree/main/docs"
73
+ Documentation = "https://uhgia.org/decision-toolkit/"
71
74
  Changelog = "https://github.com/gia-uh/decision-toolkit/blob/main/CHANGELOG.md"
72
75
 
73
76
  [project.scripts]
@@ -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.1.2"
10
+ __version__ = "0.1.3"
11
11
 
12
12
  from .adapters import register_adapter
13
13
  from .calibration import brier_score, expected_calibration_error, threshold_sweep
@@ -1,85 +0,0 @@
1
- name: release
2
-
3
- on:
4
- push:
5
- tags:
6
- - "v*"
7
- workflow_dispatch:
8
- inputs:
9
- target:
10
- description: "Publish target (tag pushes always publish TestPyPI then PyPI)"
11
- type: choice
12
- options: [testpypi]
13
- default: testpypi
14
-
15
- permissions:
16
- contents: read
17
-
18
- jobs:
19
- build:
20
- name: build distributions
21
- runs-on: ubuntu-latest
22
- steps:
23
- - uses: actions/checkout@v4
24
- - uses: actions/setup-python@v5
25
- with:
26
- python-version: "3.12"
27
- - name: Build sdist and wheel
28
- run: |
29
- python -m pip install --upgrade build twine
30
- python -m build
31
- python -m twine check dist/*
32
- - uses: actions/upload-artifact@v4
33
- with:
34
- name: distributions
35
- path: dist/
36
-
37
- publish-testpypi:
38
- name: publish TestPyPI
39
- if: startsWith(github.ref, 'refs/tags/v') || inputs.target == 'testpypi'
40
- needs: build
41
- runs-on: ubuntu-latest
42
- environment: testpypi
43
- permissions:
44
- id-token: write
45
- steps:
46
- - uses: actions/download-artifact@v4
47
- with:
48
- name: distributions
49
- path: dist/
50
- - uses: pypa/gh-action-pypi-publish@release/v1
51
- with:
52
- repository-url: https://test.pypi.org/legacy/
53
-
54
- publish-pypi:
55
- name: publish PyPI
56
- if: startsWith(github.ref, 'refs/tags/v')
57
- needs: publish-testpypi
58
- runs-on: ubuntu-latest
59
- environment: pypi
60
- permissions:
61
- id-token: write
62
- steps:
63
- - uses: actions/download-artifact@v4
64
- with:
65
- name: distributions
66
- path: dist/
67
- - uses: pypa/gh-action-pypi-publish@release/v1
68
-
69
- github-release:
70
- name: GitHub release
71
- if: startsWith(github.ref, 'refs/tags/v')
72
- needs: publish-pypi
73
- runs-on: ubuntu-latest
74
- permissions:
75
- contents: write
76
- steps:
77
- - uses: actions/checkout@v4
78
- - uses: actions/download-artifact@v4
79
- with:
80
- name: distributions
81
- path: dist/
82
- - name: Create release
83
- env:
84
- GH_TOKEN: ${{ github.token }}
85
- run: gh release create "$GITHUB_REF_NAME" dist/* --repo "$GITHUB_REPOSITORY" --generate-notes --verify-tag