I am encountering an error when trying to import OpenAIEmbeddings from langchain_openai. Here is the exact import statement I am using:
from langchain_openai import OpenAIEmbeddings
When I run this code, I get the following error:
PydanticUserError: The `__modify_schema__` method is not supported in Pydantic v2. Use `__get_pydantic_json_schema__` instead in class `SecretStr`.
Here is the full stack trace of the error:
---------------------------------------------------------------------------
PydanticUserError Traceback (most recent call last)
Cell In[1], line 1
----> 1 from langchain_openai import OpenAIEmbeddings
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\langchain_openai\__init__.py:1
----> 1 from langchain_openai.chat_models import (
2 AzureChatOpenAI,
3 ChatOpenAI,
4 )
5 from langchain_openai.embeddings import (
6 AzureOpenAIEmbeddings,
7 OpenAIEmbeddings,
8 )
9 from langchain_openai.llms import AzureOpenAI, OpenAI
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\langchain_openai\chat_models\__init__.py:1
----> 1 from langchain_openai.chat_models.azure import AzureChatOpenAI
2 from langchain_openai.chat_models.base import ChatOpenAI
4 __all__ = [
5 "ChatOpenAI",
6 "AzureChatOpenAI",
7 ]
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\langchain_openai\chat_models\azure.py:14
11 from langchain_core.pydantic_v1 import Field, SecretStr, root_validator
12 from langchain_core.utils import convert_to_secret_str, get_from_dict_or_env
---> 14 from langchain_openai.chat_models.base import BaseChatOpenAI
16 logger = logging.getLogger(__name__)
19 class AzureChatOpenAI(BaseChatOpenAI):
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\langchain_openai\chat_models\base.py:296
292 parsed: Optional[_DictOrPydantic]
293 parsing_error: Optional[BaseException]
--> 296 class BaseChatOpenAI(BaseChatModel):
297 client: Any = Field(default=None, exclude=True) #: :meta private:
298 async_client: Any = Field(default=None, exclude=True) #: :meta private:
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_model_construction.py:224, in ModelMetaclass.__new__(mcs, cls_name, bases, namespace, __pydantic_generic_metadata__, __pydantic_reset_parent_namespace__, _create_model_module, **kwargs)
221 if config_wrapper.frozen and '__hash__' not in namespace:
222 set_default_hash_func(cls, bases)
--> 224 complete_model_class(
225 cls,
226 cls_name,
227 config_wrapper,
228 raise_errors=False,
229 types_namespace=types_namespace,
230 create_model_module=_create_model_module,
231 )
233 # If this is placed before the complete_model_class call above,
234 # the generic computed fields return type is set to PydanticUndefined
235 cls.model_computed_fields = {k: v.info for k, v in cls.__pydantic_decorators__.computed_fields.items()}
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_model_construction.py:577, in complete_model_class(cls, cls_name, config_wrapper, raise_errors, types_namespace, create_model_module)
574 return False
576 try:
--> 577 schema = cls.__get_pydantic_core_schema__(cls, handler)
578 except PydanticUndefinedAnnotation as e:
579 if raise_errors:
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\main.py:671, in BaseModel.__get_pydantic_core_schema__(cls, source, handler)
668 if not cls.__pydantic_generic_metadata__['origin']:
669 return cls.__pydantic_core_schema__
--> 671 return handler(source)
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_schema_generation_shared.py:83, in CallbackGetCoreSchemaHandler.__call__(self, source_type)
82 def __call__(self, source_type: Any, /) -> core_schema.CoreSchema:
---> 83 schema = self._handler(source_type)
84 ref = schema.get('ref')
85 if self._ref_mode == 'to-def':
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:655, in GenerateSchema.generate_schema(self, obj, from_dunder_get_core_schema)
652 schema = from_property
654 if schema is None:
--> 655 schema = self._generate_schema_inner(obj)
657 metadata_js_function = _extract_get_pydantic_json_schema(obj, schema)
658 if metadata_js_function is not None:
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:924, in GenerateSchema._generate_schema_inner(self, obj)
922 if lenient_issubclass(obj, BaseModel):
923 with self.model_type_stack.push(obj):
--> 924 return self._model_schema(obj)
926 if isinstance(obj, PydanticRecursiveRef):
927 return core_schema.definition_reference_schema(schema_ref=obj.type_ref)
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:739, in GenerateSchema._model_schema(self, cls)
727 model_schema = core_schema.model_schema(
728 cls,
729 inner_schema,
(...)
735 metadata=metadata,
736 )
737 else:
738 fields_schema: core_schema.CoreSchema = core_schema.model_fields_schema(
--> 739 {k: self._generate_md_field_schema(k, v, decorators) for k, v in fields.items()},
740 computed_fields=[
741 self._computed_field_schema(d, decorators.field_serializers)
742 for d in computed_fields.values()
743 ],
744 extras_schema=extras_schema,
745 model_name=cls.__name__,
746 )
747 inner_schema = apply_validators(fields_schema, decorators.root_validators.values(), None)
748 new_inner_schema = define_expected_missing_refs(inner_schema, recursively_defined_type_refs())
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:739, in <dictcomp>(.0)
727 model_schema = core_schema.model_schema(
728 cls,
729 inner_schema,
(...)
735 metadata=metadata,
736 )
737 else:
738 fields_schema: core_schema.CoreSchema = core_schema.model_fields_schema(
--> 739 {k: self._generate_md_field_schema(k, v, decorators) for k, v in fields.items()},
740 computed_fields=[
741 self._computed_field_schema(d, decorators.field_serializers)
742 for d in computed_fields.values()
743 ],
744 extras_schema=extras_schema,
745 model_name=cls.__name__,
746 )
747 inner_schema = apply_validators(fields_schema, decorators.root_validators.values(), None)
748 new_inner_schema = define_expected_missing_refs(inner_schema, recursively_defined_type_refs())
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:1115, in GenerateSchema._generate_md_field_schema(self, name, field_info, decorators)
1108 def _generate_md_field_schema(
1109 self,
1110 name: str,
1111 field_info: FieldInfo,
1112 decorators: DecoratorInfos,
1113 ) -> core_schema.ModelField:
1114 """Prepare a ModelField to represent a model field."""
-> 1115 common_field = self._common_field_schema(name, field_info, decorators)
1116 return core_schema.model_field(
1117 common_field['schema'],
1118 serialization_exclude=common_field['serialization_exclude'],
(...)
1122 metadata=common_field['metadata'],
1123 )
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:1308, in GenerateSchema._common_field_schema(self, name, field_info, decorators)
1304 schema = self._apply_annotations(
1305 source_type, annotations + validators_from_decorators, transform_inner_schema=set_discriminator
1306 )
1307 else:
-> 1308 schema = self._apply_annotations(
1309 source_type,
1310 annotations + validators_from_decorators,
1311 )
1313 # This V1 compatibility shim should eventually be removed
1314 # push down any `each_item=True` validators
1315 # note that this won't work for any Annotated types that get wrapped by a function validator
1316 # but that's okay because that didn't exist in V1
1317 this_field_validators = filter_field_decorator_info_by_field(decorators.validators.values(), name)
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:2107, in GenerateSchema._apply_annotations(self, source_type, annotations, transform_inner_schema)
2102 continue
2103 get_inner_schema = self._get_wrapped_inner_schema(
2104 get_inner_schema, annotation, pydantic_js_annotation_functions
2105 )
-> 2107 schema = get_inner_schema(source_type)
2108 if pydantic_js_annotation_functions:
2109 metadata = CoreMetadataHandler(schema).metadata
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_schema_generation_shared.py:83, in CallbackGetCoreSchemaHandler.__call__(self, source_type)
82 def __call__(self, source_type: Any, /) -> core_schema.CoreSchema:
---> 83 schema = self._handler(source_type)
84 ref = schema.get('ref')
85 if self._ref_mode == 'to-def':
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:2088, in GenerateSchema._apply_annotations.<locals>.inner_handler(obj)
2086 from_property = self._generate_schema_from_property(obj, source_type)
2087 if from_property is None:
-> 2088 schema = self._generate_schema_inner(obj)
2089 else:
2090 schema = from_property
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:929, in GenerateSchema._generate_schema_inner(self, obj)
926 if isinstance(obj, PydanticRecursiveRef):
927 return core_schema.definition_reference_schema(schema_ref=obj.type_ref)
--> 929 return self.match_type(obj)
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:1029, in GenerateSchema.match_type(self, obj)
1027 origin = get_origin(obj)
1028 if origin is not None:
-> 1029 return self._match_generic_type(obj, origin)
1031 res = self._get_prepare_pydantic_annotations_for_known_type(obj, ())
1032 if res is not None:
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:1058, in GenerateSchema._match_generic_type(self, obj, origin)
1055 return from_property
1057 if _typing_extra.origin_is_union(origin):
-> 1058 return self._union_schema(obj)
1059 elif origin in TUPLE_TYPES:
1060 return self._tuple_schema(obj)
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:1378, in GenerateSchema._union_schema(self, union_type)
1376 nullable = True
1377 else:
-> 1378 choices.append(self.generate_schema(arg))
1380 if len(choices) == 1:
1381 s = choices[0]
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:657, in GenerateSchema.generate_schema(self, obj, from_dunder_get_core_schema)
654 if schema is None:
655 schema = self._generate_schema_inner(obj)
--> 657 metadata_js_function = _extract_get_pydantic_json_schema(obj, schema)
658 if metadata_js_function is not None:
659 metadata_schema = resolve_original_schema(schema, self.defs.definitions)
File d:\Work_Local\Tailored_Alloys\DRIVE_YT\advance-manufacturing\.venv\Lib\site-packages\pydantic\_internal\_generate_schema.py:2447, in _extract_get_pydantic_json_schema(tp, schema)
2445 if not has_custom_v2_modify_js_func:
2446 cls_name = getattr(tp, '__name__', None)
-> 2447 raise PydanticUserError(
2448 f'The `__modify_schema__` method is not supported in Pydantic v2. '
2449 f'Use `__get_pydantic_json_schema__` instead{f" in class `{cls_name}`" if cls_name else ""}.',
2450 code='custom-json-schema',
2451 )
2453 # handle GenericAlias' but ignore Annotated which "lies" about its origin (in this case it would be `int`)
2454 if hasattr(tp, '__origin__') and not is_annotated(tp):
PydanticUserError: The `__modify_schema__` method is not supported in Pydantic v2. Use `__get_pydantic_json_schema__` instead in class `SecretStr`.
For further information visit https://errors.pydantic.dev/2.9/u/custom-json-schema
My Environment
- Operating System: Windows 11
- Python version: 3.12.2
Dependencies
Here are the versions of the relevant packages installed in my environment:
langchain 0.2.5
langchain-anthropic 0.3.0
langchain-community 0.2.50
langchain-core 0.3.26
langchain-openai 0.2.12
langchain-text-splitters 0.2.1
langdetect 1.0.9
langgraph 0.2.53
langgraph-checkpoint 2.0.8
langgraph-sdk 0.1.40
langsmith 0.1.147
pydantic 2.9.2
pydantic_core 2.23.4
What I Have Tried
Version Changes: I attempted to downgrade
pydanticto the following versions:- 1.10.17
- 2.0
- 2.9.2 (current version)
None of these attempts resolved the issue.
Dependency Conflicts: I checked for potential version mismatches between
pydanticandlangchainpackages but could not identify any clear issues.Research: I have read the Pydantic documentation on schema methods and noted that
__modify_schema__is no longer supported in Pydantic v2. The suggested approach is to use__get_pydantic_json_schema__, but I am unsure how to update this in the context oflangchain_openai.
Questions
- Is this a known compatibility issue between
langchain_openaiandpydantic v2.x? - Should I downgrade Pydantic further or change the version of
langchain_openai? - Are there any specific patches or workarounds I should apply to make this work?
If you need any additional information, such as my Python version, OS, or full traceback, I’d be happy to provide it. Thank you for your help!