whatifd-inspect-ai
Inspect AI Scorer adapter for whatifd. Phase 4B.2 of the v0.1 plan.
Install
pip install whatifd-inspect-ai
Pulls whatifd and inspect-ai>=0.3.216,<0.4 (industry-standard library pinning: lower bound + minor-version cap, since Inspect AI is pre-1.0 and ships breaking changes within minor bumps).
Usage
from inspect_ai.scorer import Score, Target
from inspect_ai.solver import TaskState
from whatifd_inspect_ai import InspectAIScorer
from whatifd.contract import ScoreCase
def score_fn(case: ScoreCase) -> Score:
"""Wire the user's Inspect AI scorer into the (ScoreCase) -> Score
callable shape this adapter expects. Typical pattern: build a
TaskState from the case, run the Inspect AI scorer, return Score."""
state = TaskState(
model="anthropic/claude-opus-4-7",
sample_id=case.trace_id,
epoch=0,
input=case.input.user_message,
messages=[],
output=..., # ModelOutput from case.replayed_output.text
)
target = Target(case.original_output.text)
return my_inspect_scorer(state, target)
scorer = InspectAIScorer(
score_fn=score_fn,
judge_provider="anthropic",
judge_model_id="claude-opus-4-7",
rubric_id="faithfulness-v1",
rubric_text="Score 0-1 by faithfulness to the original output...",
scoring_parameters={"temperature": 0.0, "max_tokens": 256},
)
# Plug into the whatifd pipeline alongside a TraceSource.
Cardinal alignment
- #5 Sensitive at the boundary:
JudgeResult.rationaleis wrapped at_project_score. Inspect AI'sScore.explanationcarries free text from the judge model; it MUST be wrapped before any whatifd-core code sees it. - #1 failures-as-data: when the wrapped
score_fnreturnsNoneor raises, the adapter surfaces aJudgeResult(score=None)with structured rationale. The pipeline converts that into aFailureRecord. A non-numericScore.value(e.g., a categorical label) projects toscore=Noneinstead of crashing onfloat(). - #10 statistical claims: the adapter is metric-agnostic — that's the user's responsibility when defining the Inspect AI scorer. Methodology (judge model, rubric hash, scoring parameters) flows through
cache_key_components.
Why no recorded-smoke test in this package
Unlike Langfuse (which has a hosted ingestion API replayed via pytest-recording cassettes), Inspect AI is a local evaluation framework — its scorers run in-process against a model provider (Anthropic / OpenAI / etc.). There is no "Inspect AI host" to record HTTP cassettes against. The real-network surface is the model provider behind Inspect, which Phase 9B's real-adapter smoke covers via the integration suite. This package ships mocked-only conformance; cardinal #5 still applies (Sensitive[str] at the boundary), and the conformance harness pins it.
Contributor setup
This package lives in the parent whatifd monorepo as a uv workspace member. From the repo root:
uv sync --all-extras --dev --group workspace
The --group workspace flag pulls the in-tree whatifd-inspect-ai editable install via PEP 735 dependency groups (uv-native). Without it, uv sync --all-extras --dev installs the rest of the dev environment but leaves this package out, and pytest packages/whatifd-inspect-ai/tests/ fails with ModuleNotFoundError: whatifd_inspect_ai.
Plain pip install ".[dev]" will NOT work for the workspace package — pip ignores PEP 735 groups (deliberate; the workspace dep can't be resolved from PyPI because it isn't published yet). Use uv for development setup; pip-only consumers install the published whatifd-inspect-ai from PyPI once it lands.
Stability
Pre-1.0; the adapter follows whatifd's v0.1 stability contract. The Inspect AI minor-version cap (<0.4) reserves the next minor for a coordinated migration if Inspect AI changes the Scorer / Score shape.
Metadata
Release files for whatifd-inspect-ai 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| whatifd_inspect_ai-0.3.0.tar.gz | 11.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| whatifd_inspect_ai-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 20.4 kB
Release files / whatifd_inspect_ai-0.3.0.tar.gz
| Download URL | whatifd_inspect_ai-0.3.0.tar.gz |
|---|---|
| Size | 11.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7ec8c806eadb083b7e819062488dcd6fd769b1c3f808196e3ad8ff42bf86fe91
|
|
BLAKE2b-256 checksum How to use checksums |
303fcc0d13ea6985a985e796b234a2c1d5c198dce06716fa1db9584989c29161
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency logRelease files / whatifd_inspect_ai-0.3.0-py3-none-any.whl
| Download URL | whatifd_inspect_ai-0.3.0-py3-none-any.whl |
|---|---|
| Size | 8.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7da6cf74bf6cb8c4e01927958fbe7e2ef3b4d0b7534f7f1ba515616e3e7b4ff4
|
|
BLAKE2b-256 checksum How to use checksums |
7dcc773194a3166324a3938b6e95d65358a9e74a4b988431c2a47238d8a20641
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.
Transparency log