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

推荐阅读