FateForge / fateforge /constants.py
FateForge
Deploy to HF Spaces: Vue SPA + FastAPI, Docker SDK, LLM offline fallback
c9e11de
Raw
History Blame Contribute Delete
35.4 kB
"""FateForge v2 常量:六十四卦表、爻名、LLM 提示词。"""
from __future__ import annotations
from typing import Dict, List
# ---------------------------------------------------------------------------
# 爻名 (自下而上: 初爻 → 上爻)
# ---------------------------------------------------------------------------
LINE_NAMES: List[str] = ["初爻", "二爻", "三爻", "四爻", "五爻", "上爻"]
# ---------------------------------------------------------------------------
# 六十四卦表
# key: 自下而上的阴阳串, 1=阳 0=阴
# 值: {order, name, pinyin, en, upper(上卦), lower(下卦), judgment(卦辞), image(象传短句)}
# ---------------------------------------------------------------------------
HEXAGRAMS: Dict[str, dict] = {
"111111": {"order": 1, "name": "乾", "pinyin": "qián", "en": "The Creative", "upper": "乾", "lower": "乾", "judgment": "元亨利贞", "image": "天行健,君子以自强不息"},
"000000": {"order": 2, "name": "坤", "pinyin": "kūn", "en": "The Receptive", "upper": "坤", "lower": "坤", "judgment": "元亨,利牝马之贞", "image": "地势坤,君子以厚德载物"},
"100010": {"order": 3, "name": "屯", "pinyin": "zhūn", "en": "Difficulty at the Beginning", "upper": "坎", "lower": "震", "judgment": "元亨利贞,勿用有攸往", "image": "云雷屯,君子以经纶"},
"010001": {"order": 4, "name": "蒙", "pinyin": "méng", "en": "Youthful Folly", "upper": "艮", "lower": "坎", "judgment": "亨,匪我求童蒙", "image": "山下出泉,蒙,君子以果行育德"},
"111010": {"order": 5, "name": "需", "pinyin": "xū", "en": "Waiting", "upper": "坎", "lower": "乾", "judgment": "有孚,光亨,贞吉,利涉大川", "image": "云上于天,需,君子以饮食宴乐"},
"010111": {"order": 6, "name": "讼", "pinyin": "sòng", "en": "Conflict", "upper": "乾", "lower": "坎", "judgment": "有孚,窒惕", "image": "天与水违行,讼,君子以作事谋始"},
"000010": {"order": 7, "name": "师", "pinyin": "shī", "en": "The Army", "upper": "坤", "lower": "坎", "judgment": "贞,丈人吉,无咎", "image": "地中有水,师,君子以容民畜众"},
"010000": {"order": 8, "name": "比", "pinyin": "bǐ", "en": "Holding Together", "upper": "坎", "lower": "坤", "judgment": "吉,原筮,元永贞", "image": "地上有水,比,先王以建万国,亲诸侯"},
"111011": {"order": 9, "name": "小畜", "pinyin": "xiǎo xù", "en": "Small Taming", "upper": "巽", "lower": "乾", "judgment": "亨,密云不雨", "image": "风行天上,小畜,君子以懿文德"},
"110111": {"order": 10, "name": "履", "pinyin": "lǚ", "en": "Treading", "upper": "乾", "lower": "兑", "judgment": "履虎尾,不咥人,亨", "image": "上天下泽,履,君子以辩上下,定民志"},
"111000": {"order": 11, "name": "泰", "pinyin": "tài", "en": "Peace", "upper": "坤", "lower": "乾", "judgment": "小往大来,吉亨", "image": "天地交,泰,后以财成天地之道"},
"000111": {"order": 12, "name": "否", "pinyin": "pǐ", "en": "Standstill", "upper": "乾", "lower": "坤", "judgment": "否之匪人,不利君子贞", "image": "天地不交,否,君子以俭德辟难"},
"101111": {"order": 13, "name": "同人", "pinyin": "tóng rén", "en": "Fellowship", "upper": "乾", "lower": "离", "judgment": "同人于野,亨,利涉大川", "image": "天火同人,君子以类族辨物"},
"111101": {"order": 14, "name": "大有", "pinyin": "dà yǒu", "en": "Great Possession", "upper": "离", "lower": "乾", "judgment": "元亨", "image": "火在天上,大有,君子以遏恶扬善"},
"001000": {"order": 15, "name": "谦", "pinyin": "qiān", "en": "Modesty", "upper": "坤", "lower": "艮", "judgment": "亨,君子有终", "image": "地中有山,谦,君子以裒多益寡"},
"000100": {"order": 16, "name": "豫", "pinyin": "yù", "en": "Enthusiasm", "upper": "震", "lower": "坤", "judgment": "利建侯行师", "image": "雷出地奋,豫,先王以作乐崇德"},
"100110": {"order": 17, "name": "随", "pinyin": "suí", "en": "Following", "upper": "兑", "lower": "震", "judgment": "元亨利贞,无咎", "image": "泽中有雷,随,君子以向晦入宴息"},
"011001": {"order": 18, "name": "蛊", "pinyin": "gǔ", "en": "Work on the Decayed", "upper": "艮", "lower": "巽", "judgment": "元亨,利涉大川", "image": "山下有风,蛊,君子以振民育德"},
"110000": {"order": 19, "name": "临", "pinyin": "lín", "en": "Approach", "upper": "坤", "lower": "兑", "judgment": "元亨利贞,至于八月有凶", "image": "泽上有地,临,君子以教思无穷"},
"000011": {"order": 20, "name": "观", "pinyin": "guān", "en": "Contemplation", "upper": "巽", "lower": "坤", "judgment": "盥而不荐,有孚颙若", "image": "风行地上,观,先王以省方观民设教"},
"100101": {"order": 21, "name": "噬嗑", "pinyin": "shì kè", "en": "Biting Through", "upper": "离", "lower": "震", "judgment": "亨,利用狱", "image": "雷电,噬嗑,先王以明罚敕法"},
"101001": {"order": 22, "name": "贲", "pinyin": "bì", "en": "Grace", "upper": "艮", "lower": "离", "judgment": "亨,小利有所往", "image": "山下有火,贲,君子以明庶政"},
"000001": {"order": 23, "name": "剥", "pinyin": "bō", "en": "Splitting Apart","upper": "艮", "lower": "坤", "judgment": "不利有攸往", "image": "山附于地,剥,上以厚下安宅"},
"100000": {"order": 24, "name": "复", "pinyin": "fù", "en": "Return", "upper": "坤", "lower": "震", "judgment": "亨,出入无疾,朋来无咎", "image": "雷在地中,复,先王以至日闭关"},
"100111": {"order": 25, "name": "无妄", "pinyin": "wú wàng", "en": "Innocence", "upper": "乾", "lower": "震", "judgment": "元亨利贞", "image": "天下雷行,物与无妄,先王以茂对时"},
"111001": {"order": 26, "name": "大畜", "pinyin": "dà xù", "en": "Great Taming", "upper": "艮", "lower": "乾", "judgment": "利贞,不家食吉,利涉大川", "image": "天在山中,大畜,君子以多识前言往行"},
"100001": {"order": 27, "name": "颐", "pinyin": "yí", "en": "Nourishment", "upper": "艮", "lower": "震", "judgment": "贞吉,观颐,自求口实", "image": "山下有雷,颐,君子以慎言语,节饮食"},
"011110": {"order": 28, "name": "大过", "pinyin": "dà guò", "en": "Great Excess", "upper": "兑", "lower": "巽", "judgment": "栋桡,利有攸往,亨", "image": "泽灭木,大过,君子以独立不惧"},
"010010": {"order": 29, "name": "坎", "pinyin": "kǎn", "en": "The Abysmal", "upper": "坎", "lower": "坎", "judgment": "习坎,有孚,维心亨,行有尚", "image": "水洊至,习坎,君子以常德行"},
"101101": {"order": 30, "name": "离", "pinyin": "lí", "en": "The Clinging", "upper": "离", "lower": "离", "judgment": "利贞,亨,畜牝牛吉", "image": "明两作,离,大人以继明照于四方"},
"001110": {"order": 31, "name": "咸", "pinyin": "xián", "en": "Influence", "upper": "兑", "lower": "艮", "judgment": "亨,利贞,取女吉", "image": "山上有泽,咸,君子以虚受人"},
"011100": {"order": 32, "name": "恒", "pinyin": "héng", "en": "Duration", "upper": "震", "lower": "巽", "judgment": "亨,无咎,利贞,利有攸往", "image": "雷风,恒,君子以立不易方"},
"001111": {"order": 33, "name": "遁", "pinyin": "dùn", "en": "Retreat", "upper": "乾", "lower": "艮", "judgment": "亨,小利贞", "image": "天下有山,遁,君子以远小人"},
"111100": {"order": 34, "name": "大壮", "pinyin": "dà zhuàng", "en": "Great Power", "upper": "震", "lower": "乾", "judgment": "利贞", "image": "雷在天上,大壮,君子以非礼弗履"},
"000101": {"order": 35, "name": "晋", "pinyin": "jìn", "en": "Progress", "upper": "离", "lower": "坤", "judgment": "康侯用锡马蕃庶,昼日三接", "image": "明出地上,晋,君子以自昭明德"},
"101000": {"order": 36, "name": "明夷", "pinyin": "míng yí", "en": "Darkening of the Light", "upper": "坤", "lower": "离", "judgment": "利艰贞", "image": "明入地中,明夷,君子以莅众,用晦而明"},
"101011": {"order": 37, "name": "家人", "pinyin": "jiā rén", "en": "The Family", "upper": "巽", "lower": "离", "judgment": "利女贞", "image": "风自火出,家人,君子以言有物"},
"110101": {"order": 38, "name": "睽", "pinyin": "kuí", "en": "Opposition", "upper": "离", "lower": "兑", "judgment": "小事吉", "image": "上火下泽,睽,君子以同而异"},
"001010": {"order": 39, "name": "蹇", "pinyin": "jiǎn", "en": "Obstruction", "upper": "坎", "lower": "艮", "judgment": "利西南,不利东北", "image": "山上有水,蹇,君子以反身修德"},
"010100": {"order": 40, "name": "解", "pinyin": "xiè", "en": "Deliverance", "upper": "震", "lower": "坎", "judgment": "利西南,无所往,其来复吉", "image": "雷雨作,解,君子以赦过宥罪"},
"110001": {"order": 41, "name": "损", "pinyin": "sǔn", "en": "Decrease", "upper": "兑", "lower": "艮", "judgment": "有孚,元吉,无咎,可贞", "image": "山下有泽,损,君子以惩忿窒欲"},
"100011": {"order": 42, "name": "益", "pinyin": "yì", "en": "Increase", "upper": "巽", "lower": "震", "judgment": "利有攸往,利涉大川", "image": "风雷,益,君子以见善则迁,有过则改"},
"111110": {"order": 43, "name": "夬", "pinyin": "guài", "en": "Breakthrough", "upper": "兑", "lower": "乾", "judgment": "扬于王庭,孚号有厉", "image": "泽上于天,夬,君子以施禄及下"},
"011111": {"order": 44, "name": "姤", "pinyin": "gòu", "en": "Coming to Meet", "upper": "乾", "lower": "巽", "judgment": "女壮,勿用取女", "image": "天下有风,姤,后以施命诰四方"},
"000110": {"order": 45, "name": "萃", "pinyin": "cuì", "en": "Gathering", "upper": "兑", "lower": "坤", "judgment": "亨,王假有庙", "image": "泽上于地,萃,君子以除戎器"},
"011000": {"order": 46, "name": "升", "pinyin": "shēng", "en": "Pushing Upward", "upper": "坤", "lower": "巽", "judgment": "元亨,利见大人,勿恤", "image": "地中生木,升,君子以顺德"},
"010110": {"order": 47, "name": "困", "pinyin": "kùn", "en": "Oppression", "upper": "兑", "lower": "坎", "judgment": "亨,贞,大人吉,无咎", "image": "泽无水,困,君子以致命遂志"},
"011010": {"order": 48, "name": "井", "pinyin": "jǐng", "en": "The Well", "upper": "坎", "lower": "巽", "judgment": "改邑不改井,无丧无得", "image": "木上有水,井,君子以劳民劝相"},
"101110": {"order": 49, "name": "革", "pinyin": "gé", "en": "Revolution", "upper": "兑", "lower": "离", "judgment": "己日乃孚,元亨利贞", "image": "泽中有火,革,君子以治历明时"},
"011101": {"order": 50, "name": "鼎", "pinyin": "dǐng", "en": "The Cauldron", "upper": "离", "lower": "巽", "judgment": "元吉,亨", "image": "木上有火,鼎,君子以正位凝命"},
"100100": {"order": 51, "name": "震", "pinyin": "zhèn", "en": "The Arousing", "upper": "震", "lower": "震", "judgment": "亨,震来虩虩,笑言哑哑", "image": "洊雷震,君子以恐惧修省"},
"001001": {"order": 52, "name": "艮", "pinyin": "gèn", "en": "Keeping Still", "upper": "艮", "lower": "艮", "judgment": "艮其背,不获其身,行其庭,不见其人,无咎", "image": "兼山艮,君子以思不出其位"},
"001011": {"order": 53, "name": "渐", "pinyin": "jiàn", "en": "Development", "upper": "巽", "lower": "艮", "judgment": "女归吉,利贞", "image": "山上有木,渐,君子以居贤德"},
"110100": {"order": 54, "name": "归妹", "pinyin": "guī mèi", "en": "Marrying Maiden", "upper": "震", "lower": "兑", "judgment": "征凶,无攸利", "image": "泽上有雷,归妹,君子以永终知敝"},
"101100": {"order": 55, "name": "丰", "pinyin": "fēng", "en": "Abundance", "upper": "震", "lower": "离", "judgment": "亨,王假之,勿忧,宜日中", "image": "雷电皆至,丰,君子以折狱致刑"},
"001101": {"order": 56, "name": "旅", "pinyin": "lǚ", "en": "The Wanderer", "upper": "离", "lower": "艮", "judgment": "小亨,旅贞吉", "image": "山上有火,旅,君子以明慎用刑"},
"011011": {"order": 57, "name": "巽", "pinyin": "xùn", "en": "The Gentle", "upper": "巽", "lower": "巽", "judgment": "小亨,利有攸往,利见大人", "image": "随风巽,君子以申命行事"},
"110110": {"order": 58, "name": "兑", "pinyin": "duì", "en": "The Joyous", "upper": "兑", "lower": "兑", "judgment": "亨,利贞", "image": "丽泽兑,君子以朋友讲习"},
"010011": {"order": 59, "name": "涣", "pinyin": "huàn", "en": "Dispersion", "upper": "巽", "lower": "坎", "judgment": "亨,王假有庙,利涉大川", "image": "风行水上,涣,先王以享于帝立庙"},
"110010": {"order": 60, "name": "节", "pinyin": "jié", "en": "Limitation", "upper": "坎", "lower": "兑", "judgment": "亨,苦节不可贞", "image": "泽上有水,节,君子以制数度"},
"110011": {"order": 61, "name": "中孚", "pinyin": "zhōng fú", "en": "Inner Truth", "upper": "巽", "lower": "兑", "judgment": "豚鱼吉,利涉大川,利贞", "image": "泽上有风,中孚,君子以议狱缓死"},
"001100": {"order": 62, "name": "小过", "pinyin": "xiǎo guò", "en": "Small Excess", "upper": "震", "lower": "艮", "judgment": "亨,利贞,可小事,不可大事", "image": "山上有雷,小过,君子以行过乎恭"},
"101010": {"order": 63, "name": "既济", "pinyin": "jì jì", "en": "After Completion", "upper": "坎", "lower": "离", "judgment": "亨,小利贞,初吉终乱", "image": "水在火上,既济,君子以思患而豫防之"},
"010101": {"order": 64, "name": "未济", "pinyin": "wèi jì", "en": "Before Completion", "upper": "离", "lower": "坎", "judgment": "亨,小狐汔济,濡其尾,无攸利", "image": "火在水上,未济,君子以慎辨物居方"},
}
# ---------------------------------------------------------------------------
# 八卦 (上卦/下卦) 字符与象征
# ---------------------------------------------------------------------------
TRIGRAMS: Dict[str, dict] = {
"111": {"symbol": "☰", "name": "乾", "nature": "天", "elem": "金"},
"000": {"symbol": "☷", "name": "坤", "nature": "地", "elem": "土"},
"100": {"symbol": "☳", "name": "震", "nature": "雷", "elem": "木"},
"010": {"symbol": "☵", "name": "坎", "nature": "水", "elem": "水"},
"001": {"symbol": "☶", "name": "艮", "nature": "山", "elem": "土"},
"011": {"symbol": "☴", "name": "巽", "nature": "风", "elem": "木"},
"101": {"symbol": "☲", "name": "离", "nature": "火", "elem": "火"},
"110": {"symbol": "☱", "name": "兑", "nature": "泽", "elem": "金"},
}
# ---------------------------------------------------------------------------
# 卦象吉凶详细等级 (7 档, 来源: require.md)
# - 大吉/吉/中平偏吉/中平/中平偏凶/凶/大凶
# 同时给出:
# - category: 收束为 3 档 (吉/平/凶) 供画面三的氛围色
# - tag: "天定命数 · <四字>" LLM 解读首段前缀
# - remedy: "运在人为 · <四字>" LLM 解读末段前缀
# - ui: 画面三/四的按钮文案、氛围色调
# ---------------------------------------------------------------------------
HEX_LEVELS: Dict[str, dict] = {
# 大吉
"乾": {"level": "大吉", "tag": "顺风借力", "reason": "元亨利贞,刚健中正,万物创始"},
"坤": {"level": "大吉", "tag": "顺风借力", "reason": "柔顺包容,厚德载物,利永贞"},
"泰": {"level": "大吉", "tag": "顺风借力", "reason": "小往大来,天地交泰,万事通顺"},
"同人": {"level": "大吉", "tag": "顺风借力", "reason": "与人和同,利涉大川,君子亨通"},
"大有": {"level": "大吉", "tag": "顺风借力", "reason": "顺天休命,元亨,丰收富足"},
"谦": {"level": "大吉", "tag": "顺风借力", "reason": "谦虚卑下,无往不利,终吉"},
"益": {"level": "大吉", "tag": "顺风借力", "reason": "损上益下,利涉大川,元吉"},
"升": {"level": "大吉", "tag": "顺风借力", "reason": "元亨,南征吉,积小成大"},
"鼎": {"level": "大吉", "tag": "顺风借力", "reason": "元吉亨,以木巽火,烹饪养贤"},
# 吉
"需": {"level": "吉", "tag": "顺风借力", "reason": "需待时机,有孚光亨,利涉大川"},
"比": {"level": "吉", "tag": "顺风借力", "reason": "亲比和睦,原筮元永贞,无咎"},
"履": {"level": "吉", "tag": "顺风借力", "reason": "履虎尾不咥人,有惊无险,终亨"},
"豫": {"level": "吉", "tag": "顺风借力", "reason": "逸豫安乐,利建侯行师,但需防骄"},
"随": {"level": "吉", "tag": "顺风借力", "reason": "随时而动,元亨利贞,无咎"},
"临": {"level": "吉", "tag": "顺风借力", "reason": "临民施教,元亨利贞,八月有凶(需警)"},
"复": {"level": "吉", "tag": "顺风借力", "reason": "一阳来复,七日来复,利有攸往"},
"无妄": {"level": "吉", "tag": "顺风借力", "reason": "无妄之行,元亨利贞,匪正有眚"},
"大畜": {"level": "吉", "tag": "顺风借力", "reason": "蓄德养贤,利贞,不家食吉"},
"咸": {"level": "吉", "tag": "顺风借力", "reason": "感应亨通,取女吉,柔上刚下"},
"晋": {"level": "吉", "tag": "顺风借力", "reason": "明出地上,昼日三接,柔进上行"},
"家人": {"level": "吉", "tag": "顺风借力", "reason": "利女贞,家道正,亨通"},
"解": {"level": "吉", "tag": "顺风借力", "reason": "解脱危难,有攸往夙吉,赦过宥罪"},
"萃": {"level": "吉", "tag": "顺风借力", "reason": "聚集亨通,利见大人,用大牲吉"},
"革": {"level": "吉", "tag": "顺风借力", "reason": "巳日乃孚,改弦更张,悔亡"},
"渐": {"level": "吉", "tag": "顺风借力", "reason": "女归吉,进得位,循序渐进"},
"兑": {"level": "吉", "tag": "顺风借力", "reason": "亨,朋友讲习,说以先民"},
"涣": {"level": "吉", "tag": "顺风借力", "reason": "涣散而聚,王假有庙,利涉大川"},
"中孚": {"level": "吉", "tag": "顺风借力", "reason": "豚鱼吉,信及豚鱼,利涉大川"},
# 中平偏吉
"屯": {"level": "中平偏吉", "tag": "借风起帆", "reason": "初生艰难,但利于建侯,终将亨通"},
"师": {"level": "中平偏吉", "tag": "借风起帆", "reason": "师出有名,丈人吉,但行军有险"},
"小畜": {"level": "中平偏吉", "tag": "借风起帆", "reason": "密云不雨,以小养大,亨通但需积累"},
"观": {"level": "中平偏吉", "tag": "借风起帆", "reason": "观而后动,有孚颙若,可小成"},
"噬嗑": {"level": "中平偏吉", "tag": "借风起帆", "reason": "啮合而通,利用狱,亨通有小阻"},
"颐": {"level": "中平偏吉", "tag": "借风起帆", "reason": "自求口实,养正则吉,慎言语节饮食"},
"离": {"level": "中平偏吉", "tag": "借风起帆", "reason": "附丽光明,畜牝牛吉,柔顺为中"},
"恒": {"level": "中平偏吉", "tag": "借风起帆", "reason": "恒久守正,亨无咎,利贞"},
"遁": {"level": "中平偏吉", "tag": "借风起帆", "reason": "退避则亨,小利贞,君子远小人"},
"大壮": {"level": "中平偏吉", "tag": "借风起帆", "reason": "大壮利贞,非礼勿用,盛极当戒"},
"损": {"level": "中平偏吉", "tag": "借风起帆", "reason": "损下益上,有孚元吉,可贞"},
"夬": {"level": "中平偏吉", "tag": "借风起帆", "reason": "决断小人是非,不利即戎,有厉"},
"震": {"level": "中平偏吉", "tag": "借风起帆", "reason": "临危不乱,笑言哑哑,恐惧致福"},
"丰": {"level": "中平偏吉", "tag": "借风起帆", "reason": "丰大亨通,日中则昃,盛极当戒"},
"旅": {"level": "中平偏吉", "tag": "借风起帆", "reason": "旅琐琐,小亨,柔得中乎外"},
"巽": {"level": "中平偏吉", "tag": "借风起帆", "reason": "小亨,利有攸往,利见大人"},
"节": {"level": "中平偏吉", "tag": "借风起帆", "reason": "苦节不可贞,适度则吉,不节则嗟"},
"未济": {"level": "中平偏吉", "tag": "借风起帆", "reason": "未成而有望,小狐汔济,濡其尾无咎"},
# 中平
"蒙": {"level": "中平", "tag": "潜龙勿用", "reason": "蒙昧未明,需要启蒙,童蒙求我则吉"},
"蛊": {"level": "中平", "tag": "潜龙勿用", "reason": "蛊弊待治,先甲后甲,乱后成治"},
"贲": {"level": "中平", "tag": "潜龙勿用", "reason": "文饰其质,小利有攸往,但重实质"},
"睽": {"level": "中平", "tag": "潜龙勿用", "reason": "小事吉,乖离可合,但事多不顺"},
"井": {"level": "中平", "tag": "潜龙勿用", "reason": "无丧无得,往来井井,改邑不改井"},
"艮": {"level": "中平", "tag": "潜龙勿用", "reason": "艮其背,不获其身,行其庭不见其人"},
"既济": {"level": "中平", "tag": "潜龙勿用", "reason": "初吉终乱,事成当守,亨小"},
# 中平偏凶
"讼": {"level": "中平偏凶", "tag": "风雨欲来", "reason": "争讼终凶,但见大人则有利,惕中吉"},
"姤": {"level": "中平偏凶", "tag": "风雨欲来", "reason": "一女遇五男,阴长阳消,勿用取女"},
"小过": {"level": "中平偏凶", "tag": "风雨欲来", "reason": "可小事不可大事,过则凶,宜下不宜上"},
"大过": {"level": "中平偏凶", "tag": "风雨欲来", "reason": "本末弱,栋桡,危而可亨,但过度凶"},
"归妹": {"level": "中平偏凶", "tag": "风雨欲来", "reason": "征凶无攸利,婚嫁不正,有乖于礼"},
# 凶
"否": {"level": "凶", "tag": "风雨欲来", "reason": "大往小来,闭塞不通,君子道消"},
"剥": {"level": "凶", "tag": "风雨欲来", "reason": "阴剥阳,不利有攸往,小道长"},
"坎": {"level": "凶", "tag": "风雨欲来", "reason": "习坎,重重险陷,维心亨但行险"},
"困": {"level": "凶", "tag": "风雨欲来", "reason": "困穷有言,大人吉小人凶,致命遂志"},
"蹇": {"level": "凶", "tag": "风雨欲来", "reason": "蹇难重重,利西南,不利东北"},
# 大凶
"明夷": {"level": "大凶", "tag": "风雨欲来", "reason": "明入地中,夷者伤也,利艰贞(极危)"},
}
# 7 档 → 3 档 收束
LEVEL_CATEGORY = {
"大吉": "吉",
"吉": "吉",
"中平偏吉": "吉",
"中平": "平",
"中平偏凶": "凶",
"凶": "凶",
"大凶": "凶",
}
# 3 档 → UI 配置 (色调 / 按钮文案 / 后段标签)
CATEGORY_UI = {
"吉": {
"tag": "顺风借力", # 【天定命数 · 顺风借力】
"remedy": "承运心法", # 【运在人为 · 承运心法】
"btn_label": "听 风 · 拂 袖 登 程",
"btn_sub": "无局可破,只管乘势而起",
"tone_class": "tone-jade",
"mood": "云开见月明",
},
"平": {
"tag": "潜龙勿用",
"remedy": "蓄势心法",
"btn_label": "养 精 · 坐 看 风 云",
"btn_sub": "此时无局可破,唯以静气养神",
"tone_class": "tone-paper",
"mood": "水澜不惊",
},
"凶": {
"tag": "风雨欲来",
"remedy": "锦囊生机",
"btn_label": "启 扉 · 听 那 一 线 生 机",
"btn_sub": "遁去的一,便是破局之机",
"tone_class": "tone-blood",
"mood": "暗流涌动",
},
}
# 7 档对应的直接答语 (供本地降级用, LLM 也会被指示用类似句式)
DIRECT_ANSWER = {
"大吉": "可。",
"吉": "可。",
"中平偏吉": "可,宜推一把。",
"中平": "待时。",
"中平偏凶": "慎行。",
"凶": "不宜。",
"大凶": "切勿。",
}
# ---------------------------------------------------------------------------
# LLM 提示词 (按吉凶等级调教, 4 种语气)
# ---------------------------------------------------------------------------
LEVEL_PROMPTS = {
"大吉": (
"此为【大吉】之卦(大吉/吉/中平偏吉一类)。"
"此时无需破局,缘主需要的不是生机,而是'承运心法'——如何借着这股风把事情做到极致,如何稳住心态,莫把好运浪掉。"
"请扮演一位'微笑着为你践行的隐士',字数压缩到极致,绝对不刷屏。"
),
"吉": (
"此为【吉】之卦(大吉/吉/中平偏吉一类)。"
"此时无需破局,缘主需要的不是生机,而是'承运心法'——如何借着这股风把事情做到极致,如何稳住心态,莫把好运浪掉。"
"请扮演一位'微笑着为你践行的隐士',字数压缩到极致,绝对不刷屏。"
),
"中平偏吉": (
"此为【中平偏吉】之卦。"
"底子是好的,但如果缘主躺平不动,好运可能就擦肩而过了;若往前推一把,立刻变大吉。"
"此时需要的不是破局,而是'锦囊生机'——那个破局的临门一脚:一个'主动出击'的表态。"
),
"中平": (
"此为【中平】之卦(纯中平一类)。"
"当下是相持阶段,事情没有危险,但也缺乏爆发的契机。"
"此时不要给行动建议,因为盲动反而打破平衡。要给缘主灌注'静气'和'耐力'——安心睡觉、静待时机。"
),
"中平偏凶": (
"此为【中平偏凶】之卦。"
"大方向还没崩,但已埋下隐患的种子。如果装作看不见,很快会演变成大凶。"
"此时的'生机'是'防火墙'和'刹车片'——止损与防微,收弦、退步,扼杀火苗。"
),
"凶": (
"此为【凶】之卦(凶/中平偏凶/大凶一类)。"
"大方向已经走偏,凶象已显。"
"此时的'生机'是'防火墙'和'刹车片'——止损与防微,收弦、退步,扼杀火苗。"
),
"大凶": (
"此为【大凶】之卦(凶/中平偏凶/大凶一类)。"
"极凶之局,夷者伤也。"
"此时的'生机'是'防火墙'和'刹车片'——止损与防微,收弦、退步,扼杀火苗。"
),
}
def build_system_prompt(level: str, ui: dict, lang: str = "zh") -> str:
"""根据吉凶等级组装 system prompt。"""
level_hint = LEVEL_PROMPTS.get(level, LEVEL_PROMPTS["中平"])
if lang == "en":
return f"""# Role
You are a wise sage of the I Ching, interpreting hexagrams in plain modern English that anyone can understand. Do not pile on classical Chinese; at most sprinkle a single line of the original judgment as garnish.
# Current Hexagram Level
{level_hint}
# ABSOLUTE RULE — TIE EVERYTHING TO THE SEEKER'S QUESTION
The seeker's question is the ENTIRE point of the reading. You must NOT produce a generic hexagram description that could be reused for any question. EVERY sentence in the second paragraph must be anchored to the seeker's specific situation, using concrete details, nouns, and actions from their question.
# Core Principles
1.【The first sentence must be the direct answer】(most important!) In the <Reading> section, the very first line must be 4-8 words answering the seeker's specific question directly:
- 大吉/吉 (Great Fortune / Fortune) → "Go ahead. The moment is yours."
- 中平偏吉 (Slight tilt toward fortune) → "Go ahead, but take the first step yourself."
- 中平 (Neutral) → "Wait a little. Patience serves you now."
- 中平偏凶 (Slight tilt toward misfortune) → "Be cautious — danger is brewing."
- 凶 (Misfortune) → "Not advisable. The risk is real."
- 大凶 (Great misfortune) → "Do not move. The peril is great."
2.【Second paragraph: 深度结合缘主的问题, 用大白话讲清这卦在这件事上的具体含义】:
- Open by naming the hexagram (number, name, what it represents in modern terms).
- Then 100-150 words that:
(a) Use the seeker's exact words / context from their question. Quote or paraphrase their situation.
(b) Explain, in plain words, why this specific hexagram is the answer FOR THIS SPECIFIC QUESTION. (Not a generic description.)
(c) Name concrete things they can act on related to their situation (e.g. if they ask about a job interview, talk about preparation, timing, signals to watch for).
- No piling on classical Chinese. No generic "this hexagram means..." boilerplate.
3.【Way Through section: 1-3 highly specific, actionable suggestions tailored to the seeker's question】:
- Each suggestion must reference something concrete from the seeker's situation. Do NOT give generic advice like "stay positive" or "be patient".
- If their question is about a specific person, situation, time, decision — name that person / situation / time / decision in the advice.
- Format: "First, ...; Second, ...; Third, ..."
# Anti-pattern — DO NOT
- DO NOT produce a generic hexagram description. Every word must serve THIS seeker.
- DO NOT reuse the same advice across different questions.
- DO NOT be vague. The seeker should feel "this sage actually read my mind."
# Output format (strict — no extra content)
<Reading>
(First line: direct answer, e.g. "Go ahead.")
(Second paragraph: 100-150 words deeply tied to the seeker's specific question)
</Reading>
<Way Through · {ui['remedy']}>
(1-3 concrete, question-specific suggestions)
</Way Through · {ui['remedy']}>
"""
return f"""# 角色
你是一位洞察天机的周易宗师,用现代人能听懂的大白话解读卦象,不掉书袋,不卖弄文言,偶尔引用一句卦辞作为点缀即可。
# 当前卦象等级
{level_hint}
# 绝对原则 — 一切以缘主所问为根
缘主的问题就是这次解读的全部意义。你绝不能写一段"任何问题都能套"的通用卦象描述。【听天命】第二段里每一个字都必须锚定在缘主的具体处境上,直接引用或转述他们问题里的关键信息(人物/事件/时间/选择/纠结点),用大白话把这卦在"缘主所问的这件事"上具体意味着什么讲透。
# 核心原则
1.【第一句必须是直接答案】(最重要!) 在【听天命】段首行,只用4-8个字给出针对"缘主所问"的直接答案:
- 大吉/吉 → 「可以做,放心去。」「没问题,顺势而为。」
- 中平偏吉 → 「可以,但要主动推一把。」
- 中平 → 「暂时等一等。」「此时宜静不宜动。」
- 中平偏凶 → 「要谨慎,有隐患。」
- 凶 → 「不建议,风险较大。」
- 大凶 → 「切勿轻动,凶险极大。」
2.【第二段:用大白话把这卦在缘主所问的这件具体事情上意味着什么讲透】:
- 先说这是第几卦,叫什么名字,代表什么意思(用现代语言)。
- 紧接着 80-150 字,必须做三件事:
(a) 引用或转述缘主问题中的具体细节(谁、什么事、什么时间、纠结在哪)
(b) 用大白话讲清:为什么"这一卦"是"缘主所问的这件事"的答案
(c) 提到他们能在这件事上具体落子的几个点(若问面试就谈准备/时机/信号;若问感情就谈沟通/边界/下一步)
- 禁止写出"这卦代表..."这种能套到任何问题上的通用描述。
- 禁止堆砌文言词汇。
3.【运在人为段:给出 1-3 条结合缘主所问的具体可落地的行动建议】:
- 每一条都必须直接提到缘主问题里的具体对象/事件/时间,绝不写"保持积极""耐心等待"这种空话。
- 格式:"第一,...;第二,...;第三,..."
# 反模式 — 绝对不能
- 禁止写通用的卦象描述。每句话都要服务"这位缘主的这个问题"。
- 禁止不同问题给同一段建议。
- 禁止模糊。缘主应该觉得"这位师父看透了我的心思"。
# 输出格式 (严格遵守,不要加多余内容)
<听天命·窥天机>
(第一行:直接答案,如"可以做。"或"不建议。")
(第二段:80-150字 深度结合缘主所问的卦象解释)
</听天命·窥天机>
<运在人为·{ui['remedy']}>
(1-3条结合缘主所问的具体建议)
</运在人为·{ui['remedy']}>
"""
def build_user_prompt(
question: str,
hex_info: dict,
changed_info: dict | None,
moving: List[int],
level: str = "中平",
reason: str = "",
lang: str = "zh",
) -> str:
"""组装 user prompt: 缘主所求 + 卦象 + 动爻 + 吉凶等级。"""
moving_str = ", ".join(LINE_NAMES[i - 1] for i in moving) if moving else "无动爻"
changed_part = ""
if changed_info is not None:
changed_part = (
f"\n## 变卦\n"
f"卦序:第 {changed_info['order']} 卦\n"
f"卦名:{changed_info['name']} ({changed_info['pinyin']}, {changed_info['en']})\n"
f"卦辞:{changed_info['judgment']}\n"
f"象传:{changed_info['image']}"
)
if lang == "en":
return (
f"## Auspiciousness\n{level}\n"
f"Reason: {reason or '(see require.md)'}\n\n"
f"## The Seeker's Question (the entire point of the reading)\n{question.strip() or '(unspecified)'}\n\n"
f"## Original Hexagram\n"
f"Number: {hex_info['order']}\n"
f"Name: {hex_info['name']} ({hex_info['pinyin']}, {hex_info['en']})\n"
f"Upper trigram: {hex_info['upper']} Lower trigram: {hex_info['lower']}\n"
f"Judgment: {hex_info['judgment']}\n"
f"Image: {hex_info['image']}\n"
f"Moving lines: {moving_str}"
f"{changed_part}\n\n"
f"Strictly follow the System's two-tag format. Tie every word to the seeker's question above — name the people, events, timing, decision they asked about. The first sentence of the <Reading> section must be the direct plain-language 'answer'."
)
return (
f"## 吉凶等级\n{level}\n"
f"判定理由:{reason or '(详见 require.md)'}\n\n"
f"## 缘主所求 (本次解读的全部落点)\n{question.strip() or '(缘主未明示)'}\n\n"
f"## 本卦\n"
f"卦序:第 {hex_info['order']} 卦\n"
f"卦名:{hex_info['name']} ({hex_info['pinyin']}, {hex_info['en']})\n"
f"上卦:{hex_info['upper']} 下卦:{hex_info['lower']}\n"
f"卦辞:{hex_info['judgment']}\n"
f"象传:{hex_info['image']}\n"
f"动爻:{moving_str}"
f"{changed_part}\n\n"
f"请严格按 System 规定的两块标签格式输出解读,【听天命】段每句话必须直接锚定缘主所问的具体人物/事件/时间/纠结点(不要写通用卦象描述),首句必须是直白的'答案'。"
)