§
    	Êj6  ã                  óŒ   — d Z ddlmZ ddlmZmZ ddlmZ dddddd	œZe G d
„ d¦  «        ¦   «         Z	dd„Z
dd„Zdd„Zd d„ZdS )!a  Convert OpenAI-style message lists into a single prompt for the muse web chat.

muse.ai's web UI is a single text box, so multi-turn context and system prompts
are serialised into one message. Image parts are extracted separately so that
drivers can attach them as files.
é    )Úannotations)Ú	dataclassÚfield)ÚAnyÚSystemÚUserÚ	AssistantÚTool)ÚsystemÚ	developerÚuserÚ	assistantÚtoolc                  ó<   — e Zd ZU ded<    ee¬¦  «        Zded<   dS )Ú
FlatPromptÚstrÚtext)Údefault_factoryú	list[str]ÚimagesN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   Úlistr   © ó    ú0C:\Projects\Muse2API\src\muse2api\core\prompt.pyr   r      s9   € € € € € € à€I€I�IØ˜¨dÐ3Ñ3Ô3€FÐ3Ð3Ð3Ñ3ØWÐWr   r   Úcontentr   r   r   Úreturnr   c                ó.  — | €dS t          | t          ¦  «        r| S g }| D ]×}t          |t          ¦  «        s#|                     t          |¦  «        ¦  «         Œ:|                     d¦  «        }|dv r*|                     |                     dd¦  «        ¦  «         Œ}|dv rV|                     d¦  «        }t          |t          ¦  «        r|                     d¦  «        }|r|                     |¦  «         ŒØd                     d	„ |D ¦   «         ¦  «        S )
NÚ Útype)r   Ú
input_textÚoutput_textr   )Ú	image_urlÚinput_imager&   Úurlú
c              3  ó   K  — | ]}|¯|V — Œ	d S )Nr   )Ú.0Úps     r   ú	<genexpr>z#_content_to_text.<locals>.<genexpr>0   s'   è è € Ð+Ð+˜1¨Ð+�QÐ+Ð+Ð+Ð+Ð+Ð+r   )Ú
isinstancer   ÚdictÚappendÚgetÚjoin)r   r   ÚpartsÚpartÚptypeÚrefs         r   Ú_content_to_textr7      s  € Ø€ØˆrÝ�'�3ÑÔð ØˆØ€EØð #ð #ˆÝ˜$¥Ñ%Ô%ð 	Ø�LŠL�˜T™œÑ#Ô#Ð#ØØ—’˜Ñ Ô ˆØÐ9Ð9Ð9Ø�LŠL˜Ÿš &¨"Ñ-Ô-Ñ.Ô.Ð.Ð.ØÐ2Ð2Ð2Ø—(’(˜;Ñ'Ô'ˆCÝ˜#�tÑ$Ô$ð %Ø—g’g˜e‘n”n�Øð #Ø—’˜cÑ"Ô"Ð"øØ�9Š9Ð+Ð+ Ð+Ñ+Ô+Ñ+Ô+Ð+r   Úmessagesúlist[dict[str, Any]]úlist[tuple[str, str]]c                óØ   — g }| D ]d}t          |                     d¦  «        g ¦  «                             ¦   «         }|r+|                     |                     dd¦  «        |f¦  «         Œe|S )zHRole/text pairs, using the same text extraction as ``flatten_messages``.r   Úroler   )r7   r1   Ústripr0   )r8   ÚturnsÚmsgr   s       r   Úmessage_turnsr@   3   sp   € à#%€EØð :ð :ˆÝ §¢¨	Ñ 2Ô 2°BÑ7Ô7×=Ò=Ñ?Ô?ˆØð 	:Ø�LŠL˜#Ÿ'š' &¨&Ñ1Ô1°4Ð8Ñ9Ô9Ð9øØ€Lr   ÚpreviousÚincomingú
str | Nonec                óÄ  — | r t          |¦  «        t          | ¦  «        k    rdS |dt          | ¦  «        …         t          | ¦  «        k    rdS t          |t          | ¦  «        d…         ¦  «        }|r,|d         d         dv r|dd…         }|r|d         d         dv °g }|D ]#\  }}|dk    r dS |                     |¦  «         Œ$|sdS d                     |¦  «        S )zðText to send when ``incoming`` continues a conversation already on the page.

    Returns only the new user text. ``None`` means the histories do not line up, so the
    caller must open a fresh thread and send the full prompt instead.
    Nr   )r   r   é   r   ú

)Úlenr   r0   r2   )rA   rB   ÚextraÚ	user_textr<   r   s         r   Úfollowup_textrJ   =   s  € ð ð •s˜8‘}”}­¨H©¬Ò5Ð5ØˆtØ�•#�h‘-”-�Ô ¥D¨¡N¤NÒ2Ð2ØˆtÝ��#˜h™-œ-˜/˜/Ô*Ñ+Ô+€EØ
ð �E˜!”H˜Q”KÐ#8Ð8Ð8Ø�a�b�b”	ˆð ð �E˜!”H˜Q”KÐ#8Ð8Ð8à€IØð ð ‰
ˆˆdØ�6Š>ˆ>Ø�4�4Ø×Ò˜ÑÔÐÐØð ØˆtØ�;Š;�yÑ!Ô!Ð!r   c                ó  — g }g }| D ]f}|                      dd¦  «        }t          |                      d¦  «        |¦  «                             ¦   «         }|r|                     ||f¦  «         Œg|st	          d|¬¦  «        S t          |¦  «        dk    r/|d         d         dk    rt	          |d         d         |¬¦  «        S d„ |D ¦   «         }|                     d	¦  «         t	          d
                     |¦  «        |¬¦  «        S )Nr<   r   r   r"   )r   r   rE   r   c                óz   — g | ]8\  }}d t                                ||                     ¦   «         ¦  «        › d|› �‘Œ9S )ú[z]
)ÚROLE_LABELSr1   Útitle)r+   r<   r   s      r   ú
<listcomp>z$flatten_messages.<locals>.<listcomp>d   sC   € ÐYÐYÐYÁZÀTÈ4Ð@•+—/’/ $¨¯
ª
©¬Ñ5Ô5Ð@Ð@¸$Ð@Ð@ÐYÐYÐYr   zy[Instruction]
Continue the conversation above and reply as the Assistant to the last User message. Output only the reply.rF   )r1   r7   r=   r0   r   rG   r2   )r8   r   r>   r?   r<   r   Úblockss          r   Úflatten_messagesrR   T   s  € Ø€FØ#%€EØð 'ð 'ˆØ�wŠw�v˜vÑ&Ô&ˆÝ §¢¨	Ñ 2Ô 2°FÑ;Ô;×AÒAÑCÔCˆØð 	'Ø�LŠL˜$ ˜Ñ&Ô&Ð&øàð 2Ý˜r¨&Ð1Ñ1Ô1Ð1õ ˆ5�z„z�Q‚€˜5 œ8 Aœ;¨&Ò0Ð0Ý˜u Qœx¨œ{°6Ð:Ñ:Ô:Ð:àYÐYÐSXÐYÑYÔY€FØ
‡M‚Mð	/ñô ð õ ˜6Ÿ;š; vÑ.Ô.°vÐ>Ñ>Ô>Ð>r   N)r   r   r   r   r    r   )r8   r9   r    r:   )rA   r:   rB   r:   r    rC   )r8   r9   r    r   )Ú__doc__Ú
__future__r   Údataclassesr   r   Útypingr   rN   r   r7   r@   rJ   rR   r   r   r   ú<module>rW      s   ððð ð #Ð "Ð "Ð "Ð "Ð "à (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð ð ØØØØðð €ð ðXð Xð Xð Xð Xñ Xô Xñ „ðXð,ð ,ð ,ð ,ð,ð ð ð ð"ð "ð "ð "ð.?ð ?ð ?ð ?ð ?ð ?r   