Ë
    ÛJêjr  ã                  ó:  — d Z ddlmZ ddlZddlmc mZ ddl	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mZmZmZmZmZmZmZmZm Z m!Z!  G d„ d«      Z" G d„ d«      Z# G d	„ d
«      Z$ G d„ d«      Z% G d„ d«      Z& G d„ d«      Z' G d„ d«      Z( G d„ d«      Z)y)u"   Tests for Model Layer â€” Phase 5.é    )ÚannotationsN)ÚDiscoveryCategoryÚLiteLLMClientÚLiteLLMConfigÚLlamaCppClientÚLlamaCppConfigÚModelCapabilitiesÚModelFreeStatusÚModelIntelligenceÚModelRecordÚModelRegistryÚModelRouterÚModelRouterErrorÚModelStatusÚ
ModelTrustÚ	ModelTypeÚOllamaClientÚOllamaConfigÚProviderFreeScoreÚProviderRecordÚProviderRegistryÚProviderStatusÚProviderTrustÚRouteStrategyc                  ó¼   — e Zd ZdZej
                  dd„«       Zej
                  dd„«       Zdd„Zdd„Z	dd„Z
dd„Zdd„Zdd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Zdd„Zy)ÚTestModelRegistryzTests for ModelRegistry.c                ó   — t        «       S ©N)r   ©Úselfs    ú8/home/oem/CyberBrain26-unified/tests/test_model_layer.pyÚregistryzTestModelRegistry.registry)   s
   € ä‹Ðó    c                ó†   — t        ddddt        j                  dt        dddddd¬«      ddt        j
                  d	d
¬«      S )Nú
test-modelútest-providerú1.0ztest-familyé    FT)ÚvisionÚtool_callingÚstructured_outputÚ	reasoningÚcodingÚ
multimodalÚmité   )Úmodel_idÚproviderÚversionÚfamilyÚ
model_typeÚcontext_windowÚcapabilitiesÚlocal_availableÚapi_availableÚfree_statusÚlicenseÚ
max_tokens)r   r   ÚCHATr	   r
   ÚFREEr   s    r!   Úsample_modelzTestModelRegistry.sample_model-   sV   € äØ!Ø$ØØ Ü —~‘~ØÜ*ØØ!Ø"'ØØØ ôð "ØÜ'×,Ñ,ØØô'
ð 	
r#   c                óB  — |j                  |«      }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd	||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  d«      }	d }
|	|
u}|s™t        j                  d
|fd|	|
f«      dt	        j
                  «       v st        j                  |	«      rt        j                  |	«      ndt        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}
|	j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |	«      rt        j                  |	«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nr%   ©ú==©z0%(py2)s
{%(py2)s = %(py0)s.model_id
} == %(py5)sÚ
registered©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7r&   ©z0%(py2)s
{%(py2)s = %(py0)s.provider
} == %(py5)s©úis not©z%(py0)s is not %(py3)sÚ	retrieved©rF   Úpy3úassert %(py5)srH   )Úregisterr1   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr2   Úget)r    r"   r?   rD   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8rO   Ú@py_assert2Ú@py_format4s               r!   Útest_register_and_getz'TestModelRegistry.test_register_and_getE   sÏ  € Ø×&Ñ& |Ó4ˆ
Ø×"Ñ"Ð2 lÐ2Ð" lÑ2×2×2Õ2Ð" l×2×2×2×2×2Ñ2ˆz×2×2Ó2ˆz×2×2Ô2Ð"×2×2Ò2 l×2×2×2×2×2×2Ó2Ø×"Ñ"Ð5 oÐ5Ð" oÑ5×5×5Õ5Ð" o×5×5×5×5×5Ñ5ˆz×5×5Ó5ˆz×5×5Ô5Ð"×5×5Ò5 o×5×5×5×5×5×5Ó5à—L‘L Ó.ˆ	Ø $Ð$ˆy Ð$×$×$Õ$ˆy ×$×$×$×$×$Ñ$ˆy×$×$Ó$ˆy×$×$Ô$ ×$×$×$×$×$×$Ñ$Ø×!Ñ!Ð1 \Ð1Ð! \Ñ1×1×1Õ1Ð! \×1×1×1×1×1Ñ1ˆy×1×1Ó1ˆy×1×1Ô1Ð!×1×1Ò1 \×1×1×1×1×1×1Ô1r#   c                ó  — |j                  |«       |j                  }d} ||«      }d}||u }|sÕt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}|j                  }d} ||«      }d }||u }|sÕt        j                  d|fd	||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}|j                  }d
} ||«      }d}||u }|sÕt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}y )Nr%   T©Úis©zP%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.unregister
}(%(py4)s)
} is %(py9)sr"   ©rF   rG   Úpy4Úpy6Úpy9úassert %(py11)sÚpy11©zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} is %(py9)sÚnonexistentF©rS   Ú
unregisterrT   rU   rV   rW   rX   rY   rZ   r[   r\   )
r    r"   r?   r]   r_   Ú@py_assert5Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12s
             r!   Útest_unregisterz!TestModelRegistry.test_unregisterN   sÚ  € Ø×Ñ˜,Ô'Ø×"Ñ"Ð8 <Ð8Ñ" <Ó0Ð8°DÐ8Ð0°DÐ8×8×8Õ8Ð0°D×8×8×8×8×8Ñ8ˆx×8×8Ó8ˆx×8×8Ô8Ð"×8×8Ò8 <×8×8Ò8Ð0×8×8Ò8°D×8×8×8×8×8×8×8Ø�|‰|Ð1˜LÐ1‰|˜LÓ)Ð1¨TÐ1Ð)¨TÐ1×1×1Õ1Ð)¨T×1×1×1×1×1Ñ1ˆx×1×1Ó1ˆx×1×1Ô1ˆ|×1×1Ò1˜L×1×1Ò1Ð)×1×1Ò1¨T×1×1×1×1×1×1×1Ø×"Ñ"Ð: =Ð:Ñ" =Ó1Ð:°UÐ:Ð1°UÐ:×:×:Õ:Ð1°U×:×:×:×:×:Ñ:ˆx×:×:Ó:ˆx×:×:Ô:Ð"×:×:Ò: =×:×:Ò:Ð1×:×:Ò:°U×:×:×:×:×:×:×:Ð:r#   c           	     óÂ  — t        d«      D �cg c]!  }t        d|› �dt        j                  ¬«      ‘Œ# c}t        d«      D �cg c]!  }t        d|› �dt        j                  ¬«      ‘Œ# c}z   }|D ]  }|j	                  |«       Œ |j                  d«      }t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndd	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      d
œz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}d„ |D «       }t        |«      }|s•ddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}y c c}w c c}w )Né   úmodel-ú
provider-a©r1   r2   r5   ú
provider-brA   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚprovider_a_models©rF   Úpy1rQ   rk   úassert %(py8)sÚpy8c              3  ó:   K  — | ]  }|j                   d k(  –— Œ y­w)r|   N©r2   ©Ú.0Úms     r!   ú	<genexpr>z:TestModelRegistry.test_list_by_provider.<locals>.<genexpr>i   s   è ø€ ÒI°!�1—:‘: Õ-ÑIùs   ‚ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall©rF   rG   rj   )Úranger   r   r=   rS   Úlist_by_providerr€   rT   rU   rV   rW   rX   rY   rZ   r[   r�   )r    r"   ÚiÚmodelsrŠ   r�   rb   rs   r^   Ú@py_format7Ú@py_format9r]   r_   Ú@py_format5s                 r!   Útest_list_by_providerz'TestModelRegistry.test_list_by_providerT   s¤  € ô ˜1“Xö
ð ô Ø! ! ˜Ø%Ü$Ÿ>™>öò
ô ˜1“Xö
ð ô Ø! ! ˜Ø%Ü$Ÿ>™>öò
ñ
ˆð ò 	!ˆAØ×Ñ˜aÕ ð	!ð %×5Ñ5°lÓCÐÜÐ$Ó%Ð*¨Ð*Ð%¨Ñ*×*×*Õ*Ð%¨×*×*×*×*×*Ñ*Œs×*×*Ó*Œs×*×*×*×*×*Ò*Ð$×*×*Ó*Ð$×*×*Ô*Ð%×*×*Ò*¨×*×*×*×*×*×*Ó*ÙIÐ7HÔIÐIŒsÐIÓIÐIÑI×I×I×I×IÕIŒs×I×IÓIŒs×I×IÔIÐI×I×IÒIÐI×I×I×I×I×IÓIùò)
ùò
s   Ž&IÁ&Ic           	     óÞ  — t        d«      D �cg c]!  }t        d|› �dt        j                  ¬«      ‘Œ# c}t        d«      D �cg c]!  }t        d|› �dt        j                  ¬«      ‘Œ# c}z   }|D ]  }|j                  |«       Œ |j                  t        j                  «      }t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndd	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      d
œz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}d„ |D «       }t!        |«      }|s•ddt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}y c c}w c c}w )Né   zchat-Úpr}   zembed-rA   r   r€   Úchat_modelsr‚   r„   r…   c              3  óV   K  — | ]!  }|j                   t        j                  k(  –— Œ# y ­wr   )r5   r   r=   rˆ   s     r!   r‹   z6TestModelRegistry.test_list_by_type.<locals>.<genexpr>€   s   è ø€ ÒG°a�1—<‘<¤9§>¡>Õ1ÑGùó   ‚')rŒ   r�   rŽ   )r�   r   r   r=   Ú	EMBEDDINGrS   Úlist_by_typer€   rT   rU   rV   rW   rX   rY   rZ   r[   r�   )r    r"   r‘   r’   rŠ   rš   rb   rs   r^   r“   r”   r]   r_   r•   s                 r!   Útest_list_by_typez#TestModelRegistry.test_list_by_typek   s¥  € ô ˜1“Xö
ð ô Ø   ˜ØÜ$Ÿ>™>öò
ô ˜1“Xö
ð ô Ø! ! ˜ØÜ$×.Ñ.öò
ñ
ˆð ò 	!ˆAØ×Ñ˜aÕ ð	!ð ×+Ñ+¬I¯N©NÓ;ˆÜ�;ÓÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$Œs×$×$Ó$Œs×$×$×$×$×$Ò$�;×$×$Ó$�;×$×$Ô$Ð×$×$Ò$ 1×$×$×$×$×$×$Ó$ÙG¸;ÔGÐGŒsÐGÓGÐGÑG×G×G×G×GÕGŒs×G×GÓGŒs×G×GÔGÐG×G×GÒGÐG×G×G×G×G×GÓGùò)
ùò
ó   Ž&I%Á&I*c           	     óÞ  — t        d«      D �cg c]!  }t        d|› �dt        j                  ¬«      ‘Œ# c}t        d«      D �cg c]!  }t        d|› �dt        j                  ¬«      ‘Œ# c}z   }|D ]  }|j                  |«       Œ |j                  t        j                  «      }t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }	d
d|	iz  }
t        t        j                  |
«      «      ‚d x}x}}d„ |D «       }t!        |«      }|s•ddt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}y c c}w c c}w )Nr˜   r{   r™   ©r1   r2   ÚstatusrA   r   r€   Úactiver‚   r„   r…   c              3  óV   K  — | ]!  }|j                   t        j                  k(  –— Œ# y ­wr   )r£   r   ÚACTIVErˆ   s     r!   r‹   z8TestModelRegistry.test_list_by_status.<locals>.<genexpr>—   s   è ø€ ÒB°a�1—8‘8œ{×1Ñ1Õ1ÑBùrœ   rŒ   r�   rŽ   )r�   r   r   r¦   ÚHIDDENrS   Úlist_by_statusr€   rT   rU   rV   rW   rX   rY   rZ   r[   r�   )r    r"   r‘   r’   rŠ   r¤   rb   rs   r^   r“   r”   r]   r_   r•   s                 r!   Útest_list_by_statusz%TestModelRegistry.test_list_by_status‚   s¥  € ô ˜1“Xö
ð ô Ø! ! ˜ØÜ"×)Ñ)öò
ô ˜1“Xö
ð ô Ø! ! ˜ØÜ"×)Ñ)öò
ñ
ˆð ò 	!ˆAØ×Ñ˜aÕ ð	!ð ×(Ñ(¬×);Ñ);Ó<ˆÜ�6‹{Ð˜aÐˆ{˜aÑ××Õˆ{˜a×××××ÑŒs××ÓŒs×××××Ò�6××Ó�6××Ôˆ{××Ò˜a××××××ÓÙB¸6ÔBÐBŒsÐBÓBÐBÑB×B×B×B×BÕBŒs×B×BÓBŒs×B×BÔBÐB×B×BÒBÐB×B×B×B×B×BÓBùò)
ùò
r    c                ó<  — t        d«      D ]0  }|j                  t        d|› �dt        j                  ¬«      «       Œ2 t        d«      D ]0  }|j                  t        d|› �dt        j
                  ¬«      «       Œ2 |j                  «       }t        |«      }d}||k(  }|söt        j                  d|fd||f«      d	t        j                  «       v st        j                  t        «      rt        j                  t        «      nd	d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nrz   zactive-r™   r¢   r˜   zhidden-rA   r   r€   r¤   r‚   r„   r…   )r�   rS   r   r   r¦   r§   Úlist_activer€   rT   rU   rV   rW   rX   rY   rZ   r[   )	r    r"   r‘   r¤   rb   rs   r^   r“   r”   s	            r!   Útest_list_activez"TestModelRegistry.test_list_active™   s  € Ü�q“ò 	ˆAØ×ÑÜØ& q c˜]Ø Ü&×-Ñ-ôõð	ô �q“ò 	ˆAØ×ÑÜØ& q c˜]Ø Ü&×-Ñ-ôõð	ð ×%Ñ%Ó'ˆÜ�6‹{Ð˜aÐˆ{˜aÑ××Õˆ{˜a×××××ÑŒs××ÓŒs×××××Ò�6××Ó�6××Ôˆ{××Ò˜a××××××Ôr#   c           	     óˆ  — t        d«      D �cg c]  }t        d|› �dd¬«      ‘Œ c}t        d«      D �cg c]  }t        d|› �dd¬«      ‘Œ c}z   }|D ]  }|j                  |«       Œ |j                  «       }t	        |«      }d}||k(  }|söt        j                  d|fd	||f«      d
t        j                  «       v st        j                  t        «      rt        j                  t        «      nd
dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}d„ |D «       }t        |«      }|s•ddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}y c c}w c c}w )Nr˜   úlocal-r™   T)r1   r2   r8   zcloud-FrA   r   r€   Úlocalr‚   r„   r…   c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr   )r8   rˆ   s     r!   r‹   z4TestModelRegistry.test_list_local.<locals>.<genexpr>Â   s   è ø€ Ò4¨�1×$Õ$Ñ4ùó   ‚rŒ   r�   rŽ   )r�   r   rS   Ú
list_localr€   rT   rU   rV   rW   rX   rY   rZ   r[   r�   )r    r"   r‘   r’   rŠ   r¯   rb   rs   r^   r“   r”   r]   r_   r•   s                 r!   Útest_list_localz!TestModelRegistry.test_list_local­   s�  € ô ˜1“Xö
ð ô Ø! ! ˜ØØ $öò
ô ˜1“Xö
ð ô Ø! ! ˜ØØ %öò
ñ
ˆð ò 	!ˆAØ×Ñ˜aÕ ð	!ð ×#Ñ#Ó%ˆÜ�5‹zÐ˜QÐˆz˜Q‰××Õˆz˜Q×××××ÑŒs××ÓŒs×××××Ò�5××Ó�5××Ôˆz××Ò˜Q××××××ÓÙ4¨eÔ4Ð4ŒsÐ4Ó4Ð4Ñ4×4×4×4×4Õ4Œs×4×4Ó4Œs×4×4Ô4Ð4×4×4Ò4Ð4×4×4×4×4×4Ó4ùò)
ùò
s
   ŽH:µH?c           	     óÀ  — t        d«      D �cg c]!  }t        d|› �dt        j                  ¬«      ‘Œ# c}t        d«      D �cg c]!  }t        d|› �dt        j                  ¬«      ‘Œ# c}z   }|D ]  }|j                  |«       Œ |j                  «       }t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndd	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      d
œz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}d„ |D «       }t!        |«      }|s•ddt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}y c c}w c c}w )Nr˜   zfree-r™   ©r1   r2   r:   zpaid-rA   r   r€   Úfreer‚   r„   r…   c              3  ó4   K  — | ]  }|j                   –— Œ y ­wr   )Úis_freerˆ   s     r!   r‹   z3TestModelRegistry.test_list_free.<locals>.<genexpr>Ù   s   è ø€ Ò+ �1—9•9Ñ+ùr±   rŒ   r�   rŽ   )r�   r   r
   r>   ÚPAIDrS   Ú	list_freer€   rT   rU   rV   rW   rX   rY   rZ   r[   r�   )r    r"   r‘   r’   rŠ   r¶   rb   rs   r^   r“   r”   r]   r_   r•   s                 r!   Útest_list_freez TestModelRegistry.test_list_freeÄ   sœ  € ô ˜1“Xö
ð ô Ø   ˜ØÜ+×0Ñ0öò
ô ˜1“Xö
ð ô Ø   ˜ØÜ+×0Ñ0öò
ñ
ˆð ò 	!ˆAØ×Ñ˜aÕ ð	!ð ×!Ñ!Ó#ˆÜ�4‹yÐ˜AÐˆy˜A‰~××Õˆy˜A×××××ÑŒs××ÓŒs×××××Ò�4××Ó�4××Ôˆy××Ò˜A××××××ÓÙ+ dÔ+Ð+ŒsÐ+Ó+Ð+Ñ+×+×+×+×+Õ+Œs×+×+Ó+Œs×+×+Ô+Ð+×+×+Ò+Ð+×+×+×+×+×+Ó+ùò)
ùò
s   Ž&IÁ&Ic           	     ó¸  — t        ddt        j                  t        j                  dt
        j                  ¬«      t        ddt        j                  t        j                  dt
        j                  ¬«      g}|D ]  }|j                  |«       Œ |j                  d¬«      }t        |«      }d	}||k(  }|söt        j                  d
|fd||f«      dt        j                  «       v st        j                   t        «      rt        j"                  t        «      nddt        j                  «       v st        j                   |«      rt        j"                  |«      ndt        j"                  |«      t        j"                  |«      dœz  }dd|iz  }	t%        t        j&                  |	«      «      ‚d x}x}}|d   }
|
j(                  }d}||k(  }|s€t        j                  d
|fd||f«      t        j"                  |
«      t        j"                  |«      t        j"                  |«      dœz  }dd|iz  }	t%        t        j&                  |	«      «      ‚d x}
x}x}}|j                  d¬«      }t        |«      }d	}||k(  }|söt        j                  d
|fd||f«      dt        j                  «       v st        j                   t        «      rt        j"                  t        «      nddt        j                  «       v st        j                   |«      rt        j"                  |«      ndt        j"                  |«      t        j"                  |«      dœz  }dd|iz  }	t%        t        j&                  |	«      «      ‚d x}x}}|d   }
|
j(                  }d}||k(  }|s€t        j                  d
|fd||f«      t        j"                  |
«      t        j"                  |«      t        j"                  |«      dœz  }dd|iz  }	t%        t        j&                  |	«      «      ‚d x}
x}x}}|j                  d¬«      }t        |«      }d	}||k(  }|söt        j                  d
|fd||f«      dt        j                  «       v st        j                   t        «      rt        j"                  t        «      nddt        j                  «       v st        j                   |«      rt        j"                  |«      ndt        j"                  |«      t        j"                  |«      dœz  }dd|iz  }	t%        t        j&                  |	«      «      ‚d x}x}}|d   }
|
j(                  }d}||k(  }|s€t        j                  d
|fd||f«      t        j"                  |
«      t        j"                  |«      t        j"                  |«      dœz  }dd|iz  }	t%        t        j&                  |	«      «      ‚d x}
x}x}}y )Númodel-ar|   T)r1   r2   r5   r£   r8   r:   úmodel-br~   Fr‡   é   rA   r   r€   Úresultsr‚   r„   r…   r   )z0%(py3)s
{%(py3)s = %(py1)s.model_id
} == %(py6)s©rƒ   rQ   rk   ©Ú
local_only©Ú	free_only)r   r   r=   r   r¦   r
   r>   ÚCODEr¹   rS   Úsearchr€   rT   rU   rV   rW   rX   rY   rZ   r[   r1   )r    r"   r’   rŠ   rÀ   rb   rs   r^   r“   r”   Ú@py_assert0s              r!   Útest_searchzTestModelRegistry.test_searchÛ   s‰  € äØ"Ø%Ü$Ÿ>™>Ü"×)Ñ)Ø $Ü+×0Ñ0ôô Ø"Ø%Ü$Ÿ>™>Ü"×)Ñ)Ø %Ü+×0Ñ0ôð
ˆð$ ò 	!ˆAØ×Ñ˜aÕ ð	!ð —/‘/¨<�/Ó8ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ó Ø�q‰zÐ/ˆz×"Ñ"Ð/ iÐ/Ð" iÑ/×/×/Õ/Ð" i×/×/Ó/ˆz×/×/Ò/Ð"×/×/Ò/ i×/×/×/×/×/×/Õ/à—/‘/¨T�/Ó2ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ó Ø�q‰zÐ/ˆz×"Ñ"Ð/ iÐ/Ð" iÑ/×/×/Õ/Ð" i×/×/Ó/ˆz×/×/Ò/Ð"×/×/Ò/ i×/×/×/×/×/×/Õ/à—/‘/¨D�/Ó1ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ó Ø�q‰zÐ/ˆz×"Ñ"Ð/ iÐ/Ð" iÑ/×/×/Õ/Ð" i×/×/Ó/ˆz×/×/Ò/Ð"×/×/Ò/ i×/×/×/×/×/×/Ö/r#   c                óð  — |j                  |«       |j                  dt        j                  ¬«      }d }||u}|s™t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}}|j                  }t        j                  }||k(  }	|	söt	        j
                  d	|	fd
||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}	}y )Nr%   ©r£   rL   rN   ÚupdatedrP   rR   rH   rA   )zJ%(py2)s
{%(py2)s = %(py0)s.status
} == %(py6)s
{%(py6)s = %(py4)s.ACTIVE
}r   ©rF   rG   rj   rk   r„   r…   )rS   Úupdater   r¦   rT   rU   rV   rW   rX   rY   rZ   r[   r£   )r    r"   r?   rÌ   rb   r]   rc   r`   rs   r_   r“   r”   s               r!   Útest_updatezTestModelRegistry.test_updateý   s  € Ø×Ñ˜,Ô'Ø—/‘/ ,´{×7IÑ7I�/ÓJˆØ"Ð"ˆw˜dÐ"×"×"Õ"ˆw˜d×"×"×"×"×"Ñ"ˆw×"×"Ó"ˆw×"×"Ô"˜d×"×"×"×"×"×"Ñ"Ø�~‰~Ð3¤×!3Ñ!3Ð3ˆ~Ð!3Ñ3×3×3Õ3ˆ~Ð!3×3×3×3×3×3Ñ3ˆw×3×3Ó3ˆw×3×3Ô3ˆ~×3×3×3×3×3Ð3¤×3×3Ó3¤×3×3Ô3Ð!3×3×3×3×3×3×3Ô3r#   c                ó  — |j                   } |«       }d}||k(  }|sÁt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}}|j                  t        dd	¬
«      «       |j                  t        dd	¬
«      «       |j                   } |«       }d}||k(  }|sÁt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}}y )Nr   rA   )zD%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.count
}()
} == %(py7)sr"   ©rF   rG   rj   rJ   úassert %(py9)srl   Úm1r™   ©r1   r2   Úm2r˜   )ÚcountrT   rU   rV   rW   rX   rY   rZ   r[   rS   r   )r    r"   r]   r_   Ú@py_assert6rs   ra   rv   s           r!   Ú
test_countzTestModelRegistry.test_count  s2  € Ø�~‰~Ð$‰~ÓÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$ˆx×$×$Ó$ˆx×$×$Ô$ˆ~×$×$Ò$Ð×$×$Ò$ 1×$×$×$×$×$×$Õ$Ø×Ñœ+¨t¸cÔBÔCØ×Ñœ+¨t¸cÔBÔCØ�~‰~Ð$‰~ÓÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$ˆx×$×$Ó$ˆx×$×$Ô$ˆ~×$×$Ò$Ð×$×$Ò$ 1×$×$×$×$×$×$Ö$r#   c                ó0  — |j                  t        dd¬«      «       |j                  }d} ||«      }d}||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}|j                  }d} ||«      }d}||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )NrÓ   r™   rÔ   Trf   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.has
}(%(py4)s)
} is %(py9)sr"   ri   rm   rn   rÕ   F)rS   r   ÚhasrT   rU   rV   rW   rX   rY   rZ   r[   )	r    r"   r]   r_   rs   rt   ru   rv   rw   s	            r!   Útest_haszTestModelRegistry.test_has	  sD  € Ø×Ñœ+¨t¸cÔBÔCØ�|‰|Ð)˜DÐ)‰|˜DÓ!Ð) TÐ)Ð! TÐ)×)×)Õ)Ð! T×)×)×)×)×)Ñ)ˆx×)×)Ó)ˆx×)×)Ô)ˆ|×)×)Ò)˜D×)×)Ò)Ð!×)×)Ò) T×)×)×)×)×)×)×)Ø�|‰|Ð*˜DÐ*‰|˜DÓ!Ð* UÐ*Ð! UÐ*×*×*Õ*Ð! U×*×*×*×*×*Ñ*ˆx×*×*Ó*ˆx×*×*Ô*ˆ|×*×*Ò*˜D×*×*Ò*Ð!×*×*Ò* U×*×*×*×*×*×*×*Ð*r#   N)Úreturnr   ©rÜ   r   )r"   r   r?   r   rÜ   ÚNone)r"   r   rÜ   rÞ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpytestÚfixturer"   r?   rd   rx   r–   rŸ   r©   r¬   r³   r»   rÉ   rÏ   rØ   rÛ   © r#   r!   r   r   &   ss   „ Ù"à‡^�^òó ðð ‡^�^ò
ó ð
ó.2ó;óJó.Hó.Có. ó(5ó.,ó. 0óD4ó%ô+r#   r   c                  óŒ   — e Zd ZdZej
                  dd„«       Zej
                  dd„«       Zdd„Zdd„Z	dd„Z
dd„Zdd„Zdd	„Zy
)ÚTestProviderRegistryzTests for ProviderRegistry.c                ó   — t        «       S r   )r   r   s    r!   r"   zTestProviderRegistry.registry  s   € äÓ!Ð!r#   c                óf   — t        dt        j                  ddddgt        j                  ddd¬«	      S )Nr&   Tr½   r¾   )	r2   r£   Ú	free_tierr9   Úavailable_modelsÚtrustr¶   Úno_cardÚofficial_source)r   r   r¦   r   ÚOFFICIALr   s    r!   Úsample_providerz$TestProviderRegistry.sample_provider  s;   € äØ$Ü!×(Ñ(ØØØ'¨Ð3Ü×(Ñ(ØØØ ô

ð 
	
r#   c                ó²  — |j                  |«      }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  d«      }	d }
|	|
u}|s™t        j                  d|fd	|	|
f«      d
t	        j
                  «       v st        j                  |	«      rt        j                  |	«      nd
t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}
|	j                  }d}||k(  }|s­t        j                  d|fd||f«      d
t	        j
                  «       v st        j                  |	«      rt        j                  |	«      nd
t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nr&   rA   rK   rD   rE   rI   rJ   rL   rN   rO   rP   rR   rH   )rS   r2   rT   rU   rV   rW   rX   rY   rZ   r[   r\   )r    r"   rð   rD   r]   r^   r_   r`   ra   rO   rb   rc   s               r!   rd   z*TestProviderRegistry.test_register_and_get)  s]  € Ø×&Ñ& Ó7ˆ
Ø×"Ñ"Ð5 oÐ5Ð" oÑ5×5×5Õ5Ð" o×5×5×5×5×5Ñ5ˆz×5×5Ó5ˆz×5×5Ô5Ð"×5×5Ò5 o×5×5×5×5×5×5Ó5à—L‘L Ó1ˆ	Ø $Ð$ˆy Ð$×$×$Õ$ˆy ×$×$×$×$×$Ñ$ˆy×$×$Ó$ˆy×$×$Ô$ ×$×$×$×$×$×$Ñ$Ø×!Ñ!Ð4 _Ð4Ð! _Ñ4×4×4Õ4Ð! _×4×4×4×4×4Ñ4ˆy×4×4Ó4ˆy×4×4Ô4Ð!×4×4Ò4 _×4×4×4×4×4×4Ô4r#   c                ó  — |j                  |«       |j                  }d} ||«      }d}||u }|sÕt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}|j                  }d} ||«      }d }||u }|sÕt        j                  d|fd	||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}y )
Nr&   Trf   rh   r"   ri   rm   rn   ro   rq   )
r    r"   rð   r]   r_   rs   rt   ru   rv   rw   s
             r!   rx   z$TestProviderRegistry.test_unregister1  sA  € Ø×Ñ˜/Ô*Ø×"Ñ"Ð; ?Ð;Ñ" ?Ó3Ð;°tÐ;Ð3°tÐ;×;×;Õ;Ð3°t×;×;×;×;×;Ñ;ˆx×;×;Ó;ˆx×;×;Ô;Ð"×;×;Ò; ?×;×;Ò;Ð3×;×;Ò;°t×;×;×;×;×;×;×;Ø�|‰|Ð4˜OÐ4‰|˜OÓ,Ð4°Ð4Ð,°Ð4×4×4Õ4Ð,°×4×4×4×4×4Ñ4ˆx×4×4Ó4ˆx×4×4Ô4ˆ|×4×4Ò4˜O×4×4Ò4Ð,×4×4Ò4°×4×4×4×4×4×4×4Ð4r#   c                ó:  — t        d«      D �cg c]   }t        d|› �t        j                  ¬«      ‘Œ" }}|D ]  }|j	                  |«       Œ |j	                  t        dt        j
                  ¬«      «       |j                  «       }t        |«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }	d
d|	iz  }
t        t        j                  |
«      «      ‚d x}x}}y c c}w )Nrz   r™   )r2   r£   ÚinactiverA   r   r€   r¤   r‚   r„   r…   )r�   r   r   r¦   rS   ÚINACTIVEr«   r€   rT   rU   rV   rW   rX   rY   rZ   r[   )r    r"   r‘   Ú	providersr™   r¤   rb   rs   r^   r“   r”   s              r!   r¬   z%TestProviderRegistry.test_list_active6  s  € ô ˜1“Xö
àô  a¨ s G´N×4IÑ4IÖJð
ˆ	ð 
ð ò 	!ˆAØ×Ñ˜aÕ ð	!à×Ñœ.°*Ä^×E\ÑE\Ô]Ô^à×%Ñ%Ó'ˆÜ�6‹{Ð˜aÐˆ{˜aÑ××Õˆ{˜a×××××ÑŒs××ÓŒs×××××Ò�6××Ó�6××Ôˆ{××Ò˜a××××××Ôùò
s   Ž%Fc                ó  — t        d«      D �cg c]  }t        d|› �d¬«      ‘Œ }}|D ]  }|j                  |«       Œ |j                  t        dd¬«      «       |j                  «       }t	        |«      }d}||k(  }|söt        j                  d|fd||f«      d	t        j                  «       v st        j                  t        «      rt        j                  t        «      nd	d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
t        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}y c c}w )Nr˜   r®   T)r2   Úlocal_availabilityÚcloudFrA   r   r€   r¯   r‚   r„   r…   )r�   r   rS   r²   r€   rT   rU   rV   rW   rX   rY   rZ   r[   )r    r"   r‘   rö   r™   r¯   rb   rs   r^   r“   r”   s              r!   r³   z$TestProviderRegistry.test_list_localB  s  € ô ˜1“Xö
àô  f¨Q¨C LÀTÖJð
ˆ	ð 
ð ò 	!ˆAØ×Ñ˜aÕ ð	!à×Ñœ.°'ÈeÔTÔUà×#Ñ#Ó%ˆÜ�5‹zÐ˜QÐˆz˜Q‰××Õˆz˜Q×××××ÑŒs××ÓŒs×××××Ò�5××Ó�5××Ôˆz××Ò˜Q××××××Ôùò
s   ŽE<c                ó  — t        ddddd¬«      }|j                  |«       |j                  «       }|d   }t        j                  }||k(  }|sµt        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}y )NÚgoodTg      ð?)r2   r¶   rí   rî   Ú	stabilityrA   )z1%(py1)s == %(py5)s
{%(py5)s = %(py3)s.EXCELLENT
}r   )rƒ   rQ   rH   rI   rJ   )r   rS   Úcompute_free_scoresr   Ú	EXCELLENTrT   rU   rY   rV   rW   rX   rZ   r[   )	r    r"   r2   ÚscoresrÈ   r^   rb   r`   ra   s	            r!   Útest_compute_free_scoresz-TestProviderRegistry.test_compute_free_scoresN  s²   € Ü!ØØØØ Øô
ˆð 	×Ñ˜(Ô#à×-Ñ-Ó/ˆØ�f‰~Ð<Ô!2×!<Ñ!<Ð<ˆ~Ð!<Ñ<×<×<Õ<ˆ~Ð!<×<×<Ó<ˆ~×<×<×<×<×<Ð<Ô!2×<×<Ó<Ô!2×<×<Ô<Ð!<×<×<×<×<×<×<Ô<r#   c           
     óª  — t        d«      D �cg c].  }t        d|› �t        j                  |dz  dk(  |dz  dk(  ¬«      ‘Œ0 }}|D ]  }|j	                  |«       Œ |j                  d¬«      }t        |«      }d}||k(  }|söt        j                  d|fd	||f«      d
t        j                  «       v st        j                  t        «      rt        j                  t        «      nd
dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}|j                  d¬«      }t        |«      }d}||k(  }|söt        j                  d|fd	||f«      d
t        j                  «       v st        j                  t        «      rt        j                  t        «      nd
dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}|j                  t        j                  ¬«      }t        |«      }d}||k(  }|söt        j                  d|fd	||f«      d
t        j                  «       v st        j                  t        «      rt        j                  t        «      nd
dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }	dd|	iz  }
t        t        j                  |
«      «      ‚d x}x}}y c c}w )Né   r™   r˜   r   )r2   r£   rø   r¶   TrÂ   rA   r   r€   rÀ   r‚   r„   r…   rÄ   rË   )r�   r   r   r¦   rS   rÇ   r€   rT   rU   rV   rW   rX   rY   rZ   r[   )r    r"   r‘   rö   r™   rÀ   rb   rs   r^   r“   r”   s              r!   rÉ   z TestProviderRegistry.test_search[  sT  € ô ˜1“Xö
ð ô Ø˜Q˜C˜Ü%×,Ñ,Ø$%¨¡E¨Q¡JØ˜!‘e˜q‘jö	ð
ˆ	ð 
ð ò 	!ˆAØ×Ñ˜aÕ ð	!ð —/‘/¨T�/Ó2ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ó à—/‘/¨D�/Ó1ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ó à—/‘/¬×)>Ñ)>�/Ó?ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ô ùò'
s   Ž3ON)rÜ   r   )rÜ   r   )r"   r   rð   r   rÜ   rÞ   )r"   r   rÜ   rÞ   )rß   rà   rá   râ   rã   rä   r"   rð   rd   rx   r¬   r³   r   rÉ   rå   r#   r!   rç   rç     sQ   „ Ù%à‡^�^ò"ó ð"ð ‡^�^ò
ó ð
ó5ó5ó

 ó
ó=ô!r#   rç   c                  ó¬   — e Zd ZdZej
                  dd„«       Zej
                  dd„«       Zdd„Zdd„Z	dd„Z
dd„Zdd„Zdd	„Zdd
„Zdd„Zdd„Zdd„Zy)ÚTestModelIntelligencezTests for ModelIntelligence.c                ó   — t        «       S r   )r   r   s    r!   Úintelligencez"TestModelIntelligence.intelligencez  s   € ä Ó"Ð"r#   c                ó¶   — t        dddt        j                  dt        ddd¬«      ddt        j
                  t        j                  t        j                  ¬«      S )	Nr%   r&   r'   r(   FT)r)   r*   r-   )r1   r2   r3   r5   r6   r7   r8   r9   r:   rì   r£   )
r   r   r=   r	   r
   r>   r   rï   r   r¦   r   s    r!   r?   z"TestModelIntelligence.sample_model~  sV   € äØ!Ø$ØÜ —~‘~ØÜ*ØØ!Øôð
 "ØÜ'×,Ñ,Ü×%Ñ%Ü×%Ñ%ô
ð 	
r#   c                óF  — |j                  |«      }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd	||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )
Nr%   rA   rC   ÚmodelrE   rI   rJ   r&   rK   )Ú	normalizer1   rT   rU   rV   rW   rX   rY   rZ   r[   r2   )	r    r  r?   r	  r]   r^   r_   r`   ra   s	            r!   Útest_normalizez$TestModelIntelligence.test_normalize’  sì   € Ø×&Ñ& |Ó4ˆØ�~‰~Ð- Ð-ˆ~ Ñ-×-×-Õ-ˆ~ ×-×-×-×-×-Ñ-ˆu×-×-Ó-ˆu×-×-Ô-ˆ~×-×-Ò- ×-×-×-×-×-×-Ó-Ø�~‰~Ð0 Ð0ˆ~ Ñ0×0×0Õ0ˆ~ ×0×0×0×0×0Ñ0ˆu×0×0Ó0ˆu×0×0Ô0ˆ~×0×0Ò0 ×0×0×0×0×0×0Ô0r#   c                ó`  — t        dd¬«      }|j                  |«      }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nz
TEST-MODELÚGOOGLErÔ   r%   rA   rC   Ú
normalizedrE   rI   rJ   ÚgeminirK   )r   r
  r1   rT   rU   rV   rW   rX   rY   rZ   r[   r2   )	r    r  r	  r  r]   r^   r_   r`   ra   s	            r!   Útest_normalize_lowercasez.TestModelIntelligence.test_normalize_lowercase—  s  € ÜØ!Øô
ˆð "×+Ñ+¨EÓ2ˆ
Ø×"Ñ"Ð2 lÐ2Ð" lÑ2×2×2Õ2Ð" l×2×2×2×2×2Ñ2ˆz×2×2Ó2ˆz×2×2Ô2Ð"×2×2Ò2 l×2×2×2×2×2×2Ó2Ø×"Ñ"Ð. hÐ.Ð" hÑ.×.×.Õ.Ð" h×.×.×.×.×.Ñ.ˆz×.×.Ó.ˆz×.×.Ô.Ð"×.×.Ò. h×.×.×.×.×.×.Ô.r#   c                óZ  — t        ddt        j                  d¬«      }|j                  |«      }t        j                  }||k(  }|sât        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}}y )Nz
free-modelr™   F)r1   r2   r:   Úcard_requiredrA   )z,%(py0)s == %(py4)s
{%(py4)s = %(py2)s.FREE
}Úcategoryr   rŽ   úassert %(py6)srk   )r   r
   r>   Úclassifyr   rT   rU   rV   rW   rX   rY   rZ   r[   ©r    r  r	  r  r_   r]   r•   r“   s           r!   Útest_classify_freez(TestModelIntelligence.test_classify_free   s³   € ÜØ!ØÜ'×,Ñ,Øô	
ˆð  ×(Ñ(¨Ó/ˆÜ,×1Ñ1Ð1ˆxÐ1Ñ1×1×1Õ1ˆxÐ1×1×1×1×1×1Ñ1ˆx×1×1Ó1ˆx×1×1×1×1×1Ò1Ô,×1×1Ó1Ô,×1×1Ô1Ð1×1×1×1×1×1×1Ò1r#   c                óX  — t        ddt        j                  ¬«      }|j                  |«      }t        j                  }||k(  }|sât        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}}y )Nr%   r™   rµ   rA   )z5%(py0)s == %(py4)s
{%(py4)s = %(py2)s.FREE_FOR_TEST
}r  r   rŽ   r  rk   )r   r
   ÚFREE_FOR_TESTr  r   rT   rU   rV   rW   rX   rY   rZ   r[   r  s           r!   Útest_classify_free_for_testz1TestModelIntelligence.test_classify_free_for_testª  s°   € ÜØ!ØÜ'×5Ñ5ô
ˆð
  ×(Ñ(¨Ó/ˆÜ,×:Ñ:Ð:ˆxÐ:Ñ:×:×:Õ:ˆxÐ:×:×:×:×:×:Ñ:ˆx×:×:Ó:ˆx×:×:×:×:×:Ò:Ô,×:×:Ó:Ô,×:×:Ô:Ð:×:×:×:×:×:×:Ò:r#   c                óX  — t        ddt        j                  ¬«      }|j                  |«      }t        j
                  }||k(  }|sât        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}}y )Nz	new-modelr™   rµ   rA   )z+%(py0)s == %(py4)s
{%(py4)s = %(py2)s.NEW
}r  r   rŽ   r  rk   )r   r
   r¹   r  r   ÚNEWrT   rU   rV   rW   rX   rY   rZ   r[   r  s           r!   Útest_classify_newz'TestModelIntelligence.test_classify_new³  s°   € ÜØ ØÜ'×,Ñ,ô
ˆð
  ×(Ñ(¨Ó/ˆÜ,×0Ñ0Ð0ˆxÐ0Ñ0×0×0Õ0ˆxÐ0×0×0×0×0×0Ñ0ˆx×0×0Ó0ˆx×0×0×0×0×0Ò0Ô,×0×0Ó0Ô,×0×0Ô0Ð0×0×0×0×0×0×0Ò0r#   c                ó  — t        ddt        j                  t        j                  dt        ddddd¬«      t        j                  ¬«      }|j                  |«      }d}||kD  }|s™t        j                  d|fd	||f«      d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
t        j                  |«      dœz  }dd|iz  }t        t        j                   |«      «      ‚d x}}y )Nz
best-modelr™   é ô T)r)   r*   r,   r-   r.   ©r1   r2   r:   rì   r6   r7   r£   gÍÌÌÌÌÌì?©ú>)z%(py0)s > %(py3)sÚscorerP   rR   rH   )r   r
   r>   r   rï   r	   r   r¦   Úscore_modelrT   rU   rV   rW   rX   rY   rZ   r[   ©r    r  r	  r#  rb   r]   rc   r`   s           r!   Útest_score_model_free_officialz4TestModelIntelligence.test_score_model_free_official¼  s³   € ÜØ!ØÜ'×,Ñ,Ü×%Ñ%Ø!Ü*ØØ!ØØØôô ×%Ñ%ô
ˆð ×(Ñ(¨Ó/ˆØÐˆu�s‰{××Õˆu�s×××××Ñˆu××Óˆu××Ô�s××××××Òr#   c           	     óú  — t        ddt        j                  t        j                  dt        «       t        j                  ¬«      }|j                  |«      }d}||k  }|s™t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      d	œz  }d
d|iz  }t        t        j                   |«      «      ‚d x}}y )Nzworst-modelr™   iÐ  r   g333333Ó?)ú<)z%(py0)s < %(py3)sr#  rP   rR   rH   )r   r
   r¹   r   Ú
UNOFFICIALr	   r   r§   r$  rT   rU   rV   rW   rX   rY   rZ   r[   r%  s           r!   Ú test_score_model_paid_unofficialz6TestModelIntelligence.test_score_model_paid_unofficialÏ  s    € ÜØ"ØÜ'×,Ñ,Ü×'Ñ'ØÜ*Ó,Ü×%Ñ%ô
ˆð ×(Ñ(¨Ó/ˆØÐˆu�s‰{××Õˆu�s×××××Ñˆu××Óˆu××Ô�s××××××Òr#   c                óB  — t        dddd¬«      }|j                  |«      }|d   }d}||u }|slt        j                  d|fd	||f«      t        j                  |«      t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|d   }g }||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nzvalid-modelr&   r(   r0   )r1   r2   r6   r<   ÚvalidTrf   ©z%(py1)s is %(py4)s©rƒ   rj   r  rk   ÚissuesrA   ©z%(py1)s == %(py4)s)r   Úvalidate_metadatarT   rU   rY   rZ   r[   )	r    r  r	  ÚresultrÈ   r_   rb   r•   r“   s	            r!   Útest_validate_metadata_validz2TestModelIntelligence.test_validate_metadata_validÜ  sÊ   € ÜØ"Ø$ØØô	
ˆð ×/Ñ/°Ó6ˆØ�g‰Ð& $Ð&ˆ $Ð&×&×&Õ&ˆ $×&×&Ó&ˆ×&×&Ò& $×&×&×&×&×&×&Ó&Ø�hÑÐ% 2Ð%Ð 2Ñ%×%×%Õ%Ð 2×%×%Ó%Ð×%×%Ò% 2×%×%×%×%×%×%Ô%r#   c                ó  — t        ddd¬«      }|j                  |«      }|d   }d}||u }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}|d   }	t        |	«      }d}
||
kD  }|sÉt        j                  d|fd||
f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |	«      t        j                  |«      t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}x}}
y )NÚ r   )r1   r2   r6   r,  Frf   r-  r.  r  rk   r/  r!  )z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)sr€   rÑ   rÒ   rl   )r   r1  rT   rU   rY   rZ   r[   r€   rV   rW   rX   )r    r  r	  r2  rÈ   r_   rb   r•   r“   r]   r×   rs   ra   rv   s                 r!   Ú%test_validate_metadata_missing_fieldsz;TestModelIntelligence.test_validate_metadata_missing_fieldsç  sý   € ÜØØØô
ˆð
 ×/Ñ/°Ó6ˆØ�g‰Ð' %Ð'ˆ %Ð'×'×'Õ'ˆ %×'×'Ó'ˆ×'×'Ò' %×'×'×'×'×'×'Ó'Ø˜(Ñ#Ð(ŒsÐ#Ó$Ð( qÐ(Ð$ qÑ(×(×(Õ(Ð$ q×(×(×(×(×(Ñ(Œs×(×(Ó(Œs×(×(Ô(Ð#×(×(Ò(Ð$×(×(Ò( q×(×(×(×(×(×(Ö(r#   c                óÜ  — t        ddd¬«      t        ddd¬«      t        ddd	¬«      g}|j                  |«      }t        |«      }d
}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|d   }	|	j                  }d}||k(  }|s€t        j                  d|fd||f«      t        j                  |	«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}x}}y )NÚdupÚp1g     @�@)r1   r2   Úlast_checkedÚp2g     @Ÿ@ÚuniqueÚp3g     p§@r˜   rA   r   r€   Údedupedr‚   r„   r…   r   )z0%(py3)s
{%(py3)s = %(py1)s.provider
} == %(py6)srÁ   )r   Údeduplicater€   rT   rU   rV   rW   rX   rY   rZ   r[   r2   )
r    r  r’   r>  rb   rs   r^   r“   r”   rÈ   s
             r!   Útest_deduplicatez&TestModelIntelligence.test_deduplicateñ  sE  € äØØØ#ôô
 ØØØ#ôô
 Ø!ØØ#ôð
ˆð" ×*Ñ*¨6Ó2ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ó Ø�q‰zÐ*ˆz×"Ñ"Ð* dÐ*Ð" dÑ*×*×*Õ*Ð" d×*×*Ó*ˆz×*×*Ò*Ð"×*×*Ò* d×*×*×*×*×*×*Ö*r#   N)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*  r3  r6  r@  rå   r#   r!   r  r  w  se   „ Ù&à‡^�^ò#ó ð#ð ‡^�^ò
ó ð
ó&1ó
/ó2ó;ó1óó&ó	&ó)ô+r#   r  c                  ó´   — e Zd ZdZej
                  dd„«       Zej
                  dd„«       Zdd„Zdd„Z	dd„Z
dd„Zdd„Zdd	„Zdd
„Zdd„Zdd„Zdd„Zdd„Zy)ÚTestModelRouterzTests for ModelRouter.c                ó   — t        «       S r   )r   r   s    r!   ÚrouterzTestModelRouter.router  s
   € ä‹}Ðr#   c                óš  — ddl m} ddl m} ddl m} |j                  j                   |d|j                  d|j                  ¬«      «       |j                  j                   |d|j                  dd|j                  ¬	«      «       |j                  j                  t        d
dt        j                  ddt        j                  t        j                  dt        dddd¬«      ¬«	      «       |j                  j                  t        ddt        j                  ddt        j                  t        j                  dt        dd¬«      ¬«	      «       y )Nr   )r   )r   )r   ÚlitellmT)r2   r£   r9   rì   Úollama)r2   r£   rø   r9   rì   úgemini-flashFr  )r)   r*   r,   r-   )	r1   r2   r£   r8   r9   r:   rì   r6   r7   Úllama3r(   )r*   r-   )Úcyberbrain26.model_layerr   r   r   Úprovider_registryrS   r¦   rï   Ú	COMMUNITYÚmodel_registryr   r   r
   r>   r   r	   )r    rD  Ú_PRÚ_PSÚ_PTs        r!   Úsetup_modelszTestModelRouter.setup_models  s*  € õ	
õ	
õ	
ð 	× Ñ ×)Ñ)ÙØ"Ø—z‘zØ"Ø—l‘lô	ô	
ð 	× Ñ ×)Ñ)ÙØ!Ø—z‘zØ#'Ø"Ø—m‘môô	
ð 	×Ñ×&Ñ&ÜØ'Ø"Ü"×)Ñ)Ø %Ø"Ü+×0Ñ0Ü ×)Ñ)Ø%Ü.ØØ!%Ø"Øô	ôô	
ð$ 	×Ñ×&Ñ&ÜØ!Ø!Ü"×)Ñ)Ø $Ø"Ü+×0Ñ0Ü ×*Ñ*Ø#Ü.Ø!%Øôôõ	
r#   c                ó  — |j                  t        j                  ¬«      }|j                  }d }||u}|s­t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|j                  }t        j                  }	||	k(  }|söt	        j
                  d|fd	||	f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      d
t        j                  «       v st	        j                  t        «      rt	        j                  t        «      nd
t	        j                  |	«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}}	y )N©ÚstrategyrL   ©z4%(py2)s
{%(py2)s = %(py0)s.model_id
} is not %(py5)sr2  rE   rI   rJ   rA   )zT%(py2)s
{%(py2)s = %(py0)s.strategy
} == %(py6)s
{%(py6)s = %(py4)s.COST_OPTIMIZED
}r   rÍ   r„   r…   )Úrouter   ÚCOST_OPTIMIZEDr1   rT   rU   rV   rW   rX   rY   rZ   r[   rT  ©r    rD  rQ  r2  r]   r^   r_   r`   ra   rs   r“   r”   s               r!   Útest_route_cost_optimizedz)TestModelRouter.test_route_cost_optimizedU  s  € Ø—‘¤}×'CÑ'C�ÓDˆØ�‰Ð* dÐ*ˆ dÐ*×*×*Õ*ˆ d×*×*×*×*×*Ñ*ˆv×*×*Ó*ˆv×*×*Ô*ˆ×*×*Ò* d×*×*×*×*×*×*Ó*Ø�‰Ð>¤-×">Ñ">Ð>ˆÐ">Ñ>×>×>Õ>ˆÐ">×>×>×>×>×>Ñ>ˆv×>×>Ó>ˆv×>×>Ô>ˆ×>×>×>×>×>Ð>¤-×>×>Ó>¤-×>×>Ô>Ð">×>×>×>×>×>×>Ô>r#   c                óÖ  — |j                  t        j                  ¬«      }|j                  }d }||u}|s­t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}g }|j                  }d}	||	k(  }
|
}|
s|j                  }|}|�sLt	        j
                  d	|
fd
||	f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |	«      dœz  }dd|iz  }|j                  |«       |
slddt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  «      dœz  }|j                  |«       t	        j                  |d«      i z  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}x}x}
x}	}y )NrS  rL   rU  r2  rE   rI   rJ   rG  rA   )z0%(py4)s
{%(py4)s = %(py2)s.provider
} == %(py7)s)rG   rj   rJ   z%(py9)srl   z(%(py13)s
{%(py13)s = %(py11)s.fallback
})rn   Úpy13r¿   zassert %(py16)sÚpy16)rV  r   ÚLOCAL_FIRSTr1   rT   rU   rV   rW   rX   rY   rZ   r[   r2   ÚfallbackÚappendÚ_format_boolop)r    rD  rQ  r2  r]   r^   r_   r`   ra   r×   rs   rÈ   Ú@py_assert12rv   Ú@py_format14Ú@py_format15Ú@py_format17s                    r!   Útest_route_local_firstz&TestModelRouter.test_route_local_firstZ  sJ  € Ø—‘¤}×'@Ñ'@�ÓAˆØ�‰Ð* dÐ*ˆ dÐ*×*×*Õ*ˆ d×*×*×*×*×*Ñ*ˆv×*×*Ó*ˆv×*×*Ô*ˆ×*×*Ò* d×*×*×*×*×*×*Ó*Ù=ˆv�‰Ð= (Ð=ˆ (Ñ*Ô=¨f¯o©oÐ=¨o×=×=Ö=ˆ (×=×=×=×=×=Ñ=ˆv×=×=Ó=ˆv×=×=Ô=ˆ×=×=Ò= (×=×=×=×=×=×=×=×=×=Ð=¨f×=×=Ó=¨f×=×=Ô=¨o×=×=×=×=×=×=×=×=×=×=×=×=Ô=r#   c                óH  — |j                  d¬«      }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d	}||k(  }|s­t        j                  d|fd
||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )NrH  ©r1   rA   rC   r2  rE   rI   rJ   rF  rK   )rV  r1   rT   rU   rV   rW   rX   rY   rZ   r[   r2   )	r    rD  rQ  r2  r]   r^   r_   r`   ra   s	            r!   Útest_route_specific_modelz)TestModelRouter.test_route_specific_model_  sì   € Ø—‘ ~�Ó6ˆØ�‰Ð0 .Ð0ˆ .Ñ0×0×0Õ0ˆ .×0×0×0×0×0Ñ0ˆv×0×0Ó0ˆv×0×0Ô0ˆ×0×0Ò0 .×0×0×0×0×0×0Ó0Ø�‰Ð+ )Ð+ˆ )Ñ+×+×+Õ+ˆ )×+×+×+×+×+Ñ+ˆv×+×+Ó+ˆv×+×+Ô+ˆ×+×+Ò+ )×+×+×+×+×+×+Ô+r#   c                ó  — |j                  t        j                  ¬«      }|j                  }d }||u}|s­t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|j                  }t        j                  }	||	k(  }|söt	        j
                  d|fd	||	f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      d
t        j                  «       v st	        j                  t        «      rt	        j                  t        «      nd
t	        j                  |	«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}}	y )NrS  rL   rU  r2  rE   rI   rJ   rA   )zQ%(py2)s
{%(py2)s = %(py0)s.strategy
} == %(py6)s
{%(py6)s = %(py4)s.PERFORMANCE
}r   rÍ   r„   r…   )rV  r   ÚPERFORMANCEr1   rT   rU   rV   rW   rX   rY   rZ   r[   rT  rX  s               r!   Útest_route_performancez&TestModelRouter.test_route_performanced  ó  € Ø—‘¤}×'@Ñ'@�ÓAˆØ�‰Ð* dÐ*ˆ dÐ*×*×*Õ*ˆ d×*×*×*×*×*Ñ*ˆv×*×*Ó*ˆv×*×*Ô*ˆ×*×*Ò* d×*×*×*×*×*×*Ó*Ø�‰Ð;¤-×";Ñ";Ð;ˆÐ";Ñ;×;×;Õ;ˆÐ";×;×;×;×;×;Ñ;ˆv×;×;Ó;ˆv×;×;Ô;ˆ×;×;×;×;×;Ð;¤-×;×;Ó;¤-×;×;Ô;Ð";×;×;×;×;×;×;Ô;r#   c                ó  — |j                  t        j                  ¬«      }|j                  }d }||u}|s­t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|j                  }t        j                  }	||	k(  }|söt	        j
                  d|fd	||	f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      d
t        j                  «       v st	        j                  t        «      rt	        j                  t        «      nd
t	        j                  |	«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}}	y )NrS  rL   rU  r2  rE   rI   rJ   rA   )zQ%(py2)s
{%(py2)s = %(py0)s.strategy
} == %(py6)s
{%(py6)s = %(py4)s.RELIABILITY
}r   rÍ   r„   r…   )rV  r   ÚRELIABILITYr1   rT   rU   rV   rW   rX   rY   rZ   r[   rT  rX  s               r!   Útest_route_reliabilityz&TestModelRouter.test_route_reliabilityi  rl  r#   c                ó>  — |j                  t        j                  ddi¬«      }|j                  }d }||u}|s­t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }dd	|iz  }t        t	        j                  |«      «      ‚d x}x}}|j                  j                  |j                  «      }	d }
|	|
u}|s™t	        j
                  d|fd
|	|
f«      dt        j                  «       v st	        j                  |	«      rt	        j                  |	«      ndt	        j                  |
«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}}
|	j                  }|j                  }d}||u }|sÁt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |	«      rt	        j                  |	«      ndt	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}x}}y )Nr)   T)rT  r7   rL   rU  r2  rE   rI   rJ   rN   r	  rP   rR   rH   rf   )zP%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.capabilities
}.vision
} is %(py7)srÑ   rÒ   rl   )rV  r   Ú
CAPABILITYr1   rT   rU   rV   rW   rX   rY   rZ   r[   rM  r\   r7   r)   )r    rD  rQ  r2  r]   r^   r_   r`   ra   r	  rb   rc   r×   rs   rv   s                  r!   Útest_route_capabilityz%TestModelRouter.test_route_capabilityn  s’  € Ø—‘Ü"×-Ñ-Ø" DÐ)ð ó 
ˆð �‰Ð* dÐ*ˆ dÐ*×*×*Õ*ˆ d×*×*×*×*×*Ñ*ˆv×*×*Ó*ˆv×*×*Ô*ˆ×*×*Ò* d×*×*×*×*×*×*Ó*Ø×%Ñ%×)Ñ)¨&¯/©/Ó:ˆØ Ð ˆu˜DÐ × × Õ ˆu˜D× × × × × Ñ ˆu× × Ó ˆu× × Ô ˜D× × × × × × Ñ Ø×!Ñ!Ð0Ð!×(Ñ(Ð0¨DÐ0Ð(¨DÐ0×0×0Õ0Ð(¨D×0×0×0×0×0Ñ0ˆu×0×0Ó0ˆu×0×0Ô0Ð!×0×0Ò0Ð(×0×0Ò0¨D×0×0×0×0×0×0Ö0r#   c                ó   — |j                  t        j                  ¬«      }|j                  t        j                  ¬«      }|j                  }d }||u}|s­t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}x}}|j                  }d }||u}|s­t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}x}}y )	NrS  rL   rU  Úresult1rE   rI   rJ   Úresult2)rV  r   ÚROUND_ROBINr1   rT   rU   rV   rW   rX   rY   rZ   r[   )
r    rD  rQ  rt  ru  r]   r^   r_   r`   ra   s
             r!   Útest_route_round_robinz&TestModelRouter.test_route_round_robinx  s  € Ø—,‘,¬×(AÑ(A�,ÓBˆØ—,‘,¬×(AÑ(A�,ÓBˆØ×ÑÐ+ tÐ+Ð tÐ+×+×+Õ+Ð t×+×+×+×+×+Ñ+ˆw×+×+Ó+ˆw×+×+Ô+Ð×+×+Ò+ t×+×+×+×+×+×+Ó+Ø×ÑÐ+ tÐ+Ð tÐ+×+×+Õ+Ð t×+×+×+×+×+Ñ+ˆw×+×+Ó+ˆw×+×+Ô+Ð×+×+Ò+ t×+×+×+×+×+×+Ô+r#   c                ó€   — t        j                  t        «      5  |j                  «        d d d «       y # 1 sw Y   y xY wr   )rã   Úraisesr   rV  )r    rD  s     r!   Útest_route_no_candidatesz(TestModelRouter.test_route_no_candidates~  s-   € Ü�]‰]Ô+Ó,ñ 	Ø�L‰LŒN÷	÷ 	ñ 	ús   š4´=c                ó.  — |j                   }d} ||«      }d}||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}t        d	«      D ]  }
|j                  d«       Œ |j                   }d} ||«      }d
}||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}|j                  }d} ||«      }d}||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}|j                   }d} ||«      }d}||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}y )NÚtestTrf   )z\%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._check_circuit_breaker
}(%(py4)s)
} is %(py9)srD  ri   rm   rn   é   F)z[%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.reset_circuit_breaker
}(%(py4)s)
} is %(py9)s)Ú_check_circuit_breakerrT   rU   rV   rW   rX   rY   rZ   r[   r�   Ú_record_failureÚreset_circuit_breaker)r    rD  rQ  r]   r_   rs   rt   ru   rv   rw   Ú_s              r!   Útest_circuit_breakerz$TestModelRouter.test_circuit_breaker‚  sŒ  € Ø×,Ñ,Ð<¨VÐ<Ñ,¨VÓ4Ð<¸Ð<Ð4¸Ð<×<×<Õ<Ð4¸×<×<×<×<×<Ñ<ˆv×<×<Ó<ˆv×<×<Ô<Ð,×<×<Ò<¨V×<×<Ò<Ð4×<×<Ò<¸×<×<×<×<×<×<×<ä�q“ò 	+ˆAØ×"Ñ" 6Õ*ð	+ð ×,Ñ,Ð=¨VÐ=Ñ,¨VÓ4Ð=¸Ð=Ð4¸Ð=×=×=Õ=Ð4¸×=×=×=×=×=Ñ=ˆv×=×=Ó=ˆv×=×=Ô=Ð,×=×=Ò=¨V×=×=Ò=Ð4×=×=Ò=¸×=×=×=×=×=×=×=à×+Ñ+Ð;¨FÐ;Ñ+¨FÓ3Ð;°tÐ;Ð3°tÐ;×;×;Õ;Ð3°t×;×;×;×;×;Ñ;ˆv×;×;Ó;ˆv×;×;Ô;Ð+×;×;Ò;¨F×;×;Ò;Ð3×;×;Ò;°t×;×;×;×;×;×;×;Ø×,Ñ,Ð<¨VÐ<Ñ,¨VÓ4Ð<¸Ð<Ð4¸Ð<×<×<Õ<Ð4¸×<×<×<×<×<Ñ<ˆv×<×<Ó<ˆv×<×<Ô<Ð,×<×<Ò<¨V×<×<Ò<Ð4×<×<Ò<¸×<×<×<×<×<×<×<Ð<r#   c                ó†  — |j                  «       }t        |«      }d}||k\  }|söt        j                  d|fd||f«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|d	   }	|	j                  }d }||u}|s€t        j                  d
|fd||f«      t        j                  |	«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}x}}y )Nr¿   ©ú>=©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr€   Úroutesr‚   r„   r…   r   rL   )z4%(py3)s
{%(py3)s = %(py1)s.model_id
} is not %(py6)srÁ   )Úroute_with_fallbackr€   rT   rU   rV   rW   rX   rY   rZ   r[   r1   )
r    rD  rQ  r‡  rb   rs   r^   r“   r”   rÈ   s
             r!   Útest_route_with_fallbackz(TestModelRouter.test_route_with_fallback�  s  € Ø×+Ñ+Ó-ˆÜ�6‹{Ð˜aÐˆ{˜aÑ××Õˆ{˜a×××××ÑŒs××ÓŒs×××××Ò�6××Ó�6××Ôˆ{××Ò˜a××××××ÓØ�a‰yÐ-ˆy×!Ñ!Ð-¨Ð-Ð!¨Ð-×-×-Õ-Ð!¨×-×-Ó-ˆy×-×-Ò-Ð!×-×-Ò-¨×-×-×-×-×-×-Ö-r#   c                ó„  — |j                  t        j                  ¬«       |j                  «       }t	        |«      }d}||k\  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}}y )
NrS  r¿   r„  r†  r€   Úhistoryr‚   r„   r…   )rV  r   rW  Úget_route_historyr€   rT   rU   rV   rW   rX   rY   rZ   r[   )	r    rD  rQ  r‹  rb   rs   r^   r“   r”   s	            r!   Útest_get_route_historyz&TestModelRouter.test_get_route_history’  s°   € Ø�‰œm×:Ñ:ˆÔ;Ø×*Ñ*Ó,ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ô r#   N)rÜ   r   )rD  r   rÜ   rÞ   )rD  r   rQ  rÞ   rÜ   rÞ   )rß   rà   rá   râ   rã   rä   rD  rQ  rY  re  rh  rk  ro  rr  rw  rz  r‚  r‰  r�  rå   r#   r!   rB  rB    sk   „ Ù à‡^�^òó ðð ‡^�^ò>
ó ð>
ó@?ó
>ó
,ó
<ó
<ó
1ó,óó	=ó.ô
!r#   rB  c                  ó0   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zy)ÚTestLiteLLMClientzTests for LiteLLMClient.c                óT  — t        «       }|j                  }d }||u }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d }||u }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d	|fd
||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d	|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nrf   )z/%(py2)s
{%(py2)s = %(py0)s.api_key
} is %(py5)sÚconfigrE   rI   rJ   )z0%(py2)s
{%(py2)s = %(py0)s.base_url
} is %(py5)srz   rA   ©z3%(py2)s
{%(py2)s = %(py0)s.max_retries
} == %(py5)sç      N@©z/%(py2)s
{%(py2)s = %(py0)s.timeout
} == %(py5)s©r   Úapi_keyrT   rU   rV   rW   rX   rY   rZ   r[   Úbase_urlÚmax_retriesÚtimeout©r    r‘  r]   r^   r_   r`   ra   s          r!   Útest_config_defaultsz&TestLiteLLMClient.test_config_defaults   sÂ  € Ü“ˆØ�~‰~Ð% Ð%ˆ~ Ð%×%×%Õ%ˆ~ ×%×%×%×%×%Ñ%ˆv×%×%Ó%ˆv×%×%Ô%ˆ~×%×%Ò% ×%×%×%×%×%×%Ó%Ø�‰Ð& $Ð&ˆ $Ð&×&×&Õ&ˆ $×&×&×&×&×&Ñ&ˆv×&×&Ó&ˆv×&×&Ô&ˆ×&×&Ò& $×&×&×&×&×&×&Ó&Ø×!Ñ!Ð& QÐ&Ð! QÑ&×&×&Õ&Ð! Q×&×&×&×&×&Ñ&ˆv×&×&Ó&ˆv×&×&Ô&Ð!×&×&Ò& Q×&×&×&×&×&×&Ó&Ø�~‰~Ð% Ð%ˆ~ Ñ%×%×%Õ%ˆ~ ×%×%×%×%×%Ñ%ˆv×%×%Ó%ˆv×%×%Ô%ˆ~×%×%Ò% ×%×%×%×%×%×%Ô%r#   c                ób  — t        dddd¬«      }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nztest-keyzhttp://localhost:4100r}  g      ^@)r–  r—  r˜  r™  rA   )z/%(py2)s
{%(py2)s = %(py0)s.api_key
} == %(py5)sr‘  rE   rI   rJ   ©z0%(py2)s
{%(py2)s = %(py0)s.base_url
} == %(py5)sr’  r”  r•  rš  s          r!   Útest_config_customz$TestLiteLLMClient.test_config_custom§  s×  € ÜØØ,ØØô	
ˆð �~‰~Ð+ Ð+ˆ~ Ñ+×+×+Õ+ˆ~ ×+×+×+×+×+Ñ+ˆv×+×+Ó+ˆv×+×+Ô+ˆ~×+×+Ò+ ×+×+×+×+×+×+Ó+Ø�‰Ð9Ð"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9Ò9Ð"9×9×9×9×9×9×9Ó9Ø×!Ñ!Ð& QÐ&Ð! QÑ&×&×&Õ&Ð! Q×&×&×&×&×&Ñ&ˆv×&×&Ó&ˆv×&×&Ô&Ð!×&×&Ò& Q×&×&×&×&×&×&Ó&Ø�~‰~Ð& Ð&ˆ~ Ñ&×&×&Õ&ˆ~ ×&×&×&×&×&Ñ&ˆv×&×&Ó&ˆv×&×&Ô&ˆ~×&×&Ò& ×&×&×&×&×&×&Ô&r#   c           	     óÖ  — t        «       }|j                  } |«       }t        |t        «      }|�s3ddt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}x}}y )Nznassert %(py8)s
{%(py8)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.is_available
}()
}, %(py6)s)
}Ú
isinstanceÚclientÚbool©rF   rƒ   rQ   rH   rk   r…   )r   Úis_availabler   r¢  rV   rW   rT   rX   rY   rZ   r[   )r    r¡  rb   r^   ru   r”   s         r!   Útest_is_availablez#TestLiteLLMClient.test_is_available³  s¾   € Ü“ˆØ ×-Ñ-Ð6Ñ-Ó/Ð6ŒzÐ/´Ó6Ð6Ò6×6×6×6×6Õ6Œz×6×6Ó6Œz×6×6×6×6×6Ò6˜&×6×6Ó6˜&×6×6Ô6Ð-×6×6Ò6Ð/×6×6×6×6×6Ð6´×6×6Ó6´×6×6Ô6Ð6×6×6×6×6×6Õ6r#   c                óÌ  — t        «       }|j                  «       }d}||v }|s™t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}d}||v }|s™t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}y )	NÚhealthy©Úin©z%(py1)s in %(py3)sÚhealth©rƒ   rQ   rR   rH   r2   )
r   Úhealth_checkrT   rU   rY   rV   rW   rX   rZ   r[   ©r    r¡  r«  rÈ   rb   rc   r`   s          r!   Útest_health_checkz#TestLiteLLMClient.test_health_check·  sÉ   € Ü“ˆØ×$Ñ$Ó&ˆØÐ"ˆy˜FÐ"×"×"Õ"ˆy˜F×"×"Ó"ˆy×"×"×"×"×"Ð"˜F×"×"Ó"˜F×"×"×"×"×"×"Ó"ØÐ#ˆz˜VÐ#×#×#Õ#ˆz˜V×#×#Ó#ˆz×#×#×#×#×#Ð#˜V×#×#Ó#˜V×#×#×#×#×#×#Ô#r#   N©rÜ   rÞ   ©rß   rà   rá   râ   r›  rž  r¥  r¯  rå   r#   r!   r�  r�  �  s   „ Ù"ó&ó
'ó7ô$r#   r�  c                  ó0   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zy)ÚTestOllamaClientzTests for OllamaClient.c                óÆ  — t        «       }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd	||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d
}||u }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nzhttp://127.0.0.1:11434rA   r�  r‘  rE   rI   rJ   r“  r”  Trf   ©z2%(py2)s
{%(py2)s = %(py0)s.verify_ssl
} is %(py5)s©r   r—  rT   rU   rV   rW   rX   rY   rZ   r[   r™  Ú
verify_sslrš  s          r!   r›  z%TestOllamaClient.test_config_defaultsÆ  sY  € Ü“ˆØ�‰Ð:Ð":Ð:ˆÐ":Ñ:×:×:Õ:ˆÐ":×:×:×:×:×:Ñ:ˆv×:×:Ó:ˆv×:×:Ô:ˆ×:×:Ò:Ð":×:×:×:×:×:×:Ó:Ø�~‰~Ð% Ð%ˆ~ Ñ%×%×%Õ%ˆ~ ×%×%×%×%×%Ñ%ˆv×%×%Ó%ˆv×%×%Ô%ˆ~×%×%Ò% ×%×%×%×%×%×%Ó%Ø× Ñ Ð( DÐ(Ð  DÐ(×(×(Õ(Ð  D×(×(×(×(×(Ñ(ˆv×(×(Ó(ˆv×(×(Ô(Ð ×(×(Ò( D×(×(×(×(×(×(Ô(r#   c                óÎ  — t        ddd¬«      }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||u }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nzhttp://custom:1234ç     À‚@F)r—  r™  r·  rA   r�  r‘  rE   rI   rJ   r”  rf   rµ  r¶  rš  s          r!   rž  z#TestOllamaClient.test_config_customÌ  sg  € ÜØ)ØØô
ˆð
 �‰Ð6Ð"6Ð6ˆÐ"6Ñ6×6×6Õ6ˆÐ"6×6×6×6×6×6Ñ6ˆv×6×6Ó6ˆv×6×6Ô6ˆ×6×6Ò6Ð"6×6×6×6×6×6×6Ó6Ø�~‰~Ð& Ð&ˆ~ Ñ&×&×&Õ&ˆ~ ×&×&×&×&×&Ñ&ˆv×&×&Ó&ˆv×&×&Ô&ˆ~×&×&Ò& ×&×&×&×&×&×&Ó&Ø× Ñ Ð) EÐ)Ð  EÐ)×)×)Õ)Ð  E×)×)×)×)×)Ñ)ˆv×)×)Ó)ˆv×)×)Ô)Ð ×)×)Ò) E×)×)×)×)×)×)Ô)r#   c                ó6  ‡	— t        «       } t        ddddi«      «       Š	|j                  |dˆ	fd„«       |j                  } |«       }d}||u }|sÁt	        j
                  d|fd	||f«      d
t        j                  «       v st	        j                  |«      rt	        j                  |«      nd
t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}x}}y )NÚResponserå   Ústatus_codeéÈ   Ú_requestc                 ó   •— ‰S r   rå   )ÚargsÚkwargsÚresponses     €r!   ú<lambda>z4TestOllamaClient.test_is_available.<locals>.<lambda>Ý  s   ø€  H€ r#   Trf   )zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_available
}()
} is %(py7)sr¡  rÑ   rÒ   rl   )r   ÚtypeÚsetattrr¤  rT   rU   rV   rW   rX   rY   rZ   r[   )
r    Úmonkeypatchr¡  r]   r_   r×   rs   ra   rv   rÂ  s
            @r!   r¥  z"TestOllamaClient.test_is_availableÖ  sÂ   ø€ Ü“ˆà=”4˜
 B¨¸Ð(<Ó=Ó?ˆØ×ÑØØÛ,ô	
ð ×"Ñ"Ð,Ñ"Ó$Ð,¨Ð,Ð$¨Ð,×,×,Õ,Ð$¨×,×,×,×,×,Ñ,ˆv×,×,Ó,ˆv×,×,Ô,Ð"×,×,Ò,Ð$×,×,Ò,¨×,×,×,×,×,×,Ö,r#   c                ó‚  — t        «       }|j                  «       }d}||v }|s™t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}y ©Nr§  r¨  rª  r«  r¬  rR   rH   )
r   r­  rT   rU   rY   rV   rW   rX   rZ   r[   r®  s          r!   r¯  z"TestOllamaClient.test_health_checkâ  sp   € Ü“ˆØ×$Ñ$Ó&ˆØÐ"ˆy˜FÐ"×"×"Õ"ˆy˜F×"×"Ó"ˆy×"×"×"×"×"Ð"˜F×"×"Ó"˜F×"×"×"×"×"×"Ô"r#   Nr°  r±  rå   r#   r!   r³  r³  Ã  s   „ Ù!ó)ó*ó
-ô#r#   r³  c                  ó0   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zy)ÚTestLlamaCppClientzTests for LlamaCppClient.c                óè  — t        «       }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd	||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d
}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nzhttp://127.0.0.1:8080rA   r�  r‘  rE   rI   rJ   r¹  r”  i   ©z-%(py2)s
{%(py2)s = %(py0)s.n_ctx
} == %(py5)sr   )z4%(py2)s
{%(py2)s = %(py0)s.n_gpu_layers
} == %(py5)sr  )z1%(py2)s
{%(py2)s = %(py0)s.n_threads
} == %(py5)s)r   r—  rT   rU   rV   rW   rX   rY   rZ   r[   r™  Ún_ctxÚn_gpu_layersÚ	n_threadsrš  s          r!   r›  z'TestLlamaCppClient.test_config_defaultsð  s9  € ÜÓ!ˆØ�‰Ð9Ð"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9Ò9Ð"9×9×9×9×9×9×9Ó9Ø�~‰~Ð& Ð&ˆ~ Ñ&×&×&Õ&ˆ~ ×&×&×&×&×&Ñ&ˆv×&×&Ó&ˆv×&×&Ô&ˆ~×&×&Ò& ×&×&×&×&×&×&Ó&Ø�|‰|Ð#˜tÐ#ˆ|˜tÑ#×#×#Õ#ˆ|˜t×#×#×#×#×#Ñ#ˆv×#×#Ó#ˆv×#×#Ô#ˆ|×#×#Ò#˜t×#×#×#×#×#×#Ó#Ø×"Ñ"Ð' aÐ'Ð" aÑ'×'×'Õ'Ð" a×'×'×'×'×'Ñ'ˆv×'×'Ó'ˆv×'×'Ô'Ð"×'×'Ò' a×'×'×'×'×'×'Ó'Ø×ÑÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$ˆv×$×$Ó$ˆv×$×$Ô$Ð×$×$Ò$ 1×$×$×$×$×$×$Ô$r#   c                óÒ  — t        dddd¬«      }|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nzhttp://custom:8080z/models/llama.ggufr0   é   )r—  Ú
model_pathrÍ  rÎ  rA   r�  r‘  rE   rI   rJ   )z2%(py2)s
{%(py2)s = %(py0)s.model_path
} == %(py5)srÌ  )r   r—  rT   rU   rV   rW   rX   rY   rZ   r[   rÒ  rÍ  rš  s          r!   rž  z%TestLlamaCppClient.test_config_customø  sn  € ÜØ)Ø+ØØô	
ˆð �‰Ð6Ð"6Ð6ˆÐ"6Ñ6×6×6Õ6ˆÐ"6×6×6×6×6×6Ñ6ˆv×6×6Ó6ˆv×6×6Ô6ˆ×6×6Ò6Ð"6×6×6×6×6×6×6Ó6Ø× Ñ Ð8Ð$8Ð8Ð Ð$8Ñ8×8×8Õ8Ð Ð$8×8×8×8×8×8Ñ8ˆv×8×8Ó8ˆv×8×8Ô8Ð ×8×8Ò8Ð$8×8×8×8×8×8×8Ó8Ø�|‰|Ð#˜tÐ#ˆ|˜tÑ#×#×#Õ#ˆ|˜t×#×#×#×#×#Ñ#ˆv×#×#Ó#ˆv×#×#Ô#ˆ|×#×#Ò#˜t×#×#×#×#×#×#Ô#r#   c                ó¤  — t        «       }dd l}	 |j                  dd¬«      }|j                  dk(  }|j
                  } |«       }||u }|sît        j                  d|fd||f«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}y # t        $ r d}Y �Œw xY w)Nr   zhttp://127.0.0.1:8080/g       @)r™  r½  Frf   )zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_available
}()
} is %(py6)sr¡  ÚexpectedrÍ   r„   r…   )r   Úhttpxr\   r¼  Ú	Exceptionr¤  rT   rU   rV   rW   rX   rY   rZ   r[   )
r    r¡  rÕ  ÚresprÔ  r]   r_   rs   r“   r”   s
             r!   r¥  z$TestLlamaCppClient.test_is_available  så   € ÜÓ!ˆó 	ð	Ø—9‘9Ð5¸s�9ÓCˆDØ×'Ñ'¨3Ñ.ˆHð ×"Ñ"Ð0Ñ"Ó$Ð0Ð$¨Ð0×0×0Õ0Ð$¨×0×0×0×0×0Ñ0ˆv×0×0Ó0ˆv×0×0Ô0Ð"×0×0Ò0Ð$×0×0×0×0×0Ð0¨×0×0Ó0¨×0×0×0×0×0×0Ö0øô ò 	Ø‹Hð	ús   �"E  Å EÅEc                ó‚  — t        «       }|j                  «       }d}||v }|s™t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}y rÈ  )
r   r­  rT   rU   rY   rV   rW   rX   rZ   r[   r®  s          r!   r¯  z$TestLlamaCppClient.test_health_check  sq   € ÜÓ!ˆØ×$Ñ$Ó&ˆØÐ"ˆy˜FÐ"×"×"Õ"ˆy˜F×"×"Ó"ˆy×"×"×"×"×"Ð"˜F×"×"Ó"˜F×"×"×"×"×"×"Ô"r#   Nr°  r±  rå   r#   r!   rÊ  rÊ  í  s   „ Ù#ó%ó	$ó1ô#r#   rÊ  c                  ó`   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zdd
„Zdd„Zy)ÚTestModelGatewayzTests for ModelGateway.c                ó  — ddl m}  |«       }d }||u}|s™t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}|j                  }d }||u}|s­t        j                  d|fd	||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d
œz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j                  }d }||u}|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d
œz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j                  }d }||u}|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d
œz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}y )Nr   ©ÚModelGatewayrL   rN   ÚgatewayrP   rR   rH   )z:%(py2)s
{%(py2)s = %(py0)s.model_registry
} is not %(py5)srE   rI   rJ   )z=%(py2)s
{%(py2)s = %(py0)s.provider_registry
} is not %(py5)s)z2%(py2)s
{%(py2)s = %(py0)s.router
} is not %(py5)s)Ú(cyberbrain26.control_plane.model_gatewayrÝ  rT   rU   rV   rW   rX   rY   rZ   r[   rM  rK  rD  )
r    rÝ  rÞ  rb   r]   rc   r`   r^   r_   ra   s
             r!   Útest_gateway_initializationz,TestModelGateway.test_gateway_initialization  s¶  € ÝIá“.ˆØ"Ð"ˆw˜dÐ"×"×"Õ"ˆw˜d×"×"×"×"×"Ñ"ˆw×"×"Ó"ˆw×"×"Ô"˜d×"×"×"×"×"×"Ñ"Ø×%Ñ%Ð1¨TÐ1Ð%¨TÐ1×1×1Õ1Ð%¨T×1×1×1×1×1Ñ1ˆw×1×1Ó1ˆw×1×1Ô1Ð%×1×1Ò1¨T×1×1×1×1×1×1Ó1Ø×(Ñ(Ð4°Ð4Ð(°Ð4×4×4Õ4Ð(°×4×4×4×4×4Ñ4ˆw×4×4Ó4ˆw×4×4Ô4Ð(×4×4Ò4°×4×4×4×4×4×4Ó4Ø�~‰~Ð) TÐ)ˆ~ TÐ)×)×)Õ)ˆ~ T×)×)×)×)×)Ñ)ˆw×)×)Ó)ˆw×)×)Ô)ˆ~×)×)Ò) T×)×)×)×)×)×)Ô)r#   c                ó^  — ddl m}  |«       }|j                  «       }t        |«      }d}||k\  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }d	d
|iz  }t        t	        j                  |«      «      ‚d x}x}}y )Nr   rÜ  rz   r„  r†  r€   rö   r‚   r„   r…   )rß  rÝ  Úlist_providersr€   rT   rU   rV   rW   rX   rY   rZ   r[   )	r    rÝ  rÞ  rö   rb   rs   r^   r“   r”   s	            r!   Ú"test_gateway_has_builtin_providersz3TestModelGateway.test_gateway_has_builtin_providers'  s¦   € ÝIá“.ˆØ×*Ñ*Ó,ˆ	Ü�9‹~Ð" Ð"ˆ~ Ñ"×"×"Õ"ˆ~ ×"×"×"×"×"Ñ"Œs×"×"Ó"Œs×"×"×"×"×"Ò"�9×"×"Ó"�9×"×"Ô"ˆ~×"×"Ò" ×"×"×"×"×"×"Ô"r#   c                ó~  — ddl m}  |«       }|j                  «       }t        |t        «      }|�sddt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d }y ©Nr   rÜ  z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r   r’   Úlist)rF   rƒ   rG   rj   )rß  rÝ  Úlist_modelsr   ræ  rV   rW   rT   rX   rY   rZ   r[   ©r    rÝ  rÞ  r’   r_   r•   s         r!   Útest_gateway_list_modelsz)TestModelGateway.test_gateway_list_models.  s¢   € ÝIá“.ˆØ×$Ñ$Ó&ˆÜ˜&¤$Ó'Ð'Ò'×'×'×'×'Õ'Œz×'×'Ó'Œz×'×'×'×'×'Ò'˜&×'×'Ó'˜&×'×'×'×'×'Ò'¤$×'×'Ó'¤$×'×'Ô'Ð'×'×'×'×'×'Ñ'r#   c                ó  — ddl m}  |«       }|j                  «       }d}||v }|s™t        j                  d|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}}d
}||v }|s™t        j                  d|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}}d}||v }|s™t        j                  d|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}}y )Nr   rÜ  rö   r¨  rª  r«  r¬  rR   rH   r’   Úrouting)rß  rÝ  r­  rT   rU   rY   rV   rW   rX   rZ   r[   )r    rÝ  rÞ  r«  rÈ   rb   rc   r`   s           r!   Útest_gateway_health_checkz*TestModelGateway.test_gateway_health_check5  s%  € ÝIá“.ˆØ×%Ñ%Ó'ˆØÐ$ˆ{˜fÐ$×$×$Õ$ˆ{˜f×$×$Ó$ˆ{×$×$×$×$×$Ð$˜f×$×$Ó$˜f×$×$×$×$×$×$Ó$ØÐ!ˆx˜6Ð!×!×!Õ!ˆx˜6×!×!Ó!ˆx×!×!×!×!×!Ð!˜6×!×!Ó!˜6×!×!×!×!×!×!Ó!ØÐ"ˆy˜FÐ"×"×"Õ"ˆy˜F×"×"Ó"ˆy×"×"×"×"×"Ð"˜F×"×"Ó"˜F×"×"×"×"×"×"Ô"r#   c           	     óÜ  — ddl m}  |«       }|j                  } |«       }t        |t        «      }|�s3ddt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}x}}y )Nr   rÜ  zlassert %(py8)s
{%(py8)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.is_healthy
}()
}, %(py6)s)
}r   rÞ  r¢  r£  )rß  rÝ  Ú
is_healthyr   r¢  rV   rW   rT   rX   rY   rZ   r[   )r    rÝ  rÞ  rb   r^   ru   r”   s          r!   Útest_gateway_is_healthyz(TestModelGateway.test_gateway_is_healthy>  sÁ   € ÝIá“.ˆØ!×,Ñ,Ð5Ñ,Ó.Ð5ŒzÐ.´Ó5Ð5Ò5×5×5×5×5Õ5Œz×5×5Ó5Œz×5×5×5×5×5Ò5˜'×5×5Ó5˜'×5×5Ô5Ð,×5×5Ò5Ð.×5×5×5×5×5Ð5´×5×5Ó5´×5×5Ô5Ð5×5×5×5×5×5Õ5r#   c                óf  — ddl m}  |«       }|j                  «       }d}||v }|s™t        j                  d|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}}d
}||v }|s™t        j                  d|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}}d}||v }|s™t        j                  d|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}}d}||v }|s™t        j                  d|fd||f«      t        j
                  |«      dt        j                  «       v st        j                  |«      rt        j
                  |«      nddœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}}y )Nr   rÜ  r1   r¨  rª  r2  r¬  rR   rH   r2   rT  r#  )rß  rÝ  rV  rT   rU   rY   rV   rW   rX   rZ   r[   )r    rÝ  rÞ  r2  rÈ   rb   rc   r`   s           r!   Útest_gateway_routez#TestModelGateway.test_gateway_routeD  s{  € ÝIá“.ˆØ—‘“ˆØÐ#ˆz˜VÐ#×#×#Õ#ˆz˜V×#×#Ó#ˆz×#×#×#×#×#Ð#˜V×#×#Ó#˜V×#×#×#×#×#×#Ó#ØÐ#ˆz˜VÐ#×#×#Õ#ˆz˜V×#×#Ó#ˆz×#×#×#×#×#Ð#˜V×#×#Ó#˜V×#×#×#×#×#×#Ó#ØÐ#ˆz˜VÐ#×#×#Õ#ˆz˜V×#×#Ó#ˆz×#×#×#×#×#Ð#˜V×#×#Ó#˜V×#×#×#×#×#×#Ó#ØÐ ˆw˜&Ð × × Õ ˆw˜&× × Ó ˆw× × × × × Ð ˜&× × Ó ˜&× × × × × × Ô r#   c                ó\  — ddl m}  |«       }|j                  «       }t        |«      }d}||k\  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }d	d
|iz  }t        t	        j                  |«      «      ‚d x}x}}d}	|d   }
|	|
v }|slt	        j
                  d|fd|	|
f«      t	        j                  |	«      t	        j                  |
«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}	x}}
y )Nr   rÜ  r¿   r„  r†  r€   rÀ   r‚   r„   r…   r1   r¨  )z%(py1)s in %(py4)sr.  r  rk   )rß  rÝ  rˆ  r€   rT   rU   rV   rW   rX   rY   rZ   r[   )r    rÝ  rÞ  rÀ   rb   rs   r^   r“   r”   rÈ   r_   r•   s               r!   Ú test_gateway_route_with_fallbackz1TestModelGateway.test_gateway_route_with_fallbackN  sô   € ÝIá“.ˆØ×-Ñ-Ó/ˆÜ�7‹|Ð ˜qÐ ˆ|˜qÑ × × Õ ˆ|˜q× × × × × Ñ Œs× × Ó Œs× × × × × Ò �7× × Ó �7× × Ô ˆ|× × Ò ˜q× × × × × × Ó ØÐ'˜W Q™ZÐ'ˆz˜ZÐ'×'×'Õ'ˆz˜Z×'×'Ó'ˆz×'×'Ò'˜Z×'×'×'×'×'×'Ô'r#   c                óB  — ddl m}  |«       }|j                  d¬«      }|d   }d}||k(  }|slt        j                  d|fd||f«      t        j
                  |«      t        j
                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}y )Nr   rÜ  rH  rg  r1   rA   r0  r.  r  rk   )rß  rÝ  rV  rT   rU   rY   rZ   r[   )	r    rÝ  rÞ  r2  rÈ   r_   rb   r•   r“   s	            r!   Ú!test_gateway_route_specific_modelz2TestModelGateway.test_gateway_route_specific_modelV  sn   € ÝIá“.ˆØ—‘¨�Ó7ˆØ�jÑ!Ð3 ^Ð3Ð! ^Ñ3×3×3Õ3Ð! ^×3×3Ó3Ð!×3×3Ò3 ^×3×3×3×3×3×3Ô3r#   c                ó~  — ddl m}  |«       }|j                  «       }t        |t        «      }|�sddt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d }y rå  )rß  rÝ  Údiscover_modelsr   ræ  rV   rW   rT   rX   rY   rZ   r[   rè  s         r!   Útest_gateway_discover_modelsz-TestModelGateway.test_gateway_discover_models]  s¢   € ÝIá“.ˆØ×(Ñ(Ó*ˆÜ˜&¤$Ó'Ð'Ò'×'×'×'×'Õ'Œz×'×'Ó'Œz×'×'×'×'×'Ò'˜&×'×'Ó'˜&×'×'×'×'×'Ò'¤$×'×'Ó'¤$×'×'Ô'Ð'×'×'×'×'×'Ñ'r#   c                ó  — ddl m} ddlm}m}  |«       } |dd|j
                  ¬«      }|j                  |«      }|j                  }d}||k(  }	|	s­t        j                  d|	fd||f«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      d
œz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}	}|j                   }d}	 ||	«      }d }||u}|sÕt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |	«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}	x}x}}y )Nr   rÜ  )r   r   zcustom-modelÚcustomr}   rA   rC   rD   rE   rI   rJ   rL   )zS%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_model
}(%(py4)s)
} is not %(py9)srÞ  ri   rm   rn   )rß  rÝ  rJ  r   r   r=   Úregister_modelr1   rT   rU   rV   rW   rX   rY   rZ   r[   Ú	get_model)r    rÝ  r   r   rÞ  r	  rD   r]   r^   r_   r`   ra   rs   rt   ru   rv   rw   s                    r!   Útest_gateway_register_modelz,TestModelGateway.test_gateway_register_modeld  sF  € ÝIßCá“.ˆÙØ#ØØ —~‘~ô
ˆð
 ×+Ñ+¨EÓ2ˆ
Ø×"Ñ"Ð4 nÐ4Ð" nÑ4×4×4Õ4Ð" n×4×4×4×4×4Ñ4ˆz×4×4Ó4ˆz×4×4Ô4Ð"×4×4Ò4 n×4×4×4×4×4×4Ó4Ø× Ñ Ð< Ð<Ñ  Ó0Ð<¸Ð<Ð0¸Ð<×<×<Õ<Ð0¸×<×<×<×<×<Ñ<ˆw×<×<Ó<ˆw×<×<Ô<Ð ×<×<Ò< ×<×<Ò<Ð0×<×<Ò<¸×<×<×<×<×<×<×<Ð<r#   Nr°  )rß   rà   rá   râ   rà  rã  ré  rì  rï  rñ  ró  rõ  rø  rý  rå   r#   r!   rÚ  rÚ    s7   „ Ù!ó*ó#ó(ó#ó6ó!ó(ó4ó(ô=r#   rÚ  )*râ   Ú
__future__r   ÚbuiltinsrV   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterT   rã   rJ  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  rB  r�  r³  rÊ  rÚ  rå   r#   r!   ú<module>r     s–   ðÙ (å "ç  „ ƒ÷÷ ÷ ÷ ÷ ÷ ñ ÷>f+ñ f+÷\[!ñ [!÷FN+ñ N+÷lH!ñ H!÷`$ñ $÷L"#ñ "#÷T&#ñ &#÷\U=ò U=r#   