
    f j#m                        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
 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d            e e j        d                    Z ed          ZdedefdZdedefdZdedefdZdededefdZdedededefdZdedededededefdZ dedededefdZ!dededefdZ"dS )     N)Path)OpenAI)load_dotenv)extract_document)validate_extraction)detect_exceptions)perform_rca)generate_capa)generate_full_reportT)overrideOPENAI_API_KEY)api_keyuploadsextractionsreturnc                 j   |                      dg           }t          d |D             d           t          d |D             d           t          d |D             d           d |D             d |D             d |D             d |D             d	 |D             t          d
 |D             i           d	S )Nfilesc              3   j   K   | ].}|                     d           |                     d           V  /dS )batch_idNget.0es     BC:\Users\Terasoftware\OneDrive\Desktop\faahhh\fyndo\fyndo\agent.py	<genexpr>zflatten.<locals>.<genexpr>   s?      PPaeeJ>O>OP!%%
++PPPPPP    c              3   j   K   | ].}|                     d           |                     d           V  /dS )product_nameNr   r   s     r   r   zflatten.<locals>.<genexpr>   s?      \\aeeNF[F[\aeeN33\\\\\\r   c              3   j   K   | ].}|                     d           |                     d           V  /dS )plantNr   r   s     r   r   zflatten.<locals>.<genexpr>   s;      GG!gGquuW~~GGGGGGr   c                 D    g | ]}|                     d g           D ]}|S )
parametersr   )r   r   ps      r   
<listcomp>zflatten.<locals>.<listcomp>   3    IIIQ|R1H1HIIAqIIIIr   c                 D    g | ]}|                     d g           D ]}|S )lims_resultsr   )r   r   ls      r   r%   zflatten.<locals>.<listcomp>    s3    MMMq1553L3LMMaMMMMr   c                 D    g | ]}|                     d g           D ]}|S )equipment_readingsr   )r   r   eqs      r   r%   zflatten.<locals>.<listcomp>!   s5    [[[a155AUWY;Z;Z[[Rr[[[[r   c                 D    g | ]}|                     d g           D ]}|S )maintenance_recordsr   )r   r   ms      r   r%   zflatten.<locals>.<listcomp>"   s5    [[[a!%%@UWY:Z:Z[[Q[[[[r   c                 D    g | ]}|                     d g           D ]}|S )
sop_limitsr   )r   r   ss      r   r%   zflatten.<locals>.<listcomp>#   r&   r   c              3     K   | ]}|                     d i                                d          s=|                     d i                                di                                d          h|                     d           V  dS )deviation_detailsdeviation_iddeviation_recordDeviation_IDNr   r   s     r   r   zflatten.<locals>.<genexpr>%   s       ] ]A)2..22>BB]UU&++//0BBGGKKN[[]QUU&'' ] ] ] ] ] ]r   )	r   r   r!   r#   r(   r+   r.   r1   r4   )r   next)r   r   s     r   flattenr9      s   OOGR((EPPUPPPRVWW\\U\\\^bccGGuGGGNNII%IIIMMEMMM[[5[[[[[5[[[II%III!] ] ] ] ] 	
 
  r   uploaded_filesc                   K   t          d           d | D             }t          t          j        |  d{V           }|t	          |          d}t          |          }t          dt	          |d                    dt	          |d                    d	t	          |d
                    dt	          |d                               ||dS )u*   Tool 1 — Extract all data from all filesu9   [AGENT TOOL] extract_files — reading all uploaded filesc                 H    g | ]}t          t          |d          z             S filename)r   
UPLOAD_DIRr   fs     r   r%   z&tool_extract_files.<locals>.<listcomp>4   s*    RRRaj1Z=899RRRr   N)r   total_filesu"   [AGENT TOOL] extracted — params:r#   z lims:r(   z equipment:r+   z maintenance:r.   )combinedflat)printlistasynciogatherlenr9   )r:   tasksr   rC   rD   s        r   tool_extract_filesrK   1   s5     	
EFFFRR>RRREW^U333333344K$S5E5EFFH8D	  Es43E/F/F  E  EcRVWeRfNgNg  E  Etwx|  ~R  yS  uT  uT  E  E  cf  gk  lA  gB  cC  cC  E  E  F  F  F $///r   rD   c                   K   t          d           t          |            d{V }i }|                     dg           D ]K}t          |                    dd                    dd         }|                    d          }|r|r|||<   L|                    dg           D ]}|                    d	          snt          |                    dd                    dd         }|                    |          p*|r't	          |                                          d
         nd|d	<   i }|                     dg           D ]}t          |                    dd                                                    t          |                    dd                                                    }	t          |                    dd                                                    }
rd|	v sd|
v rd|<   |                    dg           D ]l}t          |                    dd                                                    t          fd|                                D             d          }|r||d<   mt          d |                    dg           D                       }t          d |                    dg           D                       }|                    d          r||d         d<   ||d         d<   |                     di           }|                    d|          }|                    d          p|                    d          }|dk    r@|                    d          rd|d         d<   |                    d          rd|d         d<   t          d|                    di                               d d
           d!| d"|                    di                               d                      |S )#u/   Tool 2 — Detect all exceptions from flat dataz[AGENT TOOL] detect_exceptionsNr+   	timestamp    operator_id
exceptionsoperatorr   r1   parameter_namecriticalityaction_if_exceededcriticalzstop immediatelyCritical	parameterc              3   2   K   | ]\  }}|v s|v |V  d S )N )r   kvparams      r   r   z)tool_detect_exceptions.<locals>.<genexpr>Y   s:      ZZdaeZuXYzZZZZZZZr   severityc              3   L   K   | ]}|                     d           dk    dV   dS )r^   rW      Nr   r   s     r   r   z)tool_detect_exceptions.<locals>.<genexpr>]   s9      ^^aeeJ>O>OS]>]^1^^^^^^r   c              3   L   K   | ]}|                     d           dk    dV   dS )r^   Majorr`   Nr   r   s     r   r   z)tool_detect_exceptions.<locals>.<genexpr>^   s9      XXa155;L;LPW;WXXXXXXXr   summarymajorr4   r6   Severity
risk_level
batch_risklevelu(   [AGENT TOOL] exceptions found — total:total_exceptionsz
 critical:z risk:)
rE   r   r   strrF   valueslowerr8   itemssum)rD   resultop_mapr,   tsopexsop_criticalitysoprT   actionmatchedrV   rd   	deviation
dev_recordreal_severityr]   s                    @r   tool_detect_exceptionsr{   <   si     	
*+++$T********F Fhh+R00  R(())#2#.VVM"" 	" 	F2Jjjr** ^ ^vvj!! 	^RVVK,,--crc2B#ZZ^^]F0\V]]__0E0Ea0H0HX\BzN Oxxb)) 0 0CGG,b112288::#''-4455;;==SWW126677==?? 	0jK/ 	03E3O 	0%/OE"jjr** % %BFF;++,,2244ZZZZo&;&;&=&=ZZZ\`aa 	%$BzN^^fjjr::^^^^^HXX6::lB77XXXXXEzz) +(0y*%%*y'" ,b11I19==JNN:..L*..2L2LM
" 7::i   	9.8F9l+::l## 	7,6F< )	  sVZZ	25N5N5R5RSegh5i5i  s  su}  s  s  FL  FP  FP  QZ  \^  F_  F_  Fc  Fc  dp  Fq  Fq  s  s  t  t  tMr   rQ   c                   K   t          d           |                     dg           }|                     dg           }g }|D ]}t          |                    dd                                                    }t          |                    dd                                                    }d|v sd|v sd	|v sd
|v sd|v rz|                    |                    d          |                    d          |                    d          |                    d          |                    d          d           d |D             }| |||dd         d}	t          |	           d{V }
d |                     di g          D             }t          d |D             d          }t          d |D             d          }i }|                     dg           D ]K}t          |                    dd                    dd         }|                    d          }|r|r|||<   L|
                    di                               dg           D ]}|                    d          snt          |                    dd                    dd         }|                    |          p*|r't          |                                          d         nd|d<   t          |                    d           pd          	                    d!          r||d <   |
                    d"g           D ]}|                    d          snt          |                    dd                    dd         }|                    |          p*|r't          |                                          d         nd|d<   t          |                    d#          pd          	                    d!          s|                    d#          s||d#<   |                     d$i           }|                    d%|          }|                    d&          d'k    s|                    d(          d'k    r |
                    d)          rd'|
d)         d*<   |                     dg           }d+ |D             }|r|
                    d"          g |
d"<   |dd,         D ]}|pd|                    dd          |                    dd          p|                    dd          t          |                    dd                    |                    d-d          d.}d/ |
d"         D             }|                    d          |vr|
d"                             |           t          d0|
                    d)i                               d*           d1t          |
                    d"g                                 |
S )2u&   Tool 3 — Perform root cause analysisz[AGENT TOOL] perform_rcar.   r+   observationrN   statusoverduedrift	oxidationurgentcalibrationwork_order_idmaintenance_dateaction_taken)r   r   r}   r   r~   c                     g | ];}t          |                    d d                                                    dv 9|<S )r~   rN   )ALERT	DEVIATION)rj   r   upperr   s     r   r%   z$tool_perform_rca.<locals>.<listcomp>   sE    iiiAc!%%"2E2E.F.F.L.L.N.NRh.hiaiiir   N   )extracted_datarQ   key_maintenance_recordsalert_equipment_readingsc                 :    g | ]}|                     d d          S )r>   rN   r   r@   s     r   r%   z$tool_perform_rca.<locals>.<listcomp>   s&    NNNA!%%
B''NNNr   r#   c              3   <   K   | ]}d t          |          v |V  dS )	EquipmentNrj   r@   s     r   r   z#tool_perform_rca.<locals>.<genexpr>   s2      FFQs1vv0EFqFFFFFFr   zEquipment_Log.csvc              3   <   K   | ]}d t          |          v |V  dS )MaintenanceNr   r@   s     r   r   z#tool_perform_rca.<locals>.<genexpr>   s2      HHQQ0GHqHHHHHHr   zMaintenance_Log.csvrM   rO   rP   cluster_contextvertical_timeliner   source_filefile_supporting_evidencer>   r4   r6   re   rW   r^   investigation_summaryrf   c           	         g | ]}d t          |                    dd                                                    v sdt          |                    dd                                                    v sndt          |                    dd                                                    v s7dt          |                    dd                                                    v |S )r   r~   rN   r   r}   r   r   rj   r   rl   r   r/   s     r   r%   z$tool_perform_rca.<locals>.<listcomp>   s     K K KAEE(B$7$7 8 8 > > @ @@Kc!%%r":":;;AACCCK s155#;#;<<BBDDDK !CmR(@(@$A$A$G$G$I$II	K1 K K Kr      performed_by)r>   	referencedetailrM   rP   c                 8    g | ]}|                     d           S )r   r   r   s     r   r%   z$tool_perform_rca.<locals>.<listcomp>   s$    RRRqk**RRRr   u   [AGENT TOOL] rca done — risk:z
 evidence:)rE   r   rj   rl   appendr	   r8   rF   rk   
startswithrI   )rD   rQ   maintenance	equipmentkey_maintenancer/   obsr~   alert_readings	rca_inputro   
real_files
equip_file
maint_filerp   r,   rq   rr   itemevrx   ry   key_recordsmaint_evexistings                            r   tool_perform_rcar   q   s     	
$%%% ((0"55K-r22I O 
 
!%%r**++1133QUU8R(())//11 	'S. 	K34F 	(VY/ 	]jnq]q 	""!"!7!7$%EE*<$=$= uu]33 !n 5 5%%//$ $    jiiiiN  #2$22A2$6	 I y))))))))F ON,1M1MNNNJFF*FFFH[\\JHH*HHHJ_``JFhh+R00  R(())#2#.VVM"" 	" 	F2J

,b11556I2NN - -xx&& 	cTXXk2..//4B"(**R.."bQW5aT&--//5J5J15M5M]aDtxx&&,"--88AA 	-",Djj.33 ( (vvm$$ 	aRVVK,,--crc2B &

2 `v3_43H3H3K3K[_B}rvvj!!'R((33G<< 	(BFF:DVDV 	('BzN,b11I19==J~~j!!Z/ G:>>*3M3MQ[3[ G::-.. 	G<FF*+L9 ((0"55KK Kk K K KK  ?::+,, 	/,.F()RaR 	? 	?A&?*?UU?B77%%r22OaeeNB6O6O '92!>!>?? uu^R88 H SRF;P4QRRRHuu_%%X5 ?,-44X>>>	  ^FJJ7NPR,S,S,W,WXd,e,e  ^  ^qtu{uu  AV  XZ  v[  v[  r\  r\  ^  ^  _  _  _Mr   rcac                 F  K   t          d           | ||d}t          |           d{V }|                     di           }|                    d|          }|                    d          p|                    d          }|                    d          p|                    d	          }|r||d<   |r0||d	<   |                    d
          r||d
         d<   d|d
         d<   t          d|                    d           d|                    d	                      |S )u   Tool 4 — Generate CAPA planz[AGENT TOOL] generate_capa)r   rQ   r   Nr4   r6   r7   r5   re   r^   impact_assessmentpre_capa_riskLowresidual_risku(   [AGENT TOOL] capa done — deviation_id:z
 severity:)rE   r
   r   )	rD   rQ   r   
capa_inputro   rx   ry   real_dev_idrz   s	            r   tool_generate_capar      sJ     	
&'''$(
3OOJ ,,,,,,,,F,b11I19==J..00RJNN>4R4RKNN:..L*..2L2LM -!,~ A*z::)** 	A;HF&'8;@F&'8	
sVZZ5O5O
s
s[a[e[efp[q[q
s
stttMr   capabase_urlc                 $  K   t          d           | |||d}t          ||           d{V }|                     di           }|                    d|          }|                    d          p|                    d          }	|	r |                    d          r|	|d         d<   i }
|                     d	g           D ]K}t          |                    d
d                    dd         }|                    d          }|r|r||
|<   L|
r't	          |
                                          d         nd}|                    di                               d          rK|d         d         }|                    dd|           }|                    dd|           }||d         d<   |                     dg           }t          d |D             d          }|r|                    dd          }ddl}t          |                    dd                    }|	                    d|          }|r|
                    d          }d| d}nd}|                    di                               d          r|d         d         }t          |                    d d                    }d!D ]}|                    ||          }|r.|                    d"||          }|                    d#||          }||d <   t          |                    d$d                    }|r|                    d"||          }||d$<   |                    di                               d%          rAt          |d         d%                   }d!D ]}|                    ||          }||d         d%<   |                     di           }|                    d|          }|                    d&i           }t          |                    d'd                    }|	                    d(||j                  }|r|
                    d           d)} |                    di                               d          rj|d         d         }t          |                    d d                    }|                    d*d+|  |          }|                    d,|  d-|          }||d <   |                    d.i           }!|!                    d/d          }"|"rAt          j        |                    di                     }#d0|#v r|                    di           }$d1D ]}%|$                    |%          rt          |$|%         t                     rZ|$|%                                         D ]>\  }&}'t          |'t                    r$d0|'v r |                    d2|"|'          |$|%         |&<   ?t          |$|%         t                    r |                    d2|"|$|%                   |$|%<   |                    d3          r |                    d2|"|d3                   |d3<   |                    di                               d4          r-|d         d4         D ]}(|(                    d5          d6v rd7|(d5<   |                    d8          r)|d8         D ] })|)                    d5          d9k    rd:|)d5<   !t          d;|                    di                               d<                      |S )=u(   Tool 5 — Generate final report and PDFz[AGENT TOOL] generate_report)r   rQ   r   r   Nr4   r6   re   r^   report_metadatar+   rM   rN   rO   rP   r   Unknownsectionsdeviation_descriptionzoperator ID was not recordedzoperator ID: z The operator ID was not recordedzOperator ID: r.   c              3   d   K   | ]+}d t          |                    dd                    v '|V  ,dS )0401r   rN   N)rj   r   r   s     r   r   z'tool_generate_report.<locals>.<genexpr>  sC      UUq6SPR9S9S5T5T+TUUUUUUUr   r   zWO-2024-0401r}   z[+](\d+\.?\d+|\d+)r`   +u   °Croot_cause_analysisprobable_cause)zWO-2024-0456zWO-2024-045zWO-2024-046u   [+]\d+\.?\d*°Cz[+]\d+\.?\d*\s*degrees?
conclusioncapa_summaryEquipment_DetailsCalibration_Statusz(\d+)\s*days?\s*past\s*duez dayszoverdue by \d+ dayszoverdue by z\d+ days? overduez overdueLinked_RecordsOOS_ReferenceOOS)r   r   r   executive_summaryz0OOS[-\s]?\d{4}[-\s]?\d{4}|OOS[-\s]?\d{4}|OOS-\d+ai_generated_summaryregulatory_compliancer~   )zNon-CompliantfailzUnder Reviewcompliance_checklistr   warnu!   [AGENT TOOL] report done — ref:ref_id)rE   r   r   rj   rF   rk   replacer8   researchgroupsub
IGNORECASEjsondumps
isinstancedictrm   )*rD   rQ   r   r   r   report_inputro   rx   ry   rz   rp   r,   rq   rr   first_operatordescr.   	breakdownwo_idr   r   drift_matchnum
real_driftrca_secprobablewrong_wor   capa_sum
eq_details
cal_statusoverdue_matchreal_overduelinkedreal_oosrca_textr   section_keyr[   r\   regr   s*                                             r   tool_generate_reportr      s     	
()))&**SZ^__L'h????????F,b11I19==JNN:..L*..2L2LM >$566 >0= !*-Fhh+R00  R(())#2#.VVM"" 	" 	F2J17FT&--//**1--YNzz*b!!%%&=>> ;j!"9:||:<\N<\<\]]||>@`P^@`@`aa6:z23((#8"== UU'UUU I
  (:o~>> 				)--r2233ii 5s;; 	##A&&C%SJJJ::j"%%))*?@@ 	/Z()>?G7;;'7<<==H K = =#++He<<  T66"4j(KK66"<j(SS(0G$% W[[r::;;J PVV$6
JOO
$.GL!::j"%%)).99 	:6*-n=>>HJ = =#++He<<19F:~. ,b11I19==J 3R88JZ^^$8"==>>JII;ZWWM 1'--a00777::j"%%))*?@@ 	1Z()>?G7;;'7<<==Hvv46RL6R6RT\]]Hvv2|4M4M4MxXXH(0G$% ^^,b11Fzz/2..H :fjjR8899H 	zz*b11Hn  <<,, !(;"7>> $,[$9$?$?$A$A " "DAq)!S11 "eqj ";=66$W$,a<" <" 5a 8" $H[$93?? 02O$h{&;1 1-
 ::,-- 	-/VVC&!78. .F)*
 zz*b!!%%&=>> /*%&=> 	/ 	/Cwwx  $== / .Hzz()) (12 	( 	(Dxx!!V+ (!'X	
_fjj9JB.O.O.S.ST\.].]
_
_```Mr   c           	         t          d           g }d}t                      }|                    dg           D ]2}|                    d          r|                    |d                    3|                    dg           D ]2}|                    d          r|                    |d                    3|                    dg           D ]0}|                    dg           D ]}	|                    |	           1t	          j        |                                          }
d	|
v sd
|
v r|                    d           d|
v sd|
v sd|
v r|                    d           d|
v sd|
v sd|
v r|                    d           d|
v rd|
v r|                    d           t          |          dk     r+|                    dt          |           d           |dz  }t          dt          |           dt          |          dk    rdnd            |                     di           }|                    d |          }|                    d!          p|                    d"          }|                    d#          pi                     d$          }|d%k    rK|d%k    rE|                    d&|            |d'z  }|                    d#          d%|d#         d$<   nd$d%i|d#<   t          d)| d*| d||k    rdnd+            t          d, |                    d-g           D                       }|d.k    r|                    | d/           |d0z  }t          d1| d|d.k    rdnd2            |                     d3g           }t	          j        |                                          dv pAd4v p=d5v p9dv p5t          fd6|D                       pt          fd7|D                       }|s|r|                    d8           |d0z  }t          d9| d|rdnd            d: |                     d;g           D             }d|
                                v p+d|
                                v pd|
                                v }|r,|s*|                    t          |           d<           |d0z  }t          d=| d|rdnd            |                    dg           }t          d> |D                       }|s|                    d?           |d0z  }t          d@| d|rdnd2            t          dA| dBt          |                      |r|D ]}t          dC|            ||dDk    ||dDk    dES )Fzl
    Agent checks its own work before generating CAPA.
    Returns confidence score and any gaps found.
    z+[AGENT REFLECT] Starting self reflection...d   r   r>   	five_whysevidence_sourceroot_cause_candidatesevidence_refsr   eqp_granequipment_datar   
work_orderzwo-maintenance_datalimsassayoos	lims_datarx   zdev-deviation_data   zOnly u%    evidence sources — need at least 3   z"[AGENT REFLECT] Evidence sources: u    — OKWEAKr4   r6   re   r^   r   rf   rW   uB   Risk level mismatch — Deviation JSON says Critical but RCA says    Nz[AGENT REFLECT] Risk level: z vs Deviation JSON: FIXEDc              3   D   K   | ]}|                     d           dV  dS )rR   r`   Nr   )r   rs   s     r   r   zself_reflect.<locals>.<genexpr>  s4      ``rRVVT^M_M_```````r   rQ   r   z exceptions have null operator
   z [AGENT REFLECT] Null operators: ISSUEr.   r   z
work orderc              3      K   | ];}t          |                    d d                                                    v V  <dS )r   rN   Nr   r   r/   rca_text_lowers     r   r   zself_reflect.<locals>.<genexpr>  sJ      [[!Cor**++1133~E[[[[[[r   c              3     K   | ]z}t          |                    d d                                                    dd         v Adt          |                    dd                                                    v V  {dS )r}   rN   Nr   r   r~   r   r  s     r   r   zself_reflect.<locals>.<genexpr>  s       N Na155++,,2244tt8LLNIQUU8R001177999 N N N N N Nr   z6Maintenance records not sufficiently referenced in RCAz([AGENT REFLECT] Maintenance referenced: c                 D    g | ]}|                     d           dk    |S )r~   Failr   )r   r)   s     r   r%   z self_reflect.<locals>.<listcomp>  s-    WWWQUU8__PV=VW!WWWr   r(   z# LIMS failures not mentioned in RCAz'[AGENT REFLECT] LIMS impact mentioned: c              3   @   K   | ]}|                     d           V  dS )is_rootNr   )r   ws     r   r   zself_reflect.<locals>.<genexpr>  s.      77155##777777r   z No root why identified in 5 Whysz([AGENT REFLECT] 5 Whys root identified: z[AGENT REFLECT] Score: u   /100 — Issues: u   [AGENT REFLECT] → F   )score	confidentissuesproceed)rE   setr   addr   r   rl   rI   r   rn   any)rD   rQ   r   r  r  sources_usedr   r  rcrefr   rx   ry   rz   rca_risknull_operatorsr   maintenance_referenced
lims_failsrca_mentions_limsr   has_rootissuer  s                          @r   self_reflectr*  n  sL   
 

7888FE 55Lgg+R00 - -66* 	-R
^,,,WW["%% 3 355"## 	3Q01222gg-r22 " "66/2.. 	" 	"CS!!!!	" z#$$&&Hh +*"8 +)***  -LH$< -@Q -+,,, &W0 &EX4E &%%%h +6X#5 +)***
<1 Vc,//VVVWWW	
ss</@/@
s
ssS_O`O`deOeGqttkq
s
sttt ,b11I19==JNN:..L*..2L2LM/006B;;LIIH
" Fx:'= Fe[ceefff77*++ 	F9CC'(66,8*+EC'(	  L  L  L}  L  Lcko|c|  \J[_[_  CJ  L  L  M  M  M ``Z^^L"%E%E`````N GGGHHH	
l^
l
l.\]J]Bj$$cj
l
lmmm ((0"55KZ__**,,N' 	N'	N&	N 		N 	[[[[{[[[[[		N
 	 N N N N; N N N 	N 	N  " k NOOO	
~5K
~
~ZpR|RVRVv|
~
~ XWTXXnb99WWWJ(.."2"22ngAQAQ6QnUZ^f^l^l^n^nUn + ZMMMNNN	
s4E
s
sTeLqDDkq
s
sttt R((I77Y77777H 8999	
cX
c
cHDaDDZa
c
cddd	
IE
I
ICKK
I
IJJJ 2 	2 	2E0001111 b[B;	  r   c                 T  K   t          d           t          d           t          dd | D                         t          d           g }t          d           |                    d           t          |            d{V }|d	         }|d
         }t          d           t          dt          |d                               t          dt          |d                               t          dt          |d                               t          dt          |d                               t          dt          |d                               t          dt	          |d                               |                    dt          |d                    dt          |d                    dt          |d                    d           t          d           |                    d           t          |           d{V }t          d |                    dg           D                       }t          d |            |                    d!| d"           t          d#           |                    d$           t          |           d{V }|                    d%i                               d&d'          }	|                    d%i                               d(d'          }
t          d)|	 d*|
            |                    d+|	 d,|
 d-           t          d.           |                    d/           t          ||           d{V }|                    d0i                               d1          }t          d2|            |                    d3|            t          d4           |                    d5           t          |||          }t          d6|d7          d8           |                    d9|d7          d8           |d:         st          d;|d7          d<           |                    d=|d7                     t          ||           d{V }t          |||          }t          d>|d7          d8           |                    d?|d7          d8           t          d@           |                    dA           t          |||           d{V }t          dBt          |                    dCg                      dD           |                    dEt          |                    dCg                      dF           t          dG           |                    dH           t          |||||           d{V }t          dI|                    dJ                      |                    dK|                    dJ                      t          d           t          dL           t          dM|d7          d8           t          dN|                    dO                      t          dP|                    dQi                               dR                      t          dS|                    dJ                      t          d           ||d7         |dT         |                    dO          |                    dU          ||||||                    dV          |                    dJ          dWdXS )Yu   
    ReAct Agent — runs full pharma investigation with reasoning and self reflection.
    No predefined file names. Adapts to whatever files are uploaded.
    z3
==================================================z*[AGENT] Starting ReAct Investigation Agentz[AGENT] Files to investigate: c                     g | ]
}|d          S r=   rZ   r@   s     r   r%   z+run_investigation_agent.<locals>.<listcomp>  s    +R+R+RaAjM+R+R+Rr   z3==================================================
u5   [AGENT] Phase 1 — Extracting data from all files...z!Phase 1: Extracting all file dataNrC   rD   z[AGENT] Data available:z  Parameters:    r#   z  LIMS Results:  r(   z  Equipment:     r+   z  Maintenance:   r.   z  SOP Limits:    r1   z  Deviation:     r4   zExtracted: z	 params, z LIMS, z equipment readingsu-   
[AGENT] Phase 2 — Validating parameters...zPhase 2: Validating parametersc              3   L   K   | ]}|                     d           dk    dV   dS )validation_statusr   r`   Nr   )r   rs     r   r   z*run_investigation_agent.<locals>.<genexpr>  s=      ~~TUTYTYZmTnTnr}T}~1~~~~~~r   validation_rowsu.   [AGENT] Validation done — deviations found: zValidation: z deviations foundu,   
[AGENT] Phase 3 — Detecting exceptions...zPhase 3: Detecting exceptionsrc   ri   r   rV   z[AGENT] Exceptions: total=z
 critical=zExceptions: z total, z	 criticalu6   
[AGENT] Phase 4 — Performing root cause analysis...zPhase 4: Root cause analysisr   rf   u!   [AGENT] RCA done — risk level: zRCA: risk level = u'   
[AGENT] Phase 5 — Self reflection...zPhase 5: Self reflectionz[AGENT] Reflection score: r  z/100zSelf reflection score: r  z
[AGENT] Confidence too low (z&). Re-running RCA with more context...u"   Re-running RCA — confidence was z![AGENT] Re-run reflection score: zRe-run reflection score: u,   
[AGENT] Phase 6 — Generating CAPA plan...zPhase 6: Generating CAPAu   [AGENT] CAPA done — capa_actionsz actionszCAPA: z actions generatedu/   
[AGENT] Phase 7 — Generating final report...zPhase 7: Generating reportu   [AGENT] Report done — pdf_filenamezReport: z[AGENT] Investigation Completez[AGENT] Confidence: z[AGENT] Batch: r   z[AGENT] Severity: r   r^   z[AGENT] PDF: r  r   download_url	completed)	agent_logconfidence_scorereflection_issuesr   r   validaterQ   r   r   reportr3  r2  r~   )rE   r   rK   rI   boolr   rn   r   r{   r   r*  r   r   )r:   r   r5  
extractionrC   rD   validate_resultdeviations_foundrQ   total_excritical_exr   risk
reflectionr   r9  s                   r   run_investigation_agentrB    s     
 
-	
6777	
T+R+R>+R+R+R
T
TUUU	-I 

ABBB8999).99999999J*%HfD	
$%%%	
7c$|"455
7
7888	
9c$~"677
9
9:::	
?c$';"<==
?
?@@@	
@c$'<"=>>
@
@AAA	
7c$|"455
7
7888	
?d4(;#<==
?
?@@@  \3tL'9#:#:  \  \SnI]E^E^  \  \gjko  qE  lF  hG  hG  \  \  \  ]  ]  ] 

:;;;5666/55555555O~~o&9&9:KR&P&P~~~~~	
M;K
M
MNNNG$4GGGHHH 

9:::4555-d33333333J~~i,,001CQGGH..B//33JBBK	
Hx
H
H;
H
HIIILHLLkLLLMMM 

CDDD3444 z22
2
2
2
2
2
2C77*B//33LAAD	
4d
4
45550$00111 

4555/000dJ44J	
@z'':
@
@
@AAAHz'/BHHHIII i  Pjz'/BjjjkkkSj>QSSTTT$T:66666666!$
C88
K*W2EKKKLLLNZ5HNNNOOO 

9:::/000#D*c::::::::D	
N3txx'C'C#D#D
N
N
NOOOSc$((>2">">??SSSTTT 

<===1222'j#tXNNNNNNNNF	
AVZZ%?%?
A
ABBB<

> : :<<===	-	
*+++	
:G!4
:
:
:;;;	
2DHHZ00
2
2333	
Rvzz*;R@@DDZPP
R
RSSS	
6&**^44
6
6777	- &w/'1HHZ((00# 

>22

>22  r   )#osr   rG   pathlibr   openair   dotenvr   extractr   r8  r   rQ   r   r   r	   r   r
   r9  r   getenvclientr?   r   r9   rF   rK   r{   r   r   rj   r   r*  rB  rZ   r   r   <module>rJ     s   				                     $ $ $ $ $ $ ( ( ( ( ( ( ( ( ( ( ( (             ' ' ' ' ' ' T    			"233	4	4	4T)__
 $    00T 0d 0 0 0 02t 2 2 2 2 2jZ Z4 ZD Z Z Z Zz4 T      .BT Bt B$ Bd B^a Bfj B B B BRdt d dD dT d d d dVj$ j# j$ j j j j j jr   