Skip to content

Commit a2a41d9

Browse files
author
michal.zyga
committed
add delete message method
1 parent df5d394 commit a2a41d9

File tree

5 files changed

+69
-4
lines changed

5 files changed

+69
-4
lines changed

core/src/main/scala/sttp/openai/OpenAI.scala

+20-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import sttp.openai.requests.completions.chat.ChatRequestResponseData.ChatRespons
2525
import sttp.openai.requests.embeddings.EmbeddingsRequestBody.EmbeddingsBody
2626
import sttp.openai.requests.embeddings.EmbeddingsResponseBody.EmbeddingResponse
2727
import sttp.openai.requests.files.FilesResponseData._
28-
import sttp.openai.requests.{batch, finetuning}
2928
import sttp.openai.requests.finetuning._
3029
import sttp.openai.requests.images.ImageResponseData.ImageResponse
3130
import sttp.openai.requests.images.creation.ImageCreationRequestBody.ImageCreationBody
@@ -38,7 +37,7 @@ import sttp.openai.requests.threads.QueryParameters
3837
import sttp.openai.requests.threads.ThreadsRequestBody.CreateThreadBody
3938
import sttp.openai.requests.threads.ThreadsResponseData.{DeleteThreadResponse, ThreadData}
4039
import sttp.openai.requests.threads.messages.ThreadMessagesRequestBody.CreateMessage
41-
import sttp.openai.requests.threads.messages.ThreadMessagesResponseData.{ListMessagesResponse, MessageData}
40+
import sttp.openai.requests.threads.messages.ThreadMessagesResponseData.{DeleteMessageResponse, ListMessagesResponse, MessageData}
4241
import sttp.openai.requests.threads.runs.ThreadRunsRequestBody._
4342
import sttp.openai.requests.threads.runs.ThreadRunsResponseData.{ListRunStepsResponse, ListRunsResponse, RunData, RunStepData}
4443
import sttp.openai.requests.vectorstore.VectorStoreRequestBody.{CreateVectorStoreBody, ModifyVectorStoreBody}
@@ -49,6 +48,7 @@ import sttp.openai.requests.vectorstore.file.VectorStoreFileResponseData.{
4948
ListVectorStoreFilesResponse,
5049
VectorStoreFile
5150
}
51+
import sttp.openai.requests.{batch, finetuning}
5252

5353
import java.io.{File, InputStream}
5454
import java.nio.file.Paths
@@ -769,6 +769,24 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
769769
.body(metadata)
770770
.response(asJson_parseErrors[MessageData])
771771

772+
/** Deletes a message.
773+
*
774+
* [[https://platform.openai.com/docs/api-reference/messages/deleteMessage]]
775+
*
776+
* @param threadId
777+
* The ID of the thread to which this message belongs.
778+
*
779+
* @param messageId
780+
* The ID of the message to delete.
781+
*
782+
* @return
783+
* Deletion status
784+
*/
785+
def deleteMessage(threadId: String, messageId: String): Request[Either[OpenAIException, DeleteMessageResponse]] =
786+
betaOpenAIAuthRequest
787+
.delete(openAIUris.threadMessage(threadId, messageId))
788+
.response(asJson_parseErrors[DeleteMessageResponse])
789+
772790
/** Create an assistant with a model and instructions.
773791
*
774792
* [[https://platform.openai.com/docs/api-reference/assistants/createAssistant]]

core/src/main/scala/sttp/openai/OpenAISyncClient.scala

+17-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import sttp.openai.requests.threads.QueryParameters
2929
import sttp.openai.requests.threads.ThreadsRequestBody.CreateThreadBody
3030
import sttp.openai.requests.threads.ThreadsResponseData.{DeleteThreadResponse, ThreadData}
3131
import sttp.openai.requests.threads.messages.ThreadMessagesRequestBody.CreateMessage
32-
import sttp.openai.requests.threads.messages.ThreadMessagesResponseData.{ListMessagesResponse, MessageData}
32+
import sttp.openai.requests.threads.messages.ThreadMessagesResponseData.{DeleteMessageResponse, ListMessagesResponse, MessageData}
3333
import sttp.openai.requests.threads.runs.ThreadRunsRequestBody.{CreateRun, CreateThreadAndRun, ToolOutput}
3434
import sttp.openai.requests.threads.runs.ThreadRunsResponseData.{ListRunStepsResponse, ListRunsResponse, RunData, RunStepData}
3535
import sttp.openai.requests.vectorstore.VectorStoreRequestBody.{CreateVectorStoreBody, ModifyVectorStoreBody}
@@ -518,6 +518,22 @@ class OpenAISyncClient private (
518518
def modifyMessage(threadId: String, messageId: String, metadata: Map[String, String]): MessageData =
519519
sendOrThrow(openAI.modifyMessage(threadId, messageId, metadata))
520520

521+
/** Deletes a message.
522+
*
523+
* [[https://platform.openai.com/docs/api-reference/messages/deleteMessage]]
524+
*
525+
* @param threadId
526+
* The ID of the thread to which this message belongs.
527+
*
528+
* @param messageId
529+
* The ID of the message to delete.
530+
*
531+
* @return
532+
* Deletion status
533+
*/
534+
def deleteMessage(threadId: String, messageId: String): DeleteMessageResponse =
535+
sendOrThrow(openAI.deleteMessage(threadId, messageId))
536+
521537
/** Create an assistant with a model and instructions.
522538
*
523539
* [[https://platform.openai.com/docs/api-reference/assistants/createAssistant]]

core/src/main/scala/sttp/openai/requests/threads/messages/ThreadMessagesResponseData.scala

+8
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ object ThreadMessagesResponseData {
6565
object ListMessagesResponse {
6666
implicit val listMessagesResponseR: SnakePickle.Reader[ListMessagesResponse] = SnakePickle.macroR[ListMessagesResponse]
6767
}
68+
case class DeleteMessageResponse(
69+
`object`: String = "thread.message.deleted",
70+
id: String,
71+
deleted: Boolean
72+
)
73+
object DeleteMessageResponse {
74+
implicit val deleteMessageResponseR: SnakePickle.Reader[DeleteMessageResponse] = SnakePickle.macroR[DeleteMessageResponse]
75+
}
6876

6977
sealed trait Annotation
7078

core/src/test/scala/sttp/openai/fixtures/ThreadMessagesFixture.scala

+7
Original file line numberDiff line numberDiff line change
@@ -138,4 +138,11 @@ object ThreadMessagesFixture {
138138
| }
139139
|}
140140
|""".stripMargin
141+
142+
val jsonDeleteMessageResponse: String =
143+
"""{
144+
| "id": "msg_abc123",
145+
| "object": "thread.message.deleted",
146+
| "deleted": true
147+
|}""".stripMargin
141148
}

core/src/test/scala/sttp/openai/requests/threads/messages/ThreadMessagesDataSpec.scala

+17-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import sttp.openai.fixtures
77
import sttp.openai.json.{SnakePickle, SttpUpickleApiExtension}
88
import sttp.openai.requests.completions.chat.message.Attachment
99
import sttp.openai.requests.threads.messages.ThreadMessagesResponseData.Content.{TextContent, TextContentValue}
10-
import sttp.openai.requests.threads.messages.ThreadMessagesResponseData.{ListMessagesResponse, MessageData}
10+
import sttp.openai.requests.threads.messages.ThreadMessagesResponseData.{DeleteMessageResponse, ListMessagesResponse, MessageData}
1111

1212
class ThreadMessagesDataSpec extends AnyFlatSpec with Matchers with EitherValues {
1313

@@ -187,4 +187,20 @@ class ThreadMessagesDataSpec extends AnyFlatSpec with Matchers with EitherValues
187187
// then
188188
givenResponse.value shouldBe expectedResponse
189189
}
190+
191+
"Given delete message response as Json" should "be properly deserialized to case class" in {
192+
import DeleteMessageResponse._
193+
// given
194+
val jsonResponse = fixtures.ThreadMessagesFixture.jsonDeleteMessageResponse
195+
val expectedResponse: DeleteMessageResponse = DeleteMessageResponse(
196+
id = "msg_abc123",
197+
deleted = true
198+
)
199+
200+
// when
201+
val givenResponse: Either[Exception, DeleteMessageResponse] = SttpUpickleApiExtension.deserializeJsonSnake.apply(jsonResponse)
202+
203+
// then
204+
givenResponse.value shouldBe expectedResponse
205+
}
190206
}

0 commit comments

Comments
 (0)