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:

1from acme.core import ConsoleLogger, ILogger