§
     ’jc(  ã                   óh   — d dl Z d dlZd dlmZ d dlmZ  ej        e¦  «        Z G d„ d¦  «        Z	dS )é    N)Údeepcopy)ÚAnyc                   óŠ   — e Zd Zdd„Zdedeeef         fd„Zdeeef         deeef         fd„Zdededefd	„Z	dedefd
„Z
dS )ÚMultiAgentTakeoffDebateEngineNc                 ó"   — || _         || _        d S ©N)Ú_erp_clientÚ_llm_client)ÚselfÚ
erp_clientÚ
llm_clients      úCC:\Projects\DSCons\app\modules\takeoff\application\debate_engine.pyÚ__init__z&MultiAgentTakeoffDebateEngine.__init__
   s   € Ø%ˆÔØ%ˆÔÐÐó    Úbase_parsedÚreturnc              ‹   ód  K  — t                                d¦  «         t          |                     dg ¦  «        ¦  «        }t          |                     dg ¦  «        ¦  «        }d}d}t	          | dd¦  «        �r	 d|                     d¦  «        › d	t          j        |d
¬¦  «        dd…         › d�}| j                             d|dœgdd¬¦  «        ƒ d{V —†}|�r	d|v rG| 	                    d¦  «        d          	                    d¦  «        d          
                    ¦   «         }	nFd|v r.| 	                    d¦  «        d          
                    ¦   «         }	n| 
                    ¦   «         }		 t          j        |	¦  «        }
t          |
t          ¦  «        r|                     |
¦  «         d}n6# t          $ r)}t                                d|› �¦  «         d}Y d}~nd}~ww xY wn4# t          $ r'}t                                d|› �¦  «         Y d}~nd}~ww xY w	 d}| j                             d|dœgdd¬¦  «        ƒ d{V —†}|r| 
                    ¦   «         }n4# t          $ r'}t                                d|› �¦  «         Y d}~nd}~ww xY wt#          d„ |D ¦   «         ¦  «        s|                     d d!d"d#dd$d$d%d&œ¦  «         dd'lm}  |t	          | d(d¦  «        ¬)¦  «        }|D ]¼}|                     d*d+¦  «        }t+          |                     d,d¦  «        ¦  «        }|dk    r	|d-z  |d,<   nA|r?|                     |d.d/d0¬1¦  «        }t+          |                     d2d0¦  «        ¦  «        |d,<   t+          |                     d3d¦  «        ¦  «        }||d,         z  |d4<   Œ½|||d5œ||d5œd6œS )7u    
        Giai Ä‘oáº¡n 1: Quá»³nh, LÃ¢m, Tuáº¥n bÃ³c tÃ¡ch Ä‘á»™c láº­p.
        Sá»­ dá»¥ng LLM thá»±c Ä‘á»ƒ sinh logic sá»­a Ä‘á»•i thay vÃ¬ hardcode.
        uE   [DEBATE] Báº¯t Ä‘áº§u vÃ²ng Blind Takeoff Ä‘a mÃ´ hÃ¬nh (LLM thá»±c).Úitemsu+   Ä�Ã£ bá»• sung cÃ¡c biá»‡n phÃ¡p thi cÃ´ng.u%   Ä�Ã£ tháº©m Ä‘á»‹nh láº¡i Ä‘Æ¡n giÃ¡.r
   NuQ   Báº¡n lÃ  AI LÃ¢m, Ká»¹ sÆ° Biá»‡n phÃ¡p thi cÃ´ng cáº¥p cao. Báº£n váº½ loáº¡i: Údrawing_typeu4   . Danh sÃ¡ch cÃ¡c háº¡ng má»¥c hiá»‡n táº¡i (JSON): F)Úensure_asciii¸  uP  ... Nhiá»‡m vá»¥: Tráº£ vá»� 1 Ä‘oáº¡n JSON Má»šI chá»©a cÃ¡c háº¡ng má»¥c BIá»†N PHÃ�P THI CÃ”NG (vÃ­ dá»¥ Ä‘Ãª quai, mÃ¡y bÆ¡m, giÃ n giÃ¡o...) cáº§n Bá»” SUNG vÃ o danh sÃ¡ch. Chá»‰ tráº£ vá»� danh sÃ¡ch cÃ¡c object JSON má»›i, khÃ´ng giáº£i thÃ­ch. Náº¿u khÃ´ng cáº§n, tráº£ vá»� []. Máº£ng JSON báº¯t buá»™c náº±m trong ```json ```Úuser©ÚroleÚcontentzanthropic/claude-fable-5Úlam©ÚmodelÚ
agent_codez```jsoné   z```r   uf   Ä�Ã£ tá»± Ä‘á»™ng nháº­n diá»‡n vÃ  bá»• sung cÃ¡c háº¡ng má»¥c thi cÃ´ng phá»¥ trá»£ tá»« báº£n váº½.u&   KhÃ´ng thá»ƒ parse JSON tá»« AI LÃ¢m: uO   Gáº·p khÃ³ khÄƒn khi xuáº¥t Ä‘á»‹nh dáº¡ng JSON, sá»­ dá»¥ng káº¿t quáº£ gá»‘c.u   Lá»—i gá»�i LLM AI LÃ¢m: u6  Báº¡n lÃ  AI Tuáº¥n, Ká»¹ sÆ° Dá»± toÃ¡n Ä�á»‹nh má»©c (Thá»‹ trÆ°á»�ng). Nhiá»‡m vá»¥: Tráº£ vá»� cÃ¢u bÃ¬nh luáº­n (string) giáº£i thÃ­ch cÃ¡ch báº¡n sáº½ Ä‘iá»�u chá»‰nh Ä‘Æ¡n giÃ¡ cÃ¡t vÃ  bÃª tÃ´ng theo thá»‹ trÆ°á»�ng hiá»‡n hÃ nh, khÃ´ng cáº§n Ä‘á»‹nh dáº¡ng JSON. Chá»‰ tráº£ lá»�i 1 cÃ¢u ngáº¯n gá»�n.zopenai/gpt-5.6-solÚtuanu   Lá»—i gá»�i LLM AI Tuáº¥n: c              3   ó`   K  — | ])}d t          |                     dd¦  «        ¦  «        v V — Œ*dS )ÚTEMPÚwbs_codeÚ N)ÚstrÚget©Ú.0Úis     r   ú	<genexpr>zCMultiAgentTakeoffDebateEngine.run_blind_takeoffs.<locals>.<genexpr>U   s=   è è € ÐKÐK¸A�6�S §¢ z°2Ñ!6Ô!6Ñ7Ô7Ð7ÐKÐKÐKÐKÐKÐKr   zTEMP-01z	TT.TEMP01uH   Ä�Ãª quai, rÃ£nh tiÃªu thoÃ¡t nÆ°á»›c vÃ  bÆ¡m háº¡ má»±c nÆ°á»›c ngáº§mu   gÃ³ii@x}Úsafety_method)r#   Ú	norm_codeÚ	item_nameÚunitÚquantityÚunit_price_vndÚtotal_amount_vndÚcategory)ÚPricingResolverServicer	   )r   r-   r$   r0   gÍÌÌÌÌÌð?u   BÃ³c tÃ¡ch há»‡ thá»‘ngu   Váº­t liá»‡ui † )ÚkeywordÚcontextÚmaterial_groupÚfallback_priceÚpricer/   r1   )r   Úai_report_message)Úquynhr   r    )ÚloggerÚinfor   r&   ÚgetattrÚjsonÚdumpsr
   ÚchatÚsplitÚstripÚloadsÚ
isinstanceÚlistÚextendÚ	ExceptionÚwarningÚanyÚappendÚCapp.modules.inventory.application.state_price_sync.pricing_resolverr3   ÚfloatÚresolve_material_price_sync)r   r   Úcontext_kwargsÚ	lam_itemsÚ
tuan_itemsÚlam_messageÚtuan_messageÚ
lam_promptÚres_lamÚjson_strÚ	new_itemsÚparse_eÚeÚtuan_promptÚres_tuanr3   ÚresolverÚitemÚkwÚ
orig_priceÚresolvedÚqtys                         r   Úrun_blind_takeoffsz0MultiAgentTakeoffDebateEngine.run_blind_takeoffs   sù  è è € õ 	�ŠÐ[Ñ\Ô\Ð\å˜[Ÿ_š_¨W°bÑ9Ô9Ñ:Ô:ˆ	Ý˜kŸošo¨g°rÑ:Ô:Ñ;Ô;ˆ
àCˆØ>ˆå�4˜¨Ñ-Ô-ñ 5	Bð#@ðuØ*5¯/ª/¸.Ñ*IÔ*Iðuð uåIMÌÐT]ÐlqÐIrÑIrÔIrÐsxÐtxÐsxÔIyðuð uð uð ð !%Ô 0× 5Ò 5Ø$°Ð<Ð<Ð=Ø4Ø$ð !6ñ !ô !ð ð ð ð ð ð �ð ñ Ø  GÐ+Ð+Ø#*§=¢=°Ñ#;Ô#;¸AÔ#>×#DÒ#DÀUÑ#KÔ#KÈAÔ#N×#TÒ#TÑ#VÔ#V˜˜Ø 'Ð)Ð)Ø#*§=¢=°Ñ#7Ô#7¸Ô#:×#@Ò#@Ñ#BÔ#B˜˜à#*§=¢=¡?¤?˜ð	Ý$(¤J¨xÑ$8Ô$8˜	Ý% iµÑ6Ô6ð SØ%×,Ò,¨YÑ7Ô7Ð7ð +S˜KøøÝ$ð ð ð ÝŸšÐ'YÐPWÐ'YÐ'YÑZÔZÐZàmð $˜˜˜˜˜øøøøðøøøøøõ ð @ð @ð @Ý—’Ð>¸1Ð>Ð>Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?øøøøð@øøøðBðCð ð "&Ô!1×!6Ò!6Ø$°Ð=Ð=Ð>Ø.Ø%ð "7ñ "ô "ð ð ð ð ð ð �ð
 ð 4Ø#+§>¢>Ñ#3Ô#3�LøøÝð Bð Bð BÝ—’Ð@¸QÐ@Ð@ÑAÔAÐAÐAÐAÐAÐAÐAøøøøðBøøøõ ÐKÐKÀÐKÑKÔKÑKÔKð 	Ø×Òà )Ø!,Ø!kØ"Ø !Ø&.Ø(0Ø /ð	ð 	ñô ð ð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð *Ð)µW¸TÀ=ÐRVÑ5WÔ5WÐXÑXÔXˆàð 	Dð 	DˆDØ—’˜+ rÑ*Ô*ˆBÝ˜tŸxšxÐ(8¸!Ñ<Ô<Ñ=Ô=ˆJØ˜AŠ~ˆ~Ø)3°dÑ):�Ð%Ñ&Ð&Øð NØ#×?Ò?ØØ5Ø#1Ø#)ð	 @ñ ô �õ */¨x¯|ª|¸GÀVÑ/LÔ/LÑ)MÔ)M�Ð%Ñ&å˜Ÿš ¨QÑ/Ô/Ñ0Ô0ˆCØ'*¨TÐ2BÔ-CÑ'CˆDÐ#Ñ$Ð$ð !Ø&¸[ÐIÐIØ(¸|ÐLÐLð
ð 
ð 	
s\   Á:C3G& Å.A F/ Æ.G& Æ/
G"Æ9GÇG& ÇG"Ç"G& Ç&
HÇ0HÈHÈ?I É
JÉ%JÊJÚblind_resultsc           	      ó¾  — t                                d¦  «         t          d„ |d         d         D ¦   «         ¦  «        }t          d„ |d         d         D ¦   «         ¦  «        }t          d„ |d         d         D ¦   «         ¦  «        }||z
  }||z
  }|||t          t	          |¦  «        t	          |¦  «        ¦  «        |pd	z  d
z  ||k    rdgng ||k    rdgng dœS )Nu*   [DEBATE] TÃ­nh toÃ¡n Ma tráº­n sai lá»‡ch.c              3   ó\   K  — | ]'}t          |                     d d¦  «        ¦  «        V — Œ(dS ©r1   r   N©rL   r&   r'   s     r   r*   zJMultiAgentTakeoffDebateEngine.calculate_variance_matrix.<locals>.<genexpr>…   sJ   è è € ð 
ð 
Ø45�E�!—%’%Ð*¨AÑ.Ô.Ñ/Ô/ð
ð 
ð 
ð 
ð 
ð 
r   r:   r   c              3   ó\   K  — | ]'}t          |                     d d¦  «        ¦  «        V — Œ(dS re   rf   r'   s     r   r*   zJMultiAgentTakeoffDebateEngine.calculate_variance_matrix.<locals>.<genexpr>ˆ   sJ   è è € ð 
ð 
Ø45�E�!—%’%Ð*¨AÑ.Ô.Ñ/Ô/ð
ð 
ð 
ð 
ð 
ð 
r   r   c              3   ó\   K  — | ]'}t          |                     d d¦  «        ¦  «        V — Œ(dS re   rf   r'   s     r   r*   zJMultiAgentTakeoffDebateEngine.calculate_variance_matrix.<locals>.<genexpr>‹   sJ   è è € ð 
ð 
Ø45�E�!—%’%Ð*¨AÑ.Ô.Ñ/Ô/ð
ð 
ð 
ð 
ð 
ð 
r   r    r   éd   u   Biá»‡n phÃ¡p bá»• sungu   Váº­t tÆ° thá»‹ trÆ°á»�ng)Úquynh_totalÚ	lam_totalÚ
tuan_totalÚmax_variance_percentÚmissing_itemsÚprice_deviations)r;   r<   ÚsumÚmaxÚabs)r   rb   rj   rk   rl   Údiff_lamÚ	diff_tuans          r   Úcalculate_variance_matrixz7MultiAgentTakeoffDebateEngine.calculate_variance_matrix�   sL  € õ 	�ŠÐ@ÑAÔAÐAÝð 
ð 
Ø9FÀwÔ9OÐPWÔ9Xð
ñ 
ô 
ñ 
ô 
ˆõ ð 
ð 
Ø9FÀuÔ9MÈgÔ9Vð
ñ 
ô 
ñ 
ô 
ˆ	õ ð 
ð 
Ø9FÀvÔ9NÈwÔ9Wð
ñ 
ô 
ñ 
ô 
ˆ
ð ˜{Ñ*ˆØ Ñ,ˆ	ð 'Ø"Ø$Ý$'­¨H©¬µs¸9±~´~Ñ$FÔ$FØÐ˜añ%!àñ%ð <EÈÒ;SÐ;SÐ6Ð7Ð7ÐY[à˜[Ò(Ð(ð "=Ð =Ð =àð
ð 
ð 	
r   Úvariance_matrixc              ƒ   óŠ  K  — t                                d¦  «         g }|d         d         }|d         d         }|d         d         }|D ]}|                     |¦  «         Œd„ |D ¦   «         }|D ]N}	t          |	                     dd¦  «        ¦  «                             ¦   «         |vr|                     |	¦  «         ŒOt          d	„ |D ¦   «         ¦  «        }
d
|d         d›d|
d›d�}t          | dd ¦  «        rt	 d|d         d         › d|d         d         › d|
d›d�}| j         	                    d|dœgdd¬¦  «        ƒ d {V —†}|r| 
                    ¦   «         }n# t          $ r Y nw xY wd|d         d         dœd|d         d         dœd|dœg}t          |d         ¦  «        }||d<   ||d<   ||d<   d |d!<   d"|d#<   |S )$Nu2   [DEBATE] AI TÃ¹ng (Trá»�ng tÃ i) ra phÃ¡n quyáº¿t.r:   r   r    r   c                 óx   — h | ]7}t          |                     d d¦  «        ¦  «                             ¦   «         ’Œ8S )r-   r$   )r%   r&   Úlowerr'   s     r   ú	<setcomp>zCMultiAgentTakeoffDebateEngine.supervisor_verdict.<locals>.<setcomp>®   s:   € ÐRÐRÐRÀ!�#˜aŸeše K°Ñ4Ô4Ñ5Ô5×;Ò;Ñ=Ô=ÐRÐRÐRr   r-   r$   c              3   ó\   K  — | ]'}t          |                     d d¦  «        ¦  «        V — Œ(dS re   rf   r'   s     r   r*   zCMultiAgentTakeoffDebateEngine.supervisor_verdict.<locals>.<genexpr>³   s9   è è € ÐRÐRÀ�˜qŸušuÐ%7¸Ñ;Ô;Ñ<Ô<ÐRÐRÐRÐRÐRÐRr   u+   Ä�Ã£ tá»•ng há»£p chÃ©o. Dá»± toÃ¡n gá»‘c: rj   z,.0fuT    VND. Dá»± toÃ¡n sau khi Ã¡p Ä‘Æ¡n giÃ¡ thá»‹ trÆ°á»�ng vÃ  biá»‡n phÃ¡p thi cÃ´ng: u    VND. Há»“ sÆ¡ há»£p lá»‡.r
   uJ   Báº¡n lÃ  AI TÃ¹ng, GiÃ¡m Ä‘á»‘c Ká»¹ thuáº­t. Nháº­n xÃ©t cá»§a AI LÃ¢m: r9   u    Nháº­n xÃ©t cá»§a AI Tuáº¥n: u!    Tá»•ng dá»± toÃ¡n cuá»‘i cÃ¹ng: uw    VND. HÃ£y Ä‘Æ°a ra 1 cÃ¢u phÃ¡n quyáº¿t duy nháº¥t, chuyÃªn nghiá»‡p Ä‘á»ƒ chá»‘t sá»‘ liá»‡u dá»± toÃ¡n cuá»‘i cÃ¹ng.r   r   zanthropic/claude-opus-4.8Útungr   u   AI LÃ¢m (Biá»‡n phÃ¡p))ÚspeakerÚmessageu   AI Tuáº¥n (Ä�á»‹nh má»©c)u   AI TÃ¹ng (Trá»�ng tÃ i)Údebate_audit_trailÚai_analysis_notesÚmulti_agent_verifiedÚconfidence_leveléc   Úconfidence_score)r;   r<   rJ   r%   r&   ry   rp   r=   r
   r@   rB   rG   r   )r   rb   rv   Úfinal_itemsÚquynh_itemsrP   rO   Út_itemÚexisting_namesÚl_itemÚ
final_costÚtung_messageÚtung_promptÚres_tungÚaudit_trailÚverdicts                   r   Úsupervisor_verdictz0MultiAgentTakeoffDebateEngine.supervisor_verdictŸ   sÔ  è è € õ 	�ŠÐHÑIÔIÐIàˆØ# GÔ,¨WÔ5ˆØ" 6Ô*¨7Ô3ˆ
Ø! %Ô(¨Ô1ˆ	ð !ð 	'ð 	'ˆFØ×Ò˜vÑ&Ô&Ð&Ð&ð SÐRÀzÐRÑRÔRˆØð 	+ð 	+ˆFÝ�6—:’:˜k¨2Ñ.Ô.Ñ/Ô/×5Ò5Ñ7Ô7¸~ÐMÐMØ×"Ò" 6Ñ*Ô*Ð*øåÐRÐRÀkÐRÑRÔRÑRÔRˆ
ð jÀ_ÐUbÔEcð  jð  jð  jð  Ið  jð  jð  jð  jˆå�4˜¨Ñ-Ô-ð 	ððIØ2?ÀÔ2FÐGZÔ2[ðIð Ià4AÀ&Ô4IÐJ]Ô4^ðIð Ið 8BÐNðIð Ið Ið ð "&Ô!1×!6Ò!6Ø$°Ð=Ð=Ð>Ø5Ø%ð "7ñ "ô "ð ð ð ð ð ð �ð
 ð 4Ø#+§>¢>Ñ#3Ô#3�LøøÝð ð ð Ø�ðøøøð
 4Ø(¨Ô/Ð0CÔDðð ð
 7Ø(¨Ô0Ð1DÔEðð ð 2¸lÐKÐKð

ˆõ ˜=¨Ô1Ñ2Ô2ˆØ&ˆ�ÑØ(3ˆÐ$Ñ%Ø'3ˆÐ#Ñ$Ø&<ˆÐ"Ñ#Ø&(ˆÐ"Ñ#àˆs   Ã<A"E Å
E,Å+E,c              ‹   ó”   K  —  | j         |fi |¤Žƒ d {V —†}|                      |¦  «        }|                      ||¦  «        ƒ d {V —†}|S r   )ra   ru   r�   )r   r   Úkwargsrb   rv   r�   s         r   Úexecute_debatez,MultiAgentTakeoffDebateEngine.execute_debateß   sq   è è € Ø5˜dÔ5°kÐLÐLÀVÐLÐLÐLÐLÐLÐLÐLÐLˆØ×8Ò8¸ÑGÔGˆØ×/Ò/°¸ÑOÔOÐOÐOÐOÐOÐOÐOˆØˆr   )NN)Ú__name__Ú
__module__Ú__qualname__r   Údictr%   ra   r   ru   r�   r“   © r   r   r   r   	   sÞ   € € € € € ð&ð &ð &ð &ðq
Øðq
à	ˆc�4ˆiŒðq
ð q
ð q
ð q
ðf
Ø! # t )œ_ð
à	ˆc�3ˆhŒð
ð 
ð 
ð 
ð<>Ø!ð>Ø48ð>à	ð>ð >ð >ð >ð@°ð À4ð ð ð ð ð ð r   r   )
r>   ÚloggingÚcopyr   Útypingr   Ú	getLoggerr”   r;   r   r˜   r   r   ú<module>r�      s‰   ðØ €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ðZð Zð Zð Zð Zñ Zô Zð Zð Zð Zr   