Ë
    ´ŒjO  ã                  óÊ   — d dl mZ d dlZd dl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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¬«       G d„ de«      «       Zy)é    )ÚannotationsN)ÚAnyÚOptional)Ú
deprecated)ÚCallbackManagerForChainRun)ÚBaseLanguageModel)ÚBasePromptTemplate)ÚRecursiveCharacterTextSplitterÚTextSplitter)ÚField)ÚChain)ÚLLMChain)ÚPROMPT_SELECTORz0.2.7z—example in API reference with more detail: https://api.python.langchain.com/en/latest/chains/langchain.chains.qa_generation.base.QAGenerationChain.htmlz1.0)ÚsinceÚalternativeÚremovalc                  óê   — e Zd ZU dZded<   	  e ed¬«      ¬«      Zded<   	 d	Zd
ed<   	 dZ	d
ed<   	 dZ
ded<   	 e	 d	 	 	 	 	 	 	 dd„«       Zedd„«       Zedd„«       Zedd„«       Z	 d	 	 	 	 	 dd„Zy)ÚQAGenerationChainaÉ  Base class for question-answer generation chains.

    This class is deprecated. See below for an alternative implementation.

    Advantages of this implementation include:

    - Supports async and streaming;
    - Surfaces prompt and text splitter for easier customization;
    - Use of JsonOutputParser supports JSONPatch operations in streaming mode,
      as well as robustness to markdown.

        .. code-block:: python

            from langchain.chains.qa_generation.prompt import CHAT_PROMPT as prompt
            # Note: import PROMPT if using a legacy non-chat model.
            from langchain_core.output_parsers import JsonOutputParser
            from langchain_core.runnables import (
                RunnableLambda,
                RunnableParallel,
                RunnablePassthrough,
            )
            from langchain_core.runnables.base import RunnableEach
            from langchain_openai import ChatOpenAI
            from langchain_text_splitters import RecursiveCharacterTextSplitter

            llm = ChatOpenAI()
            text_splitter = RecursiveCharacterTextSplitter(chunk_overlap=500)
            split_text = RunnableLambda(
                lambda x: text_splitter.create_documents([x])
            )

            chain = RunnableParallel(
                text=RunnablePassthrough(),
                questions=(
                    split_text | RunnableEach(bound=prompt | llm | JsonOutputParser())
                )
            )
    r   Ú	llm_chainiô  )Úchunk_overlap)Údefaultr   Útext_splitterÚtextÚstrÚ	input_keyÚ	questionsÚ
output_keyNzOptional[int]Úkc                ób   — |xs t        j                  |«      }t        ||¬«      } | dd|i|¤ŽS )zý
        Create a QAGenerationChain from a language model.

        Args:
            llm: a language model
            prompt: a prompt template
            **kwargs: additional arguments

        Returns:
            a QAGenerationChain class
        )ÚllmÚpromptr   © )r   Ú
get_promptr   )Úclsr    r!   ÚkwargsÚ_promptÚchains         úm/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain/chains/qa_generation/base.pyÚfrom_llmzQAGenerationChain.from_llmO   s8   € ð$ Ò;œO×6Ñ6°sÓ;ˆÜ˜S¨Ô1ˆÙÑ-˜UÐ- fÑ-Ð-ó    c                ó   — t         ‚©N)ÚNotImplementedError©Úselfs    r(   Ú_chain_typezQAGenerationChain._chain_typee   s   € ä!Ð!r*   c                ó   — | j                   gS r,   )r   r.   s    r(   Ú
input_keyszQAGenerationChain.input_keysi   s   € à—‘ÐÐr*   c                ó   — | j                   gS r,   )r   r.   s    r(   Úoutput_keyszQAGenerationChain.output_keysm   s   € à—‘Ð Ð r*   c                ód  — | j                   j                  || j                     g«      }| j                  j	                  |D �cg c]  }d|j
                  i‘Œ c}|¬«      }|j                  D �cg c]$  }t        j                  |d   j                  «      ‘Œ& }}| j                  |iS c c}w c c}w )Nr   )Úrun_managerr   )r   Úcreate_documentsr   r   ÚgenerateÚpage_contentÚgenerationsÚjsonÚloadsr   r   )r/   Úinputsr6   ÚdocsÚdÚresultsÚresÚqas           r(   Ú_callzQAGenerationChain._callq   s¦   € ð
 ×!Ñ!×2Ñ2°F¸4¿>¹>Ñ4JÐ3KÓLˆØ—.‘.×)Ñ)Ù/3Ó4©t¨!ˆf�a—n‘nÒ%¨tÑ4Ø#ð *ó 
ˆð 29×1DÒ1DÓEÑ1D¨#Œd�j‰j˜˜Q™Ÿ™Õ%Ð1DˆÐEØ—‘ Ð$Ð$ùò	 5ùò Fs   ÁB(Á/)B-r,   )r    r   r!   zOptional[BasePromptTemplate]r%   r   Úreturnr   )rD   r   )rD   z	list[str])r=   zdict[str, Any]r6   z$Optional[CallbackManagerForChainRun]rD   zdict[str, list])Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r
   r   r   r   r   Úclassmethodr)   Úpropertyr0   r2   r4   rC   r"   r*   r(   r   r      sø   … ñ%ðN ÓØIÙ"'Ù.¸SÔAô#€M�<ó ð ;Ø€IˆsÓØ(Ø!€J�Ó!Ø)Ø€A€}ÓØ*àð 04ð.àð.ð -ð.ð ð	.ð
 
ò.ó ð.ð* ò"ó ð"ð ò ó ð ð ò!ó ð!ð =Að%àð%ð :ð%ð 
ô	%r*   r   )Ú
__future__r   r;   Útypingr   r   Úlangchain_core._apir   Úlangchain_core.callbacksr   Úlangchain_core.language_modelsr   Úlangchain_core.promptsr	   Úlangchain_text_splittersr
   r   Úpydanticr   Úlangchain.chains.baser   Úlangchain.chains.llmr   Ú%langchain.chains.qa_generation.promptr   r   r"   r*   r(   Ú<module>rW      sZ   ðÝ "ã ß  å *Ý ?Ý <Ý 5ß QÝ å 'Ý )Ý Añ Ø
ð	wð ôôb%˜ó b%óñb%r*   