> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ovalbee.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ovalbee.com/_mcp/server.

# Dataset insights

> Turns the dataset's statistics into findings written in plain language, each one backed by a chart in the report.

## Overview

Reads the statistics of a [dataset](/node-library/nodes/dataset-ops-dataset) and writes a short report saying what they mean for training: what is wrong, what follows from it, and what is still unknown. Each finding gets a severity and is backed by a chart, a table, or images from the report.

[Annotation quality](/node-library/nodes/dataset-ops-annotation-quality) charts the same numbers. What it cannot do is judge them, because the judgement depends on the dataset: a 6:1 frame threatens small objects, a 16:9 frame is ordinary. This node makes that call per run instead of baking it into a template. Connect the reports of other analysis nodes, such as Annotation quality, [Image quality](/node-library/nodes/dataset-ops-image-quality), [Find annotation gaps](/node-library/nodes/dataset-ops-find-annotation-gaps), [Similar pairs](/node-library/nodes/models-clip-similar-pairs), [Label diagnostics](/node-library/nodes/models-clip-label-diagnostics), [Embedding anomalies](/node-library/nodes/models-clip-embedding-anomalies), [Evaluate object detection](/node-library/nodes/evaluate-evaluate-object-detection) or [Evaluate prelabeling efficiency](/node-library/nodes/evaluate-evaluate-prelabeling-efficiency), to **Findings from other nodes**, and their findings are ranked and written up in the same report. When several of them count the same problem, for example an evaluation and a prelabeling check both finding unlabeled objects, it gets one section with the other counts named in it.

Currently supports only image datasets. The badge shows how many findings the report holds.

```mermaid
flowchart LR
  n1["Dataset"] --> n2["Annotation quality"] --> n3["Dataset insights"]
```

## Prerequisites

| Requirement                     | What you need                                                                                                                                                                                                                |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Workspace credits**           | The report text is written by the language model of the OvalBee instance and charged to the workspace's credits. On a self-hosted instance the admin must set an LLM token in the instance settings, and nothing is charged. |
| **Analysis reports** (optional) | Reports from other analysis nodes that ran on the same dataset, for **Findings from other nodes**.                                                                                                                           |

## How it works

Measures the dataset's annotations, reusing whatever the shared statistics store already holds — the same store Annotation quality uses, so nothing is computed twice.

Turns the statistics into findings. The questions are generated from the shape of the data, so a dataset with no tags is never asked about tags. Findings from the connected reports are added to the list.

Renders every finding that has a visual form into a chart, table, or image gallery.

When a connected evaluation says a model and the labels disagree, shows the model a few of those images, plus a few frames picked at random, with the labels and the predictions drawn side by side. It looks at the objects and says which side is wrong, so the report can tell bad labels from a weak model. Labels are called unreliable only when the random frames show errors too.

Asks the model to rank every finding by severity, then to write the report around those files in that order. It writes prose and references, never a number into a data file.

Checks the report and sends it back for a rewrite when something fails, for example a number that no finding supports. Drops the unused charts, then uploads.

## FAQ

#### What is sent to the language model?

Statistics measured from the dataset, such as counts, class and tag names, and the findings and text of the connected reports. When a connected evaluation flags disagreements with the labels, up to six of those images and six random frames are sent too, with the labels and the predictions drawn on them. The request goes through the OvalBee API to the model the instance is configured with.

#### Why did the run fail after several attempts?

The report is checked before it is published. When the model's text still fails the check after three attempts, the run fails rather than publish a wrong report. A failed model call also stops the run: the instance has no LLM token configured (its admin must add one in the instance settings), the workspace has no credits left for the month, or the model returned an error.

#### Why is a connected report missing from the findings?

Only findings the node can read are folded in. A report whose findings cannot be read is skipped and shows a dash in the sources table, while a 0 there means that node ran and found nothing.

## Inputs

**`Dataset`** `dataset` — required

Dataset to analyse. Its images and annotations are measured, and the report is written about it. Key: `DATASET`.

---

**`Findings from other nodes`** `report`

Reports from other analysis nodes to fold into the findings list. Reports that carry no findings are skipped. Values come from `DATASET`. Key: `REPORT_IDS`.

---

## Outputs

**`Report`** `report`

Asset ID containing the dataset insights report. Shown as an artifact. Key: `REPORT_ID`.

---

**`Headline`** `string`

Number of findings in this report, shown as a badge. Shown on the node as a badge. Key: `HEADLINE`.

---

**`Summary`** `object`

Findings-per-severity table the node card shows. Hidden from the flow editor. Key: `SUMMARY`.

---

## Report

The report opens on an **Overview** tab with a verdict on the dataset and the steps to take first, then metric cards and every finding in severity order: **Critical** stops training until it is fixed, **Warning** blocks something you are about to do, **Notice** is real and bounded, and **Passed** was checked and is not a problem. Each finding has its own section with the evidence behind it and a line saying why it got its level. Findings that come only from a connected report get a tab named after that node, and a **Questions** tab can appear when a finding depends on how the dataset will be used. A table lists where the findings came from.

## JSON config

Machine-readable node interface for automation and advanced usage.

#### Show JSON

```json
{
  "name": "Dataset insights",
  "description": "Turns the dataset's statistics into findings written in plain language, each one backed by a chart in the report.",
  "category": "Datasets",
  "namespace": null,
  "templateKey": "dataset_ops/dataset_insights",
  "version": "v1",
  "inputs": [
    {
      "key": "DATASET",
      "label": "Dataset",
      "type": "dataset",
      "description": "Dataset to analyse. Its images and annotations are measured, and the report is written about it.",
      "required": true,
      "default": null,
      "visibleWhen": null,
      "options": {
        "creatable": false
      }
    },
    {
      "key": "REPORT_IDS",
      "label": "Findings from other nodes",
      "type": "report",
      "kind": "dataset_intelligence_findings_v1",
      "description": "Reports from other analysis nodes to fold into the findings list. Reports that carry no findings are skipped.",
      "required": false,
      "default": null,
      "visibleWhen": null,
      "options": {
        "minItems": 0,
        "ref": "DATASET"
      }
    }
  ],
  "outputs": [
    {
      "key": "REPORT_ID",
      "label": "Report",
      "type": "report",
      "description": "Asset ID containing the dataset insights report.",
      "artifact": true,
      "badge": false,
      "badgeOpens": null,
      "hidden": false
    },
    {
      "key": "HEADLINE",
      "label": "Headline",
      "type": "string",
      "description": "Number of findings in this report, shown as a badge.",
      "artifact": false,
      "badge": true,
      "badgeOpens": null,
      "hidden": false
    },
    {
      "key": "SUMMARY",
      "label": "Summary",
      "type": "object",
      "description": "Findings-per-severity table the node card shows.",
      "artifact": false,
      "badge": false,
      "badgeOpens": null,
      "hidden": true
    }
  ],
  "widgets": {
    "widget": {
      "id": "table",
      "settings": {
        "data": {
          "type": "variable",
          "value": "self.outputs.SUMMARY"
        }
      }
    },
    "secondaryWidget": {
      "id": "report-preview",
      "settings": {
        "reportAsset": {
          "type": "variable",
          "value": "self.outputs.REPORT_ID"
        },
        "name": {
          "type": "input",
          "value": "Open insights"
        }
      }
    }
  }
}
```