char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
4dd127584
char/aliceai-t5-moe
Agentic thread perf harness
Two tiers, both reusing the existing vitest projects (see vite.config.ts).
Tier 1 - agentic-stream.perf.svelte.test.ts (project: client, real Chromium)
Mounts ChatMessageAgenticContent and replays a stream, replacing the message
object on each chunk exactly as the real pipeline does:
chat.svelte.tsupdateStreamingUI()runs per SSE chunkconversations.svelte.tsupdateMessageAtIndexdoes{ ...old, ...updates }
That new object identity is the thing under test: it cascades through
deriveAgenticSections (which returns fresh AgenticSection objects) into every
tool-call block in the message, including completed ones.
npx vitest --project=client --run tests/client/agentic-stream.perf.svelte.test.ts
Reading the output
mean/p95/max- the synchronous window per token: prop write,await tick(), then a forcedoffsetHeightread so style and layout are included rather than deferred.sync- sum of those windows. This is the number to optimize.wall- the whole run including workMarkdownContentdefers into its ownrequestAnimationFrame. It carries a ~16.7ms/token idle floor because the harness yields a frame each iteration, so comparewallacross fixtures, never againstsync.
The knobs, and what each one discriminates
The point of the harness is the scaling curve, not any single number.
| Knob | Reads on |
|---|---|
priorToolCalls (0/1/5/20) | the reactive fan-out. Flat => no fan-out. Linear => confirmed. |
toolResultBytes | whole-blob string scans (extractSearchResults, parseToolResultWithMedia, classifyToolResult). |
editFileEdits | computeLineDiff, the O(m*n) LCS. |
openCodeFence | hljs.highlightAuto on partial code. |
Deliberately no hard assertions: CI timing is noisy and the value here is the before/after delta, not a gate.
Caveat
This measures one message's subtree. In the real app ChatMessages.svelte
rebuilds its whole displayMessages list per token, so multiply by the number
of rendered messages to get the conversation-level cost.
Tier 2 - ../unit/agentic-hotpath.bench.ts (project: unit, node)
Per-call costs for the pure functions the curve implicates.
npx vitest bench --project=unit --run tests/unit/agentic-hotpath.bench.ts
1# Agentic thread perf harness 2 3Two tiers, both reusing the existing vitest projects (see `vite.config.ts`). 4 5## Tier 1 - `agentic-stream.perf.svelte.test.ts` (project: `client`, real Chromium) 6 7Mounts `ChatMessageAgenticContent` and replays a stream, replacing the message 8object on each chunk exactly as the real pipeline does: 9 10- `chat.svelte.ts` `updateStreamingUI()` runs per SSE chunk 11- `conversations.svelte.ts` `updateMessageAtIndex` does `{ ...old, ...updates }` 12 13That new object identity is the thing under test: it cascades through 14`deriveAgenticSections` (which returns fresh `AgenticSection` objects) into every 15tool-call block in the message, including completed ones. 16 17``` 18npx vitest --project=client --run tests/client/agentic-stream.perf.svelte.test.ts 19``` 20 21### Reading the output 22 23- `mean` / `p95` / `max` - the synchronous window per token: prop write, 24`await tick()`, then a forced `offsetHeight` read so style and layout are 25included rather than deferred. 26- `sync` - sum of those windows. This is the number to optimize. 27- `wall` - the whole run including work `MarkdownContent` defers into its own 28`requestAnimationFrame`. It carries a ~16.7ms/token idle floor because the 29harness yields a frame each iteration, so compare `wall` **across fixtures**, 30never against `sync`. 31 32### The knobs, and what each one discriminates 33 34The point of the harness is the _scaling curve_, not any single number. 35 36| Knob | Reads on | 37| --------------------------- | --------------------------------------------------------------------------------------------------- | 38| `priorToolCalls` (0/1/5/20) | the reactive fan-out. Flat => no fan-out. Linear => confirmed. | 39| `toolResultBytes` | whole-blob string scans (`extractSearchResults`, `parseToolResultWithMedia`, `classifyToolResult`). | 40| `editFileEdits` | `computeLineDiff`, the O(m\*n) LCS. | 41| `openCodeFence` | `hljs.highlightAuto` on partial code. | 42 43Deliberately no hard assertions: CI timing is noisy and the value here is the 44before/after delta, not a gate. 45 46### Caveat 47 48This measures one message's subtree. In the real app `ChatMessages.svelte` 49rebuilds its whole `displayMessages` list per token, so multiply by the number 50of rendered messages to get the conversation-level cost. 51 52## Tier 2 - `../unit/agentic-hotpath.bench.ts` (project: `unit`, node) 53 54Per-call costs for the pure functions the curve implicates. 55 56``` 57npx vitest bench --project=unit --run tests/unit/agentic-hotpath.bench.ts 58```