
    ^he6                         S SK r S SKJr  S SKJrJrJrJr  S SKrS SK	r	S SK
Jr  S SKJrJr  S SKJrJr  S SKJr  S SKJrJr   " S	 S
\5      rS\S\S\S\S\S\4S jr " S S5      rg)    N)partial)CallableListOptionalUnion)Logging)custom_promptprompt_factory)AsyncHTTPHandlerget_async_httpx_client)TextChoices)CustomStreamWrapperTextCompletionResponsec                   p   ^  \ rS rSr  SS\\R                     S\\R                     4U 4S jjjrSr	U =r
$ )TextCompletionCodestralError   requestresponsec                    > Xl         X l        Ub  X0l        O[        R                  " SSS9U l        Ub  X@l        O#[        R                  " XR                  S9U l        [        TU ]!  U R                  5        g )NPOSTz8https://docs.codestral.com/user-guide/inference/rest_api)methodurl)status_coder   )	r   messager   httpxRequestr   Responsesuper__init__)selfr   r   r   r   	__class__s        c/home/james-whalen/.local/lib/python3.13/site-packages/litellm/llms/codestral/completion/handler.pyr   %TextCompletionCodestralError.__init__   sk     '"L ==NDL $M!NN'DM 	LL	
    )r   r   r   r   )NN)__name__
__module____qualname____firstlineno__r   r   r   r   r   __static_attributes____classcell__r!   s   @r"   r   r      s;    
 ,0-1
 %--(	

 5>>*
 
r$   r   clientapi_baseheadersdatamodelmessagesc                    #    U R                  XUSS9I S h  vN nUR                  S:w  a  [        UR                  UR                  S9eUR	                  5       nUR                  USUSU0S9  U$  NX7f)NTr.   r/   stream   r   r    complete_input_dictinputapi_keyoriginal_responseadditional_args)postr   r   textaiter_lines	post_call)	r,   r-   r.   r/   r0   r1   logging_objr   completion_streams	            r"   	make_callrD   4   s      [[d[SSHs"* ,,hmm
 	
 !,,.+.5	   ! Ts   A2A0AA2c                     ^  \ rS rSrSU 4S jjrS\\   S\S\4S jrS\4S	 jr	S
\S\
R                  S\S\S\S\S\S\\\4   S\S\4S jrSSS0 4S
\S\S\S\S\S\S\S\S\\\
R(                  4   S\S\\\4   4S jjrSS0 4S
\S\S\S\S\S\S\S\\\
R(                  4   S\4S jjrSSS0 4S
\S\S\S\S\S\S\\\
R(                  4   S\4S jjrS rSrU =r$ )CodestralTextCompletionP   returnNc                 "   > [         TU ]  5         g N)r   r   )r    r!   s    r"   r    CodestralTextCompletion.__init__Q   s    r$   r;   user_headersc                     Uc  [        S5      eSSR                  U5      S.nUb  [        U[        5      (       a  0 UEUEnU$ )NzVMissing CODESTRAL_API_Key - Please add CODESTRAL_API_Key to your environment variableszapplication/jsonz	Bearer {})zcontent-typeAuthorization)
ValueErrorformat
isinstancedict)r    r;   rL   r.   s       r"   _validate_environment-CodestralTextCompletion._validate_environmentT   s[    
 ?h  /(//8
 #
<(F(F11L1Gr$   generated_textc                    / SQnU Hw  nUR                  5       R                  U5      (       a  UR                  USS5      nUR                  U5      (       d  MR  USSS2   R                  USSS2   SS5      SSS2   nMy     U$ )z
Parse the output text to remove any special characters. In our current approach we just check for ChatML tokens.

Initial issue that prompted this - https://github.com/BerriAI/litellm/issues/763
)z<|assistant|>z
<|system|>z<|user|>z<s>z</s>r7      N)strip
startswithreplaceendswith)r    rU   chat_template_tokenstokens       r"   output_parser%CodestralTextCompletion.output_parsere   s     
 *E##%0077!/!7!7r1!E&&u--!/"!5!=!=eDbDk2q!QRVTVRV!W	 *
 r$   r0   r   model_responser4   rB   optional_paramsr/   r1   c                 R   UR                  U	UUR                  SU0S9  U
" SUR                   35        UR                  S:w  a'  [        [	        UR                  5      UR                  S9e UR                  5       nUR                  S/ 5      n/ nU H  nS nSnS nS nUR                  S	0 5      n[        R                  R                  UR                  S
5      UR                  S5      UR                  S5      UR                  S5      S9nUR                  U5        M     [        R                  " UR                  S5      UUR                  S5      UR                  S5      UR                  S5      SUR                  S5      S9nU$ ! [         a    [        UR                  SS9ef = f)Nr8   r9   z#codestral api: raw model_response: r5   )r   r   i  choicesr   r   finish_reasonindexcontentlogprobs)re   rf   r?   rh   idcreatedr0   usageFobject)ri   rd   rj   r0   rk   r4   rl   )rA   r?   r   r   strjson	Exceptiongetlitellmutilsr   appendr   )r    r0   r   ra   r4   rB   rb   r;   r/   r1   print_verboseencodingcompletion_response_original_choices_choiceschoice_finish_reason_index_text	_logprobs_choice_message_choice	_responses                          r"    process_text_completion_response8CodestralTextCompletion.process_text_completion_responsey   s    	&mm2D9	 	 	
 	;HMM?KL3&.HMM*$00 	W"*--/ 033IrB&('F "NFEI$jjB7Omm//$jj9jj)$((3J/	 0 G OOG$3 (6 22"&&t,'++I6%))'2%))'2&**84
	 S  	W.x}}RUVV	Ws   ,F F&r-   custom_prompt_dictrt   timeoutr.   c                    U R                  X5      nU
R                  SS 5      SL a  UnOU=(       d    SnX;   a  XA   n[        US   US   US   US9nO	[        XS9n[        R
                  R                  5       nUR                  5        H  u  nnUU
;  d  M  UU
U'   M     U
R                  S	S
5      nUUS.U
EnUnU	R                  UUUUUUS.S9  USL a>  USL a  U R                  UUUUUUUUU	U
UUUUS9$ U R                  UUUUUUUUU	U
S
UUUUS9$ USL aP  [        R                  R                  UU[        R                  " U5      US9n[        UR!                  5       USU	S9nU$ [        R                  R                  UU[        R                  " U5      S9nU R#                  UUUU
R%                  S	S
5      U	U
UUUUUS9$ )Ncustom_endpointTz/https://codestral.mistral.ai/v1/fim/completionsrolesinitial_prompt_valuefinal_prompt_value)	role_dictr   r   r1   )r0   r1   r4   F)r0   prompt)r8   r.   r-   acompletion)r:   r;   r=   )r0   r1   r/   r-   ra   rt   ru   r;   rB   rb   litellm_params	logger_fnr.   r   )r0   r1   r/   r-   ra   rt   ru   r;   rB   rb   r4   r   r   r.   r   r3   	codestral)custom_llm_providerrB   )r   r.   r/   )r0   r   ra   r4   rB   rb   r;   r/   r1   rt   ru   )rS   popr	   r
   rq   CodestralTextCompletionConfig
get_configitemspre_callasync_streamingasync_completionmodule_level_clientr>   rn   dumpsr   
iter_linesr   rp   )r    r0   r1   r-   r   ra   rt   ru   r;   rB   rb   r   r   r   r   r.   completion_urlmodel_prompt_detailsr   configkvr4   r/   
input_textr   r   s                              r"   
completion"CodestralTextCompletion.completion   s   $ ,,W>0$74?%N MM  &#5#< ".w7%9:P%Q#78L#M!	F $%CF 66AACLLNDAq(%&"	 # !$$Xu5 
 

 
'+"**	 	 		
 $~++%+#1"/%# +$3#1'## ,  $ ,,%+#1"/%# +$3 #1'## -  & T>2277ZZ%	 8 H ,##%$/'	I  2277"ZZ% 8 H
 44)"&&x7#+' 5 
 	
r$   c                   #    [        [        R                  R                  SU0S9n UR	                  X?[
        R                  " U
5      S9I S h  vN nU R!                  UUUU	UUU
UUUUS9$  N! [        R                   aF  n[        UR                  R                  SR                  UR                  R                  5      S9eS nAf[         a'  n[        SSR                  [        U5      5      S9eS nAff = f7f)	Nr   )llm_providerparams)r.   r/   zHTTPStatusError - {}r6   i  z{})r0   r   ra   r4   rB   r;   r/   r1   rt   rb   ru   )r   rq   LlmProvidersTEXT_COMPLETION_CODESTRALr>   rn   r   r   HTTPStatusErrorr   r   r   rP   r?   ro   rm   r   )r    r0   r1   r-   ra   rt   ru   r;   rB   r4   r/   rb   r   r   r   r.   async_handlerr   es                      r"   r   (CodestralTextCompletion.async_completionQ  s    & / --GGw'
	*//

40@ 0  H 44)#'+ 5 
 	
 $$ 	.JJ22.55ajjooF   	.SV)< 	sG   %C;'A/ A-A/ C;-A/ /C8ACC8"C33C88C;c                 |   #    SU	S'   [        S [        [        UU[        R                  " U	5      UUUS9USUS9nU$ 7f)NTr4   )r-   r.   r/   r0   r1   rB   ztext-completion-codestral)rC   rD   r0   r   rB   )r   r   rD   rn   r   )r    r0   r1   r-   ra   rt   ru   r;   rB   r/   r   rb   r   r   r.   streamwrappers                   r"   r   'CodestralTextCompletion.async_streaming  sV     " X+"!ZZ%!'  ;#
 s   :<c                     g rJ    )r    argskwargss      r"   	embedding!CodestralTextCompletion.embedding  s    r$   r   )rH   N)r%   r&   r'   r(   r   r   rm   rR   rS   r_   r   r   r   boolLiteLLMLoggingr   listr   r   floatTimeoutr   r   r   r   r   r)   r*   r+   s   @r"   rF   rF   P   sP   #  
	"C (GG ..G /	G
 G $G G G D#IG G 
 Gl !M
M
 M
 	M

 !M
 /M
  M
 M
 M
 uemm+,M
  !M
" 
%'::	;#M
z !1
1
 1
 	1

 /1
  1
 1
 1
 uemm+,1
" 
 #1
~ "" " 	"
 /"  " " uemm+,"  
!"H r$   rF   )rn   	functoolsr   typingr   r   r   r   r   rq   *litellm.litellm_core_utils.litellm_loggingr   r   3litellm.litellm_core_utils.prompt_templates.factoryr	   r
   &litellm.llms.custom_httpx.http_handlerr   r   litellm.types.utilsr   litellm.utilsr   r   ro   r   rm   rR   r   rD   rF   r   r$   r"   <module>r      s      2 2   P , E
9 
8  	
  8Y Yr$   