{"record":{"id":"1de479826d145a30","repo":"openai/openai-python","slug":"non-basemodel-types-are-only-supported-with-pydant","errorCode":null,"errorMessage":"Non BaseModel types are only supported with Pydantic v2 - {response_format}","messagePattern":"Non BaseModel types are only supported with Pydantic v2 - (.+?)","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"src/openai/lib/_parsing/_completions.py","lineNumber":249,"sourceCode":"\ndef is_parseable_tool(input_tool: ChatCompletionToolUnionParam) -> bool:\n    if input_tool[\"type\"] != \"function\":\n        return False\n\n    input_fn = cast(object, input_tool.get(\"function\"))\n    if isinstance(input_fn, PydanticFunctionTool):\n        return True\n\n    return cast(FunctionDefinition, input_fn).get(\"strict\") or False\n\n\ndef _parse_content(response_format: type[ResponseFormatT], content: str) -> ResponseFormatT:\n    if is_basemodel_type(response_format):\n        return cast(ResponseFormatT, model_parse_json(response_format, content))\n\n    if is_dataclass_like_type(response_format):\n        if PYDANTIC_V1:\n            raise TypeError(f\"Non BaseModel types are only supported with Pydantic v2 - {response_format}\")\n\n        return pydantic.TypeAdapter(response_format).validate_json(content)\n\n    raise TypeError(f\"Unable to automatically parse response format type {response_format}\")\n\n\ndef type_to_response_format_param(\n    response_format: type | completion_create_params.ResponseFormat | Omit,\n) -> ResponseFormatParam | Omit:\n    if not is_given(response_format):\n        return omit\n\n    if is_response_format_param(response_format):\n        return response_format\n\n    # type checkers don't narrow the negation of a `TypeGuard` as it isn't\n    # a safe default behaviour but we know that at this point the `response_format`\n    # can only be a `type`","sourceCodeStart":231,"sourceCodeEnd":267,"githubUrl":"https://github.com/openai/openai-python/blob/9917c6e28e66e90e1227b3d223c06a8c5441515a/src/openai/lib/_parsing/_completions.py#L231-L267","documentation":"maybe_parse_content tries to JSON-parse a completion into the given response_format. For dataclass-like (non-Pydantic-BaseModel) types it uses pydantic.TypeAdapter, which only exists in Pydantic v2; under Pydantic v1 it raises this TypeError.","triggerScenarios":"Passing a dataclass, TypedDict, or NamedTuple as response_format to chat.completions.parse while pydantic v1 is installed.","commonSituations":"Legacy projects pinned to pydantic<2; other dependencies forcing pydantic 1.x.","solutions":["Upgrade to pydantic v2 (pip install -U pydantic)","Or use a pydantic.BaseModel subclass as response_format, which works on v1 too"],"exampleFix":"# before\n@dataclass\nclass Output: ...\nclient.chat.completions.parse(..., response_format=Output)\n# after\nclass Output(pydantic.BaseModel): ...\nclient.chat.completions.parse(..., response_format=Output)","handlingStrategy":"validation","validationCode":"import pydantic\nfrom openai.lib._pydantic import PYDANTIC_V1\nif PYDANTIC_V1 and not is_basemodel_type(Output):\n    raise RuntimeError(\"upgrade to pydantic v2 or use BaseModel\")","typeGuard":"from pydantic import BaseModel\nfrom openai._compat import is_basemodel_type\ndef parse_safe(t: type) -> bool:\n    return is_basemodel_type(t) or (not PYDANTIC_V1 and is_dataclass_like_type(t))","tryCatchPattern":"try:\n    parsed = maybe_parse_content(completion, Output)\nexcept TypeError as e:\n    raise ConfigurationError(str(e)) from e","preventionTips":["Pin pydantic>=2 in projects using structured outputs","Prefer BaseModel over dataclasses for output types"],"tags":["parsing","pydantic","version-conflict"],"backgroundTag":"dependency-version-mismatch","analyzedSha":"9917c6e28e66e90e1227b3d223c06a8c5441515a","analyzedAt":"2026-08-28T11:46:34.183Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}