
    g                         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	m
Z
mZ  G d de      Z	 dded	ed
ee   dedee   defdZ G d d      Zy)    N)ListOptional)BaseLLMException)AllMessageValues)ChatCompletionToolCallChunkChatCompletionUsageBlockGenericStreamingChunkc                        e Zd Z fdZ xZS )CohereErrorc                 (    t         |   ||       y )N)status_codemessage)super__init__)selfr   r   	__class__s      U/var/www/openai/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   headersmodelmessagesoptional_paramsapi_keyreturnc                 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   validate_environmentr#      s9    & NN3(.	
 %,WI#6 Nr   c                   N    e Zd Z	 ddedee   fdZdedefdZd Z	d Z
d	 Zd
 Zy)ModelResponseIteratorsync_stream	json_modec                 ^    || _         | j                   | _        g | _        d| _        || _        y )N)streaming_responseresponse_iteratorcontent_blocks
tool_indexr'   )r   r*   r&   r'   s       r   r   zModelResponseIterator.__init__2   s0     #5!%!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)r2   tool_user3   r4   usager1   provider_specific_fieldsz"Failed to decode JSON from chunk: )intgetr	   jsonJSONDecodeError
ValueError)
r   r.   r2   r6   r3   r4   r7   r8   r1   returned_chunks
             r   chunk_parserz"ModelResponseIterator.chunk_parser;   s     	KD>BHKM8<E'+$		'1-.EV}%'E-,@D,H#M2 %o 6e#,7{9K+L(2!'+)AN "!## 	KA%IJJ	Ks   A$A' '"B	c                     | S N r   s    r   __iter__zModelResponseIterator.__iter___   s    r   c                    	 | j                   j                         }	 |}t        |t              r,|j                  d      }|j                  d      }|dk7  r||d  }t        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: zutf-8zdata:r)   )r.   zError parsing chunk: z,
Received chunk: )r+   __next__StopIterationr=   RuntimeError
isinstancebytesdecodefindr;   loadsr?   r   r.   estr_liner1   	data_jsons         r   rG   zModelResponseIterator.__next__b   s    	J**335E	VH%' <<0 g.B;'/H

8,I$$9$55  	  	J!DQCHII	J  	  	V!6qc9LUGTUU	Vs/   B A$B/ B,B''B,/CCCc                 D    | j                   j                         | _        | S rA   )r*   	__aiter__async_response_iteratorrC   s    r   rT   zModelResponseIterator.__aiter__y   s    '+'>'>'H'H'J$r   c                   K   	 | j                   j                          d {   }	 |}t        |t              r,|j                  d      }|j                  d      }|dk7  r||d  }t        j                  |      }| j                  |      S 7 j# 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   )rU   	__anext__StopAsyncIterationr=   rI   rJ   rK   rL   rM   r;   rN   r?   rO   s         r   rW   zModelResponseIterator.__anext__}   s     	J66@@BBE	VH%' <<0 g.B;'/H

8,I$$9$55 C! 	%$$ 	J!DQCHII	J " 	%$$ 	V!6qc9LUGTUU	VsV   C+B BB A$B; C+B B8%B33B88C+;C(C##C((C+N)F)r   r   r   boolr   r   dictr	   r?   rD   rG   rT   rW   rB   r   r   r%   r%   1   sL    QV#/3#@H#!K$ !K+@ !KHV.Vr   r%   rA   )r;   typingr   r   )litellm.llms.base_llm.chat.transformationr   litellm.types.llms.openair   litellm.types.utilsr   r   r	   r   rZ   strr#   r%   rB   r   r   <module>r`      s     ! F 6 C" C " #$ 	
 c] 
>aV aVr   