
    %j!                    (   d Z ddlmZ ddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZmZmZ ddl m!Z!m"Z" ddl#m$Z% ddl&m'Z'm(Z(m)Z)m*Z*  ejV                  e,      Z- G d d      Z.y)u   ReferenceEntityService — 단일 엔티티 참조 이미지 생성 (W5 F24 Phase 2).

ReferenceImageService facade에서 generate_single_entity_image를 literal lift.
facade는 얇은 delegate만 유지.
    )annotationsN)datetimetimezone)Path)AnyDictOptional)Session)settings)AppError)to_relative_image_path)t)ActivityLogger)EpisodeEntityCanonEntityEpisodeLink
ImageAsset)GeminiImageClientModerationError)	key_count)auto_set_primarybuild_lineage_fieldsget_latest_world_guideimage_to_dictc                  H    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddZ	 	 d	 	 	 	 	 	 	 ddZy)ReferenceEntityServiceu3   단일 엔티티 참조 이미지 생성 서비스.c                <    || _         || _        || _        || _        y )N)_db_project_id	_actor_id_logger)selfdb
project_idactor_idactivity_loggers        [/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/reference_entity_service.py__init__zReferenceEntityService.__init__,   s!     %!&    Nc                4   t         j                  s$t               dk(  rt        dt	        d      d      | j
                  j                  t              j                  t        j                  |k(  t        j                  | j                  k(        j                         }|st        dt	        d      d      | j
                  j                  t              j                  t        j                  |k(        j                         }|r|j                  nd}t!        t         j"                        | j                  z  }|dz  |z  d	z  }|j                  |j$                  |j&                  |j(                  xs d
|j*                  xs dd}	t-        | j
                  | j                  |      }
d}|dk7  r_| j
                  j                  t.              j                  t.        j                  |k(        j                         }|r|j0                  xs d}|r||	d<   ddlm} t7        t         j8                        }|j;                  | j                  |dd       |xs |j<                  xs |	d   }|s|j&                  dk(  r|dk7  rddlm }  || j                  |      }|r2|jC                  d      xs i jC                  |jD                  xs d
      nd}|r@ddl#m$}  |||      } |||	d   d      |	d<   tJ        jM                  d|jD                         ddl'm(}m)}  || j                        }	  |||j$                  |	d    ||j&                  |jD                  |v       ||| j                  |d|d      }tY        | j
                  | j                  d"      }t[        t]        j^                               }ta        dBi d#|d$| j                  d%d	d&|d'dd(|d)tc        |d)         d*|jC                  d*d
      d+|jC                  d+t         j8                        d,dd-dd.d/d0|jC                  d1      r'te        jf                  |jC                  d1i       d2      ndd3|jC                  d1      r!|jC                  d1i       jC                  d4      ndd5|jC                  d6      r!|jC                  d6i       jC                  d7      ndd8|jC                  d8      d9|jC                  d6      r!|jC                  d6i       jC                  d:      ndd;|d;   d<|d<   d=|d=   d>ti        jj                  tl        jn                        jq                         }| j
                  js                  |       tu        | j
                  | j                  |       | j
                  jw                          | jx                  j{                  | j|                  d?d@|| j                  d&|i|A       t        |      S # tT        $ r }t        d d!|jV                   d      d}~ww xY w)Cz0Generate a single reference image for an entity.r   zimage.gemini_key_missingi  )codemessagestatus_codezentity.not_foundi  sharedimages	reference z{})idnameentity_typedescriptionstable_traitskor5   )generate_and_validate_reference)model
single_refgenerate_single_entity_image)r$   
episode_idoperation_type	step_nameprop) load_printed_prop_anchor_contextby_propN)build_prop_ref_prompt_overlayF)include_framinguB   visual_continuity_anchor: prop %s 단건 ref prompt overlay 적용)body_identity_short_idsreference_entity_type)is_body_identity)r$   r<   r=   	entity_id)gemini_cliententity_nameentity_descriptionr4   
t2i_prompt
output_dir
trace_metazimage.generation_blockedzImage generation blocked: ref_image_pipeliner2   r$   
asset_typerG   still_idr<   	file_pathprompt_usedgeneration_modelwidthheightstatus	generatedreview_notes
validation)ensure_asciivalidation_scorescoresanitization_strategysanitization_infostrategyoriginal_promptsanitization_notenotecode_versionprompt_file_versionreference_image_ids
created_atzimage.generate_single_entityimage)r%   actionresource_typeresource_idr$   detail
ip_address )@r   gemini_api_keygemini_key_countr   r   r   queryr   filterr2   r$   r   firstr   canon_idr<   r   projects_dirr3   r4   r5   r6   r   r   language'app.modules.pipeline.ref_image_pipeliner8   r   gemini_image_modelset_contextrK   ,app.core.steps.visual_continuity_anchor_stepr@   getshort_id2app.modules.pipeline.visual_continuity_anchor_planrB   loggerinfoapp.core.body_identityrD   rE   r   block_reasonr   struuiduuid4r   r   jsondumpsr   nowr   utc	isoformataddr   commitr!   logr    r   )r"   rG   custom_promptipentitylinkr<   project_dirreference_direntity_dataworld_guideru   epr8   rH   _single_t2ir@   _vca_ctx_anchorrB   rD   rE   _body_identity_sidsresultexclineageasset_idassets                               r'   r;   z3ReferenceEntityService.generate_single_entity_image8   s    &&+;+=+B/45  HHNN;'VKNNi/1G1G4K[K[1[\UW 	
 ',-  HHNN,-V%..);<UW 	
 )-T__(
8001D4D4DD#h.;kI ))KK!--!--3#119T
 -TXXt7G7GT!(//

j0HIOOQB;;.$)6K&[)0K0KL!!''J'3Q 	" 	
 $Vv'8'8VK<V!3!3v!=*PXBX 88H8H*UHT\x||I.4"99&//:ORPbfG <G[Q .K[7.PM*XOO
	< 6d6F6FG	4+"KK#.}#= 2&&&,oo9L&LO '( #'"2"2",&2!*	F6 'txx1A1ACWXtzz|$ 

''
 #
  	

 
 "
 -VK-@A
 

="5
 $ZZ(:H<W<WX
 
 
 
 Z`YcYcdpYqFJJ|R$@uUw{
 KQ**UaJbVZZb9==gFhl
 Z`YcYcdwYx&**-@""E"I"I*"U  C
  #JJ'89!
" RXQ[Q[\oQpfjj)<bAEEfMvz#
$ !0%
& !((= >'
( !((= >)
*  ||HLL1;;=+
. 	U4#3#3U;^^1! ''+ 	 	
 U##_  	/4S5E5E4FG 	s   -A	W. .	X7XX)
r#   
OrmSessionr$   r   r%   r   r&   r   returnNone)NN)rG   r   r   Optional[str]r   r   r   zDict[str, Any])__name__
__module____qualname____doc__r(   r;   rm   r)   r'   r   r   )   sr    =
'
' 
' 	
'
 (
' 

' (, 	_$_$ %_$ 	_$
 
_$r)   r   )/r   
__future__r   r   loggingr   r   r   pathlibr   typingr   r   r	   sqlalchemy.ormr
   r   app.core.configr   app.core.errorsr   app.core.file_pathsr   app.i18n.loaderr   app.logging.activity_loggerr   app.models.projectr   r   r   r   #app.modules.llm.gemini_image_clientr   r   app.modules.llm.gemini_key_poolr   ro   "app.services.image_service_helpersr   r   r   r   	getLoggerr   r}   r   rm   r)   r'   <module>r      ss    #    '  & & 0 $ $ 6  6  S I  
		8	$n$ n$r)   