o
    ưi4#                     @   s   d Z ddlZddl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mZmZ ddlmZ dd	lmZ erCdd
lmZ eZneZG dd deeZdS )z 
Support for Snowflake REST API
    N)TYPE_CHECKINGAnyDictListOptionalTupleUnion)AllMessageValues)ChatCompletionMessageToolCallFunctionModelResponse   )OpenAIGPTConfig   )SnowflakeBaseConfig)Loggingc                       sX  e Zd ZdZe fddZdeeee	f  de
eeee  f fddZ		d#d	ed
ejdedededee dedede	dee dee defddZ	d$dee dee d	edededee defddZdeeee	f  deeee	f  fddZdeeeee	f f deeeee	f f fddZd	edee deded edefd!d"Z  ZS )%SnowflakeConfiga.  
    Reference: https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-llm-rest-api

    Snowflake Cortex LLM REST API supports function calling with specific models (e.g., Claude 3.5 Sonnet).
    This config handles transformation between OpenAI format and Snowflake's tool_spec format.
    c                    s
   t   S N)super
get_config)cls	__class__ a/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/snowflake/chat/transformation.pyr   "   s   
zSnowflakeConfig.get_configcontent_listreturnc                 C   s   d}g }t |D ]@\}}|ddkr||dd7 }q|ddkrH|di }t|dddt|ddt|di d	d
}|| q||rO|fS dfS )a  
        Transform Snowflake tool calls to OpenAI format.

        Args:
            content_list: Snowflake's content_list array containing text and tool_use items

        Returns:
            Tuple of (text_content, tool_calls)

        Snowflake format in content_list:
        {
          "type": "tool_use",
          "tool_use": {
            "tool_use_id": "tooluse_...",
            "name": "get_weather",
            "input": {"location": "Paris"}
          }
        }

        OpenAI format (returned tool_calls):
        ChatCompletionMessageToolCall(
            id="tooluse_...",
            type="function",
            function=Function(name="get_weather", arguments='{"location": "Paris"}')
        )
         typetextZtool_useZtool_use_idfunctionnameinput)r!   	arguments)idr   r    N)	enumerategetr
   r   jsondumpsappend)selfr   text_content
tool_callsidxZcontent_itemZtool_use_dataZ	tool_callr   r   r   ._transform_tool_calls_from_snowflake_to_openai&   s$   


z>SnowflakeConfig._transform_tool_calls_from_snowflake_to_openaiNmodelraw_responsemodel_responselogging_objrequest_datamessagesoptional_paramslitellm_paramsencodingapi_key	json_modec                 C   s   |  }|j|d|d|id d|v rKt|d dkrK|d d }d|v rKd|d v rK|d d }| |\}}||d d< |rF||d d	< |d d= tdi |}d
|jpWd |_|d urc||jd< |S )Nr   Zcomplete_input_dict)r"   r8   original_responseZadditional_argschoicesr   messager   contentr,   z
snowflake/r/   r   )r'   Z	post_calllenr.   r   r/   Z_hidden_params)r*   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   Zresponse_jsonchoicer   r+   r,   Zreturned_responser   r   r   transform_responseY   s0   


z"SnowflakeConfig.transform_responseapi_basestreamc                 C   s   |  ||}| dS )zc
        If api_base is not provided, use the default DeepSeek /chat/completions endpoint.
        z/cortex/inference:complete)Z_get_api_base)r*   rA   r8   r/   r5   r6   rB   r   r   r   get_complete_url   s   
z SnowflakeConfig.get_complete_urltoolsc              
   C   sr   g }|D ]2}| ddkr6| di }dd| d| ddi dd	i}d
|v r1|d
 |d d
< || q|S )a  
        Transform OpenAI tool format to Snowflake tool format.

        Args:
            tools: List of tools in OpenAI format

        Returns:
            List of tools in Snowflake format

        OpenAI format:
        {
            "type": "function",
            "function": {
                "name": "get_weather",
                "description": "...",
                "parameters": {...}
            }
        }

        Snowflake format:
        {
            "tool_spec": {
                "type": "generic",
                "name": "get_weather",
                "description": "...",
                "input_schema": {...}
            }
        }
        r   r    Z	tool_specZgenericr!   
parametersobject)r   
properties)r   r!   Zinput_schemadescription)r&   r)   )r*   rD   Zsnowflake_toolstoolr    Zsnowflake_toolr   r   r   _transform_tools   s$   
z SnowflakeConfig._transform_toolstool_choicec                 C   sL   t |tr|S t |tr$|ddkr$|di d}|r$d|gdS |S )a  
        Transform OpenAI tool_choice format to Snowflake format.

        Args:
            tool_choice: Tool choice in OpenAI format (str or dict)

        Returns:
            Tool choice in Snowflake format

        OpenAI format:
        {"type": "function", "function": {"name": "get_weather"}}

        Snowflake format:
        {"type": "tool", "name": ["get_weather"]}

        Note: String values ("auto", "required", "none") pass through unchanged.
        r   r    r!   rI   )r   r!   )
isinstancestrdictr&   )r*   rK   Zfunction_namer   r   r   _transform_tool_choice   s   

z&SnowflakeConfig._transform_tool_choiceheadersc           
      C   sl   | dd pd}| di }| dd }|r| ||d< | dd }	|	r,| |	|d< |||d||S )NrB   F
extra_bodyrD   rK   )r/   r4   rB   )poprJ   rO   )
r*   r/   r4   r5   r6   rP   rB   rQ   rD   rK   r   r   r   transform_request   s    z!SnowflakeConfig.transform_request)NNr   )__name__
__module____qualname____doc__classmethodr   r   r   rM   r   r   r   r
   r.   httpxResponser   LiteLLMLoggingObjrN   r	   boolr@   rC   rJ   r   rO   rS   __classcell__r   r   r   r   r      s    
>	

:
*4
#r   )rW   r'   typingr   r   r   r   r   r   r   rY   Zlitellm.types.llms.openair	   Zlitellm.types.utilsr
   r   r   Zopenai_like.chat.transformationr   utilsr   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjr[   r   r   r   r   r   <module>   s    $