跳转至

Dosi 语义适配器

Dosi adapter 使用原生 Rust engine 直接执行 OSI 语义模型。authoring、校验、 catalog 加载和执行都由 datus-semantic-dosi 提供;它不会加载 Python OSI adapter,也不会降低到 MetricFlow。

Dosi 是内置默认语义适配器,同时支持 semantic_modeling 创作和完整查询能力。未配置语义适配器时,Datus 会在交互式启动过程中自动安装并选择 Dosi。

安装

本地开发不要求先发布 dosi-engine。在标准的同级仓库布局中,从 Datus-agent checkout 进入同一个 Python 环境后安装源码:

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

adapter 仍声明逻辑上的 dosi-engine 依赖,但本地 editable install 会直接 用源码满足它。只有通过包仓库安装或正式交付时才需要已发布版本。

配置

agent:
  services:
    datasources:
      warehouse:
        type: duckdb
        uri: /absolute/path/to/warehouse.db
    semantic_layer:
      dosi:  # 可选;该 section 为空时也默认选择 Dosi
        # semantic_model_path: /absolute/path/to/model.yaml

Datus 会注入当前数据源连接,并默认把 semantic_models_path 指向 subject/semantic_models/<datasource>/。目录中只有一个 YAML 或 JSON 文件时 会自动选择;存在多个模型文件时,需要配置 semantic_model_path

当前支持范围

Dosi 当前可执行 aggregate、ratio、expression 指标,维度、many-to-one 关系、复合 Join、query-backed dataset、过滤、day 到 year 的时间粒度、 time_dimension 主时间轴、relationship join_type、metric fill_nulls_with, 以及结构化窗口。datus-ext 1.3 支持期间比较、滚动、累计、排名与分布、 first/last/nth value、向前或向后 offset,以及基于 ROWS 或 RANGE 的统计 frame。

Authoring 与校验

选择 dosi 后会启用 strict OSI authoring 和 Dosi 原生 extension profile。 validate_semanticlist_metricsget_dimensionsquery_metrics 都由 原生 engine 执行。时间查询用 metric_time 作为 dimension,并把粒度单独 传入;返回的 metric_time__<grain> 是对应的结果列/order key。

统一 semantic_modeling 会分别列出有效模型和可修复模型:有效模型直接绑定, 可修复模型按原名称原地规划和修改。最终由 Host 校验确切 YAML,并把该 artifact 完整同步到 Knowledge Base。