
    $j              	          d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
  ej                  e      ZddlmZmZ dddd	ddddd
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)u  gpt-image-2 롤 생성 gen_fn — `make_nb2_gen_fn` 과 같은 시그니처.

2026-08-03 사용자 결정: 배경 씨드의 그림 모델을 gpt-image-2 로 전면 전환.

근거(6그룹 실측). 같은 저작 프롬프트·같은 형태 참조 사진으로 그림 모델만
바꿔 그리고, 참조 사진 앞에서 좌우를 바꿔 두 번 물어 **두 번 다 이긴 쪽만**
승자로 셌다 — gpt-image-2 4승 · 무승부 2 · 기존 모델 0승. 사람이 표면에
얹은 시각물(여러 위치·크기의 한 체계, 부속 표시, 진열)이 특히 크게 갈렸다.

`multiroll_select` 계약을 그대로 지킨다: `(tag, prompt, labeled_refs,
out_path) -> Path`. 참조가 있으면 edit, 없으면 generate 로 간다.
    )annotationsN)Path)AnyCallableDictOptional)DEFAULT_SIZESIZE_BY_ASPECTmultiroll_rollz16:9high)
episode_idoperation_typeaspect_ratioqualitymodel	sanitizeropenai_clientcontext_extrac        	            ddl m}	 ddlm}
 ddlm ddlm ddlm	 |xs  |
       |xs t        |	dd      t        j                  |t              d
f
d	}|S )u  gpt-image-2 gen_fn. moderation 이면 sanitizer 로 1회 재시도.

    ★`project_id`/`episode_id` 는 받되 쓰지 않는다. 교체 대상인 nb2 gen_fn 은
    클라이언트에 컨텍스트를 직접 심어야 했지만, 이 경로의 포착은 호출자가
    열어 둔 스코프(`generation_context`)를 따라간다 — 여기서 다시 심으면
    두 곳이 같은 것을 정하게 된다. 시그니처를 맞춰 두는 것은 호출부가
    한 줄 교체로 오갈 수 있게 하기 위함이다.
    r   )settings)_resolve_openai_client)call_gpt_image_bytes)reserve_current_call)atomic_write_bytesopenai_image_modelzgpt-image-2.5-sunburstc                  
 g }|xs g D ]i  \  }}|t        d|  d| d      t        t        |            j                         st        d|  d| d|       |j	                  t        |             k |}dD ]J  }	  d|          |rdnd	||xs d d
dd| ixs i       }	|	st        d       ||	      c S  t        d      # t        $ r}
t        |
      j                         }d|v xs d|v xs
 d|v xs d|v }|d
k(  rU|rSQj                  |t        |
      g |      }|j                  d      xs d}|rt        j                  d|        |}Y d }
~
 d }
~
ww xY w)Nz
gpt-image[u   ]: 참조 'u   ' 이 비었다u   ' 파일이 없다 — )      zgpt_image_gen.)sourceeditgenerater   )r   sizer   nmultiroll_tag)modeprompt	ref_pathscall_kwargscapture_rolecapture_metadatau   gpt-image: 빈 응답
moderationsafetyblockedcontent_policysanitized_prompt u0   gpt-image[%s]: moderation — sanitize 재시도u   gpt-image: 재시도 소진)FileNotFoundErrorr   strexistsappendRuntimeError	Exceptionlowersanitizegetloggerwarning)tagr&   labeled_refsout_pathrefslabpcurrentattemptpngexcmsg	moderatedsr	sanitizedr   r   clientr   r   r   r   resolvedr   r"   s                  X/Users/manta/Documents/Projects/TheRoad-I1/backend/app/modules/pipeline/gpt_image_gen.pygen_fnz%make_gpt_image_gen_fn.<locals>.gen_fn=   s    #)r)FCy' [_EG GA<&&(' [5LQCPR RKKA * G!$nSE,BC*#'Z""ld*2D,3!!=!/&5s &?)6)<"&?
 &'>??)(C88# F 899#  #hnn&)S0 LHO L )S 0L4D4K a<I)2G
 #++GSXr7KB "'9 : @bI NPSU"+ !s    >AC	E*BE%$E%%E*)r>   r   returnr   )app.core.configr   $app.core.steps.shot_conti_light_stepr   #app.modules.llm.gpt_image_primitiver   app.core.image_call_budgetr   %app.modules.pipeline.multiroll_geminir   getattr_SIZE_BY_ASPECTr9   _DEFAULT_SIZE)
project_idr   r   r   r   r   r   r   r   r   r   rM   r   r   rJ   r   rK   r"   s     ` ` ` `   @@@@@@rL   make_gpt_image_gen_fnrX      s\    ( )KH?H646FY*>@XYH|];D3: 3:j M    )rW   r2   r   Optional[str]r   r2   r   r2   r   r2   r   rZ   r   r   r   r   r   zOptional[Dict[str, Any]]rN   r   )__doc__
__future__r   loggingpathlibr   typingr   r   r   r   	getLogger__name__r:    app.modules.llm.gpt_image_clientr	   rV   r
   rU   rX    rY   rL   <module>rd      s    #   0 0			8	$ !%*.2SS S 	S
 S S S S S ,S SrY   