transcription object with a summary inside it — a test on the output column
measures the whole serialized object, not the key you care about.
A custom column gives one key a name. It is an
RFC 9535 JSONPath expression that points into
the output or an input column. Once it exists, you use its name wherever a column name
goes: in tests, in filters, and in the records table. For example, a
character length test on a custom column measures
transcription.summary alone.
A custom column belongs to the project. You define it once, and every inference pipeline
in the project and every development commit use the same
definition, so tests in both monitoring and development mode can target it.
Prerequisites
- Data in the project whose output, or one of whose input columns, holds a JSON object or array — or JSON stored as a string. That data can come from an inference pipeline or from a development commit. Path suggestions and the preview both read recent rows.
- The Update projects permission to create, edit, and delete custom columns. See Roles and permissions. Without it, the list is read-only.
Create a custom column
Custom columns live under the project’s Settings → Custom columns, one list for the whole project. The Add custom columns entry in the records table’s options menu, on a pipeline or a commit, opens the same page. The New custom column form asks for:- Name — what tests and filters refer to. Use letters, numbers, spaces, underscores,
and hyphens, starting with a letter or underscore. Names are unique per project, and a
name can’t start with
openlayer_or match a column that already exists in the project’s data. - Source column — the column the path is evaluated against: the output
(
openlayer_output, the default) or an input column from any of the project’s pipelines or development datasets. In development,openlayer_outputis the column youropenlayer.jsonsets asoutputColumnName. - Path — a JSONPath relative to the source column, starting with
$. Paths seen in recent data are offered as suggestions. Paths inside stringified JSON are not suggested, so type those by hand and check them with the preview.
Example
Suppose each row’s output looks like this:openlayer_output:
Save the last one as
summary_en_gb, and a test on summary_en_gb measures the English
summary on every row, whichever position it appears in.
Path syntax
Paths follow RFC 9535 and are at most 512 characters long. The parts you are most likely to need:
The path is relative to the source column, so it never repeats the column’s name.
Check the match rate before saving
Select Check path in the form’s Preview section to resolve the path against recent rows from up to five of the project’s data sources: the newest development commit and the pipelines that most recently received data. The preview reports one total, Matched X of Y recent rows, names any source where the path matches no row, and shows a few distinct sample values. That way you catch a path that matches only some row shapes, only some pipelines, or the wrong key. On rows where the path matches nothing, the custom column is empty (null).When a path matches several values
A path with a wildcard, a filter, or.. can match several values on one row, but a
column holds one value per row. The column’s reduction picks it:
Non-string matches are compared and joined as their JSON text. The form saves new
columns with
first; a column with any other reduction shows it as a tag in the list’s
Options column.
Stringified JSON
Some payloads hold JSON as a string, such as{"transcript": "{\"summary\": \"...\"}"}.
With Parse stringified JSON on (the default), the path still resolves through those
strings:
- The path runs against the raw value first. If it matches, that value is used, so a field whose JSON text you want to measure as text stays text.
- Only on a miss does Openlayer parse string values that hold a JSON object or array and
retry, up to five levels deep. Strings such as
"42"or"true"stay strings.
Use a custom column
-
Tests — pick the custom column in a test’s column picker. In a
tests.json, in development or monitoring mode, use its name as the column value ininsightParameters:When the path matches none of the rows a test evaluates, the test is skipped rather than failed, with a message that names the custom column and its path. A data source that doesn’t carry the field yet doesn’t break the test.tests.json -
Filters — you can filter tests and records on a custom column whose path is a chain of
plain keys (such as
$.transcription.summary) and that has Parse stringified JSON turned off. Filtering on any other custom column returns an error instead of empty results, and its filter offers no value suggestions. - Records — custom columns appear in the records table and in the record detail, for every pipeline and development commit. A custom column can start out hidden in the table, for example when you saved a column layout before it existed. Enable it in the table’s column options.
Edit a custom column
You can change a custom column’s source column, path, and Parse stringified JSON setting. The name can’t change, because tests refer to the column by name. The edit form lists the tests that use the column. An edit applies to every pipeline and every development test in the project from their next evaluation. Existing test results don’t change.Delete a custom column
You can’t delete a custom column while any test uses it, archived tests included. The list’s Used by column shows which tests those are. Change those tests to stop using the column, or delete them, and then delete the column. Deleting an inference pipeline doesn’t delete the project’s custom columns.Limits
- Exports do not include custom columns.
- Values keep the type they have in your data. A number stored as a string stays a string.