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.
- cli_modelarium-0.1.3/.gitattributes +39 -0
- cli_modelarium-0.1.3/.github/FUNDING.yml +1 -0
- cli_modelarium-0.1.3/.github/dependabot.yml +13 -0
- cli_modelarium-0.1.3/.github/workflows/ci.yml +60 -0
- cli_modelarium-0.1.3/.gitignore +225 -0
- cli_modelarium-0.1.3/CHANGELOG.md +149 -0
- cli_modelarium-0.1.3/CONTRIBUTING.md +76 -0
- cli_modelarium-0.1.3/LICENSE +201 -0
- cli_modelarium-0.1.3/NOTICE +102 -0
- cli_modelarium-0.1.3/PKG-INFO +764 -0
- cli_modelarium-0.1.3/README.de.md +361 -0
- cli_modelarium-0.1.3/README.es.md +361 -0
- cli_modelarium-0.1.3/README.fr.md +361 -0
- cli_modelarium-0.1.3/README.it.md +361 -0
- cli_modelarium-0.1.3/README.ja.md +361 -0
- cli_modelarium-0.1.3/README.ko.md +361 -0
- cli_modelarium-0.1.3/README.md +521 -0
- cli_modelarium-0.1.3/README.pt.md +361 -0
- cli_modelarium-0.1.3/README.zh.md +361 -0
- cli_modelarium-0.1.3/SECURITY.md +44 -0
- cli_modelarium-0.1.3/docs/assets/cli-modelarium-wordmark-dark.svg +16 -0
- cli_modelarium-0.1.3/docs/assets/cli-modelarium-wordmark-light.svg +16 -0
- cli_modelarium-0.1.3/examples/README.md +61 -0
- cli_modelarium-0.1.3/examples/basic_comparison.sh +9 -0
- cli_modelarium-0.1.3/examples/batch_evaluation.json +36 -0
- cli_modelarium-0.1.3/examples/ci_eval_suite.json +28 -0
- cli_modelarium-0.1.3/examples/expected_facts_example.txt +7 -0
- cli_modelarium-0.1.3/examples/github_actions_workflow.yml +41 -0
- cli_modelarium-0.1.3/examples/hallucination_test.json +14 -0
- cli_modelarium-0.1.3/examples/mcnemar_hallucination.sh +23 -0
- cli_modelarium-0.1.3/examples/publication_grade_eval.sh +24 -0
- cli_modelarium-0.1.3/examples/reproducibility_analysis.sh +14 -0
- cli_modelarium-0.1.3/examples/statistical_significance.sh +18 -0
- cli_modelarium-0.1.3/pyproject.toml +85 -0
- cli_modelarium-0.1.3/src/cli_modelarium/__init__.py +6 -0
- cli_modelarium-0.1.3/src/cli_modelarium/__main__.py +8 -0
- cli_modelarium-0.1.3/src/cli_modelarium/assertions.py +596 -0
- cli_modelarium-0.1.3/src/cli_modelarium/banner.py +96 -0
- cli_modelarium-0.1.3/src/cli_modelarium/batch.py +425 -0
- cli_modelarium-0.1.3/src/cli_modelarium/cli.py +2577 -0
- cli_modelarium-0.1.3/src/cli_modelarium/exceptions.py +88 -0
- cli_modelarium-0.1.3/src/cli_modelarium/hallucination.py +384 -0
- cli_modelarium-0.1.3/src/cli_modelarium/io_safety.py +112 -0
- cli_modelarium-0.1.3/src/cli_modelarium/judging.py +469 -0
- cli_modelarium-0.1.3/src/cli_modelarium/models_registry.py +138 -0
- cli_modelarium-0.1.3/src/cli_modelarium/output_formatters.py +1108 -0
- cli_modelarium-0.1.3/src/cli_modelarium/pricing.py +199 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/__init__.py +7 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/_utils.py +26 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/anthropic_provider.py +148 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/base.py +87 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/deepseek_provider.py +15 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/google_provider.py +135 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/groq_provider.py +15 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/local_provider.py +94 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/mistral_provider.py +172 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/openai_provider.py +163 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/openrouter_provider.py +33 -0
- cli_modelarium-0.1.3/src/cli_modelarium/providers/xai_provider.py +15 -0
- cli_modelarium-0.1.3/src/cli_modelarium/run_statistics.py +1202 -0
- cli_modelarium-0.1.3/src/cli_modelarium/security.py +202 -0
- cli_modelarium-0.1.3/src/cli_modelarium/streaming.py +416 -0
- cli_modelarium-0.1.3/tests/__init__.py +1 -0
- cli_modelarium-0.1.3/tests/conftest.py +115 -0
- cli_modelarium-0.1.3/tests/test_anthropic_provider.py +302 -0
- cli_modelarium-0.1.3/tests/test_assertions.py +588 -0
- cli_modelarium-0.1.3/tests/test_banner.py +118 -0
- cli_modelarium-0.1.3/tests/test_batch.py +510 -0
- cli_modelarium-0.1.3/tests/test_bootstrap_ci.py +195 -0
- cli_modelarium-0.1.3/tests/test_cli_assertions.py +627 -0
- cli_modelarium-0.1.3/tests/test_cli_batch.py +459 -0
- cli_modelarium-0.1.3/tests/test_cli_compare_max_cost.py +141 -0
- cli_modelarium-0.1.3/tests/test_cli_compare_output.py +263 -0
- cli_modelarium-0.1.3/tests/test_cli_compare_output_with_hallucination.py +151 -0
- cli_modelarium-0.1.3/tests/test_cli_compare_output_with_judging.py +152 -0
- cli_modelarium-0.1.3/tests/test_cli_hallucination.py +500 -0
- cli_modelarium-0.1.3/tests/test_cli_judging.py +600 -0
- cli_modelarium-0.1.3/tests/test_cli_keys.py +68 -0
- cli_modelarium-0.1.3/tests/test_cli_runs.py +206 -0
- cli_modelarium-0.1.3/tests/test_cli_significance.py +403 -0
- cli_modelarium-0.1.3/tests/test_cli_system_prompts.py +341 -0
- cli_modelarium-0.1.3/tests/test_cli_v013.py +611 -0
- cli_modelarium-0.1.3/tests/test_compare_multi_provider.py +205 -0
- cli_modelarium-0.1.3/tests/test_documentation_files.py +176 -0
- cli_modelarium-0.1.3/tests/test_examples_run.py +79 -0
- cli_modelarium-0.1.3/tests/test_google_provider.py +251 -0
- cli_modelarium-0.1.3/tests/test_hallucination.py +474 -0
- cli_modelarium-0.1.3/tests/test_jsonschema_optional.py +142 -0
- cli_modelarium-0.1.3/tests/test_judging.py +550 -0
- cli_modelarium-0.1.3/tests/test_list_models_local.py +279 -0
- cli_modelarium-0.1.3/tests/test_local_provider.py +238 -0
- cli_modelarium-0.1.3/tests/test_mcnemar.py +111 -0
- cli_modelarium-0.1.3/tests/test_mistral_provider.py +220 -0
- cli_modelarium-0.1.3/tests/test_models_registry.py +170 -0
- cli_modelarium-0.1.3/tests/test_openai_provider.py +350 -0
- cli_modelarium-0.1.3/tests/test_output_formatters.py +330 -0
- cli_modelarium-0.1.3/tests/test_paired_tests.py +175 -0
- cli_modelarium-0.1.3/tests/test_pricing.py +162 -0
- cli_modelarium-0.1.3/tests/test_provider_inheritance.py +125 -0
- cli_modelarium-0.1.3/tests/test_run_statistics.py +248 -0
- cli_modelarium-0.1.3/tests/test_runs_cost_estimation.py +144 -0
- cli_modelarium-0.1.3/tests/test_runs_display.py +270 -0
- cli_modelarium-0.1.3/tests/test_security.py +177 -0
- cli_modelarium-0.1.3/tests/test_significance_display.py +168 -0
- cli_modelarium-0.1.3/tests/test_statistical_significance.py +416 -0
- cli_modelarium-0.1.3/tests/test_streaming.py +634 -0
- cli_modelarium-0.1.3/tests/test_streaming_runs.py +252 -0
- 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.
|