PAMELA

July 21, 2026 · View on GitHub

Low-cost, large-scale behavioral measurement of LLMs through single-token output distributions, collected once via OpenRouter and analysed

Repository map

FolderContentStart with
config/prompt battery (15 tasks × 4 languages), run configuration, curated model listconfig/README.md
run/Node.js data collection: catalog fetch, model assessment + cost estimate, resumable experiment runner, validationrun/README.md
data/append-only raw responses (JSONL + manifests), derived normalized datadata/README.md
stats/analysis pipeline: Node (normalize, distributions, JSD) + R (clustering, classification, ROC/EER)stats/README.md
results/machine-generated statistics and figures; pilot go/no-go reportresults/README.md

Quick start

cp .env.example .env            # add OPENROUTER_API_KEY
npm run fetch-models            # snapshot the catalog
npm run assess-models           # filter models + cost estimate → review config/models.selected.json
npm run pilot:dry               # sanity-check the plan (no API calls)
npm run pilot                   # collect the pilot (resumable; re-run to retry failures)
node run/validate-run.js --run-id pilot-01
npm run stats:all               # full analysis pipeline
npm run stats:pilot-report      # → results/pilot-report.md = GO / NO-GO for the main run

Requirements: Node ≥ 20, R ≥ 4.0 (packages auto-installed by npm run stats:r-deps), no npm dependencies.

Principles (bind all future work)

  • Reproducibility: every response carries the prompts-file hash, git commit, UTC timestamp, serving provider, and cost; raw data are append-only; analyses are regenerable end-to-end.
  • Budget discipline: dry-runs and cost estimates before any paid call; --limit caps; frontier models at reduced reps.
  • No silent exclusions: refusals and off-format answers are coded and counted, never dropped.
  • Pre-registration discipline: pilot data calibrate the design but are excluded from confirmatory analyses.