0.30.2

(fix): Fix dynamic snippet generation for bytes endpoints with query parameters to use the request struct instead of positional arguments.

0.30.1

(fix): Generate request structs for bytes (octet-stream) endpoints with query parameters, replacing positional arguments with a single struct that bundles the raw body and all query params with a builder pattern.

0.30.0

(feat): Overhaul WebSocket reconnection: exponential backoff with jitter, auto-reset of retry counter after 5s of stable connection, and message queuing during reconnect (text and binary messages are buffered and flushed after reconnection instead of erroring).

(feat): Add DisconnectInfo struct to WebSocketMessage::Close, exposing the close code and reason string from the server. recv() now returns None on close frames to signal end-of-stream.

(feat): Generate typed ConnectOptions structs for WebSocket channels with query parameters, replacing positional &str arguments with a #[derive(Default)] struct that supports ..Default::default() ergonomics. Uses QueryBuilder under the hood, matching the HTTP endpoint pattern.

(feat): Support custom connect and message method names from the IR (channel.connectMethodName, msg.methodName), falling back to connect and send_{name} respectively.

(feat): Add generateWebSocketClients config alias alongside enableWebsockets, matching the TypeScript/Python/Java generator config key.

(feat): Route each WebSocket connector through the correct environment URL method in multi-URL APIs (e.g., Deepgram’s wss://agent.deepgram.com vs wss://api.deepgram.com).

(feat): Add Unknown(serde_json::Value) catch-all variant to generated ServerMessage enums for forward compatibility with new server message types.

(feat): Graceful WebSocket close: sends Close frame and waits up to 5s for the server’s response, with double-close guard.

(fix): Change implicit auth parameter from required &str to Option<&str>, conditionally injecting the Authorization header only when a token is provided.

(fix): Fix connector auth forwarding for APIs with explicit Authorization headers (e.g., Deepgram) — the connector now correctly unwraps the Option to match the client’s &str parameter type.

(fix): Fix recv() on JSON-only channels to return an error with frame size on unexpected binary frames instead of silently skipping them.

(chore): Derive channel names from the channel path instead of the channel ID, moving version segments to suffix position (e.g., /v1/agent/converseAgentConverseV1Client).

(fix): Replace #[serde(untagged)] derive on ServerMessage enums with a custom Deserialize impl that uses round-trip scoring. Fixes silent mismatches where #[serde(default)] on struct fields caused every variant to match, always returning the first.

(chore): Introduce ReconnectContext struct to group reconnection state, replacing 8 separate Arc-wrapped parameters in read_loop and try_reconnect.

(fix): Fix try_reconnect to retry with exponential backoff up to max_reconnect_attempts, instead of giving up after a single failed attempt.

(fix): Fix flush_queues to preserve messages on send failure by cloning before sending and pushing back to the front of the queue on error.

(chore): Remove dead parse_websocket_message function and unused serde::de::DeserializeOwned import from WebSocket client infrastructure.

(fix): Fix wire test generator to set config.environment = None for multi-URL APIs so requests route to the WireMock server instead of real API endpoints.

(fix): Fix number_serializers unit test assertion to use 1e+20 matching Rust’s serde_json exponent formatting.

(fix): Fix WebSocket connectors to support api_key auth in addition to bearer token. The connector now receives a pre-computed Authorization header value from the root client, using the IR’s api key prefix (e.g., Token) with api_key taking priority over token, matching the HTTP client’s behavior.

What’s new

  • This is a breaking change for any code that previously passed query parameters as positional arguments to connect().

0.29.0

(feat): Add per-endpoint URL resolution for multi-URL environments. Each endpoint now resolves its base URL at call time from the environment object, matching the Python and Java SDK approach.

(feat): Generate ApiClientBuilder from code instead of a static template, enabling environment-aware builder methods for multi-URL APIs.

(feat): Add per-base-URL getter methods on the Environment enum (e.g., api_url(), agent_url()) for multi-URL environments.

(feat): Add Option<Environment> field to ClientConfig for multi-URL environments to support per-endpoint URL resolution.

(feat): Add base_url(), config(), execute_request_with_base_url(), and execute_stream_request_with_base_url() accessors to HttpClient for multi-URL endpoint resolution.

(chore): Remove construction-time URL override from RootClientGenerator; all sub-clients now receive config.clone() uniformly.

0.28.0

(feat): Add number_serializers module that serializes whole-number f64 values without trailing .0 (e.g., 24000.0 serializes as 24000). Some APIs reject the decimal representation for integer-valued numbers. Includes range validation to prevent incorrect values for numbers outside i64 range.

(feat): Add execute_bytes_request HTTP client method for endpoints with application/octet-stream request bodies, sending raw bytes instead of JSON-encoding them.

(feat): Support API key prefix from IR auth schemes. When a prefix like Token or Bearer is configured, the generated HTTP client prepends it to the API key header value.

(fix): Refactor query parameters on file-upload and inlined request bodies to be sent as URL query strings instead of being serialized into the request body. Query param fields are now marked with #[serde(skip_serializing)].

(fix): Fix redundant #[serde(skip_serializing_if = "Option::is_none")] and #[serde(skip_serializing)] on optional query param fields. Only skip_serializing is now emitted.

(chore): Conditionally include number_serializers.rs only when the IR uses float/double types, consistent with other serializer modules.

(chore): Replace unsafe type cast on auth schemes with proper FernIr.AuthScheme._visit() pattern matching.

(chore): Upgrade IR SDK from v61 to v65.