Skip to main content

osi-orionbelt

Bidirectional converter between OBML (OrionBelt Markup Language) semantic models and OSI (Open Semantic Interchange), the open standard for portable semantic models (metrics, dimensions, relationships).

This package is licensed under Apache-2.0 and may be used freely. It is the OrionBelt converter in the OSI converter ecosystem. The canonical source is developed in the orionbelt-semantic-layer repository (under packages/osi-orionbelt) and published to PyPI from there; file issues and contributions upstream.

Requirements

  • Python 3.12+
  • uv (recommended) or pip

Install

pip install osi-orionbelt

Optional deep OBML semantic validation (cycles, duplicate names, invalid refs) via the full OrionBelt engine:

pip install "osi-orionbelt[obml-validation]"

Without that extra, OBML validation runs JSON-schema checks only and emits a warning for the deeper semantic pass.

CLI

A single osi-orionbelt command with two subcommands (mirroring osi-dbt):

Subcommand Direction In Out
obml-to-osi OBML -> OSI core-spec OBML YAML OSI YAML
osi-to-obml OSI core-spec -> OBML OSI YAML OBML YAML
osi-orionbelt obml-to-osi -i model.obml.yaml -o model.osi.yaml
osi-orionbelt osi-to-obml -i model.osi.yaml -o model.obml.yaml

-i/--input and -o/--output are required. Each subcommand prints conversion warnings and a validation summary to stderr, and exits non-zero when the produced document fails schema validation (unless --no-validate). Run osi-orionbelt --help or osi-orionbelt obml-to-osi --help for the full option list.

Python API

import yaml
from osi_orionbelt import OBMLtoOSI, OSItoOBML, validate_osi

obml = yaml.safe_load(open("model.obml.yaml"))
osi = OBMLtoOSI(obml, "sales", "Sales model").convert()
result = validate_osi(osi)
assert result.valid

obml_again = OSItoOBML(osi).convert()

Vendor extensions

OSI custom_extensions carry vendor-tagged payloads. This converter:

  • emits OrionBelt/OBML-proprietary data under the ORIONBELT vendor on OBML to OSI (OBML-only filters, settings, owner, refresh, type info, etc.);
  • stashes OSI-native fields that OBML can't represent (unique keys, field labels, leftover ai_context) under the OSI vendor when going OSI to OBML, restoring them to first-class OSI fields on the way back;
  • preserves third-party vendor extensions verbatim (e.g. SNOWFLAKE, DBT, SALESFORCE, GOODDATA) at the model, dataset, field, and measure/metric levels, so a full OSI to OBML to OSI roundtrip keeps the original vendor and data. OSI has no separate dimension entity, so an OBML dimension's foreign extensions surface on its OSI field.

Legacy COMMON / OBSL tags from earlier converter versions are still accepted on read.

Limitations / unsupported constructs

Some OBML constructs have no native OSI equivalent and are carried in vendor custom_extensions (obml_* payloads) so they round-trip without loss back to OBML, but are not interpreted by other OSI consumers:

  • Many-to-many joins - represented in OBML join cardinality; flagged on export.
  • Named secondary join paths - OBML's multiple join paths between the same pair of objects are an OBML-specific topology feature.
  • OSI metrics with no OBML representation - a metric whose only expression is in a non-SQL dialect (MDX, TABLEAU, MAQL), or whose SQL expression cannot be decomposed into OBML measures/metrics, is not dropped: the original OSI metric is preserved verbatim in a model-level OSI-vendor custom_extension (obml_unconverted_metrics) and re-emitted on OBML to OSI, so the OSI to OBML to OSI roundtrip stays lossless. A LOSSY: warning is raised for each such metric because it is not queryable through OBML. SQL expressions in the ANSI_SQL, OSSIE_SQL_2026, SNOWFLAKE, and DATABRICKS dialects are all read on import.

OSI v0.1.x inputs are accepted on read via a legacy normalization shim; output targets OSI v0.2.0.dev0.

See osi_obml_mapping_analysis.md for the full OBML <-> OSI core-spec mapping.

Development

uv sync          # install
uv run pytest    # run the test suite (includes a TPC-DS baseline)
uv run ruff check && uv run mypy src/osi_orionbelt

Metadata

Release files for osi-orionbelt 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for osi-orionbelt 0.4.0
File Size Uploaded
osi_orionbelt-0.4.0.tar.gz 113.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for osi-orionbelt 0.4.0
File Interpreter ABI Platform
osi_orionbelt-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 181.5 kB

Release files / osi_orionbelt-0.4.0.tar.gz

Download URL osi_orionbelt-0.4.0.tar.gz
Size 113.5 kB
Tags Source
SHA-256 checksum
How to use checksums
27040a625648fdb1b378a02c26ba3f5f4d29c22e7a00b55f8a056f4cdb6d308a
BLAKE2b-256 checksum
How to use checksums
08c1e4f74a20da932cb423c5249bcfbf4867e37a230756210dcd0aba805eb976
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release files / osi_orionbelt-0.4.0-py3-none-any.whl

Download URL osi_orionbelt-0.4.0-py3-none-any.whl
Size 68.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2afea75d6807b1132763b5c98fe74ac4a5ce268fbe4a98c7de32a82563d7e33d
BLAKE2b-256 checksum
How to use checksums
81b0640a04bd1845de47945ea58594edd138e69a5bc80bbd5124b3f57309ba10
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 26, 2026.

Transparency log

Release history Release notifications | RSS feed

0.4.1

2 release files

This release

0.4.0 This release

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page