Ë
    ÛJêj:H  ã                  ó  — d Z ddlmZ ddl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mZmZ  ej(                  e«      Z G d	„ d
e«      Z G d„ dee
«      Ze G d„ d«      «       Ze G d„ d«      «       Z G d„ d«      Zy)u?   Model Router â€” smart routing and fallback for model requests.é    )ÚannotationsN)Ú	dataclassÚfield)ÚEnum)ÚAny)ÚModelRecordÚModelRegistryÚModelStatus)ÚProviderRegistryÚProviderStatusc                  ó   — e Zd ZdZy)ÚModelRouterErrorz1Raised when no suitable model route can be found.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úE/home/oem/CyberBrain26-unified/src/cyberbrain26/model_layer/router.pyr   r      s   „ Ú;r   r   c                  ó(   — e Zd ZdZdZdZdZdZdZdZ	y)	ÚRouteStrategyz%Routing strategy for model selection.Úcost_optimizedÚperformanceÚreliabilityÚlocal_firstÚ
capabilityÚround_robinN)
r   r   r   r   ÚCOST_OPTIMIZEDÚPERFORMANCEÚRELIABILITYÚLOCAL_FIRSTÚ
CAPABILITYÚROUND_ROBINr   r   r   r   r      s#   „ Ù/à%€NØ€KØ€KØ€KØ€JØ�Kr   r   c                  ó–   — e Zd ZU dZej
                  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)ÚRouterConfigzConfiguration for Model Router.r   Údefault_strategyNzlist[str] | NoneÚfallback_chainFÚboolÚprefer_localTÚprefer_freeé   ÚintÚmax_fallback_depthg      N@ÚfloatÚhealth_check_intervalé   Úcircuit_breaker_thresholdg      >@Úcircuit_breaker_timeout)r   r   r   r   r   r   r&   Ú__annotations__r'   r)   r*   r-   r/   r1   r2   r   r   r   r%   r%   (   sa   … á)à&3×&BÑ&BÐ�mÓBØ'+€NÐ$Ó+Ø€L�$ÓØ€K�ÓØÐ˜ÓØ#'Ð˜5Ó'Ø%&Ð˜sÓ&Ø%)Ð˜UÔ)r   r%   c                  ó†   — e Zd ZU dZded<   ded<   ded<   ded<   d	Zd
ed<   dZded<    eej                  ¬«      Z	ded<   y)ÚRouteResultzResult of a routing decision.ÚstrÚmodel_idÚproviderr   Ústrategyr.   ÚscoreFr(   ÚfallbackÚ Úreason)Údefault_factoryÚ	timestampN)
r   r   r   r   r3   r;   r=   r   Útimer?   r   r   r   r5   r5   6   sA   … á'àƒMØƒMØÓØƒLØ€HˆdÓØ€FˆCÓÙ¨T¯Y©YÔ7€IˆuÔ7r   r5   c                  ó�  — e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 dd„Zdd„Zedd„«       Zdd„Zdd„Z	dd„Z
ed d	„«       Zddddddd
dœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d!d„Zdddd
dœ	 	 	 	 	 	 	 	 	 d"d„Z	 d#	 	 	 	 	 	 	 	 	 	 	 d$d„Z	 d#	 	 	 	 	 	 	 d%d„Z	 d#	 	 	 	 	 d&d„Z	 	 	 	 	 	 	 	 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„Zdd„Zy)-ÚModelRouterzðSmart model router with fallback and load balancing.

    Routes model requests based on capability requirements, provider
    health, cost, latency, and trust. Implements circuit breaker pattern
    and fallback chains for resilience.
    Nc                óà   — |xs
 t        «       | _        |xs
 t        «       | _        |xs
 t	        «       | _        || _        i | _        i | _        t        j                  «       | _        g | _        y ©N)r	   Úmodel_registryr   Úprovider_registryr%   ÚconfigÚ_model_intelligenceÚ_circuit_breakersÚ_rr_countersÚ	threadingÚLockÚ_rr_lockÚ_route_history)ÚselfrE   rF   rG   Úmodel_intelligences        r   Ú__init__zModelRouter.__init__K   s`   € ð -Ò?´³ˆÔØ!2Ò!HÔ6FÓ6HˆÔØÒ.¤£ˆŒØ#5ˆÔ à<>ˆÔØ,.ˆÔÜ!Ÿ™Ó(ˆŒØ13ˆÕr   c                ór   — | j                   �| j                   j                  |«      S | j                  |«      S )zHScore a model. Uses model_intelligence if available, else basic scoring.)rH   Úscore_modelÚ_basic_score)rO   Úmodels     r   Ú_score_modelzModelRouter._score_model\   s6   € à×#Ñ#Ð/Ø×+Ñ+×7Ñ7¸Ó>Ð>Ø× Ñ  Ó'Ð'r   c                óš  — d}| j                   j                  dv r|dz  }| j                  j                  dv r|dz  }| j                  �S| j                  dk\  r|dz  }n>| j                  dk\  r|dz  }n)| j                  d	k\  r|d
z  }n| j                  dk\  r|dz  }| j                  t
        j                  k(  r|d
z  }t        |d«      dz  S )Nç        ©ÚfreeÚfree_for_testÚfree_for_studyé   ©ÚofficialÚverifiedi ô é   i }  é   i@  é
   iÐ  r+   g      Y@)Úfree_statusÚvalueÚtrustÚcontext_windowÚstatusr
   ÚACTIVEÚmin)rU   r:   s     r   rT   zModelRouter._basic_scoreb   sÖ   € àˆØ×Ñ×"Ñ"Ð&QÑQØ�R‰KˆEØ�;‰;×ÑÐ 8Ñ8Ø�R‰KˆEØ×ÑÐ+Ø×#Ñ# vÒ-Ø˜‘‘Ø×%Ñ%¨Ò.Ø˜‘‘Ø×%Ñ%¨Ò-Ø˜‘‘Ø×%Ñ%¨Ò-Ø˜‘
�Ø�<‰<œ;×-Ñ-Ò-Ø�R‰KˆEÜ�5˜%Ó  5Ñ(Ð(r   c                ó$  — | j                   j                  |«      }|€y|j                  dd«      syt        j                  «       |j                  dd«      z
  | j                  j                  kD  r!d|d<   d|d<   t
        j                  d|«       yy)NTÚopenFÚlast_failurer   ÚfailureszCircuit breaker closed for %s)rI   Úgetr@   rG   r2   ÚloggerÚinfo©rO   Úprovider_nameÚcbs      r   Ú_check_circuit_breakerz"ModelRouter._check_circuit_breakerz   s€   € Ø×#Ñ#×'Ñ'¨Ó6ˆØˆ:ØØ�v‰v�f˜eÔ$ØÜ�9‰9‹;˜Ÿ™ °Ó2Ñ2°T·[±[×5XÑ5XÒXØˆBˆv‰JØˆBˆz‰NÜ�K‰KÐ7¸ÔGØØr   c                óü   — | j                   j                  |ddddœ«      }|dxx   dz  cc<   t        j                  «       |d<   |d   | j                  j                  k\  rd|d	<   t
        j                  d
|«       y y )Nr   rX   F©rn   rm   rl   rn   é   rm   Trl   zCircuit breaker OPEN for %s)rI   Ú
setdefaultr@   rG   r1   rp   Úwarningrr   s      r   Ú_record_failurezModelRouter._record_failure‡   sy   € Ø×#Ñ#×.Ñ.ØØ¨C¸Ñ?ó
ˆð 	ˆ:‹˜!Ñ‹Ü!ŸY™Y›[ˆˆ>ÑØˆj‰>˜TŸ[™[×BÑBÒBØˆBˆv‰JÜ�N‰NÐ8¸-ÕHð Cr   c                óT   — | j                   j                  |«      }|rd|d<   d|d<   y y )Nr   rn   Frl   )rI   ro   rr   s      r   Ú_record_successzModelRouter._record_success’   s2   € Ø×#Ñ#×'Ñ'¨Ó6ˆÙØˆBˆz‰NØˆBˆvŠJð r   c                ó†   — | €y| j                   j                  dv ryt        | d«      r| j                   j                  dv ryy)z1Check if a model is eligible for free-only usage.FrY   Trd   )rd   re   Úhasattr)rU   s    r   Ú_is_free_eligiblezModelRouter._is_free_eligibleœ   sH   € ð ˆ=Øà×Ñ×"Ñ"Ð&QÑQØä�5˜-Ô(¨U×->Ñ->×-DÑ-DÐHsÑ-sØØr   F)r7   r8   Úcapabilitiesr)   r*   r9   Ú	free_onlyc               ó`  — |xs | j                   j                  }|�|n| j                   j                  }|�|n| j                   j                  }d }|rO| j                  j                  |«      }| j                  |||||«      }	|	r| j                  j                  |	«       |	S | j                  |||«      }
|
st        d«      ‚|t        j                  k(  r| j                  |
||«      }	nÍ|t        j                  k(  r| j                  |
«      }	n¨|t        j                   k(  r| j#                  |
«      }	nƒ|t        j$                  k(  r| j'                  |
«      }	n^|t        j(                  k(  r| j+                  |
|«      }	n8|t        j,                  k(  r| j/                  |
«      }	n| j                  |
||«      }	|�[|rY| j1                  |«      sH|	j2                  |j2                  k7  r/d|j2                  ›d|	j2                  ›d|	j4                  › d�|	_        | j                  j                  |	«       |	S )Nz/No suitable models found for the given criteriazspecific model zG requested with free_only=True but not free-eligible; substituted with z (ú))rG   r&   r)   r*   rE   ro   Ú_route_specific_modelrN   ÚappendÚ_get_candidatesr   r   r   Ú_route_cost_optimizedr   Ú_route_performancer    Ú_route_reliabilityr!   Ú_route_local_firstr"   Ú_route_by_capabilityr#   Ú_route_round_robinr€   r7   r=   )rO   r7   r8   r�   r)   r*   r9   r‚   Úrequested_modelÚrouteÚ
candidatess              r   r�   zModelRouter.route©   s  € ð Ò;˜tŸ{™{×;Ñ;ˆØ'3Ð'?‘|ÀTÇ[Á[×E]ÑE]ˆØ%0Ð%<‘kÀ$Ç+Á+×BYÑBYˆàˆÙØ"×1Ñ1×5Ñ5°hÓ?ˆOØ×.Ñ.Ø˜( L°(¸IóˆEñ Ø×#Ñ#×*Ñ*¨5Ô1Ø�à×)Ñ)¨(°LÀ)ÓLˆ
áÜ"Ð#TÓUÐUà”}×3Ñ3Ò3Ø×.Ñ.¨z¸<ÈÓU‰EØœ×2Ñ2Ò2Ø×+Ñ+¨JÓ7‰EØœ×2Ñ2Ò2Ø×+Ñ+¨JÓ7‰EØœ×2Ñ2Ò2Ø×+Ñ+¨JÓ7‰EØœ×1Ñ1Ò1Ø×-Ñ-¨j¸,ÓG‰EØœ×2Ñ2Ò2Ø×+Ñ+¨JÓ7‰Eà×.Ñ.¨z¸<ÈÓUˆEð Ð&©9¸T×=SÑ=SÐTcÔ=dØ�~‰~ ×!9Ñ!9Ò9à% o×&>Ñ&>Ð%Að B?Ø?D¿~¹~Ð>PÐPRÐSX×S_ÑS_ÐR`Ð`aðcð ”ð
 	×Ñ×"Ñ" 5Ô)Øˆr   )r7   r�   Ú	max_depthr‚   c               ó$  — |xs | j                   j                  }g }	 | j                  |||¬«      }|j                  |«       | j	                  |j
                  «       |S # t        $ r Y nw xY w| j                  ||«      }|d | D ]z  }	 | j                  |j                  ||¬«      }	|j                  |	«       | j	                  |	j
                  «       |c S # t        $ r | j                  |j
                  «       Y Œxw xY w |st        d«      ‚|S )N)r7   r�   r‚   z4All fallback routes exhausted for the given criteria)
rG   r-   r�   r†   r}   r8   r   Ú_get_fallback_candidatesr7   r{   )
rO   r7   r�   r‘   r‚   ÚroutesÚprimaryÚfallback_modelsrU   r�   s
             r   Úroute_with_fallbackzModelRouter.route_with_fallbackâ   s+  € ð Ò? §¡×!?Ñ!?ˆ	Ø$&ˆð
	Ø—j‘jØ!Ø)Ø#ð !ó ˆGð
 �M‰M˜'Ô"Ø× Ñ  ×!1Ñ!1Ô2ØˆMøÜò 	Ùð	úð ×7Ñ7¸ÀiÓPˆØ$ Z iÐ0ò 	ˆEðØŸ
™
Ø"Ÿ^™^Ø!-Ø'ð #ó �ð
 —‘˜eÔ$Ø×$Ñ$ U§^¡^Ô4Ø’øÜ#ò Ø×$Ñ$ U§^¡^Ô4Ùðúð	ñ Ü"ØFóð ð ˆs%   žAA  Á 	A,Á+A,Â
ACÃ$C?Ã>C?c                óÈ  — | j                   j                  |«      }|€y |j                  t        j                  k7  ry |r(| j                  |«      st        j                  d|«       y |xs |j                  }| j                  j                  |«      }|€y |j                  t        j                  k(  ry | j                  |«      sy t        |||| j                  |«      d¬«      S )Nz=refusing specific model %r: not free-eligible under free_onlyzspecific model requested©r7   r8   r9   r:   r=   )rE   ro   rh   r
   ri   r€   rp   rz   r8   rF   r   ÚBLOCKEDru   r5   rV   )	rO   r7   r8   r�   r9   r‚   rU   rs   Úprovider_recs	            r   r…   z!ModelRouter._route_specific_model  sÚ   € ð ×#Ñ#×'Ñ'¨Ó1ˆØˆ=ØØ�<‰<œ;×-Ñ-Ò-ØÙ˜T×3Ñ3°EÔ:Ü�N‰NØOØôð à Ò2 E§N¡NˆØ×-Ñ-×1Ñ1°-Ó@ˆØÐØØ×Ñ¤.×"8Ñ"8Ò8ØØ×*Ñ*¨=Ô9ØäØØ"ØØ×#Ñ# EÓ*Ø-ô
ð 	
r   c                óÚ  — |r| j                   j                  |«      }n| j                   j                  «       }|r!|D �cg c]  }| j                  |«      sŒ|‘Œ }}|rYg }|D ]P  }d}|j	                  «       D ]%  \  }}	|	sŒ	t        |j                  |d«      }
|
rŒ#d} n |sŒ@|j                  |«       ŒR |}|D �cg c]  }| j                  |j                  «      r|‘Œ! }}|S c c}w c c}w )NTF)
rE   Úlist_by_providerÚlist_activer€   ÚitemsÚgetattrr�   r†   ru   r8   )rO   r8   r�   r‚   r�   ÚmÚfilteredÚmatchÚcapÚrequiredÚactuals              r   r‡   zModelRouter._get_candidates8  s  € ñ Ø×,Ñ,×=Ñ=¸hÓG‰Jà×,Ñ,×8Ñ8Ó:ˆJáØ%/ÖM °4×3IÑ3IÈ!Õ3Lš!ÐMˆJÐMáØˆHØò 	'�Ø�Ø%1×%7Ñ%7Ó%9ò "‘M�C˜ÚÜ!(¨¯©¸¸eÓ!D˜Ú%Ø$)˜EÙ!ð"ò Ø—O‘O AÕ&ð	'ð "ˆJð "ö
ØØ×*Ñ*¨1¯:©:Ô6ò ð
ˆ
ð 
ð
 Ðùò+ Nùò 
s   ¿C#ÁC#Â;$C(c                ón  ‡ — ‰ j                   j                  «       }|r!|D �cg c]  }‰ j                  |«      sŒ|‘Œ }}|rYg }|D ]P  }d}|j                  «       D ]%  \  }}|sŒ	t	        |j
                  |d«      }	|	rŒ#d} n |sŒ@|j                  |«       ŒR |}|j                  ˆ fd„d¬«       |S c c}w )NTFc                ó&   •— ‰j                  | «      S rD   )rV   )r¡   rO   s    €r   ú<lambda>z6ModelRouter._get_fallback_candidates.<locals>.<lambda>s  s   ø€  d×&7Ñ&7¸Ó&:€ r   ©ÚkeyÚreverse)rE   rž   r€   rŸ   r    r�   r†   Úsort)
rO   r�   r‚   r�   r¡   r¢   r£   r¤   r¥   r¦   s
   `         r   r“   z$ModelRouter._get_fallback_candidates[  sÉ   ø€ ð
 ×(Ñ(×4Ñ4Ó6ˆ
áØ%/ÖM °4×3IÑ3IÈ!Õ3Lš!ÐMˆJÐMáØˆHØò 	'�Ø�Ø%1×%7Ñ%7Ó%9ò "‘M�C˜ÚÜ!(¨¯©¸¸eÓ!D˜Ú%Ø$)˜EÙ!ð"ò Ø—O‘O AÕ&ð	'ð "ˆJà�‰Ó:ÀDˆÔIØÐùò# Ns
   ¢B2¹B2c           	     óX  — g }|D ]L  }| j                  |«      }|r|j                  r|dz  }|r|j                  r|dz  }|j                  ||f«       ŒN |j	                  d„ d¬«       |d   \  }}t        |j                  |j                  t        j                  t        |d«      d¬	«      S )
Ng333333Ã?gš™™™™™¹?c                ó   — | d   S ©Nrx   r   ©Úxs    r   r©   z3ModelRouter._route_cost_optimized.<locals>.<lambda>…  ó
   €  ! A¡$€ r   Trª   r   ç      ð?zcost optimizedr™   )rV   Úlocal_availableÚis_freer†   r­   r5   r7   r8   r   r   rj   )	rO   r�   r)   r*   Úscoredr¡   r:   Ú
best_modelÚ
best_scores	            r   rˆ   z!ModelRouter._route_cost_optimizedv  s³   € ð ˆØò 	&ˆAØ×%Ñ% aÓ(ˆEÙ × 1Ò 1Ø˜‘�Ù˜qŸyšyØ˜‘�Ø�M‰M˜1˜e˜*Õ%ð	&ð 	�‰™°ˆÔ5Ø!'¨¡Ñˆ
�JäØ×(Ñ(Ø×(Ñ(Ü"×1Ñ1Ü�j #Ó&Ø#ô
ð 	
r   c                óè   — |D �cg c]  }|| j                  |«      f‘Œ }}|j                  d„ d¬«       |d   \  }}t        |j                  |j                  t
        j                  |d¬«      S c c}w )Nc                ó   — | d   S r°   r   r±   s    r   r©   z0ModelRouter._route_performance.<locals>.<lambda>’  r³   r   Trª   r   zperformance optimizedr™   )rV   r­   r5   r7   r8   r   r   )rO   r�   r¡   r·   r¸   r¹   s         r   r‰   zModelRouter._route_performance�  sw   € Ø5?Ö@°�1�d×'Ñ'¨Ó*Ò+Ð@ˆÐ@Ø�‰™°ˆÔ5Ø!'¨¡Ñˆ
�JäØ×(Ñ(Ø×(Ñ(Ü"×.Ñ.ØØ*ô
ð 	
ùò	 As   …A/c           	     óF  — g }|D ]C  }| j                  |«      }|j                  j                  dv r|dz  }|j                  ||f«       ŒE |j	                  d„ d¬«       |d   \  }}t        |j                  |j                  t        j                  t        |d«      d¬	«      S )
Nr^   gš™™™™™É?c                ó   — | d   S r°   r   r±   s    r   r©   z0ModelRouter._route_reliability.<locals>.<lambda>¤  r³   r   Trª   r   r´   zreliability optimizedr™   )rV   rf   re   r†   r­   r5   r7   r8   r   r    rj   )rO   r�   r·   r¡   r:   r¸   r¹   s          r   rŠ   zModelRouter._route_reliability�  s¥   € ØˆØò 	&ˆAØ×%Ñ% aÓ(ˆEØ�w‰w�}‰}Ð 8Ñ8Ø˜‘�Ø�M‰M˜1˜e˜*Õ%ð		&ð
 	�‰™°ˆÔ5Ø!'¨¡Ñˆ
�JäØ×(Ñ(Ø×(Ñ(Ü"×.Ñ.Ü�j #Ó&Ø*ô
ð 	
r   c           	     ó^  — |D �cg c]  }|j                   sŒ|‘Œ }}|r|n|}|D �cg c]  }|| j                  |«      f‘Œ }}|j                  d„ d¬«       |d   \  }}t        |j                  |j
                  t        j                  |t        |«       |sd¬«      S d¬«      S c c}w c c}w )Nc                ó   — | d   S r°   r   r±   s    r   r©   z0ModelRouter._route_local_first.<locals>.<lambda>´  r³   r   Trª   r   zlocal firstzlocal model available)r7   r8   r9   r:   r;   r=   )	rµ   rV   r­   r5   r7   r8   r   r!   r(   )rO   r�   r¡   ÚlocalÚpoolr·   r¸   r¹   s           r   r‹   zModelRouter._route_local_first¯  sº   € Ø&Ö<�q¨!×*;Ó*;’Ð<ˆÐ<Ù‰u :ˆà59Ö:°�1�d×'Ñ'¨Ó*Ò+Ð:ˆÐ:Ø�‰™°ˆÔ5Ø!'¨¡Ñˆ
�JäØ×(Ñ(Ø×(Ñ(Ü"×.Ñ.ØÜ˜e›�_Ù(-�=ô
ð 	
ð 4Kô
ð 	
ùò =ùò ;s   …B%—B%§B*c                óÎ  — |s| j                  |«      S g }|D ]~  }| j                  |«      }d}d}|j                  «       D ],  \  }}	|dz  }t        |j                  |d«      }
|	sŒ%|
sŒ(|dz  }Œ. |dkD  r||z  }|dz  |dz  z   }|j                  ||f«       Œ€ |j                  d„ d¬«       |d   \  }}t        |j                  |j                  t        j                  |d¬	«      S )
Nr   rx   Fg      à?c                ó   — | d   S r°   r   r±   s    r   r©   z2ModelRouter._route_by_capability.<locals>.<lambda>×  r³   r   Trª   zcapability optimizedr™   )r‰   rV   rŸ   r    r�   r†   r­   r5   r7   r8   r   r"   )rO   r�   r�   r·   r¡   r:   Úmatch_countÚtotal_countr¤   r¥   r¦   Úmatch_ratior¸   r¹   s                 r   rŒ   z ModelRouter._route_by_capabilityÀ  s  € ñ
 Ø×*Ñ*¨:Ó6Ð6àˆØò 	&ˆAØ×%Ñ% aÓ(ˆEØˆKØˆKØ!-×!3Ñ!3Ó!5ò %‘��XØ˜qÑ �Ü  §¡°°eÓ<�Ú¢Ø 1Ñ$‘Kð	%ð
 ˜QŠØ)¨KÑ7�Ø ™ k°CÑ&7Ñ7�Ø�M‰M˜1˜e˜*Õ%ð	&ð 	�‰™°ˆÔ5Ø!'¨¡Ñˆ
�JäØ×(Ñ(Ø×(Ñ(Ü"×-Ñ-ØØ)ô
ð 	
r   c                ó|  — |st        d«      ‚|d   j                  }| j                  5  | j                  j	                  |d«      }||t        |«      z     }|dz   | j                  |<   d d d «       t        j                  |j                  t        j                  | j                  |«      d¬«      S # 1 sw Y   ŒJxY w)Nz%No candidates for round-robin routingr   rx   zround-robinr™   )r   r8   rM   rJ   ro   Úlenr5   r7   r   r#   rV   )rO   r�   r8   ÚidxÚselecteds        r   r�   zModelRouter._route_round_robinâ  s¸   € ÙÜ"Ð#JÓKÐKà˜a‘=×)Ñ)ˆð �]‰]ñ 	2Ø×#Ñ#×'Ñ'¨°!Ó4ˆCØ! #¬¨J«Ñ"7Ñ8ˆHØ*-°©'ˆD×Ñ˜hÑ'÷	2ô
 Ø×&Ñ&Ø×&Ñ&Ü"×.Ñ.Ø×#Ñ# HÓ-Ø ô
ð 	
÷	2ð 	2ús   ©A B2Â2B;c                óP   — |r| j                   | d  S t        | j                   «      S rD   )rN   Úlist)rO   Úlimits     r   Úget_route_historyzModelRouter.get_route_historyû  s+   € ÙØ×&Ñ&¨ v wÐ/Ð/Ü�D×'Ñ'Ó(Ð(r   c                óp   — |r | j                   j                  |i «      }||iS t        | j                   «      S rD   )rI   ro   Údictrr   s      r   Úget_circuit_breaker_statusz&ModelRouter.get_circuit_breaker_status   s9   € ÙØ×'Ñ'×+Ñ+¨M¸2Ó>ˆBØ! 2Ð&Ð&Ü�D×*Ñ*Ó+Ð+r   c                óH   — || j                   v rddddœ| j                   |<   yy)Nr   rX   Frw   T)rI   )rO   rs   s     r   Úreset_circuit_breakerz!ModelRouter.reset_circuit_breaker  s3   € Ø˜D×2Ñ2Ñ2àØ #Øñ5ˆD×"Ñ" =Ñ1ð
 Ør   )NNNN)
rE   zModelRegistry | NonerF   zProviderRegistry | NonerG   zRouterConfig | NonerP   r   ÚreturnÚNone)rU   r   rÔ   r.   )rs   r6   rÔ   r(   )rs   r6   rÔ   rÕ   )rU   r   rÔ   r(   )r7   ú
str | Noner8   rÖ   r�   údict[str, bool] | Noner)   úbool | Noner*   rØ   r9   zRouteStrategy | Noner‚   r(   rÔ   r5   )
r7   rÖ   r�   r×   r‘   ú
int | Noner‚   r(   rÔ   úlist[RouteResult])F)r7   r6   r8   rÖ   r�   r×   r9   r   r‚   r(   rÔ   zRouteResult | None)r8   rÖ   r�   r×   r‚   r(   rÔ   úlist[ModelRecord])r�   r×   r‚   r(   rÔ   rÛ   )r�   rÛ   r)   r(   r*   r(   rÔ   r5   )r�   rÛ   rÔ   r5   )r�   rÛ   r�   r×   rÔ   r5   rD   )rÍ   rÙ   rÔ   rÚ   )rs   rÖ   rÔ   zdict[str, Any])r   r   r   r   rQ   rV   ÚstaticmethodrT   ru   r{   r}   r€   r�   r—   r…   r‡   r“   rˆ   r‰   rŠ   r‹   rŒ   r�   rÎ   rÑ   rÓ   r   r   r   rB   rB   C   sF  „ ñð 04Ø59Ø&*Ø"&ð4à,ð4ð 3ð4ð $ð	4ð
  ð4ð 
ó4ó"(ð ò)ó ð)ó.ó	Ióð ò
ó ð
ð  $Ø#Ø/3Ø$(Ø#'Ø)-Øñ7ð ð7ð ð	7ð
 -ð7ð "ð7ð !ð7ð 'ð7ð ð7ð 
ó7ðx  $Ø/3Ø $Øñ+ð ð+ð -ð	+ð
 ð+ð ð+ð 
ó+ðn  ð#
àð#
ð ð#
ð -ð	#
ð
  ð#
ð ð#
ð 
ó#
ðR  ð	!àð!ð -ð!ð ð	!ð
 
ó!ðL  ðà,ðð ðð 
ó	ð6
à%ð
ð ð
ð ð	
ð
 
ó
ó4
ó
ó$
ð" 
à%ð 
ð -ð 
ð 
ó	 
óD
ô2)ô
,ôr   rB   )r   Ú
__future__r   ÚloggingrK   r@   Údataclassesr   r   Úenumr   Útypingr   Ú'cyberbrain26.model_layer.model_registryr   r	   r
   Ú*cyberbrain26.model_layer.provider_registryr   r   Ú	getLoggerr   rp   Ú	Exceptionr   r6   r   r%   r5   rB   r   r   r   ú<module>ræ      s˜   ðÙ Eå "ã Û Û ß (Ý Ý ÷ñ ÷
ð
 
ˆ×	Ñ	˜8Ó	$€ô<�yô <ô �C˜ô  ð ÷
*ð 
*ó ð
*ð ÷	8ð 	8ó ð	8÷Kò Kr   