Ë
    uPêjH!  ã                   ór   — d dl mZmZ d dlZd dlmZ d dlmZ  G d„ de«      Zd„ Z	d dl
mZ  G d	„ d
e«      Zy)é    )ÚAnyÚFinalN)Úverbose_logger)ÚBaseLLMExceptionc                   óF   ‡ — e Zd Zdededeej                  z  fˆ fd„Zˆ xZ	S )ÚOllamaErrorÚstatus_codeÚmessageÚheadersc                 ó*   •— t         ‰| �  |||¬«       y )N)r	   r
   r   )ÚsuperÚ__init__)Úselfr	   r
   r   Ú	__class__s       €úe/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/ollama/common_utils.pyr   zOllamaError.__init__
   s   ø€ Ü‰Ñ [¸'È7ÐÕSó    )
Ú__name__Ú
__module__Ú__qualname__ÚintÚstrÚdictÚhttpxÚHeadersr   Ú__classcell__)r   s   @r   r   r   	   s0   ø„ ðT Cð T°#ð TÀÀuÇ}Á}Ñ@T÷ Tñ Tr   r   c                 ó"  — ddl }ddl}	 ddlm} | }| j                  d«      r| j                  d«      d   } 	 |j                  |j                  |j                  | «      «      «      }|j                  dv r| S 	 |j                  «       }|j                  d	«      j                  |d
«       |j                  d«       |j                  |j                  «       «      j!                  d«      S # t        $ r t	        d«      ‚w xY w# t        $ r |cY S w xY w)zÖ
    Convert image to base64 encoded image if not already in base64 format

    If image is already in base64 format AND is a jpeg/png, return it

    If image is not JPEG/PNG, convert it to JPEG base64 format
    r   N)ÚImagez>ollama image conversion failed please run `pip install Pillow`zdata:ú,éÿÿÿÿ)ÚJPEGÚPNGÚRGBr    zutf-8)Úbase64ÚioÚPILr   Ú	ExceptionÚ
startswithÚsplitÚopenÚBytesIOÚ	b64decodeÚformatÚconvertÚsaveÚseekÚ	b64encodeÚgetvalueÚdecode)Úimager#   r$   r   ÚorigÚ
image_dataÚ
jpeg_images          r   Ú_convert_imager7      s  € ó ÛðZÝð €DØ×Ñ˜Ô Ø—‘˜CÓ  Ñ$ˆðØ!ŸJ™J r§z¡z°&×2BÑ2BÀ5Ó2IÓ'JÓKˆ
Ø×Ñ Ñ/ØˆLð 0ð Ÿ
™
›€JØ×Ñ�uÓ×"Ñ" :¨vÔ6Ø‡O�O�AÔØ×Ñ˜J×/Ñ/Ó1Ó2×9Ñ9¸'ÓBÐBøô ò ZÜÐXÓYÐYðZûô ò ØŠðús   ŠC( ¸>D  Ã(C=Ä DÄD)ÚBaseLLMModelInfoc                   ó¬  — e Zd ZdZeddedz  fd„«       Zeddedz  defd„«       Zeddedz  defd„«       Z	ddedz  de
e   fd„Zed	edefd
„«       Zed	edefd„«       Zededefd„«       Zedededz  fd„«       Z	 	 dd	ededz  dedz  deeef   fd„Z	 	 dd	ededz  dedz  deeef   dz  fd„Z	 	 dded	ede
dededefd„Zed	edefd„«       Zy)ÚOllamaModelInfoz®
    Dynamic model listing for Ollama server.
    Fetches /api/models and /api/tags, then for each tag also /api/models?tag=...
    Returns the union of all model names.
    NÚreturnc                 ó¨   — ddl }ddl}ddlm} | xsA |j                  j                  d«      xs$ |j                  xs |j                  xs  |d«      S )z?Get API key from environment variables or litellm configurationr   N©Úget_secret_strÚOLLAMA_API_KEY)ÚosÚlitellmÚlitellm.secret_managers.mainr>   ÚenvironÚgetÚapi_keyÚ
openai_key)rE   r@   rA   r>   s       r   Úget_api_keyzOllamaModelInfo.get_api_key7   sY   € ó 	ãÝ?ð ò 0Ø�z‰z�~‰~Ð.Ó/ò0à�‰ò0ð ×!Ñ!ò0ñ Ð.Ó/ð	
r   Úapi_basec                 ó.   — ddl m} | xs  |d«      xs dS )Nr   r=   ÚOLLAMA_API_BASEzhttp://localhost:11434)rB   r>   )rH   r>   s     r   Úget_api_basezOllamaModelInfo.get_api_baseG   s   € å?ð ÒX™>Ð*;Ó<ÒXÐ@XÐXr   c                 ó˜   — | j                  |«      j                  d«      }dD ]$  }|j                  |«      sŒ|d t        |«        c S  |S )Nú/)z/api/generatez	/api/chatz
/api/embedz/api/embeddingsú	/api/showú	/api/tags)rK   ÚrstripÚendswithÚlen)ÚclsrH   Úsuffixs      r   Úget_server_api_basez#OllamaModelInfo.get_server_api_baseN   sX   € à×#Ñ# HÓ-×4Ñ4°SÓ9ˆð
ò 		0ˆFð × Ñ  Õ(Ø ¤3 v£; ,Ð/Ò/ð		0ð ˆr   c                 ó¦  — |}| j                  |«      }|�|r| j                  |«      nd}|rdd|› �ini }t        «       }	 t        j                  |› d�|¬«      }|j                  «        |j                  «       }g }	t        |t        «      rd|v rt        |d   t        «      r|d   }	nt        |t        «      r|}	|	D ]o  }
t        |
t        «      sŒ|
j	                  d«      xs |
j	                  d«      }t        |t        «      sŒI|j                  |j                  d	«      r|nd	|› �«       Œq 	 t%        |«      }|S # t        $ r‰}t        j                  d
|«       	 ddlm} |j	                  dg «      xs g }|D �cg c]  }d	|› �‘Œ	 nc c}w c}cY d}~S # t        $ r'}t        j                  d|«       g cY d}~cY d}~S d}~ww xY wd}~ww xY w)zX
        List all models available on the Ollama server via /api/tags endpoint.
        NÚAuthorizationúBearer rO   )r   ÚmodelsÚnameÚmodelúollama/z(Error retrieving ollama tag endpoint: %sr   )Úmodels_by_providerÚollamaz5Error retrieving static ollama models as fallback: %s)rU   rG   Úsetr   rD   Úraise_for_statusÚjsonÚ
isinstancer   Úlistr   Úaddr'   r&   r   ÚwarningrA   r]   Úsorted)r   rE   rH   Úpassed_api_baseÚbaser   ÚnamesÚrespÚdataÚmodels_listÚentryÚnmÚer]   ÚstaticÚmÚe1Úresults                     r   Ú
get_modelszOllamaModelInfo.get_models]   s¶  € ð
 "*ˆØ×.Ñ.¨xÓ8ˆØ/>Ð/FÉ'�$×"Ñ" 7Ô+ÐW[ˆÙCJ˜/¨W°W°IÐ+>Ñ?ÐPRˆä!$£ˆð	ÜŸ)™) t f¨IÐ$6ÀÔHˆDØ×!Ñ!Ô#ØŸ)™)›+ˆDàˆKÜ˜$¤Ô%¨(°dÑ*:¼zÈ$ÈxÉ.ÔZ^Ô?_Ø" 8™n‘Ü˜D¤$Ô'Ø"�à$ò R�Ü! %¬Ô.ØØ—Y‘Y˜vÓ&Ò<¨%¯)©)°GÓ*<�Ü˜b¤#Õ&Ø—I‘I B§M¡M°)Ô$<™bÀGÈBÈ4À.ÕQñRô$ ˜u›ˆØˆøô ò 
	Ü×"Ñ"Ð#MÈqÔQðÝ6à 2× 6Ñ 6°xÀÓ DÒ JÈ�Ø/5Ö6¨!˜' ! šÑ6ùÔ6Õ6øÜò Ü×&Ñ&Ð'^Ð`bÔcØ—	’	ûðþð
	úsa   ÁCD> Ä)D> Ä>	GÅGÅ FÅ>FÆ
FÆGÆ	GÆ!GÆ8GÆ9GÆ=GÇGÇGÇGr[   c                 ót   — | j                  d«      s| j                  d«      r| j                  dd«      d   S | S )Nr\   úollama_chat/rM   é   )r'   r(   ©r[   s    r   Ú_strip_ollama_model_prefixz*OllamaModelInfo._strip_ollama_model_prefixˆ   s8   € à×Ñ˜IÔ&¨%×*:Ñ*:¸>Ô*JØ—;‘;˜s AÓ& qÑ)Ð)Øˆr   c                 óÀ   ‡— ddl m} t        j                  | «      }| |d|z   d|z   h}|D �ch c]  }|j	                  «       ’Œ c}Št        ˆfd„|D «       «      S c c}w )Nr   )Ú
model_costr\   rv   c              3   óB   •K  — | ]  }|j                  «       ‰v –— Œ y ­w©N)Úlower)Ú.0rZ   Úmodel_cost_keyss     €r   ú	<genexpr>z:OllamaModelInfo._is_static_ollama_model.<locals>.<genexpr>š   s   øè ø€ ÒU°t�4—:‘:“< ?Ô2ÑUùs   ƒ)rA   r{   r:   ry   r~   Úany)r[   r{   Ústripped_modelÚpotential_model_namesÚkeyr€   s        @r   Ú_is_static_ollama_modelz'OllamaModelInfo._is_static_ollama_modelŽ   se   ø€ å&ä /× JÑ JÈ5Ó QˆàØØ˜Ñ&Ø˜^Ñ+ð	(
Ðð :DÖ!D°# #§)¡)¥+Ò!DˆÜÓUÐ?TÔUÓUÐUùò "Es   ­AÚollama_model_infoc                 ód   — t        | j                  dd«      xs d«      }d|j                  «       v S )NÚtemplateÚ Útools)r   rD   r~   )r‡   Ú	_templates     r   Ú_supports_function_callingz*OllamaModelInfo._supports_function_callingœ   s1   € ä #Ð$5×$9Ñ$9¸*ÀbÓ$IÒ$OÈRÓ Pˆ	Ø˜)Ÿ/™/Ó+Ð+Ð+r   c                 óh   — | j                  di «      }|j                  «       D ]  \  }}d|v sŒ|c S  y )NÚ
model_infoÚcontext_length)rD   Úitems)r‡   Ú_model_infor…   Úvalues       r   Ú_get_max_tokenszOllamaModelInfo._get_max_tokens¡   sB   € à#4×#8Ñ#8¸ÀrÓ#Jˆà%×+Ñ+Ó-ò 	‰JˆC�Ø 3Ò&Ø’ð	ð r   rE   c           
      óÄ  — ddl m} | j                  |«      }|}| j                  |«      }|�|r| j	                  |«      nd }|rdd|› �ini }	 |j                  |› d�d|i|¬«      }|j                  «        |j                  «       }| j                  |«      }	|d	d
| j                  |«      dd|	|	|	dœ	S # t        $ r# t        j                  d«       |d	d
ddd d d dœcY S w xY w)Nr   )Úmodule_level_clientrW   rX   rN   rZ   )Úurlra   r   z&OllamaError: Could not get model info.r^   Úchatg        )r…   Úlitellm_providerÚmodeÚinput_cost_per_tokenÚoutput_cost_per_tokenÚ
max_tokensÚmax_input_tokensÚmax_output_tokens)	r…   r™   rš   Úsupports_function_callingr›   rœ   r�   rž   rŸ   )rA   r–   ry   rU   rG   Úpostr`   r&   r   Údebugra   r”   r�   )
r   r[   rH   rE   r–   rg   r   Úresponser�   r�   s
             r   Úget_runtime_model_infoz&OllamaModelInfo.get_runtime_model_infoª   s)  € õ 	0à×/Ñ/°Ó6ˆØ!)ˆØ×+Ñ+¨HÓ5ˆØ/>Ð/FÉ'�$×"Ñ" 7Ô+ÐW[ˆÙCJ˜/¨W°W°IÐ+>Ñ?ÐPRˆð	Ø1×6Ñ6Ø�j 	Ð*Ø˜e�_Øð 7ó ˆHð
 ×%Ñ%Ô'ð %ŸM™M›Oˆ
Ø ×0Ñ0°Ó<ˆ
ð Ø (ØØ)-×)HÑ)HÈÓ)TØ$'Ø%(Ø$Ø *Ø!+ñ

ð 
	
øô! ò 	Ü× Ñ Ð!IÔJàØ$,ØØ(+Ø),Ø"Ø$(Ø%)ñ	ò 	ð	ús   Á)B3 Â3)CÃCc                 óN   — | j                  |«      ry | j                  |||¬«      S )N)r[   rH   rE   )r†   r¤   )r   r[   rH   rE   s       r   Úget_model_infozOllamaModelInfo.get_model_infoÛ   s.   € ð ×'Ñ'¨Ô.ØØ×*Ñ*°ÀÐSZÐ*Ó[Ð[r   r   ÚmessagesÚoptional_paramsÚlitellm_paramsc                 ó   — i S )z:
        No-op environment validation for Ollama.
        © )r   r   r[   r§   r¨   r©   rE   rH   s           r   Úvalidate_environmentz$OllamaModelInfo.validate_environmentå   s	   € ð ˆ	r   c                 ó   — | S )z@
        Return the base model name for Ollama (no-op).
        r«   rx   s    r   Úget_base_modelzOllamaModelInfo.get_base_modelô   s	   € ð
 ˆr   r}   )NN)r   r   r   Ú__doc__Ústaticmethodr   rG   rK   ÚclassmethodrU   rc   rt   ry   Úboolr†   r   r�   r   r”   r   r¤   r¦   r¬   r®   r«   r   r   r:   r:   0   s  „ ñð ñ
 S¨4¡Zò 
ó ð
ð ñY˜s T™zð Y°Sò Yó ðYð ñ¨3°©:ð Àò ó ðñ)°°t±ð )ÀtÈCÁyó )ðV ð¨#ð °#ò ó ðð
 ðV sð V¨tò Vó ðVð ð,°dð ,¸tò ,ó ð,ð ð¨4ð °C¸$±Jò ó ðð  $Ø"ñ	/
àð/
ð ˜‘*ð/
ð �t‘ð	/
ð
 
ˆc�3ˆh‰ó/
ðh  $Ø"ñ	\àð\ð ˜‘*ð\ð �t‘ð	\ð
 
ˆc�3ˆh‰˜$Ñ	ó\ð" Øñàðð ðð ð	ð
 ðð ðð 
óð ð˜cð  cò ó ñr   r:   )Útypingr   r   r   rA   r   Ú)litellm.llms.base_llm.chat.transformationr   r   r7   Ú litellm.llms.base_llm.base_utilsr8   r:   r«   r   r   ú<module>r¶      s:   ðß ã å "Ý FôTÐ"ô Tò
Cõ> >ôIÐ&õ Ir   