2.61.2

(chore): Bump @fern-api/generator-cli to 0.9.11. The GitHub pipeline step now creates signed commits via the GitHub REST API (matching fiddle’s legacy InMemoryGitRepo push path), restoring verified fern-api[bot] commits on replay-enabled orgs.

2.61.1

(fix): Emit a Body property of type System.IO.Stream on wrapped request records for endpoints whose request body is bytes. Previously the endpoint client method emitted Body = request.Body but the generated request record did not declare a Body property, producing a CS1061 compile error on any endpoint that combined a binary body with other wrapped parameters (e.g. query parameters, headers, or path parameters).

2.61.0

(feat): Add offset-semantics config option. When set to "page-index", offset pagination increments by 1 each page instead of by the number of items returned ("item-index", the default).

2.60.2

(chore): Add crash reporting via Sentry to the generator runtime, and classify thrown errors using the new shared GeneratorError taxonomy so user-facing failures (config, validation, auth, network, environment) are kept distinct from internal Fern bugs — only the latter are forwarded to Sentry. No change to generated output.


2.60.1

(chore): Bump @fern-api/generator-cli to 0.9.8. Changelog URLs in generated PRs now use the commit SHA instead of the PR branch name, keeping the link valid after the branch is deleted or squash-merged.


2.59.6

(fix): Add domain-specific event properties (e.g. AssistantMessage, ChatMetadata, AudioOutput) and UnknownMessage to the generated WebSocket client interface. Previously, these events were only available on the concrete class, forcing consumers to downcast from the interface type to access them.

2.59.5

(fix): Skip mock server test examples with empty string path parameters. An empty path parameter causes the mock server to register a collapsed URL (e.g. /v0/tools/version/1) while the SDK client sends a double-slash URL (e.g. /v0/tools//version/1), resulting in a 404 from WireMock.

(fix): Fix dynamic snippet generation for literal types when generate-literals (or experimental-readonly-constants) is enabled. Inline literal properties now correctly omit the value (relying on the = new() default initializer), and named literal alias types emit new TypeName() instead of a raw string, preventing CS0029 compilation errors.

(fix): Fix file upload request properties declared as list<file> generating a single FileParameter field instead of List<FileParameter>.

2.59.4

(fix): Add GetSingle() fallback to JsonElementComparer number comparison. When two JSON numbers differ as decimals but match as singles, they represent the same float32 value and are now considered equal. This fixes mock server test failures for fields declared as format: float where C#‘s System.Text.Json serializes System.Single with a shorter decimal representation than the original JSON string (e.g. 0.10722749680280685 vs 0.1072275).


2.59.3

(fix): Fix mock server test and snippet generation to skip literal properties in object initializers when generate-literals is enabled. Previously, the generator emitted plain string/boolean assignments for TypeLiteral properties, causing CS0029 compilation errors. Literal properties now rely on their = new() default initializer.

2.59.2

(fix): Fix dynamic snippet generation failing with “Endpoint does not have an example that matches the snippet” when the endpoint has examples but the request is a plain EndpointSnippetRequest without an id. The guard now only validates the example match when the snippet includes an id.

2.59.1

(fix): Fix undiscriminated union variant matching in dynamic snippets selecting incorrect variants when errors are added during conversion. The matcher now checks whether errors were added (via errors.size() > errorsBefore) alongside the existing isNop check, and adds a missing nop check that was causing the first variant to be unconditionally returned. This prevents empty objects from being returned for union fields like options in generated code snippets.


2.59.0

(feat): Expose HTTP response metadata on paginated endpoints. Page<TItem> now includes StatusCode, Headers, and Response properties, giving users access to HTTP status codes, response headers, and the full API response object for each page.

2.58.1

(fix): Fix dynamic snippet generation to include all required properties in object initializers. Previously, required properties missing from the example data were omitted, causing CS9035 compilation errors in C#. Required properties now receive deterministic placeholder values when not present in the snippet request.


2.58.0

(feat): Support omitting username or password from basic auth when configured via usernameOmit or passwordOmit in the IR. Omitted fields are removed from the SDK’s public API and treated as empty strings internally (e.g., omitting password encodes username:, omitting username encodes :password). When both are omitted, the Authorization header is skipped entirely.

2.56.6

(fix): Ensure extra-dependencies overrides take precedence over bundled dependency versions, preventing duplicate PackageReference entries in generated .csproj files.

2.56.5

(fix): Fix mock server test generation to omit null values for non-nullable properties in inlined request bodies, matching the SDK’s JsonIgnoreCondition.WhenWritingNull serialization behavior. When enableExplicitNullableOptional is disabled (default), all nulls are now unconditionally omitted from expected request JSON.

(fix): Fix pagination test build errors (CS8411) when generatePaginatedClients is disabled. The test generator now checks the config flag before emitting await foreach code, preventing attempts to iterate over plain response types that do not implement IAsyncEnumerable.


2.56.4

(fix): Fix duplicate field error in wrapped request generation when an inlined request body property has the same PascalCase name as a path parameter (e.g., upload_request_id body property colliding with uploadRequestId path parameter). When a collision is detected, the path parameter field ([JsonIgnore]) is skipped and the body property ([JsonPropertyName]) is kept, so the single property serializes to both the URL path and the JSON request body.

2.56.3

(chore): Remove legacy backslash escape in generated CI workflow’s NuGet publish step now that Eta template engine does not interpret ${} syntax.

2.56.2

(fix): Make query-string and path parameter encoding RFC 3986 spec-compliant with three distinct encoding contexts: path segments (pchar), query keys, and query values. Each context now encodes exactly the characters that RFC 3986 requires. Query keys exclude &, =, +, #; query values exclude &, +, # (but allow =); path segments allow all sub-delimiters plus : and @ (but encode / and ?). Path parameter values are now percent-encoded via EncodePathSegment in ValueConvert.ToPathParameterString. Previously, all contexts shared a single character set and path parameters were not encoded.

2.56.1

(chore): Use a persistent CSharpier process for code formatting. Instead of spawning a new process per format call, a single csharpier pipe-files process is kept alive and files are piped to it on demand. This eliminates repeated .NET startup overhead and significantly speeds up formatting during SDK generation.

2.56.0

(feat): Add maxRetries custom config option to override the default maximum number of retries for failed requests. The default remains 2 when not specified.


2.57.0-rc.0

(feat): Upgrade to IR v66 which compresses the IR Name type, reducing IR size and increasing performance.

2.55.4

(fix): Fix C# compilation errors (CS0118) in generated subpackage clients where a type name collides with a namespace segment. Type references are now fully qualified to avoid ambiguity.

2.55.3

(chore): Upgrade WireMock.Net from 1.25.0 to 2.2.0 in generated test projects. This is a test-only dependency and does not affect the shipped SDK.


2.55.2

(fix): Support multiple Basic Auth schemes with AuthSchemesRequirement.Any. When an API defines more than one basic auth scheme (e.g., accountId/authToken and apiKey/apiKeySecret), the generated client now produces conditional if/else if blocks that check which credential pair was provided and sets the Authorization header accordingly. Previously, only the first basic auth scheme was used.

2.55.1

(fix): Include extraProperties (AdditionalProperties) in WireMock mock server response objects. Previously, object types with [JsonExtensionData] additional properties were missing those properties in generated mock responses, causing incomplete WireMock stubs.


2.55.0

(feat): Add Environments section to generated README showing how to select different environments (production/sandbox) when initializing the client.