Ë
    uPêj¶;  ã                   óf  — U d Z ddlmZmZmZ ddlmZmZmZm	Z	m
Z
mZ ddlZddl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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$m%Z% ddl&m'Z' erddl(Z( e)ddh«      Z*ee+d<    G d„ de«      Z, ee-e,df   «      Z.ee+d<    G d„ de'«      Z/ G d„ de«      Z0y)zQ
Translate from OpenAI's `/v1/chat/completions` to Groq's `/v1/chat/completions`
é    )ÚAsyncIteratorÚ	CoroutineÚIterator)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚcastÚoverloadN)Ú	BaseModelÚTypeAdapterÚValidationError)Úverbose_logger)ÚLogging)Ú$OpenAIChatCompletionStreamingHandler)ÚOpenAIError©Úget_secret_str)ÚAllMessageValuesÚChatCompletionAssistantMessageÚChatCompletionToolParamÚ$ChatCompletionToolParamFunctionChunk)ÚModelResponseÚModelResponseStreamÚServerToolUseé   )ÚOpenAILikeChatConfigÚcompoundzcompound-miniÚGROQ_COMPOUND_MODELSc                   ó6   — e Zd ZU dZedz  ed<   dZedz  ed<   y)ÚGroqExecutedToolIdentityNÚnameÚtype)Ú__name__Ú
__module__Ú__qualname__r"   ÚstrÚ__annotations__r#   © ó    új/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/groq/chat/transformation.pyr!   r!   #   s   … Ø€Dˆ#�‰*ÓØ€Dˆ#�‰*Ôr*   r!   .Ú_EXECUTED_TOOLS_ADAPTERc                   óv  ‡ — e Zd ZU dZedz  ed<   dZeez  dz  ed<   dZ	e
dz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZee
z  dz  ed	<   dZedz  ed
<   dZedz  ed<   dZedz  ed<   dZe
dz  ed<   dZeez  dz  ed<   	 	 	 	 	 	 	 	 	 	 	 	 	 d:dedz  deez  dz  de
dz  dedz  dedz  dedz  dedz  d	ee
z  dz  d
edz  dedz  dedz  de
dz  deez  dz  ddfd„Zededz  fd„«       Zeˆ fd„«       Z	 d;dee   ee   z  ez  dededz  defd„Zdede
fˆ fd„Z e!dedefd„«       Z"e#de
e$   dede%d   de&eee
e$   f   fd„«       Z'e#	 d;de
e$   dede%d   de
e$   fd„«       Z'	 d;de
e$   dedede
e$   e&eee
e$   f   z  fˆ fd „Z'd!edz  d"edz  de(edz  edz  f   fd#„Z)d$edefd%„Z*d&efd'„Z+	 	 d<d(ed$eded)ed*edefˆ fd+„Z,	 	 d=ded,e-j\                  d-ed.e/d/ede
e$   d$ed0ed1d2d"edz  dedz  defˆ fd3„Z0d-eddfd4„Z1e!d-ede(edz  d5f   fd6„«       Z2d7edz  de%d8   fd9„Z3ˆ xZ4S )>Ú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/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   Úlocals_ÚkeyÚvalues                    r+   Ú__init__zGroqChatConfig.__init__:   sF   € ô   ›Ÿ™›ˆØ!Ÿ-™-›/ò 	4‰JˆC�Ø�f‹} Ñ!2Ü˜Ÿ™¨¨UÕ3ñ	4r*   c                  ó   — y)NÚgroqr)   )r>   s    r+   Úcustom_llm_providerz"GroqChatConfig.custom_llm_providerO   s   € àr*   c                 ó    •— t         ‰| �  «       S ©N)ÚsuperÚ
get_config)ÚclsrC   s    €r+   rN   zGroqChatConfig.get_configS   s   ø€ ä‰wÑ!Ó#Ð#r*   FÚstreaming_responseÚsync_streamÚ	json_modec                 ó   — t        |||¬«      S )N)rP   rQ   rR   )Ú"GroqChatCompletionStreamingHandler)r>   rP   rQ   rR   s       r+   Úget_model_response_iteratorz*GroqChatConfig.get_model_response_iteratorW   s   € ô 2Ø1Ø#Øô
ð 	
r*   Úmodelc                 ó®  •— t         ‰| �  |«      }	 |j                  d«       | j	                  |«      s2t        j                  || j                  ¬«      s|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©rV   rJ   Úweb_search_optionsÚreasoning_effortz.Error checking if model supports reasoning: %s)rM   Úget_supported_openai_paramsÚremoveÚ
ValueErrorÚ_is_compound_modelÚlitellmÚsupports_web_searchrJ   Úsupports_reasoningÚappendÚ	Exceptionr   Údebug)r>   rV   Úbase_paramsÚerC   s       €r+   r\   z*GroqChatConfig.get_supported_openai_paramsc   sÏ   ø€ Ü"™WÑ@ÀÓGˆð	Ø×Ñ˜}Ô-ð
 ×#Ñ# EÔ*Ü×*Ñ*°ÈD×LdÑLdÕeà×ÑÐ3Ô4ð	VÜ×)Ñ)°È4×KcÑKcÕdØ×"Ñ"Ð#5Ô6ð Ðøô ò 	Ùð	ûô ò 	VÜ× Ñ Ð!QÐST×UÐUàÐûð	Vús)   ’B Á'2B* Â	B'Â&B'Â*	CÂ3CÃCc                 ó0   — | j                  d«      t        v S )Nzgroq/)Úremoveprefixr   )rV   s    r+   r_   z!GroqChatConfig._is_compound_modelx   s   € à×!Ñ! 'Ó*Ô.BÐBÐBr*   ÚmessagesÚis_asyncTc                  ó   — y rL   r)   ©r>   rj   rV   rk   s       r+   Ú_transform_messagesz"GroqChatConfig._transform_messages|   s   € ð 7:r*   c                  ó   — y rL   r)   rm   s       r+   rn   z"GroqChatConfig._transform_messages�   s   € ð "%r*   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)rq   T)rj   rV   rk   F)	Ú	enumerateÚ
isinstancer   Ú
model_dumpÚgetr   rA   rM   rn   )r>   rj   rV   rk   ÚidxÚmessageÚ_messageÚassistant_messageÚnew_messageÚkÚvrC   s              €r+   rn   z"GroqChatConfig._transform_messages‰   sÊ   ø€ ô & hÓ/ò 	,‰LˆC�ðô ˜'¤9Ô-Ø"×-Ñ-Ó/‘à"�Ø (§¡¨VÓ 4¸Ñ CÐÚ Ü<À+ÔN�Ø$ŸN™NÓ,ò +‘D�A�qØ‘}Ø)*˜ Ašð+ð !,�˜’ð	,ñ  Ü‘7Ñ.¸ÈÐX\Ð.Ó]Ð]ä‘7Ñ.¸ÈÐX]Ð.Ó^Ð^r*   Ú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>   r~   r   Údynamic_api_keys       r+   Ú$_get_openai_compatible_provider_infoz3GroqChatConfig._get_openai_compatible_provider_info¡   s3   € ð Òbœ~¨oÓ>ÒbÐBbˆØ!(Ò!J¬N¸>Ó,JˆØ˜Ð(Ð(r*   Úoptional_paramsc                 ó(   — |j                  d«      �yy)zH
        Groq doesn't support 'response_format' while streaming
        r9   TF©rv   )r>   r…   s     r+   Ú_should_fake_streamz"GroqChatConfig._should_fake_stream©   s   € ð ×ÑÐ0Ó1Ð=Øàr*   Ú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)r"   Ú
parameters©r#   r‹   )r   r   )r>   r‰   s     r+   Ú*_create_json_tool_call_for_response_formatz9GroqChatConfig._create_json_tool_call_for_response_format²   s"   € ô 'ØÜ9Ø%Ø&ôô
ð 	
r*   Únon_default_paramsÚdrop_paramsÚ-replace_max_completion_tokens_with_max_tokensc                 óÂ  •— |j                  d«      }| j                  |«      rd|d<   |��t        |t        «      r�d }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 «       |j                  dd «      }
t        ‰| �)  ||||«      }|
€|S |
rt        j                  dt        |
«      «       | j                  |«      r|S t        d„ |j                  d	«      xs dD «       «      s| j!                  |ddig¬«      }|S )Nr9   TÚfake_streamÚresponse_schemar‰   ÚschemarI   rY   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)rx   rV   Úllm_providerr‹   r"   rŒ   rŽ   )r‰   r;   rR   rZ   zKGroq web search enabled; ignoring unsupported web_search_options fields: %sc              3   óD   K  — | ]  }|j                  d «      dk(  –— Œ y­w)r#   Úbrowser_searchNr‡   )Ú.0Útools     r+   ú	<genexpr>z3GroqChatConfig.map_openai_params.<locals>.<genexpr>  s   è ø€ Òg¸D�4—8‘8˜FÓ#Ð'7Õ7Ñgùs   ‚ r)   r#   r™   )r…   r:   )rv   rˆ   rt   Údictr`   Úsupports_response_schemaÚBadRequestErrorr�   ÚpoprM   Úmap_openai_paramsr   ÚinfoÚsortedr_   ÚanyÚ_add_tools_to_optional_params)r>   r�   r…   rV   r‘   r’   Ú_response_formatr‰   Ú_tool_choiceÚ_toolrZ   rC   s              €r+   r¡   z GroqChatConfig.map_openai_paramsÇ   sè  ø€ ð #5×"8Ñ"8Ð9JÓ"KÐØ×#Ñ#Ð$6Ô7Ø-1ˆO˜MÑ*ØÐ'¬JÐ7GÌÔ,NØ'+ˆKØ Ð$4Ñ4Ø.Ð/@ÑA‘ØÐ"2Ñ2Ø.¨}Ñ=¸hÑG�ð
ð Ð&ä×7Ñ7¸eÐY_Õ`ð Ð"4Ñ4Ü%×5Ñ5Ø&2°5°'ð :eð %eð #(Ø)/ô	ð 	ð !+Ø%+Ð-=Ð$>ñ+�Lð $(×#RÑ#RØ$/ð $Só $�Eð 16¨w�O GÑ,Ø5A�O MÑ2Ø37�O KÑ0Ø&×*Ñ*Ø)¨4ôð %7×$:Ñ$:Ð;OÐQUÓ$VÐÜ™'Ñ3Ð4FÈÐY^Ð`kÓlˆØÐ%Ø"Ð"áÜ×ÑØ]ÜÐ)Ó*ôð ×"Ñ" 5Ô)Ø"Ð"ÜÑgÀO×DWÑDWÐX_ÓD`ÒDfÐdfÔgÔgØ"×@Ñ@Ø /ØÐ 0Ð1Ð2ð Aó ˆOð
 Ðr*   Úraw_responseÚmodel_responseÚlogging_objÚrequest_dataÚlitellm_paramsÚencodingztiktoken.Encoding | Nonec                 ó²   •— t         ‰| �  |||||||||	|
|¬«      }| j                  t        |d«      ¬«      }t	        |d|«       | j                  |¬«       |S )N)rV   r©   rª   r«   r¬   rj   r…   r­   r®   r   rR   Úservice_tier)Úoriginal_service_tier)rª   )rM   Útransform_responseÚ_map_groq_service_tierÚgetattrrB   Ú_add_web_search_usage)r>   rV   r©   rª   r«   r¬   rj   r…   r­   r®   r   rR   Úmapped_service_tierrC   s                €r+   r²   z!GroqChatConfig.transform_response  s‡   ø€ ô ™Ñ3ØØ%Ø)Ø#Ø%ØØ+Ø)ØØØð 4ó 
ˆð JN×IdÑIdÜ")¨.¸.Ó"Ið Jeó J
Ðô 	� Ð0CÔDØ×"Ñ"°.Ð"ÔAØÐr*   c                 óè   — t        |dd «      }|€y | j                  |«      }|j                  d«      |j                  d«      z   }|j                  d«      }|dk(  r|dk(  ry t        ||¬«      |_        y )NÚusagezbrowser.searchr™   zbrowser.openr   )Úweb_search_requestsÚbrowser_open_requests)r´   Ú_executed_tool_actionsÚcountr   Úserver_tool_use)r>   rª   r¸   ÚactionsÚsearchesÚopenss         r+   rµ   z$GroqChatConfig._add_web_search_usage:  st   € Ü˜~¨w¸Ó=ˆØˆ=ØØ×4Ñ4°^ÓDˆØ!Ÿ-™-Ð(8Ó9¸G¿M¹MÐJZÓ<[Ñ[ˆØ—}‘} ^Ó4ˆØ�qŠ=˜U ašZØÜ -À(ÐbgÔ hˆÕr*   .c                 ó”   — 	 t        d„ | j                  D «       «      S # t        $ r }t        j                  d|«       Y d }~yd }~ww xY w)Nc           
   3   ó¸   K  — | ]R  }t         j                  t        t        |d d«      dd«      xs d«      D ]  }|j                  xs |j                  –— Œ  ŒT y­w)rx   NÚexecuted_toolsr)   )r,   Úvalidate_pythonr´   r"   r#   )rš   ÚchoiceÚidentitys      r+   rœ   z8GroqChatConfig._executed_tool_actions.<locals>.<genexpr>H  se   è ø€ ò àÜ 7× GÑ GÜœG F¨I°tÓ<Ð>NÐPTÓUÒ[ÐY[ó!òð ð —‘Ò. §¡Ó.ðØ.ñùs   ‚AAzLGroq executed_tools entries did not match the expected shape; not billed: %sr)   )ÚtupleÚchoicesr   r   r¢   )rª   rg   s     r+   r»   z%GroqChatConfig._executed_tool_actionsE  sN   € ð
	Üñ à,×4Ñ4ôó ð øô ò 	Ü×ÑÐ nÐpqÔrÜûð	ús   ‚ ž	A§AÁA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     r+   r³   z%GroqChatConfig._map_groq_service_tierS  s-   € ð !Ð(ØØ Ð(CÑCØä”GÐ5Ñ6Ð8MÓNÐNr*   )NNNNNNNNNNNNN)F)FF)NN)5r$   r%   r&   r/   Úintr(   r0   r'   r�   r1   Úlistr2   r3   r4   r5   r6   r7   r8   r9   r:   r;   rG   ÚpropertyrJ   ÚclassmethodrN   r   r   r   Úboolr   rU   r\   Ústaticmethodr_   r   r   r	   r   rn   rÇ   r„   rˆ   r�   r¡   ÚhttpxÚResponseÚLiteLLMLoggingObjr²   rµ   r»   r³   Ú__classcell__©rC   s   @r+   r.   r.   +   s  ø… Ø$(Ð�s˜T‘zÓ(Ø'+€M�3˜‘: Ñ$Ó+Ø!€Iˆt�d‰{Ó!Ø"€J��t‘Ó"Ø!€J��d‘
Ó!Ø€A€sˆT�zÓØ#'Ð�c˜D‘jÓ'Ø"€Dˆ#�‰*�tÑ
Ó"Ø"€K��t‘Ó"Ø€Eˆ3�‰:ÓØ#'€O�T˜D‘[Ó'Ø€Eˆ4�$‰;ÓØ%)€K��t‘˜dÑ"Ó)ð )-Ø+/Ø!%Ø"&Ø!%ØØ'+Ø"&Ø"&Ø Ø'+Ø!Ø)-ñ4à ™:ð4ð ˜T‘z DÑ(ð4ð ˜$‘;ð	4ð
 ˜4‘Kð4ð ˜$‘Jð4ð �‰:ð4ð  ™*ð4ð �D‰j˜4Ñð4ð ˜4‘Zð4ð �T‰zð4ð  ™ð4ð �d‰{ð4ð ˜4‘Z $Ñ&ð4ð 
ó4ð* ð S¨4¡Zò ó ðð ó$ó ð$ð "'ñ	

à$ S™M¨M¸#Ñ,>Ñ>ÀÑNð

ð ð

ð ˜$‘;ð	

ð
 
ó

ð°ð ¸õ ð* ðC #ð C¨$ò Có ðCð ð:ØÐ-Ñ.ð:Ø7:ð:ØFMÈdÁmð:à	�3˜˜TÐ"2Ñ3Ð3Ñ	4ò:ó ð:ð ð
 $)ñ	%àÐ'Ñ(ð%ð ð%ð ˜%‘.ð	%ð
 
ÐÑ	ò%ó ð%ð NSñ_ØÐ-Ñ.ð_Ø7:ð_ØFJð_à	ÐÑ	 )¨C°°dÐ;KÑ6LÐ,LÑ"MÑ	Mõ_ð0)Ø˜d™
ð)Ø-0°4©Zð)à	ˆs�T‰z˜3 ™:Ð%Ñ	&ó)ð°4ð ¸Dó ð
àó
ð4 "Ø>CñNà ðNð ðNð ð	Nð
 ðNð 8<ðNð 
õNðv #Ø!%ñ!àð!ð —n‘nð!ð &ð	!ð
 'ð!ð ð!ð Ð'Ñ(ð!ð ð!ð ð!ð -ð!ð �t‘ð!ð ˜$‘;ð!ð 
õ!ðF	i°Mð 	iÀdó 	ið ð¨}ð ÀÀsÈTÁzÐSVÀÑAWò ó ðð	O¸CÀ$¹Jð 	OÈ7ÐSlÑKm÷ 	Or*   r.   c                   ó(   ‡ — e Zd Zdedefˆ fd„Zˆ xZS )rT   Ú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Úcoderx   )Ústatus_coderx   ÚbodyrÈ   ÚdeltaÚ	reasoningÚreasoning_content)rv   r   r    rM   Úchunk_parser)r>   rÚ   rÜ   rÈ   rÅ   rà   rC   s         €r+   rã   z/GroqChatCompletionStreamingHandler.chunk_parser`  s—   ø€ Ø—y‘y Ó)ˆÙÜ¨%¯)©)°FÓ*;ÀUÇYÁYÈyÓEYÐ`eÔfÐfð Ÿ™ 9¨bÓ1ˆØò 	DˆFØ—J‘J˜w¨Ó+ˆEØ˜eÒ#Ø-2¯Y©Y°{Ó-C�Ð)Ò*ð	Dô
 ‰wÑ# EÓ*Ð*r*   )r$   r%   r&   r�   r   rã   r×   rØ   s   @r+   rT   rT   _  s   ø„ ð+ $ð +Ð+>÷ +ñ +r*   rT   )1Ú__doc__Úcollections.abcr   r   r   Útypingr   r   r   r	   r
   r   rÔ   Úpydanticr   r   r   r`   Úlitellm._loggingr   Ú*litellm.litellm_core_utils.litellm_loggingr   rÖ   Ú+litellm.llms.openai.chat.gpt_transformationr   Ú litellm.llms.openai.common_utilsr   Úlitellm.secret_managers.mainr   Úlitellm.types.llms.openair   r   r   r   Úlitellm.types.utilsr   r   r   Úopenai_like.chat.transformationr   ÚtiktokenÚ	frozensetr   r(   r!   rÇ   r,   r.   rT   r)   r*   r+   ú<module>rò      s°   ðò÷ ?Ñ >ß E× Eã ß <Ñ <ã Ý +Ý Sõõ 9Ý 7÷ó ÷ RÑ Qå CáÛá'¨°_Ð(EÓFÐ �eÓ Fô˜yô ñ
 "-¨UÐ3KÈSÐ3PÑ-QÓ!RÐ ˜Ó RôqOÐ)ô qOôh	+Ð)Mõ +r*   