nextBackoff() {
+ retryNumber += 1;
+ if (retryNumber > maxNumRetries) {
+ return Optional.empty();
+ }
+
+ int upperBound = (int) Math.pow(2, retryNumber);
+ return Optional.of(ONE_SECOND.multipliedBy(random.nextInt(upperBound)));
+ }
+ }
+}
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/core/Stream.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/core/Stream.java
new file mode 100644
index 00000000000..303eaf050fe
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/core/Stream.java
@@ -0,0 +1,272 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.seed.api.core;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Scanner;
+
+/**
+ * The {@code Stream} class implements {@link Iterable} to provide a simple mechanism for reading and parsing
+ * objects of a given type from data streamed via a {@link Reader} using a specified delimiter.
+ *
+ * {@code Stream} assumes that data is being pushed to the provided {@link Reader} asynchronously and utilizes a
+ * {@code Scanner} to block during iteration if the next object is not available.
+ * Iterable stream for parsing JSON and Server-Sent Events (SSE) data.
+ * Supports both newline-delimited JSON and SSE with optional stream termination.
+ *
+ * @param The type of objects in the stream.
+ */
+public final class Stream implements Iterable, Closeable {
+
+ private static final String NEWLINE = "\n";
+ private static final String DATA_PREFIX = "data:";
+
+ public enum StreamType {
+ JSON,
+ SSE
+ }
+
+ private final Class valueType;
+ private final Scanner scanner;
+ private final StreamType streamType;
+ private final String messageTerminator;
+ private final String streamTerminator;
+ private final Reader sseReader;
+ private boolean isClosed = false;
+
+ /**
+ * Constructs a new {@code Stream} with the specified value type, reader, and delimiter.
+ *
+ * @param valueType The class of the objects in the stream.
+ * @param reader The reader that provides the streamed data.
+ * @param delimiter The delimiter used to separate elements in the stream.
+ */
+ public Stream(Class valueType, Reader reader, String delimiter) {
+ this.valueType = valueType;
+ this.scanner = new Scanner(reader).useDelimiter(delimiter);
+ this.streamType = StreamType.JSON;
+ this.messageTerminator = delimiter;
+ this.streamTerminator = null;
+ this.sseReader = null;
+ }
+
+ private Stream(Class valueType, StreamType type, Reader reader, String terminator) {
+ this.valueType = valueType;
+ this.streamType = type;
+ if (type == StreamType.JSON) {
+ this.scanner = new Scanner(reader).useDelimiter(terminator);
+ this.messageTerminator = terminator;
+ this.streamTerminator = null;
+ this.sseReader = null;
+ } else {
+ this.scanner = null;
+ this.messageTerminator = NEWLINE;
+ this.streamTerminator = terminator;
+ this.sseReader = reader;
+ }
+ }
+
+ public static Stream fromJson(Class valueType, Reader reader, String delimiter) {
+ return new Stream<>(valueType, reader, delimiter);
+ }
+
+ public static Stream fromJson(Class valueType, Reader reader) {
+ return new Stream<>(valueType, reader, NEWLINE);
+ }
+
+ public static Stream fromSse(Class valueType, Reader sseReader) {
+ return new Stream<>(valueType, StreamType.SSE, sseReader, null);
+ }
+
+ public static Stream fromSse(Class valueType, Reader sseReader, String streamTerminator) {
+ return new Stream<>(valueType, StreamType.SSE, sseReader, streamTerminator);
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (!isClosed) {
+ isClosed = true;
+ if (scanner != null) {
+ scanner.close();
+ }
+ if (sseReader != null) {
+ sseReader.close();
+ }
+ }
+ }
+
+ private boolean isStreamClosed() {
+ return isClosed;
+ }
+
+ /**
+ * Returns an iterator over the elements in this stream that blocks during iteration when the next object is
+ * not yet available.
+ *
+ * @return An iterator that can be used to traverse the elements in the stream.
+ */
+ @Override
+ public Iterator iterator() {
+ if (streamType == StreamType.SSE) {
+ return new SSEIterator();
+ } else {
+ return new JsonIterator();
+ }
+ }
+
+ private final class JsonIterator implements Iterator {
+
+ /**
+ * Returns {@code true} if there are more elements in the stream.
+ *
+ * Will block and wait for input if the stream has not ended and the next object is not yet available.
+ *
+ * @return {@code true} if there are more elements, {@code false} otherwise.
+ */
+ @Override
+ public boolean hasNext() {
+ if (isStreamClosed()) {
+ return false;
+ }
+ return scanner.hasNext();
+ }
+
+ /**
+ * Returns the next element in the stream.
+ *
+ * Will block and wait for input if the stream has not ended and the next object is not yet available.
+ *
+ * @return The next element in the stream.
+ * @throws NoSuchElementException If there are no more elements in the stream.
+ */
+ @Override
+ public T next() {
+ if (isStreamClosed()) {
+ throw new NoSuchElementException("Stream is closed");
+ }
+
+ if (!scanner.hasNext()) {
+ throw new NoSuchElementException();
+ } else {
+ try {
+ T parsedResponse =
+ ObjectMappers.JSON_MAPPER.readValue(scanner.next().trim(), valueType);
+ return parsedResponse;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ private final class SSEIterator implements Iterator {
+ private Scanner sseScanner;
+ private T nextItem;
+ private boolean hasNextItem = false;
+ private boolean endOfStream = false;
+ private StringBuilder buffer = new StringBuilder();
+ private boolean prefixSeen = false;
+
+ private SSEIterator() {
+ if (sseReader != null && !isStreamClosed()) {
+ this.sseScanner = new Scanner(sseReader);
+ } else {
+ this.endOfStream = true;
+ }
+ }
+
+ @Override
+ public boolean hasNext() {
+ if (isStreamClosed() || endOfStream) {
+ return false;
+ }
+
+ if (hasNextItem) {
+ return true;
+ }
+
+ return readNextMessage();
+ }
+
+ @Override
+ public T next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException("No more elements in stream");
+ }
+
+ T result = nextItem;
+ nextItem = null;
+ hasNextItem = false;
+ return result;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
+ private boolean readNextMessage() {
+ if (sseScanner == null || isStreamClosed()) {
+ endOfStream = true;
+ return false;
+ }
+
+ try {
+ while (sseScanner.hasNextLine()) {
+ String chunk = sseScanner.nextLine();
+ buffer.append(chunk).append(NEWLINE);
+
+ int terminatorIndex;
+ while ((terminatorIndex = buffer.indexOf(messageTerminator)) >= 0) {
+ String line = buffer.substring(0, terminatorIndex + messageTerminator.length());
+ buffer.delete(0, terminatorIndex + messageTerminator.length());
+
+ line = line.trim();
+ if (line.isEmpty()) {
+ continue;
+ }
+
+ if (!prefixSeen && line.startsWith(DATA_PREFIX)) {
+ prefixSeen = true;
+ line = line.substring(DATA_PREFIX.length()).trim();
+ } else if (!prefixSeen) {
+ continue;
+ }
+
+ if (streamTerminator != null && line.contains(streamTerminator)) {
+ endOfStream = true;
+ return false;
+ }
+
+ try {
+ nextItem = ObjectMappers.JSON_MAPPER.readValue(line, valueType);
+ hasNextItem = true;
+ prefixSeen = false;
+ return true;
+ } catch (Exception parseEx) {
+ continue;
+ }
+ }
+ }
+
+ endOfStream = true;
+ return false;
+
+ } catch (Exception e) {
+ System.err.println("Failed to parse SSE stream: " + e.getMessage());
+ endOfStream = true;
+ return false;
+ }
+ }
+ }
+}
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/core/Suppliers.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/core/Suppliers.java
new file mode 100644
index 00000000000..a3c24e96857
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/core/Suppliers.java
@@ -0,0 +1,23 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.seed.api.core;
+
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
+
+public final class Suppliers {
+ private Suppliers() {}
+
+ public static Supplier memoize(Supplier delegate) {
+ AtomicReference value = new AtomicReference<>();
+ return () -> {
+ T val = value.get();
+ if (val == null) {
+ val = value.updateAndGet(cur -> cur == null ? Objects.requireNonNull(delegate.get()) : cur);
+ }
+ return val;
+ };
+ }
+}
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/requests/NonNullableObject.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/requests/NonNullableObject.java
new file mode 100644
index 00000000000..c88c0350432
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/requests/NonNullableObject.java
@@ -0,0 +1,196 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.seed.api.requests;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.seed.api.core.ObjectMappers;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import org.jetbrains.annotations.NotNull;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = NonNullableObject.Builder.class)
+public final class NonNullableObject {
+ private final String id;
+
+ private final Optional nonNullableObjectId;
+
+ private final Optional name;
+
+ private final Optional age;
+
+ private final Map additionalProperties;
+
+ private NonNullableObject(
+ String id,
+ Optional nonNullableObjectId,
+ Optional name,
+ Optional age,
+ Map additionalProperties) {
+ this.id = id;
+ this.nonNullableObjectId = nonNullableObjectId;
+ this.name = name;
+ this.age = age;
+ this.additionalProperties = additionalProperties;
+ }
+
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ @JsonProperty("id")
+ public Optional getNonNullableObjectId() {
+ return nonNullableObjectId;
+ }
+
+ @JsonProperty("name")
+ public Optional getName() {
+ return name;
+ }
+
+ @JsonProperty("age")
+ public Optional getAge() {
+ return age;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof NonNullableObject && equalTo((NonNullableObject) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(NonNullableObject other) {
+ return id.equals(other.id)
+ && nonNullableObjectId.equals(other.nonNullableObjectId)
+ && name.equals(other.name)
+ && age.equals(other.age);
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.id, this.nonNullableObjectId, this.name, this.age);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static IdStage builder() {
+ return new Builder();
+ }
+
+ public interface IdStage {
+ _FinalStage id(@NotNull String id);
+
+ Builder from(NonNullableObject other);
+ }
+
+ public interface _FinalStage {
+ NonNullableObject build();
+
+ _FinalStage nonNullableObjectId(Optional nonNullableObjectId);
+
+ _FinalStage nonNullableObjectId(String nonNullableObjectId);
+
+ _FinalStage name(Optional name);
+
+ _FinalStage name(String name);
+
+ _FinalStage age(Optional age);
+
+ _FinalStage age(Integer age);
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder implements IdStage, _FinalStage {
+ private String id;
+
+ private Optional age = Optional.empty();
+
+ private Optional name = Optional.empty();
+
+ private Optional nonNullableObjectId = Optional.empty();
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ @java.lang.Override
+ public Builder from(NonNullableObject other) {
+ id(other.getId());
+ nonNullableObjectId(other.getNonNullableObjectId());
+ name(other.getName());
+ age(other.getAge());
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter("id")
+ public _FinalStage id(@NotNull String id) {
+ this.id = Objects.requireNonNull(id, "id must not be null");
+ return this;
+ }
+
+ @java.lang.Override
+ public _FinalStage age(Integer age) {
+ this.age = Optional.ofNullable(age);
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter(value = "age", nulls = Nulls.SKIP)
+ public _FinalStage age(Optional age) {
+ this.age = age;
+ return this;
+ }
+
+ @java.lang.Override
+ public _FinalStage name(String name) {
+ this.name = Optional.ofNullable(name);
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter(value = "name", nulls = Nulls.SKIP)
+ public _FinalStage name(Optional name) {
+ this.name = name;
+ return this;
+ }
+
+ @java.lang.Override
+ public _FinalStage nonNullableObjectId(String nonNullableObjectId) {
+ this.nonNullableObjectId = Optional.ofNullable(nonNullableObjectId);
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter(value = "id", nulls = Nulls.SKIP)
+ public _FinalStage nonNullableObjectId(Optional nonNullableObjectId) {
+ this.nonNullableObjectId = nonNullableObjectId;
+ return this;
+ }
+
+ @java.lang.Override
+ public NonNullableObject build() {
+ return new NonNullableObject(id, nonNullableObjectId, name, age, additionalProperties);
+ }
+ }
+}
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/requests/PostWithNullableNamedRequestBodyTypeRequest.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/requests/PostWithNullableNamedRequestBodyTypeRequest.java
new file mode 100644
index 00000000000..69007eefb34
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/requests/PostWithNullableNamedRequestBodyTypeRequest.java
@@ -0,0 +1,135 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.seed.api.requests;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.seed.api.core.ObjectMappers;
+import com.seed.api.types.NullableObject;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import org.jetbrains.annotations.NotNull;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = PostWithNullableNamedRequestBodyTypeRequest.Builder.class)
+public final class PostWithNullableNamedRequestBodyTypeRequest {
+ private final String id;
+
+ private final Optional body;
+
+ private final Map additionalProperties;
+
+ private PostWithNullableNamedRequestBodyTypeRequest(
+ String id, Optional body, Map additionalProperties) {
+ this.id = id;
+ this.body = body;
+ this.additionalProperties = additionalProperties;
+ }
+
+ @JsonProperty("id")
+ public String getId() {
+ return id;
+ }
+
+ @JsonProperty("body")
+ public Optional getBody() {
+ return body;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof PostWithNullableNamedRequestBodyTypeRequest
+ && equalTo((PostWithNullableNamedRequestBodyTypeRequest) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(PostWithNullableNamedRequestBodyTypeRequest other) {
+ return id.equals(other.id) && body.equals(other.body);
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.id, this.body);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static IdStage builder() {
+ return new Builder();
+ }
+
+ public interface IdStage {
+ _FinalStage id(@NotNull String id);
+
+ Builder from(PostWithNullableNamedRequestBodyTypeRequest other);
+ }
+
+ public interface _FinalStage {
+ PostWithNullableNamedRequestBodyTypeRequest build();
+
+ _FinalStage body(Optional body);
+
+ _FinalStage body(NullableObject body);
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder implements IdStage, _FinalStage {
+ private String id;
+
+ private Optional body = Optional.empty();
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ @java.lang.Override
+ public Builder from(PostWithNullableNamedRequestBodyTypeRequest other) {
+ id(other.getId());
+ body(other.getBody());
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter("id")
+ public _FinalStage id(@NotNull String id) {
+ this.id = Objects.requireNonNull(id, "id must not be null");
+ return this;
+ }
+
+ @java.lang.Override
+ public _FinalStage body(NullableObject body) {
+ this.body = Optional.ofNullable(body);
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter(value = "body", nulls = Nulls.SKIP)
+ public _FinalStage body(Optional body) {
+ this.body = body;
+ return this;
+ }
+
+ @java.lang.Override
+ public PostWithNullableNamedRequestBodyTypeRequest build() {
+ return new PostWithNullableNamedRequestBodyTypeRequest(id, body, additionalProperties);
+ }
+ }
+}
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/types/NullableObject.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/types/NullableObject.java
new file mode 100644
index 00000000000..00c392cc04a
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/types/NullableObject.java
@@ -0,0 +1,143 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.seed.api.types;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.seed.api.core.ObjectMappers;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = NullableObject.Builder.class)
+public final class NullableObject {
+ private final Optional id;
+
+ private final Optional name;
+
+ private final Optional age;
+
+ private final Map additionalProperties;
+
+ private NullableObject(
+ Optional id,
+ Optional name,
+ Optional age,
+ Map additionalProperties) {
+ this.id = id;
+ this.name = name;
+ this.age = age;
+ this.additionalProperties = additionalProperties;
+ }
+
+ @JsonProperty("id")
+ public Optional getId() {
+ return id;
+ }
+
+ @JsonProperty("name")
+ public Optional getName() {
+ return name;
+ }
+
+ @JsonProperty("age")
+ public Optional getAge() {
+ return age;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof NullableObject && equalTo((NullableObject) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(NullableObject other) {
+ return id.equals(other.id) && name.equals(other.name) && age.equals(other.age);
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.id, this.name, this.age);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder {
+ private Optional id = Optional.empty();
+
+ private Optional name = Optional.empty();
+
+ private Optional age = Optional.empty();
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ public Builder from(NullableObject other) {
+ id(other.getId());
+ name(other.getName());
+ age(other.getAge());
+ return this;
+ }
+
+ @JsonSetter(value = "id", nulls = Nulls.SKIP)
+ public Builder id(Optional id) {
+ this.id = id;
+ return this;
+ }
+
+ public Builder id(String id) {
+ this.id = Optional.ofNullable(id);
+ return this;
+ }
+
+ @JsonSetter(value = "name", nulls = Nulls.SKIP)
+ public Builder name(Optional name) {
+ this.name = name;
+ return this;
+ }
+
+ public Builder name(String name) {
+ this.name = Optional.ofNullable(name);
+ return this;
+ }
+
+ @JsonSetter(value = "age", nulls = Nulls.SKIP)
+ public Builder age(Optional age) {
+ this.age = age;
+ return this;
+ }
+
+ public Builder age(Integer age) {
+ this.age = Optional.ofNullable(age);
+ return this;
+ }
+
+ public NullableObject build() {
+ return new NullableObject(id, name, age, additionalProperties);
+ }
+ }
+}
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/types/ResponseBody.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/types/ResponseBody.java
new file mode 100644
index 00000000000..83c1f59df5a
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/seed/api/types/ResponseBody.java
@@ -0,0 +1,95 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.seed.api.types;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.seed.api.core.ObjectMappers;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = ResponseBody.Builder.class)
+public final class ResponseBody {
+ private final Optional success;
+
+ private final Map additionalProperties;
+
+ private ResponseBody(Optional success, Map additionalProperties) {
+ this.success = success;
+ this.additionalProperties = additionalProperties;
+ }
+
+ @JsonProperty("success")
+ public Optional getSuccess() {
+ return success;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof ResponseBody && equalTo((ResponseBody) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(ResponseBody other) {
+ return success.equals(other.success);
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.success);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder {
+ private Optional success = Optional.empty();
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ public Builder from(ResponseBody other) {
+ success(other.getSuccess());
+ return this;
+ }
+
+ @JsonSetter(value = "success", nulls = Nulls.SKIP)
+ public Builder success(Optional success) {
+ this.success = success;
+ return this;
+ }
+
+ public Builder success(Boolean success) {
+ this.success = Optional.ofNullable(success);
+ return this;
+ }
+
+ public ResponseBody build() {
+ return new ResponseBody(success, additionalProperties);
+ }
+ }
+}
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/snippets/Example0.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/snippets/Example0.java
new file mode 100644
index 00000000000..a750eecd7be
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/snippets/Example0.java
@@ -0,0 +1,29 @@
+package com.snippets;
+
+import com.seed.api.Foo;
+import com.seed.api.requests.PostWithNullableNamedRequestBodyTypeRequest;
+import com.seed.api.types.NullableObject;
+
+public class Example0 {
+ public static void main(String[] args) {
+ Foo client = Foo
+ .builder()
+ .url("https://api.fern.com")
+ .build();
+
+ client.postWithNullableNamedRequestBodyType(
+ PostWithNullableNamedRequestBodyTypeRequest
+ .builder()
+ .id("id")
+ .body(
+ NullableObject
+ .builder()
+ .id("id")
+ .name("name")
+ .age(1)
+ .build()
+ )
+ .build()
+ );
+ }
+}
\ No newline at end of file
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/snippets/Example1.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/snippets/Example1.java
new file mode 100644
index 00000000000..5c381f285d3
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/snippets/Example1.java
@@ -0,0 +1,20 @@
+package com.snippets;
+
+import com.seed.api.Foo;
+import com.seed.api.requests.NonNullableObject;
+
+public class Example1 {
+ public static void main(String[] args) {
+ Foo client = Foo
+ .builder()
+ .url("https://api.fern.com")
+ .build();
+
+ client.postWithNonNullableNamedRequestBodyType(
+ NonNullableObject
+ .builder()
+ .id("id")
+ .build()
+ );
+ }
+}
\ No newline at end of file
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/snippets/Example2.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/snippets/Example2.java
new file mode 100644
index 00000000000..18bbf98e824
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/main/java/com/snippets/Example2.java
@@ -0,0 +1,23 @@
+package com.snippets;
+
+import com.seed.api.Foo;
+import com.seed.api.requests.NonNullableObject;
+
+public class Example2 {
+ public static void main(String[] args) {
+ Foo client = Foo
+ .builder()
+ .url("https://api.fern.com")
+ .build();
+
+ client.postWithNonNullableNamedRequestBodyType(
+ NonNullableObject
+ .builder()
+ .id("id")
+ .nonNullableObjectId("id")
+ .name("name")
+ .age(1)
+ .build()
+ );
+ }
+}
\ No newline at end of file
diff --git a/seed/java-sdk/java-nullable-named-request-types/custom-config/src/test/java/com/seed/api/StreamTest.java b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/test/java/com/seed/api/StreamTest.java
new file mode 100644
index 00000000000..77f138e487f
--- /dev/null
+++ b/seed/java-sdk/java-nullable-named-request-types/custom-config/src/test/java/com/seed/api/StreamTest.java
@@ -0,0 +1,86 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.seed.api;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import com.seed.api.core.ObjectMappers;
+import com.seed.api.core.Stream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import org.junit.jupiter.api.Test;
+
+public final class StreamTest {
+ @Test
+ public void testJsonStream() {
+ List