o
    [iS                     @   s  d dl Z d dlZd dlZd dlZd dl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mZmZmZmZmZmZmZmZmZmZmZ d dlZd dlmZ d dlmZ ejdk rdd d	lmZm Z  nd d	l!mZm Z  d d
l"m#Z# ze#$dZ%W n e#j&y   dZ%Y nw d dl'Z'd dl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZD edZEG dd dZFdZGG dd deFZHG dd deFZIdeeee4ef   de e4 fddZJdeeeeeKef e6f   de e6 fddZLd&deeeeeKef e@ef   de e@ fddZMd eeeKe	f  deedf fd!d"ZNd#eeK deKfd$d%ZOdS )'    N)sha256)PathLike)Path)AnyCallableDictListLiteralMappingOptionalSequenceTypeTypeVarUnionoverload)JsonSchemaValue)convert_function_to_tool)   	   )AsyncIteratorIterator)metadataollamaz0.0.0)ChatRequestChatResponseCopyRequestCreateRequestDeleteRequestEmbeddingsRequestEmbeddingsResponseEmbedRequestEmbedResponseGenerateRequestGenerateResponseImageListResponseMessageOptionsProcessResponseProgressResponsePullRequestPushRequestResponseErrorShowRequestShowResponseStatusResponseToolWebFetchRequestWebFetchResponseWebSearchRequestWebSearchResponseTc                   @   sH   e Zd Z	ddddddee dededeeeef  ddf
d	d
ZdS )
BaseClientNT)follow_redirectstimeoutheadershostr7   r8   r9   returnc                K   s   dd i |pi dddt  dt  dt   dt  d D }td	d
}|	ds;|r;d| |d< |dt
|pDtd|||d|| _d
S )z
    Creates a httpx client. Default parameters are the same as those defined in httpx
    except for the following:
    - `follow_redirects`: True
    - `timeout`: None
    `kwargs` are passed to the httpx client.
    c                 S   s"   i | ]\}}|d ur|  |qS N)lower.0kv rB   I/var/www/html/RAG/RAG_venv/lib/python3.10/site-packages/ollama/_client.py
<dictcomp>a   s
    z'BaseClient.__init__.<locals>.<dictcomp>zapplication/jsonzollama-python/z ( z	) Python/)zContent-TypeAcceptz
User-AgentOLLAMA_API_KEYNauthorizationBearer OLLAMA_HOST)base_urlr7   r8   r9   rB   )__version__platformmachinesystemr=   python_versionitemsosgetenvget_parse_host_client)selfclientr:   r7   r8   r9   kwargsapi_keyrB   rB   rC   __init__O   s*   *
zBaseClient.__init__r<   )	__name__
__module____qualname__r   strboolr   r
   r[   rB   rB   rB   rC   r6   N   s"    	r6   zxFailed to connect to Ollama. Please check that Ollama is downloaded, running and accessible. https://ollama.com/downloadc                %       s
  e Zd Zdadee ddf fddZdd Zedd	d
ee	 de
d de	fddZedd	d
ee	 de
d dee	 fddZedd	d
ee	 dedee	ee	 f fddZdd	d
ee	 dedee	ee	 f fddZe			dbddddddddddddddedededededeee  de
d dee dee dee dedeee
d ef  d eeeeeef   d!eeeeef ef  d"eeeef  def d#d$Ze			dbddddddddddddddedededededeee  de
d dee dee dee dedeee
d ef  d eeeeeef   d!eeeeef ef  d"eeeef  dee f d%d$Z			dcddddddddddddddedee dee dee dee deee  dedee dee dee dee deee
d ef  d eeeeeef   d!eeeeef ef  d"eeeef  deeee f f d&d$Ze		ddddddddddd'ded(eeeeeef ef   d)eeeeeef eef   de
d deeee
d* f  dee dee deee
d ef  d!eeeeef ef  d"eeeef  defd+d,Ze		ddddddddddd'ded(eeeeeef ef   d)eeeeeef eef   de
d deeee
d* f  dee dee deee
d ef  d!eeeeef ef  d"eeeef  dee fd-d,Z		ddddddddddd'ded(eeeeeef ef   d)eeeeeef eef   dedeeee
d* f  dee dee deee
d ef  d!eeeeef ef  d"eeeef  deeee f fd.d,Z						deded/eeee f d0ee d!eeeeef ef  d"eeeef  d1ee defd2d3Z 				dfdedee d!eeeeef ef  d"eeeef  de!f
d4d5Z"eddd6ded7ede
d de#fd8d9Z$eddd6ded7ede
d dee# fd:d9Z$ddd6ded7ededee#ee# f fd;d9Z$eddd6ded7ede
d de#fd<d=Z%eddd6ded7ede
d dee# fd>d=Z%ddd6ded7ededee#ee# f fd?d=Z%e									dgdd	ded@ee dAee dBee&eef  dCee&eef  dee dDeeee'e f  dee dEeeeeef ef  d(eeeeeef ef   de
d de#fdFdGZ(e									dgdd	ded@ee dAee dBee&eef  dCee&eef  dee dDeeee'e f  dee dEeeeeef ef  d(eeeeeef ef   de
d dee# fdHdGZ(									dgdd	ded@ee dAee dBee&eef  dCee&eef  dee dDeeee'e f  dee dEeeeeef ef  d(eeeeeef ef   dedee#ee# f fdIdGZ(dJeee)f defdKdLZ*de+fdMdNZ,dede-fdOdPZ.dQedRede-fdSdTZ/dede0fdUdVZ1de2fdWdXZ3dhdZed[ede4fd\d]Z5d^ede6fd_d`Z7  Z8S )iClientNr:   r;   c                       t  jtj|fi | d S r<   )superr[   httpxra   rW   r:   rY   	__class__rB   rC   r[   |      zClient.__init__c              
   O   sh   z| j j|i |}|  |W S  tjy' } z
t|jj|jjd d }~w tj	y3   t
td w r<   rV   requestraise_for_statusrd   HTTPStatusErrorr,   responsetextstatus_codeConnectErrorConnectionErrorCONNECTION_ERROR_MESSAGErW   argsrY   rerB   rB   rC   _request_raw   s   
zClient._request_rawFstreamclsry   c                O      d S r<   rB   rW   rz   ry   rt   rY   rB   rB   rC   _request      zClient._requestTc                O   r{   r<   rB   r|   rB   rB   rC   r}      r~   c                O   r{   r<   rB   r|   rB   rB   rC   r}      r~   c                   s:   |r fdd}| S di j  i  S )Nc                  3   s    j j i K} z|   W n tjy- } z|j  t|jj|jj	d d }~ww | 
 D ]}t|}|d }rDt|di |V  q2W d    d S 1 sXw   Y  d S NerrorrB   )rV   ry   rk   rd   rl   rm   readr,   rn   ro   
iter_linesjsonloadsrT   ru   rv   lineparterrrt   rz   rY   rW   rB   rC   inner   s    

"zClient._request.<locals>.innerrB   rw   r   rW   rz   ry   rt   rY   r   rB   r   rC   r}      s    rO   templatecontextry   thinklogprobstop_logprobsrawformatimagesoptions
keep_alivemodelpromptsuffixrO   r   r   r   r   r   r   r   r   r   r   r   r   c                C   r{   r<   rB   rW   r   r   r   rO   r   r   ry   r   r   r   r   r   r   r   r   rB   rB   rC   generate      zClient.generatec                C   r{   r<   rB   r   rB   rB   rC   r      r   c                C   sN   | j tddt|||||||||	|
|||rtt|nd||djdd|dS )a  
    Create a response using the requested model.

    Raises `RequestError` if a model is not provided.

    Raises `ResponseError` if the request could not be fulfilled.

    Returns `GenerateResponse` if `stream` is `False`, otherwise returns a `GenerateResponse` generator.
    POST/api/generateNr   r   r   rO   r   r   ry   r   r   r   r   r   r   r   r   Texclude_noner   ry   r}   r#   r"   list_copy_images
model_dumpr   rB   rB   rC   r      s2   toolsry   r   r   r   r   r   r   messagesr   lowmediumhighc                C   r{   r<   rB   rW   r   r   r   ry   r   r   r   r   r   r   rB   rB   rC   chat     zClient.chatc                C   r{   r<   rB   r   rB   rB   rC   r   .  r   c                C   sD   | j tddt|tt|tt|||||||	|
d
jdd|dS )a  
    Create a chat response using the requested model.

    Args:
      tools:
        A JSON schema as a dict, an Ollama Tool or a Python Function.
        Python functions need to follow Google style docstrings to be converted to an Ollama Tool.
        For more information, see: https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings
      stream: Whether to stream the response.
      format: The format of the response.

    Example:
      def add_two_numbers(a: int, b: int) -> int:
        '''
        Add two numbers together.

        Args:
          a: First number to add
          b: Second number to add

        Returns:
          int: The sum of a and b
        '''
        return a + b

      client.chat(model='llama3.2', tools=[add_two_numbers], messages=[...])

    Raises `RequestError` if a model is not provided.

    Raises `ResponseError` if the request could not be fulfilled.

    Returns `ChatResponse` if `stream` is `False`, otherwise returns a `ChatResponse` generator.
    r   	/api/chat
r   r   r   ry   r   r   r   r   r   r   Tr   r   r}   r   r   r   _copy_messages_copy_toolsr   r   rB   rB   rC   r   >  s(   /

inputtruncate
dimensionsc                 C   s*   | j tddt||||||djdddS Nr   z
/api/embed)r   r   r   r   r   r   Tr   r   r}   r!   r    r   rW   r   r   r   r   r   r   rB   rB   rC   embed  s   	zClient.embedc              
   C   s&   | j tddt||||djdddS ))
    Deprecated in favor of `embed`.
    r   /api/embeddingsr   r   r   r   Tr   r   r}   r   r   r   rW   r   r   r   r   rB   rB   rC   
embeddings  s   
zClient.embeddingsinsecurery   r   c                C   r{   r<   rB   rW   r   r   ry   rB   rB   rC   pull  r~   zClient.pullc                C   r{   r<   rB   r   rB   rB   rC   r     r~   c             	   C   &   | j tddt|||djdd|dS )
    Raises `ResponseError` if the request could not be fulfilled.

    Returns `ProgressResponse` if `stream` is `False`, otherwise returns a `ProgressResponse` generator.
    r   	/api/pullr   r   ry   Tr   r   r}   r)   r*   r   r   rB   rB   rC   r        c                C   r{   r<   rB   r   rB   rB   rC   push  r~   zClient.pushc                C   r{   r<   rB   r   rB   rB   rC   r     r~   c             	   C   r   )r   r   	/api/pushr   Tr   r   r}   r)   r+   r   r   rB   rB   rC   r     r   quantizefrom_filesadapterslicense
parametersc                C   r{   r<   rB   rW   r   r   r   r   r   r   r   rO   r   r   ry   rB   rB   rC   create     zClient.createc                C   r{   r<   rB   r   rB   rB   rC   r     r   c                C   s6   | j tddt||||||||||	|
djdd|dS )r   r   /api/creater   ry   r   r   r   r   r   r   rO   r   r   Tr   r   r}   r)   r   r   r   rB   rB   rC   r   #  s*   pathc                 C   s   t  }t|d}	 |d}|sn|| q
W d    n1 s"w   Y  d|  }t|d}| jdd| |d W d    |S 1 sJw   Y  |S )NrbT   sha256:r   /api/blobs/content)r   openr   update	hexdigestrw   )rW   r   	sha256sumru   chunkdigestrB   rB   rC   create_blobK  s"   


zClient.create_blobc                 C      |  tddS NGETz	/api/tagsr}   r%   rW   rB   rB   rC   r   [  
   zClient.listc                 C   s:   | j ddt|djddd}t|jdkrdd
S d	d
S NDELETEz/api/deleter   Tr   r      successr   statusrw   r   r   r/   ro   rW   r   ru   rB   rB   rC   deleteb  s   zClient.deletesourcedestinationc                 C   s<   | j ddt||djddd}t|jdkrdd
S d	d
S Nr   z	/api/copy)r   r   Tr   r   r   r   r   r   rw   r   r   r/   ro   rW   r   r   ru   rB   rB   rC   copyn  s   zClient.copyc                 C   s    | j tddt|djdddS Nr   z	/api/showr   Tr   r   r}   r.   r-   r   rW   r   rB   rB   rC   show{  s   zClient.showc                 C   r   Nr   z/api/psr}   r(   r   rB   rB   rC   ps  r   z	Client.psr   querymax_resultsc                 C   s@   | j jdddstd| jtddt||djdd	d
S )a%  
    Performs a web search

    Args:
      query: The query to search for
      max_results: The maximum number of results to return (default: 3)

    Returns:
      WebSearchResponse with the search results
    Raises:
      ValueError: If OLLAMA_API_KEY environment variable is not set
    rH   r   rI   zAAuthorization header with Bearer token is required for web searchr   !https://ollama.com/api/web_searchr  r  Tr   r   )	rV   r9   rT   
startswith
ValueErrorr}   r4   r3   r   rW   r  r  rB   rB   rC   
web_search  s   zClient.web_searchurlc                 C   s>   | j jdddstd| jtddt|djdd	d
S )
    Fetches the content of a web page for the provided URL.

    Args:
      url: The URL to fetch

    Returns:
      WebFetchResponse with the fetched result
    rH   r   rI   z@Authorization header with Bearer token is required for web fetchr    https://ollama.com/api/web_fetchr  Tr   r   )	rV   r9   rT   r  r  r}   r2   r1   r   rW   r  rB   rB   rC   	web_fetch  s   
zClient.web_fetchr<   r   r   r   r   NNr   Nr   r   NNNNr   NNN	NNNNNNNNNr   )9r\   r]   r^   r   r_   r[   rw   r   r   r5   r	   r}   r   r`   r   r   intr   bytesr$   r
   r   r'   floatr#   r   r&   r0   r   r   r   r!   r   r   r   r)   r   r   r   r   r   r   r   r%   r   r/   r   r  r.   r  r(   r
  r4   r  r2   r  __classcell__rB   rB   rf   rC   ra   {   s   


	

	

	

5	
	
	

D



	
	
	

(
ra   c                %       s
  e Zd Zdadee ddf fddZdd Zedd	d
ee	 de
d de	fddZedd	d
ee	 de
d dee	 fddZedd	d
ee	 dedee	ee	 f fddZdd	d
ee	 dedee	ee	 f fddZdbdededefddZdedefddZe			dcddddddddddddddedededed ed!eee  de
d d"eeee
d# f  d$ee d%ee d&ed'eee
d( ef  d)eeeeeef   d*eeeeef ef  d+eeeef  def d,d-Ze			dcddddddddddddddedededed ed!eee  de
d d"eeee
d# f  d$ee d%ee d&ed'eee
d( ef  d)eeeeeef   d*eeeeef ef  d+eeeef  dee f d.d-Z			ddddddddddddddddedee dee dee d ee d!eee  ded"eeee
d# f  d$ee d%ee d&ee d'eee
d( ef  d)eeeeeef   d*eeeeef ef  d+eeeef  deeee f f d/d-Ze		deddddddddd0ded1eeeeeef ef   d2eeeeeef ee f   de
d d"eeee
d# f  d$ee d%ee d'eee
d( ef  d*eeeeef ef  d+eeeef  de!fd3d4Z"e		deddddddddd0ded1eeeeeef ef   d2eeeeeef ee f   de
d d"eeee
d# f  d$ee d%ee d'eee
d( ef  d*eeeeef ef  d+eeeef  dee! fd5d4Z"		deddddddddd0ded1eeeeeef ef   d2eeeeeef ee f   ded"eeee
d# f  d$ee d%ee d'eee
d( ef  d*eeeeef ef  d+eeeef  dee!ee! f fd6d4Z"						dfded7eeee f d8ee d*eeeeef ef  d+eeeef  d9ee de#fd:d;Z$				dgdedee d*eeeeef ef  d+eeeef  de%f
d<d=Z&eddd>ded?ede
d de'fd@dAZ(eddd>ded?ede
d dee' fdBdAZ(ddd>ded?ededee'ee' f fdCdAZ(eddd>ded?ede
d de'fdDdEZ)eddd>ded?ede
d dee' fdFdEZ)ddd>ded?ededee'ee' f fdGdEZ)e									dhdd	dedHee dIee dJee*eef  dKee*eef  d ee dLeeee+e f  dee dMeeeeef ef  d1eeeeeef ef   de
d de'fdNdOZ,e									dhdd	dedHee dIee dJee*eef  dKee*eef  d ee dLeeee+e f  dee dMeeeeef ef  d1eeeeeef ef   de
d dee' fdPdOZ,									dhdd	dedHee dIee dJee*eef  dKee*eef  d ee dLeeee+e f  dee dMeeeeef ef  d1eeeeeef ef   dedee'ee' f fdQdOZ,dReee-f defdSdTZ.de/fdUdVZ0dede1fdWdXZ2dYedZede1fd[d\Z3dede4fd]d^Z5de6fd_d`Z7  Z8S )iAsyncClientNr:   r;   c                    rb   r<   )rc   r[   rd   r$  re   rf   rB   rC   r[     rh   zAsyncClient.__init__c              
      sp   z| j j|i |I d H }|  |W S  tjy+ } z
t|jj|jjd d }~w tj	y7   t
td w r<   ri   rs   rB   rB   rC   rw     s   
zAsyncClient._request_rawFrx   rz   ry   c                      d S r<   rB   r|   rB   rB   rC   r}        zAsyncClient._requestTc                   r%  r<   rB   r|   rB   rB   rC   r}     r&  c                   r%  r<   rB   r|   rB   rB   rC   r}     r&  c                   sB   |r fdd}| S di j  i I d H  S )Nc                    s   j j i 4 I d H V} z|   W n tjy4 } z|j I d H  t|jj|jj	d d }~ww | 
 2 z3 d H W }t|}|d }rOt|di |V  q96 W d   I d H  d S 1 I d H sjw   Y  d S r   )rV   ry   rk   rd   rl   rm   areadr,   rn   ro   aiter_linesr   r   rT   r   r   rB   rC   r     s    
.z#AsyncClient._request.<locals>.innerrB   r   r   rB   r   rC   r}     s
   $r   r  r  c                    s*   | j tddt||djdddI dH S )z
    Performs a web search

    Args:
      query: The query to search for
      max_results: The maximum number of results to return (default: 3)

    Returns:
      WebSearchResponse with the search results
    r   r  r  Tr   r   N)r}   r4   r3   r   r  rB   rB   rC   r    s   zAsyncClient.web_searchr  c                    s(   | j tddt|djdddI dH S )r  r   r  r  Tr   r   N)r}   r2   r1   r   r  rB   rB   rC   r    s   
zAsyncClient.web_fetchr   r   r   r   r   rO   r   r   r   r   r   r   r   r   r   r   r   r   c                   r%  r<   rB   r   rB   rB   rC   r   )     zAsyncClient.generatec                   r%  r<   rB   r   rB   rB   rC   r   >  r)  c                   sV   | j tddt|||||||||	|
|||rtt|nd||djdd|dI dH S )a(  
    Create a response using the requested model.

    Raises `RequestError` if a model is not provided.

    Raises `ResponseError` if the request could not be fulfilled.

    Returns `GenerateResponse` if `stream` is `False`, otherwise returns an asynchronous `GenerateResponse` generator.
    r   r   Nr   Tr   r   r   r   rB   rB   rC   r   S  s4   r   r   r   c                   r%  r<   rB   r   rB   rB   rC   r        zAsyncClient.chatc                   r%  r<   rB   r   rB   rB   rC   r     r*  c                   sL   | j tddt|tt|tt|||||||	|
d
jdd|dI dH S )a  
    Create a chat response using the requested model.

    Args:
      tools:
        A JSON schema as a dict, an Ollama Tool or a Python Function.
        Python functions need to follow Google style docstrings to be converted to an Ollama Tool.
        For more information, see: https://google.github.io/styleguide/pyguide.html#38-comments-and-docstrings
      stream: Whether to stream the response.
      format: The format of the response.

    Example:
      def add_two_numbers(a: int, b: int) -> int:
        '''
        Add two numbers together.

        Args:
          a: First number to add
          b: Second number to add

        Returns:
          int: The sum of a and b
        '''
        return a + b

      await client.chat(model='llama3.2', tools=[add_two_numbers], messages=[...])

    Raises `RequestError` if a model is not provided.

    Raises `ResponseError` if the request could not be fulfilled.

    Returns `ChatResponse` if `stream` is `False`, otherwise returns an asynchronous `ChatResponse` generator.
    r   r   r   Tr   r   Nr   r   rB   rB   rC   r     s*   0

r   r   r   c                    s2   | j tddt||||||djdddI d H S r   r   r   rB   rB   rC   r     s    	zAsyncClient.embedc              
      s.   | j tddt||||djdddI dH S )r   r   r   r   Tr   r   Nr   r   rB   rB   rC   r     s   
zAsyncClient.embeddingsr   r   c                   r%  r<   rB   r   rB   rB   rC   r     r&  zAsyncClient.pullc                   r%  r<   rB   r   rB   rB   rC   r      r&  c             	      .   | j tddt|||djdd|dI dH S )r   r   r   r   Tr   r   Nr   r   rB   rB   rC   r   )     c                   r%  r<   rB   r   rB   rB   rC   r   A  r&  zAsyncClient.pushc                   r%  r<   rB   r   rB   rB   rC   r   J  r&  c             	      r+  )r   r   r   r   Tr   r   Nr   r   rB   rB   rC   r   S  r,  r   r   r   r   r   r   c                   r%  r<   rB   r   rB   rB   rC   r   k     zAsyncClient.createc                   r%  r<   rB   r   rB   rB   rC   r   |  r-  c                   s>   | j tddt||||||||||	|
djdd|dI dH S )r   r   r   r   Tr   r   Nr   r   rB   rB   rC   r     s,   r   c              	      s   t  }t dI d H 4 I d H }	 |dI d H }|sn|| qW d   I d H  n1 I d H s4w   Y  d|  } fdd}| jdd| | d	I d H  |S )
Nr   Tr   r   c               	     sn   t  dI d H 4 I d H } 	 | dI d H }|sn|V  qW d   I d H  d S 1 I d H s0w   Y  d S )Nr   Tr   )anyio	open_filer   )ru   r   r   rB   rC   upload_bytes  s   .z-AsyncClient.create_blob.<locals>.upload_bytesr   r   r   )r   r.  r/  r   r   r   rw   )rW   r   r   ru   r   r   r1  rB   r0  rC   r     s   
(zAsyncClient.create_blobc                       |  tddI d H S r   r   r   rB   rB   rC   r        
zAsyncClient.listc                    sB   | j ddt|djdddI d H }t|jdkrdd
S d	d
S r   r   r   rB   rB   rC   r     s   zAsyncClient.deleter   r   c                    sD   | j ddt||djdddI d H }t|jdkrdd
S d	d
S r   r  r  rB   rB   rC   r    s    zAsyncClient.copyc                    s(   | j tddt|djdddI d H S r  r  r  rB   rB   rC   r    s   zAsyncClient.showc                    r2  r  r	  r   rB   rB   rC   r
    r3  zAsyncClient.psr<   r  r  r  r  r  r  r  )9r\   r]   r^   r   r_   r[   rw   r   r   r5   r	   r}   r   r`   r   r   r4   r  r2   r  r   r   r!  r$   r
   r   r'   r"  r#   r   r&   r0   r   r   r   r!   r   r   r   r)   r   r   r   r   r   r   r   r%   r   r/   r   r  r.   r  r(   r
  r#  rB   rB   rf   rC   r$    s   


	

	

	

4	
	
	

E



	
	
	

)
r$  r   r;   c                 c   s.    | pg D ]}t |tr|nt|dV  qd S )N)value)
isinstancer$   )r   imagerB   rB   rC   r     s   r   r   c                 c   s2    | pg D ]}t dd t| D V  qd S )Nc                 S   s.   i | ]\}}|r||d krt t|n|qS )r   )r   r   r>   rB   rB   rC   rD     s   . z"_copy_messages.<locals>.<dictcomp>)r&   model_validatedictrQ   )r   messagerB   rB   rC   r     s   r   r   c                 c   s0    | pg D ]}t |rt|nt|V  qd S r<   )callabler   r0   r7  )r   unprocessed_toolrB   rB   rC   r     s   r   sc                 C   sD   t | ttfr zt|  } r|W S W d S  ty   Y d S w d S r<   )r5  r_   r   exists	Exception)r<  prB   rB   rC   _as_path  s   r@  r:   c                 C   s   | pdd} }|  d\}}}|sd| }}n|dkrd}n|dkr$d}tj| d| }|jp3d} |jp8|}ztt| tj	rId	|  d
} W n	 t
yS   Y nw |jd }ri| d|  d| d| S | d|  d| S )a  
  >>> _parse_host(None)
  'http://127.0.0.1:11434'
  >>> _parse_host('')
  'http://127.0.0.1:11434'
  >>> _parse_host('1.2.3.4')
  'http://1.2.3.4:11434'
  >>> _parse_host(':56789')
  'http://127.0.0.1:56789'
  >>> _parse_host('1.2.3.4:56789')
  'http://1.2.3.4:56789'
  >>> _parse_host('http://1.2.3.4')
  'http://1.2.3.4:80'
  >>> _parse_host('https://1.2.3.4')
  'https://1.2.3.4:443'
  >>> _parse_host('https://1.2.3.4:56789')
  'https://1.2.3.4:56789'
  >>> _parse_host('example.com')
  'http://example.com:11434'
  >>> _parse_host('example.com:56789')
  'http://example.com:56789'
  >>> _parse_host('http://example.com')
  'http://example.com:80'
  >>> _parse_host('https://example.com')
  'https://example.com:443'
  >>> _parse_host('https://example.com:56789')
  'https://example.com:56789'
  >>> _parse_host('example.com/')
  'http://example.com:11434'
  >>> _parse_host('example.com:56789/')
  'http://example.com:56789'
  >>> _parse_host('example.com/path')
  'http://example.com:11434/path'
  >>> _parse_host('example.com:56789/path')
  'http://example.com:56789/path'
  >>> _parse_host('https://example.com:56789/path')
  'https://example.com:56789/path'
  >>> _parse_host('example.com:56789/path/')
  'http://example.com:56789/path'
  >>> _parse_host('[0001:002:003:0004::1]')
  'http://[0001:002:003:0004::1]:11434'
  >>> _parse_host('[0001:002:003:0004::1]:56789')
  'http://[0001:002:003:0004::1]:56789'
  >>> _parse_host('http://[0001:002:003:0004::1]')
  'http://[0001:002:003:0004::1]:80'
  >>> _parse_host('https://[0001:002:003:0004::1]')
  'https://[0001:002:003:0004::1]:443'
  >>> _parse_host('https://[0001:002:003:0004::1]:56789')
  'https://[0001:002:003:0004::1]:56789'
  >>> _parse_host('[0001:002:003:0004::1]/')
  'http://[0001:002:003:0004::1]:11434'
  >>> _parse_host('[0001:002:003:0004::1]:56789/')
  'http://[0001:002:003:0004::1]:56789'
  >>> _parse_host('[0001:002:003:0004::1]/path')
  'http://[0001:002:003:0004::1]:11434/path'
  >>> _parse_host('[0001:002:003:0004::1]:56789/path')
  'http://[0001:002:003:0004::1]:56789/path'
  >>> _parse_host('https://[0001:002:003:0004::1]:56789/path')
  'https://[0001:002:003:0004::1]:56789/path'
  >>> _parse_host('[0001:002:003:0004::1]:56789/path/')
  'http://[0001:002:003:0004::1]:56789/path'
  r   i,  z://httpP   httpsi  z	127.0.0.1[]/:)	partitionurllibparseurlsplithostnameportr5  	ipaddress
ip_addressIPv6Addressr  r   strip)r:   rM  scheme_hostportsplitr   rB   rB   rC   rU     s*   @

rU   r<   )PrN  r   rR   rM   sysurllib.parserI  hashlibr   r   pathlibr   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r.  pydantic.json_schemar   ollama._utilsr   version_infor   r   collections.abc	importlibr   versionrL   PackageNotFoundErrorrd   ollama._typesr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   rr   ra   r$  r   r_   r   r   r@  rU   rB   rB   rB   rC   <module>   sT    8
x*    F    &F.2&
