predikit 0.6.2__tar.gz → 0.6.4__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 (54) hide show
  1. {predikit-0.6.2 → predikit-0.6.4}/.github/ISSUE_TEMPLATE/bug_report.md +38 -38
  2. {predikit-0.6.2 → predikit-0.6.4}/.github/ISSUE_TEMPLATE/feature_request.md +20 -20
  3. {predikit-0.6.2 → predikit-0.6.4}/.github/workflows/publish.yml +31 -31
  4. {predikit-0.6.2 → predikit-0.6.4}/.github/workflows/test.yml +56 -56
  5. {predikit-0.6.2 → predikit-0.6.4}/.pre-commit-config.yaml +15 -15
  6. {predikit-0.6.2 → predikit-0.6.4}/CHANGELOG.md +155 -141
  7. {predikit-0.6.2 → predikit-0.6.4}/CLAUDE.md +71 -71
  8. {predikit-0.6.2 → predikit-0.6.4}/CONTRIBUTING.md +66 -66
  9. {predikit-0.6.2 → predikit-0.6.4}/LICENSE +21 -21
  10. {predikit-0.6.2 → predikit-0.6.4}/PKG-INFO +10 -4
  11. {predikit-0.6.2 → predikit-0.6.4}/README.md +9 -3
  12. {predikit-0.6.2 → predikit-0.6.4}/examples/01_basic_sklearn.py +48 -48
  13. {predikit-0.6.2 → predikit-0.6.4}/examples/02_xgboost_regression.py +57 -57
  14. {predikit-0.6.2 → predikit-0.6.4}/examples/03_orlando_real_estate.py +127 -127
  15. {predikit-0.6.2 → predikit-0.6.4}/examples/04_confidence_routing.py +106 -106
  16. {predikit-0.6.2 → predikit-0.6.4}/examples/05_multi_model_ensemble.py +182 -182
  17. {predikit-0.6.2 → predikit-0.6.4}/examples/06_mlflow_loader.py +99 -99
  18. {predikit-0.6.2 → predikit-0.6.4}/examples/07_snowflake_loader.py +102 -102
  19. {predikit-0.6.2 → predikit-0.6.4}/pyproject.toml +98 -98
  20. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/__init__.py +16 -16
  21. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/cli.py +143 -143
  22. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/coerce.py +56 -56
  23. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/ensemble.py +121 -121
  24. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/exceptions.py +2 -2
  25. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/exporters/langchain.py +31 -31
  26. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/exporters/openai.py +22 -22
  27. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/introspect.py +20 -20
  28. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/loaders/__init__.py +4 -4
  29. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/loaders/mlflow.py +95 -95
  30. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/loaders/snowflake.py +104 -104
  31. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/registry.py +52 -52
  32. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/tool.py +206 -190
  33. {predikit-0.6.2 → predikit-0.6.4}/tests/test_cli.py +219 -219
  34. {predikit-0.6.2 → predikit-0.6.4}/tests/test_coerce.py +68 -68
  35. {predikit-0.6.2 → predikit-0.6.4}/tests/test_confidence.py +134 -134
  36. {predikit-0.6.2 → predikit-0.6.4}/tests/test_ensemble.py +189 -189
  37. {predikit-0.6.2 → predikit-0.6.4}/tests/test_exporters_openai.py +42 -42
  38. {predikit-0.6.2 → predikit-0.6.4}/tests/test_introspect.py +31 -31
  39. {predikit-0.6.2 → predikit-0.6.4}/tests/test_loaders_mlflow.py +202 -202
  40. {predikit-0.6.2 → predikit-0.6.4}/tests/test_loaders_snowflake.py +250 -250
  41. {predikit-0.6.2 → predikit-0.6.4}/tests/test_registry.py +117 -117
  42. {predikit-0.6.2 → predikit-0.6.4}/tests/test_tool.py +140 -120
  43. {predikit-0.6.2 → predikit-0.6.4}/tests/test_weighted_ensemble.py +176 -176
  44. {predikit-0.6.2 → predikit-0.6.4}/.gitattributes +0 -0
  45. {predikit-0.6.2 → predikit-0.6.4}/.gitignore +0 -0
  46. {predikit-0.6.2 → predikit-0.6.4}/docs/logo.gif +0 -0
  47. {predikit-0.6.2 → predikit-0.6.4}/docs/logo.png +0 -0
  48. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/exporters/__init__.py +0 -0
  49. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/mcp.py +0 -0
  50. {predikit-0.6.2 → predikit-0.6.4}/src/predikit/py.typed +0 -0
  51. {predikit-0.6.2 → predikit-0.6.4}/tests/__init__.py +0 -0
  52. {predikit-0.6.2 → predikit-0.6.4}/tests/test_exporters_langchain.py +0 -0
  53. {predikit-0.6.2 → predikit-0.6.4}/tests/test_logging.py +0 -0
  54. {predikit-0.6.2 → predikit-0.6.4}/tests/test_mcp.py +0 -0
@@ -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,56 +1,56 @@
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/ examples/
27
-
28
- - name: Ruff format check
29
- run: ruff format --check src/ tests/ examples/
30
-
31
- - name: Mypy
32
- run: mypy src/predikit
33
-
34
- - name: Build package
35
- run: |
36
- python -m pip install hatchling
37
- python -m hatchling build
38
-
39
- test:
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
+ 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/ examples/
27
+
28
+ - name: Ruff format check
29
+ run: ruff format --check src/ tests/ examples/
30
+
31
+ - name: Mypy
32
+ run: mypy src/predikit
33
+
34
+ - name: Build package
35
+ run: |
36
+ python -m pip install hatchling
37
+ python -m hatchling build
38
+
39
+ test:
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,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,141 +1,155 @@
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
- ## [Unreleased]
8
-
9
- ## [0.6.2] - 2026-08-22
10
-
11
- ### Added
12
- - `py.typed` marker, so type checkers actually consume the annotations. Every module is annotated and mypy-clean, and the package declares the `Typing :: Typed` classifier, but without the PEP 561 marker downstream consumers got no type information at all.
13
-
14
- ### Changed
15
- - `from_snowflake()` imports `snowflake.ml.registry` inside the function body instead of at module level, matching `from_mlflow()` and the project's own rule for optional dependencies. The module-level `Registry = None` sentinel is gone.
16
- - CI lints and format-checks `examples/` alongside `src/` and `tests/`.
17
-
18
- ### Removed
19
- - `uv.lock`. Nothing consumed it — CI installs with `pip install -e ".[dev]"` — and a library should not pin its consumers' transitive dependencies.
20
- - `.claude/settings.local.json` from version control. It holds per-developer machine paths.
21
-
22
- ## [0.6.1] - 2026-08-15
23
-
24
- ### Fixed
25
- - 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.
26
- - 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.
27
- - `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`.
28
- - `coerce_value()` converts `True` / `False` to `1` / `0` for `int` fields. `isinstance(True, int)` is true in Python, so bools previously passed through unconverted.
29
-
30
- ### Added
31
- - `--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`.
32
- - `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.
33
- - Python 3.13 in the CI matrix and the package classifiers.
34
-
35
- ### Changed
36
- - `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.
37
- - Test coverage for `predikit serve`, which previously had none.
38
-
39
- ## [0.6.0] - 2026-08-03
40
-
41
- ### Added
42
- - MCP server integration via `create_mcp_server()` and `predikit serve`.
43
- - Optional `mcp` dependency for exposing `ToolRegistry` tools to MCP-compatible clients.
44
-
45
- ## [0.5.2] - 2026-08-01
46
-
47
- ### Fixed
48
- - Repaired the development lockfile so `uv` can resolve the pinned Colorama artifact.
49
- - Added repository-wide LF line-ending normalization so Ruff formatting is stable across platforms.
50
-
51
- ### Added
52
- - Regression coverage for invalid Snowflake output methods and duplicate registry names.
53
- - CI package-build verification to catch release artifacts that cannot be built.
54
-
55
- ## [0.5.1] - 2026-07-21
56
-
57
- ### Added
58
- - Test coverage for the LangChain exporter (`test_exporters_langchain.py`) — previously untested
59
- - Warning when `confidence_threshold` is set on a classifier whose model has no `predict_proba` method, mirroring the existing regressor warning
60
- - Test coverage for both `confidence_threshold` construction-time warnings (regressor, and classifier without `predict_proba`)
61
-
62
- ### Fixed
63
- - `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
64
-
65
- ## [0.5.0] - 2026-07-01
66
-
67
- ### Fixed
68
- - Improved `ModelTool` input coercion for optional scalar annotations like `float | None`, `bool | None`, `int | None`, and `str | None`
69
- - Added test coverage for optional scalar string inputs to keep LLM-friendly coercion consistent across modern Pydantic schemas
70
-
71
- ### Changed
72
- - Removed generated MLflow run artifacts from source control and ignored future `mlruns/` outputs
73
- - Cleaned package metadata and CLI text to avoid Unicode dash rendering issues in terminals and package indexes
74
-
75
- ## [0.4.5] - 2026-07-01
76
-
77
- ### Fixed
78
- - Added validation for `confidence_threshold` so values outside `0.0` to `1.0` fail at construction time
79
- - Added `ModelEnsemble` validation for duplicate `collect` outputs, mismatched aggregate output names, negative weights, and zero-total weighted strategies
80
- - Added `ToolRegistry` duplicate-name validation across tools and ensembles
81
- - Updated `ToolRegistry.get()` to retrieve both tools and ensembles with clearer missing-name errors
82
- - Cleaned up example lint issues and corrected stale `modelbridge[xgboost]` install text
83
-
84
- ### Changed
85
- - Marked MLflow loader tests as opt-in integration tests so the default pytest suite stays fast and deterministic
86
-
87
- ## [0.4.4] - 2026-06-24
88
-
89
- ### Changed
90
- - README overhauled: added "Why predikit?" comparison table, "Works with" ecosystem section, GitHub star/fork badges, and a shipped-vs-planned roadmap
91
- - Quick start section replaces "30-second example" heading; `---` dividers added between major sections for better scanability
92
- - PyPI package description updated to a more descriptive one-liner
93
- - Keywords expanded: added `scikit-learn`, `tool-use`, `openai`, `langchain`, `mlops`, `ai-agents`, `pydantic`, `model-serving`
94
- - Added `Documentation` URL to `[project.urls]` in `pyproject.toml`
95
- - Added `Topic :: Software Development :: Libraries :: Python Modules` and `Typing :: Typed` classifiers
96
-
97
- ## [0.4.2] - 2026-06-13
98
-
99
- ### Changed
100
- - Redesigned PyPI/README hero: logo, centered tagline, and badges in a unified `<p align="center">` block
101
- - Tagline moved from a `##` heading to a proper descriptive paragraph
102
- - Badges converted to centered HTML `<img>` links for consistent rendering on PyPI
103
- - Quick code teaser repositioned directly below badges (before Table of Contents)
104
- - "Field naming rule" added to Table of Contents
105
- - `ainvoke()` added to `ModelTool` Core API reference table
106
- - `ModelEnsemble` Core API subsection added with constructor signature and full strategy table
107
- - Project Traffic / download badge moved to bottom of README
108
- - Development Status classifier bumped from `3 - Alpha` to `4 - Beta` in `pyproject.toml`
109
- - Removed CI test status badge from README
110
-
111
- ## [0.4.1] - 2026-06-02
112
-
113
- ### Added
114
- - `ruff` (lint + format) and `mypy` (type checking) configured in `pyproject.toml`
115
- - `.pre-commit-config.yaml` — ruff and mypy hooks run automatically before every commit
116
- - Lint CI job in GitHub Actions — runs `ruff check`, `ruff format --check`, and `mypy` on every push and PR
117
- - `CONTRIBUTING.md` — development setup, code style, and PR guidelines
118
- - `CHANGELOG.md`
119
- - `CLAUDE.md` — project context for Claude Code
120
-
121
- ### Changed
122
- - Bumped version to `0.4.1`
123
- - Added `ruff>=0.4.0`, `mypy>=1.10`, and `pre-commit>=3.0` to `[dev]` extras
124
-
125
- ## [0.4.0] - 2026-05-01
126
-
127
- ### Added
128
- - `ModelEnsemble` with `weighted_mean` and `weighted_vote` strategies
129
- - `ainvoke()` async wrapper on `ModelTool` (runs blocking predict in a thread pool)
130
- - Verbose logging via `verbose=True` on `ModelTool`
131
- - Snowflake Model Registry loader (`from_snowflake`)
132
- - MLflow Model Registry loader (`from_mlflow`)
133
- - `predikit inspect` CLI command
134
-
135
- ### Changed
136
- - Moved to `src/` layout with hatchling build backend
137
- - Upgraded Pydantic dependency to v2
138
-
139
- ## [0.3.x] and earlier
140
-
141
- See [GitHub Releases](https://github.com/Tejas-TA/predikit/releases) for earlier history.
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
+ ## [Unreleased]
8
+
9
+ ## [0.6.4] - 2026-10-28
10
+
11
+ ### Fixed
12
+ - Validate unnamed model feature counts when creating a `ModelTool`, producing an actionable
13
+ schema/model mismatch error before the first prediction instead of exposing an estimator error.
14
+
15
+ ## [0.6.3] - 2026-09-13
16
+
17
+ ### Fixed
18
+ - Corrected the MCP quick-start command: `predikit serve` requires both the `mcp` and `cli` extras. The MCP library API itself remains available with `predikit[mcp]` alone.
19
+
20
+ ### Changed
21
+ - Polished the README installation guidance and documented MCP HTTP host/port options.
22
+
23
+ ## [0.6.2] - 2026-08-22
24
+
25
+ ### Added
26
+ - `py.typed` marker, so type checkers actually consume the annotations. Every module is annotated and mypy-clean, and the package declares the `Typing :: Typed` classifier, but without the PEP 561 marker downstream consumers got no type information at all.
27
+
28
+ ### Changed
29
+ - `from_snowflake()` imports `snowflake.ml.registry` inside the function body instead of at module level, matching `from_mlflow()` and the project's own rule for optional dependencies. The module-level `Registry = None` sentinel is gone.
30
+ - CI lints and format-checks `examples/` alongside `src/` and `tests/`.
31
+
32
+ ### Removed
33
+ - `uv.lock`. Nothing consumed it — CI installs with `pip install -e ".[dev]"` — and a library should not pin its consumers' transitive dependencies.
34
+ - `.claude/settings.local.json` from version control. It holds per-developer machine paths.
35
+
36
+ ## [0.6.1] - 2026-08-15
37
+
38
+ ### Fixed
39
+ - 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.
40
+ - 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.
41
+ - `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`.
42
+ - `coerce_value()` converts `True` / `False` to `1` / `0` for `int` fields. `isinstance(True, int)` is true in Python, so bools previously passed through unconverted.
43
+
44
+ ### Added
45
+ - `--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`.
46
+ - `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.
47
+ - Python 3.13 in the CI matrix and the package classifiers.
48
+
49
+ ### Changed
50
+ - `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.
51
+ - Test coverage for `predikit serve`, which previously had none.
52
+
53
+ ## [0.6.0] - 2026-08-03
54
+
55
+ ### Added
56
+ - MCP server integration via `create_mcp_server()` and `predikit serve`.
57
+ - Optional `mcp` dependency for exposing `ToolRegistry` tools to MCP-compatible clients.
58
+
59
+ ## [0.5.2] - 2026-08-01
60
+
61
+ ### Fixed
62
+ - Repaired the development lockfile so `uv` can resolve the pinned Colorama artifact.
63
+ - Added repository-wide LF line-ending normalization so Ruff formatting is stable across platforms.
64
+
65
+ ### Added
66
+ - Regression coverage for invalid Snowflake output methods and duplicate registry names.
67
+ - CI package-build verification to catch release artifacts that cannot be built.
68
+
69
+ ## [0.5.1] - 2026-07-21
70
+
71
+ ### Added
72
+ - Test coverage for the LangChain exporter (`test_exporters_langchain.py`) — previously untested
73
+ - Warning when `confidence_threshold` is set on a classifier whose model has no `predict_proba` method, mirroring the existing regressor warning
74
+ - Test coverage for both `confidence_threshold` construction-time warnings (regressor, and classifier without `predict_proba`)
75
+
76
+ ### Fixed
77
+ - `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
78
+
79
+ ## [0.5.0] - 2026-07-01
80
+
81
+ ### Fixed
82
+ - Improved `ModelTool` input coercion for optional scalar annotations like `float | None`, `bool | None`, `int | None`, and `str | None`
83
+ - Added test coverage for optional scalar string inputs to keep LLM-friendly coercion consistent across modern Pydantic schemas
84
+
85
+ ### Changed
86
+ - Removed generated MLflow run artifacts from source control and ignored future `mlruns/` outputs
87
+ - Cleaned package metadata and CLI text to avoid Unicode dash rendering issues in terminals and package indexes
88
+
89
+ ## [0.4.5] - 2026-07-01
90
+
91
+ ### Fixed
92
+ - Added validation for `confidence_threshold` so values outside `0.0` to `1.0` fail at construction time
93
+ - Added `ModelEnsemble` validation for duplicate `collect` outputs, mismatched aggregate output names, negative weights, and zero-total weighted strategies
94
+ - Added `ToolRegistry` duplicate-name validation across tools and ensembles
95
+ - Updated `ToolRegistry.get()` to retrieve both tools and ensembles with clearer missing-name errors
96
+ - Cleaned up example lint issues and corrected stale `modelbridge[xgboost]` install text
97
+
98
+ ### Changed
99
+ - Marked MLflow loader tests as opt-in integration tests so the default pytest suite stays fast and deterministic
100
+
101
+ ## [0.4.4] - 2026-06-24
102
+
103
+ ### Changed
104
+ - README overhauled: added "Why predikit?" comparison table, "Works with" ecosystem section, GitHub star/fork badges, and a shipped-vs-planned roadmap
105
+ - Quick start section replaces "30-second example" heading; `---` dividers added between major sections for better scanability
106
+ - PyPI package description updated to a more descriptive one-liner
107
+ - Keywords expanded: added `scikit-learn`, `tool-use`, `openai`, `langchain`, `mlops`, `ai-agents`, `pydantic`, `model-serving`
108
+ - Added `Documentation` URL to `[project.urls]` in `pyproject.toml`
109
+ - Added `Topic :: Software Development :: Libraries :: Python Modules` and `Typing :: Typed` classifiers
110
+
111
+ ## [0.4.2] - 2026-06-13
112
+
113
+ ### Changed
114
+ - Redesigned PyPI/README hero: logo, centered tagline, and badges in a unified `<p align="center">` block
115
+ - Tagline moved from a `##` heading to a proper descriptive paragraph
116
+ - Badges converted to centered HTML `<img>` links for consistent rendering on PyPI
117
+ - Quick code teaser repositioned directly below badges (before Table of Contents)
118
+ - "Field naming rule" added to Table of Contents
119
+ - `ainvoke()` added to `ModelTool` Core API reference table
120
+ - `ModelEnsemble` Core API subsection added with constructor signature and full strategy table
121
+ - Project Traffic / download badge moved to bottom of README
122
+ - Development Status classifier bumped from `3 - Alpha` to `4 - Beta` in `pyproject.toml`
123
+ - Removed CI test status badge from README
124
+
125
+ ## [0.4.1] - 2026-06-02
126
+
127
+ ### Added
128
+ - `ruff` (lint + format) and `mypy` (type checking) configured in `pyproject.toml`
129
+ - `.pre-commit-config.yaml` — ruff and mypy hooks run automatically before every commit
130
+ - Lint CI job in GitHub Actions — runs `ruff check`, `ruff format --check`, and `mypy` on every push and PR
131
+ - `CONTRIBUTING.md` — development setup, code style, and PR guidelines
132
+ - `CHANGELOG.md`
133
+ - `CLAUDE.md` — project context for Claude Code
134
+
135
+ ### Changed
136
+ - Bumped version to `0.4.1`
137
+ - Added `ruff>=0.4.0`, `mypy>=1.10`, and `pre-commit>=3.0` to `[dev]` extras
138
+
139
+ ## [0.4.0] - 2026-05-01
140
+
141
+ ### Added
142
+ - `ModelEnsemble` with `weighted_mean` and `weighted_vote` strategies
143
+ - `ainvoke()` async wrapper on `ModelTool` (runs blocking predict in a thread pool)
144
+ - Verbose logging via `verbose=True` on `ModelTool`
145
+ - Snowflake Model Registry loader (`from_snowflake`)
146
+ - MLflow Model Registry loader (`from_mlflow`)
147
+ - `predikit inspect` CLI command
148
+
149
+ ### Changed
150
+ - Moved to `src/` layout with hatchling build backend
151
+ - Upgraded Pydantic dependency to v2
152
+
153
+ ## [0.3.x] and earlier
154
+
155
+ See [GitHub Releases](https://github.com/Tejas-TA/predikit/releases) for earlier history.