MING
返回部落格

我們把八字工具鏈全開源了:bazi-kit 三件套

AskingMing 團隊把支撐產品的八字工具鏈全部開源:計算引擎 bazi-engine、雙語術語庫 bazi-terms、React 排盤組件 bazi-chart,MIT 協議,歡迎複用。

2026年9月7日Ming Team

做一款八字產品,最底層的痛點不是「怎么解讀」,而是连一套乾淨的雙語術語表和能用的排盘介面都没有。市面上要么只有中文資料,要么每个排盘 UI 都焊死在某一个特定的計算引擎上——想换个引擎、想显示英文標籤,就得把整個檢視层重寫一遍。

AskingMing 在開發過程中也踩了同样的坑。所以我們乾脆把支撐產品的整條工具鏈都整理出来,以 MIT 協議開源成了 bazi-kit —— 三個可以獨立使用、也可以組合使用的 npm 包:

  • bazi-engine —— 計算层:傳入出生時間、地點和性別,返回一張完整的命盤。
  • bazi-terms —— 雙語術語库:天干地支、十神、納音、神煞……結構化、可翻譯、零依賴。
  • bazi-chart —— React 排盘組件:把任意命盤數據渲染成乾淨的雙語介面。

三者之間的依賴方向是嚴格單向的:bazi-terms ← bazi-engine / bazi-chart。渲染組件不依賴計算引擎——你可以用我們的引擎,也可以帶你自己的。

bazi-engine:从出生時間到一張完整命盤

这是整條链路里最「重」的一层,也是最容易被低估的一层。排盘看起来只是查表,但要把真太阳时、历史夏令时、城市坐标这些细节都做对,工程量远比想象中大。

import { computeBazi } from 'bazi-engine';

const result = computeBazi({
  solar: '1990-03-24 09:54',
  gender: 'male',
  location: { city: '广州' },
});
// result.pillars, result.daYun, result.solarTime …

computeBazi 是一个纯函數:相同輸入永远得到字节级相同的輸出,没有 IO、没有 Date.now()、没有全局状态。它默认开启真太阳时校正(使用 Meeus 均时差公式),通过 IANA 时区數據库处理历史夏令时——比如中国 1988 年夏天实际是 UTC+9,静态偏移量表表达不了这种细节。

v1 版本覆盖的能力:

  • 四柱(干支、藏干)、十神(天干级 + 藏干级)
  • 納音、旬 / 空亡、长生十二宫、自坐
  • 大运(含十神与納音)
  • 真太阳时(Meeus / 近似两种演算法可选)
  • 内置 88 个城市的坐标与时区映射

刑冲合会、神煞、五行分值计划在 v2 加入。

bazi-terms:让每个概念都可翻譯、可检索

命盤用到的每一个術語,都是結構化數據:

  • 十天干 STEMS(10)、十二地支 BRANCHES(12)
  • 五行(含相生相克)ELEMENTSELEMENT_CYCLES
  • 十神(含日主)TEN_GODS(11)
  • 十二长生 GROWTH_STAGES神煞 SHEN_SHA(38)
  • 六十甲子納音 NA_YIN(30 音 / 60 组)
  • 刑冲合会 INTERACTION_TYPES(8)、通用術語 GENERAL_TERMS(40+)

每个词条都带 keyzhen、可选的 pinyin,以及一段可以直接贴进 tooltip 的英文定義。主力函數 translate() 永不抛错——无法識別的輸入原样返回,所以你可以放心把任何引擎的原始輸出直接管道给它:

import { translate, t, naYinOf } from 'bazi-terms';

t('dayMaster');              // 'Day Master'
translate('元男');            // 'Day Master'   (别名自动解析)
translate('甲子');            // 'Sea Gold'     (按六十甲子取納音)
naYinOf('甲子')?.en;          // 'Sea Gold'

不同引擎对同一个概念的命名往往不一样(有的用 元男,有的用 日元;有的把刑冲合会輸出成枚举值),bazi-terms 通过别名和专用解析器把它们统一归一,于是一套 zh → key 映射就能服务所有引擎。

bazi-chart:把任意命盤渲染成雙語介面

把你的命盤數據喂给 <BaziChart />,它会自动識別輸入形状、归一化、然后渲染——不需要额外配置。

import { BaziChart } from 'bazi-chart';

// data = 你引擎的原始輸出;形状会被自动識別。
export default function Reading({ engineOutput }) {
  return <BaziChart data={engineOutput} lang="both" theme="light" />;
}

它会渲染完整的画面:四柱(主星、按五行着色的干支字、藏干及其十神、納音、长生、空亡、神煞)、五行分数条、刑冲合会面板、大运時間线,以及命宫 / 身宫 / 胎元 / 胎息等辅助宫位。样式是纯内联的,不需要 import CSS,对 SSR 和任何元框架(Next.js、Remix、Astro)都安全。

如果你已经有自己的引擎、只想用我們的渲染层,bazi-chart 也能直接对接——它自动識別社区最常见的两种數據形状(顶层 八字 对象、按年月日时键控的 pillars 映射),也支持你自己構建 NormalizedChart

安裝与組合

三個包都可以单独使用,也可以按需組合:

# 完整链路:計算 + 渲染
npm install bazi-engine bazi-chart

# 只要渲染层(带自己的引擎)
npm install bazi-chart

# 只要術語库(做 i18n、博客词条、tooltip)
npm install bazi-terms

都提供 ESM + CJS 双構建和完整的 TypeScript 類型宣告。

为什么選擇開源整條链路

很多八字專案要么只開源演算法、要么只開源 UI,中间缺了一环就逼着你去适配别人的私有格式。我們把三层都打开,是因为每一层都有獨立的复用价值

  • 你正在做一款八字 App?直接用 bazi-engine 算、bazi-chart 渲染,省掉几个月的基础设施工作。
  • 你已经有自己的引擎、只想要一个乾淨的排盘介面?装 bazi-chart,它不绑定任何特定引擎。
  • 你在写八字相关的文章或教程、需要准确的中英对照術語?bazi-terms 零依賴,拿来就用。

这也是我們对「八字工具生态」的一点期待:与其每个人都在重复造轮子,不如把基础的部分做成公共基础设施,把精力留给真正有差异化的解讀和產品体验。

關於 AskingMing

bazi-kit 是 AskingMing 底下開源出来的工具鏈——AskingMing 是一款 AI 八字洞察与心灵成长產品(也就是你正在看的这个站)。但这套工具是设计给任何在这个领域做開發的人用的,獨立于產品本身存在。

它还早期(v0.1.x),真心欢迎回饋:術語缺漏、翻译有误、边界情况、新的命盤形状、或者非 React 的渲染器需求——都可以通过 GitHub issue 或 PR 告诉我們。

想看看这套排盘实际长什么样?輸入你的出生年月日时,一键生成属于你自己的八字命盤:免费排八字

GitHub: https://github.com/favkit/bazi-kit · npm: bazi-engine / bazi-terms / bazi-chart

推薦閱讀