Ë
    åÞÅj¯&  ã                   óx   — d dl Z d dlZd dlZd dlZd dlZ ej
                  e«      Zh d£Zd„ Z	d„ Z
 G d„ d«      Zy)é    N>   ÚboyÚ1boyÚgirlÚsoloÚ1girlÚ1girlsÚ1otherÚandrogynousc                 ó.  — t        j                  d| «      }|r|j                  d«      j                  «       nd}t        j                  dd| «      }|j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}||fS c c}w )zP-> (nombre_lora|None, [tags]). Acepta el tag <lora:...> al principio o al final.z<lora:([^:>]+):[^>]*>é   Nz<lora:[^:>]+:[^>]*>Ú Ú,)ÚreÚsearchÚgroupÚstripÚsubÚsplit)ÚlineÚmÚloraÚrestÚtÚtagss         ú7C:\Users\Usuario\Downloads\NEW\Engine\prompt_builder.pyÚparse_character_liner      sy   € ä
�	‰	Ð*¨DÓ1€AÙ!"ˆ1�7‰7�1‹:×ÑÔ¨€DÜ�6‰6Ð(¨#¨tÓ4€DØ#Ÿz™z¨#œÓ<™˜!°!·'±'µ)ˆA�G‰G�I˜€DÐ<Ø�ˆ:Ðùò =s   Á$BÁ:Bc                 ó  — i }| D ]+  }t        |«      \  }}|sŒ|j                  |d«      dz   ||<   Œ- g }i }| D ]Å  }t        |«      \  }}|j                  |d«      dkD  }|D �	cg c]=  }	|	j                  «       t        vr%|r!|	j                  «       |j                  «       k7  r|	‘Œ? }
}	|r|
r|
d   n|xs |dd }n|xs |
r|
d   n|dd }||v r||xx   dz  cc<   |› d||   › �}nd||<   |j	                  |||f«       ŒÇ |S c c}	w )a‚  -> [(clave, linea, lora)] con una clave unica por personaje.

    La clave es el nombre del LoRA, salvo que varias lineas compartan ese LoRA
    (pack multi-personaje): ahi se usa el primer tag que difiere del nombre del
    LoRA, que normalmente es el triggerword. Los tags genericos (1girl, solo...)
    se descartan siempre. Ninguna clave se inventa: sale de un tag de la linea.
    r   r   Né   Ú#)r   ÚgetÚlowerÚGENERIC_TAGSÚappend)ÚrowsÚ
lora_countr   r   Ú_ÚoutÚusedr   Ú	ambiguousr   ÚcandsÚkeys               r   Úcompute_character_keysr,      s;  € ð €JÛˆÜ& tÓ,‰ˆˆaÚØ)Ÿ~™~¨d°AÓ6¸Ñ:ˆJ�tÒð ð
 €CØ€DÛˆÜ)¨$Ó/‰
ˆˆdØ—N‘N 4¨Ó+¨aÑ/ˆ	Ù ó >™D�qØ—G‘G“I¤\Ñ1Ù !§'¡'£)¨t¯z©z«|Ò";ò ˜Dˆð >ñ Ù#�%˜’(¨$Ò*;°$°s¸°)‰CàÒ<¡u˜5 š8°$°s¸°)ˆCà�$‰;Ø�‹I˜‰N‹IØ�E˜˜4 ™9˜+Ð&‰CàˆD�‰Ià�
‰
�C˜˜tÐ$Õ%ð# ð$ €Jùò>s   Á#ADc                   óf   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zdd„Z	 	 	 dd„Zdd„Zy)ÚPromptBuilderc                 ó  — || _         t        j                  j                  |d«      | _        t        j                  j                  |d«      | _        d| _        d| _        i | _        i | _	        i | _
        | j                  «        y )NÚConfigÚArchivosÚ )Úbase_dirÚosÚpathÚjoinÚ
config_dirÚarchivos_dirÚmaster_promptÚnegative_promptÚ
exceptionsÚ
charactersÚ	wildcardsÚ	_load_all)Úselfr3   s     r   Ú__init__zPromptBuilder.__init__;   se   € Ø ˆŒÜŸ'™'Ÿ,™, x°Ó:ˆŒÜŸG™GŸL™L¨°:Ó>ˆÔàˆÔØ!ˆÔØˆŒØˆŒØˆŒà�‰Õó    c                 ó„   — | j                  «        | j                  «        | j                  «        | j                  «        y ©N)Ú_load_master_promptÚ_load_exceptionsÚ_load_charactersÚ_load_wildcards©r?   s    r   r>   zPromptBuilder._load_allH   s2   € Ø× Ñ Ô"Ø×ÑÔØ×ÑÔØ×ÑÕrA   c                 ó`  — t         j                  j                  | j                  d«      }t         j                  j	                  |«      st
        j                  d|› �«       y t        |dd¬«      5 }t        j                  |«      }d d d «       j                  dd«      j                  «       j                  d«      | _        |j                  d	d«      j                  «       j                  d«      | _        t
        j                  d
t!        | j                  «      › d�«       y # 1 sw Y   ŒžxY w)Nzmaster_prompt.yamlz No existe master_prompt.yaml en Úrúutf-8©Úencodingr9   r2   r   r:   zMaster prompt cargado: ú chars)r4   r5   r6   r7   ÚexistsÚloggerÚerrorÚopenÚyamlÚ	safe_loadr    r   Úrstripr9   r:   ÚinfoÚlen)r?   r5   ÚfÚdatas       r   rD   z!PromptBuilder._load_master_promptN   sß   € Ü�w‰w�|‰|˜DŸO™OÐ-AÓBˆÜ�w‰w�~‰~˜dÔ#Ü�L‰LÐ;¸D¸6ÐBÔCØä�$˜ gÕ.°!Ü—>‘> !Ó$ˆD÷ /ð "ŸX™X o°rÓ:×@Ñ@ÓB×IÑIÈ#ÓNˆÔØ#Ÿx™xÐ(9¸2Ó>×DÑDÓF×MÑMÈcÓRˆÔÜ�‰Ð-¬c°$×2DÑ2DÓ.EÐ-FÀfÐMÕN÷ /Ð.ús   Á1D$Ä$D-c                 ó   — t         j                  j                  | j                  d«      }t         j                  j	                  |«      st
        j                  d«       y t        |dd¬«      5 }t        j                  |«      }d d d «       xs i | _
        | j                  j                  d«      xs i }| j                  j                  d«      xs i }t
        j                  dt        |«      › d	t        |«      › d
�«       y # 1 sw Y   Œ�xY w)Nzexcepciones_maestras.yamlz#No existe excepciones_maestras.yamlrJ   rK   rL   ÚglobalesÚ
personajeszExcepciones cargadas: z globales, z personajes)r4   r5   r6   r7   rO   rP   ÚwarningrR   rS   rT   r;   r    rV   rW   )r?   r5   rX   rY   r[   r\   s         r   rE   zPromptBuilder._load_exceptions[   sÊ   € Ü�w‰w�|‰|˜DŸO™OÐ-HÓIˆÜ�w‰w�~‰~˜dÔ#Ü�N‰NÐ@ÔAØä�$˜ gÕ.°!Ü—>‘> !Ó$ˆD÷ /ð š* "ˆŒØ—?‘?×&Ñ& zÓ2Ò8°bˆØ—_‘_×(Ñ(¨Ó6Ò<¸"ˆ
Ü�‰Ð,¬S°«]¨O¸;ÄsÈ:ÃÐFWÐWbÐcÕd÷ /Ð.ús   Á.DÄDc                 ó´  — t         j                  j                  | j                  d«      }t         j                  j                  | j                  d«      }g }t         j                  j	                  |«      rTt        |dd¬«      5 }|D ]7  }|j                  «       }|r|j                  d«      rŒ'|j                  |«       Œ9 	 d d d «       t        |«      D ]  \  }}}|d|dœ| j                  |<   Œ t         j                  j	                  |«      r…t        |dd¬«      5 }|D ]h  }|j                  «       }|r|j                  d«      rŒ't        |«      \  }}| j                  j                  «       D ]  }	|	d	   sŒ	|	d	   |k(  sŒ||	d
<    Œh Œj 	 d d d «       t        j                  dt        | j                  «      › �«       y # 1 sw Y   �ŒxY w# 1 sw Y   ŒBxY w)Nzpersonajes.txtzpersonajes_outfit.txtrJ   z	utf-8-sigrL   r   r2   )ÚbaseÚoutfitr   r   r`   zPersonajes cargados: )r4   r5   r6   r8   rO   rR   r   Ú
startswithr#   r,   r<   r   ÚvaluesrP   rV   rW   )
r?   Ú	base_fileÚoutfit_filer$   rX   r   r+   r   r&   Úchars
             r   rF   zPromptBuilder._load_charactersi   s~  € Ü—G‘G—L‘L ×!2Ñ!2Ð4DÓEˆ	Ü—g‘g—l‘l 4×#4Ñ#4Ð6MÓNˆàˆÜ�7‰7�>‰>˜)Ô$Ü�i ¨{Õ;¸qÛ�DØŸ:™:›<�DÙ 4§?¡?°3Ô#7Ø Ø—K‘K Õ%ñ	 ÷ <ô  6°dÖ;‰OˆC��tØ,0¸BÈÑ#MˆD�O‰O˜CÒ ð  <ô �7‰7�>‰>˜+Ô&Ü�k 3°Õ=ÀÛ�DØŸ:™:›<�DÙ 4§?¡?°3Ô#7Ø ä2°4Ó8‘G�D˜!Ø $§¡× 6Ñ 6Ö 8˜Ø ›<¨D°©L¸DÓ,@Ø-1˜D ™NÙ!ñ !9ñ ÷ >ô 	�‰Ð+¬C°·±Ó,@Ð+AÐBÕC÷/ <Ñ;ú÷ >Ð=ús%   Â=GÄAGÅ9GÆ
GÇGÇGc           	      ó²  — t         j                  j                  | j                  d«      }t         j                  j	                  |«      st
        j                  d|› �«       y dD ]ß  }t         j                  j                  ||«      }t         j                  j	                  |«      sŒC|j                  dd«      }t        |dd¬«      5 }|D �cg c]5  }|j                  «       sŒ|j                  d	«      rŒ&|j                  «       ‘Œ7 }}d d d «       | j                  |<   t
        j                  d
|› dt        |«      › d�«       Œá y c c}w # 1 sw Y   ŒExY w)Nr=   zNo existe carpeta wildcards: )zpose.txtz	scene.txtzdetails.txtz
outfit.txtz.txtr2   rJ   rK   rL   r   z
Wildcard 'ú': z	 opciones)r4   r5   r6   r8   rO   rP   r]   ÚreplacerR   r   ra   r=   rV   rW   )r?   Úwc_dirÚfilenameÚfilepathr+   rX   ÚlÚliness           r   rG   zPromptBuilder._load_wildcardsˆ   s  € Ü—‘—‘˜d×/Ñ/°Ó=ˆÜ�w‰w�~‰~˜fÔ%Ü�N‰NÐ:¸6¸(ÐCÔDØãNˆHÜ—w‘w—|‘| F¨HÓ5ˆHÜ�w‰w�~‰~˜hÕ'Ø×&Ñ& v¨rÓ2�Ü˜( C°'Õ:¸aÙ01ÓY±¨1°Q·W±WµYÀqÇ|Á|ÐTWÕGX˜QŸW™W�Y°�EÐY÷ ;à&+�—‘˜sÑ#Ü—‘˜j¨¨¨S´°U³°¸IÐFÕGñ Oùò
 Z÷ ;Ð:ús*   ÃEÃEÃ#EÃ5EÄEÅEÅE	c                 óH   — t        | j                  j                  «       «      S rC   )Úsortedr<   ÚkeysrH   s    r   Úget_character_namesz!PromptBuilder.get_character_names—   s   € Ü�d—o‘o×*Ñ*Ó,Ó-Ð-rA   c                 ó8   — | j                   j                  |«      S rC   )r<   r    )r?   Únames     r   Úget_characterzPromptBuilder.get_characterš   s   € Ø�‰×"Ñ" 4Ó(Ð(rA   c                 ó:   — | j                   j                  |g «      S rC   )r=   r    )r?   Úwc_types     r   Úget_wildcard_optionsz"PromptBuilder.get_wildcard_options�   s   € Ø�~‰~×!Ñ! '¨2Ó.Ð.rA   c                 ój   — | j                   j                  |g «      }|rt        j                  |«      S y)Nr2   )r=   r    ÚrandomÚchoice)r?   rv   Úoptionss      r   Úrandom_wildcardzPromptBuilder.random_wildcard    s-   € Ø—.‘.×$Ñ$ W¨bÓ1ˆÙÜ—=‘= Ó)Ð)ØrA   c                 ó¶  — d}d}| j                   j                  di «      }|j                  di «      }|rS|j                  dg «      }|D ]<  }	|	j                  «       |j                  «       v sŒ$|d|j                  dd«      › �z  } n |j                  di «      }
|
rS|
j                  dg «      }|D ]<  }	|	j                  «       |j                  «       v sŒ$|d|
j                  dd«      › �z  } n | j                   j                  d«      xs i }||v r§||   }|j                  d	i «      }||v r6|d||   j                  d
d«      › �z  }|d||   j                  dd«      › �z  }|j                  di «      }|D ]?  }|j                  «       |j                  «       v sŒ$|d||   j                  dd«      › �z  } n |j                  d«      |j                  d«      fS )Nr2   r[   Úbloqueo_reflejosÚdisparadoresú, Úinyectar_negativoÚbloqueo_oceanor\   ÚoutfitsÚpositivo_extraÚnegativo_extraÚ
escenarios)r;   r    r!   r   )r?   Úcharacter_namer`   ÚsceneÚ	pos_extraÚ	neg_extrar[   r~   r   Údr‚   Úpersonajes_excÚp_excÚ
outfit_excÚescenario_excr+   s                   r   Úapply_exceptionszPromptBuilder.apply_exceptions¦   sù  € Øˆ	Øˆ	à—?‘?×&Ñ& z°2Ó6ˆà#Ÿ<™<Ð(:¸BÓ?ÐÙØ+×/Ñ/°ÀÓCˆLÛ!�Ø—7‘7“9 §¡£Ò-Ø 2Ð&6×&:Ñ&:Ð;NÐPRÓ&SÐ%TÐ!UÑU�IÙð "ð
 "Ÿ™Ð&6¸Ó;ˆÙØ)×-Ñ-¨n¸bÓAˆLÛ!�Ø—7‘7“9 §¡£Ò.Ø 2 n×&8Ñ&8Ð9LÈbÓ&QÐ%RÐ!SÑS�IÙð "ð
 Ÿ™×,Ñ,¨\Ó:Ò@¸bˆØ˜^Ñ+Ø" >Ñ2ˆEàŸ™ 9¨bÓ1ˆJØ˜Ñ#Ø˜r *¨VÑ"4×"8Ñ"8Ð9IÈ2Ó"NÐ!OÐPÑP�	Ø˜r *¨VÑ"4×"8Ñ"8Ð9IÈ2Ó"NÐ!OÐPÑP�	à!ŸI™I l°BÓ7ˆMÛ$�Ø—9‘9“; %§+¡+£-Ò/Ø 2 m°CÑ&8×&<Ñ&<Ð=MÈrÓ&RÐ%SÐ!TÑT�IÙð %ð
 �‰˜tÓ$ i§o¡o°dÓ&;Ð;Ð;rA   Nc           	      ó¾  — | j                   j                  |«      }|st        d|› d�«      ‚|d   }	|€|j                  dd«      }
n#|| j                  j                  dg «      v r|}
n|}
|r|n| j	                  d«      }|r|n| j	                  d«      }|r|n| j	                  d«      }|rd	nd}| j                  ||
|«      \  }}| j                  |	||
|||||g	}d
j                  |D �cg c]  }|sŒ|‘Œ	 c}«      }| j                  |g}d
j                  |D �cg c]  }|sŒ|‘Œ	 c}«      }t        j                  d|› dt        |«      › d�«       ||fS c c}w c c}w )NzPersonaje 'z!' no encontrado en personajes.txtr_   r`   r2   rˆ   ÚposeÚdetailszage up, mature femaler€   zPrompt construido para 'rg   rN   )r<   r    Ú
ValueErrorr=   r|   r�   r9   r6   r:   rP   rV   rW   )r?   r‡   r`   rˆ   r’   r“   Ú
extra_tagsÚalways_age_upre   Ú	char_tagsÚoutfit_tagsÚ
scene_tagsÚ	pose_tagsÚdetails_tagsÚage_upr‰   rŠ   ÚpartsÚpÚpositiveÚ	neg_partsÚnÚnegatives                          r   Úbuild_promptzPromptBuilder.build_promptÍ   sƒ  € ð �‰×"Ñ" >Ó2ˆÙÜ˜{¨>Ð*:Ð:[Ð\Ó]Ð]à˜‘Lˆ	àˆ>ØŸ(™( 8¨RÓ0‰KØ�t—~‘~×)Ñ)¨(°BÓ7Ñ7Ø ‰Kà ˆKá#‘U¨×)=Ñ)=¸gÓ)Fˆ
Ù ‘D d×&:Ñ&:¸6Ó&Bˆ	Ù")‘w¨t×/CÑ/CÀIÓ/Nˆá,9Ñ(¸rˆà#×4Ñ4°^À[ÐR\Ó]Ñˆ	�9ð ×ÑØØØØØØØØð

ˆð —9‘9©Ó4© A²!ša¨Ñ4Ó5ˆà×)Ñ)¨9Ð5ˆ	Ø—9‘9©Ó8© A²aša¨Ñ8Ó9ˆä�‰Ð.¨~Ð.>¸cÄ#ÀhÃ-ÀÐPVÐWÔXØ˜Ð!Ð!ùò 5ùò 9s   Ã)EÃ1EÄEÄ!Ec                 ó.  — |€6t        j                  t        | j                  j	                  «       «      «      }| j
                  j                  dg «      }|dk(  r<t        |«      dk\  rt        j                  |d d «      nt        j                  |«      }n8|dk(  r|rt        j                  |«      nd}n|rt        j                  |«      nd}| j                  d«      }| j                  d«      }| j                  d«      }| j                  |||||¬	«      S )
Nr`   Ú
suggestiveé   Úexplicitr2   rˆ   r’   r“   )r‡   r`   rˆ   r’   r“   )
ry   rz   Úlistr<   rp   r=   r    rW   r|   r£   )r?   r‡   Úspice_levelÚoutfit_optionsr`   rˆ   r’   r“   s           r   Úbuild_randomzPromptBuilder.build_randomø   sú   € ØÐ!Ü#Ÿ]™]¬4°·±×0DÑ0DÓ0FÓ+GÓHˆNàŸ™×+Ñ+¨H°bÓ9ˆØ˜,Ò&Ü;>¸~Ó;NÐRTÒ;T”V—]‘] >°#°2Ð#6Ô7ÔZ`×ZgÑZgÐhvÓZw‰FØ˜JÒ&Ù6D”V—]‘] >Ô2È"‰Fá6D”V—]‘] >Ô2È"ˆFà×$Ñ$ WÓ-ˆØ×#Ñ# FÓ+ˆØ×&Ñ& yÓ1ˆà× Ñ Ø)ØØØØð !ó 
ð 	
rA   )r2   r2   )NNNNr2   T)Nr¥   )Ú__name__Ú
__module__Ú__qualname__r@   r>   rD   rE   rF   rG   rq   rt   rw   r|   r�   r£   r«   © rA   r   r.   r.   :   sU   „ òòòOòeòDò>Hò.ò)ò/òó%<ðN ?CØ9;Ø#'ó)"ôV
rA   r.   )r4   r   ry   ÚloggingrS   Ú	getLoggerr¬   rP   r"   r   r,   r.   r¯   rA   r   Ú<module>r²      sB   ðÛ 	Û 	Û Û Û à	ˆ×	Ñ	˜8Ó	$€âZ€òò"÷JT
ò T
rA   