Ë
    uPêj¾  ã                   ó:  — d Z ddl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 ddlmZ ddlmZ ddlmZmZ dd	lmZmZmZ  G d
„ de«      Z G d„ de«      Zdee   dedz  fd„Zddededz  defd„Z	 ddee   ez  dz  dedz  dedz  fd„Zdee   dee   fd„Z y)z)
Utility functions for base LLM classes.
é    N)ÚABCÚabstractmethod)ÚAnyÚFinal)Ú_parsingÚ	_pydantic)Ú	BaseModel)Úverbose_logger)ÚAllMessageValuesÚChatCompletionToolCallChunk)ÚMessageÚProviderSpecificModelInfoÚTokenCountResponsec                   óÊ   — e Zd Ze	 	 	 	 ddedeeeef      dz  deeeef      dz  deeef   dz  dedeeeef      dz  dedz  d	edz  fd
„«       Z	e	 ddedz  d	e
fd„«       Zy)ÚBaseTokenCounterNÚmodel_to_useÚmessagesÚcontentsÚ
deploymentÚrequest_modelÚtoolsÚsystemÚreturnc              ƒ   ó   K  — y ­w©N© )Úselfr   r   r   r   r   r   r   s           úe/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/base_llm/base_utils.pyÚcount_tokenszBaseTokenCounter.count_tokens   s   è ø€ ð 	ùs   ‚Úcustom_llm_providerc                  ó   — y)zr
        Returns True if we should the this API for token counting for the selected `custom_llm_provider`
        Fr   )r   r    s     r   Úshould_use_token_counting_apiz.BaseTokenCounter.should_use_token_counting_api    s   € ð ó    )NÚ NNr   )Ú__name__Ú
__module__Ú__qualname__r   ÚstrÚlistÚdictr   r   r   Úboolr"   r   r#   r   r   r      së   „ Øð -1ØØ-1Ø!ñ
àð
ð �t˜C ˜H‘~Ñ&¨Ñ-ð
ð �t˜C ˜H‘~Ñ&¨Ñ-ð	
ð
 ˜˜c˜‘N TÑ)ð
ð ð
ð �D˜˜c˜‘NÑ# dÑ*ð
ð �d‘
ð
ð 
˜dÑ	"ò
ó ð
ð ð +/ñà  4™Zðð 
òó ñr#   r   c                   ó@  — e Zd Zdededz  fd„Zeddedz  dedz  dee   fd„«       Ze	eddedz  dedz  fd„«       «       Z
e	e	 ddedz  dedz  fd	„«       «       Ze	 	 dd
ededee   dedededz  dedz  defd„«       Ze	edededz  fd„«       «       Zdedz  fd„Zy)ÚBaseLLMModelInfoÚmodelr   Nc                  ó   — y)zE
        Default values all models of this provider support.
        Nr   )r   r.   s     r   Úget_provider_infoz"BaseLLMModelInfo.get_provider_info,   s   € ð r#   Úapi_keyÚapi_basec                 ó   — g S )zF
        Returns a list of models supported by this provider.
        r   )r   r1   r2   s      r   Ú
get_modelszBaseLLMModelInfo.get_models5   s	   € ð
 ˆ	r#   c                  ó   — y r   r   )r1   s    r   Úget_api_keyzBaseLLMModelInfo.get_api_key<   s   € ð 	r#   c                  ó   — y r   r   )r2   s    r   Úget_api_basezBaseLLMModelInfo.get_api_baseA   s   € ð
 	r#   Úheadersr   Úoptional_paramsÚlitellm_paramsc                  ó   — y r   r   )r   r9   r.   r   r:   r;   r1   r2   s           r   Úvalidate_environmentz%BaseLLMModelInfo.validate_environmentH   s   € ð 	r#   c                  ó   — y)a2  
        Returns the base model name from the given model name.

        Some providers like bedrock - can receive model=`invoke/anthropic.claude-3-opus-20240229-v1:0` or `converse/anthropic.claude-3-opus-20240229-v1:0`
            This function will return `anthropic.claude-3-opus-20240229-v1:0`
        Nr   ©r.   s    r   Úget_base_modelzBaseLLMModelInfo.get_base_modelU   s   � r#   c                  ó   — y)zä
        Factory method to create a token counter for this provider.

        Returns:
            Optional TokenCounterInterface implementation for this provider,
            or None if token counting is not supported.
        Nr   )r   s    r   Úget_token_counterz"BaseLLMModelInfo.get_token_counter_   s   € ð r#   )NNr   )r%   r&   r'   r(   r   r0   r   r)   r4   Ústaticmethodr6   r8   r*   r   r=   r@   r   rB   r   r#   r   r-   r-   +   sw  „ ðàðð 
# TÑ	)óð ñ #¨¡*ð ¸sÀT¹zð ÐUYÐZ]ÑU^ò ó ðð Øñ˜S 4™Zð °3¸±:ò ó ó ðð Øà#ñØ˜‘*ðà	ˆt‰òó ó ðð
 ð #Ø#ñ
àð
ð ð
ð Ð'Ñ(ð	
ð
 ð
ð ð
ð �t‘ð
ð ˜‘*ð
ð 
ò
ó ð
ð Øð˜cð  c¨D¡jò ó ó ððÐ#3°dÑ#:ô r#   r-   Ú
tool_callsr   c                 óx  — | d   d   j                  d«      }	 |�zt        j                  |«      }t        |t        «      r4|j                  d«      x}�!t        t        j                  |«      ¬«      }|S t        t        j                  |«      ¬«      }|S 	 y# t        j                  $ r t        |¬«      cY S w xY w)z‰
    In JSON mode, Anthropic API returns JSON schema as a tool call, we need to convert it to a message to follow the OpenAI format

    r   ÚfunctionÚ	argumentsNÚvalues)Úcontent)ÚgetÚjsonÚloadsÚ
isinstancer*   r   ÚdumpsÚJSONDecodeError)rD   Újson_mode_content_strÚargsrH   Ú_messages        r   Ú!_convert_tool_response_to_messagerS   j   s´   € ð 0:¸!©}¸ZÑ/H×/LÑ/LÈ[Ó/YÐð6Ø Ð,ÜŸ*™*Ð%:Ó;ˆDÜ˜$¤Ô%°T·X±X¸hÓ5GÐ+G¨6Ð*TÜ"¬4¯:©:°fÓ+=Ô>�Ø�ô #¬4¯:©:°dÓ+;Ô<�Ø�ð -ð øô ×Ñò 6äÐ4Ô5Ò5ð6ús   ™AB Á4 B ÂB9Â8B9Úresponse_formatÚref_templatec                 óŒ   ‡— ‰�@| j                  d«      dk(  r,t        j                  | «      }|d   d   }ˆfd„} ||«       |S | S )NÚtypeÚjson_schemaÚschemac                 óP  •— | g fg}t        «       }|�r|j                  «       \  }}t        |«      }||v rŒ&|j                  |«       t	        |t
        «      ryd|v r.|d   }|j                  d«      d   }‰j                  |¬«      |d<   |j                  «       D ]3  \  }}	t	        |	t
        t        f«      sŒ|j                  |	||gz   f«       Œ5 nQt	        |t        «      rAt        |«      D ]3  \  }
}t	        |t
        t        f«      sŒ|j                  |||
gz   f«       Œ5 |r�Œy y )Nz$refú/éÿÿÿÿr?   )ÚsetÚpopÚidÚaddrM   r*   ÚsplitÚformatÚitemsr)   ÚappendÚ	enumerate)rY   ÚstackÚvisitedÚobjÚpathÚobj_idÚref_pathÚ
model_nameÚkÚvÚiÚitemrU   s               €r   Úupdate_refsz4_dict_to_response_format_helper.<locals>.update_refs‹   s  ø€ Ø# R˜L˜>ˆEÜ ›UˆGâØ!ŸI™I›K‘	��TÜ˜C›�à˜WÑ$ØØ—‘˜FÔ#ä˜c¤4Ô(Ø ‘}Ø#& v¡;˜Ø%-§^¡^°CÓ%8¸Ñ%<˜
Ø&2×&9Ñ&9À
Ð&9Ó&K˜˜F™à #§	¡	£ò :™˜˜1Ü% a¬$´¨Õ6Ø!ŸL™L¨!¨T°Q°C©Z¨Õ9ñ:ô   ¤TÔ*Ü#,¨S£>ò =™˜˜4Ü% d¬T´4¨LÕ9Ø!ŸL™L¨$°¸°s±
Ð);Õ<ð=õ' r#   )rJ   ÚcopyÚdeepcopy)rT   rU   Úmodified_formatrY   rq   s    `   r   Ú_dict_to_response_format_helperru   „   sS   ø€ ØÐ O×$7Ñ$7¸Ó$?À=Ò$Pä!%§¡¨Ó!?ˆØ'¨Ñ6°xÑ@ˆô	=ñ6 	�FÔØÐØÐr#   c                 ó  — | €yt        | t        «      rt        | |«      S t        j                  j                  | «      st        d| › �«      ‚|�| j                  |¬«      }nt        j                  | «      }d|| j                  ddœdœS )zˆ
    Re-implementation of openai's 'type_to_response_format_param' function

    Used for converting pydantic object to api schema.
    Nz#Unsupported response_format type - )rU   rX   T)rY   ÚnameÚstrict)rW   rX   )rM   r*   ru   r   Ú_completionsÚis_basemodel_typeÚ	TypeErrorÚmodel_json_schemar   Úto_strict_json_schemar%   )rT   rU   rY   s      r   Útype_to_response_format_paramr~   «   sš   € ð ÐØä�/¤4Ô(Ü.¨ÀÓMÐMô
 × Ñ ×2Ñ2°?ÔCÜÐ=¸oÐ=NÐOÓPÐPàÐØ ×2Ñ2ÀÐ2ÓM‰ä×0Ñ0°ÓAˆð àØ#×,Ñ,Øñ
ñð r#   r   c                 ó¤   — g }| D ]H  }|d   dk(  r-t        j                  d«       |j                  d|d   dœ«       Œ8|j                  |«       ŒJ |S )zO
    Translate `developer` role to `system` role for non-OpenAI providers.
    ÚroleÚ	developerzCTranslating developer role to system role for non-OpenAI providers.r   rI   )r€   rI   )r
   Údebugrd   )r   Únew_messagesÚms      r   Ú!map_developer_role_to_system_roler…   Ï   sd   € ð 35€LØò #ˆØˆV‰9˜Ò#Ü× Ñ ØUôð ×Ñ¨¸aÀ	¹lÑ KÕLà×Ñ Õ"ð#ð Ðr#   r   )!Ú__doc__rr   rK   Úabcr   r   Útypingr   r   Ú
openai.libr   r   Úpydanticr	   Úlitellm._loggingr
   Úlitellm.types.llms.openair   r   Úlitellm.types.utilsr   r   r   r   r-   r)   rS   r*   r(   ru   rW   r~   r…   r   r#   r   ú<module>rŽ      sÞ   ðñó Û ß #ß ç *Ý å +ß Sß VÑ Vô�sô ô2<�sô <ð~ØÐ0Ñ1ðàˆt�^óñ4$°Tð $ÈÈtÉð $Ð_có $ðR  $ñ!Ø˜)‘_ tÑ+¨dÑ2ð!à˜‘*ð!ð 
ˆD�[ó!ðHØÐ#Ñ$ðà	Ð
Ñôr#   