Ë
    ÍìjÑ-  ã                  óÀ   — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZmZmZ ddlZ ej"                  e«      Ze	 G d„ d	«      «       Z G d
„ de«      Zy)u:   Ollama integration â€” local model serving via Ollama API.é    )ÚannotationsN)ÚAsyncIteratorÚIterator)Ú	dataclass)ÚAny)Ú
ChatResultÚProviderABCÚProviderProtocolc                  ó<   — e Zd ZU dZdZded<   dZded<   dZd	ed
<   y)ÚOllamaConfigz Configuration for Ollama client.zhttp://127.0.0.1:11434ÚstrÚbase_urlg      N@ÚfloatÚtimeoutTÚboolÚ
verify_sslN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   © ó    úL/home/oem/CyberBrain26-unified/src/cyberbrain26/model_layer/ollama_client.pyr   r      s#   … á*à,€HˆcÓ,Ø€GˆUÓØ€J�Ôr   r   c                  óø  — e Zd ZdZd d!d„Zed"d„«       Zed#d„«       Zd$d„Zd$d„Z	d%d„Z
d%d	„Zd&d
„Zddœ	 	 	 	 	 d'd„Z	 	 	 	 	 	 d(d„Z	 	 	 	 	 	 	 	 d)d„Z	 	 	 	 	 	 d*d„Zdddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 d+d„Z	 	 	 	 	 	 d*d„Z	 	 	 	 	 	 	 	 d,d„Zdddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 d-d„Z	 	 	 	 	 	 d.d„Z	 	 	 	 	 	 d/d„Zdddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 d0d„Z	 	 	 	 	 	 d.d„Z	 	 	 	 	 	 d/d„Zddœ	 	 	 	 	 	 	 d1d„Zd2d„Zd3d„Zd4d„Zy)5ÚOllamaClientz(Ollama client for local model inference.Nc                óF   — |xs
 t        «       | _        d | _        d | _        y ©N)r   ÚconfigÚ_httpÚ_async_http)Úselfr   s     r   Ú__init__zOllamaClient.__init__   s   € ØÒ.¤£ˆŒØ*.ˆŒ
Ø59ˆÕr   c                óä   — | j                   €Yt        j                  | j                  j                  | j                  j
                  | j                  j                  ¬«      | _         | j                   S ©N)r   r   Úverify)r    ÚhttpxÚClientr   r   r   r   ©r"   s    r   ÚhttpzOllamaClient.http"   sO   € à�:‰:ÐÜŸ™ØŸ™×-Ñ-ØŸ™×+Ñ+Ø—{‘{×-Ñ-ôˆDŒJð
 �z‰zÐr   c                óä   — | j                   €Yt        j                  | j                  j                  | j                  j
                  | j                  j                  ¬«      | _         | j                   S r%   )r!   r'   ÚAsyncClientr   r   r   r   r)   s    r   Ú
async_httpzOllamaClient.async_http,   sV   € à×ÑÐ#Ü$×0Ñ0ØŸ™×-Ñ-ØŸ™×+Ñ+Ø—{‘{×-Ñ-ô ˆDÔð
 ×ÑÐr   c                óŠ   — |j                  d| j                  j                  «        | j                  j                  ||fi |¤ŽS ©Nr   )Ú
setdefaultr   r   r*   Úrequest©r"   ÚmethodÚpathÚkwargss       r   Ú_requestzOllamaClient._request6   s:   € Ø×Ñ˜) T§[¡[×%8Ñ%8Ô9Ø ˆt�y‰y× Ñ  ¨Ñ8°Ñ8Ð8r   c              ‹  ó¦   K  — |j                  d| j                  j                  «        | j                  j                  ||fi |¤Žƒ d {  –—† S 7 Œ­wr/   )r0   r   r   r-   r1   r2   s       r   Ú	_arequestzOllamaClient._arequest:   sD   è ø€ Ø×Ñ˜) T§[¡[×%8Ñ%8Ô9Ø,�T—_‘_×,Ñ,¨V°TÑD¸VÑD×DÐDÐDús   ‚AAÁ
AÁAc                óŠ   — | j                  dd«      }|j                  «        |j                  «       }|j                  dg «      S )NÚGETz	/api/tagsÚmodels©r6   Úraise_for_statusÚjsonÚget©r"   ÚresponseÚdatas      r   Úlist_modelszOllamaClient.list_models>   s:   € Ø—=‘= ¨Ó4ˆØ×!Ñ!Ô#Ø�}‰}‹ˆØ�x‰x˜ "Ó%Ð%r   c                óŠ   — | j                  dd«      }|j                  «        |j                  «       }|j                  dg «      S )Nr:   z/api/psr;   r<   r@   s      r   Úlist_runningzOllamaClient.list_runningD   s:   € Ø—=‘= ¨	Ó2ˆØ×!Ñ!Ô#Ø�}‰}‹ˆØ�x‰x˜ "Ó%Ð%r   c                ón   — | j                  ddd|i¬«      }|j                  «        |j                  «       S )NÚPOSTz	/api/showÚmodel©r>   )r6   r=   r>   )r"   Ú
model_namerA   s      r   Ú
show_modelzOllamaClient.show_modelJ   s3   € Ø—=‘= ¨¸GÀZÐ;P�=ÓQˆØ×!Ñ!Ô#Ø�}‰}‹Ðr   F)Ústreamc               ó˜   — | j                  ddd|i|¬«      }|r| j                  ||«      S |j                  «        |j                  «       S )NrG   z	/api/pullrH   )r>   rL   )r6   Ú_pull_streamr=   r>   )r"   rJ   rL   rA   s       r   Ú
pull_modelzOllamaClient.pull_modelO   sU   € ð —=‘=Ø�K w°
Ð&;ÀFð !ó 
ˆñ Ø×$Ñ$ Z°Ó:Ð:Ø×!Ñ!Ô#Ø�}‰}‹Ðr   c              #  ój   K  — |j                  «       D ]  }|sŒt        j                  |«      –— Œ y ­wr   )Ú
iter_linesr>   Úloads)r"   rJ   rA   Úlines       r   rN   zOllamaClient._pull_streamZ   s2   è ø€ ð ×'Ñ'Ó)ò 	'ˆDÚÜ—j‘j Ó&Ó&ñ	'ùs   ‚3™3c                óB  — |j                  d«      }|j                  d«      }|j                  dd«      }|j                  d«      }|||dœ}|�|j                  di «       ||d   d<   |�|j                  di «       ||d   d<   |r|j                  |«       t        j	                  d|t        |«      «       | j                  d	d
|¬«      }	|	j                  «        |	j                  «       }
|r| j                  ||
«      S |
j                  di «      j                  dd«      S )NÚtemperatureÚnum_predictrL   FÚextra©rH   ÚmessagesrL   Úoptionsz"Ollama chat: model=%s, messages=%drG   ú	/api/chatrI   ÚmessageÚcontentÚ )
r?   r0   ÚupdateÚloggerÚinfoÚlenr6   r=   r>   Ú_stream_chat)r"   rH   rY   r5   rU   rV   rL   rW   ÚbodyrA   rB   s              r   ÚchatzOllamaClient.chata   s  € ð —j‘j Ó/ˆØ—j‘j Ó/ˆØ—‘˜H eÓ,ˆØ—
‘
˜7Ó#ˆàØ Øñ 
ˆð
 Ð"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ØÐ"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ÙØ�K‰K˜Ôä�‰Ð8¸%ÄÀXÃÔOà—=‘= ¨¸4�=Ó@ˆØ×!Ñ!Ô#Ø�}‰}‹ˆáØ×$Ñ$ U¨DÓ1Ð1Ø�x‰x˜	 2Ó&×*Ñ*¨9°bÓ9Ð9r   c              #  óŠ   K  — |D ]:  }|j                  d|«      |j                  di «      |j                  dd«      dœ–— Œ< y ­w)NrH   r\   ÚdoneF©rH   r\   rg   ©r?   ©r"   rH   rB   Úchunks       r   rc   zOllamaClient._stream_chatƒ   sK   è ø€ ð ò 	ˆEàŸ™ 7¨EÓ2Ø Ÿ9™9 Y°Ó3ØŸ	™	 &¨%Ó0ñó ñ	ùó   ‚AA)rU   rV   rL   rW   c               ó„  — |||dœ}|�|j                  di «       ||d   d<   |�|j                  di «       ||d   d<   |r|j                  |«       t        j                  d|«       | j	                  dd|¬«      }|j                  «        |j                  «       }	|r| j                  ||	«      S |	j                  d	d
«      S )N©rH   ÚpromptrL   rZ   rU   rV   zOllama completion: model=%srG   ú/api/generaterI   rA   r^   )	r0   r_   r`   ra   r6   r=   r>   Ú_stream_completionr?   )
r"   rH   ro   rU   rV   rL   rW   rd   rA   rB   s
             r   Ú
completionzOllamaClient.completion�   sÊ   € ð ØØñ 
ˆð
 Ð"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ØÐ"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ÙØ�K‰K˜Ôä�‰Ð1°5Ô9à—=‘= ¨¸t�=ÓDˆØ×!Ñ!Ô#Ø�}‰}‹ˆáØ×*Ñ*¨5°$Ó7Ð7Ø�x‰x˜
 BÓ'Ð'r   c              #  óŠ   K  — |D ]:  }|j                  d|«      |j                  dd«      |j                  dd«      dœ–— Œ< y ­w)NrH   rA   r^   rg   F©rH   rA   rg   ri   rj   s       r   rq   zOllamaClient._stream_completion¯   sK   è ø€ ð ò 	ˆEàŸ™ 7¨EÓ2Ø!ŸI™I j°"Ó5ØŸ	™	 &¨%Ó0ñó ñ	ùrl   c                ó  — |j                  d«      }||dœ}|r|j                  |«       t        j                  d|«       | j	                  dd|¬«      }|j                  «        |j                  «       }|j                  dg «      S )NrW   ©rH   ÚinputzOllama embed: model=%srG   ú
/api/embedrI   Ú
embeddings)r?   r_   r`   ra   r6   r=   r>   )r"   rH   Útextsr5   rW   rd   rA   rB   s           r   ÚembedzOllamaClient.embed¹   s{   € ð —
‘
˜7Ó#ˆàØñ 
ˆñ Ø�K‰K˜Ôä�‰Ð,¨eÔ4à—=‘= ¨¸D�=ÓAˆØ×!Ñ!Ô#Ø�}‰}‹ˆØ�x‰x˜ bÓ)Ð)r   c             ƒ  ó  K  — |||dœ}|�|j                  di «       ||d   d<   |�|j                  di «       ||d   d<   |r|j                  |«       |r| j                  ||«      S | j                  ||«      ƒ d {  –—† S 7 Œ­w)NrX   rZ   rU   rV   )r0   r_   Ú_astream_chatÚ_achat_nonstream)r"   rH   rY   rU   rV   rL   rW   rd   s           r   ÚachatzOllamaClient.achatÎ   sœ   è ø€ ð Ø Øñ 
ˆð
 Ð"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ØÐ"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ÙØ�K‰K˜ÔáØ×%Ñ% e¨TÓ2Ð2Ø×*Ñ*¨5°$Ó7×7Ð7Ð7úó   ‚A;BÁ=BÁ>Bc               ó  K  — | j                  dd|¬«      ƒ d {  –—† }|j                  «        |j                  «       }|D ];  }|j                  d|«      |j                  di «      |j                  dd«      dœ­–— Œ= y 7 Œe­w)	NrG   r[   rI   rH   r\   rg   Frh   ©r8   r=   r>   r?   ©r"   rH   rd   rA   rB   rk   s         r   r}   zOllamaClient._astream_chatê   s   è ø€ ð
 Ÿ™¨°À$˜ÓG×GˆØ×!Ñ!Ô#Ø�}‰}‹ˆàò 	ˆEàŸ™ 7¨EÓ2Ø Ÿ9™9 Y°Ó3ØŸ	™	 &¨%Ó0ñô ñ	ð	 Húó   ‚BšB ›A&Bc              ƒ  óÊ   K  — | j                  dd|¬«      ƒ d {  –—† }|j                  «        |j                  «       }|j                  di «      j                  dd«      S 7 ŒF­w)NrG   r[   rI   r\   r]   r^   r‚   ©r"   rH   rd   rA   rB   s        r   r~   zOllamaClient._achat_nonstreamú   sZ   è ø€ ð
 Ÿ™¨°À$˜ÓG×GˆØ×!Ñ!Ô#Ø�}‰}‹ˆØ�x‰x˜	 2Ó&×*Ñ*¨9°bÓ9Ð9ð Hús   ‚A#šA!›AA#c             ƒ  ó  K  — |||dœ}|�|j                  di «       ||d   d<   |�|j                  di «       ||d   d<   |r|j                  |«       |r| j                  ||«      S | j                  ||«      ƒ d {  –—† S 7 Œ­w)Nrn   rZ   rU   rV   )r0   r_   Ú_astream_completionÚ_acompletion_nonstream)r"   rH   ro   rU   rV   rL   rW   rd   s           r   ÚacompletionzOllamaClient.acompletion  sœ   è ø€ ð ØØñ 
ˆð
 Ð"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ØÐ"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ÙØ�K‰K˜ÔáØ×+Ñ+¨E°4Ó8Ð8Ø×0Ñ0°¸Ó=×=Ð=Ð=úr€   c               ó  K  — | j                  dd|¬«      ƒ d {  –—† }|j                  «        |j                  «       }|D ];  }|j                  d|«      |j                  dd«      |j                  dd«      d	œ­–— Œ= y 7 Œe­w)
NrG   rp   rI   rH   rA   r^   rg   Frt   r‚   rƒ   s         r   rˆ   z OllamaClient._astream_completion   s   è ø€ ð
 Ÿ™¨°Àd˜ÓK×KˆØ×!Ñ!Ô#Ø�}‰}‹ˆàò 	ˆEàŸ™ 7¨EÓ2Ø!ŸI™I j°"Ó5ØŸ	™	 &¨%Ó0ñô ñ	ð	 Lúr„   c              ƒ  óª   K  — | j                  dd|¬«      ƒ d {  –—† }|j                  «        |j                  «       }|j                  dd«      S 7 Œ6­w)NrG   rp   rI   rA   r^   r‚   r†   s        r   r‰   z#OllamaClient._acompletion_nonstream0  sM   è ø€ ð
 Ÿ™¨°Àd˜ÓK×KˆØ×!Ñ!Ô#Ø�}‰}‹ˆØ�x‰x˜
 BÓ'Ð'ð Lús   ‚AšA›7A)rW   c             ƒ  óÚ   K  — ||dœ}|r|j                  |«       | j                  dd|¬«      ƒ d {  –—† }|j                  «        |j                  «       }|j	                  dg «      S 7 Œ6­w)Nrv   rG   rx   rI   ry   )r_   r8   r=   r>   r?   )r"   rH   rz   rW   rd   rA   rB   s          r   ÚaembedzOllamaClient.aembed:  sk   è ø€ ð Øñ 
ˆñ Ø�K‰K˜ÔàŸ™¨°À4˜ÓH×HˆØ×!Ñ!Ô#Ø�}‰}‹ˆØ�x‰x˜ bÓ)Ð)ð Iús   ‚0A+²A)³7A+c                ód   — 	 | j                  dd«      }|j                  dk(  S # t        $ r Y yw xY w)Nr:   ú/éÈ   F)r6   Ústatus_codeÚ	Exception)r"   rA   s     r   Úis_availablezOllamaClient.is_availableM  s:   € ð	Ø—}‘} U¨CÓ0ˆHØ×'Ñ'¨3Ñ.Ð.øÜò 	Ùð	ús   ‚ # £	/®/c                óê   — 	 | j                  «       }| j                  «       }dd| j                  j                  t	        |«      t	        |«      dœS # t
        $ r}ddt        |«      dœcY d }~S d }~ww xY w)NTÚollama)ÚhealthyÚproviderr   Úmodels_availableÚmodels_runningF)r—   r˜   Úerror)rC   rE   r   r   rb   r“   r   )r"   r;   ÚrunningÚexcs       r   Úhealth_checkzOllamaClient.health_checkT  st   € ð	OØ×%Ñ%Ó'ˆFØ×'Ñ'Ó)ˆGàØ$Ø ŸK™K×0Ñ0Ü$'¨£KÜ"% g£,ñð øô ò 	OØ$°(ÄSÈÃXÑNÕNûð	Oús   ‚AA Á	A2ÁA-Á'A2Á-A2c                óž  — | j                   �| j                   j                  «        | j                  �€	 dd l}|j	                  «       }|j                  «       r*|j                  | j                  j                  «       «       n)|j                  | j                  j                  «       «       d | _        y y # t        $ r Y Œw xY w# d | _        w xY w)Nr   )
r    Úcloser!   ÚasyncioÚget_event_loopÚ
is_runningÚcreate_taskÚacloseÚrun_until_completer“   )r"   r¡   Úloops      r   r    zOllamaClient.closeb  s°   € Ø�:‰:Ð!Ø�J‰J×ÑÔØ×ÑÐ'ð(Ûà×-Ñ-Ó/�Ø—?‘?Ô$à×$Ñ$ T×%5Ñ%5×%<Ñ%<Ó%>Õ?à×+Ñ+¨D×,<Ñ,<×,CÑ,CÓ,EÔFð $(�Õ ð (øô ò Ùðûð $(�Õ ús$   ´A7B4 Â4	C Â=C Â?C Ã C Ã	Cr   )r   zOllamaConfig | NoneÚreturnÚNone)r¨   zhttpx.Client)r¨   zhttpx.AsyncClient)r3   r   r4   r   r5   r   r¨   úhttpx.Response)r¨   zlist[dict[str, Any]])rJ   r   r¨   údict[str, Any])rJ   r   rL   r   r¨   z)dict[str, Any] | Iterator[dict[str, Any]])rJ   r   rA   rª   r¨   úIterator[dict[str, Any]])rH   r   rY   úlist[dict[str, str]]r5   r   r¨   r   )rH   r   rB   r   r¨   r¬   )rH   r   ro   r   rU   úfloat | NonerV   ú
int | NonerL   r   rW   údict[str, Any] | Noner¨   zstr | Iterator[dict[str, Any]])rH   r   rz   ú	list[str]r5   r   r¨   úlist[list[float]])rH   r   rY   r­   rU   r®   rV   r¯   rL   r   rW   r°   r¨   ú#str | AsyncIterator[dict[str, Any]])rH   r   rd   r«   r¨   zAsyncIterator[dict[str, Any]])rH   r   rd   r«   r¨   r   )rH   r   ro   r   rU   r®   rV   r¯   rL   r   rW   r°   r¨   r³   )rH   r   rz   r±   rW   r°   r¨   r²   )r¨   r   )r¨   r«   )r¨   r©   )r   r   r   r   r#   Úpropertyr*   r-   r6   r8   rC   rE   rK   rO   rN   re   rc   rr   rq   r{   r   r}   r~   rŠ   rˆ   r‰   rŽ   r”   rž   r    r   r   r   r   r      sæ  „ Ù2ô:ð
 òó ðð ò ó ð ó9óEó&ó&óð 27ñ	Øð	Ø*.ð	à	2ó	ð'Øð'Ø)7ð'à	!ó'ð :àð :ð 'ð :ð ð	 :ð
 
ó :ðDØðØ #ðà	!óð %)Ø"&ØØ'+ñ (àð (ð ð (ð
 "ð (ð  ð (ð ð (ð %ð (ð 
(ó (ðDØðØ #ðà	!óð*àð*ð ð*ð ð	*ð
 
ó*ð4 %)Ø"&ØØ'+ñ8àð8ð 'ð8ð
 "ð8ð  ð8ð ð8ð %ð8ð 
-ó8ð8àðð ðð 
'ó	ð :àð:ð ð:ð 
ó	:ð %)Ø"&ØØ'+ñ>àð>ð ð>ð
 "ð>ð  ð>ð ð>ð %ð>ð 
-ó>ð8àðð ðð 
'ó	ð (àð(ð ð(ð 
ó	(ð (,ñ*àð*ð ð*ð
 %ð*ð 
ó*ó&óOô(r   r   )r   Ú
__future__r   r>   ÚloggingÚcollections.abcr   r   Údataclassesr   Útypingr   Ú+cyberbrain26.model_layer.provider_interfacer   r	   r
   r'   Ú	getLoggerr   r`   r   r   r   r   r   ú<module>r¼      s\   ðÙ @å "ã Û ß 3Ý !Ý ç aÑ aÛ à	ˆ×	Ñ	˜8Ó	$€ð ÷ð ó ðôX(�;õ X(r   