PALACE_NAME_FIX.md•5.64 kB
# 宫位名称验证问题修复总结
## 问题描述
用户在 Smithery playground 上运行 MCP 时遇到两个问题:
### 问题 1:单独查询宫位时报错
当用户尝试使用 `analyze_ziwei_palace` 工具查询父母宫时,遇到以下错误:
```
MCP error -32602: 无效的宫位名称: 父母(父母). 有效宫位: 命宫, 兄弟, 夫妻, 子女, 财帛, 疾厄, 迁移, 仆役, 官禄, 田宅, 福德, 父母
```
或
```
MCP error -32603: 未找到宫位: 父母
```
### 问题 2:排盘中父母宫显示有天府星
用户反馈 1989-10-17 午时的排盘中,父母宫显示有天府星,但理论上应该无主星。
## 问题分析
### 问题 1:根本原因
这是一个**宫位名称不一致**的 bug:
1. **PALACES 常量定义**(ziwei_system.py:32-45):
```python
PALACES = ["命宫", "兄弟", "夫妻", "子女", ...]
```
除了"命宫",其他宫位名称都不带"宫"字。
2. **iztro-py 库返回的名称**:
```python
['命宫', '父母宫', '福德宫', '田宅宫', ...]
```
除了"命宫",其他宫位名称都带"宫"字。
3. **analyze_palace 方法的逻辑**:
- 首先验证输入的 `palace_name` 必须在 `PALACES` 列表中
- 然后获取完整星盘,在 `chart["palaces"]` 中查找 `palace["name"]` 匹配
- 由于名称不一致(一个不带"宫",一个带"宫"),导致永远找不到匹配
### 问题 2:iztro-py 库的计算结果
测试验证了 iztro-py 库对于 1989-10-17 午时的排盘结果:
```
父母宫 (parentsPalace) - 天干丁 地支丑
主星: 天府
```
这是 iztro-py 库(版本 0.3.0)的计算结果。
## 修复方案
### 问题 1:修复宫位名称不一致
**方案**:修改 `PALACES` 常量,使其与 iztro-py 返回的名称保持一致。
**修改的文件**:
1. **systems/ziwei/ziwei_system.py:32-45**
```python
# 修改前
PALACES = [
"命宫", "兄弟", "夫妻", "子女", "财帛",
"疾厄", "迁移", "仆役", "官禄", "田宅", "福德", "父母",
]
# 修改后
PALACES = [
"命宫", "兄弟宫", "夫妻宫", "子女宫", "财帛宫",
"疾厄宫", "迁移宫", "交友宫", "官禄宫", "田宅宫", "福德宫", "父母宫",
]
```
注:同时将"仆役"改为"交友宫",以匹配 iztro-py 的 `friendsPalace`。
2. **mingli_mcp.py:299-316**
更新 MCP 工具定义中的 `palace_name` 枚举:
```python
"enum": [
"命宫", "兄弟宫", "夫妻宫", "子女宫", "财帛宫",
"疾厄宫", "迁移宫", "交友宫", "官禄宫", "田宅宫", "福德宫", "父母宫",
]
```
**测试验证**:
```bash
python test_formatter_output.py
```
结果:
- ✓ "命宫" 查询成功
- ✓ "父母宫" 查询成功
- ✓ "财帛宫" 查询成功
- ✗ "父母" 查询失败(符合预期,因为名称已改为"父母宫")
单元测试全部通过:
```bash
pytest tests/test_ziwei.py -v
# 4 passed, 4 warnings in 2.87s
```
### 问题 2:排盘准确性
这是 iztro-py 库的计算结果。建议:
1. 使用其他紫微斗数软件(如元亨利贞网、灵机妙算等)进行交叉验证
2. 如果确认是 iztro-py 的计算错误,向上游项目提交 issue:
- https://github.com/SylarLong/iztro-py
mingli-mcp 作为一个 MCP 服务器,我们依赖 iztro-py 库进行紫微斗数计算。如果上游库有问题,我们需要等待上游修复或寻找替代库。
## 影响评估
### 破坏性变更
这是一个**破坏性变更**,会影响现有用户:
**之前**:
- 用户需要使用 `"父母"` 查询父母宫
- 用户需要使用 `"财帛"` 查询财帛宫
**现在**:
- 用户需要使用 `"父母宫"` 查询父母宫
- 用户需要使用 `"财帛宫"` 查询财帛宫
**例外**:
- `"命宫"` 保持不变
### 优点
1. 与 iztro-py 库的输出保持一致
2. 更符合中文习惯(通常说"父母宫"而不是"父母")
3. 解决了 Smithery playground 上的报错问题
4. 避免用户困惑(输出是"父母宫",但输入要用"父母")
## 版本更新
建议发布 **v1.0.13**,changelog:
```markdown
## v1.0.13 - 2025-01-XX
### Breaking Changes
- **宫位名称更新**:为了与 iztro-py 库保持一致,所有宫位名称(除"命宫"外)现在都带"宫"字
- `analyze_ziwei_palace` 工具的 `palace_name` 参数枚举值已更新
- 旧值:`["命宫", "兄弟", "夫妻", "子女", "财帛", "疾厄", "迁移", "仆役", "官禄", "田宅", "福德", "父母"]`
- 新值:`["命宫", "兄弟宫", "夫妻宫", "子女宫", "财帛宫", "疾厄宫", "迁移宫", "交友宫", "官禄宫", "田宅宫", "福德宫", "父母宫"]`
### Bug Fixes
- 修复 `analyze_ziwei_palace` 工具无法查询非命宫的宫位的问题
- 将"仆役宫"统一为"交友宫",与 iztro-py 保持一致
### Migration Guide
如果您使用 `analyze_ziwei_palace` 工具:
**之前**:
```python
# 查询父母宫
result = ziwei.analyze_palace(birth_info, "父母")
```
**现在**:
```python
# 查询父母宫
result = ziwei.analyze_palace(birth_info, "父母宫")
```
"命宫"保持不变,无需修改。
```
## 测试清单
- [x] 运行单元测试 `pytest tests/test_ziwei.py -v`
- [x] 测试 "命宫" 查询
- [x] 测试 "父母宫" 查询
- [x] 测试 "财帛宫" 查询
- [x] 验证 "父母" 查询失败(符合预期)
- [x] 验证所有宫位名称与 iztro-py 输出一致
## 后续工作
1. 发布 v1.0.13
2. 更新文档(README.md, API_REFERENCE.md)
3. 通知用户破坏性变更
4. 调查 iztro-py 的排盘准确性问题(可选)