cli-modelarium 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 (108) hide show
  1. cli_modelarium-0.1.3/.gitattributes +39 -0
  2. cli_modelarium-0.1.3/.github/FUNDING.yml +1 -0
  3. cli_modelarium-0.1.3/.github/dependabot.yml +13 -0
  4. cli_modelarium-0.1.3/.github/workflows/ci.yml +60 -0
  5. cli_modelarium-0.1.3/.gitignore +225 -0
  6. cli_modelarium-0.1.3/CHANGELOG.md +149 -0
  7. cli_modelarium-0.1.3/CONTRIBUTING.md +76 -0
  8. cli_modelarium-0.1.3/LICENSE +201 -0
  9. cli_modelarium-0.1.3/NOTICE +102 -0
  10. cli_modelarium-0.1.3/PKG-INFO +764 -0
  11. cli_modelarium-0.1.3/README.de.md +361 -0
  12. cli_modelarium-0.1.3/README.es.md +361 -0
  13. cli_modelarium-0.1.3/README.fr.md +361 -0
  14. cli_modelarium-0.1.3/README.it.md +361 -0
  15. cli_modelarium-0.1.3/README.ja.md +361 -0
  16. cli_modelarium-0.1.3/README.ko.md +361 -0
  17. cli_modelarium-0.1.3/README.md +521 -0
  18. cli_modelarium-0.1.3/README.pt.md +361 -0
  19. cli_modelarium-0.1.3/README.zh.md +361 -0
  20. cli_modelarium-0.1.3/SECURITY.md +44 -0
  21. cli_modelarium-0.1.3/docs/assets/cli-modelarium-wordmark-dark.svg +16 -0
  22. cli_modelarium-0.1.3/docs/assets/cli-modelarium-wordmark-light.svg +16 -0
  23. cli_modelarium-0.1.3/examples/README.md +61 -0
  24. cli_modelarium-0.1.3/examples/basic_comparison.sh +9 -0
  25. cli_modelarium-0.1.3/examples/batch_evaluation.json +36 -0
  26. cli_modelarium-0.1.3/examples/ci_eval_suite.json +28 -0
  27. cli_modelarium-0.1.3/examples/expected_facts_example.txt +7 -0
  28. cli_modelarium-0.1.3/examples/github_actions_workflow.yml +41 -0
  29. cli_modelarium-0.1.3/examples/hallucination_test.json +14 -0
  30. cli_modelarium-0.1.3/examples/mcnemar_hallucination.sh +23 -0
  31. cli_modelarium-0.1.3/examples/publication_grade_eval.sh +24 -0
  32. cli_modelarium-0.1.3/examples/reproducibility_analysis.sh +14 -0
  33. cli_modelarium-0.1.3/examples/statistical_significance.sh +18 -0
  34. cli_modelarium-0.1.3/pyproject.toml +85 -0
  35. cli_modelarium-0.1.3/src/cli_modelarium/__init__.py +6 -0
  36. cli_modelarium-0.1.3/src/cli_modelarium/__main__.py +8 -0
  37. cli_modelarium-0.1.3/src/cli_modelarium/assertions.py +596 -0
  38. cli_modelarium-0.1.3/src/cli_modelarium/banner.py +96 -0
  39. cli_modelarium-0.1.3/src/cli_modelarium/batch.py +425 -0
  40. cli_modelarium-0.1.3/src/cli_modelarium/cli.py +2577 -0
  41. cli_modelarium-0.1.3/src/cli_modelarium/exceptions.py +88 -0
  42. cli_modelarium-0.1.3/src/cli_modelarium/hallucination.py +384 -0
  43. cli_modelarium-0.1.3/src/cli_modelarium/io_safety.py +112 -0
  44. cli_modelarium-0.1.3/src/cli_modelarium/judging.py +469 -0
  45. cli_modelarium-0.1.3/src/cli_modelarium/models_registry.py +138 -0
  46. cli_modelarium-0.1.3/src/cli_modelarium/output_formatters.py +1108 -0
  47. cli_modelarium-0.1.3/src/cli_modelarium/pricing.py +199 -0
  48. cli_modelarium-0.1.3/src/cli_modelarium/providers/__init__.py +7 -0
  49. cli_modelarium-0.1.3/src/cli_modelarium/providers/_utils.py +26 -0
  50. cli_modelarium-0.1.3/src/cli_modelarium/providers/anthropic_provider.py +148 -0
  51. cli_modelarium-0.1.3/src/cli_modelarium/providers/base.py +87 -0
  52. cli_modelarium-0.1.3/src/cli_modelarium/providers/deepseek_provider.py +15 -0
  53. cli_modelarium-0.1.3/src/cli_modelarium/providers/google_provider.py +135 -0
  54. cli_modelarium-0.1.3/src/cli_modelarium/providers/groq_provider.py +15 -0
  55. cli_modelarium-0.1.3/src/cli_modelarium/providers/local_provider.py +94 -0
  56. cli_modelarium-0.1.3/src/cli_modelarium/providers/mistral_provider.py +172 -0
  57. cli_modelarium-0.1.3/src/cli_modelarium/providers/openai_provider.py +163 -0
  58. cli_modelarium-0.1.3/src/cli_modelarium/providers/openrouter_provider.py +33 -0
  59. cli_modelarium-0.1.3/src/cli_modelarium/providers/xai_provider.py +15 -0
  60. cli_modelarium-0.1.3/src/cli_modelarium/run_statistics.py +1202 -0
  61. cli_modelarium-0.1.3/src/cli_modelarium/security.py +202 -0
  62. cli_modelarium-0.1.3/src/cli_modelarium/streaming.py +416 -0
  63. cli_modelarium-0.1.3/tests/__init__.py +1 -0
  64. cli_modelarium-0.1.3/tests/conftest.py +115 -0
  65. cli_modelarium-0.1.3/tests/test_anthropic_provider.py +302 -0
  66. cli_modelarium-0.1.3/tests/test_assertions.py +588 -0
  67. cli_modelarium-0.1.3/tests/test_banner.py +118 -0
  68. cli_modelarium-0.1.3/tests/test_batch.py +510 -0
  69. cli_modelarium-0.1.3/tests/test_bootstrap_ci.py +195 -0
  70. cli_modelarium-0.1.3/tests/test_cli_assertions.py +627 -0
  71. cli_modelarium-0.1.3/tests/test_cli_batch.py +459 -0
  72. cli_modelarium-0.1.3/tests/test_cli_compare_max_cost.py +141 -0
  73. cli_modelarium-0.1.3/tests/test_cli_compare_output.py +263 -0
  74. cli_modelarium-0.1.3/tests/test_cli_compare_output_with_hallucination.py +151 -0
  75. cli_modelarium-0.1.3/tests/test_cli_compare_output_with_judging.py +152 -0
  76. cli_modelarium-0.1.3/tests/test_cli_hallucination.py +500 -0
  77. cli_modelarium-0.1.3/tests/test_cli_judging.py +600 -0
  78. cli_modelarium-0.1.3/tests/test_cli_keys.py +68 -0
  79. cli_modelarium-0.1.3/tests/test_cli_runs.py +206 -0
  80. cli_modelarium-0.1.3/tests/test_cli_significance.py +403 -0
  81. cli_modelarium-0.1.3/tests/test_cli_system_prompts.py +341 -0
  82. cli_modelarium-0.1.3/tests/test_cli_v013.py +611 -0
  83. cli_modelarium-0.1.3/tests/test_compare_multi_provider.py +205 -0
  84. cli_modelarium-0.1.3/tests/test_documentation_files.py +176 -0
  85. cli_modelarium-0.1.3/tests/test_examples_run.py +79 -0
  86. cli_modelarium-0.1.3/tests/test_google_provider.py +251 -0
  87. cli_modelarium-0.1.3/tests/test_hallucination.py +474 -0
  88. cli_modelarium-0.1.3/tests/test_jsonschema_optional.py +142 -0
  89. cli_modelarium-0.1.3/tests/test_judging.py +550 -0
  90. cli_modelarium-0.1.3/tests/test_list_models_local.py +279 -0
  91. cli_modelarium-0.1.3/tests/test_local_provider.py +238 -0
  92. cli_modelarium-0.1.3/tests/test_mcnemar.py +111 -0
  93. cli_modelarium-0.1.3/tests/test_mistral_provider.py +220 -0
  94. cli_modelarium-0.1.3/tests/test_models_registry.py +170 -0
  95. cli_modelarium-0.1.3/tests/test_openai_provider.py +350 -0
  96. cli_modelarium-0.1.3/tests/test_output_formatters.py +330 -0
  97. cli_modelarium-0.1.3/tests/test_paired_tests.py +175 -0
  98. cli_modelarium-0.1.3/tests/test_pricing.py +162 -0
  99. cli_modelarium-0.1.3/tests/test_provider_inheritance.py +125 -0
  100. cli_modelarium-0.1.3/tests/test_run_statistics.py +248 -0
  101. cli_modelarium-0.1.3/tests/test_runs_cost_estimation.py +144 -0
  102. cli_modelarium-0.1.3/tests/test_runs_display.py +270 -0
  103. cli_modelarium-0.1.3/tests/test_security.py +177 -0
  104. cli_modelarium-0.1.3/tests/test_significance_display.py +168 -0
  105. cli_modelarium-0.1.3/tests/test_statistical_significance.py +416 -0
  106. cli_modelarium-0.1.3/tests/test_streaming.py +634 -0
  107. cli_modelarium-0.1.3/tests/test_streaming_runs.py +252 -0
  108. cli_modelarium-0.1.3/tests/test_system_prompts.py +174 -0
@@ -0,0 +1,39 @@
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto eol=lf
3
+
4
+ # Explicitly declare text files
5
+ *.py text eol=lf
6
+ *.pyi text eol=lf
7
+ *.md text eol=lf
8
+ *.toml text eol=lf
9
+ *.cfg text eol=lf
10
+ *.ini text eol=lf
11
+ *.yml text eol=lf
12
+ *.yaml text eol=lf
13
+ *.json text eol=lf
14
+ *.txt text eol=lf
15
+ *.csv text eol=lf
16
+ *.sh text eol=lf
17
+ *.bash text eol=lf
18
+ *.gitignore text eol=lf
19
+ *.gitattributes text eol=lf
20
+
21
+ # Documentation
22
+ LICENSE text eol=lf
23
+ NOTICE text eol=lf
24
+ README* text eol=lf
25
+ CHANGELOG* text eol=lf
26
+ CONTRIBUTING* text eol=lf
27
+ SECURITY* text eol=lf
28
+
29
+ # Declare binary files (no line ending conversion)
30
+ *.png binary
31
+ *.jpg binary
32
+ *.jpeg binary
33
+ *.gif binary
34
+ *.ico binary
35
+ *.svg binary
36
+ *.pdf binary
37
+ *.zip binary
38
+ *.tar.gz binary
39
+ *.whl binary
@@ -0,0 +1 @@
1
+ github: [lavellehatcherjr]
@@ -0,0 +1,13 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ open-pull-requests-limit: 5
8
+
9
+ - package-ecosystem: "github-actions"
10
+ directory: "/"
11
+ schedule:
12
+ interval: "weekly"
13
+ open-pull-requests-limit: 5
@@ -0,0 +1,60 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ concurrency:
11
+ group: ${{ github.workflow }}-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ jobs:
15
+ test:
16
+ name: Test (${{ matrix.os }}, Python ${{ matrix.python-version }})
17
+ runs-on: ${{ matrix.os }}
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ os: [ubuntu-latest, macos-latest, windows-latest]
22
+ python-version: ["3.11", "3.12", "3.13"]
23
+ steps:
24
+ - name: Checkout
25
+ uses: actions/checkout@v6
26
+
27
+ - name: Set up Python ${{ matrix.python-version }}
28
+ uses: actions/setup-python@v6
29
+ with:
30
+ python-version: ${{ matrix.python-version }}
31
+ cache: 'pip'
32
+
33
+ - name: Install dependencies
34
+ run: |
35
+ python -m pip install --upgrade pip
36
+ pip install -e ".[dev,schema]"
37
+
38
+ - name: Run tests
39
+ run: python -m pytest tests/ -v
40
+
41
+ lint:
42
+ name: Lint (ruff)
43
+ runs-on: ubuntu-latest
44
+ steps:
45
+ - name: Checkout
46
+ uses: actions/checkout@v6
47
+
48
+ - name: Set up Python
49
+ uses: actions/setup-python@v6
50
+ with:
51
+ python-version: "3.13"
52
+ cache: 'pip'
53
+
54
+ - name: Install dependencies
55
+ run: |
56
+ python -m pip install --upgrade pip
57
+ pip install -e ".[dev,schema]"
58
+
59
+ - name: Run ruff
60
+ run: ruff check .
@@ -0,0 +1,225 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ # Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ # poetry.lock
109
+ # poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ # pdm.lock
116
+ # pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ # pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # Redis
135
+ *.rdb
136
+ *.aof
137
+ *.pid
138
+
139
+ # RabbitMQ
140
+ mnesia/
141
+ rabbitmq/
142
+ rabbitmq-data/
143
+
144
+ # ActiveMQ
145
+ activemq-data/
146
+
147
+ # SageMath parsed files
148
+ *.sage.py
149
+
150
+ # Environments
151
+ .env
152
+ .envrc
153
+ .venv
154
+ env/
155
+ venv/
156
+ ENV/
157
+ env.bak/
158
+ venv.bak/
159
+
160
+ # Spyder project settings
161
+ .spyderproject
162
+ .spyproject
163
+
164
+ # Rope project settings
165
+ .ropeproject
166
+
167
+ # mkdocs documentation
168
+ /site
169
+
170
+ # mypy
171
+ .mypy_cache/
172
+ .dmypy.json
173
+ dmypy.json
174
+
175
+ # Pyre type checker
176
+ .pyre/
177
+
178
+ # pytype static type analyzer
179
+ .pytype/
180
+
181
+ # Cython debug symbols
182
+ cython_debug/
183
+
184
+ # PyCharm
185
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
186
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
187
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
188
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
189
+ .idea/
190
+
191
+ # Abstra
192
+ # Abstra is an AI-powered process automation framework.
193
+ # Ignore directories containing user credentials, local state, and settings.
194
+ # Learn more at https://abstra.io/docs
195
+ .abstra/
196
+
197
+ # Visual Studio Code
198
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
199
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
200
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
201
+ # you could uncomment the following to ignore the entire vscode folder
202
+ .vscode/
203
+ # Temporary file for partial code execution
204
+ tempCodeRunnerFile.py
205
+
206
+ # Ruff stuff:
207
+ .ruff_cache/
208
+
209
+ # PyPI configuration file
210
+ .pypirc
211
+
212
+ # Marimo
213
+ marimo/_static/
214
+ marimo/_lsp/
215
+ __marimo__/
216
+
217
+ # Streamlit
218
+ .streamlit/secrets.toml
219
+
220
+ # OS / editor junk
221
+ .DS_Store
222
+ .DS_Store?
223
+ ._*
224
+ Thumbs.db
225
+ Desktop.ini
@@ -0,0 +1,149 @@
1
+ # Changelog
2
+
3
+ All notable changes to Cli Modelarium will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [0.1.3] - 2026-05-28
8
+
9
+ ### Added
10
+
11
+ - Bootstrap confidence intervals on per-cell means via `scipy.stats.bootstrap`. Auto-enabled when `--runs > 1`.
12
+ - New CLI flags on `compare`:
13
+ - `--confidence-intervals` / `--no-confidence-intervals` (auto-enabled with `--runs > 1`)
14
+ - `--ci-level FLOAT` (default `0.95`)
15
+ - `--ci-method {bca,percentile,basic}` (default `bca` - publication-grade)
16
+ - `--bootstrap-resamples INT` (default `5000`, min `100`)
17
+ - `--bootstrap-seed INT` (required for reproducible CIs)
18
+ - New test choices on `--significance-test`:
19
+ - `paired-t` - paired t-test via `scipy.stats.ttest_rel` (more statistical power for same-prompt comparisons)
20
+ - `wilcoxon-signed` - Wilcoxon signed-rank via `scipy.stats.wilcoxon` (non-parametric paired)
21
+ - McNemar's test for paired binary outcomes. Auto-triggers when `--check-hallucination` is set with `--runs > 1` and 2+ models. Uses exact binomial test (`scipy.stats.binomtest`) for small discordant counts or Edwards continuity-corrected chi-square (`scipy.stats.chi2.sf`) for larger samples - NOT `scipy.stats.chi2_contingency` on the full 2×2 table (which would compute a test of independence, not McNemar).
22
+ - Bootstrap CIs on Cohen's d effect sizes via paired/independent bootstrap.
23
+ - `mcnemar_tests` array in JSON output when applicable.
24
+ - `methodology` block in JSON output recording bootstrap parameters, scipy version, and seed for reproducibility.
25
+ - Additive CI columns in CSV output (`latency_ms_ci_low`, `latency_ms_ci_high`, etc.) when CIs are enabled.
26
+ - Additive Markdown sections: "Bootstrap confidence intervals", "Statistical significance tests", "Binary outcome significance (McNemar)", "Statistical methodology".
27
+ - New public functions in `cli_modelarium.run_statistics`:
28
+ - `ConfidenceInterval`, `McNemarResult` dataclasses
29
+ - `bootstrap_ci()` - thin scipy wrapper with degenerate-data handling
30
+ - `paired_t_test()`, `wilcoxon_signed_rank()`
31
+ - `mcnemar_test()` - Edwards-corrected or exact binomial McNemar
32
+ - `compute_significance_with_ci()` - like `compute_pairwise_significance` plus CIs on Cohen's d
33
+ - `compute_stats_with_cis()` - CIs on per-model metric means
34
+ - `compute_mcnemar_pairwise()` - pairwise McNemar over hallucination pass/fail
35
+ - New private helpers ensuring paired tests align by `run_index` even when failures are asymmetric:
36
+ - `_extract_paired_metric_samples()`
37
+ - `_align_paired_samples()`
38
+
39
+ ### Changed
40
+
41
+ - `SignificanceResult` dataclass extended with seven optional fields (all default `None`): `bootstrap_ci_low`, `bootstrap_ci_high`, `bootstrap_method`, `bootstrap_resamples`, `bootstrap_seed`, `effect_size_ci_low`, `effect_size_ci_high`. v0.1.2-style positional instantiation continues to work unchanged.
42
+ - Output formatters extended so CSV, Markdown, and JSON all receive significance, CI, McNemar, and methodology data (previously only JSON received significance results - a v0.1.2 wiring gap).
43
+ - `_emit_batch_results` threads the new parameters into every formatter branch.
44
+
45
+ ### Dependencies
46
+
47
+ - No new runtime dependencies (uses scipy 1.17 already in v0.1.2).
48
+ - `NOTICE` unchanged - scipy is already attributed.
49
+ - Python version unchanged (still `>=3.11` from v0.1.2).
50
+
51
+ ## [0.1.2] - 2026-05-28
52
+
53
+ ### ⚠️ Breaking Changes
54
+
55
+ - **Minimum Python version is now 3.11** (was 3.10).
56
+ - Reason: scipy 1.17+ is a new runtime dependency for statistical significance testing, and scipy 1.17 requires Python 3.11+.
57
+ - Python 3.10 users can continue using cli-modelarium v0.1.1, which remains available on PyPI.
58
+ - Python 3.10 reaches end-of-life in October 2026.
59
+
60
+ ### Added
61
+
62
+ - Pairwise statistical significance testing on the `compare` command. Auto-enabled when `--runs > 1` with 2+ models.
63
+ - New CLI flags on `compare`:
64
+ - `--significance` / `--no-significance` (auto-enabled with `--runs > 1` and 2+ models)
65
+ - `--significance-threshold FLOAT` (default: `0.05`)
66
+ - `--significance-test {welch,mann-whitney}` (default: `welch`)
67
+ - `--correction {none,bonferroni,holm}` (default: `bonferroni`)
68
+ - `--significance-metric {score,latency_ms,output_tokens,cost_usd}` (default: `score` when judging, else `latency_ms`)
69
+ - Welch's t-test via `scipy.stats.ttest_ind(equal_var=False)`.
70
+ - Mann-Whitney U test via `scipy.stats.mannwhitneyu` with continuity correction.
71
+ - Cohen's d effect size with conventional interpretation bands (`negligible` / `small` / `medium` / `large`), implemented in pure stdlib.
72
+ - Bonferroni and Holm-Bonferroni multiple-comparison corrections, implemented in pure stdlib with monotone enforcement.
73
+ - JSON output now includes a `significance_tests` array when significance testing was performed. When significance is disabled or trivially absent, the JSON schema is unchanged (additive only).
74
+ - Display strategy: single-line summary for 2 models, matrix table for 3-5 models, top-K significant pairs for 6+ models (full matrix available in JSON).
75
+ - New functions in `cli_modelarium.run_statistics`:
76
+ - `SignificanceResult` dataclass
77
+ - `compute_pairwise_significance()`
78
+ - `welch_t_test()`, `mann_whitney_u_test()`
79
+ - `cohens_d()`, `cohens_d_interpretation()`
80
+ - `bonferroni_correct()`, `holm_correct()`
81
+
82
+ ### Changed
83
+
84
+ - `pyproject.toml`: `requires-python` bumped to `>=3.11`.
85
+ - `pyproject.toml`: classifiers updated - removed Python 3.10, added 3.13 and 3.14.
86
+ - `pyproject.toml`: `[tool.ruff].target-version` bumped to `py311`.
87
+ - `NOTICE`: added attributions for scipy, numpy, and the bundled native libraries (OpenBLAS, LAPACK, libquadmath).
88
+ - README: new "System Requirements" section and statistical-significance documentation.
89
+
90
+ ### Fixed
91
+
92
+ - Resolved a latent inconsistency: `tests/test_jsonschema_optional.py` already imported `tomllib` (Python 3.11+ stdlib only) while the project declared 3.10 support. The Python bump retroactively fixes this.
93
+
94
+ ### Dependencies
95
+
96
+ - Added: `scipy>=1.17,<2.0` (pulls `numpy>=1.26.4` as a transitive dependency).
97
+
98
+ ## [0.1.1] - 2026-05-27
99
+
100
+ ### Added
101
+
102
+ - `--runs N` flag on the `compare` command for statistical reproducibility analysis. Runs each (model, temperature, system_prompt) combination N times (1-100) and displays mean/median/stdev/CV of timing and tokens, cost totals, output frequency analysis, mode output, and output diversity.
103
+ - `--show-all-runs` flag to override the auto-collapse heuristic when many concurrent display panels would be created.
104
+ - New module `src/cli_modelarium/run_statistics.py` with `RunStats` dataclass and `compute_run_stats()` function for pure-stdlib statistical analysis.
105
+ - Hallucination rate calculation when `--check-hallucination` is combined with `--runs N`. Reports "N of M runs flagged as High risk" with the aggregate hallucination rate.
106
+ - Cost warning when `--runs N` is used without `--max-cost` (helps prevent unexpected spend).
107
+
108
+ ### Changed
109
+
110
+ - `compare` command's display path branches when `runs > 1` to show statistical summary instead of per-run details. When `runs == 1` (default), behavior is byte-identical to v0.1.0.
111
+ - `run_streaming_comparison()` accepts new keyword parameters `runs: int = 1` and `show_all_runs: bool = False`. Default values preserve existing behavior.
112
+ - `StreamState` dataclass has new field `run_index: int = 0`. Default value preserves all existing test expectations.
113
+ - `BatchResult` dataclass has new field `run_index: int = 0`. Only emitted in CSV/JSON/Markdown output when the surrounding `runs` parameter > 1.
114
+ - Live streaming display auto-collapses when total concurrent tasks exceed 12 (configurable via `--show-all-runs`).
115
+ - LLM-as-judge with `--runs N`:
116
+ - Default (with `--judge` or `--judges`): mode-only judging (one judge call per cell, expanded to every run in the cell)
117
+ - With `--check-hallucination`: per-run judging (computes hallucination rate)
118
+ - JSON output schema additive when `runs > 1`: new `total_runs` and `stats_by_cell` top-level fields, plus `run_index` per result. When `runs == 1`, schema is byte-identical to v0.1.0.
119
+ - CSV output adds `run_index` column when `runs > 1`. When `runs == 1`, columns are unchanged.
120
+ - Markdown output adds a "Per-cell statistical summary" section when `runs > 1`. When `runs == 1`, output is unchanged.
121
+
122
+ ### Fixed
123
+
124
+ - N/A (no bug fixes in this release; only additions)
125
+
126
+ ## [0.1.0] - 2026-05-25
127
+
128
+ ### Added
129
+
130
+ - Initial v0.1.0 release
131
+ - 8 cloud provider integrations: OpenAI, Anthropic, Google, xAI, DeepSeek, Mistral, Groq, OpenRouter
132
+ - Local model support: Ollama, LM Studio, vLLM, llama.cpp via OpenAI-compatible API
133
+ - Parallel streaming with TTFT (Time To First Token) tracking
134
+ - Multi-prompt batch mode with CSV, JSON, and Markdown output formats
135
+ - System prompt support: single, multiple (comparison), and file-based
136
+ - LLM-as-a-judge scoring with panel mode and self-evaluation skip
137
+ - Deterministic assertions with 10 types (`contains`, `not_contains`, `regex`, `equals`, `json_valid`, `json_schema`, `min_length_chars`, `max_length_chars`, `latency_under`, `cost_under`)
138
+ - CI/CD exit codes: 0 = success, 1 = assertion failure, 2 = call failure (call failures dominate)
139
+ - Hallucination detection preset with optional reference facts and worst-wins panel aggregation
140
+ - OS-native keychain integration via `keyring`
141
+ - API key format validation for 8 providers
142
+ - Error message redaction prevents key leakage
143
+ - Localhost-only validation for local model URLs
144
+ - Cross-platform support: macOS, Windows 10+/ARM, Linux
145
+ - Rate limit handling: 429 retry with exponential backoff, 529 (Anthropic overloaded) with longer backoff
146
+ - `retry-after` header honored when present
147
+ - Per-provider semaphores for concurrent request management
148
+ - Atomic file writes for output integrity
149
+ - Apache 2.0 License with proper NOTICE attribution
@@ -0,0 +1,76 @@
1
+ # Contributing to Cli Modelarium
2
+
3
+ Thanks for your interest in Cli Modelarium - a terminal tool for
4
+ statistically rigorous LLM comparison across multiple providers.
5
+
6
+ ## Quick Links
7
+
8
+ - GitHub: https://github.com/lavellehatcherjr/cli-modelarium
9
+ - Issues: https://github.com/lavellehatcherjr/cli-modelarium/issues/new
10
+ - Maintainer: Lavelle Hatcher Jr ([@lavellehatcherjr](https://github.com/lavellehatcherjr)) - Creator & Maintainer
11
+
12
+ ## How to Contribute
13
+
14
+ Cli Modelarium is maintained by one person. I personally review and decide on
15
+ every contribution. Not everything will be merged - so for anything beyond a
16
+ small fix, please open an issue first so we can agree on the approach before
17
+ you spend time writing code. This saves your effort as much as mine.
18
+
19
+ 1. **Typos and small bug fixes** -> open a pull request directly.
20
+ 2. **New features or larger changes** -> open an issue first to discuss the
21
+ idea. Please don't send a large PR without checking in - it may not fit the
22
+ direction of the project, and I'd rather save you the work.
23
+ 3. **Refactor-only or style-only PRs** -> please don't open these unless I've
24
+ asked for them as part of a specific fix.
25
+ 4. **Questions** -> open an issue and I'll respond when I can.
26
+
27
+ Because I'm a solo maintainer, reviews can take some time. Thank you for your
28
+ patience, and thank you for helping make the project better.
29
+
30
+ ## Development Setup
31
+
32
+ Clone the repository and install it with the development extras:
33
+
34
+ ```bash
35
+ git clone https://github.com/lavellehatcherjr/cli-modelarium.git
36
+ cd cli-modelarium
37
+ python -m venv .venv
38
+ source .venv/bin/activate
39
+ pip install -e ".[dev,schema]"
40
+ ```
41
+
42
+ This requires Python 3.11 or newer.
43
+
44
+ ## Running Tests and Lint
45
+
46
+ Before opening a pull request, please run the test suite and the linter so
47
+ your change is easy to review:
48
+
49
+ ```bash
50
+ # Run the full test suite
51
+ python -m pytest tests/
52
+
53
+ # Run the linter on your changes
54
+ ruff check .
55
+ ```
56
+
57
+ All tests should pass. Please make sure your change does not add new lint
58
+ warnings. (A few pre-existing lint items are being cleaned up separately, so
59
+ don't worry about those.)
60
+
61
+ ## What Makes a Good PR
62
+
63
+ - Keep it focused - one logical change per PR.
64
+ - Include or update tests for any behavior you change.
65
+ - Match the existing code style.
66
+ - Describe what the change does and why in the PR description.
67
+
68
+ ## Security Issues
69
+
70
+ See [SECURITY.md](SECURITY.md) for reporting security vulnerabilities. Do
71
+ NOT open public issues for security problems.
72
+
73
+ ## License
74
+
75
+ By contributing, you agree that your contributions will be licensed under the
76
+ project's Apache 2.0 license.