Skip to content
Back to skills

Read Inspect Eval Tbroadley Dotfiles 6032d6f5

ASecurity

Read and analyze Inspect AI evaluation log files using the Python API. Extract samples, messages, events, and metrics from .eval files.

  • 666 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added June 3, 2026
ai-agentspythonbashgitapiperformancedocumentation

Works with

  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned June 3, 2026

npx -y skills add majiayu000/claude-skill-registry --skill read-inspect-eval-tbroadley-dotfiles-6032d6f5 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Read Inspect Eval Tbroadley Dotfiles 6032d6f5?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Read Inspect Eval Tbroadley Dotfiles 6032d6f5
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-read-inspect-eval-tbroadley-dotfiles-6032d6f5/badge)](https://www.skillsdirectory.com/skills/majiayu000-read-inspect-eval-tbroadley-dotfiles-6032d6f5)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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:
```bash
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

```python
from inspect_ai import log

# List available logs
logs = log.list_eval_logs("./logs")

# Read a specific log
eval_log = log.read_eval_log("path/to/file.eval")

# Check status
print(f"Status: {eval_log.status}")  # "success", "error", or "started"
print(f"Results: {eval_log.results}")
```

### Read Options

```python
# Read only header/metadata (fast, no sample data)
eval_log = log.read_eval_log("file.eval", header_only=True)

# Resolve de-duplicated attachments
eval_log = log.read_eval_log("file.eval", resolve_attachments=True)

# Require successful completion
eval_log = log.read_eval_log("file.eval", all_samples_required=True)
```

### Iterating Samples

For large files, iterate samples without loading all into memory:

```python
from inspect_ai import log

# Read samples as generator (memory efficient)
for sample in log.read_eval_log_samples("file.eval"):
    print(f"Sample {sample.id}: {sample.scores}")

# Or get summaries only (even faster)
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:

```python
eval_log.status      # "success", "error", "started"
eval_log.samples     # List[EvalSample] - individual evaluations
eval_log.results     # Aggregate metrics
eval_log.stats       # Token usage data
eval_log.error       # Exception details if failed
eval_log.eval        # Eval configuration (task, model, etc.)
```

### EvalSample Structure

Each sample contains:

```python
sample.id            # Sample identifier
sample.epoch         # Epoch number
sample.input         # Input to the model
sample.target        # Expected target
sample.output        # Model output
sample.scores        # Dict of scorer results
sample.messages      # List of conversation messages
sample.metadata      # Custom metadata
sample.error         # Error if sample failed
```

## Dataframe API

The `inspect_ai.analysis` module provides functions to extract dataframes:

### Evaluation-Level Data

```python
from inspect_ai import analysis

# One row per eval log
df = analysis.evals_df("./logs")

# Custom columns
df = analysis.evals_df("./logs", columns=analysis.EvalInfo + analysis.EvalResults)
```

### Sample-Level Data

```python
# One row per sample (summary info - fast)
df = analysis.samples_df("./logs")

# Full sample data (slower, use parallel)
df = analysis.samples_df("./logs", full=True, parallel=True)
```

### Message-Level Data

```python
# One row per message
df = analysis.messages_df("./logs", parallel=True)

# Filter by role
df = analysis.messages_df("./logs", filter=["assistant"], parallel=True)
```

### Event-Level Data

```python
# One row per event (model calls, tool use, etc.)
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

```python
from inspect_ai import log, analysis

# Load eval
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}")

    # Accuracy by task
    df = analysis.samples_df([eval_log])
    print(df.groupby("task")["score"].mean())
```

### Extract Conversation Messages

```python
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

```python
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

```python
from inspect_ai import analysis

df = analysis.evals_df("./logs")
print(df.groupby("model")["accuracy"].mean().sort_values(ascending=False))
```

### Export to CSV

```python
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:

```python
from inspect_ai import log

# Read the downloaded file directly
eval_log = log.read_eval_log("2025-12-17T05-42-03+00-00_debug_xyz.eval")

# Iterate samples
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):

```python
import zipfile
with zipfile.ZipFile("file.eval", "r") as z:
    z.extractall("extracted")

# Read sample JSON directly
import json
with open("extracted/samples/task_epoch_1.json") as f:
    sample_data = json.load(f)
```

## Error Handling

```python
from inspect_ai import log, analysis

# Handle missing fields gracefully
df, errors = analysis.evals_df("./logs", strict=False)
if errors:
    print(f"Errors: {errors}")

# Check log status before processing
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

1. **Use `header_only=True`** when you only need metadata
2. **Use `read_eval_log_samples()`** generator for large files
3. **Use `SampleSummary`** columns (default) for fast `samples_df()`
4. **Use `parallel=True`** for full sample/message/event extraction
5. **Filter early** in `messages_df()` and `events_df()` to reduce data

## Reference

- [Eval Logs Documentation](https://inspect.aisi.org.uk/eval-logs.html)
- [Dataframe API Documentation](https://inspect.aisi.org.uk/dataframe.html)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.