
    ih`                         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
Z G d de	      Zy)zCallback handler for Context AI    N)AnyDictList)UUID)BaseCallbackHandler)BaseMessage)	LLMResult)guard_importreturnc            	          t        dd      t        dd      j                  t        dd      j                  t        dd      j                  t        dd      j                  t        dd      j
                  fS )z Import the `getcontext` package.
getcontextzpython-context)pip_namezgetcontext.tokenzgetcontext.generated.models)r
   
CredentialConversationMessageMessageRoleRating     l/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain_community/callbacks/context_callback.pyimport_contextr      su     	\,<='2BCNN)4D	

,2=MNVV)4D	

+2=MNUU r   c            
           e Zd ZdZddedededdfdZdeeef   d	e	e	e
      d
edede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dZy)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")
    tokenverbosekwargsr   Nc                 H   t               \  | _        | _        | _        | _        | _        | _        |xs# t        j                  j                  d      xs d}| j                  j                  | j                  |            | _        d | _        d | _        g | _        i | _        y )NCONTEXT_TOKEN )
credential)r   contextr    conversation_modelmessage_modelmessage_role_modelrating_modelosenvironget
ContextAPIclientchain_run_id	llm_modelmessagesmetadata)selfr   r   r   s       r   __init__zContextCallbackHandler.__init__Y   s     	
LO## >8>Bll--9O-P #%(*r   
serializedr-   run_idc                   |j                  di       j                  dd      }||| j                  d<   t        |      dk(  ry|d   D ]  }| j                  j                  }|j
                  dk(  r| j                  j                  }nK|j
                  dk(  r| j                  j                  }n%|j
                  dk(  r| j                  j                  }| j                  j                  | j                  |j                  |              y)	z#Run when the chat model is started.invocation_paramsmodelNr   humansystemaimessagerole)r(   r.   lenr$   SYSTEMtypeUSER	ASSISTANTr-   appendr#   content)r/   r1   r-   r2   r   r,   r:   r;   s           r   on_chat_model_startz*ContextCallbackHandler.on_chat_model_startn   s     JJ2B7;;GTJ	 %.DMM'"x=A{ 	G**11D||w&..33)..55%..88MM  ""#OO # 	r   responsec                 ^   t        |j                        dk(  st        |j                  d         dk(  ry| j                  sm|j                  d   d   }| j                  j	                  | j                  |j                  | j                  j                               | j                          yy)zRun when LLM ends.r   Nr9   )
r<   generationsr+   r-   rA   r#   textr$   r@   _log_conversation)r/   rD   r   
generations       r   
on_llm_endz!ContextCallbackHandler.on_llm_end   s    x##$)S1E1Ea1H-IQ-N  !--a03JMM  ""&OO00:: #  ""$ !r   inputsc                 2    |j                  dd      | _        y)zRun when chain starts.r2   N)r(   r+   )r/   r1   rK   r   s       r   on_chain_startz%ContextCallbackHandler.on_chain_start   s     #JJx6r   outputsc                     | j                   j                  | j                  |d   | j                  j                               | j                          d| _        y)zRun when chain ends.rG   r9   N)r-   rA   r#   r$   r@   rH   r+   )r/   rN   r   s      r   on_chain_endz#ContextCallbackHandler.on_chain_end   sS    ,,66  	
 	  r   c                     t        | j                        dk(  ry| j                  j                  j	                  d| j                  | j                  | j                        i       g | _        i | _        y)z(Log the conversation to the context API.r   Nconversation)r-   r.   )body)r<   r-   r*   logconversation_upsertr"   r.   )r/   s    r   rH   z(ContextCallbackHandler._log_conversation   si    t}}"++ 7 7!]]!]] !8 ! 	, 	
 r   )r   F)r   N)__name__
__module____qualname____doc__strboolr   r0   r   r   r   r   rC   r	   rJ   rM   rP   rH   r   r   r   r   r      s    9v+c + + +QU +*cN tK()
   
@%9 % % % 7sCx.726sCx.7LO7	7!DcN !c !d !r   r   )rY   r&   typingr   r   r   uuidr   langchain_core.callbacksr   langchain_core.messagesr   langchain_core.outputsr	   langchain_core.utilsr
   r   r   r   r   r   <module>rb      s;    % 	 " "  8 / , -  c0 cr   