o
    ưi0                     @   s   d 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 ddlZddlZddlmZ ddlmZ ddlmZ erCdd	lmZ eZneZd
dlmZ ddlmZmZmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z& de'de'fddZ(G dd deZ)dS )zp
Translate from OpenAI's `/v1/chat/completions` to SAP Generative AI Hub's Orchestration Service`v2/completion`
    )	ListOptionalUnionDictTupleAnyTYPE_CHECKINGIteratorAsyncIterator)cached_propertyN)AllMessageValues)ModelResponse   )OpenAIGPTConfig)Logging   )get_token_creator   )
SAPMessageSAPAssistantMessageSAPToolChatMessageChatCompletionToolResponseFormatJSONSchemaResponseFormatSAPUserMessage)GenAIHubOrchestrationErrorAsyncSAPStreamIteratorSAPStreamIteratordatareturnc                 C   s   |di | j ddS )NT)Zby_alias )Z
model_dump)r   modelr    r    [/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/sap/chat/transformation.pyvalidate_dict"   s   r#   c                       s\  e Zd ZU dZee ed< dZeee	e
f  ed< dZee ed< dZee
 ed< dZee ed< dZee ed< dZee ed< dZeee	ef  ed	< dZee ed
< dZee ed< dZee
 ed< dZee ed< dZeee	e
f  ed< dZe	ed< 													dBdee deee	e
f  dee dee
 dee dee dee d	eee	ef  d
ee dee dee
 dee deee	e
f  ddfddZdCdee	 ddfddZedee	e	f fddZede	fddZede	fddZede	fddZ e! fdd Z"d!d" Z#		dDd#e
d$e	d%e$e% d&e
d'e
d(ee	 d)ee	 de
fd*d+Z&	dCd)ee	 d(ee	 d$e	d&e
d'e
d,ee' fd-d.Z(d$e	d%e$ee	e	f  d&e
d'e
d#e
de
fd/d0Z)		dDd$e	d1e*j+d2e,d3e-d4e
d%e$e% d&e
d'e
d5e.d(ee	 d6ee' de,fd7d8Z/d9e,de,fd:d;Z0	<dEd=ee1e	 e2e	 d>f d?e'd6ee' fd@dAZ3  Z4S )FGenAIHubOrchestrationConfigNfrequency_penaltyfunction_call	functions
logit_bias
max_tokensnpresence_penaltystoptemperaturetop_presponse_formattoolstool_choicelatestmodel_versionr   c                 C   sP   t   }| D ]\}}|dkr|d urt| j|| q	d | _d | _d | _d S )Nself)localscopyitemssetattr	__class__token_creator	_base_url_resource_group)r4   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   Zlocals_keyvaluer    r    r"   __init__6   s   

z$GenAIHubOrchestrationConfig.__init__service_keyc              
   C   sF   zt |\| _| _| _W d S  ty" } z	td|jd dd }~ww )Ni  r   )status_codemessage)r   r:   r;   r<   
ValueErrorr   args)r4   r@   errr    r    r"   run_env_setupN   s   z)GenAIHubOrchestrationConfig.run_env_setupc                 C   s*   | j d u r	|   |   }|| jdddS )Nzapplication/jsonZLiteLLM)AuthorizationzAI-Resource-GroupzContent-TypezAI-Client-Type)r:   rF   resource_group)r4   Zaccess_tokenr    r    r"   headersU   s   
z#GenAIHubOrchestrationConfig.headersc                 C      | j d u r	|   | j S N)r;   rF   r4   r    r    r"   base_urla      
z$GenAIHubOrchestrationConfig.base_urlc                 C   rJ   rK   )r<   rF   rL   r    r    r"   rH   h   rN   z*GenAIHubOrchestrationConfig.resource_groupc                 C   s   t j}|j| j d| jd }g }|dg D ]-}|ddkrF|j| j d|d  | jd }|ddkrF||d	 |d
 f qt|dd ddd d S )Nz/lm/deployments)rI   	resourcesZ
scenarioIdZorchestrationz/lm/configurations/ZconfigurationIdZexecutableIdZdeploymentUrlZ	createdAtc                 S   s   | d S )Nr   r    )xr    r    r"   <lambda>   s    z<GenAIHubOrchestrationConfig.deployment_url.<locals>.<lambda>T)r=   reverser   )litellmZmodule_level_clientgetrM   rI   jsonappendsorted)r4   clientZdeploymentsZvaliddepcfgr    r    r"   deployment_urln   s&   z*GenAIHubOrchestrationConfig.deployment_urlc                    s
   t   S rK   )super
get_config)clsr9   r    r"   r]      s   
z&GenAIHubOrchestrationConfig.get_configc                 C   sZ   g d}| ds| ds| ds|dkr|d | ds&| dr+|d |S )	N)r%   r(   ZlogprobsZtop_logprobsr)   Zmax_completion_tokensZ
predictionr*   r+   seedr,   streamstream_optionsr-   r.   r0   r1   r&   r'   extra_headersZparallel_tool_callsr/   timeoutZamazonZcohereZ
alephalphazgpt-4r/   geminir1   )
startswithremove)r4   r!   paramsr    r    r"   get_supported_openai_params   s   

z7GenAIHubOrchestrationConfig.get_supported_openai_paramsrI   r!   messagesoptional_paramslitellm_paramsapi_keyapi_basec                 C   s   |r|  | | jS rK   )rF   rI   )r4   rI   r!   rj   rk   rl   rm   rn   r    r    r"   validate_environment   s   

z0GenAIHubOrchestrationConfig.validate_environmentra   c                 C   s   | j  d}|S )Nz/v2/completion)r[   )r4   rn   rm   r!   rk   rl   ra   Z	api_base_r    r    r"   get_complete_url   s   	z,GenAIHubOrchestrationConfig.get_complete_urlc                    s  h d | dr d  fdd| D }|dd}g }|D ]7}	|	d d	kr4|t|	t q#|	d d
krC|t|	t q#|	d dkrR|t|	t q#|t|	t	 q#|dg }
dd |
D }
|
g krqd|
i}ni }|di }|
dd }|r|dkrt|t}nt|t}d|i}|dd i }d|v r|di }|
dd|d< d|v r|
d|d< ddd|i|||||ddi|di}|S )N>   r[   r0   r3   Zgptstrictc                    s   i | ]\}}| vr||qS r    r    ).0kvZexcluded_paramsr    r"   
<dictcomp>   s    zAGenAIHubOrchestrationConfig.transform_request.<locals>.<dictcomp>r3   r2   ZroleuserZ	assistanttoolr0   c                 S   s   g | ]}t |tqS r    )r#   r   )rr   rx   r    r    r"   
<listcomp>   s    zAGenAIHubOrchestrationConfig.transform_request.<locals>.<listcomp>r/   typejson_schemara   Frb   
chunk_sized   
delimitersconfigZprompt_templatingtemplate)namerh   version)promptr!   )modulesra   )rf   addr7   poprV   r#   r   r   r   r   rT   r   r   )r4   r!   rj   rk   rl   rI   Zmodel_paramsr3   r   rB   Ztools_r0   r/   Z	resp_typeZstream_configrb   r   r    ru   r"   transform_request   sj   





z-GenAIHubOrchestrationConfig.transform_requestraw_responsemodel_responselogging_objrequest_dataencoding	json_modec                 C   s\   |j ||
|jd|id t| d }|di }|ddv r,|dr,| |}|S )NZcomplete_input_dict)inputrm   original_responseZadditional_argsZfinal_resultr/   rz   )Zjson_objectr{   Z	anthropic)Z	post_calltextr   Zmodel_validaterU   rT   rf   _strip_markdown_json)r4   r!   r   r   r   r   rj   rk   rl   r   rm   r   responser/   r    r    r"   transform_response  s   

z.GenAIHubOrchestrationConfig.transform_responser   c                 C   s\   ddl }|jpg D ]"}|jr+|jjr+|jj }|d||j}|r+|d |j_q	|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choicesrB   contentstripmatchDOTALLgroup)r4   r   r   choicer   r   r    r    r"   r   9  s   z0GenAIHubOrchestrationConfig._strip_markdown_jsonFstreaming_responser   sync_streamc                 C   s   |rt |dS t|dS )N)r   )r   r   )r4   r   r   r   r    r    r"   get_model_response_iteratorL  s   

z7GenAIHubOrchestrationConfig.get_model_response_iterator)NNNNNNNNNNNNNrK   )NN)F)5__name__
__module____qualname__r%   r   int__annotations__r&   r   strdictr'   listr(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r3   r?   rF   propertyr   rI   rM   rH   r   r[   classmethodr]   ri   r   r   ro   boolrp   r   httpxResponser   LiteLLMLoggingObjr   r   r   r	   r
   r   __classcell__r    r    r_   r"   r$   &   s.  
 	

.	


\	

!r$   )*__doc__typingr   r   r   r   r   r   r   r	   r
   	functoolsr   rS   r   Zlitellm.types.llms.openair   Zlitellm.types.utilsr   Zopenai.chat.gpt_transformationr   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjr   credentialsr   modelsr   r   r   r   r   r   r   handlerr   r   r   r   r#   r$   r    r    r    r"   <module>   s"    ,$	