a
    ag                  	   @   s   d dl mZmZmZ d dlmZ d dlmZ d dlm	Z	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mZmZ eed
ddZdZeddddddeeee eee  eedddZeddddddeeee eedddZdS )    )AnyListOptional)
deprecated)BaseLanguageModel)JsonKeyOutputFunctionsParser!PydanticAttrOutputFunctionsParser)BasePromptTemplateChatPromptTemplate)	BaseModel)Chain)LLMChain)_convert_schema_resolve_schema_referencesget_llm_kwargs)entity_schemareturnc                 C   s$   dddddt | didgddS )	NZinformation_extractionz3Extracts the relevant information from the passage.objectinfoarray)typeitems)r   
propertiesrequired)namedescription
parameters)r   )r    r   z/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain/chains/openai_functions/extraction.py_get_extraction_function   s    r   a<  Extract and save the relevant entities mentioned in the following passage together with their properties.

Only extract the properties mentioned in the 'information_extraction' function.

If a property is not present and is not required in the function parameters, do not include it in the output.

Passage:
{input}
z0.1.14a  LangChain has introduced a method called `with_structured_output` thatis available on ChatModels capable of tool calling.You can read more about the method here: <https://python.langchain.com/docs/modules/model_io/chat/structured_output/>. Please follow our extraction use case documentation for more guidelineson how to do information extraction with LLMs.<https://python.langchain.com/docs/use_cases/extraction/>. If you notice other issues, please provide feedback here:<https://github.com/langchain-ai/langchain/discussions/18154>z1.0a4  
            from pydantic import BaseModel, Field
            from langchain_anthropic import ChatAnthropic
    
            class Joke(BaseModel):
                setup: str = Field(description="The setup of the joke")
                punchline: str = Field(description="The punchline to the joke") 
    
            # Or any other chat model that supports tools.
            # Please reference to to the documentation of structured_output
            # to see an up to date list of which models support 
            # with_structured_output.
            model = ChatAnthropic(model="claude-3-opus-20240229", temperature=0)
            structured_llm = model.with_structured_output(Joke)
            structured_llm.invoke("Tell me a joke about cats. 
                Make sure to call the Joke function.")
            )ZsincemessageZremovalalternativeNF)schemallmprompttagsverboser   c           
      C   s@   t | }|ptt}tdd}t|}t||||||d}	|	S )a  Creates a chain that extracts information from a passage.

    Args:
        schema: The schema of the entities to extract.
        llm: The language model to use.
        prompt: The prompt to use for extraction.
        verbose: Whether to run in verbose mode. In verbose mode, some intermediate
            logs will be printed to the console. Defaults to the global `verbose` value,
            accessible via `langchain.globals.get_verbose()`.

    Returns:
        Chain that can be used to extract information from a passage.
    r   )Zkey_name)r#   r$   
llm_kwargsoutput_parserr%   r&   )r   r
   from_template_EXTRACTION_TEMPLATEr   r   r   )
r"   r#   r$   r%   r&   functionextraction_promptr(   r'   chainr   r   r   create_extraction_chain/   s    7
r.   )pydantic_schemar#   r$   r&   r   c                    s   G  fdddt }t dr(  }n  }t||di }t|}|pVtt	}t
|dd}t|}	t|||	||d}
|
S )a@  Creates a chain that extracts information from a passage using pydantic schema.

    Args:
        pydantic_schema: The pydantic schema of the entities to extract.
        llm: The language model to use.
        prompt: The prompt to use for extraction.
        verbose: Whether to run in verbose mode. In verbose mode, some intermediate
            logs will be printed to the console. Defaults to the global `verbose` value,
            accessible via `langchain.globals.get_verbose()`

    Returns:
        Chain that can be used to extract information from a passage.
    c                       s   e Zd ZU e  ed< dS )z8create_extraction_chain_pydantic.<locals>.PydanticSchemar   N)__name__
__module____qualname__r   __annotations__r   r/   r   r   PydanticSchema   s   
r5   model_json_schemaZdefinitionsr   )r/   	attr_name)r#   r$   r'   r(   r&   )r   hasattrr6   r"   r   getr   r
   r)   r*   r   r   r   )r/   r#   r$   r&   r5   Zopenai_schemar+   r,   r(   r'   r-   r   r4   r    create_extraction_chain_pydanticu   s*    7

r:   )NNF)NF)typingr   r   r   Zlangchain_core._apir   Zlangchain_core.language_modelsr   Z.langchain_core.output_parsers.openai_functionsr   r   Zlangchain_core.promptsr	   r
   Zpydanticr   Zlangchain.chains.baser   Zlangchain.chains.llmr   Z'langchain.chains.openai_functions.utilsr   r   r   dictr   r*   strboolr.   r:   r   r   r   r   <module>   sT   &   
#&  