char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

parabelboiui: add read_media tool (#25877)4dd127584

char/aliceai-t5-moe
2.7 KiB58 linesraw

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.ts updateStreamingUI() runs per SSE chunk
  • conversations.svelte.ts updateMessageAtIndex does { ...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 forced offsetHeight read 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 work MarkdownContent defers into its own requestAnimationFrame. It carries a ~16.7ms/token idle floor because the harness yields a frame each iteration, so compare wall across fixtures, never against sync.

The knobs, and what each one discriminates

The point of the harness is the scaling curve, not any single number.

KnobReads on
priorToolCalls (0/1/5/20)the reactive fan-out. Flat => no fan-out. Linear => confirmed.
toolResultByteswhole-blob string scans (extractSearchResults, parseToolResultWithMedia, classifyToolResult).
editFileEditscomputeLineDiff, the O(m*n) LCS.
openCodeFencehljs.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
25  included 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
29  harness yields a frame each iteration, so compare `wall` **across fixtures**,
30  never 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```