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.
Files changed (77) hide show
  1. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/CHANGELOG.md +1 -0
  2. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/PKG-INFO +1 -1
  3. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/_version.py +2 -2
  4. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/machines.py +4 -4
  5. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/watch_proxy.py +7 -0
  6. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/tests/mock_server.py +9 -1
  7. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/.gitignore +0 -0
  8. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/LICENSE +0 -0
  9. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/README.md +0 -0
  10. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/RELEASING.md +0 -0
  11. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/README.md +0 -0
  12. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/favicon.ico +0 -0
  13. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/readme-header.png +0 -0
  14. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/social-preview.png +0 -0
  15. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-1024.png +0 -0
  16. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-128.png +0 -0
  17. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-16.png +0 -0
  18. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-16.svg +0 -0
  19. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-256.png +0 -0
  20. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-32.png +0 -0
  21. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-48.png +0 -0
  22. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-512.png +0 -0
  23. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-64.png +0 -0
  24. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon-animated.svg +0 -0
  25. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/brand/tuieval-icon.svg +0 -0
  26. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/tui-answer-reasoning.png +0 -0
  27. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/tui-run-reasoning.png +0 -0
  28. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/images/tui-setup.png +0 -0
  29. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/models.md +0 -0
  30. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/docs/writing-packs.md +0 -0
  31. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/pyproject.toml +0 -0
  32. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/__init__.py +0 -0
  33. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/__main__.py +0 -0
  34. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/builtin.toml +0 -0
  35. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/cli.py +0 -0
  36. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/client.py +0 -0
  37. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/compare.py +0 -0
  38. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/doctor.py +0 -0
  39. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/engine.py +0 -0
  40. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/export.py +0 -0
  41. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/__init__.py +0 -0
  42. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/answer.py +0 -0
  43. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/code.py +0 -0
  44. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/rag.py +0 -0
  45. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/reply.py +0 -0
  46. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/graders/tool_call.py +0 -0
  47. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/onboard.py +0 -0
  48. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/packs.py +0 -0
  49. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/profiles.py +0 -0
  50. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/pta.py +0 -0
  51. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/remove.py +0 -0
  52. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/run_evals.py +0 -0
  53. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/scaffold.py +0 -0
  54. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/selftest.py +0 -0
  55. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/models.toml +0 -0
  56. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/answer/pack.toml +0 -0
  57. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/answer/system.txt +0 -0
  58. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/answer/tests.yaml +0 -0
  59. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/code/pack.toml +0 -0
  60. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/code/system.txt +0 -0
  61. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/code/tests.yaml +0 -0
  62. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/rag/pack.toml +0 -0
  63. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/rag/system.txt +0 -0
  64. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/rag/tests.yaml +0 -0
  65. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/reply/pack.toml +0 -0
  66. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/reply/system.txt +0 -0
  67. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/reply/tests.yaml +0 -0
  68. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/pack.toml +0 -0
  69. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/system.txt +0 -0
  70. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/tests.yaml +0 -0
  71. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/templates/packs/tool_call/tools.yaml +0 -0
  72. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/tui.py +0 -0
  73. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/tune.py +0 -0
  74. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/verdict.py +0 -0
  75. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/workspace.py +0 -0
  76. {tuieval-0.2.0.dev50 → tuieval-0.2.0.dev55}/src/tuieval/yamlout.py +0 -0
  77. {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.dev50
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.dev50'
22
- __version_tuple__ = version_tuple = (0, 2, 0, 'dev50')
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(["system_profiler", "SPDisplaysDataType"], capture_output=True, text=True,
70
- timeout=15).stdout
71
- m = re.search(r"Total Number of Cores:\s*(\d+)", out)
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 = ThreadingHTTPServer(("127.0.0.1", a.port), Handler)
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