tuieval 0.2.0.dev98__tar.gz → 0.2.0.dev99__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.
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/CHANGELOG.md +1 -1
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/PKG-INFO +1 -1
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/models.md +1 -1
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/_version.py +2 -2
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/pta.py +5 -5
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/tests/test_tuieval.py +5 -5
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/.gitignore +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/LICENSE +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/README.md +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/RELEASING.md +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/README.md +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/favicon.ico +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/readme-header.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/social-preview.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-1024.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-128.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-16.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-16.svg +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-256.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-32.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-48.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-512.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-64.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon-animated.svg +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/brand/tuieval-icon.svg +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/tui-answer-reasoning.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/tui-run-reasoning.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/images/tui-setup.png +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/docs/writing-packs.md +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/pyproject.toml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/__init__.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/__main__.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/builtin.toml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/cli.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/client.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/compare.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/doctor.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/engine.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/export.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/graders/__init__.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/graders/answer.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/graders/code.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/graders/rag.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/graders/reply.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/graders/tool_call.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/insights.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/logs.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/machines.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/onboard.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/packs.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/profiles.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/remove.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/run_evals.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/scaffold.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/selftest.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/models.toml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/answer/pack.toml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/answer/system.txt +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/answer/tests.yaml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/code/pack.toml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/code/system.txt +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/code/tests.yaml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/rag/pack.toml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/rag/system.txt +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/rag/tests.yaml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/reply/pack.toml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/reply/system.txt +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/reply/tests.yaml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/tool_call/pack.toml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/tool_call/system.txt +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/tool_call/tests.yaml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/tool_call/tools.yaml +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/tui.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/tune.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/verdict.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/watch_proxy.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/workspace.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/yamlout.py +0 -0
- {tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/tests/mock_server.py +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
5
|
- Results, Per question: the model summary shows every picked model without scrolling, and fits the window: shorter column names, and long model names cut in the middle (both ends kept). The PTA index table fits the same way.
|
|
6
|
-
- PTA index: the accuracy bar shows answers cut off at max_tokens in orange, with
|
|
6
|
+
- PTA index: the accuracy bar shows answers cut off at max_tokens in orange, with `(n% truncated)` beside it and a **truncated** column in the table, so overthinking stands apart from wrong answers.
|
|
7
7
|
- Results → Insights (also `tuieval insights`): charts with what to do next: every model against a reference (95% CI), the best model per use case, fine-tunes against their base (`base` in models.toml), why models fail, accuracy against tokens or time, question health, and the Certify runs that would settle the strongest models' verdicts. `[defaults] reference` sets the default reference.
|
|
8
8
|
- A server that stops sending tokens mid-answer for 5 minutes (`stall_timeout_ms`) is a server error: retried, never counted against the model. Keep-alive pings no longer stretch a request past `request_timeout_ms`.
|
|
9
9
|
- The run screen's queue shows what each running model is doing: waiting, thinking or answering with ~tokens so far, and how long it's been quiet, so a model you aren't streaming doesn't look stuck.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: tuieval
|
|
3
|
-
Version: 0.2.0.
|
|
3
|
+
Version: 0.2.0.dev99
|
|
4
4
|
Summary: Evaluate local and frontier LLMs on your own questions: accuracy, speed, tokens and PASS/FAIL verdicts, in the terminal.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ashe-wb/tuieval
|
|
6
6
|
Project-URL: Issues, https://github.com/ashe-wb/tuieval/issues
|
|
@@ -104,7 +104,7 @@ The **PTA index** puts parsimony (tokens), time and accuracy side by side, as a
|
|
|
104
104
|
|
|
105
105
|
- **P parsimony (tokens)**: the tokens used, reasoning and answer, on every question compared (each question at its median over repeats). Beside the bar: how many times the leanest model's, e.g. `2.4×` (`1.0×` is the leanest, ★ in the table's **tokens/answer**). Unlike time it doesn't depend on your machine: it's how much a model says to get to an answer, which is what you pay for on an API and what fills its context.
|
|
106
106
|
- **T time**: the total time to answer those questions, as how many times the fastest model's, e.g. `28×` (★ in **time/answer**).
|
|
107
|
-
- **A accuracy**: the share of answers to those questions that passed. Answers cut off at `max_tokens` count as wrong, but show in orange after the green, with
|
|
107
|
+
- **A accuracy**: the share of answers to those questions that passed. Answers cut off at `max_tokens` count as wrong, but show in orange after the green, with `(n% truncated)` beside the number and a **truncated** column in the table: those failures are a model out of tokens (overthinking), not a wrong answer yet. A pack's own `max_tokens` gives it more room.
|
|
108
108
|
|
|
109
109
|
The P and T bars are as long as the tokens and time used: the model that used the most fills its bar, the others in proportion (at least one block), so **shorter is better**. The A bar is the share of answers right, so **longer is better**; it's full only when every answer passed. Each heading says which way is better.
|
|
110
110
|
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.2.0.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 2, 0, '
|
|
21
|
+
__version__ = version = '0.2.0.dev99'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 2, 0, 'dev99')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -122,7 +122,7 @@ def bars(result, width=20, markup=True):
|
|
|
122
122
|
are proportional to tokens and time (the longest is the model that used most; shorter is better),
|
|
123
123
|
with how many times the leanest / fastest model's beside them; the A bar is the share of answers
|
|
124
124
|
right (longer is better, full only when every answer passed), then the share cut off at max_tokens in
|
|
125
|
-
orange (▓ in plain text) and "
|
|
125
|
+
orange (▓ in plain text) and "(n% truncated)" beside it. markup=False gives plain text."""
|
|
126
126
|
if not result["models"]:
|
|
127
127
|
return []
|
|
128
128
|
name_w = max(len(x["model"]) for x in result["models"])
|
|
@@ -145,7 +145,7 @@ def bars(result, width=20, markup=True):
|
|
|
145
145
|
cut = x.get("cut_pct") or 0
|
|
146
146
|
part = min(width - full, max(1, round(width * cut / 100))) if cut else 0
|
|
147
147
|
if cut: # after the accuracy, which stays aligned with the other rows'
|
|
148
|
-
num = f"{num:>6}
|
|
148
|
+
num = f"{num:>6} ({compare.pct(cut / 100)} truncated)"
|
|
149
149
|
else:
|
|
150
150
|
full = _blocks(width, x.get(measure), most[measure])
|
|
151
151
|
num = times(x.get(shown))
|
|
@@ -178,7 +178,7 @@ def left_out_lines(result):
|
|
|
178
178
|
def table(result):
|
|
179
179
|
"""(header, rows) for a plain table of the index."""
|
|
180
180
|
n = result["questions"] or 1
|
|
181
|
-
header = ["model", "tokens/answer", "time/answer", "answers right", "
|
|
181
|
+
header = ["model", "tokens/answer", "time/answer", "answers right", "truncated", "tok/s", "TTFT s", "memory GB"]
|
|
182
182
|
rows = [[x["model"], f"{round(x['tokens'] / n):,}" + (" ★" if x.get("fewest") else ""),
|
|
183
183
|
fmt_secs(x["total_s"] / n) + (" ★" if x.get("fastest") else ""),
|
|
184
184
|
f"{x['passed']}/{x['answers']}", f"{x.get('cut') or 0}/{x['answers']}",
|
|
@@ -216,8 +216,8 @@ def scope_note(result, models):
|
|
|
216
216
|
"P parsimony (tokens) and T time: bars as long as the tokens / time used (shorter is better), "
|
|
217
217
|
"and how many times the leanest / fastest model's (1.0×, ★ in the table). A accuracy: answers right "
|
|
218
218
|
"(longer is better)"
|
|
219
|
-
+ ("; orange
|
|
220
|
-
if any(x.get("cut") for x in result["models"]) else "."))
|
|
219
|
+
+ ("; orange, (n% truncated): answers cut off at max_tokens. They count as wrong, but the model ran "
|
|
220
|
+
"out of tokens rather than answering wrong." if any(x.get("cut") for x in result["models"]) else "."))
|
|
221
221
|
|
|
222
222
|
|
|
223
223
|
def for_engine(e, labels=None, packs=None, results_dir=None):
|
|
@@ -1278,14 +1278,14 @@ class PTAIndex(unittest.TestCase):
|
|
|
1278
1278
|
self.assertEqual((by["thinker"]["A"], by["thinker"]["cut"], by["thinker"]["cut_pct"]), (60, 2, 20))
|
|
1279
1279
|
self.assertEqual((by["plain"]["cut"], by["plain"]["cut_pct"]), (0, 0))
|
|
1280
1280
|
bars = {line.split()[0]: line.split() for line in pta.bars(res, 10, markup=False)[2:]}
|
|
1281
|
-
self.assertEqual(bars["thinker"][-4:], ["██████▓▓░░", "60.0%", "
|
|
1282
|
-
self.assertEqual(bars["plain"][-2:], ["██████░░░░", "60.0%"]) #
|
|
1281
|
+
self.assertEqual(bars["thinker"][-4:], ["██████▓▓░░", "60.0%", "(20.0%", "truncated)"]) # right, cut off, wrong
|
|
1282
|
+
self.assertEqual(bars["plain"][-2:], ["██████░░░░", "60.0%"]) # none truncated: nothing beside it
|
|
1283
1283
|
self.assertIn("[#ff8c00]██[/]", pta.bars(res, 10)[2] + pta.bars(res, 10)[3])
|
|
1284
1284
|
header, table = pta.table(res)
|
|
1285
|
-
self.assertEqual(header[4], "
|
|
1285
|
+
self.assertEqual(header[4], "truncated")
|
|
1286
1286
|
self.assertEqual({r[0]: r[4] for r in table}, {"thinker": "2/10", "plain": "0/10"})
|
|
1287
|
-
self.assertIn("
|
|
1288
|
-
self.assertNotIn("
|
|
1287
|
+
self.assertIn("truncated", pta.scope_note(res, ["thinker", "plain"]))
|
|
1288
|
+
self.assertNotIn("truncated", pta.scope_note(pta.index(rows[10:]), ["plain"]))
|
|
1289
1289
|
|
|
1290
1290
|
def test_server_errors_and_models_with_few_answers(self):
|
|
1291
1291
|
from tuieval import pta
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/tool_call/system.txt
RENAMED
|
File without changes
|
{tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/tool_call/tests.yaml
RENAMED
|
File without changes
|
{tuieval-0.2.0.dev98 → tuieval-0.2.0.dev99}/src/tuieval/templates/packs/tool_call/tools.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|