Ë
    uPêjÂ8  ã                   óÜ   — d dl 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mZmZmZ  G d„ de«      Z G d	„ d
e«      Z	 ddededee	   dededz  defd„Z G d„ d«      Z G d„ d«      Zy)é    N)ÚFinalÚLiteral)ÚBaseLLMModelInfo)ÚBaseLLMException)ÚAllMessageValues)ÚChatCompletionToolCallChunkÚChatCompletionUsageBlockÚGenericStreamingChunkÚProviderSpecificModelInfoc                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚCohereErrorc                 ó(   •— t         ‰| �  ||¬«       y )N)Ústatus_codeÚmessage)ÚsuperÚ__init__)Úselfr   r   Ú	__class__s      €úe/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/cohere/common_utils.pyr   zCohereError.__init__   s   ø€ Ü‰Ñ [¸'ÐÕBó    )Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__)r   s   @r   r   r      s   ø„ ÷Cð Cr   r   c                   ó  — e Zd Zdededz  fd„Zddedz  dedz  dee   fd„Zeddedz  dedz  fd„«       Z	e	 ddedz  dedz  fd	„«       Z
	 	 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dededz  fd„«       Zededed   fd„«       Zy)ÚCohereModelInfoÚmodelÚreturnNc                  ó   — y)zE
        Default values all models of this provider support.
        N© )r   r   s     r   Úget_provider_infoz!CohereModelInfo.get_provider_info   s   € ð r   Úapi_keyÚapi_basec                 ó   — g S )zF
        Returns a list of models supported by this provider.
        r    )r   r"   r#   s      r   Ú
get_modelszCohereModelInfo.get_models   s	   € ð ˆ	r   c                 ó   — | S ©Nr    )r"   s    r   Úget_api_keyzCohereModelInfo.get_api_key$   s   € àˆr   c                 ó   — | S r'   r    )r#   s    r   Úget_api_basezCohereModelInfo.get_api_base(   s	   € ð ˆr   ÚheadersÚmessagesÚoptional_paramsÚlitellm_paramsc                 ó   — i S r'   r    )r   r+   r   r,   r-   r.   r"   r#   s           r   Úvalidate_environmentz$CohereModelInfo.validate_environment.   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CohereModelInfo.get_base_model:   s   � r   )Úv1Úv2c                 ó   — d| v ryy)a  
        Get the Cohere route for the given model.

        Args:
            model: The model name (e.g., "cohere_chat/v2/command-r-plus", "command-r-plus")

        Returns:
            "v2" for standard Cohere v2 API (default), "v1" for Cohere v1 API
        zv1/r4   r5   r    r2   s    r   Úget_cohere_routez CohereModelInfo.get_cohere_routeC   s   € ð �E‰>Øð r   )NNr'   )r   r   r   Ústrr   r!   Úlistr%   Ústaticmethodr(   r*   Údictr   r0   r3   r   r7   r    r   r   r   r      sV  „ ðàðð 
# TÑ	)óñ #¨¡*ð ¸sÀT¹zð ÐUYÐZ]ÑU^ó ð ñ˜S 4™Zð °3¸±:ò ó ðð à#ñØ˜‘*ðà	ˆt‰òó ðð #Ø#ñ
àð
ð ð
ð Ð'Ñ(ð	
ð
 ð
ð ð
ð �t‘ð
ð ˜‘*ð
ð 
ó
ð ð˜cð  c¨D¡jò ó ðð ð ð ¨°
Ñ(;ò ó ñr   r   r+   r   r,   r-   r"   r   c                 óD   — | j                  ddddœ«       |rd|› �| d<   | S )aQ  
    Return headers to use for cohere chat completion request

    Cohere API Ref: https://docs.cohere.com/reference/chat
    Expected headers:
    {
        "Request-Source": "unspecified:litellm",
        "accept": "application/json",
        "content-type": "application/json",
        "Authorization": "Bearer $CO_API_KEY"
    }
    zunspecified:litellmzapplication/json)zRequest-SourceÚacceptzcontent-typezBearer ÚAuthorization)Úupdate)r+   r   r,   r-   r"   s        r   r0   r0   V   s9   € ð& ‡N�Nà3Ø(Ø.ñ	
ôñ Ø%,¨W¨IÐ#6ˆ�Ñ Ø€Nr   c                   ó\   — e Zd Zddededz  fd„Zdedefd„Zd„ Zd	„ Z	de
defd
„Zd„ Zd„ Zy)ÚModelResponseIteratorÚsync_streamÚ	json_modeNc                 ó^   — || _         | j                   | _        g | _        d| _        || _        y ©Néÿÿÿÿ©Ústreaming_responseÚresponse_iteratorÚcontent_blocksÚ
tool_indexrC   ©r   rH   rB   rC   s       r   r   zModelResponseIterator.__init__v   ó.   € Ø"4ˆÔØ!%×!8Ñ!8ˆÔØ$&ˆÔØˆŒØ"ˆ�r   Úchunkr   c           	      ó  — 	 d}d }d}d}d }d }t        |j                  dd«      «      }d|v r|d   }nd|v r|d   du r
|d   }|d   }d	|v rd	|d	   i}t        |||||||¬
«      }	|	S # t        j                  $ r t        d|› �«      ‚w xY w)NÚ FÚindexr   ÚtextÚis_finishedTÚfinish_reasonÚ	citations©rR   Útool_userS   rT   ÚusagerQ   Úprovider_specific_fieldsz"Failed to decode JSON from chunk: )ÚintÚgetr
   ÚjsonÚJSONDecodeErrorÚ
ValueError)
r   rN   rR   rW   rS   rT   rX   rY   rQ   Úreturned_chunks
             r   Úchunk_parserz"ModelResponseIterator.chunk_parser}   sÝ   € ð 	KØˆDØBFˆHØˆKØˆMØ<@ˆEØ'+Ð$ä˜uŸy™y¨°!Ó4Ó5ˆEà˜‰Ø˜V‘}‘Ø %Ñ'¨E°-Ñ,@ÀDÑ,HØ# MÑ2�Ø % oÑ 6�à˜eÑ#Ø,7¸¸{Ñ9KÐ+LÐ(ä$9ØØ!Ø'Ø+ØØØ)Aô%ˆNð "Ð!øä×#Ñ#ò 	KÜÐAÀ%ÀÐIÓJÐJð	Kús   ‚A$A' Á'"B	c                 ó   — | S r'   r    ©r   s    r   Ú__iter__zModelResponseIterator.__iter__¡   ó   € Øˆr   c                 ó  — 	 | j                   j                  «       }	 | j                  |¬«      S # t        $ r t        ‚t        $ r}t	        d|› �«      ‚d }~ww xY w# t        $ r t        ‚t        $ r}t	        d|› d|› �«      ‚d }~ww xY w©Nz#Error receiving chunk from stream: ©rN   zError parsing chunk: z,
Received chunk: ©rI   Ú__next__ÚStopIterationr^   ÚRuntimeErrorÚ"convert_str_chunk_to_generic_chunk©r   rN   Úes      r   ri   zModelResponseIterator.__next__¤   ó¦   € ð	JØ×1Ñ1×:Ñ:Ó<ˆEð	VØ×:Ñ:ÀÐ:ÓGÐGøô ò 	 ÜÐÜò 	JÜÐ!DÀQÀCÐHÓIÐIûð	Jûô
 ò 	 ÜÐÜò 	VÜÐ!6°q°cÐ9LÈUÈGÐTÓUÐUûð	Vúó,   ‚/ �A ¯AÁAÁAÁB	Á3BÂB	c                 óÌ   — |}t        |t        «      r,|j                  d«      }|j                  d«      }|dk7  r||d }t	        j
                  |«      }| j                  |¬«      S )z‰
        Convert a string chunk to a GenericStreamingChunk

        Note: This is used for Cohere pass through streaming logging
        úutf-8údata:rF   Nrg   ©Ú
isinstanceÚbytesÚdecodeÚfindr\   Úloadsr`   ©r   rN   Ústr_linerQ   Ú	data_jsons        r   rl   z8ModelResponseIterator.convert_str_chunk_to_generic_chunk³   ód   € ð ˆÜ�eœUÔ#Ø—|‘| GÓ,ˆHØ#Ÿ=™=¨Ó1ˆEØ˜Š{Ø# E FÐ+�äŸ:™: hÓ/ˆ	Ø× Ñ  yÐ Ó1Ð1r   c                 óD   — | j                   j                  «       | _        | S r'   ©rH   Ú	__aiter__Úasync_response_iteratorrb   s    r   r€   zModelResponseIterator.__aiter__Ä   ó   € Ø'+×'>Ñ'>×'HÑ'HÓ'JˆÔ$Øˆr   c              ƒ   ó4  K  — 	 | j                   j                  «       ƒ d {  –—† }	 | j                  |¬«      S 7 Œ# t        $ r t        ‚t        $ r}t	        d|› �«      ‚d }~ww xY w# t        $ r t        ‚t        $ r}t	        d|› d|› �«      ‚d }~ww xY w­wrf   ©r�   Ú	__anext__ÚStopAsyncIterationr^   rk   rl   rm   s      r   r…   zModelResponseIterator.__anext__È   ó°   è ø€ ð	JØ!%×!=Ñ!=×!GÑ!GÓ!I×IˆEð	VØ×:Ñ:ÀÐ:ÓGÐGð JùÜ!ò 	%Ü$Ð$Üò 	JÜÐ!DÀQÀCÐHÓIÐIûð	Jûô
 "ò 	%Ü$Ð$Üò 	VÜÐ!6°q°cÐ9LÈUÈGÐTÓUÐUûð	VüóN   ‚B„; ¡9¢; §A( ¸B¹; »A%ÁA Á A%Á%BÁ(BÁ?BÂBÂB©F)r   r   r   Úboolr   r;   r
   r`   rc   ri   r8   rl   r€   r…   r    r   r   rA   rA   u   s\   „ ñ#¸ð #ÈÐPTÉó #ð!K $ð !KÐ+@ó !KòHòVð2¸ð 2Ð@Uó 2ò"óVr   rA   c                   óÔ   — e Zd ZdZddededz  fd„Zdedefd„Zdede	dz  fd	„Z
dededz  fd
„Zdededz  fd„Zdedeeeedz  f   fd„Zdedefd„Zd„ Zd„ Zdedefd„Zd„ Zd„ Zy)ÚCohereV2ModelResponseIteratorz2V2-specific response iterator for Cohere streamingrB   rC   Nc                 ó^   — || _         | j                   | _        g | _        d| _        || _        y rE   rG   rL   s       r   r   z&CohereV2ModelResponseIterator.__init__Û   rM   r   rN   r   c                 óÆ   — |j                  di «      }|j                  di «      }|j                  di «      }t        |t        «      r	d|v r|d   S t        |t        «      r|S y)z+Parse content-delta chunks to extract text.Údeltar   ÚcontentrR   rP   )r[   ru   r;   r8   )r   rN   r�   r   r�   s        r   Ú_parse_content_deltaz2CohereV2ModelResponseIterator._parse_content_deltaâ   s_   € à—y‘y ¨"Ó-ˆØŸ™ 9¨bÓ1ˆØ Ÿ™ Y°Ó3ˆÜ�gœtÔ$¨°7Ñ):Ø˜6‘?Ð"Ü˜¤Ô%ØˆNØr   c                 óÔ   — |j                  di «      }|j                  dg «      }|rB|d   j                  dd«      d|d   j                  dd«      |d   j                  dd«      d	œd
œS y)z3Parse tool-call-delta chunks to extract tool calls.r�   Ú
tool_callsr   ÚidrP   ÚfunctionÚnameÚ	arguments)r–   r—   )r”   Útyper•   N©r[   )r   rN   r�   r“   s       r   Ú_parse_tool_call_deltaz4CohereV2ModelResponseIterator._parse_tool_call_deltaí   sx   € à—y‘y ¨"Ó-ˆØ!ŸI™I l°BÓ7ˆ
Ùà  ‘m×'Ñ'¨¨bÓ1Ø"à& q™M×-Ñ-¨f°bÓ9Ø!+¨A¡×!2Ñ!2°;ÀÓ!Cññð ð r   c                 ó    — |j                  di «      }|j                  di «      }|j                  di «      }|j                  dd«      }|rd|iS y)z2Parse tool-plan-delta events to extract tool plan.Údatar�   r   Ú	tool_planrP   Nr™   )r   rN   rœ   r�   r   r�   s         r   Ú_parse_tool_plan_deltaz4CohereV2ModelResponseIterator._parse_tool_plan_deltaü   sS   € à—i‘i ¨Ó+ˆØ—x‘x ¨Ó,ˆØŸ™ 9¨bÓ1ˆØ"Ÿ;™; {°BÓ7ˆ	ÙØ Ð+Ð+Ør   c                 óR  — |j                  di «      }|j                  di «      }|j                  di «      }|j                  di «      }|r]|j                  dd«      |j                  dd«      |j                  dd	«      |j                  d
g «      |j                  dd«      dœ}d|giS y)z1Parse citation-start events to extract citations.rœ   r�   r   rU   Ústartr   ÚendrR   rP   Úsourcesr˜   ÚTEXT_CONTENT)r    r¡   rR   r¢   r˜   Nr™   )r   rN   rœ   r�   r   rU   Úcitation_datas          r   Ú_parse_citation_startz3CohereV2ModelResponseIterator._parse_citation_start  s¤   € à—i‘i ¨Ó+ˆØ—x‘x ¨Ó,ˆØŸ™ 9¨bÓ1ˆØ"Ÿ;™; {°BÓ7ˆ	Ùà"Ÿ™ w°Ó2Ø —}‘} U¨AÓ.Ø!Ÿ™ f¨bÓ1Ø$Ÿ=™=¨°BÓ7Ø!Ÿ™ f¨nÓ=ñ$ˆMð   - Ð1Ð1Ør   c           	      ón  — |j                  di «      }|j                  di «      }d}|j                  dd«      }d}|j                  di «      }|rc|j                  di «      }t        |j                  d	d
«      |j                  dd
«      |j                  d	d
«      |j                  dd
«      z   ¬«      }|||fS )z:Parse message-end events to extract finish info and usage.rœ   r�   TrT   ÚstopNrX   ÚtokensÚinput_tokensr   Úoutput_tokens)Úprompt_tokensÚcompletion_tokensÚtotal_tokens)r[   r	   )	r   rN   rœ   r�   rS   rT   rX   Ú
usage_dataÚtokens_datas	            r   Ú_parse_message_endz0CohereV2ModelResponseIterator._parse_message_end  s´   € à—i‘i ¨Ó+ˆØ—x‘x ¨Ó,ˆØ!ˆØ$Ÿy™y¨¸&ÓAˆàˆØ!ŸI™I g¨rÓ2ˆ
ÙØ!+§¡°¸"Ó!=ˆKÜ,Ø)Ÿo™o¨n¸aÓ@Ø"-§/¡/°/À1Ó"EØ(Ÿ_™_¨^¸QÓ?À+Ç/Á/ÐRaÐcdÓBeÑeôˆEð ˜M¨5Ð0Ð0r   c           	      ó  — 	 d}d}d}d}d}d}t        |j                  dd«      «      }|j                  dd«      }	|j                  dd«      }
|	dk(  r| j                  |«      }n_|	d	k(  r| j                  |«      }nH|
d
k(  r| j	                  |«      }n1|
dk(  r| j                  |«      }n|
dk(  r| j                  |«      \  }}}d|v r|€i }|d   |d<   t        |||||||¬«      S # t        $ r}t        d|› d|› �«      ‚d}~ww xY w)aô  
        Parse Cohere v2 streaming chunks.

        v2 format:
        - Content: chunk.type == "content-delta" -> chunk.delta.message.content.text
        - Tool calls: chunk.type == "tool-call-delta" -> chunk.delta.tool_calls
        - Tool plan: chunk.event == "tool-plan-delta" -> chunk.data.delta.message.tool_plan
        - Citations: chunk.event == "citation-start" -> chunk.data.delta.message.citations
        - Finish: chunk.event == "message-end" -> chunk.data.delta.finish_reason
        rP   NFrQ   r   r˜   Úeventzcontent-deltaztool-call-deltaztool-plan-deltazcitation-startzmessage-endrU   rV   zFailed to parse v2 chunk: z	, chunk: )
rZ   r[   r‘   rš   rž   r¥   r°   r
   Ú	Exceptionr^   )r   rN   rR   rW   rS   rT   rX   rY   rQ   Ú
chunk_typeÚ
event_typern   s               r   r`   z*CohereV2ModelResponseIterator.chunk_parser*  sW  € ð)	OØˆDØ;?ˆHØˆKØˆMØ59ˆEØ'+Ð$ä˜uŸy™y¨°!Ó4Ó5ˆEØ %§	¡	¨&°"Ó 5ˆJØ %§	¡	¨'°2Ó 6ˆJð ˜_Ò,Ø×0Ñ0°Ó7‘ØÐ0Ò0Ø×6Ñ6°uÓ=‘ØÐ0Ò0Ø+/×+FÑ+FÀuÓ+MÑ(ØÐ/Ò/Ø+/×+EÑ+EÀeÓ+LÑ(Ø˜}Ò,Ø48×4KÑ4KÈEÓ4RÑ1�˜]¨Eð ˜eÑ#Ø+Ð3Ø/1Ð,Ø8=¸kÑ8JÐ(¨Ñ5ä(ØØ!Ø'Ø+ØØØ)Aôð øô ò 	OÜÐ9¸!¸¸IÀeÀWÐMÓNÐNûð	Oús   ‚C"C% Ã%	DÃ.C?Ã?Dc                 ó   — | S r'   r    rb   s    r   rc   z&CohereV2ModelResponseIterator.__iter__a  rd   r   c                 ó  — 	 | j                   j                  «       }	 | j                  |¬«      S # t        $ r t        ‚t        $ r}t	        d|› �«      ‚d }~ww xY w# t        $ r t        ‚t        $ r}t	        d|› d|› �«      ‚d }~ww xY wrf   rh   rm   s      r   ri   z&CohereV2ModelResponseIterator.__next__d  ro   rp   c                 óÌ   — |}t        |t        «      r,|j                  d«      }|j                  d«      }|dk7  r||d }t	        j
                  |«      }| j                  |¬«      S )z“
        Convert a string chunk to a GenericStreamingChunk for v2

        Note: This is used for Cohere v2 pass through streaming logging
        rr   rs   rF   Nrg   rt   rz   s        r   rl   z@CohereV2ModelResponseIterator.convert_str_chunk_to_generic_chunks  r}   r   c                 óD   — | j                   j                  «       | _        | S r'   r   rb   s    r   r€   z'CohereV2ModelResponseIterator.__aiter__„  r‚   r   c              ƒ   ó4  K  — 	 | j                   j                  «       ƒ d {  –—† }	 | j                  |¬«      S 7 Œ# t        $ r t        ‚t        $ r}t	        d|› �«      ‚d }~ww xY w# t        $ r t        ‚t        $ r}t	        d|› d|› �«      ‚d }~ww xY w­wrf   r„   rm   s      r   r…   z'CohereV2ModelResponseIterator.__anext__ˆ  r‡   rˆ   r‰   )r   r   r   Ú__doc__rŠ   r   r;   r8   r‘   r   rš   rž   r¥   Útupler	   r°   r
   r`   rc   ri   rl   r€   r…   r    r   r   rŒ   rŒ   Ø   sà   „ Ù<ñ#¸ð #ÈÐPTÉó #ð	¨$ð 	°3ó 	ð¨Dð Ð5PÐSWÑ5Wó ð¨Dð °T¸D±[ó ð¨4ð °D¸4±Kó ð"1¨ð 1°°t¸SÐBZÐ]aÑBaÐ7aÑ1bó 1ð&4O $ð 4OÐ+@ó 4OònòVð2¸ð 2Ð@Uó 2ò"óVr   rŒ   r'   )r\   Útypingr   r   Ú litellm.llms.base_llm.base_utilsr   Ú)litellm.llms.base_llm.chat.transformationr   Úlitellm.types.llms.openair   Úlitellm.types.utilsr   r	   r
   r   r   r   r;   r8   r9   r0   rA   rŒ   r    r   r   ú<module>rÂ      s¤   ðÛ ß !å =Ý FÝ 6÷ó ôCÐ"ô Cô
?Ð&ô ?ðN ñØðàðð Ð#Ñ$ðð ð	ð
 �4‰Zðð 
ó÷>`Vñ `V÷F}Vò }Vr   