
    i                     0   U d Z ddlZddlmZ ddlmZmZmZmZ  ee	      j                         j                  j                  j                  j                  dz  dz  dz  Zd Zd	d
ddiddiddidddddiddddddiddddddiddddddiddddddiddddddiddddddidd	d
dddidddddidddddgddg ddZeeef   ed<   ddd Zd!ed"efd#Zd$eeeef      d"eeeef      fd%Zd&eeeef      d"eeeef      fd'Z G d( d)      Zy)*u_   월드 가이드 생성 모듈 — LLM 클라이언트를 사용한 세계관 가이드 생성.    N)Path)AnyDictListOptionalprompts_baseprototype_promptsc                      ddl m}  t        t        j	                         D cg c]  }|j                         s|j                  ! c}| d      }|s	t        dz  S t        |d   z  S c c}w )Nr   )_version_sort_keyT)keyreversev5)app.modules.prompt_loaderr   sortedPROMPTS_BASEiterdiris_dirname)r   dversionss      W/Users/manta/Documents/Projects/TheRoad-I1/backend/app/modules/world_guide_generator.py_get_prompts_dirr   	   s^    ;|';';'=L'=!qvv'=LRcmqrHd""(1+%% Ms
   A'A'objectFtypestringarray      )r   minItemsmaxItemsitems            uF   이미지 생성 시 반드시 유지해야 할 시각 규칙 (3-5개))r   r"   descriptionuC   이미지 생성 시 반드시 피해야 할 시각 요소 (3-5개))must_maintain
must_avoidr(   r)   )r   additionalProperties
propertiesrequired)world_time_periodworld_setting_summarytechnology_levelera_guardrailscostume_guardrailslocation_guardrailsprop_guardrailsprohibited_visual_misreadscontinuity_guardrailsimage_generation_notesstyle_rulesWORLD_GUIDE_SCHEMAkoKorean)enEnglish)r:   r<   filenamereturnc                 X    t               | z  j                  d      j                         S )Nzutf-8)encoding)r   	read_textstrip)r>   s    r   _load_promptrD   E   s'    )44g4FLLNN    entitiesc           
          g }| D ]X  }|j                  |j                  dd      |j                  dd      |j                  dd      |j                  dd      d       Z |S )z+Compact entity dicts for world guide input.r    entity_typer'   stable_traitsz{})r   rI   r'   rJ   appendget)rF   compactitems      r   _compact_entitiesrP   I   sa    GHHVR(88M2688M26!XXot<	
 	  NrE   stillsc           
          g }| D ]X  }|j                  |j                  dd      |j                  dd      |j                  dd      |j                  dd      d       Z |S )z0Compact scene still dicts for world guide input.still_indexr   screenplay_scene_headingrH   
beat_titlestill_frame_prompt)rS   rT   rU   rV   rK   )rQ   rN   ss      r   _compact_stillsrX   V   sc    G552().H"(M%%b1"#%%(<b"A	
 	  NrE   c                   |    e Zd ZdZdddZ	 ddedededeeeef      d	eeeef      d
e	eeef      deeef   fdZ
y)WorldGuideGeneratoru   세계관 가이드 생성기.Nr?   c                      y N )self
llm_clients     r   __init__zWorldGuideGenerator.__init__f   s    rE   fulltextlanguagesource_filerF   rQ   project_configc           
      T   ddl m} t        j                  |d      \  }}	t	        d      j                  ||	      }
t	        d      j                  ||t        j                  t        |      dd	      t        j                  t        |      dd	      
      } |d|
|t        |d      S )z?Generate a world guide from screenplay text and extracted data.r   )call_structuredr9   zworld_guide_system.md)source_language_codesource_language_namezworld_guide_user.mdFr#   )ensure_asciiindent)rc   screenplay_textentities_jsonscene_stills_jsonworld_guideprototype_world_guide)stepsystem_promptuser_promptresponse_schemard   schema_name)app.modules.llm.llm_clientrf   LANGUAGE_NAMESrM   rD   formatjsondumpsrP   rX   r8   )r^   ra   rb   rc   rF   rQ   rd   rf   	lang_code	lang_namerq   rr   s               r   generatezWorldGuideGenerator.generatej   s     	?-11(<LM	9$%<=DD!*!* E 
 ##89@@#$**%6x%@u]^_"jj)@u]^_	 A 
 '#.)/
 	
rE   r\   )r?   N)__name__
__module____qualname____doc__r`   strr   r   r   r   r|   r]   rE   r   rZ   rZ   c   s    ( 48 
 
  
 	 

 tCH~& 
 T#s(^$ 
 !c3h0 
 
c3h 
rE   rZ   )r   rx   pathlibr   typingr   r   r   r   __file__resolveparentr   r   r8   r   __annotations__rv   rD   rP   rX   rZ   r]   rE   r   <module>r      s   e   , ,H~%%'..55<<CCiORYY\oo& !$h/"((!3#X.#*qTZ\dSef'.A1X^`hWij(/QAY_aiXjk$+U[]eTfg/6ASUagiq`r&s*1qa[ackZl!m+2q\bdl[m"n$) $$h/#k" $$h/#h ),7
:A-& DcN -` 
O3 O3 O
T#s(^ 4 
d38n9M 

Dc3h0 
T$sCx.5I 
'
 '
rE   