o
    ưi2                     @   s   d dl Z d dlmZmZ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 d dlmZ d dlmZ d dlmZ d d	lmZmZmZ d d
lmZ d dlmZ erad dlmZ  e Z!neZ!dZ"G dd deZ#dS )    N)TYPE_CHECKINGAnyDictOptionalTupleUnion)verbose_logger)process_response_headers)_safe_convert_created_field)OpenAIError)OpenAIResponsesAPIConfig)get_secret_str)ResponseAPIUsageResponseInputParamResponsesAPIResponse)GenericLiteLLMParams)LlmProviders)Loggingzhttps://api.manus.imc                       s0  e Zd ZdZedefddZ	d#dee dee	 dee de	fd	d
Z
de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eef dedededef fddZdedejdedefddZ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  ZS )$ManusResponsesAPIConfiga  
    Configuration for Manus API's Responses API.
    
    Manus API is OpenAI-compatible but has some differences:
    - API key passed via `API_KEY` header (not `Authorization: Bearer`)
    - Model format: `manus/{agent_profile}` (e.g., `manus/manus-1.6`)
    - Requires `extra_body` with `task_mode: "agent"` and `agent_profile`
    
    Reference: https://open.manus.im/docs/openai-compatibility
    returnc                 C   s   t jS N)r   ZMANUSself r   b/home/app/Keep/.python/lib/python3.10/site-packages/litellm/llms/manus/responses/transformation.pycustom_llm_provider-   s   z+ManusResponsesAPIConfig.custom_llm_providerNmodelstreamr   c                 C   s   |du S )z
        Manus API doesn't support real-time streaming.
        It returns a task that runs asynchronously.
        We fake streaming by converting the response into streaming events.
        Tr   )r   r   r   r   r   r   r   should_fake_stream1   s   z*ManusResponsesAPIConfig.should_fake_streamc                 C   s   d|v r| ddd S |S )a  
        Extract agent profile from model name.
        
        Model format: `manus/{agent_profile}`
        Examples: `manus/manus-1.6`, `manus/manus-1.6-lite`, `manus/manus-1.6-max`
        
        Returns:
            str: The agent profile (e.g., "manus-1.6")
        /   )split)r   r   r   r   r   _extract_agent_profile>   s   
z.ManusResponsesAPIConfig._extract_agent_profileheaderslitellm_paramsc                 C   s>   |pt  }|jptjptd}|std||dd |S )z
        Validate environment and set up headers for Manus API.
        
        Manus uses `API_KEY` header instead of `Authorization: Bearer`.
        ZMANUS_API_KEYz\Manus API key is required. Set MANUS_API_KEY environment variable or pass api_key parameter.zapplication/json)ZAPI_KEYzContent-Type)r   api_keylitellmr   
ValueErrorupdate)r   r#   r   r$   r%   r   r   r   validate_environmentM   s    
z,ManusResponsesAPIConfig.validate_environmentapi_basec                 C   s>   |p
t jp
tdp
t}|d}|dr| dS | dS )z
        Get the complete URL for Manus Responses API endpoint.
        
        Returns:
            str: The full URL for the Manus /v1/responses endpoint
        MANUS_API_BASEr   z/v1z
/responsesz/v1/responses)r&   r*   r   r+   rstripendswith)r   r*   r$   r   r   r   get_complete_urlk   s   



z(ManusResponsesAPIConfig.get_complete_urlinput$response_api_optional_request_paramsc           	         sf   t  j|||||d}| j|d}d|d< ||d< |di p i }|r(|| td| d |S )	z
        Transform the request for Manus API.
        
        Manus requires:
        - `task_mode: "agent"` in the request body
        - `agent_profile` extracted from model name in the request body
        )r   r/   r0   r$   r#   )r   ZagentZ	task_modeagent_profile
extra_bodyzManus: Using agent_profile=z, task_mode=agent)supertransform_responses_api_requestr"   getr(   r   debug)	r   r   r/   r0   r$   r#   Zbase_requestr1   r2   	__class__r   r   r4      s"   	

z7ManusResponsesAPIConfig.transform_responses_api_requestraw_responselogging_objc                 C   s  z,|j |jdi id | }d|v rd|vrt|d |d< d|v r+t|d |d< W n ty;   t|j|jdw t|j}t	|}d|vsP|
ddu rTi |d< d|vs_|
ddu rci |d< d	|vsn|
d	du rrg |d	< d
|vs}|
d
du rtdddd|d
< d|vs|
ddu rdt jdd  |d< z	tdi |}W n ty   td| d tjdi |}Y nw ||jd< ||jd< |S )z
        Transform Manus API response to OpenAI-compatible format.
        
        Manus uses camelCase (createdAt) instead of snake_case (created_at).
        complete_input_dictoriginal_responseZadditional_args	createdAt
created_atmessagestatus_code	reasoningNtextoutputusager   Zinput_tokensZoutput_tokensZtotal_tokensidunknown-   )Error constructing ResponsesAPIResponse: , using model_constructadditional_headersr#   r   Z	post_callrD   jsonr
   	Exceptionr   rB   dictr#   r	   r5   r   uuiduuid4hexr   r   r6   Zmodel_constructZ_hidden_params)r   r   r9   r:   raw_response_jsonraw_response_headersprocessed_headersresponser   r   r   transform_response_api_response   s^   




z7ManusResponsesAPIConfig.transform_response_api_responsec                 C   s   dS )z9Manus does not support native WebSocket for Responses APIFr   r   r   r   r   supports_native_websocket   s   z1ManusResponsesAPIConfig.supports_native_websocketresponse_idc                 C   s   | d| }i }||fS )a   
        Transform the get response API request into a URL and data.
        
        Manus API follows OpenAI-compatible format:
        - GET /v1/responses/{response_id}
        
        Reference: https://open.manus.im/docs/openai-compatibility
        r   r   )r   r[   r*   r$   r#   urldatar   r   r   "transform_get_response_api_request   s   z:ManusResponsesAPIConfig.transform_get_response_api_requestc                 C   s  z,|j |jdi id | }d|v rd|vrt|d |d< d|v r+t|d |d< W n ty;   t|j|jdw t|j}t	|}d|vsP|
ddu rTi |d< d|vs_|
ddu rci |d< d	|vsn|
d	du rrg |d	< d
|vs}|
d
du rtdddd|d
< d|vs|
ddu rdt jdd  |d< z	tdi |}W n ty   td| d tjdi |}Y nw ||jd< ||jd< |S )z
        Transform Manus API GET response to OpenAI-compatible format.
        
        Manus uses camelCase (createdAt) instead of snake_case (created_at).
        Same transformation as transform_response_api_response.
        r;   r<   r>   r?   r@   rC   NrD   rE   rF   r   rG   rH   rI   rJ   rK   rL   rM   r#   r   rN   )r   r9   r:   rU   rV   rW   rX   r   r   r   #transform_get_response_api_response  s^   




z;ManusResponsesAPIConfig.transform_get_response_api_responser   )__name__
__module____qualname____doc__propertyr   r   r   strboolr   r"   rQ   r   r)   r.   r   r   r   r4   httpxResponseLiteLLMLoggingObjr   rY   rZ   r   r^   r_   __classcell__r   r   r7   r   r   !   s    



+
J

r   )$rR   typingr   r   r   r   r   r   rg   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.common_utilsr   Z,litellm.llms.openai.responses.transformationr   Zlitellm.secret_managers.mainr   Zlitellm.types.llms.openair   r   r   Zlitellm.types.routerr   Zlitellm.types.utilsr   Z*litellm.litellm_core_utils.litellm_loggingr   Z_LiteLLMLoggingObjri   r+   r   r   r   r   r   <module>   s&     