Pydantic v1 accepted an int for a str field and stringified it. Pydantic v2's default lax mode does not: it raises Input should be a valid string with type string_type. The same tightening applies to a str input for a float field in strict contexts and to several other pairs documented in the conversion table.
This shows up when parsing JSON from a source that emits numeric identifiers, or YAML where an unquoted version like 1.10 is a float. Nothing in the model changed, only the library, so the failure appears purely as an upgrade regression.
The explicit fix is to declare the field as Union[str, int] and normalise in a validator, or to use coerce_numbers_to_str=True in model_config, which restores the old behaviour for that model. Adding a @field_validator(mode="before") that calls str() is the most surgical option when only one field is affected. Check the direction you need before changing anything: v2 is asymmetric, and str to int is still accepted in lax mode when the string is numeric.