3.27.3

(fix): Fix streaming endpoint return types to use Iterable instead of Optional, fix missing ArrayList import for empty list literals, and fix OAuth wire tests to use withCredentials() pattern.

3.27.2

(chore): Support configurable Node.js and Java V2 executable paths via NODE_PATH and JAVA_V2_PATH environment variables for local seed testing.

3.27.1

(chore): Add sdkVersion as a top-level field in the generated metadata.json file.


3.27.0

(feat): Add gradle-central-dependency-management configuration option (boolean, default false). When enabled, this skips generating the repositories block in build.gradle files, allowing dependencyResolutionManagement in settings.gradle with RepositoriesMode.FAIL_ON_PROJECT_REPOS to work correctly.

This should be used in conjunction with gradle-plugin-management when configuring central repository management on enterprise networks.

Configuration example:

1config:
2 gradle-central-dependency-management: true
3 gradle-plugin-management: |
4 pluginManagement {
5 repositories {
6 maven { url 'https://internal-artifactory.example.com/gradle-plugins/' }
7 }
8 }
9 dependencyResolutionManagement {
10 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
11 repositories {
12 maven { url 'https://internal-artifactory.example.com/maven-releases/' }
13 }
14 }

3.26.0

(feat): Add gradle-plugin-management configuration option to inject custom plugin management and dependency resolution configuration into settings.gradle. This enables SDK generation on enterprise networks that cannot access the Gradle Plugin Portal (plugins.gradle.org) by configuring internal Artifactory/Nexus repositories for plugin resolution.

Configuration example:

1config:
2 gradle-plugin-management: |
3 pluginManagement {
4 repositories {
5 maven { url 'https://internal-artifactory.example.com/gradle-plugins/' }
6 }
7 }
8 dependencyResolutionManagement {
9 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
10 repositories {
11 maven { url 'https://internal-artifactory.example.com/maven-releases/' }
12 }
13 }

(fix): Fix gradle-distribution-url override in Java V2 generator to properly create the gradle/wrapper directory before writing gradle-wrapper.properties.

3.25.1

(fix): Fix form-urlencoded request body handling to properly serialize request objects using Jackson’s convertValue, preserving wire names from @JsonProperty annotations.


3.25.0

(feat): Add gradle-distribution-url configuration option to allow overriding the Gradle wrapper distribution URL. This enables SDK generation on enterprise networks that cannot access services.gradle.org by pointing to an internal Gradle distribution mirror.

Configuration example:

1config:
2 gradle-distribution-url: https://internal-mirror.example.com/gradle/gradle-8.14.3-bin.zip

3.24.5

(fix): Fix OAuth token handling for optional expires_in field with default fallback, and skip literal properties in OAuth request building.

3.24.4

(fix): Mitigate OutOfMemoryError when generating SDKs for large specs. (Specifically, the IR preprocessing preprocessing step now modifies the JSON tree in-place and avoids calling .deepCopy().)

3.24.3

(fix): Update libpng16-16 in container to fix CVE-2025-64720, CVE-2025-65018, CVE-2025-64505, CVE-2025-64506.


3.24.2

(fix): Pass full ClientOptions instead of just httpClient() to custom pagination create() method. This gives custom pager implementations access to all client configuration including base URL, headers, and other options needed for making subsequent pagination requests.


3.24.1

(fix): Fix Jackson deserialization conflict when a property starts with with (e.g., withLabel) and another property matches the suffix (e.g., label).


3.24.0

(feat): Add support for configuring the default timeout via default-timeout-in-seconds in generators.yml. Previously, the default timeout was hardcoded to 60 seconds. Now you can customize it:

Configuration example:

1config:
2 default-timeout-in-seconds: 120

3.23.4

(chore): OAuth token override is now always enabled for APIs with OAuth client credentials authentication. The oauth-token-override config flag has been removed - SDK users can always choose between providing a pre-generated bearer token directly or using the OAuth client credentials flow.

Generated usage:

1// Option 1: Direct bearer token (bypass OAuth flow)
2SeedApiClient client = SeedApiClient.withToken("my-pre-generated-bearer-token")
3 .url("https://api.example.com")
4 .build();
5
6// Option 2: OAuth client credentials flow (automatic token management)
7SeedApiClient client = SeedApiClient.withCredentials("your-client-id", "your-client-secret")
8 .url("https://api.example.com")
9 .build();

3.23.3

(fix): Fix OptionalNullable query parameters to correctly apply .orElse(default) for parameters with default values. Previously, only java.util.Optional was recognized for default value handling, causing OptionalNullable parameters to be passed directly without unwrapping. Now both Optional and OptionalNullable types are handled correctly: parameters with defaults use .orElse(default), and parameters without defaults use appropriate presence checks (!isAbsent() for OptionalNullable, isPresent() for Optional).

3.23.2

(fix): Revert OAuth staged builder compatibility changes.


3.23.1

(fix): Fix duplicate case label compilation errors when multiple error types map to the same HTTP status code. The generator now deduplicates errors by status code, keeping the first error declaration for each code. This prevents Java compilation errors in generated switch statements.


3.23.0

(feat): Add OAuth token override support with compile-time safe staged builder pattern. When oauth-token-override: true is configured, SDK users can choose between the OAuth client credentials flow or providing a pre-generated bearer token directly.

Configuration example:

1config:
2 oauth-token-override: true

Generated usage:

1// Option 1: Direct bearer token (bypass OAuth flow)
2SeedApiClient client = SeedApiClient.withToken("my-pre-generated-bearer-token")
3 .url("https://api.example.com")
4 .build();
5
6// Option 2: OAuth client credentials flow (automatic token management)
7SeedApiClient client = SeedApiClient.withCredentials("your-client-id", "your-client-secret")
8 .url("https://api.example.com")
9 .build();

3.22.0

(feat): Add support for inferred authentication schemes. Inferred auth allows SDKs to automatically fetch tokens from custom (non-OAuth) token endpoints using scheme: bearer with get-token configuration. The generated InferredAuthTokenSupplier class handles token caching and automatic refresh with a 2-minute buffer before expiry.

Configuration example:

1auth:
2 scheme: bearer
3 get-token:
4 endpoint: POST auth.retrieveToken

Generated usage:

1SeedApiClient client = SeedApiClient.builder()
2 .apiKey("your-api-key")
3 .build();
4// Token is automatically fetched and refreshed as needed

3.21.1

(fix): Fix header parameters with x-fern-parameter-name to use the correct HTTP header name (wire value) instead of the SDK parameter name.

3.21.0

(fix): Remove unused kotlin-stdlib from Gradle base image to address CVE-2020-29582 in container.