
    i)              
       "   d Z ddlZddlZddlmZmZmZmZ ddlm	Z	 ddl
mZ  ej                  e      ZdZddd	d
ddd
ddd
ddd
dddidddddidddg dddZdedefdZdeeeef      deeef   defdZdedefdZ G d d      Zy) uT   T2I 프롬프트 변환 모듈 — 씬 설명을 2가지 T2I 프롬프트로 변환.    N)AnyDictListOptional)call_structured)load_promptt2i_composerobjectstringuS   First angle choice and why (e.g. 'high angle looking down — shows power dynamic'))typedescriptionu/   T2I prompt for angle A — 16:9 format, Englishz0Second angle choice and why (must differ from A)u/   T2I prompt for angle B — 16:9 format, Englisharrayr   z+Key visual elements identified in the scene)r   itemsr   z/Non-visual narrative elements that were removed)angle_a_description	cinematicangle_b_descriptioncloseupkey_visual_elementsremoved_narrative_elementsF)r   
propertiesrequiredadditionalPropertiesfilenamereturnc                 l    | j                  d      r| j                  dd      n| }t        t        |      S )Nz.md )endswithreplace_load_pl_MODULE)r   stems     U/Users/manta/Documents/Projects/TheRoad-I1/backend/app/modules/t2i_prompt_composer.py_load_promptr#   9   s0    *2*;*;E*B8E2&DGT""    visible_entitiesentity_visual_traitsc           	         | syg }| D ]  }|j                  dd      }|j                  dd      }|j                  dd      }|j                  |i       }t        |t              r	 t        j                  |      }|rt        j                  |d      nd}|j                  d	| d
| d|         |rdj                  |      S dS # t        j
                  $ r i }Y cw xY w)z+Format entity visual traits for the prompt.   없음idr   nameunknownentity_typeF)ensure_asciiz- z (z): 
)	get
isinstancestrjsonloadsJSONDecodeErrordumpsappendjoin)	r%   r&   linesentityeidr*   etypetraits	trait_strs	            r"   _format_entity_traitsr>   >   s    
 E"jjr"zz&),

=)4%))#r2fc"F+ ?EDJJvE:(	r$r%I;78 #  %499U2(2	 '' s   $CCCdatac                     t        | t              r	 t        j                  |       } | r| i k(  ryt        j
                  | dd      S # t        j                  $ r | cY S w xY w)z7Format a JSON-serializable object as a readable string.r(   F   )r-   indent)r0   r1   r2   r3   r4   r5   )r?   s    r"   _format_json_blockrC   U   s\    $	::d#D 42:::dq99	 ## 	K	s   A AAc                       e Zd ZdZ	 	 	 	 ddee   dedee   dee   ddf
dZdefd	Zdefd
Z		 ddede
de
deeee
f      deee
f   deeee
f      deee
f   fdZy)T2IPromptComposeru   씬 내용 + 엔티티 시각 특성 -> 2가지 T2I 프롬프트 생성.

    A) cinematic: 전체 구도, 카메라 각도/렌즈/조명 포함
    B) closeup: 인물 감정 중심, 클로즈업/미디엄
    Nproject_llm_configprompt_versionsystem_prompt_overrideuser_prompt_overrider   c                 <    || _         || _        || _        || _        y N)_project_config_version_system_override_user_override)selfrF   rG   rH   rI   s        r"   __init__zT2IPromptComposer.__init__h   s#      2& 62r$   c                 H    | j                   r| j                   S t        d      S )Nz	system.md)rN   r#   rP   s    r"   _get_system_promptz$T2IPromptComposer._get_system_promptt   s"      (((K((r$   c                 H    | j                   r| j                   S t        d      S )Nzuser.md)rO   r#   rS   s    r"   _get_user_templatez$T2IPromptComposer._get_user_templatey   s"    &&&I&&r$   scene_descriptioncamera_jsonlighting_jsonr%   r&   world_guidec           	         | j                         }| j                         }t        |      }	t        |      }
t        ||      }d}|r|j	                  dd      }|st        |      }|j                  ||	|
||xs d      }t        d||t        | j                  dd      }|j	                  d	d      |j	                  d
d      | j                  |j	                  dg       |j	                  dg       dS )a|  Transform a scene description into two T2I prompts.

        Returns:
            {
                "cinematic": "English T2I prompt for wide shot...",
                "closeup": "English T2I prompt for close-up...",
                "composer_version": "v1",
                "key_visual_elements": [...],
                "removed_narrative_elements": [...],
            }
        r   world_setting_summaryr(   )rW   camera_infolighting_infoentity_traitsworld_contextprompt_translationt2i_composer_responsei  )stepsystem_promptuser_promptresponse_schemaproject_configschema_name
max_tokensr   r   r   r   )r   r   composer_versionr   r   )
rT   rV   rC   r>   r/   formatr   _RESPONSE_SCHEMArL   rM   )rP   rW   rX   rY   r%   r&   rZ   rd   user_templater]   r^   r_   r`   re   results                  r"   composezT2IPromptComposer.compose~   s   ( //1//1(5*=9-.>@TU'OO,CRHM  2; ?#**/#'''38 + 
 !%'#,///
  K4zz)R0 $#)::.CR#H*0**5QSU*V
 	
r$   )Nv1NNrK   )__name__
__module____qualname____doc__r   r   r1   rQ   rT   rV   r   r   ro    r$   r"   rE   rE   a   s     .2"04.2
3$TN
3 
3 !)	
3
 'sm
3 

3)C )
'C ' 158
8
 8
 	8

 tCH~.8
 #38n8
 d38n-8
 
c3h8
r$   rE   )rt   r2   loggingtypingr   r   r   r   app.modules.llm.llm_clientr   app.modules.prompt_loaderr   r   	getLoggerrq   loggerr    rl   r1   r#   r>   rC   rE   ru   r$   r"   <module>r|      s   Z   , , 6 =			8	$
  p 

 L

 M 

 L

 h'H 
 h'L'
-8 "M' T#3 #3 #
34S>*3sCx.3 	3.	:S 	:S 	:U
 U
r$   