Ë
    uPêj^+  ã                   ó¤   — d Z ddlmZmZ ddl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mZ d	d
lmZ dededz  fd„Z G d„ de«      Zy)zY
Translates from OpenAI's `/v1/chat/completions` to Moonshot AI's `/v1/chat/completions`
é    )Ú	CoroutineÚMapping)ÚAnyÚFinalÚLiteralÚcastÚoverloadN)Ú3handle_messages_with_content_list_to_str_conversion©Úget_secret_str)ÚAllMessageValues)Úsupports_reasoningé   )ÚOpenAIGPTConfigÚvalueÚreturnc                 óp   — t        | t        «      r| j                  d«      n| }t        |t        «      r|S dS )a(  The /v1/messages and /v1/responses bridges wrap the level as {"effort", "summary"} for
    providers with a reasoning-summary surface. Moonshot's API takes only the bare string and 400s
    on an object, so the level is unwrapped and the summary, which has no Moonshot equivalent, is
    dropped.ÚeffortN)Ú
isinstancer   ÚgetÚstr)r   r   s     ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/moonshot/chat/transformation.pyÚ_reasoning_effort_stringr      s1   € ô
 ,6°e¼WÔ+E�E—I‘I˜hÔ'È5€FÜ ¬Ô,ˆ6Ð6°$Ð6ó    c                   óÖ  ‡ — e Z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d
edz  dedz  dededededz  defd„Zdedefˆ fd„Zdededededef
d„Zdee   dee   fd„Zdedee   dedededefˆ fd„Zdee   dedee   fd„Zˆ xZS )ÚMoonshotChatConfigÚmessagesÚmodelÚis_asyncTr   c                  ó   — y ©N© ©Úselfr   r   r   s       r   Ú_transform_messagesz&MoonshotChatConfig._transform_messages   s   € ð 7:r   Fc                  ó   — y r!   r"   r#   s       r   r%   z&MoonshotChatConfig._transform_messages"   s   € ð "%r   c                 óò   •— d}|D ]=  }|j                  d«      }|sŒt        |t        «      sŒ(t        d„ |D «       «      sŒ;d} n |st	        |«      }|rt
        ‰| �  ||d¬«      S t
        ‰| �  ||d¬«      S )aƒ  
        Moonshot text-only models don't support content in list format.
        Multimodal models (kimi-k2.5, kimi-latest, etc.) accept the
        standard OpenAI content array with non-text blocks (image_url,
        input_audio, video_url, file, etc.).

        If any message contains a non-text content part, skip flattening
        so the multimodal payload is preserved.
        FÚcontentc              3   óD   K  — | ]  }|j                  d «      dk7  –— Œ y­w)ÚtypeÚtextN)r   )Ú.0Úcs     r   ú	<genexpr>z9MoonshotChatConfig._transform_messages.<locals>.<genexpr>:   s   è ø€ ÒA°1�q—u‘u˜V“}¨Õ.ÑAùs   ‚ T)r   r   r   )r   r   ÚlistÚanyr
   Úsuperr%   )r$   r   r   r   Úhas_non_textÚmÚ_contentÚ	__class__s          €r   r%   z&MoonshotChatConfig._transform_messages*   s‹   ø€ ð ˆØò 	ˆAØ—u‘u˜YÓ'ˆHÚœJ x´Õ6ÜÑA¸ÔAÕAØ#'�LÙð	ñ ÜJÈ8ÓTˆHáÜ‘7Ñ.¸ÈÐX\Ð.Ó]Ð]ä‘7Ñ.¸ÈÐX]Ð.Ó^Ð^r   Úapi_baseNÚapi_keyc                 óN   — |xs t        d«      xs d}|xs t        d«      }||fS )NÚMOONSHOT_API_BASEúhttps://api.moonshot.ai/v1ÚMOONSHOT_API_KEYr   )r$   r6   r7   Údynamic_api_keys       r   Ú$_get_openai_compatible_provider_infoz7MoonshotChatConfig._get_openai_compatible_provider_infoF   s5   € ð Òbœ~Ð.AÓBÒbÐFbˆØ!(Ò!N¬NÐ;MÓ,NˆØ˜Ð(Ð(r   Úoptional_paramsÚlitellm_paramsÚstreamc                 ó:   — |sd}|j                  d«      s|› d�}|S )zf
        If api_base is not provided, use the default Moonshot AI /chat/completions endpoint.
        r:   z/chat/completions)Úendswith)r$   r6   r7   r   r>   r?   r@   s          r   Úget_complete_urlz#MoonshotChatConfig.get_complete_urlM   s-   € ñ Ø3ˆHà× Ñ Ð!4Ô5Ø"˜Ð#4Ð5ˆHàˆr   c                 ó¢   •— t        d|v rdnd«      }t        ‰| �	  |¬«      }|D �cg c]	  }||vsŒ|‘Œ }}t        |d¬«      rg |¢d‘S |S c c}w )aã  
        Get the supported OpenAI params for Moonshot AI models

        Moonshot AI limitations:
        - functions parameter is not supported (use tools instead)
        - tool_choice doesn't support "required" value
        - kimi-thinking-preview doesn't support tool calls at all

        A reasoning model additionally takes `reasoning_effort`, which the OpenAI base list this
        subtracts from does not carry, so it has to be added back rather than merely kept.
        zkimi-thinking-preview)Ú	functionsÚtoolsÚtool_choice)rE   )r   Úmoonshot©r   Úcustom_llm_providerÚreasoning_effort)Ú	frozensetr1   Úget_supported_openai_paramsr   )r$   r   Úexcluded_paramsÚbase_openai_paramsÚparamÚ	supportedr5   s         €r   rM   z.MoonshotChatConfig.get_supported_openai_paramsa   su   ø€ ô "+Ø5LÐPUÑ5UÑ1Ð[ió"
ˆô %*¡GÑ$GÈeÐ$GÓ$TÐØ/AÖb eÀUÐRaÒEašEÐbˆ	ÐbÜ E¸zÕJØ3�YÐ3Ð 2Ð3Ð3ØÐùò cs
   §	A±AÚnon_default_paramsÚdrop_paramsc                 óf  — | j                  |«      }|j                  «       D ]3  \  }}|dk(  r||d<   Œ||vrŒ|dk(  rt        |«      x}€Œ)||d<   Œ/|||<   Œ5 t        |d¬«      r|j	                  dd«       |S d|v r4t        |d   d«      |d<   |d   d	k  r|j                  d
d«      dkD  rd	|d<   |S )zÙ
        Map OpenAI parameters to Moonshot AI parameters

        Handles Moonshot AI specific limitations:
        - tool_choice doesn't support "required" value
        - Temperature <0.3 limitation for n>1
        Úmax_completion_tokensÚ
max_tokensrK   NrH   rI   Útemperatureé   g333333Ó?Ún)rM   Úitemsr   r   ÚpopÚminr   )	r$   rR   r>   r   rS   Úsupported_openai_paramsrP   r   r   s	            r   Úmap_openai_paramsz$MoonshotChatConfig.map_openai_paramsv   sö   € ð *.×)IÑ)IÈ%Ó)PÐØ.×4Ñ4Ó6ò 		/‰LˆE�5ØÐ/Ò/Ø05� Ò-ØÐ5Ñ5ØØÐ,Ò,Ü6°uÓ=Ð=�FÑJØ:@�OÐ$6Ò7à).� Ò&ð		/ô&  E¸zÕJØ×Ñ ¨tÔ4ð
 Ðð	 ˜oÑ-Ü-0°ÀÑ1OÐQRÓ-SˆO˜MÑ*Ø˜}Ñ-°Ò3¸×8KÑ8KÈCÐQRÓ8SÐVWÒ8WØ14� Ñ.ØÐr   c                 ó   — g }|D ]ö  }|j                  d«      dk(  rÏ|j                  d«      r¾|j                  d«      s­t        t        t        |«      «      }|j                  d«      xs i }|j                  d«      }|r(||d<   t        |«      }|j                  dd«       ||d<   n$t        j
                  j                  d«       d|d<   |j                  t        t        |«      «       Œæ|j                  |«       Œø |S )	uó  
        Moonshot reasoning models require `reasoning_content` on every assistant
        message that contains tool_calls (multi-turn tool-calling flows).

        For each such message that is missing the field:
          1. Check if reasoning_content exists at the top level (for Pydantic models
             that have the attribute but don't support 'in' operator)
          2. Promote provider_specific_fields["reasoning_content"] if present and non-empty
             (this is where LiteLLM stores it from a previous response)
          3. Otherwise inject a single space â€” the minimum value the API accepts
        Messages that already carry the field, or are not assistant/tool-call messages,
        are appended as-is (no copy made).
        ÚroleÚ	assistantÚ
tool_callsÚreasoning_contentÚprovider_specific_fieldsNa  Moonshot reasoning model: assistant tool-call message is missing `reasoning_content`. Injecting a placeholder to satisfy API validation. For best results, preserve `reasoning_content` from the original assistant response when building multi-turn conversation history.ú )	r   Údictr   r[   ÚlitellmÚverbose_loggerÚwarningÚappendr   )r$   r   ÚresultÚmsgÚpatchedÚprovider_fieldsÚstoredÚcleaned_provider_fieldss           r   Úfill_reasoning_contentz)MoonshotChatConfig.fill_reasoning_content    sÿ   € ð 13ˆØò 	#ˆCà—‘˜“ ;Ò.Ø—G‘G˜LÔ)ØŸ™Ø'ôô œt¤D¨#›Ó/�Ø")§+¡+Ð.HÓ"IÒ"OÈR�Ø(×,Ñ,Ð-@ÓA�ÙØ39�GÐ/Ñ0ô /3°?Ó.CÐ+Ø+×/Ñ/Ð0CÀTÔJØ:Q�GÐ6Ò7ä×*Ñ*×2Ñ2ð\ôð 47�GÐ/Ñ0Ø—‘œdÔ#3°WÓ=Õ>à—‘˜cÕ"ð9	#ð: ˆr   Úheadersc                 ó¸   •— |j                  dd«      dk(  r| j                  ||¬«      }t        |d¬«      r| j                  |«      }t        ‰| �  |||||¬«      S )z¤
        Transform the overall request to be sent to the API.
        Returns:
            dict: The transformed request. Sent as the body of the API call.
        rG   NÚrequired)r   r>   rH   rI   )r   r   r>   r?   rr   )r   Ú!_add_tool_choice_required_messager   rq   r1   Útransform_request)r$   r   r   r>   r?   rr   r5   s         €r   rv   z$MoonshotChatConfig.transform_requestÎ   sy   ø€ ð ×Ñ˜}¨dÓ3°zÒAØ×=Ñ=Ø!Ø /ð >ó ˆHô  E¸zÕJØ×2Ñ2°8Ó<ˆHô ‰wÑ(ØØØ+Ø)Øð )ó 
ð 	
r   c                 ó6   — |j                  d«       g |¢dddœ‘S )zÃ
        Add a message to the messages list to indicate that the tool choice is required.

        https://platform.moonshot.ai/docs/guide/migrating-from-openai-to-kimi#about-tool_choice
        rG   Úuserz1Please select a tool to handle the current issue.)r`   r(   )r[   )r$   r   r>   s      r   ru   z4MoonshotChatConfig._add_tool_choice_required_messageï   s6   € ð 	×Ñ˜MÔ*ð
Øð
ð ØNñð
ð 	
r   )Fr!   )Ú__name__Ú
__module__Ú__qualname__r	   r/   r   r   r   r   r   r%   ÚboolÚtupler=   rf   rC   rM   r^   rq   rv   ru   Ú__classcell__)r5   s   @r   r   r      s]  ø„ Øð:ØÐ-Ñ.ð:Ø7:ð:ØFMÈdÁmð:à	�3˜˜TÐ"2Ñ3Ð3Ñ	4ò:ó ð:ð ð
 $)ñ	%àÐ'Ñ(ð%ð ð%ð ˜%‘.ð	%ð
 
ÐÑ	ò%ó ð%ð NSñ_ØÐ-Ñ.ð_Ø7:ð_ØFJð_à	ÐÑ	 )¨C°°dÐ;KÑ6LÐ,LÑ"MÑ	Mõ_ð8)Ø˜d™
ð)Ø-0°4©Zð)à	ˆs�T‰z˜3 ™:Ð%Ñ	&ó)ð #ñà˜‘*ðð �t‘ðð ð	ð
 ðð ðð �t‘ðð 
óð(°ð ¸õ ð*(à ð(ð ð(ð ð	(ð
 ð(ð 
ó(ðT,¨tÐ4DÑ/Eð ,È$ÐO_ÑJ`ó ,ð\
àð
ð Ð'Ñ(ð
ð ð	
ð
 ð
ð ð
ð 
õ
ðB
ØÐ-Ñ.ð
ØAEð
à	ÐÑ	÷
r   r   )Ú__doc__Úcollections.abcr   r   Útypingr   r   r   r   r	   rg   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr
   Úlitellm.secret_managers.mainr   Úlitellm.types.llms.openair   Úlitellm.utilsr   Úopenai.chat.gpt_transformationr   Úobjectr   r   r   r"   r   r   ú<module>rˆ      sP   ðñ÷ /ß 6Õ 6ã õõ 8Ý 6Ý ,å =ð7 Fð 7¨s°T©zó 7ôb
˜õ b
r   