Skip to content

Commit 1bcb808

Browse files
Update client4:akka-http-backend, ... to 4.0.0-RC1 (#275)
1 parent 4cc1ce7 commit 1bcb808

File tree

46 files changed

+369
-293
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+369
-293
lines changed

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

+31-37
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,7 @@ import sttp.capabilities.Streams
44
import sttp.client4._
55
import sttp.model.{Header, Uri}
66
import sttp.openai.OpenAIExceptions.OpenAIException
7-
import sttp.openai.json.SttpUpickleApiExtension.{
8-
asInputStreamUnsafe_parseErrors,
9-
asJson_parseErrors,
10-
asStreamUnsafe_parseErrors,
11-
asStringEither,
12-
upickleBodySerializer
13-
}
7+
import sttp.openai.json.SttpUpickleApiExtension._
148
import sttp.openai.requests.admin.{QueryParameters => _, _}
159
import sttp.openai.requests.assistants.AssistantsRequestBody.{CreateAssistantBody, ModifyAssistantBody}
1610
import sttp.openai.requests.assistants.AssistantsResponseData.{AssistantData, DeleteAssistantResponse, ListAssistantsResponse}
@@ -99,7 +93,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
9993
def createCompletion(completionBody: CompletionsBody): Request[Either[OpenAIException, CompletionsResponse]] =
10094
openAIAuthRequest
10195
.post(openAIUris.Completions)
102-
.body(completionBody)
96+
.body(asJson(completionBody))
10397
.response(asJson_parseErrors[CompletionsResponse])
10498

10599
/** Creates an image given a prompt in request body.
@@ -112,7 +106,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
112106
def createImage(imageCreationBody: ImageCreationBody): Request[Either[OpenAIException, ImageResponse]] =
113107
openAIAuthRequest
114108
.post(openAIUris.CreateImage)
115-
.body(imageCreationBody)
109+
.body(asJson(imageCreationBody))
116110
.response(asJson_parseErrors[ImageResponse])
117111

118112
/** Creates edited or extended images given an original image and a prompt.
@@ -175,7 +169,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
175169
Some(multipartFile("image", image)),
176170
Some(multipart("prompt", prompt)),
177171
mask.map(multipartFile("mask", _)),
178-
n.map(multipart("n", _)),
172+
n.map(i => multipart("n", i.toString)),
179173
size.map(s => multipart("size", s.value)),
180174
responseFormat.map(format => multipart("response_format", format.value))
181175
).flatten
@@ -236,7 +230,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
236230
import imageVariationsConfig._
237231
Seq(
238232
Some(multipartFile("image", image)),
239-
n.map(multipart("n", _)),
233+
n.map(i => multipart("n", i.toString)),
240234
size.map(s => multipart("size", s.value)),
241235
responseFormat.map(format => multipart("response_format", format.value)),
242236
user.map(multipart("user", _))
@@ -254,7 +248,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
254248
def createChatCompletion(chatBody: ChatBody): Request[Either[OpenAIException, ChatResponse]] =
255249
openAIAuthRequest
256250
.post(openAIUris.ChatCompletions)
257-
.body(chatBody)
251+
.body(asJson(chatBody))
258252
.response(asJson_parseErrors[ChatResponse])
259253

260254
/** Creates a model response for the given chat conversation defined in chatBody.
@@ -272,7 +266,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
272266
def createChatCompletionAsBinaryStream[S](s: Streams[S], chatBody: ChatBody): StreamRequest[Either[OpenAIException, s.BinaryStream], S] =
273267
openAIAuthRequest
274268
.post(openAIUris.ChatCompletions)
275-
.body(ChatBody.withStreaming(chatBody))
269+
.body(asJson(ChatBody.withStreaming(chatBody)))
276270
.response(asStreamUnsafe_parseErrors(s))
277271

278272
/** Creates a model response for the given chat conversation defined in chatBody.
@@ -287,7 +281,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
287281
def createChatCompletionAsInputStream(chatBody: ChatBody): Request[Either[OpenAIException, InputStream]] =
288282
openAIAuthRequest
289283
.post(openAIUris.ChatCompletions)
290-
.body(ChatBody.withStreaming(chatBody))
284+
.body(asJson(ChatBody.withStreaming(chatBody)))
291285
.response(asInputStreamUnsafe_parseErrors)
292286

293287
/** Get a stored chat completion. Only chat completions that have been created with the store parameter set to true will be returned.
@@ -366,7 +360,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
366360
): Request[Either[OpenAIException, ChatResponse]] =
367361
openAIAuthRequest
368362
.post(openAIUris.chatCompletion(completionId))
369-
.body(requestBody)
363+
.body(asJson(requestBody))
370364
.response(asJson_parseErrors[ChatResponse])
371365

372366
/** Delete a stored chat completion. Only chat completions that have been created with the store parameter set to true can be deleted.
@@ -546,7 +540,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
546540
.post(openAIUris.Translations)
547541
.multipartBody(
548542
multipartFile("file", Paths.get(systemPath).toFile),
549-
multipart("model", model)
543+
multipart("model", asJson(model))
550544
)
551545
.response(asJson_parseErrors[AudioResponse])
552546

@@ -566,8 +560,8 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
566560
Some(multipartFile("file", file)),
567561
Some(multipart("model", model.value)),
568562
prompt.map(multipart("prompt", _)),
569-
responseFormat.map(format => multipart("response_format", format)),
570-
temperature.map(multipart("temperature", _)),
563+
responseFormat.map(format => multipart("response_format", asJson(format))),
564+
temperature.map(i => multipart("temperature", i.toString)),
571565
language.map(multipart("language", _))
572566
).flatten
573567
}
@@ -583,7 +577,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
583577
def createModeration(moderationsBody: ModerationsBody): Request[Either[OpenAIException, ModerationData]] =
584578
openAIAuthRequest
585579
.post(openAIUris.Moderations)
586-
.body(moderationsBody)
580+
.body(asJson(moderationsBody))
587581
.response(asJson_parseErrors[ModerationData])
588582

589583
/** Transcribes audio into the input language.
@@ -642,7 +636,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
642636
Some(multipart("model", model.value)),
643637
prompt.map(multipart("prompt", _)),
644638
responseFormat.map(format => multipart("response_format", format.value)),
645-
temperature.map(multipart("temperature", _)),
639+
temperature.map(t => multipart("temperature", t.toString)),
646640
language.map(lang => multipart("language", lang.value))
647641
).flatten
648642
}
@@ -672,7 +666,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
672666
def createUpload(uploadRequestBody: UploadRequestBody): Request[Either[OpenAIException, UploadResponse]] =
673667
openAIAuthRequest
674668
.post(openAIUris.Uploads)
675-
.body(uploadRequestBody)
669+
.body(asJson(uploadRequestBody))
676670
.response(asJson_parseErrors[UploadResponse])
677671

678672
/** Adds a Part to an Upload object. A Part represents a chunk of bytes from the file you are trying to upload.
@@ -719,7 +713,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
719713
def completeUpload(uploadId: String, requestBody: CompleteUploadRequestBody): Request[Either[OpenAIException, UploadResponse]] =
720714
openAIAuthRequest
721715
.post(openAIUris.completeUpload(uploadId))
722-
.body(requestBody)
716+
.body(asJson(requestBody))
723717
.response(asJson_parseErrors[UploadResponse])
724718

725719
/** Cancels the Upload. No Parts may be added after an Upload is cancelled.
@@ -749,7 +743,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
749743
def createFineTuningJob(fineTuningRequestBody: FineTuningJobRequestBody): Request[Either[OpenAIException, FineTuningJobResponse]] =
750744
openAIAuthRequest
751745
.post(openAIUris.FineTuningJobs)
752-
.body(fineTuningRequestBody)
746+
.body(asJson(fineTuningRequestBody))
753747
.response(asJson_parseErrors[FineTuningJobResponse])
754748

755749
/** List your organization's fine-tuning jobs
@@ -841,7 +835,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
841835
def createEmbeddings(embeddingsBody: EmbeddingsBody): Request[Either[OpenAIException, EmbeddingResponse]] =
842836
openAIAuthRequest
843837
.post(openAIUris.Embeddings)
844-
.body(embeddingsBody)
838+
.body(asJson(embeddingsBody))
845839
.response(asJson_parseErrors[EmbeddingResponse])
846840

847841
/** Create a thread.
@@ -854,7 +848,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
854848
def createThread(createThreadBody: CreateThreadBody): Request[Either[OpenAIException, ThreadData]] =
855849
betaOpenAIAuthRequest
856850
.post(openAIUris.Threads)
857-
.body(createThreadBody)
851+
.body(asJson(createThreadBody))
858852
.response(asJson_parseErrors[ThreadData])
859853

860854
/** Retrieves a thread.
@@ -904,7 +898,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
904898
def createThreadMessage(threadId: String, message: CreateMessage): Request[Either[OpenAIException, MessageData]] =
905899
betaOpenAIAuthRequest
906900
.post(openAIUris.threadMessages(threadId))
907-
.body(message)
901+
.body(asJson(message))
908902
.response(asJson_parseErrors[MessageData])
909903

910904
/** Returns a list of messages for a given thread.
@@ -989,7 +983,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
989983
def createAssistant(createAssistantBody: CreateAssistantBody): Request[Either[OpenAIException, AssistantData]] =
990984
betaOpenAIAuthRequest
991985
.post(openAIUris.Assistants)
992-
.body(createAssistantBody)
986+
.body(asJson(createAssistantBody))
993987
.response(asJson_parseErrors[AssistantData])
994988

995989
/** Returns a list of assistants.
@@ -1032,7 +1026,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
10321026
def modifyAssistant(assistantId: String, modifyAssistantBody: ModifyAssistantBody): Request[Either[OpenAIException, AssistantData]] =
10331027
betaOpenAIAuthRequest
10341028
.post(openAIUris.assistant(assistantId))
1035-
.body(modifyAssistantBody)
1029+
.body(asJson(modifyAssistantBody))
10361030
.response(asJson_parseErrors[AssistantData])
10371031

10381032
/** Delete an assistant.
@@ -1059,7 +1053,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
10591053
def createRun(threadId: String, createRun: CreateRun): Request[Either[OpenAIException, RunData]] =
10601054
betaOpenAIAuthRequest
10611055
.post(openAIUris.threadRuns(threadId))
1062-
.body(createRun)
1056+
.body(asJson(createRun))
10631057
.response(asJson_parseErrors[RunData])
10641058

10651059
/** Create a thread and run it in one request.
@@ -1072,7 +1066,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
10721066
def createThreadAndRun(createThreadAndRun: CreateThreadAndRun): Request[Either[OpenAIException, RunData]] =
10731067
betaOpenAIAuthRequest
10741068
.post(openAIUris.ThreadsRuns)
1075-
.body(createThreadAndRun)
1069+
.body(asJson(createThreadAndRun))
10761070
.response(asJson_parseErrors[RunData])
10771071

10781072
/** Returns a list of runs belonging to a thread..
@@ -1157,7 +1151,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
11571151
def modifyRun(threadId: String, runId: String, metadata: Map[String, String]): Request[Either[OpenAIException, RunData]] =
11581152
betaOpenAIAuthRequest
11591153
.post(openAIUris.threadRun(threadId, runId))
1160-
.body(ModifyRun(metadata))
1154+
.body(asJson(ModifyRun(metadata)))
11611155
.response(asJson_parseErrors[RunData])
11621156

11631157
/** When a run has the status: "requires_action" and required_action.type is submit_tool_outputs, this endpoint can be used to submit the
@@ -1175,7 +1169,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
11751169
def submitToolOutputs(threadId: String, runId: String, toolOutputs: Seq[ToolOutput]): Request[Either[OpenAIException, RunData]] =
11761170
betaOpenAIAuthRequest
11771171
.post(openAIUris.threadRunSubmitToolOutputs(threadId, runId))
1178-
.body(SubmitToolOutputsToRun(toolOutputs))
1172+
.body(asJson(SubmitToolOutputsToRun(toolOutputs)))
11791173
.response(asJson_parseErrors[RunData])
11801174

11811175
/** Cancels a run that is in_progress.
@@ -1203,7 +1197,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
12031197
def createVectorStore(createVectorStoreBody: CreateVectorStoreBody): Request[Either[OpenAIException, VectorStore]] =
12041198
betaOpenAIAuthRequest
12051199
.post(openAIUris.VectorStores)
1206-
.body(createVectorStoreBody)
1200+
.body(asJson(createVectorStoreBody))
12071201
.response(asJson_parseErrors[VectorStore])
12081202

12091203
/** Lists vector store
@@ -1247,7 +1241,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
12471241
): Request[Either[OpenAIException, VectorStore]] =
12481242
betaOpenAIAuthRequest
12491243
.post(openAIUris.vectorStore(vectorStoreId))
1250-
.body(modifyVectorStoreBody)
1244+
.body(asJson(modifyVectorStoreBody))
12511245
.response(asJson_parseErrors[VectorStore])
12521246

12531247
/** Deletes vector store
@@ -1277,7 +1271,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
12771271
): Request[Either[OpenAIException, VectorStoreFile]] =
12781272
betaOpenAIAuthRequest
12791273
.post(openAIUris.vectorStoreFiles(vectorStoreId))
1280-
.body(createVectorStoreFileBody)
1274+
.body(asJson(createVectorStoreFileBody))
12811275
.response(asJson_parseErrors[VectorStoreFile])
12821276

12831277
/** List files belonging to particular datastore
@@ -1337,7 +1331,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
13371331
def createBatch(createBatchRequest: BatchRequestBody): Request[Either[OpenAIException, BatchResponse]] =
13381332
openAIAuthRequest
13391333
.post(openAIUris.Batches)
1340-
.body(createBatchRequest)
1334+
.body(asJson(createBatchRequest))
13411335
.response(asJson_parseErrors[BatchResponse])
13421336

13431337
/** Retrieves a batch.
@@ -1399,7 +1393,7 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
13991393
def createAdminApiKey(createAdminApiKeyRequest: AdminApiKeyRequestBody): Request[Either[OpenAIException, AdminApiKeyResponse]] =
14001394
openAIAuthRequest
14011395
.post(openAIUris.AdminApiKeys)
1402-
.body(createAdminApiKeyRequest)
1396+
.body(asJson(createAdminApiKeyRequest))
14031397
.response(asJson_parseErrors[AdminApiKeyResponse])
14041398

14051399
/** Retrieve a single organization API key
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,86 @@
11
package sttp.openai
22

3-
import sttp.client4.{DeserializationException, HttpError, ResponseException}
3+
import sttp.client4.ResponseException
4+
import sttp.client4.ResponseException.{DeserializationException, UnexpectedStatusCode}
5+
import sttp.model.ResponseMetadata
46

57
object OpenAIExceptions {
68
sealed abstract class OpenAIException(
79
val message: Option[String],
810
val `type`: Option[String],
911
val param: Option[String],
1012
val code: Option[String],
11-
val cause: ResponseException[String, Exception]
13+
val cause: ResponseException[String]
1214
) extends Exception(cause.getMessage, cause)
1315

1416
object OpenAIException {
1517
class DeserializationOpenAIException(
1618
message: String,
17-
cause: DeserializationException[Exception]
19+
cause: DeserializationException
1820
) extends OpenAIException(Some(message), None, None, None, cause)
1921

2022
object DeserializationOpenAIException {
21-
def apply(cause: DeserializationException[Exception]): DeserializationOpenAIException =
23+
def apply(cause: DeserializationException): DeserializationOpenAIException =
2224
new DeserializationOpenAIException(cause.getMessage, cause)
2325

24-
def apply(cause: Exception): DeserializationOpenAIException = apply(DeserializationException(cause.getMessage, cause))
26+
def apply(cause: Exception, meta: ResponseMetadata): DeserializationOpenAIException = apply(
27+
DeserializationException(cause.getMessage, cause, meta)
28+
)
2529
}
2630
class RateLimitException(
2731
message: Option[String],
2832
`type`: Option[String],
2933
param: Option[String],
3034
code: Option[String],
31-
cause: HttpError[String]
35+
cause: UnexpectedStatusCode[String]
3236
) extends OpenAIException(message, `type`, param, code, cause)
3337

3438
class InvalidRequestException(
3539
message: Option[String],
3640
`type`: Option[String],
3741
param: Option[String],
3842
code: Option[String],
39-
cause: HttpError[String]
43+
cause: UnexpectedStatusCode[String]
4044
) extends OpenAIException(message, `type`, param, code, cause)
4145

4246
class AuthenticationException(
4347
message: Option[String],
4448
`type`: Option[String],
4549
param: Option[String],
4650
code: Option[String],
47-
cause: HttpError[String]
51+
cause: UnexpectedStatusCode[String]
4852
) extends OpenAIException(message, `type`, param, code, cause)
4953

5054
class PermissionException(
5155
message: Option[String],
5256
`type`: Option[String],
5357
param: Option[String],
5458
code: Option[String],
55-
cause: HttpError[String]
59+
cause: UnexpectedStatusCode[String]
5660
) extends OpenAIException(message, `type`, param, code, cause)
5761

5862
class TryAgain(
5963
message: Option[String],
6064
`type`: Option[String],
6165
param: Option[String],
6266
code: Option[String],
63-
cause: HttpError[String]
67+
cause: UnexpectedStatusCode[String]
6468
) extends OpenAIException(message, `type`, param, code, cause)
6569

6670
class ServiceUnavailableException(
6771
message: Option[String],
6872
`type`: Option[String],
6973
param: Option[String],
7074
code: Option[String],
71-
cause: HttpError[String]
75+
cause: UnexpectedStatusCode[String]
7276
) extends OpenAIException(message, `type`, param, code, cause)
7377

7478
class APIException(
7579
message: Option[String],
7680
`type`: Option[String],
7781
param: Option[String],
7882
code: Option[String],
79-
cause: HttpError[String]
83+
cause: UnexpectedStatusCode[String]
8084
) extends OpenAIException(message, `type`, param, code, cause)
8185
}
8286
}

0 commit comments

Comments
 (0)