@wendellresearch-ai/benchwarmers 0.5.6 → 0.6.0

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.
package/README.md CHANGED
@@ -99,7 +99,7 @@ with [AGENTS.md](AGENTS.md).
99
99
 
100
100
  ## Try it
101
101
 
102
- **v0.3, early.** It runs with Python 3.11 or later on Windows, macOS and
102
+ **Pre-1.0, early.** It runs with Python 3.11 or later on Windows, macOS and
103
103
  Linux, from PyPI, npm, a checkout or Docker. Expect rough edges, and read the
104
104
  code where these pages are thin.
105
105
 
@@ -145,6 +145,10 @@ dependencies either way: the app is the Python standard library.
145
145
  its key, which goes to the key file in llm's user folder (`keys.json`,
146
146
  shared with the `llm` CLI if you have it, not needed otherwise), never into
147
147
  the data folder. `BENCHWARMERS_KEY_<NAME>` in the environment works too.
148
+ To move an install to another machine, Settings → Export and import takes
149
+ the folder as one .zip (settings only, or everything; the endpoints' keys
150
+ only if you tick them) and imports it on the other install, saving what it
151
+ replaces to `backups/` first.
148
152
 
149
153
  3. **Start the dashboard.** With no endpoint yet it opens on adding one: sign
150
154
  in with a provider on its own page (OpenRouter, NanoGPT, Hugging Face,
@@ -153,7 +157,10 @@ dependencies either way: the app is the Python standard library.
153
157
  LiteLLM included. Anthropic and Gemini keys can also be called through
154
158
  those providers' own APIs (the API choice in the same dialog). Only providers that publish a sign-in for other apps are
155
159
  offered; adding one is an entry in `metrics/connect.py` (its docstring says
156
- how).
160
+ how). A model server already running on this machine, at its usual port or
161
+ any other its process is listening on (Ollama, LM Studio, Jan, llama.cpp,
162
+ LocalAI, vLLM, LiteLLM, CLI Proxy API, OmniRoute), is offered under "Found
163
+ on this machine", its address and kind filled in.
157
164
 
158
165
  python serve.py # http://localhost:8122
159
166
 
@@ -195,6 +202,18 @@ dependencies either way: the app is the Python standard library.
195
202
  that is only out of quota until a stated reset is not counted against. The
196
203
  built-in scheduler runs all of this once Settings switches it on; a fresh
197
204
  install spends no calls until then.
205
+ - **Benchmarks.** One page of reports: bugs found against false alarms, who
206
+ is confidently wrong, real work that helped, each model against its own
207
+ earlier scores (Trend), whether each provider was there when the bench
208
+ called it (Uptime: busy, unreachable and timed out count as down; your own
209
+ quota and pacing are left out), and speed. Each report shares as an image or
210
+ its table. [BENCHMARKS.md](BENCHMARKS.md) says how to read them.
211
+ - **Decision models.** A model that answers typed questions with a
212
+ probability (Mercury Decide, say) labels a request's shape, picks a
213
+ collection for a request that names none (when it is sure, and the reply
214
+ says so), and classes an error no rule knows. Each is measured daily on
215
+ questions the bench's own data answers, and each use asks the one that does
216
+ best.
198
217
  - **Rate limits and usage.** Limits come from providers' rate-limit headers
199
218
  and error messages, and from what you set per connection or model
200
219
  (requests a minute, day or month; tokens a minute or day). They are kept per
@@ -394,6 +413,13 @@ points at it with `ANTHROPIC_BASE_URL=http://127.0.0.1:8122` and
394
413
  OpenAI-, Responses- or Ollama-speaking agents with the same base URL.
395
414
  [GATEWAY.md](GATEWAY.md), "Route mode", has the set-up and the limits.
396
415
 
416
+ **Ready set-ups.** The dashboard's **Clients** page (Gateway) gives each
417
+ popular app's configuration, filled in from your install's address,
418
+ collections and MCP server, with a Copy button: opencode, VS Code chat, Codex
419
+ CLI, Zed, Continue, Cline and Kilo Code, Claude Code, goose, and chat apps
420
+ (LobeHub, AnythingLLM, Cherry Studio, Chatbox, LibreChat). Where keys are
421
+ asked for, it makes one and fills it in, never into a file that may sync.
422
+
397
423
  <!-- The MCP Registry's proof that the PyPI package is this server (server.json):
398
424
  mcp-name: io.github.WendellResearch-AI/benchwarmers -->
399
425
 
@@ -446,8 +472,10 @@ reaches Wendell Research. What it sends, and where:
446
472
 
447
473
  - **Your prompts**, only to the endpoints you add: a provider, an aggregator,
448
474
  a hub such as Open WebUI, or a local runtime. That includes the probes, the
449
- suite and onboarding, which spend calls on your keys. Add only endpoints you
450
- are content to send that work to.
475
+ suite and onboarding, which spend calls on your keys, and the decision
476
+ models' daily benchmark, which puts past requests, judged answers and
477
+ redacted error text to them again. Add only endpoints you are content to
478
+ send that work to.
451
479
  - **Catalog reads**, no key and nothing of yours: FreeLLMAPI (its feed and
452
480
  its site's sitemap) and models.dev once a day, and OpenRouter's public
453
481
  model list. With an NVIDIA connection, the public file of rate limits
@@ -462,12 +490,18 @@ reaches Wendell Research. What it sends, and where:
462
490
  API asks each sign-in's own provider for its quota.
463
491
  - **Charts**: the dashboard's browser page loads Observable Plot from jsDelivr
464
492
  at a pinned version.
493
+ - **Posts**, only when you click Post on X, Bluesky, LinkedIn or Reddit in a
494
+ report's Share menu: that site opens in your browser with the report's name
495
+ and the project's link. The image goes only to your clipboard, a file, or
496
+ the app you pick in your system's share sheet.
465
497
  - **Seeding real-bug tasks**, only when you run `suite/rebench.py`: the
466
498
  SWE-rebench-V2 rows from Hugging Face and the files from GitHub.
467
499
 
468
500
  Keys stay in the environment or llm's key file (`keys.json` in its user
469
- folder), never in the data folder. [PRIVACY.md](PRIVACY.md) and [SECURITY.md](SECURITY.md) have the
470
- detail.
501
+ folder), not in the data folder. An export (Settings, Export and import)
502
+ carries them only if you tick them, and an import that carries keys first
503
+ backs up the ones it replaces, in the data folder's `backups/`.
504
+ [PRIVACY.md](PRIVACY.md) and [SECURITY.md](SECURITY.md) have the detail.
471
505
 
472
506
  ## Limits
473
507
 
@@ -475,8 +509,8 @@ detail.
475
509
  with tools is refused there, not trimmed. Route mode passes turns only to
476
510
  members on chat-completions endpoints, keeps its sticky conversations in
477
511
  memory (a restart starts each on a fresh pick), and has been run end to end
478
- with Claude Code; the Codex, opencode and Cline set-ups are written from
479
- their docs. Shadow seats (other members answering an agent's turn for
512
+ with Claude Code; the other set-ups on the Clients page are written from
513
+ each app's docs, not run. Shadow seats (other members answering an agent's turn for
480
514
  evaluation) are planned, not built.
481
515
  - **Some parts are checked against fakes only.** The native Anthropic and
482
516
  Gemini endpoints, and the LiteLLM and CLI Proxy API hub adapters, are built
@@ -486,9 +520,10 @@ detail.
486
520
  seats before it stream as they finish.
487
521
  - **Pacing and the ledger cover the built-in client.** Calls made through the
488
522
  `llm` CLI, when you choose it, are neither paced nor counted.
489
- - **Calls cost.** Probes, onboarding and the suite run on your keys and free
490
- tiers. Onboarding runs one model at a time for that reason (Quick spreads
491
- the suite over the scheduled passes); a suite pass is paced, not burst.
523
+ - **Calls cost.** Probes, onboarding, the suite and the decision benchmark
524
+ run on your keys and free tiers. Onboarding runs one model at a time for
525
+ that reason (Quick spreads the suite over the scheduled passes); a suite
526
+ pass is paced, not burst.
492
527
  - **The scheduler lives in the server.** Its jobs run while the dashboard (or
493
528
  the container, or the service) is up; a missed run is made up once, within
494
529
  seven days, when it comes back.
package/SECURITY.md CHANGED
@@ -24,8 +24,9 @@ reproduce, and what an attacker gains.
24
24
  **On this machine by default.** The dashboard (`serve.py`, port 8122) and the
25
25
  gateway (on the same port at `/v1`, or alone with `gateway.py` on 8123) listen
26
26
  on 127.0.0.1. Every request is checked for the server's own host name (against
27
- DNS rebinding), and every write must be a same-origin JSON request, so a web
28
- page open in your browser cannot drive either server. With no admin token
27
+ DNS rebinding), and every write must be a same-origin request with a JSON
28
+ body (a zip, for an import), a type no plain form can send, so a web page
29
+ open in your browser cannot drive either server. With no admin token
29
30
  there is no login and the gateway asks for no key.
30
31
 
31
32
  **Anywhere else, only with a login.** To listen beyond this machine
@@ -60,15 +61,24 @@ open itself to anyone.
60
61
  - **Keys.** Endpoint keys come from `BENCHWARMERS_KEY_<NAME>` (the key name
61
62
  upper-cased, `-` as `_`) first, then from llm's key file (`keys.json` in
62
63
  its user folder, used whether or not the `llm` CLI is installed). They are
63
- never written to the data folder, never shown back, and never put in a log.
64
- Sign-ins through a provider's page store their token the same way.
64
+ never shown back and never put in a log. Sign-ins through a provider's page
65
+ store their token the same way.
66
+ - **Exports.** Settings, Export and import, puts the endpoints' stored keys
67
+ (key, admin key, refresh token; never one from the environment) in an
68
+ export only when you tick them, in plain text in its `keys.json`: keep that
69
+ file like a password and delete it once imported. Importing one puts its
70
+ keys in the key store, and first backs up this install's own, with its files,
71
+ to the data folder's `backups/before-import-<time>.zip`. An import is
72
+ refused whole if any file in it would land outside its scope's folders.
65
73
  - **The network.** Your prompts go only to the endpoints you add; the probes,
66
- the suite and onboarding spend calls there too. Otherwise: public catalog
67
- reads (models.dev, FreeLLMAPI, OpenRouter's model list), each Open WebUI
68
- connection's model list (through Open WebUI, with its key), a provider's
69
- sign-in page when you choose one, Observable Plot from jsDelivr in the
70
- dashboard's page, and Hugging Face and GitHub only when you run
71
- `suite/rebench.py`. [PRIVACY.md](PRIVACY.md) lists them.
74
+ the suite, onboarding and the decision benchmark spend calls there too.
75
+ Otherwise: public catalog reads (models.dev, FreeLLMAPI, OpenRouter's model
76
+ list), each Open WebUI connection's model list (through Open WebUI, with its
77
+ key), a provider's sign-in page when you choose one, Observable Plot from
78
+ jsDelivr in the dashboard's page, the site a report's Share menu posts to
79
+ when you choose one (opened with the report's name and the project's link
80
+ only), and Hugging Face and GitHub only when you run `suite/rebench.py`.
81
+ [PRIVACY.md](PRIVACY.md) lists them.
72
82
  - **Files.** It writes inside its data folder (`BENCHWARMERS_HOME`, or the
73
83
  folder `.benchwarmers-home` names) and, in llm's user folder, the key file
74
84
  (when you paste a key or sign in) and the model list (when it registers a
package/USAGE.md CHANGED
@@ -13,6 +13,7 @@ coding agent doing it with you); the gateway's whole contract is in
13
13
  - [Collections](#collections)
14
14
  - [Connecting an app](#connecting-an-app)
15
15
  - [Recording verdicts](#recording-verdicts)
16
+ - [Benchmarks, and sharing a report](#benchmarks-and-sharing-a-report)
16
17
  - [Discover: finding models to add](#discover-finding-models-to-add)
17
18
  - [Quota management](#quota-management)
18
19
  - [The scheduler](#the-scheduler)
@@ -24,17 +25,24 @@ coding agent doing it with you); the gateway's whole contract is in
24
25
 
25
26
  | Group | Page | What it is for |
26
27
  | --- | --- | --- |
27
- | Observe | **At a glance** | Every model on the bench: whether it works right now, its role, and its connection. Click a name for its popup: role, alias, facts, options, retire. |
28
+ | Observe | **At a glance** | Every model on the bench: whether it works right now, its uptime over 7 days, its role, and its connection. Click a name for its popup: role, alias, facts, options, retire. |
28
29
  | | **Action needed** | What will not fix itself, by the connection it comes from, with Retry and Retire on each model. |
29
- | | **Benchmarks** | How models do on the suite and on real work: bugs found against false alarms, who is confidently wrong, and speed. |
30
+ | | **Benchmarks** | How models do on the suite and on real work: bugs found against false alarms, who is confidently wrong, each model against its own earlier scores, uptime, speed, and the decision models. Each report shares as an image or its table. |
30
31
  | | **Quota management** | A tile per provider: what is left, when it resets, and which of its models are resting. Then the week's resets, and what the bench sent. |
31
32
  | | **Logs** | Gateway calls (who sat and how it went, never the prompt), changes made from the dashboard, the scheduler, and onboarding runs. |
32
- | Gateway | **Endpoints** | Where models are served from. Add an endpoint (a provider's sign-in, or any OpenAI-compatible API key), change a key, and see what each one serves. Also your own app registrations and rate limits per connection. |
33
+ | Gateway | **Endpoints** | Where models are served from. Add an endpoint (a provider's sign-in, or any OpenAI-compatible API key), change a key, and see what each one serves. A model server running on this machine, at its usual port or any other its process is listening on (LM Studio, Jan, llama.cpp, vLLM and the like), is offered under Found on this machine: Add opens the dialog with it filled in, to test and save. Also your own app registrations and rate limits per connection. |
33
34
  | | **Models** | Every model on the bench, by the connection it comes from. |
34
35
  | | **Collections** | The named panels your apps ask for, and the gateway's settings. |
36
+ | | **Clients** | Each popular app's set-up (opencode, VS Code, Codex, Zed, Continue, Cline, Kilo Code, Claude Code, goose, chat apps), filled in from this install, with Copy and a gateway key made on the spot. |
35
37
  | | **Discover** | Models worth adding, from public catalogs, with the ways this install can reach each one. |
36
- | Control | **Settings** | Theme, gateway keys, the scheduler, the model client, providers whose free models work only in their own app, how the install is reached (shown only), and Restart. |
37
- | | **Info** | Version, Python, data folder and counts. |
38
+ | Control | **Settings** | Theme, gateway keys, the scheduler, the model client, providers whose free models work only in their own app, export and import, how the install is reached (shown only), and Restart. |
39
+ | | **Info** | The source repository, the version (linking its release), Python, data folder and counts. |
40
+
41
+ The page shown follows the data: while it is in view it checks every 10
42
+ seconds, and when something has changed it swaps in the new page in place,
43
+ keeping open sections, sorting and filters. It waits while you are at work on
44
+ it (a popup open, a form not saved or in use, text selected, a chart hovered),
45
+ and **New results · Show**, top right, offers the change instead.
38
46
 
39
47
  **Action needed** lists what will not fix itself, such as a model about to be
40
48
  retired, grouped by the connection it comes from, since one cause usually
@@ -108,7 +116,9 @@ unavailable, so the daily probe keeps watching it.
108
116
  `code`, `light` (small and fast), `vision` (reads images well, weak at text:
109
117
  OCR and document models; seated only when a request carries images) or
110
118
  `image` (makes images; never seated). A model that reads images and does
111
- everything else well stays `general`.
119
+ everything else well stays `general`. Where a decision model is onboarded,
120
+ onboarding asks it to suggest a new chat model's role; the popup shows the
121
+ suggestion, and nothing applies it.
112
122
 
113
123
  ## Collections
114
124
 
@@ -135,8 +145,18 @@ empty, it follows those settings. A member out of quota stays on the collection
135
145
  and an explorer sits in for it, named `stand-in for <member>`, until the quota
136
146
  is back. Max explorers 0 means only the members ever run, stand-ins included.
137
147
 
148
+ Gateway settings also says whether a request that names no collection is given
149
+ one by a decision model, and how sure that model must be (GATEWAY.md, "No
150
+ default collection").
151
+
138
152
  ## Connecting an app
139
153
 
154
+ The dashboard's **Clients** page has a ready set-up for each popular app,
155
+ filled in from this install (its address, collections and MCP server): copy it
156
+ into the file or screen it names. When keys are asked for, it makes one on the
157
+ spot and fills it in where a key goes, never into a file that may sync. What
158
+ follows is the same by hand.
159
+
140
160
  Any OpenAI-compatible client works. Point it at the dashboard's port and ask
141
161
  for the model `bench/<collection>`:
142
162
 
@@ -197,7 +217,8 @@ claude
197
217
 
198
218
  Each conversation is one offload per model that answered it; a verdict is
199
219
  optional, and the Gateway card lists route conversations apart from the
200
- panels. GATEWAY.md, "Route mode", has the other clients and the limits.
220
+ panels. The Clients page has the other agents' set-ups; GATEWAY.md, "Route
221
+ mode", has the limits.
201
222
 
202
223
  **A coding agent** connects over MCP instead: the Claude Code plugin
203
224
  (`/plugin marketplace add WendellResearch-AI/benchwarmers`, then
@@ -229,6 +250,33 @@ claims feed **Confidently wrong** on Benchmarks, and verdicts together decide
229
250
  who sits on the next panel. Agreement between models is not evidence: they
230
251
  are often wrong together.
231
252
 
253
+ ## Benchmarks, and sharing a report
254
+
255
+ **Benchmarks** is one report after another: who to trust with a review, bug
256
+ hunt, real work, confidently wrong, our code, vision, trend, uptime,
257
+ performance and the decision models, then links to public leaderboards. Most
258
+ have a chart, the table folded under it (with a filter, and **Show
259
+ retired**), and **How to read this**;
260
+ [BENCHMARKS.md](BENCHMARKS.md) has the same explanations in one place.
261
+ **Trend** (30 or 60 days) and **Uptime** (7 or 30) have a window to choose.
262
+
263
+ **Share**, top right of each report:
264
+
265
+ - **Copy image** / **Download image**: the report's charts, title and the line
266
+ under it, with a band at the foot holding the logo, the project's link and
267
+ the date, as a PNG at twice the size shown. The table, the key and the
268
+ controls stay out; a window you chose shows as its words.
269
+ - **Copy table as Markdown** / **Download table as CSV**: the table as shown
270
+ (its window, filter and Show retired), a model's connection in brackets.
271
+ - **Share…**: your system's share sheet, with the image.
272
+ - **Post on** X, Bluesky, LinkedIn or Reddit: the image goes on the clipboard
273
+ (or is saved, where there is no clipboard), then the site opens with the
274
+ report's name and the project's link, for you to paste the image into.
275
+
276
+ What your browser cannot do is not offered: copying needs a secure page
277
+ (`localhost` is one; a LAN address over plain http is not), and Share… needs
278
+ a share sheet.
279
+
232
280
  ## Discover: finding models to add
233
281
 
234
282
  **Discover** leads with FreeLLMAPI's catalog of free tiers and fills in from
@@ -319,8 +367,9 @@ Under the tiles are:
319
367
  ## The scheduler
320
368
 
321
369
  The recurring jobs (the morning availability probe, the catalog refresh, the
322
- deprecation check and auto-retire, suite passes, the weekly speed and
323
- capability tests) run inside the dashboard. Settings, **Scheduler**:
370
+ deprecation check and auto-retire, suite passes, the decision models' daily
371
+ benchmark, the weekly speed and capability tests) run inside the dashboard.
372
+ Settings, **Scheduler**:
324
373
 
325
374
  - **Off**: nothing runs; a fresh install spends no calls until you opt in.
326
375
  - **Log only**: writes "would run" to `runs/scheduler.log` at each due time,
@@ -337,3 +386,16 @@ call logs, probe history, task answers) lives in the data folder: the one
337
386
  `BENCHWARMERS_HOME` names, else the one in `.benchwarmers-home` at the top of
338
387
  the checkout. Back it up by copying it; move it by copying it and pointing one
339
388
  of those two at the new place. Info shows which folder is in use.
389
+
390
+ **Export and import**, on Settings, does the same through the dashboard, for
391
+ another machine or a copy to keep: one .zip of **Settings only**
392
+ (`config/`: endpoints, collections, roles, model options, the schedule,
393
+ gateway keys, the theme) or **Everything** (also every result, history, log
394
+ and saved answer). The endpoints' API keys go in only if you tick them; the
395
+ file then holds them, so keep it like a password and delete it once
396
+ imported. On the other install, choose the file: it says what is in it
397
+ (scope, release, date, files, how many it replaces, keys) before **Import**.
398
+ Its files replace the ones of the same name, after this install's own in that
399
+ scope are saved to `backups/before-import-<time>.zip`; files it does not have
400
+ are left. Restart afterwards (Settings, Server and access), so every part
401
+ reads them.
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.6
1
+ 0.6.0