Ë
    uPêjm=  ã            	       ól  — U d Z ddlmZmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlZddlZddlmZ ddlmZ dd	lmZ erddlZdd
lmZ eZneZddlm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$m%Z%m&Z&  e'h d£«      Z(e	e'e)      e*d<   de+de+fd„Z,de-e+e)e)f      de-fd„Z.de+de+de/e+e+e+f   fd„Z0 G d„ de«      Z1y)zp
Translate from OpenAI's `/v1/chat/completions` to SAP Generative AI Hub's Orchestration Service`v2/completion`
é    )ÚAsyncIteratorÚIterator)Úcached_property)ÚTYPE_CHECKINGÚAnyÚFinalÚUnionN)ÚAllMessageValues)ÚModelResponseé   )ÚOpenAIGPTConfig)ÚLoggingé   )Úget_token_creatoré   )ÚAsyncSAPStreamIteratorÚGenAIHubOrchestrationErrorÚSAPStreamIterator)ÚChatCompletionToolÚOrchestrationRequestÚResponseFormatÚResponseFormatJSONSchemaÚSAPAssistantMessageÚ
SAPMessageÚSAPToolChatMessageÚSAPUserMessage>   ÚtoolsÚtool_choiceÚmodel_versionÚstream_optionsÚplaceholder_valuesÚfallback_sap_modulesÚ_SAP_MODEL_PARAMS_EXCLUDED_KEYSÚdataÚreturnc                 ó4   —  |di | ¤Žj                  dd¬«      S )NT)Úby_aliasÚexclude_unset© )Ú
model_dump)r$   Úmodels     úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/sap/chat/transformation.pyÚvalidate_dictr-   8   s   € Ù‰=�4‰=×#Ñ#¨TÀÐ#ÓFÐFó    Úmessagesc                 óF  — g }| D ]™  }|d   dk(  r |j                  t        |t        «      «       Œ+|d   dk(  r |j                  t        |t        «      «       ŒS|d   dk(  r |j                  t        |t        «      «       Œ{|j                  t        |t
        «      «       Œ› |S )NÚroleÚuserÚ	assistantÚtool)Úappendr-   r   r   r   r   )r/   ÚtemplateÚmessages      r,   Ú_messages_to_sap_templater8   <   s‘   € Ø€HØò @ˆØ�6‰?˜fÒ$Ø�O‰OœM¨'´>ÓBÕCØ�V‰_ Ò+Ø�O‰OœM¨'Ô3FÓGÕHØ�V‰_ Ò&Ø�O‰OœM¨'Ô3EÓFÕGà�O‰OœM¨'´:Ó>Õ?ð@ð €Or.   Úoptional_paramsÚmodel_paramsc                 óØ  — | j                  dg «      }|D �cg c]  }t        |t        «      ‘Œ }}|rd|ini }|j                  di «      }|j                  dd «      }|r*|dk(  rt        |t        «      }nt        |t
        «      }d|i}|j                  dd«       i }d| v rB| j                  di «      }d|v r|j                  d«      |d<   d	|v r|j                  d	«      |d	<   |||fS c c}w )
Nr   Úresponse_formatÚtypeÚjson_schemaÚstreamFr    Ú
chunk_sizeÚ
delimiters)Úpopr-   r   Úgetr   r   )	r9   r:   Útools_r4   r   r<   Ú	resp_typeÚstream_configr    s	            r,   Ú!_tools_response_format_and_streamrG   J   s  € Ø× Ñ  ¨"Ó-€FØBHÖI¸$Œm˜DÔ"4Õ5ÐI€FÐIÙ.4˜' 6Ñ*¸"€Eà"×&Ñ&Ð'8¸"Ó=€OØ&×*Ñ*¨6°4Ó8€IÙØ˜Ò%Ü+¨OÔ=UÓV‰Oä+¨O¼^ÓLˆOØ,¨oÐ>ˆà×Ñ�X˜uÔ%Ø!#€MØ˜?Ñ*Ø /× 3Ñ 3Ð4DÀbÓ IˆØ˜>Ñ)Ø*8×*<Ñ*<¸\Ó*JˆM˜,Ñ'Ø˜>Ñ)Ø*8×*<Ñ*<¸\Ó*JˆM˜,Ñ'à�/ =Ð0Ð0ùò+ Js   —C'c                   ó  ‡ — 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Zeed<   	 	 	 	 	 	 	 	 	 	 	 	 	 d8d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d9dedz  ddfd„Zedeeef   fd„«       Zedefd„«       Zedefd„«       Zedefd„«       Zeˆ fd„«       Z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d"„Z"	 d9d!edz  d edz  dededed#e#dz  fd$„Z$d%ed&e
eeef      d'edefd(„Z%dede
eeef      dedededefd)„Z&	 	 d:ded*e'jP                  d+e)d,e*d-ede
e!   deded.d/d edz  d0e#dz  de)fd1„Z+d2e)de)fd3„Z,	 d;d4e-e.e   e/e   d5f   d6e#d0e#dz  fd7„Z0ˆ xZ1S )<ÚGenAIHubOrchestrationConfigNÚfrequency_penaltyÚfunction_callÚ	functionsÚ
logit_biasÚ
max_tokensÚnÚpresence_penaltyÚstopÚtemperatureÚtop_pr<   r   r   Úlatestr   r%   c                 óÎ   — t        «       j                  «       }|j                  «       D ]%  \  }}|dk7  sŒ|€Œt        | j                  ||«       Œ' d | _        d | _        d | _        y )NÚself)ÚlocalsÚcopyÚitemsÚsetattrÚ	__class__Útoken_creatorÚ	_base_urlÚ_resource_group)rV   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   r<   r   r   Úlocals_ÚkeyÚvalues                    r,   Ú__init__z$GenAIHubOrchestrationConfig.__init__t   s_   € ô   ›Ÿ™›ˆØ!Ÿ-™-›/ò 	4‰JˆC�Ø�f‹} Ñ!2Ü˜Ÿ™¨¨UÕ3ð	4ð "ˆÔØˆŒØ#ˆÕr.   Úservice_keyc                 ó˜   — 	 t        |«      \  | _        | _        | _        y # t        $ r}t        d|j                  d   ¬«      ‚d }~ww xY w)Ni�  r   )Ústatus_coder7   )r   r\   r]   r^   Ú
ValueErrorr   Úargs)rV   rc   Úerrs      r,   Úrun_env_setupz)GenAIHubOrchestrationConfig.run_env_setupŒ   sI   € ð	SÜGXÐYdÓGeÑDˆDÔ ¤°Õ0DøÜò 	SÜ,¸ÀcÇhÁhÈqÁkÔRÐRûð	Sús   ‚! ¡	A	ªAÁA	c                 ó|   — | j                   €| j                  «        | j                  «       }|| j                  dddœS )Nzapplication/jsonÚLiteLLM)ÚAuthorizationzAI-Resource-GroupzContent-TypezAI-Client-Type)r\   ri   Úresource_group)rV   Úaccess_tokens     r,   Úheadersz#GenAIHubOrchestrationConfig.headers’   sD   € à×ÑÐ%Ø×ÑÔ Ø×)Ñ)Ó+ˆà)Ø!%×!4Ñ!4Ø.Ø'ñ	
ð 	
r.   c                 óR   — | j                   €| j                  «        | j                   S ©N)r]   ri   ©rV   s    r,   Úbase_urlz$GenAIHubOrchestrationConfig.base_urlž   s"   € à�>‰>Ð!Ø×ÑÔ Ø�~‰~Ðr.   c                 óR   — | j                   €| j                  «        | j                   S rq   )r^   ri   rr   s    r,   rm   z*GenAIHubOrchestrationConfig.resource_group¤   s&   € à×ÑÐ'Ø×ÑÔ Ø×#Ñ#Ð#r.   c                 óî  — t         j                  }|j                  | j                  › d�| j                  ¬«      j                  «       }g }|j                  dg «      D ]‚  }|j                  d«      dk(  sŒ|j                  | j                  › d|d   › �| j                  ¬«      j                  «       }|j                  d«      dk(  sŒj|j                  |d	   |d
   f«       Œ„ t        |d„ d¬«      d   d   S )Nz/lm/deployments)ro   Ú	resourcesÚ
scenarioIdÚorchestrationz/lm/configurations/ÚconfigurationIdÚexecutableIdÚdeploymentUrlÚ	createdAtc                 ó   — | d   S )Nr   r)   )Úxs    r,   ú<lambda>z<GenAIHubOrchestrationConfig.deployment_url.<locals>.<lambda>º   s
   € ¨1¨Q©4€ r.   T)r`   Úreverser   )ÚlitellmÚmodule_level_clientrC   rs   ro   Újsonr5   Úsorted)rV   ÚclientÚdeploymentsÚvalidÚdepÚcfgs         r,   Údeployment_urlz*GenAIHubOrchestrationConfig.deployment_urlª   s÷   € ô  ×3Ñ3ˆà#ŸZ™Z¨4¯=©=¨/¸Ð(IÐSW×S_ÑS_˜ZÓ`×eÑeÓgˆØ.0ˆØ—?‘? ;°Ó3ò 	KˆCØ�w‰w�|Ó$¨Ó7Ø—j‘jØ—}‘}�oÐ%8¸Ð=NÑ9OÐ8PÐQØ ŸL™Lð !ó ÷ ‘$“&ð ð —7‘7˜>Ó*¨oÓ=Ø—L‘L # oÑ"6¸¸KÑ8HÐ!IÕJð	Kô �e¡¸Ô>¸qÑAÀ!ÑDÐDr.   c                 ó    •— t         ‰| �  «       S rq   )ÚsuperÚ
get_config)Úclsr[   s    €r,   r�   z&GenAIHubOrchestrationConfig.get_config¼   s   ø€ ä‰wÑ!Ó#Ð#r.   c                 ó  — g d¢}|j                  d«      s'|j                  d«      s|j                  d«      s|dk(  r|j                  d«       |j                  d«      s|j                  d«      r|j                  d«       |S )	N)rJ   rM   ÚlogprobsÚtop_logprobsrN   Úmax_completion_tokensÚ
predictionrO   rP   ÚseedrQ   r?   r    rR   rS   r   r   rK   rL   Úextra_headersÚparallel_tool_callsr<   ÚtimeoutÚamazonÚcohereÚ
alephalphazgpt-4r<   Úgeminir   )Ú
startswithÚremove)rV   r+   Úparamss      r,   Úget_supported_openai_paramsz7GenAIHubOrchestrationConfig.get_supported_openai_paramsÀ   sv   € ò
ˆð6 ×Ñ˜XÔ&Ø×Ñ Ô)Ø×Ñ Ô-Ø˜Òà�M‰MÐ+Ô,Ø×Ñ˜HÔ%¨×)9Ñ)9¸(Ô)CØ�M‰M˜-Ô(Øˆr.   ro   r+   r/   r9   Úlitellm_paramsÚapi_keyÚapi_basec                 ó@   — |r| j                  |«       | j                  S rq   )ri   ro   )rV   ro   r+   r/   r9   r    r¡   r¢   s           r,   Úvalidate_environmentz0GenAIHubOrchestrationConfig.validate_environmentæ   s   € ñ Ø×Ñ˜wÔ'Ø�|‰|Ðr.   r?   c                 ó$   — | j                   › d�}|S )Nz/v2/completion)rŠ   )rV   r¢   r¡   r+   r9   r    r?   Ú	api_base_s           r,   Úget_complete_urlz,GenAIHubOrchestrationConfig.get_complete_urlô   s   € ð #×1Ñ1Ð2°.ÐAˆ	ØÐr.   Ú
model_nameÚtemplate_messagesrž   c                 óV  — |j                  d«      rd|v r|j                  d«       |j                  dd«      }|j                  dg «      }|D �cg c]  }t        |t        «      ‘Œ }}|rd|ini }|j                  di «      }|j	                  dd «      }	|	r+|	dk(  rt        |t
        «      }nt        |t        «      }d|i}ni }|j                  d	i «      }
|
rd
|
ini }
i }g d¢}|D ])  }|j	                  |d «      €Œ|j                  |«      ||<   Œ+ dd|i|
¥|¥|¥|||dœdœi|¥S c c}w )NÚgptÚstrictr   rT   r   r<   r=   r>   Úplaceholder_defaultsÚdefaults)Ú	groundingÚmaskingÚ	filteringÚtranslationÚprompt_templatingr6   )Únamerž   Úversion)Úpromptr+   )rœ   rB   r-   r   rC   r   r   )rV   r¨   r©   rž   r   rD   r4   r   r<   rE   r­   Úoptional_modulesÚoptional_modules_lstÚmodules                 r,   Ú_build_prompt_modulez0GenAIHubOrchestrationConfig._build_prompt_module   s‚  € ð × Ñ  Ô'¨H¸Ñ,>Ø�J‰J�xÔ à%Ÿz™z¨/¸8ÓDˆà—‘˜G RÓ(ˆØFLÖM¸d”- Ô&8Õ9ÐMˆÐMÙ,2˜ Ñ(¸ˆà Ÿ*™*Ð%6¸Ó;ˆØ*×.Ñ.¨v°tÓ<ˆ	ÙØ˜MÒ)Ü"/°ÔAYÓ"Z‘ä"/°ÄÓ"P�Ø0°/ÐB‰Oà ˆOà%Ÿz™zÐ*@À"ÓEÐÙEY 
Ð,@ÑAÐ_aÐà"$ÐÚ&ZÐØ*ò 	>ˆFØ�z‰z˜& $Ó'Ñ3Ø+1¯:©:°fÓ+=Ð  Ò(ð	>ð
  àÐ 1ðà*ðð ðð &ð	ð 'Ø$Ø,ññ"ð
ð ð
ð 	
ùò/ Ns   ÁD&c                 óâ  — t        |«      }|j                  dd «       t        |«      }|j                  dd «      }|j                  dg «      }|j                  dd «       i }	d|v r*|j                  di «      }
d|
v r|
d   |	d<   d|
v r|
d   |	d<   |j                  dd «       | j                  ||t        |«      ¬	«      g}|D ]r  }t        |«      }|j                  d
d «      }|€t	        d«      ‚|j                  d«      }|j                  dg «      }|j                  | j                  |||¬	«      «       Œt dt        |«      dkD  r|n|d   i}|	r|	|d<   d|i}|�||d<   t        |t        «      }|S )NrŠ   r!   r"   r?   r    r@   rA   r   )r¨   r©   rž   r+   z@Each entry in `fallback_sap_modules` must include a 'model' key.zsap/r/   Úmodulesr   r   Úconfig)
ÚdictrB   r8   rº   rf   Úremoveprefixr5   Úlenr-   r   )rV   r+   r/   r9   r    ro   r6   r!   Úfallback_modulesrF   r    r¼   Úmodules_dictÚfallback_modelÚfallback_templateÚconfig_payloadÚrequest_bodyÚbodys                     r,   Útransform_requestz-GenAIHubOrchestrationConfig.transform_request7  sÎ  € ô ˜Ó/ˆØ×ÑÐ,¨dÔ3ä3°HÓ=ˆà$3×$7Ñ$7Ð8LÈdÓ$SÐØ"1×"5Ñ"5Ð6LÈbÓ"QÐà×Ñ˜H dÔ+Ø%'ˆØ˜Ñ.Ø$3×$7Ñ$7Ð8HÈ"Ó$MˆNØ˜~Ñ-Ø.<¸\Ñ.J�˜lÑ+Ø˜~Ñ-Ø.<¸\Ñ.J�˜lÑ+à×Ñ˜M¨4Ô0ð ×%Ñ%Ø Ø"*Ü˜OÓ,ð &ó ð
ˆð -ò 	ˆLÜ Ó-ˆLØ)×-Ñ-¨g°tÓ<ˆNØÐ%Ü Ð!cÓdÐdØ+×8Ñ8¸Ó@ˆNØ ,× 0Ñ 0°¸RÓ @Ðà�N‰NØ×)Ñ)Ø-Ø&7Ø'ð *ó õð	ð" ¤# g£,°Ò"2‘w¸À¹
ð1
ˆñ Ø'4ˆN˜8Ñ$à/7¸Ð.HˆØÐ)Ø1CˆLÐ-Ñ.ä# LÔ2FÓGˆàˆr.   Úraw_responseÚmodel_responseÚlogging_objÚrequest_dataÚencodingztiktoken.Encoding | NoneÚ	json_modec                 ó"  — |j                  ||
|j                  d|i¬«       t        j                  |j	                  «       d   «      }|j                  di «      }|j                  d«      dv r"|j                  d«      r| j                  |«      }|S )NÚcomplete_input_dict)Úinputr¡   Úoriginal_responseÚadditional_argsÚfinal_resultr<   r=   )Újson_objectr>   Ú	anthropic)Ú	post_callÚtextr   Úmodel_validaterƒ   rC   rœ   Ú_strip_markdown_json)rV   r+   rÉ   rÊ   rË   rÌ   r/   r9   r    rÍ   r¡   rÎ   Úresponser<   s                 r,   Útransform_responsez.GenAIHubOrchestrationConfig.transform_responsex  sš   € ð 	×ÑØØØ*×/Ñ/Ø2°LÐAð	 	ô 	
ô !×/Ñ/°×0AÑ0AÓ0CÀNÑ0SÓTˆð "1×!4Ñ!4Ð5FÈÓ!KˆØ×Ñ˜vÓ&Ð*HÑHØ×Ñ Ô,Ø×4Ñ4°XÓ>�àˆr.   rÛ   c                 ód  — ddl }|j                  xs g D ]˜  }|j                  sŒ|j                  j                  sŒ'|j                  j                  j	                  «       }|j                  d||j                  «      }|sŒk|j                  d«      j	                  «       |j                  _        Œš |S )a.  Strip markdown code block wrapper from JSON content if present.

        SAP GenAI Hub with Anthropic models sometimes returns JSON wrapped in
        markdown code blocks (```json ... ```) depending on prompt phrasing.
        This method strips that wrapper to ensure consistent JSON output.
        r   Nz^```(?:json)?\s*\n?(.*?)\n?```$r   )ÚreÚchoicesr7   ÚcontentÚstripÚmatchÚDOTALLÚgroup)rV   rÛ   rÞ   Úchoicerà   râ   s         r,   rÚ   z0GenAIHubOrchestrationConfig._strip_markdown_json™  sŒ   € ó 	à×&Ñ&Ò,¨"ò 	DˆFØ�~‹~ &§.¡.×"8Ó"8Ø Ÿ.™.×0Ñ0×6Ñ6Ó8�àŸ™Ð!CÀWÈbÏiÉiÓX�ÚØ-2¯[©[¸«^×-AÑ-AÓ-C�F—N‘NÕ*ð	Dð ˆr.   Ústreaming_responser   Úsync_streamc                 ó6   — |rt        |¬«      S t        |¬«      S )N)rÛ   )r   r   )rV   ræ   rç   rÎ   s       r,   Úget_model_response_iteratorz7GenAIHubOrchestrationConfig.get_model_response_iterator¬  s   € ñ Ü$Ð.@ÔAÐAä)Ð3EÔFÐFr.   )NNNNNNNNNNNNNrq   )NN)F)2Ú__name__Ú
__module__Ú__qualname__rJ   ÚintÚ__annotations__rK   Ústrr¾   rL   ÚlistrM   rN   rO   rP   rQ   rR   rS   r<   r   r   r   rb   ri   Úpropertyro   rs   rm   r   rŠ   Úclassmethodr�   rŸ   r
   r¤   Úboolr§   rº   rÈ   ÚhttpxÚResponser   ÚLiteLLMLoggingObjrÜ   rÚ   r	   r   r   ré   Ú__classcell__)r[   s   @r,   rI   rI   d   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Ñ"Ó)Ø!€M�3Ó!ð )-Ø+/Ø!%Ø"&Ø!%ØØ'+Ø"&Ø"&Ø Ø'+Ø!Ø)-ñ$à ™:ð$ð ˜T‘z DÑ(ð$ð ˜$‘;ð	$ð
 ˜4‘Kð$ð ˜$‘Jð$ð �‰:ð$ð  ™*ð$ð �D‰j˜4Ñð$ð ˜4‘Zð$ð �T‰zð$ð  ™ð$ð �d‰{ð$ð ˜4‘Z $Ñ&ð$ð 
ó$ñ0S¨¨t©ð S¸tó Sð ð	
˜˜c 3˜h™ò 	
ó ð	
ð ð˜#ò ó ðð
 ð$ ò $ó ð$ð
 ðE ò Eó ðEð" ó$ó ð$ò$ðZ #Ø#ñàðð ðð Ð'Ñ(ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óð* #ñ
à˜‘*ð
ð �t‘ð
ð ð	
ð
 ð
ð ð
ð �t‘ó
ð5
àð5
ð    S¨# X¡Ñ/ð5
ð ð	5
ð
 
ó5
ðn?àð?ð �t˜C ˜H‘~Ñ&ð?ð ð	?ð
 ð?ð ð?ð 
ó?ðX #Ø!%ñàðð —n‘nðð &ð	ð
 'ðð ðð Ð'Ñ(ðð ðð ðð -ðð �t‘ðð ˜$‘;ðð 
óðB¨]ð ¸}ó ð. "'ñ		Gà! (¨3¡-°¸sÑ1CÀ_Ð"TÑUð	Gð ð	Gð ˜$‘;÷		Gr.   rI   )2Ú__doc__Úcollections.abcr   r   Ú	functoolsr   Útypingr   r   r   r	   rô   r�   Úlitellm.types.llms.openair
   Úlitellm.types.utilsr   Úopenai.chat.gpt_transformationr   ÚtiktokenÚ*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjrö   Úcredentialsr   Úhandlerr   r   r   Úmodelsr   r   r   r   r   r   r   r   Ú	frozensetr#   rï   rî   r¾   r-   rð   r8   ÚtuplerG   rI   r)   r.   r,   ú<module>r     së   ðò÷ 4Ý %ß 3Ó 3ã ã Ý 6Ý -å =áÛåXà*ÑàÐå +÷ñ ÷
	÷ 	ó 	ñ :Còó	:Ð   y°¡~Ñ!6ó 	ðG˜ð G¨ó Gð¨¨T°#°s°(©^Ñ(<ð Àó ð1°tð 1È4ð 1ÐTYÐZ^Ð`dÐfjÐZjÑTkó 1ô4QG /õ QGr.   