Ë
    uPêjÈ;  ã                   ó  — d Z ddlZddlmZmZ ddlmZmZ 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mZ dd	lmZmZmZmZmZ e	rddlZdd
lmZ ddlm Z  ddl!m"Z"m#Z# e	r	ddl$m%Z& e&Z'ne
Z' G d„ de(«      Z) G d„ de«      Z*y)z*
Common base config for all LLM providers
é    N)ÚABCÚabstractmethod)ÚAsyncIteratorÚIterator)ÚTYPE_CHECKINGÚAnyÚFinalÚUnion)Ú	BaseModel)ÚDEFAULT_MAX_TOKENSÚRESPONSE_FORMAT_TOOL_NAME)ÚAsyncHTTPHandlerÚHTTPHandler)ÚAllMessageValuesÚ%ChatCompletionToolChoiceFunctionParamÚ#ChatCompletionToolChoiceObjectParamÚChatCompletionToolParamÚ$ChatCompletionToolParamFunctionChunk)ÚCustomStreamWrapper)ÚModelResponseé   )Ú!map_developer_role_to_system_roleÚtype_to_response_format_param)ÚLoggingc                   ó¢   ‡ — e Zd Z	 	 	 	 	 d
dededeej                  z  dz  dej                  dz  dej                  dz  dedz  de
fˆ fd	„Zˆ xZS )ÚBaseLLMExceptionNÚstatus_codeÚmessageÚheadersÚrequestÚresponseÚbodyÚstatus_code_is_synthesizedc                 ó*  •— || _         || _        || _        || _        |r|| _        nt        j                  dd¬«      | _        |r|| _        n&t        j                  || j                  ¬«      | _        || _	        t        ‰| �-  | j                  «       y )NÚPOSTzhttps://docs.litellm.ai/docs)ÚmethodÚurl)r   r    )r   r#   r   r   r    ÚhttpxÚRequestr!   ÚResponser"   ÚsuperÚ__init__)	Úselfr   r   r   r    r!   r"   r#   Ú	__class__s	           €ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/base_llm/chat/transformation.pyr,   zBaseLLMException.__init__+   sx   ø€ ð 'ˆÔØ*DˆÔ'Ø#ˆŒØˆŒÙØ"ˆD�Lä Ÿ=™=°Ð<ZÔ[ˆDŒLÙØ$ˆD�Mä!ŸN™N°{ÈDÏLÉLÔYˆDŒMØˆŒ	Ü‰Ñ˜Ÿ™Õ&ó    )NNNNF)Ú__name__Ú
__module__Ú__qualname__ÚintÚstrÚdictr(   ÚHeadersr)   r*   Úboolr,   Ú__classcell__)r.   s   @r/   r   r   *   s†   ø„ ð
 04Ø(,Ø*.Ø Ø+0ñ'àð'ð ð'ð ˜Ÿ™Ñ%¨Ñ,ð	'ð
 —‘ Ñ%ð'ð —.‘. 4Ñ'ð'ð �T‰kð'ð %)÷'ñ 'r0   r   c                   óü  — e Zd Zd„ Zed„ «       Zdee   ez  dz  dedz  fd„Z	dede
fd„Zdede
fd	„Zded
efd„Z	 dJdedz  de
dz  dedz  de
fd„Zd
ededefd„Zdee   dee   fd„Zdej*                  dede
fd„Zdej*                  dedefd„Zedefd„«       Zededefd„«       Z	 dKd
edede
de
def
d„Zeded
edede
def
d „«       Ze	 	 dLd!ededee   d
eded"edz  d#edz  defd$„«       Z	 	 	 	 dMd!ed
eded#ed"edz  dedz  de
dz  d%e
dz  de ee!dz  f   fd&„Z"	 dJd#edz  d"edz  ded
edede
dz  defd'„Z#ededee   d
eded!edefd(„«       Z$dedee   d
eded!edefd)„Z%e	 	 dLded*ejL                  d+d,d-e'dedee   d
eded.d/d"edz  d0e
dz  dd,fd1„«       Z(d2edefd3„Z)ed4ed5ed!eejT                  z  de+fd6„«       Z,	 dNd7e-e.e   e/e   d,f   d8e
d0e
dz  de0fd9„Z1	 	 	 dOdeded-e'd#ed!ed:eded;e2dz  d0e
dz  d<e!dz  dd=fd>„Z3	 	 	 dOdeded-e'd#ed!ed:eded;e4e2z  dz  d0e
dz  d<e!dz  dd=fd?„Z5ededz  fd@„«       Z6ede
fdA„«       Z7ede
fdB„«       Z8de0de0fdC„Z9dDd,dEee0   ddfdF„Z:dedGedHededz  fdI„Z;y)PÚ
BaseConfigc                  ó   — y ©N© ©r-   s    r/   r,   zBaseConfig.__init__F   s   € Ør0   c                 ó  — | j                   j                  «       D ��ci c]_  \  }}|j                  d«      sIt        |t        j
                  t        j                  t        t        t        f«      s|�t        |«      s||“Œa c}}S c c}}w )NÚ_)Ú__dict__ÚitemsÚ
startswithÚ
isinstanceÚtypesÚFunctionTypeÚBuiltinFunctionTypeÚclassmethodÚstaticmethodÚpropertyÚcallable)ÚclsÚkÚvs      r/   Ú
get_configzBaseConfig.get_configI   s~   € ð Ÿ™×*Ñ*Ó,÷
á��1Ø—<‘< Ô$ÜØä×&Ñ&Ü×-Ñ-ÜÜ Üðô	ð �Ü˜Q”Kð ˆq‰Dó
ð 	
ùó 
s   žA$BÚresponse_formatNÚreturnc                 ó   — t        |¬«      S )N)rQ   )r   )r-   rQ   s     r/   Ú$get_json_schema_from_pydantic_objectz/BaseConfig.get_json_schema_from_pydantic_object]   s   € Ü,¸_ÔMÐMr0   Únon_default_paramsc                 óª   — |j                  d«      }t        |t        «      r|j                  d«      nd }|du xs |dk(  xs |j                  d«      d uS )NÚthinkingÚtypeTÚenabledÚreasoning_effort)ÚgetrE   r6   )r-   rU   rW   Úthinking_types       r/   Úis_thinking_enabledzBaseConfig.is_thinking_enabled`   sY   € Ø,×0Ñ0°Ó<ˆÜ7AÀ(ÌDÔ7Q˜xŸ|™|¨FÔ3ÐW[ˆØ˜4ÐÒw =°IÑ#=ÒwÐAS×AWÑAWÐXjÓAkÐswÐAwÐwr0   c                 ó   — d|v xs d|v S )zY
        OpenAI spec allows max_tokens or max_completion_tokens to be specified.
        Ú
max_tokensÚmax_completion_tokensr>   )r-   rU   s     r/   Úis_max_tokens_in_requestz#BaseConfig.is_max_tokens_in_requeste   s   € ð Ð1Ð1ÒbÐ5LÐPbÐ5bÐbr0   Úoptional_paramsc                 óÆ   — | j                  |«      }|rNd|vrId|vrD|j                  d«      }t        |t        «      r|j                  d«      nd}|�|t        z   |d<   yyyyy)aÅ  
        Handles scenario where max tokens is not specified. For anthropic models (anthropic api/bedrock/vertex ai), this requires having the max tokens being set and being greater than the thinking token budget.

        Checks 'non_default_params' for 'thinking' and 'max_tokens'

        if 'thinking' is enabled and 'max_tokens' or 'max_completion_tokens' is not specified, set 'max_tokens' to the thinking token budget + DEFAULT_MAX_TOKENS
        r_   r`   rW   Úbudget_tokensN)r]   r[   rE   r6   r   )r-   rU   rb   r]   Úthinking_valueÚthinking_token_budgets         r/   Ú+update_optional_params_with_thinking_tokensz6BaseConfig.update_optional_params_with_thinking_tokensk   s…   € ð &*×%=Ñ%=¸oÓ%NÐÙØÐ 2Ñ2Ð7NÐVhÑ7hà$3×$7Ñ$7¸
Ó$CˆNä7AÀ.ÔRVÔ7W�×"Ñ" ?Ô3Ð]að "ð %Ð0Ø0EÔHZÑ0Z� Ò-ð 1ð 8iÐ2ð r0   ÚmodelÚstreamÚcustom_llm_providerc                  ó   — y)zG
        Returns True if the model/provider should fake stream
        Fr>   )r-   rh   ri   rj   s       r/   Úshould_fake_streamzBaseConfig.should_fake_stream~   s   € ð r0   Útoolsc                 ó4   — d|vr||d<   |S g |d   ¢|¢|d<   |S )z>
        Helper util to add tools to optional_params.
        rm   r>   )r-   rb   rm   s      r/   Ú_add_tools_to_optional_paramsz(BaseConfig._add_tools_to_optional_params‰   sG   € ð ˜/Ñ)Ø',ˆO˜GÑ$ð Ðð	(Ø  Ñ)ð(àð(ˆO˜GÑ$ð Ðr0   Úmessagesc                 ó   — t        |¬«      S )zz
        Translate `developer` role to `system` role for non-OpenAI providers.

        Overriden by OpenAI/Azure
        )rp   )r   )r-   rp   s     r/   Ú'translate_developer_role_to_system_rolez2BaseConfig.translate_developer_role_to_system_role–   s   € ô 1¸(ÔCÐCr0   ÚeÚlitellm_paramsc                  ó   — y)z¾
        Returns True if the model/provider should retry the LLM API on UnprocessableEntityError

        Overriden by azure ai - where different models support different parameters
        Fr>   )r-   rs   rt   s      r/   Ú9should_retry_llm_api_inside_llm_translation_on_http_errorzDBaseConfig.should_retry_llm_api_inside_llm_translation_on_http_error¡   s   € ð r0   Úrequest_datac                 ó   — |S )zH
        Transform the request data on UnprocessableEntityError
        r>   )r-   rs   rw   s      r/   Ú/transform_request_on_unprocessable_entity_errorz:BaseConfig.transform_request_on_unprocessable_entity_error«   s
   € ð Ðr0   c                  ó   — y)zŸ
        Returns the max retry count for UnprocessableEntityError

        Used if `should_retry_llm_api_inside_llm_translation_on_http_error` is True
        r   r>   r?   s    r/   Ú'max_retry_on_unprocessable_entity_errorz2BaseConfig.max_retry_on_unprocessable_entity_error±   s   € ð r0   c                  ó   — y r=   r>   )r-   rh   s     r/   Úget_supported_openai_paramsz&BaseConfig.get_supported_openai_paramsº   ó   € àr0   ÚvalueÚis_response_format_supportedÚenforce_tool_choicec                 ó"  — d}d|v r|d   }nd|v r|d   d   }|rm|skt        dt        t        ¬«      ¬«      }t        dt	        t        |¬«      ¬«      }|j                  d	g «       |d	   j                  |«       |r||d
<   d|d<   |S |r||d<   |S )u§  
        Follow similar approach to anthropic - translate to a single tool call.

        When using tools in this way: - https://docs.anthropic.com/en/docs/build-with-claude/tool-use#json-mode
        - You usually want to provide a single tool
        - You should set tool_choice (see Forcing tool use) to instruct the model to explicitly use that tool
        - Remember that the model will pass the input to the tool, so the name of the tool and description should be from the modelâ€™s perspective.

        Add response format to tools

        This is used to translate response_format to a tool call, for models/APIs that don't support response_format directly.
        NÚresponse_schemaÚjson_schemaÚschemaÚfunction)Úname)rX   r†   )r‡   Ú
parametersrm   Útool_choiceTÚ	json_moderQ   )r   r   r   r   r   Ú
setdefaultÚappend)r-   rb   r   r€   r�   r„   Ú_tool_choiceÚ_tools           r/   Ú_add_response_format_to_toolsz(BaseConfig._add_response_format_to_tools¾   sÄ   € ð& $(ˆØ Ñ%ØÐ 1Ñ2‰KØ˜eÑ#Ø Ñ.¨xÑ8ˆKáÑ;Ü"EØÜ>ÔD]Ô^ô#ˆLô
 3ØÜ=ÔC\ÐitÔuôˆEð
 ×&Ñ& w°Ô3Ø˜GÑ$×+Ñ+¨EÔ2Ù"Ø1=� Ñ.à+/ˆO˜KÑ(ð Ðñ *Ø16ˆOÐ-Ñ.ØÐr0   Údrop_paramsc                  ó   — y r=   r>   )r-   rU   rb   rh   r�   s        r/   Úmap_openai_paramszBaseConfig.map_openai_paramsì   s   € ð 	r0   r   Úapi_keyÚapi_basec                  ó   — y r=   r>   )r-   r   rh   rp   rb   rt   r“   r”   s           r/   Úvalidate_environmentzBaseConfig.validate_environmentö   s   € ð 	r0   Úfake_streamc	                 ó
   — |dfS )a0  
        Some providers like Bedrock require signing the request. The sign request funtion needs access to `request_data` and `complete_url`
        Args:
            headers: dict
            optional_params: dict
            request_data: dict - the request body being sent in http request
            api_base: str - the complete url being sent in http request
        Returns:
            dict - the signed headers

        Update the headers with the signed headers in this function. The return values will be sent as headers in the http request.
        Nr>   )	r-   r   rb   rw   r”   r“   rh   ri   r—   s	            r/   Úsign_requestzBaseConfig.sign_request  s   € ð. ˜ˆ}Ðr0   c                 ó    — |€t        d«      ‚|S )z{
        OPTIONAL

        Get the complete url for the request

        Some providers need `model` in `api_base`
        zapi_base is required)Ú
ValueError)r-   r”   r“   rh   rb   rt   ri   s          r/   Úget_complete_urlzBaseConfig.get_complete_url  s   € ð  ÐÜÐ3Ó4Ð4Øˆr0   c                  ó   — y r=   r>   ©r-   rh   rp   rb   rt   r   s         r/   Útransform_requestzBaseConfig.transform_request0  s   € ð 	r0   c              ƒ   ó6   K  — | j                  |||||¬«      S ­w)zŽ
        Override to allow for http requests on async calls - e.g. converting url to base64

        Currently only used by openai.py
        )rh   rp   rb   rt   r   )rŸ   rž   s         r/   Úasync_transform_requestz"BaseConfig.async_transform_request;  s/   è ø€ ð ×%Ñ%ØØØ+Ø)Øð &ó 
ð 	
ùs   ‚Úraw_responseÚmodel_responser   Úlogging_objÚencodingztiktoken.Encoding | NonerŠ   c                  ó   — y r=   r>   )r-   rh   r¢   r£   r¤   rw   rp   rb   rt   r¥   r“   rŠ   s               r/   Útransform_responsezBaseConfig.transform_responseP  s   € ð 	r0   Úparsed_responsec                 ó   — |S )a›  
        Repair a parsed OpenAI-format response dict before generic conversion.

        Providers routed through the OpenAI SDK handler bypass transform_response,
        which calls convert_to_model_response_object directly on the SDK's parsed
        output. Override this to normalize a malformed response (e.g. github_copilot
        returning empty choices for Anthropic-native Claude responses).
        r>   )r-   r¨   s     r/   Útransform_parsed_response_dictz)BaseConfig.transform_parsed_response_dicta  s
   € ð Ðr0   Úerror_messager   c                  ó   — y r=   r>   )r-   r«   r   r   s       r/   Úget_error_classzBaseConfig.get_error_classl  r~   r0   Ústreaming_responseÚsync_streamc                  ó   — y r=   r>   )r-   r®   r¯   rŠ   s       r/   Úget_model_response_iteratorz&BaseConfig.get_model_response_iteratorp  s   € ð 	r0   ÚdataÚclientÚsigned_json_bodyr   c              ƒ   ó   K  — t         ‚­wr=   ©ÚNotImplementedError©r-   rh   rj   r¤   r”   r   r²   rp   r³   rŠ   r´   s              r/   Úget_async_custom_stream_wrapperz*BaseConfig.get_async_custom_stream_wrapperx  s   è ø€ ô "Ð!ùs   ‚	c                 ó   — t         ‚r=   r¶   r¸   s              r/   Úget_sync_custom_stream_wrapperz)BaseConfig.get_sync_custom_stream_wrapper‡  s
   € ô "Ð!r0   c                  ó   — y r=   r>   r?   s    r/   rj   zBaseConfig.custom_llm_provider–  s   € àr0   c                  ó   — y)NFr>   r?   s    r/   Úhas_custom_stream_wrapperz$BaseConfig.has_custom_stream_wrapperš  s   € àr0   c                  ó   — y)z©
        Some providers like Bedrock invoke do not support the stream parameter in the request body.

        By default, this is true for almost all providers.
        Tr>   r?   s    r/   Ú%supports_stream_param_in_request_bodyz0BaseConfig.supports_stream_param_in_request_bodyž  s   € ð r0   c                 ó   — |S )zNHook for providers to post-process streaming responses. Default: pass-through.r>   )r-   ri   s     r/   Úpost_stream_processingz!BaseConfig.post_stream_processing§  s   € àˆr0   r!   Úchunksc                  ó   — y)zNHook for providers to merge chunk metadata into assembled streaming responses.Nr>   )r-   r!   rÃ   s      r/   Ú+apply_assembled_streaming_response_metadataz6BaseConfig.apply_assembled_streaming_response_metadata«  s   € ð 	r0   Úprompt_tokensÚcompletion_tokensc                  ó   — y)a  
        Calculate any additional costs beyond standard token costs.

        This is used for provider-specific infrastructure costs, routing fees, etc.

        Args:
            model: The model name
            prompt_tokens: Number of prompt tokens
            completion_tokens: Number of completion tokens

        Returns:
            Optional dictionary with cost names and amounts, e.g.:
            {"Infrastructure Fee": 0.001, "Routing Cost": 0.0005}
            Returns None if no additional costs apply.
        Nr>   )r-   rh   rÆ   rÇ   s       r/   Úcalculate_additional_costsz%BaseConfig.calculate_additional_costs³  s   € ð  r0   r=   )T)NN)NNNN)F)NNN)<r1   r2   r3   r,   rI   rP   rX   r   r6   rT   r8   r]   ra   rg   r5   rl   Úlistro   r   rr   r(   ÚHTTPStatusErrorrv   ry   rK   r4   r{   r   r}   r�   r’   r–   ÚtupleÚbytesr™   rœ   rŸ   r¡   r*   ÚLiteLLMLoggingObjr§   rª   r7   r   r­   r
   r   r   r   r±   r   r¹   r   r»   rj   r¾   rÀ   rÂ   rÅ   rÉ   r>   r0   r/   r;   r;   E   s	  „ òð ñ
ó ð
ð&NÀDÈÁOÐVZÑDZÐ]aÑDað NÐfjÐmqÑfqó Nðx°dð x¸tó xð
c¸4ð cÀDó cð[Èdð [Ðeió [ð. +/ñ		à�T‰zð	ð �t‘ð	ð ! 4™Zð		ð
 
ó	ð¸Tð È$ð ÐSWó ð	DàÐ'Ñ(ð	Dð 
ÐÑ	ó	DðØ×&Ñ&ðØ8<ðà	óðÀ×AVÑAVð Ðfjð Ðosó ð ð¸ò ó ðð ð°ð ¸ò ó ðð %)ñ,àð,ð ð,ð '+ð	,ð
 "ð,ð 
ó,ð\ ðà ðð ðð ð	ð
 ðð 
òó ðð ð #Ø#ñ
àð
ð ð
ð Ð'Ñ(ð	
ð
 ð
ð ð
ð �t‘ð
ð ˜‘*ð
ð 
ò
ó ð
ð$ #Ø Ø"Ø#'ñàðð ðð ð	ð
 ðð �t‘ðð �T‰zðð �t‘ðð ˜D‘[ðð 
ˆt�U˜T‘\Ð!Ñ	"óð@ #ñà˜‘*ðð �t‘ðð ð	ð
 ðð ðð �t‘ðð 
óð( ðàðð Ð'Ñ(ðð ð	ð
 ðð ðð 
òó ðð
àð
ð Ð'Ñ(ð
ð ð	
ð
 ð
ð ð
ð 
ó
ð* ð #Ø!%ñàðð —n‘nðð (ð	ð
 'ðð ðð Ð'Ñ(ðð ðð ðð -ðð �t‘ðð ˜$‘;ðð 
òó ðð 	¸dð 	Àtó 	ð ð¨Sð ¸sð ÈTÐTY×TaÑTaÑMað Ðfvò ó ðð "'ñ	à! (¨3¡-°¸sÑ1CÀ_Ð"TÑUðð ðð ˜$‘;ð	ð
 
óð" +/Ø!%Ø)-ñ"àð"ð !ð"ð 'ð	"ð
 ð"ð ð"ð ð"ð ð"ð ! 4Ñ'ð"ð ˜$‘;ð"ð   $™,ð"ð 
ó"ð0 9=Ø!%Ø)-ñ"àð"ð !ð"ð 'ð	"ð
 ð"ð ð"ð ð"ð ð"ð Ð.Ñ.°Ñ5ð"ð ˜$‘;ð"ð   $™,ð"ð 
ó"ð ð S¨4¡Zò ó ðð ð¨4ò ó ðð ð°tò ó ðð¨Sð °Só ðà!ðð �S‘	ðð 
ó	ð°ð ÀCð Ð\_ð ÐdhÐkoÑdoô r0   r;   )+Ú__doc__rF   Úabcr   r   Úcollections.abcr   r   Útypingr   r   r	   r
   r(   Úpydanticr   Úlitellm.constantsr   r   Ú&litellm.llms.custom_httpx.http_handlerr   r   Úlitellm.types.llms.openair   r   r   r   r   ÚtiktokenÚ,litellm.litellm_core_utils.streaming_handlerr   Úlitellm.types.utilsr   Ú
base_utilsr   r   Ú*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjrÎ   Ú	Exceptionr   r;   r>   r0   r/   ú<module>rÞ      sr   ðñó ß #ß 3ß 3Ó 3ã Ý ç Kß P÷õ ñ ÛåPÝ1÷ñ
 ÝXà*ÑàÐô'�yô 'ô6~�õ ~r0   