ó
    À‘´j32  ã                   óÐ   • S r SSKrSSKJr  SSKJrJrJrJrJ	r	J
r
  SSKrSSKJr  SSKJr  SSKJr  Sq\
" S	\S
9rSrS\S\4S jr " S S\\5      r " S S5      r " S S5      rg)zN
Agent Factory for creating PydanticAI agents with different model providers.
é    N)ÚEnum)ÚAnyÚDictÚListÚOptionalÚTypeÚTypeVar)Ú	BaseModel)ÚAgent)Úget_settingsFÚOutputT)Úbound)zsonnet-5zopus-4-7zopus-4-8zopus-5ÚfableÚmythosÚmodel_idÚreturnc                 ó`   ^• U R                  5       m[        U4S j[         5       5      (       + $ )z:Whether the model accepts an explicit temperature setting.c              3   ó,   >#   • U  H	  oT;   v •  M     g 7f©N© )Ú.0ÚmarkerÚlowereds     €Ú2/home/mande/repo/quber/src/quber/agents/factory.pyÚ	<genexpr>Ú0supports_sampling_temperature.<locals>.<genexpr>#   s   øé € ÐMÒ3L¨˜WÖ$Ò3Lùs   ƒ)ÚlowerÚanyÚNO_SAMPLING_MODEL_MARKERS)r   r   s    @r   Úsupports_sampling_temperaturer        s$   ø€ à�n‰nÓ€GÜÔMÕ3LÓMÓMÔMÐMó    c                   óH   • \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrg)ÚModelProvideré&   zSupported model providers.Ú	anthropicÚopenaiÚgroqÚgeminiÚvertexaiÚbedrockÚollamaÚxaiÚmistralÚdeepseekÚcohereÚcerebrasr   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú	ANTHROPICÚOPENAIÚGROQÚGEMINIÚVERTEXAIÚBEDROCKÚOLLAMAÚXAIÚMISTRALÚDEEPSEEKÚCOHEREÚCEREBRASÚ__static_attributes__r   r!   r   r#   r#   &   sA   † Ù$à€IØ€FØ€DØ€FØ€HØ€GØ€FØ
€CØ€GØ€HØ€FØƒHr!   r#   c                   ó”  • \ rS rSrSr\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S	\R                  S
\R                  S\R                   S\R"                  S0r\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                   S\R"                  S0r\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S\R                  S \R                  S!\R                  S"\R                   S#\R"                  S$0r\S%\\\\   4   4S& j5       rS'rg)(ÚModelConfigé7   zModel configuration mappings.zclaude-haiku-4-5zgpt-4.1-minizllama-3.3-70b-versatilezgemini-2.5-flashz(anthropic.claude-haiku-4-5-20251001-v1:0zllama3.2zgrok-4-fastzmistral-small-latestzdeepseek-chatzcommand-r-plus-08-2024zgpt-oss-120bÚANTHROPIC_API_KEYÚOPENAI_API_KEYÚGROQ_API_KEYÚGEMINI_API_KEYÚGOOGLE_APPLICATION_CREDENTIALSÚAWS_ACCESS_KEY_IDNÚXAI_API_KEYÚMISTRAL_API_KEYÚDEEPSEEK_API_KEYÚ
CO_API_KEYÚCEREBRAS_API_KEYr%   r&   r'   Úgooglezgoogle-cloudr*   r,   r-   r.   r/   r0   r   c                 óÎ   ^• SSK Jn  U" 5       n0 nU R                  R                  5        H6  u  pEU S3m[	        U4S jU 5       5      nU(       d  M(  XcUR
                  '   M8     U$ )aæ  Model names per provider, taken from pydantic-ai's model registry.

pydantic-ai maintains the authoritative set of recognized model ids and
refreshes it on each release, so this tracks model availability with the
pinned pydantic-ai version rather than a hand-kept file. The registry
returns "provider:model" ids; we group them under our own provider
values via ``REGISTRY_PREFIXES`` and strip the prefix.

Returns:
    Dictionary mapping provider value to a sorted list of model names.
r   )Úknown_model_namesÚ:c              3   ón   >#   • U  H*  oR                  T5      (       d  M  U[        T5      S  v •  M,     g 7fr   )Ú
startswithÚlen)r   ÚnameÚheads     €r   r   Ú/ModelConfig.get_known_models.<locals>.<genexpr>…   s)   øé € ÐYº%°$Ç?Á?ÐSW×CXÓ-˜D¤ T£ Õ-º%ùs   ƒ5 5)Úpydantic_ai.modelsrS   ÚREGISTRY_PREFIXESÚitemsÚsortedÚvalue)ÚclsrS   ÚnamesÚby_providerÚproviderÚprefixÚmodelsrY   s          @r   Úget_known_modelsÚModelConfig.get_known_modelsr   se   ø€ õ 	9á!Ó#ˆØ,.ˆØ #× 5Ñ 5× ;Ñ ;Ö =ÑˆHØ�X˜Q�<ˆDÜÔY¹%ÓYÓYˆFßˆvØ.4˜HŸN™NÓ+ñ	 !>ð
 Ðr!   r   )r1   r2   r3   r4   r5   r#   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   ÚDEFAULT_MODELSÚAPI_KEY_VARSr\   Úclassmethodr   Ústrr   rf   rB   r   r!   r   rD   rD   7   sÙ  † Ù'ð 	×ÑÐ!3Ø×Ñ˜nØ×ÑÐ5Ø×ÑÐ0Ø×ÑÐ 2Ø×ÑÐIØ×Ñ˜jØ×Ñ˜=Ø×ÑÐ5Ø×Ñ Ø×ÑÐ6Ø×Ñ ð€Nð" 	×ÑÐ!4Ø×ÑÐ.Ø×Ñ˜NØ×ÑÐ.Ø×ÑÐ @Ø×ÑÐ2Ø×Ñ˜dØ×Ñ˜=Ø×ÑÐ0Ø×ÑÐ 2Ø×Ñ˜lØ×ÑÐ 2ð€Lð* 	×Ñ Ø×Ñ˜hØ×Ñ˜FØ×Ñ˜hØ×Ñ Ø×Ñ˜yØ×Ñ˜5Ø×Ñ˜yØ×Ñ 
Ø×Ñ˜hØ×Ñ 
ðÐð ð  c¨4°©9 nÑ!5ó ó ór!   rD   c                   óÚ   • \ rS rSrSrSS\4S jjr  SS\\   S\	S\
\   S	\
\	   S
\S\\\4   4S jjrS\
\   4S jrS\S	\	S\	4S jrSS\
\   S\\	\\	   4   4S jjrS\\	   4S jrSrg)ÚAgentFactoryé‹   zó
Factory for creating PydanticAI agents with different model providers.

This factory provides a unified interface for creating agents that can work
with various LLM providers, automatically handling API key configuration
and model selection.
Úenable_logfirec                 óJ  • Xl         [        5       R                  R                  nU(       aq  U(       aj  [        (       dW  [
        R                  " SUSS9  [
        R                  " 5         [
        R                  " 5         [
        R                  " 5         SqSU l
        gSU l
        g)z^
Initialize the Agent Factory.

Args:
    enable_logfire: Whether to enable logfire telemetry
ÚquberF)Úservice_nameÚtokenÚconsoleTN)ro   r   ÚobsÚlogfire_tokenÚ_logfire_configuredÚlogfireÚ	configureÚinstrument_anthropicÚinstrument_openaiÚinstrument_pydantic_aiÚlogfire_configured)Úselfro   rv   s      r   Ú__init__ÚAgentFactory.__init__”   s{   € ð -ÔÜ$›×*Ñ*×8Ñ8ˆÞžmß&Ò&Ü×!Ò!Ø!(Ø'Ø!òô
 ×,Ò,Ô.Ü×)Ò)Ô+Ü×.Ò.Ô0Ø&*Ð#Ø&*ˆDÕ#à&+ˆDÕ#r!   NÚoutput_typeÚsystem_promptrc   ÚmodelÚagent_kwargsr   c           	      óD  • U(       aK  SU;   aE  UR                  SS5      u  pg[         H'  nUR                  UR                  5       :X  d  M#  UnUn  O   Uce  U R	                  5       nUcR  [        SSR                  [        R                  R                  5        V	s/ s H  o™(       d  M  U	PM     sn	5      -   5      e[        R                  R                  U5      n
U
(       a)  [        R                  " U
5      (       d  [        SU
 35      eUc  [        R                  U   nU R                  X45      nU R                  (       a9  [         R"                  " SUR                  US9   [%        U4XS	.UD6nSSS5        U$ [%        U4XS	.UD6nU$ s  sn	f ! , (       d  f       W$ = f)
aø  
Create a PydanticAI agent with the specified configuration.

Args:
    output_type: The Pydantic model for structured output
    system_prompt: System prompt for the agent
    provider: Model provider to use (auto-detected if not specified)
    model: Specific model to use (uses default if not specified)
    **agent_kwargs: Additional kwargs to pass to Agent constructor

Returns:
    Configured PydanticAI Agent instance

Raises:
    ValueError: If no valid API key is found or invalid configuration
rT   é   Nz%No API key found. Please set one of: z, zAPI key not found: Úcreate_agent)rc   rƒ   )r�   r‚   )Úsplitr#   r_   r   Údetect_providerÚ
ValueErrorÚjoinrD   ri   ÚvaluesÚgetÚosÚgetenvrh   Úformat_model_stringr}   rx   Úspanr   )r~   r�   r‚   rc   rƒ   r„   Úprovider_strÚ
model_nameÚpÚvÚapi_key_varÚ	model_strÚagents                r   r‡   ÚAgentFactory.create_agent­   s†  € ö2 �S˜E“\Ø',§{¡{°3¸Ó':Ñ$ˆLç"�Ø—7‘7˜l×0Ñ0Ó2Õ2Ø �HØ&�EÙñ	 #ð ÑØ×+Ñ+Ó-ˆHØÑÜ Ø;Ø—i‘i¬K×,DÑ,D×,KÑ,KÔ,MÓ SÒ,M qÓQR§Ñ,MÑ SÓTñUóð ô "×.Ñ.×2Ñ2°8Ó<ˆÞœrŸyšy¨×5Ñ5ÜÐ2°;°-Ð@ÓAÐAð ‰=Ü×.Ñ.¨xÑ8ˆEð ×,Ñ,¨XÓ=ˆ	ð ×"×"Ü—’˜n°x·~±~ÈUÓSÜ˜iÐn°[ÑnÐamÑn�÷ Tð
 ˆô ˜)Ðj°ÑjÐ]iÑjˆEàˆùò7 !T÷, TÔSð
 ˆús   Â
FÂ(FÅ"FÆ
Fc                 ól  • [         R                  [         R                  [         R                  [         R                  /nU[          Vs/ s H  o"U;  d  M
  UPM     sn-   nU HJ  n[
        R                  R                  U5      nU(       d  M+  [        R                  " U5      (       d  MH  Us  $    gs  snf )z„
Auto-detect available provider based on environment variables.

Returns:
    First available provider or None if no API keys found
N)
r#   r6   r7   r8   r9   rD   ri   r�   rŽ   r�   )r~   Úpriorityr”   Úorderedrc   Úkey_vars         r   r‰   ÚAgentFactory.detect_providerò   s’   € ô ×#Ñ#Ü× Ñ Ü×ÑÜ× Ñ ð	
ˆð ­ÓLª AÀ8Ñ:KŸa©ÑLÑLˆãˆHÜ!×.Ñ.×2Ñ2°8Ó<ˆGßˆwœ2Ÿ9š9 W×-Ó-Ø’ñ  ð
 ùò Ms   Á	B1ÁB1c                 ó€   • U[         R                  :X  a  UR                  S5      (       a  U$ U$ UR                   SU 3$ )z­
Format model string for PydanticAI based on provider.

Args:
    provider: The model provider
    model: The model name

Returns:
    Formatted model string for PydanticAI
z
anthropic:rT   )r#   r6   rV   r_   )r~   rc   rƒ   s      r   r�   Ú AgentFactory.format_model_string  sE   € ð ”}×.Ñ.Ó.à×Ñ ×-Ñ-Ø�àˆLð —.‘.Ð!  5 'Ð*Ð*r!   c                 ó€  • [         R                  5       nU(       aI  UR                  nUR                  U/ 5      nU(       d!  [         R                  R                  US5      /nX40$ 0 n[
         HM  nUR                  nUR                  U/ 5      nU(       d!  [         R                  R                  US5      /nXEU'   MO     U$ )z©
List available models for each provider.

Args:
    provider: Specific provider to list models for (all if None)

Returns:
    Dictionary of provider -> list of models
zNo models found)rD   rf   r_   r�   rh   r#   )r~   rc   Úknown_modelsÚprovider_namere   Úresultr”   s          r   Úlist_available_modelsÚ"AgentFactory.list_available_models"  s²   € ô #×3Ñ3Ó5ˆæØ$ŸN™NˆMØ!×%Ñ% m°RÓ8ˆFæÜ%×4Ñ4×8Ñ8¸ÐCTÓUÐV�Ø!Ð*Ð*ð ˆßˆAØŸG™GˆMØ!×%Ñ% m°RÓ8ˆFæÜ%×4Ñ4×8Ñ8¸Ð<MÓNÐO�Ø$*�=Ó!ñ ð ˆr!   c                 ó>  • / n[          H�  n[        R                  R                  U5      nUc3  U[         R                  :X  a  UR                  UR                  5        MV  MX  [        R                  " U5      (       d  Mu  UR                  UR                  5        M’     U$ )z`
Get list of providers with configured API keys.

Returns:
    List of available provider names
)	r#   rD   ri   r�   r<   Úappendr_   rŽ   r�   )r~   Ú	availablerc   r–   s       r   Úget_available_providersÚ$AgentFactory.get_available_providersC  s}   € ð ˆ	ß%ˆHÜ%×2Ñ2×6Ñ6°xÓ@ˆKàÑ"àœ}×3Ñ3Ó3Ø×$Ñ$ X§^¡^Ö4ñ 4ä—’˜;×'Ó'Ø× Ñ  §¡Ö0ñ &ð Ðr!   )ro   r}   )T)NNr   )r1   r2   r3   r4   r5   Úboolr   r   r   rk   r   r#   r   r   r‡   r‰   r�   r   r   r¥   Úlistrª   rB   r   r!   r   rm   rm   ‹   sß   † ññ, tõ ,ð: -1Ø#ñCà˜'‘]ðCð ðCð ˜=Ñ)ð	Cð
 ˜‰}ðCð ðCð 
ˆs�Gˆ|Ñ	õCðJ ¨-Ñ!8ô ð2+¨Mð +À#ð +È#ô +ñ.¨h°}Ñ.Eð ÐQUÐVYÐ[_Ð`cÑ[dÐVdÑQeõ ðB¨¨c©÷ r!   rm   )r5   rŽ   Úenumr   Útypingr   r   r   r   r   r	   rx   Úpydanticr
   Úpydantic_air   Úquber.settingsr   rw   r   r   rk   r¬   r    r#   rD   rm   r   r!   r   Ú<module>r³      s{   ðñó 
Ý ß ;× ;ã Ý Ý å 'àÐ á
�) 9Ñ
-€ð
Ð ðN¨Cð N°Dô Nô�C˜ô ÷"Qñ Q÷hIò Ir!   