ó
    ’j:j+'  ã                   ó¸  • S r SSKrSSKJs  Jr  SSKrSSKJ	r	  SSK
JrJrJr  S rS rS rS rS	 rS
 rS rS r\	R,                  " \R.                  0 SS9S 5       r\	R,                  " \R.                  SS05      S 5       r\	R,                  " \R.                  SS0SS9S 5       r\	R,                  " \R.                  SSS.5      S 5       rS rS rS rS rS r S r!S r"S  r#\	R,                  " \R.                  0 SS9S! 5       r$\	R,                  " \R.                  SS05      S" 5       r%\	R,                  " \R.                  SSS.5      S# 5       r&S$ r'S% r(S& r)g)'zBTests for quber.agents.factory module (non-PydanticAI components).é    N)Úpatch)ÚAgentFactoryÚModelConfigÚModelProviderc                  óJ  • [         R                  o R                  nSo!U:H  o3(       d×  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =n=p2[         R                  o R                  nS	o!U:H  o3(       d×  [        R                  " SU4S
X45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =n=p2[         R                  o R                  nSo!U:H  o3(       d×  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =n=p2[         R                  o R                  nSo!U:H  o3(       d×  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =n=p2[         R                  o R                  nSo!U:H  o3(       d×  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =n=p2[         R                  o R                  nSo!U:H  o3(       d×  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =n=p2[         R                   o R                  nSo!U:H  o3(       d×  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =n=p2g)z,Test ModelProvider enum has expected values.Ú	anthropic©ú==)zL%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.ANTHROPIC
}.value
} == %(py7)sr   ©Úpy0Úpy2Úpy4Úpy7úassert %(py9)sÚpy9NÚopenai)zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.OPENAI
}.value
} == %(py7)sÚgroq)zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.GROQ
}.value
} == %(py7)sÚgemini)zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.GEMINI
}.value
} == %(py7)sÚvertexai)zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.VERTEXAI
}.value
} == %(py7)sÚbedrock)zJ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.BEDROCK
}.value
} == %(py7)sÚollama)zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.OLLAMA
}.value
} == %(py7)s)r   Ú	ANTHROPICÚvalueÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚOPENAIÚGROQÚGEMINIÚVERTEXAIÚBEDROCKÚOLLAMA)Ú@py_assert1Ú@py_assert3Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10s         Ú3/home/mande/repo/quber/tests/agents/test_factory.pyÚtest_model_provider_enum_valuesr/   	   sº  € ä×"Ñ"Ð7×(Ñ(Ð7¨KÐ7¨KÑ7×7×7×7Ò7Ð(×7×7×7×7×7Õ7Œ=×7×7×7Ñ7Œ=×7×7Õ7Ð"×7×7Ó7Ð(×7×7Ó7¨K×7×7×7×7×7×7Õ7Ü×ÑÐ1×%Ñ%Ð1¨Ð1¨Ñ1×1×1×1Ò1Ð%×1×1×1×1×1Õ1Œ=×1×1×1Ñ1Œ=×1×1Õ1Ð×1×1Ó1Ð%×1×1Ó1¨×1×1×1×1×1×1Õ1Ü×ÑÐ-×#Ñ#Ð- vÐ- vÑ-×-×-×-Ò-Ð#×-×-×-×-×-Õ-Œ=×-×-×-Ñ-Œ=×-×-Õ-Ð×-×-Ó-Ð#×-×-Ó- v×-×-×-×-×-×-Õ-Ü×ÑÐ1×%Ñ%Ð1¨Ð1¨Ñ1×1×1×1Ò1Ð%×1×1×1×1×1Õ1Œ=×1×1×1Ñ1Œ=×1×1Õ1Ð×1×1Ó1Ð%×1×1Ó1¨×1×1×1×1×1×1Õ1Ü×!Ñ!Ð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Õ5Ü× Ñ Ð3×&Ñ&Ð3¨)Ð3¨)Ñ3×3×3×3Ò3Ð&×3×3×3×3×3Õ3Œ=×3×3×3Ñ3Œ=×3×3Õ3Ð ×3×3Ó3Ð&×3×3Ó3¨)×3×3×3×3×3×3Õ3Ü×ÑÐ1×%Ñ%Ð1¨Ð1¨Ñ1×1×1×1Ò1Ð%×1×1×1×1×1Õ1Œ=×1×1×1Ñ1Œ=×1×1Õ1Ð×1×1Ó1Ð%×1×1Ó1¨×1×1×1×1×1×1Ö1ó    c                  ó°  • [         R                  n [        R                  oU;   o"(       Gd  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =p![         R                  n [        R                  oU;   o"(       Gd  [        R
                  " SU4S	X45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =p![         R                  n [        R                  oU;   o"(       Gd  [        R
                  " SU4S
X45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =p![         R                  n [        R                  oU;   o"(       Gd  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =p![        R                  [         R                     nSo%U:H  of(       do  [        R
                  " SU4SXR45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=pb[        R                  [         R                     nSo%U:H  of(       do  [        R
                  " SU4SXR45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=pbg)z6Test ModelConfig has default models for each provider.©Úin)zU%(py2)s
{%(py2)s = %(py0)s.ANTHROPIC
} in %(py6)s
{%(py6)s = %(py4)s.DEFAULT_MODELS
}r   r   ©r   r   r   Úpy6úassert %(py8)sÚpy8N)zR%(py2)s
{%(py2)s = %(py0)s.OPENAI
} in %(py6)s
{%(py6)s = %(py4)s.DEFAULT_MODELS
})zP%(py2)s
{%(py2)s = %(py0)s.GROQ
} in %(py6)s
{%(py6)s = %(py4)s.DEFAULT_MODELS
})zR%(py2)s
{%(py2)s = %(py0)s.GEMINI
} in %(py6)s
{%(py6)s = %(py4)s.DEFAULT_MODELS
}zclaude-haiku-4-5r	   ©z%(py1)s == %(py4)s©Úpy1r   úassert %(py6)sr5   zgpt-4.1-mini)r   r   r   ÚDEFAULT_MODELSr   r   r   r   r   r   r    r!   r"   r#   r$   )r(   r+   r)   Ú@py_format7Ú@py_format9Ú@py_assert0Ú@py_assert2Ú@py_format5s           r.   Ú test_model_config_default_modelsrB      s1  € ä×"Ñ"Ð@¤k×&@Ñ&@Ð@Ð&@Ñ@×@×@×@Ó@Ð"×@×@×@×@×@Õ@Œ=×@×@×@Ñ@Œ=×@×@Õ@Ð"×@×@×@×@×@Ô@¤k×@×@×@Ñ@¤k×@×@Õ@Ð&@×@×@×@×@×@×@Ó@Ü×ÑÐ=¤;×#=Ñ#=Ð=Ð#=Ñ=×=×=×=Ó=Ð×=×=×=×=×=Õ=Œ=×=×=×=Ñ=Œ=×=×=Õ=Ð×=×=×=×=×=Ô=¤;×=×=×=Ñ=¤;×=×=Õ=Ð#=×=×=×=×=×=×=Ó=Ü×ÑÐ;¤×!;Ñ!;Ð;Ð!;Ñ;×;×;×;Ó;Ð×;×;×;×;×;Õ;Œ=×;×;×;Ñ;Œ=×;×;Õ;Ð×;×;×;×;×;Ô;¤×;×;×;Ñ;¤×;×;Õ;Ð!;×;×;×;×;×;×;Ó;Ü×ÑÐ=¤;×#=Ñ#=Ð=Ð#=Ñ=×=×=×=Ó=Ð×=×=×=×=×=Õ=Œ=×=×=×=Ñ=Œ=×=×=Õ=Ð×=×=×=×=×=Ô=¤;×=×=×=Ñ=¤;×=×=Õ=Ð#=×=×=×=×=×=×=Ó=ä×%Ñ%¤m×&=Ñ&=Ñ>ÐTÐBTÐTÐBTÑT×T×T×TÒTÐ>×T×TÔTÐ>×T×TÓTÐBT×T×T×T×T×T×TÓTÜ×%Ñ%¤m×&:Ñ&:Ñ;ÐM¸~ÐM¸~ÑM×M×M×MÒMÐ;×M×MÔMÐ;×M×MÓM¸~×M×M×M×M×M×MÔMr0   c                  ó
  • [         R                  [        R                     n SoU:H  o"(       do  [        R
                  " SU4SX45      [        R                  " U 5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =p![         R                  [        R                     n SoU:H  o"(       do  [        R
                  " SU4SX45      [        R                  " U 5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =p![         R                  [        R                     n S	oU:H  o"(       do  [        R
                  " SU4SX45      [        R                  " U 5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =p![         R                  [        R                     n SoUL o"(       do  [        R
                  " S
U4SX45      [        R                  " U 5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n =p!g)z8Test ModelConfig has API key environment variable names.ÚANTHROPIC_API_KEYr	   r8   r9   r;   r5   NÚOPENAI_API_KEYÚGROQ_API_KEY©Úis)z%(py1)s is %(py4)s)r   ÚAPI_KEY_VARSr   r   r   r   r   r    r!   r"   r#   r'   )r?   r)   r@   rA   r=   s        r.   Útest_model_config_api_key_varsrJ      sx  € ä×#Ñ#¤M×$;Ñ$;Ñ<ÐSÐ@SÐSÐ@SÑS×S×S×SÒSÐ<×S×SÔSÐ<×S×SÓSÐ@S×S×S×S×S×S×SÓSÜ×#Ñ#¤M×$8Ñ$8Ñ9ÐMÐ=MÐMÐ=MÑM×M×M×MÒMÐ9×M×MÔMÐ9×M×MÓMÐ=M×M×M×M×M×M×MÓMÜ×#Ñ#¤M×$6Ñ$6Ñ7ÐI¸>ÐI¸>ÑI×I×I×IÒIÐ7×I×IÔIÐ7×I×IÓI¸>×I×I×I×I×I×IÓIÜ×#Ñ#¤M×$8Ñ$8Ñ9ÐA¸TÐA¸TÐA×A×A×AÒAÐ9×A×AÔAÐ9×A×AÓA¸T×A×A×A×A×A×AÔAr0   c                  óž  • [         R                  " 5       n SoU ;   o"(       d¥  [        R                  " SU4SX45      [        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS=pS	 U S    5       n[        U5      of(       d¢  S
S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS=pVS U S    5       n[        U5      of(       d¢  S
S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS=pVg)zPget_known_models sources names from pydantic-ai's registry, grouped by provider.r   r2   ©z%(py1)s in %(py3)sÚmodels©r:   Úpy3úassert %(py5)sÚpy5Nc              3   óB   #   • U  H  oR                  S 5      v •  M     g7f)ÚclaudeN©Ú
startswith©Ú.0Únames     r.   Ú	<genexpr>ÚCtest_model_config_get_known_models_from_registry.<locals>.<genexpr>-   s   é € ÐIÒ5H¨T�‰˜x×(Ð(Ò5Hùó   ‚ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany©r   r   r   c              3   ó,   #   • U  H
  nS U;  v •  M     g7f)Ú:N© rV   s     r.   rY   rZ   .   s   é € Ð?Ò+> 4ˆs˜$ŽÒ+>ùs   ‚Úall)r   Úget_known_modelsr   r   r   r   r   r   r    r!   r]   rb   ©rM   r?   r@   Ú@py_format4Ú@py_format6r(   r)   rA   s           r.   Ú0test_model_config_get_known_models_from_registryrg   '   sA  € ä×)Ò)Ó+€Fð Ð ˜&Ñ × × × Ò ˆ;× × Ô ˆ;× × × × × Ô ˜&× × × Ñ ˜&× × × × × × Ó ÙI°V¸KÒ5HÓIÐIŒ3ÐIÓIÐIÕI×I×I×I×I×IÑIŒ3×I×I×IÑIŒ3×I×IÕIÐI×I×IÓIÐI×I×I×I×I×IÒIÙ?¨6°+Ò+>Ó?Ð?Œ3Ð?Ó?Ð?Õ?×?×?×?×?×?Ñ?Œ3×?×?×?Ñ?Œ3×?×?Õ?Ð?×?×?Ó?Ð?×?×?×?×?×?Ó?r0   c                  ó  • [         R                  " 5       n SoU ;   o"(       d¥  [        R                  " SU4SX45      [        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS=pS	 U S    5       n[        U5      of(       d¢  S
S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS=pVg)zêGemini resolves via the registry's 'google' prefix, not the literal 'gemini'.

Guards the prefix mapping: filtering the registry by the bare provider value
would return nothing for Gemini, since the registry groups it under 'google'.
r   r2   rL   rM   rN   rP   rQ   Nc              3   óB   #   • U  H  oR                  S 5      v •  M     g7f)r   NrT   rV   s     r.   rY   ÚKtest_model_config_get_known_models_maps_gemini_to_google.<locals>.<genexpr>:   s   é € ÐFÒ5E¨T�‰˜x×(Ð(Ò5Eùr[   r\   r]   r^   )r   rc   r   r   r   r   r   r   r    r!   r]   rd   s           r.   Ú8test_model_config_get_known_models_maps_gemini_to_googlerk   1   s×   € ô ×)Ò)Ó+€FàÐ�vÑ×××Òˆ8××Ôˆ8×××××Ô�v×××Ñ�v××××××ÓÙF°V¸HÒ5EÓFÐFŒ3ÐFÓFÐFÕF×F×F×F×F×FÑFŒ3×F×F×FÑFŒ3×F×FÕFÐF×F×FÓFÐF×F×F×F×F×FÓFr0   c                  óz  • SSK Jn   [        U " 5       5      n[        R                  R                  5        GH  u  p#[        R                  R                  U5      nUc  M*  U SU 3oUU;   of(       dÄ  [        R                  " SU4SXQ45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  n[        R                  " S	U< S
U S35      S-   SU0-  n[        [        R                   " U5      5      eS=pVGM     g)zãEvery non-local default must be a real model id in pydantic-ai's registry.

Guards against a hardcoded default silently going invalid the way
gemini-1.5-flash did. Ollama has no registry prefix (it is local), so it is
skipped.
r   )Úknown_model_namesNr`   r2   rL   ÚnamesrN   zdefault z for z not in registryz
>assert %(py5)srQ   )Úpydantic_ai.modelsrm   Úsetr   r<   ÚitemsÚREGISTRY_PREFIXESÚgetr   r   r   r   r   r   Ú_format_assertmsgr    r!   )	rm   rn   ÚproviderÚmodelÚprefixr?   r@   re   rf   s	            r.   Ú&test_default_models_are_registry_validrx   =   sÔ   € õ 5äÑ!Ó#Ó$€EÜ&×5Ñ5×;Ñ;×=‰ˆÜ×.Ñ.×2Ñ2°8Ó<ˆØ‰>ÙØ�˜˜5˜'Ð"Ð` eÑ+×`×`×`Ò`Ð"×`×`Ô`Ð"×`×`×`×`×`Ô` e×`×`×`Ñ` e×`×`×`Ò`¨x¸±yÀÀhÀZÐO_Ð-`×`×`×`×`×`×`Ñ`ò	 >r0   c                  óê  • [         R                  " [        R                  0 SS9   [	        SS9n U R
                  nSo!UL o3(       dº  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS=n=p2U R                  nSo!UL o3(       dº  [        R                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS=n=p2SSS5        g! , (       d  f       g= f)z/Test AgentFactory initialization with defaults.T©ÚclearF©Úenable_logfirerG   )z6%(py2)s
{%(py2)s = %(py0)s.enable_logfire
} is %(py5)sÚfactory©r   r   rQ   úassert %(py7)sr   N©z:%(py2)s
{%(py2)s = %(py0)s.logfire_configured
} is %(py5)s)r   ÚdictÚosÚenvironr   r}   r   r   r   r   r   r   r    r!   Úlogfire_configured©r~   r(   Ú@py_assert4r)   rf   r,   s         r.   Ú test_agent_factory_init_defaultsrˆ   N   s  € ä	�Š”B—J‘J ¨$Ó	/Ü¨eÑ4ˆà×%Ñ%Ð.¨Ð.¨Ð.×.×.×.Ò.Ð%×.×.×.×.×.Õ.ˆw×.×.×.Ñ.ˆw×.×.Õ.Ð%×.×.Ó.¨×.×.×.×.×.×.Ó.Ø×)Ñ)Ð2¨UÐ2¨UÐ2×2×2×2Ò2Ð)×2×2×2×2×2Õ2ˆw×2×2×2Ñ2ˆw×2×2Õ2Ð)×2×2Ó2¨U×2×2×2×2×2×2Ó2÷	 
0×	/Ö	/ús   ¥F6G$Ç$
G2c                  óÂ  • [        SS9n U R                  nSo!UL o3(       dº  [        R                  " SU4SX45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=n=p2g	)
z1Test AgentFactory initialization without logfire.Fr|   rG   r�   r~   r   r€   r   N)
r   r…   r   r   r   r   r   r   r    r!   r†   s         r.   Ú'test_agent_factory_init_without_logfirerŠ   W   s   € ä¨%Ñ0€Gà×%Ñ%Ð.¨Ð.¨Ð.×.×.×.Ò.Ð%×.×.×.×.×.Õ.ˆ7×.×.×.Ñ.ˆ7×.×.Õ.Ð%×.×.Ó.¨×.×.×.×.×.×.Ô.r0   Trz   c                  óœ  • [        SS9n U R                  5       nSo!UL o3(       d¥  [        R                  " SU4SX45      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS=p2g)
z)Test provider detection with no API keys.Fr|   NrG   )z%(py0)s is %(py3)sru   ©r   rO   rP   rQ   )
r   Údetect_providerr   r   r   r   r   r   r    r!   )r~   ru   r@   r(   re   rf   s         r.   Ú)test_agent_factorydetect_provider_no_keysrŽ   ^   sw   € ô ¨%Ñ0€Gà×&Ñ&Ó(€HàÐ�tÐ×××Òˆ8×××××Õˆ8×××Ñˆ8××Õ�t××××××Òr0   rD   ztest-keyc                  ó`  • [        SS9n U R                  5       n[        R                  o!U:H  o3(       dø  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS
=p2g
)z+Test provider detection with Anthropic key.Fr|   r	   ©z1%(py0)s == %(py4)s
{%(py4)s = %(py2)s.ANTHROPIC
}ru   r   r^   r;   r5   N©r   r�   r   r   r   r   r   r   r   r   r    r!   ©r~   ru   r)   r(   rA   r=   s         r.   Ú+test_agent_factorydetect_provider_anthropicr“   h   ó¡   € ô ¨%Ñ0€Gà×&Ñ&Ó(€Hä$×.Ñ.Ð.Ð.Ñ.×.×.×.Ò.ˆ8×.×.×.×.×.Õ.ˆ8×.×.×.Ñ.ˆ8×.×.×.×.×.Ö.”}×.×.×.Ñ.”}×.×.Õ.Ð.×.×.×.×.×.×.Ò.r0   rE   c                  ó`  • [        SS9n U R                  5       n[        R                  o!U:H  o3(       dø  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS
=p2g
)z(Test provider detection with OpenAI key.Fr|   r	   )z.%(py0)s == %(py4)s
{%(py4)s = %(py2)s.OPENAI
}ru   r   r^   r;   r5   N)r   r�   r   r"   r   r   r   r   r   r   r    r!   r’   s         r.   Ú(test_agent_factorydetect_provider_openair–   r   s¡   € ô ¨%Ñ0€Gà×&Ñ&Ó(€Hä$×+Ñ+Ð+Ð+Ñ+×+×+×+Ò+ˆ8×+×+×+×+×+Õ+ˆ8×+×+×+Ñ+ˆ8×+×+×+×+×+Ö+”}×+×+×+Ñ+”}×+×+Õ+Ð+×+×+×+×+×+×+Ò+r0   Úkey1Úkey2)rD   rE   c                  ó`  • [        SS9n U R                  5       n[        R                  o!U:H  o3(       dø  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS
=p2g
)z0Test provider detection respects priority order.Fr|   r	   r�   ru   r   r^   r;   r5   Nr‘   r’   s         r.   Ú*test_agent_factorydetect_provider_priorityrš   |   r”   r0   c                  ó¾  • [        SS9n U R                  [        R                  S5      nSo!U:H  o3(       d¥  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS
=p2g
)z+Test formatting model string for Anthropic.Fr|   úclaude-3-5-sonnet-latestr	   ©z%(py0)s == %(py3)sÚresultrŒ   rP   rQ   N©r   Úformat_model_stringr   r   r   r   r   r   r   r   r    r!   ©r~   rž   r@   r(   re   rf   s         r.   Ú/test_agent_factoryformat_model_string_anthropicr¢   †   s‚   € ä¨%Ñ0€Gà×(Ñ(¬×)@Ñ)@ÐB\Ó]€Fà/Ð/Ð/Ñ/×/×/×/Ò/ˆ6×/×/×/×/×/Õ/ˆ6×/×/×/Ñ/ˆ6×/×/Õ/Ð/×/×/×/×/×/×/Ò/r0   c                  ó¾  • [        SS9n U R                  [        R                  S5      nSo!U:H  o3(       d¥  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS
=p2g
)z@Test formatting model string for Anthropic with existing prefix.Fr|   z"anthropic:claude-3-5-sonnet-latestr	   r�   rž   rŒ   rP   rQ   NrŸ   r¡   s         r.   Ú;test_agent_factoryformat_model_string_anthropic_with_prefixr¤   �   s‚   € ä¨%Ñ0€Gà×(Ñ(¬×)@Ñ)@ÐBfÓg€Fà9Ð9Ð9Ñ9×9×9×9Ò9ˆ6×9×9×9×9×9Õ9ˆ6×9×9×9Ñ9ˆ6×9×9Õ9Ð9×9×9×9×9×9×9Ò9r0   c                  ó¾  • [        SS9n U R                  [        R                  S5      nSo!U:H  o3(       d¥  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS=p2g)z(Test formatting model string for OpenAI.Fr|   úgpt-4ozopenai:gpt-4or	   r�   rž   rŒ   rP   rQ   N)r   r    r   r"   r   r   r   r   r   r   r    r!   r¡   s         r.   Ú,test_agent_factoryformat_model_string_openair§   ˜   s   € ä¨%Ñ0€Gà×(Ñ(¬×)=Ñ)=¸xÓH€Fà$Ð$�_Ñ$×$×$×$Ò$ˆ6×$×$×$×$×$Õ$ˆ6×$×$×$Ñ$ˆ6×$×$Õ$�_×$×$×$×$×$×$Ò$r0   c                  ó¾  • [        SS9n U R                  [        R                  S5      nSo!U:H  o3(       d¥  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS=p2g)z&Test formatting model string for Groq.Fr|   zllama-3.1-8b-instantzgroq:llama-3.1-8b-instantr	   r�   rž   rŒ   rP   rQ   N)r   r    r   r#   r   r   r   r   r   r   r    r!   r¡   s         r.   Ú*test_agent_factoryformat_model_string_groqr©   ¡   s‚   € ä¨%Ñ0€Gà×(Ñ(¬×);Ñ);Ð=SÓT€Fà0Ð0Ð0Ñ0×0×0×0Ò0ˆ6×0×0×0×0×0Õ0ˆ6×0×0×0Ñ0ˆ6×0×0Õ0Ð0×0×0×0×0×0×0Ò0r0   c                  ó¾  • [        SS9n U R                  [        R                  S5      nSo!U:H  o3(       d¥  [        R
                  " SU4SX45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS=p2g)z(Test formatting model string for Gemini.Fr|   zgemini-1.5-flashzgemini:gemini-1.5-flashr	   r�   rž   rŒ   rP   rQ   N)r   r    r   r$   r   r   r   r   r   r   r    r!   r¡   s         r.   Ú,test_agent_factoryformat_model_string_geminir«   ª   s‚   € ä¨%Ñ0€Gà×(Ñ(¬×)=Ñ)=Ð?QÓR€Fà.Ð.Ð.Ñ.×.×.×.Ò.ˆ6×.×.×.×.×.Õ.ˆ6×.×.×.Ñ.ˆ6×.×.Õ.Ð.×.×.×.×.×.×.Ò.r0   c                  ó^  • [        SS9n [        R                  " [        S0 S9   U R	                  5       n[        U[        5      o"(       Gd+  SS[        R                  " 5       ;   d  [        R                  " [
        5      (       a  [        R                  " [
        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S	.-  n[        [        R                  " U5      5      eS
nSoDU;   oU(       d¥  [        R                  " SU4SXA45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS
=pESoDU;   oU(       d¥  [        R                  " SU4SXA45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS
=pESoDU;   oU(       d¥  [        R                  " SU4SXA45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS
=pES
S
S
5        g
! , (       d  f       g
= f)z"Test listing all available models.Fr|   rc   ©Úreturn_valuez5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}Ú
isinstancerM   r‚   )r   r:   r   r   Nr   r2   rL   rN   rP   rQ   r   r   )r   r   Úobjectr   Úlist_available_modelsr¯   r‚   r   r   r   r   r   r    r!   r   )r~   rM   r)   rA   r?   r@   re   rf   s           r.   Ú,test_agent_factory_list_available_models_allr²   ³   sÝ  € ä¨%Ñ0€Gä	�Š”kÐ#5ÀBÓ	GØ×.Ñ.Ó0ˆä˜&¤$Ó'Ð'Ö'×'×'×'×'×'Ñ'Œz×'×'×'Ñ'Œz×'×'×'×'×'Ö'˜&×'×'×'Ñ'˜&×'×'×'×'×'Ö'¤$×'×'×'Ñ'¤$×'×'Õ'Ð'×'×'×'×'×'Ñ'ØÐ$˜fÑ$×$×$×$Ò$ˆ{×$×$Ô$ˆ{×$×$×$×$×$Ô$˜f×$×$×$Ñ$˜f×$×$×$×$×$×$Ó$ØÐ!˜6Ñ!×!×!×!Ò!ˆx×!×!Ô!ˆx×!×!×!×!×!Ô!˜6×!×!×!Ñ!˜6×!×!×!×!×!×!Ó!ØÐ˜Ñ×××Òˆv××Ôˆv×××××Ô˜×××Ñ˜××××××Ó÷ 
H×	GÖ	Gús   ¤M1NÎ
N,c                  ót  • [        SS9n [        R                  " [        S0 S9   U R	                  [
        R                  S9nSo"U;   o3(       d¥  [        R                  " SU4SX!45      [        R                  " U5      S	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	S
.-  nSSU0-  n[        [        R                  " U5      5      eS=p#[        U5      nSocU:H  ow(       Gd  [        R                  " SU4SX645      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS	[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS	[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS=n=pvSSS5        g! , (       d  f       g= f)z*Test listing models for specific provider.Fr|   rc   r­   ©ru   r   r2   rL   rM   rN   rP   rQ   Né   r	   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlen©r   r:   rO   r5   r6   r7   )r   r   r°   r   r±   r   r   r   r   r   r   r   r   r    r!   r·   )
r~   rM   r?   r@   re   rf   r+   r‡   r=   r>   s
             r.   Ú:test_agent_factory_list_available_models_specific_providerr¹   À   s/  € ä¨%Ñ0€Gä	�Š”kÐ#5ÀBÓ	GØ×.Ñ.¼×8OÑ8OÐ.ÐPˆàÐ$˜fÑ$×$×$×$Ò$ˆ{×$×$Ô$ˆ{×$×$×$×$×$Ô$˜f×$×$×$Ñ$˜f×$×$×$×$×$×$Ó$Ü�6‹{Ð˜aÐ˜aÑ×××Óˆ{×××××ÕŒs×××ÑŒs×××××Ö�6×××Ñ�6××Õˆ{××Ó˜a××××××Ó÷	 
H×	GÖ	Gús   ¤G<H)È)
H7c                  óØ  • [        SS9n SS/SS/S.n[        R                  " [        SUS	9   U R	                  [
        R                  S
9nUS   nSS/oCU:H  oU(       do  [        R                  " SU4SX445      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=n=pTSSS5        g! , (       d  f       g= f)z4Test listing models when known_models are available.Fr|   rœ   zclaude-3-5-haiku-latestr¦   zgpt-4o-mini)r   r   rc   r­   r´   r   r	   r8   r9   r;   r5   N)r   r   r°   r   r±   r   r   r   r   r   r    r!   )r~   Úmock_known_modelsrM   r?   r)   r@   rA   r=   s           r.   Ú:test_agent_factory_list_available_models_with_known_modelsr¼   Ë   sº   € ä¨%Ñ0€Gð 1Ð2KÐLØ˜]Ð+ñÐô
 
�Š”kÐ#5ÐDUÓ	VØ×.Ñ.¼×8OÑ8OÐ.ÐPˆà�kÑ"Ð]Ð'AÐC\Ð&]Ð]Ð&]Ñ]×]×]×]Ò]Ð"×]×]Ô]Ð"×]×]Ó]Ð&]×]×]×]×]×]×]Ó]÷ 
W×	VÖ	Vús   ­B%CÃ
C)c                  ó  • [        SS9n U R                  5       n[        R                  o"R                  o3U;   oD(       Gd  [
        R                  " SU4SX145      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSS	U0-  n[        [
        R                  " U5      5      eS
=n=p4[        R                  o"R                  o3U;  oD(       Gd  [
        R                  " SU4SX145      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSS	U0-  n[        [
        R                  " U5      5      eS
=n=p4g
)z2Test getting available providers with no API keys.Fr|   r2   ©zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.OLLAMA
}.value
} in %(py6)sr   Ú	providersr4   r6   r7   N)únot in)zP%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.ANTHROPIC
}.value
} not in %(py6)s)r   Úget_available_providersr   r'   r   r   r   r   r   r   r   r    r!   r   ©r~   r¿   r(   r)   r+   r=   r>   s          r.   Ú/test_agent_factory_get_available_providers_nonerÃ   Ú   sP  € ô ¨%Ñ0€Gà×/Ñ/Ó1€Iä×ÑÐ2×%Ñ%Ð2¨Ñ2×2×2×2Ó2Ð%×2×2×2×2×2Õ2Œ=×2×2×2Ñ2Œ=×2×2Õ2Ð×2×2Ó2Ð%×2×2×2×2×2Ô2¨×2×2×2Ñ2¨×2×2×2×2×2×2Õ2Ü×"Ñ"Ð9×(Ñ(Ð9°	Ñ9×9×9×9Ó9Ð(×9×9×9×9×9Õ9Œ=×9×9×9Ñ9Œ=×9×9Õ9Ð"×9×9Ó9Ð(×9×9×9×9×9Ô9°	×9×9×9Ñ9°	×9×9×9×9×9×9Ö9r0   c                  ó  • [        SS9n U R                  5       n[        R                  o"R                  o3U;   oD(       Gd  [
        R                  " SU4SX145      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSS	U0-  n[        [
        R                  " U5      5      eS
=n=p4[        R                  o"R                  o3U;   oD(       Gd  [
        R                  " SU4SX145      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSS	U0-  n[        [
        R                  " U5      5      eS
=n=p4g
)z4Test getting available providers with Anthropic key.Fr|   r2   ©zL%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.ANTHROPIC
}.value
} in %(py6)sr   r¿   r4   r6   r7   Nr¾   )r   rÁ   r   r   r   r   r   r   r   r   r   r    r!   r'   rÂ   s          r.   Ú4test_agent_factory_get_available_providers_anthropicrÆ   å   sP  € ô ¨%Ñ0€Gà×/Ñ/Ó1€Iä×"Ñ"Ð5×(Ñ(Ð5¨IÑ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¨I×5×5×5Ñ5¨I×5×5×5×5×5×5Õ5Ü×ÑÐ2×%Ñ%Ð2¨Ñ2×2×2×2Ó2Ð%×2×2×2×2×2Õ2Œ=×2×2×2Ñ2Œ=×2×2Õ2Ð×2×2Ó2Ð%×2×2×2×2×2Ô2¨×2×2×2Ñ2¨×2×2×2×2×2×2Ö2r0   c                  ó†  • [        SS9n U R                  5       n[        R                  o"R                  o3U;   oD(       Gd  [
        R                  " SU4SX145      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSS	U0-  n[        [
        R                  " U5      5      eS
=n=p4[        R                  o"R                  o3U;   oD(       Gd  [
        R                  " SU4SX145      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSS	U0-  n[        [
        R                  " U5      5      eS
=n=p4[        R                  o"R                  o3U;   oD(       Gd  [
        R                  " SU4SX145      S[        R                  " 5       ;   d  [
        R                  " [        5      (       a  [
        R                  " [        5      OS[
        R                  " U5      [
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OSS.-  nSS	U0-  n[        [
        R                  " U5      5      eS
=n=p4g
)z4Test getting available providers with multiple keys.Fr|   r2   rÅ   r   r¿   r4   r6   r7   N)zI%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.OPENAI
}.value
} in %(py6)sr¾   )r   rÁ   r   r   r   r   r   r   r   r   r   r    r!   r"   r'   rÂ   s          r.   Ú3test_agent_factory_get_available_providers_multiplerÈ   ð   sê  € ô ¨%Ñ0€Gà×/Ñ/Ó1€Iä×"Ñ"Ð5×(Ñ(Ð5¨IÑ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¨I×5×5×5Ñ5¨I×5×5×5×5×5×5Õ5Ü×ÑÐ2×%Ñ%Ð2¨Ñ2×2×2×2Ó2Ð%×2×2×2×2×2Õ2Œ=×2×2×2Ñ2Œ=×2×2Õ2Ð×2×2Ó2Ð%×2×2×2×2×2Ô2¨×2×2×2Ñ2¨×2×2×2×2×2×2Õ2Ü×ÑÐ2×%Ñ%Ð2¨Ñ2×2×2×2Ó2Ð%×2×2×2×2×2Õ2Œ=×2×2×2Ñ2Œ=×2×2Õ2Ð×2×2Ó2Ð%×2×2×2×2×2Ô2¨×2×2×2Ñ2¨×2×2×2×2×2×2Ö2r0   c                  óô  • [        [        5      n [        U 5      nSo!U:H  o3(       Gd  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS	=n=p2[        R                  ofU ;   ow(       dø  [        R                  " S
U4SX`45      S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS	=pg[        R                  ofU ;   ow(       dø  [        R                  " S
U4SX`45      S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS	=pg[        R                  ofU ;   ow(       dø  [        R                  " S
U4SX`45      S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS	=pgg	)z1Test that we can iterate over ModelProvider enum.é   r	   r¶   r·   r¿   r¸   r6   r7   Nr2   )z1%(py2)s
{%(py2)s = %(py0)s.ANTHROPIC
} in %(py4)sr   r^   r;   r5   )z.%(py2)s
{%(py2)s = %(py0)s.OLLAMA
} in %(py4)s)z+%(py2)s
{%(py2)s = %(py0)s.XAI
} in %(py4)s)Úlistr   r·   r   r   r   r   r   r   r    r!   r   r'   ÚXAI)	r¿   r@   r+   r‡   r=   r>   r(   r)   rA   s	            r.   Ú"test_model_provider_enum_iterationrÍ   ü   s,  € ä”]Ó#€Iäˆy‹>Ð˜RÐ˜RÑ×××Óˆ>×××××ÕŒ3×××ÑŒ3×××××Öˆy×××Ñˆy××Õˆ>××Ó˜R××××××ÓÜ×"Ñ"Ð/ iÑ/×/×/×/Ò/Ð"×/×/×/×/×/Õ/Œ=×/×/×/Ñ/Œ=×/×/Õ/Ð"×/×/×/×/×/Ô/ i×/×/×/Ñ/ i×/×/×/×/×/×/Ó/Ü×ÑÐ, 9Ñ,×,×,×,Ò,Ð×,×,×,×,×,Õ,Œ=×,×,×,Ñ,Œ=×,×,Õ,Ð×,×,×,×,×,Ô, 9×,×,×,Ñ, 9×,×,×,×,×,×,Ó,Ü×ÑÐ) 	Ñ)×)×)×)Ò)Ð×)×)×)×)×)Õ)Œ=×)×)×)Ñ)Œ=×)×)Õ)Ð×)×)×)×)×)Ô) 	×)×)×)Ñ) 	×)×)×)×)×)×)Ô)r0   c                  óž  • [          GHB  n [        R                  oU;   o"(       dø  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OSS[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=p![        R                  U    n[        U[        5      oU(       dõ  S	S
[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS
[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eS=p%[        R                  U    n[        U5      nSoqU:„  oˆ(       d×  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n	SSU	0-  n
[        [        R                  " U
5      5      eS=n=n=p‡GME     g)z7Test that all providers have default models configured.r2   )z6%(py0)s in %(py4)s
{%(py4)s = %(py2)s.DEFAULT_MODELS
}ru   r   r^   r;   r5   Nz5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}r¯   Ústr)r   r   rO   rQ   r   )Ú>)z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)sr·   r   r   r   )r   r   r<   r   r   r   r   r   r   r    r!   r¯   rÏ   r·   )ru   r)   r(   rA   r=   r‡   rf   r*   r+   r,   r-   s              r.   Ú-test_model_config_all_providers_have_defaultsrÑ     s´  € ç!�MˆÜ&×5Ñ5Ð5Ð5Ñ5×5×5×5Ò5ˆx×5×5×5×5×5Õ5ˆx×5×5×5Ñ5ˆx×5×5×5×5×5Ö5œ;×5×5×5Ñ5œ;×5×5Õ5Ð5×5×5×5×5×5×5Ñ5Ü%×4Ñ4°XÑ>ÐDŒzÐ>ÄÓDÐDÕD×D×D×D×D×DÑDŒz×D×D×DÑDŒz×D×DÕDÐ>×D×D×D×D×DÔDÄ×D×D×DÑDÄ×D×DÕDÐD×D×D×D×D×DÒDÜ×-Ñ-¨hÑ7Ð<ŒsÐ7Ó8Ð<¸1Ð<¸1Ñ<×<×<×<Ò<Ð8×<×<×<×<×<Õ<Œs×<×<×<Ñ<Œs×<×<Õ<Ð7×<×<Ó<Ð8×<×<Ó<¸1×<×<×<×<×<×<×<Ð<ò "r0   c                  óÆ  • [          GHV  n [        R                  oU;   o"(       dø  [        R                  " SU4SX45      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OSS[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS=p![        R                  U    n/ nSoeUL ooq(       d  [        U[        5      oˆnU(       Gdú  [        R                  " S	U4S
XV45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  n	SSU	0-  o¢R                  U
5        U(       Gd  SS[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[
        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " W5      S.-  o²R                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS=n=n=n=phGMY     g)z7Test that all providers have API key variable mappings.r2   )z4%(py0)s in %(py4)s
{%(py4)s = %(py2)s.API_KEY_VARS
}ru   r   r^   r;   r5   NrG   )z%(py2)s is %(py5)sÚapi_key_var)r   rQ   z%(py7)sr   z2%(py13)s
{%(py13)s = %(py9)s(%(py10)s, %(py11)s)
}r¯   rÏ   )r   Úpy10Úpy11Úpy13rµ   zassert %(py16)sÚpy16)r   r   rI   r   r   r   r   r   r   r    r!   r¯   rÏ   ÚappendÚ_format_boolop)ru   r)   r(   rA   r=   rÓ   r‡   r?   Ú@py_assert12rf   r,   Ú@py_format14Ú@py_format15Ú@py_format17s                 r.   Ú1test_model_config_all_providers_have_api_key_varsrÞ     sŸ  € ç!�MˆÜ&×3Ñ3Ð3Ð3Ñ3×3×3×3Ò3ˆx×3×3×3×3×3Õ3ˆx×3×3×3Ñ3ˆx×3×3×3×3×3Ö3œ;×3×3×3Ñ3œ;×3×3Õ3Ð3×3×3×3×3×3×3Ñ3Ü!×.Ñ.¨xÑ8ˆÙB˜dÐB˜dÐ"×B¤j°¼cÓ&B×B×B×BÕBˆ{×B×B×B×B×BÕBˆ{×B×B×BÑBˆ{×B×BÕB˜d×B×B×B×B×B×B×B×B×B×BÑB¤j×B×B×BÑB¤j×B×B×B×B×BÖB°×B×B×BÑB°×B×B×B×B×BÖB¼c×B×B×BÑB¼c×B×BÕBÐ&B×B×B×B×B×B×B×B×B×B×B×B×BÔBò "r0   )*Ú__doc__Úbuiltinsr   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   rƒ   Úunittest.mockr   Úquber.agents.factoryr   r   r   r/   rB   rJ   rg   rk   rx   rˆ   rŠ   r‚   r„   rŽ   r“   r–   rš   r¢   r¤   r§   r©   r«   r²   r¹   r¼   rÃ   rÆ   rÈ   rÍ   rÑ   rÞ   ra   r0   r.   Ú<module>ræ      s˜  ðÙ Hç  „ ƒ	Ý ç IÑ Iò2òNòBò@ò	Gòaò"3ò/ð ‡‚ˆB�J‰J˜ $Ñ'ñó (ðð ‡‚ˆB�J‰JÐ,¨jÐ9Ó:ñ/ó ;ð/ð ‡‚ˆB�J‰JÐ)¨:Ð6¸dÑCñ,ó Dð,ð ‡‚ˆB�J‰J¨fÈÑOÓPñ/ó Qð/ò0ò:ò%ò1ò/ò
 ò ò^ð ‡‚ˆB�J‰J˜ $Ñ'ñ:ó (ð:ð ‡‚ˆB�J‰JÐ,¨jÐ9Ó:ñ3ó ;ð3ð ‡‚ˆB�J‰J¨fÈÑOÓPñ3ó Qð3ò*ò=óCr0   