You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Build a comparison viewer for Inspect AI that enables side-by-side evaluation of 2-4 models on the same task, with synchronized sample navigation and drill-down. This requires extracting the current monolithic viewer into granular, composable React components.
No tool in the Inspect AI ecosystem (upstream or any of 426 forks) provides multi-model comparison. This is the #1 requested viewer feature:
#1327 — "Side by side comparison of two models" (open, maintainer confirmed "on our todo list" but blocked on refactoring)
#2176 — "Paired analysis between 2 models on the same benchmark" (closed, DIY only)
#704 — "Frameworks for summarising and visualising inspect logs" (closed, no solution)
Maintainer dragonstyle (Charles Teague, Posit) said in UKGovernmentBEIS#1327: "Right now there isn't an automated way to do this (though it is on our todo list)... I think we'd still like to do it!" He noted being "right in the middle of quite a bit of refactoring of the main application logic which is necessary to tackle a feature like this."
Our Use Case
The Grounding Measure benchmark evaluates 17 embedding models across G1-G4 metrics on SimLex-999 (999 word pairs each). We need to:
Compare how two models score on the same word pair (e.g., "old/new" — why does GPT-2 get 0.89 but BERT gets 0.72?)
See side-by-side G1 drift patterns for specific words across models
Drill from a cross-model ranking table into paired sample views
Current State of the Viewer Architecture
What Already Exists (Upstream)
The viewer was extracted as a React library in PR #2464 (merged Sep 2025) by revmischa (METR):
Package:@meridianlabs/log-viewer v0.0.11 Build:yarn build:lib → ES modules via Vite library mode Exports from src/inspect_ai/_view/www/src/index.ts:
// Monolithic app componentexport{App}from"./app/App";// API factoriesexport{clientApi}from"./client/api/client-api";export{viewServerApiascreateViewServerApi}from"./client/api/view-server/api-view-server";// Typesexporttype{ClientAPI,LogViewAPI,LogHandle,LogPreview, ... }from"./client/api/types";// Stateexport{initializeStore}from"./state/store";
What's Missing for Comparison
Granular component exports. Only App is exported — no SampleViewer, ScoreTable, EventTimeline, LogHeader, TranscriptPanel. These exist internally but aren't individually importable.
Multi-instance store.initializeStore() creates a single Zustand store managing one active log. Comparison needs N stores (one per panel) or a store redesigned for multi-log state.
Synchronized navigation. No mechanism to link sample selection across panels (e.g., "when I click pair_042 in panel A, also navigate to pair_042 in panel B").
The ClientAPI is single-log-oriented. Methods like get_log_summary(log_file) work for one log. A comparison backend needs to scope API calls per panel.
METR's Performance Work (Reference)
METR's faber/viewer-performance-combined branch (39 ahead, active Feb 2026) has patterns we should adopt:
Pattern
Implementation
Relevance
Server-side sample loading
New /log-sample endpoint
Critical — comparison loads N samples simultaneously
5 open PRs from sjawhar (UKGovernmentBEIS#3353-3357): virtualization, lazy-loading, minification, cache headers, sample loading optimization. These should land before or alongside comparison work.
Proposed Architecture
Phase 1: Granular Component Extraction
Extract these as individually importable components:
Summary
Build a comparison viewer for Inspect AI that enables side-by-side evaluation of 2-4 models on the same task, with synchronized sample navigation and drill-down. This requires extracting the current monolithic viewer into granular, composable React components.
This is a proposed upstream contribution to UKGovernmentBEIS/inspect_ai, addressing issue #1327.
Motivation
The Gap
No tool in the Inspect AI ecosystem (upstream or any of 426 forks) provides multi-model comparison. This is the #1 requested viewer feature:
Maintainer dragonstyle (Charles Teague, Posit) said in UKGovernmentBEIS#1327: "Right now there isn't an automated way to do this (though it is on our todo list)... I think we'd still like to do it!" He noted being "right in the middle of quite a bit of refactoring of the main application logic which is necessary to tackle a feature like this."
Our Use Case
The Grounding Measure benchmark evaluates 17 embedding models across G1-G4 metrics on SimLex-999 (999 word pairs each). We need to:
Current State of the Viewer Architecture
What Already Exists (Upstream)
The viewer was extracted as a React library in PR #2464 (merged Sep 2025) by revmischa (METR):
Package:
@meridianlabs/log-viewerv0.0.11Build:
yarn build:lib→ ES modules via Vite library modeExports from
src/inspect_ai/_view/www/src/index.ts:What's Missing for Comparison
Granular component exports. Only
Appis exported — noSampleViewer,ScoreTable,EventTimeline,LogHeader,TranscriptPanel. These exist internally but aren't individually importable.Multi-instance store.
initializeStore()creates a single Zustand store managing one active log. Comparison needs N stores (one per panel) or a store redesigned for multi-log state.Synchronized navigation. No mechanism to link sample selection across panels (e.g., "when I click pair_042 in panel A, also navigate to pair_042 in panel B").
The
ClientAPIis single-log-oriented. Methods likeget_log_summary(log_file)work for one log. A comparison backend needs to scope API calls per panel.METR's Performance Work (Reference)
METR's
faber/viewer-performance-combinedbranch (39 ahead, active Feb 2026) has patterns we should adopt:/log-sampleendpointsampleSlice.tsjson-worker.tsoffloads parsinglog/_pool.py+ frontend resolutionMETR's Pending Performance PRs on Upstream
5 open PRs from sjawhar (UKGovernmentBEIS#3353-3357): virtualization, lazy-loading, minification, cache headers, sample loading optimization. These should land before or alongside comparison work.
Proposed Architecture
Phase 1: Granular Component Extraction
Extract these as individually importable components:
SampleViewer{sample: EvalSample, scores: Score[]}ScorePanel{scores: Score[], metrics: Metric[]}TranscriptPanelTranscriptPanel.tsx{events: Event[], transforms: Transform[]}LogHeader{log: EvalLog, metadata: Record}SampleList{samples: SampleSummary[], onSelect: (id) => void}Each component should:
AppPhase 2: Multi-Instance Store
Refactor
initializeStore()to support:Phase 3: Comparison Route
New
/compareroute in the viewer:Layout options:
Features:
Phase 4: Wrapper Dashboard (Our Layer)
A lightweight dashboard (could be the existing
reporting/module) that:analysis.mddata)/compareroute for any selected model pairbenchmarks/results/partials/*.jsonfor aggregate dataKey Decisions Needed
@meridianlabs/log-viewer?Ecosystem Context
Key People
Fork Landscape
Upstream Viewer Tech Stack
Related Issues
@meridianlabs/log-viewerlibrary (upstream PR React Library + API Fetch Interface UKGovernmentBEIS/inspect_ai#2464)Acceptance Criteria
@meridianlabs/log-viewer