
    j                       U d Z ddlmZ ddlZddlmZmZ ddlZdZde	d<    ej                  d      Zde	d	<    ej                  d
      Zde	d<    ej                  d      Zde	d<    ej                  d      Zde	d<    ej                  d      Zde	d<    ej                  d      Zde	d<    ej                  d      Zde	d<    ej                  d      Zde	d<    ej                  d      Zde	d<   dZde	d<   ddZ	 	 	 	 	 	 ddZy) z>Shared prohibited-content boundary for nutrition model output.    )annotationsN)FinalIterable)u	   처방약u   약물u	   호르몬u   탈수u   진단u   의료진 지시를 무시u   응급실에 가지r   _PROHIBITED_PHRASESu  (?:복용\s*중인\s*약|처방약|처방\s*받(?:은|고|았)|약물|호르몬제?|인슐린|혈압약|당뇨약|약(?!속))(?:은|는|을|를)?.{0,24}(?:중단|끊|먹지|드시지|복용하지|피하|투여|주사|증량|감량|늘리|줄이|두\s*배|용량.{0,8}(?:변경|조절))_MEDICATION_ACTIONu   (?:굶|식사.{0,12}(?:전부\s*)?(?:끊|중단)|아무것도.{0,12}(?:먹지|드시지)|(?:물|수분).{0,12}(?:마시지|입에.{0,4}대지|섭취.{0,8}(?:하지|말)|끊|중단))_STARVATION_ACTIONu   (?:응급|긴급|위급|구급대|119).{0,48}(?:(?:신고|연락|119|도움|의료진|구급대).{0,16}(?:하지|말|피하)|(?:병원|응급실|의료기관).{0,16}(?:가지\s*마|방문하지|연락하지|피하))_EMERGENCY_CARE_BYPASSz(?:stop|discontinue|quit|avoid|skip|do\s*not)\b.{0,32}(?:medication|medicine|prescription|insulin|hormone|blood\s*pressure\s*(?:medication|medicine)|diabetes\s*(?:medication|medicine))_ENGLISH_MEDICATION_ACTIONzk(?:drink\s*no\s*water|do\s*not\s*drink\s*(?:any\s*)?(?:water|fluids?)|avoid\s*(?:all\s*)?(?:water|fluids?))_ENGLISH_DEHYDRATION_ACTIONz(?:do\s*not|never|avoid).{0,24}(?:contact|call|seek|visit|go\s*to).{0,24}(?:emergency|ambulance|hospital|doctor|medical\s*care|911)_ENGLISH_EMERGENCY_BYPASSz((?<![a-z])(?:[a-z]\s+){2,}[a-z](?![a-z])_SPACED_ASCII_SEQUENCEu   (?:계정\s*)?(?:비밀번호|인증번호|보안\s*코드|주민등록번호|접근\s*토큰).{0,32}(?:보내|공유|알려|입력|제출)_CREDENTIAL_ACTIONuS   (?<![가-힣A-Za-z])(?P<name>[가-힣]{2,4}|[A-Za-z][A-Za-z .'-]{1,40})\s*고객님_CUSTOMER_IDENTITY)	u   알레르기u   임신u   당뇨u	   고혈압u	   갑상선u   신장 질환u
   간 질환u   심장 질환u   질환_SENSITIVE_FACT_TERMSc                   t        |       t        urydj                  d t        j                  d|       j                         D              t        j                  d       t        j                  dd      }t        fdt        D              xsb t        t        d |fD              xsC t        j                        xs, t        j                        xs t        j                              S )	zIReturn whether model-authored text crosses the nutrition safety boundary.F c              3  P   K   | ]  }t        j                  |      d k7  r|   yw)CfN)unicodedatacategory).0	characters     j/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/gateway/platforms/nutrition_coaching_safety.py	<genexpr>z9contains_prohibited_nutrition_guidance.<locals>.<genexpr>S   s+      HI	*d2 	Hs   $&NFKCc                L    t        j                  dd| j                               S )N\s+r   )resubgroup)matchs    r   <lambda>z8contains_prohibited_nutrition_guidance.<locals>.<lambda>Y   s    bffVR7    r   c              3  &   K   | ]  }|v  
 y wN )r   term
normalizeds     r   r   z9contains_prohibited_nutrition_guidance.<locals>.<genexpr>]   s     B.Adtz!.A   c              3  t   K   | ]0  }t         t        t        t        fD ]  }|j	                  |        2 y wr%   )r   r   r	   r   search)r   	candidatepatterns      r   r   z9contains_prohibited_nutrition_guidance.<locals>.<genexpr>^   s>      	
2	""&"	 NN9% &2s   68)typestrjoinr   	normalizecasefoldr   r   r   anyr   boolr
   r+   r   r   )valuecompactr(   s     @r   &contains_prohibited_nutrition_guidancer7   O   s    E{# $..vu=FFH J
 (++7J ffVR,GB.ABB d 	
('2	
 		
 	8 &,,Z8	8 '--j9	8 %++J7G r#   c                     t               t        uryt        |      t         fdt        D              ryt        fdt
        j                         D              S )zCReject sensitive factual domains absent from validated source copy.Fc              3  V   K   | ]  v xr t        fd D                ! yw)c              3  &   K   | ]  }|v  
 y wr%   r&   )r   sourcer'   s     r   r   z@contains_unsupported_sensitive_fact.<locals>.<genexpr>.<genexpr>x   s     =vDFNr)   Nr3   )r   r'   source_textr5   s    @r   r   z6contains_unsupported_sensitive_fact.<locals>.<genexpr>v   s:       *D 	 	>====	>)s   %)Tc              3  J   K   | ]  t        fd D                 yw)c              3  D   K   | ]  }j                  d       |v   yw)r   N)r    )r   r;   r!   s     r   r   z@contains_unsupported_sensitive_fact.<locals>.<genexpr>.<genexpr>}   s     C{VA&({s    Nr<   )r   r!   r=   s    @r   r   z6contains_unsupported_sensitive_fact.<locals>.<genexpr>|   s'      7E C{CCC7s   #)r.   r/   tupler3   r   r   finditer)r5   sourcesr=   s   ` @r   #contains_unsupported_sensitive_factrC   n   s^    
 E{#.K
  * 
  '007  r#   )r5   objectreturnr4   )r5   rD   rB   zIterable[str]rE   r4   )__doc__
__future__r   r   typingr   r   r   r   __annotations__compiler   r   r	   r
   r   r   r   r   r   r   r7   rC   r&   r#   r   <module>rK      sn   D " 	 "  U  'BJJL E  'BJJ/ E  !+

:!   %/BJJV% E 
 &0RZZ-& U  $.2::B$ 5 
 !+

/!   'BJJ. E 
 'BJJ E 

  u 
> 
r#   