inspect-scout 0.3.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 (122) hide show
  1. inspect_scout-0.3.0/.gitignore +227 -0
  2. inspect_scout-0.3.0/LICENSE +21 -0
  3. inspect_scout-0.3.0/PKG-INFO +88 -0
  4. inspect_scout-0.3.0/README.md +32 -0
  5. inspect_scout-0.3.0/pyproject.toml +143 -0
  6. inspect_scout-0.3.0/src/inspect_scout/.gitignore +2 -0
  7. inspect_scout-0.3.0/src/inspect_scout/__init__.py +146 -0
  8. inspect_scout-0.3.0/src/inspect_scout/_cli/__init__.py +4 -0
  9. inspect_scout-0.3.0/src/inspect_scout/_cli/common.py +77 -0
  10. inspect_scout-0.3.0/src/inspect_scout/_cli/info.py +29 -0
  11. inspect_scout-0.3.0/src/inspect_scout/_cli/main.py +55 -0
  12. inspect_scout-0.3.0/src/inspect_scout/_cli/scan.py +535 -0
  13. inspect_scout-0.3.0/src/inspect_scout/_cli/scan_complete.py +21 -0
  14. inspect_scout-0.3.0/src/inspect_scout/_cli/scan_list.py +56 -0
  15. inspect_scout-0.3.0/src/inspect_scout/_cli/scan_resume.py +21 -0
  16. inspect_scout-0.3.0/src/inspect_scout/_cli/scan_status.py +23 -0
  17. inspect_scout-0.3.0/src/inspect_scout/_cli/trace.py +80 -0
  18. inspect_scout-0.3.0/src/inspect_scout/_cli/view.py +61 -0
  19. inspect_scout-0.3.0/src/inspect_scout/_concurrency/__init__.py +0 -0
  20. inspect_scout-0.3.0/src/inspect_scout/_concurrency/_iterator.py +50 -0
  21. inspect_scout-0.3.0/src/inspect_scout/_concurrency/_mp_common.py +200 -0
  22. inspect_scout-0.3.0/src/inspect_scout/_concurrency/_mp_logging.py +48 -0
  23. inspect_scout-0.3.0/src/inspect_scout/_concurrency/_mp_registry.py +198 -0
  24. inspect_scout-0.3.0/src/inspect_scout/_concurrency/_mp_semaphore.py +78 -0
  25. inspect_scout-0.3.0/src/inspect_scout/_concurrency/_mp_shutdown.py +200 -0
  26. inspect_scout-0.3.0/src/inspect_scout/_concurrency/_mp_subprocess.py +209 -0
  27. inspect_scout-0.3.0/src/inspect_scout/_concurrency/common.py +102 -0
  28. inspect_scout-0.3.0/src/inspect_scout/_concurrency/multi_process.py +330 -0
  29. inspect_scout-0.3.0/src/inspect_scout/_concurrency/single_process.py +310 -0
  30. inspect_scout-0.3.0/src/inspect_scout/_display/__init__.py +9 -0
  31. inspect_scout-0.3.0/src/inspect_scout/_display/_display.py +103 -0
  32. inspect_scout-0.3.0/src/inspect_scout/_display/none.py +32 -0
  33. inspect_scout-0.3.0/src/inspect_scout/_display/plain.py +145 -0
  34. inspect_scout-0.3.0/src/inspect_scout/_display/protocol.py +81 -0
  35. inspect_scout-0.3.0/src/inspect_scout/_display/rich.py +390 -0
  36. inspect_scout-0.3.0/src/inspect_scout/_display/util.py +96 -0
  37. inspect_scout-0.3.0/src/inspect_scout/_llm_scanner/__init__.py +4 -0
  38. inspect_scout-0.3.0/src/inspect_scout/_llm_scanner/_llm_scanner.py +216 -0
  39. inspect_scout-0.3.0/src/inspect_scout/_llm_scanner/answer.py +322 -0
  40. inspect_scout-0.3.0/src/inspect_scout/_llm_scanner/prompt.py +56 -0
  41. inspect_scout-0.3.0/src/inspect_scout/_llm_scanner/structured.py +431 -0
  42. inspect_scout-0.3.0/src/inspect_scout/_llm_scanner/types.py +46 -0
  43. inspect_scout-0.3.0/src/inspect_scout/_recorder/__init__.py +0 -0
  44. inspect_scout-0.3.0/src/inspect_scout/_recorder/buffer.py +375 -0
  45. inspect_scout-0.3.0/src/inspect_scout/_recorder/factory.py +10 -0
  46. inspect_scout-0.3.0/src/inspect_scout/_recorder/file.py +603 -0
  47. inspect_scout-0.3.0/src/inspect_scout/_recorder/recorder.py +200 -0
  48. inspect_scout-0.3.0/src/inspect_scout/_recorder/summary.py +104 -0
  49. inspect_scout-0.3.0/src/inspect_scout/_scan.py +976 -0
  50. inspect_scout-0.3.0/src/inspect_scout/_scancontext.py +225 -0
  51. inspect_scout-0.3.0/src/inspect_scout/_scanjob.py +514 -0
  52. inspect_scout-0.3.0/src/inspect_scout/_scanlist.py +30 -0
  53. inspect_scout-0.3.0/src/inspect_scout/_scanner/__init__.py +0 -0
  54. inspect_scout-0.3.0/src/inspect_scout/_scanner/_loaders.py +194 -0
  55. inspect_scout-0.3.0/src/inspect_scout/_scanner/extract.py +263 -0
  56. inspect_scout-0.3.0/src/inspect_scout/_scanner/filter.py +74 -0
  57. inspect_scout-0.3.0/src/inspect_scout/_scanner/loader.py +221 -0
  58. inspect_scout-0.3.0/src/inspect_scout/_scanner/result.py +202 -0
  59. inspect_scout-0.3.0/src/inspect_scout/_scanner/scanner.py +443 -0
  60. inspect_scout-0.3.0/src/inspect_scout/_scanner/scorer.py +146 -0
  61. inspect_scout-0.3.0/src/inspect_scout/_scanner/types.py +20 -0
  62. inspect_scout-0.3.0/src/inspect_scout/_scanner/util.py +50 -0
  63. inspect_scout-0.3.0/src/inspect_scout/_scanner/validate.py +453 -0
  64. inspect_scout-0.3.0/src/inspect_scout/_scanresults.py +502 -0
  65. inspect_scout-0.3.0/src/inspect_scout/_scanspec.py +175 -0
  66. inspect_scout-0.3.0/src/inspect_scout/_transcript/__init__.py +0 -0
  67. inspect_scout-0.3.0/src/inspect_scout/_transcript/caching.py +191 -0
  68. inspect_scout-0.3.0/src/inspect_scout/_transcript/database/__init__.py +0 -0
  69. inspect_scout-0.3.0/src/inspect_scout/_transcript/database/database.py +105 -0
  70. inspect_scout-0.3.0/src/inspect_scout/_transcript/database/factory.py +77 -0
  71. inspect_scout-0.3.0/src/inspect_scout/_transcript/database/parquet.py +917 -0
  72. inspect_scout-0.3.0/src/inspect_scout/_transcript/database/reader.py +110 -0
  73. inspect_scout-0.3.0/src/inspect_scout/_transcript/eval_log.py +482 -0
  74. inspect_scout-0.3.0/src/inspect_scout/_transcript/factory.py +86 -0
  75. inspect_scout-0.3.0/src/inspect_scout/_transcript/json/__init__.py +0 -0
  76. inspect_scout-0.3.0/src/inspect_scout/_transcript/json/load_filtered.py +282 -0
  77. inspect_scout-0.3.0/src/inspect_scout/_transcript/json/reducer.py +188 -0
  78. inspect_scout-0.3.0/src/inspect_scout/_transcript/local_files_cache.py +153 -0
  79. inspect_scout-0.3.0/src/inspect_scout/_transcript/log.py +175 -0
  80. inspect_scout-0.3.0/src/inspect_scout/_transcript/metadata.py +663 -0
  81. inspect_scout-0.3.0/src/inspect_scout/_transcript/source.py +12 -0
  82. inspect_scout-0.3.0/src/inspect_scout/_transcript/transcripts.py +199 -0
  83. inspect_scout-0.3.0/src/inspect_scout/_transcript/types.py +81 -0
  84. inspect_scout-0.3.0/src/inspect_scout/_transcript/util.py +283 -0
  85. inspect_scout-0.3.0/src/inspect_scout/_util/__init__.py +0 -0
  86. inspect_scout-0.3.0/src/inspect_scout/_util/_json.py +0 -0
  87. inspect_scout-0.3.0/src/inspect_scout/_util/appdirs.py +9 -0
  88. inspect_scout-0.3.0/src/inspect_scout/_util/async_bytes_reader.py +91 -0
  89. inspect_scout-0.3.0/src/inspect_scout/_util/async_zip.py +415 -0
  90. inspect_scout-0.3.0/src/inspect_scout/_util/attachments.py +19 -0
  91. inspect_scout-0.3.0/src/inspect_scout/_util/constants.py +12 -0
  92. inspect_scout-0.3.0/src/inspect_scout/_util/decorator.py +6 -0
  93. inspect_scout-0.3.0/src/inspect_scout/_util/jinja.py +25 -0
  94. inspect_scout-0.3.0/src/inspect_scout/_util/log.py +18 -0
  95. inspect_scout-0.3.0/src/inspect_scout/_util/path.py +28 -0
  96. inspect_scout-0.3.0/src/inspect_scout/_util/port.py +67 -0
  97. inspect_scout-0.3.0/src/inspect_scout/_util/refusal.py +40 -0
  98. inspect_scout-0.3.0/src/inspect_scout/_util/revision.py +90 -0
  99. inspect_scout-0.3.0/src/inspect_scout/_util/trace.py +7 -0
  100. inspect_scout-0.3.0/src/inspect_scout/_validation/__init__.py +5 -0
  101. inspect_scout-0.3.0/src/inspect_scout/_validation/predicates.py +207 -0
  102. inspect_scout-0.3.0/src/inspect_scout/_validation/types.py +88 -0
  103. inspect_scout-0.3.0/src/inspect_scout/_validation/validate.py +161 -0
  104. inspect_scout-0.3.0/src/inspect_scout/_validation/validation.py +274 -0
  105. inspect_scout-0.3.0/src/inspect_scout/_version.py +34 -0
  106. inspect_scout-0.3.0/src/inspect_scout/_view/__init__.py +0 -0
  107. inspect_scout-0.3.0/src/inspect_scout/_view/notify.py +51 -0
  108. inspect_scout-0.3.0/src/inspect_scout/_view/server.py +356 -0
  109. inspect_scout-0.3.0/src/inspect_scout/_view/view.py +36 -0
  110. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/_commonjsHelpers.js +9 -0
  111. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/chunk-DfAF0w94.js +9 -0
  112. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/favicon.svg +22 -0
  113. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/index.css +8078 -0
  114. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/index.js +137745 -0
  115. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/lib-CBtriEt5.js +1070 -0
  116. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/liteDOM-Cp0aN3bP.js +644 -0
  117. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/tex-svg-full-BI3fonbT.js +28011 -0
  118. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/wgxpath.install-node-Csk64Aj9.js +1081 -0
  119. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/assets/xypic-DrMJn58R.js +9542 -0
  120. inspect_scout-0.3.0/src/inspect_scout/_view/www/dist/index.html +29 -0
  121. inspect_scout-0.3.0/src/inspect_scout/async/__init__.py +21 -0
  122. inspect_scout-0.3.0/src/inspect_scout/py.typed +0 -0
@@ -0,0 +1,227 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ downloads/
14
+ eggs/
15
+ .eggs/
16
+ lib/
17
+ lib64/
18
+ parts/
19
+ sdist/
20
+ var/
21
+ wheels/
22
+ share/python-wheels/
23
+ *.egg-info/
24
+ .installed.cfg
25
+ *.egg
26
+ MANIFEST
27
+
28
+ # PyInstaller
29
+ # Usually these files are written by a python script from a template
30
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
31
+ *.manifest
32
+ *.spec
33
+
34
+ # Installer logs
35
+ pip-log.txt
36
+ pip-delete-this-directory.txt
37
+
38
+ # Unit test / coverage reports
39
+ htmlcov/
40
+ .tox/
41
+ .nox/
42
+ .coverage
43
+ .coverage.*
44
+ .cache
45
+ nosetests.xml
46
+ coverage.xml
47
+ *.cover
48
+ *.py.cover
49
+ .hypothesis/
50
+ .pytest_cache/
51
+ cover/
52
+
53
+ # Translations
54
+ *.mo
55
+ *.pot
56
+
57
+ # Django stuff:
58
+ *.log
59
+ local_settings.py
60
+ db.sqlite3
61
+ db.sqlite3-journal
62
+
63
+ # Flask stuff:
64
+ instance/
65
+ .webassets-cache
66
+
67
+ # Scrapy stuff:
68
+ .scrapy
69
+
70
+ # Sphinx documentation
71
+ docs/_build/
72
+
73
+ # PyBuilder
74
+ .pybuilder/
75
+ target/
76
+
77
+ # Jupyter Notebook
78
+ .ipynb_checkpoints
79
+
80
+ # IPython
81
+ profile_default/
82
+ ipython_config.py
83
+
84
+ # pyenv
85
+ # For a library or package, you might want to ignore these files since the code is
86
+ # intended to run in multiple environments; otherwise, check them in:
87
+ # .python-version
88
+
89
+ # pipenv
90
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
91
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
92
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
93
+ # install all needed dependencies.
94
+ #Pipfile.lock
95
+
96
+ # UV
97
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
98
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
99
+ # commonly ignored for libraries.
100
+ #uv.lock
101
+
102
+ # poetry
103
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
104
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
105
+ # commonly ignored for libraries.
106
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
107
+ #poetry.lock
108
+ #poetry.toml
109
+
110
+ # pdm
111
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
112
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
113
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
114
+ #pdm.lock
115
+ #pdm.toml
116
+ .pdm-python
117
+ .pdm-build/
118
+
119
+ # pixi
120
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
121
+ #pixi.lock
122
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
123
+ # in the .venv directory. It is recommended not to include this directory in version control.
124
+ .pixi
125
+
126
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
127
+ __pypackages__/
128
+
129
+ # Celery stuff
130
+ celerybeat-schedule
131
+ celerybeat.pid
132
+
133
+ # SageMath parsed files
134
+ *.sage.py
135
+
136
+ # Environments
137
+ .env
138
+ .envrc
139
+ .venv*
140
+ env/
141
+ venv/
142
+ ENV/
143
+ env.bak/
144
+ venv.bak/
145
+
146
+ # Spyder project settings
147
+ .spyderproject
148
+ .spyproject
149
+
150
+ # Rope project settings
151
+ .ropeproject
152
+
153
+ # mkdocs documentation
154
+ /site
155
+
156
+ # mypy
157
+ .mypy_cache/
158
+ .dmypy.json
159
+ dmypy.json
160
+
161
+ # Pyre type checker
162
+ .pyre/
163
+
164
+ # pytype static type analyzer
165
+ .pytype/
166
+
167
+ # Cython debug symbols
168
+ cython_debug/
169
+
170
+ # PyCharm
171
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
172
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
173
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
174
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
175
+ #.idea/
176
+
177
+ # Abstra
178
+ # Abstra is an AI-powered process automation framework.
179
+ # Ignore directories containing user credentials, local state, and settings.
180
+ # Learn more at https://abstra.io/docs
181
+ .abstra/
182
+
183
+ # Visual Studio Code
184
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
185
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
186
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
187
+ # you could uncomment the following to ignore the entire vscode folder
188
+ # .vscode/
189
+
190
+ # Ruff stuff:
191
+ .ruff_cache/
192
+
193
+ # PyPI configuration file
194
+ .pypirc
195
+
196
+ # Cursor
197
+ # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
198
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
199
+ # refer to https://docs.cursor.com/context/ignore-files
200
+ .cursorignore
201
+ .cursorindexingignore
202
+
203
+ # Marimo
204
+ marimo/_static/
205
+ marimo/_lsp/
206
+ __marimo__/
207
+
208
+ # Dynamic version
209
+ src/inspect_scout/_version.py
210
+
211
+ # Inspect logs and scans
212
+ /logs/
213
+ /scans/
214
+
215
+ # MacOS
216
+ .DS_Store
217
+
218
+ # Claude Code
219
+ **/.claude/settings.local.json
220
+
221
+ /.luarc.json
222
+
223
+ # node
224
+ /src/inspect_scout/_view/www/node_modules
225
+
226
+ # dist builds
227
+ /src/inspect_scout/_view/www/*.tgz
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Meridian Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,88 @@
1
+ Metadata-Version: 2.4
2
+ Name: inspect_scout
3
+ Version: 0.3.0
4
+ Summary: AI Analysis
5
+ Project-URL: Source Code, https://github.com/meridianlabs-ai/inspect_scout
6
+ Project-URL: Issue Tracker, https://github.com/meridianlabs-ai/inspect_scout/issues
7
+ Author: Meridian Labs
8
+ License: MIT License
9
+ License-File: LICENSE
10
+ Requires-Python: >=3.10
11
+ Requires-Dist: anyio>=4.8.0
12
+ Requires-Dist: click!=8.2.0,<8.2.2,>=8.1.3
13
+ Requires-Dist: dill>=0.4.0
14
+ Requires-Dist: duckdb>=1.4.0
15
+ Requires-Dist: fastapi
16
+ Requires-Dist: ijson>=3.2.0
17
+ Requires-Dist: importlib-metadata
18
+ Requires-Dist: inspect-ai>=0.3.144
19
+ Requires-Dist: jinja2>=3.0.0
20
+ Requires-Dist: jsonlines>=3.0.0
21
+ Requires-Dist: jsonschema>3.1.1
22
+ Requires-Dist: pandas>=2.0.0
23
+ Requires-Dist: psutil>=6.0.0
24
+ Requires-Dist: pyarrow>=10.0.1
25
+ Requires-Dist: pydantic>=2.11.4
26
+ Requires-Dist: python-dotenv>=0.16.0
27
+ Requires-Dist: rich!=14.0.0,>=13.3.3
28
+ Requires-Dist: shortuuid
29
+ Requires-Dist: typing-extensions>=4.9.0
30
+ Requires-Dist: universal-pathlib>=0.2.6
31
+ Requires-Dist: uvicorn
32
+ Provides-Extra: dev
33
+ Requires-Dist: anthropic; extra == 'dev'
34
+ Requires-Dist: mypy; extra == 'dev'
35
+ Requires-Dist: openai; extra == 'dev'
36
+ Requires-Dist: pandas-stubs>=2.3.2.250926; extra == 'dev'
37
+ Requires-Dist: pyarrow-stubs>=20.0.0.20250928; extra == 'dev'
38
+ Requires-Dist: pytest; extra == 'dev'
39
+ Requires-Dist: pytest-asyncio; extra == 'dev'
40
+ Requires-Dist: pytest-dotenv; extra == 'dev'
41
+ Requires-Dist: ruff; extra == 'dev'
42
+ Requires-Dist: types-jsonschema; extra == 'dev'
43
+ Requires-Dist: types-psutil; extra == 'dev'
44
+ Requires-Dist: types-pyyaml; extra == 'dev'
45
+ Provides-Extra: dist
46
+ Requires-Dist: build; extra == 'dist'
47
+ Requires-Dist: twine; extra == 'dist'
48
+ Provides-Extra: doc
49
+ Requires-Dist: griffe; extra == 'doc'
50
+ Requires-Dist: jupyter; extra == 'doc'
51
+ Requires-Dist: markdown; extra == 'doc'
52
+ Requires-Dist: panflute; extra == 'doc'
53
+ Requires-Dist: pyyaml; extra == 'doc'
54
+ Requires-Dist: types-markdown; extra == 'doc'
55
+ Description-Content-Type: text/markdown
56
+
57
+ Welcome to Inspect Scout.
58
+
59
+ To get started with Inspect Scout, please see the [documentation](https://meridianlabs-ai.github.io/inspect_scout/).
60
+
61
+ ***
62
+
63
+ ## Installation
64
+
65
+ Latest development version:
66
+
67
+ ```bash
68
+ pip install git+https://github.com/meridianlabs-ai/inspect_scout
69
+ ```
70
+
71
+ ## Development
72
+
73
+ To work on development of Inspect Scout, clone the repository and install with the `-e` flag and `[dev]` optional dependencies:
74
+
75
+ ```bash
76
+ git clone https://github.com/meridianlabs-ai/inspect_scout
77
+ cd inspect_scout
78
+ pip install -e ".[dev]"
79
+ ```
80
+
81
+ Run linting, formatting, and tests via
82
+
83
+ ```bash
84
+ make check
85
+ make test
86
+ ```
87
+
88
+
@@ -0,0 +1,32 @@
1
+ Welcome to Inspect Scout.
2
+
3
+ To get started with Inspect Scout, please see the [documentation](https://meridianlabs-ai.github.io/inspect_scout/).
4
+
5
+ ***
6
+
7
+ ## Installation
8
+
9
+ Latest development version:
10
+
11
+ ```bash
12
+ pip install git+https://github.com/meridianlabs-ai/inspect_scout
13
+ ```
14
+
15
+ ## Development
16
+
17
+ To work on development of Inspect Scout, clone the repository and install with the `-e` flag and `[dev]` optional dependencies:
18
+
19
+ ```bash
20
+ git clone https://github.com/meridianlabs-ai/inspect_scout
21
+ cd inspect_scout
22
+ pip install -e ".[dev]"
23
+ ```
24
+
25
+ Run linting, formatting, and tests via
26
+
27
+ ```bash
28
+ make check
29
+ make test
30
+ ```
31
+
32
+
@@ -0,0 +1,143 @@
1
+ [build-system]
2
+ requires = ["hatchling", "hatch-vcs"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "inspect_scout"
7
+ dynamic = ["version"]
8
+ description = "AI Analysis"
9
+ authors = [{ name = "Meridian Labs" }]
10
+ readme = "README.md"
11
+ requires-python = ">=3.10"
12
+ license = { text = "MIT License" }
13
+ dependencies = [
14
+ "anyio>=4.8.0",
15
+ "click>=8.1.3,!=8.2.0,<8.2.2",
16
+ "dill>=0.4.0",
17
+ "duckdb>=1.4.0",
18
+ "fastapi",
19
+ "ijson>=3.2.0",
20
+ "importlib-metadata",
21
+ "inspect-ai>=0.3.144",
22
+ "jinja2>=3.0.0",
23
+ "jsonlines>=3.0.0",
24
+ "jsonschema>3.1.1",
25
+ "pandas>=2.0.0",
26
+ "psutil>=6.0.0",
27
+ "pyarrow>=10.0.1",
28
+ "pydantic>=2.11.4",
29
+ "python-dotenv>=0.16.0",
30
+ "rich>=13.3.3,!=14.0.0",
31
+ "shortuuid",
32
+ "typing_extensions>=4.9.0",
33
+ "universal-pathlib>=0.2.6",
34
+ "uvicorn"
35
+ ]
36
+
37
+ [project.urls]
38
+ "Source Code" = "https://github.com/meridianlabs-ai/inspect_scout"
39
+ "Issue Tracker" = "https://github.com/meridianlabs-ai/inspect_scout/issues"
40
+
41
+ [project.scripts]
42
+ scout = "inspect_scout._cli.main:main"
43
+
44
+ [project.optional-dependencies]
45
+ dev = [
46
+ "ruff",
47
+ "pytest",
48
+ "anthropic",
49
+ "openai",
50
+ "pytest-dotenv",
51
+ "pytest-asyncio",
52
+ "mypy",
53
+ "pandas-stubs>=2.3.2.250926",
54
+ "pyarrow-stubs>=20.0.0.20250928",
55
+ "types-jsonschema",
56
+ "types-psutil",
57
+ "types-PyYAML"
58
+ ]
59
+ doc = [
60
+ "jupyter",
61
+ "panflute",
62
+ "markdown",
63
+ "griffe",
64
+ "pyyaml",
65
+ "types-Markdown",
66
+ ]
67
+ dist = ["twine", "build"]
68
+
69
+ [dependency-groups]
70
+ dev = [
71
+ "ruff",
72
+ "pytest",
73
+ "anthropic",
74
+ "openai",
75
+ "pytest-dotenv",
76
+ "pytest-asyncio",
77
+ "mypy",
78
+ "pandas-stubs>=2.3.2.250926",
79
+ "pyarrow-stubs>=20.0.0.20250928",
80
+ "types-jsonschema",
81
+ "types-psutil",
82
+ "types-PyYAML"
83
+ ]
84
+ doc = [
85
+ "jupyter",
86
+ "panflute",
87
+ "markdown",
88
+ "griffe",
89
+ "pyyaml",
90
+ ]
91
+ dist = ["twine", "build"]
92
+
93
+ [tool.hatch.build]
94
+ only-packages = true
95
+ exclude = ["docs/", "tests/"]
96
+ artifacts = ["src/inspect_scout/_view/www/dist"]
97
+
98
+ [tool.hatch.version]
99
+ source = "vcs"
100
+
101
+ [tool.hatch.build.hooks.vcs]
102
+ version-file = "src/inspect_scout/_version.py"
103
+
104
+ [tool.hatch.version.raw-options]
105
+ local_scheme = "no-local-version" # Important for PyPI compatibility
106
+
107
+ [tool.hatch.metadata]
108
+ allow-direct-references = true
109
+
110
+ [tool.uv]
111
+ managed = true
112
+
113
+ [tool.ruff]
114
+ extend-exclude = ["docs"]
115
+ src = ["."]
116
+
117
+ [tool.ruff.lint]
118
+ select = [
119
+ "E", # pycodestyle errors
120
+ "W", # pycodestyle warnings
121
+ "F", # flake8
122
+ "D", # pydocstyle
123
+ "I", # isort
124
+ "B", # flake8-bugbear
125
+ "SIM101", # duplicate isinstance
126
+ # "RET", # flake8-return
127
+ # "RUF", # ruff rules
128
+ ]
129
+ ignore = ["E203", "E501", "D10", "D212", "D415"]
130
+
131
+ [tool.ruff.lint.pydocstyle]
132
+ convention = "google"
133
+
134
+ [tool.pytest.ini_options]
135
+ pythonpath = ["src"]
136
+ testpaths = ["tests"]
137
+
138
+ [tool.mypy]
139
+ strict = true
140
+ mypy_path = "src"
141
+ files = ["src", "examples"]
142
+ namespace_packages = true
143
+ explicit_package_bases = true
@@ -0,0 +1,2 @@
1
+ # A convenience directory where dev's can goof around/test
2
+ _dev_private/*
@@ -0,0 +1,146 @@
1
+ from inspect_ai._util.deprecation import relocated_module_attribute
2
+
3
+ from ._llm_scanner import AnswerMultiLabel, AnswerStructured, llm_scanner
4
+ from ._recorder.recorder import (
5
+ ScanResultsDF,
6
+ Status,
7
+ )
8
+ from ._recorder.summary import Summary
9
+ from ._scan import (
10
+ scan,
11
+ scan_complete,
12
+ scan_resume,
13
+ )
14
+ from ._scanjob import ScanJob, ScanJobConfig, scanjob
15
+ from ._scanlist import scan_list
16
+ from ._scanner.extract import (
17
+ MessageFormatOptions,
18
+ MessagesPreprocessor,
19
+ messages_as_str,
20
+ )
21
+ from ._scanner.loader import Loader, loader
22
+ from ._scanner.result import Error, Reference, Result
23
+ from ._scanner.scanner import Scanner, scanner
24
+ from ._scanner.scorer import as_scorer
25
+ from ._scanner.types import ScannerInput
26
+ from ._scanresults import (
27
+ scan_results_df,
28
+ scan_status,
29
+ )
30
+ from ._scanspec import (
31
+ ScannerSpec,
32
+ ScannerWork,
33
+ ScanOptions,
34
+ ScanRevision,
35
+ ScanSpec,
36
+ ScanTranscripts,
37
+ TranscriptField,
38
+ )
39
+ from ._transcript.database.database import TranscriptsDB
40
+ from ._transcript.database.factory import transcripts_db
41
+ from ._transcript.factory import transcripts_from
42
+ from ._transcript.log import LogMetadata, log_metadata
43
+ from ._transcript.metadata import Column, Condition, Metadata, metadata
44
+ from ._transcript.source import TranscriptsSource
45
+ from ._transcript.transcripts import Transcripts, TranscriptsReader
46
+ from ._transcript.types import (
47
+ EventType,
48
+ MessageType,
49
+ Transcript,
50
+ TranscriptInfo,
51
+ )
52
+ from ._util.refusal import RefusalError
53
+ from ._validation import (
54
+ ValidationCase,
55
+ ValidationPredicate,
56
+ ValidationSet,
57
+ validation_set,
58
+ )
59
+
60
+ try:
61
+ from ._version import __version__
62
+ except ImportError:
63
+ __version__ = "unknown"
64
+
65
+
66
+ __all__ = [
67
+ # scan
68
+ "scan",
69
+ "scan_resume",
70
+ "scan_complete",
71
+ "ScanSpec",
72
+ "ScanOptions",
73
+ "ScannerSpec",
74
+ "ScannerWork",
75
+ "ScanRevision",
76
+ "ScanTranscripts",
77
+ "TranscriptField",
78
+ "scanjob",
79
+ "ScanJob",
80
+ "ScanJobConfig",
81
+ "scan_list",
82
+ "scan_status",
83
+ "scan_results_df",
84
+ "Status",
85
+ "ScanResultsDF",
86
+ "Summary",
87
+ # transcript
88
+ "transcripts_db",
89
+ "TranscriptsDB",
90
+ "transcripts_from",
91
+ "Transcripts",
92
+ "TranscriptsSource",
93
+ "TranscriptsReader",
94
+ "Transcript",
95
+ "TranscriptInfo",
96
+ "Column",
97
+ "Condition",
98
+ "Metadata",
99
+ "metadata",
100
+ "LogMetadata",
101
+ "log_metadata",
102
+ # scanner
103
+ "Error",
104
+ "Scanner",
105
+ "ScannerInput",
106
+ "Result",
107
+ "Reference",
108
+ "scanner",
109
+ "Loader",
110
+ "loader",
111
+ "EventType",
112
+ "MessageType",
113
+ "as_scorer",
114
+ "messages_as_str",
115
+ "MessageFormatOptions",
116
+ "MessagesPreprocessor",
117
+ "RefusalError",
118
+ "llm_scanner",
119
+ "AnswerMultiLabel",
120
+ "AnswerStructured",
121
+ # validation
122
+ "ValidationSet",
123
+ "ValidationCase",
124
+ "ValidationPredicate",
125
+ "validation_set",
126
+ # version
127
+ "__version__",
128
+ ]
129
+
130
+
131
+ _DEPRECATED_VERSION_2_2 = "0.2.2"
132
+ _REMOVED_IN = "0.3"
133
+ relocated_module_attribute(
134
+ "scan_results",
135
+ "inspect_scout.scan_results_df",
136
+ _DEPRECATED_VERSION_2_2,
137
+ _REMOVED_IN,
138
+ )
139
+
140
+
141
+ relocated_module_attribute(
142
+ "transcripts_from_logs",
143
+ "inspect_scout.transcripts_from",
144
+ _DEPRECATED_VERSION_2_2,
145
+ _REMOVED_IN,
146
+ )
@@ -0,0 +1,4 @@
1
+ # Import subcommands to ensure they are registered with their parent commands
2
+ from . import scan, scan_complete, scan_list, scan_resume, trace # noqa: F401
3
+
4
+ __all__ = ["scan", "scan_complete", "scan_list", "scan_resume", "trace"]