tuieval 0.2.0.dev50__tar.gz → 0.2.0.dev55__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.dev50 → tuieval-0.2.0.dev55}/CHANGELOG.md +1 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/PKG-INFO +1 -1
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/_version.py +2 -2
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/machines.py +4 -4
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/watch_proxy.py +7 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/tests/mock_server.py +9 -1
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/.gitignore +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/LICENSE +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/README.md +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/RELEASING.md +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/README.md +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/favicon.ico +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/readme-header.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/social-preview.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-1024.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-128.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-16.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-16.svg +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-256.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-32.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-48.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-512.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-64.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-animated.svg +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon.svg +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/tui-answer-reasoning.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/tui-run-reasoning.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/tui-setup.png +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/models.md +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/writing-packs.md +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/pyproject.toml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/__init__.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/__main__.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/builtin.toml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/cli.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/client.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/compare.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/doctor.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/engine.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/export.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/__init__.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/answer.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/code.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/rag.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/reply.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/tool_call.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/onboard.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/packs.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/profiles.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/pta.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/remove.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/run_evals.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/scaffold.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/selftest.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/models.toml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/answer/pack.toml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/answer/system.txt +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/answer/tests.yaml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/code/pack.toml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/code/system.txt +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/code/tests.yaml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/rag/pack.toml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/rag/system.txt +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/rag/tests.yaml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/reply/pack.toml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/reply/system.txt +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/reply/tests.yaml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/pack.toml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/system.txt +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/tests.yaml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/tools.yaml +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/tui.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/tune.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/verdict.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/workspace.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/yamlout.py +0 -0
- {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/tests/test_tuieval.py +0 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
- Faster start on Macs: the GPU core count comes from `ioreg` instead of `system_profiler`, which took seconds on some Macs.
|
|
5
6
|
- A model a server won't serve (HTTP 401-404, e.g. OpenRouter's "No endpoints found") is never judged on it: those answers don't count, and the model stops at once instead of failing every question.
|
|
6
7
|
- PTA index: parsimony (tokens used) and speed (time), each 100 for the best and 15 points less per doubling, and accuracy per model, as bars: the first Results tab (where `r` lands), `tuieval pta` and the report. Server errors aren't answers, and models with few answers are left out unless picked.
|
|
7
8
|
- Run several models at a time: `parallel_models` per machine, **Models at a time** in the TUI, or `tuieval run --parallel N` (default 1). Models wait for memory to fit, and answers note what ran alongside them.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: tuieval
|
|
3
|
-
Version: 0.2.0.
|
|
3
|
+
Version: 0.2.0.dev55
|
|
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
|
|
@@ -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.dev55'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 2, 0, 'dev55')
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -65,10 +65,10 @@ def detect():
|
|
|
65
65
|
# macOS default when unset: about 2/3 of RAM up to 36 GB, 3/4 above.
|
|
66
66
|
limit = wired / 1024 if wired > 0 else ram * (0.75 if ram > 36 else 2 / 3)
|
|
67
67
|
gpu_cores = None
|
|
68
|
-
try:
|
|
69
|
-
out = subprocess.run(["
|
|
70
|
-
timeout=
|
|
71
|
-
m = re.search(r"
|
|
68
|
+
try: # the GPU driver's own count: instant, where system_profiler can take seconds (CI's virtual Macs)
|
|
69
|
+
out = subprocess.run(["ioreg", "-rc", "AGXAccelerator", "-d1"], capture_output=True, text=True,
|
|
70
|
+
timeout=5).stdout
|
|
71
|
+
m = re.search(r'"gpu-core-count"\s*=\s*(\d+)', out)
|
|
72
72
|
gpu_cores = int(m.group(1)) if m else None
|
|
73
73
|
except (OSError, subprocess.TimeoutExpired):
|
|
74
74
|
pass
|
|
@@ -18,6 +18,7 @@ import http.client
|
|
|
18
18
|
import itertools
|
|
19
19
|
import json
|
|
20
20
|
import os
|
|
21
|
+
import socketserver
|
|
21
22
|
import sys
|
|
22
23
|
import threading
|
|
23
24
|
import time
|
|
@@ -129,6 +130,12 @@ class Proxy:
|
|
|
129
130
|
class Server(ThreadingHTTPServer):
|
|
130
131
|
daemon_threads = True
|
|
131
132
|
|
|
133
|
+
def server_bind(self):
|
|
134
|
+
# HTTPServer looks up its own hostname here (socket.getfqdn), which can take half a
|
|
135
|
+
# minute where DNS is slow; the name is only cosmetic, so use the address.
|
|
136
|
+
socketserver.TCPServer.server_bind(self)
|
|
137
|
+
self.server_name, self.server_port = self.server_address[:2]
|
|
138
|
+
|
|
132
139
|
def handle_error(self, request, client_address):
|
|
133
140
|
err = sys.exc_info()[1]
|
|
134
141
|
if isinstance(err, (BrokenPipeError, ConnectionResetError)):
|
|
@@ -15,6 +15,7 @@ import json
|
|
|
15
15
|
import os
|
|
16
16
|
import sys
|
|
17
17
|
import time
|
|
18
|
+
import socketserver
|
|
18
19
|
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
|
|
19
20
|
|
|
20
21
|
import yaml
|
|
@@ -104,6 +105,13 @@ class Handler(BaseHTTPRequestHandler):
|
|
|
104
105
|
self.wfile.write(b"data: [DONE]\n\n")
|
|
105
106
|
|
|
106
107
|
|
|
108
|
+
class Server(ThreadingHTTPServer):
|
|
109
|
+
def server_bind(self):
|
|
110
|
+
# skip HTTPServer's own-hostname lookup (socket.getfqdn): 35 s per server on CI's macOS runners
|
|
111
|
+
socketserver.TCPServer.server_bind(self)
|
|
112
|
+
self.server_name, self.server_port = self.server_address[:2]
|
|
113
|
+
|
|
114
|
+
|
|
107
115
|
def main(argv=None):
|
|
108
116
|
p = argparse.ArgumentParser()
|
|
109
117
|
p.add_argument("--port", type=int, default=18090)
|
|
@@ -113,7 +121,7 @@ def main(argv=None):
|
|
|
113
121
|
p.add_argument("--delay", type=float, default=0.0, help="seconds each answer takes")
|
|
114
122
|
a, _ = p.parse_known_args(argv) # other flags (e.g. speed knobs under test) are accepted and ignored
|
|
115
123
|
Handler.answers, Handler.mode, Handler.model, Handler.delay = load_answers(a.packs), a.mode, a.model, a.delay
|
|
116
|
-
srv =
|
|
124
|
+
srv = Server(("127.0.0.1", a.port), Handler)
|
|
117
125
|
print(f"mock server on 127.0.0.1:{a.port} ({a.mode}, {len(Handler.answers)} known questions)", flush=True)
|
|
118
126
|
try:
|
|
119
127
|
srv.serve_forever()
|
|
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.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/system.txt
RENAMED
|
File without changes
|
{tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/tests.yaml
RENAMED
|
File without changes
|
{tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/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
|