Control Tower and Inspect
Control Tower runs its evaluations on Inspect. Samples go through Inspect's solvers and scorers, against its model providers, inside its sandboxes, and come out as an Inspect .eval log. ct run eval passes its Inspect-facing options straight through, so those options behave the way Inspect documents them.
Nothing below is restated here. Follow the link.
| Concern | Inspect documentation |
|---|---|
| Model names, providers, credentials | Models, Providers |
| Reasoning options, caching, batch APIs | Reasoning, Caching, Batch Mode |
| Container sandboxes and their tools | Sandboxing, Standard Tools |
| Time, message, token, and cost limits | Setting Limits |
| Retries and sample errors | Handling Errors |
| Concurrency and parallelism | Parallelism, Concurrency |
The .eval log format | Log Files, Dataframes |
Coding agents can read all of it directly: Inspect publishes an index at https://inspect.aisi.org.uk/llms.txt and a markdown copy of every page by appending .md to its path.
Everything Control Tower adds on top — settings, main and side tasks, protocols, monitors, safety metrics, trajectories, fleets — is documented in the rest of these docs.
Model costs
Sample metadata stores control_tower_costs.actual and control_tower_costs.full, each a model-to-USD mapping. Actual is the model-call charge recorded by Inspect; a local response-cache hit costs zero. Full prices every recorded call with all input tokens at the uncached rate, choosing the pricing tier per call before summing. The stored amounts preserve the rates used during execution. Monitor results likewise store cost_usd (actual) and full_cost_usd, with corresponding per-model mappings. These are model costs, not infrastructure charges or invoice reconciliation. An unpriced model has a null amount.
Costs include failed attempts within a sample execution. control_tower_costs.eval_id identifies that execution and user records its runner; the sample's native uuid identifies its work within the eval. Retried evals and merged/copied files preserve these identities on reused samples. For spend, retain the original execution logs and count each (eval_id, sample.uuid) once, using its original timestamps and owner rather than the upload date or uploader. Do not sum file-level stats.model_usage across retries: Inspect carries earlier usage forward.
A monitored copy preserves its source sample costs. Each added monitor_* score records cost_usd, full_cost_usd, and the replay's source_eval_id / source_sample_uuid. Full artifact price includes those added scores; replacing a score replaces its contribution. Spend still belongs to each original execution, including superseded scores. Older logs without these fields are not evidence of zero cost.