
    (<i(%                        d Z ddlZddlZddlZddlZddlmZ  ed      Z ee      ej                  vr"ej                  j                  d ee             ddlZej                  Zej                  Z ej                  ej                   dd        ej"                  d      Zd	Z ed
      Zedz  ZdZdddddddddgZdedefdZdedededefdZdefdZedk(  r e        yy)u   A/B 테스트: Gemini vs GPT Image 포토 모델 비교.

photo 타입 프롬프트 3개로 각 모델의 성공률, 생성 시간, 파일 크기, 해상도를 측정한다.

실행:
    python3 ab_test_photo_models.py
    N)Pathz&/home/jay/workspace/tools/ai-image-genu4   %(asctime)s [%(levelname)s] %(name)s — %(message)sz%H:%M:%S)levelformatdatefmtab_testz
2026-04-11z5/home/jay/workspace/tools/ai-image-gen/output/ab_testzresults.json   P1zeProfessional insurance office interior, modern Korean style, natural lighting, clean desk with laptop)idtextP2z]Happy Korean family reviewing insurance documents with financial advisor, warm indoor settingP3zZAbstract visualization of insurance protection concept, shield, umbrella, minimalist style
image_pathreturnc                     	 ddl m} |j                  |       5 }|j                  \  }}| d| cddd       S # 1 sw Y   yxY w# t        $ r+}t
        j                  d| j                  |       Y d}~yd}~ww xY w)u   PIL로 이미지 해상도를 'WxH' 형식으로 반환한다.

    PIL import 실패 또는 파일 읽기 실패 시 'unknown'을 반환한다.
    r   )ImagexNu    해상도 확인 실패 (%s): %sunknown)PILr   opensize	Exceptionlogwarningname)r   r   imgwhexcs         X/home/jay/workspace/.worktrees/task-2057-dev2/tools/ai-image-gen/ab_test_photo_models.py_get_resolutionr    K   sp    
ZZ
# 	s88DAqS!:	 	 	  6
Ms0   A 9	A AA A 	A9!A44A9
model_nameprompt_textoutput_pathc                    t         j                  d| j                         |j                         ddddddd}t	        j
                         }	 |j                  j                  dd        |||      }t        t	        j
                         |z
  d      }||d<   |r|j                         s0|j                  d	      j                         r|j                  d	      n|}d|d
<   |j                         j                  |d<   t        |      |d<   t        |      |d<   t         j                  d| j                         ||d   |d          |S d|d<   t         j                  d| j                         |       	 |S # t         $ rv}	t        t	        j
                         |z
  d      }||d<   t#        |	      j$                   d|	 |d<   t         j'                  d| j                         |d          Y d}	~	|S d}	~	ww xY w)uj  단일 모델 호출을 실행하고 측정 결과 dict를 반환한다.

    Args:
        model_name: 로그용 모델 식별자 ("gemini" 또는 "gpt")
        generate_fn: _generate_gemini 또는 _generate_gpt
        prompt_text: 이미지 생성 프롬프트
        output_path: 결과 이미지 저장 경로

    Returns:
        측정 결과 dict
    u   [%s] 호출 시작 → %sFN)successtime_sec	file_size
resolutionpatherrorTparentsexist_okr   r&   z.jpgr%   r'   r(   r)   u#   [%s] 성공 | %.2fs | %d bytes | %su#   생성 함수가 False를 반환함r*   u"   [%s] 실패 (False 반환) | %.2fsz: u   [%s] 예외 발생: %s)r   infoupperr   time	monotonicparentmkdirroundexistswith_suffixstatst_sizer    strr   r   type__name__r*   )
r!   generate_fnr"   r#   resultt0r%   elapsedactual_pathr   s
             r   _run_singlerA   [   s   " HH(**:*:*<k>N>NOF 
	BQ   =k;7(2-q1$z #))+0G0G0O0V0V0X ''/  
 !%F9"-"2"2"4"<"<F;#2;#?F<  -F6NHH5  "{#|$" M DF7OKK<j>N>N>PRYZ M  Q(2-q1$z!#Y//03%8w		*J,<,<,>wPPMQs    C;E8 *E8 8	G7A+G22G7c                  t   t         j                  dd       t        j                  dt               g } t
        D ]  }|d   }|d   }t        j                  d||dd        t         d	|j                          d
z  }t         d|j                          d
z  }t        dt        ||      }t        j                  dt               t        j                  t               t        dt        ||      }|t
        d   ur3t        j                  dt               t        j                  t               | j                  ||||d        | D cg c]  }|d   d   s| }	}| D cg c]  }|d   d   s| }
}| D cg c]  }|d   d   |d   d    }}| D cg c]  }|d   d   |d   d    }}|r!t        t        |      t!        |      z  d      nd}|r!t        t        |      t!        |      z  d      nd}t!        t
              }t!        |	       d| t!        |
       d| ||d}t        | |d}t"        j%                  t'        j(                  |dd      d       t        j                  dt"               t        j                  d|d   |d   |d    |d!          |S c c}w c c}w c c}w c c}w )"u:   A/B 테스트를 실행하고 결과 dict를 반환한다.Tr+   u6   === A/B 테스트 시작: Gemini vs GPT Image (%s) ===r
   r   u   --- [%s] 프롬프트: %s...N<   gemini_z.pnggpt_geminiu#   다음 호출까지 %d초 대기...gptu)   다음 프롬프트까지 %d초 대기...)	prompt_idpromptrF   rG   r%   r&   r   /)gemini_success_rategpt_success_rategemini_avg_timegpt_avg_time)	test_dateresultssummaryF)ensure_asciiindentzutf-8)encodingu+   === 테스트 완료. 결과 저장: %s ===uP   요약 | Gemini: %s | GPT: %s | Gemini 평균시간: %ss | GPT 평균시간: %ssrL   rM   rN   rO   )
OUTPUT_DIRr3   r   r.   	TEST_DATEPROMPTSlowerrA   _generate_geminiINTER_CALL_DELAY_SECr0   sleep_generate_gptappendr4   sumlenRESULTS_JSON
write_textjsondumps)rQ   prompt_entrypidr"   
gemini_outgpt_outgemini_result
gpt_resultrgemini_successesgpt_successesgemini_times	gpt_timesrN   rO   totalrR   outputs                     r   run_ab_testrr      s   TD1HHEyQG 
4 "6*/k#26FGGCIIK="==
ciik]$77 $H.>ZX68LM

'( !{GL
 wr{*HH@BVWJJ+, %'!		
+
> $+Eaak).DEE '?11U8I+>Q?M?5<d(J@W@cAhK
+dLd/6[!!E(::N:Z5*%[I[IUeC-L0AA1E[_O@I5Y#i.8!<tLLE"%&6"7!8%A"=12!E7;*$	G F DJJvE!LW^_HH:LIHHZ%&"#!" ME F?d[s0   
J&J&"J+0J+:J0
J0J5&
J5__main__)__doc__rc   loggingsysr0   pathlibr   _AI_IMAGE_GEN_DIRr9   r)   insertimage_router_irrZ   r]   basicConfigINFO	getLoggerr   rW   rV   ra   r[   rX   r    dictrA   rr   r;        r   <module>r      sX     
   AB )HHOOAs,-. '' !!   
,,A
 g	" 	IJ
N*  7 " 1<   == = 	=
 
=JHT H^ zM r   