@itsharmanjot: 你的AI智能体现在可以构建你的BI仪表盘了。不是查询它们,而是构建它们。它叫Rill。每个仪表盘、指标……
摘要
Rill是一个开源BI工具,允许AI智能体通过自然语言提示直接构建仪表盘,使用YAML和SQL,并配有MCP服务器,可与Claude、ChatGPT等智能体集成。
查看缓存全文
缓存时间: 2026/07/09 13:45
现在,你的AI代理可以直接构建BI仪表板。不是查询它们,而是构建它们。
它叫Rill。每一个仪表板、度量和数据模型都通过代码定义,Claude Code或Cursor可以根据一句提示写出整个内容。
不再需要“嘿,数据团队能帮我建个仪表板吗?”然后等上两周。你的代理读取语义层,编写YAML,然后交付度量。
→ 一键安装二进制文件,curl https://rill.sh | sh,几分钟内在本地启动仪表板,无需集群,无需服务器配置
→ 仪表板用YAML和SQL定义,像真实代码一样在git中进行版本控制,而不是锁定在拖拽式UI中
→ 开箱即用提供MCP服务器,因此Claude、ChatGPT或任何代理直接连接你的度量层
→ 本地开发由DuckDB驱动,当你需要查询数十亿行时改用ClickHouse,无论哪种方式都是亚秒级响应
→ 专为这样一个时刻而构建:BI不再是你要提交工单的团队,而是你的代理自动完成的事情
2018年构建的BI工具假设人类点击按钮。Rill假设编写SQL的可能是AI,并用代码构建了整个栈,使这成为可能。
Apache 2.0许可证。2600+ GitHub星标。100%开源。
来源:https://rill.sh/ #!/usr/bin/env sh # Determine the platform using ‘OS’ and ‘ARCH’ initPlatform() { OS=\(uname \-s \| tr '\[:upper:\]' '\[:lower:\]'\) ARCH=(uname -m) if [ “OS" = "darwin" \] && \[ "ARCH” = “arm64” ]; then PLATFORM=“darwin_arm64” elif [ “OS" = "darwin" \] && \[ "ARCH” = “x86_64” ]; then PLATFORM=“darwin_amd64” elif [ “OS" = "linux" \] && \[ "ARCH” = “x86_64” ]; then PLATFORM=“linux_amd64” elif [ “OS" = "linux" \] && \{ \[ "ARCH” = “arm64” ] || [ “ARCH" = "aarch64" \]; \}; then PLATFORM="linux\_arm64" else printf "Platform not supported: os=%s arch=%s\\n" "OS” “ARCH" exit 1 fi \} \# Create a temporary directory and setup deletion on script exit using the 'EXIT' signal initTmpDir\(\) \{ TMP\_DIR=(mktemp -d) trap ‘rm -rf -- “\{TMP\_DIR\}"' EXIT cd "TMP_DIR” } # Ensure that dependency is installed and executable, exit and print help message if not checkDependency() { if ! [ -x “\(command \-v "1”)“ ]; then printf “’%s’ could not be found, this script depends on it, please install and try again.\n” “1" exit 1 fi \} \# Ensure that 'git' is installed and executable, exit and print help message if not checkGitDependency\(\) \{ if \! \[ \-x "(command -v git)” ]; then publishSyftEvent git_missing printf “Git could not be found, Rill depends on it, please install and try again.\n\n” printf “Helpful instructions: https://github.com/git-guides/install-git\n” exit 1 fi } # Ensure that either ‘shasum’ or ‘sha256sum’ is installed and executable, exit and print help message if not resolveShasumDependency() { if [ -x “\(command \-v shasum\)" \]; then sha256\_verify="shasum \-\-algorithm 256 \-\-ignore\-missing \-\-check" elif \[ \-x "(command -v sha256sum)” ]; then sha256_verify=“sha256sum --ignore-missing --check” else printf “neither ‘shasum’ or ‘sha256sum’ could be found, this script depends on one of them, please install one of them and try again.\n” exit 1 fi } # Download the binary and check the integrity using the SHA256 checksum downloadBinary() { CDN=“cdn.rilldata.com” LATEST_URL=“https://\{CDN\}/rill/latest\.txt" if \[ "{VERSION}” = “latest” ]; then VERSION=$(curl --silent --show-error \{LATEST\_URL\}\) fi BINARY\_URL="https://{CDN}/rill/\{VERSION\}/rill\_{PLATFORM}.zip“ CHECKSUM_URL=“https://\{CDN\}/rill/{VERSION}/checksums.txt” printf “Downloading binary: %s\n” “BINARY\_URL" curl \-\-location \-\-progress\-bar "{BINARY_URL}” --output rill_\{PLATFORM\}\.zip printf "\\nDownloading checksum: %s\\n" "CHECKSUM_URL“ curl --location --progress-bar “${CHECKSUM_URL}” --output checksums.txt printf “\nVerifying the SHA256 checksum of the downloaded binary:\n” \{sha256\_verify\} checksums\.txt printf "\\nUnpacking rill\_%s\.zip\\n" "PLATFORM“ unzip -q rill_\{PLATFORM\}\.zip \} \# Print install options printInstallOptions\(\) \{ printf "\\nWhere would you like to install rill? \(Default \[1\]\)\\n\\n" printf "\[1\] /usr/local/bin/rill \[recommended, but requires sudo privileges\]\\n" printf "\[2\] ~/\.rill/rill \[directory will be created & path configured\]\\n" printf "\[3\] \./rill \[download to the current directory\]\\n\\n" \} \# Ask for preferred install option promtInstallChoice\(\) \{ printf "Pick install option: \(1/2/3\)\\n" read \-r ans /dev/null 2\>&1; then printf "There is a conflicting version of Rill installed using Brew\.\\n\\n" printf "To upgrade using Brew, run 'brew upgrade rilldata/tap/rill'\.\\n\\n" printf "To use this script to install Rill, run 'brew remove rilldata/tap/rill' to remove the conflicting version and try again\.\\n" exit 1 elif \[ "INSTALLED_RILL“ != “\{INSTALL\_DIR\}/rill" \]; then printf "There is a conflicting version of Rill installed at '%s'\\n\\n" "INSTALLED_RILL” printf “To use this script to install Rill, remove the conflicting version and try again.\n” exit 1 fi fi } # Install the binary and ask for elevated permissions if needed installBinary() { if [ “INSTALL\_DIR" = "/usr/local/bin" \]; then printf "\\nElevated permissions required to install the Rill binary to: %s/rill\\n" "INSTALL_DIR” sudo install -d “INSTALL\_DIR" sudo install rill "INSTALL_DIR” else install -d “INSTALL\_DIR" install rill "INSTALL_DIR” fi cd - > /dev/null } # Run the installed binary and print the version testInstalledBinary() { RILL_VERSION=\("INSTALL_DIR“/rill version) “INSTALL\_DIR"/rill verify\-install 1\>/dev/null \|\| true printf "\\nInstallation of %s completed\!\\n" "RILL_VERSION” } # Print ‘rill start’ help intrcutions printStartHelp() { boldon=\(tput smso\) boldoff=(tput rmso) if [ “INSTALL\_DIR" = "/usr/local/bin" \]; then printf "\\nTo start a new project in Rill, execute the command:\\n\\n %srill start my\-rill\-project%s\\n\\n" "boldon” “boldoff" elif \[ "INSTALL_DIR” = “HOME/\.rill" \]; then printf "\\nTo start a new project in Rill, open a %snew terminal%s and execute the command:\\n\\n %srill start my\-rill\-project%s\\n\\n" "boldon” “boldoff" "boldon” “boldoff" elif \[ "INSTALL_DIR” = “\(pwd\)" \]; then printf "\\nTo start a new project in Rill, execute the command:\\n\\n %s\./rill start my\-rill\-project%s\\n\\n" "boldon” “boldoff" fi \} \# Publish Syft install telemetry event, can be disabled by setting the 'RILL\_INSTALL\_DISABLE\_TELEMETRY' environment variable publishSyftEvent\(\) \{ SYFT\_URL=https://event\.syftdata\.com/log SYFT\_ID=clp76quhs0006l908bux79l4v if \[ \-z "RILL_INSTALL_DISABLE_TELEMETRY” ]; then curl --silent --show-error --header “Authorization: \{SYFT\_ID\}" \-\-header "Content\-Type: application/json" \-\-data "\{\\"event\_name\\":\\"1\”}“ SYFT\_URL \> /dev/null \|\| true \>&2 fi \} \# Add the Rill binary to the PATH via configuration of the shells we detect on the system addPathConfigEntries\(\) \{ PATH\_CONFIG\_LINE="export PATH=\\HOME/.rill:\PATH \# Added by Rill install" if \[ "INSTALL_DIR“ = “HOME/\.rill" \]; then for f in "HOME/.bashrc” “HOME/\.zshrc"; do if \[ \-f "f” ]; then if ! grep -Fxq “PATH\_CONFIG\_LINE" "f”; then printf “\nWould you like to add ‘rill’ to your PATH by adding an entry in ‘%s’? (Y/n)\n” “f" read \-r ans \> "f” ;; esac fi fi done fi } # Remove PATH configurations, we have to do handle this slightly different based on OS because of platform variations in ‘sed’ behaviour removePathConfigEntries() { for f in “HOME/\.bashrc" "HOME/.zshrc”; do if [ -f “f" \]; then if \[ "OS” = “darwin” ]; then sed -i “” -e ‘/# Added by Rill install/d’ “f" elif \[ "OS” = “linux” ]; then sed -i -e ‘/# Added by Rill install/d’ “f" fi fi done \} \# Install Rill on the system installRill\(\) \{ publishSyftEvent install checkDependency curl checkDependency unzip checkGitDependency resolveShasumDependency initPlatform detectPreviousInstallation if \[ \-z "{INSTALL_DIR}” ]; then printInstallOptions promtInstallChoice checkConflictingInstallation fi initTmpDir downloadBinary installBinary testInstalledBinary addPathConfigEntries printStartHelp publishSyftEvent installed } # Uninstall Rill from the system, this function is aware of both the privileged and unprivileged install methods uninstallRill() { checkDependency sed initPlatform if [ -f “/usr/local/bin/rill” ] then printf “\nElevated permissions required to uninstall the Rill binary from: ‘/usr/local/bin/rill’\n” sudo rm /usr/local/bin/rill fi rm -f “$HOME/.rill/rill” removePathConfigEntries printf “Uninstall of Rill completed\n” } set -e # Parse input flag case 1 in \-\-uninstall\) uninstallRill ;; \-\-nightly\) VERSION=nightly installRill ;; \-\-version\) VERSION={2:-latest} installRill ;; --non-interactive) INSTALL_DIR=\{2\:-"/usr/local/bin"\} VERSION={3:-latest} installRill ;; *) VERSION=latest installRill ;; esac
相似文章
Launch HN: BitBoard (YC P25) – 面向智能体的分析工作台
BitBoard 是一个分析工作台,允许用户使用 Claude、ChatGPT 和 Cursor 等 AI 工具构建仪表板和报告,支持可追溯的查询和团队共享。
赋能团队更快地解锁洞察 - OpenAI
OpenAI 开发了一个内部研究助手,它将仪表板与对话式 GPT-5 界面相结合,帮助团队在几分钟内分析数百万支持工单并生成洞察,而不是花费数周时间。该工具在整个团队中实现了数据分析民主化,允许非技术用户用自然语言提问并获得关于产品反馈、客户情感和趋势的可行性报告。
在AgentSwarms沙箱中引入本地SQL与BI智能体。上传CSV并用自然语言与数据对话(Text-to-SQL + 自动图表)。
AgentSwarms推出了一个新的SQL与BI智能体工作区,允许用户上传CSV文件,用自然语言提问,自动转换为SQL查询并生成可视化图表。
AI仪表盘 + 基础设施 + Rocket.Chat
作者分享了他们使用Rocket.Chat、CLI代理和tmux构建AI代理基础设施的经验,规模扩展至250个客户,帮助他们建立网站。他们从销售服务转向教客户自己使用代理,强调了此类系统中上下文管理的重要性。
构建数据代理
探讨从文本转SQL到自主数据代理的演变,比较了使用LangGraph自定义构建的代理与Snowflake Cortex Analyst、Databricks Genie和PowerBI Copilot等托管平台。