a
    bg`                     @   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 ed	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   |/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/callbacks/context_callback.pyimport_context   s    
r   c                   @   s   e Zd ZdZdeeeddddZeeef e	e	e
  eeedd	d
ZeeddddZeeef eeef eddddZeeef eddddZd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")
     FN)tokenverbosekwargsr   c                 K   sd   t  \| _| _| _| _| _| _|p0tj	dp0d}| 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_idr   r   c                K   s   | di  dd}|dur&|| jd< t|dkr6dS |d D ]^}| jj}|jdkr^| jj}n&|jdkrr| jj}n|jdkr| 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)responser   r   c                 K   s`   t |jdks t |jd dkr$dS | js\|jd d }| j| j|j| jjd | 	  dS )zRun when LLM ends.r   Nr)   )
r,   Zgenerationsr   r!   r0   r   textr   r/   _log_conversation)r#   r3   r   Z
generationr   r   r   
on_llm_end   s     z!ContextCallbackHandler.on_llm_end)r%   inputsr   r   c                 K   s   | dd| _dS )zRun when chain starts.r&   N)r   r   )r#   r%   r7   r   r   r   r   on_chain_start   s    z%ContextCallbackHandler.on_chain_start)outputsr   r   c                 K   s0   | j | j|d | jjd |   d| _dS )zRun when chain ends.r4   r)   N)r!   r0   r   r   r/   r5   r   )r#   r9   r   r   r   r   on_chain_end   s    z#ContextCallbackHandler.on_chain_endr
   c                 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   r5      s    	z(ContextCallbackHandler._log_conversation)r   F)__name__
__module____qualname____doc__strboolr   r$   r   r   r   r   r2   r   r6   r8   r:   r5   r   r   r   r   r      s   ;

 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   