Ë
    uPêj!1  ã                   óð   — U d dl Z d dl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 d d
lmZmZmZ d dlmZ d dlmZ er	d dlmZ eZ neZ dZ!ee"d<    G d„ de«      Z#y)é    N)ÚTYPE_CHECKINGÚAnyÚFinal)Úverbose_logger)Úprocess_response_headers)Ú_safe_convert_created_field©Úencode_url_path_segment)ÚOpenAIError)ÚOpenAIResponsesAPIConfig)Úget_secret_str)ÚResponseAPIUsageÚResponseInputParamÚResponsesAPIResponse)ÚGenericLiteLLMParams)ÚLlmProviders)ÚLoggingzhttps://api.manus.imÚMANUS_API_BASEc                   óT  ‡ — e Zd ZdZedefd„«       Z	 ddedz  dedz  dedz  defd„Z	dedefd	„Z
d
edededz  defd„Zdedz  dedefd„Zdedeez  deded
edefˆ fd„Zdedej$                  dedefd„Zdefd„Zdededed
edeeef   f
d„Zdej$                  dedefd„Zˆ x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                 ó"   — t         j                  S ©N)r   ÚMANUS©Úselfs    úp/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/manus/responses/transformation.pyÚcustom_llm_providerz+ManusResponsesAPIConfig.custom_llm_provider.   s   € ä×!Ñ!Ð!ó    NÚmodelÚstreamr   c                 ó
   — |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.
        T© )r   r    r!   r   s       r   Úshould_fake_streamz*ManusResponsesAPIConfig.should_fake_stream2   s   € ð ˜ˆ~Ðr   c                 ó8   — d|v r|j                  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    s     r   Ú_extract_agent_profilez.ManusResponsesAPIConfig._extract_agent_profile?   s&   € ð �%‰<Ø—;‘;˜s AÓ& qÑ)Ð)àˆr   ÚheadersÚlitellm_paramsc                 óº   — |xs
 t        «       }|j                  xs t        j                  xs t        d«      }|st	        d«      ‚|j                  |ddœ«       |S )z‘
        Validate environment and set up headers for Manus API.

        Manus uses `API_KEY` header instead of `Authorization: Bearer`.
        ÚMANUS_API_KEYz\Manus API key is required. Set MANUS_API_KEY environment variable or pass api_key parameter.zapplication/json)ÚAPI_KEYzContent-Type)r   Úapi_keyÚlitellmr   Ú
ValueErrorÚupdate)r   r*   r    r+   r/   s        r   Úvalidate_environmentz,ManusResponsesAPIConfig.validate_environmentN   sd   € ð (ÒAÔ+?Ó+AˆØ'×/Ñ/Òe´7·?±?ÒeÄnÐUdÓFeˆáÜØnóð ð 	�‰à"Ø 2ñô	
ð ˆr   Úapi_basec                 ó¬   — |xs% t         j                  xs t        d«      xs t        }|j	                  d«      }|j                  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
        r   r&   z/v1z
/responsesz/v1/responses)r0   r4   r   r   ÚrstripÚendswith)r   r4   r+   s      r   Úget_complete_urlz(ManusResponsesAPIConfig.get_complete_urlf   s_   € ð Òeœw×/Ñ/Òe´>ÐBRÓ3SÒeÔWeˆð —?‘? 3Ó'ˆð ×Ñ˜UÔ#Ø�Z˜zÐ*Ð*Ø�˜=Ð)Ð)r   ÚinputÚ$response_api_optional_request_paramsc                 óæ   •— t         ‰	| �  |||||¬«      }| j                  |¬«      }d|d<   ||d<   |j                  di «      xs i }|r|j	                  |«       t        j                  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    r9   r:   r+   r*   )r    ÚagentÚ	task_modeÚagent_profileÚ
extra_bodyz.Manus: Using agent_profile=%s, task_mode=agent)ÚsuperÚtransform_responses_api_requestr)   Úgetr2   r   Údebug)
r   r    r9   r:   r+   r*   Úbase_requestr>   r?   Ú	__class__s
            €r   rA   z7ManusResponsesAPIConfig.transform_responses_api_request{   s˜   ø€ ô  $™gÑEØØØ1UØ)Øð Fó 
ˆð  $×:Ñ:ÀÐ:ÓGˆð %,ˆ�[Ñ!Ø(5ˆ�_Ñ%ð A×DÑDÀ\ÐSUÓVÒ\ÐZ\ˆ
ÙØ×Ñ 
Ô+ä×ÑÐMÈ}Ô]àÐr   Úraw_responseÚlogging_objc                 óš  — 	 |j                  |j                  di i¬«       |j                  «       }d|v rd|vrt        |d   «      |d<   d|v rt        |d   «      |d<   t        |j                  «      }t        |«      }d|vs|j                  d«      €i |d<   d|vs|j                  d«      €i |d<   d	|vs|j                  d	«      €g |d	<   d
|vs|j                  d
«      €t        ddd¬«      |d
<   d|vs|j                  d«      €'dt        j                  «       j                  dd › �|d<   	 t        j                   |«      }||j(                  d<   ||j(                  d<   |S # t        $ r" t        |j                  |j                  ¬«      ‚w xY w# t        $ r. t#        j$                  d|«       t        j&                  di |¤Ž}Y Œ„w xY w)z™
        Transform Manus API response to OpenAI-compatible format.

        Manus uses camelCase (createdAt) instead of snake_case (created_at).
        Úcomplete_input_dict©Úoriginal_responseÚadditional_argsÚ	createdAtÚ
created_at©ÚmessageÚstatus_codeÚ	reasoningNÚtextÚoutputÚusager   ©Úinput_tokensÚoutput_tokensÚtotal_tokensÚidúunknown-é   úBError constructing ResponsesAPIResponse: %s, using model_constructÚadditional_headersr*   r#   ©Ú	post_callrS   Újsonr   Ú	Exceptionr   rQ   Údictr*   r   rB   r   ÚuuidÚuuid4Úhexr   Úmodel_validater   rC   Úmodel_constructÚ_hidden_params)r   r    rF   rG   Úraw_response_jsonÚraw_response_headersÚprocessed_headersÚresponses           r   Útransform_response_api_responsez7ManusResponsesAPIConfig.transform_response_api_response¤   s<  € ð	_Ø×!Ñ!Ø".×"3Ñ"3Ø!6¸Ð ;ð "ô ð (4×'8Ñ'8Ó':Ðð Ð/Ñ/°LÐHYÑ4YÜ2MÐN_Ð`kÑNlÓ2mÐ! ,Ñ/ð Ð0Ñ0Ü2MÐN_Ð`lÑNmÓ2nÐ! ,Ñ/ô '+¨<×+?Ñ+?Ó&@ÐÜ#;Ð<PÓ#QÐð Ð/Ñ/Ð3D×3HÑ3HÈÓ3UÐ3]Ø-/Ð˜kÑ*àÐ*Ñ*Ð.?×.CÑ.CÀFÓ.KÐ.SØ(*Ð˜fÑ%àÐ,Ñ,Ð0A×0EÑ0EÀhÓ0OÐ0WØ*,Ð˜hÑ'ð Ð+Ñ+Ð/@×/DÑ/DÀWÓ/MÐ/UÜ)9ØØØô*Ð˜gÑ&ð Ð(Ñ(Ð,=×,AÑ,AÀ$Ó,GÐ,Oð )1´·±³×1AÑ1AÀ"À1Ð1EÐ0FÐ&GÐ˜dÑ#ð	QÜ+×:Ñ:Ð;LÓMˆHð 9Jˆ×ÑÐ 4Ñ5Ø-Aˆ×Ñ 	Ñ*ØˆøôS ò 	_Ü l×&7Ñ&7À\×E]ÑE]Ô^Ð^ð	_ûô@ ò 	QÜ× Ñ ØTÐVgôô ,×;Ñ;ÑPÐ>OÑPŠHð		Qúó   ‚AE% Ä0F Å%+FÆ4G
Ç	G
c                  ó   — y)z9Manus does not support native WebSocket for Responses APIFr#   r   s    r   Úsupports_native_websocketz1ManusResponsesAPIConfig.supports_native_websocketè   s   € àr   Úresponse_idc                 ó6   — t        |d¬«      }|› d|› �}i }||fS )zð
        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
        rr   )Ú
field_namer&   r	   )r   rr   r4   r+   r*   Úencoded_response_idÚurlÚdatas           r   Ú"transform_get_response_api_requestz:ManusResponsesAPIConfig.transform_get_response_api_requestì   s3   € ô &=¸[ÐUbÔ%cÐØ �z Ð#6Ð"7Ð8ˆØˆØ�DˆyÐr   c                 óš  — 	 |j                  |j                  di i¬«       |j                  «       }d|v rd|vrt        |d   «      |d<   d|v rt        |d   «      |d<   t        |j                  «      }t        |«      }d|vs|j                  d«      €i |d<   d|vs|j                  d«      €i |d<   d	|vs|j                  d	«      €g |d	<   d
|vs|j                  d
«      €t        ddd¬«      |d
<   d|vs|j                  d«      €'dt        j                  «       j                  dd › �|d<   	 t        j                   |«      }||j(                  d<   ||j(                  d<   |S # t        $ r" t        |j                  |j                  ¬«      ‚w xY w# t        $ r. t#        j$                  d|«       t        j&                  di |¤Ž}Y Œ„w xY w)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.
        rI   rJ   rM   rN   rO   rR   NrS   rT   rU   r   rV   rZ   r[   r\   r]   r^   r*   r#   r_   )r   rF   rG   rj   rk   rl   rm   s          r   Ú#transform_get_response_api_responsez;ManusResponsesAPIConfig.transform_get_response_api_response   s7  € ð	_Ø×!Ñ!Ø".×"3Ñ"3Ø!6¸Ð ;ð "ô ð (4×'8Ñ'8Ó':Ðð Ð/Ñ/°LÐHYÑ4YÜ2MÐN_Ð`kÑNlÓ2mÐ! ,Ñ/ð Ð0Ñ0Ü2MÐN_Ð`lÑNmÓ2nÐ! ,Ñ/ô '+¨<×+?Ñ+?Ó&@ÐÜ#;Ð<PÓ#QÐð Ð/Ñ/Ð3D×3HÑ3HÈÓ3UÐ3]Ø-/Ð˜kÑ*àÐ*Ñ*Ð.?×.CÑ.CÀFÓ.KÐ.SØ(*Ð˜fÑ%àÐ,Ñ,Ð0A×0EÑ0EÀhÓ0OÐ0WØ*,Ð˜hÑ'àÐ+Ñ+Ð/@×/DÑ/DÀWÓ/MÐ/UÜ)9ØØØô*Ð˜gÑ&ð Ð(Ñ(Ð,=×,AÑ,AÀ$Ó,GÐ,Oà(0´·±³×1AÑ1AÀ"À1Ð1EÐ0FÐ&GÐ˜dÑ#ð	QÜ+×:Ñ:Ð;LÓMˆHð 9Jˆ×ÑÐ 4Ñ5Ø-Aˆ×Ñ 	Ñ*ØˆøôO ò 	_Ü l×&7Ñ&7À\×E]ÑE]Ô^Ð^ð	_ûô< ò 	QÜ× Ñ ØTÐVgôô ,×;Ñ;ÑPÐ>OÑPŠHð		Qúro   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úpropertyr   r   ÚstrÚboolr$   r)   rc   r   r3   r8   r   rA   ÚhttpxÚResponseÚLiteLLMLoggingObjr   rn   rq   Útuplerx   rz   Ú__classcell__)rE   s   @r   r   r   "   s®  ø„ ñ	ð ð" \ò "ó ð"ð +/ñ	à�T‰zðð �t‘ðð ! 4™Zð	ð
 
óð¨Cð °Có ð¨Dð ¸ð ÐNbÐeiÑNið Ðnró ð0*à˜‘*ð*ð ð*ð 
ó	*ð*'àð'ð Ð'Ñ'ð'ð /3ð	'ð
 -ð'ð ð'ð 
õ'ðRBàðBð —n‘nðBð 'ð	Bð
 
óBðH¨4ó ðàðð ðð -ð	ð
 ðð 
ˆs�DˆyÑ	óð(@à—n‘nð@ð 'ð@ð 
÷	@r   r   )$rd   Útypingr   r   r   r‚   r0   Úlitellm._loggingr   Ú'litellm.litellm_core_utils.core_helpersr   ÚFlitellm.litellm_core_utils.llm_response_utils.convert_dict_to_responser   Ú$litellm.litellm_core_utils.url_utilsr
   Ú litellm.llms.openai.common_utilsr   Ú,litellm.llms.openai.responses.transformationr   Úlitellm.secret_managers.mainr   Úlitellm.types.llms.openair   r   r   Úlitellm.types.routerr   Úlitellm.types.utilsr   Ú*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjr„   r   Ú__annotations__r   r#   r   r   ú<module>r•      sk   ðÜ ß ,Ñ ,ã ã Ý +Ý Lõõ IÝ 8Ý QÝ 7÷ñ õ
 6Ý ,áÝXà*ÑàÐà.€�Ó .ô^Ð6õ ^r   