ziwei-mcp
Version:
紫微斗数 MCP (Ziwei Doushu Model Context Protocol) - 基于 MCP 协议的紫微斗数命理分析工具
585 lines (512 loc) • 17.2 kB
JavaScript
/**
* 增强版紫微斗数命盘生成工具
* 集成专业算法和数据源
*/
const { z } = require("zod");
const {
EnhancedChartGenerator,
} = require("../core/enhanced-chart-generator.js");
const {
ProfessionalDataService,
} = require("../services/professional-data-service.js");
const { getStarInfo, getPatternInfo } = require("../data/stars-database.js");
/**
* 输入参数验证模式
*/
const GenerateEnhancedChartSchema = z.object({
name: z.string().min(1, "姓名不能为空").max(50, "姓名长度不能超过50个字符"),
gender: z.enum(["male", "female"], {
errorMap: () => ({ message: "性别必须是 male 或 female" }),
}),
birthDate: z
.string()
.regex(/^\d{4}-\d{2}-\d{2}$/, "出生日期格式必须是 YYYY-MM-DD"),
birthTime: z.string().regex(/^\d{2}:\d{2}$/, "出生时间格式必须是 HH:MM"),
birthLocation: z.string().optional(),
useProApi: z.boolean().default(false).describe("是否使用专业API"),
detailLevel: z
.enum(["basic", "standard", "professional"])
.default("standard")
.describe("详细程度"),
includePatterns: z.boolean().default(true).describe("是否包含格局分析"),
includePredictions: z.boolean().default(false).describe("是否包含运势预测"),
});
class EnhancedChartGeneratorTool {
constructor() {
this.name = "generate_enhanced_chart";
this.description = "生成增强版紫微斗数命盘,支持专业算法和数据源";
this.inputSchema = GenerateEnhancedChartSchema;
this.generator = new EnhancedChartGenerator();
this.dataService = new ProfessionalDataService();
// 性能统计
this.stats = {
totalGenerated: 0,
apiCalls: 0,
localCalculations: 0,
averageTime: 0,
errors: 0,
};
}
/**
* 生成增强版命盘
*/
async execute(input) {
const startTime = Date.now();
try {
// 验证输入参数
const validatedInput = this.inputSchema.parse(input);
console.log(
`开始生成增强版命盘: ${validatedInput.name} (${validatedInput.gender})`,
);
// 检查数据源状态
const healthCheck = await this.dataService.healthCheck();
console.log("数据源状态:", healthCheck);
// 解析出生信息
const solarDate = this.parseBirthInfo(validatedInput);
// 获取精确农历信息
let lunarInfo;
if (validatedInput.useProApi && healthCheck.zhwnl_api) {
console.log("使用专业API获取农历信息");
lunarInfo = await this.dataService.getPreciseLunarInfo(solarDate);
this.stats.apiCalls++;
} else {
console.log("使用本地算法计算农历信息");
lunarInfo = this.dataService.calculateLunarLocal(solarDate);
this.stats.localCalculations++;
}
// 生成基础命盘结构
const baseChart = await this.generateBaseChart(validatedInput, lunarInfo);
// 获取专业星曜定位
let starPositions;
if (validatedInput.useProApi && healthCheck.ziwei_pro_api) {
console.log("使用专业API获取星曜定位");
starPositions = await this.dataService.getProfessionalStarPositions(
lunarInfo,
validatedInput.gender,
);
this.stats.apiCalls++;
} else {
console.log("使用增强本地算法计算星曜定位");
starPositions = await this.dataService.calculateStarPositionsLocal(
lunarInfo,
validatedInput.gender,
);
this.stats.localCalculations++;
}
// 合并星曜信息到命盘
const enhancedChart = this.mergeStarPositions(baseChart, starPositions);
// 专业格局分析
let patternAnalysis = null;
if (validatedInput.includePatterns) {
if (validatedInput.useProApi && healthCheck.ziwei_pro_api) {
console.log("使用专业API进行格局分析");
patternAnalysis =
await this.dataService.getProfessionalPatternAnalysis(
enhancedChart,
);
this.stats.apiCalls++;
} else {
console.log("使用本地专业数据进行格局分析");
patternAnalysis =
await this.dataService.analyzePatternLocal(enhancedChart);
this.stats.localCalculations++;
}
enhancedChart.patterns = patternAnalysis.patterns || [];
enhancedChart.patternAnalysis = patternAnalysis;
}
// 专业解释文本
let interpretations = null;
if (validatedInput.detailLevel === "professional") {
if (validatedInput.useProApi && healthCheck.ziwei_pro_api) {
console.log("使用专业API生成解释文本");
interpretations =
await this.dataService.getProfessionalInterpretations(
enhancedChart,
"comprehensive",
);
this.stats.apiCalls++;
} else {
console.log("使用本地专业数据生成解释文本");
interpretations = await this.dataService.generateInterpretationsLocal(
enhancedChart,
"comprehensive",
);
this.stats.localCalculations++;
}
enhancedChart.interpretations = interpretations;
}
// 运势预测(可选)
if (validatedInput.includePredictions) {
enhancedChart.predictions = await this.generatePredictions(
enhancedChart,
lunarInfo,
);
}
// 生成增强摘要
const enhancedSummary = this.generateEnhancedSummary(
enhancedChart,
validatedInput.detailLevel,
);
// 更新统计信息
const executionTime = Date.now() - startTime;
this.updateStats(executionTime);
// 构建返回结果
const result = {
success: true,
data: {
chartId: enhancedChart.id,
chart: enhancedChart,
summary: enhancedSummary,
metadata: {
...enhancedChart.metadata,
executionTime: executionTime,
dataSource: this.getDataSourceInfo(
healthCheck,
validatedInput.useProApi,
),
detailLevel: validatedInput.detailLevel,
accuracy: starPositions?.accuracy || "enhanced_local",
},
},
};
console.log(`命盘生成完成,耗时: ${executionTime}ms`);
return result;
} catch (error) {
this.stats.errors++;
console.error("生成增强版命盘失败:", error);
return {
success: false,
error: error.message,
errorType: error.name,
timestamp: new Date().toISOString(),
};
}
}
/**
* 生成基础命盘结构
*/
async generateBaseChart(input, lunarInfo) {
// 使用增强版生成器创建基础结构
const result = await this.generator.generateChart({
name: input.name,
gender: input.gender,
birthDate: input.birthDate,
birthTime: input.birthTime,
birthLocation: input.birthLocation,
});
if (!result.success) {
throw new Error(`基础命盘生成失败: ${result.error}`);
}
return result.data.chart;
}
/**
* 合并星曜定位信息
*/
mergeStarPositions(baseChart, starPositions) {
if (starPositions.palaces) {
// 使用专业星曜定位覆盖基础定位
baseChart.palaces = starPositions.palaces;
}
if (starPositions.brightness) {
// 添加专业亮度信息
baseChart.palaces.forEach((palace) => {
palace.stars.forEach((star) => {
if (starPositions.brightness[star.name]) {
star.professionalBrightness = starPositions.brightness[star.name];
}
});
});
}
if (starPositions.sihua) {
// 使用专业四化信息
baseChart.sihua = { ...baseChart.sihua, ...starPositions.sihua };
}
return baseChart;
}
/**
* 生成运势预测
*/
async generatePredictions(chart, lunarInfo) {
const currentYear = new Date().getFullYear();
const predictions = {
currentYear: currentYear,
yearlyFortune: this.calculateYearlyFortune(chart, currentYear),
monthlyTrends: this.calculateMonthlyTrends(chart, currentYear),
keyEvents: this.predictKeyEvents(chart, currentYear),
recommendations: this.generateRecommendations(chart),
};
return predictions;
}
/**
* 生成增强摘要
*/
generateEnhancedSummary(chart, detailLevel) {
const destinyPalace = chart.palaces.find(
(p) => p.id === chart.info.destinyPalace,
);
const mainStars = destinyPalace.stars.filter((s) => s.type === "main");
const patterns = chart.patterns || [];
const summary = {
basicInfo: {
name: chart.info.name,
gender: chart.info.gender,
age: chart.info.age,
destinyPalace: destinyPalace.name,
mainStars: mainStars.map((s) => ({
name: s.name,
brightness: s.brightness || s.professionalBrightness,
element: s.element,
sihua: s.sihua,
})),
},
patterns: patterns.map((p) => ({
name: p.name,
type: p.type,
strength: p.strength,
influence: p.influence,
description: detailLevel === "professional" ? p.description : p.name,
})),
overallAssessment: this.generateOverallAssessment(chart, patterns),
keyInsights: this.generateKeyInsights(chart, detailLevel),
};
if (detailLevel === "professional" && chart.interpretations) {
summary.professionalAnalysis = {
personality: chart.interpretations.personality,
career: chart.interpretations.career,
wealth: chart.interpretations.wealth,
relationships: chart.interpretations.relationships,
health: chart.interpretations.health,
};
}
if (chart.predictions) {
summary.predictions = {
yearlyFortune: chart.predictions.yearlyFortune,
keyEvents: chart.predictions.keyEvents.slice(0, 3), // 只显示前3个关键事件
recommendations: chart.predictions.recommendations.slice(0, 5), // 只显示前5个建议
};
}
return summary;
}
/**
* 生成整体评估
*/
generateOverallAssessment(chart, patterns) {
const excellentPatterns = patterns.filter(
(p) => p.strength === "excellent",
).length;
const goodPatterns = patterns.filter((p) => p.strength === "good").length;
const poorPatterns = patterns.filter((p) => p.strength === "poor").length;
let level = "普通";
let score = 60;
let description = "命盘格局一般,需要后天努力";
if (excellentPatterns >= 2) {
level = "优秀";
score = 85 + excellentPatterns * 5;
description = "命盘格局优秀,天赋异禀,前程似锦";
} else if (excellentPatterns >= 1) {
level = "良好";
score = 75 + excellentPatterns * 5 + goodPatterns * 3;
description = "命盘格局良好,具有发展潜力";
} else if (goodPatterns >= 2) {
level = "中上";
score = 70 + goodPatterns * 3;
description = "命盘格局中上,有一定优势";
} else if (poorPatterns >= 2) {
level = "较差";
score = 45 - poorPatterns * 3;
description = "命盘格局较差,需要特别注意化解";
}
return {
level: level,
score: Math.max(0, Math.min(100, score)),
description: description,
strengths: this.identifyStrengths(chart),
challenges: this.identifyChallenges(chart),
};
}
/**
* 生成关键洞察
*/
generateKeyInsights(chart, detailLevel) {
const insights = [];
const destinyPalace = chart.palaces.find(
(p) => p.id === chart.info.destinyPalace,
);
const mainStar = destinyPalace.stars.find((s) => s.type === "main");
if (mainStar) {
const starInfo = getStarInfo(mainStar.name);
if (starInfo) {
insights.push({
type: "personality",
title: "性格特质",
content: `主星${mainStar.name},${starInfo.characteristics.personality.slice(0, 2).join("、")}`,
});
insights.push({
type: "career",
title: "事业方向",
content: `适合${starInfo.characteristics.career.slice(0, 3).join("、")}等领域`,
});
}
}
// 添加格局洞察
const excellentPatterns =
chart.patterns?.filter((p) => p.strength === "excellent") || [];
if (excellentPatterns.length > 0) {
insights.push({
type: "pattern",
title: "格局优势",
content: `具有${excellentPatterns[0].name},${excellentPatterns[0].description}`,
});
}
// 添加四化洞察
if (chart.sihua && chart.sihua["化禄"]) {
insights.push({
type: "sihua",
title: "财运机遇",
content: `${chart.sihua["化禄"].star}化禄在${chart.sihua["化禄"].palace},财运亨通`,
});
}
return insights.slice(0, detailLevel === "professional" ? 8 : 5);
}
/**
* 识别优势
*/
identifyStrengths(chart) {
const strengths = [];
const destinyPalace = chart.palaces.find(
(p) => p.id === chart.info.destinyPalace,
);
// 检查主星优势
destinyPalace.stars.forEach((star) => {
if (star.brightness === "庙" || star.brightness === "旺") {
strengths.push(`${star.name}星入庙旺,发挥良好`);
}
});
// 检查格局优势
const excellentPatterns =
chart.patterns?.filter((p) => p.strength === "excellent") || [];
excellentPatterns.forEach((pattern) => {
strengths.push(`具有${pattern.name}格局`);
});
return strengths.slice(0, 5);
}
/**
* 识别挑战
*/
identifyChallenges(chart) {
const challenges = [];
const destinyPalace = chart.palaces.find(
(p) => p.id === chart.info.destinyPalace,
);
// 检查煞星影响
const maleficStars = destinyPalace.stars.filter(
(s) => s.type === "malefic",
);
maleficStars.forEach((star) => {
challenges.push(
`${star.name}入命,需注意${star.name === "擎羊" ? "冲动" : star.name === "陀罗" ? "拖延" : "意外"}`,
);
});
// 检查化忌影响
if (chart.sihua && chart.sihua["化忌"]) {
challenges.push(`${chart.sihua["化忌"].star}化忌,需注意相关领域的挫折`);
}
return challenges.slice(0, 3);
}
/**
* 获取数据源信息
*/
getDataSourceInfo(healthCheck, useProApi) {
const sources = [];
if (useProApi) {
if (healthCheck.zhwnl_api) sources.push("中华万年历API");
if (healthCheck.ziwei_pro_api) sources.push("紫微斗数专业API");
}
if (healthCheck.local_database) sources.push("本地专业数据库");
sources.push("增强本地算法");
return {
primary: sources[0] || "增强本地算法",
fallback: sources.slice(1),
api_enabled: useProApi,
health_status: healthCheck,
};
}
/**
* 更新统计信息
*/
updateStats(executionTime) {
this.stats.totalGenerated++;
this.stats.averageTime =
(this.stats.averageTime * (this.stats.totalGenerated - 1) +
executionTime) /
this.stats.totalGenerated;
}
/**
* 获取工具统计信息
*/
getStats() {
return {
...this.stats,
dataSourceStats: this.dataService.getDataSourceStats(),
};
}
/**
* 解析出生信息
*/
parseBirthInfo(input) {
const [year, month, day] = input.birthDate.split("-").map(Number);
const [hour, minute] = input.birthTime.split(":").map(Number);
return {
year: year,
month: month,
day: day,
hour: hour,
minute: minute || 0,
};
}
// 简化的预测方法(实际应用中需要更复杂的算法)
calculateYearlyFortune(chart, year) {
return {
overall: "中上",
career: "稳步上升",
wealth: "财运亨通",
health: "注意保养",
relationships: "和谐稳定",
};
}
calculateMonthlyTrends(chart, year) {
const months = [];
for (let i = 1; i <= 12; i++) {
months.push({
month: i,
fortune: ["上上", "上中", "中上", "中平", "中下"][
Math.floor(Math.random() * 5)
],
focus: ["事业", "财运", "感情", "健康", "学业"][
Math.floor(Math.random() * 5)
],
});
}
return months;
}
predictKeyEvents(chart, year) {
return [
{ month: 3, event: "事业有新机遇", probability: "high" },
{ month: 6, event: "财运有所提升", probability: "medium" },
{ month: 9, event: "人际关系改善", probability: "high" },
{ month: 11, event: "健康需要关注", probability: "low" },
];
}
generateRecommendations(chart) {
return [
"保持积极心态,把握机遇",
"注重人际关系的维护",
"合理规划财务,稳健投资",
"定期体检,关注健康",
"持续学习,提升自我",
];
}
}
module.exports = {
EnhancedChartGeneratorTool,
};