o
    ȳg                     @   sh   d dl Z d dlZd dl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 G dd de	ZdS )    N)AnyDictListOptionalUnion)BaseCallbackHandler)AgentActionAgentFinish)	LLMResultc                       s  e Zd ZU dZdZeed< e dZeed< dZeed< 	d7d	e	e
 d
ee ddf fddZdeee
f de	e de
ddfddZdede
ddfddZdede
dd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ede
ddfd"d#Zdeee
f d$ede
ddfd%d&Zd'ede
de
fd(d)Z		d8d*e
d+ee d,ee de
ddf
d-d.Zdede
ddfd/d0Zd1ede
ddfd2d3Zd4ede
ddfd5d6Z  ZS )9DeepEvalCallbackHandlera   Callback Handler that logs into deepeval.

    Args:
        implementation_name: name of the `implementation` in deepeval
        metrics: A list of metrics

    Raises:
        ImportError: if the `deepeval` package is not installed.

    Examples:
        >>> from langchain_community.llms import OpenAI
        >>> from langchain_community.callbacks import DeepEvalCallbackHandler
        >>> from deepeval.metrics import AnswerRelevancy
        >>> metric = AnswerRelevancy(minimum_score=0.3)
        >>> deepeval_callback = DeepEvalCallbackHandler(
        ...     implementation_name="exampleImplementation",
        ...     metrics=[metric],
        ... )
        >>> llm = OpenAI(
        ...     temperature=0,
        ...     callbacks=[deepeval_callback],
        ...     verbose=True,
        ...     openai_api_key="API_KEY_HERE",
        ... )
        >>> llm.generate([
        ...     "What is the best evaluation tool out there? (no bias at all)",
        ... ])
        "Deepeval, no doubt about it."
    z(https://github.com/confident-ai/deepevalREPO_URLz/issues
ISSUES_URLzhttps://docs.confident-ai.comBLOG_URLNmetricsimplementation_namereturnc                    sh   t    zddl}W n ty   tdw tjdr"td || _	|| _
td| j d dS )aX  Initializes the `deepevalCallbackHandler`.

        Args:
            implementation_name: Name of the implementation you want.
            metrics: What metrics do you want to track?

        Raises:
            ImportError: if the `deepeval` package is not installed.
            ConnectionError: if the connection to deepeval fails.
        r   NzTo use the deepeval callback manager you need to have the 
                `deepeval` Python package installed. Please install it with 
                `pip install deepeval`z	.deepevalznYou are currently not logging anything to the dashboard, we 
                recommend using `deepeval login`.zThe `DeepEvalCallbackHandler` is currently in beta and is subject to change based on updates to `langchain`. Please report any issues to z as an `integration` issue.)super__init__deepevalImportErrorospathexistswarningswarnr   r   r   )selfr   r   r   	__class__ l/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/langchain_community/callbacks/confident_callback.pyr   .   s&   
z DeepEvalCallbackHandler.__init__
serializedpromptskwargsc                 K   s
   || _ dS )zStore the promptsN)r!   )r   r    r!   r"   r   r   r   on_llm_start\   s   
z$DeepEvalCallbackHandler.on_llm_starttokenc                 K      dS )z)Do nothing when a new token is generated.Nr   )r   r$   r"   r   r   r   on_llm_new_tokenb      z(DeepEvalCallbackHandler.on_llm_new_tokenresponsec                 K   s   ddl m} ddlm} ddlm} ddlm} | jD ]V}t	|j
D ]N\}}	|	d j}
| j| }t||rD|j|
|d}td|  q"t||rV||
}td|  q"t||rh||
}td	|  q"td
|j dqdS )z)Log records to deepeval when an LLM ends.r   )AnswerRelevancy)UnBiasedMetric)Metric)NonToxicMetric)outputqueryzAnswer Relevancy: zBias Score: zToxic Score: zMetric zA is not supported by deepeval 
                        callbacks.N)!deepeval.metrics.answer_relevancyr)    deepeval.metrics.bias_classifierr*   deepeval.metrics.metricr+   !deepeval.metrics.toxic_classifierr,   r   	enumerategenerationstextr!   
isinstancemeasureprint
ValueError__name__)r   r(   r"   r)   r*   r+   r,   metrici
generationr-   r.   resultscorer   r   r   
on_llm_endf   s2   







z"DeepEvalCallbackHandler.on_llm_enderrorc                 K   r%   )z%Do nothing when LLM outputs an error.Nr   r   rA   r"   r   r   r   on_llm_error   r'   z$DeepEvalCallbackHandler.on_llm_errorinputsc                 K   r%   )zDo nothing when chain startsNr   )r   r    rD   r"   r   r   r   on_chain_start   s   z&DeepEvalCallbackHandler.on_chain_startoutputsc                 K   r%   )zDo nothing when chain ends.Nr   )r   rF   r"   r   r   r   on_chain_end   r'   z$DeepEvalCallbackHandler.on_chain_endc                 K   r%   )z+Do nothing when LLM chain outputs an error.Nr   rB   r   r   r   on_chain_error   r'   z&DeepEvalCallbackHandler.on_chain_error	input_strc                 K   r%   )zDo nothing when tool starts.Nr   )r   r    rI   r"   r   r   r   on_tool_start   s   z%DeepEvalCallbackHandler.on_tool_startactionc                 K   r%   )z.Do nothing when agent takes a specific action.Nr   )r   rK   r"   r   r   r   on_agent_action   r'   z'DeepEvalCallbackHandler.on_agent_actionr-   observation_prefix
llm_prefixc                 K   r%   )zDo nothing when tool ends.Nr   )r   r-   rM   rN   r"   r   r   r   on_tool_end   s   z#DeepEvalCallbackHandler.on_tool_endc                 K   r%   )z&Do nothing when tool outputs an error.Nr   rB   r   r   r   on_tool_error   r'   z%DeepEvalCallbackHandler.on_tool_errorr5   c                 K   r%   z
Do nothingNr   )r   r5   r"   r   r   r   on_text   r'   zDeepEvalCallbackHandler.on_textfinishc                 K   r%   rQ   r   )r   rS   r"   r   r   r   on_agent_finish   r'   z'DeepEvalCallbackHandler.on_agent_finish)N)NN) r:   
__module____qualname____doc__r   str__annotations__r   r   r   r   r   r   r   r#   r&   r
   r@   BaseExceptionrC   rE   rG   rH   rJ   r   rL   rO   rP   rR   r	   rT   __classcell__r   r   r   r   r      s|   
 .






	

r   )r   r   typingr   r   r   r   r   langchain_core.callbacksr   langchain_core.agentsr   r	   langchain_core.outputsr
   r   r   r   r   r   <module>   s   