o
    ưi2                     @   sf  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dZ	d2dedee d
eee  fddZ	d3deeee f dee dee d
ee fddZde
d
ee fddZ		d4de
dee deeee f dee dee d
ee fddZ	d3dee dee deeee f dee d
ee f
d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&d'Z	d2d(edee d
ee fd)d*Z		d5d+ee d$ee d%ee d
ee fd,d-Z		.d6d	ed%ee d/ed
ee fd0d1ZdS )7    )DictListOptionalSetN)verbose_proxy_logger)SpecialModelNamesUserAPIKeyAuth)Router)get_fallback_model_group)LiteLLM_Params)get_valid_modelsmodelreturnc                 C   s   d| v rdS dS )zk
    Returns True if a model is a provider wildcard.

    eg:
    - anthropic/*
    - openai/*
    - *
    *TF r   r   r   V/home/app/Keep/.python/lib/python3.10/site-packages/litellm/proxy/auth/model_checks.py_check_wildcard_routing   s   	r   providerlitellm_paramsc                 C   s0   | dkr	t |dS | tjv rt | |d}|S dS )z6
    Returns the list of known models by provider
    r   )r   )Zcustom_llm_providerr   N)r   litellmZmodels_by_provider)r   r   Zprovider_modelsr   r   r   get_provider_models   s   

r   Fmodel_access_groups
all_modelsinclude_model_access_groupsc                 C   sh   g }g }t |D ]\}}|| v r|s|| || |  qt|ddD ]}|| q%|| |S )NT)reverse)	enumerateappendextendsortedpop)r   r   r   Zidx_to_removeZ
new_modelsidxr   r   r   r   _get_models_from_access_groups-   s   

r"   user_api_key_dictc                    st   ddl m} |du rg S | jdu rg S z|jjjd| jidI dH }|r,|jr,|jW S g W S  ty9   g  Y S 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)Zlitellm.proxy.proxy_serverr$   r%   dbZlitellm_objectpermissiontableZfind_uniqueZmcp_servers	Exception)r#   r$   resultr   r   r   get_mcp_server_idsC   s    

r*   proxy_model_listonly_model_access_groupsc                 C   s   g }t | jdkr,t| j}tjj|v rt| j}tjj|v r,t|}|r,||	  t
|||d}tt|}td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   r   zALL KEY MODELS - {})lenmodelslistr   all_team_modelsvalueteam_modelsall_proxy_modelsr   keysr"   dictfromkeysr   debugformat)r#   r+   r   r   r,   r   r   r   r   get_key_models^   s"   

r:   r3   c                 C   s   t  }t| dkr-||  tjj|v r||  tjj|v r-|| |r-||  t|t	||d}t	t
|}t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 - {})setr.   updater   r1   r2   r4   r5   r"   r0   r6   r7   r   r8   r9   )r3   r+   r   r   Zall_models_setr   r   r   r   get_team_models   s"   


r=   
key_models
user_modelinfer_model_from_keysreturn_wildcard_routes
llm_routerc
                    s   	 g   fdd}
| r|
|  n%|r|
| n|
| |r%|
t |  |r,|
|g |r5t }|
| |	rIg } D ]}||v rF|| q;|S t ||d} | }|S )zCLogic for returning complete model list for a given key + team pairc                    s    | D ]}| vr  | qd S N)r   )r/   r   unique_modelsr   r   append_unique   s
   
z.get_complete_model_list.<locals>.append_unique)rE   rA   rB   )r0   r5   r   r   _get_wildcard_models)r>   r3   r+   r?   r@   rA   rB   r   r   r,   rF   Zvalid_modelsZmodel_access_groups_to_returnr   all_wildcard_modelsZcomplete_model_listr   rD   r   get_complete_model_list   s:   



rI   wildcard_modelc           
         s  z
|  dd\}}W n ty   g  Y S w |d ur1z|j ddd }W n ty0   |}Y nw |}t||d}|d u r?g S |dkrk|dd t fdd|D }|rb fd	d
|D }|}n	 fdd
|D }g }|D ]}	|	|s}| d|	 }	||	 qo|pg S )N/   r   )r   r   r    c                 3   s    | ]}|  V  qd S rC   
startswith.0Zwc_modelZmodel_prefixr   r   	<genexpr>  s    

z1get_known_models_from_wildcard.<locals>.<genexpr>c                    s   g | ]	}|  r|qS r   rN   rP   rR   r   r   
<listcomp>  s    z2get_known_models_from_wildcard.<locals>.<listcomp>c                    s   g | ]}  | qS r   r   )rQ   r   rR   r   r   rT     s    )split
ValueErrorr   r   replaceanyrO   r   )
rJ   r   Zwildcard_provider_prefixZwildcard_suffixr   wildcard_modelsZis_partial_filterZfiltered_wildcard_modelsZsuffix_appended_wildcard_modelsr   r   rR   r   get_known_models_from_wildcard   sD   

rZ   rE   c           	   	   C   s   t  }g }| D ]W}t|dr^|r|| |d urL|j|d}|r9|D ]}t|tdi |d d}|| q#qt|d d}|rK|| || qt|d d}|r^|| || q|D ]}| | qa|S )Nr   )Z
model_namer   )rJ   r   r   )	r;   r   r   Zget_model_listrZ   r   r   addremove)	rE   rA   rB   Zmodels_to_removerH   r   Z
model_listZrouter_modelrY   r   r   r   rG     sH   





rG   generalfallback_typec              
   C   s   |du r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d|  g S |s7g S zt|| d	\}}|du rGg W S |W S  tyh } ztd
|  d|  g W  Y d}~S d}~w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.
    Nr]   	fallbacksZcontext_windowZcontext_window_fallbacksZcontent_policyZcontent_policy_fallbackszUnknown fallback_type: )r_   Zmodel_groupz"Error getting fallbacks for model z: )getattrr   warningr
   r(   error)r   rB   r^   Zfallbacks_configZfallback_model_group_er   r   r   get_all_fallbacksK  s2   
re   rC   )F)FF)FN)Nr]   )typingr   r   r   r   r   Zlitellm._loggingr   Zlitellm.proxy._typesr   r   Zlitellm.routerr	   Z,litellm.router_utils.fallback_event_handlersr
   Zlitellm.types.routerr   Zlitellm.utilsr   strboolr   r   r"   r*   r:   r=   rI   rZ   rG   re   r   r   r   r   <module>   s   




*
)	

>
6
5