跳转至

Define once. Use everywhere.

OSI 原生的指标语义层:一次定义,处处使用

进去是一份开放模型,出来是各数仓各自正确的 SQL。 revenue 在 DuckDB、Postgres、Snowflake、ClickHouse、StarRocks 上算,含义都一样。

一份 OSI YAML 文件构成 OSI 语义模型。左侧编译并下推成 13 种以上方言的 SQL —— DuckDB、StarRocks、ClickHouse、Doris、TiDB、Trino、Postgres、MySQL、Snowflake、BigQuery、Databricks、Redshift、Hologres;右侧以同一份契约、多种形态对外提供服务:dosi CLI、REST API、零拷贝的 Arrow IPC,以及 MCP 服务,供应用、notebook 和 Agent 使用。

它解决什么问题

指标的含义,看板里写一遍,SQL 里写一遍,notebook 里又写一遍。写着写着就对不上了: 一处过滤了已取消订单,另一处没过滤;一次不留神的 JOIN 把总额悄悄翻了倍。 最后两个数都说自己"正确",却谁也对不上谁。

Dosi 把每个指标收敛到一处定义,SQL 由它生成。同一份定义,在每个数仓上都算得对, 重复计数这类错误在设计上就被排除了。

30 秒看懂

在模型里定义一次,之后按名字取用:

$ dosi list metrics --model fixtures/orders/model.yaml
NAME              KIND        DATASETS          DESCRIPTION
revenue           aggregate   orders            Total order amount
order_count       aggregate   orders            Number of orders
unique_customers  aggregate   orders            Distinct purchasing customers
avg_order_value   ratio       orders            Revenue per order (ratio)
total_margin      expression  orders, products  Revenue minus cost (expression over two aggregates)

$ dosi query --model fixtures/orders/model.yaml \
    --metrics revenue --group-by orders.status --execute --db orders.db
status     revenue
completed  350
cancelled  100
2 rows

换成 --dialect snowflake,SQL 就变了,模型一个字不用动。

团队为什么用它

  • 一份模型,多个数仓


    同一份 OSI 模型能编译出 13 种以上方言的正确 SQL。换数仓只改一个参数,不用重写。

  • 正确性由构造保证


    有扇出保护,绝不会悄悄重复计数。算不安全的数,它会直说,而不是猜一个给你。

  • 开放标准,不绑定厂商


    输入就是纯 OSI YAML,厂商中立,不用为哪家的私有语义层买单。

  • 够快,原生支持 Arrow


    精简的 Rust 引擎,内置进程内 DuckDB,结果以零拷贝的 Arrow 流式送进 DuckDB、 Polars 或 pyarrow。

  • 接入方式随选


    CLIREST + Arrow 服务Python 绑定,同一个引擎,同样的答案。

  • 为自动化而生


    错误是结构化、机器可读的,带稳定错误码和修复建议,脚本和 AI Agent 据此就能自我纠正。

从这里开始

  • 安装


    拿到 dosi 可执行文件并验证,几分钟搞定,不用装数据库。

  • 运行你的第一个指标查询


    10 分钟动手教程,从一份模型走到能肉眼核对的真实结果。

  • 为什么用 Dosi


    OSI 是什么、语义层解决了什么问题,以及这些数字凭什么可信。


基于 Apache-2.0 开源。源码、issue 和设计文档都在 GitHub 上。