Skip to content

Commit 787e12b

Browse files
fix(client): return binary content from get /containers/{container_id}/files/{file_id}/content
1 parent 37aa563 commit 787e12b

File tree

7 files changed

+66
-39
lines changed

7 files changed

+66
-39
lines changed

.stats.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
configured_endpoints: 86
22
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai%2Fopenai-d4bcffecf0cdadf746faa6708ed1ec81fac451f9b857deabbab26f0a343b9314.yml
33
openapi_spec_hash: 7c54a18b4381248bda7cc34c52142615
4-
config_hash: 2102e4b25bbcab5d32d5ffa5d34daa0c
4+
config_hash: d23f847b9ebb3f427d0f198035bd3e9f

openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsync.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,30 @@ interface ContentServiceAsync {
1616
fun withRawResponse(): WithRawResponse
1717

1818
/** Retrieve Container File Content */
19-
fun retrieve(fileId: String, params: ContentRetrieveParams): CompletableFuture<Void?> =
19+
@MustBeClosed
20+
fun retrieve(fileId: String, params: ContentRetrieveParams): CompletableFuture<HttpResponse> =
2021
retrieve(fileId, params, RequestOptions.none())
2122

2223
/** @see [retrieve] */
24+
@MustBeClosed
2325
fun retrieve(
2426
fileId: String,
2527
params: ContentRetrieveParams,
2628
requestOptions: RequestOptions = RequestOptions.none(),
27-
): CompletableFuture<Void?> =
29+
): CompletableFuture<HttpResponse> =
2830
retrieve(params.toBuilder().fileId(fileId).build(), requestOptions)
2931

3032
/** @see [retrieve] */
31-
fun retrieve(params: ContentRetrieveParams): CompletableFuture<Void?> =
33+
@MustBeClosed
34+
fun retrieve(params: ContentRetrieveParams): CompletableFuture<HttpResponse> =
3235
retrieve(params, RequestOptions.none())
3336

3437
/** @see [retrieve] */
38+
@MustBeClosed
3539
fun retrieve(
3640
params: ContentRetrieveParams,
3741
requestOptions: RequestOptions = RequestOptions.none(),
38-
): CompletableFuture<Void?>
42+
): CompletableFuture<HttpResponse>
3943

4044
/**
4145
* A view of [ContentServiceAsync] that provides access to raw HTTP responses for each method.

openai-java-core/src/main/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncImpl.kt

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@ package com.openai.services.async.containers.files
55
import com.openai.core.ClientOptions
66
import com.openai.core.RequestOptions
77
import com.openai.core.checkRequired
8-
import com.openai.core.handlers.emptyHandler
98
import com.openai.core.handlers.errorHandler
10-
import com.openai.core.handlers.withErrorHandler
119
import com.openai.core.http.HttpMethod
1210
import com.openai.core.http.HttpRequest
1311
import com.openai.core.http.HttpResponse
1412
import com.openai.core.http.HttpResponse.Handler
15-
import com.openai.core.http.parseable
1613
import com.openai.core.prepareAsync
1714
import com.openai.models.ErrorObject
1815
import com.openai.models.containers.files.content.ContentRetrieveParams
@@ -31,17 +28,15 @@ class ContentServiceAsyncImpl internal constructor(private val clientOptions: Cl
3128
override fun retrieve(
3229
params: ContentRetrieveParams,
3330
requestOptions: RequestOptions,
34-
): CompletableFuture<Void?> =
31+
): CompletableFuture<HttpResponse> =
3532
// get /containers/{container_id}/files/{file_id}/content
36-
withRawResponse().retrieve(params, requestOptions).thenAccept {}
33+
withRawResponse().retrieve(params, requestOptions)
3734

3835
class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) :
3936
ContentServiceAsync.WithRawResponse {
4037

4138
private val errorHandler: Handler<ErrorObject?> = errorHandler(clientOptions.jsonMapper)
4239

43-
private val retrieveHandler: Handler<Void?> = emptyHandler().withErrorHandler(errorHandler)
44-
4540
override fun retrieve(
4641
params: ContentRetrieveParams,
4742
requestOptions: RequestOptions,
@@ -62,11 +57,9 @@ class ContentServiceAsyncImpl internal constructor(private val clientOptions: Cl
6257
.build()
6358
.prepareAsync(clientOptions, params, deploymentModel = null)
6459
val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions))
65-
return request
66-
.thenComposeAsync { clientOptions.httpClient.executeAsync(it, requestOptions) }
67-
.thenApply { response ->
68-
response.parseable { response.use { retrieveHandler.handle(it) } }
69-
}
60+
return request.thenComposeAsync {
61+
clientOptions.httpClient.executeAsync(it, requestOptions)
62+
}
7063
}
7164
}
7265
}

openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentService.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,29 @@ interface ContentService {
1515
fun withRawResponse(): WithRawResponse
1616

1717
/** Retrieve Container File Content */
18-
fun retrieve(fileId: String, params: ContentRetrieveParams) =
18+
@MustBeClosed
19+
fun retrieve(fileId: String, params: ContentRetrieveParams): HttpResponse =
1920
retrieve(fileId, params, RequestOptions.none())
2021

2122
/** @see [retrieve] */
23+
@MustBeClosed
2224
fun retrieve(
2325
fileId: String,
2426
params: ContentRetrieveParams,
2527
requestOptions: RequestOptions = RequestOptions.none(),
26-
) = retrieve(params.toBuilder().fileId(fileId).build(), requestOptions)
28+
): HttpResponse = retrieve(params.toBuilder().fileId(fileId).build(), requestOptions)
2729

2830
/** @see [retrieve] */
29-
fun retrieve(params: ContentRetrieveParams) = retrieve(params, RequestOptions.none())
31+
@MustBeClosed
32+
fun retrieve(params: ContentRetrieveParams): HttpResponse =
33+
retrieve(params, RequestOptions.none())
3034

3135
/** @see [retrieve] */
36+
@MustBeClosed
3237
fun retrieve(
3338
params: ContentRetrieveParams,
3439
requestOptions: RequestOptions = RequestOptions.none(),
35-
)
40+
): HttpResponse
3641

3742
/** A view of [ContentService] that provides access to raw HTTP responses for each method. */
3843
interface WithRawResponse {

openai-java-core/src/main/kotlin/com/openai/services/blocking/containers/files/ContentServiceImpl.kt

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,11 @@ package com.openai.services.blocking.containers.files
55
import com.openai.core.ClientOptions
66
import com.openai.core.RequestOptions
77
import com.openai.core.checkRequired
8-
import com.openai.core.handlers.emptyHandler
98
import com.openai.core.handlers.errorHandler
10-
import com.openai.core.handlers.withErrorHandler
119
import com.openai.core.http.HttpMethod
1210
import com.openai.core.http.HttpRequest
1311
import com.openai.core.http.HttpResponse
1412
import com.openai.core.http.HttpResponse.Handler
15-
import com.openai.core.http.parseable
1613
import com.openai.core.prepare
1714
import com.openai.models.ErrorObject
1815
import com.openai.models.containers.files.content.ContentRetrieveParams
@@ -27,18 +24,18 @@ class ContentServiceImpl internal constructor(private val clientOptions: ClientO
2724

2825
override fun withRawResponse(): ContentService.WithRawResponse = withRawResponse
2926

30-
override fun retrieve(params: ContentRetrieveParams, requestOptions: RequestOptions) {
27+
override fun retrieve(
28+
params: ContentRetrieveParams,
29+
requestOptions: RequestOptions,
30+
): HttpResponse =
3131
// get /containers/{container_id}/files/{file_id}/content
3232
withRawResponse().retrieve(params, requestOptions)
33-
}
3433

3534
class WithRawResponseImpl internal constructor(private val clientOptions: ClientOptions) :
3635
ContentService.WithRawResponse {
3736

3837
private val errorHandler: Handler<ErrorObject?> = errorHandler(clientOptions.jsonMapper)
3938

40-
private val retrieveHandler: Handler<Void?> = emptyHandler().withErrorHandler(errorHandler)
41-
4239
override fun retrieve(
4340
params: ContentRetrieveParams,
4441
requestOptions: RequestOptions,
@@ -59,8 +56,7 @@ class ContentServiceImpl internal constructor(private val clientOptions: ClientO
5956
.build()
6057
.prepare(clientOptions, params, deploymentModel = null)
6158
val requestOptions = requestOptions.applyDefaults(RequestOptions.from(clientOptions))
62-
val response = clientOptions.httpClient.execute(request, requestOptions)
63-
return response.parseable { response.use { retrieveHandler.handle(it) } }
59+
return clientOptions.httpClient.execute(request, requestOptions)
6460
}
6561
}
6662
}

openai-java-core/src/test/kotlin/com/openai/services/async/containers/files/ContentServiceAsyncTest.kt

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,44 @@
22

33
package com.openai.services.async.containers.files
44

5+
import com.github.tomakehurst.wiremock.client.WireMock.anyUrl
6+
import com.github.tomakehurst.wiremock.client.WireMock.get
7+
import com.github.tomakehurst.wiremock.client.WireMock.ok
8+
import com.github.tomakehurst.wiremock.client.WireMock.stubFor
9+
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo
10+
import com.github.tomakehurst.wiremock.junit5.WireMockTest
511
import com.openai.TestServerExtension
612
import com.openai.client.okhttp.OpenAIOkHttpClientAsync
713
import com.openai.models.containers.files.content.ContentRetrieveParams
14+
import org.assertj.core.api.Assertions.assertThat
815
import org.junit.jupiter.api.Test
916
import org.junit.jupiter.api.extension.ExtendWith
17+
import org.junit.jupiter.api.parallel.ResourceLock
1018

1119
@ExtendWith(TestServerExtension::class)
20+
@WireMockTest
21+
@ResourceLock("https://github.com/wiremock/wiremock/issues/169")
1222
internal class ContentServiceAsyncTest {
1323

1424
@Test
15-
fun retrieve() {
25+
fun retrieve(wmRuntimeInfo: WireMockRuntimeInfo) {
1626
val client =
1727
OpenAIOkHttpClientAsync.builder()
18-
.baseUrl(TestServerExtension.BASE_URL)
28+
.baseUrl(wmRuntimeInfo.httpBaseUrl)
1929
.apiKey("My API Key")
2030
.build()
2131
val contentServiceAsync = client.containers().files().content()
32+
stubFor(get(anyUrl()).willReturn(ok().withBody("abc")))
2233

23-
val future =
34+
val contentFuture =
2435
contentServiceAsync.retrieve(
2536
ContentRetrieveParams.builder()
2637
.containerId("container_id")
2738
.fileId("file_id")
2839
.build()
2940
)
3041

31-
val response = future.get()
42+
val content = contentFuture.get()
43+
assertThat(content.body()).hasContent("abc")
3244
}
3345
}

openai-java-core/src/test/kotlin/com/openai/services/blocking/containers/files/ContentServiceTest.kt

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,43 @@
22

33
package com.openai.services.blocking.containers.files
44

5+
import com.github.tomakehurst.wiremock.client.WireMock.anyUrl
6+
import com.github.tomakehurst.wiremock.client.WireMock.get
7+
import com.github.tomakehurst.wiremock.client.WireMock.ok
8+
import com.github.tomakehurst.wiremock.client.WireMock.stubFor
9+
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo
10+
import com.github.tomakehurst.wiremock.junit5.WireMockTest
511
import com.openai.TestServerExtension
612
import com.openai.client.okhttp.OpenAIOkHttpClient
713
import com.openai.models.containers.files.content.ContentRetrieveParams
14+
import org.assertj.core.api.Assertions.assertThat
815
import org.junit.jupiter.api.Test
916
import org.junit.jupiter.api.extension.ExtendWith
17+
import org.junit.jupiter.api.parallel.ResourceLock
1018

1119
@ExtendWith(TestServerExtension::class)
20+
@WireMockTest
21+
@ResourceLock("https://github.com/wiremock/wiremock/issues/169")
1222
internal class ContentServiceTest {
1323

1424
@Test
15-
fun retrieve() {
25+
fun retrieve(wmRuntimeInfo: WireMockRuntimeInfo) {
1626
val client =
1727
OpenAIOkHttpClient.builder()
18-
.baseUrl(TestServerExtension.BASE_URL)
28+
.baseUrl(wmRuntimeInfo.httpBaseUrl)
1929
.apiKey("My API Key")
2030
.build()
2131
val contentService = client.containers().files().content()
32+
stubFor(get(anyUrl()).willReturn(ok().withBody("abc")))
2233

23-
contentService.retrieve(
24-
ContentRetrieveParams.builder().containerId("container_id").fileId("file_id").build()
25-
)
34+
val content =
35+
contentService.retrieve(
36+
ContentRetrieveParams.builder()
37+
.containerId("container_id")
38+
.fileId("file_id")
39+
.build()
40+
)
41+
42+
assertThat(content.body()).hasContent("abc")
2643
}
2744
}

0 commit comments

Comments
 (0)