From 320969364c85fbafc39d3220d5f3ff4031cf4d77 Mon Sep 17 00:00:00 2001 From: "andrew.iskander" Date: Sun, 8 Sep 2024 10:12:07 -0400 Subject: [PATCH 1/2] feature/get-response-header: get headers --- .../kotlin/com.aallam.openai.client/Messages.kt | 4 ++-- .../internal/api/MessagesApi.kt | 5 +++-- .../internal/http/HttpRequester.kt | 13 +++++++++++++ .../internal/http/HttpTransport.kt | 10 ++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/Messages.kt b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/Messages.kt index db7f7a8b..01111b5e 100644 --- a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/Messages.kt +++ b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/Messages.kt @@ -3,11 +3,11 @@ package com.aallam.openai.client import com.aallam.openai.api.BetaOpenAI import com.aallam.openai.api.core.RequestOptions import com.aallam.openai.api.core.SortOrder -import com.aallam.openai.api.file.FileId import com.aallam.openai.api.message.Message import com.aallam.openai.api.message.MessageId import com.aallam.openai.api.message.MessageRequest import com.aallam.openai.api.thread.ThreadId +import io.ktor.http.* /** * Create messages within threads @@ -84,5 +84,5 @@ public interface Messages { after: MessageId? = null, before: MessageId? = null, requestOptions: RequestOptions? = null - ): List + ): Pair> } diff --git a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/api/MessagesApi.kt b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/api/MessagesApi.kt index 65f95487..f4dce201 100644 --- a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/api/MessagesApi.kt +++ b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/api/MessagesApi.kt @@ -12,6 +12,7 @@ import com.aallam.openai.client.internal.extension.beta import com.aallam.openai.client.internal.extension.requestOptions import com.aallam.openai.client.internal.http.HttpRequester import com.aallam.openai.client.internal.http.perform +import com.aallam.openai.client.internal.http.performGetHeaders import io.ktor.client.call.* import io.ktor.client.request.* import io.ktor.http.* @@ -73,8 +74,8 @@ internal class MessagesApi(val requester: HttpRequester) : Messages { after: MessageId?, before: MessageId?, requestOptions: RequestOptions? - ): PaginatedList { - return requester.perform { + ): Pair> { + return requester.performGetHeaders{ it.get { url(path = "${ApiPath.Threads}/${threadId.id}/messages") { limit?.let { value -> parameter("limit", value) } diff --git a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/http/HttpRequester.kt b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/http/HttpRequester.kt index 2a00dd96..af798276 100644 --- a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/http/HttpRequester.kt +++ b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/http/HttpRequester.kt @@ -4,6 +4,7 @@ import com.aallam.openai.client.Closeable import io.ktor.client.* import io.ktor.client.request.* import io.ktor.client.statement.* +import io.ktor.http.* import io.ktor.util.reflect.* /** @@ -16,6 +17,11 @@ internal interface HttpRequester : Closeable { */ suspend fun perform(info: TypeInfo, block: suspend (HttpClient) -> HttpResponse): T + /** + * Perform an HTTP request and get a result with headers + */ + suspend fun performGetHeaders(info: TypeInfo, block: suspend (HttpClient) -> HttpResponse): Pair + /** * Perform an HTTP request and get a result. * @@ -33,3 +39,10 @@ internal interface HttpRequester : Closeable { internal suspend inline fun HttpRequester.perform(noinline block: suspend (HttpClient) -> HttpResponse): T { return perform(typeInfo(), block) } + +/** + * Perform an HTTP request and get a result with headers + */ +internal suspend inline fun HttpRequester.performGetHeaders(noinline block: suspend (HttpClient) -> HttpResponse): Pair { + return performGetHeaders(typeInfo(), block) +} diff --git a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/http/HttpTransport.kt b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/http/HttpTransport.kt index c8c7bc03..043f86b5 100644 --- a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/http/HttpTransport.kt +++ b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/http/HttpTransport.kt @@ -7,6 +7,7 @@ import io.ktor.client.network.sockets.* import io.ktor.client.plugins.* import io.ktor.client.request.* import io.ktor.client.statement.* +import io.ktor.http.* import io.ktor.util.reflect.* import io.ktor.utils.io.errors.* import kotlinx.coroutines.CancellationException @@ -35,6 +36,15 @@ internal class HttpTransport(private val httpClient: HttpClient) : HttpRequester } } + override suspend fun performGetHeaders(info: TypeInfo, block: suspend (HttpClient) -> HttpResponse): Pair { + try { + val response = block(httpClient) + return Pair(response.headers,response.body(info)) + } catch (e: Exception) { + throw handleException(e) + } + } + override fun close() { httpClient.close() } From 45fc7962ea5688cf96efb17dc95880436dae109a Mon Sep 17 00:00:00 2001 From: "andrew.iskander" Date: Sun, 8 Sep 2024 10:21:37 -0400 Subject: [PATCH 2/2] feature/get-response-header: add separate function --- .../com.aallam.openai.client/Messages.kt | 25 +++++++++++++++++++ .../internal/api/MessagesApi.kt | 22 ++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/Messages.kt b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/Messages.kt index 01111b5e..4321f3ab 100644 --- a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/Messages.kt +++ b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/Messages.kt @@ -84,5 +84,30 @@ public interface Messages { after: MessageId? = null, before: MessageId? = null, requestOptions: RequestOptions? = null + ): List + + /** + * Returns a list of messages for a given thread with response headers. + * + * @param threadId the identifier of the thread + * @param limit a limit on the number of objects to be returned. + * The Limit can range between 1 and 100, and the default is 20. + * @param order sort order by the `created_at` timestamp of the objects. + * @param after a cursor for use in pagination. [after] is an object ID that defines your place in the list. + * For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call + * can include `after = MessageId("obj_foo")` in order to fetch the next page of the list. + * @param before a cursor for use in pagination. [before] is an object ID that defines your place in the list. + * For instance, if you make a list request and receive 100 objects, ending with `obj_foo`, your subsequent call + * can include `before = MessageId("obj_foo")` in order to fetch the previous page of the list. + * @param requestOptions request options. + */ + @BetaOpenAI + public suspend fun messagesWithHeaders( + threadId: ThreadId, + limit: Int? = null, + order: SortOrder? = null, + after: MessageId? = null, + before: MessageId? = null, + requestOptions: RequestOptions? = null ): Pair> } diff --git a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/api/MessagesApi.kt b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/api/MessagesApi.kt index f4dce201..1e158e59 100644 --- a/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/api/MessagesApi.kt +++ b/openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/api/MessagesApi.kt @@ -74,6 +74,28 @@ internal class MessagesApi(val requester: HttpRequester) : Messages { after: MessageId?, before: MessageId?, requestOptions: RequestOptions? + ): PaginatedList { + return requester.perform{ + it.get { + url(path = "${ApiPath.Threads}/${threadId.id}/messages") { + limit?.let { value -> parameter("limit", value) } + order?.let { value -> parameter("order", value.order) } + before?.let { value -> parameter("before", value.id) } + after?.let { value -> parameter("after", value.id) } + } + beta("assistants", 2) + requestOptions(requestOptions) + }.body() + } + } + + override suspend fun messagesWithHeaders( + threadId: ThreadId, + limit: Int?, + order: SortOrder?, + after: MessageId?, + before: MessageId?, + requestOptions: RequestOptions? ): Pair> { return requester.performGetHeaders{ it.get {