Skip to main content

datus-semantic-dosi

A Datus semantic adapter backed by Dosi, the native Rust OSI engine, with no MetricFlow dependency. It is a thin protocol translator: the OSI YAML is loaded, planned, compiled to dialect SQL, and executed entirely inside the Rust engine (via the dosi-engine pyo3 bindings); this package only maps the Datus semantic-adapter contract onto the engine's API and its structured errors onto SemanticValidationError.

service_type: dosi.

Install

The adapter declares the native engine as a normal dependency. One command installs both packages:

pip install datus-semantic-dosi

No separate dosi-engine installation is required.

For local source development, a release is not required. Install the native checkout first, then the adapter into the same environment:

uv pip install -e ../osi-engine/crates/dosi-py
uv pip install -e ./datus-semantic-dosi

Adjust the relative paths to the workspace root. The first command builds the Rust/PyO3 extension with maturin and keeps the Python package linked to the local checkout.

Configure

from datus_semantic_dosi.config import DosiConfig

DosiConfig(
    semantic_model_path="model.yaml",  # OSI model (.yaml/.yml/.json)
    db_config={"type": "sqlite", "uri": "orders.sqlite"},  # or duckdb
)

The adapter passes db_config to the Python engine entirely in memory. The Rust CLI and server retain connections-file discovery; the embedded Python surface does not read or write connection files.

SQLite is a storage connector rather than a SQL dialect: Dosi receives type: sqlite unchanged and executes DuckDB SQL against the file in read-only mode.

Authoring contract

datus_extension_authoring_spec_text() reads the dialect-neutral authoring contract from the active dosi-engine Python binding. The adapter keeps its vendored versioned specifications only as a compatibility fallback for older engine builds. datus_extension_authoring_spec_digest() exposes a stable prompt-cache key, while the datasource dialect remains a separate Agent input.

Use with Datus-agent

Install the adapter into the same virtualenv as datus-agent:

uv pip install datus-semantic-dosi

For local development before a registry release, install both checkouts with the editable commands above. Entry-point discovery requires an installed adapter distribution; PYTHONPATH alone is not sufficient.

Then wire it in agent.yml. The semantic_layer key must equal the service_type (dosi); Datus-agent fills db_config from the active datasource and semantic_models_path from subject/semantic_models/<datasource>/ automatically, so a model file dropped there needs no further config:

agent:
  services:
    datasources:
      mydb:
        type: duckdb
        uri: /abs/path/to/orders.db
    semantic_layer:
      dosi:                 # key MUST be the service_type
        # both optional; either overrides the auto-derived directory:
        # semantic_model_path: /abs/path/to/model.yaml   # explicit single file

Place OSI model files under <project>/subject/semantic_models/mydb/ (Datus's per-datasource convention). The adapter catalogs every top-level YAML/YML/JSON file, keeps one native engine per file, and routes each globally unique metric name to its owning model. Set semantic_model_path only when an authoring flow must pin the adapter to one explicit file. Launch with datus --datasource mydb; the ask_metrics node then drives list_metrics / query_metrics through this adapter.

Behavior notes

  • attribute delegates to the native engine and returns the shared attribution contract with term_wise, mix_shift, factor_shapley, or a structured unsupported result.
  • validate_semantic delegates to the engine's own validator (structure, references, metric compilation) — no separate ossie integration.
  • get_dimensions(metric) projects the engine's metric-scoped dimension catalog unchanged: Dosi owns reachability, conformance, recommendation, and ordering. Every returned row is queryable; recommended=false is a discovery hint, not a permission check. The adapter uses compile-only planning only to add the supported grains for time dimensions.
  • Ambiguous / unknown names surface as SemanticValidationException whose payload carries the engine's candidates; single-candidate fixes are turned into a concrete suggested_retry.
  • Multiple model files are supported for discovery and single-model queries. Metric and semantic-model names must be unique within a datasource; one query cannot combine metrics owned by different files.
  • Time granularity attaches only to time dimensions; supplying it with no time dimension raises a time_grain_required validation payload.
  • Native time axis accepts metric_time plus time_granularity; a suffixed result column is an output/order key, not a query dimension.
  • Window discovery exposes native structured-window metadata and rejects legacy grain_to_date, window_aggregation, period_over_period, and string window hints instead of silently executing the base aggregate.
  • Engine instances and the metric routing catalog refresh when model files are added, removed, or changed.

Tests

Unit tests run against a fake binding (no native build needed): ci/run-unit-tests.sh datus-semantic-dosi. Integration tests (-m integration) need the real local or installed dosi-engine binding and the duckdb CLI used to seed the test fixture, and use the vendored tests/fixtures/orders/ copy.

Metadata

Release files for datus-semantic-dosi 0.1.14

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

Source distribution (sdist)

Source distribution for datus-semantic-dosi 0.1.14
File Size Uploaded
datus_semantic_dosi-0.1.14.tar.gz 56.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for datus-semantic-dosi 0.1.14
File Interpreter ABI Platform
datus_semantic_dosi-0.1.14-py3-none-any.whl Python 3 none any Details

Total release size: 99.6 kB

Release files / datus_semantic_dosi-0.1.14.tar.gz

Download URL datus_semantic_dosi-0.1.14.tar.gz
Size 56.4 kB
Tags Source
SHA-256 checksum
How to use checksums
3b4515f8255341a3eb785d8f1ebd51a0ef16c9da7a1d7c7afe8be5be94172578
BLAKE2b-256 checksum
How to use checksums
c5f83f938fa8ca0f49608727dffdeaeea58a3593eccda30cceda8d77e0985ec6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Release files / datus_semantic_dosi-0.1.14-py3-none-any.whl

Download URL datus_semantic_dosi-0.1.14-py3-none-any.whl
Size 43.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1ecdc69f21d25d55b175ce41c61eec488ac3e225eaffeaf84b996e714d694d42
BLAKE2b-256 checksum
How to use checksums
942981a86c7747842b72eaeac943818be5b6c1217bf4e04fd56e2f71ac198c88
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Release history Release notifications | RSS feed

0.1.15

2 release files

This release

0.1.14 This release

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.9

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

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