[X] I added a very descriptive title to this issue.
[X] I searched the LangChain documentation with the integrated search.
[X] I used the GitHub search to find a similar question and didn't find it.
[X] I am sure that this is a bug in LangChain rather than my code.
[X] The bug is not resolved by updating to the latest stable version of LangChain (or the specific integration package).
Example Code
def handler_func(schema_or_field: CoreSchemaOrField) -> JsonSchemaValue:
"""Generate a JSON schema based on the input schema.
Args:
schema_or_field: The core schema to generate a JSON schema from.
Returns:
The generated JSON schema.
Raises:
TypeError: If an unexpected schema type is encountered.
"""
# Generate the core-schema-type-specific bits of the schema generation:
json_schema: JsonSchemaValue | None = None
if self.mode == 'serialization' and 'serialization' in schema_or_field:
# In this case, we skip the JSON Schema generation of the schema
# and use the `'serialization'` schema instead (canonical example:
# `Annotated[int, PlainSerializer(str)]`).
ser_schema = schema_or_field['serialization'] # type: ignore
json_schema = self.ser_schema(ser_schema)
# It might be that the 'serialization'` is skipped depending on `when_used`.
# This is only relevant for `nullable` schemas though, so we special case here.
if (
json_schema is not None
and ser_schema.get('when_used') in ('unless-none', 'json-unless-none')
and schema_or_field['type'] == 'nullable'
):
json_schema = self.get_flattened_anyof([{'type': 'null'}, json_schema])
if json_schema is None:
if _core_utils.is_core_schema(schema_or_field) or _core_utils.is_core_schema_field(schema_or_field):
generate_for_schema_type = self._schema_type_to_method[schema_or_field['type']]
json_schema = generate_for_schema_type(schema_or_field)
else:
raise TypeError(f'Unexpected schema type: schema={schema_or_field}')
if _core_utils.is_core_schema(schema_or_field):
json_schema = populate_defs(schema_or_field, json_schema)
return json_schema
current_handler = _schema_generation_shared.GenerateJsonSchemaHandler(self, handler_func)
for js_modify_function in metadata_handler.metadata.get('pydantic_js_functions', ()):
def new_handler_func(
schema_or_field: CoreSchemaOrField,
current_handler: GetJsonSchemaHandler = current_handler,
js_modify_function: GetJsonSchemaFunction = js_modify_function,
) -> JsonSchemaValue:
json_schema = js_modify_function(schema_or_field, current_handler)
if _core_utils.is_core_schema(schema_or_field):
json_schema = populate_defs(schema_or_field, json_schema)
original_schema = current_handler.resolve_ref_schema(json_schema)
ref = json_schema.pop('$ref', None)
if ref and json_schema:
original_schema.update(json_schema)
return original_schema
current_handler = _schema_generation_shared.GenerateJsonSchemaHandler(self, new_handler_func)
for js_modify_function in metadata_handler.metadata.get('pydantic_js_annotation_functions', ()):
def new_handler_func(
schema_or_field: CoreSchemaOrField,
current_handler: GetJsonSchemaHandler = current_handler,
js_modify_function: GetJsonSchemaFunction = js_modify_function,
) -> JsonSchemaValue:
json_schema = js_modify_function(schema_or_field, current_handler)
if _core_utils.is_core_schema(schema_or_field):
json_schema = populate_defs(schema_or_field, json_schema)
return json_schema
current_handler = _schema_generation_shared.GenerateJsonSchemaHandler(self, new_handler_func)
json_schema = current_handler(schema)
if _core_utils.is_core_schema(schema):
json_schema = populate_defs(schema, json_schema)
return json_schema
Error Message and Stack Trace (if applicable)
File "E:\Software\Anaconda\envs\Langchain311\Lib\site-packages\pydantic\json_schema.py", line 511, in handler_func
return self.handler(core_schema)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\Software\Anaconda\envs\Langchain311\Lib\site-packages\pydantic\json_schema.py", line 511, in handler_func
json_schema = generate_for_schema_type(schema_or_field)
File "E:\Software\Anaconda\envs\Langchain311\Lib\site-packages\pydantic\json_schema.py", line 511, in handler_func
json_schema = generate_for_schema_type(schema_or_field)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
json_schema = generate_for_schema_type(schema_or_field)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\Software\Anaconda\envs\Langchain311\Lib\site-packages\pydantic\json_schema.py", line 1014, in function_plain_schema
return self.handle_invalid_for_json_schema(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "E:\Software\Anaconda\envs\Langchain311\Lib\site-packages\pydantic\json_schema.py", line 2185, in handle_invalid_for_json_schema
raise PydanticInvalidForJsonSchema(f'Cannot generate a JsonSchema for {error_info}')
pydantic.errors.PydanticInvalidForJsonSchema: Cannot generate a JsonSchema for core_schema.PlainValidatorFunctionSchema ({'type': 'with-info', 'function': <bound method BaseModel.validate of <class 'neo4j_cypher.chain.Question'>>})
Description
When using Langchain's neo4j-cypher template, pydanticv2 always reports errors and is not compatible. Switching pydantic version to v1 is not compatible either.
Hello! We're a group of students from the University of Toronto Scarborough, and we're excited to contribute to LangChain. We'd love the opportunity to investigate this bug further.
Checked other resources
Example Code
Error Message and Stack Trace (if applicable)
Description
When using Langchain's neo4j-cypher template, pydanticv2 always reports errors and is not compatible. Switching pydantic version to v1 is not compatible either.
System Info
Python 3.11 pydantic 2.9.2 pydantic-core 2.23.4 langchain-cli 0.0.31 langchain-community 0.0.33