From 12eff6a1308a4b5ffb41d93a4948bd450d5dbd04 Mon Sep 17 00:00:00 2001 From: Jacob Lee Date: Thu, 13 Jun 2024 02:56:10 -0700 Subject: [PATCH] docs[patch]: Readd Pydantic compatibility docs (#22836) As a how-to guide. CC @eyurtsev @hwchase17 --- docs/docs/how_to/index.mdx | 1 + docs/docs/how_to/pydantic_compatibility.md | 105 +++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 docs/docs/how_to/pydantic_compatibility.md diff --git a/docs/docs/how_to/index.mdx b/docs/docs/how_to/index.mdx index 692a7845d2..db4989a09c 100644 --- a/docs/docs/how_to/index.mdx +++ b/docs/docs/how_to/index.mdx @@ -14,6 +14,7 @@ For comprehensive descriptions of every class and function see the [API Referenc ## Installation - [How to: install LangChain packages](/docs/how_to/installation/) +- [How to: use LangChain with different Pydantic versions](/docs/how_to/pydantic_compatibility) ## Key features diff --git a/docs/docs/how_to/pydantic_compatibility.md b/docs/docs/how_to/pydantic_compatibility.md new file mode 100644 index 0000000000..7a3f3fe220 --- /dev/null +++ b/docs/docs/how_to/pydantic_compatibility.md @@ -0,0 +1,105 @@ +# How to use LangChain with different Pydantic versions + +- Pydantic v2 was released in June, 2023 (https://docs.pydantic.dev/2.0/blog/pydantic-v2-final/) +- v2 contains has a number of breaking changes (https://docs.pydantic.dev/2.0/migration/) +- Pydantic v2 and v1 are under the same package name, so both versions cannot be installed at the same time + +## LangChain Pydantic migration plan + +As of `langchain>=0.0.267`, LangChain will allow users to install either Pydantic V1 or V2. + * Internally LangChain will continue to [use V1](https://docs.pydantic.dev/latest/migration/#continue-using-pydantic-v1-features). + * During this time, users can pin their pydantic version to v1 to avoid breaking changes, or start a partial + migration using pydantic v2 throughout their code, but avoiding mixing v1 and v2 code for LangChain (see below). + +User can either pin to pydantic v1, and upgrade their code in one go once LangChain has migrated to v2 internally, or they can start a partial migration to v2, but must avoid mixing v1 and v2 code for LangChain. + +Below are two examples of showing how to avoid mixing pydantic v1 and v2 code in +the case of inheritance and in the case of passing objects to LangChain. + +**Example 1: Extending via inheritance** + +**YES** + +```python +from pydantic.v1 import root_validator, validator + +class CustomTool(BaseTool): # BaseTool is v1 code + x: int = Field(default=1) + + def _run(*args, **kwargs): + return "hello" + + @validator('x') # v1 code + @classmethod + def validate_x(cls, x: int) -> int: + return 1 + + +CustomTool( + name='custom_tool', + description="hello", + x=1, +) +``` + +Mixing Pydantic v2 primitives with Pydantic v1 primitives can raise cryptic errors + +**NO** + +```python +from pydantic import Field, field_validator # pydantic v2 + +class CustomTool(BaseTool): # BaseTool is v1 code + x: int = Field(default=1) + + def _run(*args, **kwargs): + return "hello" + + @field_validator('x') # v2 code + @classmethod + def validate_x(cls, x: int) -> int: + return 1 + + +CustomTool( + name='custom_tool', + description="hello", + x=1, +) +``` + +**Example 2: Passing objects to LangChain** + +**YES** + +```python +from langchain_core.tools import Tool +from pydantic.v1 import BaseModel, Field # <-- Uses v1 namespace + +class CalculatorInput(BaseModel): + question: str = Field() + +Tool.from_function( # <-- tool uses v1 namespace + func=lambda question: 'hello', + name="Calculator", + description="useful for when you need to answer questions about math", + args_schema=CalculatorInput +) +``` + +**NO** + +```python +from langchain_core.tools import Tool +from pydantic import BaseModel, Field # <-- Uses v2 namespace + +class CalculatorInput(BaseModel): + question: str = Field() + +Tool.from_function( # <-- tool uses v1 namespace + func=lambda question: 'hello', + name="Calculator", + description="useful for when you need to answer questions about math", + args_schema=CalculatorInput +) +``` \ No newline at end of file