diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 3f63a6728..7f3f5c846 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.22.1"
+ ".": "0.23.0"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index 920dcbc36..2e67f53d3 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,2 +1,2 @@
-configured_endpoints: 61
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai-dfb00c627f58e5180af7a9b29ed2f2aa0764a3b9daa6a32a1cc45bc8e48dfe15.yml
+configured_endpoints: 65
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openai-4aa6ee65ba9efc789e05e6a5ef0883b2cadf06def8efd863dbf75e9e233067e1.yml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6bf8b93cb..69f6c5e95 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
# Changelog
+## 0.23.0 (2025-02-14)
+
+Full Changelog: [v0.22.1...v0.23.0](https://github.com/openai/openai-java/compare/v0.22.1...v0.23.0)
+
+### Features
+
+* **api:** add support for storing chat completions ([#216](https://github.com/openai/openai-java/issues/216)) ([68a7883](https://github.com/openai/openai-java/commit/68a7883782574f1af0d724c1d838fd70a99f2958))
+
## 0.22.1 (2025-02-12)
Full Changelog: [v0.22.0...v0.22.1](https://github.com/openai/openai-java/compare/v0.22.0...v0.22.1)
diff --git a/README.md b/README.md
index 2043b6219..bc612a5c0 100644
--- a/README.md
+++ b/README.md
@@ -9,8 +9,8 @@
-[](https://central.sonatype.com/artifact/com.openai/openai-java/0.22.1)
-[](https://javadoc.io/doc/com.openai/openai-java/0.22.1)
+[](https://central.sonatype.com/artifact/com.openai/openai-java/0.23.0)
+[](https://javadoc.io/doc/com.openai/openai-java/0.23.0)
@@ -25,7 +25,7 @@ The REST API documentation can be found on [platform.openai.com](https://platfor
### Gradle
```kotlin
-implementation("com.openai:openai-java:0.22.1")
+implementation("com.openai:openai-java:0.23.0")
```
### Maven
@@ -34,7 +34,7 @@ implementation("com.openai:openai-java:0.22.1")
com.openai
openai-java
- 0.22.1
+ 0.23.0
```
diff --git a/build.gradle.kts b/build.gradle.kts
index 9eddb3cc9..25c92f6cd 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -8,7 +8,7 @@ repositories {
allprojects {
group = "com.openai"
- version = "0.22.1" // x-release-please-version
+ version = "0.23.0" // x-release-please-version
}
subprojects {
diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingAsyncStreamResponse.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingAsyncStreamResponse.kt
index 12817e89b..389f062a0 100644
--- a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingAsyncStreamResponse.kt
+++ b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingAsyncStreamResponse.kt
@@ -5,36 +5,46 @@ import com.openai.core.http.AsyncStreamResponse.Handler
import java.util.Optional
import java.util.concurrent.Executor
+/**
+ * A delegating wrapper around an `AsyncStreamResponse` that closes it once it's only phantom
+ * reachable.
+ *
+ * This class ensures the `AsyncStreamResponse` is closed even if the user forgets to close it.
+ */
internal class PhantomReachableClosingAsyncStreamResponse(
private val asyncStreamResponse: AsyncStreamResponse
) : AsyncStreamResponse {
+
+ /**
+ * An object used for keeping `asyncStreamResponse` open while the object is still reachable.
+ */
+ private val reachabilityTracker = Object()
+
init {
- closeWhenPhantomReachable(this, asyncStreamResponse::close)
+ closeWhenPhantomReachable(reachabilityTracker, asyncStreamResponse::close)
}
override fun subscribe(handler: Handler): AsyncStreamResponse = apply {
- asyncStreamResponse.subscribe(HandlerReferencingAsyncStreamResponse(handler, this))
+ asyncStreamResponse.subscribe(TrackedHandler(handler, reachabilityTracker))
}
override fun subscribe(handler: Handler, executor: Executor): AsyncStreamResponse =
apply {
- asyncStreamResponse.subscribe(
- HandlerReferencingAsyncStreamResponse(handler, this),
- executor
- )
+ asyncStreamResponse.subscribe(TrackedHandler(handler, reachabilityTracker), executor)
}
override fun close() = asyncStreamResponse.close()
}
/**
- * A wrapper around a `Handler` that also references an `AsyncStreamResponse` so that the latter
- * will not only be phantom reachable and get reclaimed early while the handler itself is reachable
- * and subscribed to the response.
+ * A wrapper around a `Handler` that also references a `reachabilityTracker` object.
+ *
+ * Referencing the `reachabilityTracker` object prevents it from getting reclaimed while the handler
+ * is still reachable.
*/
-private class HandlerReferencingAsyncStreamResponse(
+private class TrackedHandler(
private val handler: Handler,
- private val asyncStreamResponse: AsyncStreamResponse
+ private val reachabilityTracker: Any,
) : Handler {
override fun onNext(value: T) = handler.onNext(value)
diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpClient.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpClient.kt
index 19b0d18b9..43c0f4c09 100644
--- a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpClient.kt
+++ b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingHttpClient.kt
@@ -4,6 +4,11 @@ import com.openai.core.RequestOptions
import com.openai.core.closeWhenPhantomReachable
import java.util.concurrent.CompletableFuture
+/**
+ * A delegating wrapper around an `HttpClient` that closes it once it's only phantom reachable.
+ *
+ * This class ensures the `HttpClient` is closed even if the user forgets to close it.
+ */
internal class PhantomReachableClosingHttpClient(private val httpClient: HttpClient) : HttpClient {
init {
closeWhenPhantomReachable(this, httpClient)
diff --git a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingStreamResponse.kt b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingStreamResponse.kt
index 1cb2e2953..4321edb49 100644
--- a/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingStreamResponse.kt
+++ b/openai-java-core/src/main/kotlin/com/openai/core/http/PhantomReachableClosingStreamResponse.kt
@@ -3,6 +3,11 @@ package com.openai.core.http
import com.openai.core.closeWhenPhantomReachable
import java.util.stream.Stream
+/**
+ * A delegating wrapper around a `StreamResponse` that closes it once it's only phantom reachable.
+ *
+ * This class ensures the `StreamResponse` is closed even if the user forgets to close it.
+ */
internal class PhantomReachableClosingStreamResponse(
private val streamResponse: StreamResponse
) : StreamResponse {
diff --git a/openai-java-core/src/main/kotlin/com/openai/models/ChatCompletionDeleteParams.kt b/openai-java-core/src/main/kotlin/com/openai/models/ChatCompletionDeleteParams.kt
new file mode 100644
index 000000000..edde0e348
--- /dev/null
+++ b/openai-java-core/src/main/kotlin/com/openai/models/ChatCompletionDeleteParams.kt
@@ -0,0 +1,218 @@
+// File generated from our OpenAPI spec by Stainless.
+
+package com.openai.models
+
+import com.openai.core.JsonValue
+import com.openai.core.NoAutoDetect
+import com.openai.core.Params
+import com.openai.core.checkRequired
+import com.openai.core.http.Headers
+import com.openai.core.http.QueryParams
+import com.openai.core.toImmutable
+import java.util.Objects
+import java.util.Optional
+
+/**
+ * Delete a stored chat completion. Only chat completions that have been created with the `store`
+ * parameter set to `true` can be deleted.
+ */
+class ChatCompletionDeleteParams
+private constructor(
+ private val completionId: String,
+ private val additionalHeaders: Headers,
+ private val additionalQueryParams: QueryParams,
+ private val additionalBodyProperties: Map,
+) : Params {
+
+ fun completionId(): String = completionId
+
+ fun _additionalHeaders(): Headers = additionalHeaders
+
+ fun _additionalQueryParams(): QueryParams = additionalQueryParams
+
+ fun _additionalBodyProperties(): Map = additionalBodyProperties
+
+ @JvmSynthetic
+ internal fun _body(): Optional