Ë
    tPêjUG  ã                   ó’  — d dl Z d dlmZ d dlmZmZ d dlZd dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d dlmZ d dlmZ  eej8                  «      Z eej8                  «      Zdedefd„Z d/dededz  de!e   dz  fd„Z"	 	 d0de#ee!e   f   de!e   dedz  dee   dz  de!e   f
d„Z$dede!e   fd„Z%	 	 d1dede!e   de#ee!e   f   dedz  dedz  de!e   fd„Z&	 d2de!e   de!e   de#ee!e   f   dedz  de!e   f
d„Z'ddi dddfdee   dee   de!e   d edz  d!edz  d"edz  d#edz  de#ee!e   f   dedz  dedz  d$edz  de!e   fd%„Z(dedz  dedz  fd&„Z)d/d'ededz  de!e   fd(„Z*d)e!e#eef      de!e#eef      fd*„Z+	 	 	 d3d+e!e   d"edz  d#edz  d$edz  de!e   f
d,„Z,	 	 d4ded#edz  d-ede!e   fd.„Z-y)5é    N)ÚSequence)ÚAnyÚFinal)Úverbose_proxy_logger)ÚCredentialAccessor)ÚSpecialModelNamesÚUserAPIKeyAuth)ÚObjectPermissionRepository)ÚRouter)Úget_fallback_model_group)ÚCredentialLiteLLMParamsÚLiteLLM_Params)ÚLlmProviders)Úget_valid_modelsÚmodelÚreturnc                 ó   — d| v ryy)zk
    Returns True if a model is a provider wildcard.

    eg:
    - anthropic/*
    - openai/*
    - *
    Ú*TF© ©r   s    úd/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/auth/model_checks.pyÚ_check_wildcard_routingr      s   € ð ˆe�|ØØó    ÚproviderÚlitellm_paramsc                 óh   — | dk(  rt        |¬«      S | t        j                  v rt        | |¬«      }|S y)z6
    Returns the list of known models by provider
    r   )r   )Úcustom_llm_providerr   N)r   ÚlitellmÚmodels_by_provider)r   r   Úprovider_modelss      r   Úget_provider_modelsr!   &   s:   € ð �3‚Ü¨~Ô>Ð>à”7×-Ñ-Ñ-Ü!1ÀhÐ_mÔ!nˆØÐØr   FÚmodel_access_groupsÚ
all_modelsÚinclude_model_access_groupsÚproxy_model_listc                 ó²   — t        |xs d«      }|D �cg c]  }|| vs|s||v r|‘Œ }}|D ��cg c]  }|| v sŒ| |   D ]  }|‘Œ Œ }}}||z   S c c}w c c}}w )Nr   )Ú	frozenset)	r"   r#   r$   r%   Údeployed_model_namesr   Úkept_modelsÚmemberÚmember_modelss	            r   Ú_get_models_from_access_groupsr,   3   sœ   € ô #,Ð,<Ò,BÀÓ"CÐð  öàØÐ+Ñ+Ñ/JÈeÐWkÑNkò 	ð€Kð ð '÷Ø¨%Ð3FÒ*FÐUhÐinÑUoòØKQŠðØð€Mñ ð ˜Ñ&Ð&ùòùó
s   ”A®	A¸AÚuser_api_key_dictc              ƒ   ó  K  — ddl m} |€g S | j                  €g S 	 t        |«      j                  j                  d| j                  i¬«      ƒ d{  –—† }|r|j                  r|j                  S g S 7 Œ # t        $ r g cY S w xY w­w)zd
    Returns the list of MCP server ids for a given key by querying the object_permission table
    r   )Úprisma_clientNÚobject_permission_id)Úwhere)Úlitellm.proxy.proxy_serverr/   r0   r
   ÚtableÚfind_uniqueÚmcp_serversÚ	Exception)r-   r/   Úresults      r   Úget_mcp_server_idsr8   G   s™   è ø€ õ 9àÐØˆ	à×-Ñ-Ð5Øˆ	ðÜ8¸ÓG×MÑM×YÑYØ)Ð+<×+QÑ+QÐRð Zó 
÷ 
ˆñ �f×(Ò(Ø×%Ñ%Ð%Øˆ	ð
ùô ò ØŠ	ðüsF   ‚Bœ4A3 ÁA1ÁA3 Á.BÁ/A3 Á0BÁ1A3 Á3BÁ>BÂ BÂBÚonly_model_access_groupsc                 óð  — g }t        | j                  «      dkD  �r	t        | j                  «      }t        j                  j
                  |v r�t        | j                  «      }t        j                  j
                  |v r_|D �cg c]"  }|t        j                  j
                  k7  sŒ!|‘Œ$ }}|j                  |«       |r|j                  |j                  «       «       t        j                  j
                  |v r,t        |«      }|r|j                  |j                  «       «       t        ||||¬«      }t        t        j                  |«      «      }t        j                  dt        |«      «       |S c c}w )ai  
    Returns:
    - List of model name strings
    - Empty list if no models set
    - If model_access_groups is provided, only return models that are in the access groups
    - If include_model_access_groups is True, it includes the 'keys' of the model_access_groups
      in the response - {"beta-models": ["gpt-4", "claude-v1"]} -> returns 'beta-models'
    r   ©r"   r#   r$   r%   zALL KEY MODELS - %s)ÚlenÚmodelsÚlistr   Úall_team_modelsÚvalueÚteam_modelsÚextendÚkeysÚall_proxy_modelsr,   ÚdictÚfromkeysr   Údebug)r-   r%   r"   r$   r9   r#   r   s          r   Úget_key_modelsrH   a   s>  € ð €JÜ
Ð×#Ñ#Ó$ qÓ(ÜÐ+×2Ñ2Ó3ˆ
Ü×,Ñ,×2Ñ2°jÑ@ÜÐ/×;Ñ;Ó<ˆJÜ ×0Ñ0×6Ñ6¸*ÑDØ1;Öp¨¸uÔHY×HiÑHi×HoÑHoÓ?ošeÐp�
ÐpØ×!Ñ!Ð"2Ô3Ù.Ø×%Ñ%Ð&9×&>Ñ&>Ó&@ÔAÜ×-Ñ-×3Ñ3°zÑAÜÐ.Ó/ˆJÙ*Ø×!Ñ!Ð"5×":Ñ":Ó"<Ô=ä/Ø/ØØ$?Ø)ô	€Jô ”d—m‘m JÓ/Ó0€Jä×ÑÐ4´c¸*³oÔFØÐùò) qs   Â"E3Â%E3rA   c                 ó®  — t        «       }t        | «      dkD  rç|j                  | «       t        j                  j
                  |v rl|j                  | «       |j                  t        j                  j
                  «       |j                  |«       |r|j                  |j                  «       «       t        j                  j
                  |v r2|j                  |«       |r|j                  |j                  «       «       t        |t        |«      ||¬«      }t        t        j                  |«      «      }t        j                  dt        |«      «       |S )z°
    Returns:
    - List of model name strings
    - Empty list if no models set
    - If model_access_groups is provided, only return models that are in the access groups
    r   r;   zALL TEAM MODELS - %s)Úsetr<   Úupdater   r?   r@   ÚdiscardrC   rD   r,   r>   rE   rF   r   rG   )rA   r%   r"   r$   Úall_models_setr#   s         r   Úget_team_modelsrN   �   s  € ô '*£e€NÜ
ˆ;Ó˜!ÒØ×Ñ˜kÔ*Ü×,Ñ,×2Ñ2°nÑDØ×!Ñ! +Ô.ð ×"Ñ"Ô#4×#DÑ#D×#JÑ#JÔKØ×!Ñ!Ð"2Ô3Ù*Ø×%Ñ%Ð&9×&>Ñ&>Ó&@ÔAÜ×-Ñ-×3Ñ3°~ÑEØ×!Ñ!Ð"2Ô3Ù*Ø×%Ñ%Ð&9×&>Ñ&>Ó&@ÔAä/Ø/Ü˜Ó'Ø$?Ø)ô	€Jô ”d—m‘m JÓ/Ó0€Jä×ÑÐ5´s¸:³ÔGØÐr   Ú
key_modelsÚ
user_modelÚinfer_model_from_keysÚreturn_wildcard_routesÚ
llm_routerÚteam_idc                 óB  ‡— 	 g Šˆfd„}| r	 || «       nS|r	 ||«       nH ||«       |r |t        |j                  «       «      «       |r	 ||g«       |rt        «       } ||«       |	r!g }‰D ]  }||v sŒ|j                  |«       Œ |S t	        ‰|||
¬«      }‰|z   }|S )zCLogic for returning complete model list for a given key + team pairc                 ó|   •— | D ]6  }|‰vsŒ|t         j                  j                  k7  sŒ&‰j                  |«       Œ8 y ©N)r   Úno_default_modelsr@   Úappend)r=   r   Úunique_modelss     €r   Úappend_uniquez.get_complete_model_list.<locals>.append_uniqueÏ   s<   ø€ Øò 	,ˆEØ˜MÒ)¨eÔ7H×7ZÑ7Z×7`Ñ7`Ó.`Ø×$Ñ$ UÕ+ñ	,r   )rZ   rR   rS   rT   )r>   rC   r   rY   Ú_get_wildcard_models)rO   rA   r%   rP   rQ   rR   rS   r"   r$   r9   rT   r[   Úvalid_modelsÚmodel_access_groups_to_returnr   Úall_wildcard_modelsÚcomplete_model_listrZ   s                    @r   Úget_complete_model_listra   ·   sÑ   ø€ ðð €Mô,ñ
 Ù�jÕ!Ù	Ù�kÕ"áÐ&Ô'Ù&Ùœ$Ð2×7Ñ7Ó9Ó:Ô;áÙ˜:˜,Ô'á Ü"2Ó"4ˆLÙ˜,Ô'áØ:<Ð%Ø"ò 	<ˆEØÐ+Ò+Ø-×4Ñ4°UÕ;ð	<ð -Ð,ä!5Ø#Ø5ØØô	"Ðð "/Ð1DÑ!DÐàÐr   c                 ó  — | �| j                   €| S t        j                  | j                   «      }|s| S | j                  «       } |j	                  «       D ])  \  }}|t
        v sŒt        | |d «      �Œt        | ||«       Œ+ d | _         | S rW   )Úlitellm_credential_namer   Úget_credential_valuesÚ
model_copyÚitemsÚ _CREDENTIAL_LITELLM_PARAM_FIELDSÚgetattrÚsetattr)r   Úcredential_valuesÚkeyr@   s       r   Ú _hydrate_litellm_credential_namerl   ÷   s™   € ð Ð ×!GÑ!GÐ!OØÐä1×GÑGÈ×HnÑHnÓoÐÙØÐà#×.Ñ.Ó0€NØ'×-Ñ-Ó/ò 0‰
ˆˆUØÔ2Ò2´w¸~ÈsÐTXÓ7YÑ7aÜ�N C¨Õ/ð0ð .2€NÔ*ØÐr   Úwildcard_modelc                 ó>  ‡— | dk(  r1|�/t        |j                  «      rd|j                  v r|j                  n| }	 |j                  dd«      \  }}|�!	 |j                  j                  dd«      d   }n|}t	        |«      }t        ||¬«      }|€g S |dk7  r_|j                  dd«      Št        ˆfd„|D «       «      }|r$|D �cg c]  }|j                  ‰«      sŒ|‘Œ }	}|	}n|D �
cg c]  }
‰› |
› �‘Œ
 }}
t        D �ch c]  }|j                  ’Œ }}g }|D ]N  }
|
j                  |«      s*|
j                  d«      \  }}}|r||v r|› d|› �}
n|› d|
› �}
|j                  |
«       ŒP |xs g S # t        $ r g cY S w xY w# t        $ r |}Y �Œw xY wc c}w c c}
w c c}w )Nr   ú/é   r   )r   r   Ú c              3   ó@   •K  — | ]  }|j                  ‰«      –— Œ y ­wrW   )Ú
startswith)Ú.0Úwc_modelÚmodel_prefixs     €r   ú	<genexpr>z1get_known_models_from_wildcard.<locals>.<genexpr>+  s   øè ø€ Ò&iÈX x×':Ñ':¸<×'HÑ&iùs   ƒ)r   r   ÚsplitÚ
ValueErrorrl   r!   ÚreplaceÚanyrs   r   r@   Ú	partitionrY   )rm   r   Úwildcard_model_to_expandÚwildcard_provider_prefixÚwildcard_suffixr   Úwildcard_modelsÚis_partial_filterru   Úfiltered_wildcard_modelsr   Úknown_providersÚsuffix_appended_wildcard_modelsÚleadingÚsepÚmodel_suffixrv   s                   @r   Úget_known_models_from_wildcardrˆ   	  sÿ  ø€ ð ˜SÒ ØÐ&Ü# N×$8Ñ$8Ô9Ø�>×'Ñ'Ñ'ð	 	×Òð
 ð ðØ4L×4RÑ4RÐSVÐXYÓ4ZÑ1Ð  /ð Ð!ð	0Ø%×+Ñ+×1Ñ1°#°qÓ9¸!Ñ<‰Hð ,ˆä5°nÓE€Nä)°8ÈNÔ[€OàÐØˆ	Ø˜#Òà-×5Ñ5°c¸2Ó>ˆä#&Ó&iÐYhÔ&iÓ#iÐÙØAPÖ'v°XÐT\×TgÑTgÐhtÕTuªÐ'vÐ$Ð'vØ6‰Oð FUÖU¸E , °¨wÒ7ÐUˆOÐUä=IÖJ°˜hŸn›nÐJ€OÐJØ-/Ð#Ø ò 6ˆØ×ÑÐ 8Ô9ð */¯©¸Ó)=Ñ&ˆG�S˜,Ù�w /Ñ1Ø3Ð4°A°l°^ÐD‘à3Ð4°A°e°WÐ=�Ø'×.Ñ.¨uÕ5ð6ð +Ò0¨bÐ0øô_ ò ØŠ	ðûô ò 	0Ø/‹Hð	0üò" (wùò VùâJs;   »E- ÁE> ÃFÃFÃ&FÃ=FÅ-E;Å:E;Å>FÆFÚdeploymentsc                 óÜ  — g }| D �]B  }t        |j                  d«      xs d«      }|j                  d«      }t        |t        «      r|ni }t        |j                  d«      xs d«      }t	        |«      rd|v r|}n9t	        |«      rt	        |«      r|}n t	        |«      r|}n|j                  |«       Œ°	 |rt        j                  |«      nd}t        ||¬«      }	|	s|j                  |«       Œë|	D ]S  }
t        j                  |«      }|
|d<   |j                  d«      }t        |t        «      r|
|d<   |j                  |«       ŒU �ŒE |S # t        $ r |j                  |«       Y �Œew xY w)a•  Expand wildcard deployments into one row per known provider model.

    PR #30025 changed /model/info to read from llm_router.model_list (correct,
    so team-scoped rows are included). This function restores wildcard expansion
    on top of that: a wildcard deployment like model_name="*" / litellm_params.model="openai/*"
    becomes one entry per known openai model, matching /v1/models behaviour.
    Ú
model_namerq   r   r   ro   N©rm   r   )ÚstrÚgetÚ
isinstancerE   r   rY   r   Úmodel_validater6   rˆ   ÚcopyÚdeepcopy)r‰   ÚexpandedÚ
deploymentr‹   Ú
raw_paramsÚlitellm_params_dictÚlitellm_modelÚwildcard_patternr   Úexpanded_namesÚnameÚrowÚparamss                r   Ú*expand_wildcard_deployments_for_model_infor�   F  sv  € ð -/€HØ!ó &!ˆ
Ü˜Ÿ™¨Ó5Ò;¸Ó<ˆ
Ø—^‘^Ð$4Ó5ˆ
Ü<FÀzÔSWÔ<X©jÐ^`ÐÜÐ/×3Ñ3°GÓ<ÒBÀÓCˆô
 # :Ô.°3¸*Ñ3DØ)ÑÜ$ ZÔ0Ô5LÈ]Ô5[Ø,ÑÜ$ ZÔ0Ø)Ñà�O‰O˜JÔ'Øð	ÙSfœ^×:Ñ:Ð;NÔOÐlpˆNô 8Ø+Ø)ô
ˆñ Ø�O‰O˜JÔ'Øà"ò 	!ˆDÜ—-‘- 
Ó+ˆCØ $ˆC�ÑØ—W‘WÐ-Ó.ˆFÜ˜&¤$Ô'Ø"&��w‘Ø�O‰O˜CÕ ò	!ðA&!ðP €Oøô' ò 	Ø�O‰O˜JÔ'Úð	ús   Â6EÅE+Å*E+rZ   c                 óø  — t        «       }g }| D ]Ð  }t        |¬«      sŒ|r|j                  |«       |�z|j                  ||¬«      }|r2|D ],  }t	        |t        di |d   ¤Ž¬«      }	|j                  |	«       Œ. Œlt	        |d ¬«      }	|	sŒ||j                  |«       |j                  |	«       ŒŸt	        |d ¬«      }	|	sŒ¯|j                  |«       |j                  |	«       ŒÒ |D ]  }| j                  |«       Œ |S )Nr   )r‹   rT   r   rŒ   r   )	rJ   r   rY   Úget_model_listrˆ   r   rB   ÚaddÚremove)
rZ   rR   rS   rT   Úmodels_to_remover_   r   Ú
model_listÚrouter_modelr€   s
             r   r\   r\   |  s#  € ô "›eÐØ!#ÐØò @ˆÜ"¨Ö/Ù%Ø#×*Ñ*¨5Ô1ð Ð%Ø'×6Ñ6À%ÐQXÐ6ÓY�
ÙØ(2ò D˜Ü*HØ+0Ü+9Ñ+[¸LÐIYÑ<ZÑ+[ô+˜ð ,×2Ñ2°?ÕCñDô 'EÐTYÐjnÔ&o�OÚ&Ø(×,Ñ,¨UÔ3Ø+×2Ñ2°?ÕCô #AÐPUÐfjÔ"k�â"Ø$×(Ñ(¨Ô/Ø'×.Ñ.¨Õ?ð9@ð< "ò $ˆØ×Ñ˜UÕ#ð$ð Ðr   Úfallback_typec                 óD  — |€g S g }|dk(  rt        |dg «      }n>|dk(  rt        |dg «      }n+|dk(  rt        |dg «      }nt        j                  d|«       g S |sg S 	 t        || ¬	«      \  }}|€g S |S # t        $ r#}t        j
                  d
| |«       g cY d}~S d}~ww xY w)as  
    Get all fallbacks for a given model from the router's fallback configuration.

    Args:
        model: The model name to get fallbacks for
        llm_router: The LiteLLM router instance
        fallback_type: Type of fallback ("general", "context_window", "content_policy")

    Returns:
        List of fallback model names. Empty list if no fallbacks found.
    NÚgeneralÚ	fallbacksÚcontext_windowÚcontext_window_fallbacksÚcontent_policyÚcontent_policy_fallbackszUnknown fallback_type: %s)r¨   Úmodel_groupz(Error getting fallbacks for model %s: %s)rh   r   Úwarningr   r6   Úerror)r   rS   r¥   Úfallbacks_configÚfallback_model_groupÚ_Úes          r   Úget_all_fallbacksr´   ¨  sÑ   € ð  ÐØˆ	ð  ÐØ˜	Ò!Ü" :¨{¸BÓ?ÑØ	Ð*Ò	*Ü" :Ð/IÈ2ÓNÑØ	Ð*Ò	*Ü" :Ð/IÈ2ÓNÑä×$Ñ$Ð%@À-ÔPØˆ	áØˆ	ð
ä":ÐEUÐchÔ"iÑÐ˜aàÐ'ØˆIà#Ð#øÜò Ü×"Ñ"Ð#MÈuÐVWÔXØ�	ûðús$   ÁA3 Á1A3 Á3	BÁ<BÂBÂBrW   )FN)FF)F)FNN)Nr§   ).r‘   Úcollections.abcr   Útypingr   r   r   Úlitellm._loggingr   Ú.litellm.litellm_core_utils.credential_accessorr   Úlitellm.proxy._typesr   r	   Ú1litellm.repositories.object_permission_repositoryr
   Úlitellm.routerr   Ú,litellm.router_utils.fallback_event_handlersr   Úlitellm.types.routerr   r   Úlitellm.types.utilsr   Úlitellm.utilsr   rJ   Úmodel_fieldsrg   r�   Úboolr   r>   r!   rE   r,   r8   rH   rN   ra   rl   rˆ   r�   r\   r´   r   r   r   ú<module>rÂ      sŒ  ðó Ý $ß ã Ý 1Ý Mß BÝ XÝ !Ý Qß HÝ ,Ý *á#&Ð'>×'KÑ'KÓ#LÐ  ñ $'Ð'>×'KÑ'KÓ#LÐ  ð 3ð ¨4ó ñ
 #ð 
°~ÈÑ7Lð 
ÐX\Ð]`ÑXaÐdhÑXhó 
ð  05Ø-1ñ	'Ø˜c 4¨¡9˜nÑ-ð'à�S‘	ð'ð "&¨¡ð'ð ˜s‘m dÑ*ð	'ð
 
ˆ#�Yó'ð(Ø%ðà	ˆ#�Yóð< 05Ø,1ñ)Ø%ð)à˜3‘ið)ð ˜c 4¨¡9˜nÑ-ð)ð "&¨¡ð	)ð
 # T™kð)ð 
ˆ#�Yó)ð` 05ñ	'Ø�c‘ð'à˜3‘ið'ð ˜c 4¨¡9˜nÑ-ð'ð "&¨¡ð	'ð
 
ˆ#�Yó'ð` +0Ø $Ø02Ø/4Ø,1Øñ=Ø˜‘ð=à˜#‘ð=ð ˜3‘ið=ð �d‘
ð	=ð
   $™;ð=ð ! 4™Kð=ð ˜‘ð=ð ˜c 4¨¡9˜nÑ-ð=ð "&¨¡ð=ð # T™kð=ð �4‰Zð=ð 
ˆ#�Yó=ð@Ø" TÑ)ðà�dÑóñ$:1°3ð :1ÈÐY]ÑH]ð :1ÐimÐnqÑiró :1ðz3Ø�d˜3 ˜8‘nÑ%ð3à	ˆ$ˆs�Cˆx‰.Ñó3ðp +0Ø $Øñ	)Ø˜‘9ð)à  4™Kð)ð ˜‘ð)ð �4‰Zð	)ð
 
ˆ#�Yó)ð\ !%Ø"ñ,Øð,à˜‘ð,ð ð,ð 
ˆ#�Yô	,r   