安装 Dosi¶
一条命令就能在 Linux 或 macOS 上装好 dosi 和 dosi-server,不需要另外装任何东西:
不需要工具链、不需要数据库、不需要客户端库。
需要 Python 3.12+,见 Python 绑定。
装完检查一下:
拿不准选哪个?选默认版。精简版是给没有 C++ 运行时的机器用的,两者区别见
该下载哪个?。不想把脚本直接管道给 sh,可以走
手动下载。想确认它能读模型,接着看验证是否可用。
安装脚本做了什么¶
脚本会识别你的 CPU,下载对应的归档,校验它的 SHA-256,
然后把 dosi 和 dosi-server 装到 ~/.local/bin——默认版还会把
libduckdb.so 一并放在旁边。如果这个目录还不在 PATH 上,记得加进去。
之后想换版本,重新跑一次脚本即可(加或不加 DOSI_SHAPE=lean),它会直接覆盖。
从默认版换到精简版会留下一个用不到的 libduckdb.so,无害——想省空间可以删掉。
示例模型会跟着一起装到 ~/.local/share/dosi/examples,
脚本结束时会把路径打出来。
不传 DOSI_SOURCE 时脚本的 manifest 和归档都默认从 GitHub 取;上面的命令
额外传了 DOSI_SOURCE=oss,两者都改从阿里云 OSS 镜像取——国内网络通常快
很多。两个源之间不会自动切换:选中的源失败,脚本直接报错退出,不会
偷偷换一个源重试。校验和仍然是防线:不管走哪个源,下载下来的归档都要通过
同一份 manifest 里记录的 SHA-256 校验,只是这份 manifest 现在也跟着
DOSI_SOURCE 走,不再固定只从 GitHub 读——普通的传输损坏依然会被校验挡住,
但如果 OSS 镜像本身被攻破,理论上能同时伪造归档和与之匹配的校验和,这一点
上不再像"manifest 固定在 GitHub"时那样绝对可信。DOSI_OSS_MIRROR 可以把
镜像指向内网地址;镜像上归档存放在 v<version>/<file>,manifest 同时存放在
v<version>/manifest.json 和 latest/manifest.json 两处。
该下载哪个?¶
选默认版。 它是完整形态:精简版能做的它都能做,外加在你的进程内运行 DuckDB 执行本地查询。
选精简版只有一个理由,而且不是体积:默认版要求机器上有 C++ 运行时
(libstdc++ 提供 GLIBCXX_3.4.22,即 GCC 6 及以上),因为 DuckDB 是 C++ 写的。
精简版是纯 Rust 对 libc,完全不需要 C++。如果你的目标环境是 distroless 之类的
精简镜像,或者较老的发行版,这一条就是全部的判断依据。
| 默认版 | 精简版 | |
|---|---|---|
| 归档 | dosi-<version>-<target>.tar.gz |
dosi-<version>-<target>-lean.tar.gz |
| 本地 DuckDB 查询 | 进程内,Arrow 原生 | 调用 PATH 上的 duckdb CLI |
| 文件 | dosi、dosi-server、libduckdb.so |
dosi、dosi-server |
| 机器上还需要什么 | glibc ≥ 2.28、libstdc++ | glibc ≥ 2.28。仅当要跑本地查询时才需要 duckdb CLI |
| 数仓连接器 | 全部 | 全部——完全一致 |
| 下载体积 | 约 63 MB | 约 41 MB |
其余部分完全相同:同一个编译器、同样的方言、同样的连接器(Postgres、 MySQL/TiDB/StarRocks/Doris、Hologres、DWS、GaussDB、Oracle、ClickHouse、Trino、 Snowflake、BigQuery、Databricks、Arrow Flight)。把指标查询编译成 SQL 两者一模一样, 连数仓执行也一模一样,只有本地 DuckDB 执行不同。
使用默认版¶
libduckdb.so 必须和 dosi、dosi-server 放在同一个目录——可执行文件是在
自己旁边找这个库的。安装脚本会把三个文件放在一起;手动解压请让它们一起移动,
把 dosi 复制到别处时也要把库一起带上。
使用精简版¶
本地执行(--execute 配 --db)会调用 PATH 上的 duckdb,需要的话从
duckdb.org 装一个。没有 CLI 时 dosi
照样能编译 SQL、照样能查所有数仓——只是失去本地 DuckDB,真去用会报
cannot start duckdb CLI。
这条路径有两点需要知道:
- 它是针对 DuckDB v1.4.x 系列验证的,发现 CLI 不在该系列时
dosi会告警一次。 那条路径的结果经 JSON 回传,所以大整数、DECIMAL、TIMESTAMPTZ的类型保真度 对版本敏感,默认版的 Arrow 路径没有这个问题。 - 每条语句起一个新进程,所以内存库在两次调用之间什么都不留。需要保持状态时
请用文件库(
--db)。
我装的是哪个?¶
build 一行会显示 engine 或 lean;dosi info --format json 里对应字段是
shape。
手动下载¶
Dosi 发布 Linux 和 macOS 版本:
| 平台 | 归档 | 精简版归档 |
|---|---|---|
| Linux x86_64 | dosi-<version>-x86_64-unknown-linux-gnu.tar.gz |
dosi-<version>-x86_64-unknown-linux-gnu-lean.tar.gz |
| Linux arm64 | dosi-<version>-aarch64-unknown-linux-gnu.tar.gz |
dosi-<version>-aarch64-unknown-linux-gnu-lean.tar.gz |
| macOS Apple Silicon | dosi-<version>-aarch64-apple-darwin.tar.gz |
dosi-<version>-aarch64-apple-darwin-lean.tar.gz |
并非每个 release 都带上表中的每一行。某个 release 究竟构建了哪些平台,以它的
manifest.json 为准——macOS Intel 尤其只在需要时才构建。安装脚本读的是这个文件,
不去猜文件名,所以缺哪个平台就报 no build for <target>,不会下错归档。
Linux 上可执行文件需要 glibc 2.28 及以上——RHEL/Rocky/Alma 8、Ubuntu 20.04、
Debian 10 以及更新的发行版都可以。默认版还需要 libstdc++ 提供 GLIBCXX_3.4.22
(GCC 6+),这个要求来自 libduckdb;精简版完全没有 C++ 依赖。CentOS 7 低于
这两条下限,在那上面请用容器运行 Dosi。macOS 上的下限是 macOS 11(Big Sur),
除系统框架外不需要额外安装任何东西。
归档挂在下载仓库每个 release 下。manifest.json 指明当前发布版本,
并带上该版本每个归档的校验和——从 latest 路径取,就不用写死版本号:
$ VERSION=0.1.12 TARGET=x86_64-unknown-linux-gnu
$ BASE=https://github.com/Datus-ai/dosi-dist/releases/download/v$VERSION
$ curl -fsSLO $BASE/dosi-$VERSION-$TARGET.tar.gz
$ curl -fsSLO $BASE/SHA256SUMS
$ sha256sum --ignore-missing -c SHA256SUMS # macOS: shasum -a 256 -c SHA256SUMS --ignore-missing
$ tar xzf dosi-$VERSION-$TARGET.tar.gz
$ sudo install dosi-$VERSION-$TARGET/dosi /usr/local/bin/dosi
$ sudo install dosi-$VERSION-$TARGET/dosi-server /usr/local/bin/dosi-server
$ sudo install -m 0644 dosi-$VERSION-$TARGET/libduckdb.so /usr/local/bin/libduckdb.so
最后一行对默认版不是可选的:可执行文件是在自己所在目录找 libduckdb.so 的,
只装两个可执行文件,第一次运行就会报 libduckdb.so: cannot open shared object file。
精简版归档(…-$TARGET-lean.tar.gz)没有这个库,也就没有第三行。
运行之前先校验一遍——SHA256SUMS 覆盖了该版本的每一个归档。
归档里有什么¶
dosi-<version>-<target>/
├── dosi CLI
├── dosi-server REST / Arrow-Flight / MCP 服务
├── libduckdb.so DuckDB——仅默认版;必须与上面两个可执行文件放在一起
├── LICENSE
└── examples/
├── orders/ 教程用的模型
└── tpcds/ CLI 参考用的模型
精简版归档是同样的目录树,只是没有 libduckdb.so。
安装脚本会把两个可执行文件都放到 PATH 上。REST API 和
MCP 服务 两页调用的就是 dosi-server。
验证是否可用¶
dosi info 不需要模型,所以它同时也是版本探针——它会报告 Apache Ossie 规范版本、
Datus 扩展版本、你装的是哪个版本,以及它认识的 Datus 扩展键:
$ dosi --version
dosi 0.1.12
$ dosi info
dosi 0.1.12
osi spec 0.2.0.dev0
datus-ext 1.9 (accepts 1.0 and up)
mode datus
build engine (DuckDB in process)
examples /home/you/.local/share/dosi/examples
...
要留意的是 examples 这一行:它是内置示例模型的落地位置 —— 用安装脚本装的话是
~/.local/share/dosi/examples,自己解包的话就是归档里那个 examples/ 目录。
本文档所有页面都通过 $DOSI_EXAMPLES 引用它们,所以先导出一次:
然后拿一份示例模型校验一下:
出现这一行,就可以去看第一个指标查询教程了。
数仓¶
两个发布版本都包含全部连接器——MySQL/TiDB/StarRocks/Doris、Postgres、Hologres、 DWS、GaussDB/openGauss、Oracle、ClickHouse、Trino、Snowflake、BigQuery、Databricks。 两者的区别只在本地 DuckDB 执行方式(见该下载哪个?), 与能连哪些数仓无关。各数仓的连接配置(主机、凭据、TLS)见 连接数仓。
为任意方言编译 SQL 从来不需要连接器,它们只在 --execute 时起作用。
Python 绑定¶
想从 Python 调用 Dosi(模块名 dosi_engine),装 wheel 即可,
需要 Python 3.12+:
快速检查:
Python API 与 CLI 一一对应:构造 Engine(model_path=…),再调用
.metrics()、.compile(...)、.execute(...)。(专门的 Python API
参考页在计划中。)
模块级常量说明这个构建实现了哪些能力,内容与 dosi info 一致。
生成模型的工具在决定输出哪些 Datus 扩展键之前,应该先读它:
>>> import dosi_engine
>>> dosi_engine.SPEC_VERSION # the OSI core spec
'0.2.0.dev0'
>>> dosi_engine.DATUS_EXT_VERSION # the Datus extension version
'1.10'
>>> [k["key"] for k in dosi_engine.DATUS_EXT["keys"]]
['join_type', 'fill_nulls_with', 'time_dimension', 'time_granularity', 'window',
'dataset', 'derive', 'measure', 'params', 'time', 'is_dimension',
'cardinality', 'lod']
DATUS_EXT["keys"] 的每一项还带有引入它的版本号,以及忽略它的代价,见
datus-extensions.md。
Agent 集成可以直接从已安装的 engine 获取完整 authoring contract,不再维护按版本分支的副本:
contract = dosi_engine.DATUS_AUTHORING_CONTRACT
digest = dosi_engine.DATUS_AUTHORING_CONTRACT_DIGEST
prompt_yaml = dosi_engine.render_datus_authoring_spec()
该 contract 不包含方言。当前 Ossie expression dialect 由 datasource 决定,应由宿主单独告诉 Agent;它不属于 engine extension 版本。digest 对相同 contract 内容保持稳定,可用于 prompt cache key。
从 datus_osi_engine 迁移过来¶
本项目此前叫 osi-engine,Python 包名也随之改动:
datus-osi-engine / datus_osi_engine 现已改为 dosi-engine / dosi_engine。
新代码直接 import dosi_engine 即可。
环境变量和连接配置文件也一并改名:OSI_* → DOSI_*、
./osi-connections.yaml → ./dosi-connections.yaml、
~/.config/osi/ → ~/.config/dosi/。旧文件路径仍会作为回退被发现
(connectors.md),旧环境变量则不会。
规范本身现已更名为 Apache Ossie(原 OSI);引擎模式参数 --osi-basic / --osi-datus
和 OSSIE_DIR 保持原名不变。
许可¶
Dosi 采用 Elastic License 2.0
(ELv2),完整条款在每个归档里的 LICENSE 文件中。你可以免费下载、使用、再分发,
包括生产环境和商业用途。三条限制:不得将 Dosi 作为托管或受管服务提供给第三方、
不得绕过其 license key 机制、不得移除其许可声明。需要托管授权或 ELv2 未涵盖的用法,
请联系 Datus。
下一步¶
-
10 分钟从一份模型走到真实、可核对的结果。
-
用大白话讲清楚这份开放语义模型规范,以及 Dosi 怎样执行它。
-
把 Dosi 指向 Postgres、Snowflake、ClickHouse 等等。