evalstand 0.0.0.dev0__py3-none-any.whl

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.
evalstand/__init__.py ADDED
@@ -0,0 +1,12 @@
1
+ """evalstand — a local-first LLM evaluation tool for Python.
2
+
3
+ Evaluating an LLM application should feel like running a test suite: write an
4
+ eval file, run a watch command, and watch results stream in with scores,
5
+ traces, token counts, and cost.
6
+
7
+ The public API is deliberately small. Keep it under 10 exported names.
8
+ """
9
+
10
+ __version__ = "0.0.0.dev0"
11
+
12
+ __all__ = ["__version__"]
evalstand/api.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.api — implemented in a later phase."""
evalstand/cache.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.cache — implemented in a later phase."""
evalstand/cli.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.cli — implemented in a later phase."""
evalstand/config.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.config — implemented in a later phase."""
evalstand/llm.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.llm — implemented in a later phase."""
@@ -0,0 +1 @@
1
+ """Migrations for the evalstand SQLite store (Phase 5)."""
evalstand/models.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.models — implemented in a later phase."""
evalstand/plugin.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.plugin — implemented in a later phase."""
File without changes
@@ -0,0 +1 @@
1
+ """evalstand.reporting.console — implemented in a later phase."""
@@ -0,0 +1 @@
1
+ """evalstand.reporting.markdown — implemented in a later phase."""
evalstand/runner.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.runner — implemented in a later phase."""
File without changes
@@ -0,0 +1 @@
1
+ """evalstand.scorers.base — implemented in Phase 4."""
@@ -0,0 +1 @@
1
+ """evalstand.scorers.fuzzy — implemented in Phase 4."""
@@ -0,0 +1 @@
1
+ """evalstand.scorers.json_field — implemented in Phase 4."""
@@ -0,0 +1 @@
1
+ """evalstand.scorers.llm — implemented in Phase 4."""
@@ -0,0 +1 @@
1
+ """evalstand.scorers.numeric — implemented in Phase 4."""
@@ -0,0 +1 @@
1
+ """evalstand.scorers.string — implemented in Phase 4."""
evalstand/storage.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.storage — implemented in a later phase."""
evalstand/tracing.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.tracing — implemented in a later phase."""
File without changes
evalstand/tui/app.py ADDED
@@ -0,0 +1 @@
1
+ """evalstand.tui.app — implemented in Phase 6."""
File without changes
@@ -0,0 +1,127 @@
1
+ Metadata-Version: 2.5
2
+ Name: evalstand
3
+ Version: 0.0.0.dev0
4
+ Summary: A local-first LLM evaluation tool for Python: write evals, run them like tests, watch results stream in.
5
+ License: MIT License
6
+
7
+ Copyright (c) 2026 evalstand contributors
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ of this software and associated documentation files (the "Software"), to deal
11
+ in the Software without restriction, including without limitation the rights
12
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included in all
17
+ copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
+ SOFTWARE.
26
+ License-File: LICENSE
27
+ Keywords: ai,eval,evaluation,llm,pytest,testing
28
+ Classifier: Development Status :: 2 - Pre-Alpha
29
+ Classifier: Intended Audience :: Developers
30
+ Classifier: License :: OSI Approved :: MIT License
31
+ Classifier: Programming Language :: Python :: 3.11
32
+ Classifier: Programming Language :: Python :: 3.12
33
+ Classifier: Programming Language :: Python :: 3.13
34
+ Classifier: Topic :: Software Development :: Testing
35
+ Requires-Python: >=3.11
36
+ Requires-Dist: litellm>=1.55
37
+ Requires-Dist: pydantic>=2.10
38
+ Requires-Dist: pytest>=8.3
39
+ Requires-Dist: rapidfuzz>=3.11
40
+ Requires-Dist: rich>=13.9
41
+ Requires-Dist: tenacity>=9.0
42
+ Requires-Dist: textual>=1.0
43
+ Requires-Dist: typer>=0.15
44
+ Requires-Dist: watchfiles>=1.0
45
+ Provides-Extra: examples
46
+ Requires-Dist: faker>=33.1; extra == 'examples'
47
+ Requires-Dist: pypdfium2>=4.30; extra == 'examples'
48
+ Requires-Dist: reportlab>=4.2; extra == 'examples'
49
+ Description-Content-Type: text/markdown
50
+
51
+ # evalstand
52
+
53
+ > **Status: in development.** Phase 0 of 7. This release is a **name
54
+ > reservation placeholder** and contains no working code. The example below
55
+ > shows the intended API, which is not implemented yet.
56
+
57
+ Evaluating an LLM application should feel like running a test suite.
58
+
59
+ `evalstand` is a local-first LLM evaluation tool for Python. You write an eval
60
+ file, run a watch command, and results stream into a live terminal UI — scores,
61
+ nested call traces, token counts, latency, and cost. Everything runs on your
62
+ machine and persists to a local SQLite database, so you can compare a run
63
+ against the one before it.
64
+
65
+ ```python
66
+ from evalstand import Case, evaluate
67
+ from evalstand.scorers import exact, levenshtein
68
+
69
+
70
+ def load_cases() -> list[Case]:
71
+ return [
72
+ Case(id="q1", input="What is the capital of France?", expected="Paris"),
73
+ Case(id="q2", input="What is 2 + 2?", expected="4"),
74
+ ]
75
+
76
+
77
+ async def answer(question: str) -> str:
78
+ resp = await llm.acall("gpt-4o-mini", [{"role": "user", "content": question}])
79
+ return resp.text
80
+
81
+
82
+ evaluate(
83
+ name="basic-qa",
84
+ cases=load_cases,
85
+ task=answer,
86
+ scorers=[exact, levenshtein],
87
+ )
88
+ ```
89
+
90
+ Save that as `qa_eval.py` and run it either way:
91
+
92
+ ```bash
93
+ evalstand run qa_eval.py # live TUI, watch mode, traces
94
+ pytest qa_eval.py # plain test runner, CI-friendly
95
+ ```
96
+
97
+ ## Why
98
+
99
+ Existing Python options are either heavyweight platforms that push you toward a
100
+ hosted service, or bare metric libraries with no runner, no persistence, and no
101
+ live feedback loop. `evalstand` is the middle: a real runner with a real UI that
102
+ stays on your machine.
103
+
104
+ ## Planned capabilities
105
+
106
+ See [PLAN.md](PLAN.md) for the full build plan and the capability checklist that
107
+ defines v1.
108
+
109
+ ## Limitations
110
+
111
+ Stated up front, and kept accurate as the project grows:
112
+
113
+ - Score differences between runs are reported as plain deltas. There is **no
114
+ statistical significance testing** in v1, so a delta is not evidence of a real
115
+ regression or improvement.
116
+ - LLM-as-judge scorers are **unvalidated** — they have not been calibrated
117
+ against human labels.
118
+
119
+ ## Licence
120
+
121
+ MIT. See [LICENSE](LICENSE).
122
+
123
+ ---
124
+
125
+ <sub>Inspired by [evalite](https://github.com/mattpocock/evalite) (MIT), which
126
+ showed that local LLM evals could feel like running tests. `evalstand` is an
127
+ independent Python implementation.</sub>
@@ -0,0 +1,30 @@
1
+ evalstand/__init__.py,sha256=bkTRSFI2lelAlq5XqN9RnM38tEsPM0iK5JRDytSt7q0,378
2
+ evalstand/api.py,sha256=bfvKl_Yv1ET9XFQ7Zlu6UB7CIF7elm0tlEt0WaiYRS0,54
3
+ evalstand/cache.py,sha256=7E7d8XKpeDNldtAkt59jAaJqwotZEgLp3WHU52nne-c,56
4
+ evalstand/cli.py,sha256=CQpWMVDlJ8BbAN4xarhyvIEnKYG2Ux9sLEqOsSH65xE,54
5
+ evalstand/config.py,sha256=w9vGoRmh4lBEN06mJ8G_TtAtc7lw-cwRuWHbl3PXnBY,57
6
+ evalstand/llm.py,sha256=94gbGTn9ryRY1dVM30vbVESvTls-fmlgQiMgl5h3A1M,54
7
+ evalstand/models.py,sha256=4d3w324Wk_SzMK06qUBMsZbN5m6cXDOdZZ1Nmp4Df60,57
8
+ evalstand/plugin.py,sha256=Q72BYBOzIgHMDx12ydfcpgPsV3ol_IAMQsvXmYkSUkI,57
9
+ evalstand/runner.py,sha256=-3Yq0JPtl9TvGuqWLfsrO7AnE7a1VS5JpadMhz518U8,57
10
+ evalstand/storage.py,sha256=Tfi2n_RqVHl06SjO7fwEULu6zNilEavvngIc9QViRak,58
11
+ evalstand/tracing.py,sha256=GzF9ZtsQgIlx1zGek7arRmphcBDAAKZsOc-v3i2bIvY,58
12
+ evalstand/migrations/__init__.py,sha256=I4F4NdLke4ao7fIAMAGZtOEhEmhrTG6QfMRKLmlorn4,59
13
+ evalstand/reporting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ evalstand/reporting/console.py,sha256=ShXMSLUo28EwiK1tKkGbF-ZVDr2E1KpdG0fmcJbJKVg,68
15
+ evalstand/reporting/markdown.py,sha256=1sSxI6H-gNByDaRGIGl3os3klT6lxIbpFjBACqlUk4U,69
16
+ evalstand/scorers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ evalstand/scorers/base.py,sha256=vJCzRx74ZPoNJnb4HI3KskhJUF2oDdF20RXrvi6PF-g,57
18
+ evalstand/scorers/fuzzy.py,sha256=WQfE0L6aa_DJJFCGbyio4PDSgSGwAq3RI7eCcPATP9Q,58
19
+ evalstand/scorers/json_field.py,sha256=tlt8mAbtsG_4VWUDw7vyruiJCaToahtTWz7PDK8d5uM,63
20
+ evalstand/scorers/llm.py,sha256=tRAmy-QwpkuljZ6NAp4kPy2SUOlysS0NTcJFfjdXdM8,56
21
+ evalstand/scorers/numeric.py,sha256=OUfFaxCDWs53nUy-ouSQCCJvlAqZTfZ3vS339NhP8Mw,60
22
+ evalstand/scorers/string.py,sha256=9O3gtvUCoODWiLTVGVtxkWA03dvUaxAo_iGUiKmqBes,59
23
+ evalstand/tui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ evalstand/tui/app.py,sha256=VD7dBE72hsO6r5YwWS9sXGz1iiMbqQgaINujf-Jqg3Q,52
25
+ evalstand/tui/widgets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ evalstand-0.0.0.dev0.dist-info/METADATA,sha256=l12I9HKSiO5JkkubEbXie2MjOlHBnq8HcOq89HnqInk,4697
27
+ evalstand-0.0.0.dev0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
28
+ evalstand-0.0.0.dev0.dist-info/entry_points.txt,sha256=03shVFLd5RaIlU19bp3j9Kb8mo0HV4HRKybKD4UcNS4,89
29
+ evalstand-0.0.0.dev0.dist-info/licenses/LICENSE,sha256=a076uNC8pnFdDmJIjHiL2eB5bCiJG9-PsOWMicW_Ytw,1079
30
+ evalstand-0.0.0.dev0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,5 @@
1
+ [console_scripts]
2
+ evalstand = evalstand.cli:app
3
+
4
+ [pytest11]
5
+ evalstand = evalstand.plugin
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 evalstand contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.