Skip to content

LLM inference: live concurrency streams and sweep; tool-call eval with tool-eval-bench - #2

Merged
sfxnz merged 1 commit into
mainfrom
feat/concurrency-streams-tool-eval
Oct 21, 2026
Merged

sfxnz merged 1 commit into
mainfrom
feat/concurrency-streams-tool-eval

Conversation

@sfxnz

@sfxnz sfxnz commented Oct 21, 2026

Copy link
Copy Markdown
Owner

Summary

Concurrency streams (LLM inference). While a run is going, every request in flight is a live card: its text types out with the request's state, TTFT, tok/s and token progress. Above the cards: aggregate output with a trend line, a dot per stream and a level rail. A new Sweep concurrency option runs 1, 2, 4 … N streams in turn. After the run: per-level charts and a table (output tok/s, per-request decode, TTFT p50/p95, scaling efficiency), a waiting-vs-decoding timeline for every request, and each stream's final output.

Tool-call eval (new benchmark). Runs tool-eval-bench 2.8.0 in-process inside a payload, so scores, fingerprints and per-scenario verdicts match its CLI. A tool-calling preflight stops runs against servers without tool parsing (otherwise vLLM without --enable-auto-tool-choice still scores "★★★★ Good" with 93 of 97 scenarios silently excluded), and scores always carry their completion rate. Live scenario board; afterwards the score and rating, safety gate, categories and capabilities, a searchable scenario list with upstream's pass/fail criteria and traces, and the upstream result JSON as a download.

Plumbing.

  • NodeBenchState.live (replaced) and .detail (merged), with size and nesting guards; persisted with the run, left out of run lists.
  • A 32 MiB per-browser byte budget in the console hub.
  • The agent drains a payload's output after terminating it, so final snapshots survive a cancel.
  • The LLM payload exits on SIGTERM in milliseconds.

Behaviour changes

  • Every LLM level now sends at least one request per stream (requests per level = max(requests, level)). Baselines key on the requests actually sent, so older runs with fewer requests than streams aren't compared with new ones. All other existing baselines still match; the new sweep param is left out of the key while off.
  • New dependency: tool-eval-bench==2.8.0 plus rich, pygments, markdown-it-py and mdurl, all hash-pinned from PyPI. Existing pins are unchanged.

Test plan

  • Server: ruff, ruff format, mypy, pytest -q (333 tests). test_builtin_io_random_workers_do_not_share_a_gil failed once under parallel load; it passes alone and also failed once before this change.
  • Web: typecheck, lint, 628 unit tests, production build. Startup JS is 154.2 KB gzip (budget 200 KB). The benchmarks lazy chunk grew from 31.5 to 55.0 KB gzip.
  • e2e: all 38 Playwright tests against the demo, including the new sweep, cancel, History and tool-eval flows and axe checks in both themes.
  • End to end: a real dev agent and console against fake model servers. At 32 streams, live updates are about 17 KB at 2 Hz and payload CPU is about 4%; rates match the fake's timing. tool-eval fault modes covered: HTTP 400 without parser, 503 exclusions, <think> in answers, unsafe TC-34.
  • Not yet run against a real model endpoint. The nodes were busy with measured workloads, so only fakes and the demo were used.

🤖 Generated with Claude Code

…h tool-eval-bench

- LLM inference streams every request in flight live: one card per stream with its
  text, state, TTFT, tok/s and tokens; aggregate output, a dot per stream and a level
  rail. Optional "Sweep concurrency" runs 1, 2, 4 … N streams with results per level,
  then shows a sweep panel (output, per-request decode, TTFT p50/p95, scaling
  efficiency), a per-request stream timeline and each stream's final output.
  Every level sends at least one request per stream; baselines key on the requests
  actually sent, so older runs with fewer requests than streams aren't compared.
  SIGTERM now ends the payload in milliseconds instead of a SIGKILL after 5 s.
- New benchmark "Tool-call eval": tool-eval-bench 2.8.0 (SeraphimSerapis, MIT;
  PyPI, hash-pinned) runs in-process in a payload, so scores and fingerprints match
  its CLI. A tool-calling preflight stops runs against servers without tool parsing;
  scores always carry their completion rate. Live scenario board, summary with
  safety gate and categories, scenario table with criteria and traces, and the
  upstream JSON as a download.
- NodeBenchState gains live (replaced) and detail (merged) data with size and depth
  guards; persisted with the run, left out of run lists. The console's per-browser
  queue gets a 32 MiB byte budget. The agent keeps reading a payload's output after
  terminating it, so final snapshots survive a cancel.
- Demo simulates both features and seeds a finished sweep and evaluation; README,
  PLAN, DISCOVERY and REVIEW updated with four new screenshots; e2e coverage for both.

Neither feature has run against a real model endpoint yet: fake servers and the demo only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@sfxnz
sfxnz merged commit 7f760de into main Oct 21, 2026
3 checks passed
@sfxnz
sfxnz deleted the feat/concurrency-streams-tool-eval branch October 21, 2026 18:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant