predikit 0.6.0__tar.gz → 0.6.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 (58) hide show
  1. {predikit-0.6.0 → predikit-0.6.1}/.claude/settings.local.json +13 -1
  2. {predikit-0.6.0 → predikit-0.6.1}/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
  3. {predikit-0.6.0 → predikit-0.6.1}/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
  4. {predikit-0.6.0 → predikit-0.6.1}/.github/workflows/publish.yml +31 -31
  5. {predikit-0.6.0 → predikit-0.6.1}/.github/workflows/test.yml +47 -47
  6. {predikit-0.6.0 → predikit-0.6.1}/.gitignore +8 -8
  7. {predikit-0.6.0 → predikit-0.6.1}/.pre-commit-config.yaml +15 -15
  8. {predikit-0.6.0 → predikit-0.6.1}/CHANGELOG.md +109 -92
  9. {predikit-0.6.0 → predikit-0.6.1}/CLAUDE.md +71 -71
  10. {predikit-0.6.0 → predikit-0.6.1}/CONTRIBUTING.md +66 -66
  11. {predikit-0.6.0 → predikit-0.6.1}/LICENSE +21 -21
  12. {predikit-0.6.0 → predikit-0.6.1}/PKG-INFO +4 -2
  13. {predikit-0.6.0 → predikit-0.6.1}/examples/01_basic_sklearn.py +48 -48
  14. {predikit-0.6.0 → predikit-0.6.1}/examples/02_xgboost_regression.py +57 -57
  15. {predikit-0.6.0 → predikit-0.6.1}/examples/03_orlando_real_estate.py +127 -127
  16. {predikit-0.6.0 → predikit-0.6.1}/examples/04_confidence_routing.py +106 -106
  17. {predikit-0.6.0 → predikit-0.6.1}/examples/05_multi_model_ensemble.py +182 -182
  18. {predikit-0.6.0 → predikit-0.6.1}/examples/06_mlflow_loader.py +99 -99
  19. {predikit-0.6.0 → predikit-0.6.1}/examples/07_snowflake_loader.py +102 -102
  20. {predikit-0.6.0 → predikit-0.6.1}/pyproject.toml +92 -90
  21. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/__init__.py +1 -1
  22. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/cli.py +143 -124
  23. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/coerce.py +56 -52
  24. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/ensemble.py +121 -121
  25. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/exceptions.py +2 -2
  26. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/exporters/langchain.py +31 -31
  27. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/exporters/openai.py +22 -22
  28. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/introspect.py +20 -20
  29. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/loaders/__init__.py +4 -4
  30. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/loaders/mlflow.py +95 -95
  31. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/loaders/snowflake.py +66 -66
  32. predikit-0.6.1/src/predikit/mcp.py +115 -0
  33. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/registry.py +52 -40
  34. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/tool.py +190 -190
  35. predikit-0.6.1/tests/test_cli.py +219 -0
  36. {predikit-0.6.0 → predikit-0.6.1}/tests/test_coerce.py +68 -57
  37. {predikit-0.6.0 → predikit-0.6.1}/tests/test_confidence.py +134 -134
  38. {predikit-0.6.0 → predikit-0.6.1}/tests/test_ensemble.py +189 -189
  39. {predikit-0.6.0 → predikit-0.6.1}/tests/test_exporters_openai.py +42 -42
  40. {predikit-0.6.0 → predikit-0.6.1}/tests/test_introspect.py +31 -31
  41. {predikit-0.6.0 → predikit-0.6.1}/tests/test_loaders_mlflow.py +202 -202
  42. {predikit-0.6.0 → predikit-0.6.1}/tests/test_loaders_snowflake.py +240 -240
  43. {predikit-0.6.0 → predikit-0.6.1}/tests/test_logging.py +39 -39
  44. predikit-0.6.1/tests/test_mcp.py +158 -0
  45. {predikit-0.6.0 → predikit-0.6.1}/tests/test_registry.py +117 -102
  46. {predikit-0.6.0 → predikit-0.6.1}/tests/test_tool.py +120 -120
  47. {predikit-0.6.0 → predikit-0.6.1}/tests/test_weighted_ensemble.py +176 -176
  48. predikit-0.6.0/src/predikit/mcp.py +0 -68
  49. predikit-0.6.0/tests/test_cli.py +0 -104
  50. predikit-0.6.0/tests/test_mcp.py +0 -82
  51. {predikit-0.6.0 → predikit-0.6.1}/.gitattributes +0 -0
  52. {predikit-0.6.0 → predikit-0.6.1}/README.md +0 -0
  53. {predikit-0.6.0 → predikit-0.6.1}/docs/logo.gif +0 -0
  54. {predikit-0.6.0 → predikit-0.6.1}/docs/logo.png +0 -0
  55. {predikit-0.6.0 → predikit-0.6.1}/src/predikit/exporters/__init__.py +0 -0
  56. {predikit-0.6.0 → predikit-0.6.1}/tests/__init__.py +0 -0
  57. {predikit-0.6.0 → predikit-0.6.1}/tests/test_exporters_langchain.py +0 -0
  58. {predikit-0.6.0 → predikit-0.6.1}/uv.lock +0 -0
@@ -27,7 +27,19 @@
27
27
  "Bash(git stash *)",
28
28
  "Bash(./.venv/Scripts/python.exe -m pytest -q)",
29
29
  "Bash(./.venv/Scripts/python.exe -c \"import numpy; print\\(numpy.__version__\\); print\\(numpy.__file__\\)\")",
30
- "Bash(./.venv/Scripts/python.exe -m mypy --version)"
30
+ "Bash(./.venv/Scripts/python.exe -m mypy --version)",
31
+ "Bash(gh release *)",
32
+ "Bash(python -c \"import mcp; print\\('mcp', mcp.__version__ if hasattr\\(mcp,'__version__'\\) else 'installed'\\)\")",
33
+ "Bash(python -c \"import snowflake.ml; print\\('snowflake-ml installed'\\)\")",
34
+ "Bash(python -m pytest -q --cov=src/predikit --cov-report=term-missing)",
35
+ "Bash(py -0p)",
36
+ "Bash(where python *)",
37
+ "Bash(.venv/Scripts/python.exe -m pytest -q --cov=src/predikit --cov-report=term-missing)",
38
+ "Bash(command -v uv)",
39
+ "Bash(.venv/Scripts/python.exe -m pip download 'mcp>=1.28,<2' -d __TRACKED_VAR__/mcpdl --no-deps -q)",
40
+ "Bash(.venv/Scripts/python.exe -m pip show twine)",
41
+ "Bash(.venv/Scripts/python.exe -m pip install -q -U twine)",
42
+ "Bash(.venv/Scripts/python.exe -m twine check dist/*0.6.1*)"
31
43
  ],
32
44
  "additionalDirectories": [
33
45
  "C:\\AI\\predikit"
@@ -1,38 +1,38 @@
1
- ---
2
- name: Bug report
3
- about: Create a report to help us improve
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- **Describe the bug**
11
- A clear and concise description of what the bug is.
12
-
13
- **To Reproduce**
14
- Steps to reproduce the behavior:
15
- 1. Go to '...'
16
- 2. Click on '....'
17
- 3. Scroll down to '....'
18
- 4. See error
19
-
20
- **Expected behavior**
21
- A clear and concise description of what you expected to happen.
22
-
23
- **Screenshots**
24
- If applicable, add screenshots to help explain your problem.
25
-
26
- **Desktop (please complete the following information):**
27
- - OS: [e.g. iOS]
28
- - Browser [e.g. chrome, safari]
29
- - Version [e.g. 22]
30
-
31
- **Smartphone (please complete the following information):**
32
- - Device: [e.g. iPhone6]
33
- - OS: [e.g. iOS8.1]
34
- - Browser [e.g. stock browser, safari]
35
- - Version [e.g. 22]
36
-
37
- **Additional context**
38
- Add any other context about the problem here.
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+ Steps to reproduce the behavior:
15
+ 1. Go to '...'
16
+ 2. Click on '....'
17
+ 3. Scroll down to '....'
18
+ 4. See error
19
+
20
+ **Expected behavior**
21
+ A clear and concise description of what you expected to happen.
22
+
23
+ **Screenshots**
24
+ If applicable, add screenshots to help explain your problem.
25
+
26
+ **Desktop (please complete the following information):**
27
+ - OS: [e.g. iOS]
28
+ - Browser [e.g. chrome, safari]
29
+ - Version [e.g. 22]
30
+
31
+ **Smartphone (please complete the following information):**
32
+ - Device: [e.g. iPhone6]
33
+ - OS: [e.g. iOS8.1]
34
+ - Browser [e.g. stock browser, safari]
35
+ - Version [e.g. 22]
36
+
37
+ **Additional context**
38
+ Add any other context about the problem here.
@@ -1,20 +1,20 @@
1
- ---
2
- name: Feature request
3
- about: Suggest an idea for this project
4
- title: ''
5
- labels: ''
6
- assignees: ''
7
-
8
- ---
9
-
10
- **Is your feature request related to a problem? Please describe.**
11
- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
-
13
- **Describe the solution you'd like**
14
- A clear and concise description of what you want to happen.
15
-
16
- **Describe alternatives you've considered**
17
- A clear and concise description of any alternative solutions or features you've considered.
18
-
19
- **Additional context**
20
- Add any other context or screenshots about the feature request here.
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: ''
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
@@ -1,31 +1,31 @@
1
- name: Publish to PyPI
2
-
3
- on:
4
- release:
5
- types: [published]
6
-
7
- permissions:
8
- contents: read
9
-
10
- jobs:
11
- publish:
12
- runs-on: ubuntu-latest
13
- environment: pypi
14
- permissions:
15
- contents: read
16
- id-token: write
17
-
18
- steps:
19
- - uses: actions/checkout@v4
20
-
21
- - uses: actions/setup-python@v5
22
- with:
23
- python-version: "3.12"
24
-
25
- - name: Build
26
- run: |
27
- pip install hatchling
28
- python -m hatchling build
29
-
30
- - name: Publish to PyPI
31
- uses: pypa/gh-action-pypi-publish@release/v1
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ publish:
12
+ runs-on: ubuntu-latest
13
+ environment: pypi
14
+ permissions:
15
+ contents: read
16
+ id-token: write
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.12"
24
+
25
+ - name: Build
26
+ run: |
27
+ pip install hatchling
28
+ python -m hatchling build
29
+
30
+ - name: Publish to PyPI
31
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -1,33 +1,33 @@
1
- name: Test
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
- branches: [main]
8
-
9
- permissions:
10
- contents: read
11
-
12
- jobs:
13
- lint:
14
- runs-on: ubuntu-latest
15
- steps:
16
- - uses: actions/checkout@v4
17
-
18
- - uses: actions/setup-python@v5
19
- with:
20
- python-version: "3.12"
21
-
22
- - name: Install dev dependencies
23
- run: pip install -e ".[dev]"
24
-
25
- - name: Ruff lint
26
- run: ruff check src/ tests/
27
-
28
- - name: Ruff format check
29
- run: ruff format --check src/ tests/
30
-
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ lint:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.12"
21
+
22
+ - name: Install dev dependencies
23
+ run: pip install -e ".[dev]"
24
+
25
+ - name: Ruff lint
26
+ run: ruff check src/ tests/
27
+
28
+ - name: Ruff format check
29
+ run: ruff format --check src/ tests/
30
+
31
31
  - name: Mypy
32
32
  run: mypy src/predikit
33
33
 
@@ -37,20 +37,20 @@ jobs:
37
37
  python -m hatchling build
38
38
 
39
39
  test:
40
- runs-on: ubuntu-latest
41
- strategy:
42
- matrix:
43
- python-version: ["3.10", "3.11", "3.12"]
44
-
45
- steps:
46
- - uses: actions/checkout@v4
47
-
48
- - uses: actions/setup-python@v5
49
- with:
50
- python-version: ${{ matrix.python-version }}
51
-
52
- - name: Install dependencies
53
- run: pip install -e ".[dev]"
54
-
55
- - name: Run tests
56
- run: pytest --cov=src/predikit --cov-report=term-missing
40
+ runs-on: ubuntu-latest
41
+ strategy:
42
+ matrix:
43
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
44
+
45
+ steps:
46
+ - uses: actions/checkout@v4
47
+
48
+ - uses: actions/setup-python@v5
49
+ with:
50
+ python-version: ${{ matrix.python-version }}
51
+
52
+ - name: Install dependencies
53
+ run: pip install -e ".[dev]"
54
+
55
+ - name: Run tests
56
+ run: pytest --cov=src/predikit --cov-report=term-missing
@@ -1,14 +1,14 @@
1
- __pycache__/
2
- *.py[cod]
3
- *.egg-info/
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
4
  dist/
5
5
  build/
6
6
  mlruns/
7
7
  .coverage
8
8
  coverage.xml
9
- htmlcov/
10
- .pytest_cache/
11
- .venv/
12
- venv/
13
- *.egg
9
+ htmlcov/
10
+ .pytest_cache/
11
+ .venv/
12
+ venv/
13
+ *.egg
14
14
  file.py
@@ -1,15 +1,15 @@
1
- repos:
2
- - repo: https://github.com/astral-sh/ruff-pre-commit
3
- rev: v0.5.0
4
- hooks:
5
- - id: ruff
6
- args: [--fix]
7
- - id: ruff-format
8
-
9
- - repo: https://github.com/pre-commit/mirrors-mypy
10
- rev: v1.10.0
11
- hooks:
12
- - id: mypy
13
- additional_dependencies:
14
- - pydantic>=2.0
15
- - numpy>=1.24
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.5.0
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - id: ruff-format
8
+
9
+ - repo: https://github.com/pre-commit/mirrors-mypy
10
+ rev: v1.10.0
11
+ hooks:
12
+ - id: mypy
13
+ additional_dependencies:
14
+ - pydantic>=2.0
15
+ - numpy>=1.24
@@ -1,11 +1,28 @@
1
- # Changelog
2
-
3
- All notable changes to this project will be documented in this file.
4
-
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
-
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.6.1] - 2026-08-15
10
+
11
+ ### Fixed
12
+ - MCP tools now advertise an `outputSchema` and return `structuredContent`. The generated callable carried no return annotation, so FastMCP emitted `outputSchema: null` and every result came back as unstructured text. Output fields are named from the tool's `output_name` / `output_description`, and a `collect` ensemble declares each member's output.
13
+ - Low-confidence results keep their `_confidence` and `_low_confidence` keys when served over MCP. The output model allows extra keys; a strict one validates them away silently.
14
+ - `predikit serve` no longer disguises unrelated failures as a bad registry target. Module import and attribute lookup are handled separately, and errors raised while building or running the server propagate with their own traceback instead of being reported as `Could not load registry target`.
15
+ - `coerce_value()` converts `True` / `False` to `1` / `0` for `int` fields. `isinstance(True, int)` is true in Python, so bools previously passed through unconverted.
16
+
17
+ ### Added
18
+ - `--host` and `--port` options on `predikit serve`, plus matching `host` / `port` arguments on `create_mcp_server()`. The `streamable-http` transport was previously stuck on the SDK default of `127.0.0.1:8000`.
19
+ - `ToolRegistry.items()`, `.names()`, `__iter__`, and `__len__` as the public way to enumerate a registry. `create_mcp_server()` used the private `_tools` / `_ensembles` attributes; `to_openai()` and `to_langchain()` now share the same accessor.
20
+ - Python 3.13 in the CI matrix and the package classifiers.
21
+
22
+ ### Changed
23
+ - `mcp` is now a dev dependency, so the MCP integration is tested against the real SDK. The previous tests substituted a fake `FastMCP` and reported full coverage of `mcp.py` while never exercising the SDK — which is how the missing output schema shipped.
24
+ - Test coverage for `predikit serve`, which previously had none.
25
+
9
26
  ## [0.6.0] - 2026-08-03
10
27
 
11
28
  ### Added
@@ -23,89 +40,89 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
23
40
  - CI package-build verification to catch release artifacts that cannot be built.
24
41
 
25
42
  ## [0.5.1] - 2026-07-21
26
-
27
- ### Added
28
- - Test coverage for the LangChain exporter (`test_exporters_langchain.py`) — previously untested
29
- - Warning when `confidence_threshold` is set on a classifier whose model has no `predict_proba` method, mirroring the existing regressor warning
30
- - Test coverage for both `confidence_threshold` construction-time warnings (regressor, and classifier without `predict_proba`)
31
-
32
- ### Fixed
33
- - `to_langchain()` now wires up `ainvoke()` as the LangChain tool's `coroutine`, so async LangChain agents actually get async execution instead of silently falling back to sync
34
-
35
- ## [0.5.0] - 2026-07-01
36
-
37
- ### Fixed
38
- - Improved `ModelTool` input coercion for optional scalar annotations like `float | None`, `bool | None`, `int | None`, and `str | None`
39
- - Added test coverage for optional scalar string inputs to keep LLM-friendly coercion consistent across modern Pydantic schemas
40
-
41
- ### Changed
42
- - Removed generated MLflow run artifacts from source control and ignored future `mlruns/` outputs
43
- - Cleaned package metadata and CLI text to avoid Unicode dash rendering issues in terminals and package indexes
44
-
45
- ## [0.4.5] - 2026-07-01
46
-
47
- ### Fixed
48
- - Added validation for `confidence_threshold` so values outside `0.0` to `1.0` fail at construction time
49
- - Added `ModelEnsemble` validation for duplicate `collect` outputs, mismatched aggregate output names, negative weights, and zero-total weighted strategies
50
- - Added `ToolRegistry` duplicate-name validation across tools and ensembles
51
- - Updated `ToolRegistry.get()` to retrieve both tools and ensembles with clearer missing-name errors
52
- - Cleaned up example lint issues and corrected stale `modelbridge[xgboost]` install text
53
-
54
- ### Changed
55
- - Marked MLflow loader tests as opt-in integration tests so the default pytest suite stays fast and deterministic
56
-
57
- ## [0.4.4] - 2026-06-24
58
-
59
- ### Changed
60
- - README overhauled: added "Why predikit?" comparison table, "Works with" ecosystem section, GitHub star/fork badges, and a shipped-vs-planned roadmap
61
- - Quick start section replaces "30-second example" heading; `---` dividers added between major sections for better scanability
62
- - PyPI package description updated to a more descriptive one-liner
63
- - Keywords expanded: added `scikit-learn`, `tool-use`, `openai`, `langchain`, `mlops`, `ai-agents`, `pydantic`, `model-serving`
64
- - Added `Documentation` URL to `[project.urls]` in `pyproject.toml`
65
- - Added `Topic :: Software Development :: Libraries :: Python Modules` and `Typing :: Typed` classifiers
66
-
67
- ## [0.4.2] - 2026-06-13
68
-
69
- ### Changed
70
- - Redesigned PyPI/README hero: logo, centered tagline, and badges in a unified `<p align="center">` block
71
- - Tagline moved from a `##` heading to a proper descriptive paragraph
72
- - Badges converted to centered HTML `<img>` links for consistent rendering on PyPI
73
- - Quick code teaser repositioned directly below badges (before Table of Contents)
74
- - "Field naming rule" added to Table of Contents
75
- - `ainvoke()` added to `ModelTool` Core API reference table
76
- - `ModelEnsemble` Core API subsection added with constructor signature and full strategy table
77
- - Project Traffic / download badge moved to bottom of README
78
- - Development Status classifier bumped from `3 - Alpha` to `4 - Beta` in `pyproject.toml`
79
- - Removed CI test status badge from README
80
-
81
- ## [0.4.1] - 2026-06-02
82
-
83
- ### Added
84
- - `ruff` (lint + format) and `mypy` (type checking) configured in `pyproject.toml`
85
- - `.pre-commit-config.yaml` — ruff and mypy hooks run automatically before every commit
86
- - Lint CI job in GitHub Actions — runs `ruff check`, `ruff format --check`, and `mypy` on every push and PR
87
- - `CONTRIBUTING.md` — development setup, code style, and PR guidelines
88
- - `CHANGELOG.md`
89
- - `CLAUDE.md` — project context for Claude Code
90
-
91
- ### Changed
92
- - Bumped version to `0.4.1`
93
- - Added `ruff>=0.4.0`, `mypy>=1.10`, and `pre-commit>=3.0` to `[dev]` extras
94
-
95
- ## [0.4.0] - 2026-05-01
96
-
97
- ### Added
98
- - `ModelEnsemble` with `weighted_mean` and `weighted_vote` strategies
99
- - `ainvoke()` async wrapper on `ModelTool` (runs blocking predict in a thread pool)
100
- - Verbose logging via `verbose=True` on `ModelTool`
101
- - Snowflake Model Registry loader (`from_snowflake`)
102
- - MLflow Model Registry loader (`from_mlflow`)
103
- - `predikit inspect` CLI command
104
-
105
- ### Changed
106
- - Moved to `src/` layout with hatchling build backend
107
- - Upgraded Pydantic dependency to v2
108
-
109
- ## [0.3.x] and earlier
110
-
111
- See [GitHub Releases](https://github.com/Tejas-TA/predikit/releases) for earlier history.
43
+
44
+ ### Added
45
+ - Test coverage for the LangChain exporter (`test_exporters_langchain.py`) — previously untested
46
+ - Warning when `confidence_threshold` is set on a classifier whose model has no `predict_proba` method, mirroring the existing regressor warning
47
+ - Test coverage for both `confidence_threshold` construction-time warnings (regressor, and classifier without `predict_proba`)
48
+
49
+ ### Fixed
50
+ - `to_langchain()` now wires up `ainvoke()` as the LangChain tool's `coroutine`, so async LangChain agents actually get async execution instead of silently falling back to sync
51
+
52
+ ## [0.5.0] - 2026-07-01
53
+
54
+ ### Fixed
55
+ - Improved `ModelTool` input coercion for optional scalar annotations like `float | None`, `bool | None`, `int | None`, and `str | None`
56
+ - Added test coverage for optional scalar string inputs to keep LLM-friendly coercion consistent across modern Pydantic schemas
57
+
58
+ ### Changed
59
+ - Removed generated MLflow run artifacts from source control and ignored future `mlruns/` outputs
60
+ - Cleaned package metadata and CLI text to avoid Unicode dash rendering issues in terminals and package indexes
61
+
62
+ ## [0.4.5] - 2026-07-01
63
+
64
+ ### Fixed
65
+ - Added validation for `confidence_threshold` so values outside `0.0` to `1.0` fail at construction time
66
+ - Added `ModelEnsemble` validation for duplicate `collect` outputs, mismatched aggregate output names, negative weights, and zero-total weighted strategies
67
+ - Added `ToolRegistry` duplicate-name validation across tools and ensembles
68
+ - Updated `ToolRegistry.get()` to retrieve both tools and ensembles with clearer missing-name errors
69
+ - Cleaned up example lint issues and corrected stale `modelbridge[xgboost]` install text
70
+
71
+ ### Changed
72
+ - Marked MLflow loader tests as opt-in integration tests so the default pytest suite stays fast and deterministic
73
+
74
+ ## [0.4.4] - 2026-06-24
75
+
76
+ ### Changed
77
+ - README overhauled: added "Why predikit?" comparison table, "Works with" ecosystem section, GitHub star/fork badges, and a shipped-vs-planned roadmap
78
+ - Quick start section replaces "30-second example" heading; `---` dividers added between major sections for better scanability
79
+ - PyPI package description updated to a more descriptive one-liner
80
+ - Keywords expanded: added `scikit-learn`, `tool-use`, `openai`, `langchain`, `mlops`, `ai-agents`, `pydantic`, `model-serving`
81
+ - Added `Documentation` URL to `[project.urls]` in `pyproject.toml`
82
+ - Added `Topic :: Software Development :: Libraries :: Python Modules` and `Typing :: Typed` classifiers
83
+
84
+ ## [0.4.2] - 2026-06-13
85
+
86
+ ### Changed
87
+ - Redesigned PyPI/README hero: logo, centered tagline, and badges in a unified `<p align="center">` block
88
+ - Tagline moved from a `##` heading to a proper descriptive paragraph
89
+ - Badges converted to centered HTML `<img>` links for consistent rendering on PyPI
90
+ - Quick code teaser repositioned directly below badges (before Table of Contents)
91
+ - "Field naming rule" added to Table of Contents
92
+ - `ainvoke()` added to `ModelTool` Core API reference table
93
+ - `ModelEnsemble` Core API subsection added with constructor signature and full strategy table
94
+ - Project Traffic / download badge moved to bottom of README
95
+ - Development Status classifier bumped from `3 - Alpha` to `4 - Beta` in `pyproject.toml`
96
+ - Removed CI test status badge from README
97
+
98
+ ## [0.4.1] - 2026-06-02
99
+
100
+ ### Added
101
+ - `ruff` (lint + format) and `mypy` (type checking) configured in `pyproject.toml`
102
+ - `.pre-commit-config.yaml` — ruff and mypy hooks run automatically before every commit
103
+ - Lint CI job in GitHub Actions — runs `ruff check`, `ruff format --check`, and `mypy` on every push and PR
104
+ - `CONTRIBUTING.md` — development setup, code style, and PR guidelines
105
+ - `CHANGELOG.md`
106
+ - `CLAUDE.md` — project context for Claude Code
107
+
108
+ ### Changed
109
+ - Bumped version to `0.4.1`
110
+ - Added `ruff>=0.4.0`, `mypy>=1.10`, and `pre-commit>=3.0` to `[dev]` extras
111
+
112
+ ## [0.4.0] - 2026-05-01
113
+
114
+ ### Added
115
+ - `ModelEnsemble` with `weighted_mean` and `weighted_vote` strategies
116
+ - `ainvoke()` async wrapper on `ModelTool` (runs blocking predict in a thread pool)
117
+ - Verbose logging via `verbose=True` on `ModelTool`
118
+ - Snowflake Model Registry loader (`from_snowflake`)
119
+ - MLflow Model Registry loader (`from_mlflow`)
120
+ - `predikit inspect` CLI command
121
+
122
+ ### Changed
123
+ - Moved to `src/` layout with hatchling build backend
124
+ - Upgraded Pydantic dependency to v2
125
+
126
+ ## [0.3.x] and earlier
127
+
128
+ See [GitHub Releases](https://github.com/Tejas-TA/predikit/releases) for earlier history.