Ë
    uPêj4*  ã                   óò   — d Z ddlmZmZm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 dd	lmZmZmZmZ erddlZdd
lmZ ddlmZmZ ddlmZ eZneZeZeZeZ G d„ de«      Z  G d„ de«      Z!y)z6LangFlow run API: POST {api_base}/api/v1/run/{flow_id}é    )ÚTYPE_CHECKINGÚAnyÚFinal)ÚquoteN)Úverbose_logger)Úconvert_content_list_to_str)Ú
BaseConfigÚBaseLLMException)ÚAllMessageValues)ÚChoicesÚMessageÚModelResponseÚUsage)ÚLogging)ÚAsyncHTTPHandlerÚHTTPHandler)ÚCustomStreamWrapperc                   ó   — e Zd ZdZy)ÚLangFlowErrorz(Exception class for LangFlow API errors.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    ún/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/langflow/chat/transformation.pyr   r      s   „ Ú2r   r   c                   ó²  ‡ — e Zd ZdZˆ fd„Zdedz  dedz  deedz  edz  f   fd„Zdedee   fd	„Z	d
e
de
dedede
f
d„Zdede
de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e   defd„Zde
ddfd„Zdedee   de
de
de
de
fd„Zde
dedz  fd„Z	 	 d,dedej*                  dedede
dee   de
de
dddedz  d edz  defd!„Z	 	 	 	 d-de
de
de
dededz  dedz  dedz  d"edz  dee
edz  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de
ej:                  z  def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"ˆ xZ#S ).ÚLangFlowConfigzÎ
    Configuration for the LangFlow API.

    LangFlow is a visual, low-code platform for building AI agents and pipelines.
    Each flow has a unique flow_id and is invoked via a simple HTTP endpoint.
    c                 ó$   •— t        ‰| �  di |¤Ž y )Nr   )ÚsuperÚ__init__)ÚselfÚkwargsÚ	__class__s     €r   r!   zLangFlowConfig.__init__+   s   ø€ Ü‰ÑÑ"˜6Ó"r   Úapi_baseNÚapi_keyÚreturnc                 óN   — ddl m} |xs  |d«      xs d}|xs  |d«      }||fS )Nr   )Úget_secret_strÚLANGFLOW_API_BASEzhttp://localhost:7860ÚLANGFLOW_API_KEY)Úlitellm.secret_managers.mainr)   )r"   r%   r&   r)   s       r   Ú$_get_openai_compatible_provider_infoz3LangFlowConfig._get_openai_compatible_provider_info.   s9   € õ
 	@àÒ]™~Ð.AÓBÒ]ÐF]ˆØÒ?™^Ð,>Ó?ˆØ˜Ð Ð r   Úmodelc                 ó   — dgS )NÚstreamr   )r"   r.   s     r   Úget_supported_openai_paramsz*LangFlowConfig.get_supported_openai_params9   s
   € ØˆzÐr   Únon_default_paramsÚoptional_paramsÚdrop_paramsc                 ó   — |S ©Nr   )r"   r2   r3   r.   r4   s        r   Úmap_openai_paramsz LangFlowConfig.map_openai_params<   s
   € ð Ðr   c                 ó²   — |j                  d«      �t        dd¬«      ‚d|v r|j                  dd«      d   n|j                  «       }|st        dd¬«      ‚|S )zÞ
        Extract flow_id from the authorized model name only.

        Model format: "langflow/{flow_id}". Request kwargs must not override
        flow_id (would allow calling another flow with the same API key).
        Úflow_idé�  zJflow_id cannot be set via request parameters; use model langflow/{flow_id}©Ústatus_codeÚmessageú/é   z1flow_id is required; use model langflow/{flow_id})Úgetr   ÚsplitÚstrip)r"   r.   r3   r9   s       r   Ú_get_flow_idzLangFlowConfig._get_flow_idE   sm   € ð ×Ñ˜yÓ)Ð5ÜØØeôð ð
 58¸5±L˜%Ÿ+™+ c¨1Ó-¨aÒ0Àe×RÑRÓTˆÙÜØØKôð ð ˆr   Úlitellm_paramsr0   c                 ó†   — |€t        d«      ‚|j                  d«      }t        | j                  ||«      d¬«      }|› d|› �S )Nz^api_base is required for LangFlow. Set it via LANGFLOW_API_BASE env var or api_base parameter.r>   Ú )Úsafez/api/v1/run/)Ú
ValueErrorÚrstripr   rC   )r"   r%   r&   r.   r3   rD   r0   r9   s           r   Úget_complete_urlzLangFlowConfig.get_complete_urlZ   sT   € ð ÐÜØpóð ð —?‘? 3Ó'ˆÜ˜t×0Ñ0°¸ÓHÈrÔRˆØ�˜<¨ yÐ1Ð1r   Úmessagesc                 óˆ  — t        |«      D ]b  }|j                  d«      dk(  sŒ|j                  dd«      }t        |t        «      rt	        |«      }t        |t
        «      st        |«      }|c S  |rP|d   j                  dd«      }t        |t        «      rt	        |d   «      }t        |t
        «      st        |«      }|S y)z@Extract the text of the last user message to use as input_value.ÚroleÚuserÚcontentrF   éÿÿÿÿ)Úreversedr@   Ú
isinstanceÚlistr   Ústr)r"   rK   ÚmsgrO   s       r   Ú_get_last_user_messagez%LangFlowConfig._get_last_user_messagel   s°   € ä˜HÓ%ò 	ˆCØ�w‰w�v‹ &Ó(ØŸ'™' )¨RÓ0�Ü˜g¤tÔ,Ü9¸#Ó>�GÜ! '¬3Ô/Ü! '›l�GØ’ð	ñ Ø˜r‘l×&Ñ& y°"Ó5ˆGÜ˜'¤4Ô(Ü5°h¸r±lÓC�Ü˜g¤sÔ+Ü˜g›,�ØˆNàr   Úparamsc                 ó@   — |j                  d«      �t        dd¬«      ‚y )NÚtweaksr:   zqtweaks cannot be set via request parameters; they would override the operator-configured LangFlow flow componentsr;   )r@   r   )r"   rW   s     r   Ú_reject_caller_tweaksz$LangFlowConfig._reject_caller_tweaks‚   s,   € Ø�:‰:�hÓÐ+ÜØðPôð ð ,r   Úheadersc                 óò   — | j                  |«       | j                  |«      }||j                  dd«      |j                  dd«      dœ}|j                  d«      }|r||d<   t        j                  d|«       |S )a  
        Transform the request to LangFlow format.

        LangFlow request format:
        {
            "input_value": "<last user message>",
            "input_type": "chat",
            "output_type": "chat",
            "session_id": "<session_id>"
        }
        Ú
input_typeÚchatÚoutput_type)Úinput_valuer]   r_   Ú
session_idzLangFlow request payload: %s)rZ   rV   r@   r   Údebug)	r"   r.   rK   r3   rD   r[   r`   Úpayloadra   s	            r   Útransform_requestz LangFlowConfig.transform_requestŒ   sƒ   € ð& 	×"Ñ" ?Ô3à!×8Ñ8¸ÓBˆð 'Ø)×-Ñ-¨l¸FÓCØ*×.Ñ.¨}¸fÓEñ*
ˆð ,×/Ñ/°Ó=ˆ
ÙØ$.ˆG�LÑ!ä×ÑÐ;¸WÔEØˆr   Úresponse_jsonc                 óª  — |j                  dg «      }t        |t        «      r|sy|d   }t        |t        «      sy|j                  dg «      }t        |t        «      r|sy|d   }t        |t        «      sy|j                  di «      }t        |t        «      r8|j                  di «      }t        |t        «      r|j                  d«      r|d   S |j                  di «      }t        |t        «      ra|j	                  «       D ]N  }	t        |	t        «      sŒ|	j                  di «      }
t        |
t        «      sŒ7|
j                  d«      sŒI|
d   c S  y)aV  
        Extract the assistant text from a LangFlow run response.

        Expected structure:
        {"outputs": [{"outputs": [{"results": {"message": {"text": "..."}}}]}]}

        Returns None when no message text is present so the caller can surface an
        explicit error instead of forwarding a raw JSON blob as the answer.
        ÚoutputsNr   Úresultsr=   Útext)r@   rR   rS   ÚdictÚvalues)r"   re   rg   Úfirst_outputÚinner_outputsÚfirst_innerrh   r=   Úoutputs_dictÚvalrU   s              r   Ú_extract_content_from_responsez-LangFlowConfig._extract_content_from_response°   s+  € ð '×*Ñ*¨9°bÓ9ˆÜ˜7¤DÔ)©gØà% a™jˆÜ˜,¬Ô-Øà+×/Ñ/°	¸2Ó>ˆÜ˜=¬$Ô/±MØà*¨1Ñ-ˆÜ˜+¤tÔ,Øà$Ÿ™¨°BÓ7ˆÜ�gœtÔ$Ø$Ÿ[™[¨°BÓ7ˆGÜ˜'¤4Ô(¨W¯[©[¸Ô-@Ø˜v‘Ð&à)Ÿo™o¨i¸Ó<ˆÜ�l¤DÔ)Ø#×*Ñ*Ó,ò +�Ü˜c¤4Õ(ØŸ'™' )¨RÓ0�CÜ! #¤tÕ,°·±¸µØ" 6™{Ò*ð	+ð r   Úraw_responseÚmodel_responseÚlogging_objÚrequest_dataÚencodingztiktoken.Encoding | NoneÚ	json_modec                 ó  — 	 |j                  «       }t	        j
                  d|«       | j                  |«      }|€t        dd¬«      ‚t        |d¬«      }t        dd	|¬
«      }|g|_	        ||_
        	 d	dlm}  |||¬«      } |||d¬«      }t        ||||z   ¬«      }t        |d|«       |S # t        $ r}t        d|› �|j                  ¬«      ‚d }~ww xY w# t        $ r!}t	        j                  d|«       Y d }~|S d }~ww xY w)Nz'LangFlow returned a non-JSON response: )r=   r<   zLangFlow response: %szgCould not extract a message from the LangFlow response; ensure the flow ends in a Chat Output componentiô  Ú	assistant)rO   rM   Ústopr   )Úfinish_reasonÚindexr=   )Útoken_counter)r.   rK   T)r.   ri   Úcount_response_tokens)Úprompt_tokensÚcompletion_tokensÚtotal_tokensÚusagez#Failed to calculate token usage: %s)ÚjsonÚ	Exceptionr   r<   r   rb   rq   r   r   Úchoicesr.   Úlitellm.utilsr}   r   ÚsetattrÚwarning)r"   r.   rr   rs   rt   ru   rK   r3   rD   rv   r&   rw   re   ÚerO   r=   Úchoicer}   r   r€   r‚   s                        r   Útransform_responsez!LangFlowConfig.transform_responseÚ   s8  € ð	Ø#/×#4Ñ#4Ó#6ˆMô 	×ÑÐ4°mÔDà×<Ñ<¸]ÓKˆØˆ?ÜðFð  ôð ô !¨°{ÔCˆÜ¨f¸AÀwÔOˆà"( ˆÔØ$ˆÔð	MÝ3á#0°uÀxÔ#PˆMÙ'4¸5ÀwÐfjÔ'kÐÜ Ø+Ø"3Ø*Ð->Ñ>ôˆEô
 �N G¨UÔ3ð ÐøôM ò 	ÜØAÀ!ÀÐEØ(×4Ñ4ôð ûð	ûôF ò 	MÜ×"Ñ"Ð#HÈ!×LÐLàÐûð	Mús/   ‚B. Á39C Â.	CÂ7CÃCÃ	DÃ"C>Ã>DÚfake_streamc	                 ó,   — | j                  |«       |d fS r6   )rZ   )	r"   r[   r3   ru   r%   r&   r.   r0   rŒ   s	            r   Úsign_requestzLangFlowConfig.sign_request  s   € ð 	×"Ñ" <Ô0Ø˜ˆ}Ðr   c                 ó   — d|d<   |r||d<   |S )Nzapplication/jsonzContent-Typez	x-api-keyr   )r"   r[   r.   rK   r3   rD   r&   r%   s           r   Úvalidate_environmentz#LangFlowConfig.validate_environment   s    € ð #5ˆ�ÑáØ#*ˆG�KÑ àˆr   Úerror_messager<   c                 ó   — t        ||¬«      S )Nr;   )r   )r"   r‘   r<   r[   s       r   Úget_error_classzLangFlowConfig.get_error_class1  s   € Ü¨¸mÔLÐLr   c                  ó   — y)NFr   )r"   s    r   Ú%supports_stream_param_in_request_bodyz4LangFlowConfig.supports_stream_param_in_request_body4  s   € àr   Úcustom_llm_providerc                 ó
   — |du S )NTr   )r"   r.   r0   r–   s       r   Úshould_fake_streamz!LangFlowConfig.should_fake_stream8  s   € ð ˜ˆ~Ðr   r6   )NN)NNNN)$r   r   r   r   r!   rT   Útupler-   rS   r1   rj   Úboolr7   rC   rJ   r   rV   rZ   rd   rq   ÚhttpxÚResponser   ÚLiteLLMLoggingObjr‹   ÚbytesrŽ   r�   ÚintÚHeadersr
   r“   Úpropertyr•   r˜   Ú__classcell__)r$   s   @r   r   r   #   s¤  ø„ ñô#ð	!à˜‘*ð	!ð �t‘ð	!ð 
ˆs�T‰z˜3 ™:Ð%Ñ	&ó		!ð°ð ¸¸c¹ó ðà ðð ðð ð	ð
 ðð 
óð #ð ¸ð Àó ð8 #ñ2à˜‘*ð2ð �t‘ð2ð ð	2ð
 ð2ð ð2ð �t‘ð2ð 
ó2ð$¨tÐ4DÑ/Eð È#ó ð,¨Dð °Tó ð"àð"ð Ð'Ñ(ð"ð ð	"ð
 ð"ð ð"ð 
ó"ðH(¸Dð (ÀSÈ4ÁZó (ðj #Ø!%ñ6àð6ð —n‘nð6ð &ð	6ð
 'ð6ð ð6ð Ð'Ñ(ð6ð ð6ð ð6ð -ð6ð �t‘ð6ð ˜$‘;ð6ð 
ó6ð| #Ø Ø"Ø#'ñàðð ðð ð	ð
 ðð �t‘ðð �T‰zðð �t‘ðð ˜D‘[ðð 
ˆt�U˜T‘\Ð!Ñ	"óð* #Ø#ñàðð ðð Ð'Ñ(ð	ð
 ðð ðð �t‘ðð ˜‘*ðð 
óð"M¨Sð M¸sð MÈTÐTY×TaÑTaÑMað MÐfvó Mð ð°tò ó ðð +/ñ	à�T‰zðð �t‘ðð ! 4™Zð	ð
 
÷r   r   )"r   Útypingr   r   r   Úurllib.parser   r›   Úlitellm._loggingr   Ú8litellm.litellm_core_utils.prompt_templates.common_utilsr   Ú)litellm.llms.base_llm.chat.transformationr	   r
   Úlitellm.types.llms.openair   Úlitellm.types.utilsr   r   r   r   ÚtiktokenÚ*litellm.litellm_core_utils.litellm_loggingr   Ú_LiteLLMLoggingObjÚ&litellm.llms.custom_httpx.http_handlerr   r   r†   r   r�   r   r   r   r   r   ú<module>r®      sr   ðÙ <ç ,Ñ ,Ý ã å +õ÷ SÝ 6ß FÓ FáÛåXßTÝ1à*ÑàÐØ€KØÐØÐô3Ð$ô 3ô[�Zõ [r   