
    jKjH                         d dl Z d dlZd dlmZmZmZmZmZmZm	Z	m
Z
mZ  G d dej                        Z G d dej                        Zedk(  r ej                           yy)    N)	redact_base64_data_urlsanitize_openaisanitize_openai_responsesanitize_anthropicsanitize_geminisanitize_langchainis_base64_data_urlis_raw_base64REDACTED_IMAGE_PLACEHOLDERc                   x    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestSanitizationc                 <    d| _         d| _        d| _        d| _        y )N0data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQ...z5data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA...https://example.com/image.jpg5iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUl==)sample_base64_imagesample_base64_pngregular_url
raw_base64selfs    r/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/test/ai/test_sanitization.pysetUpzTestSanitization.setUp   s!    #U !X:Q    c                    | j                  t        | j                               | j                  t        | j                               | j	                  t        | j
                               | j	                  t        d             y )Nzregular text)
assertTruer	   r   r   assertFalser   r   s    r   test_is_base64_data_urlz(TestSanitization.test_is_base64_data_url   s`    *4+C+CDE*4+A+ABC+D,<,<=>+N;<r   c                     | j                  t        | j                               | j                  t        d             | j                  t        | j                               | j                  t        d             y )Nshortz/path/to/file)r   r
   r   r   r   r   s    r   test_is_raw_base64z#TestSanitization.test_is_raw_base64   sV    doo67w/0t'7'78978r   c                 r   | j                  t        | j                        t               | j                  t        | j                        t               | j                  t        | j
                        | j
                         | j                  t        d       d        | j                  t        d      d       y )N{   )assertEqualr   r   r   r   r   r   s    r   test_redact_base64_data_urlz,TestSanitization.test_redact_base64_data_url$   s    "4#;#;<>X	
 	"4#9#9:<V	
 	/0@0@A4CSCST/5t</4c:r   c                    ddddd| j                   dddgd	g}t        |      }| j                  |d
   d   d
   d   d       | j                  |d
   d   d   d   d   t               | j                  |d
   d   d   d   d   d       y )NusertextWhat is in this image?typer(   	image_urlhigh)urldetailr+   r,   rolecontentr   r3      r.   r/   r   r   r$   r   r   
input_dataresults      r   test_sanitize_openaiz%TestSanitization.test_sanitize_openai/   s     #-EF +#'#;#;&,&	

  !,9-a08:RS1Ii #K079S	
 	9-a0=hGPr   c                     dd| j                   dgdg}t        |      }| j                  |d   d   d   d   t               y Nr'   input_imager0   r1   r   r3   r,   r5   r6   s      r    test_sanitize_openai_input_imagez1TestSanitization.test_sanitize_openai_input_imageH   s^      !.%)%=%=


 !,1Ii #K02L	
r   c                     ddd| j                   idgdg}t        |      }| j                  |d   d   d   d   d   | j                          y Nr'   r,   r.   r0   r1   r   r3   )r   r   r$   r6   s      r   +test_sanitize_openai_preserves_regular_urlsz<TestSanitization.test_sanitize_openai_preserves_regular_urls[   sj      !,&+T-=-=%>


 !,9-a0=eDdFVFVWr   c                     dd| j                   dgdg}t        |      }| j                  |d   d   d   d   t               y r;   )r   r   r$   r   r6   s      r   test_sanitize_openai_responsez.TestSanitization.test_sanitize_openai_responsek   s^      !.%)%=%=


 **51Ii #K02L	
r   c                 H   ddddddddd	d
gdg}t        |      }| j                  |d   d   d   d   d       | j                  |d   d   d   d   d   t               | j                  |d   d   d   d   d   d       | j                  |d   d   d   d   d   d       y )Nr'   r(   r)   r*   imagebase64
image/jpeg
base64datar+   
media_typedatar+   sourcer1   r   r3   r4   rL   rJ   r+   rI   )r   r$   r   r6   s      r   test_sanitize_anthropicz(TestSanitization.test_sanitize_anthropic}   s     #-EF '$,*6$0#


" $J/9-a08:RS1Ii #H-f57Q	
 	9-a0:6BHM9-a0:<H,Wr   c                     dddiddddigig}t        |      }| j                  |d   d   d   d   d       | j                  |d   d   d	   d   d
   t               | j                  |d   d   d	   d   d   d       y )Npartsr(   r)   inline_datarF   rG   	mime_typerJ   r   r4   rJ   rR   )r   r$   r   r6   s      r   test_sanitize_geminiz%TestSanitization.test_sanitize_gemini   s     56%)5$0(


 !,7+A.v68PQ1Igq!-08:T	
 	1Igq!-0=|	
r   c                     ddd| j                   idgdg}t        |      }| j                  |d   d   d   d   d   t               y r?   )r   r   r$   r   r6   s      r   $test_sanitize_langchain_openai_stylez5TestSanitization.test_sanitize_langchain_openai_style   sh      !,&+T-E-E%F


 $J/1Ii #K079S	
r   c                 |    ddddidgdg}t        |      }| j                  |d   d   d   d	   d   t               y )
Nr'   rD   rJ   rG   rK   r1   r   r3   rL   )r   r$   r   r6   s      r   'test_sanitize_langchain_anthropic_stylez8TestSanitization.test_sanitize_langchain_anthropic_style   sb      !(#)<"8


 $J/1Ii #H-f57Q	
r   c                 j   d}ddd|idgdg}t        |      }| j                  |d   d   d   d   d   t               dd	d
d|ddgdg}t        |      }| j                  |d   d   d   d   d   t               dd	|dgdg}t	        |      }| j                  |d   d   d   d   t               y )Nz2data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAADr'   r,   r.   r0   r1   r   r3   rD   rE   rF   rH   rK   rL   rJ   )r+   rJ   )r   r$   r   r   r   )r   data_urlopenai_datar8   anthropic_datalangchain_datas         r   "test_sanitize_with_data_url_formatz3TestSanitization.test_sanitize_with_data_url_format   s   G
 %0x?PQR
 !-1Ii #K079S	
  !($,*6$,#	
 $N31Ii #H-f57Q	
 '8)L(MN
 $N39-a08:TUr   c                     d}dddd|ddgdg}t        |      }| j                  |d	   d
   d	   d   d   t               ddd|digig}t        |      }| j                  |d	   d   d	   d   d   t               y )Nr   r'   rD   rE   z	image/pngrH   rK   r1   r   r3   rL   rJ   rO   rP   rQ   )r   r$   r   r   )r   r   r[   r8   gemini_datas        r   test_sanitize_with_raw_base64z.TestSanitization.test_sanitize_with_raw_base64  s    L

  !($,*5$.#	
 $N31Ii #H-f57Q	
 [*'UVWX
 !-1Igq!-08:T	
r   c                 v   d}d}dd|ddd|idgd	g}t        |      }| j                  |d
   d   d
   d   |       | j                  |d
   d   d   d   d   |       dd|ddd|ddgd	g}t        |      }| j                  |d
   d   d
   d   |       | j                  |d
   d   d   d   d   |       y )Nr   zWhat do you see?r'   r(   r*   r,   r.   r0   r1   r   r3   r4   rD   )r+   r.   rK   rL   )r   r$   r   )r   r   text_contentrZ   r8   r[   s         r   'test_sanitize_preserves_regular_contentz8TestSanitization.test_sanitize_preserves_regular_content#  s   5)
 #\:({7KL
 !-9-a08,G9-a0=eDkR
 #\:${0ST
 $N39-a08,G9-a0:5A;Or   c                 J    dddg}t        |      }| j                  ||       y )Nr'   z	Just textr1   )r   r$   r6   s      r   &test_sanitize_handles_non_dict_contentz7TestSanitization.test_sanitize_handles_non_dict_contentE  s)    %+>?
 ,,r   c                     | j                  t        d              | j                  t        d              | j                  t        d              | j                  t	        d              y )N)assertIsNoner   r   r   r   r   s    r    test_sanitize_handles_none_inputz1TestSanitization.test_sanitize_handles_none_inputK  sP    /$/0,T23/$/0,T23r   c                     ddd| j                   idgd}t        |      }| j                  |d   d   d   d   t               y )Nr'   r,   r.   r0   r1   r3   r   r5   r6   s      r   $test_sanitize_handles_single_messagez5TestSanitization.test_sanitize_handles_single_messageQ  s]     ("')A)A!B

 !,9a -e46P	
r   N)__name__
__module____qualname__r   r   r!   r%   r9   r=   r@   rB   rM   rS   rU   rW   r]   r`   rc   re   rh   rj    r   r   r   r      se    R=9	;Q2
&X 
$X6
2
$
$*VX 
D PD-4
r   r   c                   ^    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zy)TestAIMultipartRequestzOTest that _INTERNAL_LLMA_MULTIMODAL environment variable controls sanitization.c                 L    dt         j                  v rt         j                  d= y y )N_INTERNAL_LLMA_MULTIMODAL)osenvironr   s    r   tearDownzTestAIMultipartRequest.tearDowne  s     &"**4

67 5r   c                     dt         j                  v rt         j                  d= d}t        |      }| j                  |t               y)zEWhen _INTERNAL_LLMA_MULTIMODAL is not set, images should be redacted.rr   r   Nrs   rt   r   r$   r   r   base64_imager8   s      r   'test_multimodal_disabled_redacts_imagesz>TestAIMultipartRequest.test_multimodal_disabled_redacts_imagesj  s;    &"**4

67I'5!;<r   c                 h    dt         j                  d<   d}t        |      }| j                  ||       y)zCWhen _INTERNAL_LLMA_MULTIMODAL is true, images should be preserved.truerr   r   Nrs   rt   r   r$   rx   s      r   (test_multimodal_enabled_preserves_imagesz?TestAIMultipartRequest.test_multimodal_enabled_preserves_imagess  s0    28

./I'5.r   c                 h    dt         j                  d<   d}t        |      }| j                  ||       y)z5_INTERNAL_LLMA_MULTIMODAL=1 should enable multimodal.1rr   r   Nr}   rx   s      r   test_multimodal_enabled_with_1z5TestAIMultipartRequest.test_multimodal_enabled_with_1{  s0    25

./I'5.r   c                 h    dt         j                  d<   d}t        |      }| j                  ||       y)z7_INTERNAL_LLMA_MULTIMODAL=yes should enable multimodal.yesrr   r   Nr}   rx   s      r    test_multimodal_enabled_with_yesz7TestAIMultipartRequest.test_multimodal_enabled_with_yes  s0    27

./I'5.r   c                 p    dt         j                  d<   d}t        |      }| j                  |t               y)z4_INTERNAL_LLMA_MULTIMODAL=false should still redact.falserr   r   Nrw   rx   s      r   $test_multimodal_false_redacts_imagesz;TestAIMultipartRequest.test_multimodal_false_redacts_images  s1    29

./I'5!;<r   c                     dt         j                  d<   ddddddd	gd
g}t        |      }| j                  |d   d   d   d   d   d       y)zOAnthropic images should be preserved when _INTERNAL_LLMA_MULTIMODAL is enabled.r|   rr   r'   rD   rE   rF   rG   rH   rK   r1   r   r3   rL   rJ   N)rs   rt   r   r$   r6   s      r   !test_anthropic_multimodal_enabledz8TestAIMultipartRequest.test_anthropic_multimodal_enabled  ss    28

./  !($,*6$0#	

  $J/9-a0:6BLQr   c                     dt         j                  d<   dddddigig}t        |      }| j                  |d   d   d   d   d	   d       y
)zLGemini images should be preserved when _INTERNAL_LLMA_MULTIMODAL is enabled.r|   rr   rO   rP   rF   rG   rQ   r   rJ   Nrs   rt   r   r$   r6   s      r   test_gemini_multimodal_enabledz5TestAIMultipartRequest.test_gemini_multimodal_enabled  sh    28

./ ",$UV

 !,7+A.}=fE|Tr   c                     dt         j                  d<   ddddidgdg}t        |      }| j                  |d	   d
   d	   d   d   d       y)z_LangChain Anthropic-style images should be preserved when _INTERNAL_LLMA_MULTIMODAL is enabled.r|   rr   r'   rD   rJ   rG   rK   r1   r   r3   rL   N)rs   rt   r   r$   r6   s      r   1test_langchain_anthropic_style_multimodal_enabledzHTestAIMultipartRequest.test_langchain_anthropic_style_multimodal_enabled  sm    28

./  !(#)<"8


 $J/9-a0:6BLQr   c                     dt         j                  v rt         j                  d= dddddgdg}t        |      }| j                  |d   d	   d   d
   t               | j                  |d   d	   d   d   d       y)zJOpenAI audio should be redacted when _INTERNAL_LLMA_MULTIMODAL is not set.rr   	assistantaudiobase64audiodata	audio_123r+   rJ   idr1   r   r3   rJ   r   N)rs   rt   r   r$   r   r6   s      r   %test_openai_audio_redacted_by_defaultz<TestAIMultipartRequest.test_openai_audio_redacted_by_default  s    &"**4

67 $$.?{S

 !,9-a08:TU9-a06Dr   c                     dt         j                  d<   dddddgdg}t        |      }| j                  |d	   d
   d	   d   d       y)zKOpenAI audio should be preserved when _INTERNAL_LLMA_MULTIMODAL is enabled.r|   rr   r   r   r   r   r   r1   r   r3   rJ   N)rs   rt   r   r$   r6   s      r   %test_openai_audio_preserved_with_flagz<TestAIMultipartRequest.test_openai_audio_preserved_with_flag  sb    28

./ $$.?{S

 !,9-a08:KLr   c                     dt         j                  v rt         j                  d= dddddigig}t        |      }| j                  |d   d   d   d   d   t               y	)
zJGemini audio should be redacted when _INTERNAL_LLMA_MULTIMODAL is not set.rr   rO   rP   audio/L16;codec=pcm;rate=24000r   rQ   r   rJ   N)rs   rt   r   r$   r   r6   s      r   %test_gemini_audio_redacted_by_defaultz<TestAIMultipartRequest.test_gemini_audio_redacted_by_default  s|    &"**4

67 %)I$5(	

 !,1Igq!-08:T	
r   c                     dt         j                  d<   dddddigig}t        |      }| j                  |d   d   d   d   d	   d       y
)zKGemini audio should be preserved when _INTERNAL_LLMA_MULTIMODAL is enabled.r|   rr   rO   rP   r   r   rQ   r   rJ   Nr   r6   s      r   %test_gemini_audio_preserved_with_flagz<TestAIMultipartRequest.test_gemini_audio_preserved_with_flag  sr    28

./ %)I$5(	

 !,1Igq!-08:K	
r   N)rk   rl   rm   __doc__ru   rz   r~   r   r   r   r   r   r   r   r   r   r   rn   r   r   rp   rp   b  sK    Y8
=///=R.UR&E$M 
.
r   rp   __main__)rs   unittestposthog.ai.sanitizationr   r   r   r   r   r   r	   r
   r   TestCaser   rp   rk   mainrn   r   r   <module>r      s^    	 
 
 
N
x(( N
b
w
X.. w
t zHMMO r   