o
    ưiK                     @   s  d dl mZmZmZ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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 d	lmZmZmZmZ d d
lm Z  d dl!m"Z" d dl#m$Z$ ddl%m&Z&m'Z'm(Z( erwd dl)m*Z+ e+Z,neZ,G dd deZ-dS )    )
TYPE_CHECKINGAnyDictListLiteralOptionalTupleUnionget_args
get_originN)fields)verbose_logger)process_response_headers)_safe_convert_created_field)OpenAIResponsesAPIConfig)get_secret_str)ResponseInputParam!ResponsesAPIOptionalRequestParamsResponsesAPIResponseResponsesAPIStreamingResponse)DeleteResponseResult)GenericLiteLLMParams)LlmProviders   )VolcEngineErrorget_volcengine_base_urlget_volcengine_headers)Loggingc                       s  e Zd ZU g dZee ed< edefddZ	dede
fddZd	ed
edeeejf defddZdededee defddZdee dedefddZdedededefddZdedeeef dedededef fddZdedededefddZded ej dede!fd!d"Z"d#edededede#eef f
d$d%Z$d ej dede%fd&d'Z&d#edededede#eef f
d(d)Z'd ej dede!fd*d+Z(	,	,	,	-	.dOd#edededed/ee d0ee d1eee  d2ed3e)d4 de#eef fd5d6Z*d ej dedefd7d8Z+d#edededede#eef f
d9d:Z,d ej dede!fd;d<Z-	,dPdee d=ee d>ee defd?d@Z.e/dAe0dBe0deee0f fdCdDZ1e/dEe0de0fdFdGZ2e/dHe0dEe0de0fdIdJZ3e/dEe0dHe0dee0 fdKdLZ4defdMdNZ5  Z6S )QVolcEngineResponsesAPIConfig)ZinstructionsZmax_output_tokensZprevious_response_idstoreZ	reasoningstreamZtemperatureZtop_ptextZtoolsZtool_choiceZmax_tool_callsZthinkingZcachingZ	expire_atZcontext_managementmetadataextra_headersZextra_query
extra_bodytimeout_SUPPORTED_OPTIONAL_PARAMSreturnc                 C   s   t jS N)r   Z
VOLCENGINEself r+   g/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/volcengine/responses/transformation.pycustom_llm_providerM   s   z0VolcEngineResponsesAPIConfig.custom_llm_providermodelc                 C   s(   ddgt | j }d|v r|d |S )zU
        Volcengine Responses API: only documented parameters are supported.
        inputr.   r"   )listr&   remove)r*   r.   	supportedr+   r+   r,   get_supported_openai_paramsQ   s   
z8VolcEngineResponsesAPIConfig.get_supported_openai_paramserror_messagestatus_codeheadersc                 C   s,   t |tjr|nt|pi }t|||dS )N)r5   messager6   )
isinstancehttpxHeadersr   )r*   r4   r5   r6   Ztyped_headersr+   r+   r,   get_error_class[   s   z,VolcEngineResponsesAPIConfig.get_error_classlitellm_paramsc                 C   s`   |du rt  }nt|trt di |}|jp!tjp!tdp!td}|du r*tdt||dS )zB
        Build auth headers for Volcengine Responses API.
        NZARK_API_KEYZVOLCENGINE_API_KEYzUVolcengine API key is required. Set ARK_API_KEY / VOLCENGINE_API_KEY or pass api_key.)api_keyr#   r+   )r   r8   dictr=   litellmr   
ValueErrorr   )r*   r6   r.   r<   r=   r+   r+   r,   validate_environmentg   s    
z1VolcEngineResponsesAPIConfig.validate_environmentapi_basec                 C   sV   |pt jptdptdpt }|d}|dr|S |dr&| dS | dS )z>
        Construct Volcengine Responses API endpoint.
        ZVOLCENGINE_API_BASEZARK_API_BASE/z
/responsesz/api/v3z/api/v3/responses)r?   rB   r   r   rstripendswith)r*   rB   r<   base_urlr+   r+   r,   get_complete_url   s   	




z-VolcEngineResponsesAPIConfig.get_complete_urlresponse_api_optional_paramsdrop_paramsc                    sH    fddt | D }|dd d|v r"td |dd |S )z
        Volcengine Responses API aligns with OpenAI parameters.
        Remove parameters not supported by the public docs.
        c                    s    i | ]\}}| j v r||qS r+   )r&   ).0keyvaluer)   r+   r,   
<dictcomp>   s
    
zBVolcEngineResponsesAPIConfig.map_openai_params.<locals>.<dictcomp>r"   Nparallel_tool_callszKVolcengine Responses API: dropping unsupported 'parallel_tool_calls' param.)r>   itemspopr   debug)r*   rH   r.   rI   paramsr+   r)   r,   map_openai_params   s   


z.VolcEngineResponsesAPIConfig.map_openai_paramsr/   $response_api_optional_request_paramsc                    s   t | j  fdd| D }|dd |dd t|dtr> fdd|d  D }|r8||d< n|dd t j|||||dS )	z
        Volcengine rejects any undocumented fields (including extra_body). Fail fast
        with clear errors and re-filter with the documented whitelist before delegating
        to the OpenAI base transformer.
        c                       i | ]\}}| v r||qS r+   r+   rJ   kvallowedr+   r,   rM          zPVolcEngineResponsesAPIConfig.transform_responses_api_request.<locals>.<dictcomp>r"   NrN   r$   c                    rU   r+   r+   rV   rY   r+   r,   rM      r[   )r.   r/   rT   r<   r6   )	setr&   rO   rP   r8   getr>   supertransform_responses_api_request)r*   r.   r/   rT   r<   r6   Zsanitized_optionalZfiltered_body	__class__rY   r,   r_      s(   




z<VolcEngineResponsesAPIConfig.transform_responses_api_requestparsed_chunklogging_objc           
      C   s   |}t |tr'|d}t |tr'd|vr't|}t|}g |d< ||d< |}t |tr3t|dnd}tj|d}	| ||	}|	di |S )za
        Volcengine may omit required fields; auto-fill them using event model defaults.
        responseoutputtypeN)
event_typer+   )r8   r>   r]   strr   Zget_event_model_class_fill_missing_fields)
r*   r.   rb   rc   chunkrespZpatched_chunkZpatched_resprg   Zevent_pydantic_modelr+   r+   r,   transform_streaming_response   s   	

z9VolcEngineResponsesAPIConfig.transform_streaming_responseraw_responsec                 C   s   z|j |jdi id | }d|v rt|d |d< W n ty+   t|j|jdw t|j}t	|}z	t
di |}W n tyT   td t
jdi |}Y nw ||jd< ||jd< |S )	NZcomplete_input_dict)original_responseZadditional_argsZ
created_atr7   r5   zOVolcengine Responses API: falling back to model_construct for response parsing.additional_headersr6   r+   )Z	post_callr!   jsonr   	Exceptionr   r5   r>   r6   r   r   r   rQ   model_construct_hidden_params)r*   r.   rm   rc   raw_response_jsonraw_response_headersprocessed_headersrd   r+   r+   r,   transform_response_api_response   s:   


z<VolcEngineResponsesAPIConfig.transform_response_api_responseresponse_idc                 C      | d| }i }||fS NrC   r+   r*   ry   rB   r<   r6   urldatar+   r+   r,   %transform_delete_response_api_request"     zBVolcEngineResponsesAPIConfig.transform_delete_response_api_requestc                 C   sj   z|  }W n ty   t|j|jdw ztdi |W S  ty4   td tjdi | Y S w )Nro   zVVolcengine Responses API: falling back to model_construct for delete response parsing.r+   )	rq   rr   r   r!   r5   r   r   rQ   rs   )r*   rm   rc   ru   r+   r+   r,   &transform_delete_response_api_response-  s   zCVolcEngineResponsesAPIConfig.transform_delete_response_api_responsec                 C   rz   r{   r+   r|   r+   r+   r,   "transform_get_response_api_requestC  r   z?VolcEngineResponsesAPIConfig.transform_get_response_api_requestc                 C   d   z|  }W n ty   t|j|jdw t|j}t|}tdi |}||j	d< ||j	d< |S Nro   rp   r6   r+   
rq   rr   r   r!   r5   r>   r6   r   r   rt   r*   rm   rc   ru   rv   rw   rd   r+   r+   r,   #transform_get_response_api_responseN     


z@VolcEngineResponsesAPIConfig.transform_get_response_api_responseN   descafterbeforeincludelimitorder)ascr   c
                 C   sn   | d| d}
i }|d ur||d< |d ur||d< |r#d ||d< |d ur+||d< |	d ur3|	|d< |
|fS )	NrC   z/input_itemsr   r   ,r   r   r   )join)r*   ry   rB   r<   r6   r   r   r   r   r   r}   rR   r+   r+   r,   "transform_list_input_items_requeste  s   z?VolcEngineResponsesAPIConfig.transform_list_input_items_requestc                 C   s*   z|  W S  ty   t|j|jdw )Nro   )rq   rr   r   r!   r5   )r*   rm   rc   r+   r+   r,   #transform_list_input_items_response  s   
z@VolcEngineResponsesAPIConfig.transform_list_input_items_responsec                 C   s   | d| d}i }||fS )NrC   z/cancelr+   r|   r+   r+   r,   %transform_cancel_response_api_request  s   zBVolcEngineResponsesAPIConfig.transform_cancel_response_api_requestc                 C   r   r   r   r   r+   r+   r,   &transform_cancel_response_api_response  r   zCVolcEngineResponsesAPIConfig.transform_cancel_response_api_responser    r-   c                 C      dS )ze
        Volcengine Responses API supports native streaming; never fall back to fake stream.
        Fr+   )r*   r.   r    r-   r+   r+   r,   should_fake_stream  s   	z/VolcEngineResponsesAPIConfig.should_fake_streamrj   event_modelc                 C   s   t | tr	|du r| S t| }t|di pi }| D ]?\}}||v r/t|| |j||< q|jtj	ur@|jdur@|j||< q|j
durR|j
tj	urR|
 ||< qt|j||< q|S )z
        Heuristically fill missing required fields with safe defaults based on the
        event model's field annotations. This keeps parsing tolerant of providers that
        omit non-essential fields.
        Nmodel_fields)r8   r>   getattrrO   r   _maybe_fill_nested
annotationdefault
pyd_fieldsZPydanticUndefineddefault_factory_default_for_annotation)rj   r   ZpatchedZ
fields_mapnamefieldr+   r+   r,   ri     s*   	



z1VolcEngineResponsesAPIConfig._fill_missing_fieldsr   c                 C   sz   t | }t| }| tu rdS | tu s|tu rg S |tu r/tdd |D r'g S td |v r/d S |tu r;td |v r;d S d S )Nr   c                 s   s$    | ]}|t u pt|t u V  qd S r(   )r0   r   )rJ   argr+   r+   r,   	<genexpr>  s   " zGVolcEngineResponsesAPIConfig._default_for_annotation.<locals>.<genexpr>)r   r
   intr0   r	   anyrf   )r   originargsr+   r+   r,   r     s   z4VolcEngineResponsesAPIConfig._default_for_annotationrL   c                    sj   t || }t|}t| tr|durt | |S t| tr3|r$|d nd  dur3 fdd| D S | S )z\
        Recursively fill nested dict/list structures based on the annotated model.
        Nr   c                    s   g | ]}t | qS r+   )r   r   )rJ   rX   Zelem_annr+   r,   
<listcomp>  s    
zCVolcEngineResponsesAPIConfig._maybe_fill_nested.<locals>.<listcomp>)r   _pick_model_classr
   r8   r>   ri   r0   )rL   r   Z	model_clsr   r+   r   r,   r     s   

z/VolcEngineResponsesAPIConfig._maybe_fill_nestedc           
   	   C   s   g }t | }t| dr||  |tu r%t| D ]}t|dr$|| q|s)dS t|tre|d}|D ]/}z$|jd}|du rDW q5|j	}t |t
u rZt|}	||	v rZ|W   S W q5 tyd   Y q5w |d S )zR
        Choose the best-matching Pydantic model class for a nested dict.
        r   Nrf   r   )r   hasattrappendr	   r
   r8   r>   r]   r   r   r   rr   )
r   rL   
candidatesr   r   Zv_type	candidateZ
type_fieldZliteral_annZliteral_valuesr+   r+   r,   r     s8   






z.VolcEngineResponsesAPIConfig._pick_model_classc                 C   r   )z>VolcEngine does not support native WebSocket for Responses APIFr+   r)   r+   r+   r,   supports_native_websocket0  s   z6VolcEngineResponsesAPIConfig.supports_native_websocket)NNNr   r   r(   )7__name__
__module____qualname__r&   r   rh   __annotations__propertyr   r-   r0   r3   r   r	   r>   r9   r:   r   r;   r   r   rA   rG   r   boolr   rS   r   r_   LiteLLMLoggingObjr   rl   Responser   rx   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   ri   r   r   r   r   __classcell__r+   r+   r`   r,   r   1   sl  
 





)

'






	








'$r   ).typingr   r   r   r   r   r   r   r	   r
   r   r9   Zpydanticr   r   r?   Zlitellm._loggingr   Z'litellm.litellm_core_utils.core_helpersr   ZFlitellm.litellm_core_utils.llm_response_utils.convert_dict_to_responser   Z,litellm.llms.openai.responses.transformationr   Zlitellm.secret_managers.mainr   Zlitellm.types.llms.openair   r   r   r   Zlitellm.types.responses.mainr   Zlitellm.types.routerr   Zlitellm.types.utilsr   Zcommon_utilsr   r   r   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjr   r   r+   r+   r+   r,   <module>   s&   0 