
    i2                         d Z ddlmZmZmZmZmZmZmZm	Z	m
Z
mZmZ ddlZddlmZ ddlmZ ddlmZ ddl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  ddl!m"Z"m#Z# ddl$m%Z%  G d de%      Z& G d de      Z'y)zQ
Translate from OpenAI's `/v1/chat/completions` to Groq's `/v1/chat/completions`
    )Any	CoroutineListLiteralOptionalTupleUnioncastoverloadIteratorAsyncIteratorN)$OpenAIChatCompletionStreamingHandler)OpenAIError)	BaseModel)verbose_logger)Loggingget_secret_str)AllMessageValuesChatCompletionAssistantMessageChatCompletionToolParam$ChatCompletionToolParamFunctionChunk)ModelResponseModelResponseStream   )OpenAILikeChatConfigc                   >    e Zd ZU dZee   ed<   dZeee	e
f      ed<   dZee   ed<   dZee
   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZeee	ef      ed	<   dZee   ed
<   dZee   ed<   dZee
   ed<   dZee   ed<   dZeee	e
f      ed<   	 	 	 	 	 	 	 	 	 	 	 	 	 d5dee   deee	e
f      dee   dee
   dee   dee   dee   d	eee	ef      d
ee   dee   dee
   dee   deee	e
f      ddfdZedee	   fd       Ze fd       Z	 d6deee	   ee	   ef   dedee   de fdZ!de	def fdZ"e#de$e%   de	de&d   de'e e e$e%   f   fd       Z(e#	 d6de$e%   de	de&d   de$e%   fd       Z(	 d6de$e%   de	dedee$e%   e'e e e$e%   f   f   f fdZ(d ee	   d!ee	   de)ee	   ee	   f   fd"Z*d#e
defd$Z+d%e
fd&Z,	 	 d7d'e
d#e
de	d(ed)ede
f fd*Z-	 	 d8de	d+e.j^                  d,ed-e0d.e
de$e%   d#e
d/e
d0e d!ee	   dee   def fd1Z1d2ee	   de&d3   fd4Z2 xZ3S )9GroqChatConfigNfrequency_penaltyfunction_call	functions
logit_bias
max_tokensnpresence_penaltystoptemperaturetop_presponse_formattoolstool_choicereturnc                     t               j                         }|j                         D ]%  \  }}|dk7  s|t        | j                  ||       ' y )Nself)localscopyitemssetattr	__class__)r.   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   locals_keyvalues                    v/Users/manta/Documents/Projects/TheRoad-I1/.venv/lib/python3.12/site-packages/litellm/llms/groq/chat/transformation.py__init__zGroqChatConfig.__init__9   sA      (--/!--/JCf}!2U3 *    c                      y)Ngroq )r.   s    r7   custom_llm_providerz"GroqChatConfig.custom_llm_providerN   s    r9   c                      t         |          S N)super
get_config)clsr3   s    r7   rA   zGroqChatConfig.get_configR   s    w!##r9   Fstreaming_responsesync_stream	json_modec                     t        |||      S )N)rC   rD   rE   )"GroqChatCompletionStreamingHandler)r.   rC   rD   rE   s       r7   get_model_response_iteratorz*GroqChatConfig.get_model_response_iteratorV   s     21#
 	
r9   modelc                 ,   t         |   |      }	 |j                  d       	 t	        j
                  || j                        r|j                  d       |S # t        $ r Y @w xY w# t        $ r#}t        j                  d|        Y d }~|S d }~ww xY w)Nmax_retriesrI   r=   reasoning_effortz,Error checking if model supports reasoning: )r@   get_supported_openai_paramsremove
ValueErrorlitellmsupports_reasoningr=   append	Exceptionr   debug)r.   rI   base_paramser3   s       r7   rN   z*GroqChatConfig.get_supported_openai_paramsb   s    g9%@	}-	U))1I1I ""#56   		  	U  #OPQs!STT	Us(   A 2A' 	A$#A$'	B0BBmessagesis_asyncTc                      y r?   r<   r.   rX   rI   rY   s       r7   _transform_messagesz"GroqChatConfig._transform_messagess   s     	r9   c                      y r?   r<   r[   s       r7   r\   z"GroqChatConfig._transform_messagesy   s     	r9   c                 N   t        |      D ]q  \  }}	 t        |t              r|j                         }n|}|j	                  d      dk(  }|sAt        d      }|j                         D ]  \  }	}
|
	|
||	<    |||<   s |rt        | !  ||d      S t        | !  ||d      S )Nrole	assistant)r_   T)rX   rI   rY   F)		enumerate
isinstancer   
model_dumpgetr   r1   r@   r\   )r.   rX   rI   rY   idxmessage_messageassistant_messagenew_messagekvr3   s              r7   r\   z"GroqChatConfig._transform_messages   s     &h/LC '9-"--/" (V 4 C <+N$NN,DAq})*A - !, 0  7.! /   7.! /  r9   api_baseapi_keyc                 N    |xs t        d      xs d}|xs t        d      }||fS )NGROQ_API_BASEzhttps://api.groq.com/openai/v1GROQ_API_KEYr   )r.   rl   rm   dynamic_api_keys       r7   $_get_openai_compatible_provider_infoz3GroqChatConfig._get_openai_compatible_provider_info   s=    
  0o.0/ 	
 "C^N%C((r9   optional_paramsc                 (    |j                  d      yy)zH
        Groq doesn't support 'response_format' while streaming
        r)   TF)rd   )r.   rs   s     r7   _should_fake_streamz"GroqChatConfig._should_fake_stream   s     01=r9   json_schemac                 2    t        dt        d|            S )a3  
        Handles creating a tool call for getting responses in JSON format.

        Args:
            json_schema (Optional[dict]): The JSON schema the response should be in

        Returns:
            AnthropicMessagesTool: The tool call to send to Anthropic API to get responses in JSON format
        functionjson_tool_call)name
parameterstyperx   )r   r   )r.   rv   s     r7   *_create_json_tool_call_for_response_formatz9GroqChatConfig._create_json_tool_call_for_response_format   s"     '9%&
 	
r9   non_default_paramsdrop_params-replace_max_completion_tokens_with_max_tokensc                    |j                  d      }| j                  |      rd|d<   |t        |t              rd }d|v r|d   }nd|v r|d   d   }	 |rt	        j
                  |d      s[d	|v rt	        j                  d
| d|d      dddid}| j                  |      }	|	g|d	<   ||d<   d|d<   |j                  dd        t        
| )  ||||      }|S )Nr)   Tfake_streamresponse_schemarv   schemar;   rL   r*   zGroq model 'as  ' does not support native structured outputs. LiteLLM uses a tool-calling workaround for structured outputs on this model, which is incompatible with user-provided tools. Either use a model that supports native structured outputs (e.g., gpt-oss-120b, llama-4, kimi-k2), or remove the tools parameter. See: https://console.groq.com/docs/structured-outputs#supported-models)rf   rI   llm_providerrx   rz   ry   r|   )rv   r+   rE   )rd   ru   rb   dictrQ   supports_response_schemaBadRequestErrorr~   popr@   map_openai_params)r.   r   rs   rI   r   r   _response_formatrv   _tool_choice_toolr3   s             r7   r   z GroqChatConfig.map_openai_params   sQ    .112CD##$67-1OM*'J7G,N*.K $44./@A"22.}=hG
 &77V "44%55&25' :e %e #()/	 	 !+%+-=$>$L !KK$/ L E 16wOG,5AOM237OK0&**)4  '3
 r9   raw_responsemodel_responselogging_objrequest_datalitellm_paramsencodingc                     t         |   |||||||||	|
|      }| j                  t        |d            }t	        |d|       |S )N)rI   r   r   r   r   rX   rs   r   r   rm   rE   service_tier)original_service_tier)r@   transform_response_map_groq_service_tiergetattrr2   )r.   rI   r   r   r   r   rX   rs   r   r   rm   rE   mapped_service_tierr3   s                r7   r   z!GroqChatConfig.transform_response  ss     3%)#%+) 4 
  ''").."I ( 
 	
 	0CDr9   r   autodefaultflexc                 8    |y|dvryt        t        d   |      S )z@
        Ensure groq service tier is OpenAI compatible.
        r   r   )r
   r   )r.   r   s     r7   r   z%GroqChatConfig._map_groq_service_tier0  s-     !( (CCG568MNNr9   )NNNNNNNNNNNNN)F)FF)NN)4__name__
__module____qualname__r   r   int__annotations__r    r	   strr   r!   listr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r8   propertyr=   classmethodrA   r   r   r   boolr   rH   rN   r   r   r   r   r   r\   r   rr   ru   r~   r   httpxResponseLiteLLMLoggingObjr   r   __classcell__r3   s   @r7   r   r   *   s   '+x}+04M8E#t),-4 $Ix~$!%J% $J$Ax}&*hsm*'+D(5d#
$+!%K#%E8C=&*OXd^* E8D> .2K%T	*+2 ,048$(%)$(*.+/%)#*. $264#C=4  c4i 014 D>	4
 TN4 SM4 C=4 #3-4 uS$Y'(4 c]4 }4 "$4 ~4 eCI./4 
4* Xc]   $ $ %*	

!(3-s1C]"RS

 

 D>	


 


  " -.7:FMdm	3T"233	4 
 
 $)	'(  %.	
 
	  NS-.7:FJ	t$%yc4@P;Q1Q'RR	S8
) 
)08
)	x}hsm+	,
)4 D 

4 ">CB B B 	B
 B 8<B 
B^ "&$("" nn" &	"
 '" " '(" " " " #" D>" 
"HO%-c]O	*	+Or9   r   c                   (     e Zd Zdedef fdZ xZS )rG   chunkr,   c                 (   |j                  d      }|r,t        |j                  d      |j                  d      |      |j                  dg       }|D ]-  }|j                  di       }d|v s|j                  d      |d<   / t        |   |      S )	Nerrorcoderf   )status_coderf   bodychoicesdelta	reasoningreasoning_content)rd   r   r   r@   chunk_parser)r.   r   r   r   choicer   r3   s         r7   r   z/GroqChatCompletionStreamingHandler.chunk_parser?  s    		'"!IIf-uyy7KRW  ))Ir*FJJw+Ee#-2YY{-C)* 
 w#E**r9   )r   r   r   r   r   r   r   r   s   @r7   rG   rG   >  s    +$ ++> + +r9   rG   )(__doc__typingr   r   r   r   r   r   r	   r
   r   r   r   r   +litellm.llms.openai.chat.gpt_transformationr    litellm.llms.openai.common_utilsr   pydanticr   rQ   litellm._loggingr   *litellm.litellm_core_utils.litellm_loggingr   r   litellm.secret_managers.mainr   litellm.types.llms.openair   r   r   r   litellm.types.utilsr   r   openai_like.chat.transformationr   r   rG   r<   r9   r7   <module>r      sn        9   + S 7  C CQO) QOh+)M +r9   