o
    ưi"                     @   sl   d dl mZmZmZ d dlZd dlmZ d dlmZ G dd deZ	dd Z
d d	lmZ G d
d deZdS )    )ListOptionalUnionN)verbose_logger)BaseLLMExceptionc                       s4   e Zd Zdededeeejf f fddZ	  Z
S )OllamaErrorstatus_codemessageheadersc                    s   t  j|||d d S )N)r   r	   r
   )super__init__)selfr   r	   r
   	__class__ W/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/ollama/common_utils.pyr   
   s   zOllamaError.__init__)__name__
__module____qualname__intstrr   dicthttpxZHeadersr   __classcell__r   r   r   r   r   	   s    r   c                 C   s   ddl }ddl}zddlm} W n ty   tdw | }| dr*| dd } z|||	| }|j
dv r>| W S W n tyJ   | Y S w | }|d	|d
 |d || dS )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:,)JPEGZPNGRGBr   zutf-8)base64ioZPILr   	Exception
startswithsplitopenBytesIO	b64decodeformatconvertsaveseek	b64encodegetvaluedecode)imager   r    r   origZ
image_dataZ
jpeg_imager   r   r   _convert_image   s0   


r0   )BaseLLMModelInfoc                   @   s   e Zd ZdZeddee fddZeddee defddZddee de	e fd	d
Z
		ddedededededefddZededefddZdS )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                 C   s<   ddl }ddl}ddlm} |jdp|jp|jp|dS )z?Get API key from environment variables or litellm configurationr   Nget_secret_strZOLLAMA_API_KEY)oslitellmlitellm.secret_managers.mainr5   environgetapi_keyZ
openai_key)r;   r6   r7   r5   r   r   r   get_api_key;   s   zOllamaModelInfo.get_api_keyapi_basec                 C   s   ddl m} | p|dpdS )Nr   r4   ZOLLAMA_API_BASEzhttp://localhost:11434)r8   r5   )r=   r5   r   r   r   get_api_baseK   s   zOllamaModelInfo.get_api_basec                 C   s  |  |}|  }|rdd| ini }t }zQtj| d|d}|  | }g }t|trAd|v rAt|d t	rA|d }nt|t	rH|}|D ]}	t|	tsRqJ|	dp[|	d}
t|
t
rf||
 qJW nS ty } zGtd|  zd	d
lm} |dg pg }dd |D W W  Y d}~S  ty } ztd|  g W  Y d}~W  Y d}~S d}~ww d}~ww t|}|S )zX
        List all models available on the Ollama server via /api/tags endpoint.
        AuthorizationzBearer z	/api/tags)r
   modelsnamemodelz&Error retrieving ollama tag endpoint: r   )models_by_providerZollamac                 S   s   g | ]}d | qS )zollama/r   ).0mr   r   r   
<listcomp>x   s    z.OllamaModelInfo.get_models.<locals>.<listcomp>Nz3Error retrieving static ollama models as fallback: )r>   r<   setr   r:   raise_for_statusjson
isinstancer   listr   addr!   r   warningr7   rC   sorted)r   r;   r=   baser
   namesrespdataZmodels_listentrynmerC   Zstatice1resultr   r   r   
get_modelsR   sT   





zOllamaModelInfo.get_modelsr
   rB   messagesoptional_paramslitellm_paramsc                 C   s   i S )z:
        No-op environment validation for Ollama.
        r   )r   r
   rB   rY   rZ   r[   r;   r=   r   r   r   validate_environment   s   z$OllamaModelInfo.validate_environmentc                 C   s   | S )z@
        Return the base model name for Ollama (no-op).
        r   )rB   r   r   r   get_base_model   s   zOllamaModelInfo.get_base_model)N)NN)r   r   r   __doc__staticmethodr   r   r<   r>   r   rX   r   rK   r\   r]   r   r   r   r   r2   4   s0    7	
r2   )typingr   r   r   r   r7   r   Z)litellm.llms.base_llm.chat.transformationr   r   r0   Z litellm.llms.base_llm.base_utilsr1   r2   r   r   r   r   <module>   s    !