§
    šŠtj76  ã                   óþ   — d dl Z d dlZd dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
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 d d	lmZmZ  G d
„ de¦  «        Zdeeef         de
eef         fd„Z G d„ de¦  «        ZdS )é    N)Údatetime)ÚEnum)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)ÚUUID)ÚAgentActionÚAgentFinish)ÚBaseCallbackHandler)ÚBaseMessageÚChatMessage)Ú
GenerationÚ	LLMResultc                   ó   — e Zd ZdZdZdZdS )ÚLabelStudioModezLabel Studio mode enumerator.ÚpromptÚchatN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚPROMPTÚCHAT© ó    úp/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/callbacks/labelstudio_callback.pyr   r      s   € € € € € Ø'Ð'à€FØ€D€D€Dr   r   ÚmodeÚreturnc                 ó°   — t           j        j        dt           j        j        di}t	          | t
          ¦  «        rt          | ¦  «        } || j                 | fS )z³Get default Label Studio configs for the given mode.

    Parameters:
        mode: Label Studio mode ("prompt" or "chat")

    Returns: Tuple of Label Studio config and mode
    a	  
<View>
<Style>
    .prompt-box {
        background-color: white;
        border-radius: 10px;
        box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
        padding: 20px;
    }
</Style>
<View className="root">
    <View className="prompt-box">
        <Text name="prompt" value="$prompt"/>
    </View>
    <TextArea name="response" toName="prompt"
              maxSubmissions="1" editable="true"
              required="true"/>
</View>
<Header value="Rate the response:"/>
<Rating name="rating" toName="prompt"/>
</View>aë  
<View>
<View className="root">
     <Paragraphs name="dialogue"
               value="$prompt"
               layout="dialogue"
               textKey="content"
               nameKey="role"
               granularity="sentence"/>
  <Header value="Final response:"/>
    <TextArea name="response" toName="dialogue"
              maxSubmissions="1" editable="true"
              required="true"/>
</View>
<Header value="Rate the response:"/>
<Rating name="rating" toName="dialogue"/>
</View>)r   r   Úvaluer   Ú
isinstanceÚstr)r    Ú_default_label_configss     r   Úget_default_label_configsr'      s^   € õ 	ÔÔ$ð 'õ* 	ÔÔ"ð %ð-'ÐõR �$�ÑÔð %Ý˜tÑ$Ô$ˆà! $¤*Ô-¨tÐ3Ð3r   c                   ó  ‡ — e Zd ZU dZdZeed<   dddedej        fde	e         de	e         de	e
         ded	e	e         d
eeef         fˆ fd„Zdedeee                  ddfd„Zdeeef         dee         deddfd„Zdedefd„Zddddœdeeef         deee                  dede	e         de	ee                  de	eeef                  dedefd„Zdededdfd„Zdededdfd„Zd ededdfd!„Zdeeef         d"eeef         deddfd#„Zd$eeef         deddfd%„Zd ededdfd&„Zdeeef         d'ededdfd(„Zd)e dedefd*„Z!	 	 d4d+ed,e	e         d-e	e         deddf
d.„Z"d ededdfd/„Z#d0ededdfd1„Z$d2e%deddfd3„Z&ˆ xZ'S )5ÚLabelStudioCallbackHandlera¹  Label Studio callback handler.
    Provides the ability to send predictions to Label Studio
    for human evaluation, feedback and annotation.

    Parameters:
        api_key: Label Studio API key
        url: Label Studio URL
        project_id: Label Studio project ID
        project_name: Label Studio project name
        project_config: Label Studio project config (XML)
        mode: Label Studio mode ("prompt" or "chat")

    Examples:
        >>> from langchain_community.llms import OpenAI
        >>> from langchain_community.callbacks import LabelStudioCallbackHandler
        >>> handler = LabelStudioCallbackHandler(
        ...             api_key='<your_key_here>',
        ...             url='http://localhost:8080',
        ...             project_name='LangChain-%Y-%m-%d',
        ...             mode='prompt'
        ... )
        >>> llm = OpenAI(callbacks=[handler])
        >>> llm.invoke('Tell me a story about a dog.')
    zLangChain-%Y-%m-%dÚDEFAULT_PROJECT_NAMENÚapi_keyÚurlÚ
project_idÚproject_nameÚproject_configr    c                 ó´  •— t          ¦   «                              ¦   «          	 dd l}n+# t          $ r t          d| j        j        › d�¦  «        ‚w xY w|s`t          j        d¦  «        r"t          t          j        d¦  «        ¦  «        }n*t          d| j        j        › d| j        j        › d�¦  «        ‚|| _
        |sZt          j        d¦  «        rt          j        d¦  «        }n1t          j        d|j        › d	| j        j        › d
�¦  «         |j        }|| _        i | _        |                     | j        | j
        ¬¦  «        | _        || _        |r|| _        d | _        nt+          |¦  «        \  | _        | _        |pt          j        d¦  «        | _        | j        �2| j                             t1          | j        ¦  «        ¦  «        | _        nžt5          j        ¦   «                              | j        ¦  «        }| j                             |¬¦  «        }	|	r|	d         | _        | j        j        | _        n7| j                             || j        ¬¦  «        | _        | j        j        | _        | j        j         | _         d\  | _!        | _"        | _#        | _$        | j          %                    ¦   «         D ]_\  }
}|d         dk    rN|
| _!        |d         d         | _"        |d         d         d         | _#        |d         d         d         | _$         nŒ`| j!        s:d| j        › d�}| j        tL          j'        k    r|dz  }n|dz  }t          |¦  «        ‚d S )Nr   zYou're using zº in your code, but you don't have the LabelStudio SDK Python package installed or upgraded to the latest version. Please run `pip install -U label-studio-sdk` before using this callback.ÚLABEL_STUDIO_API_KEYzé in your code, Label Studio API key is not provided. Please provide Label Studio API key: go to the Label Studio instance, navigate to Account & Settings -> Access Token and copy the key. Use the key as a parameter for the callback: zr(label_studio_api_key='<your_key_here>', ...) or set the environment variable LABEL_STUDIO_API_KEY=<your_key_here>ÚLABEL_STUDIO_URLz5Label Studio URL is not provided, using default URL: z8If you want to provide your own URL, use the parameter: zj(label_studio_url='<your_url_here>', ...) or set the environment variable LABEL_STUDIO_URL=<your_url_here>)r,   r+   ÚLABEL_STUDIO_PROJECT_ID)Útitle)r4   Úlabel_config)NNNNÚtypeÚTextAreaÚto_nameÚinputsr#   zLabel Studio project "zI" does not have a TextArea tag. Please add a TextArea tag to the project.z•
HINT: go to project Settings -> Labeling Interface -> Browse Templates and select "Generative AI -> Supervised Language Model Fine-tuning" template.z„
HINT: go to project Settings -> Labeling Interface -> Browse Templates and check available templates under "Generative AI" section.)(ÚsuperÚ__init__Úlabel_studio_sdkÚImportErrorÚ	__class__r   ÚosÚgetenvr%   Ú
ValueErrorr+   ÚwarningsÚwarnÚLABEL_STUDIO_DEFAULT_URLr,   ÚpayloadÚClientÚ	ls_clientr.   r/   r    r'   r-   Úget_projectÚintÚ
ls_projectr   ÚtodayÚstrftimeÚget_projectsÚidÚcreate_projectÚparsed_label_configÚ	from_namer8   r#   Ú
input_typeÚitemsr   r   )Úselfr+   r,   r-   r.   r/   r    ÚlsÚproject_titleÚexisting_projectsÚtag_nameÚtag_infoÚerror_messager>   s                €r   r;   z#LabelStudioCallbackHandler.__init__j   sÓ  ø€ õ 	‰Œ×ÒÑÔÐð		Ø)Ð)Ð)Ð)Ð)øÝð 	ð 	ð 	Ýð0 ¤Ô 7ð 0ð 0ð 0ñô ð ð	øøøð ð 	ÝŒyÐ/Ñ0Ô0ð Ý�bœiÐ(>Ñ?Ô?Ñ@Ô@��å ðY D¤NÔ$;ð Yð Yð ”~Ô.ðYð Yð Yñ
ô 
ð 
ð ˆŒàð 	2ÝŒyÐ+Ñ,Ô,ð 2Ý”iÐ 2Ñ3Ô3��å”ðXØ*,Ô*EðXð Xð ”~Ô.ðXð Xð Xñô ð ð Ô1�ØˆŒð )+ˆŒàŸš t¤x¸¼˜ÑFÔFˆŒØ(ˆÔØð 	MØ"0ˆDÔØˆDŒIˆIå-FÀtÑ-LÔ-LÑ*ˆDÔ ¤à$ÐL­¬	Ð2KÑ(LÔ(LˆŒØŒ?Ð&Ø"œn×8Ò8½¸T¼_Ñ9MÔ9MÑNÔNˆDŒOˆOå$œNÑ,Ô,×5Ò5°dÔ6GÑHÔHˆMØ $¤× ;Ò ;À-Ð ;Ñ PÔ PÐØ ð 5Ø"3°AÔ"6�”Ø"&¤/Ô"4�”�à"&¤.×"?Ò"?Ø'°dÔ6Ið #@ñ #ô #�”ð #'¤/Ô"4�”Ø#'¤?Ô#FˆÔ ðE
ÑAˆŒ˜œ d¤j°$´/ð #'Ô":×"@Ò"@Ñ"BÔ"Bð 	ð 	ÑˆH�hØ˜Ô :Ò-Ð-Ø!)�”Ø'¨	Ô2°1Ô5�”Ø% hÔ/°Ô2°7Ô;�”
Ø"*¨8Ô"4°QÔ"7¸Ô"?�”Ø�ð .ð Œ~ð 	,ð=¨Ô):ð =ð =ð =ð ð
 Œy�OÔ2Ò2Ð2ØðGñ��ð ð/ñ�õ ˜]Ñ+Ô+Ð+ð)	,ð 	,s	   £( ¨(AÚrun_idÚgenerationsr!   c           
      ó†  — g }| j         |         d         }| j         |         d                              di ¦  «                             d¦  «        }t          ||¦  «        D ]F\  }}|                     | j        |d|i| j        | j        ddd„ |D ¦   «         id	œg|d
œgdœ¦  «         ŒG| j                             |¦  «         d S )NÚpromptsÚkwargsÚinvocation_paramsÚ
model_namer[   ÚtextareaÚtextc                 ó   — g | ]	}|j         ‘Œ
S r   )rc   )Ú.0Úgs     r   ú
<listcomp>zFLabelStudioCallbackHandler.add_prompts_generations.<locals>.<listcomp>û   s   € Ð6RÐ6RÐ6RÀ!°q´vÐ6RÐ6RÐ6Rr   )rQ   r8   r6   r#   )ÚresultÚmodel_version)ÚdataÚpredictions)	rE   ÚgetÚzipÚappendr#   rQ   r8   rJ   Úimport_tasks)rT   r[   r\   Útasksr^   ri   r   Ú
generations           r   Úadd_prompts_generationsz2LabelStudioCallbackHandler.add_prompts_generationsâ   s
  € ð ˆØ”,˜vÔ& yÔ1ˆàŒL˜Ô  Ô*ßŠSÐ$ bÑ)Ô)ßŠS�ÑÔð 	õ
 #& g¨{Ñ";Ô";ð 	ð 	ÑˆF�JØ�LŠLð œ
 FØ  &ðð 26´Ø/3¬|Ø,6Ø.4Ð6RÐ6RÀzÐ6RÑ6RÔ6RÐ-Sð	!"ð !"ð'ð .;ð
ð 
ð$ðð ñô ð ð ð* 	Œ×$Ò$ UÑ+Ô+Ð+Ð+Ð+r   Ú
serializedr^   r_   c                 ó    — | j         dk    r t          d| j        › d| j         › d�¦  «        ‚t          |d         ¦  «        }||dœ| j        |<   dS )ú.Save the prompts in memory when an LLM starts.ÚTextú
Label Studio project "ú" has an input type <zw>. To make it work with the mode="chat", the input type should be <Text>.
Read more here https://labelstud.io/tags/textr[   )r^   r_   N)rR   rA   r.   r%   rE   )rT   rs   r^   r_   r[   s        r   Úon_llm_startz'LabelStudioCallbackHandler.on_llm_start  s   € ð Œ?˜fÒ$Ð$ÝðA¨4Ô+<ð Að AØ&*¤oðAð Að Añô ð õ �V˜HÔ%Ñ&Ô&ˆØ+2¸fÐEÐEˆŒ�VÑÐÐr   Úmessagec                 óR   — t          |t          ¦  «        r|j        S |j        j        S )zGet the role of the message.)r$   r   Úroler>   r   )rT   rz   s     r   Ú_get_message_rolez,LabelStudioCallbackHandler._get_message_role  s(   € å�g�{Ñ+Ô+ð 	.Ø”<ÐàÔ$Ô-Ð-r   )Úparent_run_idÚtagsÚmetadataÚmessagesr~   r   r€   c                ó>  — | j         dk    r t          d| j        › d| j         › d�¦  «        ‚g }|D ]N}	g }
|	D ]2}|
                     |                      |¦  «        |j        dœ¦  «         Œ3|                     |
¦  «         ŒO||||||dœ| j        t          |¦  «        <   dS )ru   Ú
Paragraphsrw   rx   zƒ>. To make it work with the mode="chat", the input type should be <Paragraphs>.
Read more here https://labelstud.io/tags/paragraphs)r|   Úcontent)r^   r   r€   r[   r~   r_   N)rR   rA   r.   rn   r}   r„   rE   r%   )rT   rs   r�   r[   r~   r   r€   r_   r^   Úmessage_listÚdialogrz   s               r   Úon_chat_model_startz.LabelStudioCallbackHandler.on_chat_model_start  sþ   € ð Œ?˜lÒ*Ð*ÝðG¨4Ô+<ð Gð GØ&*¤oðGð Gð Gñô ð ð ˆØ$ð 		#ð 		#ˆLØˆFØ'ð ð �Ø—’à $× 6Ò 6°wÑ ?Ô ?Ø#*¤?ðð ñô ð ð ð �NŠN˜6Ñ"Ô"Ð"Ð"àØØ ØØ*Øð%
ð %
ˆŒ•S˜‘[”[Ñ!Ð!Ð!r   Útokenc                 ó   — dS )z)Do nothing when a new token is generated.Nr   )rT   rˆ   r_   s      r   Úon_llm_new_tokenz+LabelStudioCallbackHandler.on_llm_new_tokenG  ó   € àˆr   Úresponsec                 óš   — t          |d         ¦  «        }|                      ||j        ¦  «         | j                             |¦  «         dS )z>Create a new Label Studio task for each prompt and generation.r[   N)r%   rr   r\   rE   Úpop)rT   rŒ   r_   r[   s       r   Ú
on_llm_endz%LabelStudioCallbackHandler.on_llm_endK  sM   € å�V˜HÔ%Ñ&Ô&ˆð 	×$Ò$ V¨XÔ-AÑBÔBÐBð 	Œ×Ò˜Ñ Ô Ð Ð Ð r   Úerrorc                 ó   — dS )z%Do nothing when LLM outputs an error.Nr   ©rT   r�   r_   s      r   Úon_llm_errorz'LabelStudioCallbackHandler.on_llm_errorU  r‹   r   r9   c                 ó   — d S ©Nr   )rT   rs   r9   r_   s       r   Úon_chain_startz)LabelStudioCallbackHandler.on_chain_startY  s	   € ð 	ˆr   Úoutputsc                 ó   — d S r•   r   )rT   r—   r_   s      r   Úon_chain_endz'LabelStudioCallbackHandler.on_chain_end^  s   € Øˆr   c                 ó   — dS )z+Do nothing when LLM chain outputs an error.Nr   r’   s      r   Úon_chain_errorz)LabelStudioCallbackHandler.on_chain_errora  r‹   r   Ú	input_strc                 ó   — dS )zDo nothing when tool starts.Nr   )rT   rs   rœ   r_   s       r   Úon_tool_startz(LabelStudioCallbackHandler.on_tool_starte  s	   € ð 	ˆr   Úactionc                 ó   — dS )z.Do nothing when agent takes a specific action.Nr   )rT   rŸ   r_   s      r   Úon_agent_actionz*LabelStudioCallbackHandler.on_agent_actionn  r‹   r   ÚoutputÚobservation_prefixÚ
llm_prefixc                 ó   — dS )zDo nothing when tool ends.Nr   )rT   r¢   r£   r¤   r_   s        r   Úon_tool_endz&LabelStudioCallbackHandler.on_tool_endr  s	   € ð 	ˆr   c                 ó   — dS )z&Do nothing when tool outputs an error.Nr   r’   s      r   Úon_tool_errorz(LabelStudioCallbackHandler.on_tool_error|  r‹   r   rc   c                 ó   — dS ©z
Do nothingNr   )rT   rc   r_   s      r   Úon_textz"LabelStudioCallbackHandler.on_text€  r‹   r   Úfinishc                 ó   — dS rª   r   )rT   r¬   r_   s      r   Úon_agent_finishz*LabelStudioCallbackHandler.on_agent_finish„  r‹   r   )NN)(r   r   r   r   r*   r%   Ú__annotations__r   r   r   rI   r
   r;   r   r   rr   r   r   ry   r   r}   r   r‡   rŠ   r   r�   ÚBaseExceptionr“   r–   r™   r›   rž   r   r¡   r¦   r¨   r«   r   r®   Ú__classcell__)r>   s   @r   r)   r)   N   s}  ø€ € € € € € ðð ð2 !5Ð˜#Ð4Ð4Ñ4ð "&Ø!Ø$(Ø0Ø(,Ø,;Ô,Bðv,ð v,à˜#”ðv,ð �cŒ]ðv,ð ˜S”Mð	v,ð
 ðv,ð ! œðv,ð �C˜Ð(Ô)ðv,ð v,ð v,ð v,ð v,ð v,ðp!,Øð!,Ø(,¨T°*Ô-=Ô(>ð!,à	ð!,ð !,ð !,ð !,ðFFà˜˜c˜”NðFð �c”ðFð ð	Fð
 
ðFð Fð Fð Fð$.¨ð .¸ð .ð .ð .ð .ð )-Ø$(Ø-1ð'
ð '
ð '
à˜˜c˜”Nð'
ð �t˜KÔ(Ô)ð'
ð
 ð'
ð   ”~ð'
ð �t˜C”yÔ!ð'
ð ˜4  S œ>Ô*ð'
ð ð'
ð 
ð'
ð '
ð '
ð '
ðR cð °Sð ¸Tð ð ð ð ð! 9ð !¸ð !Àð !ð !ð !ð !ð -ð ¸3ð À4ð ð ð ð ðØ˜s C˜xœ.ðØ26°s¸C°x´.ðØLOðà	ðð ð ð ð
 D¨¨c¨¤Nð ¸cð Àdð ð ð ð ð Mð ¸Sð ÀTð ð ð ð ðà˜˜c˜”Nðð ðð ð	ð
 
ðð ð ð ð kð ¸Sð ÀSð ð ð ð ð -1Ø$(ð	ð àðð % SœMðð ˜S”Mð	ð
 ðð 
ðð ð ð ð =ð ¸Cð ÀDð ð ð ð ð˜Cð ¨3ð °4ð ð ð ð ð kð ¸Sð ÀTð ð ð ð ð ð ð ð r   r)   )r?   rB   r   Úenumr   Útypingr   r   r   r   r	   r
   Úuuidr   Úlangchain_core.agentsr   r   Úlangchain_core.callbacksr   Úlangchain_core.messagesr   r   Úlangchain_core.outputsr   r   r   r%   r'   r)   r   r   r   ú<module>r¹      sy  ðØ 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð à :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ðð ð ð ð �dñ ô ð ð64Ø
��_Ð$Ô
%ð64à
ˆ3�ÐÔ ð64ð 64ð 64ð 64ðrxð xð xð xð xÐ!4ñ xô xð xð xð xr   