§
    ^ ’jÉ  ã                  óª   — d dl mZ 	 d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZ ddlmZmZ  ej        d¦  «        Z G d	„ d
¦  «        ZdS )é    )ÚannotationsN)ÚAsyncGenerator)ÚAny)Úformat_sse_eventé   )Úbuild_quynh_fallback_responseÚbuild_quynh_system_promptzdscons.takeoff.learning_memoryc                  ó6   — e Zd ZdZdd„Z	 	 ddd„Z	 	 ddd„ZdS )ÚTakeoffLearningMemoryEngineuO   Engine handling interactive training and real-time reasoning for AI Quá»³nh QS.Ú
erp_clientr   Ú
llm_clientc                ó"   — || _         || _        d S )N)Ú_erp_clientÚ_llm_client)Úselfr   r   s      úEC:\Projects\DSCons\app\modules\takeoff\application\learning_memory.pyÚ__init__z$TakeoffLearningMemoryEngine.__init__   s   € Ø%ˆÔØ%ˆÔÐÐó    õ   Ká»¹ SÆ° TrÆ°á»Ÿng QSFÚ
takeoff_idÚstrÚuser_messageÚcurrent_user_nameÚ
auto_applyÚboolÚreturnúdict[str, Any]c              ƒ  ó6  K  — | j                              |¦  «        }|st          d¦  «        ‚| j                              |¦  «        pg }|                     d¦  «        pd}| j                              |d||¬¦  «         d                     d„ t          |¦  «        D ¦   «         ¦  «        }t          ¦   «         }	d|                     d	¦  «        › d
|                     d¦  «        › d|› d|› d|› d|› d�}
d }	 t          j
                             d¦  «        rdnd}t          j        | j                             d|	dœd|
dœgddddddiddœ¬¦  «        |¬¦  «        ƒ d {V —†}|d          d!         d"                              d#¦  «        pd$}t          j        d%|t          j        ¦  «        }|r't%          j        |                     d&¦  «        ¦  «        }n2# t*          $ r%}t,                               d'|¦  «         Y d }~nd }~ww xY w|st1          ||||¬(¦  «        }|                     d)¦  «        pd*}|                     d+¦  «        pg }|                     d,¦  «        pg }g }|D ]5}d-„ |                     ¦   «         D ¦   «         }|                     |¦  «         Œ6	 d!d.lm}  |¦   «         }|                     |||¬/¦  «        }n2# t*          $ r%}t,                               d0|¦  «         Y d }~nd }~ww xY wg }|D ]“}| j                              |                     d¦  «        p||                     d1¦  «        pd2|                     d3¦  «        p	|d d4…         |                     d5¦  «        p|||¬6¦  «        }|                     |¦  «         Œ”| j                              |d7d8||||¬9¦  «        }|r2|r0| j                               ||tC          |d:         ¦  «        ¬;¦  «         d<||tC          |d:         ¦  «        ||||r|d!         nd tE          |¦  «        ||d=œS )>Nu1   KhÃ´ng tÃ¬m tháº¥y há»“ sÆ¡ bÃ³c tÃ¡ch báº£n váº½Údrawing_typeÚgeneralÚuser)r   Úsender_roleÚsender_nameÚmessage_textú
c                óâ  — g | ]ì\  }}d |                      d|dz   ¦  «        › d|                      dd¦  «        › d|                      dd¦  «        › d|                      d	¦  «        › d
|                      d¦  «        › d|                      d¦  «        › d|                      d¦  «        › d|                      d¦  «        › d|                      d¦  «        d›d|                      d¦  «        d›d�‘ŒíS )z- STT Ú
item_orderr   z: [Úwbs_codeÚ z] [Ú	norm_codez] Ú	item_nameu
    | NhÃ³m: Úcategoryu    | CÃ´ng thá»©c: Údimension_formulau	    | Ä�VT: Úunitz | KL: Úquantityu    | Ä�Æ¡n giÃ¡: Úunit_price_vndú,u    Ä‘ | ThÃ nh tiá»�n: Útotal_amount_vndu    Ä‘)Úget)Ú.0ÚidxÚis      r   ú
<listcomp>zCTakeoffLearningMemoryEngine.chat_train_ai_quynh.<locals>.<listcomp>1   s  € ð ð ð á�C˜ð ^˜Ÿš˜|¨S°1©WÑ5Ô5ð  ^ð  ^¸!¿%º%À
ÈBÑ:OÔ:Oð  ^ð  ^ÐTU×TYÒTYÐZeÐgiÑTjÔTjð  ^ð  ^Ðno×nsÒnsÐtñ  oAô  oAð  ^ð  ^ð  MN÷  MRò  MRð  S]ñ  M^ô  M^ð  ^ð  ^ð  qr÷  qvò  qvð  wJñ  qKô  qKð  ^ð  ^ð  VW÷  V[ò  V[ð  \bñ  Vcô  Vcð  ^ð  ^ð  lm÷  lqò  lqð  r|ñ  l}ô  l}ð  ^ð  ^ð  NO÷  NSò  NSð  Tdñ  Neô  Neð  ^ð  ^ð  ^ð  ~÷  ~Cò  ~Cð  DVñ  ~Wô  ~Wð  ^ð  ^ð  ^ð  ^ðð ð r   u   Báº¢N Váº¼: Údrawing_codez - Údrawing_titleu   
LOáº I CÃ”NG TRÃŒNH: u   
DANH Má»¤C BOQ HIá»†N Táº I:
u)   

Ã� KIáº¾N CHá»ˆ Ä�áº O Cá»¦A Ká»¸ SÆ¯ (z):
"uz   "

HÃ£y tiáº¿p thu, hiá»‡u chá»‰nh danh má»¥c BoQ vÃ  Ä‘Ãºc káº¿t quy táº¯c kinh nghiá»‡m theo Ä‘Ãºng Ä‘á»‹nh dáº¡ng JSON.ÚPYTEST_CURRENT_TESTg       @g      N@Úsystem)ÚroleÚcontentzgoogle/gemini-3.1-pro-previewÚquynhgš™™™™™É?i €  Úthinking_budgeti @  Úhigh)Úthinking_configÚreasoning_effort)ÚmodelÚ
agent_codeÚtemperatureÚ
max_tokensÚ
extra_body)ÚtimeoutÚchoicesr   Úmessager=   r)   z(\{.*\})r   z([TAKEOFF] LLM chat training fallback: %s)r   r   Úcurrent_itemsr   Úreply_messageu<   Em Quá»³nh QS Ä‘Ã£ tiáº¿p thu vÃ  ghi nháº­n hiá»‡u chá»‰nh.Úsuggested_correctionsÚextracted_rulesc                óZ   — i | ](\  }}t          |¦  «        |d v rt          |¦  «        n|“Œ)S ))Úidr   )r   )r4   ÚkÚvs      r   ú
<dictcomp>zCTakeoffLearningMemoryEngine.chat_train_ai_quynh.<locals>.<dictcomp>l   sI   € ð ð ð á�A�qõ �A‘” 1Ð(<Ð#<Ð#<�˜Q™œ˜À!ðð ð r   )Úget_drawing_takeoff_service)r   r   z0[LEARNING] Non-critical normalization notice: %sr,   ÚallÚerror_patterné–   Úcorrection_rule)r   r,   rV   rX   Úlearned_from_userr   Ú	assistantu"   AI Quá»³nh (Ká»¹ SÆ° TrÆ°á»Ÿng QS))r   r"   r#   r$   rM   rN   ÚappliedrP   )r   Úsuggested_itemsÚ
message_idÚsuccess)ÚstatusrL   Úai_responser]   rM   Úsuggested_boq_itemsrN   Úlearned_rule_createdÚsaved_rules_countr[   Úapplied_to_takeoff)#r   Úget_drawing_takeoffÚ
ValueErrorÚlist_drawing_takeoff_itemsr3   Úsave_takeoff_chat_messageÚjoinÚ	enumerater	   ÚosÚenvironÚasyncioÚwait_forr   Úcreate_chat_completionÚreÚsearchÚDOTALLÚjsonÚloadsÚgroupÚ	ExceptionÚloggerÚwarningr   ÚitemsÚappendÚapp.modules.takeoff.applicationrT   Ú$apply_learned_rules_and_state_pricesÚdebugÚsave_takeoff_learned_ruleÚ apply_chat_suggested_correctionsr   Úlen)r   r   r   r   r   ÚtakeoffrK   r   Úitems_summaryÚsystem_promptÚuser_contentÚparsed_responseÚllm_timeoutÚrespÚraw_textÚ
json_matchÚeÚ
reply_textr\   rN   Úsanitized_itemsÚitmÚs_itmrT   Útakeoff_serviceÚnorm_errÚsaved_rulesÚrÚsaved_rÚassistant_msgs                                 r   Úchat_train_ai_quynhz/TakeoffLearningMemoryEngine.chat_train_ai_quynh   s¬  è è € ð Ô"×6Ò6°zÑBÔBˆØð 	RÝÐPÑQÔQÐQàÔ(×CÒCÀJÑOÔOÐUÐSUˆØ—{’{ >Ñ2Ô2Ð?°iˆàÔ×2Ò2Ø!ØØ)Ø%ð	 	3ñ 	
ô 	
ð 	
ð Ÿ	š	ðð å'¨Ñ6Ô6ðñ ô ñ
ô 
ˆõ 2Ñ3Ô3ˆðG˜7Ÿ;š; ~Ñ6Ô6ð Gð G¸7¿;º;ÀÑ;WÔ;Wð Gð GØ$0ðGð Gà-:ðGð Gð 7HðGð Gð O[ðGð Gð Gð 	ð ˆð	JÝ!#¤§¢Ð0EÑ!FÔ!FÐP˜#˜#ÈDˆKÝ Ô)ØÔ ×7Ò7à!)°mÐDÐDØ!'°LÐAÐAðð :Ø&Ø #Ø$à,=¸uÐ+EØ,2ð ð  ð 8ñ ô ð $ðñ ô ð ð ð ð ð ð ˆDð" ˜I” qÔ)¨)Ô4×8Ò8¸ÑCÔCÐIÀrˆHÝœ ;°½"¼)ÑDÔDˆJØð BÝ"&¤*¨Z×-=Ò-=¸aÑ-@Ô-@Ñ"AÔ"A�øøÝð 	Jð 	Jð 	JÝ�NŠNÐEÀqÑIÔIÐIÐIÐIÐIÐIÐIøøøøð	Jøøøð ð 	Ý;Ø)Ø"3Ø+Ø)ð	ñ ô ˆOð ×Ò Ñ0Ô0ð NØMð 	ð *×-Ò-Ð.EÑFÔFÐLÈ"ˆØ)×-Ò-Ð.?Ñ@Ô@ÐFÀBˆàˆØ"ð 	*ð 	*ˆCðð àŸIšI™KœKðñ ô ˆEð ×"Ò" 5Ñ)Ô)Ð)Ð)ð
	WØSÐSÐSÐSÐSÐSà9Ð9Ñ;Ô;ˆOØ-×RÒRØØ)Ø%ð Sñ ô ˆOˆOøõ
 ð 	Wð 	Wð 	WÝ�LŠLÐKÈXÑVÔVÐVÐVÐVÐVÐVÐVøøøøð	Wøøøð ˆØ ð 		(ð 		(ˆAØÔ&×@Ò@ØŸUšU >Ñ2Ô2ÐB°lØŸš˜zÑ*Ô*Ð3¨eØŸeše OÑ4Ô4ÐJ¸ÀTÀcÀTÔ8JØ !§¢Ð&7Ñ 8Ô 8Ð H¸LØ"3Ø%ð Añ ô ˆGð ×Ò˜wÑ'Ô'Ð'Ð'àÔ(×BÒBØ!Ø#Ø<Ø#Ø"1Ø+Øð Cñ 
ô 
ˆð ð 	˜/ð 	ØÔ×=Ò=Ø%Ø /Ý˜}¨TÔ2Ñ3Ô3ð >ñ ô ð ð  Ø'Ø%Ý˜m¨DÔ1Ñ2Ô2Ø%4Ø#2Ø.Ø6AÐ$K K°¤N NÀtÝ!$ [Ñ!1Ô!1Ø!Ø",ð
ð 
ð 	
s1   Ã7CG Ç
HÇG>Ç>HÊ(K Ë
K3ËK.Ë.K3úAsyncGenerator[str, None]c               ó@  K  — t          ddddœ¦  «        W V — t          j        d¦  «        ƒ d {V —† |                      ||||¬¦  «        ƒ d {V —†}|                     d¦  «        pd}|                     d¦  «        }d	}t          d
t          |¦  «        |¦  «        D ]l}	d                     ||	|	|z   …         ¦  «        }
|	|z   t          |¦  «        k     r|
dz  }
t          dd|
i¦  «        W V — t          j        d¦  «        ƒ d {V —† Œmt          d|¦  «        W V — d S )NÚthinkingu   AI Quá»³nh Ä‘ang Ä‘á»‘i soÃ¡t báº£n váº½ ká»¹ thuáº­t, tra cá»©u Ä‘á»‹nh má»©c xÃ¢y dá»±ng 2026 vÃ  phÃ¢n tÃ­ch chá»‰ Ä‘áº¡o...)r_   Útextg{®Gáz´?)r   r   r   r   rL   r)   ú é   r   ÚdeltaÚchunkg¸…ëQ¸ž?Úcomplete)	r   rm   Úsleepr•   r3   ÚsplitÚranger€   ri   )r   r   r   r   r   Úresr‹   ÚwordsÚ
chunk_sizer6   r�   s              r   Úchat_train_ai_quynh_streamz6TakeoffLearningMemoryEngine.chat_train_ai_quynh_stream©   s—  è è € õ Øà$ð Zðð ñ
ô 
ð 	
ð 	
ð 	
ð 	
õ Œm˜DÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!à×,Ò,Ø!Ø%Ø/Ø!ð	 -ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð —W’W˜_Ñ-Ô-Ð3°ˆ
Ø× Ò  Ñ%Ô%ˆØˆ
Ý�q�#˜e™*œ* jÑ1Ô1ð 	&ð 	&ˆAØ—H’H˜U 1 q¨:¡~Ð#5Ô6Ñ7Ô7ˆEØ�:‰~¥ E¡
¤
Ò*Ð*Ø˜‘�Ý" 7¨W°eÐ,<Ñ=Ô=Ð=Ð=Ð=Ð=Ý”- Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%å˜z¨3Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/r   N)r   r   r   r   )r   F)
r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r–   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r•   r¥   © r   r   r   r      sv   € € € € € ØYÐYð&ð &ð &ð &ð "9Ø ðL
ð L
ð L
ð L
ð L
ðd "9Ø ð!0ð !0ð !0ð !0ð !0ð !0ð !0r   r   )Ú
__future__r   rm   rs   Úloggingrk   rp   Úcollections.abcr   Útypingr   Úapp.common.sser   Úlearning_promptsr   r	   Ú	getLoggerrw   r   rª   r   r   ú<module>r²      sä   ðØ "Ð "Ð "Ð "Ð "Ð "à Dà €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð à +Ð +Ð +Ð +Ð +Ð +à VÐ VÐ VÐ VÐ VÐ VÐ VÐ Và	ˆÔ	Ð;Ñ	<Ô	<€ðv0ð v0ð v0ð v0ð v0ñ v0ô v0ð v0ð v0ð v0r   