§
    ÚŽ’jéA  ã                   óì   — d Z ddlZddlZddlmZ ddlmZ ddl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mZmZmZmZmZ  G d„ dee¦  «        Z G d„ de¦  «        Z G d„ de¦  «        ZdS )zThe Ollama formatter module.é    N)ÚABC)ÚAny)ÚFieldé   )ÚFormatterBaseé   )Úlogger)Ú_json_loads_with_repair)	ÚMsgÚ	TextBlockÚ	HintBlockÚ	DataBlockÚToolCallBlockÚToolResultBlockÚThinkingBlockÚ	URLSourceÚBase64Sourcec                   óN   — e Zd ZdZdededz  fd„Zedee	z  defd„¦   «         Z
dS )Ú_OllamaFormatterBasezSBase class for Ollama formatters, providing shared data block
    formatting logic.ÚblockÚreturnNc                 ó  ‡— |j         }|j        Št          ˆfd„| j        D ¦   «         ¦  «        st	          j        d‰¦  «         dS ‰                     d¦  «        st	          j        d‰¦  «         dS |                      |¦  «        S )a6  Format a DataBlock into Ollama API format (base64 string).

        Args:
            block (`DataBlock`):
                The data block to format.

        Returns:
            `str | None`:
                Base64 encoded data as a string, or None if the media type
                is not supported.
        c              3   óB   •K  — | ]}t          j         ‰|¦  «        V — Œd S )N)Úfnmatch)Ú.0ÚpatternÚ
media_types     €úTC:\Projects\DSCons\.venv\Lib\site-packages\agentscope\formatter\_ollama_formatter.pyú	<genexpr>zA_OllamaFormatterBase._format_ollama_data_block.<locals>.<genexpr>2   sC   øè è € ð 
ð 
àõ ŒO˜J¨Ñ0Ô0ð
ð 
ð 
ð 
ð 
ð 
ó    z(Media type %s is not supported, skipped.Nzimage/z1Ollama only supports image data, got %s, skipped.)Úsourcer   ÚanyÚsupported_input_media_typesr	   ÚwarningÚ
startswithÚ_format_image_source)Úselfr   r!   r   s      @r   Ú_format_ollama_data_blockz._OllamaFormatterBase._format_ollama_data_block   sÁ   ø€ ð ”ˆØÔ&ˆ
õ ð 
ð 
ð 
ð 
àÔ;ð
ñ 
ô 
ñ 
ô 
ð 	õ ŒNØ:Øñô ð ð �4ð ×$Ò$ XÑ.Ô.ð 	ÝŒNØCØñô ð ð �4à×(Ò(¨Ñ0Ô0Ð0r    r!   c                 ó”  — t          | t          ¦  «        r| j        S t          | t          ¦  «        rùt	          | j        ¦  «        }|                     d¦  «        rx|                     d¦  «        }t          |d¦  «        5 }t          j
        |                     ¦   «         ¦  «                             d¦  «        }ddd¦  «         n# 1 swxY w Y   |S t          j        |d¬¦  «        }|                     ¦   «          t          j
        |j        ¦  «                             d¦  «        }|S t#          dt%          | ¦  «        › �¦  «        ‚)a  Format an image source into Ollama API format (base64 string).

        Args:
            source (`URLSource | Base64Source`):
                The image source to format.

        Returns:
            `str`:
                Base64 encoded image data.
        zfile://Úrbzutf-8Né   )ÚtimeoutzUnsupported source type: )Ú
isinstancer   Údatar   ÚstrÚurlr%   ÚremoveprefixÚopenÚbase64Ú	b64encodeÚreadÚdecodeÚrequestsÚgetÚraise_for_statusÚcontentÚ
ValueErrorÚtype)r!   r0   Ú	file_pathÚfr.   Úresponses         r   r&   z)_OllamaFormatterBase._format_image_sourceF   sn  € õ �f�lÑ+Ô+ð 	IØ”;ÐÝ˜¥	Ñ*Ô*ð 	IÝ�f”j‘/”/ˆCØ�~Š~˜iÑ(Ô(ð à×,Ò,¨YÑ7Ô7�	Ý˜) TÑ*Ô*ð F¨aÝ!Ô+¨A¯FªF©H¬HÑ5Ô5×<Ò<¸WÑEÔE�DðFð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fà�õ $œ<¨°RÐ8Ñ8Ô8�Ø×)Ò)Ñ+Ô+Ð+ÝÔ'¨Ô(8Ñ9Ô9×@Ò@ÀÑIÔI�Ø�åÐG½¸f¹¼ÐGÐGÑHÔHÐHs   Â :CÃC
ÃC
)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r/   r(   Ústaticmethodr   r   r&   © r    r   r   r      s„   € € € € € ðð ð%1àð%1ð 
ˆt‰ð%1ð %1ð %1ð %1ðN ðI Y°Ñ%=ð IÀ#ð Ið Ið Iñ „\ðIð Ið Ir    r   c                   ó~   — e Zd ZU dZ ed„ d¬¦  «        Zee         ed<   dee	         dee
eef                  fd„Zd	S )
ÚOllamaChatFormatterzºThe Ollama formatter class for chatbot scenario, where only a user
    and an agent are involved. We use the `role` field to identify different
    participants in the conversation.
    c                  ó
   — ddgS ©Nz
text/plainzimage/*rE   rE   r    r   ú<lambda>zOllamaChatFormatter.<lambda>m   ó   €  ¨yÐ 9€ r    úEThe supported input types. Defaults to ``["text/plain", "image/*"]``.©Údefault_factoryÚdescriptionÚinput_typesÚmsgsr   c              ƒ   óX  K  — |                       |¦  «         g }|D �]}g }g }|                     ¦   «         D �]®}t          |t          ¦  «        r|                     |j        ¦  «         Œ3t          |t          ¦  «        �r2|s|r=|j        d                     |¦  «        dœ}|r||d<   |                     |¦  «         g }g }t          |j	        t          ¦  «        r|                     d|j	        dœ¦  «         ŒÂg }g }	|j	        D ]s}
t          |
t          ¦  «        r|                     |
j        ¦  «         Œ2t          |
t          ¦  «        r,|                      |
¦  «        }|r|	                     |¦  «         Œt|s|	r4dd                     |¦  «        dœ}|	r|	|d<   |                     |¦  «         �Œ{t          |t          ¦  «        r.|                      |¦  «        }|r|                     |¦  «         �Œ¾t          |t          ¦  «        r�ŒÕt          |t          ¦  «        rZ|                     |j        |rd                     |¦  «        ndd|j        t!          |j        pd¦  «        dœigd	œ¦  «         g }g }�ŒDt          |t$          ¦  «        �r2|s|r=|j        d                     |¦  «        dœ}|r||d<   |                     |¦  «         g }g }|                      |j        ¦  «        \  }}|                     d
|j        |dœ¦  «         |r²g }g }|D ]s}t          |t          ¦  «        r-|                      |¦  «        }|r|                     |¦  «         ŒDt          |t          ¦  «        r|                     |j        ¦  «         Œtd|rd                     |¦  «        n|dœ}|r||d<   |                     |¦  «         �ŒŒt+          j        dt/          |¦  «        ¦  «         �Œ°|s|r=|j        |rd                     |¦  «        nddœ}|r||d<   |                     |¦  «         �Œ|S )a  Format message objects into Ollama API format.

        Args:
            msgs (`list[Msg]`):
                The list of message objects to format.

        Returns:
            `list[dict[str, Any]]`:
                The formatted messages as a list of dictionaries.
        ú
©Úroler:   ÚimagesÚuserÚ Úfunctionz{})ÚnameÚ	arguments)rU   r:   Ú
tool_callsÚtool)rU   Ú	tool_namer:   z2Unsupported block type %s in the message, skipped.)Úassert_list_of_msgsÚget_content_blocksr-   r   ÚappendÚtextr   rU   ÚjoinÚhintr/   r   r(   r   r   rZ   r
   Úinputr   Úconvert_tool_result_to_stringÚoutputr	   r$   r<   )r'   rQ   ÚmessagesÚmsgÚcontent_partsrV   r   Ú	msg_flushÚhint_text_partsÚhint_imagesÚsubÚformatted_subÚhint_msgÚformatted_imageÚtextual_outputÚmultimodal_dataÚuser_imagesÚuser_content_partsÚ
data_blockÚuser_msgÚ
msg_ollamas                        r   ÚformatzOllamaChatFormatter.formatt   sS  è è € ð 	× Ò  Ñ&Ô&Ð&à!ˆØð ]	,ñ ]	,ˆCØˆMØˆFà×/Ò/Ñ1Ô1ð Mñ M�Ý˜e¥YÑ/Ô/ð LØ!×(Ò(¨¬Ñ4Ô4Ð4Ð4å ¥yÑ1Ô1ñ IØ$ð 	$¨ð 	$à$'¤HØ'+§y¢y°Ñ'?Ô'?ð%ð %˜	ð "ð 9Ø28˜I hÑ/Ø Ÿš¨	Ñ2Ô2Ð2Ø(*˜Ø!#˜å! %¤*­cÑ2Ô2ð 6Ø ŸšØ%+¸¼
ÐCÐCñô ð ð ð 68˜Ø13˜Ø#(¤:ð Fð F˜CÝ)¨#­yÑ9Ô9ð FØ /× 6Ò 6°s´xÑ @Ô @Ð @Ð @Ý!+¨CµÑ!;Ô!;ð FØ04×0NÒ0NØ$'ñ1"ô 1" ð $1ð !FØ$/×$6Ò$6°}Ñ$EÔ$EÐ$EøØ*ð 6¨kð 6à(.Ø+/¯9ª9°_Ñ+EÔ+Eð8ð 8˜Hð  +ð AØ5@ ¨Ñ 2Ø$ŸOšO¨HÑ5Ô5Ð5ùå ¥yÑ1Ô1ð dØ&*×&DÒ&DÀUÑ&KÔ&K�OØ&ð 7ØŸš oÑ6Ô6Ð6ùå ¥}Ñ5Ô5ð _ñ å ¥}Ñ5Ô5ð ZØ—O’Oà$'¤Hà,ð($ t§y¢y°Ñ'?Ô'?Ð'?à!#ð %/Ø05´
õ 6MØ,1¬KÐ,?¸4ñ6*ô 6*ð1&ð 1&ð!"ð+ðð ñô ð ð0 %'�MØ�F‘Få ¥Ñ7Ô7ñ >Ø$ð 	$¨ð 	$à$'¤HØ'+§y¢y°Ñ'?Ô'?ð%ð %˜	ð "ð 9Ø28˜I hÑ/Ø Ÿš¨	Ñ2Ô2Ð2Ø(*˜Ø!#˜ð
 ×:Ò:¸5¼<ÑHÔHñØ&Ø'ð —O’Oà$*Ø).¬Ø'5ðð ñô ð ð 'ð 2Ø&(˜Ø-/Ð*Ø*9ð 
Kð 
K˜JÝ)¨*µiÑ@Ô@ð 	Kà$(×$BÒ$BØ(2ñ%&ô %&ð !0ð
 $3ð !HØ$/×$6Ò$6°Ñ$GÔ$GÐ$GøÝ!+¨J½	Ñ!BÔ!Bð KØ 2× 9Ò 9¸*¼/Ñ JÔ JÐ Jøð %+à1ð(0 t§y¢yÐ1CÑ'DÔ'DÐ'Dà!/ð	$ð $˜ð 'ð =Ø1<˜H XÑ.Ø Ÿš¨Ñ1Ô1Ð1ùõ ”NØLÝ˜U™œñô ð ñ ð ð 	, ð 	,àœHà$ð ˜tŸyšy¨Ñ7Ô7Ð7àð	.ð .�
ð ð 2Ø+1�J˜xÑ(Ø—’ 
Ñ+Ô+Ð+ùàˆr    N)r@   rA   rB   rC   r   rP   Úlistr/   Ú__annotations__r   Údictr   ry   rE   r    r   rG   rG   f   s—   € € € € € € ðð ð
 #˜UØ9Ð9ð9ðñ ô €K��c”ð ð ñ ðpà�3Œiðpð 
ˆd�3˜�8ŒnÔ	ðpð pð pð pð pð pr    rG   c            	       óF  — e Zd ZU dZ edd¬¦  «        Zeed<    ed„ d¬¦  «        Ze	e         ed	<   d
e	e
         de	eeef                  fd„Zd
e	e
         de	eeef                  fd„Zd
e	e
         dede	eeef                  fd„Zede
deeef         fd„¦   «         ZdS )ÚOllamaMultiAgentFormatterzo
    Ollama formatter for multi-agent conversations, where more than
    a user and an agent are involved.
    zg# Conversation History
The content between <history></history> tags contains your conversation history
z7The prompt to use for the conversation history section.)ÚdefaultrO   Úconversation_history_promptc                  ó
   — ddgS rI   rE   rE   r    r   rJ   z"OllamaMultiAgentFormatter.<lambda>7  rK   r    rL   rM   rP   rQ   r   c              ƒ   ó"  K  — |                       |¦  «         g }d}t          |¦  «        dk    rG|d         j        dk    r6|                     |                      |d         ¦  «        ƒ d{V —†¦  «         d}d}|                      ||d…         ¦  «        2 3 d{V —†\  }}|xdk    r0 |                     |                      |¦  «        ƒ d{V —†¦  «         ŒAdk    r2|                     |                      ||¦  «        ƒ d{V —†¦  «         d}ŒxŒy6 |S )	zjFormat input messages into the structure required by the Ollama
        API for multi-agent conversations.r   ÚsystemNr   TÚtool_sequenceÚagent_messageF)	r_   ÚlenrU   ra   Ú_format_system_messageÚ_group_messagesÚextendÚ_format_tool_sequenceÚ_format_agent_message)r'   rQ   Úformatted_msgsÚstart_indexÚis_first_agent_messageÚtypÚgroups          r   ry   z OllamaMultiAgentFormatter.format>  s˜  è è € ð 	× Ò  Ñ&Ô&Ð&àˆØˆÝˆt‰9Œ9�qŠ=ˆ=˜T !œWœ\¨XÒ5Ð5Ø×!Ò!Ø×1Ò1°$°q´'Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:ñô ð ð ˆKà!%ÐØ $× 4Ò 4°T¸+¸,¸,Ô5GÑ HÔ Hð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3‘*�#�uØØ$�_’_�_�_Ø"×)Ò)Ø"×8Ò8¸Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?ñô ð ð ð %’_�_Ø"×)Ò)Ø"×8Ò8Ø!Ø2ñô ð ð ð ð ð ð ñô ð ð .3Ð*Ð*ð %ð !Ið Ðs   ÂDc              ƒ   ób   K  — t          | j        ¬¦  «                             |¦  «        ƒ d{V —†S )z+Format a sequence of tool-related messages.)rP   N)rG   rP   ry   )r'   rQ   s     r   rŠ   z/OllamaMultiAgentFormatter._format_tool_sequence]  sN   è è € õ
 )ØÔ(ð
ñ 
ô 
ç
Š&�‰,Œ,ðð ð ð ð ð ð 	r    Úis_firstc              ƒ   óŠ  K  — g }g }g }|D �]}g }|j         r|                     |j         › d�¦  «         |                     ¦   «         D ]³}t          |t          ¦  «        r|                     |j        ¦  «         Œ2t          |t          ¦  «        r-|                      |¦  «        }	|	r|                     |	¦  «         Œtt          |t          t          f¦  «        rŒ‘t          j        dt          |¦  «        ¦  «         Œ´|r(|                     d                     |¦  «        ¦  «         �Œ|r*|                     dd                     |¦  «        i¦  «         |r©|r§|d                              d¦  «        r#| j        dz   |d         d         z   |d         d<   n |                     dd| j        dz   i¦  «         |d                              d¦  «        r|d         dxx         dz  cc<   n|                     dd	i¦  «         d                     d
„ |D ¦   «         ¦  «        }
d|
dœ}|r||d<   g }|r|                     |¦  «         |S )z7Format agent messages into conversation history format.ú:z4Unsupported block type %s in agent message, skipped.rS   rb   r   z
<history>
éÿÿÿÿz
</history>z
</history>c              3   óB   K  — | ]}|                      d d¦  «        V — ŒdS )rb   rX   N)r8   )r   Úconversation_blocks     r   r   zBOllamaMultiAgentFormatter._format_agent_message.<locals>.<genexpr>£  sF   è è € ð -
ð -
à"ð ×"Ò" 6¨2Ñ.Ô.ð-
ð -
ð -
ð -
ð -
ð -
r    rW   rT   rV   )rZ   ra   r`   r-   r   rb   r   r(   r   r   r	   r$   r<   rc   r8   r€   Úinsert)r'   rQ   r’   Úconversation_blocksÚaccumulated_textrV   ri   Úmsg_text_partsr   rq   Úconversation_blocks_textÚuser_messagerŒ   s                r   r‹   z/OllamaMultiAgentFormatter._format_agent_messagef  sé  è è € ð +-ÐØ&(ÐØˆàð 	Cñ 	CˆCØˆNØŒxð 6Ø×%Ò%¨¬ n n nÑ5Ô5Ð5à×/Ò/Ñ1Ô1ð ð �Ý˜e¥YÑ/Ô/ð Ø"×)Ò)¨%¬*Ñ5Ô5Ð5Ð5Ý ¥yÑ1Ô1ð 
Ø&*×&DÒ&DÀUÑ&KÔ&K�OØ&ð 7ØŸš oÑ6Ô6Ð6øÝ ­	µ=Ð'AÑBÔBð Øå”NØNÝ˜U™œñô ð ð ð
 ð CØ ×'Ò'¨¯	ª	°.Ñ(AÔ(AÑBÔBÐBùàð 	Ø×&Ò&Ø˜ŸšÐ#3Ñ4Ô4Ð5ñô ð ð ð 	C 8ð 	CØ" 1Ô%×)Ò)¨&Ñ1Ô1ð àÔ4Ø#ñ$à)¨!Ô,¨VÔ4ñ5ð $ AÔ& vÑ.Ð.ð $×*Ò*Øà Ô @Ø'ñ!(ðñô ð ð # 2Ô&×*Ò*¨6Ñ2Ô2ð CØ# BÔ'¨Ð/Ð/Ô/°>ÑAÐ/Ð/Ñ/Ð/ð $×*Ò*¨F°LÐ+AÑBÔBÐBà#'§9¢9ð -
ð -
à&9ð-
ñ -
ô -
ñ $
ô $
Ð ð Ø/ð(
ð (
ˆð ð 	,Ø%+ˆL˜Ñ"àˆØð 	0Ø×!Ò! ,Ñ/Ô/Ð/àÐr    ri   c              ƒ   ó  K  — g }|                       ¦   «         D ]T}t          |t          ¦  «        r|                     |j        ¦  «         Œ2t          j        dt          |¦  «        ¦  «         ŒUdd                     |¦  «        dœS )zFormat a system message.z5Unsupported block type %s in system message, skipped.rƒ   rS   rT   )	r`   r-   r   ra   rb   r	   r$   r<   rc   )ri   Ú
text_partsr   s      r   r‡   z0OllamaMultiAgentFormatter._format_system_messageµ  s›   è è € ð ˆ
Ø×+Ò+Ñ-Ô-ð 	ð 	ˆEÝ˜%¥Ñ+Ô+ð Ø×!Ò! %¤*Ñ-Ô-Ð-Ð-å”ØKÝ˜‘K”Kñô ð ð ð
 Ø—y’y Ñ,Ô,ð
ð 
ð 	
r    N)r@   rA   rB   rC   r   r€   r/   r{   rP   rz   r   r|   r   ry   rŠ   Úboolr‹   rD   r‡   rE   r    r   r~   r~   '  sv  € € € € € € ðð ð
 (- uð*ð Nð(ñ (ô (Ð ð ð ñ ð #˜UØ9Ð9ð9ðñ ô €K��c”ð ð ñ ð  c¤ð ¨t°D¸¸c¸´NÔ/Cð ð ð ð ð>à�3Œiðð 
ˆd�3˜�8ŒnÔ	ðð ð ð ðMà�3ŒiðMð ðMð 
ˆd�3˜�8ŒnÔ	ð	Mð Mð Mð Mð^ ð
¨#ð 
°$°s¸C°x´.ð 
ð 
ð 
ñ „\ð
ð 
ð 
r    r~   )rC   r3   r   Úabcr   Útypingr   r7   Úpydanticr   Ú_formatter_baser   Ú_loggingr	   Ú_utils._commonr
   Úmessager   r   r   r   r   r   r   r   r   r   rG   r~   rE   r    r   ú<module>r¨      s°  ðà "Ð "Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€Ø Ð Ð Ð Ð Ð à *Ð *Ð *Ð *Ð *Ð *Ø Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ðHIð HIð HIð HIð HI˜=¨#ñ HIô HIð HIðV~ð ~ð ~ð ~ð ~Ð.ñ ~ô ~ð ~ðB]
ð ]
ð ]
ð ]
ð ]
Ð 4ñ ]
ô ]
ð ]
ð ]
ð ]
r    