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.
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/.github/workflows/ci.yml +26 -4
- decision_toolkit-0.1.3/.github/workflows/docs.yml +48 -0
- decision_toolkit-0.1.3/.github/workflows/release.yml +137 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/.gitignore +1 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/CHANGELOG.md +9 -1
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/PKG-INFO +13 -6
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/README.md +9 -4
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/BENCH.md +3 -3
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/RELEASE.md +9 -8
- decision_toolkit-0.1.3/docs/index.md +53 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/pyproject.toml +5 -2
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/__init__.py +1 -1
- decision_toolkit-0.1.2/.github/workflows/release.yml +0 -85
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/CONTRIBUTING.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/LICENSE +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/SECURITY.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/THIRD_PARTY_NOTICES.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/README.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/__init__.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/load.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/results/2026-10-20-calibration.json +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/results/2026-10-20-load.json +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/results/2026-10-20-smoke.json +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/run.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/suites/calibration.jsonl +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/bench/suites/smoke.jsonl +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/CLI.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/CORE.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/EXAMPLES.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/OPERATIONS.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/REST.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/ROADMAP.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/README.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/gliner2.5-decide.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/gliner2.5-multi.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/julia-1.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/laya.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/docs/models/opendecider-nano.md +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/__main__.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/__init__.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/base.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/gliner2.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/gliner2_decide.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/julia.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/laya.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/opendecider.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/calibration.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/catalog.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/cli.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/config.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/__init__.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/common.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/mapping.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/openai_decisions_beta.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/systemone_v1.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/decision_model.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/engine/__init__.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/errors.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/limits.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/metrics.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/models.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/observability.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/py.typed +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/registry.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/results.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/schema.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/server.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/tracing.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/__init__.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/conftest.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_gliner2.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_gliner2_decide.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_julia.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_laya.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_adapters_opendecider.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_bench.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_catalog.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_cli.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_config.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_core_phase1.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_decision_model.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_fuzz_rest.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_integration_gliner2.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_models.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_operations.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_results.py +0 -0
- {decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/tests/test_schema.py +0 -0
- {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@
|
|
25
|
-
- uses: actions/setup-python@
|
|
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@
|
|
48
|
-
- uses: actions/setup-python@
|
|
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
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
All notable changes to this project are documented here. Version `0.1.
|
|
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.
|
|
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://
|
|
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
|
+
[](https://pypi.org/project/decision-toolkit/)
|
|
50
|
+
[](https://github.com/gia-uh/decision-toolkit/actions/workflows/ci.yml)
|
|
51
|
+
[](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
|
-
**
|
|
58
|
-
|
|
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.
|
|
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.
|
|
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
|
+
[](https://pypi.org/project/decision-toolkit/)
|
|
4
|
+
[](https://github.com/gia-uh/decision-toolkit/actions/workflows/ci.yml)
|
|
5
|
+
[](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
|
-
**
|
|
14
|
-
|
|
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.
|
|
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.
|
|
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/`](
|
|
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`](
|
|
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`](
|
|
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`
|
|
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.
|
|
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.
|
|
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.
|
|
70
|
-
git push origin v0.1.
|
|
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.
|
|
114
|
+
`0.1.3` is published through Trusted Publishing on 2026-10-20:
|
|
115
115
|
|
|
116
|
-
<https://pypi.org/project/decision-toolkit/0.1.
|
|
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
|
-
|
|
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.
|
|
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://
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/gliner2_decide.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/adapters/opendecider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{decision_toolkit-0.1.2 → decision_toolkit-0.1.3}/src/decision_toolkit/contracts/systemone_v1.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|