OrionBelt Semantic Layer - Compiles and executes YAML semantic models as analytical SQL
Project description
OrionBelt Semantic Layer
Compile and execute YAML semantic models as analytical SQL across multiple database dialects
OrionBelt Semantic Layer is an API-first semantic engine and query planner for AI agents that compiles and executes declarative YAML model definitions as optimized SQL for BigQuery, ClickHouse, Databricks, Dremio, DuckDB/MotherDuck, MySQL, Postgres, and Snowflake. Query using business concepts — dimensions, measures, and metrics — instead of raw SQL.
Analytics as Code — Define your analytical semantics in version-controlled YAML, compile to dialect-specific SQL, and execute against live databases, all through a single API. No BI tool in the middle: the full loop from declarative model to query results is programmable, reviewable, and reproducible.
Features
- 8 SQL Dialects — BigQuery, ClickHouse, Databricks, Dremio, DuckDB/MotherDuck, MySQL, Postgres, Snowflake
- OBML Model Format — YAML-based semantic models with data objects, dimensions, measures, metrics, and joins
- AST-Based SQL — Custom SQL AST ensures correct, injection-safe SQL generation
- Cross-Schema Queries — Model data objects across multiple databases and schemas in a single model
- Static Model Filters — Mandatory WHERE conditions baked into the model, applied to every query with auto-join extension
- Star Schema & CFL — Automatic join resolution with Composite Fact Layer for multi-fact queries
- REST API — FastAPI endpoints for model management, validation, compilation, and execution
- Gradio UI — Interactive web interface for model editing, query testing, and ER diagrams
- MCP Server — Available as a separate thin client for Claude, Copilot, Cursor, Windsurf
- AI Integrations — LangChain, OpenAI Agents SDK, CrewAI, Google ADK, Vercel AI SDK, n8n, ChatGPT
- DB-API 2.0 + Flight SQL — PEP 249 drivers and Arrow Flight SQL server for DBeaver, Tableau, Power BI
- OBSL Graph & SPARQL — RDF graph export and read-only SPARQL querying for every loaded model
- OSI Interoperability — Bidirectional conversion between OBML and Open Semantic Interchange format
Quick Start
Docker (fastest)
docker run -p 8080:8080 ralforion/orionbelt-api
API at http://localhost:8080 — Swagger docs at /docs
From Source
git clone https://github.com/ralfbecher/orionbelt-semantic-layer.git
cd orionbelt-semantic-layer
uv sync
uv run orionbelt-api
API at http://localhost:8000 — Swagger docs at /docs
Live Demo
http://35.187.174.102/ui — Gradio UI with pre-loaded example model
API: http://35.187.174.102 — Swagger UI | ReDoc
Example
Define a Semantic Model (OBML)
version: 1.0
dataObjects:
Customers:
code: CUSTOMERS
database: WAREHOUSE
schema: PUBLIC
columns:
Customer ID: { code: CUSTOMER_ID, abstractType: string }
Country: { code: COUNTRY, abstractType: string }
Orders:
code: ORDERS
database: WAREHOUSE
schema: PUBLIC
columns:
Order Customer ID: { code: CUSTOMER_ID, abstractType: string }
Price: { code: PRICE, abstractType: float }
Quantity: { code: QUANTITY, abstractType: int }
joins:
- joinType: many-to-one
joinTo: Customers
columnsFrom: [Order Customer ID]
columnsTo: [Customer ID]
dimensions:
Country:
dataObject: Customers
column: Country
resultType: string
measures:
Revenue:
resultType: float
aggregation: sum
expression: "{[Orders].[Price]} * {[Orders].[Quantity]}"
Compile via REST API
# Create a session
curl -s -X POST http://localhost:8000/v1/sessions | jq .session_id
# -> "a1b2c3d4"
# Load the model
curl -s -X POST http://localhost:8000/v1/sessions/a1b2c3d4/models \
-H "Content-Type: application/json" \
-d '{"model_yaml": "..."}' | jq .model_id
# -> "abcd1234"
# Compile a query
curl -s -X POST http://localhost:8000/v1/sessions/a1b2c3d4/query/sql \
-H "Content-Type: application/json" \
-d '{"model_id":"abcd1234","query":{"select":{"dimensions":["Country"],"measures":["Revenue"]}},"dialect":"postgres"}' \
| jq -r .sql
Generated SQL (Postgres):
SELECT
"Customers"."COUNTRY" AS "Country",
SUM("Orders"."PRICE" * "Orders"."QUANTITY") AS "Revenue"
FROM WAREHOUSE.PUBLIC.ORDERS AS "Orders"
LEFT JOIN WAREHOUSE.PUBLIC.CUSTOMERS AS "Customers"
ON "Orders"."CUSTOMER_ID" = "Customers"."CUSTOMER_ID"
GROUP BY "Customers"."COUNTRY"
Change dialect to bigquery, clickhouse, databricks, dremio, duckdb, mysql, or snowflake for dialect-specific SQL.
Gradio UI
Install the ui extra and the UI is mounted at /ui on the API server:
uv sync --extra ui && uv run orionbelt-api
# -> UI at http://localhost:8000/ui
Documentation
| Topic | Link |
|---|---|
| Full docs site | ralforion.com/orionbelt-semantic-layer |
| Installation | getting-started/installation |
| Quick Start | getting-started/quickstart |
| Docker & Deployment | getting-started/docker |
| Development | getting-started/development |
| OBML Model Format | guide/model-format |
| Query Language | guide/query-language |
| SQL Dialects | guide/dialects |
| Period-over-Period Metrics | guide/period-over-period |
| Compilation Pipeline | guide/compilation |
| OBSL Graph & SPARQL | guide/obsl |
| Gradio UI | guide/ui |
| AI Integrations | guide/integrations |
| OSI Interoperability | guide/osi |
| REST API Endpoints | api/endpoints |
| DB-API Drivers & Flight SQL | drivers |
| Architecture | reference/architecture |
| Configuration | reference/configuration |
| Sales Model Walkthrough | examples/sales-model |
| Multi-Dialect Output | examples/multi-dialect |
| Multi-Fact: Sales & Returns | examples/multi-fact |
| TPC-DS Benchmark | examples/tpcds |
| Quickstart Notebook | examples/quickstart.ipynb |
Companion Project
OrionBelt Analytics
An ontology-based MCP server that analyzes relational database schemas and generates RDF/OWL ontologies. Together with OrionBelt Semantic Layer, it enables AI assistants to navigate your data landscape through ontologies and compile safe, dialect-aware analytical SQL.
License
Copyright 2025 RALFORION d.o.o.
Licensed under the Business Source License 1.1. The Licensed Work will convert to Apache License 2.0 on 2030-03-16.
By contributing to this project, you agree to the Contributor License Agreement.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file orionbelt_semantic_layer-1.6.0.tar.gz.
File metadata
- Download URL: orionbelt_semantic_layer-1.6.0.tar.gz
- Upload date:
- Size: 4.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ac314ad20a406eb0d4a03721528ef8dc07c3fac730da747364a654403b051a6
|
|
| MD5 |
a65f16f7892619d9fc091bdcd581cf7d
|
|
| BLAKE2b-256 |
acc68662beecebd8d423839b0b3bf3f0d9494f62908dc14d997c1d745fd97152
|
File details
Details for the file orionbelt_semantic_layer-1.6.0-py3-none-any.whl.
File metadata
- Download URL: orionbelt_semantic_layer-1.6.0-py3-none-any.whl
- Upload date:
- Size: 181.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be74dfb26fade2eb93faf04a687de0ff3aafc891beb39909464dd92a9f64a3f8
|
|
| MD5 |
520bff9585a88ee7b3e2d8c26c9d20a3
|
|
| BLAKE2b-256 |
0e4ed2eab82efed17bcc841e12c5b252d31884ae25df363b3a81656821773396
|