
    .h                    |    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
  G d d	          Z G d
 de          ZdS )    )annotations)AsyncOpenAI   )	UserError   )ModelModelProvider)OpenAIProviderc                  H    e Zd ZdZd ZddZdd	ZddZddZddZ	ddZ
dS )MultiProviderMapz/A map of model name prefixes to ModelProviders.c                    i | _         d S )N_mappingselfs    Y/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/agents/models/multi_provider.py__init__zMultiProviderMap.__init__   s    24    prefixstrreturnboolc                    || j         v S )z3Returns True if the given prefix is in the mapping.r   r   r   s     r   
has_prefixzMultiProviderMap.has_prefix   s    &&r   dict[str, ModelProvider]c                4    | j                                         S )z>Returns a copy of the current prefix -> ModelProvider mapping.)r   copyr   s    r   get_mappingzMultiProviderMap.get_mapping   s    }!!###r   mappingc                    || _         dS )z.Overwrites the current mapping with a new one.Nr   )r   r    s     r   set_mappingzMultiProviderMap.set_mapping   s    r   ModelProvider | Nonec                6    | j                             |          S )zReturns the ModelProvider for the given prefix.

        Args:
            prefix: The prefix of the model name e.g. "openai" or "my_prefix".
        )r   getr   s     r   get_providerzMultiProviderMap.get_provider   s     }  (((r   providerr	   c                    || j         |<   dS )zAdds a new prefix -> ModelProvider mapping.

        Args:
            prefix: The prefix of the model name e.g. "openai" or "my_prefix".
            provider: The ModelProvider to use for the given prefix.
        Nr   )r   r   r'   s      r   add_providerzMultiProviderMap.add_provider$   s     !)fr   c                    | j         |= dS )zRemoves the mapping for the given prefix.

        Args:
            prefix: The prefix of the model name e.g. "openai" or "my_prefix".
        Nr   r   s     r   remove_providerz MultiProviderMap.remove_provider-   s     M&!!!r   N)r   r   r   r   )r   r   )r    r   )r   r   r   r#   )r   r   r'   r	   )r   r   )__name__
__module____qualname____doc__r   r   r   r"   r&   r)   r+    r   r   r   r   
   s        995 5 5' ' ' '$ $ $ $       ) ) ) )) ) ) )" " " " " "r   r   c                  L    e Zd ZdZddddddddddZddZddZddZd dZdS )!MultiProvideraA  This ModelProvider maps to a Model based on the prefix of the model name. By default, the
    mapping is:
    - "openai/" prefix or no prefix -> OpenAIProvider. e.g. "openai/gpt-4.1", "gpt-4.1"
    - "litellm/" prefix -> LitellmProvider. e.g. "litellm/openai/gpt-4.1"

    You can override or customize this mapping.
    N)provider_mapopenai_api_keyopenai_base_urlopenai_clientopenai_organizationopenai_projectopenai_use_responsesr3   MultiProviderMap | Noner4   
str | Noner5   r6   AsyncOpenAI | Noner7   r8   r9   bool | Noner   Nonec               V    || _         t          ||||||          | _        i | _        dS )a  Create a new OpenAI provider.

        Args:
            provider_map: A MultiProviderMap that maps prefixes to ModelProviders. If not provided,
                we will use a default mapping. See the documentation for this class to see the
                default mapping.
            openai_api_key: The API key to use for the OpenAI provider. If not provided, we will use
                the default API key.
            openai_base_url: The base URL to use for the OpenAI provider. If not provided, we will
                use the default base URL.
            openai_client: An optional OpenAI client to use. If not provided, we will create a new
                OpenAI client using the api_key and base_url.
            openai_organization: The organization to use for the OpenAI provider.
            openai_project: The project to use for the OpenAI provider.
            openai_use_responses: Whether to use the OpenAI responses API.
        )api_keybase_urlr6   organizationprojectuse_responsesN)r3   r
   openai_provider_fallback_providers)r   r3   r4   r5   r6   r7   r8   r9   s           r   r   zMultiProvider.__init__?   sF    6 )-"$',". 
  
  
 >@   r   
model_nametuple[str | None, str | None]c                T    |dS d|v r|                     dd          \  }}||fS d |fS )N)NN/r   )split)r   rG   r   s      r   _get_prefix_and_model_namez(MultiProvider._get_prefix_and_model_namef   sH    :J!+!1!1#q!9!9FJ:%%##r   r   r   r	   c                R    |dk    rddl m}  |            S t          d|           )Nlitellmr   )LitellmProviderzUnknown prefix: )"extensions.models.litellm_providerrO   r   )r   r   rO   s      r   _create_fallback_providerz'MultiProvider._create_fallback_providero   sD    YLLLLLL"?$$$7v77888r   c                    ||dk    r| j         S || j        v r| j        |         S |                     |          | j        |<   | j        |         S )Nopenai)rE   rF   rQ   r   s     r   _get_fallback_providerz$MultiProvider._get_fallback_providerw   s_    >Vx//''t///+F33/3/M/Mf/U/UD$V,+F33r   r   c                    |                      |          \  }}|r8| j        r1| j                            |          x}r|                    |          S |                     |                              |          S )aK  Returns a Model based on the model name. The model name can have a prefix, ending with
        a "/", which will be used to look up the ModelProvider. If there is no prefix, we will use
        the OpenAI provider.

        Args:
            model_name: The name of the model to get.

        Returns:
            A Model.
        )rL   r3   r&   	get_modelrT   )r   rG   r   r'   s       r   rV   zMultiProvider.get_model   s     "<<ZHH
 	Md' 	M9J9W9WX^9_9_-_X 	M%%j111..v66@@LLLr   )r3   r:   r4   r;   r5   r;   r6   r<   r7   r;   r8   r;   r9   r=   r   r>   )rG   r;   r   rH   )r   r   r   r	   )r   r;   r   r	   )rG   r;   r   r   )	r,   r-   r.   r/   r   rL   rQ   rT   rV   r0   r   r   r2   r2   6   s          15%)&*,0*.%),0%@ %@ %@ %@ %@ %@N$ $ $ $9 9 9 94 4 4 4M M M M M Mr   r2   N)
__future__r   rS   r   
exceptionsr   	interfacer   r	   rE   r
   r   r2   r0   r   r   <module>rZ      s    " " " " " "       " " " " " " + + + + + + + + + + + + + +)" )" )" )" )" )" )" )"XZM ZM ZM ZM ZMM ZM ZM ZM ZM ZMr   