benchmark: deduplicate engines, friendly error messages, tooltip for full error (v2.0.5)
- _run_bench: deduplicate STT engines by name before running; show a
warning in the summary line listing which names were skipped
- _bench_add_row: replace raw HTTP error strings with human-readable
reasons ("Wrong model name", "Server offline", "Timed out", etc.);
full raw error stored in hidden column 7 shown as row tooltip on hover
- bench_store: added 8th column (tooltip text); tree.set_tooltip_column(7)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
e01b130e5f
commit
bc6e2a6e54
@ -6,4 +6,4 @@ counterpart to the macOS Blitztext menu bar app: it runs natively on the host
|
|||||||
(not in a container) so it can type into any application via xdotool.
|
(not in a container) so it can type into any application via xdotool.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__version__ = "2.0.4"
|
__version__ = "2.0.5"
|
||||||
|
|||||||
@ -1857,8 +1857,11 @@ notebook.bt-nb tab:checked label {
|
|||||||
run.set_halign(Gtk.Align.START)
|
run.set_halign(Gtk.Align.START)
|
||||||
page.pack_start(run, False, False, 6)
|
page.pack_start(run, False, False, 6)
|
||||||
|
|
||||||
self.bench_store = Gtk.ListStore(str, str, str, str, str, str, str)
|
# cols: engine, model, device, best_for, time, accuracy, output_friendly, tooltip_full
|
||||||
|
self.bench_store = Gtk.ListStore(str, str, str, str, str, str, str, str)
|
||||||
tree = Gtk.TreeView(model=self.bench_store)
|
tree = Gtk.TreeView(model=self.bench_store)
|
||||||
|
tree.set_has_tooltip(True)
|
||||||
|
tree.set_tooltip_column(7) # hover any row → full error text
|
||||||
for title, i, expand in [("Engine", 0, False), ("Model", 1, False), ("Device", 2, False),
|
for title, i, expand in [("Engine", 0, False), ("Model", 1, False), ("Device", 2, False),
|
||||||
("Best for", 3, False), ("Time (s)", 4, False),
|
("Best for", 3, False), ("Time (s)", 4, False),
|
||||||
("Accuracy", 5, False), ("Output", 6, True)]:
|
("Accuracy", 5, False), ("Output", 6, True)]:
|
||||||
@ -1937,9 +1940,24 @@ notebook.bt-nb tab:checked label {
|
|||||||
return
|
return
|
||||||
reference = Path(refp).read_text(errors="replace")
|
reference = Path(refp).read_text(errors="replace")
|
||||||
self.bench_store.clear()
|
self.bench_store.clear()
|
||||||
self.bench_summary.set_markup("<i>Running… (local models load on first use)</i>")
|
|
||||||
self._stt_commit()
|
self._stt_commit()
|
||||||
engines = list(self.cfg.stt_engines)
|
|
||||||
|
# Deduplicate by name — show warning if any were skipped
|
||||||
|
seen: set[str] = set()
|
||||||
|
engines: list = []
|
||||||
|
skipped: list[str] = []
|
||||||
|
for e in self.cfg.stt_engines:
|
||||||
|
if e.name in seen:
|
||||||
|
skipped.append(e.name)
|
||||||
|
else:
|
||||||
|
seen.add(e.name)
|
||||||
|
engines.append(e)
|
||||||
|
if skipped:
|
||||||
|
names = ", ".join(skipped)
|
||||||
|
self.bench_summary.set_markup(
|
||||||
|
f"<i>Running… </i><span foreground='#e67e00'>⚠ Skipped duplicate engines: {GLib.markup_escape_text(names)}</span>")
|
||||||
|
else:
|
||||||
|
self.bench_summary.set_markup("<i>Running… (local models load on first use)</i>")
|
||||||
|
|
||||||
def work():
|
def work():
|
||||||
def prog(row):
|
def prog(row):
|
||||||
@ -1949,11 +1967,36 @@ notebook.bt-nb tab:checked label {
|
|||||||
GLib.idle_add(self._bench_done, rows)
|
GLib.idle_add(self._bench_done, rows)
|
||||||
threading.Thread(target=work, daemon=True).start()
|
threading.Thread(target=work, daemon=True).start()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _bench_friendly_error(err: str) -> str:
|
||||||
|
"""Short human-readable reason from a raw STT error string."""
|
||||||
|
e = err.lower()
|
||||||
|
if "bad model" in e or ("400" in e and "model" in e):
|
||||||
|
return "Wrong model name — clear the model field to use server default"
|
||||||
|
if "connection refused" in e or "errno 111" in e:
|
||||||
|
return "Server offline — check the URL and that the service is running"
|
||||||
|
if "timed out" in e or "time out" in e:
|
||||||
|
return "Timed out — server too slow or not responding (>60 s)"
|
||||||
|
if "500" in e or "internal server error" in e:
|
||||||
|
return "Server-side error — check the server logs"
|
||||||
|
if "401" in e or "unauthorized" in e:
|
||||||
|
return "Authentication failed — check the API key environment variable"
|
||||||
|
if "404" in e or "not found" in e:
|
||||||
|
return "Endpoint not found — check the URL (needs /v1 suffix?)"
|
||||||
|
if "cannot reach" in e:
|
||||||
|
return "Unreachable — check URL / firewall"
|
||||||
|
return err[:120]
|
||||||
|
|
||||||
def _bench_add_row(self, row) -> bool:
|
def _bench_add_row(self, row) -> bool:
|
||||||
acc = f"{row.accuracy:.1f}%" if row.ok else "—"
|
acc = f"{row.accuracy:.1f}%" if row.ok else "—"
|
||||||
out = row.text if row.ok else f"⚠ {row.error}"
|
if row.ok:
|
||||||
|
out_friendly = row.text
|
||||||
|
tooltip = row.text
|
||||||
|
else:
|
||||||
|
out_friendly = f"⚠ {self._bench_friendly_error(row.error)}"
|
||||||
|
tooltip = row.error
|
||||||
self.bench_store.append([row.engine, row.model, row.device, row.best_for,
|
self.bench_store.append([row.engine, row.model, row.device, row.best_for,
|
||||||
f"{row.seconds:.2f}", acc, out])
|
f"{row.seconds:.2f}", acc, out_friendly, tooltip])
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _bench_done(self, rows) -> bool:
|
def _bench_done(self, rows) -> bool:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user