Ë
    uPêj00  ã                   ó¶   — d dl 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mZ d dlmZ dd	lmZ dd
lmZmZmZ erd dlmZ  G d„ de«      Zy)é    N)ÚTYPE_CHECKINGÚAnyÚFinal)ÚAuthenticationError)ÚAnthropicConfig)ÚOpenAIConfig)ÚAllMessageValuesÚChatCompletionToolCallChunk)ÚModelResponseé   )ÚAuthenticator)ÚDEFAULT_GITHUB_COPILOT_API_BASEÚGetAPIKeyErrorÚget_copilot_default_headers)ÚLoggingc                   óþ  ‡ — e Zd Z	 	 	 d#dedz  dedz  deddfˆ fd„Zdededz  dedz  dedeedz  edz  ef   f
d„Zdefd	„Z	 	 d$d
edede	e
   dedededz  dedz  defˆ fd„Zdede	fˆ fd„Zde	e
   defd„Zde	e
   defd„Zede	e   deee	e   e	e   dz  f   fd„«       Zededefd„«       Zededefd„«       Zdedefd„Z	 	 d$dedej2                  dddddede	e
   deded ededz  d!edz  ddfˆ fd"„Zˆ xZS )%ÚGithubCopilotConfigNÚapi_keyÚapi_baseÚcustom_llm_providerÚreturnc                 ó@   •— t         ‰| �  «        t        «       | _        y )N)ÚsuperÚ__init__r   Úauthenticator)Úselfr   r   r   Ú	__class__s       €út/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/github_copilot/chat/transformation.pyr   zGithubCopilotConfig.__init__   s   ø€ ô 	‰ÑÔÜ*›_ˆÕó    Úmodelc                 ó  — |xs9 | j                   j                  «       xs t        j                  d«      xs t        }	 | j                   j                  «       }|||fS # t        $ r}t        ||t        |«      ¬«      ‚d }~ww xY w)NÚGITHUB_COPILOT_API_BASE)r    Úllm_providerÚmessage)	r   Úget_api_baseÚosÚgetenvr   Úget_api_keyr   r   Ústr)r   r    r   r   r   Údynamic_api_baseÚdynamic_api_keyÚes           r   Ú$_get_openai_compatible_provider_infoz8GithubCopilotConfig._get_openai_compatible_provider_info"   s”   € ð ò /Ø×!Ñ!×.Ñ.Ó0ò/ä�y‰yÐ2Ó3ò/ô /ð	 	ð	Ø%)×%7Ñ%7×%CÑ%CÓ%EˆOð   Ð2EÐEÐEøô ò 	Ü%ØØ0Ü˜A›ôð ûð	ús   ¿A Á	BÁ'A>Á>Bc                 óÔ   — dd l }|j                  r|S g }|D ]N  }|j                  d«      dk(  r'|j                  «       }d|d<   |j	                  |«       Œ>|j	                  |«       ŒP |S )Nr   ÚroleÚsystemÚ	assistant)ÚlitellmÚ#disable_copilot_system_to_assistantÚgetÚcopyÚappend)r   Úmessagesr    r2   Útransformed_messagesr$   Útransformed_messages          r   Ú_transform_messagesz'GithubCopilotConfig._transform_messages9   s}   € ó
 	ð ×6Ò6ð ˆOð ')ÐØò 	5ˆGØ�{‰{˜6Ó" hÒ.à&-§l¡l£nÐ#Ø.9Ð# FÑ+Ø$×+Ñ+Ð,?Õ@à$×+Ñ+¨GÕ4ð	5ð $Ð#r   Úheadersr7   Úoptional_paramsÚlitellm_paramsc           	      ó   •— t         ‰| �  |||||||«      }	 | j                  j                  «       }	t	        |	«      }
i |
¥|¥}| j                  |«      }||d<   | j                  |«      rd|d<   |S # t
        $ r Y Œ9w xY w)NzX-InitiatorÚtruezCopilot-Vision-Request)r   Úvalidate_environmentr   r(   r   r   Ú_determine_initiatorÚ_has_vision_content)r   r;   r    r7   r<   r=   r   r   Úvalidated_headersÚcopilot_api_keyÚcopilot_headersÚ	initiatorr   s               €r   r@   z(GithubCopilotConfig.validate_environmentS   s¬   ø€ ô "™GÑ8Ø�U˜H o°~ÀwÐPXó
Ðð
	Ø%)×%7Ñ%7×%CÑ%CÓ%EˆOÜ%@ÀÓ%QˆOØ H ?Ð HÐ6GÐ HÐð
  ×4Ñ4°XÓ>ˆ	Ø+4Ð˜-Ñ(ð ×#Ñ# HÔ-Ø:@ÐÐ6Ñ7à Ð øô ò 	Ùð	ús   ˜+A1 Á1	A=Á<A=c                 óØ   •— ddl m} t        ‰| �  |«      }d|j	                  «       v rA ||j	                  «       ¬«      r*d|vr|j                  d«       d|vr|j                  d«       |S )aK  
        Get supported OpenAI parameters for GitHub Copilot.

        For Claude models that support extended thinking (Claude 4 family and Claude 3-7), includes thinking and reasoning_effort parameters.
        For other models, returns standard OpenAI parameters (which may include reasoning_effort for o-series models).
        r   )Úsupports_reasoningÚclaude)r    ÚthinkingÚreasoning_effort)Úlitellm.utilsrH   r   Úget_supported_openai_paramsÚlowerr6   )r   r    rH   Úbase_paramsr   s       €r   rM   z/GithubCopilotConfig.get_supported_openai_paramst   so   ø€ õ 	5ô #™WÑ@ÀÓGˆð �u—{‘{“}Ñ$Ñ);Ø—+‘+“-õ*
ð  Ñ,Ø×"Ñ" :Ô.à!¨Ñ4Ø×"Ñ"Ð#5Ô6àÐr   c                 ó@   — |D ]  }|j                  d«      }|dv sŒ y y)z²
        Determine if request is user or agent initiated based on message roles.
        Returns 'agent' if any message has role 'tool' or 'assistant', otherwise 'user'.
        r/   )Útoolr1   ÚagentÚuser)r4   )r   r7   r$   r/   s       r   rA   z(GithubCopilotConfig._determine_initiatorŒ   s2   € ð
  ò 	ˆGØ—;‘;˜vÓ&ˆDØÐ,Ò,Ùð	ð r   c                 óÆ   — |D ]\  }|j                  d«      }t        |t        «      sŒ%|D ]3  }t        |t        «      sŒd|v r  y|j                  d«      }|dk(  sŒ2  y Œ^ y)a  
        Check if any message contains vision content (images).
        Returns True if any message has content with vision-related types, otherwise False.

        Checks for:
        - image_url content type (OpenAI format)
        - Content items with type 'image_url'
        ÚcontentÚ	image_urlTÚtypeF)r4   Ú
isinstanceÚlistÚdict)r   r7   r$   rU   Úcontent_itemÚcontent_types         r   rB   z'GithubCopilotConfig._has_vision_content—   so   € ð  ò 	(ˆGØ—k‘k )Ó,ˆGÜ˜'¤4Õ(à$+ò (�LÜ! ,´Õ5à&¨,Ñ6Ú#'à'3×'7Ñ'7¸Ó'?˜Ø'¨;Ó6Ú#'ñ(ð		(ð r   Úcontent_blocksc                 óV   — t        «       j                  d| i¬«      \  }}}}}}}}|||fS )zÙ
        Parse Anthropic-native content blocks into OpenAI-compatible fields.

        Concatenates all text blocks, extracts tool_use blocks as tool_calls, and
        preserves thinking blocks when present.
        rU   )Úcompletion_response)r   Úextract_response_content)	r]   Útext_contentÚ
_citationsÚthinking_blocksÚ_reasoning_contentÚ
tool_callsÚ_web_search_resultsÚ_tool_resultsÚ_compaction_blockss	            r   Ú_parse_anthropic_native_contentz3GithubCopilotConfig._parse_anthropic_native_content¯   sH   € ô& Ó×6Ñ6ÈIÐWeÐKfÐ6Ógñ		
ØØØØØØØØà˜Z¨Ð8Ð8r   Úusagec                 ó´   — t        | «      }d| v rd| vr| d   |d<   d| v rd| vr| d   |d<   d|vr(|j                  dd«      |j                  dd«      z   |d<   |S )NÚinput_tokensÚprompt_tokensÚoutput_tokensÚcompletion_tokensÚtotal_tokensr   )rZ   r4   )rj   Ú
normalizeds     r   Ú_normalize_anthropic_usagez.GithubCopilotConfig._normalize_anthropic_usageÅ   s~   € ä  ›Kˆ
Ø˜UÑ" ¸eÑ'CØ*/°Ñ*?ˆJ�Ñ'Ø˜eÑ#Ð(;À5Ñ(HØ.3°OÑ.DˆJÐ*Ñ+Ø Ñ+Ø)3¯©¸ÈÓ)KÈjÏnÉnÐ]pÐrsÓNtÑ)tˆJ�~Ñ&ØÐr   Úresponse_jsonc                 óÜ  — |j                  d«      r|S d}g }d}|j                  d«      }t        |t        «      r| j                  |«      \  }}}nt        |t        «      r|}|j                  d«      }ddddd	œ}|rd}n||v r||   }n|rd}nd}d
|s|s|nddœ}	|r||	d<   |r||	d<   i |¥dd|	|dœgi¥}
|j                  d«      }t        |t
        «      r| j                  |«      |
d<   |
S )aµ  
        Synthesize a `choices` array from an Anthropic-native Copilot response.

        Newer Copilot Claude models (e.g. opus-4.7, opus-4.8) return content
        blocks and `stop_reason` without an OpenAI-style `choices` array, and the
        max_tokens=1 probe returns no content at all. Returns the response
        unchanged when it already carries choices.

        See: https://github.com/BerriAI/litellm/issues/29391
        ÚchoicesÚ NrU   Ústop_reasonÚstopÚlengthre   )Úend_turnÚ
max_tokensÚstop_sequenceÚtool_user1   )r/   rU   rc   r   )Úindexr$   Úfinish_reasonrj   )r4   rX   rY   ri   r)   rZ   rr   )Úclsrs   rU   re   rc   Úraw_contentrw   Úfinish_reason_mapr   r$   Úsynthesizedrj   s               r   Ú(_synthesize_choices_for_anthropic_nativez<GithubCopilotConfig._synthesize_choices_for_anthropic_nativeÐ   sB  € ð ×Ñ˜YÔ'Ø Ð àˆØ8:ˆ
Ø,0ˆØ*×.Ñ.¨yÓ9ˆÜ�k¤4Ô(Ø36×3VÑ3VÐWbÓ3cÑ0ˆG�Z¡Ü˜¤SÔ)Ø!ˆGà*×.Ñ.¨}Ó=ˆàØ"Ø#Ø$ñ	$
Ðñ Ø(‰MØÐ-Ñ-Ø-¨kÑ:‰MÙØ"‰Mà$ˆMð  Ù")±‘wÀñ 
ˆñ Ø$.ˆG�LÑ!ÙØ)8ˆGÐ%Ñ&ð
Øð
à !°È-ÑXÐYñ
ˆð %×(Ñ(¨Ó1ˆÜ�eœTÔ"Ø#&×#AÑ#AÀ%Ó#HˆK˜Ñ ØÐr   Úparsed_responsec                 ó$   — | j                  |«      S )zª
        Repair the OpenAI-SDK-parsed response on the handler path that bypasses
        transform_response. See: https://github.com/BerriAI/litellm/issues/30927
        )r„   )r   r…   s     r   Útransform_parsed_response_dictz2GithubCopilotConfig.transform_parsed_response_dict
  s   € ð
 ×<Ñ<¸_ÓMÐMr   Úraw_responseÚmodel_responser   Úlogging_objÚLiteLLMLoggingObjÚrequest_dataÚencodingÚ	json_modec                 óŠ  •— 	 |j                  «       }|j	                  d«      s^| j                  |«      }t        j                  |j                  |j                  t        j                  |«      j                  «       ¬«      }t        ‰| �  |||||||||	|
|¬«      S # t        $ r t        ‰| �  |||||||||	|
|¬«      cY S w xY w)N)r    rˆ   r‰   rŠ   rŒ   r7   r<   r=   r�   r   rŽ   ru   )Ústatus_coder;   rU   )ÚjsonÚ	Exceptionr   Útransform_responser4   r„   ÚhttpxÚResponser�   r;   ÚdumpsÚencode)r   r    rˆ   r‰   rŠ   rŒ   r7   r<   r=   r�   r   rŽ   rs   r   s                €r   r“   z&GithubCopilotConfig.transform_response  sî   ø€ ð	Ø(×-Ñ-Ó/ˆMð  × Ñ  Ô+Ø ×IÑIÈ-ÓXˆMÜ Ÿ>™>Ø(×4Ñ4Ø$×,Ñ,ÜŸ
™
 =Ó1×8Ñ8Ó:ôˆLô ‰wÑ)ØØ%Ø)Ø#Ø%ØØ+Ø)ØØØð *ó 
ð 	
øô/ ò 	Ü‘7Ñ-ØØ)Ø-Ø'Ø)Ø!Ø /Ø-Ø!ØØ#ð .ó ò ð	ús   ƒB Â#CÃC)NNÚopenai)NN)Ú__name__Ú
__module__Ú__qualname__r)   r   Útupler-   r:   rZ   rY   r	   r@   rM   rA   ÚboolrB   Ústaticmethodr   r
   ri   rr   Úclassmethodr„   r‡   r”   r•   Úobjectr“   Ú__classcell__)r   s   @r   r   r      s�  ø„ ð #Ø#Ø#+ñ	-à�t‘ð-ð ˜‘*ð-ð !ð	-ð
 
õ-ðFàðFð ˜‘*ðFð �t‘ð	Fð
 !ðFð 
ˆs�T‰z˜3 ™: sÐ*Ñ	+óFð.$ð ó$ðB #Ø#ñ!àð!ð ð!ð Ð'Ñ(ð	!ð
 ð!ð ð!ð �t‘ð!ð ˜‘*ð!ð 
õ!ðB°ð ¸õ ð0	¨TÐ2BÑ-Cð 	Èó 	ð¨DÐ1AÑ,Bð Àtó ð0 ð9Ø˜S™	ð9à	ˆs�DÐ4Ñ5°t¸C±yÀ4Ñ7GÐGÑ	Hò9ó ð9ð* ð¨$ð °4ò ó ðð ð7ÀTð 7Èdò 7ó ð7ðrN¸dð NÀtó Nð$ #Ø!%ñ3
àð3
ð —n‘nð3
ð (ð	3
ð
 )ð3
ð ð3
ð Ð'Ñ(ð3
ð ð3
ð ð3
ð ð3
ð �t‘ð3
ð ˜$‘;ð3
ð 
÷3
ñ 3
r   r   )r‘   r&   Útypingr   r   r   r”   Úlitellm.exceptionsr   Ú*litellm.llms.anthropic.chat.transformationr   Úlitellm.llms.openai.openair   Úlitellm.types.llms.openair	   r
   Úlitellm.types.utilsr   r   r   Úcommon_utilsr   r   r   Ú*litellm.litellm_core_utils.litellm_loggingr   r‹   r   © r   r   ú<module>r«      sF   ðÛ Û 	ß ,Ñ ,ã å 2Ý FÝ 3ß SÝ -å )÷ñ ñ ÝWôl
˜,õ l
r   