§
    6´›jö(  ã                  óp   — d dl mZ d dlZd dlZd dlmZ d dlZ ej        d¦  «        Z G d„ d¦  «        Z	dS )é    )ÚannotationsN)ÚAnyz#dscons.document_processing.analyzerc                  ó"   — e Zd ZdZdd„Zdd„ZdS )ÚDocumentAnalyzerMixinzFLLM-based document analysis, metadata extraction, and version diffing.ÚtextÚstrÚfilenameÚreturnúdict[str, Any]c              ƒ  ó˜  K  — ddl m} |                     |dd…         ¦  «        \  }}d}d|› d|› �}d|d	œd
|d	œg}	 | j                             |d¬¦  «        ƒ d{V —†}	t
                               d|	¦  «         |	                     ¦   «         }
|
                     d¦  «        }
|
                     d¦  «        }
|
 	                    d¦  «        }
|
                     ¦   «         }
| 
                    |
¦  «        \  }}}ddl}|                     d|¦  «        }|r|                     d¦  «        n|}t          j        |d¬¦  «        }t!          |t"          ¦  «        r.|                      |                     d¦  «        |¦  «        |d<   |S 	 t)          j        |¦  «        }t!          |t"          ¦  «        r.|                      |                     d¦  «        |¦  «        |d<   |S n# t,          $ r Y nw xY wn3# t,          $ r&}t
                               d||¦  «         Y d}~nd}~ww xY w|                      ||¦  «        }dddddddd|dddddg dœS )z]Ask LLM to classify document group/type, stage, signature status, and extract fields as JSON.r   )ÚAgentSecurityGuardNip  uz  Báº¡n lÃ  ChuyÃªn viÃªn PhÃ¡p lÃ½ & Há»“ sÆ¡ CÃ´ng trÃ¬nh (Persona Tháº£o) táº¡i CÃ´ng ty TNHH XÃ¢y Dá»±ng Ä�á»‹nh SÆ¡n.
Nhiá»‡m vá»¥ cá»§a báº¡n lÃ  Ä‘á»�c ká»¹ vÄƒn báº£n cÃ´ng trÃ¬nh / thÃ´ng bÃ¡o má»�i tháº§u / quyáº¿t Ä‘á»‹nh / há»£p Ä‘á»“ng vÃ  trÃ­ch xuáº¥t Ä‘áº§y Ä‘á»§ cÃ¡c trÆ°á»�ng thÃ´ng tin vÃ o Ä‘Ãºng cáº¥u trÃºc JSON sau:

QUY Táº®C BÃ“C TÃ�CH:
1. document_code: MÃ£ sá»‘ vÄƒn báº£n, sá»‘ quyáº¿t Ä‘á»‹nh hoáº·c MÃ£ TBMT (vÃ­ dá»¥: 'IB2600471890', '87/QÄ�-TTDVSNC', '12/2026/HÄ�-Ä�S', '01/2026/TM-Ä�S'). KhÃ´ng Ä‘á»ƒ trá»‘ng náº¿u vÄƒn báº£n cÃ³ mÃ£.
2. document_title: TrÃ­ch yáº¿u nghiá»‡p vá»¥ Ä‘áº§y Ä‘á»§ (vÃ­ dá»¥: 'ThÃ´ng bÃ¡o má»�i tháº§u - GÃ³i tháº§u sá»‘ 05: GÃ³i tháº§u xÃ¢y láº¯p (Dá»± Ã¡n XÃ¢y dá»±ng cá»‘ng há»™p Ä‘oáº¡n tá»« nhÃ  Ã´ng Ä�Ã¨n Ä‘áº¿n nhÃ  bÃ  Lanh thÃ´n Phong Cáº§u, xÃ£ Kiáº¿n Minh)').
3. issuer_name: TÃªn Ä‘Æ¡n vá»‹ ban hÃ nh hoáº·c Chá»§ Ä‘áº§u tÆ° (vÃ­ dá»¥: 'Trung tÃ¢m Dá»‹ch vá»¥ sá»± nghiá»‡p cÃ´ng xÃ£ Kiáº¿n Minh').
4. partner_name: TÃªn Ä‘á»‘i tÃ¡c hoáº·c Chá»§ Ä‘áº§u tÆ° liÃªn quan.
5. issue_date: NgÃ y ban hÃ nh hoáº·c ngÃ y Ä‘Äƒng táº£i Ä‘á»‹nh dáº¡ng YYYY-MM-DD (vÃ­ dá»¥: '2026-08-22').
6. summary_content: TÃ³m táº¯t 2-3 cÃ¢u chi tiáº¿t vá»� gÃ³i tháº§u/vÄƒn báº£n: tÃªn dá»± Ã¡n, thá»�i gian thi cÃ´ng, giÃ¡ trá»‹ báº£o Ä‘áº£m, hÃ¬nh thá»©c Ä‘áº¥u tháº§u, thá»�i Ä‘iá»ƒm Ä‘Ã³ng/má»Ÿ tháº§u.
7. document_group: 'legal' (phÃ¡p lÃ½, thÃ´ng bÃ¡o, tá»� trÃ¬nh, quyáº¿t Ä‘á»‹nh) | 'contract' (há»£p Ä‘á»“ng, phá»¥ lá»¥c, bÃ¡o giÃ¡, há»“ sÆ¡ tháº§u) | 'technical' (thuyáº¿t minh, báº£n váº½, BPTC, chá»‰ dáº«n) | 'site' (biÃªn báº£n nghiá»‡m thu, hiá»‡n trÆ°á»�ng, nháº­t kÃ½, thÃ­ nghiá»‡m) | 'financial' (á»§y nhiá»‡m chi, sao kÃª ngÃ¢n hÃ ng, giáº¥y bÃ¡o ná»£/cÃ³, hÃ³a Ä‘Æ¡n, thanh toÃ¡n Ä‘á»£t IPC, quyáº¿t toÃ¡n) | 'other'.
8. document_type: Chá»�n mÃ£ ngáº¯n chuáº©n: 'CV' (CÃ´ng vÄƒn), 'QÄ�' (Quyáº¿t Ä‘á»‹nh), 'TB' (ThÃ´ng bÃ¡o), 'TTr' (Tá»� trÃ¬nh), 'THU' (ThÆ° tá»«), 'GUQ' (Giáº¥y á»§y quyá»�n), 'HÄ�' (Há»£p Ä‘á»“ng), 'PLHÄ�' (Phá»¥ lá»¥c HÄ�), 'BG' (BÃ¡o giÃ¡/ChÃ o giÃ¡), 'HSMT' (Há»“ sÆ¡ má»�i tháº§u), 'HSDT' (Há»“ sÆ¡ dá»± tháº§u), 'TM' (Thuyáº¿t minh/Dá»± toÃ¡n sÆ¡ bá»™), 'BV' (Báº£n váº½ ká»¹ thuáº­t), 'BPTC' (Biá»‡n phÃ¡p thi cÃ´ng), 'CDKT' (Chá»‰ dáº«n ká»¹ thuáº­t), 'BB' (BiÃªn báº£n), 'BBNT' (Nghiá»‡m thu), 'NK' (Nháº­t kÃ½), 'TN' (ThÃ­ nghiá»‡m), 'KCS' (Kiá»ƒm tra váº­t tÆ°), 'UNC' (á»¦y nhiá»‡m chi), 'SK' (Sao kÃª ngÃ¢n hÃ ng), 'GBN' (Giáº¥y bÃ¡o Ná»£/CÃ³), 'HDDT' (HÃ³a Ä‘Æ¡n), 'IPC' (Thanh toÃ¡n Ä‘á»£t), 'QT' (Quyáº¿t toÃ¡n), hoáº·c 'KHAC'.
9. signature_status: 'fully_executed' (náº¿u lÃ  vÄƒn báº£n Ä‘iá»‡n tá»­ e-GP hoáº·c cÃ³ chá»¯ kÃ½/con dáº¥u) | 'signed_unsigned_seal' | 'draft'.
10. TUYá»†T Ä�á»�I KHÃ”NG tá»± chÃ¨n cÃ¡c tá»« khÃ³a an toÃ n/báº£o máº­t há»‡ thá»‘ng (nhÆ° 'báº£o máº­t', 'an toÃ n', 'zero-trust', 'cáº£nh bÃ¡o', 'untrusted') vÃ o báº¥t ká»³ trÆ°á»�ng nÃ o.

Cáº¥u trÃºc JSON báº¯t buá»™c:
{
  "document_code": "...",
  "document_title": "...",
  "document_group": "legal",
  "document_type": "TB",
  "signature_status": "fully_executed",
  "document_direction": "incoming",
  "project_stage": "stage_01_initiation",
  "partner_name": "...",
  "partner_tax_code": null,
  "issuer_name": "...",
  "signer_name": null,
  "issue_date": "YYYY-MM-DD",
  "summary_content": "...",
  "ai_risk_assessment": "...",
  "ai_legal_references": ["..."]
}
LÆ°u Ã½: Chá»‰ tráº£ vá»� chuá»—i JSON thÃ´ báº¯t Ä‘áº§u báº±ng { vÃ  káº¿t thÃºc báº±ng }.u   TÃªn file gá»‘c: u   
Ná»™i dung vÄƒn báº£n:
Úsystem©ÚroleÚcontentÚuserÚthao©Ú
agent_codezRaw LLM Response: %sú```jsonú```z\{[\s\S]*\}T©Úreturn_objectsÚdocument_titlez*Failed to analyze document %s with LLM: %sÚdispatchÚCVÚdraftÚincomingÚstage_01_initiationuF   KhÃ´ng thá»ƒ phÃ¢n tÃ­ch ná»™i dung vÄƒn báº£n tá»± Ä‘á»™ng báº±ng AI.u+   Lá»—i phÃ¢n tÃ­ch cÃº phÃ¡p káº¿t quáº£ AI.)Údocument_groupÚdocument_typeÚsignature_statusÚdocument_directionÚproject_stageÚpartner_nameÚpartner_tax_codeÚdocument_coder   Ú
issue_dateÚissuer_nameÚsigner_nameÚsummary_contentÚai_risk_assessmentÚai_legal_references)Ú3app.modules.agents.application.agent_security_guardr   Úsanitize_untrusted_inputÚ_llm_clientÚchatÚloggerÚinfoÚstripÚremoveprefixÚremovesuffixÚinspect_output_dlpÚreÚsearchÚgroupÚjson_repairÚrepair_jsonÚ
isinstanceÚdictÚsanitize_document_titleÚgetÚjsonÚloadsÚ	ExceptionÚerror)Úselfr   r	   r   Úisolated_textÚthreatsÚsystem_promptÚuser_contentÚmessagesÚresponse_textÚcleaned_textÚis_safeÚdlp_textÚ	dlp_flagsr8   Ú
json_matchÚtarget_json_strÚparsedÚparsed_jsonÚeÚfallback_titles                        úOC:\Projects\DSCons\app\modules\core\application\document_processing\analyzer.pyÚanalyze_with_aiz%DocumentAnalyzerMixin.analyze_with_ai   sþ  è è € àZÐZÐZÐZÐZÐZð "4×!LÒ!LØ��$�ŒKñ"
ô "
Ñˆ�wð
jð 	ðF _¨8Ð^Ð^È}Ð^Ð^ˆð ¨-Ð8Ð8Ø¨Ð5Ð5ð
ˆð
&	TØ"&Ô"2×"7Ò"7¸ÈVÐ"7Ñ"TÔ"TÐTÐTÐTÐTÐTÐTˆMÝ�KŠKÐ.°Ñ>Ô>Ð>ð )×.Ò.Ñ0Ô0ˆLØ'×4Ò4°YÑ?Ô?ˆLØ'×4Ò4°UÑ;Ô;ˆLØ'×4Ò4°UÑ;Ô;ˆLØ'×-Ò-Ñ/Ô/ˆLð ,>×+PÒ+PØñ,ô ,Ñ(ˆG�X˜yð
 ˆIˆIˆIàŸš >°8Ñ<Ô<ˆJØ5?ÐM˜j×.Ò.¨qÑ1Ô1Ð1ÀXˆOå Ô,¨_ÈTÐRÑRÔRˆFÝ˜&¥$Ñ'Ô'ð Ø+/×+GÒ+GØ—J’JÐ/Ñ0Ô0°(ñ,ô ,�Ð'Ñ(ð �ðÝ"œj¨Ñ9Ô9�Ý˜k­4Ñ0Ô0ð 'Ø48×4PÒ4PØ#ŸšÐ(8Ñ9Ô9¸8ñ5ô 5�KÐ 0Ñ1ð 'Ð&ð	'øõ
 ð ð ð Ø�ðøøøøøåð 	Tð 	Tð 	TÝ�LŠLÐEÀxÐQRÑSÔSÐSÐSÐSÐSÐSÐSøøøøð	Tøøøð ×5Ò5°hÀÑIÔIˆà(Ø!Ø 'Ø",Ø2Ø Ø $Ø!Ø,ØØØØgØ"OØ#%ð
ð 
ð 	
s=   ¾EG1 ÆAG  ÇG1 Ç 
G-Ç*G1 Ç,G-Ç-G1 Ç1
H!Ç;HÈH!Úold_textÚnew_textÚfilename_oldÚfilename_newc           
   ƒ  ó>  K  — d}d|› d|dd…         › d|› d|dd…         › d�	}d|d	œd
|d	œg}	 | j                              |d¬¦  «        ƒ d{V —†}|                     ¦   «         }	|	                     d¦  «        }	|	                     d¦  «        }	|	                     d¦  «        }	|	                     ¦   «         }	t          j        |	d¬¦  «        }
t          |
t          ¦  «        r|
S n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wdddg dœS )zOAsk LLM to perform document diffing between two versions and highlight changes.uÚ  Báº¡n lÃ  chuyÃªn gia tháº©m Ä‘á»‹nh há»“ sÆ¡ cÃ´ng trÃ¬nh vÃ  kiá»ƒm toÃ¡n Ä‘á»™c láº­p táº¡i DSCons.
Nhiá»‡m vá»¥ cá»§a báº¡n lÃ  so sÃ¡nh 2 phiÃªn báº£n vÄƒn báº£n (Báº£n cÅ© vÃ  Báº£n má»›i táº£i lÃªn thay tháº¿), phÃ¢n tÃ­ch cÃ¡c Ä‘iá»ƒm sai khÃ¡c, sá»‘ liá»‡u sá»­a Ä‘á»•i, bá»• sung hoáº·c cáº¯t giáº£m.
HÃ£y tráº£ vá»� káº¿t quáº£ dÆ°á»›i Ä‘á»‹nh dáº¡ng JSON duy nháº¥t:
{
  "summary_of_changes": "..." (TÃ³m táº¯t ngáº¯n gá»�n cÃ¡c Ä‘iá»ƒm sá»­a Ä‘á»•i cá»‘t lÃµi, vÃ­ dá»¥: sá»­a lá»—i chÃ­nh táº£, thay Ä‘á»•i Ä‘Æ¡n giÃ¡, tÄƒng khá»‘i lÆ°á»£ng, bá»• sung ngÆ°á»�i kÃ½...),
  "financial_impact": "..." (Ä�Ã¡nh giÃ¡ thay Ä‘á»•i vá»� sá»‘ tiá»�n hoáº·c khá»‘i lÆ°á»£ng náº¿u cÃ³, náº¿u khÃ´ng ghi rÃµ 'KhÃ´ng áº£nh hÆ°á»Ÿng tÃ i chÃ­nh'),
  "legal_impact": "..." (Ä�Ã¡nh giÃ¡ hiá»‡u lá»±c phÃ¡p lÃ½ vÃ  rá»§i ro náº¿u cÃ³),
  "key_differences": [
     {"section": "...", "old_value": "...", "new_value": "...", "reason": "..."}
  ]
}
LÆ°u Ã½: Chá»‰ tráº£ vá»� chuá»—i JSON thÃ´.u   --- Báº¢N CÅ¨ (z) ---
Ni¬  u   

--- Báº¢N Má»šI THAY THáº¾ (ú
r   r   r   r   r   r   r   Tr   z0Failed to compare document versions with LLM: %suB   PhiÃªn báº£n má»›i Ä‘Æ°á»£c cáº­p nháº­t thay tháº¿ cho báº£n cÅ©.uC   KhÃ´ng phÃ¡t hiá»‡n thay Ä‘á»•i lá»›n vá»� sá»‘ liá»‡u tÃ i chÃ­nh.uB   Cáº§n kiá»ƒm tra Ä‘á»‘i soÃ¡t chá»¯ kÃ½ vÃ  con dáº¥u phÃ¡p nhÃ¢n.)Úsummary_of_changesÚfinancial_impactÚlegal_impactÚkey_differences)r0   r1   r4   r5   r6   r;   r<   r=   r>   rC   r2   rD   )rE   rX   rY   rZ   r[   rH   rI   rJ   rK   rL   rR   rT   s               rV   Úcompare_document_versionsz/DocumentAnalyzerMixin.compare_document_versions~   s®  è è € ð
;ð 	ð T˜lð Tð T°8¸E¸T¸E´?ð Tð TØ+7ðTð TØ@HÈÈ$ÈÄðTð Tð Tð 	ð ¨-Ð8Ð8Ø¨Ð5Ð5ð
ˆð
	PØ"&Ô"2×"7Ò"7¸ÈVÐ"7Ñ"TÔ"TÐTÐTÐTÐTÐTÐTˆMØ(×.Ò.Ñ0Ô0ˆLØ'×4Ò4°YÑ?Ô?ˆLØ'×4Ò4°UÑ;Ô;ˆLØ'×4Ò4°UÑ;Ô;ˆLØ'×-Ò-Ñ/Ô/ˆLå Ô,¨\È$ÐOÑOÔOˆFÝ˜&¥$Ñ'Ô'ð Ø�ðøåð 	Pð 	Pð 	PÝ�LŠLÐKÈQÑOÔOÐOÐOÐOÐOÐOÐOøøøøð	Pøøøð #gØ eØ`Ø!ð	
ð 
ð 	
s   ¯B5C& Ã&
DÃ0DÄDN)r   r   r	   r   r
   r   )
rX   r   rY   r   rZ   r   r[   r   r
   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rW   rb   © ó    rV   r   r      sG   € € € € € ØPÐPðm
ð m
ð m
ð m
ð^0
ð 0
ð 0
ð 0
ð 0
ð 0
rh   r   )
Ú
__future__r   rA   ÚloggingÚtypingr   r;   Ú	getLoggerr2   r   rg   rh   rV   ú<module>rm      s–   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð à	ˆÔ	Ð@Ñ	AÔ	A€ðb
ð b
ð b
ð b
ð b
ñ b
ô b
ð b
ð b
ð b
rh   