Skip to content

Model & govern / Imports

Imports ​

Most teams already have some semantic or lineage assets. Keel can take them in so a model does not start from zero.

Available in v1.0 ​

WhatHowResult
OpenLineage run eventsPOST /api/v1/lineage/openlineage (API key with admin:*, or a user with ?workspaceId=)Dataset and column lineage (inputs, outputs, the column-lineage facet) in scope openlineage:{namespace}/{job}. FAIL and ABORT events change nothing.
dbt manifest.jsonPOST …/lineage/dbtModel dependencies as dataset-level lineage, mapped onto scanned tables (dbt:{project}); unmapped datasets are listed.
Glossary CSV / JSONGlossary › ··· › Import or POST …/glossary:importTerms (Draft), with counts and row errors.

External datasets are matched to scanned tables by the last parts of their name (db.schema.table), narrowed by the namespace's host, port and database; anything unmatched stays external. Imports are audited.

Model imports: dbt, LookML, Cube ​

Bootstrap a model from what your BI layer already defines. Open Import from the model bar's model menu, or Import from dbt / LookML / Cube on the Change requests page, pick the format and upload the files or a zip of the project. Preview shows what each object would do; Import opens a change request.

FormatReadReported, not guessed
dbt Semantic Layer (MetricFlow YAML + model SQL)semantic models, entities → joins, dimensions, measures, simple / ratio / derived / cumulative metrics, config.meta.keelother aggregations, conversion metrics, saved queries, Jinja SQL (imported verbatim, flagged)
LookMLviews (sql_table_name, derived-table SQL), dimensions, dimension groups (grains), measures and filters, type: number measures as ratio / derived metrics, explore joins (roles from from:)parameters, filter fields, Liquid, extends / refinements, access grants, datagroups, aggregate tables, cross-view field references
Cube (YAML)cubes, dimensions, measures and filters, calculated measures as metrics, segments, hierarchies, joinsviews, pre-aggregations, access policies, extends, JavaScript models, templated SQL
  • Every imported object is a proposal: origin Imported, a confidence (lower when approximated) and the file:line it came from as evidence.
  • Tables bind to the model's scanned sources by schema and table name; a table that is not in the latest scan is imported without a source and reported.
  • The import lands on its own branch, keel/import-{format}-{id}, with a change request into main. Objects main already has identically change nothing. Objects main has differently are kept as conflicts: when merging, choose per object whether to keep main's version or take the imported one. Nothing on main changes without that decision.
  • The report lists every construct that was skipped or approximated, and every file that could not be read, with its line. Uploads: up to 10 MB (20 MB unzipped), text model files only.
  • API: POST …/models/{id}/imports:preview, POST …/models/{id}/imports (multipart format + files; EditModels), GET …/models/{id}/imports. Imports are audited.

Data-quality imports: dbt tests, Great Expectations ​

On Data quality › Import dbt tests / GE suite, choose the source the checks describe and upload dbt schema YAML files or Great Expectations suites (JSON), or a zip. Each check that maps onto a scanned table and column becomes a suggested rule (origin Imported, with its file and line) in Suggested rules — nothing runs until a Steward accepts it.

dbtGreat ExpectationsKeel rule
not_null, dbt_utils.not_null_proportionexpect_column_values_to_not_be_nullNot null
unique, dbt_utils.unique_combination_of_columnsexpect_column_values_to_be_unique, expect_compound_columns_to_be_uniqueUnique
accepted_valuesexpect_column_values_to_be_in_setAccepted values
relationships—Referential integrity
dbt_utils.accepted_range, dbt_expectations.expect_column_values_to_be_betweenexpect_column_values_to_be_betweenRange
dbt_expectations.expect_column_values_to_match_regexexpect_column_values_to_match_regexPattern
dbt_utils.recency—Freshness
dbt_utils.expression_is_true, expect_table_row_count_to_be_betweenexpect_table_row_count_to_be_between / _to_equalCustom SQL (read-only)

dbt severity: warn (or a GE .warning suite) becomes a Warning rule, otherwise Critical. Checks that do not map (an unknown table or column, an unsupported test) are listed with their line; importing again refreshes undecided suggestions, and a check Keel already suggested from the scan is not proposed twice. API: POST /api/v1/workspaces/{ws}/quality/rules:import (multipart format = dbt or great_expectations, dataSourceId, files; Govern).

Anchor Keel is a working product name: one platform, a shared core and licensed modules (Keel Semantic, Keel Migrate). Documentation built from the repository — facts are derived from code, ADRs and the decisions log.