@@ -17,14 +17,14 @@ import sttp.openai.requests.audio.AudioResponseData.AudioResponse
17
17
import sttp .openai .requests .audio .RecognitionModel
18
18
import sttp .openai .requests .audio .transcriptions .TranscriptionConfig
19
19
import sttp .openai .requests .audio .translations .TranslationConfig
20
+ import sttp .openai .requests .batch .{QueryParameters => _ , _ }
20
21
import sttp .openai .requests .completions .CompletionsRequestBody .CompletionsBody
21
22
import sttp .openai .requests .completions .CompletionsResponseData .CompletionsResponse
22
23
import sttp .openai .requests .completions .chat .ChatRequestBody .ChatBody
23
24
import sttp .openai .requests .completions .chat .ChatRequestResponseData .ChatResponse
24
25
import sttp .openai .requests .embeddings .EmbeddingsRequestBody .EmbeddingsBody
25
26
import sttp .openai .requests .embeddings .EmbeddingsResponseBody .EmbeddingResponse
26
27
import sttp .openai .requests .files .FilesResponseData ._
27
- import sttp .openai .requests .finetuning
28
28
import sttp .openai .requests .finetuning ._
29
29
import sttp .openai .requests .images .ImageResponseData .ImageResponse
30
30
import sttp .openai .requests .images .creation .ImageCreationRequestBody .ImageCreationBody
@@ -37,7 +37,7 @@ import sttp.openai.requests.threads.QueryParameters
37
37
import sttp .openai .requests .threads .ThreadsRequestBody .CreateThreadBody
38
38
import sttp .openai .requests .threads .ThreadsResponseData .{DeleteThreadResponse , ThreadData }
39
39
import sttp .openai .requests .threads .messages .ThreadMessagesRequestBody .CreateMessage
40
- import sttp .openai .requests .threads .messages .ThreadMessagesResponseData .{ListMessagesResponse , MessageData }
40
+ import sttp .openai .requests .threads .messages .ThreadMessagesResponseData .{DeleteMessageResponse , ListMessagesResponse , MessageData }
41
41
import sttp .openai .requests .threads .runs .ThreadRunsRequestBody ._
42
42
import sttp .openai .requests .threads .runs .ThreadRunsResponseData .{ListRunStepsResponse , ListRunsResponse , RunData , RunStepData }
43
43
import sttp .openai .requests .vectorstore .VectorStoreRequestBody .{CreateVectorStoreBody , ModifyVectorStoreBody }
@@ -48,6 +48,7 @@ import sttp.openai.requests.vectorstore.file.VectorStoreFileResponseData.{
48
48
ListVectorStoreFilesResponse ,
49
49
VectorStoreFile
50
50
}
51
+ import sttp .openai .requests .{batch , finetuning }
51
52
52
53
import java .io .{File , InputStream }
53
54
import java .nio .file .Paths
@@ -463,7 +464,8 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
463
464
Some (multipart(" model" , model.value)),
464
465
prompt.map(multipart(" prompt" , _)),
465
466
responseFormat.map(format => multipart(" response_format" , format)),
466
- temperature.map(multipart(" temperature" , _))
467
+ temperature.map(multipart(" temperature" , _)),
468
+ language.map(multipart(" language" , _))
467
469
).flatten
468
470
}
469
471
.response(asJson_parseErrors[AudioResponse ])
@@ -767,6 +769,24 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
767
769
.body(metadata)
768
770
.response(asJson_parseErrors[MessageData ])
769
771
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
+
770
790
/** Create an assistant with a model and instructions.
771
791
*
772
792
* [[https://platform.openai.com/docs/api-reference/assistants/createAssistant ]]
@@ -1113,6 +1133,68 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
1113
1133
.delete(openAIUris.vectorStoreFile(vectorStoreId, fileId))
1114
1134
.response(asJson_parseErrors[DeleteVectorStoreFileResponse ])
1115
1135
1136
+ /** Creates and executes a batch from an uploaded file of requests
1137
+ *
1138
+ * [[https://platform.openai.com/docs/api-reference/batch/create ]]
1139
+ *
1140
+ * @param createBatchRequest
1141
+ * Request body that will be used to create a batch.
1142
+ * @return
1143
+ * The created Batch object.
1144
+ */
1145
+ def createBatch (createBatchRequest : BatchRequestBody ): Request [Either [OpenAIException , BatchResponse ]] =
1146
+ openAIAuthRequest
1147
+ .post(openAIUris.Batches )
1148
+ .body(createBatchRequest)
1149
+ .response(asJson_parseErrors[BatchResponse ])
1150
+
1151
+ /** Retrieves a batch.
1152
+ *
1153
+ * [[https://platform.openai.com/docs/api-reference/batch/retreive ]]
1154
+ *
1155
+ * @param batchId
1156
+ * The ID of the batch to retrieve.
1157
+ * @return
1158
+ * The Batch object matching the specified ID.
1159
+ */
1160
+ def retrieveBatch (batchId : String ): Request [Either [OpenAIException , BatchResponse ]] =
1161
+ openAIAuthRequest
1162
+ .get(openAIUris.batch(batchId))
1163
+ .response(asJson_parseErrors[BatchResponse ])
1164
+
1165
+ /** Cancels an in-progress batch. The batch will be in status cancelling for up to 10 minutes, before changing to cancelled, where it will
1166
+ * have partial results (if any) available in the output file.
1167
+ *
1168
+ * [[https://platform.openai.com/docs/api-reference/batch/cancel ]]
1169
+ *
1170
+ * @param batchId
1171
+ * The ID of the batch to cancel.
1172
+ * @return
1173
+ * The Batch object matching the specified ID.
1174
+ */
1175
+ def cancelBatch (batchId : String ): Request [Either [OpenAIException , BatchResponse ]] =
1176
+ openAIAuthRequest
1177
+ .post(openAIUris.cancelBatch(batchId))
1178
+ .response(asJson_parseErrors[BatchResponse ])
1179
+
1180
+ /** List your organization's batches.
1181
+ *
1182
+ * [[https://platform.openai.com/docs/api-reference/batch/list ]]
1183
+ *
1184
+ * @return
1185
+ * A list of paginated Batch objects.
1186
+ */
1187
+ def listBatches (
1188
+ queryParameters : batch.QueryParameters = batch.QueryParameters .empty
1189
+ ): Request [Either [OpenAIException , ListBatchResponse ]] = {
1190
+ val uri = openAIUris.Batches
1191
+ .withParams(queryParameters.toMap)
1192
+
1193
+ openAIAuthRequest
1194
+ .get(uri)
1195
+ .response(asJson_parseErrors[ListBatchResponse ])
1196
+ }
1197
+
1116
1198
protected val openAIAuthRequest : PartialRequest [Either [String , String ]] = basicRequest.auth
1117
1199
.bearer(authToken)
1118
1200
@@ -1133,6 +1215,7 @@ private class OpenAIUris(val baseUri: Uri) {
1133
1215
val Models : Uri = uri " $baseUri/models "
1134
1216
val Moderations : Uri = uri " $baseUri/moderations "
1135
1217
val FineTuningJobs : Uri = uri " $baseUri/fine_tuning/jobs "
1218
+ val Batches : Uri = uri " $baseUri/batches "
1136
1219
val Transcriptions : Uri = audioBase.addPath(" transcriptions" )
1137
1220
val Translations : Uri = audioBase.addPath(" translations" )
1138
1221
val VariationsImage : Uri = imageBase.addPath(" variations" )
@@ -1147,6 +1230,9 @@ private class OpenAIUris(val baseUri: Uri) {
1147
1230
def fineTuningJobCheckpoints (fineTuningJobId : String ): Uri = fineTuningJob(fineTuningJobId).addPath(" checkpoints" )
1148
1231
def cancelFineTuningJob (fineTuningJobId : String ): Uri = fineTuningJob(fineTuningJobId).addPath(" cancel" )
1149
1232
1233
+ def batch (batchId : String ): Uri = Batches .addPath(batchId)
1234
+ def cancelBatch (batchId : String ): Uri = batch(batchId).addPath(" cancel" )
1235
+
1150
1236
def file (fileId : String ): Uri = Files .addPath(fileId)
1151
1237
def fileContent (fileId : String ): Uri = Files .addPath(fileId, " content" )
1152
1238
def model (modelId : String ): Uri = Models .addPath(modelId)
0 commit comments