Publisher: The Malloy Semantic Model Server
Publisher:The Malloy Semantic Model Server
欢迎来到 Publisher,它是为 Malloy 数据语言提供的开源语义模型服务器。
什么是 Malloy?
Malloy 是一种用于建模数据的开源语言。 Malloy 允许您构建丰富的语义数据模型,定义数据的_含义_、关系_和_上下文。
Malloy 提供了一个强大的框架,用于编码数据的业务上下文以及针对数据库运行查询。 随附的 VS Code extension 提供了一个用于开发 Malloy 模型、浏览数据和构建简单仪表板的环境。
什么是 Publisher?
Publisher 接受在 Malloy 中定义的语义模型(这些模型富含业务上下文和含义),并通过服务器接口公开它们。 这使得应用程序、AI agents、工具和用户能够一致且可靠地查询您的数据,从而利用 Malloy 模型中定义的共享、明确的理解。
目标:
Publisher 解决了现代数据和 AI 系统中日益严重的问题:如果数据背后的含义不明确,您就无法信任答案。
无论是仪表板、数据应用程序还是 AI-agent,每个与您的数据交互的应用程序都需要理解“收入”、“活跃用户”或“流失”等术语在您的业务中的实际含义。 如果没有这种共同的理解,答案充其量是不一致的,最坏的情况是非常危险的错误。
Publisher 通过 API 提供以 Malloy 定义的语义模型。 这意味着:
- 您可以使用业务术语(而不是原始 SQL)查询数据。
- 工具和 agents 使用 Malloy 查询进行 API 调用,Publisher 在后台将它们编译为 SQL。
- 您可以从 agent、仪表板或嵌入式应用程序获得可信的答案,而无需在每个工具中重新定义数据的含义。
我们认为语义层是现代数据栈中缺失的关键。 Publisher 和 Malloy 提供了一种开源的、以开发者为先的方式来定义、管理和服务该层,从而在所有工具中实现一致的、可解释的和 AI-ready 的数据访问。
现在,您可以像发布代码一样发布定义,而不是将定义锁定在专有的 BI 平台中:进行版本控制、测试并通过清晰的接口提供服务。
架构概览
Publisher 由三个主要组件组成:Publisher Server(API 和后端,现在包括 MCP 支持)、Publisher SDK(UI 组件)和 Publisher App(一个参考数据应用程序实现)。
下图说明了 Publisher 组件的组成以及它可以支持的工具和应用程序。
1. Publisher Server (packages/server/
)
- 核心后端: 这是 Publisher 的核心。它是一个服务器应用程序,负责加载和管理 Malloy Packages,这些包封装了您的语义模型。
- Malloy 集成: 它使用 Malloy 运行时来解析
.malloy
文件,理解其中定义的丰富的语义模型(包括关系、计算和业务上下文),并将 Malloy 查询编译为 SQL 以针对目标数据库(BigQuery、Snowflake、Trino、DuckDB、Postgres、MySQL)执行。 - API 层: Publisher 服务器公开两个主要的 API 接口(还有一个即将推出):
- REST API:
- Endpoint:
/api/v0
(在由PUBLISHER_PORT
定义的端口上运行,默认为4000
) - Host: 由
PUBLISHER_HOST
定义(默认为localhost
) - Purpose: 由 Web 前端(Publisher App/SDK)用于浏览软件包、模型和执行查询。
- Specification: 在
api-doc.yaml
中定义。 - Authentication: 无。
- Endpoint:
- Model Context Protocol (MCP) API:
- Endpoint:
/mcp
(在由MCP_PORT
定义的端口上运行,默认为4040
) - Host: 由
PUBLISHER_HOST
定义(默认为localhost
) - Purpose: 允许 AI agents 和其他 MCP 客户端(如 MCP Inspector 或兼容的应用程序)以编程方式与 Malloy 资源(项目、包、模型、来源、视图、notebooks)交互并执行查询。
- Specification: 遵循 MCP
2025-03-26
specification revision。 这包括提供资源元数据和带有建议的详细错误消息。 - Transport: 使用规范中定义的
StreamableHttpServerTransport
,需要兼容的 MCP 客户端。 - Authentication: 无。
- Compatibility: 此实现使用现代的
StreamableHttpServerTransport
,并且与期望已弃用的 SSE 传输的旧客户端不向后兼容(Source: MCP SSE Transport Deprecation)。 - Usage: 要连接 MCP 客户端,请将其指向
http://<PUBLISHER_HOST>:<MCP_PORT>/mcp
。 有关客户端示例,请参阅 MCP Documentation。
- Endpoint:
- SQL API (即将推出):
- Purpose: 连接到您现有的工具。
- REST API:
- Malloy Package Format: Publisher Server 基于 Malloy Package 格式加载语义模型、notebooks 和转换。 此格式旨在与标准的开发人员实践无缝集成。
- Goal:通过标准实践实现可扩展性和治理: 使工程师能够使用熟悉的 workflow(本地开发、CI/CD)和分发机制(例如,packages、容器镜像、registries)来管理、版本控制、测试和分发其数据转换和语义模型。 这旨在将数据开发扩展到远远超出当前 ad-hoc 方法的限制。 至关重要的是,利用这些标准软件工程实践提供了一种自然的治理形式。 当受信任的来源将版本化的 package 推送到中央存储库或注册表时,该特定版本实际上成为用于消费的受祝福或“受治理”的定义。 这与传统数据目录或 BI 工具为实现对数据资产的类似信任和治理级别所需的复杂、通常是定制的过程形成鲜明对比。
- 结构: Malloy package 目前定义为一个目录,其中包含:
- 一个或多个定义数据模型、查询和转换的
.malloy
文件。 - 可选地,一个或多个
.malloynb
文件 (Malloy Notebooks),用于 ad hoc 分析、探索和类似仪表板的演示。 - 一个
publisher.json
manifest 文件。
- 一个或多个定义数据模型、查询和转换的
- Manifest (
publisher.json
): 包含有关 package 的元数据。 当前,它支持name
、version
和description
字段。 随着 Publisher 的发展,此模式将得到显着扩展,以更好地支持依赖项管理、版本控制以及与 package/容器注册表的集成,从而进一步加强治理模型。
2. Publisher SDK (packages/sdk/
)
- UI Component Library: 一组可重用的 React 组件,旨在构建与 Publisher Server 的 RESTful API 交互的用户界面。
- Embeddable: 旨在导入并在其他基于 React 的数据应用程序中使用,允许开发人员轻松地为人类用户添加 Malloy 模型浏览和查询功能。
- Server Communication: 处理获取数据并将查询请求发送到 Publisher Server 的 REST API。
3. Publisher App (packages/app/
)
- 参考实现: 使用 Publisher SDK 构建的独立 Web 应用程序。
- 功能: 允许用户连接到正在运行的 Publisher Server 实例(通过 REST API),浏览可用的 Malloy packages 及其内容,并生成可嵌入的代码段。
- Purpose: 用作如何使用 SDK 的一个实际示例,并为人类分析师的本地开发和探索提供一个有用的工具。
4. MCP-Powered Applications
Publisher Server 及其公开 Malloy 语义模型的 MCP 接口支持一类新的数据驱动应用程序,特别是那些利用 AI 的应用程序。 例如:
- AI Data Analysts: 可以连接到 MCP 服务器,了解 Malloy 中定义的可用业务指标和维度,提出复杂的分析问题(例如,“上个季度按地区划分的客户流失的主要驱动因素是什么?”),并根据检索到的语义一致的数据生成报告或见解的自主代理。
- Context-Aware Chatbots: 客户服务或内部支持 chatbots,可以查询语义层,通过 MCP 准确地回答特定的数据相关问题(例如,“产品 SKU 12345 的当前库存水平是多少?” 或 “客户 X 的 ARR 是多少?”)。
- Automated Reporting & Alerting: 系统,通过 MCP 监视 Malloy 模型中定义的关键指标,并在检测到某些阈值或异常情况时自动生成报告或触发警报,并完全相信被监视指标的定义。
- Data Quality Validation: 工具,通过 MCP 使用访问的语义模型定义来自动根据预期的业务规则和定义验证底层仓库中的数据。
- Enhanced BI Tools: 未来的 BI 工具可能会使用 MCP 作为连接到 Publisher 等语义层的标准方法,从而为用户提供跨不同平台的更可靠和一致的数据视图。
Publisher App Demo
构建和运行说明
按照以下步骤构建 Publisher 组件并在本地运行服务器。 此项目使用 bun
作为 JavaScript 运行时和 package manager。
1. 初始化和更新 Git Submodules:
Publisher 存储库使用 Git submodules 来包含示例 Malloy 模型(当前是 malloy-samples
的一个 fork)。 这些样本用于测试和演示 Publisher 的功能。
首先,初始化注册的 submodules:
git submodule init
然后,更新 submodules 以获取其内容:
git submodule update
2. 安装依赖项:
使用 bun 安装所有必要的项目依赖项(包括服务器、SDK 和应用程序的依赖项):
bun install
3. 构建项目:
将所有 packages(服务器、SDK、应用程序)的 TypeScript 代码编译为 JavaScript:
bun run build
4. 启动 Publisher 服务器:
运行编译后的服务器代码。 默认情况下,这将在端口 4000 上启动 REST API 服务器,并在端口 4040 上启动 MCP 服务器。服务器将加载在 submodules 中找到的 Malloy packages。
bun run start
启动后,您通常可以在 http://localhost:4000 访问 Publisher App(如果正在运行),并在 http://localhost:4040/mcp 访问 MCP endpoint。
有关如何在服务器上进行开发的信息,请参阅 packages/app/README.md。
5. (可选) 配置 GCP 凭据以用于 BigQuery 示例:
一些包含的 malloy-samples 针对 Google BigQuery 公共数据集运行查询。 要运行这些特定的示例,您需要使用 Google Cloud 进行身份验证:
通过使用 gcloud 登录来更新您的 Application Default Credentials (ADC):
gcloud auth login --update-adc
设置您的默认 GCP 项目(将 {my_project_id} 替换为您的实际项目 ID,但对于公共数据集,任何有效的项目通常都应该有效):
gcloud config set project {my_project_id} --installation
当连接到 BigQuery 时,Publisher 服务器(特别是 Malloy 运行时)将自动使用这些凭据。
服务器配置
Publisher 使用本地文件系统上的配置文件来管理服务器设置和项目特定的详细信息,如数据库连接。
- 服务器配置 (
publisher.config.json
):- 位置: 存储在
SERVER_ROOT
目录(运行publisher-server
命令或服务器 package 所在的目录)中。 - Purpose: 定义整体服务器环境,主要是通过列出可用的“项目”及其相对路径。 一个项目代表一个不同的环境或 package 的集合。
- 示例: 有关基本结构,请参见
packages/server/publisher.config.json
。
- 位置: 存储在
- 项目配置 (
publisher.connections.json
):- 位置: 存储在服务器配置中定义的每个单独项目目录的根目录中。
- Purpose: 包含项目特定的设置,最重要的是 Malloy 模型在该项目的 packages 中所需的数据库连接配置(凭据、数据库名称、类型如 BigQuery/Postgres/DuckDB 等)。
- 示例: 有关示例,请参见
malloy-samples/publisher.connections.json
。
- 环境管理:
- 这种两层配置结构(服务器级别列出项目,项目级别定义连接)允许标准的境分离(例如,
dev
、staging
、prod
),这是云开发中的常见做法。 - 您可以为每个环境创建单独的项目目录。 每个项目目录都将包含自己的
publisher.connections.json
,其中包含适用于该环境的适当凭据。 - 至关重要的是,这些环境特定的项目目录可以使用符号链接引用 相同的 底层 Malloy packages(包含模型和 notebooks)。
- 示例文件结构:
- 这种两层配置结构(服务器级别列出项目,项目级别定义连接)允许标准的境分离(例如,
SERVER_ROOT/
├── publisher.config.json # Lists 'staging' and 'prod' projects
│
├── packages/ # Contains the actual Malloy packages
│ ├── package1/
│ │ └── model.malloy
│ ├── package2/
│ └── ...
│
├── staging/ # Staging environment project
│ ├── publisher.connections.json # Staging DB credentials
│ ├── package1 -> ../packages/package1 # Symbolic link
│ └── package2 -> ../packages/package2 # Symbolic link
│
└── prod/ # Production environment project
├── publisher.connections.json # Production DB credentials
├── package1 -> ../packages/package1 # Symbolic link
└── package2 -> ../packages/package2 # Symbolic link
* **好处:** 这允许您构建包含 Publisher 服务器和所有 Malloy packages 的单个 Docker 镜像。 然后,您可以将 *相同的镜像* 部署到不同的环境(staging、production)。 通过配置您的 staging 和 production jobs 以指向适当的项目(`staging` 或 `prod`),您可以确保为每个环境使用正确的连接凭据,而无需重建镜像或修改核心 package 代码。
升级 Malloy 依赖项
要更新到 @malloydata/*
的新 NPM 版本:
bun run upgrade-malloy 0.0.XXX #XXX is the new version number
bun install # This updates node_modules
注意: 请注意,Publisher 存储库当前指向 malloy-samples 仓库的一个 fork。 该 fork 包含一些小的更改,以将每个 Malloy 示例目录转换为一个 package。 一旦 package 格式确定下来,我们打算将更改合并到主要的 malloy-samples 仓库中。
即将推出
我们正在积极开发 Publisher,并计划推出以下几个令人兴奋的功能:
- 增强的开发者模式: 一个简化的本地开发体验,其中对您的
.malloy
或.malloynb
文件的更改会自动触发模型的重新编译和 Publisher App/SDK 的热加载,从而实现更快的迭代和测试。 - 集成的 Ad Hoc 分析 UI: 将来自 Malloy Composer 的强大 Explore UI 直接嵌入到 Publisher App 中。 这将提供一个丰富的图形界面,用于交互式查询和可视化来自已发布的 Malloy 模型的数据,而无需编写代码。
- 计划的转换 pipelines: 扩展 Publisher 以安排 Malloy 转换的执行。 在您的 Malloy packages 中定义 pipelines 以更新 materialized views、创建汇总表或执行由 Publisher 直接管理的其它例行数据准备任务。
- SQL API: 通过 Postgres SQL API 将您现有的 BI 和数据工具连接到 Malloy 语义模型。
- 容器化支持(Dockerfile & Images): 提供官方 Dockerfiles 和预构建的容器镜像,以便轻松地将 Publisher 服务器与特定的 Malloy packages 一起打包。 这简化了部署,提高了跨环境的一致性,并与标准的 DevOps 实践保持一致。 更多详细信息,请参阅 Docker documentation。
- DBT 集成: 弥合与流行的 dbt 生态系统的差距。 潜在的集成点包括在 dbt 中引用 Malloy 模型,以及触发 Malloy 转换作为 dbt workflow 的一部分。
- Airflow 集成: 实现与 Apache Airflow 的无缝集成。 这可能涉及自定义 Airflow 操作符来触发 Publisher 操作,如模型刷新或计划的 pipeline 运行,从而允许将 Malloy/Publisher 任务合并到更大、更复杂的数据编排 DAG 中。
加入 Malloy 社区
- 加入我们的 Malloy Slack Community! 使用此社区提出问题,与其他 Malloy 用户会面,并彼此分享想法。
- 使用此 Repo 中的 GitHub issues 提供反馈、建议改进、报告错误并开始新的讨论。
资源
文档:
- Malloy Language - 语言的快速介绍
- eCommerce Example Analysis - 电子商务数据集(BigQuery 公共数据集)上的基础知识演练
- Modeling Walkthrough - 通过 Iowa 酒类销售公共数据集(BigQuery 公共数据集)介绍建模
- YouTube - 观看 Malloy 的演示/演练
关于
未提供说明、网站或主题。
资源
许可证
Stars
Watchers
Forks
Releases
未发布任何版本
Packages 0
未发布任何 package
Contributors 9
语言
- TypeScript 97.4%
- JavaScript 2.2%
- Other 0.4%
页脚
GitHub © 2025 GitHub, Inc.
页脚导航
You can’t perform that action at this time.