Ë
    ÛJêj
S  ã                  óF  — d Z ddlmZ ddlZddlZddlZddlm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mZmZmZmZmZmZmZmZmZmZ dd	lmZmZ dd
l mZ! ddl"m#Z#  ejH                  e%«      Z&e	 G d„ d«      «       Z' G d„ de(«      Z) G d„ de)«      Z* G d„ d«      Z+y)uR  Model Gateway â€” unified interface for the Model Layer.

The Model Gateway provides a single entry point for:
- Chat/completion requests with automatic routing and fallback
- Embedding generation
- Model and provider registry management
- Model intelligence (discovery, validation, classification)
- Health checking across all providers
é    )ÚannotationsN)ÚIterator)Ú	dataclassÚfield)ÚAny)ÚModelEgressGate)ÚLiteLLMClientÚLiteLLMConfigÚModelIntelligenceÚModelRecordÚModelRegistryÚModelRouterÚOllamaClientÚOllamaConfigÚProviderRecordÚProviderRegistryÚProviderStatusÚProviderTrustÚRouterConfig)ÚLlamaCppClientÚLlamaCppConfig)r   )ÚSecurityErrorc                  ó®   — e Zd ZU dZdZded<    e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<   dZded<   dZded<   y)ÚModelGatewayConfigz Configuration for Model Gateway.ÚlitellmÚstrÚdefault_providerc                 ó
   — ddgS )NÚollamaú	llama.cpp© r!   ó    úW/home/oem/CyberBrain26-unified/src/cyberbrain26/control_plane/model_gateway/__init__.pyú<lambda>zModelGatewayConfig.<lambda>0   s   € À8È[ÐBY€ r"   )Údefault_factoryú	list[str]Úfallback_providersTÚboolÚprefer_localÚprefer_freeÚ	free_onlyÚlocal_firstÚstrategyNzLiteLLMConfig | NonezOllamaConfig | Noner   zLlamaCppConfig | NoneÚ	llama_cppzRouterConfig | NoneÚrouter)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   r'   r)   r*   r+   r-   r   r   r.   r/   r!   r"   r#   r   r   +   su   … á*à%Ð�cÓ%Ù$)Ñ:YÔ$ZÐ˜	ÓZØ€L�$ÓØ€K�ÓØ€IˆtÓØ!€HˆcÓ!à$(€GÐ!Ó(Ø"&€FÐÓ&Ø'+€IÐ$Ó+Ø"&€FÐÔ&r"   r   c                  ó   — e Zd ZdZy)ÚModelGatewayErrorz(Base exception for Model Gateway errors.N©r0   r1   r2   r3   r!   r"   r#   r6   r6   <   s   „ Ú2r"   r6   c                  ó   — e Zd ZdZy)ÚModelNotAvailableErrorz+Raised when no suitable model is available.Nr7   r!   r"   r#   r9   r9   @   s   „ Ú5r"   r9   c                  óô  — e Zd ZdZ	 d&dddœ	 	 	 	 	 	 	 d'd„Zd(d„Zd(d„Zddddd	dd
œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d)d„Zd*d„Z	 	 	 	 	 	 	 	 	 	 d+d„Z	dddœ	 	 	 	 	 d,d„Z
	 	 	 	 	 	 	 	 	 	 	 	 	 	 d-d„Z	 d&	 	 	 	 	 	 	 	 	 	 	 	 	 d.d„Zddœ	 	 	 	 	 	 	 d/d„Z	 	 	 	 	 	 	 	 d0d„Zd1d„Zd2d„Zd3d„Zd4d„Zd5d„Zd6d„Zd3d„Zd&d7d„Zd8d„Zd9d„Zdddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 d:d „Zdddd!œ	 	 	 	 	 	 	 d;d"„Zd<d#„Zd=d$„Zd>d%„Zy)?ÚModelGatewayz'Unified Model Gateway for CyberBrain26.Nzmodel-gateway)Úegress_gateÚagent_idc               óÔ  — |xs
 t        «       | _        t        | j                  j                  «      | _        t        | j                  j                  «      | _        t        | j                  j                  «      | _
        t        «       | _        t        «       | _        t        | j                  | j                  ¬«      | _        t#        | j                  | j                  | j                  j$                  xs5 t'        | j                  j(                  | j                  j*                  ¬«      | j                   ¬«      | _        | j-                  «        || _        t1        |¬«      | _        y )N)Úmodel_registryÚprovider_registry)r)   r*   )r?   r@   ÚconfigÚmodel_intelligence)r<   )r   rA   r	   r   Úlitellm_clientr   r   Úollama_clientr   r.   Úllama_cpp_clientr   r?   r   r@   r   rB   r   r/   r   r)   r*   Ú_register_builtin_providersr=   r   Úmodel_egress)ÚselfrA   r<   r=   s       r#   Ú__init__zModelGateway.__init__G   s  € ð Ò4Ô 2Ó 4ˆŒä+¨D¯K©K×,?Ñ,?Ó@ˆÔÜ)¨$¯+©+×*<Ñ*<Ó=ˆÔÜ .¨t¯{©{×/DÑ/DÓ EˆÔä-:«_ˆÔÜ3CÓ3EˆÔÜ"3Ø×.Ñ.Ø"×4Ñ4ô#
ˆÔô
 "Ø×.Ñ.Ø"×4Ñ4Ø—;‘;×%Ñ%ò ¬Ø!Ÿ[™[×5Ñ5Ø ŸK™K×3Ñ3ô*ð  $×6Ñ6ô
ˆŒð 	×(Ñ(Ô*ð !ˆŒÜ+¸ÔDˆÕr"   c                ó  — t        dt        j                  ddddddg d¢t        j                  ddddd¬«      }| j
                  j                  |«       t        dt        j                  ddddddg d	¢t        j                  ddddd¬
«      }| j
                  j                  |«       t        dt        j                  dddddddgt        j                  ddddd¬
«      }| j
                  j                  |«       | j                  «        y )Nr   TFzhttps://api.litellm.ai)
zgemini-flashz
gemini-prozgpt-4ozgpt-4o-minizclaude-3-5-sonnetzclaude-3-haikuzmistral-largezmistral-mediumzgroq-llama-3zgroq-mixtral)ÚproviderÚstatusÚ	free_tierÚregistration_requiredÚcard_requiredÚapi_baseÚapi_key_requiredÚapi_availableÚavailable_modelsÚtrustÚsourceÚfreeÚno_cardÚapi_availabilityÚofficial_sourcer   zhttp://127.0.0.1:11434)Úllama3zllama3.1ÚmistralÚmixtralÚphi3Úgemma2zqwen2.5)rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   Úlocal_availabilityrX   r    zhttp://127.0.0.1:8080)	r   r   ÚACTIVEr   ÚOFFICIALr@   ÚregisterÚ	COMMUNITYÚ_register_builtin_models)rH   Úlitellm_providerÚollama_providerÚllama_cpp_providers       r#   rF   z(ModelGateway._register_builtin_providersn   s'  € Ü)ØÜ!×(Ñ(ØØ"'ØØ-Ø!Øòô  ×(Ñ(ØØØØ!Ø ô5
Ðð8 	×Ñ×'Ñ'Ð(8Ô9ä(ØÜ!×(Ñ(ØØ"'ØØ-Ø"Øòô  ×)Ñ)ØØØØ#Ø!ô/
ˆð2 	×Ñ×'Ñ'¨Ô8ä+Ø Ü!×(Ñ(ØØ"'ØØ,Ø"ØØ)˜]Ü×)Ñ)ØØØØ#Ø!ô
Ðð" 	×Ñ×'Ñ'Ð(:Ô;à×%Ñ%Õ'r"   c                ó’  — ddl m}m}m}m}m}m} | j                  j                  d«      xs t        dg ¬«      j                  D ]]  }| j                  j                   ||d|j                  |j                  dd|j                  |j                    |ddd¬«      ¬«	      «       Œ_ | j                  j                  d	«      xs t        d	g ¬«      j                  D ]\  }| j                  j                   ||d	|j                  |j                  dd|j                  |j"                   |dd¬
«      ¬«	      «       Œ^ | j                  j                  d«      xs t        dg ¬«      j                  D ]Y  }| j                  j                   ||d|j                  |j                  dd|j                  |j"                   |«       ¬«	      «       Œ[ y )Nr   )ÚModelCapabilitiesÚModelFreeStatusr   ÚModelStatusÚ
ModelTrustÚ	ModelTyper   )rK   rS   TF)Útool_callingÚ	reasoningÚcoding)	Úmodel_idrK   Ú
model_typerL   rR   Úlocal_availableÚfree_statusrT   Úcapabilitiesr   )rn   rp   r    )Úcyberbrain26.model_layerri   rj   r   rk   rl   rm   r@   Úgetr   rS   r?   rb   ÚCHATr`   ÚFREEra   rc   )rH   ri   rj   r   rk   rl   rm   rq   s           r#   rd   z%ModelGateway._register_builtin_models½   sÃ  € ÷	
÷ 	
ð ×/Ñ/×3Ñ3°IÓ>ÒyÄ.ÐZcÐvxÔBy÷  Lñ  Lò 	ˆHØ×Ñ×(Ñ(ÙØ%Ø&Ø(Ÿ~™~Ø&×-Ñ-Ø"&Ø$)Ø /× 4Ñ 4Ø$×-Ñ-Ù!2Ø%)Ø"&Ø#ô"ôõð	ð& ×/Ñ/×3Ñ3°HÓ=ÒwÄÐYaÐtvÔAw÷  Jñ  Jò 	ˆHØ×Ñ×(Ñ(ÙØ%Ø%Ø(Ÿ~™~Ø&×-Ñ-Ø"&Ø$(Ø /× 4Ñ 4Ø$×.Ñ.Ù!2Ø%)Ø#ô"ôõð	ð$ ×/Ñ/×3Ñ3°KÓ@Ò}ÄNÐ\gÐz|ÔD}÷  Pñ  Pò 	ˆHØ×Ñ×(Ñ(ÙØ%Ø(Ø(Ÿ~™~Ø&×-Ñ-Ø"&Ø$(Ø /× 4Ñ 4Ø$×.Ñ.Ù!2Ó!4ô
õñ	r"   FT)ÚtemperatureÚ
max_tokensÚstreamr)   ÚfallbackÚclassificationsc          	     ó@  — | j                  ||¬«      }	| j                  |	j                  |||«       	 | j                  |	|||||«      S # t        $ rK}
|r2t
        j                  d|
«       | j                  ||||||¬«      cY d }
~
S t        d|› d|
› �«      |
‚d }
~
ww xY w)N©rq   r)   z)Primary model failed, trying fallback: %s)r~   zChat failed for model z: )	Ú_resolve_routeÚ_authorize_egressrK   Ú_execute_chatÚ	ExceptionÚloggerÚwarningÚ_fallback_chatr9   )rH   ÚmodelÚmessagesrz   r{   r|   r)   r}   r~   ÚrouteÚexcs              r#   ÚchatzModelGateway.chatû   sÂ   € ð ×#Ñ#¨UÀÐ#ÓNˆà×Ñ˜uŸ~™~¨u°hÀÔPð	Ø×%Ñ%Ø�u˜h¨°ZÀóð øô ò 		ÙÜ—‘ÐJÈCÔPØ×*Ñ*Ø˜8 [°*¸fØ$3ð +ó õ ô )Ø(¨¨¨r°#°Ð7óàðûð		ús#   ³A	 Á		BÁ.BÂ BÂBÂBc                ón   — | j                   j                  |«      }t        |duxr |j                  «      S )zÒWhether the registry records ``model_id`` as free-eligible.

        Unknown models are treated as not free: the free-only guarantee must
        fail closed when the registry has no record to consult.
        N)r?   rw   r(   Úis_free)rH   rq   Úrecords      r#   Ú_model_is_freezModelGateway._model_is_free  s3   € ð ×$Ñ$×(Ñ(¨Ó2ˆÜ�F $Ð&Ò9¨6¯>©>Ó:Ð:r"   c           
     ó0  — | j                   j                  €y|st        d«      ‚t        j                  |dd¬«      }| j                   j                  | j                  ||t        j                  |j                  d«      «      j                  «       |¬«       y)a  Clear the request with the egress gate before any provider call.

        Fail-closed: a missing classification is refused rather than assumed
        public.  No gate configured means no check, which is the pre-F4
        behaviour and is explicit at construction time.
        NzKmodel egress requires an explicit classification; refusing to assume PUBLICFT)Úensure_asciiÚ	sort_keyszutf-8)r=   Úprovider_idrq   Úpayload_sha256r~   )rG   Ú_egress_gater   ÚjsonÚdumpsÚauthorize_model_callr=   ÚhashlibÚsha256ÚencodeÚ	hexdigest)rH   Úprovider_namerˆ   r‰   r~   Úpayloads         r#   r‚   zModelGateway._authorize_egress#  s‰   € ð ×Ñ×)Ñ)Ð1ØáÜð óð ô
 —*‘*˜X°EÀTÔJˆØ×Ñ×.Ñ.Ø—]‘]Ø%ØÜ"Ÿ>™>¨'¯.©.¸Ó*AÓB×LÑLÓNØ+ð 	/õ 	
r"   r€   c               ó.  — |rR| j                   j                  |«      }|r5|j                  r)| j                  j                  |j                  «      }|r|S |s| j
                  j                  rB| j                  j                  «       }|D ]#  }|j                  t        j                  k(  sŒ!|c S  | j                  j                  d«      }|r|j                  t        j                  k(  r|S | j                  j                  «       }|r|d   S t        d«      ‚)Nr   r   zNo active providers available)r?   rw   rs   r@   rK   rA   r)   Ú
list_localrL   Ú_ProviderStatusr`   Úlist_activer9   )	rH   rq   r)   rˆ   rK   Úlocal_providersÚpr   Úactives	            r#   r�   zModelGateway._resolve_routeB  sñ   € ñ Ø×'Ñ'×+Ñ+¨HÓ5ˆEÙ˜×.Ò.Ø×1Ñ1×5Ñ5°e·n±nÓE�ÙØ#�Oá˜4Ÿ;™;×3Ò3Ø"×4Ñ4×?Ñ?ÓAˆOØ$ò �Ø—8‘8œ×5Ñ5Ó5Ø’Hðð ×(Ñ(×,Ñ,¨YÓ7ˆÙ�w—~‘~¬×)?Ñ)?Ò?ØˆNà×'Ñ'×3Ñ3Ó5ˆÙØ˜!‘9Ðä$Ð%DÓEÐEr"   c                óL  — |j                   dk(  r | j                  j                  |||||¬«      S |j                   dk(  r | j                  j                  |||||¬«      S |j                   dk(  r | j                  j                  |||||¬«      S t        d|j                   › �«      ‚)Nr   )rˆ   r‰   rz   r{   r|   r   )rˆ   r‰   rz   Únum_predictr|   r    úUnknown provider: )rK   rC   rŒ   rD   rE   r9   )rH   rK   rˆ   r‰   rz   r{   r|   s          r#   rƒ   zModelGateway._execute_chat_  sÕ   € ð ×Ñ 	Ò)Ø×&Ñ&×+Ñ+ØØ!Ø'Ø%Øð ,ó ð ð ×Ñ (Ò*Ø×%Ñ%×*Ñ*ØØ!Ø'Ø&Øð +ó ð ð ×Ñ +Ò-Ø×(Ñ(×-Ñ-ØØ!Ø'Ø%Øð .ó ð ô )Ð+=¸h×>OÑ>OÐ=PÐ)QÓRÐRr"   c           	     ód  — | j                   j                  }|D ]´  }| j                  j                  |«      }	|	sŒ!|	j                  t
        j                  k(  sŒ?| j                   j                  r)| j                  |«      st        j                  d||«       Œ~	 | j                  |	j                  |||«       	 | j                  |	|||||«      c S  t!        d|z   «      ‚# t        $ r ‚ t        $ r t        j                  d|«       Y Œïw xY w# t        $ r t        j                  d|«       Y �Œw xY w)Nz;Fallback provider %s refused: model %r is not free-eligiblez+Fallback provider %s blocked by egress gatezFallback provider %s failedz,All fallback providers exhausted for model: )rA   r'   r@   rw   rL   r¢   r`   r+   r�   r…   r†   r‚   rK   r   r„   rƒ   r9   )
rH   rˆ   r‰   rz   r{   r|   r~   r'   rž   rK   s
             r#   r‡   zModelGateway._fallback_chatƒ  s:  € ð "Ÿ[™[×;Ñ;ÐØ/ò  	ˆMØ×-Ñ-×1Ñ1°-Ó@ˆHÚ˜HŸO™O¬×/EÑ/EÓEð —;‘;×(Ò(°×1DÑ1DÀUÔ1KÜ—N‘NØUØ%Øôð
 ð
Ø×*Ñ*Ø ×)Ñ)¨5°(¸OôðØ×-Ñ-Ø  %¨°;À
ÈFóò ð3 	ôD %Ø:¸UÑBó
ð 	
øô# %ò ØÜ ò Ü—N‘NØEÀ}ôñ ð	ûô !ò Ü—N‘NØ5°}ôò ð	ús$   ÂCÂ7DÃ(D	ÄD	ÄD/Ä.D/)r)   c               óˆ  — |s| j                   j                  rS| j                  j                  «       }|D ]4  }|j                  t
        j                  k(  sŒ!| j                  |||«      c S  | j                  j                  d«      }|r0|j                  t
        j                  k(  r| j                  |||«      S t        d«      ‚)Nr   zNo provider for embeddings)
rA   r)   r@   r¡   rL   r¢   r`   Ú_execute_embedrw   r9   )rH   rˆ   Útextsr)   r¤   r¥   r   s          r#   ÚembedzModelGateway.embed³  s¬   € ñ ˜4Ÿ;™;×3Ò3Ø"×4Ñ4×?Ñ?ÓAˆOØ$ò @�Ø—8‘8œ×5Ñ5Ó5Ø×.Ñ.¨q°%¸Ó?Ò?ð@ð ×(Ñ(×,Ñ,¨YÓ7ˆÙ�w—~‘~¬×)?Ñ)?Ò?Ø×&Ñ& w°°uÓ=Ð=ä$Ð%AÓBÐBr"   c                ó:  — |j                   dk(  r| j                  j                  ||¬«      S |j                   dk(  r| j                  j                  ||¬«      S |j                   dk(  r| j                  j                  ||¬«      S t        d|j                   › �«      ‚)Nr   )rˆ   r­   r   r    r©   )rK   rC   r®   rD   rE   r9   )rH   rK   rˆ   r­   s       r#   r¬   zModelGateway._execute_embedÆ  sœ   € ð ×Ñ 	Ò)Ø×&Ñ&×,Ñ,°5ÀÐ,ÓFÐFØ×Ñ (Ò*Ø×%Ñ%×+Ñ+°%¸uÐ+ÓEÐEØ×Ñ +Ò-Ø×(Ñ(×.Ñ.°UÀ%Ð.ÓHÐHä(Ð+=¸h×>OÑ>OÐ=PÐ)QÓRÐRr"   c                ó8   — | j                   j                  |«      S ©N)r?   rb   ©rH   rˆ   s     r#   Úregister_modelzModelGateway.register_modelÕ  s   € Ø×"Ñ"×+Ñ+¨EÓ2Ð2r"   c                ó8   — | j                   j                  |«      S r±   )r?   rw   )rH   rq   s     r#   Ú	get_modelzModelGateway.get_modelØ  s   € Ø×"Ñ"×&Ñ& xÓ0Ð0r"   c                ó6   — | j                   j                  «       S r±   )r?   Úlist_all©rH   s    r#   Úlist_modelszModelGateway.list_modelsÛ  s   € Ø×"Ñ"×+Ñ+Ó-Ð-r"   c                ó8   — | j                   j                  |«      S r±   )r@   rb   )rH   rK   s     r#   Úregister_providerzModelGateway.register_providerÞ  s   € Ø×%Ñ%×.Ñ.¨xÓ8Ð8r"   c                ó8   — | j                   j                  |«      S r±   )r@   rw   ©rH   rž   s     r#   Úget_providerzModelGateway.get_providerá  s   € Ø×%Ñ%×)Ñ)¨-Ó8Ð8r"   c                ó6   — | j                   j                  «       S r±   )r@   r·   r¸   s    r#   Úlist_providerszModelGateway.list_providersä  s   € Ø×%Ñ%×.Ñ.Ó0Ð0r"   c                ó6   — | j                   j                  «       S r±   )rB   Údiscover_from_providersr¸   s    r#   Údiscover_modelszModelGateway.discover_modelsç  s   € Ø×&Ñ&×>Ñ>Ó@Ð@r"   c                ó8   — | j                   j                  |«      S r±   )rB   Úrun_pipeline)rH   Úmodelss     r#   Úrun_validation_pipelinez$ModelGateway.run_validation_pipelineê  s   € Ø×&Ñ&×3Ñ3°FÓ;Ð;r"   c                óL   — | j                   j                  |«      j                  S r±   )rB   ÚclassifyÚvaluer²   s     r#   Úclassify_modelzModelGateway.classify_modelí  s   € Ø×&Ñ&×/Ñ/°Ó6×<Ñ<Ð<r"   c                ó8   — | j                   j                  |«      S r±   )rB   Úscore_modelr²   s     r#   rÍ   zModelGateway.score_modelð  s   € Ø×&Ñ&×2Ñ2°5Ó9Ð9r"   ©rq   ru   r)   r*   r-   r+   c               ój  — ddl m} |r ||«      n || j                  j                  «      }| j                  j                  ||||||€| j                  j                  n|¬«      }	|	j                  |	j                  |	j                  j                  |	j                  |	j                  |	j                  dœS )Nr   )ÚRouteStrategyrÎ   ©rq   rK   r-   Úscorer}   Úreason)rv   rÐ   rA   r-   r/   rŠ   r+   rq   rK   rÊ   rÒ   r}   rÓ   )
rH   rq   ru   r)   r*   r-   r+   rÐ   ÚstratrŠ   s
             r#   rŠ   zModelGateway.routeó  s§   € õ 	;ñ ñ ˜(Ô#á˜tŸ{™{×3Ñ3Ó4ð 	ð —‘×!Ñ!ØØ%Ø%Ø#ØØ/8Ð/@�d—k‘k×+Ò+Àið "ó 
ˆð Ÿ™ØŸ™ØŸ™×,Ñ,Ø—[‘[ØŸ™Ø—l‘lñ
ð 	
r"   ©rq   ru   r+   c          
     ó2  — | j                   j                  |||€| j                  j                  n|¬«      }|D �cg c]Q  }|j                  |j
                  |j                  j                  |j                  |j                  |j                  dœ‘ŒS c}S c c}w )NrÕ   rÑ   )r/   Úroute_with_fallbackrA   r+   rq   rK   r-   rÊ   rÒ   r}   rÓ   )rH   rq   ru   r+   ÚroutesÚrs         r#   r×   z ModelGateway.route_with_fallback  s�   € ð —‘×0Ñ0ØØ%Ø/8Ð/@�d—k‘k×+Ò+Àið 1ó 
ˆð ö

ð ð ŸJ™JØŸJ™JØŸJ™J×,Ñ,ØŸ™ØŸJ™JØŸ(™(óò

ð 
	
ùò 

s   »ABc                ó„  — i | j                   j                  «       t        | j                   j                  «       «      t        | j                   j	                  «       «      t        | j                   j                  «       «      dœ| j                  j                  «       t        | j                  j                  «       «      dœdœ}| j                  j                  «       D ]`  }| j                  |j                  «      }|r!|j                  «       |d   |j                  <   ŒAd|j                  ddœ|d   |j                  <   Œb |S )N)Útotalr¦   ÚlocalrV   )Úcircuit_breakersÚtotal_routes)Ú	providersrÆ   Úroutingrß   Fz	no client)ÚhealthyrK   Úerror)r?   ÚcountÚlenr£   r¡   Ú	list_freer/   Úget_circuit_breaker_statusÚget_route_historyr@   r·   Ú_get_clientrK   Úhealth_check)rH   ÚresultsrK   Úclients       r#   ré   zModelGateway.health_check/  s  € àà×,Ñ,×2Ñ2Ó4Ü˜d×1Ñ1×=Ñ=Ó?Ó@Ü˜T×0Ñ0×;Ñ;Ó=Ó>Ü˜D×/Ñ/×9Ñ9Ó;Ó<ñ	ð %)§K¡K×$JÑ$JÓ$LÜ # D§K¡K×$AÑ$AÓ$CÓ Dññ#
ˆð ×.Ñ.×7Ñ7Ó9ò 		ˆHØ×%Ñ% h×&7Ñ&7Ó8ˆFÙØ:@×:MÑ:MÓ:O�˜Ñ$ X×%6Ñ%6Ò7ð  %Ø (× 1Ñ 1Ø(ñ;�˜Ñ$ X×%6Ñ%6Ò7ð		ð ˆr"   c                ój   — |dk(  r| j                   S |dk(  r| j                  S |dk(  r| j                  S y )Nr   r   r    )rC   rD   rE   r½   s     r#   rè   zModelGateway._get_clientK  sA   € Ø˜IÒ%Ø×&Ñ&Ð&Ø˜hÒ&Ø×%Ñ%Ð%Ø˜kÒ)Ø×(Ñ(Ð(Ør"   c                ó¢   — | j                   j                  «       D ]2  }| j                  |j                  «      }|sŒ!|j	                  «       sŒ2 y y)NTF)r@   r£   rè   rK   Úis_available)rH   rK   rë   s      r#   Ú
is_healthyzModelGateway.is_healthyT  sL   € Ø×.Ñ.×:Ñ:Ó<ò 	ˆHØ×%Ñ% h×&7Ñ&7Ó8ˆFÚ˜&×-Ñ-Õ/Ùð	ð r"   r±   )rA   zModelGatewayConfig | Noner<   z
Any | Noner=   r   ÚreturnÚNone)rð   rñ   )rˆ   r   r‰   úlist[dict[str, str]]rz   úfloat | Noner{   ú
int | Noner|   r(   r)   úbool | Noner}   r(   r~   úfrozenset[Any] | Nonerð   ústr | Iterator[dict[str, Any]])rq   r   rð   r(   )
rž   r   rˆ   r   r‰   rò   r~   rö   rð   rñ   )rq   ú
str | Noner)   rõ   rð   r   )rK   r   rˆ   r   r‰   rò   rz   ró   r{   rô   r|   r(   rð   r÷   )rˆ   r   r‰   rò   rz   ró   r{   rô   r|   r(   r~   rö   rð   r÷   )rˆ   r   r­   r&   r)   rõ   rð   úlist[list[float]])rK   r   rˆ   r   r­   r&   rð   rù   )rˆ   r   rð   r   )rq   r   rð   zModelRecord | None)rð   zlist[ModelRecord])rK   r   rð   r   )rž   r   rð   zProviderRecord | None)rð   zlist[ProviderRecord])rÆ   zlist[ModelRecord] | Nonerð   úlist[dict[str, Any]])rˆ   r   rð   r   )rˆ   r   rð   Úfloat)rq   rø   ru   údict[str, bool] | Noner)   rõ   r*   rõ   r-   rø   r+   rõ   rð   údict[str, Any])rq   rø   ru   rü   r+   rõ   rð   rú   )rð   rý   )rž   r   rð   r   )rð   r(   )r0   r1   r2   r3   rI   rF   rd   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"   r#   r;   r;   D   s  „ Ù1ð -1ð%Eð #'Ø'ñ%Eà)ð%Eð  ð	%Eð
 ð%Eð 
ó%EóNM(ó^<ðF %)Ø!%ØØ$(ØØ15ñàðð 'ðð
 "ðð ðð ðð "ðð ðð /ðð 
(óó>;ð
àð
ð ð
ð 'ð	
ð
 /ð
ð 
ó
ðD  $Ø$(ñ	Fð ðFð "ð	Fð
 
óFð:"Sà ð"Sð ð"Sð 'ð	"Sð
 "ð"Sð ð"Sð ð"Sð 
(ó"SðV 26ð.
àð.
ð 'ð.
ð "ð	.
ð
 ð.
ð ð.
ð /ð.
ð 
(ó.
ðj %)ñCàðCð ðCð
 "ðCð 
óCð&Sà ðSð ðSð ð	Sð
 
óSó3ó1ó.ó9ó9ó1óAô<ó=ó:ð  $Ø/3Ø$(Ø#'Ø#Ø!%ñ"
ð ð"
ð -ð	"
ð
 "ð"
ð !ð"
ð ð"
ð ð"
ð 
ó"
ðN  $Ø/3Ø!%ñ
ð ð
ð -ð	
ð
 ð
ð 
ó
ó0ó8ôr"   r;   ),r3   Ú
__future__r   rš   r—   ÚloggingÚcollections.abcr   Údataclassesr   r   Útypingr   Ú5cyberbrain26.control_plane.model_gateway.model_egressr   rv   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Ú)cyberbrain26.model_layer.llama_cpp_clientr   r   Ú*cyberbrain26.model_layer.provider_registryr¢   Ú&cyberbrain26.security_plane.permissionr   Ú	getLoggerr0   r…   r   r„   r6   r9   r;   r!   r"   r#   ú<module>r     s”   ðñõ #ã Û Û Ý $ß (Ý å Q÷÷ ÷ õ ÷ UÝ XÝ @à	ˆ×	Ñ	˜8Ó	$€ð ÷'ð 'ó ð'ô 3˜	ô 3ô6Ð.ô 6÷Uò Ur"   