UNPKG

yijing-bazi-mcp

Version:

易经八字分析 MCP 服务器 - 提供传统命理分析和易经卦象解读的AI工具

584 lines (505 loc) 19.3 kB
/** * 易经分析引擎 * 负责卦象生成、解读和决策建议 */ const HexagramDatabase = require('../data/hexagram-database.js'); const YijingCalculator = require('../utils/yijing-calculator.js'); const Logger = require('../utils/logger.js'); class YijingEngine { constructor() { this.hexagramDB = new HexagramDatabase(); this.calculator = new YijingCalculator(); this.logger = new Logger(); } /** * 生成卦象 * @param {Object} params - 参数对象 * @param {string} params.method - 起卦方式 * @param {string} params.question - 用户问题 * @param {string} [params.seed] - 起卦种子 * @returns {Object} 卦象结果 */ async generateHexagram({ method, question, seed }) { try { this.logger.info('开始生成卦象', { method, question }); // 根据不同方法生成爻 let calculatorResult; switch (method) { case 'number': calculatorResult = this.calculator.generateFromNumber(seed || question); break; case 'time': calculatorResult = this.calculator.generateFromTime(new Date()); break; case 'plum_blossom': calculatorResult = this.calculator.generateFromPlumBlossom(seed || question); break; case 'random': calculatorResult = this.calculator.generateRandom(question, seed); break; default: throw new Error(`不支持的起卦方式: ${method}`); } // 提取爻线数组 const lines = calculatorResult.lines || calculatorResult; // 确定本卦 const originalHexagram = this.determineHexagram(lines.map(l => l.type)); // 确定变卦 const changingLines = lines.filter(l => l.changing || l.is_changing).map(l => l.position); const changedHexagram = changingLines.length > 0 ? this.calculateChangedHexagram(originalHexagram, changingLines) : null; // 获取卦象详细信息 const originalInfo = await this.hexagramDB.getHexagram(originalHexagram.id); const changedInfo = changedHexagram ? await this.hexagramDB.getHexagram(changedHexagram.id) : null; const result = { timestamp: new Date().toISOString(), method: method, question: question, original: { ...originalHexagram, ...originalInfo, lines: lines }, changing_lines: changingLines, changed: changedInfo ? { ...changedHexagram, ...changedInfo } : null, interpretation_hint: this.generateInterpretationHint(originalInfo, changedInfo, question) }; this.logger.info('卦象生成成功', { hexagramId: originalHexagram.id }); return result; } catch (error) { this.logger.error('卦象生成失败', { error: error.message, stack: error.stack, method: method, question: question, seed: seed }); console.error('详细错误信息:', error); throw error; } } /** * 解读卦象 * @param {Object} params - 参数对象 * @param {Object} params.hexagram - 卦象数据 * @param {string} params.focus - 解读焦点 * @param {number} [params.line_number] - 爻位 * @param {string} params.context - 应用场景 * @param {string} [params.detail_level] - 详细程度 * @returns {Object} 解读结果 */ async interpretHexagram({ hexagram, focus, line_number, context, detail_level = 'standard' }) { try { this.logger.info('开始解读卦象', { focus, context, detail_level }); const originalInfo = await this.hexagramDB.getHexagram(hexagram.original?.id || hexagram.id || 1); const changedInfo = hexagram.changed ? await this.hexagramDB.getHexagram(hexagram.changed?.id || 1) : null; let interpretation = {}; switch (focus) { case 'overall': interpretation = this.interpretOverall(originalInfo, changedInfo, context, detail_level); break; case 'specific_line': if (!line_number || line_number < 1 || line_number > 6) { throw new Error('解读特定爻位时必须提供有效的爻位号(1-6)'); } interpretation = this.interpretSpecificLine(originalInfo, line_number, context, detail_level); break; case 'changing': if (!changedInfo) { throw new Error('没有变卦信息,无法进行变卦解读'); } interpretation = this.interpretChanging(originalInfo, changedInfo, hexagram.changing_lines, context, detail_level); break; default: throw new Error(`不支持的解读焦点: ${focus}`); } const result = { timestamp: new Date().toISOString(), focus: focus, context: context, detail_level: detail_level, interpretation: interpretation, practical_guidance: this.generatePracticalGuidance(interpretation, context), cultural_context: this.getCulturalContext(originalInfo, context) }; this.logger.info('卦象解读成功'); return result; } catch (error) { this.logger.error('卦象解读失败', { error: error.message }); throw error; } } /** * 提供决策建议 * @param {Object} params - 参数对象 * @param {Object} params.hexagram - 卦象数据 * @param {string} params.question - 用户问题 * @param {Array} [params.options] - 可选方案 * @param {string} [params.time_frame] - 时间框架 * @returns {Object} 决策建议 */ async provideAdvice({ hexagram, question, options = [], time_frame = 'short_term' }) { try { this.logger.info('开始提供决策建议', { question, time_frame }); const originalInfo = await this.hexagramDB.getHexagram(hexagram.original?.id || hexagram.id || 1); const changedInfo = hexagram.changed ? await this.hexagramDB.getHexagram(hexagram.changed?.id || 1) : null; // 确保changing_lines是数组 const changingLines = hexagram.changing_lines || []; // 分析卦象的行动指导 const actionGuidance = this.analyzeActionGuidance(originalInfo, changedInfo, changingLines); // 判断吉凶和时机 const timingAnalysis = this.analyzeTimingAndLuck(originalInfo, changedInfo, time_frame); // 针对选项进行分析 const optionAnalysis = (options && options.length > 0) ? this.analyzeOptions(options, originalInfo, changedInfo) : null; // 生成个性化建议 const personalizedAdvice = this.generatePersonalizedAdvice( question, actionGuidance, timingAnalysis, optionAnalysis ); const result = { timestamp: new Date().toISOString(), question: question, time_frame: time_frame, overall_guidance: actionGuidance, timing_analysis: timingAnalysis, option_analysis: optionAnalysis, recommendations: personalizedAdvice, cautions: this.generateCautions(originalInfo, changedInfo), follow_up_suggestions: this.generateFollowUpSuggestions(originalInfo, question) }; this.logger.info('决策建议生成成功'); return result; } catch (error) { this.logger.error('决策建议生成失败', { error: error.message }); throw error; } } /** * 确定卦象 * @param {Array} lineTypes - 爻类型数组 * @returns {Object} 卦象信息 */ determineHexagram(lineTypes) { // 将爻类型转换为二进制(阳爻=1,阴爻=0) const binary = lineTypes.map(type => type === 'yang' ? 1 : 0).join(''); // 根据二进制确定卦序,限制在1-8范围内(当前数据库只有8个卦象) const binaryValue = parseInt(binary, 2); const hexagramId = (binaryValue % 8) + 1; // 确保ID在1-8范围内 return { id: hexagramId, binary: binary, lines: lineTypes }; } /** * 计算变卦 * @param {Object} originalHexagram - 本卦 * @param {Array} changingLines - 变爻位置 * @returns {Object} 变卦信息 */ calculateChangedHexagram(originalHexagram, changingLines) { const newLines = [...originalHexagram.lines]; // 变换指定位置的爻 changingLines.forEach(position => { const index = position - 1; // 转换为数组索引 newLines[index] = newLines[index] === 'yang' ? 'yin' : 'yang'; }); return this.determineHexagram(newLines); } /** * 整体卦象解读 */ interpretOverall(originalInfo, changedInfo, context, detailLevel) { const interpretation = { hexagram_meaning: originalInfo.meaning, judgment: originalInfo.judgment, image: originalInfo.image, context_application: this.applyToContext(originalInfo, context), energy_analysis: this.analyzeEnergy(originalInfo), development_trend: changedInfo ? this.analyzeTrend(originalInfo, changedInfo) : null }; if (detailLevel === 'detailed') { interpretation.detailed_analysis = { upper_trigram: originalInfo.upper_trigram, lower_trigram: originalInfo.lower_trigram, trigram_interaction: this.analyzeTrigramInteraction(originalInfo), five_elements: this.analyzeFiveElements(originalInfo), historical_references: originalInfo.historical_cases || [] }; } return interpretation; } /** * 特定爻位解读 */ interpretSpecificLine(hexagramInfo, lineNumber, context, detailLevel) { const line = hexagramInfo.lines[lineNumber - 1]; return { line_position: lineNumber, line_type: line.type, line_text: line.text, line_meaning: line.meaning, position_significance: this.getPositionSignificance(lineNumber), context_application: this.applyLineToContext(line, context), action_guidance: line.action_guidance || '根据爻辞指导行动', timing_indication: line.timing || '适宜时机的判断' }; } /** * 变卦解读 */ interpretChanging(originalInfo, changedInfo, changingLines, context, detailLevel) { return { transformation_meaning: `从${originalInfo.name}变为${changedInfo.name}`, change_significance: this.analyzeChangeSignificance(originalInfo, changedInfo), changing_lines_analysis: changingLines.map(line => ({ position: line, significance: this.getLineChangeSignificance(originalInfo, line) })), development_direction: this.analyzeDevelopmentDirection(originalInfo, changedInfo), timing_of_change: this.analyzeChangeTimimg(changingLines), context_implications: this.analyzeChangeInContext(originalInfo, changedInfo, context) }; } /** * 生成解读提示 */ generateInterpretationHint(originalInfo, changedInfo, question) { const hints = [ `本卦${originalInfo?.name || ''}代表当前状况`, question.includes('事业') || question.includes('工作') ? '建议从事业角度解读' : null, question.includes('感情') || question.includes('关系') ? '建议从人际关系角度解读' : null, changedInfo ? `变卦${changedInfo.name}显示未来发展趋势` : '无变爻,当前状态相对稳定' ].filter(Boolean); return hints.join(';'); } /** * 生成实用指导 */ generatePracticalGuidance(interpretation, context) { const guidance = { immediate_actions: [], things_to_avoid: [], optimal_timing: '', long_term_strategy: '' }; // 根据上下文和解读结果生成具体指导 switch (context) { case 'career': guidance.immediate_actions = ['专注当前工作', '寻求合作机会', '提升专业技能']; guidance.things_to_avoid = ['冒险投资', '频繁跳槽', '与同事冲突']; break; case 'relationship': guidance.immediate_actions = ['真诚沟通', '理解包容', '共同成长']; guidance.things_to_avoid = ['争吵冲突', '猜疑不信', '过度依赖']; break; case 'health': guidance.immediate_actions = ['规律作息', '适度运动', '心态平和']; guidance.things_to_avoid = ['过度劳累', '情绪波动', '忽视身体信号']; break; case 'finance': guidance.immediate_actions = ['谨慎理财', '稳健投资', '开源节流']; guidance.things_to_avoid = ['投机取巧', '盲目跟风', '过度消费']; break; default: guidance.immediate_actions = ['顺应自然', '把握时机', '积极行动']; guidance.things_to_avoid = ['急躁冒进', '消极等待', '违背原则']; } return guidance; } /** * 获取文化背景 */ getCulturalContext(hexagramInfo, context) { return { philosophical_background: '易经作为中华文化瑰宝,体现了阴阳变化的哲学思想', historical_significance: hexagramInfo.historical_background || '此卦在历史上的重要意义', modern_application: '将古老智慧应用于现代生活决策', cultural_values: ['和谐平衡', '顺应自然', '自强不息', '厚德载物'] }; } /** * 分析行动指导 */ analyzeActionGuidance(originalInfo, changedInfo, changingLines = []) { return { primary_guidance: originalInfo.action_guidance || '根据卦象指导行动', secondary_guidance: changedInfo?.action_guidance || null, change_guidance: (changingLines && changingLines.length > 0) ? '注意变化时机,适时调整策略' : '保持当前方向', energy_direction: this.determineEnergyDirection(originalInfo, changedInfo) }; } /** * 分析时机和吉凶 */ analyzeTimingAndLuck(originalInfo, changedInfo, timeFrame) { return { current_luck: originalInfo.luck_indication || 'neutral', future_trend: changedInfo ? this.compareLuck(originalInfo, changedInfo) : 'stable', optimal_timing: this.determineOptimalTiming(originalInfo, timeFrame), caution_periods: this.identifyCautionPeriods(originalInfo, changedInfo), opportunity_windows: this.identifyOpportunities(originalInfo, changedInfo) }; } /** * 分析选项 */ analyzeOptions(options, originalInfo, changedInfo) { return options.map((option, index) => ({ option: option, compatibility: this.assessOptionCompatibility(option, originalInfo), recommendation_level: this.getRecommendationLevel(option, originalInfo, changedInfo), potential_outcomes: this.predictOutcomes(option, originalInfo, changedInfo), timing_advice: this.getTimingAdviceForOption(option, originalInfo) })); } /** * 生成个性化建议 */ generatePersonalizedAdvice(question, actionGuidance, timingAnalysis, optionAnalysis) { const advice = { primary_recommendation: actionGuidance.primary_guidance, timing_recommendation: timingAnalysis.optimal_timing, strategic_approach: this.generateStrategicApproach(question, actionGuidance), risk_management: this.generateRiskManagement(timingAnalysis), success_factors: this.identifySuccessFactors(actionGuidance, timingAnalysis) }; if (optionAnalysis) { advice.option_ranking = optionAnalysis .sort((a, b) => b.recommendation_level - a.recommendation_level) .map(opt => opt.option); } return advice; } /** * 生成注意事项 */ generateCautions(originalInfo, changedInfo) { const cautions = [ '易经解读仅供参考,最终决策需结合实际情况', '保持理性思考,避免过度依赖占卜结果' ]; if (originalInfo.cautions) { cautions.push(...originalInfo.cautions); } if (changedInfo && changedInfo.cautions) { cautions.push(`变卦提醒:${changedInfo.cautions}`); } return cautions; } /** * 生成后续建议 */ generateFollowUpSuggestions(originalInfo, question) { return [ '可以在重要决策前再次求卦确认', '建议学习相关卦象的深层含义', '关注事态发展,适时调整策略', '保持内心平静,以智慧应对变化' ]; } // 辅助方法(简化实现) applyToContext(hexagramInfo, context) { return `在${context}方面,${hexagramInfo.name}卦提示...`; } analyzeEnergy(hexagramInfo) { return { overall_energy: hexagramInfo.energy || 'balanced', yin_yang_balance: 'harmonious', movement_tendency: 'progressive' }; } analyzeTrend(originalInfo, changedInfo) { return `从${originalInfo.name}到${changedInfo.name}的发展趋势`; } analyzeTrigramInteraction(hexagramInfo) { return '上下卦的相互作用分析'; } analyzeFiveElements(hexagramInfo) { return { primary_element: hexagramInfo.primary_element || 'earth', element_balance: 'harmonious', seasonal_correspondence: 'spring' }; } getPositionSignificance(lineNumber) { const positions = { 1: '初爻:事物开始阶段', 2: '二爻:发展阶段', 3: '三爻:转折阶段', 4: '四爻:上升阶段', 5: '五爻:成功阶段', 6: '六爻:完成阶段' }; return positions[lineNumber] || '未知位置'; } applyLineToContext(line, context) { return `在${context}方面,此爻提示...`; } analyzeChangeSignificance(originalInfo, changedInfo) { return `变化的重要意义:从${originalInfo.nature}转向${changedInfo.nature}`; } getLineChangeSignificance(hexagramInfo, linePosition) { return `第${linePosition}爻变化的意义`; } analyzeDevelopmentDirection(originalInfo, changedInfo) { return `发展方向:向${changedInfo.nature}发展`; } analyzeChangeTimimg(changingLines) { return `变化时机:${changingLines.length}个变爻显示变化程度`; } analyzeChangeInContext(originalInfo, changedInfo, context) { return `在${context}方面的变化含义`; } determineEnergyDirection(originalInfo, changedInfo) { return changedInfo ? 'transforming' : 'stable'; } compareLuck(originalInfo, changedInfo) { return 'improving'; // 简化实现 } determineOptimalTiming(hexagramInfo, timeFrame) { return `在${timeFrame}时间框架内的最佳时机`; } identifyCautionPeriods(originalInfo, changedInfo) { return ['需要谨慎的时期']; } identifyOpportunities(originalInfo, changedInfo) { return ['机会窗口期']; } assessOptionCompatibility(option, hexagramInfo) { return 'high'; // 简化实现 } getRecommendationLevel(option, originalInfo, changedInfo) { return Math.random() * 10; // 简化实现 } predictOutcomes(option, originalInfo, changedInfo) { return ['可能的结果1', '可能的结果2']; } getTimingAdviceForOption(option, hexagramInfo) { return '时机建议'; } generateStrategicApproach(question, actionGuidance) { return '战略方法建议'; } generateRiskManagement(timingAnalysis) { return '风险管理建议'; } identifySuccessFactors(actionGuidance, timingAnalysis) { return ['成功因素1', '成功因素2']; } } module.exports = YijingEngine;