
    P1iM                        d Z ddlZddlZddlZddlmZmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ 	 ddlmZ  ej4                  e      Z G d d      Zdede fdZ!de de fdZ"dee   fdZ# G d d      Z$ G d d      Z%dde fdZ&d Z'ddZ(y# e$ r(  ej4                  e      Zej;                  d
       dZY w xY w)z
LiuYao analysis utilities for AI processing.

This module provides functions to prepare data for AI analysis of LiuYao divination.
    N)DictListOptionalUnionAny)timezone)settings)LLMServiceFactory)filter_prompt_for_response)get_active_template)normalize_languagezCould not import iching.utilsc                      e Zd ZdZi dddddddd	d
dddddddddddddddddddddd d!d"d#i d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEi dFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtduZdvdwdgdxdhdydzd{d|Zd}d~dddddZdddddddZddddddddddddddddZy)LiuYaoConstantszConstants for LiuYao analysis.   u   乾 (qián) - The Creative   u   坤 (kūn) - The Receptive   u)   屯 (zhūn) - Difficulty at the Beginning   u   蒙 (méng) - Youthful Folly   u   需 (xū) - Waiting   u   讼 (sòng) - Conflict   u   师 (shī) - The Army   u   比 (bǐ) - Holding Together	   u(   小畜 (xiǎo chù) - Small Accumulation
   u   履 (lǚ) - Treading   u   泰 (tài) - Peace   u   否 (pǐ) - Standstill   u    同人 (tóng rén) - Fellowship   u$   大有 (dà yǒu) - Great Possession   u   谦 (qiān) - Modesty   u   豫 (yù) - Enthusiasm   u   随 (suí) - Following   u   蛊 (gǔ) - Decay   u   临 (lín) - Approach   u   观 (guān) - Contemplation   u"   噬嗑 (shì kè) - Biting Through   u   贲 (bì) - Grace   u   剥 (bō) - Splitting Apart   u   复 (fù) - Return   u   无妄 (wú wàng) - Innocence   u&   大畜 (dà chù) - Great Accumulation   u   颐 (yí) - Nourishment   u    大过 (dà guò) - Great Excess   u   坎 (kǎn) - The Abysmal Water   u   离 (lí) - The Clinging Fire   u   咸 (xián) - Influence    u   恒 (héng) - Duration!   u   遁 (dùn) - Retreat"   u"   大壮 (dà zhuàng) - Great Power#   u   晋 (jìn) - Progress$   u+   明夷 (míng yí) - Darkening of the Light%   u   家人 (jiā rén) - Family&   u   睽 (kuí) - Opposition'   u   蹇 (jiǎn) - Obstruction(   u   解 (xiè) - Deliverance)   u   损 (sǔn) - Decrease*   u   益 (yì) - Increase+   u   夬 (guài) - Breakthrough,   u   姤 (gòu) - Coming to Meet-   u   萃 (cuì) - Gathering Together.   u   升 (shēng) - Pushing Upward/   u   困 (kùn) - Oppression0   u   井 (jǐng) - The Well1   u   革 (gé) - Revolution2   u   鼎 (dǐng) - The Cauldron3   u   震 (zhèn) - Thunderu   艮 (gèn) - Mountainu   渐 (jiàn) - Developmentu(   归妹 (guī mèi) - The Marrying Maidenu   丰 (fēng) - Abundanceu   旅 (lǚ) - The Wandereru   巽 (xùn) - The Gentle Windu   兑 (duì) - The Joyous Lakeu   涣 (huàn) - Dispersionu   节 (jié) - Limitationu!   中孚 (zhōng fú) - Inner Truthu"   小过 (xiǎo guò) - Small Excessu#   既济 (jì jì) - After Completionu%   未济 (wèi jì) - Before Completion)4   5   6   7   8   9   :   ;   <   =   >   ?   @   u   乾 (qián) - Heavenu   坤 (kūn) - Earthu   坎 (kǎn) - Wateru   巽 (xùn) - Wind/Woodu   离 (lí) - Fireu   兑 (duì) - Lake)111000001010100110101011u"   初爻 - Initial line (foundation)u#   二爻 - Second line (inner growth)u    三爻 - Third line (transition)u2   四爻 - Fourth line (approaching the outer world)u'   五爻 - Fifth line (position of power)u8   上爻 - Sixth line (transition away from the situation)r   r   r   r   r   r   u   青龙u   朱雀u   勾陈u   腾蛇u   白虎u   玄武)r   r   r   r   r   r   u   临u	   同五行u   空   六合u   冲   生   克u   害u   刑u   克合u   生合	   化进神	   化退神u	   化自身   化日)samesame5eempty6harmonyclashproducecounterharmpunishcounter-6harmonyproduce-6harmonydirect-1	direct--1zdirect-0changed-samedayN)	__name__
__module____qualname____doc__HEXAGRAM_NAMESTRIGRAM_NAMESLINE_POSITIONSSIX_GOD_NAMESRELATIONSHIP_MAPPING     :/home/cursorai/projects/iching/ai/utils/liuyao_analysis.pyr   r      s   (A	'A	'A 	
6A 	
)	A
 	
 A 	
#A 	
"A 	
)A 	
5A 	"A 	 A 	$A 	.A 	2A 	#A  	$!A" 	$#A$ 	%A& 	#'A( 	))A* 	0+A, 	-A. 	)/A0 	 1A2 	,3A4 	45A6 	%7A8 	.9A: 	,;A< 	+=A> 	%?A@ 	$AAB 	"CAD 	0EAF 	#GAH 	9IAJ 	)KAL 	%MAN 	'OAP 	&QAR 	#SAT 	"UAV 	(WAX 	)YAZ 	-[A\ 	+]A^ 	%_A` 	$aAb 	$cAd 	(eAf 	#gAh $'6%&**&%/013AANJ &#&#&'!"	M 00-?4EN M $$ #rw   r   hexagram_numberreturnc                 H    t         j                  j                  | d|        S )z&Get hexagram name based on its number.zUnknown hexagram )r   rq   get)ry   s    rx   get_hexagram_namer}      s%    ))--oARSbRc?deerw   trigram_codec                 H    t         j                  j                  | d|        S )z*Get trigram name based on its binary code.zUnknown trigram )r   rr   r|   )r~   s    rx   get_trigram_namer      s#    ((,,\=Ml^;\]]rw   c                 v    g }t        dd      D ]'  }t        | d|       }|dv s|j                  |       ) |S )z(Identify changing lines in the hexagram.r   r   y)rQ   rP   )rangegetattrappend)liuyaochanging_linesi
line_values       rx   identify_changing_linesr      sG    N1a[VqW-
'!!!$  rw   c                   x    e Zd ZdZeddededefd       Zedee	df   defd       Z
ed	eeef   defd
       Zy)DataFormatterz.Consolidated formatter for various data types.data	data_typerz   c           	         | s	d| d| dS 	 t        | t              r| S t        | t              r7dj                  | j	                         D cg c]  \  }}| d|  c}}      S t        | t
              r(dj                  | D cg c]  }t        |       c}      S t        |       S c c}}w c c}w # t        $ r6}t        j                  d| d|        d| d	t        |       cY d
}~S d
}~ww xY w)z8Generic data formatter that handles multiple data types.u   无u   数据 (No z data)
u   ：zError formatting z data: u(   数据格式化错误 (Error formatting z data): N)	
isinstancestrdictjoinitemslist	Exceptionloggererror)r   r   keyvalueitemes         rx   format_datazDataFormatter.format_data   s     ;yk@@	Z$$D$'yytzz|!T|eSEUG"4|!TUUD$'yy!=#d)!=>>4y 	 "U!=  	ZLL,YKwqcBC=i[QTUVQWPXYY	ZsL   B4 .B4 B)
B4 &B4 B/B4 
B4 )B4 4	C3=+C.(C3.C3	god_indexNc                     | yt        | t              r| t        j                  vrd|  S t        j                  |    }d| S )zFormat Six Gods information.u"   无六神数据 (No Six Gods data)u   六神: 未知 (Unknown): u   六神: )r   intr   rt   )r   god_names     rx   format_six_godszDataFormatter.format_six_gods   sN     7)S)Yo>[>[-[/	{;;"00;($$rw   rel_datac                    | rt        | t              syg }dD ]  }|| v s	| |   sg }| |   D ]  }|t        |t              ru|j                  d      rd	 t	        |j                  dd            }t        j                  j                  j                  |t        |            }|j                  d|        t        |t              st        j                  j                  |      }|s|j                  |        |s|j                  |dk(  rdnd dd	j                  |               d	j                  |      S # t        t        f$ r Y &w xY w)
u7   Format wangshui (旺衰) information for a single line. )daymonthcs12-u   十二长生: r   u   日u   月: , )r   r   r   
startswithr   replaceiutilsbzg12ChangShengr|   r   
ValueError	TypeErrorr   ru   r   )r   resultperiodperiod_infor   cs_indexcs_textmapped_texts           rx   format_wangshui_linez"DataFormatter.format_wangshui_line   s?    z(D9&F!hv&6 $V,D| !$,1I%'*4<<+D'EH&,ii&=&=&A&A(CPXM&ZG'..y/IJ $D#.&5&J&J&N&Nt&T&'..{; -  MMfoU5$IDIIVaLbKc"de) ', yy   !+I6 %$%s   A"EEE)generic)rm   rn   ro   rp   staticmethodr   r   r   r   r   r   r   r   rv   rw   rx   r   r      s    8Z# Z# Zc Z Z$ 	%5d#3 	% 	% 	% !tCH~ !# ! !rw   r   c                       e Zd ZdZededeeeef      fd       Z	ededeeef   fd       Z
ededeeef   fd       Zy)	ResponseValidatorz3Handles validation and extraction of LLM responses.textrz   c                    	 t        j                  |       S # t         j                  $ r Y nw xY wd}t        j                  ||       }|rN	 |j                  d      j                         }t        j                  |      S # t         j                  $ r Y nw xY wd}t        j                  ||       }|D ]=  }	 t        j                  |      }d|v rd|v r|c S &# t         j                  $ r Y ;w xY w y)z'Extract JSON from various text formats.z```json\s*([\s\S]*?)\s*```r   z\{[\s\S]*?\}thinkanalysisN)jsonloadsJSONDecodeErrorresearchgroupstripfindall)r   json_patternmatchjson_contentjson_object_patternmatches	json_datas          rx   extract_json_from_textz(ResponseValidator.extract_json_from_text   s    	::d#### 		 5		,-${{1~335zz,//''  .**0$7E JJu-	i'J),C$$''   s0    --3A? ?BB6CC.-C.c                     ddd}ddd}|j                         D ]2  \  }}t        j                  ||       }|s|j                  d      ||<   4 |S )z7Extract think and analysis fields using regex patterns.r   )r   r   z$"think"\s*:\s*"([^"]*(?:\\.[^"]*)*)"z'"analysis"\s*:\s*"([^"]*(?:\\.[^"]*)*)"r   )r   r   r   r   )r   	extractedpatternsfieldpatternr   s         rx   extract_fields_manuallyz)ResponseValidator.extract_fields_manually  sa     !b1	 =B

 'nn.NE7IIgt,E#(;;q>	%  /
 rw   response_textc                 (   t         j                  d| dd  d       t        j                  |       }|r-d|v r)d|v r%|j	                  dd      |j	                  dd      dS t        j                  |       }|d   s|d   r|d   xs | |d   dS | ddS )	z;Validate and extract structured data from the LLM response.z!Response text (first 100 chars): Nd   z...r   r   r   )liuyao_analysisr   )r   debugr   r   r|   r   )r   r   manual_datas      rx   validate_liuyao_responsez*ResponseValidator.validate_liuyao_response$  s     	8t9L8MSQR &<<]K	I-*	2I#,==R#@"w3  (??Nw;z#:#.z#:#Km$W-   -
 	
rw   N)rm   rn   ro   rp   r   r   r   r   r   r   r   r   rv   rw   rx   r   r      s    =S Xd38n-E  > c d38n    
 
S#X 
 
rw   r   languagec                    t        |      }|}|s	 t        d|      }i }| j
                  |d<   	 | j                  | j                  | j                  | j                  | j                  | j                  | j                  r| j                  ni d}d|d   vr-| j                  }t        j                  j!                  ||      }nt        j                  j!                  |      }|j#                  di       }|j#                  d	i       }	|j#                  di       }
| j                  j%                  d
      }|
rXt'        |
t(              rGt        j*                  j,                  j#                  |
j#                  di       j#                  d      d      }t        j*                  j.                  j#                  |
j#                  di       j#                  d      d      }t        j*                  j,                  j#                  |
j#                  di       j#                  d      d      }t        j*                  j.                  j#                  |
j#                  di       j#                  d      d      }t        j*                  j,                  j#                  |
j#                  di       j#                  d      d      }t        j*                  j.                  j#                  |
j#                  di       j#                  d      d      }t        j*                  j,                  j#                  |
j#                  di       j#                  d      d      }t        j*                  j.                  j#                  |
j#                  di       j#                  d      d      }g }d|
v rt'        |
d   t(              r|
d   }|j#                  d      xs |j#                  d      }|j#                  d      xs |j#                  d      }|V|Tt        j*                  j.                  j#                  |d      t        j*                  j.                  j#                  |d      g}d| | d| | d| | d| | d}|r#t1        |      r|ddj3                  |       dz  }||z  }||d<   t        j5                  d       t9        |      }||d"<   t;        |       }d#j3                  |D cg c]%  }t<        j>                  j#                  |d$|       ' c}      }|sd%}||d&<   t7        tA        |            |d'<   d}d}|	At'        |	t(              r1d(|	v r-|	d(   (d)|	d(   v r!|	d(   d)   dz   }t7        |      }tC        |      }||d*<   ||d+<   |jE                         D ]   \  } }!|jG                  | t7        |!            }" tA        |      }"tI        |      }tA        |      |"k  r%t        j5                  d,tA        |       d-|" d.       |S # t        $ r"}t        j	                  d|        Y d}~yd}~ww xY w# t        $ r0}t        j	                  d |        d!t7        |       cY d}~S d}~ww xY wc c}w )/a  
    Prepare a prompt for LiuYao analysis.
    
    Args:
        liuyao: LiuYao instance
        custom_template: Optional custom template to use
        language: Language code for template retrieval and filler text
        
    Returns:
        str: Formatted prompt
    r   r   zError retrieving template: Nz{{question}})y1y2y3y4y5y6r   r   r   lyz%Y/%m/%d %H:%M:%Syeargr   r   r   r   hourra   r   0r   1 u   年 u   月 u   日 u   时u    （空亡：u   ）z	{{qdate}}z%Recalculated LiuYao data successfullyz!Error recalculating LiuYao data: u#   处理六爻数据时发生错误: z{{hexagram_calculation}}r   zLine u   无动爻 (No changing lines)z{{changing_lines}}z{{changing_lines_count}}cguaguaz{{changed_hexagram_info}}z{{changed_hexagram_number}}z9Stripped content after last '---' separator, new length: z characters (was ))%r   r   r   r   r   questionr   r   r   r   r   r   r   qdater   r   recalculate_liuyao_datar|   strftimer   r   r   gGodstem
gEarthstemallr   r   r   format_hexagram_calculationr   r   rs   lenr}   r   r   r   )#r   custom_templater   template_contentr   replacementsliuyao_dictdater   r   bz_datadate_formatted	year_stemyear_branch
month_stemmonth_branchday_stem
day_branch	hour_stemhour_branchempty_branches
empty_dictempty1empty2bazi_strhexagram_calculationr   linechanging_lines_textchanged_hexagram_infochanged_hexagram_numberchanged_numplaceholderr   original_lengths#                                      rx   prepare_liuyao_promptr  ?  s    "(+H '	28hO L $*??L ?> ))))))))))))#);;FKKB
 {6**<<D --??TRK --??LK vr*XXdB((4$  ../BC z'40		**..w{{62/F/J/J3/OQSTI ))..227;;vr3J3N3Ns3SUWXK++//GR0H0L0LS0QSUVJ!99//33GKK4L4P4PQT4UWYZLyy))--gkk%.D.H.H.MrRH--11'++eR2H2L2LS2QSUVJ		**..w{{62/F/J/J3/OQSTI ))..227;;vr3J3N3Ns3SUWXK  N'!j1A4&H$W-
#*AjnnS.A#*AjnnS.A%&*<		,,00<		,,00<&N
 9+k]$zl<.PTU]T^_i^jjnoxny  {F  zG  GJ  KH#n"5mBGGN,C+DCHHh&N$2[!<= 7t</CL+, -V4N))jx$yjxbf_%C%C%G%GPUVZU[n%]jx$yz=)<L%&/23~3F/GL+,   
~*R.6R<BvJDZBvJV*U+a/K&)+&6#$5k$B!0EL,-2IL./ +002U+33KUL 3 *+O12BC
.PQTUeQfPggx  zI  yJ  JK  L  	Mm  	LL6qc:;	R  >8<=4SVH==> %zs;   W1 Q7X *Y1	X:XX	Y(%YYYc                 /   | sy	 | j                  di       }| j                  dd      }| j                  di       }|syg }d|v r|d   |j                  d	       |d   }d
|v r|d
   }t        j                  j                  j                  |d|       }|dz   }t        |      }	g }
|j                  dd      r|
j                  d       |j                  dd      r|
j                  d       |j                  dd      r|
j                  d       |j                  dd      r|
j                  d       d}|
rddj                  |
       d}d|v r|d   }t        |d         t        |d         z   t        |d         z   }t        |d         t        |d         z   t        |d          z   }t        |      }t        |      }|j                  d!| d"|	j                  d"      d    |        |j                  d#|        |j                  d$|        |j                  d%|        d&|v r|d&   }d'g}d&|v rl|d&   }t        j                  j                  j                  |i       j                  d(d)|       }|j                  d*d      }|j                  d+| d,| d-       d.|v r|j                  d/|d.    d0       d1|v r|j                  d2|d1    d0       |j                  d3j                  |             d4g}d}d5|v rd6|v rd7|v rd8}t        d9dd:      D ]  }d;d<d=d>d?d@dA|   }dB| }||z   dz
  d9z  }t        j                  j                  |dC      }|d5   j                  |      }|d6   j                  |      }t        |t              r3t        j                   j"                  j                  |t        |            n|}t        |t              r3t        j                   j$                  j                  |t        |            n|} |d7   j                  |      }!t        |!t              r3t        j                  j&                  j                  |!t        |!            n|!}"d}#dD|v rdE|v rz||j                  dDi       v re||j                  dEi       v rP|dD   j                  |      }$|dE   j                  |      }%t        |$t              r3t        j                   j"                  j                  |$t        |$            n|$}&t        |%t              r3t        j                   j$                  j                  |%t        |%            n|%}'d}(dF|v rt||j                  dFi       v r`|dF   j                  |      })t        |)t              r3t        j                  j&                  j                  |)t        |)            n|)}*|*rdG|* }(|&r"|'r ||j                  dFi       v }+|+r
dH|& |' |( d}#dI| dJ| dK| |  },|"r|,dG|" z  },|#r|,|#z  },|j                  |,       |st        |t(              sd|v s|d   }-d7| }.|.|-v r3|-|.   r.t*        j-                  |-|.         }/|/r|j                  dL|/        dD| }0|0|-v sh|-|0   so||j                  dFi       v st*        j-                  |-|0         }1|1s|j                  dM|1         |r#|j                  d3d3j                  |      z          |rd6|v rg dN}2t        d9dd:      D ]?  }3dB|3 }4|4|d6   v s|d6   |4   }5t        j                   j/                  |5      }6|6;i }7t        ddO      D ]~  }8|8|3k7  s	dB|8 }9|9|d6   v s|d6   |9   }:t        j                   j/                  |:      };|;@t        j                   j1                  |6|;      }<|<dk(  rdP}=n|<dk(  rdQ}=n
|<dRk(  rdS}=ndT}=|=|7|8<    d@d?d>d=d<d;dU|3   }>g }?t        ddO      D ]0  }||3k7  s	|7j                  |dT      }=|?j                  | dV|=        2 dW|> dXdKj                  |?       dY}@|2j                  |@       B t3        |2      dkD  r#|j                  d3d3j                  |2      z          |rd6|v rdE|v rdF|v ri }At        ddO      D ]  }dB| }||j                  dEi       v s||j                  dFi       v s2|dE   |   ;|dE   |   }B|dF   |   })t        j                  j&                  j                  |)t        |)            }*|B|*dZA|<    Arg d[}Ct        d9dd:      D ]+  }3dB|3 }4|4|d6   v s|d6   |4   }5t        j                   j/                  |5      }6|6;i }DAj5                         D ]i  \  }E}#t        j                   j/                  |#d\         }F|F+t        j                   j1                  |6F      }<|<dk(  rdP}=n|<dk(  rdQ}=n
|<dRk(  rdS}=ndT}=|=DE<   k Dsd@d?d>d=d<d;dU|3   }>g }?t7        Dj9                               D ]  }ED|E   }=|?j                  |E dV|=         dW|> dXdKj                  |?       dY}@Cj                  |@       . t3        C      dkD  r#|j                  d3d3j                  C      z          g d]}Gt7        Aj9                               D ]/  }EA|E   }#t        j                   j/                  |#d\         }F|F.i }Ht        ddO      D ]x  }IdB|I }J|J|d6   v s|d6   J   }Kt        j                   j/                  |K      }L|L:t        j                   j1                  FL      }<|<dk(  rdP}=n|<dk(  rdQ}=n
|<dRk(  rdS}=ndT}=|=HI<   z Hsd;d<d=d>d?d@dAE   }>g }?t        ddO      D ]*  }IHj                  |IdT      }=|?j                  |I dV|=        , dW|> d0|#d^    d_dKj                  |?       dY}@Gj                  |@       2 t3        G      dkD  r#|j                  d3d3j                  G      z          d`|v rt        |d`   t(              rt;        da |d`   j=                         D              }M|Mri }N|rt        |t(              rdb|v r	|db   xs i }Ndcg}Ot?               }P|d`   j5                         D ]  \  }Q}R|Rdk(  sQjA                  dBd      }PjC                  t        |             d}Sdd| }TNt        Nt(              sSTNv r$Nj                  T      jt        NT   tD              rNT   rdedfdgdhdidjdkdldmdndodpdq}UNT   }Vg }W|VrVng D ]  }X|Xt        Xt              rxXjG                  dr      rg	 XjA                  drd      }Yt        |Y      }Zt        j                   jH                  j                  |Zt        |Z            }[Wj                  ds|[ dt       t        Xt              sUj                  Xd      }\|\sWj                  \        WrddKj                  W       d}SOj                  dv| d0S         |j                  d3d3j                  O      z          g }]|rt        |t(              r~d|v rz|d   }-t        ddO      D ]f  }|Pv rd7| }.|.|-v s|-|.   st        |-|.   t(              s,dw|-|.   v s4t        |-|.   dw   tD              sKdx|-|.   dw   v sV]j                  |       h ]r4dyg}^]D ]  }_^j                  dv|_ d0        |j                  d3d3j                  ^      z          n|j                  dz       t?               }Pg }]|rt        |t(              r~d|v rz|d   }-t        ddO      D ]f  }|Pv rd7| }.|.|-v s|-|.   st        |-|.   t(              s,dw|-|.   v s4t        |-|.   dw   tD              sKdx|-|.   dw   v sV]j                  |       h ]rBdyg}^]D ]  }_^j                  dv|_ d0        |j                  d3d3j                  ^      z          db|v r|db   |j                  d{       |db   }`d
|`v r`d
   }t        j                  j                  j                  |d|       }|dz   }t        |      }	g }
|`j                  dd      r|
j                  d       `j                  dd      r|
j                  d       `j                  dd      r|
j                  d       `j                  dd      r|
j                  d       d}|
rddj                  |
       d}d`v r`d   }t        |d         t        |d         z   t        |d         z   }t        |d         t        |d         z   t        |d          z   }t        |      }t        |      }|j                  d|| d"|	j                  d"      d    |        |j                  d#|        |j                  d$|        |j                  d%|        d&`v r`d&   }d'g}|j                  d}|j                  d&d            }t        j                  j                  j                  |i       j                  d(d)|       }|j                  d*d      }|j                  d+| d,| d-       d.|v r|j                  d/|d.    d0       d1|v r|j                  d2|d1    d0       |j                  d3j                  |             d4g}d}d5`v rd6`v rd7`v rd8}t        d9dd:      D ]  }d;d<d=d>d?d@dA|   }dB| }||z   dz
  d9z  }t        j                  j                  |dC      }`d5   j                  |      }|`d6   j                  |      }t        |t              r3t        j                   j"                  j                  |t        |            n|}t        |t              r3t        j                   j$                  j                  |t        |            n|} `d7   j                  |      }!t        |!t              r3t        j                  j&                  j                  |!t        |!            n|!}"d}#dD`v rdE`v rz|`j                  dDi       v re|`j                  dEi       v rP`dD   j                  |      }$|`dE   j                  |      }%t        |$t              r3t        j                   j"                  j                  |$t        |$            n|$}&t        |%t              r3t        j                   j$                  j                  |%t        |%            n|%}'d}(dF`v rt|`j                  dFi       v r``dF   j                  |      })t        |)t              r3t        j                  j&                  j                  |)t        |)            n|)}*|*rdG|* }(|&r"|'r |`j                  dFi       v }+|+r
dH|& |' |( d}#dI| dJ| dK| |  },|"r|,dG|" z  },|#r|,|#z  },|j                  |,       |st        |t(              sdb|v s|db   #|db   }ad7| }.|.|av r3a|.   r.t*        j-                  a|.         }/|/r|j                  dL|/        dD| }0|0av soa|0   sv|`j                  dFi       v st*        j-                  a|0         }1|1s|j                  dM|1         |r#|j                  d3d3j                  |      z          d3j                  |      S # tJ        tL        f$ r tN        jQ                  duX        Y 
 w xY w# tR        $ r0}btN        jU                  d~b        dt        |b       cY d}b~bS d}b~bww xY w)zFormat the hexagram calculation data for display.
    
    Args:
        liuyao_dict: Complete LiuYao data dictionary with all components
        
    Returns:
        str: Formatted display string
    u   无数据 (No data)r   god6r   relu    无六爻数据 (No LiuYao data)oguaNu   原卦信息:r   u   未知卦象 r   clash6Fu   六冲harmony6rY   wsu   游魂rsu   归魂r   z (/r   yaor   r   r   r   r   r   u     本卦：z - u     卦序：u     上卦：u     下卦：palaceu	     卦宫:nu   宫posu       卦宫: u	   宫（第u   卦）shiu       世爻: u   爻yinu       应爻: r   u	     六爻:r   r   qTr   u   一u   二u   三u   四u   五u   六rX   r   u   未知hghehqu   ，u    (伏神：z    u   爻：r   u         旺衰: u         伏神旺衰: )u     六爻五行关系:j       提示：AI 不需要自行计算五行生克关系，可直接使用本结构中已给出的关系。u       描述：该部分表示六个爻位之间的五行生克关系，每个爻位与其他爻的相互关系，用五行的视角进行表示。r   u   同rZ   r   r[   -)r   r   r   r   r   r   :z  u   爻: {})	earth_idxqin_name)u!     六爻对伏神的五行关系:r+  u       描述：该部分记录主卦六个爻位对"伏神"的五行生克关系。伏神是被压制在动爻之下的爻，虽不显但有一定影响。r/  )u!     伏神对六爻的五行关系:r+  ur       描述：表示伏神本身对主爻的五行作用关系，属于"伏神为主动者，六爻为被动者"。r0  z: {	changeyaoc              3   &   K   | ]	  }|d k(    yw)r   Nrv   ).0r   s     rx   	<genexpr>z.format_hexagram_calculation.<locals>.<genexpr>&  s     &Z?Yeuz?Ys   r   u	     动爻:cyr\   r]   r^   u   化空u	   化六合u   化冲u   化回头生u   化回头克u   化害u   化刑u	   化克合u	   化生合)rj   rk   rl   ra   rb   rc   rd   re   rf   rg   rh   ri   r   u   化u   (十二长生)zInvalid cs12 format: u       第r   rc   u	     暗动:u   
  动爻: 无u   
变卦信息:u     变卦：orig_palacez'Error formatting hexagram calculation: u/   数据格式化错误 (Error formatting data): )+r|   r   r   r   g64Guar}   r   r   r   split	g8GuaDatar   r   rt   r   r   r   r   r   g6Qinr   r   r   getEarthElementIcalcElementRelr   r   sortedkeysanyvaluessetr   addr   r   r   r   r   r   warningr   r   )cr   ly_data
god6_indexr   r   r  	gua_indexhexagram_nameadjusted_indexhexagram_infospecial_propertiesspecial_properties_textr   upper_trigram_codelower_trigram_codeupper_trigramlower_trigramr!  palace_infopalace_indexpalace_namer#  six_yao_infohas_yao_datar   yao_numyao_keyr   r   stem_idx
branch_idx	stem_namebranch_name	qin_indexr0  hidden_infohidden_stem_idxhidden_branch_idxhidden_stem_namehidden_branch_name
hidden_relhidden_qin_idxhidden_qin_nameshould_displayyao_lineogua_relqkeywangshui_infohgkeyhidden_wangshuifive_element_relationshipscurrent_yaocurrent_yao_keycurrent_earth_idxcurrent_element_idxrelationships	other_yaoother_yao_keyother_earth_idxother_element_idxr  rel_textyao_num_chinese	rel_partsrel_linehidden_god_yaoshidden_earth_idxyao_to_hidden_relationshipshidden_relationships
hidden_yaohidden_element_idxhidden_to_yao_relationshipsyao_relationships
target_yaotarget_yao_keytarget_earth_idxtarget_element_idxhas_changing_yaocgua_rel_datachanging_infomoving_linessubkeyr   relationship_infocy_keyrelationship_mappingrel_list	rel_textsrel_itemcs_index_strr   r   r   hidden_moving_lineshidden_changing_infohidden_liner   cgua_relr   sc                                                                                                      rx   r   r     s    $s	J//$+ __VQ/
??5"-5  W!<MM/*6?D} K	 & 4 4 8 8mT]S^D_ `!*Q 1. A &("88He,&--h788J.&--h788D%(&--h788D%(&--h7*,'%02388<N3O2PPQ.R+ D=u+C),SY#c$i.)H3sSWy>)Y&),SY#c$i.)H3sSWy>)Y&$45G$HM$45G$HMMMKc-BUBUV[B\]^B_A`ax`y"z{MMK/?"@AMMK"?@MMK"?@ 4h*mv%#)(#3L"(--"9"9"="=lB"O"S"STW[^_k^lYm"nK **UB/C&&k])C5PV'WXF?&&fUm_C'HIF?&&fUm_C'HIdii45 (=L !Ld{sd{sd{#q!RA"'Ee%TYZ[\]G !!gG ",a!!3q 8I.<<@@HUH  $Cy}}W5H!%cw!7J T^^fhkSl		 2 2 6 6xX OrzI[efpru[v&))"6"6":"::s:"W  }GK !%S	g 6IU_`iknUov}}2266y#i.Qu~H #%Kt|DHHTSUDV9V[bfjfnfnosuwfx[x*.t*..*A,0JNN7,C) mw  xG  IL  mM699+=+=+A+A/SVWfSg+h  Sb(t~  @Q  SV  uWVYY-A-A-E-EFWY\]nYo-p  ]n* &(
4<Gtxxb7I,I-1$Z^^G-DNnx  zH  JM  oNfmm.A.A.E.EnVYZhVi.j  TbO./2?2C-D
+0B-4r8J-JN-0;<L;MN`Mablammn.o "&gYfXJbK=YH c($44 # K/ ''1  Jx$>6XCU#+F#3!"1#w8+,9,N,NxX\~,^M, , 3 3n]O4T U #%QC H,%WPTPXPXY]_aPbEb.;.P.PQYZ_Q`.aO. , 3 36J?J[4\ ]O )R dTYY|%<<= t.* $)Ar?K()+&7O '$s)3,0Io,F).4ii.H.HIZ.[+.:,.M-21a[	#,#;67	{OM'4S	'A:>s)M:R<BII<V<VWf<g(9+<+H28))2J2JK^`q2rC 03ax;@14;@14;@;>GOM),D+ .90 38EePUZ_di.jkv.wO(*I+0A;#*k#9/</@/@#/NH$-$4$4y(5L$M ,7
 *,O+<GDIIiDXCYY['\H6==hGW $3Z 12Q6MM$3M)N"NO t"$q!A !!gG488D"#55488D"#55T
7+7+/:g+>()-dG)<*0--*=*=*A*A.RUVdRe*f)9(7.* % #3/ (-Q2,-k]*;*d3i704S	/0J-28))2L2LM^2_/2>79 4?N?T?T?V$;J9?9S9ST_`kTl9m$6'9'E.4ii.F.FGZ\n.o ,/!87<H-0AX7<H-0AX7<H7:HKS(<Z(H# @W& $8:?EeX]bglq6rs~6O02I6<=Q=V=V=X6Y
3G
3S(1(8(8J<q
9S(T 7Z 24O3DGDIIV_L`Kaac/dH$?$F$Fx$PM (7P 67!;dTYY7R-S&ST3/ '-_-A-A-C&D
&5j&A-3YY-G-GT_H`-a*-902-.3Aqk
34ZL1A#1T#Y#>7;Cy7P$49?9S9STd9e$6'9'E.4ii.F.FGY[m.n ,/!87<H-0AX7<H-0AX7<H7:HHP(9*(E) /:,  16;%TY^chm2noy2z,.	271+J/@/D/DZQT/UH$-$4$4
|1XJ5O$P 3> .0/@KPZD[C\\`aeajajktau`vvx+y ; B B8 LM 'EP 67!;dTYY7R-S&ST d"z${2CT'J#&&ZtK?P?W?W?Y&Z#Z #$&MJx$>6XCU(0(8(>B%0MM $'5L)-k):)@)@)B A:&,nnS"&=G(,,S\: 13-')'^F  -4J}VZ<[ (%6#0#4#4V#<#D$, $.mF.CT#J}]cOd 1<1<7?-50;-5/=/=,4.68C8C<&$8 0=V/DH02I AIHb4P+3+;,4+5h+DI\I\]dIe
-9?G?O?OPWY[?\;>|;L:@)):Q:Q:U:UV^`cdl`m:n090@0@3wi~A^0_ 0:(C/H>R>V>VW_ae>f3>4=4D4D[4Q) 5Q, (1>@9AU@VVW<X(9)0077)3GXFY1Z[C *CF MM$=)A"AB +-'  Jx$>6XCU#+F#3 "'q!A L0 (%&qc7D#x/HTNzRZ[_R`bfGg#(HTN#:z(SW.Y^J_ae?f'.(4.2G'G(;(B(B1(E "- +0;},+>K077'+c8RS ,?dTYY7K-L&LMMM"34#&5L +-'  Jx$>6XCU#+F#3 "'q!A L0 (%&qc7D#x/HTNzRZ[_R`bfGg#(HTN#:z(SW.Y^J_ae?f'.(4.2G'G(;(B(B1(E "- +0;},+>K077'+c8RS ,?dTYY7K-L&LM
 W!<MM+,6?D} K	 & 4 4 8 8mT]S^D_ `!*Q 1. A &("88He,&--h788J.&--h788D%(&--h788D%(&--h7*,'%02388<N3O2PPQ.R+ D=u+C),SY#c$i.)H3sSWy>)Y&),SY#c$i.)H3sSWy>)Y&$45G$HM$45G$HMMMKc-BUBUV[B\]^B_A`ax`y"z{MMK/?"@AMMK"?@MMK"?@ 4h*m  &zz-Ha9PQ$mm5599,KOOPSWZ[gZhUijjj+""\+iuF#STF?&&fUm_C'HIF?&&fUm_C'HIdii45 (=L !Ld{sd{sd{#q!RA"'Ee%TYZ[\]G !!gG ",a!!3q 8I.<<@@HUH  $Cy}}W5H!%cw!7J T^^fhkSl		 2 2 6 6xX OrzI[efpru[v&))"6"6":"::s:"W  }GK !%S	g 6IU_`iknUov}}2266y#i.Qu~H #%Kt|DHHTSUDV9V[bfjfnfnosuwfx[x*.t*..*A,0JNN7,C) mw  xG  IL  mM699+=+=+A+A/SVWfSg+h  Sb(t~  @Q  SV  uWVYY-A-A-E-EFWY\]nYo-p  ]n* &(
4<Gtxxb7I,I-1$Z^^G-DNnx  zH  JM  oNfmm.A.A.E.EnVYZhVi.j  TbO./2?2C-D
+0B-4r8J-JN-0;<L;MN`Mablammn.o "&gYfXJbK=YH c($44 # K/ ''1  Jx$>6XCUZbciZjZv#+F#3!"1#w8+,9,N,NxX\~,^M, , 3 3n]O4T U #%QC H,%WPTPXPXY]_aPbEb.;.P.PQYZ_Q`.aO. , 3 36J?J[4\ ]M )P dTYY|%<<= yy  A 5?	3J -906AVW_V`?a0b08-9B  J>qcBC@QIIJs  8A] W(A] (A] :A]  A
A] A] A] )A] A%A] +)A] A] ,A] 9)A] #A#A] CA] A]  A] )A1A] )A] <A] AA] C.A] 5A] )A] =AA] D6A] 8B8A] 1A%A\A] (A] =B!A] A] %A] 9A] A] 
A] #B.A] A] A] ,A] 4A] 
A] YA] X.A] Y A] YA] YA
A] ZA] Z A] Z6A] [AA] \'A]
]A] ]	A]
]
A] ]	A^]%A^];A^^A^c           	         	 t        |      }|r|s ddlm}  |d      }|xs |d   }|xs |d   }t        | |      }|s=t        j                  d| j                          d| _        | j                  d	g
       yt        j                  |      }|r|j                  |       |j                  |dd      }|s=t        j                  d| j                          d| _        | j                  d	g
       yd}	d}
t        j                  |
|      }|rD|j                  d      j!                         }	t        j"                  |
d|      j!                         }t$        j'                  |      }t)        |      |||j+                  d|      |j+                  d|	      |j+                  d|      |d}|| _        d| _        t/        j0                         | _        | j                  g d
       |S # t4        $ rI}t        j                  d| j                   d|        d| _        | j                  d	g
       Y d}~yd}~ww xY w)z
    Generate AI analysis for LiuYao divination.
    
    Args:
        liuyao: LiuYao instance to analyze
        model_key: Optional model key to use
        provider: Optional provider to use
        
    Returns:
        dict: Analysis result
    r   )get_ai_configr   providermodelr   z$Failed to prepare prompt for LiuYao r   analysis_status)update_fieldsNgffffff?i   )prompttemperature
max_tokensz#Empty response from LLM for LiuYao r   z<think>([\s\S]*?)</think>r   r   r   )r  r  r  r   r   r   r   	completed)ai_analysisr  analysis_timestampzError analyzing LiuYao r   )r   ai.utils.configr  r  r   r   idr  saver
   get_servicechange_modelget_completionr   r   r   r   subr   r   r   r|   r  r   nowr  r   )r   	model_keyr  r   r  configr  llm_serviceresponsethinking_processthink_patternthink_matchanalysis_datar   r   s                  rx   analyze_liuyaor  K  s9   G%h/ y5"8,F56*#5H!4VG_I 'vALL?		{KL%,F"KK'8&9K: (33H=$$Y/ -- . 
 LL>vyykJK%,F"KK'8&9K: 4iix8*00399;vvmR:@@BH *BB8L 18 ,001BHM"&&w0@A%))*;XF 
 $!,$,LLN!"Z[ .vyykA3?@!(#4"56	s&   A:G- =A:G- 8C4G- -	H?6?H::H?)Nzzh-hans)NNN))rp   loggingr   r   typingr   r   r   r   r   django.utilsr   django.confr	   ai.services.factoryr
   iching.utils.utilsr   ai.utilsr   ai.utils.i18nr   iching.utilsutilsr   ImportError	getLoggerrm   r   rC  r   r   r   r}   r   r   r   r   r  r   r  rv   rw   rx   <module>r     s   
   	 3 3 !   1 9 ( ,! 
		8	$x xxfs fs f
^3 ^3 ^
tCy @! @!HM
 M
^I# IV	JBSq!  Wx(F
NN23Fs   B   *CC