
    (<i                        U d Z ddlmZ 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ZddlZ ed      Zedz  Zed	z  Zd
ZdZdZddddZded<   ddZ	 	 	 	 	 	 	 	 	 	 ddZddZedk(  r e        yy)u  Gemini Nano Banana 2 (gemini-3.1-flash-image-preview) 이미지 생성 스크립트.

SA(서비스 계정) Bearer 토큰으로 Gemini API REST를 직접 호출합니다(방법 3).
시나리오 A, B, C에 대한 보험 GA 리크루팅 광고 이미지를 생성합니다.
    )annotationsN)datetime)Path)Anyz;/home/jay/workspace/tools/ai-image-gen/output/v2-gemini-nb2zresults.jsonz
errors.logzgemini-3.1-flash-image-previewz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languageu?  Professional Korean insurance general agency recruiting advertisement. Modern office environment with confident business professionals. Clean, premium design. 1080x1080 square format for Meta ads. Text overlay: '당신의 커리어, 새로운 시작' in Korean. Color scheme: navy blue and gold. Corporate premium feel.u   Korean insurance consultant personal branding image. Confident male professional in business suit, modern Seoul office backdrop. Warm lighting, trustworthy atmosphere. 1080x1080 square. Subtle text: '보험의 모든 것' in elegant Korean typography.u   Motivational career change advertisement for insurance professionals. Split image: left side dark/stressful office, right side bright/modern workspace. Aspirational feel. 1080x1080 square format. Korean text: '지금이 기회입니다' centered.ABCzdict[str, str]	SCENARIOSc                    t        j                         j                         }t        t        dd      5 }|j                  d| d|  d       ddd       t        d|         y# 1 sw Y   xY w)	u+   에러 로그를 파일에 기록합니다.autf-8encoding[] 
Nz[ERROR] )r   now	isoformatopen
ERRORS_LOGwriteprint)message	timestampfs      W/home/jay/workspace/.worktrees/task-2057-dev2/tools/ai-image-gen/gemini_nb2_generate.py	log_errorr   4   sc    ((*I	j#	0 .A	!I;b	,-.	HWI
. .s   A%%A.c                   t          dt         d}d|  dd}dd|igigdd	d
gid}t        d| dt         d       t        j                         }t	        j
                  |||d      }|j                          t        j                         |z
  }	|j                         }
|
j                  dg       }|s$t        dt        j                  |
      dd        |d   j                  di       j                  dg       }d}|D ]
  }d|v s|} n |5|D cg c]  }d|v s|j                  dd       }}t        d|dd        |d   j                  dd      }|d   d   }t        j                  |      }d|v rdnd }|j                  j                         |k7  r|j                  |      }|j!                  |       |j#                         j$                  }t        d| d!|j&                   d"|d#d$|	d%d&| d       |t        d't)        j*                         j-                         |j&                  t/        |      t1        |	d      ||dd(
S c c}w ))uR   Gemini API REST 호출로 이미지를 생성하고 PNG 파일로 저장합니다.z/models/z:generateContentzBearer zapplication/json)AuthorizationzContent-TypepartstextresponseModalitiesIMAGETEXT)contentsgenerationConfigu   [시나리오 u*   ] 이미지 생성 요청 중... (모델: )   )headersjsontimeout
candidatesu.   응답에 candidates가 없습니다. 응답: Ni,  r   content
inlineData uA   이미지 데이터가 응답에 없습니다. 텍스트 파트:    mimeTypez
image/jpegdatajpeg.jpg.pngu
   ] 완료: z (,z bytes, .1fu
   초, mime=)sa_bearer_token_generative-language_scope
scenariomodelauth_methodr   filenamefilepathtime_secondsfile_size_bytes	mime_typeerror)GEMINI_API_BASEMODEL_IDr   timerequestspostraise_for_statusr+   getRuntimeErrordumpsbase64	b64decodesuffixlowerwith_suffixwrite_bytesstatst_sizenamer   r   r   strround)tokenpromptoutput_pathr;   urlr*   payload
start_timeresponseelapsedr3   r-   r!   
image_partpartp
text_partsrB   	image_b64image_bytesext	file_sizes                         r   generate_image_via_gemini_apirh   <   s    XhZ/?
@C"5'**G
  01231GV3DEG
 
N8*$NxjXY
Z[J}}S'MHiikJ&G#==?D,+JKDJJW[L\]a^aLbKcdeeqMi,00"=E(,J 4J
 16FA&A+aeeFB'F
Fbcmnpopcqbrstt-11*lKI-f5I""9-K i'&VC!S(!--c2K(  "**I	

*[-=-=,>fYqMQYZabeYffpqzp{{|}
 B\\^--/$$$gq)$ % Gs   	I Ic                    t         j                  dd       t        d       t        d       t        dt                t        dt                 t        d       t        d       t        d       	 t	        j
                  t              } t        d	t        |        d
       g }t        j                         }dD ]  }t        |   }t         d| dz  }|t        dt        j                          j#                         d| dt%        |      ddddd
}t        d| d       t        d|dd  d       	 t'        | |||      }	|j)                  |	       |j5                  |        t        j                         |z
  }
t        j                          j#                         t        dt7        |
d       |d!}t9        t:        d"d#$      5 }t=        j>                  ||d%d &       ddd       t        d'       t        d(       t        d       tA        d) |D              }t        |      |z
  }t        d*| d+| d,       t        d-|
d.d/       t        d0t:                tB        jE                         rt        d1tB                |D ]g  }|jG                  d      d2nd3}|jG                  d4      }|jG                  d5      }|r|d6d7nd8}|r|d9d/nd8}t        d:|d;    d<| d=| d=|        i y# t        $ r7}dt        |      j                   d| }t        |       t        d      |d}~ww xY w# t*        j,                  $ rQ}d| d|j.                  j0                   d|j.                  j2                  dd  }t        |       ||d<   Y d}~>d}~wt        $ r9}d| dt        |      j                   d| }t        |       ||d<   Y d}~~d}~ww xY w# 1 sw Y   xY w)>u+   메인: 3개 시나리오 이미지 생성.T)parentsexist_okz<============================================================u,   Gemini Nano Banana 2 이미지 생성 시작u   모델: u   출력 디렉토리: u;   인증 방법: SA Bearer 토큰 (generative-language scope)u2   
[인증] SA 서비스 계정 토큰 획득 중...u*   [인증] SA 토큰 획득 성공 (길이: z chars)u   SA 토큰 획득 실패: z:    Nr   gemini_nb2_r5   r9   r6   r:   z
[u   ] 시나리오 처리 중...u     프롬프트: P   z...u   시나리오 u    HTTP 오류: z - i  rC   u	    오류: r1   )run_timestampr<   r=   total_time_seconds	scenarioswr   r   F)ensure_asciiindentz=
============================================================u   생성 결과 요약c              3  D   K   | ]  }|j                  d       d  yw)rC   Nrl   )rJ   ).0rs     r   	<genexpr>zmain.<locals>.<genexpr>   s     EaaeeGn.DEs     u   성공: u   /3, 실패: z/3u   총 소요 시간: r8   u   초u   결과 저장: u   에러 로그: OKFAILrA   r@   r7   z byteszN/Az.2fz  [r;   r   z | )$
OUTPUT_DIRmkdirr   rE   gcloud_authget_service_account_tokenGEMINI_SCOPElen	Exceptiontype__name__r   
SystemExitrF   r   r   r   r   rV   rh   updaterG   	HTTPErrorr^   status_coder"   appendrW   r   RESULTS_JSONr+   dumpsumr   existsrJ   )rX   e	error_msgresultstotal_startr;   rY   rZ   result
gen_resulttotal_elapsedresults_datar   success_count
fail_countrw   statussizetsize_strtime_strs                        r   mainr      s   TD1	(O	
89	HXJ
 	!*
./	GI	(O 

?@#55lC:3u:,gNO %'G))+K#  8$ [
$#?? !F!113%hZt4K( #"
 	H:9:; S12
	(6ufkS[\JMM*% 	vA D IIK+-M "113B#M15$L 
lC'	2 Aa		,a@A 
/	
 !	(OE7EEMW-J	H]O<
|2
>?	c2#
67	OL>
*+
|,- Iw/Vuu&'EE.!(,d1XV$%$%aWC=5AjM?"VHCzXJGHII  #/Q0@0@/AA3G	)m"#> !! 	('zAJJDZDZC[[^_`_i_i_n_nosps_t^uvIi 'F7O 	('z47;K;K:LBqcRIi 'F7O	($A AsI   41K1 6L4O1	L1:2L,,L14OANO.OOO%__main__)r   rV   returnNone)
rX   rV   rY   rV   rZ   r   r;   rV   r   zdict[str, Any])r   r   )__doc__
__future__r   rM   r+   rF   r   pathlibr   typingr   rG   r}   r{   r   r   rE   rD   r   r   __annotations__r   rh   r   r        r   <module>r      s    #        OP
N*,&
+DD	D	L	=	> 0 BBB B 	B
 BJZIz zF r   