| name | read-inspect-eval |
| description | Read and analyze Inspect AI evaluation log files using the Python API. Extract samples, messages, events, and metrics from .eval files. |
Read Inspect AI Evaluation Files
This skill provides instructions for reading and analyzing Inspect AI evaluation log files using the Python API.
When to Use
Use this skill when the user needs to:
- Read evaluation results from
.eval log files
- Extract samples, messages, or events from evaluations
- Analyze model performance metrics and scores
- Convert eval data to dataframes for analysis
- Debug evaluation failures or errors
- Access specific samples by task or epoch
Prerequisites
Requires the inspect_ai package:
pip install inspect-ai
Core Functions
The inspect_ai.log module provides these primary functions:
| Function | Purpose |
|---|
list_eval_logs() | List all eval logs at a location |
read_eval_log() | Read an EvalLog from a file path |
read_eval_log_sample() | Retrieve a single EvalSample |
read_eval_log_samples() | Read all samples incrementally (generator) |
read_eval_log_sample_summaries() | Access summary-level info for all samples |
Reading Eval Logs
Basic Usage
from inspect_ai import log
logs = log.list_eval_logs("./logs")
eval_log = log.read_eval_log("path/to/file.eval")
print(f"Status: {eval_log.status}")
print(f"Results: {eval_log.results}")
Read Options
eval_log = log.read_eval_log("file.eval", header_only=True)
eval_log = log.read_eval_log("file.eval", resolve_attachments=True)
eval_log = log.read_eval_log("file.eval", all_samples_required=True)
Iterating Samples
For large files, iterate samples without loading all into memory:
from inspect_ai import log
for sample in log.read_eval_log_samples("file.eval"):
print(f"Sample {sample.id}: {sample.scores}")
for summary in log.read_eval_log_sample_summaries("file.eval"):
print(f"Sample {summary.id}: score={summary.scores}")
EvalLog Structure
The EvalLog object contains:
eval_log.status
eval_log.samples
eval_log.results
eval_log.stats
eval_log.error
eval_log.eval
EvalSample Structure
Each sample contains:
sample.id
sample.epoch
sample.input
sample.target
sample.output
sample.scores
sample.messages
sample.metadata
sample.error
Dataframe API
The inspect_ai.analysis module provides functions to extract dataframes:
Evaluation-Level Data
from inspect_ai import analysis
df = analysis.evals_df("./logs")
df = analysis.evals_df("./logs", columns=analysis.EvalInfo + analysis.EvalResults)
Sample-Level Data
df = analysis.samples_df("./logs")
df = analysis.samples_df("./logs", full=True, parallel=True)
Message-Level Data
df = analysis.messages_df("./logs", parallel=True)
df = analysis.messages_df("./logs", filter=["assistant"], parallel=True)
Event-Level Data
df = analysis.events_df(
"logs",
columns=analysis.EventTiming + analysis.ModelEventColumns,
filter=lambda e: e.event == "model",
parallel=True
)
Column Groups
Pre-defined column groups for evals_df:
EvalInfo - Metadata (created, tags, git commit)
EvalTask - Task configuration
EvalModel - Model details
EvalResults - Status, errors, headline metrics
EvalScores - All scores as separate columns
Pre-defined column groups for samples_df:
SampleSummary - Default lightweight columns
SampleScores - Score details (answer, metadata, explanation)
SampleMessages - Message content as strings
Common Workflows
Analyze Evaluation Results
from inspect_ai import log, analysis
eval_log = log.read_eval_log("results.eval")
if eval_log.status == "success":
print(f"Total samples: {len(eval_log.samples)}")
print(f"Results: {eval_log.results}")
df = analysis.samples_df([eval_log])
print(df.groupby("task")["score"].mean())
Extract Conversation Messages
from inspect_ai import log
for sample in log.read_eval_log_samples("results.eval"):
print(f"\n=== Sample {sample.id} ===")
for msg in sample.messages:
role = msg.role
content = msg.content if isinstance(msg.content, str) else str(msg.content)
print(f"{role}: {content[:200]}...")
Find Failed Samples
from inspect_ai import log
for sample in log.read_eval_log_samples("results.eval"):
if sample.error:
print(f"Sample {sample.id} failed: {sample.error}")
Compare Model Performance
from inspect_ai import analysis
df = analysis.evals_df("./logs")
print(df.groupby("model")["accuracy"].mean().sort_values(ascending=False))
Export to CSV
from inspect_ai import analysis
samples = analysis.samples_df("./logs", parallel=True)
samples.to_csv("samples.csv", index=False)
evals = analysis.evals_df("./logs")
evals.to_csv("evals.csv", index=False)
Working with Downloaded .eval Files
If you downloaded an .eval file using the download-inspect-eval skill, use the standard inspect_ai functions:
from inspect_ai import log
eval_log = log.read_eval_log("2025-12-17T05-42-03+00-00_debug_xyz.eval")
for sample in log.read_eval_log_samples("file.eval"):
print(sample.id, sample.scores)
As a last resort, you can manually extract the archive (.eval files are zip archives):
import zipfile
with zipfile.ZipFile("file.eval", "r") as z:
z.extractall("extracted")
import json
with open("extracted/samples/task_epoch_1.json") as f:
sample_data = json.load(f)
Error Handling
from inspect_ai import log, analysis
df, errors = analysis.evals_df("./logs", strict=False)
if errors:
print(f"Errors: {errors}")
eval_log = log.read_eval_log("file.eval")
if eval_log.status == "error":
print(f"Evaluation failed: {eval_log.error}")
elif eval_log.status == "started":
print("Evaluation incomplete")
Performance Tips
- Use
header_only=True when you only need metadata
- Use
read_eval_log_samples() generator for large files
- Use
SampleSummary columns (default) for fast samples_df()
- Use
parallel=True for full sample/message/event extraction
- Filter early in
messages_df() and events_df() to reduce data
Reference