Skip to content

Commit a8a3682

Browse files
feat(api): add support for storing chat completions (#216)
1 parent a7ff995 commit a8a3682

28 files changed

+2799
-18
lines changed

.stats.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
configured_endpoints: 61
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai-dfb00c627f58e5180af7a9b29ed2f2aa0764a3b9daa6a32a1cc45bc8e48dfe15.yml
1+
configured_endpoints: 65
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai-4aa6ee65ba9efc789e05e6a5ef0883b2cadf06def8efd863dbf75e9e233067e1.yml

openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingAsyncStreamResponse.kt

+21-11
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,46 @@ import com.openai.core.http.AsyncStreamResponse.Handler
55
import java.util.Optional
66
import java.util.concurrent.Executor
77

8+
/**
9+
* A delegating wrapper around an `AsyncStreamResponse` that closes it once it's only phantom
10+
* reachable.
11+
*
12+
* This class ensures the `AsyncStreamResponse` is closed even if the user forgets to close it.
13+
*/
814
internal class PhantomReachableClosingAsyncStreamResponse<T>(
915
private val asyncStreamResponse: AsyncStreamResponse<T>
1016
) : AsyncStreamResponse<T> {
17+
18+
/**
19+
* An object used for keeping `asyncStreamResponse` open while the object is still reachable.
20+
*/
21+
private val reachabilityTracker = Object()
22+
1123
init {
12-
closeWhenPhantomReachable(this, asyncStreamResponse::close)
24+
closeWhenPhantomReachable(reachabilityTracker, asyncStreamResponse::close)
1325
}
1426

1527
override fun subscribe(handler: Handler<T>): AsyncStreamResponse<T> = apply {
16-
asyncStreamResponse.subscribe(HandlerReferencingAsyncStreamResponse(handler, this))
28+
asyncStreamResponse.subscribe(TrackedHandler(handler, reachabilityTracker))
1729
}
1830

1931
override fun subscribe(handler: Handler<T>, executor: Executor): AsyncStreamResponse<T> =
2032
apply {
21-
asyncStreamResponse.subscribe(
22-
HandlerReferencingAsyncStreamResponse(handler, this),
23-
executor
24-
)
33+
asyncStreamResponse.subscribe(TrackedHandler(handler, reachabilityTracker), executor)
2534
}
2635

2736
override fun close() = asyncStreamResponse.close()
2837
}
2938

3039
/**
31-
* A wrapper around a `Handler` that also references an `AsyncStreamResponse` so that the latter
32-
* will not only be phantom reachable and get reclaimed early while the handler itself is reachable
33-
* and subscribed to the response.
40+
* A wrapper around a `Handler` that also references a `reachabilityTracker` object.
41+
*
42+
* Referencing the `reachabilityTracker` object prevents it from getting reclaimed while the handler
43+
* is still reachable.
3444
*/
35-
private class HandlerReferencingAsyncStreamResponse<T>(
45+
private class TrackedHandler<T>(
3646
private val handler: Handler<T>,
37-
private val asyncStreamResponse: AsyncStreamResponse<T>
47+
private val reachabilityTracker: Any,
3848
) : Handler<T> {
3949
override fun onNext(value: T) = handler.onNext(value)
4050

openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpClient.kt

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import com.openai.core.RequestOptions
44
import com.openai.core.closeWhenPhantomReachable
55
import java.util.concurrent.CompletableFuture
66

7+
/**
8+
* A delegating wrapper around an `HttpClient` that closes it once it's only phantom reachable.
9+
*
10+
* This class ensures the `HttpClient` is closed even if the user forgets to close it.
11+
*/
712
internal class PhantomReachableClosingHttpClient(private val httpClient: HttpClient) : HttpClient {
813
init {
914
closeWhenPhantomReachable(this, httpClient)

openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingStreamResponse.kt

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ package com.openai.core.http
33
import com.openai.core.closeWhenPhantomReachable
44
import java.util.stream.Stream
55

6+
/**
7+
* A delegating wrapper around a `StreamResponse` that closes it once it's only phantom reachable.
8+
*
9+
* This class ensures the `StreamResponse` is closed even if the user forgets to close it.
10+
*/
611
internal class PhantomReachableClosingStreamResponse<T>(
712
private val streamResponse: StreamResponse<T>
813
) : StreamResponse<T> {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
// File generated from our OpenAPI spec by Stainless.
2+
3+
package com.openai.models
4+
5+
import com.openai.core.JsonValue
6+
import com.openai.core.NoAutoDetect
7+
import com.openai.core.Params
8+
import com.openai.core.checkRequired
9+
import com.openai.core.http.Headers
10+
import com.openai.core.http.QueryParams
11+
import com.openai.core.toImmutable
12+
import java.util.Objects
13+
import java.util.Optional
14+
15+
/**
16+
* Delete a stored chat completion. Only chat completions that have been created with the `store`
17+
* parameter set to `true` can be deleted.
18+
*/
19+
class ChatCompletionDeleteParams
20+
private constructor(
21+
private val completionId: String,
22+
private val additionalHeaders: Headers,
23+
private val additionalQueryParams: QueryParams,
24+
private val additionalBodyProperties: Map<String, JsonValue>,
25+
) : Params {
26+
27+
fun completionId(): String = completionId
28+
29+
fun _additionalHeaders(): Headers = additionalHeaders
30+
31+
fun _additionalQueryParams(): QueryParams = additionalQueryParams
32+
33+
fun _additionalBodyProperties(): Map<String, JsonValue> = additionalBodyProperties
34+
35+
@JvmSynthetic
36+
internal fun _body(): Optional<Map<String, JsonValue>> =
37+
Optional.ofNullable(additionalBodyProperties.ifEmpty { null })
38+
39+
override fun _headers(): Headers = additionalHeaders
40+
41+
override fun _queryParams(): QueryParams = additionalQueryParams
42+
43+
fun getPathParam(index: Int): String {
44+
return when (index) {
45+
0 -> completionId
46+
else -> ""
47+
}
48+
}
49+
50+
fun toBuilder() = Builder().from(this)
51+
52+
companion object {
53+
54+
@JvmStatic fun builder() = Builder()
55+
}
56+
57+
/** A builder for [ChatCompletionDeleteParams]. */
58+
@NoAutoDetect
59+
class Builder internal constructor() {
60+
61+
private var completionId: String? = null
62+
private var additionalHeaders: Headers.Builder = Headers.builder()
63+
private var additionalQueryParams: QueryParams.Builder = QueryParams.builder()
64+
private var additionalBodyProperties: MutableMap<String, JsonValue> = mutableMapOf()
65+
66+
@JvmSynthetic
67+
internal fun from(chatCompletionDeleteParams: ChatCompletionDeleteParams) = apply {
68+
completionId = chatCompletionDeleteParams.completionId
69+
additionalHeaders = chatCompletionDeleteParams.additionalHeaders.toBuilder()
70+
additionalQueryParams = chatCompletionDeleteParams.additionalQueryParams.toBuilder()
71+
additionalBodyProperties =
72+
chatCompletionDeleteParams.additionalBodyProperties.toMutableMap()
73+
}
74+
75+
fun completionId(completionId: String) = apply { this.completionId = completionId }
76+
77+
fun additionalHeaders(additionalHeaders: Headers) = apply {
78+
this.additionalHeaders.clear()
79+
putAllAdditionalHeaders(additionalHeaders)
80+
}
81+
82+
fun additionalHeaders(additionalHeaders: Map<String, Iterable<String>>) = apply {
83+
this.additionalHeaders.clear()
84+
putAllAdditionalHeaders(additionalHeaders)
85+
}
86+
87+
fun putAdditionalHeader(name: String, value: String) = apply {
88+
additionalHeaders.put(name, value)
89+
}
90+
91+
fun putAdditionalHeaders(name: String, values: Iterable<String>) = apply {
92+
additionalHeaders.put(name, values)
93+
}
94+
95+
fun putAllAdditionalHeaders(additionalHeaders: Headers) = apply {
96+
this.additionalHeaders.putAll(additionalHeaders)
97+
}
98+
99+
fun putAllAdditionalHeaders(additionalHeaders: Map<String, Iterable<String>>) = apply {
100+
this.additionalHeaders.putAll(additionalHeaders)
101+
}
102+
103+
fun replaceAdditionalHeaders(name: String, value: String) = apply {
104+
additionalHeaders.replace(name, value)
105+
}
106+
107+
fun replaceAdditionalHeaders(name: String, values: Iterable<String>) = apply {
108+
additionalHeaders.replace(name, values)
109+
}
110+
111+
fun replaceAllAdditionalHeaders(additionalHeaders: Headers) = apply {
112+
this.additionalHeaders.replaceAll(additionalHeaders)
113+
}
114+
115+
fun replaceAllAdditionalHeaders(additionalHeaders: Map<String, Iterable<String>>) = apply {
116+
this.additionalHeaders.replaceAll(additionalHeaders)
117+
}
118+
119+
fun removeAdditionalHeaders(name: String) = apply { additionalHeaders.remove(name) }
120+
121+
fun removeAllAdditionalHeaders(names: Set<String>) = apply {
122+
additionalHeaders.removeAll(names)
123+
}
124+
125+
fun additionalQueryParams(additionalQueryParams: QueryParams) = apply {
126+
this.additionalQueryParams.clear()
127+
putAllAdditionalQueryParams(additionalQueryParams)
128+
}
129+
130+
fun additionalQueryParams(additionalQueryParams: Map<String, Iterable<String>>) = apply {
131+
this.additionalQueryParams.clear()
132+
putAllAdditionalQueryParams(additionalQueryParams)
133+
}
134+
135+
fun putAdditionalQueryParam(key: String, value: String) = apply {
136+
additionalQueryParams.put(key, value)
137+
}
138+
139+
fun putAdditionalQueryParams(key: String, values: Iterable<String>) = apply {
140+
additionalQueryParams.put(key, values)
141+
}
142+
143+
fun putAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply {
144+
this.additionalQueryParams.putAll(additionalQueryParams)
145+
}
146+
147+
fun putAllAdditionalQueryParams(additionalQueryParams: Map<String, Iterable<String>>) =
148+
apply {
149+
this.additionalQueryParams.putAll(additionalQueryParams)
150+
}
151+
152+
fun replaceAdditionalQueryParams(key: String, value: String) = apply {
153+
additionalQueryParams.replace(key, value)
154+
}
155+
156+
fun replaceAdditionalQueryParams(key: String, values: Iterable<String>) = apply {
157+
additionalQueryParams.replace(key, values)
158+
}
159+
160+
fun replaceAllAdditionalQueryParams(additionalQueryParams: QueryParams) = apply {
161+
this.additionalQueryParams.replaceAll(additionalQueryParams)
162+
}
163+
164+
fun replaceAllAdditionalQueryParams(additionalQueryParams: Map<String, Iterable<String>>) =
165+
apply {
166+
this.additionalQueryParams.replaceAll(additionalQueryParams)
167+
}
168+
169+
fun removeAdditionalQueryParams(key: String) = apply { additionalQueryParams.remove(key) }
170+
171+
fun removeAllAdditionalQueryParams(keys: Set<String>) = apply {
172+
additionalQueryParams.removeAll(keys)
173+
}
174+
175+
fun additionalBodyProperties(additionalBodyProperties: Map<String, JsonValue>) = apply {
176+
this.additionalBodyProperties.clear()
177+
putAllAdditionalBodyProperties(additionalBodyProperties)
178+
}
179+
180+
fun putAdditionalBodyProperty(key: String, value: JsonValue) = apply {
181+
additionalBodyProperties.put(key, value)
182+
}
183+
184+
fun putAllAdditionalBodyProperties(additionalBodyProperties: Map<String, JsonValue>) =
185+
apply {
186+
this.additionalBodyProperties.putAll(additionalBodyProperties)
187+
}
188+
189+
fun removeAdditionalBodyProperty(key: String) = apply {
190+
additionalBodyProperties.remove(key)
191+
}
192+
193+
fun removeAllAdditionalBodyProperties(keys: Set<String>) = apply {
194+
keys.forEach(::removeAdditionalBodyProperty)
195+
}
196+
197+
fun build(): ChatCompletionDeleteParams =
198+
ChatCompletionDeleteParams(
199+
checkRequired("completionId", completionId),
200+
additionalHeaders.build(),
201+
additionalQueryParams.build(),
202+
additionalBodyProperties.toImmutable(),
203+
)
204+
}
205+
206+
override fun equals(other: Any?): Boolean {
207+
if (this === other) {
208+
return true
209+
}
210+
211+
return /* spotless:off */ other is ChatCompletionDeleteParams && completionId == other.completionId && additionalHeaders == other.additionalHeaders && additionalQueryParams == other.additionalQueryParams && additionalBodyProperties == other.additionalBodyProperties /* spotless:on */
212+
}
213+
214+
override fun hashCode(): Int = /* spotless:off */ Objects.hash(completionId, additionalHeaders, additionalQueryParams, additionalBodyProperties) /* spotless:on */
215+
216+
override fun toString() =
217+
"ChatCompletionDeleteParams{completionId=$completionId, additionalHeaders=$additionalHeaders, additionalQueryParams=$additionalQueryParams, additionalBodyProperties=$additionalBodyProperties}"
218+
}

0 commit comments

Comments
 (0)