transcript-viewer 0.9.0__tar.gz → 0.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/PKG-INFO +9 -3
  2. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/README.md +7 -1
  3. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/pyproject.toml +2 -2
  4. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/corpus.py +1 -0
  5. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/fetch.py +12 -3
  6. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/page.html +3 -0
  7. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/uv.lock +5 -5
  8. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/.coverage +0 -0
  9. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/.github/workflows/publish.yml +0 -0
  10. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/.github/workflows/test.yml +0 -0
  11. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/.gitignore +0 -0
  12. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/__init__.py +0 -0
  13. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/ai.py +0 -0
  14. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/cli.py +0 -0
  15. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/config.py +0 -0
  16. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/library.py +0 -0
  17. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/store.py +0 -0
  18. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/src/transcript_viewer/viewer.py +0 -0
  19. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/fixtures/big-command.json +0 -0
  20. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/page.test.js +0 -0
  21. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_ai.py +0 -0
  22. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_cli.py +0 -0
  23. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_config.py +0 -0
  24. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_corpus.py +0 -0
  25. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_fetch.py +0 -0
  26. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_library.py +0 -0
  27. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_page.py +0 -0
  28. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_readme.py +0 -0
  29. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_store.py +0 -0
  30. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_stream.py +0 -0
  31. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_style.py +0 -0
  32. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_tidiness.py +0 -0
  33. {transcript_viewer-0.9.0 → transcript_viewer-0.10.0}/tests/test_viewer.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: transcript-viewer
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: Browse agent transcripts in a local, dependency-free web viewer.
5
5
  License: MIT
6
6
  Requires-Python: >=3.12
7
- Requires-Dist: atif-make>=0.6.0
7
+ Requires-Dist: atif-make>=0.7.0
8
8
  Provides-Extra: ai
9
9
  Requires-Dist: anthropic>=0.40; extra == 'ai'
10
10
  Provides-Extra: parquet
@@ -162,7 +162,13 @@ of yours, keeps its file.
162
162
 
163
163
  Some datasets ship as a single file holding many runs — ATBench publishes a
164
164
  thousand agent trajectories as one JSON array, METR's as Parquet shards
165
- (install with `uv tool install "transcript-viewer[parquet]"` to read those). Those are opened rather than
165
+ (install with `uv tool install "transcript-viewer[parquet]"` to read those),
166
+ and an Inspect `.eval` log holds one run per sample.
167
+
168
+ A fetch takes at most 32 GB at once. That is a backstop, not a judgement:
169
+ published corpora are routinely several gigabytes, and what actually guards
170
+ against an accident is the picker, which measures what you have ticked and
171
+ shows it before anything downloads. Those are opened rather than
166
172
  listed: the file is split into a transcript apiece and each is indexed on its
167
173
  own, so a download of one file becomes a thousand sessions you can read. The
168
174
  pieces are kept beside what they came from, so removing the folder removes them
@@ -149,7 +149,13 @@ of yours, keeps its file.
149
149
 
150
150
  Some datasets ship as a single file holding many runs — ATBench publishes a
151
151
  thousand agent trajectories as one JSON array, METR's as Parquet shards
152
- (install with `uv tool install "transcript-viewer[parquet]"` to read those). Those are opened rather than
152
+ (install with `uv tool install "transcript-viewer[parquet]"` to read those),
153
+ and an Inspect `.eval` log holds one run per sample.
154
+
155
+ A fetch takes at most 32 GB at once. That is a backstop, not a judgement:
156
+ published corpora are routinely several gigabytes, and what actually guards
157
+ against an accident is the picker, which measures what you have ticked and
158
+ shows it before anything downloads. Those are opened rather than
153
159
  listed: the file is split into a transcript apiece and each is indexed on its
154
160
  own, so a download of one file becomes a thousand sessions you can read. The
155
161
  pieces are kept beside what they came from, so removing the folder removes them
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "transcript-viewer"
3
- version = "0.9.0"
3
+ version = "0.10.0"
4
4
  description = "Browse agent transcripts in a local, dependency-free web viewer."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -10,7 +10,7 @@ license = { text = "MIT" }
10
10
  # The floor is not politeness: this viewer imports atif_make.container, which
11
11
  # is how a benchmark published as one JSON array of a thousand runs becomes a
12
12
  # thousand sessions. An older atif-make fails to import at all.
13
- dependencies = ["atif-make>=0.6.0"]
13
+ dependencies = ["atif-make>=0.7.0"]
14
14
 
15
15
  [project.optional-dependencies]
16
16
  # Claude-backed explanations are opt-in, so the default install stays
@@ -315,6 +315,7 @@ def scan(roots: list[Path] | None = None, origin: str = "scanned") -> list[Entry
315
315
  + sorted(where.rglob("*.md"))
316
316
  # Not a log, but a container of them, opened above.
317
317
  + sorted(where.rglob("*.parquet"))
318
+ + sorted(where.rglob("*.eval"))
318
319
  )
319
320
  for path in candidates:
320
321
  resolved = path.resolve()
@@ -62,7 +62,9 @@ HOSTS = {
62
62
  LOGS = (".jsonl", ".json", ".har", ".md", ".markdown")
63
63
  # A published dataset is a container of runs rather than a log, but it is still
64
64
  # a thing worth fetching: METR's transcripts come as Parquet shards.
65
- DATASETS = (".parquet",)
65
+ # An Inspect .eval is a zip of JSON, and a corpus of them is where most
66
+ # control research keeps its transcripts.
67
+ DATASETS = (".parquet", ".eval")
66
68
  ARCHIVES = (".zip", ".tgz", ".tar", ".tar.gz", ".tar.bz2", ".tar.xz", ".gz")
67
69
  SUFFIXES = LOGS + DATASETS + ARCHIVES
68
70
 
@@ -88,7 +90,13 @@ AWS_TIMEOUT = 300
88
90
  BROWSE_LIMIT = 3_000
89
91
 
90
92
  MAX_FILES = 2_000
91
- MAX_TOTAL_BYTES = 2 * 1024**3
93
+ # A ceiling on one fetch, not a judgement about what is worth having: published
94
+ # corpora are routinely several gigabytes — MonitoringBench ships as a single
95
+ # 2.5 GB archive — and two was refusing them. What still guards against an
96
+ # accident is the picker, which measures a selection and shows it before
97
+ # anything downloads; this is the backstop for the bucket nobody meant to take
98
+ # whole, which in practice is the 144 GB one.
99
+ MAX_TOTAL_BYTES = 32 * 1024**3
92
100
  TIMEOUT = 60
93
101
 
94
102
 
@@ -579,7 +587,8 @@ def _sized(plan: "Plan") -> "Plan":
579
587
  if known > MAX_TOTAL_BYTES:
580
588
  raise FetchError(
581
589
  f"That is {known / 1024**3:.1f} GB, over the "
582
- f"{MAX_TOTAL_BYTES // 1024**3} GB limit."
590
+ f"{MAX_TOTAL_BYTES // 1024**3} GB limit for one fetch. "
591
+ f"Pick fewer folders, or take it in parts."
583
592
  )
584
593
  return plan
585
594
 
@@ -1731,6 +1731,9 @@ const EXAMPLES=[
1731
1731
  {name:"Redwood sabotage trajectories",
1732
1732
  url:"s3://rr-strajs",
1733
1733
  note:"136 transcripts, honest and attack in pairs — needs an AWS profile"},
1734
+ {name:"MonitoringBench",
1735
+ url:"https://huggingface.co/datasets/neur26anonsub/ctrldataset2026",
1736
+ note:"2,644 attack runs as Inspect logs — the archive alone is 2.5 GB"},
1734
1737
  ];
1735
1738
 
1736
1739
  function drawExamples(){
@@ -44,11 +44,11 @@ wheels = [
44
44
 
45
45
  [[package]]
46
46
  name = "atif-make"
47
- version = "0.6.0"
47
+ version = "0.7.0"
48
48
  source = { registry = "https://pypi.org/simple" }
49
- sdist = { url = "https://files.pythonhosted.org/packages/d3/2b/b8cf83efc63bc09a546eb15b4a13a6013413f14b02ce2cc8e491c7884c21/atif_make-0.6.0.tar.gz", hash = "sha256:1aabe7af93cb07cbe23f39dd6f28aab5aa42f96074eb6f0d8312400447493f77", size = 240892, upload-time = "2026-08-24T21:29:42.84Z" }
49
+ sdist = { url = "https://files.pythonhosted.org/packages/6a/ed/b1fbadcc65d59186442517059beffe7c4a590be85d17308d9143278a2104/atif_make-0.7.0.tar.gz", hash = "sha256:858966e102e772f35ffc3fdcd25a11cb52759190233b41cead3878dc607ff4ce", size = 350496, upload-time = "2026-08-24T21:49:42.323Z" }
50
50
  wheels = [
51
- { url = "https://files.pythonhosted.org/packages/f9/b2/41bc96961d27d0d8794844ff2c716345f4593f6d1c0d7378039d3ce02b19/atif_make-0.6.0-py3-none-any.whl", hash = "sha256:add29b4bfb41682840b2e1bfe1564ac3b97c6eebe3f894c321b30d7d95485373", size = 58826, upload-time = "2026-08-24T21:29:41.798Z" },
51
+ { url = "https://files.pythonhosted.org/packages/14/7b/d135b4b2bec98599cb65166f278487f87d9842492c2f13e8a1385c6a3e85/atif_make-0.7.0-py3-none-any.whl", hash = "sha256:ef1601b5d2ac3e07b9e9e97ee0a2e0856b953b4ba317633e6f590747b450659e", size = 63987, upload-time = "2026-08-24T21:49:41.087Z" },
52
52
  ]
53
53
 
54
54
  [package.optional-dependencies]
@@ -388,7 +388,7 @@ wheels = [
388
388
 
389
389
  [[package]]
390
390
  name = "transcript-viewer"
391
- version = "0.9.0"
391
+ version = "0.10.0"
392
392
  source = { editable = "." }
393
393
  dependencies = [
394
394
  { name = "atif-make" },
@@ -410,7 +410,7 @@ dev = [
410
410
  [package.metadata]
411
411
  requires-dist = [
412
412
  { name = "anthropic", marker = "extra == 'ai'", specifier = ">=0.40" },
413
- { name = "atif-make", specifier = ">=0.6.0" },
413
+ { name = "atif-make", specifier = ">=0.7.0" },
414
414
  { name = "atif-make", extras = ["parquet"], marker = "extra == 'parquet'", specifier = ">=0.5.0" },
415
415
  ]
416
416
  provides-extras = ["parquet", "ai"]