Ë
    uPêjÍw  ã                   ó¸  — d Z ddl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 ddlm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m Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: de;e<ef   ddfd„Z=de>e"   de>e"   fd„Z?erddl@Z@ddlAmBZC eCZDneZD G d„ de9e7e5«      ZE G d„ de«      ZFy)zT
Translates from OpenAI's `/v1/chat/completions` to Databricks' `/chat/completions`
é    N)ÚAsyncIteratorÚ	CoroutineÚIterator)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚcastÚoverload)Ú	BaseModel©ÚRESPONSE_FORMAT_TOOL_NAME)Ú#_handle_invalid_parallel_tool_callsÚ&_should_convert_tool_call_to_json_mode)Ústrip_name_from_message)ÚBaseModelResponseIterator)ÚAllAnthropicToolsValues)ÚAllDatabricksContentValuesÚDatabricksChoiceÚDatabricksFunctionÚDatabricksResponseÚDatabricksTool)	ÚAllMessageValuesÚChatCompletionAssistantMessageÚChatCompletionAssistantToolCallÚ#ChatCompletionRedactedThinkingBlockÚChatCompletionThinkingBlockÚ%ChatCompletionToolChoiceFunctionParamÚ#ChatCompletionToolChoiceObjectParamÚChatCompletionToolMessageÚChatCompletionToolParam)ÚChatCompletionMessageToolCallÚChoicesÚMessageÚModelResponseÚModelResponseStreamÚProviderFieldÚUsageé   )Ú(REASONING_EFFORT_TO_OUTPUT_CONFIG_EFFORTÚAnthropicConfig)ÚOpenAILikeChatConfigé   )ÚDatabricksBaseÚDatabricksExceptionÚmessage_dictÚreturnc                 óæ  — | j                  d«      }|€| j                  dd«       yt        |t        «      r"|j	                  «       s| j                  d«       yt        |t
        «      r„|s| j                  d«       y|D �cg c]K  }t        |t        «      r7|j                  d«      dk(  r#|j                  d«      xs dj	                  «       r|‘ŒM }}|s| j                  d«       y|| d<   yyc c}w )z¢
    Remove or filter content so empty text blocks are not sent.
    Databricks Model Serving uses Anthropic Messages API spec and rejects empty text blocks.
    ÚcontentNÚtypeÚtextÚ )ÚgetÚpopÚ
isinstanceÚstrÚstripÚlistÚdict)r0   r3   ÚblockÚfiltereds       úp/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/databricks/chat/transformation.pyÚ_sanitize_empty_contentrA   :   sì   € ð
 "×%Ñ% iÓ0€GØ€Ø×Ñ˜ DÔ)ØÜ�'œ3ÔØ�}‰}ŒØ×Ñ˜YÔ'ØÜ�'œ4Ô ÙØ×Ñ˜YÔ'Øð !ö
àÜ˜u¤dÔ+°·	±	¸&Ó0AÀVÒ0KÐUZ×U^ÑU^Ð_eÓUfÒUlÐjl×TsÑTsÔTuò ð
ˆð 
ñ
 Ø×Ñ˜YÕ'à&.ˆL˜Ò#ð !ùò
s   ÂAC.Úmessagesc           	      óÂ   ‡ ‡— dt         dt        t        dz  t        f   dt        t
           dt        t           fd„Šdt        t           fˆˆ fd„}t	         |«       «      S )a®  
    Databricks (OpenAI-compatible serving) rejects a ``tool`` message unless the
    message immediately before it carries ``tool_calls``. A single assistant turn
    with parallel tool calls is followed by one ``tool`` message per call, so every
    result after the first is preceded by another ``tool`` message and 400s. Re-emit
    each result right after an assistant message holding only its matching call:
    ``assistant(tool_calls=[A, B]), tool(A), tool(B)`` becomes
    ``assistant(tool_calls=[A]), tool(A), assistant(tool_calls=[B]), tool(B)``.

    Left untouched (no-op) when the turn is already valid or the history is
    malformed, so no tool call is ever dropped.
    Ú	assistantÚcalls_by_idNÚtool_messagesr1   c              3   ó¨   K  — t        |«      D ]@  \  }}||d      }|dk(  rt        t        i | ¥d|gi¥«      –— nt        d|g¬«      –— |–— ŒB y ­w)NÚtool_call_idr   Ú
tool_callsrD   )ÚrolerI   )Ú	enumerater
   r   r   )rD   rE   rF   ÚpositionÚtool_messageÚmatched_calls         r@   Ú_expandz+_split_parallel_tool_calls.<locals>._expandd   sk   è ø€ ô
 '0°Ó&>ò 	Ñ"ˆH�lØ& |°NÑ'CÑDˆLØ˜1Š}ÜÔ+Ð-X°	Ð-X¸<È,ÈÑ-XÓYÓYä4¸+ÐS_ÐR`ÔaÒaØÓñ	ùs   ‚AAc               3   ó~  •K  — d} | t        ‰
«      k  �r‰
|    }|d   dk(  r|j                  d«      nd }|rt        |«      dk  r
|–— | dz  } ŒI| dz   }|t        ‰
«      k  r*‰
|   d   dk(  r|dz  }|t        ‰
«      k  r‰
|   d   dk(  rŒt        t        t           ‰
| dz   | «      }|D �ci c]  }|d   |“Œ
 }}|D �ch c]  }|d	   ’Œ	 }}t        |«      t        |«      k(  r1t        |«      |k(  r# ‰	t        t        |«      ||«      E d {  –—†  |} n	|–— | dz  } | t        ‰
«      k  r�Œy y c c}w c c}w 7 Œ,­w)
Nr   rJ   rD   rI   r-   é   ÚtoolÚidrH   )Úlenr7   r
   r<   r    Úsetr   )ÚindexÚmessagerI   ÚendrF   ÚcallrE   rM   Ú
result_idsrO   rB   s            €€r@   Ú	_generatez-_split_parallel_tool_calls.<locals>._generateq   sa  øè ø€ ØˆØ”c˜(“mÓ#Ø˜u‘oˆGØ6=¸f±oÈÒ6T˜Ÿ™ \Ô2ÐZ^ˆJÙ¤ Z£°1Ò!4Ø’Ø˜‘
�ØØ˜!‘)ˆCØœ˜H›Ò%¨(°3©-¸Ñ*?À6Ò*IØ�q‘�ð œ˜H›Ò%¨(°3©-¸Ñ*?À6Ó*Iä ¤Ô&?Ñ!@À(È5ÐSTÉ9ÐWZÐB[Ó\ˆMØ8BÖC°˜4 ™: tÑ+ÐCˆKÐCØKXÖY¸<˜, ~Ó6ÐYˆJÐYÜ�=Ó!¤S¨£_Ò4¼¸[Ó9IÈZÒ9WÙ"¤4Ô(FÈÓ#PÐR]Ð_lÓm×mÐmØ‘à’Ø˜‘
�ð% ”c˜(“mÖ#ùò DùÚYàmús7   ƒBD=Â!D=Â-D1Â:D=Ã D6ÃAD=ÄD;ÄD=Ä/D=)r   r=   r:   r   r<   r    r   r   )rB   r[   rO   s   ` @r@   Ú_split_parallel_tool_callsr\   V   sh   ù€ ðÜ1ðäœ# ™*Ô&EÐEÑFðô Ô5Ñ6ðô 
Ô"Ñ	#ó	ð”xÔ 0Ñ1ö ô, ‘	“ÓÐó    )ÚLoggingc                   óÖ  ‡ — e Zd ZU dZ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   ez  dz  ed<   dZedz  ed<   	 	 	 	 	 	 d@dedz  dedz  dedz  dedz  dee   ez  dz  dedz  d	dfd
„Zed	edz  fd„«       Zeˆ fd„«       Zd	ee   fd„Z	 	 dAdededee   dedededz  dedz  d	efd„Z	 dBdedz  dedz  dededededz  d	efd„ZdBdedz  d	efd„Zdedz  d	edz  fd„Zdeded	ee   fd„Zdededz  deded	edz  f
d„Z	 dBdedee   ded    dz  d	e ee   ed    dz  f   fd!„Z!	 dCd#ededed$ed%ed	efˆ fd&„Z"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$	 dDdee   ded(e%d*   d	ee   fd+„«       Z(	 dDdee   ded(ed	ee   e&e'e'ee   f   z  fˆ fd,„Z(d-ed	efd.„Z)e*d/e+dz  d	edz  fd0„«       Z,e*d/e+dz  d	e edz  ee-e.z     dz  f   fd1„«       Z/e*d/e+dz  d	ee'   dz  fd2„«       Z0dBd3ee1   d4edz  d	ee2   fd5„Z3	 	 dAded6e4jj                  d7e6d8e7d9edee   deded:d;dedz  d4edz  d	e6fd<„Z8	 dDd=e9e   e:e   z  e6z  d>ed4edz  fd?„Z;ˆ xZ<S )EÚDatabricksConfigzv
    Reference: https://docs.databricks.com/en/machine-learning/foundation-models/api-reference.html#chat-request
    NÚ
max_tokensÚtemperatureÚtop_pÚtop_kÚstopÚnr1   c                 ó¤   — t        «       j                  «       }|j                  «       D ]%  \  }}	|dk7  sŒ|	€Œt        | j                  ||	«       Œ' y )NÚself)ÚlocalsÚcopyÚitemsÚsetattrÚ	__class__)
rh   ra   rb   rc   rd   re   rf   Úlocals_ÚkeyÚvalues
             r@   Ú__init__zDatabricksConfig.__init__    sF   € ô  ›Ÿ™›ˆØ!Ÿ-™-›/ò 	4‰JˆC�Ø�f‹} Ñ!2Ü˜Ÿ™¨¨UÕ3ñ	4r]   c                  ó   — y)NÚ
databricks© ©rh   s    r@   Úcustom_llm_providerz$DatabricksConfig.custom_llm_provider®   s   € àr]   c                 ó    •— t         ‰| �  «       S ©N)ÚsuperÚ
get_config)Úclsrm   s    €r@   rz   zDatabricksConfig.get_config²   s   ø€ ä‰wÑ!Ó#Ð#r]   c                 ó>   — t        dddd¬«      t        dddd¬«      gS )	zDFor a given provider, return it's required fields with a descriptionÚapi_keyÚstringzYour Databricks API Key.zdapi...)Ú
field_nameÚ
field_typeÚfield_descriptionÚfield_valueÚapi_basezYour Databricks API Base.zhttps://adb-..)r'   ru   s    r@   Úget_required_paramsz$DatabricksConfig.get_required_params¶   s8   € ô Ø$Ø#Ø"<Ø%ô	ô Ø%Ø#Ø"=Ø,ô	ð
ð 	
r]   ÚheadersÚmodelrB   Úoptional_paramsÚlitellm_paramsr}   rƒ   c                 ó  — |j                  dd «      xsS |j                  dd «      xs? |j                  d«      xs, t        j                  d«      xs t        j                  d«      }| j	                  ||dd||¬«      \  }}d|d	<   |S )
NÚ
user_agentÚdatabricks_user_agentÚLITELLM_USER_AGENTÚDATABRICKS_USER_AGENTÚchat_completionsF)rƒ   r}   Úendpoint_typeÚcustom_endpointr…   Úcustom_user_agentzapplication/jsonzContent-Type)r8   r7   ÚosÚgetenvÚdatabricks_validate_environment)	rh   r…   r†   rB   r‡   rˆ   r}   rƒ   r‘   s	            r@   Úvalidate_environmentz%DatabricksConfig.validate_environmentÇ   sª   € ð ×Ñ ¨dÓ3ò 2Ø×"Ñ"Ð#:¸DÓAò2à×!Ñ! ,Ó/ò2ô �y‰yÐ-Ó.ò2ô �y‰yÐ0Ó1ð 	ð !×@Ñ@ØØØ,Ø!ØØ/ð Aó 
Ñˆ�'ð #5ˆ�ÑØˆr]   Ústreamc                 ó2   — | j                  |«      }|› d�}|S )Nz/chat/completions)Ú_get_api_base)rh   rƒ   r}   r†   r‡   rˆ   r–   Úcomplete_urls           r@   Úget_complete_urlz!DatabricksConfig.get_complete_urlè   s'   € ð ×%Ñ% hÓ/ˆØ!) 
Ð*;Ð<ˆØÐr]   c                 ó
   — g d¢S )N)r–   re   rb   rc   ra   Úmax_completion_tokensrf   Úresponse_formatÚtoolsÚtool_choiceÚreasoning_effortÚthinkingrt   )rh   r†   s     r@   Úget_supported_openai_paramsz,DatabricksConfig.get_supported_openai_paramsõ   s   € ò
ð 	
r]   rR   c                 óÎ   — |€y |d   t        t        |j                  d«      xs i «      dœ}|j                  d«      }|�t        t        t        z  |«      |d<   t	        d|¬«      S )NÚnameÚinput_schema)r¤   Ú
parametersÚdescriptionÚfunction©r4   r¨   )r
   r=   r7   r:   r   )rh   rR   Úfunction_paramsr§   s       r@   Ú)convert_anthropic_tool_to_databricks_toolz:DatabricksConfig.convert_anthropic_tool_to_databricks_tool  sp   € Øˆ<Øð ˜‘LÜœt T§X¡X¨nÓ%=Ò%CÀÓDñ6
ˆð "ŸX™X mÓ4ˆØÐ"Ü-1´$¼±*¸kÓ-JˆO˜MÑ*äØØ$ô
ð 	
r]   rž   c           	      óž   — d|vr|S | j                  |¬«      \  }}|D �cg c]!  }t        t        | j                  |«      «      ‘Œ# }}|S c c}w )NÚclaude)rž   )Ú
_map_toolsr
   r   r«   )rh   r†   rž   Úanthropic_toolsÚ_rR   Údatabricks_toolss          r@   Ú_map_openai_to_dbrx_toolz)DatabricksConfig._map_openai_to_dbrx_tool  sa   € à˜5Ñ ØˆLð "Ÿ_™_°5˜_Ó9Ñˆ˜àcrö#
Ø[_ŒD” ×!OÑ!OÐPTÓ!UÕVð#
Ðð #
ð  Ðùò#
s    &A
rp   Úis_thinking_enabledc                 óT   — |€y | j                  |||«      }| j                  |«      }|S rx   )Ú%map_response_format_to_anthropic_toolr«   )rh   r†   rp   r‡   r³   rR   Údatabricks_tools          r@   Ú&map_response_format_to_databricks_toolz7DatabricksConfig.map_response_format_to_databricks_tool%  s8   € ð ˆ=Øà×@Ñ@ÀÈÐYlÓmˆà!%×!OÑ!OÐPTÓ!UˆØÐr]   r!   c                 ó
   — ||fS )zø
        Override the parent class method to preserve cache_control for models on Databricks.
        Databricks supports Anthropic-style cache control for Claude models.
        Databricks ignores the cache_control flag with other models.
        rt   )rh   r†   rB   rž   s       r@   Ú1remove_cache_control_flag_from_messages_and_toolszBDatabricksConfig.remove_cache_control_flag_from_messages_and_tools4  s   € ð ˜ˆÐr]   TÚnon_default_paramsÚdrop_paramsÚ-replace_max_completion_tokens_with_max_tokensc                 óf  •— | j                  |«      }t        ‰| �	  ||||«      }d|v r| j                  ||d   ¬«      |d<   d|v r|r|d   |d<   |j	                  dd «       d|v rjd|v rf| j                  ||d   ||«      }|�;| j                  ||g¬«       d|d	<   |s t        d
t        t        ¬«      ¬«      }	|	|d<   |j	                  dd «       d|v rÊd|v rÆ|j                  d«      }
t        j                  |
|dd¬«      }|€%|j	                  dd «       |j	                  dd «       nc||d<   t        j                  |d«      rHd }t        |
t        «      rt!        j                  |
«      }|€t        j"                  ||
d¬«       d|i|d<   |j	                  dd «       | j%                  ||¬«       |S )Nrž   )r†   rž   rœ   ra   r�   r­   )r‡   rž   TÚ	json_moder¨   )r¤   r©   rŸ   r    rs   )r    r†   rv   Úllm_providerr¡   Úoutput_config)r†   rp   r¿   Úeffort)rº   r‡   )r³   ry   Úmap_openai_paramsr²   r8   r·   Ú_add_tools_to_optional_paramsr   r   r   r7   r+   Ú_map_reasoning_effortÚ_is_adaptive_thinking_modelr9   r:   r*   Ú_raise_invalid_reasoning_effortÚ+update_optional_params_with_thinking_tokens)rh   rº   r‡   r†   r»   r¼   r³   Úmapped_paramsÚ_toolÚ_tool_choiceÚreasoning_effort_valueÚmapped_thinkingÚmapped_effortrm   s                €r@   rÂ   z"DatabricksConfig.map_openai_paramsC  s   ø€ ð &*×%=Ñ%=Ð>PÓ%QÐÜ$™wÑ8Ð9KÈ_Ð^cÐepÓqˆØ�mÑ#Ø%)×%BÑ%BÈÐVcÐdkÑVlÐ%BÓ%mˆM˜'Ñ"Ø"Ð&8Ñ8Ñ=jØ*<Ø'ñ+ˆM˜,Ñ'ð ×ÑÐ5°tÔ<àÐ 2Ñ2°xÀ5Ñ7HØ×FÑFØØ"Ð#4Ñ5ØØ#ó	ˆEð Ð Ø×2Ñ2À?Ð[`ÐZaÐ2ÔbØ/3� Ñ,Ù*Ü*MØ'Ü!FÔLeÔ!fô+�Lð 6B�O MÑ2Ø×ÑØ! 4ôð Ð!3Ñ3¸ÀEÑ8IØ,>×,BÑ,BÐCUÓ,VÐ"Ü%4×%JÑ%JØ!7ØØ$0Ø)ô	&ˆOð Ð&Ø×#Ñ# J°Ô5Ø×#Ñ# O°TÕ:à.=� 
Ñ+Ü"×>Ñ>¸uÀlÔSØ04�MÜ!Ð"8¼#Ô>Ü(P×(TÑ(TÐUkÓ(l˜Ø$Ð,Ü'×GÑGØ"'Ø"8Ø)5õð
 9AÀ-Ð7P�O OÑ4Ø×ÑÐ 2°DÔ9à×8Ñ8Ø1À=ð 	9ô 	
ð Ðr]   c                 ó(   — |j                  d«      �yy)zN
        Databricks doesn't support 'response_format' while streaming
        r�   TF)r7   )rh   r‡   s     r@   Ú_should_fake_streamz$DatabricksConfig._should_fake_streamŠ  s   € ð ×ÑÐ0Ó1Ð=Øàr]   Úis_asyncc                  ó   — y rx   rt   ©rh   rB   r†   rÐ   s       r@   Ú_transform_messagesz$DatabricksConfig._transform_messages“  s   € ð 7:r]   Fc                  ó   — y rx   rt   rÒ   s       r@   rÓ   z$DatabricksConfig._transform_messages˜  s   € ð "%r]   c                 óB  •— g }t        |«      D ]£  \  }}t        |t        «      r|j                  d¬«      }n|}t	        |dg¬«      }d|v r0t        |j                  d«      t        «      r| j                  |«      }t        t        t        t        t        f   |«      «       |j                  |«       Œ¥ d|vr t        t        t        t           |«      «      }|r#t         ‰| �E  ||t        t$        d   d«      ¬«      S t         ‰| �E  ||t        t$        d	   d	«      ¬«      S )
zP
        Databricks does not support:
        - 'name' in user message.
        T)Úexclude_noneÚuser)Úallowed_name_rolesÚcache_controlr3   r­   )rB   r†   rÐ   F)rK   r9   r   Ú
model_dumpr   r7   r:   Ú-_move_cache_control_into_string_content_blockrA   r
   r=   r   Úappendr\   r<   r   ry   rÓ   r	   )	rh   rB   r†   rÐ   Únew_messagesÚidxrW   Ú_messagerm   s	           €r@   rÓ   z$DatabricksConfig._transform_messages   s  ø€ ð ˆÜ% hÓ/ò 
	*‰LˆC�Ü˜'¤9Ô-Ø"×-Ñ-¸4Ð-Ó@‘à"�Ü.¨xÈVÈHÔUˆHà (Ñ*¬z¸(¿,¹,ÀyÓ:QÔSVÔ/WØ×MÑMÈhÓW�Ü#¤D¬¬c´3¨h©¸Ó$BÔCØ×Ñ Õ)ð
	*ð ˜5Ñ Ü5´d¼4Ô@PÑ;QÐS_Ó6`ÓaˆLáÜ‘7Ñ.¸ÈEÔ\`ÔahÐimÑanÐptÓ\uÐ.ÓvÐvä‘7Ñ.¸ÈEÔ\`ÔahÐinÑaoÐqvÓ\wÐ.ÓxÐxr]   rW   c                 óÐ   — |j                  d«      }t        t        t        t        f   |j                  «       «      }|j                  d«      }d||dœg|d<   t        t        |«      S )aô  
        Moves message-level cache_control into a content block when content is a string.

        Transforms:
            {"role": "user", "content": "text", "cache_control": {...}}
        Into:
            {"role": "user", "content": [{"type": "text", "text": "text", "cache_control": {...}}]}

        This is required for Anthropic's prompt caching API when cache_control is specified
        at the message level but content is a simple string (not already an array of content blocks).
        r3   rÙ   r5   )r4   r5   rÙ   )r7   r
   r=   r:   r   rj   r8   r   )rh   rW   r3   Útransformed_messagerÙ   s        r@   rÛ   z>DatabricksConfig._move_cache_control_into_string_content_block¼  sk   € ð !Ÿ™ YÓ/ˆä%)¬$¬s´C¨x©.¸'¿,¹,».Ó%IÐØ2×6Ñ6°ÓGˆð ØØ!.ñð*
Ð˜IÑ&ô Ô$Ð&9Ó:Ð:r]   r3   c                 ó  — | €y t        | t        «      r| S t        | t        «      rDd}| D ];  }|j                  d«      dk(  sŒ|j                  dd«      }||�t        |«      ndz  }Œ= |S t	        dt        | «      › �«      ‚)Nr6   r4   r5   zUnsupported content type: )r9   r:   r<   r7   Ú	Exceptionr4   )r3   Úcontent_strÚitemÚ
text_values       r@   Úextract_content_strz$DatabricksConfig.extract_content_strÕ  s‘   € ð ˆ?ØÜ�gœsÔ#ØˆNÜ˜¤Ô&ØˆKØò U�Ø—8‘8˜FÓ# vÓ-Ø!%§¡¨&°"Ó!5�JØ°jÐ6L¤3 z¤?ÐRTÑT‘KðUð ÐäÐ8¼¸g»¸ÐHÓIÐIr]   c           
      ób  — | €yd}d}t        | t        «      r•| D ]�  }|j                  d«      dk(  sŒ|j                  dg «      }t        |t        «      sŒ;|D ]Q  }|€d}||d   z  }t        d|j                  dd«      |j                  d	d«      ¬
«      }|€g }|j	                  |«       ŒS Œ’ ||fS )zN
        Extract and return the reasoning content and thinking blocks
        N©NNr4   Ú	reasoningÚsummaryr6   r5   r¡   Ú	signature)r4   r¡   rì   )r9   r<   r7   r   rÜ   )r3   Úthinking_blocksÚreasoning_contentrå   Úsummary_listÚsumÚthinking_blocks          r@   Úextract_reasoning_contentz*DatabricksConfig.extract_reasoning_contentç  sÚ   € ð ˆ?ØØjnˆØ(,ÐÜ�gœtÔ$Øò C�Ø—8‘8˜FÓ# {Ó2Ø#'§8¡8¨I°rÓ#:�LÜ! ,´Õ5Ø#/ò C˜CØ0Ð8Ø46Ð 1Ø-°°V±Ñ<Ð-Ü-HØ%/Ø),¯©°¸Ó)<Ø*-¯'©'°+¸rÓ*Bô.˜Nð
  /Ð6Ø24 Ø+×2Ñ2°>ÕBñCð	Cð  ! /Ð1Ð1r]   c           	      óæ   — | €y g }t        | t        «      rR| D ]M  }|j                  dd «      }|j                  d«      x}sŒ)|j                  |D �cg c]
  }i |¥d|i¥‘Œ c}«       ŒO |xs d S c c}w )Nr5   Ú	citationsÚsupported_text)r9   r<   r7   rÜ   )r3   rô   rå   r5   Úcitations_itemÚcitations         r@   Úextract_citationsz"DatabricksConfig.extract_citations  s‹   € ð ˆ?ØØˆ	Ü�gœtÔ$Øò l�Ø—x‘x ¨Ó-�Ø%)§X¡X¨kÓ%:Ð:�>Ñ:Ø×$Ñ$Ð[iÖ%jÈxÐ&J¨Ð&JÐ3CÀTÓ&JÒ%jÕkðlð Ò ˜DÐ ùò &ks   ÁA.
Úchoicesr¾   c           
      óÆ  — g }|D �]X  }|d   j                  dd «      }|�4g }|D ]  }t        di |¤Ž}|j                  |«       Œ  t        |«      }	|	�|	}d }
d }|rBt	        ||¬«      r5t        |d   d   j                  dd«      «      xs d }|�t        |¬«      }
d	}|
€•t        j                  |d   d
   «      }t        j                  |d   j                  d
«      «      \  }}t        j                  |d   j                  d
«      «      }t        d||||d   j                  d«      |�d|ind ¬«      }
|€|d   }t        ||d   |
d d ¬«      }|j                  |«       �Œ[ |S )NrW   rI   )rI   Úconvert_tool_call_to_json_moder   r¨   Ú	argumentsr6   )r3   re   r3   rD   rô   )rJ   r3   rî   rí   rI   Úprovider_specific_fieldsÚfinish_reasonrV   )rþ   rV   rW   ÚlogprobsÚenhancementsrt   )r7   r"   rÜ   r   r   r:   r$   r`   rç   rò   rø   r#   )rh   rù   r¾   Útransformed_choicesÚchoicerI   Ú_openai_tool_callsÚ_tcÚ
_openai_tcÚfixed_tool_callsÚtranslated_messagerþ   Újson_mode_content_strrä   rî   rí   rô   Útranslated_choices                     r@   Ú_transform_dbrx_choicesz(DatabricksConfig._transform_dbrx_choices  sÑ  € Ø%'Ðàó 9	:ˆFà 	Ñ*×.Ñ.¨|¸TÓBˆJØÐ%Ø%'Ð"Ø%ò :�CÜ!>Ñ!EÀÑ!E�JØ&×-Ñ-¨jÕ9ð:ô $GÐGYÓ#ZÐ à#Ð/Ø!1�Jà15ÐØ(,ˆMÙÔDØ%Ø/8õô
 58¸
À1¹ÀjÑ8Q×8UÑ8UÐVaÐceÓ8fÓ4gÒ4oÐkoÐ%Ø(Ð4Ü)0Ð9NÔ)OÐ&Ø$*�Mà!Ð)ä.×BÑBÀ6È)ÑCTÐU^ÑC_Ó`�ô %×>Ñ>¸vÀiÑ?P×?TÑ?TÐU^Ó?_Ó`ñØ%Ø#ô -×>Ñ>¸vÀiÑ?P×?TÑ?TÐU^Ó?_Ó`�	ä%,Ø$Ø'Ø&7Ø$3Ø% iÑ0×4Ñ4°\ÓBØJSÐJ_¨{¸IÑ.FÐeiô&Ð"ð Ð$Ø & Ñ 7�ä 'Ø+Ø˜W‘oØ*ØØ!ô!Ðð  ×&Ñ&Ð'8Ö9ðs9	:ðv #Ð"r]   Úraw_responseÚmodel_responseÚlogging_objÚrequest_dataÚencodingztiktoken.Encoding | Nonec           
      ó&  — | j                  |«      }|j                  |d|j                  d|i¬«       	 t        di |j	                  «       ¤Ž}|j                  d«      xs d	}|j                  d
«      xs d}|› d|› �|_
        |d   |_        |d   |_        t        |dt        di |d   ¤Ž«       | j                  |d   |¬«      |_        |S # t
        $ r:}t        |dd «      }t        d|› d|j                  › �|j                  |¬«      ‚d }~ww xY w)Nz
[REDACTED]Úcomplete_input_dict)Úinputr}   Úoriginal_responseÚadditional_argsr…   zUnable to get json response - z, Original Response: )rW   Ústatus_coder…   rv   rs   r†   r6   ú/rS   ÚcreatedÚusagerù   )rù   r¾   rt   )Úredact_sensitive_dataÚ	post_callr5   r   Újsonrã   Úgetattrr/   r  r7   r†   rS   r  rl   r(   r
  rù   )rh   r†   r  r  r  r  rB   r‡   rˆ   r  r}   r¾   Úredacted_request_dataÚcompletion_responseÚeÚresponse_headersÚ_custom_llm_providerÚ_response_models                     r@   Útransform_responsez#DatabricksConfig.transform_responseV  sT  € ð (,×'AÑ'AÀ,Ó'OÐð 	×ÑØØ Ø*×/Ñ/Ø2Ð4IÐJð	 	ô 	
ð	Ü);Ñ)R¸l×>OÑ>OÓ>QÑ)RÐð '5×&8Ñ&8Ð9NÓ&OÒ&_ÐS_ÐØ!4×!8Ñ!8¸Ó!AÒ!GÀRˆØ"6Ð!7°q¸Ð8IÐJˆÔØ/°Ñ5ˆÔØ!4°YÑ!?ˆÔÜ� ¬Ñ)NÐ1DÀWÑ1MÑ)NÔOà!%×!=Ñ!=Ø'¨	Ñ2Øð ">ó "
ˆÔð
 Ðøô) ò 	Ü&-¨l¸IÀtÓ&LÐÜ%Ø8¸¸Ð;PÐQ]×QbÑQbÐPcÐdØ(×4Ñ4Ø(ôð ûð	ús   ´C Ã	DÃ5DÄDÚstreaming_responseÚsync_streamc                 ó   — t        |||¬«      S )N)r$  r%  r¾   )ÚDatabricksChatResponseIterator)rh   r$  r%  r¾   s       r@   Úget_model_response_iteratorz,DatabricksConfig.get_model_response_iteratorˆ  s   € ô .Ø1Ø#Øô
ð 	
r]   )NNNNNNré   rx   )T©F)=Ú__name__Ú
__module__Ú__qualname__Ú__doc__ra   ÚintÚ__annotations__rb   rc   rd   re   r<   r:   rf   rq   Úpropertyrv   Úclassmethodrz   r'   r„   r=   r   r•   Úboolrš   r¢   r   r   r«   r²   r·   Útupler¹   rÂ   rÏ   r   r	   r   r   rÓ   rÛ   Ústaticmethodr   rç   r   r   rò   rø   r   r#   r
  ÚhttpxÚResponser%   ÚLiteLLMLoggingObjr#  r   r   r(  Ú__classcell__©rm   s   @r@   r`   r`   ”   sü  ø… ñð "€J��d‘
Ó!Ø"€K��t‘Ó"Ø€Eˆ3�‰:ÓØ€Eˆ3�‰:ÓØ#'€Dˆ$ˆs‰)�c‰/˜DÑ
 Ó'Ø€A€sˆT�zÓð "&Ø"&Ø Ø Ø'+Øñ4à˜$‘Jð4ð ˜4‘Zð4ð �T‰zð	4ð
 �T‰zð4ð �3‰i˜#‰o Ñ$ð4ð �‰:ð4ð 
ó4ð ð S¨4¡Zò ó ðð ó$ó ð$ð
 T¨-Ñ%8ó 
ð0 #Ø#ñàðð ðð Ð'Ñ(ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óðP #ñà˜‘*ðð �t‘ðð ð	ð
 ðð ðð �t‘ðð 
óñ
°°t±ð 
Àtó 
ð 
Ð>UÐX\Ñ>\ð 
ÐaoÐrvÑavó 
ð(
 ¨cð 
 ¸$ð 
 À4ÈÑCWó 
 ðàðð �d‰{ðð ð	ð
 "ðð 
˜$Ñ	óð& 9=ñ	àðð Ð'Ñ(ðð Ð-Ñ.°Ñ5ð	ð
 
ˆtÐ$Ñ% tÐ,EÑ'FÈÑ'MÐMÑ	Nóð* ?CñEà ðEð ðEð ð	Eð
 ðEð 8<ðEð 
õEðN°4ð ¸Dó ð ð:ØÐ-Ñ.ð:Ø7:ð:ØFMÈdÁmð:à	�3˜˜TÐ"2Ñ3Ð3Ñ	4ò:ó ð:ð ð
 $)ñ	%àÐ'Ñ(ð%ð ð%ð ˜%‘.ð	%ð
 
ÐÑ	ò%ó ð%ð NSñyØÐ-Ñ.ðyØ7:ðyØFJðyà	ÐÑ	 )¨C°°dÐ;KÑ6LÐ,LÑ"MÑ	Mõyð8;ÐEUð ;ÐZjó ;ð2 ðJØ+¨dÑ2ðJà	ˆt‰òJó ðJð" ð2Ø+¨dÑ2ð2à	Øˆd‰
ØÐ(Ð+NÑNÑOÐRVÑVð	Xñ
ò2ó ð2ð@ ð!Ø+¨dÑ2ð!à	ˆc‰�TÑ	ò!ó ð!ñ>#¨tÐ4DÑ/Eð >#ÐRVÐY]ÑR]ð >#ÐimÐnuÑivó >#ðV #Ø!%ñ0àð0ð —n‘nð0ð &ð	0ð
 'ð0ð ð0ð Ð'Ñ(ð0ð ð0ð ð0ð -ð0ð �t‘ð0ð ˜$‘;ð0ð 
ó0ðl "'ñ	

à$ S™M¨M¸#Ñ,>Ñ>ÀÑNð

ð ð

ð ˜$‘;÷	

r]   r`   c                   ó^   ‡ — e Zd Z	 d	dee   ee   z  ez  dededz  fˆ fd„Zde	de
fd„Zˆ xZS )
r'  r$  r%  r¾   Nc                 óB   •— t         ‰| �  ||«       || _        d | _        y rx   )ry   rq   r¾   Ú_last_function_name)rh   r$  r%  r¾   rm   s       €r@   rq   z'DatabricksChatResponseIterator.__init__–  s$   ø€ ô 	‰ÑÐ+¨[Ô9à"ˆŒØ#'ˆÕ r]   Úchunkr1   c           
      óD  — 	 g }|d   D �]º  }|d   j                  d«      }|r”| j                  rˆddlm} ddlm} |d   j                  di «      j                  d«      }|�|| _        | j                  |k(  s||k(  rq ||«      }|�g|j                  d	k(  rd
|_        |j                  |d   d<   d |d   d<   n6|r4|D ]/  }	|	j                  di «      j                  d«      d	k(  sŒ(d
|	d   d<   Œ1 t        |d   j                  d«      t        «      r;|d   d   x}
r1|
d   j                  d«      x}r|d   |d   j                  di «      d<   t        j                  |d   j                  d«      «      }t        j                  |d   j                  d«      «      \  }}||d   d<   ||d   d<   ||d   d<   |j                  |«       �Œ½ t        |d   d|d   |d   ||j                  d«      ¬«      S # t         $ r}t#        d|› d|› �d¬«      ‚d }~wt$        $ r}|‚d }~ww xY w)Nrù   ÚdeltarI   r   r   )Ú!_convert_tool_response_to_messager¨   r¤   z{}r6   r3   rü   rô   rý   r÷   rî   rí   rS   zchat.completion.chunkr  r†   r  )rS   Úobjectr  r†   rù   r  z
KeyError: z+, Got unexpected response from Databricks: i�  )rW   r  )r7   r¾   Úlitellm.constantsr   Ú litellm.llms.base_llm.base_utilsr@  r<  r3   r9   r<   Ú
setdefaultr`   rç   rò   rÜ   r&   ÚKeyErrorr/   rã   )rh   r=  Útranslated_choicesr  rI   r   r@  Úfunction_namerW   r  r3   rô   rä   rî   rí   r  s                   r@   Úchunk_parserz+DatabricksChatResponseIterator.chunk_parser¡  s”  € ðH	Ø(*ÐØ 	Ñ*ó 72�Ø# G™_×0Ñ0°Ó>�
Ù $§.¢.õ Lõð
 %/¨q¡M×$5Ñ$5°jÀ"Ó$E×$IÑ$IÈ&Ó$Q�MØ$Ð0Ø3@˜Ô0ð
 ×0Ñ0Ð4MÒMØ(Ð,EÒEñ #DÀJÓ"O˜Ø"Ð.Ø&Ÿ™°$Ò6Ø24 ¤Ø9@¿¹˜F 7™O¨IÑ6Ø<@˜F 7™O¨LÒ9ÙØ)ò >˜ØŸ7™7 :¨rÓ2×6Ñ6°{ÓCÀtÓKØ;=˜C 
™O¨KÒ8ð>ô ˜f W™o×1Ñ1°)Ó<¼dÔCÐTZÐ[bÑTcÐdmÑTnÐInÈÐInØ$+¨A¡J§N¡N°;Ó$?Ð?�yÐ?ð bkØñb˜˜w™×2Ñ2Ð3MÈrÓRÐS]Ñ^ô /×BÑBÀ6È'Á?×CVÑCVÐW`ÓCaÓb�ô %×>Ñ>¸vÀg¹×?RÑ?RÐS\Ó?]Ó^ñØ%Ø#ð .9��w‘ 	Ñ*Ø7H��w‘Ð 3Ñ4Ø5D��w‘Ð 1Ñ2Ø"×)Ñ)¨&Ö1ðo72ôp 'Ø˜‘;Ø.Ø˜iÑ(Ø˜G‘nØ*Ø—i‘i Ó(ôð øô ò 	Ü%Ø$ Q CÐ'RÐSXÐRYÐZØôð ûô ò 	ØˆGûð	ús+   ‚C G0 Ã#DG0 Ç0	HÇ9HÈHÈHÈHr)  )r*  r+  r,  r   r:   r   r%   r2  rq   r=   r&   rH  r8  r9  s   @r@   r'  r'  •  sW   ø„ ð
 "'ñ		(à$ S™M¨M¸#Ñ,>Ñ>ÀÑNð	(ð ð	(ð ˜$‘;õ		(ðI $ð IÐ+>÷ Ir]   r'  )Gr-  r’   Úcollections.abcr   r   r   Útypingr   r   r   r	   r
   r   r5  Úpydanticr   rB  r   ÚFlitellm.litellm_core_utils.llm_response_utils.convert_dict_to_responser   r   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr   Ú)litellm.llms.base_llm.base_model_iteratorr   Úlitellm.types.llms.anthropicr   Úlitellm.types.llms.databricksr   r   r   r   r   Úlitellm.types.llms.openair   r   r   r   r   r   r   r    r!   Úlitellm.types.utilsr"   r#   r$   r%   r&   r'   r(   Úanthropic.chat.transformationr*   r+   Úopenai_like.chat.transformationr,   Úcommon_utilsr.   r/   r=   r:   rA   r<   r\   ÚtiktokenÚ*litellm.litellm_core_utils.litellm_loggingr^   Ú_LiteLLMLoggingObjr7  r`   r'  rt   r]   r@   ú<module>rY     sâ   ðñó 
ß >Ñ >ß E× Eã Ý å 7÷õõ PÝ @÷õ ÷
÷ 
õ 
÷÷ ñ ÷õ Dß >ð/¨$¨s°C¨x©.ð /¸Tó /ð81¨Ð.>Ñ)?ð 1ÀDÐIYÑDZó 1ñh ÛåXà*ÑàÐô~
�~Ð';¸_ô ~
ôBUÐ%>õ Ur]   