o
    Zh`                     @   s~   d Z ddlZddlmZmZ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	efd
dZG dd de	ZdS )zCallback handler for Context AI    N)AnyDictList)UUID)BaseCallbackHandler)BaseMessage)	LLMResult)guard_importreturnc                	   C   sJ   t dddt dddjt dddjt dddjt dddjt dddjfS )z Import the `getcontext` package.
getcontextzpython-context)Zpip_namezgetcontext.tokenzgetcontext.generated.models)r	   Z
CredentialZConversationMessageZMessageRoleZRating r   r   e/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/callbacks/context_callback.pyimport_context   s   
r   c                
   @   s   e Zd ZdZddedededdfd	d
Zdeeef de	e	e
  dededef
ddZdededdfddZdeeef deeef deddfddZdeeef deddfddZdddZdS )ContextCallbackHandlera	  Callback Handler that records transcripts to the Context service.

     (https://context.ai).

    Keyword Args:
        token (optional): The token with which to authenticate requests to Context.
            Visit https://with.context.ai/settings to generate a token.
            If not provided, the value of the `CONTEXT_TOKEN` environment
            variable will be used.

    Raises:
        ImportError: if the `context-python` package is not installed.

    Chat Example:
        >>> from langchain_community.llms import ChatOpenAI
        >>> from langchain_community.callbacks import ContextCallbackHandler
        >>> context_callback = ContextCallbackHandler(
        ...     token="<CONTEXT_TOKEN_HERE>",
        ... )
        >>> chat = ChatOpenAI(
        ...     temperature=0,
        ...     headers={"user_id": "123"},
        ...     callbacks=[context_callback],
        ...     openai_api_key="API_KEY_HERE",
        ... )
        >>> messages = [
        ...     SystemMessage(content="You translate English to French."),
        ...     HumanMessage(content="I love programming with LangChain."),
        ... ]
        >>> chat.invoke(messages)

    Chain Example:
        >>> from langchain.chains import LLMChain
        >>> from langchain_community.chat_models import ChatOpenAI
        >>> from langchain_community.callbacks import ContextCallbackHandler
        >>> context_callback = ContextCallbackHandler(
        ...     token="<CONTEXT_TOKEN_HERE>",
        ... )
        >>> human_message_prompt = HumanMessagePromptTemplate(
        ...     prompt=PromptTemplate(
        ...         template="What is a good name for a company that makes {product}?",
        ...         input_variables=["product"],
        ...    ),
        ... )
        >>> chat_prompt_template = ChatPromptTemplate.from_messages(
        ...   [human_message_prompt]
        ... )
        >>> callback = ContextCallbackHandler(token)
        >>> # Note: the same callback object must be shared between the
        ...   LLM and the chain.
        >>> chat = ChatOpenAI(temperature=0.9, callbacks=[callback])
        >>> chain = LLMChain(
        ...   llm=chat,
        ...   prompt=chat_prompt_template,
        ...   callbacks=[callback]
        ... )
        >>> chain.run("colorful socks")
     Ftokenverbosekwargsr
   Nc                 K   sd   t  \| _| _| _| _| _| _|ptj	dpd}| jj
| |d| _d | _d | _g | _i | _d S )NZCONTEXT_TOKENr   )
credential)r   contextr   conversation_modelmessage_modelmessage_role_modelZrating_modelosenvirongetZ
ContextAPIclientchain_run_id	llm_modelmessagesmetadata)selfr   r   r   r   r   r   __init__Y   s   
zContextCallbackHandler.__init__
serializedr    run_idc                K   s   | di  dd}|dur|| jd< t|dkrdS |d D ]/}| jj}|jdkr/| jj}n|jdkr9| jj}n	|jdkrB| jj}| j	| j
|j|d qdS )	z#Run when the chat model is started.Zinvocation_paramsmodelNr   ZhumansystemZaimessagerole)r   r!   lenr   ZSYSTEMtypeUSER	ASSISTANTr    appendr   content)r"   r$   r    r%   r   r   r)   r*   r   r   r   on_chat_model_startn   s(   	





z*ContextCallbackHandler.on_chat_model_startresponsec                 K   sd   t |jdkst |jd dkrdS | js0|jd d }| j| j|j| jjd | 	  dS dS )zRun when LLM ends.r   Nr(   )
r+   Zgenerationsr   r    r/   r   textr   r.   _log_conversation)r"   r2   r   Z
generationr   r   r   
on_llm_end   s    z!ContextCallbackHandler.on_llm_endinputsc                 K   s   | dd| _dS )zRun when chain starts.r%   N)r   r   )r"   r$   r6   r   r   r   r   on_chain_start   s   z%ContextCallbackHandler.on_chain_startoutputsc                 K   s0   | j | j|d | jjd |   d| _dS )zRun when chain ends.r3   r(   N)r    r/   r   r   r.   r4   r   )r"   r8   r   r   r   r   on_chain_end   s   
z#ContextCallbackHandler.on_chain_endc                 C   sD   t | jdkr	dS | jjjd| j| j| jdid g | _i | _dS )z(Log the conversation to the context API.r   NZconversation)r    r!   )body)r+   r    r   logZconversation_upsertr   r!   )r"   r   r   r   r4      s   	
z(ContextCallbackHandler._log_conversation)r   F)r
   N)__name__
__module____qualname____doc__strboolr   r#   r   r   r   r   r1   r   r5   r7   r9   r4   r   r   r   r   r      s4    ;


 


r   )r?   r   typingr   r   r   uuidr   Zlangchain_core.callbacksr   Zlangchain_core.messagesr   Zlangchain_core.outputsr   Zlangchain_core.utilsr	   r   r   r   r   r   r   <module>   s    