专业八字命理 AI 系统 — 排盘、五行精算、格局判定、大运流年、AI 对话解读
graph TB
subgraph Desktop["Tauri v2 Desktop"]
WebView["WebView2<br/>React 18 SPA"]
end
subgraph Browser["Web Browser"]
SPA["React SPA<br/>localhost:5173"]
end
subgraph Backend["FastAPI Backend :8000"]
API["API Routes<br/>/api/v1/*"]
CORS["CORS Middleware"]
Static["Static Files<br/>frontend/dist/"]
end
subgraph Engine["Python Engine"]
BaziEngine["bazi_engine.py<br/>四柱计算"]
Shensha["shensha.py<br/>神煞判定"]
WuxingCalc["wuxing_calculator.py<br/>五行精算"]
GejuAnalyzer["geju_analyzer.py<br/>格局判定"]
end
subgraph Agent["ReAct Agent"]
ReactLoop["react_agent.py<br/>推理循环"]
ApiAdapter["api_adapter.py<br/>API 适配"]
Tools["14 Tools<br/>bazi_tools.py"]
PromptEngine["system_prompts.py<br/>提示词引擎"]
end
subgraph Data["Data Layer"]
JSON["Classical Texts<br/>5 JSON files"]
Chroma["ChromaDB<br/>RAG Vector DB"]
end
subgraph LLM["AI Models"]
OpenAI["OpenAI<br/>GPT-4o"]
Anthropic["Anthropic<br/>Claude"]
MiniMax["MiniMax<br/>M2.7"]
GLM["智谱 GLM<br/>glm-5.1"]
DeepSeek["DeepSeek"]
end
Desktop -->|SSE / HTTP| API
Browser -->|Vite Proxy| API
API --> CORS
API --> BaziEngine
API --> ReactLoop
API --> Static
BaziEngine --> Shensha
BaziEngine --> WuxingCalc
BaziEngine --> GejuAnalyzer
ReactLoop --> Tools
ReactLoop --> ApiAdapter
ReactLoop --> PromptEngine
PromptEngine --> JSON
Tools --> Chroma
ApiAdapter --> OpenAI
ApiAdapter --> Anthropic
ApiAdapter --> MiniMax
ApiAdapter --> GLM
ApiAdapter --> DeepSeek
sequenceDiagram
participant U as 用户
participant F as React 前端
participant B as FastAPI 后端
participant E as bazi_engine
participant W as wuxing_calculator
participant G as geju_analyzer
U->>F: 输入出生日期/时间/性别
F->>B: POST /api/v1/chart
B->>E: calculate_professional_bazi(dt, gender)
E-->>B: flat chart data (pillars, tg_gan, tg_zhi, nayin, ...)
B->>W: calculate_wuxing_power(chart)
W-->>B: wuxing_power (strong/weak/balanced)
B->>G: analyze_geju(chart)
G-->>B: geju (格局类型, 日主强弱, ...)
B-->>F: {chart, wuxing_power, geju}
F->>F: adaptChartResponse() → BaziReading
F->>U: 命盘可视化展示
sequenceDiagram
participant U as 用户
participant F as React 前端
participant B as FastAPI 后端
participant N as _normalize_chart_data
participant A as ReAct Agent
participant T as 14 Tools
participant LLM as AI Model
U->>F: 提问(如:分析我的格局)
F->>F: 构建 ChatStreamRequest
Note over F: bazi_context = BaziReading<br/>provider → PROVIDER_NAME_MAP
F->>B: POST /api/v1/chat/stream (SSE)
B->>N: normalize(BaziReading → flat)
N-->>B: flat chart data
B->>A: stream_chat(chart_data, message)
A->>A: build_system_prompt(chart_data)
loop ReAct Loop (max 8 steps)
A->>LLM: messages + tools schema
LLM-->>A: tool_calls or text
alt Tool Call
A->>T: dispatch_tool(name, args, bazi_data)
T-->>A: tool result
A-->>F: SSE event: status/tool_call
else Final Answer
A-->>F: SSE event: token (streaming)
end
end
A-->>F: SSE event: done
F->>U: Markdown 渲染展示
graph LR
subgraph Frontend["frontend/src/"]
Pages["10 Pages<br/>Lazy-loaded"]
Components["Components<br/>bazi · chat · layout · ui"]
Stores["Zustand Stores<br/>bazi · chat · settings"]
Hooks["Hooks<br/>useChatSSE"]
Lib["Lib<br/>api · adapter · wuxing"]
Types["Types<br/>bazi.ts"]
end
subgraph Backend["backend/"]
API_Routes["api/<br/>chart · chat · texts<br/>compatibility · entertainment"]
Schemas["schemas/<br/>chart · chat · common"]
Services["services/<br/>bazi · agent · text"]
Config["config.py<br/>Pydantic Settings"]
end
subgraph Core["Python Core"]
Engine["engine/<br/>bazi_engine · shensha"]
Tools["tools/<br/>bazi_tools · wuxing · geju"]
Agent["agent/<br/>react_agent · api_adapter<br/>scholar_agent"]
Prompts["prompts/<br/>system_prompts · ancient_texts"]
end
subgraph DataLayer["data/"]
Texts["classical_texts/<br/>5 JSON files"]
RAG["chroma_db/<br/>RAG Vector DB"]
RAGService["rag_service.py"]
end
subgraph Tests["tests/ - 452 tests"]
T1["test_backend_api"]
T2["test_engine_comprehensive"]
T3["test_tools_comprehensive"]
T4["test_agent_service"]
T5["test_api_comprehensive"]
T6["test_chart_data_adapter"]
end
完整目录树
FOR-BAZI/
├── engine/ # 核心命理引擎
│ ├── bazi_engine.py # 四柱八字计算(基于 lunar-python)
│ └── shensha.py # 神煞判定(20+ 神煞)
│
├── tools/ # 分析工具(14 个 Agent 工具)
│ ├── bazi_tools.py # Agent 可调用工具集
│ ├── wuxing_calculator.py # 五行力量精算
│ └── geju_analyzer.py # 格局判定
│
├── agent/ # AI Agent 层
│ ├── react_agent.py # ReAct 推理循环
│ ├── api_adapter.py # OpenAI/Anthropic API 适配
│ ├── scholar_agent.py # RAG 学术 Agent
│ └── context_manager.py # 上下文管理
│
├── prompts/ # 提示词模板
│ ├── system_prompts.py # 系统提示词(玄冥人设)
│ └── ancient_texts.py # 古籍文献数据库
│
├── backend/ # FastAPI 后端
│ ├── main.py # 应用入口
│ ├── config.py # Pydantic Settings
│ ├── api/ # 5 个路由模块
│ ├── schemas/ # Pydantic 数据模型
│ └── services/ # 业务逻辑层
│
├── frontend/ # React + Tauri 前端
│ ├── src/
│ │ ├── pages/ # 10 个页面(Lazy-loaded)
│ │ ├── components/ # bazi · chat · layout · ui
│ │ ├── stores/ # Zustand 状态管理(3 个)
│ │ ├── hooks/ # useChatSSE
│ │ ├── lib/ # api · response-adapter · wuxing
│ │ └── types/ # TypeScript 类型
│ └── src-tauri/ # Tauri v2 配置
│
├── data/ # 数据层
│ ├── classical_texts/ # 5 本古籍 JSON
│ └── chroma_db/ # RAG 向量数据库
│
├── tests/ # 452 个单元测试
├── mcp_server/ # MCP 工具服务器
├── docs/ # 文档
└── streamlit_app.py # Streamlit 旧版
graph TD
subgraph Agent["ReAct Agent 玄冥"]
Router["dispatch_tool()"]
end
subgraph CoreTools["核心计算"]
T1["get_annual_fortune<br/>流年干支"]
T2["get_dayun_stage<br/>大运阶段"]
T3["calculate_wuxing_power<br/>五行精算"]
T4["analyze_wuxing_balance<br/>五行平衡"]
T5["analyze_geju<br/>格局判定"]
end
subgraph ClassicalTools["古籍查询"]
T6["query_qiongtong_guidance<br/>穷通宝鉴"]
T7["query_disitian_guidance<br/>滴天髓"]
T8["query_ziping_guidance<br/>子平真诠"]
T9["query_sanming_guidance<br/>三命通会"]
T10["query_classical_text<br/>通用古籍检索"]
end
subgraph AuxTools["辅助工具"]
T11["rag_retrieve<br/>RAG 语义检索"]
T12["query_xing_chong_he_hai<br/>刑冲合害"]
T13["explain_shensha<br/>神煞解释"]
T14["fact_check_ganzhi<br/>干支校验"]
end
Router --> T1 & T2 & T3 & T4 & T5
Router --> T6 & T7 & T8 & T9 & T10
Router --> T11 & T12 & T13 & T14
graph LR
subgraph Sources["5 本经典"]
Q["穷通宝鉴<br/>调候用神"]
D["滴天髓<br/>十干体性"]
Z["子平真诠<br/>格局论法"]
S["三命通会<br/>宫位六亲"]
Y["渊海子平<br/>命理总论"]
end
subgraph Storage["存储"]
JSON["JSON Files<br/>data/classical_texts/"]
Chroma["ChromaDB<br/>向量索引"]
end
subgraph Query["查询"]
Exact["精确匹配<br/>text_service"]
Semantic["语义检索<br/>rag_service"]
end
Sources --> JSON
JSON --> Chroma
JSON --> Exact
Chroma --> Semantic
| 依赖 | 版本 | 用途 |
|---|---|---|
| Python | 3.10+ | 后端 + 命理引擎 |
| Node.js | 18+ | 前端构建 |
| Rust | 1.70+ | Tauri 桌面应用(可选) |
git clone https://github.com/gaaiyun/FOR-BAZI.git
cd FOR-BAZI
# Python 依赖
pip install -r backend/requirements.txt
# 前端依赖
cd frontend && npm install && cd ..# AI 模型(至少配置一个)
BAZI_OPENAI_API_KEY=sk-...
BAZI_OPENAI_BASE_URL=https://api.openai.com/v1
BAZI_OPENAI_MODEL=gpt-4o
BAZI_ANTHROPIC_API_KEY=sk-ant-...
BAZI_ANTHROPIC_BASE_URL=https://api.anthropic.com# 后端
python -m uvicorn backend.main:app --reload --host 0.0.0.0 --port 8000
# 前端(新终端)
cd frontend && npm run dev访问 http://localhost:5173 或 http://localhost:8000
cd frontend && npx tauri build
# 产出:frontend/src-tauri/target/release/bundle/nsis/FOR-BAZI_2.0.0_x64-setup.exe| 端点 | 方法 | 说明 |
|---|---|---|
/api/v1/chart |
POST | 八字排盘计算 |
/api/v1/chat/stream |
POST | AI 流式对话(SSE) |
/api/v1/compatibility |
POST | 合婚匹配 |
/api/v1/texts |
GET | 古籍检索 |
/api/v1/entertainment/daily-fortune |
GET | 每日运势 |
/health |
GET | 健康检查 |
完整 API 文档见 docs/API.md
| 层 | 技术 |
|---|---|
| 前端 | React 18 · TypeScript · Vite 6 · Tailwind CSS 4 · shadcn/ui · ECharts 5 · Zustand 5 |
| 后端 | FastAPI · uvicorn · sse-starlette · Pydantic 2 · lunar-python |
| AI | OpenAI SDK · Anthropic SDK · ReAct Agent · RAG (ChromaDB + sentence-transformers) |
| 桌面 | Tauri v2 · Rust · WebView2 |
| 测试 | pytest · 452 tests · 100% 核心模块覆盖 |
| 五行 | 颜色 | Hex |
|---|---|---|
| 金 (Metal) | 金黄 | #d4af37 |
| 木 (Wood) | 翠绿 | #50c878 |
| 水 (Water) | 深蓝 | #1e90ff |
| 火 (Fire) | 赤红 | #e94560 |
| 土 (Earth) | 土黄 | #c9a96e |
MIT License