
    h+                        d dl mZmZmZmZ d dl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 d	ed
efdZ	 d'dedee   d
eee      fdZ	 d(deeee   f   dee   dee   d
ee   fdZde
d
ee   fdZ	 	 d)de
dee   deeee   f   dee   dee   d
ee   fdZ	 d(dee   dee   deeee   f   dee   d
ee   f
dZddi ddfdee   dee   dee   dee   dee   dee   dee   deeee   f   dee   dee   d
ee   fd Z	 d'd!edee   d
ee   fd"Z	 	 d*d#ee   dee   dee   d
ee   fd$Z	 	 d+d	edee   d%ed
ee   fd&Zy),    )DictListOptionalSetN)verbose_proxy_logger)SpecialModelNamesUserAPIKeyAuth)Router)get_fallback_model_group)LiteLLM_Params)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    [/var/www/Befach/backend/env/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---* (
 r   Fmodel_access_groups
all_modelsinclude_model_access_groupsc                     g }g }t        |      D ]1  \  }}|| v s|s|j                  |       |j                  | |          3 t        |d      D ]  }|j	                  |        |j                  |       |S )NT)reverse)	enumerateappendextendsortedpop)r   r    r!   idx_to_remove
new_modelsidxr   s          r   _get_models_from_access_groupsr,   -   s    
 MJ
+
U''/$$S)1%89 , mT2s 3 j!r   user_api_key_dictc                   K   ddl m} |g S | j                  g S 	 |j                  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   dblitellm_objectpermissiontablefind_uniquemcp_servers	Exception)r-   r/   results      r   get_mcp_server_idsr9   C   s      9	 --5		$''EEQQ-/@/U/UV R 
 
 f((%%%	
  	sF   B5A4 A2A4 /B0A4 1B2A4 4B?BBBproxy_model_listonly_model_access_groupsc                 R   g }t        | j                        dkD  rR| j                  }t        j                  j                  |v r| j
                  }t        j                  j                  |v r|}t        ||      }t        j                  dj                  t        |                   |S )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    zALL KEY MODELS - {})lenmodelsr   all_team_modelsvalueteam_modelsall_proxy_modelsr,   r   debugformat)r-   r:   r   r!   r;   r    s         r   get_key_modelsrE   `   s     J
##$q(&--
,,22j@*66J--33zA)J//JJ 4;;C
OLMr   rA   c                    t               }t        |       dkD  rk|j                  |        t        j                  j
                  |v r|j                  |        t        j                  j
                  |v r|j                  |       t        |      }t        |t        |      |      }t        j                  dj                  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   r    r!   zALL TEAM MODELS - {})setr=   updater   r?   r@   rB   listr,   r   rC   rD   )rA   r:   r   r!   all_models_setr    s         r   get_team_modelsrK      s      #uN
;!k*,,22nD!!+.--33~E!!"23n%J//'$?J 5<<S_MNr   
key_models
user_modelinfer_model_from_keysreturn_wildcard_routes
llm_routerc
                    	 t               }
| r|
j                  |        nv|r|
j                  |       nb|
j                  |       |r|
j                  |j                                |r|
j                  |       |rt	               }|
j                  |       |	r!g }|
D ]  }||v s|j                  |        |S t        |
||      }t        |
      |z   }|S )zCLogic for returning complete model list for a given key + team pair)unique_modelsrO   rP   )rG   rH   keysaddr   r%   _get_wildcard_modelsrI   )rL   rA   r:   rM   rN   rO   rP   r   r!   r;   rR   valid_modelsmodel_access_groups_to_returnr   all_wildcard_modelscomplete_model_lists                   r   get_complete_model_listrZ      s     "eMZ(	[)-.&  !4!9!9!;<j) +-L  .35%"E++-44U; # -,.#5 }-0CCr   wildcard_modelc                    	 | j                  dd      \  }}|g S 	 |j                  j                  dd      d   }t        ||      }|g S |dk7  r4|j	                  dd      }|D cg c]  }|j                  |      r| }}|}g }	|D ]+  }
|
j                  |      s| d|
 }
|	j                  |
       - |	xs g S # t        $ r g cY S w xY w# t        $ r |}Y w xY wc c}w )N/   r   )r   r   r    )split
ValueErrorr   r   replace
startswithr%   )r[   r   wildcard_provider_prefixwildcard_suffixr   wildcard_modelsmodel_prefixwc_modelfiltered_wildcard_modelssuffix_appended_wildcard_modelsr   s              r   get_known_models_from_wildcardrk      s5   4B4H4Ha4P1 / 	,!''--c15a8
 *.O 	#&..sB7 ,$
""<0 $
  $

 3&(#  89/0%9E'..u5 ! +0b0?  	  ,+,$
s(   B= C 'C=C
CCCrR   c                    t               }g }| D ]  }t        |      s|r|j                  |       |G|j                  |      }|:|D ],  }t	        |t        di |d         }|j                  |       . lt	        |      }|{|j                  |       |j                  |        |D ]  }| j                  |        |S )Nr   )
model_namer   )r[   r   )r[   r   )	rG   r   r%   get_model_listrk   r   r&   rT   remove)	rR   rO   rP   models_to_removerX   r   
model_listrouter_modelrf   s	            r   rU   rU      s    
 u"/&#**51 %'66%6H
)(2*H+0+9 ,"./?"@,+ ,22?C )3 #APU"V".$((/'..?3 6 "U# " r   fallback_typec                 P   |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
|  d|        g cY d}~S d}~ww xY w)a{  
    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: )rv   model_groupz"Error getting fallbacks for model z: )getattrr   warningr   r7   error)r   rP   rs   fallbacks_configfallback_model_group_es          r   get_all_fallbacksr   &  s      	  	!":{B?	*	*":/I2N	*	*":/I2N$$'>}o%NO		":&#
a
  'I## ""%GwbQRPS#TU	s$   A5 3A5 5	B%>B B% B%)N)F)FF)FN)Nru   )typingr   r   r   r   r   litellm._loggingr   litellm.proxy._typesr   r	   litellm.routerr
   ,litellm.router_utils.fallback_event_handlersr   litellm.types.routerr   litellm.utilsr   strboolr   r   r,   r9   rE   rK   rZ   rk   rU   r   r   r   r   <module>r      s   - ,  1 B ! Q / *3 4  ?C#+N#;d3i( 38c49n-S	 "*$ 
#Y	,%	#YB 38/4%3i c49n- "*$	
 'tn 
#YF 38	c3i c49n- "*$	
 
#YL .3#'0227/45S	5c5 3i5 	5
 $D>5 %TN5  5 c49n-5 "*$5 'tn5 
#Y5r EI$1$1)1.)A$1	#Y$1R .3#'%s8%$TN%  % 
#Y	%T $("// / / 
#Y	/r   