
    h                         d Z ddlmZmZmZmZmZ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mZ d	d
lmZ ddlmZ  G d de      Z G d de      Zy)z
Support for OpenAI's `/v1/chat/completions` endpoint.

Calls done in OpenAI/openai.py as OpenRouter is openai-compatible.

Docs: https://openrouter.ai/docs/parameters
    )AnyAsyncIteratorIteratorListOptionalTupleUnionN)BaseModelResponseIterator)BaseLLMException)AllMessageValuesChatCompletionToolParam)OpenRouterErrorMessage)ModelResponseModelResponseStream   )OpenAIGPTConfig   OpenRouterExceptionc                       e Zd Zdededededef
 fdZ	 ddedee   de	ed	      de
ee   e	ed	      f   f fd
Zdedee   dedededef fdZdededeeej                   f   defdZ	 ddeee   ee   ef   dede	e   defdZ xZS )OpenrouterConfignon_default_paramsoptional_paramsmodeldrop_paramsreturnc                     t         
|   ||||      }i }|j                  dd       }|j                  dd       }|j                  dd       }	|||d<   |||d<   |	|	|d<   ||d<   |S )N
transformsmodelsroute
extra_body)supermap_openai_paramspop)selfr   r   r   r   mapped_openai_paramsr!   r   r   r    	__class__s             g/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/llms/openrouter/chat/transformation.pyr#   z"OpenrouterConfig.map_openai_params   s      %w8 

 
'++L$?
#''$7"&&w5!'1J|$#)Jx "'Jw 	\* $#    messagestoolsr   c                 R    d|j                         v r||fS t        | 	  |||      S )Nclaude)lowerr"   1remove_cache_control_flag_from_messages_and_tools)r%   r   r*   r+   r'   s       r(   r/   zBOpenrouterConfig.remove_cache_control_flag_from_messages_and_tools3   s6     u{{}$U?"7Lx r)   litellm_paramsheadersc                 t    |j                  di       }t        | 	  |||||      }|j                  |       |S )z
        Transform the overall request to be sent to the API.

        Returns:
            dict: The transformed request. Sent as the body of the API call.
        r!   )r$   r"   transform_requestupdate)	r%   r   r*   r   r0   r1   r!   responser'   s	           r(   r3   z"OpenrouterConfig.transform_request@   sD     %((r:
7,8_ng
 	
#r)   error_messagestatus_codec                     t        |||      S )Nmessager7   r1   r   )r%   r6   r7   r1   s       r(   get_error_classz OpenrouterConfig.get_error_classU   s     #!#
 	
r)   streaming_responsesync_stream	json_modec                     t        |||      S )N)r<   r=   r>   )(OpenRouterChatCompletionStreamingHandler)r%   r<   r=   r>   s       r(   get_model_response_iteratorz,OpenrouterConfig.get_model_response_iterator^   s     81#
 	
r)   )N)F)__name__
__module____qualname__dictstrboolr#   r   r   r   r   r/   r3   intr	   httpxHeadersr   r;   r   r   r   r   rA   __classcell__)r'   s   @r(   r   r      sV   $ $ $ 	$
 $ 
$> <@	 '( 678	
 
t$%x5N0O'PP	Q '( 	
   
*
 
/2
=B4CV=W
	
 %*	

!(3-s1C]"RS

 

 D>	


 


r)   r   c                       e Zd ZdedefdZy)r@   chunkr   c           
      8   	 d|v r|d   }t        dj                  |d   |j                  di       |j                  dd            |d   |j                  di             }t        |d   |d   |d   j                  d	i       
      g }|d   D ]-  }|d   j                  d      |d   d<   |j	                  |       / t        |d   d|d   |j                  d      |d   |      S # t        $ r}t        d| d| dddi
      d }~wt        $ r}|d }~ww xY w)Nerrorz&Message: {}, Metadata: {}, User ID: {}r:   metadatauser_id code)r:   rS   rP   r1   r9   choicesdelta	reasoningreasoning_contentidzchat.completion.chunkcreatedusager   )rX   objectrY   rZ   r   rT   z
KeyError: z+, Got unexpected response from OpenRouter: i  zContent-Typezapplication/json)r   formatgetr   appendr   KeyError	Exception)r%   rM   error_chunkr6   new_choiceschoicees          r(   chunk_parserz5OpenRouterChatCompletionStreamingHandler.chunk_parserl   sg   &	%#Gn 6DKK#I.#
B7#	26
 %V,(__Z<! *))4 -f 5)*599)RH  K	*7=g7J7J;7Ww 34""6* + ';.i(ii(Gn#   	%$QC'RSXRYZ');< 
  	G	s$   C$C' '	D0DDDDN)rB   rC   rD   rE   r   re    r)   r(   r@   r@   k   s    '$ '+> 'r)   r@   )__doc__typingr   r   r   r   r   r   r	   rI   )litellm.llms.base_llm.base_model_iteratorr
   )litellm.llms.base_llm.chat.transformationr   litellm.types.llms.openair   r   litellm.types.llms.openrouterr   litellm.types.utilsr   r   openai.chat.gpt_transformationr   common_utilsr   r   r@   rf   r)   r(   <module>rp      sJ    N M M  O F O @ B = .Q
 Q
h(/H (r)   