Ë
    ÝìjY7  ã                  ó¸   — d Z ddlm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ZddlmZmZmZ  ej                   e«      Ze G d„ d	«      «       Z G d
„ de«      Zy)uJ   llama.cpp integration â€” local inference via llama.cpp server or library.é    )ÚannotationsN)ÚAsyncIteratorÚIterator)Ú	dataclass)ÚAny)Ú
ChatResultÚProviderABCÚProviderProtocolc                  ót   — e Zd ZU dZdZded<   dZded<   dZd	ed
<   dZded<   dZ	ded<   dZ
ded<   dZded<   y)ÚLlamaCppConfigz#Configuration for llama.cpp client.zhttp://127.0.0.1:8080ÚstrÚbase_urlg     À‚@ÚfloatÚtimeoutNú
str | NoneÚ
model_pathi   ÚintÚn_ctxr   Ún_gpu_layersé   Ú	n_threadsTÚboolÚ
verify_ssl)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r   r   r   r   r   © ó    úO/home/oem/CyberBrain26-unified/src/cyberbrain26/model_layer/llama_cpp_client.pyr   r      sK   … á-à+€HˆcÓ+Ø€GˆUÓØ!€J�
Ó!Ø€Eˆ3ÓØ€L�#ÓØ€IˆsÓØ€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„Zddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d)d„Z	 	 	 	 	 	 d(d„Z	 	 	 	 	 	 	 	 d*d„Zd+d„Zd,d„Zd-d„Z	 	 	 	 d.	 	 	 	 	 	 	 	 	 d/d„Zddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d0d„Z	 	 	 	 	 	 d1d„Z	 	 	 	 	 	 d2d„Zddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d3d„Z	 	 	 	 	 	 d1d„Z	 	 	 	 	 	 d2d„Zddœ	 	 	 	 	 	 	 d4d„Zd5d„Zd&d„Zd6d„Zy)7ÚLlamaCppClientz+llama.cpp client for local model inference.Nc                óT   — |xs
 t        «       | _        d | _        d | _        d| _        y )NF)r   ÚconfigÚ_httpÚ_async_httpÚ_lib_loaded)Úselfr%   s     r!   Ú__init__zLlamaCppClient.__init__    s(   € ØÒ0¤Ó 0ˆŒØ*.ˆŒ
Ø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LlamaCppClient.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   r0   s    r!   Ú
async_httpzLlamaCppClient.async_http0   sV   € à×ÑÐ#Ü$×0Ñ0ØŸ™×-Ñ-ØŸ™×+Ñ+Ø—{‘{×-Ñ-ô ˆDÔð
 ×ÑÐr    c                ó>   —  | j                   j                  ||fi |¤ŽS ©N)r1   Úrequest©r)   ÚmethodÚpathÚkwargss       r!   Ú_requestzLlamaCppClient._request:   s    € Ø ˆt�y‰y× Ñ  ¨Ñ8°Ñ8Ð8r    c              ‹  óZ   K  —  | j                   j                  ||fi |¤Žƒ d {  –—† S 7 Œ­wr6   )r4   r7   r8   s       r!   Ú	_arequestzLlamaCppClient._arequest=   s*   è ø€ Ø,�T—_‘_×,Ñ,¨V°TÑD¸VÑD×DÐDÐDús   ‚"+¤)¥+c                ó"  — g }| j                  dd«      }|j                  dk(  rF	 |j                  «       }t        |t        «      r#|j                  d|j                  dd«      i«       |S |S # t        $ r t        j                  d«       Y |S w xY w)NÚGETú/api/tokenizeéÈ   ÚmodelÚunknownz%Failed to parse models from llama.cpp)
r<   Ústatus_codeÚjsonÚ
isinstanceÚdictÚappendÚgetÚ	ExceptionÚloggerÚdebug)r)   ÚmodelsÚresponseÚdatas       r!   Úlist_modelszLlamaCppClient.list_models@   sŒ   € Ø')ˆØ—=‘= ¨Ó8ˆØ×Ñ 3Ò&ðFØ—}‘}“�Ü˜d¤DÔ)Ø—M‘M 7¨D¯H©H°W¸iÓ,HÐ"IÔJð ˆˆvˆøô ò FÜ—‘ÐDÕEØˆðFús   ¥AA, Á,BÂBc                óh   — | j                  dd«      }|j                  dk(  r|j                  «       S i S )Nr@   ú/rB   )r<   rE   rF   ©r)   rO   s     r!   ÚinfozLlamaCppClient.infoL   s1   € Ø—=‘= ¨Ó,ˆØ×Ñ 3Ò&Ø—=‘=“?Ð"Øˆ	r    c                ó  — |j                  d«      }|j                  d«      }|j                  d«      }|j                  d«      }|j                  dd«      }|j                  d«      }	|||dœ}
|�|
j                  d	i «       ||
d	   d<   |�|
j                  d	i «       ||
d	   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g «      }|r%|d   j                  di «      j                  dd«      S y)NÚtemperatureÚ
max_tokensÚtop_pÚtop_kÚstreamFÚextra©rC   Úmessagesr[   Úoptionszllama.cpp chat: model=%sÚPOSTú	/api/chat©rF   Úchoicesr   ÚmessageÚcontentÚ )	rJ   Ú
setdefaultÚupdaterL   rU   r<   Úraise_for_statusrF   Ú_stream_chat)r)   rC   r^   r;   rW   rX   rY   rZ   r[   r\   ÚbodyrO   rP   rc   s                 r!   ÚchatzLlamaCppClient.chatR   s‹  € ð —j‘j Ó/ˆØ—Z‘Z Ó-ˆ
Ø—
‘
˜7Ó#ˆØ—
‘
˜7Ó#ˆØ—‘˜H eÓ,ˆØ—
‘
˜7Ó#ˆàØ Øñ 
ˆð
 Ð"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ØÐ!Ø�O‰O˜I rÔ*Ø,6ˆD�‰O˜LÑ)ØÐØ�O‰O˜I rÔ*Ø',ˆD�‰O˜GÑ$ØÐØ�O‰O˜I rÔ*Ø',ˆD�‰O˜GÑ$ÙØ�K‰K˜Ôä�‰Ð.°Ô6à—=‘= ¨¸4�=Ó@ˆØ×!Ñ!Ô#Ø�}‰}‹ˆáØ×$Ñ$ U¨DÓ1Ð1Ø—(‘(˜9 bÓ)ˆÙØ˜1‘:—>‘> )¨RÓ0×4Ñ4°YÀÓCÐCØr    c              #  óŠ   K  — |D ]:  }|j                  d|«      |j                  dd«      |j                  dd«      dœ–— Œ< y ­w)NrC   re   rf   ÚdoneF©rC   re   rn   ©rJ   ©r)   rC   rP   Úchunks       r!   rj   zLlamaCppClient._stream_chat   sK   è ø€ ð ò 	ˆEàŸ™ 7¨EÓ2Ø Ÿ9™9 Y°Ó3ØŸ	™	 &¨%Ó0ñó ñ	ùó   ‚AAF)rW   rX   rY   r[   r\   c               óì  — |||dœ}|�|j                  di «       ||d   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
g «      }|r|d   j                  dd«      S y)N©rC   Úpromptr[   r_   rW   rX   rY   zllama.cpp completion: model=%sr`   ú/api/completionrb   rc   r   Útextrf   )	rg   rh   rL   rU   r<   ri   rF   Ú_stream_completionrJ   )r)   rC   rv   rW   rX   rY   r[   r\   rk   rO   rP   rc   s               r!   Ú
completionzLlamaCppClient.completion‰   s  € ð ØØñ 
ˆð
 Ð"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ØÐ!Ø�O‰O˜I rÔ*Ø,6ˆD�‰O˜LÑ)ØÐØ�O‰O˜I rÔ*Ø',ˆD�‰O˜GÑ$ÙØ�K‰K˜Ôä�‰Ð4°eÔ<à—=‘= Ð):À�=ÓFˆØ×!Ñ!Ô#Ø�}‰}‹ˆáØ×*Ñ*¨5°$Ó7Ð7Ø—(‘(˜9 bÓ)ˆÙØ˜1‘:—>‘> &¨"Ó-Ð-Ør    c              #  óŠ   K  — |D ]:  }|j                  d|«      |j                  dd«      |j                  dd«      dœ–— Œ< y ­w)NrC   rx   rf   rn   F©rC   rx   rn   rp   rq   s       r!   ry   z!LlamaCppClient._stream_completion²   sK   è ø€ ð ò 	ˆEàŸ™ 7¨EÓ2ØŸ	™	 &¨"Ó-ØŸ	™	 &¨%Ó0ñó ñ	ùrs   c                ó  — |j                  d«      }||dœ}|r|j                  |«       t        j                  d|«       | j	                  dd|¬«      }|j                  «        |j                  «       }|j                  dg «      S )Nr\   ©rC   Úinputzllama.cpp embed: model=%sr`   ú/api/embeddingsrb   Ú
embeddings)rJ   rh   rL   rU   r<   ri   rF   )r)   rC   Útextsr;   r\   rk   rO   rP   s           r!   ÚembedzLlamaCppClient.embed¼   s|   € ð —
‘
˜7Ó#ˆàØñ 
ˆñ Ø�K‰K˜Ôä�‰Ð/°Ô7à—=‘= Ð):À�=ÓFˆØ×!Ñ!Ô#Ø�}‰}‹ˆØ�x‰x˜ bÓ)Ð)r    c                óÐ   — | j                  dd||dœ¬«      }|j                  «        |j                  «       }|j                  dg «      }|D �cg c]  }t	        |«      ‘Œ c}S c c}w )Nr`   rA   )rC   re   rb   Útokens)r<   ri   rF   rJ   r   )r)   rC   rx   rO   rP   r…   Úts          r!   ÚtokenizezLlamaCppClient.tokenizeÑ   sc   € Ø—=‘= ¨ØØñ@
�=ó ˆð 	×!Ñ!Ô#Ø�}‰}‹ˆØ—‘˜( BÓ'ˆØ &Ö'˜1”�A•Ò'Ð'ùÒ's   ÁA#c                ó”   — | j                  dd||dœ¬«      }|j                  «        |j                  «       }|j                  dd«      S )Nr`   z/api/detokenize)rC   r…   rb   rx   rf   )r<   ri   rF   rJ   )r)   rC   r…   rO   rP   s        r!   Ú
detokenizezLlamaCppClient.detokenizeÛ   sM   € Ø—=‘= Ð):ØØñB
�=ó ˆð 	×!Ñ!Ô#Ø�}‰}‹ˆØ�x‰x˜ Ó#Ð#r    c                óˆ   — | j                   r		 ddlm} |S 	 ddlm} d| _         |S # t        $ r Y y w xY w# t        $ r Y y w xY w)Nr   )ÚLlamaT)r(   Ú	llama_cppr‹   ÚImportError)r)   r‹   s     r!   Ú_load_libraryzLlamaCppClient._load_libraryä   sT   € Ø×ÒðÝ+Ø�ð	Ý'Ø#ˆDÔØˆLøô ò Ùðûô ò 	Ùð	ús   Ž& —5 ¦	2±2µ	AÁ Ac                ó®  — | j                  «       }|€t        d«      ‚|xs | j                  j                  xs d|xs | j                  j                  |xs | j                  j
                  |xs | j                  j                  ddœ}|j                  «       D ��ci c]  \  }}|sŒ	||“Œ }}}t        j                  d|d   «        |di |¤ŽS c c}}w )NzYllama-cpp-python is required for library mode. Install with: pip install llama-cpp-pythonrf   F)r   r   r   r   ÚverbosezLoading llama.cpp model: %sr   r   )
rŽ   r�   r%   r   r   r   r   ÚitemsrL   rU   )	r)   r   r   r   r   Ú	Llama_clsr;   ÚkÚvs	            r!   Úload_library_modelz!LlamaCppClient.load_library_modelò   sÏ   € ð ×&Ñ&Ó(ˆ	ØÐÜð=óð ð %ÒD¨¯©×(>Ñ(>ÒDÀ"ØÒ/˜dŸk™k×/Ñ/Ø(ÒD¨D¯K©K×,DÑ,DØ"Ò; d§k¡k×&;Ñ&;Øñ"
ˆð $*§<¡<£>×7™4˜1˜a²Q�!�Q‘$Ð7ˆÑ7ä�‰Ð1°6¸,Ñ3GÔHÙÑ"˜6Ñ"Ð"ùó 8s   Â
CÂ(Cc             ƒ  óD  K  — |||dœ}|�|j                  di «       ||d   d<   |�|j                  di «       ||d   d<   |�|j                  di «       ||d   d<   |r|j                  |«       |r| j                  ||«      S | j                  ||«      ƒ d {  –—† S 7 Œ­w)Nr]   r_   rW   rX   rY   )rg   rh   Ú_astream_chatÚ_achat_nonstream)	r)   rC   r^   rW   rX   rY   r[   r\   rk   s	            r!   ÚachatzLlamaCppClient.achat  s¾   è ø€ ð Ø Øñ 
ˆð
 Ð"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ØÐ!Ø�O‰O˜I rÔ*Ø,6ˆD�‰O˜LÑ)ØÐØ�O‰O˜I rÔ*Ø',ˆD�‰O˜GÑ$ÙØ�K‰K˜ÔáØ×%Ñ% e¨TÓ2Ð2Ø×*Ñ*¨5°$Ó7×7Ð7Ð7úó   ‚BB ÂBÂB c               ó  K  — | j                  dd|¬«      ƒ d {  –—† }|j                  «        |j                  «       }|D ];  }|j                  d|«      |j                  dd«      |j                  dd«      d	œ­–— Œ= y 7 Œe­w)
Nr`   ra   rb   rC   re   rf   rn   Fro   ©r>   ri   rF   rJ   ©r)   rC   rk   rO   rP   rr   s         r!   r—   zLlamaCppClient._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g «      }|r%|d   j                  di «      j                  dd«      S y7 Œ^­w)	Nr`   ra   rb   rc   r   rd   re   rf   rœ   ©r)   rC   rk   rO   rP   rc   s         r!   r˜   zLlamaCppClient._achat_nonstream<  st   è ø€ ð
 Ÿ™¨°À$˜ÓG×GˆØ×!Ñ!Ô#Ø�}‰}‹ˆà—(‘(˜9 bÓ)ˆÙØ˜1‘:—>‘> )¨RÓ0×4Ñ4°YÀÓCÐCØð Hús   ‚A;šA9›AA;c             ƒ  óD  K  — |||dœ}|�|j                  di «       ||d   d<   |�|j                  di «       ||d   d<   |�|j                  di «       ||d   d<   |r|j                  |«       |r| j                  ||«      S | j                  ||«      ƒ d {  –—† S 7 Œ­w)Nru   r_   rW   rX   rY   )rg   rh   Ú_astream_completionÚ_acompletion_nonstream)	r)   rC   rv   rW   rX   rY   r[   r\   rk   s	            r!   ÚacompletionzLlamaCppClient.acompletionJ  s¾   è ø€ ð ØØñ 
ˆð
 Ð"Ø�O‰O˜I rÔ*Ø-8ˆD�‰O˜MÑ*ØÐ!Ø�O‰O˜I rÔ*Ø,6ˆD�‰O˜LÑ)ØÐØ�O‰O˜I rÔ*Ø',ˆD�‰O˜GÑ$ÙØ�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)
Nr`   rw   rb   rC   rx   rf   rn   Fr|   rœ   r�   s         r!   r¢   z"LlamaCppClient._astream_completionj  s€   è ø€ ð
 Ÿ™¨Ð0AÈ˜ÓM×MˆØ×!Ñ!Ô#Ø�}‰}‹ˆàò 	ˆEàŸ™ 7¨EÓ2ØŸ	™	 &¨"Ó-ØŸ	™	 &¨%Ó0ñô ñ	ð	 Núrž   c              ƒ  óÚ   K  — | j                  dd|¬«      ƒ d {  –—† }|j                  «        |j                  «       }|j                  dg «      }|r|d   j                  dd«      S y7 ŒN­w)Nr`   rw   rb   rc   r   rx   rf   rœ   r    s         r!   r£   z%LlamaCppClient._acompletion_nonstreamz  sh   è ø€ ð
 Ÿ™¨Ð0AÈ˜ÓM×MˆØ×!Ñ!Ô#Ø�}‰}‹ˆà—(‘(˜9 bÓ)ˆÙØ˜1‘:—>‘> &¨"Ó-Ð-Øð Nús   ‚A+šA)›AA+)r\   c             ƒ  óÚ   K  — ||dœ}|r|j                  |«       | j                  dd|¬«      ƒ d {  –—† }|j                  «        |j                  «       }|j	                  dg «      S 7 Œ6­w)Nr~   r`   r€   rb   r�   )rh   r>   ri   rF   rJ   )r)   rC   r‚   r\   rk   rO   rP   s          r!   ÚaembedzLlamaCppClient.aembedˆ  sl   è ø€ ð Øñ 
ˆñ Ø�K‰K˜ÔàŸ™¨Ð0AÈ˜ÓM×MˆØ×!Ñ!Ô#Ø�}‰}‹ˆØ�x‰x˜ bÓ)Ð)ð Nús   ‚0A+²A)³7A+c                ód   — 	 | j                  dd«      }|j                  dk(  S # t        $ r Y yw xY w)Nr@   rS   rB   F)r<   rE   rK   rT   s     r!   Úis_availablezLlamaCppClient.is_available›  s:   € ð	Ø—}‘} U¨CÓ0ˆHØ×'Ñ'¨3Ñ.Ð.øÜò 	Ùð	ús   ‚ # £	/®/c                ó¤   — 	 | j                  «       }dd| j                  j                  |dœS # t        $ r}ddt	        |«      dœcY d }~S d }~ww xY w)NTz	llama.cpp)ÚhealthyÚproviderr   Úserver_infoF)r¬   r­   Úerror)rU   r%   r   rK   r   )r)   rU   Úexcs      r!   Úhealth_checkzLlamaCppClient.health_check¢  sX   € ð		RØ—9‘9“;ˆDàØ'Ø ŸK™K×0Ñ0Ø#ñ	ð øô ò 	RØ$°+ÌÈCËÑQÕQûð	Rús   ‚*- ­	A¶A
ÁAÁ
A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_completerK   )r)   r´   Úloops      r!   r³   zLlamaCppClient.close®  s°   € Ø�:‰:Ð!Ø�J‰J×ÑÔØ×ÑÐ'ð(Ûà×-Ñ-Ó/�Ø—?‘?Ô$Ø×$Ñ$ T×%5Ñ%5×%<Ñ%<Ó%>Õ?à×+Ñ+¨D×,<Ñ,<×,CÑ,CÓ,EÔFð $(�Õ ð (øô ò Ùðûð $(�Õ ús$   ´A7B4 Â4	C Â=C Â?C Ã C Ã	Cr6   )r%   zLlamaCppConfig | NoneÚreturnÚNone)r»   zhttpx.Client)r»   zhttpx.AsyncClient)r9   r   r:   r   r;   r   r»   zhttpx.Response)r»   zlist[dict[str, Any]])r»   údict[str, Any])rC   r   r^   úlist[dict[str, str]]r;   r   r»   r   )rC   r   rP   r   r»   zIterator[dict[str, Any]])rC   r   rv   r   rW   úfloat | NonerX   ú
int | NonerY   r¿   r[   r   r\   údict[str, Any] | Noner»   zstr | Iterator[dict[str, Any]])rC   r   r‚   ú	list[str]r;   r   r»   úlist[list[float]])rC   r   rx   r   r»   ú	list[int])rC   r   r…   rÄ   r»   r   )r»   r   )NNNN)
r   r   r   rÀ   r   rÀ   r   rÀ   r»   r   )rC   r   r^   r¾   rW   r¿   rX   rÀ   rY   r¿   r[   r   r\   rÁ   r»   ú#str | AsyncIterator[dict[str, Any]])rC   r   rk   r½   r»   zAsyncIterator[dict[str, Any]])rC   r   rk   r½   r»   r   )rC   r   rv   r   rW   r¿   rX   rÀ   rY   r¿   r[   r   r\   rÁ   r»   rÅ   )rC   r   r‚   rÂ   r\   rÁ   r»   rÃ   )r»   r   )r»   r¼   )r   r   r   r   r*   Úpropertyr1   r4   r<   r>   rQ   rU   rl   rj   rz   ry   rƒ   r‡   r‰   rŽ   r•   r™   r—   r˜   r¤   r¢   r£   r¨   rª   r±   r³   r   r    r!   r#   r#      s  „ Ù5ô'ð òó ðð ò ó ð ó9óEó
óð+àð+ð 'ð+ð ð	+ð
 
ó+ðZØðØ #ðà	!óð %)Ø!%Ø"ØØ'+ñ'àð'ð ð'ð
 "ð'ð ð'ð ð'ð ð'ð %ð'ð 
(ó'ðRØðØ #ðà	!óð*àð*ð ð*ð ð	*ð
 
ó*ó*(ó$óð  "&Ø Ø#'Ø $ð#àð#ð ð#ð !ð	#ð
 ð#ð 
ó#ð> %)Ø!%Ø"ØØ'+ñ8àð8ð 'ð8ð
 "ð8ð ð8ð ð8ð ð8ð %ð8ð 
-ó8ð@àðð ðð 
'ó	ð àðð ðð 
ó	ð& %)Ø!%Ø"ØØ'+ñ>àð>ð ð>ð
 "ð>ð ð>ð ð>ð ð>ð %ð>ð 
-ó>ð@àðð ðð 
'ó	ð àðð ðð 
ó	ð& (,ñ*àð*ð ð*ð
 %ð*ð 
ó*ó&ó
Rô(r    r#   )r   Ú
__future__r   ÚloggingÚcollections.abcr   r   Údataclassesr   Útypingr   r.   Ú+cyberbrain26.model_layer.provider_interfacer   r	   r
   Ú	getLoggerr   rL   r   r#   r   r    r!   ú<module>rÎ      sY   ðÙ På "ã ß 3Ý !Ý ã ß aÑ aà	ˆ×	Ñ	˜8Ó	$€ð ÷	ð 	ó ð	ô`(�[õ `(r    