o
    `+ i                     @   s  d dl 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 d
edefddZdZeddddd			d dededee deee  dedefddZeddddd		d!dededee dedef
ddZdS )"    )Any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   x/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/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.0a)  
            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verbosec           	      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&   r   r   r   create_extraction_chain/   s   7
r,   pydantic_schemac           
         s~   G  fdddt }t dr  }n  }t||di }t|}|p+t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__list__annotations__r   r-   r   r   PydanticSchema   s   
 r4   model_json_schemaZdefinitionsr   )r-   	attr_name)r"   r#   r&   r'   r%   )r
   hasattrr5   r!   r   getr   r	   r(   r)   r   r   r   )
r-   r"   r#   r%   r4   Zopenai_schemar*   r+   r'   r&   r   r3   r    create_extraction_chain_pydantict   s,   7


r9   )NNF)NF)typingr   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)   r1   strboolr,   r9   r   r   r   r   <module>   sh    &
"&