From d74afef3a8fd32b97d9a31c1d2d6d5ffb9afccf0 Mon Sep 17 00:00:00 2001 From: Arpan Chakraborty Date: Sat, 7 Mar 2026 01:12:00 +0530 Subject: [PATCH] fix: Refactor ConvertDocumentResponse for polymorphic deserialization (#206) Refactored ConvertDocumentResponse into a sealed abstract base class with three concrete implementations (InBodyConvertDocumentResponse, PreSignedUrlConvertDocumentResponse, ZipArchiveConvertDocumentResponse) to properly handle different response types from Docling Serve API. - Use Jackson @JsonTypeInfo with DEDUCTION for automatic type detection of JSON-based responses - Leverage Java 17 sealed classes for type safety - Update reference implementation in docling-serve-client to handle these new types - Add comprehensive test coverage for all response types - Update documentation and Javadoc - Apply Spotless Fixes #206 Signed-off-by: Arpan Chakraborty --- .../serve/api/DoclingServeConvertApi.java | 2 +- .../serve/api/DoclingServeTaskApi.java | 2 +- .../response/ConvertDocumentResponse.java | 92 +---- .../InBodyConvertDocumentResponse.java | 111 ++++++ .../PreSignedUrlConvertDocumentResponse.java | 93 +++++ .../api/convert/response/ResponseType.java | 9 + .../ZipArchiveConvertDocumentResponse.java | 87 +++++ .../ConvertDocumentResponseTests.java | 28 +- .../serve/client/DoclingServeClient.java | 68 +++- .../client/DoclingServeJackson2Client.java | 1 - .../client/operations/ConvertOperations.java | 37 +- .../client/operations/HttpOperations.java | 48 +++ .../client/operations/StreamResponse.java | 67 ++++ .../client/operations/TaskOperations.java | 38 +- .../ai/docling/serve/client/util/Utils.java | 30 ++ .../serve/client/util/package-info.java | 4 + .../AbstractDoclingServeClientTests.java | 342 ++++++++++++++++-- .../src/test/resources/2408.09869.pdf | Bin 0 -> 171833 bytes .../client/tester/service/TagsTester.java | 114 +++--- docs/src/doc/docs/docling-serve/serve-api.md | 18 +- .../doc/docs/docling-serve/serve-client.md | 5 +- docs/src/doc/docs/getting-started.md | 4 +- docs/src/doc/docs/testcontainers.md | 4 +- 23 files changed, 1000 insertions(+), 204 deletions(-) create mode 100644 docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/InBodyConvertDocumentResponse.java create mode 100644 docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/PreSignedUrlConvertDocumentResponse.java create mode 100644 docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ResponseType.java create mode 100644 docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ZipArchiveConvertDocumentResponse.java create mode 100644 docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/StreamResponse.java create mode 100644 docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/util/Utils.java create mode 100644 docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/util/package-info.java create mode 100644 docling-serve/docling-serve-client/src/test/resources/2408.09869.pdf diff --git a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/DoclingServeConvertApi.java b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/DoclingServeConvertApi.java index be669438..a8503462 100644 --- a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/DoclingServeConvertApi.java +++ b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/DoclingServeConvertApi.java @@ -21,7 +21,7 @@ public interface DoclingServeConvertApi { * Converts the provided document source(s) into a processed document based on the specified options. * * @param request the {@link ConvertDocumentRequest} containing the source(s), conversion options, and optional target. - * @return a {@link ConvertDocumentResponse} containing the processed document data, processing details, and any errors. + * @return a {@link ConvertDocumentResponse} describing the convert document response. * @throws ai.docling.serve.api.validation.ValidationException If request validation fails for any reason. */ ConvertDocumentResponse convertSource(ConvertDocumentRequest request); diff --git a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/DoclingServeTaskApi.java b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/DoclingServeTaskApi.java index 535c50ee..55267de7 100644 --- a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/DoclingServeTaskApi.java +++ b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/DoclingServeTaskApi.java @@ -32,7 +32,7 @@ public interface DoclingServeTaskApi { TaskStatusPollResponse pollTaskStatus(TaskStatusPollRequest request); /** - * Converts the result of a completed task into a document format as specified in the request. + * Returns the result of a completed convert task. * * This method processes the task result identified by the unique task ID provided in * the request, performs any necessary transformation, and returns a response diff --git a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ConvertDocumentResponse.java b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ConvertDocumentResponse.java index 7dc20b35..1eb48d66 100644 --- a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ConvertDocumentResponse.java +++ b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ConvertDocumentResponse.java @@ -1,90 +1,34 @@ package ai.docling.serve.api.convert.response; -import java.util.List; -import java.util.Map; - +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.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; /** - * Response returned by the Convert API for a single conversion request. + * Abstract response returned by the Convert API for a single conversion request. * *

Serialization uses {@link JsonInclude.Include#NON_EMPTY}, so nulls and empty * collections/strings are omitted from JSON output.

*/ @JsonInclude(JsonInclude.Include.NON_EMPTY) -@tools.jackson.databind.annotation.JsonDeserialize(builder = ConvertDocumentResponse.Builder.class) -@lombok.extern.jackson.Jacksonized -@lombok.Builder(toBuilder = true) -@lombok.Getter -@lombok.ToString -public class ConvertDocumentResponse { - /** - * Converted document content. - * - * @param document the converted document - * @return the converted document - */ - @JsonProperty("document") - private DocumentResponse document; - +@JsonTypeInfo( + use = JsonTypeInfo.Id.DEDUCTION +) +@JsonSubTypes({ + @JsonSubTypes.Type(InBodyConvertDocumentResponse.class), + @JsonSubTypes.Type(PreSignedUrlConvertDocumentResponse.class), + @JsonSubTypes.Type(ZipArchiveConvertDocumentResponse.class) +}) +public abstract sealed class ConvertDocumentResponse permits InBodyConvertDocumentResponse, PreSignedUrlConvertDocumentResponse, + ZipArchiveConvertDocumentResponse { /** - * List of errors that occurred during conversion. + * Type of response * - * @param errors the list of errors - * @return the list of errors + * @return the response type */ - @JsonProperty("errors") - @JsonSetter(nulls = Nulls.AS_EMPTY) - @lombok.Singular - private List errors; + @JsonProperty("response_type") + public abstract ResponseType getResponseType(); - /** - * Total processing time in seconds. - * - * @param processingTime the processing time in seconds - * @return the processing time in seconds - */ - @JsonProperty("processing_time") - private Double processingTime; - - /** - * Conversion status (success, failure, partial_success, etc.). - * - * @param status the conversion status - * @return the conversion status - */ - @JsonProperty("status") - private String status; - - /** - * Detailed timing information for processing stages. - * - * @param timings the map of timing information - * @return the map of timing information - */ - @JsonProperty("timings") - @JsonSetter(nulls = Nulls.AS_EMPTY) - @lombok.Singular - private Map timings; - - /** - * Builder for creating {@link ConvertDocumentResponse} instances. - * Generated by Lombok's {@code @Builder} annotation. - * - *

Builder methods: - *

    - *
  • {@code document(DocumentResponse)} - Set the converted document
  • - *
  • {@code error(ErrorItem)} - Add a single error (use with @Singular)
  • - *
  • {@code errors(List)} - Set the list of errors
  • - *
  • {@code processingTime(Double)} - Set the processing time in seconds
  • - *
  • {@code status(String)} - Set the conversion status
  • - *
  • {@code timing(String, Object)} - Add a single timing entry (use with @Singular)
  • - *
  • {@code timings(Map)} - Set the map of timing information
  • - *
- */ - @tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "") - public static class Builder { } } diff --git a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/InBodyConvertDocumentResponse.java b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/InBodyConvertDocumentResponse.java new file mode 100644 index 00000000..851e6bcc --- /dev/null +++ b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/InBodyConvertDocumentResponse.java @@ -0,0 +1,111 @@ +package ai.docling.serve.api.convert.response; + +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; + +/** + * Response for single document conversions with in-body content delivery. + * + *

This response type is returned when:

+ *
    + *
  • The conversion request contains a single source file
  • + *
  • The target type is {@link ai.docling.serve.api.convert.request.target.InBodyTarget}
  • + *
+ * + *

The converted document content is included directly in the response body, + * along with conversion status, processing time, errors, and detailed timing + * information for each processing stage.

+ * + *

Serialization uses {@link JsonInclude.Include#NON_EMPTY}, so nulls and empty + * collections/strings are omitted from JSON output.

+ * + * @see ConvertDocumentResponse + * @see ResponseType#InBodyConvertDocumentResponse + * @see ai.docling.serve.api.convert.request.target.InBodyTarget + * @see DocumentResponse + */ +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@tools.jackson.databind.annotation.JsonDeserialize(builder = InBodyConvertDocumentResponse.Builder.class) +@lombok.extern.jackson.Jacksonized +@lombok.Builder(toBuilder = true) +@lombok.Getter +@lombok.ToString +public final class InBodyConvertDocumentResponse extends ConvertDocumentResponse { + /** + * Converted document content. + * + * @param document the converted document + * @return the converted document + */ + @JsonProperty("document") + private DocumentResponse document; + + /** + * List of errors that occurred during conversion. + * + * @param errors the list of errors + * @return the list of errors + */ + @JsonProperty("errors") + @JsonSetter(nulls = Nulls.AS_EMPTY) + @lombok.Singular + private List errors; + + /** + * Total processing time in seconds. + * + * @param processingTime the processing time in seconds + * @return the processing time in seconds + */ + @JsonProperty("processing_time") + private Double processingTime; + + /** + * Conversion status (success, failure, partial_success, etc.). + * + * @param status the conversion status + * @return the conversion status + */ + @JsonProperty("status") + private String status; + + /** + * Detailed timing information for processing stages. + * + * @param timings the map of timing information + * @return the map of timing information + */ + @JsonProperty("timings") + @JsonSetter(nulls = Nulls.AS_EMPTY) + @lombok.Singular + private Map timings; + + @Override + @lombok.ToString.Include + public ResponseType getResponseType() { + return ResponseType.InBodyConvertDocumentResponse; + } + + /** + * Builder for creating {@link InBodyConvertDocumentResponse} instances. + * Generated by Lombok's {@code @Builder} annotation. + * + *

Builder methods: + *

    + *
  • {@code document(DocumentResponse)} - Set the converted document
  • + *
  • {@code error(ErrorItem)} - Add a single error (use with @Singular)
  • + *
  • {@code errors(List)} - Set the list of errors
  • + *
  • {@code processingTime(Double)} - Set the processing time in seconds
  • + *
  • {@code status(String)} - Set the conversion status
  • + *
  • {@code timing(String, Object)} - Add a single timing entry (use with @Singular)
  • + *
  • {@code timings(Map)} - Set the map of timing information
  • + *
+ */ + @tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "") + public static class Builder { } +} diff --git a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/PreSignedUrlConvertDocumentResponse.java b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/PreSignedUrlConvertDocumentResponse.java new file mode 100644 index 00000000..0e712992 --- /dev/null +++ b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/PreSignedUrlConvertDocumentResponse.java @@ -0,0 +1,93 @@ +package ai.docling.serve.api.convert.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Response for document conversions with S3 or PUT target types. + * + *

This response type is returned when the conversion request specifies + * an S3 target or PUT target. The converted documents are stored in the + * specified location. + * The response includes processing statistics and conversion metrics.

+ * + *

Use cases:

+ *
    + *
  • Target type is {@link ai.docling.serve.api.convert.request.target.S3Target}
  • + *
  • Target type is {@link ai.docling.serve.api.convert.request.target.PutTarget}
  • + *
+ * + *

Serialization uses {@link JsonInclude.Include#NON_EMPTY}, so nulls and empty + * collections/strings are omitted from JSON output.

+ * + * @see ConvertDocumentResponse + * @see ResponseType#PreSignedUrlConvertDocumentResponse + * @see ai.docling.serve.api.convert.request.target.S3Target + * @see ai.docling.serve.api.convert.request.target.PutTarget + */ +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@tools.jackson.databind.annotation.JsonDeserialize(builder = PreSignedUrlConvertDocumentResponse.Builder.class) +@lombok.extern.jackson.Jacksonized +@lombok.Builder(toBuilder = true) +@lombok.Getter +@lombok.ToString +public final class PreSignedUrlConvertDocumentResponse extends ConvertDocumentResponse { + + /** + * Total processing time in seconds. + * + * @param processingTime the processing time in seconds + * @return the processing time in seconds + */ + @JsonProperty("processing_time") + private Double processingTime; + + /** + * Number of attempted conversions + * + * @param numSucceeded the number of attempted conversions + * @return the number of attempted conversions + */ + @JsonProperty("num_converted") + private Integer numConverted; + + /** + * Number of successful conversions + * + * @param numSucceeded the number of successful conversions + * @return the number of successful conversions + */ + @JsonProperty("num_succeeded") + private Integer numSucceeded; + + /** + * Number of failed conversions + * + * @param numSucceeded the number of failed conversions + * @return the number of failed conversions + */ + @JsonProperty("num_failed") + private Integer numFailed; + + @Override + @lombok.ToString.Include + public ResponseType getResponseType() { + return ResponseType.PreSignedUrlConvertDocumentResponse; + } + + /** + * Builder for creating {@link PreSignedUrlConvertDocumentResponse} instances. + * Generated by Lombok's {@code @Builder} annotation. + * + *

Builder methods: + *

    + *
  • {@code processingTime(Double)} - Set the processing time in seconds
  • + *
  • {@code numConverted(Integer)} - Set the number of successful conversions
  • + *
  • {@code numFailed(Integer)} - Set the number of failed conversions
  • + *
  • {@code numConverted(Integer)} - Set the number of attempted conversions
  • + *
+ */ + @tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "") + public static class Builder { } + +} diff --git a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ResponseType.java b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ResponseType.java new file mode 100644 index 00000000..e91c519f --- /dev/null +++ b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ResponseType.java @@ -0,0 +1,9 @@ +package ai.docling.serve.api.convert.response; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum ResponseType { + @JsonProperty("in_body") InBodyConvertDocumentResponse, + @JsonProperty("zip_archive") ZipArchiveConvertDocumentResponse, + @JsonProperty("presigned_url") PreSignedUrlConvertDocumentResponse +} diff --git a/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ZipArchiveConvertDocumentResponse.java b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ZipArchiveConvertDocumentResponse.java new file mode 100644 index 00000000..7c3585bf --- /dev/null +++ b/docling-serve/docling-serve-api/src/main/java/ai/docling/serve/api/convert/response/ZipArchiveConvertDocumentResponse.java @@ -0,0 +1,87 @@ +package ai.docling.serve.api.convert.response; + +import java.io.InputStream; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Response for document conversions delivered as a ZIP archive. + * + *

This response type is returned in any one the following scenarios:

+ *
    + *
  • The conversion request contains multiple source files
  • + *
  • The target type is {@link ai.docling.serve.api.convert.request.target.ZipTarget}
  • + *
+ * + *

The response includes the ZIP file name and an input stream to read + * the archive contents. All converted documents and their associated assets + * are packaged together in the ZIP file.

+ * + *

Serialization uses {@link JsonInclude.Include#NON_EMPTY}, so nulls and empty + * collections/strings are omitted from JSON output.

+ * + * @see ConvertDocumentResponse + * @see ResponseType#ZipArchiveConvertDocumentResponse + * @see ai.docling.serve.api.convert.request.target.ZipTarget + * @see ai.docling.serve.api.convert.request.ConvertDocumentRequest + */ +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@tools.jackson.databind.annotation.JsonDeserialize(builder = ZipArchiveConvertDocumentResponse.Builder.class) +@lombok.extern.jackson.Jacksonized +@lombok.Builder(toBuilder = true) +@lombok.Getter +@lombok.ToString +public final class ZipArchiveConvertDocumentResponse extends ConvertDocumentResponse { + + /** + * Name of the ZIP archive file containing the converted documents. + * + *

This is the suggested filename for saving the ZIP archive locally.

+ * + * @param fileName the ZIP archive file name + * @return the ZIP archive file name + */ + + @JsonProperty("file_name") + @lombok.Builder.Default + private String fileName = "converted_docs.zip"; + + /** + * Input stream for reading the ZIP archive contents. + * + *

This stream provides access to the binary ZIP file data containing + * all converted documents and their assets. The stream should be properly + * closed after reading to release resources.

+ * + *

Note: This field is typically not serialized to JSON + * as it represents binary data. It's used for programmatic access to the + * ZIP archive contents.

+ * + * @param inputStream the input stream for the ZIP archive + * @return the input stream for the ZIP archive + */ + @JsonIgnore + private InputStream inputStream; + + @Override + @lombok.ToString.Include + public ResponseType getResponseType() { + return ResponseType.ZipArchiveConvertDocumentResponse; + } + + /** + * Builder for creating {@link ZipArchiveConvertDocumentResponse} instances. + * Generated by Lombok's {@code @Builder} annotation. + * + *

Builder methods:

+ *
    + *
  • {@code fileName(String)} - Set the ZIP archive file name
  • + *
  • {@code inputStream(InputStream)} - Set the input stream for the ZIP archive
  • + *
+ */ + @tools.jackson.databind.annotation.JsonPOJOBuilder(withPrefix = "") + public static class Builder { } + +} diff --git a/docling-serve/docling-serve-api/src/test/java/ai/docling/serve/api/convert/response/ConvertDocumentResponseTests.java b/docling-serve/docling-serve-api/src/test/java/ai/docling/serve/api/convert/response/ConvertDocumentResponseTests.java index 38bfc26c..f6f95a73 100644 --- a/docling-serve/docling-serve-api/src/test/java/ai/docling/serve/api/convert/response/ConvertDocumentResponseTests.java +++ b/docling-serve/docling-serve-api/src/test/java/ai/docling/serve/api/convert/response/ConvertDocumentResponseTests.java @@ -43,7 +43,7 @@ void createResponseWithAllFields() { "convert_time", 0.7 ); - ConvertDocumentResponse response = ConvertDocumentResponse.builder() + InBodyConvertDocumentResponse response = InBodyConvertDocumentResponse.builder() .document(document) .errors(errors) .processingTime(processingTime) @@ -59,8 +59,8 @@ void createResponseWithAllFields() { } @Test - void createResponseWithNullFields() { - ConvertDocumentResponse response = ConvertDocumentResponse.builder().build(); + void createInBodyConvertDocumentResponseWithNullFields() { + InBodyConvertDocumentResponse response = InBodyConvertDocumentResponse.builder().build(); assertThat(response.getDocument()).isNull(); assertThat(response.getErrors()).isNotNull().isEmpty(); @@ -69,6 +69,24 @@ void createResponseWithNullFields() { assertThat(response.getTimings()).isNotNull().isEmpty(); } + @Test + void createZipArchiveConvertDocumentResponseWithNullFields() { + ZipArchiveConvertDocumentResponse response = ZipArchiveConvertDocumentResponse.builder().build(); + + assertThat(response.getInputStream()).isNull(); + assertThat(response.getFileName()).isNotNull().isEqualTo("converted_docs.zip"); + } + + @Test + void createPreSignedUrlConvertDocumentResponseWithNullFields() { + PreSignedUrlConvertDocumentResponse response = PreSignedUrlConvertDocumentResponse.builder().build(); + + assertThat(response.getNumConverted()).isNull(); + assertThat(response.getNumFailed()).isNull(); + assertThat(response.getProcessingTime()).isNull(); + assertThat(response.getNumSucceeded()).isNull(); + } + @Test void createResponseWithEmptyCollections() { DocumentResponse document = DocumentResponse.builder() @@ -76,7 +94,7 @@ void createResponseWithEmptyCollections() { .textContent("") .build(); - ConvertDocumentResponse response = ConvertDocumentResponse.builder() + InBodyConvertDocumentResponse response = InBodyConvertDocumentResponse.builder() .document(document) .processingTime(0.1) .status("completed") @@ -97,7 +115,7 @@ void convertDocumentResponseIsImmutable() { Map timings = new HashMap<>(Map.of("original_time", 1.0)); - ConvertDocumentResponse response = ConvertDocumentResponse.builder() + InBodyConvertDocumentResponse response = InBodyConvertDocumentResponse.builder() .errors(errors) .timings(timings) .build(); diff --git a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/DoclingServeClient.java b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/DoclingServeClient.java index 0c2a2b17..cc3c5da8 100644 --- a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/DoclingServeClient.java +++ b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/DoclingServeClient.java @@ -3,6 +3,7 @@ import static ai.docling.serve.api.util.ValidationUtils.ensureNotNull; import java.io.IOException; +import java.io.InputStream; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpClient.Redirect; @@ -12,6 +13,7 @@ import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.List; import java.util.Map; @@ -52,6 +54,7 @@ import ai.docling.serve.client.operations.HealthOperations; import ai.docling.serve.client.operations.HttpOperations; import ai.docling.serve.client.operations.RequestContext; +import ai.docling.serve.client.operations.StreamResponse; import ai.docling.serve.client.operations.TaskOperations; /** @@ -214,7 +217,12 @@ protected T execute(HttpRequest request, Class expectedValueType) { long startTime = System.currentTimeMillis(); try { - var response = this.httpClient.send(request, BodyHandlers.ofString()); + HttpResponse response = null; + if(StreamResponse.class.equals(expectedValueType)) + response = this.httpClient.send(request, BodyHandlers.ofInputStream()); + else + response = this.httpClient.send(request, BodyHandlers.ofString()); + return getResponse(request, response, expectedValueType); } catch (IOException | InterruptedException e) { @@ -236,6 +244,16 @@ protected O executePost(RequestContext requestContext) { return execute(httpRequest, requestContext.getResponseType()); } + @Override + protected StreamResponse executePostWithStreamResponse(RequestContext requestContext) { + var httpRequest = createRequestBuilder(requestContext) + .header("Accept", "application/octet-stream") + .header("Content-Type", "application/json") + .POST(new LoggingBodyPublisher<>(requestContext.getRequest())) + .build(); + return execute(httpRequest, requestContext.getResponseType()); + } + @Override protected O executeGet(RequestContext requestContext) { var httpRequest = createRequestBuilder(requestContext) @@ -245,6 +263,15 @@ protected O executeGet(RequestContext requestContext) { return execute(httpRequest, requestContext.getResponseType()); } + @Override + protected StreamResponse executeGetWithStreamResponse(RequestContext requestContext) { + var httpRequest = createRequestBuilder(requestContext) + .header("Accept", "application/octet-stream") + .GET() + .build(); + return execute(httpRequest, requestContext.getResponseType()); + } + protected HttpRequest.Builder createRequestBuilder(RequestContext requestContext) { var requestBuilder = HttpRequest.newBuilder() .uri(this.baseUrl.resolve(resolvePath(requestContext.getUri()))) @@ -265,28 +292,51 @@ private String resolvePath(String path) { .orElse(path); } - protected T getResponse(HttpRequest request, HttpResponse response, Class expectedReturnType) { + protected T getResponse(HttpRequest request, HttpResponse response, Class expectedReturnType) { var body = response.body(); - if (this.logResponses) { - logResponse(response, Optional.ofNullable(body)); + // if expectedReturnType is StreamResponse.class, avoid logging potential binary data + if (this.logResponses && !(StreamResponse.class.equals(expectedReturnType))) { + logResponse((HttpResponse) response, Optional.ofNullable(body.toString())); } var statusCode = response.statusCode(); if (statusCode == 422) { + if(StreamResponse.class.equals(expectedReturnType)) { + try { + body = new String(((InputStream)body).readAllBytes(), StandardCharsets.UTF_8); + } catch (IOException e) { + throw new DoclingServeClientException(e); + } + } throw new ValidationException( - readValue(body, ValidationError.class), + readValue(body.toString(), ValidationError.class), "An error occurred while making %s request to %s".formatted(request.method(), request.uri()) ); } else if (statusCode >= 400) { // Handle errors // The Java HTTPClient doesn't throw exceptions on error codes - throw new DoclingServeClientException("An error occurred: %s".formatted(body), statusCode, body); + if(StreamResponse.class.equals(expectedReturnType)) { + try { + body = new String(((InputStream)body).readAllBytes(), StandardCharsets.UTF_8); + } catch (IOException e) { + throw new DoclingServeClientException(e); + } + } + throw new DoclingServeClientException("An error occurred: %s".formatted(body.toString()), statusCode, body.toString()); } - return readValue(body, expectedReturnType); + if(StreamResponse.class.equals(expectedReturnType)) { + return (T) StreamResponse + .builder() + .headers(headerName -> response.headers().firstValue(headerName)) + .body((InputStream)body) + .build(); + } else { + return readValue(body.toString(), expectedReturnType); + } } @Override @@ -500,7 +550,7 @@ public B readTimeout(Duration readTimeout) { * Sets the polling interval for async operations. * *

This configures how frequently the client will check the status of async - * conversion tasks when using {@link DoclingServeApi#convertSourceAsync(ConvertDocumentRequest)} (ConvertDocumentRequest)}. + * conversion tasks when using {@link DoclingServeApi#convertSourceAsync(ConvertDocumentRequest)} (ConvertDocumentRequest). * * @param asyncPollInterval the polling interval (must not be null or negative) * @return this builder instance for method chaining @@ -515,7 +565,7 @@ public B asyncPollInterval(Duration asyncPollInterval) { * Sets the timeout for async operations. * *

This configures the maximum time to wait for an async conversion task to complete - * when using {@link DoclingServeApi#convertSourceAsync(ConvertDocumentRequest)} (ConvertDocumentRequest)}. + * when using {@link DoclingServeApi#convertSourceAsync(ConvertDocumentRequest)} (ConvertDocumentRequest). * * @param asyncTimeout the timeout duration (must not be null or negative) * @return this builder instance for method chaining diff --git a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/DoclingServeJackson2Client.java b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/DoclingServeJackson2Client.java index f7942f14..db3bbd74 100644 --- a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/DoclingServeJackson2Client.java +++ b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/DoclingServeJackson2Client.java @@ -76,7 +76,6 @@ public static final class Builder extends DoclingServeClientBuilder 1; + boolean isRemoteTarget = request.getTarget() instanceof S3Target || request.getTarget() instanceof PutTarget; + boolean isZipTarget = request.getTarget() instanceof ZipTarget; + + if((hasMultipleSources && !isRemoteTarget) || isZipTarget) { + StreamResponse response = this.httpOperations + .executePostWithStreamResponse(createRequestContext(uri, request, + StreamResponse.class)); + String fileName = Utils.getFileName(response.getHeaders()).orElse("converted_docs.zip"); + return ZipArchiveConvertDocumentResponse + .builder().fileName(fileName) + .inputStream(response.getBody()) + .build(); + } else { + return this.httpOperations.executePost(createRequestContext(uri, request, + ConvertDocumentResponse.class)); + } } - private RequestContext createRequestContext(String uri, I request) { - return RequestContext.builder() + private RequestContext createRequestContext(String uri, I request, Class responseType) { + return RequestContext.builder() .request(request) - .responseType(ConvertDocumentResponse.class) + .responseType(responseType) .uri(uri) .build(); } diff --git a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/HttpOperations.java b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/HttpOperations.java index 0c846acf..2250b641 100644 --- a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/HttpOperations.java +++ b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/HttpOperations.java @@ -6,6 +6,21 @@ * implement these operations for specific use cases. */ public abstract class HttpOperations { + + /** + * Content-Type header key + */ + public static final String CONTENT_TYPE_HEADER = "Content-Type"; + /** + * Content-Type header value for JSON body + */ + public static final String CONTENT_TYPE_JSON = "application/json"; + + /** + * Content-Type header value for ZIP binary body + */ + public static final String CONTENT_TYPE_ZIP = "application/zip"; + /** * The header name used to specify the API key in HTTP requests. * This constant is commonly utilized in authentication mechanisms @@ -24,6 +39,16 @@ public abstract class HttpOperations { */ protected abstract O executeGet(RequestContext requestContext); + /** + * Executes an HTTP GET request using the details specified in the provided {@code RequestContext}. + * + * @param the type of the request payload + * @param requestContext the context containing details such as the URI, request payload, + * and expected response type of the GET operation + * @return an instance of the {@link StreamResponse}, which represents the response. + */ + protected abstract StreamResponse executeGetWithStreamResponse(RequestContext requestContext); + /** * Executes an HTTP POST request using the details provided in the {@code RequestContext}. * This method is designed to be implemented by subclasses and facilitates sending POST requests @@ -36,4 +61,27 @@ public abstract class HttpOperations { * @return an instance of the response type {@code O}, which represents the deserialized response data */ protected abstract O executePost(RequestContext requestContext); + + /** + * Executes an HTTP POST request using the details provided in the {@code RequestContext}. + * This method is designed to be implemented by subclasses and facilitates sending POST requests + * with a specified request payload and receiving a stream response. + * + * @param the type of the request payload + * @param requestContext the context containing details such as the URI, request payload, and + * expected response type of the POST operation + * @return an instance of the {@link StreamResponse}, which represents the response. + */ + protected abstract StreamResponse executePostWithStreamResponse(RequestContext requestContext); + + /** + * Reads and deserializes the given JSON string into an instance of the specified type. + * + * @param json the JSON string to deserialize; must not be {@code null} + * @param valueType the {@link Class} of the target type; must not be {@code null} + * @param the type of the object to be deserialized + * @return an instance of {@code T} deserialized from the provided JSON + * @throws RuntimeException if the JSON parsing fails + */ + protected abstract T readValue(String json, Class valueType); } diff --git a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/StreamResponse.java b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/StreamResponse.java new file mode 100644 index 00000000..6ee33d0d --- /dev/null +++ b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/StreamResponse.java @@ -0,0 +1,67 @@ +package ai.docling.serve.client.operations; + +import java.io.InputStream; +import java.util.Optional; + +/** + * Wrapper for HTTP responses containing binary stream data. + * Provides an abstraction layer to decouple from specific HTTP client implementations. + */ +public class StreamResponse { + private final InputStream body; + private final ResponseHeaders headers; + + private StreamResponse(Builder builder) { + this.body = builder.body; + this.headers = builder.headers; + } + + public InputStream getBody() { return body; } + + + public ResponseHeaders getHeaders() { return headers; } + + public static Builder builder() { return new Builder(); } + + public Builder toBuilder() { return new Builder(this); } + + public static class Builder { + private InputStream body; + private ResponseHeaders headers; + + public Builder() {} + + public Builder(StreamResponse streamResponse) { + this.body = streamResponse.body; + this.headers = streamResponse.headers; + } + + public Builder body(InputStream body) { + this.body = body; + return this; + } + + public Builder headers(ResponseHeaders headers) { + this.headers = headers; + return this; + } + + public StreamResponse build() { + return new StreamResponse(this); + } + } + + /** + * Abstraction for HTTP response headers. + */ + @FunctionalInterface + public interface ResponseHeaders { + /** + * Gets the first value of the specified header. + * + * @param headerName the name of the header + * @return an Optional containing the first header value, or empty if not found + */ + Optional getFirstValue(String headerName); + } +} diff --git a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/TaskOperations.java b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/TaskOperations.java index 898957ef..4bf0702a 100644 --- a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/TaskOperations.java +++ b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/operations/TaskOperations.java @@ -1,12 +1,18 @@ package ai.docling.serve.client.operations; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + import ai.docling.serve.api.DoclingServeTaskApi; import ai.docling.serve.api.chunk.response.ChunkDocumentResponse; import ai.docling.serve.api.convert.response.ConvertDocumentResponse; +import ai.docling.serve.api.convert.response.ZipArchiveConvertDocumentResponse; import ai.docling.serve.api.task.request.TaskResultRequest; import ai.docling.serve.api.task.request.TaskStatusPollRequest; import ai.docling.serve.api.task.response.TaskStatusPollResponse; import ai.docling.serve.api.util.ValidationUtils; +import ai.docling.serve.client.DoclingServeClientException; +import ai.docling.serve.client.util.Utils; /** * Base class for task API operations. Provides operations for managing and querying @@ -31,7 +37,7 @@ public TaskOperations(HttpOperations httpOperations) { * unique task identifier and optional wait time for polling. * Must not be null. * @return a {@link TaskStatusPollResponse} containing the current status of - * the task, its position in the queue, and any associated metadata. + * the task, its position in the queue, and any associated metadata. * @throws IllegalArgumentException if the {@code request} is null. */ public TaskStatusPollResponse pollTaskStatus(TaskStatusPollRequest request) { @@ -46,21 +52,39 @@ public TaskStatusPollResponse pollTaskStatus(TaskStatusPollRequest request) { } /** - * Retrieves the result of a completed task identified by the specified task ID. + * Retrieves the result of a completed convert task identified by the specified task ID. * * This method sends a GET request to fetch the result of a task that has been processed. - * The response includes details about the converted document, processing time, status, - * and any potential errors or additional metadata related to the task. * * @param request an instance of {@link TaskResultRequest} containing the unique task * identifier. Must not be null. * @return a {@link ConvertDocumentResponse} containing details about the converted - * document, processing time, status, and any associated errors or metadata. + * document, processing time, status, and any associated errors or metadata. * @throws IllegalArgumentException if {@code request} is null. */ public ConvertDocumentResponse convertTaskResult(TaskResultRequest request) { ValidationUtils.ensureNotNull(request, "request"); - return this.httpOperations.executeGet(createRequestContext("/v1/result/%s".formatted(request.getTaskId()), ConvertDocumentResponse.class)); + StreamResponse response = this.httpOperations + .executeGetWithStreamResponse(createRequestContext("/v1/result/%s".formatted(request.getTaskId()), StreamResponse.class)); + switch (Utils.getContentType(response.getHeaders()).orElse("Unknown Content-Type")) { + case HttpOperations.CONTENT_TYPE_JSON -> { + try { + return httpOperations + .readValue(new String(response.getBody().readAllBytes(), StandardCharsets.UTF_8) + , ConvertDocumentResponse.class); + } catch (IOException e) { + throw new DoclingServeClientException(e); + } + } + case HttpOperations.CONTENT_TYPE_ZIP -> { + String fileName = Utils.getFileName(response.getHeaders()).orElse("converted_docs.zip"); + return ZipArchiveConvertDocumentResponse + .builder().fileName(fileName) + .inputStream(response.getBody()) + .build(); + } + default -> throw new DoclingServeClientException(null, "Content-Type missing in task api response"); + } } /** @@ -73,7 +97,7 @@ public ConvertDocumentResponse convertTaskResult(TaskResultRequest request) { * @param request an instance of {@link TaskResultRequest} containing the unique task * identifier. Must not be null. * @return a {@link ChunkDocumentResponse} containing details about the chunks, - * documents, processing time, and any associated metadata. + * documents, processing time, and any associated metadata. * @throws IllegalArgumentException if {@code request} is null. */ public ChunkDocumentResponse chunkTaskResult(TaskResultRequest request) { diff --git a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/util/Utils.java b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/util/Utils.java new file mode 100644 index 00000000..ea83ad8d --- /dev/null +++ b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/util/Utils.java @@ -0,0 +1,30 @@ +package ai.docling.serve.client.util; + +import java.util.Optional; + +import ai.docling.serve.client.operations.HttpOperations; +import ai.docling.serve.client.operations.StreamResponse; + +public class Utils { + + public static Optional getFileName(StreamResponse.ResponseHeaders headers) { + return headers + .getFirstValue("Content-Disposition") + .filter(ai.docling.serve.api.util.Utils::isNotNullOrBlank) + .map(contentDisposition -> { + int filenameIndex = contentDisposition.indexOf("filename="); + if (filenameIndex==-1) { + return null; + } + + String fileName = contentDisposition.substring(filenameIndex + "filename=".length()); + return fileName.replaceAll("^\"|\"$", "").trim(); + }) + .filter(ai.docling.serve.api.util.Utils::isNotNullOrBlank); + } + + public static Optional getContentType(StreamResponse.ResponseHeaders headers) { + return headers.getFirstValue(HttpOperations.CONTENT_TYPE_HEADER) + .filter(ai.docling.serve.api.util.Utils::isNotNullOrBlank); + } +} diff --git a/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/util/package-info.java b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/util/package-info.java new file mode 100644 index 00000000..449971ae --- /dev/null +++ b/docling-serve/docling-serve-client/src/main/java/ai/docling/serve/client/util/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package ai.docling.serve.client.util; + +import org.jspecify.annotations.NullMarked; diff --git a/docling-serve/docling-serve-client/src/test/java/ai/docling/serve/client/AbstractDoclingServeClientTests.java b/docling-serve/docling-serve-client/src/test/java/ai/docling/serve/client/AbstractDoclingServeClientTests.java index 3acfbbd2..85783935 100644 --- a/docling-serve/docling-serve-client/src/test/java/ai/docling/serve/client/AbstractDoclingServeClientTests.java +++ b/docling-serve/docling-serve-client/src/test/java/ai/docling/serve/client/AbstractDoclingServeClientTests.java @@ -17,6 +17,7 @@ import static org.awaitility.Awaitility.await; import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Method; import java.net.URI; import java.net.http.HttpClient; @@ -33,8 +34,12 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.Flow.Subscriber; import java.util.concurrent.atomic.AtomicReference; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import org.assertj.core.api.InstanceOfAssertFactories; import org.jspecify.annotations.Nullable; @@ -63,17 +68,25 @@ import ai.docling.serve.api.clear.response.ClearResponse; import ai.docling.serve.api.convert.request.ConvertDocumentRequest; import ai.docling.serve.api.convert.request.options.ConvertDocumentOptions; +import ai.docling.serve.api.convert.request.options.ImageRefMode; import ai.docling.serve.api.convert.request.options.OutputFormat; import ai.docling.serve.api.convert.request.options.TableFormerMode; import ai.docling.serve.api.convert.request.source.HttpSource; import ai.docling.serve.api.convert.request.source.S3Source; +import ai.docling.serve.api.convert.request.target.PutTarget; import ai.docling.serve.api.convert.request.target.S3Target; +import ai.docling.serve.api.convert.request.target.ZipTarget; import ai.docling.serve.api.convert.response.ConvertDocumentResponse; +import ai.docling.serve.api.convert.response.InBodyConvertDocumentResponse; +import ai.docling.serve.api.convert.response.PreSignedUrlConvertDocumentResponse; +import ai.docling.serve.api.convert.response.ResponseType; +import ai.docling.serve.api.convert.response.ZipArchiveConvertDocumentResponse; import ai.docling.serve.api.health.HealthCheckResponse; import ai.docling.serve.api.task.request.TaskResultRequest; import ai.docling.serve.api.task.request.TaskStatusPollRequest; import ai.docling.serve.api.task.response.TaskStatus; import ai.docling.serve.api.task.response.TaskStatusPollResponse; +import ai.docling.serve.api.util.FileUtils; import ai.docling.serve.api.validation.ValidationError; import ai.docling.serve.api.validation.ValidationErrorContext; import ai.docling.serve.api.validation.ValidationErrorDetail; @@ -269,7 +282,7 @@ void convertUrlTaskResult() throws IOException, InterruptedException { .build(); var result = getDoclingClient().convertTaskResult(request); - ConvertTests.assertConvertHttpSource(result); + ConvertTests.assertConvertSingleHttpSourceWithDefaultTarget(result); } @Test @@ -439,17 +452,34 @@ void shouldSuccessfullyCallHealthEndpoint() { @Nested class ConvertTests { - static void assertConvertHttpSource(ConvertDocumentResponse response) { + static void assertConvertSingleHttpSourceWithDefaultTarget(ConvertDocumentResponse response) { assertThat(response).isNotNull(); - assertThat(response.getStatus()).isNotEmpty(); - assertThat(response.getDocument()).isNotNull(); - assertThat(response.getDocument().getFilename()).isNotEmpty(); - - if (response.getProcessingTime() != null) { - assertThat(response.getProcessingTime()).isPositive(); + assertThat(response.getResponseType().equals(ResponseType.InBodyConvertDocumentResponse)).isTrue(); + var inBodyResponse = (InBodyConvertDocumentResponse)response; + assertThat(inBodyResponse.getStatus()).isNotEmpty(); + assertThat(inBodyResponse.getDocument()).isNotNull(); + assertThat(inBodyResponse.getDocument().getFilename()).isNotEmpty(); + + if (inBodyResponse.getProcessingTime() != null) { + assertThat(inBodyResponse.getProcessingTime()).isPositive(); } - assertThat(response.getDocument().getMarkdownContent()).isNotEmpty(); + assertThat(inBodyResponse.getDocument().getMarkdownContent()).isNotEmpty(); + } + + static void assertZipArchiveEntries(InputStream inputStream, Set expectedEntries) { + Set actualEntries = new TreeSet<>(); + try (ZipInputStream zipInputStream = new ZipInputStream(inputStream)) { + ZipEntry entry; + while ((entry = zipInputStream.getNextEntry()) != null) { + actualEntries.add(entry.getName()); + LOG.info("Found entry in ZIP: {} (size: {} bytes)", entry.getName(), entry.getSize()); + zipInputStream.closeEntry(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + assertThat(actualEntries).containsExactlyInAnyOrderElementsOf(expectedEntries); } @Test @@ -497,6 +527,59 @@ void shouldThrowValidationError() { ); } + @Test + void shouldConvertSourceWithPutTargetSuccessfully() { + var request = ConvertDocumentRequest.builder() + .source( + HttpSource + .builder() + .url(URI.create("https://docs.arconia.io/arconia-cli/latest/development/dev/")) + .build() + ) + .target( + PutTarget.builder().url(URI.create("https://github.com/docling-project/docling-java/save")).build() + ).build(); + + var wireMockServer = getWiremockServer(); + + wireMockServer.stubFor( + post("/v1/convert/source") + .withRequestBody(equalToJson(writeValueAsString(request))) + .withHeader("Content-Type", equalTo("application/json")) + .withHeader("Accept", equalTo("application/json")) + .willReturn(okJson(""" + { + "processing_time": 7, + "num_converted": 10, + "num_succeeded": 5, + "num_failed": 5 + } + """)) + ); + + var response = getDoclingClient(false, true).convertSource(request); + assertThat(response).isNotNull(); + assertThat(response.getResponseType().equals(ResponseType.PreSignedUrlConvertDocumentResponse)).isTrue(); + var preSignedUrlResponse = (PreSignedUrlConvertDocumentResponse)response; + + assertThat(preSignedUrlResponse.getNumConverted()).isEqualTo(10); + assertThat(preSignedUrlResponse.getNumSucceeded()).isEqualTo(5); + assertThat(preSignedUrlResponse.getNumFailed()).isEqualTo(5); + assertThat(preSignedUrlResponse.getProcessingTime()).isPositive().isEqualTo(7); + + wireMockServer.verify( + 1, + postRequestedFor(urlPathEqualTo("/v1/convert/source")) + .withHeader("Content-Type", equalTo("application/json")) + .withRequestBody( + matchingJsonPath("$.sources[0].kind", equalTo("http")) + .and(matchingJsonPath("$.sources[0].url", equalTo("https://docs.arconia.io/arconia-cli/latest/development/dev/"))) + .and(matchingJsonPath("$.target.kind", equalTo("put"))) + .and(matchingJsonPath("$.target.url", equalTo("https://github.com/docling-project/docling-java/save"))) + ) + ); + } + @Test void shouldConvertS3SourceSuccessfully() { // Need to use Wiremock here rather than a "real" backend because Docling Serve requires kubeflow @@ -528,7 +611,14 @@ void shouldConvertS3SourceSuccessfully() { .withRequestBody(equalToJson(writeValueAsString(request))) .withHeader("Content-Type", equalTo("application/json")) .withHeader("Accept", equalTo("application/json")) - .willReturn(okJson("{}")) + .willReturn(okJson(""" + { + "processing_time": 7, + "num_converted": 10, + "num_succeeded": 5, + "num_failed": 5 + } + """)) ); var response = getDoclingClient(false, true).convertSource(request); @@ -556,29 +646,32 @@ void shouldConvertS3SourceSuccessfully() { } @Test - void shouldConvertHttpSourceSuccessfully() { + void shouldConvertSingleHttpSourceWithDefaultTargetSuccessfully() { var request = ConvertDocumentRequest.builder() .source(HttpSource.builder().url(URI.create("https://docs.arconia.io/arconia-cli/latest/development/dev/")).build()) .build(); var response = getDoclingClient().convertSource(request); - assertConvertHttpSource(response); + assertConvertSingleHttpSourceWithDefaultTarget(response); } @Test void shouldConvertFileSuccessfully() { var response = getDoclingClient().convertFiles(Path.of("src", "test", "resources", "story.pdf")); - + assertThat(ResponseType.InBodyConvertDocumentResponse.equals(response.getResponseType())).isTrue(); assertThat(response).isNotNull(); - assertThat(response.getStatus()).isNotEmpty(); - assertThat(response.getDocument()).isNotNull(); - assertThat(response.getDocument().getFilename()).isEqualTo("story.pdf"); - if (response.getProcessingTime()!=null) { - assertThat(response.getProcessingTime()).isPositive(); + var inBodyResponse = (InBodyConvertDocumentResponse)response; + + assertThat(inBodyResponse.getStatus()).isNotEmpty(); + assertThat(inBodyResponse.getDocument()).isNotNull(); + assertThat(inBodyResponse.getDocument().getFilename()).isEqualTo("story.pdf"); + + if (inBodyResponse.getProcessingTime()!=null) { + assertThat(inBodyResponse.getProcessingTime()).isPositive(); } - assertThat(response.getDocument().getMarkdownContent()).isNotEmpty(); + assertThat(inBodyResponse.getDocument().getMarkdownContent()).isNotEmpty(); } @Test @@ -597,9 +690,13 @@ void shouldHandleConversionWithDifferentDocumentOptions() { var response = getDoclingClient().convertSource(request); + assertThat(ResponseType.InBodyConvertDocumentResponse.equals(response.getResponseType())).isTrue(); assertThat(response).isNotNull(); - assertThat(response.getStatus()).isNotEmpty(); - assertThat(response.getDocument()).isNotNull(); + + var inBodyResponse = (InBodyConvertDocumentResponse)response; + + assertThat(inBodyResponse.getStatus()).isNotEmpty(); + assertThat(inBodyResponse.getDocument()).isNotNull(); } @Test @@ -615,11 +712,15 @@ void shouldHandleResponseWithDoclingDocument() { ConvertDocumentResponse response = getDoclingClient().convertSource(request); + assertThat(ResponseType.InBodyConvertDocumentResponse.equals(response.getResponseType())).isTrue(); assertThat(response).isNotNull(); - assertThat(response.getStatus()).isNotEmpty(); - assertThat(response.getDocument()).isNotNull(); - DoclingDocument doclingDocument = response.getDocument().getJsonContent(); + var inBodyResponse = (InBodyConvertDocumentResponse)response; + + assertThat(inBodyResponse.getStatus()).isNotEmpty(); + assertThat(inBodyResponse.getDocument()).isNotNull(); + + DoclingDocument doclingDocument = inBodyResponse.getDocument().getJsonContent(); assertThat(doclingDocument).isNotNull(); assertThat(doclingDocument.getName()).isNotEmpty(); assertThat(doclingDocument.getTexts().get(0).getLabel()).isEqualTo(DocItemLabel.TITLE); @@ -633,21 +734,30 @@ void shouldConvertSourceAsync() { ConvertDocumentResponse response = getDoclingClient().convertSourceAsync(request).toCompletableFuture().join(); + assertThat(ResponseType.InBodyConvertDocumentResponse.equals(response.getResponseType())).isTrue(); + assertThat(response).isInstanceOf(InBodyConvertDocumentResponse.class); assertThat(response).isNotNull(); - assertThat(response.getStatus()).isNotEmpty(); - assertThat(response.getDocument()).isNotNull(); - assertThat(response.getDocument().getMarkdownContent()).isNotEmpty(); + + var inBodyResponse = (InBodyConvertDocumentResponse)response; + + assertThat(inBodyResponse.getStatus()).isNotEmpty(); + assertThat(inBodyResponse.getDocument()).isNotNull(); + assertThat(inBodyResponse.getDocument().getMarkdownContent()).isNotEmpty(); } @Test void shouldConvertFileAsync() { ConvertDocumentResponse response = getDoclingClient().convertFilesAsync(Path.of("src", "test", "resources", "story.pdf")).toCompletableFuture().join(); + assertThat(ResponseType.InBodyConvertDocumentResponse.equals(response.getResponseType())).isTrue(); assertThat(response).isNotNull(); - assertThat(response.getStatus()).isNotEmpty(); - assertThat(response.getDocument()).isNotNull(); - assertThat(response.getDocument().getFilename()).isEqualTo("story.pdf"); - assertThat(response.getDocument().getMarkdownContent()).isNotEmpty(); + + var inBodyResponse = (InBodyConvertDocumentResponse)response; + + assertThat(inBodyResponse.getStatus()).isNotEmpty(); + assertThat(inBodyResponse.getDocument()).isNotNull(); + assertThat(inBodyResponse.getDocument().getFilename()).isEqualTo("story.pdf"); + assertThat(inBodyResponse.getDocument().getMarkdownContent()).isNotEmpty(); } @Test @@ -666,9 +776,15 @@ void shouldHandleAsyncConversionWithDifferentDocumentOptions() { ConvertDocumentResponse response = getDoclingClient().convertSourceAsync(request).toCompletableFuture().join(); + assertThat(ResponseType.InBodyConvertDocumentResponse.equals(response.getResponseType())).isTrue(); assertThat(response).isNotNull(); - assertThat(response.getStatus()).isNotEmpty(); - assertThat(response.getDocument()).isNotNull(); + + var inBodyResponse = (InBodyConvertDocumentResponse)response; + + + assertThat(inBodyResponse).isNotNull(); + assertThat(inBodyResponse.getStatus()).isNotEmpty(); + assertThat(inBodyResponse.getDocument()).isNotNull(); } @Test @@ -679,12 +795,170 @@ void shouldChainAsyncOperations() { // Test chaining with thenApply String markdownContent = getDoclingClient().convertSourceAsync(request) - .thenApply(response -> response.getDocument().getMarkdownContent()) + .thenApply(response -> ((InBodyConvertDocumentResponse)response).getDocument().getMarkdownContent()) .toCompletableFuture().join(); assertThat(markdownContent).isNotEmpty(); } + @Test + void shouldConvertSingleFileSourceWithZipTargetAsync() { + Path[] files = new Path[]{Path.of("src", "test", "resources", "2408.09869.pdf")}; + + var requestBuilder = ConvertDocumentRequest + .builder() + .target(ZipTarget.builder().build()); + + FileUtils.createFileSources(files) + .forEach(requestBuilder::source); + + var request = requestBuilder.build(); + + var response = getDoclingClient() + .convertSourceAsync(request).toCompletableFuture().join(); + + assertThat(response).isNotNull(); + assertThat(response.getResponseType().equals(ResponseType.ZipArchiveConvertDocumentResponse)).isTrue(); + assertThat(response).isInstanceOf(ZipArchiveConvertDocumentResponse.class); + assertThat(((ZipArchiveConvertDocumentResponse)response).getFileName()).isEqualTo("converted_docs.zip"); + assertThat(((ZipArchiveConvertDocumentResponse)response).getInputStream()).isNotNull(); + assertZipArchiveEntries(((ZipArchiveConvertDocumentResponse)response).getInputStream(), Set.of("2408.09869.md")); + } + + @Test + void shouldConvertSingleFileSourceWithZipTargetAndReferencedImageExportModeAsync() { + Path[] files = new Path[]{Path.of("src", "test", "resources", "2408.09869.pdf")}; + + var requestBuilder = ConvertDocumentRequest + .builder() + .target(ZipTarget.builder().build()) + .options(ConvertDocumentOptions.builder().imageExportMode(ImageRefMode.REFERENCED).build()); + + FileUtils.createFileSources(files) + .forEach(requestBuilder::source); + + var request = requestBuilder.build(); + + var response = getDoclingClient() + .convertSourceAsync(request).toCompletableFuture().join(); + + assertThat(response).isNotNull(); + assertThat(response.getResponseType().equals(ResponseType.ZipArchiveConvertDocumentResponse)).isTrue(); + assertThat(response).isInstanceOf(ZipArchiveConvertDocumentResponse.class); + assertThat(((ZipArchiveConvertDocumentResponse)response).getFileName()).isEqualTo("converted_docs.zip"); + assertThat(((ZipArchiveConvertDocumentResponse)response).getInputStream()).isNotNull(); + assertZipArchiveEntries(((ZipArchiveConvertDocumentResponse)response).getInputStream(), + Set.of("2408.09869.md", + "artifacts/", + "artifacts/image_000000_4f05ea6de89ce20493a5d9cc2305a4feb948c7bb794d7b81ee29554ec56b8445.png")); + } + + @Test + void shouldConvertMultipleFileSourcesAsync(){ + Path[] files = new Path[]{Path.of("src", "test", "resources", "2408.09869.pdf"), + Path.of("src", "test", "resources", "story.pdf")}; + + var requestBuilder = ConvertDocumentRequest + .builder(); + + FileUtils.createFileSources(files) + .forEach(requestBuilder::source); + + var request = requestBuilder.build(); + + var response = getDoclingClient() + .convertSourceAsync(request).toCompletableFuture().join(); + + assertThat(response).isNotNull(); + assertThat(response.getResponseType().equals(ResponseType.ZipArchiveConvertDocumentResponse)).isTrue(); + assertThat(response).isInstanceOf(ZipArchiveConvertDocumentResponse.class); + assertThat(((ZipArchiveConvertDocumentResponse)response).getFileName()).isEqualTo("converted_docs.zip"); + assertThat(((ZipArchiveConvertDocumentResponse)response).getInputStream()).isNotNull(); + assertZipArchiveEntries(((ZipArchiveConvertDocumentResponse)response).getInputStream(), + Set.of("2408.09869.md", "story.md")); + } + + @Test + void shouldConvertMultipleFileSourcesWithReferencedImageExportModeAsync(){ + Path[] files = new Path[]{Path.of("src", "test", "resources", "2408.09869.pdf"), + Path.of("src", "test", "resources", "story.pdf")}; + + var requestBuilder = ConvertDocumentRequest + .builder() + .options(ConvertDocumentOptions.builder().imageExportMode(ImageRefMode.REFERENCED).build()); + + FileUtils.createFileSources(files) + .forEach(requestBuilder::source); + + var request = requestBuilder.build(); + + var response = getDoclingClient() + .convertSourceAsync(request).toCompletableFuture().join(); + + assertThat(response).isNotNull(); + assertThat(response.getResponseType().equals(ResponseType.ZipArchiveConvertDocumentResponse)).isTrue(); + assertThat(response).isInstanceOf(ZipArchiveConvertDocumentResponse.class); + assertThat(((ZipArchiveConvertDocumentResponse)response).getFileName()).isEqualTo("converted_docs.zip"); + assertThat(((ZipArchiveConvertDocumentResponse)response).getInputStream()).isNotNull(); + assertZipArchiveEntries(((ZipArchiveConvertDocumentResponse)response).getInputStream(), + Set.of("2408.09869.md", "story.md", "artifacts/", + "artifacts/image_000000_4f05ea6de89ce20493a5d9cc2305a4feb948c7bb794d7b81ee29554ec56b8445.png")); + } + + @Test + void shouldConvertMultipleFileSourcesWithInBodyTargetAsync() { + Path[] files = new Path[]{Path.of("src", "test", "resources", "2408.09869.pdf"), + Path.of("src", "test", "resources", "story.pdf")}; + + var requestBuilder = ConvertDocumentRequest + .builder() + .target(ZipTarget.builder().build()); + + FileUtils.createFileSources(files) + .forEach(requestBuilder::source); + + var request = requestBuilder.build(); + + var response = getDoclingClient() + .convertSourceAsync(request).toCompletableFuture().join(); + + assertThat(response).isNotNull(); + assertThat(response.getResponseType().equals(ResponseType.ZipArchiveConvertDocumentResponse)).isTrue(); + assertThat(response).isInstanceOf(ZipArchiveConvertDocumentResponse.class); + assertThat(((ZipArchiveConvertDocumentResponse)response).getFileName()).isEqualTo("converted_docs.zip"); + assertThat(((ZipArchiveConvertDocumentResponse)response).getInputStream()).isNotNull(); + assertZipArchiveEntries(((ZipArchiveConvertDocumentResponse)response).getInputStream(), + Set.of("2408.09869.md", "story.md")); + } + + @Test + void shouldConvertMultipleFileSourcesWithInBodyTargetAndReferencedImageExportModeAsync() { + Path[] files = new Path[]{Path.of("src", "test", "resources", "2408.09869.pdf"), + Path.of("src", "test", "resources", "story.pdf")}; + + var requestBuilder = ConvertDocumentRequest + .builder() + .target(ZipTarget.builder().build()) + .options(ConvertDocumentOptions.builder().imageExportMode(ImageRefMode.REFERENCED).build()); + + FileUtils.createFileSources(files) + .forEach(requestBuilder::source); + + var request = requestBuilder.build(); + + var response = getDoclingClient() + .convertSourceAsync(request).toCompletableFuture().join(); + + assertThat(response).isNotNull(); + assertThat(response.getResponseType().equals(ResponseType.ZipArchiveConvertDocumentResponse)).isTrue(); + assertThat(response).isInstanceOf(ZipArchiveConvertDocumentResponse.class); + assertThat(((ZipArchiveConvertDocumentResponse)response).getFileName()).isEqualTo("converted_docs.zip"); + assertThat(((ZipArchiveConvertDocumentResponse)response).getInputStream()).isNotNull(); + assertZipArchiveEntries(((ZipArchiveConvertDocumentResponse)response).getInputStream(), + Set.of("2408.09869.md", "story.md", "artifacts/", + "artifacts/image_000000_4f05ea6de89ce20493a5d9cc2305a4feb948c7bb794d7b81ee29554ec56b8445.png")); + } + @Test void convertFilesNullFiles() { assertThatExceptionOfType(IllegalArgumentException.class) diff --git a/docling-serve/docling-serve-client/src/test/resources/2408.09869.pdf b/docling-serve/docling-serve-client/src/test/resources/2408.09869.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5c3267de606142027fd7e894ea7824509f3e412d GIT binary patch literal 171833 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 - assertThat(o) - .as("Document should have a filename") - .asString() - .isNotEmpty(), - atIndex(0) - ) - .satisfies(o -> - assertThat(o) - .as("Document should have markdown content") - .asString() - .isNotEmpty(), - atIndex(1) - ) - .satisfies(o -> - assertThat(o) - .as("Document should have text content") - .asString() - .isNotEmpty(), - atIndex(2) - ) - .satisfies(o -> - assertThat(o) - .as("Document should have JSON content") - .asInstanceOf(InstanceOfAssertFactories.type(DoclingDocument.class)) - .isNotNull(), - atIndex(3) - ); + switch(response.getResponseType()) { + case InBodyConvertDocumentResponse -> { + var inBodyResponse = (InBodyConvertDocumentResponse)response; + Log.debugf("Response: %s", inBodyResponse); + + assertThat(inBodyResponse) + .as("Response should not be null") + .isNotNull(); + + assertThat(inBodyResponse.getStatus()) + .as("Response status should not be null or empty") + .isNotEmpty(); + + assertThat(inBodyResponse.getErrors()) + .as("Response should not have errors") + .isNullOrEmpty(); + + assertThat(inBodyResponse.getDocument()) + .as("Response should have a valid document") + .isNotNull() + .extracting( + DocumentResponse::getFilename, + DocumentResponse::getMarkdownContent, + DocumentResponse::getTextContent, + DocumentResponse::getJsonContent + ) + .satisfies(o -> + assertThat(o) + .as("Document should have a filename") + .asString() + .isNotEmpty(), + atIndex(0) + ) + .satisfies(o -> + assertThat(o) + .as("Document should have markdown content") + .asString() + .isNotEmpty(), + atIndex(1) + ) + .satisfies(o -> + assertThat(o) + .as("Document should have text content") + .asString() + .isNotEmpty(), + atIndex(2) + ) + .satisfies(o -> + assertThat(o) + .as("Document should have JSON content") + .asInstanceOf(InstanceOfAssertFactories.type(DoclingDocument.class)) + .isNotNull(), + atIndex(3) + ); + } + case PreSignedUrlConvertDocumentResponse -> { + var preSignedUrlResponse = (PreSignedUrlConvertDocumentResponse)response; + Log.debugf("Response: %s", preSignedUrlResponse); + } + case ZipArchiveConvertDocumentResponse -> {} + } } private void checkDoclingHealthy(DoclingServeApi doclingClient) { diff --git a/docs/src/doc/docs/docling-serve/serve-api.md b/docs/src/doc/docs/docling-serve/serve-api.md index ff97e14f..a8b4fcb0 100644 --- a/docs/src/doc/docs/docling-serve/serve-api.md +++ b/docs/src/doc/docs/docling-serve/serve-api.md @@ -59,7 +59,7 @@ import ai.docling.serve.api.convert.request.options.ConvertDocumentOptions; import ai.docling.serve.api.convert.request.options.OutputFormat; import ai.docling.serve.api.convert.request.source.HttpSource; import ai.docling.serve.api.convert.request.target.InBodyTarget; -import ai.docling.serve.api.convert.response.ConvertDocumentResponse; +import ai.docling.serve.api.convert.response.InBodyConvertDocumentResponse; DoclingServeApi api = DoclingServeApi.builder() .baseUrl("http://localhost:8000") // your Docling Serve URL @@ -78,7 +78,7 @@ ConvertDocumentRequest request = ConvertDocumentRequest.builder() .target(InBodyTarget.builder().build()) // get results in the HTTP response body .build(); -ConvertDocumentResponse response = api.convertSource(request); +InBodyConvertDocumentResponse response = (InBodyConvertDocumentResponse)api.convertSource(request); System.out.println(response.getDocument().getMarkdownContent()); ``` @@ -132,10 +132,12 @@ Options (`ai.docling.serve.api.convert.request.options.ConvertDocumentOptions`) Explore the `options` package for the full list of knobs you can turn. -### Responses: `ConvertDocumentResponse` and `DocumentResponse` - -- `ConvertDocumentResponse` contains the converted `document` (if any), `errors`, processing `status`, - total `processing_time`, and detailed `timings` map. +### Responses: `InBodyConvertDocumentResponse`, `PreSignedUrlConvertDocumentResponse`, `ZipArchiveConvertDocumentResponse` and `DocumentResponse` +- `InBodyConvertDocumentResponse` contains the converted `document` (if any), `errors`, processing `status`, + total `processing_time`, and detailed `timings` map. +- `PreSignedUrlConvertDocumentResponse` contains processing statistics - total `processing_time` and conversion metrics + `num_converted`, `num_succeeded`, `num_failed`. +- `ZipArchiveConvertDocumentResponse` contains `file_name` and an input stream for the archive. - `DocumentResponse` holds the actual content fields you requested, such as `md_content` (Markdown), `html_content`, `text_content`, and a `json_content` map. It also includes the `filename` and `doctags_content` when relevant. @@ -154,10 +156,10 @@ System.out.println("Service status: " + health.getStatus()); ## Error handling Conversion may succeed partially (e.g., some pages) while returning warnings or errors. Always inspect -`ConvertDocumentResponse#getErrors()` and consider `status`: +`InBodyConvertDocumentResponse#getErrors()` and consider `status`: ```java -ConvertDocumentResponse response = api.convertSource(request); +InBodyConvertDocumentResponse response = (InBodyConvertDocumentResponse)api.convertSource(request); if (response.getErrors() != null && !response.getErrors().isEmpty()) { response.getErrors().forEach(err -> diff --git a/docs/src/doc/docs/docling-serve/serve-client.md b/docs/src/doc/docs/docling-serve/serve-client.md index 952fd70c..112c833c 100644 --- a/docs/src/doc/docs/docling-serve/serve-client.md +++ b/docs/src/doc/docs/docling-serve/serve-client.md @@ -59,7 +59,7 @@ import ai.docling.serve.api.convert.request.options.ConvertDocumentOptions; import ai.docling.serve.api.convert.request.options.OutputFormat; import ai.docling.serve.api.convert.request.source.HttpSource; import ai.docling.serve.api.convert.request.target.InBodyTarget; -import ai.docling.serve.api.convert.response.ConvertDocumentResponse; +import ai.docling.serve.api.convert.response.InBodyConvertDocumentResponse; DoclingServeApi api = DoclingServeApi.builder() .baseUrl("http://localhost:8000") // your Docling Serve URL @@ -77,7 +77,7 @@ ConvertDocumentRequest request = ConvertDocumentRequest.builder() .target(InBodyTarget.builder().build()) .build(); -ConvertDocumentResponse response = api.convertSource(request); +InBodyConvertDocumentResponse response = (InBodyConvertDocumentResponse)api.convertSource(request); System.out.println(response.getDocument().getMarkdownContent()); ``` @@ -198,6 +198,7 @@ from `HttpClient`. Conversion may also return structured errors in the response `ConvertDocumentResponse#getErrors()` even when content is present: ```java +// InBodyConvertDocumentResponse var result = api.convertSource(request); if (result.getErrors() != null && !result.getErrors().isEmpty()) { result.getErrors().forEach(err -> diff --git a/docs/src/doc/docs/getting-started.md b/docs/src/doc/docs/getting-started.md index d895b206..65f046f6 100644 --- a/docs/src/doc/docs/getting-started.md +++ b/docs/src/doc/docs/getting-started.md @@ -6,7 +6,7 @@ Use the [`DoclingServeApi`](docling-serve/serve-api.md) to convert a document by import ai.docling.serve.api.DoclingServeApi; import ai.docling.serve.api.convert.request.ConvertDocumentRequest; import ai.docling.serve.api.convert.request.source.HttpSource; -import ai.docling.serve.api.convert.response.ConvertDocumentResponse; +import ai.docling.serve.api.convert.response.InBodyConvertDocumentResponse; DoclingServeApi doclingServeApi = DoclingServeApi.builder() .baseUrl("") @@ -20,7 +20,7 @@ ConvertDocumentRequest request = ConvertDocumentRequest.builder() ) .build(); -ConvertDocumentResponse response = doclingServeApi.convertSource(request); +InBodyConvertDocumentResponse response = (InBodyConvertDocumentResponse)doclingServeApi.convertSource(request); System.out.println(response.getDocument().getMarkdownContent()); ``` diff --git a/docs/src/doc/docs/testcontainers.md b/docs/src/doc/docs/testcontainers.md index 7c3ef733..949553ac 100644 --- a/docs/src/doc/docs/testcontainers.md +++ b/docs/src/doc/docs/testcontainers.md @@ -95,7 +95,7 @@ import ai.docling.serve.api.convert.request.options.ConvertDocumentOptions; import ai.docling.serve.api.convert.request.options.OutputFormat; import ai.docling.serve.api.convert.request.source.HttpSource; import ai.docling.serve.api.convert.request.target.InBodyTarget; -import ai.docling.serve.api.convert.response.ConvertDocumentResponse; +import ai.docling.serve.api.convert.response.InBodyConvertDocumentResponse; String baseUrl = docling.getApiUrl(); DoclingServeApi api = DoclingServeApi.builder() @@ -111,7 +111,7 @@ ConvertDocumentRequest request = ConvertDocumentRequest.builder() .target(InBodyTarget.builder().build()) .build(); -ConvertDocumentResponse response = api.convertSource(request); +InBodyConvertDocumentResponse response = (InBodyConvertDocumentResponse)api.convertSource(request); // Assert on response.getDocument().getMarkdownContent(), errors, timings, etc. ```