Ë
    uPêj
%  ã                   óf   — d 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	m
Z
 ddlmZ  G d„ d	e«      Zy)
au  
RAGFlow provider configuration for OpenAI-compatible API.

RAGFlow provides OpenAI-compatible APIs with unique path structures:
- Chat endpoint: /api/v1/chats_openai/{chat_id}/chat/completions
- Agent endpoint: /api/v1/agents_openai/{agent_id}/chat/completions

Model name format:
- Chat: ragflow/chat/{chat_id}/{model_name}
- Agent: ragflow/agent/{agent_id}/{model_name}
é    )ÚFinalN)Úencode_url_path_segment)ÚOpenAIConfig)Ú
get_secretÚget_secret_str)ÚAllMessageValuesc                   ó  ‡ — e Zd ZdZdedeeeef   fd„Z	 ddedz  dedz  deded	ed
edz  defd„Z	dededz  dedz  dedeedz  edz  ef   f
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dedee   ded	ededefˆ fd„Zˆ xZS )ÚRAGFlowConfiga  
    Configuration for RAGFlow OpenAI-compatible API.

    Handles both chat and agent endpoints by parsing the model name format:
    - ragflow/chat/{chat_id}/{model_name} for chat endpoints
    - ragflow/agent/{agent_id}/{model_name} for agent endpoints
    ÚmodelÚreturnc                 óø   — |j                  d«      }t        |«      dk  rt        d|› d�«      ‚|d   dk7  rt        d|› d�«      ‚|d   }|d	vrt        d
|› d�«      ‚|d   }dj                  |dd «      }|||fS )aa  
        Parse RAGFlow model name format: ragflow/{endpoint_type}/{id}/{model_name}

        Args:
            model: Model name in format ragflow/chat/{chat_id}/{model} or ragflow/agent/{agent_id}/{model}

        Returns:
            Tuple of (endpoint_type, id, model_name)

        Raises:
            ValueError: If model format is invalid
        ú/é   zInvalid RAGFlow model format: zU. Expected format: ragflow/chat/{chat_id}/{model} or ragflow/agent/{agent_id}/{model}r   Úragflowz. Must start with 'ragflow/'é   )ÚchatÚagentzInvalid RAGFlow endpoint type: z. Must be 'chat' or 'agent'é   é   N)ÚsplitÚlenÚ
ValueErrorÚjoin)Úselfr   ÚpartsÚendpoint_typeÚ	entity_idÚ
model_names         úm/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/ragflow/chat/transformation.pyÚ_parse_ragflow_modelz"RAGFlowConfig._parse_ragflow_model   s³   € ð —{‘{ 3Ó'ˆÜˆu‹:˜Š>ÜØ0°°ð 8nð oóð ð
 �‰8�yÒ ÜÐ=¸e¸WÐD`ÐaÓbÐbà$ Q™xˆØÐ 1Ñ1ÜÐ>¸}¸oÐMhÐiÓjÐjà  ™8ˆ	ØŸH™H U¨1¨2 YÓ/ˆ
à˜i¨Ð3Ð3ó    NÚapi_baseÚapi_keyÚoptional_paramsÚlitellm_paramsÚstreamc                 óè  — |r(t        |d«      r|j                  r|xs |j                  }|xs* t        j                  xs t        d«      xs t	        d«      }|€t        d«      ‚| j                  |«      \  }}}	|j                  d«      }|j                  d«      r|dd }n|j                  d«      r|dd	 }t        |d
¬«      }
|dk(  rd|
› d�}nd|
› d�}|j                  d«      sd|z   }|› |› �S )aÖ  
        Get the complete URL for the RAGFlow API call.

        Constructs URL based on endpoint type:
        - Chat: /api/v1/chats_openai/{chat_id}/chat/completions
        - Agent: /api/v1/agents_openai/{agent_id}/chat/completions

        Args:
            api_base: Base API URL (e.g., http://ragflow-server:port or http://ragflow-server:port/v1)
            api_key: API key (not used in URL construction)
            model: Model name in format ragflow/{endpoint_type}/{id}/{model}
            optional_params: Optional parameters
            litellm_params: LiteLLM parameters (may contain api_base)
            stream: Whether streaming is enabled

        Returns:
            Complete URL for the API call
        r"   ÚRAGFLOW_API_BASENz„api_base is required for RAGFlow provider. Set it via api_base parameter, RAGFLOW_API_BASE environment variable, or litellm.api_baser   z/api/v1iùÿÿÿz/v1éýÿÿÿr   )Ú
field_namer   z/api/v1/chats_openai/z/chat/completionsz/api/v1/agents_openai/)Úhasattrr"   Úlitellmr   r   r   r    ÚrstripÚendswithr   Ú
startswith)r   r"   r#   r   r$   r%   r&   r   r   Ú_Úencoded_entity_idÚpaths               r   Úget_complete_urlzRAGFlowConfig.get_complete_url?   s%  € ñ8 œg n°jÔAÀn×F]ÒF]ØÒ: >×#:Ñ#:ˆHàÒwœw×/Ñ/Òw´:Ð>PÓ3QÒwÔUcÐdvÓUwˆàÐÜð Wóð ð
 '+×&?Ñ&?ÀÓ&FÑ#ˆ�y !ð —?‘? 3Ó'ˆð ×Ñ˜YÔ'Ø  �}‰HØ×Ñ˜uÔ%Ø  �}ˆHô $;¸9ÐQ\Ô#]ÐØ˜FÒ"Ø*Ð+<Ð*=Ð=NÐO‰Dà+Ð,=Ð+>Ð>OÐPˆDð �‰˜sÔ#Ø˜‘:ˆDà�˜D˜6Ð"Ð"r!   Úcustom_llm_providerc                 óÔ   — | j                  |«      \  }}}|xs* t        j                  xs t        d«      xs t	        d«      }|xs t        j
                  xs t	        d«      }|||fS )a–  
        Get OpenAI-compatible provider information for RAGFlow.

        Args:
            model: Model name (will be parsed to extract actual model name)
            api_base: Base API URL (from input params)
            api_key: API key (from input params)
            custom_llm_provider: Custom LLM provider name

        Returns:
            Tuple of (api_base, api_key, custom_llm_provider)
        r(   ÚRAGFLOW_API_KEY)r    r,   r"   r   r   r#   )	r   r   r"   r#   r4   r0   Úactual_modelÚdynamic_api_baseÚdynamic_api_keys	            r   Ú$_get_openai_compatible_provider_infoz2RAGFlowConfig._get_openai_compatible_provider_info   so   € ð* "×6Ñ6°uÓ=Ñˆˆ1ˆlð Òpœ×(Ñ(Òp¬JÐ7IÓ,JÒpÌnÐ]oÓNpð 	ð
 ")Ò!`¬G¯O©OÒ!`¼~ÐN_Ó?`ˆà Ð2EÐEÐEr!   ÚheadersÚmessagesc                 ó   — |r(t        |d«      r|j                  r|xs |j                  }|xs t        j                  xs t        d«      }|�d|› �|d<   d|vr	d|vrd|d<   	 | j	                  |«      \  }}}	|	|d<   |S # t
        $ r Y |S w xY w)	aÃ  
        Validate environment and set up headers for RAGFlow API.

        Args:
            headers: Request headers
            model: Model name
            messages: Chat messages
            optional_params: Optional parameters
            litellm_params: LiteLLM parameters (may contain api_key)
            api_key: API key (from input params)
            api_base: Base API URL

        Returns:
            Updated headers dictionary
        r#   r6   zBearer ÚAuthorizationzcontent-typezContent-Typezapplication/jsonÚ_ragflow_actual_model)r+   r#   r,   r   r    r   )
r   r;   r   r<   r$   r%   r#   r"   r0   r7   s
             r   Úvalidate_environmentz"RAGFlowConfig.validate_environment    s¼   € ñ4 œg n°iÔ@À^×E[ÒE[ØÒ7 ×!7Ñ!7ˆGð ÒQœWŸ_™_ÒQ´Ð?PÓ0QˆàÐØ)0°°	Ð':ˆG�OÑ$ð  Ñ(¨^À7Ñ-JØ&8ˆG�NÑ#ð	Ø!%×!:Ñ!:¸5Ó!AÑˆAˆq�,à6BˆNÐ2Ñ3ð
 ˆøô	 ò 	ààˆð		ús   Á$B  Â 	BÂBc                 óž   •— |j                  d«      }|€	 | j                  |«      \  }}}t        ‰| �  |||||«      S # t        $ r |}Y Œ w xY w)aÊ  
        Transform request for RAGFlow API.

        Uses the actual model name extracted from the RAGFlow model format.

        Args:
            model: Model name in RAGFlow format
            messages: Chat messages
            optional_params: Optional parameters
            litellm_params: LiteLLM parameters (may contain _ragflow_actual_model)
            headers: Request headers

        Returns:
            Transformed request dictionary
        r?   )Úgetr    r   ÚsuperÚtransform_request)	r   r   r<   r$   r%   r;   r7   r0   Ú	__class__s	           €r   rD   zRAGFlowConfig.transform_requestÓ   sj   ø€ ð0 &×)Ñ)Ð*AÓBˆØÐð%Ø%)×%>Ñ%>¸uÓ%EÑ"��1�lô ‰wÑ(¨°xÀÐR`ÐbiÓjÐjøô ò %à$’ð%ús   –> ¾AÁA)N)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚtupler    ÚdictÚboolr3   r:   Úlistr   r@   rD   Ú__classcell__)rE   s   @r   r
   r
      s–  ø„ ñð4¨#ð 4°%¸¸SÀ#¸Ñ2Fó 4ðN #ñ>#à˜‘*ð>#ð �t‘ð>#ð ð	>#ð
 ð>#ð ð>#ð �t‘ð>#ð 
ó>#ð@FàðFð ˜‘*ðFð �t‘ð	Fð
 !ðFð 
ˆs�T‰z˜3 ™: sÐ*Ñ	+óFðP #Ø#ñ1àð1ð ð1ð Ð'Ñ(ð	1ð
 ð1ð ð1ð �t‘ð1ð ˜‘*ð1ð 
ó1ðf"kàð"kð Ð'Ñ(ð"kð ð	"kð
 ð"kð ð"kð 
÷"kñ "kr!   r
   )rI   Útypingr   r,   Ú$litellm.litellm_core_utils.url_utilsr   Úlitellm.llms.openai.openair   Úlitellm.secret_managers.mainr   r   Úlitellm.types.llms.openair   r
   © r!   r   ú<module>rV      s.   ðñ
õ ã Ý HÝ 3ß CÝ 6ô_k�Lõ _kr!   