Skip to content

Commit f3f8e80

Browse files
authored
feat: add configurable timeouts (#71)
1 parent 92cdf96 commit f3f8e80

File tree

5 files changed

+38
-6
lines changed

5 files changed

+38
-6
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

openai-client/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ kotlin {
2020
optIn("kotlin.RequiresOptIn")
2121
optIn("okio.ExperimentalFileSystem")
2222
optIn("kotlinx.coroutines.ExperimentalCoroutinesApi")
23+
optIn("com.aallam.openai.api.ExperimentalOpenAI")
2324
}
2425
}
2526
val commonMain by getting {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
package com.aallam.openai.client
22

3+
import com.aallam.openai.api.http.Timeout
34
import com.aallam.openai.api.logging.LogLevel
45
import com.aallam.openai.api.logging.Logger
6+
import kotlin.time.Duration.Companion.seconds
57

68
/**
79
* OpenAI client configuration.
10+
*
11+
* @param token OpenAI Token
12+
* @param logger http client logging level
13+
* @param logLevel http client logger
14+
* @param timeout http client timeout
815
*/
916
public class OpenAIConfig(
1017
public val token: String,
1118
public val logLevel: LogLevel = LogLevel.Headers,
1219
public val logger: Logger = Logger.Simple,
20+
public val timeout: Timeout = Timeout(socket = 30.seconds),
1321
)

openai-client/src/commonMain/kotlin/com.aallam.openai.client/internal/HttpClient.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,11 @@ import io.ktor.client.plugins.auth.providers.bearer
1111
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
1212
import io.ktor.client.plugins.defaultRequest
1313
import io.ktor.client.plugins.logging.Logging
14-
import io.ktor.client.request.accept
15-
import io.ktor.client.request.header
1614
import io.ktor.http.ContentType
17-
import io.ktor.http.HttpHeaders
1815
import io.ktor.http.URLProtocol
19-
import io.ktor.http.contentType
2016
import io.ktor.serialization.kotlinx.KotlinxSerializationConverter
2117
import kotlinx.serialization.json.Json
18+
import kotlin.time.DurationUnit
2219

2320
/**
2421
* Default Http Client.
@@ -41,7 +38,15 @@ internal fun createHttpClient(config: OpenAIConfig): HttpClient {
4138
}
4239

4340
install(HttpTimeout) {
44-
socketTimeoutMillis = 30000 // 30s
41+
config.timeout.socket?.let { socketTimeout ->
42+
socketTimeoutMillis = socketTimeout.toLong(DurationUnit.MILLISECONDS)
43+
}
44+
config.timeout.connect?.let { connectTimeout ->
45+
connectTimeoutMillis = connectTimeout.toLong(DurationUnit.MILLISECONDS)
46+
}
47+
config.timeout.request?.let { requestTimeout ->
48+
requestTimeoutMillis = requestTimeout.toLong(DurationUnit.MILLISECONDS)
49+
}
4550
}
4651

4752
defaultRequest {
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.aallam.openai.api.http
2+
3+
import com.aallam.openai.api.ExperimentalOpenAI
4+
import kotlin.time.Duration
5+
6+
/**
7+
* Http operations timeouts.
8+
*
9+
* @param request time period required to process an HTTP call: from sending a request to receiving a response
10+
* @param connect time period in which a client should establish a connection with a server
11+
* @param socket maximum time of inactivity between two data packets when exchanging data with a server
12+
*/
13+
@ExperimentalOpenAI
14+
public class Timeout(
15+
public val request: Duration? = null,
16+
public val connect: Duration? = null,
17+
public val socket: Duration? = null,
18+
)

0 commit comments

Comments
 (0)