4.62.0
(feat): Add README.md and reference.md generation to the python-v2 SDK generator.
The v2 generator now produces README documentation with feature snippets
(installation, usage, timeouts, custom client, exception handling, raw responses,
websockets, custom sections) and endpoint reference documentation.
(chore): Format AST output with trailing commas in multiline function calls and
inline list/dict formatting for improved code readability.
4.61.5
(fix): Fix WebSocket client generation to respect pydantic_config.skip_validation: true.
Previously, socket clients always used parse_obj_as (full Pydantic validation)
regardless of the skip_validation flag. They now correctly use construct_type
(no validation) when the flag is enabled, matching the behavior of HTTP clients.
4.61.4
(fix): WebSocket clients now gracefully handle unknown message types instead of crashing.
When the server sends a message type not yet in the SDK’s union, the client logs a
warning and skips the message rather than killing the connection with a validation error.
4.61.3
(chore): Standardize WireMock configuration to use WIREMOCK_URL environment variable
(e.g., http://localhost:8080) instead of WIREMOCK_PORT. The conftest plugin
now sets WIREMOCK_URL after discovering the dynamically assigned port. Falls
back to http://localhost:8080 if the variable is not set.
4.61.2
(fix): Re-add @fern-api/generator-cli to Python SDK Docker image. The CLI was inadvertently
removed in 4.60.1 when JS-based generators migrated to using the generator-cli JS API
directly. The Python generator still relies on the CLI binary via subprocess for
README.md and reference.md generation.
4.61.1
(fix): Fix positional_single_property_constructors breaking pydantic response deserialization.
The custom __init__ now uses @typing.overload with a permissive *args, **kwargs runtime
signature, so pydantic can pass alias-keyed data freely during deserialization while still
allowing positional construction like Wrapper("value").
4.61.0
(feat): Add support for DATE_TIME_RFC_2822 primitive type. Fields with format: date-time-rfc-2822
in OpenAPI specs now generate as Rfc2822DateTime (a datetime.datetime subclass) that
parses RFC 2822 date strings (e.g., “Wed, 02 Oct 2002 13:00:00 GMT”) using Python’s
email.utils.parsedate_to_datetime. Compatible with both Pydantic V1 (__get_validators__)
and V2 (__get_pydantic_core_schema__), passing mypy strict type checking.
(fix): Fix code snippet generation for RFC 2822 datetime fields to use
email.utils.parsedate_to_datetime() with RFC 2822 format strings instead of
datetime.fromisoformat() with ISO 8601 format.
4.60.2
(fix): Fix explode: false query parameter serialization for array types. When an OpenAPI spec
sets explode: false on an array query parameter, the generated SDK now serializes values
as comma-separated strings (e.g. tags=A,B,C) instead of repeated keys (e.g. tags=A&tags=B&tags=C).
This applies to both regular and streaming endpoints.
4.60.1
(chore): Use generator-cli JS API directly instead of subprocess spawning.
Remove generator-cli from Docker image since it is now bundled via esbuild.
4.60.0
(feat): Support connectMethodName on WebSocket channels. When a channel specifies a custom
connection method name via x-fern-sdk-method-name, the generated SDK uses that name
(converted to snake_case) instead of the default connect.
4.59.4
(fix): Fix wire test import generation for organizations with hyphens in their name.
Use package_name from custom config when available, and auto-convert hyphens
to underscores in the fallback module path to produce valid Python import statements.
4.59.3
(fix): Fix bytes body snippet generation to use request parameter name instead of dynamic IR body key.
(fix): Skip wire test generation for bytes request body endpoints, which lack IR example support.
4.59.1
(fix): Fix wire test imports to respect package_name custom config, preventing import errors when users specify custom package names
4.59.2
(fix): Generate an appropriate client.py file when client.exported_filename differs from client.filename.
Previously, the __init__.py would import from the exported filename (e.g., client.py) but
that file was never created, causing mypy import-not-found errors.
4.58.1
(fix): Export ConsoleLogger and ILogger from the core module, allowing users to import
and use them directly: