讓 AI 直接幫你畫圖表:dbt Charts 接上 Hermes Agent 實測
前幾天 dbt Labs 把自家的圖表層開源了,名字就叫 dbt Charts,官方 blog 標題下得很直白:Charts built for Chat。意思就是,這套東西從一開始就不是寫給人點的,是寫給 agent 讀寫的。我花了一個下午把它接上我的 Hermes Agent,順手拿 Upstart(UPST)近四季營收畫了一張圖,過程記錄下來。
dbt Charts 是什麼
一句話:整份互動式儀表板收進一個 YAML 檔,SQL 負責拿資料,YAML 負責決定怎麼呈現。
傳統做法是 agent 幫你生一堆 HTML、CSS、JavaScript,加兩個圖表庫,要上線再包成 React 或 Streamlit。改一次就燒一堆 token,審計還得跨好幾個檔案追。另一條路是 BI 工具內建的 copilot,但能做的事被 UI 框死。dbt Charts 想走第三條路:
queries:
upst_revenue:
columns: [quarter, revenue_m]
values:
- [2025-Q3, 277.1]
- [2025-Q4, 296.1]
charts:
revenue_bar:
title: Upstart 單季總營收(百萬美元)
type: bar
query: upst_revenue
x: quarter
y: revenue_m
rows:
- revenue_bar
上面這段就是全部了,一個 query、一個圖、一行版面。包名叫 dbt-charts,CLI 叫 dct,Apache 2.0 授權,裝一行:
uv tool install dbt-charts
DuckDB 內建,其他倉庫(BigQuery、Snowflake、Postgres 等)當 extra 裝。目前 pre-1.0,語法還會變,官方說舊 board 解析時會自動遷移。圖表有 16 種核心類型加 13 種組合,1,100 多個參數,文件是離線的,dct docs 直接查。
接上 Hermes Agent:三條路,我選 MCP
dct 官方給 agent 留了三個接口。第一,CLI 直接下指令,輸出全是給機器讀的文字,錯誤碼加檔行加修法建議。第二,MCP server,stdio,對外丟 13 支工具。第三,dct init skills 把 workflow 落盤到 .agents/skills,Hermes 不讀那個目錄,跳過,用 MCP 的 get_skill 按需拿就行。
MCP 那 13 支:validate_board、render_board、execute_query、describe_query、search_boards、query_board、describe_board、docs、list_diagnostic_codes、get_diagnostic_code,加上 list_skills、search_skills、get_skill。檔案讀寫刻意沒包,官方的理由是外部 agent 自己都有,Hermes 也是,剛好互補。
註冊指令長這樣:
hermes mcp add dbt-charts \
--command /Users/derekhsu/.local/share/uv/tools/dbt-charts/bin/dct \
--connect-timeout 60 --env PYTHONUNBUFFERED=1 \
--args mcp serve --project-dir=/tmp/dct-demo
hermes mcp test 驗證 13 支全認到。過程踩了三個坑:--project-dir 要用等號相連,不然會被 hermes 自己的參數解析吃掉;server 的 stdout 會被緩衝,得指直接 binary 路徑加 PYTHONUNBUFFERED,不然連線 hang 死;冷啟動要 30 秒以上,timeout 設 60 秒。另外 dct init mcp 只認 Cursor、Codex、VS Code 和 Claude Code,沒有 Hermes,只能手動加。
還有一個觀念要先建立:它是一個 server 綁一個專案目錄。啟動時用 --project-dir 往上找 dbt_charts.yml,所有路徑參數都是專案內相對路徑,跨專案查不到。多專案就多加幾個 entry,這跟它「charts 目錄跟 models 放同一 repo」的哲學一致,治理邊界就是 repo 邊界。
實戰:UPST 近四季營收
先抓數字。Q2 2026 的 SEC 新聞稿寫總營收 3.647 億美元,年增 42%。Q1 是 3.082 億,Q4 2025 是 2.961 億,Q3 2025 是 2.771 億,四份來源交叉對過,沒矛盾。
| 季度 | 營收 | 季增 |
|---|---|---|
| 2025-Q3 | 277.1M | — |
| 2025-Q4 | 296.1M | 6.9% |
| 2026-Q1 | 308.2M | 4.1% |
| 2026-Q2 | 364.7M | 18.3% |
Q2 的 EPS 其實大 miss(0.16 對預期 0.55),但營收 beat,全年 14 億美元指引不變。這張圖只呈現營收,不摻別的。
Board 檔 19 行,資料用 type values 直接內嵌,連資料庫都不用開。dct validate 第一次就過,只跳一個警告:y 軸欄位看起來像貨幣,卻沒設貨幣格式,照它給的修法補上,第二次乾淨通過。這就是它主打的回饋環:agent 看不見圖,所有問題都得用文字講到能直接動手。
render 出來我用 vision 複檢,抓到 validator 沒抓到的:Y 軸上限停在 300,Q2 那根 365 被天花板吃了。查 dct docs 找到 axis_y.scale.continuous.domain,定成 0 到 400,重 render,乾淨。
成品如下,SVG 向量,明細表附在圖下方:
!
以後 Q3 財報出來,改 values 四行重跑就行,CI 也能跑 dct validate 擋破版。
先說限制
pre-1.0 是真的早,repo 83 顆星,不收 PR 只收 issue。dbt Semantic Layer 還沒接,metric 口徑目前要自己寫 SQL。託管版 dbtCharts.com 在 public beta,定價沒公布。我的定位是本地試玩和 agent 報表,不會現在就拿去接生產的東西。
但方向我買單。讓 agent 寫一個 YAML,比讓它吐一整套前端省下來的 token 不是一點半點,而且審計只要看一個檔。下次財報季,我大概就是一句話叫 Hermes 更新這張圖了。
參考連結:官方 blog(dbtcharts.com/blog/charts-built-for-chat)、GitHub(dbt-labs/dbt-charts)、文件(docs.dbtcharts.com)、免安裝試玩(play.dbtcharts.com)。
