Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove deprecated stuff, no longer available in OpenAI API #281

Merged
merged 2 commits into from
Feb 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 9 additions & 113 deletions core/src/main/scala/sttp/openai/OpenAI.scala
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package sttp.openai

import sttp.capabilities.Streams
import sttp.client4._
import sttp.model.{Header, Uri}
import sttp.openai.OpenAIExceptions.OpenAIException
Expand All @@ -12,47 +13,31 @@ import sttp.openai.json.SttpUpickleApiExtension.{
}
import sttp.openai.requests.assistants.AssistantsRequestBody.{CreateAssistantBody, ModifyAssistantBody}
import sttp.openai.requests.assistants.AssistantsResponseData.{AssistantData, DeleteAssistantResponse, ListAssistantsResponse}
import sttp.openai.requests.audio.AudioResponseData.AudioResponse
import sttp.openai.requests.audio.RecognitionModel
import sttp.openai.requests.audio.transcriptions.TranscriptionConfig
import sttp.openai.requests.audio.translations.TranslationConfig
import sttp.openai.requests.completions.CompletionsRequestBody.CompletionsBody
import sttp.openai.requests.completions.CompletionsResponseData.CompletionsResponse
import sttp.openai.requests.completions.chat.ChatRequestBody.ChatBody
import sttp.openai.requests.completions.chat.ChatRequestResponseData.ChatResponse
import sttp.openai.requests.completions.edit.EditRequestBody.EditBody
import sttp.openai.requests.completions.edit.EditRequestResponseData.EditResponse
import sttp.openai.requests.embeddings.EmbeddingsRequestBody.EmbeddingsBody
import sttp.openai.requests.embeddings.EmbeddingsResponseBody.EmbeddingResponse
import sttp.openai.requests.files.FilesResponseData._
import sttp.openai.requests.finetunes.FineTunesRequestBody
import sttp.openai.requests.finetunes.FineTunesResponseData.{
DeleteFineTuneModelResponse,
FineTuneEventsResponse,
FineTuneResponse,
GetFineTunesResponse
}
import sttp.openai.requests.images.ImageResponseData.ImageResponse
import sttp.openai.requests.images.creation.ImageCreationRequestBody.ImageCreationBody
import sttp.openai.requests.images.edit.ImageEditsConfig
import sttp.openai.requests.images.variations.ImageVariationsConfig
import sttp.openai.requests.models.ModelsResponseData.{ModelData, ModelsResponse}
import sttp.openai.requests.moderations.ModerationsRequestBody.ModerationsBody
import sttp.openai.requests.moderations.ModerationsResponseData.ModerationData
import sttp.openai.requests.audio.AudioResponseData.AudioResponse
import sttp.openai.requests.audio.transcriptions.TranscriptionConfig
import sttp.openai.requests.audio.translations.TranslationConfig
import sttp.openai.requests.audio.RecognitionModel
import sttp.capabilities.Streams
import sttp.openai.requests.threads.QueryParameters
import sttp.openai.requests.threads.ThreadsRequestBody.CreateThreadBody
import sttp.openai.requests.threads.ThreadsResponseData.{DeleteThreadResponse, ThreadData}
import sttp.openai.requests.threads.messages.ThreadMessagesRequestBody.CreateMessage
import sttp.openai.requests.threads.messages.ThreadMessagesResponseData.{ListMessagesResponse, MessageData}
import sttp.openai.requests.threads.runs.ThreadRunsRequestBody.{
CreateRun,
CreateThreadAndRun,
ModifyRun,
SubmitToolOutputsToRun,
ToolOutput
}
import sttp.openai.requests.threads.runs.ThreadRunsRequestBody._
import sttp.openai.requests.threads.runs.ThreadRunsResponseData.{ListRunStepsResponse, ListRunsResponse, RunData, RunStepData}
import sttp.openai.requests.threads.QueryParameters
import sttp.openai.requests.vectorstore.VectorStoreRequestBody.{CreateVectorStoreBody, ModifyVectorStoreBody}
import sttp.openai.requests.vectorstore.VectorStoreResponseData.{DeleteVectorStoreResponse, ListVectorStoresResponse, VectorStore}
import sttp.openai.requests.vectorstore.file.VectorStoreFileRequestBody.{CreateVectorStoreFileBody, ListVectorStoreFilesBody}
Expand Down Expand Up @@ -96,6 +81,8 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
*
* @param completionBody
* Create completion request body.
* @deprecated
* This is marked as Legacy in OpenAI API and might be removed in the future. Please use createChatCompletion instead.
*/
def createCompletion(completionBody: CompletionsBody): Request[Either[OpenAIException, CompletionsResponse]] =
openAIAuthRequest
Expand Down Expand Up @@ -245,19 +232,6 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
}
.response(asJson_parseErrors[ImageResponse])

/** Creates a new edit for provided request body.
*
* [[https://platform.openai.com/docs/api-reference/edits/create]]
*
* @param editRequestBody
* Edit request body.
*/
def createEdit(editRequestBody: EditBody): Request[Either[OpenAIException, EditResponse]] =
openAIAuthRequest
.post(openAIUris.Edits)
.body(editRequestBody)
.response(asJson_parseErrors[EditResponse])

/** Creates a model response for the given chat conversation defined in chatBody.
*
* [[https://platform.openai.com/docs/api-reference/chat/create]]
Expand Down Expand Up @@ -567,42 +541,6 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
}
.response(asJson_parseErrors[AudioResponse])

/** Creates a job that fine-tunes a specified model from a given dataset.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/create]]
*
* @param fineTunesRequestBody
* Request body that will be used to create a fine-tune.
*/
def createFineTune(
fineTunesRequestBody: FineTunesRequestBody
): Request[Either[OpenAIException, FineTuneResponse]] =
openAIAuthRequest
.post(openAIUris.FineTunes)
.body(fineTunesRequestBody)
.response(asJson_parseErrors[FineTuneResponse])

/** List of your organization's fine-tuning jobs.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/list]]
*/
def getFineTunes: Request[Either[OpenAIException, GetFineTunesResponse]] =
openAIAuthRequest
.get(openAIUris.FineTunes)
.response(asJson_parseErrors[GetFineTunesResponse])

/** Immediately cancel a fine-tune job.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/cancel]]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's the first one I checked, but it seems to be there? maybe the path is different though?

https://platform.openai.com/docs/api-reference/fine-tuning/cancel

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Path has changed from fine-tunes to fine-tuning/jobs. Also request data has changed and most probably response. Currently I am working on add again new fine-tuning API.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, I'll merge this then :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I meant request and response for creating of fine-tuning.

*
* @param fineTuneId
* The ID of the fine-tune job to cancel.
*/
def cancelFineTune(fineTuneId: String): Request[Either[OpenAIException, FineTuneResponse]] =
openAIAuthRequest
.post(openAIUris.cancelFineTune(fineTuneId))
.response(asJson_parseErrors[FineTuneResponse])

/** Gets info about the fine-tune job.
*
* [[https://platform.openai.com/docs/api-reference/embeddings/create]]
Expand All @@ -616,42 +554,6 @@ class OpenAI(authToken: String, baseUri: Uri = OpenAIUris.OpenAIBaseUri) {
.body(embeddingsBody)
.response(asJson_parseErrors[EmbeddingResponse])

/** Gets info about the fine-tune job.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/retrieve]]
*
* @param fineTuneId
* The ID of the fine-tune job.
*/
def retrieveFineTune(fineTuneId: String): Request[Either[OpenAIException, FineTuneResponse]] =
openAIAuthRequest
.get(openAIUris.fineTune(fineTuneId))
.response(asJson_parseErrors[FineTuneResponse])

/** Delete a fine-tuned model. You must have the Owner role in your organization.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/delete-model]]
*
* @param model
* The model to delete.
*/
def deleteFineTuneModel(model: String): Request[Either[OpenAIException, DeleteFineTuneModelResponse]] =
openAIAuthRequest
.delete(openAIUris.fineTuneModel(model))
.response(asJson_parseErrors[DeleteFineTuneModelResponse])

/** Get fine-grained status updates for a fine-tune job.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/events]]
*
* @param fineTuneId
* The ID of the fine-tune job to get events for.
*/
def getFineTuneEvents(fineTuneId: String): Request[Either[OpenAIException, FineTuneEventsResponse]] =
openAIAuthRequest
.get(openAIUris.fineTuneEvents(fineTuneId))
.response(asJson_parseErrors[FineTuneEventsResponse])

/** Create a thread.
*
* [[https://platform.openai.com/docs/api-reference/threads/createThread]]
Expand Down Expand Up @@ -1129,11 +1031,9 @@ private class OpenAIUris(val baseUri: Uri) {
val ChatCompletions: Uri = uri"$baseUri/chat/completions"
val Completions: Uri = uri"$baseUri/completions"
val CreateImage: Uri = imageBase.addPath("generations")
val Edits: Uri = uri"$baseUri/edits"
val Embeddings: Uri = uri"$baseUri/embeddings"
val EditImage: Uri = imageBase.addPath("edits")
val Files: Uri = uri"$baseUri/files"
val FineTunes: Uri = uri"$baseUri/fine-tunes"
val Models: Uri = uri"$baseUri/models"
val Moderations: Uri = uri"$baseUri/moderations"
val Transcriptions: Uri = audioBase.addPath("transcriptions")
Expand All @@ -1145,12 +1045,8 @@ private class OpenAIUris(val baseUri: Uri) {
val ThreadsRuns: Uri = uri"$baseUri/threads/runs"
val VectorStores: Uri = uri"$baseUri/vector_stores"

def cancelFineTune(fineTuneId: String): Uri = FineTunes.addPath(fineTuneId, "cancel")
def file(fileId: String): Uri = Files.addPath(fileId)
def fileContent(fileId: String): Uri = Files.addPath(fileId, "content")
def fineTuneModel(model: String): Uri = Models.addPath(model)
def fineTuneEvents(fineTuneId: String): Uri = FineTunes.addPath(fineTuneId, "events")
def fineTune(fineTuneId: String): Uri = FineTunes.addPath(fineTuneId)
def model(modelId: String): Uri = Models.addPath(modelId)

def assistant(assistantId: String): Uri = Assistants.addPath(assistantId)
Expand Down
76 changes: 0 additions & 76 deletions core/src/main/scala/sttp/openai/OpenAISyncClient.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,9 @@ import sttp.openai.requests.completions.CompletionsRequestBody.CompletionsBody
import sttp.openai.requests.completions.CompletionsResponseData.CompletionsResponse
import sttp.openai.requests.completions.chat.ChatRequestBody.ChatBody
import sttp.openai.requests.completions.chat.ChatRequestResponseData.ChatResponse
import sttp.openai.requests.completions.edit.EditRequestBody.EditBody
import sttp.openai.requests.completions.edit.EditRequestResponseData.EditResponse
import sttp.openai.requests.embeddings.EmbeddingsRequestBody.EmbeddingsBody
import sttp.openai.requests.embeddings.EmbeddingsResponseBody.EmbeddingResponse
import sttp.openai.requests.files.FilesResponseData.{DeletedFileData, FileData, FilesResponse}
import sttp.openai.requests.finetunes.FineTunesRequestBody
import sttp.openai.requests.finetunes.FineTunesResponseData.{
DeleteFineTuneModelResponse,
FineTuneEventsResponse,
FineTuneResponse,
GetFineTunesResponse
}
import sttp.openai.requests.images.ImageResponseData.ImageResponse
import sttp.openai.requests.images.creation.ImageCreationRequestBody.ImageCreationBody
import sttp.openai.requests.images.edit.ImageEditsConfig
Expand Down Expand Up @@ -171,16 +162,6 @@ class OpenAISyncClient private (
def imageVariations(imageVariationsConfig: ImageVariationsConfig): ImageResponse =
sendOrThrow(openAI.imageVariations(imageVariationsConfig))

/** Creates a new edit for provided request body.
*
* [[https://platform.openai.com/docs/api-reference/edits/create]]
*
* @param editRequestBody
* Edit request body.
*/
def createEdit(editRequestBody: EditBody): EditResponse =
sendOrThrow(openAI.createEdit(editRequestBody))

/** Creates a model response for the given chat conversation defined in chatBody.
*
* [[https://platform.openai.com/docs/api-reference/chat/create]]
Expand Down Expand Up @@ -367,33 +348,6 @@ class OpenAISyncClient private (
def createTranscription(transcriptionConfig: TranscriptionConfig): AudioResponse =
sendOrThrow(openAI.createTranscription(transcriptionConfig))

/** Creates a job that fine-tunes a specified model from a given dataset.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/create]]
*
* @param fineTunesRequestBody
* Request body that will be used to create a fine-tune.
*/
def createFineTune(fineTunesRequestBody: FineTunesRequestBody): FineTuneResponse =
sendOrThrow(openAI.createFineTune(fineTunesRequestBody))

/** List of your organization's fine-tuning jobs.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/list]]
*/
def getFineTunes: GetFineTunesResponse =
sendOrThrow(openAI.getFineTunes)

/** Immediately cancel a fine-tune job.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/cancel]]
*
* @param fineTuneId
* The ID of the fine-tune job to cancel.
*/
def cancelFineTune(fineTuneId: String): FineTuneResponse =
sendOrThrow(openAI.cancelFineTune(fineTuneId))

/** Gets info about the fine-tune job.
*
* [[https://platform.openai.com/docs/api-reference/embeddings/create]]
Expand All @@ -404,36 +358,6 @@ class OpenAISyncClient private (
def createEmbeddings(embeddingsBody: EmbeddingsBody): EmbeddingResponse =
sendOrThrow(openAI.createEmbeddings(embeddingsBody))

/** Gets info about the fine-tune job.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/retrieve]]
*
* @param fineTuneId
* The ID of the fine-tune job.
*/
def retrieveFineTune(fineTuneId: String): FineTuneResponse =
sendOrThrow(openAI.retrieveFineTune(fineTuneId))

/** Delete a fine-tuned model. You must have the Owner role in your organization.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/delete-model]]
*
* @param model
* The model to delete.
*/
def deleteFineTuneModel(model: String): DeleteFineTuneModelResponse =
sendOrThrow(openAI.deleteFineTuneModel(model))

/** Get fine-grained status updates for a fine-tune job.
*
* [[https://platform.openai.com/docs/api-reference/fine-tunes/events]]
*
* @param fineTuneId
* The ID of the fine-tune job to get events for.
*/
def getFineTuneEvents(fineTuneId: String): FineTuneEventsResponse =
sendOrThrow(openAI.getFineTuneEvents(fineTuneId))

/** Create a thread.
*
* [[https://platform.openai.com/docs/api-reference/threads/createThread]]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,19 +82,11 @@ object CompletionsRequestBody {
}
)

case object TextDavinci003 extends CompletionModel("text-davinci-003")

case object TextDavinci002 extends CompletionModel("text-davinci-002")

case object TextCurie001 extends CompletionModel("text-curie-001")

case object TextBabbage001 extends CompletionModel("text-babbage-001")

case object TextAda001 extends CompletionModel("text-ada-001")
case object GPT35TurboInstruct extends CompletionModel("gpt-3.5-turbo-instruct")

case class CustomCompletionModel(customCompletionModel: String) extends CompletionModel(customCompletionModel)

val values: Set[CompletionModel] = Set(TextDavinci003, TextDavinci002, TextCurie001, TextBabbage001, TextAda001)
val values: Set[CompletionModel] = Set(GPT35TurboInstruct)

private val byCompletionModelValue = values.map(model => model.value -> model).toMap
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package sttp.openai.requests.completions.chat

import io.circe.{DecodingFailure, Json, JsonNumber, JsonObject}
import io.circe.syntax._
import io.circe.{DecodingFailure, Json, JsonNumber, JsonObject}
import sttp.apispec.Schema
import sttp.apispec.circe._
import sttp.openai.OpenAIExceptions.OpenAIException.DeserializationOpenAIException
Expand Down Expand Up @@ -249,8 +249,6 @@ object ChatRequestBody {

case object GPT4Turbo extends ChatCompletionModel("gpt-4-1106-preview")

case object GPT4TurboVision extends ChatCompletionModel("gpt-4-vision-preview")

case object GPT4o extends ChatCompletionModel("gpt-4o")

case object GPT4oMini extends ChatCompletionModel("gpt-4o-mini")
Expand All @@ -266,7 +264,6 @@ object ChatRequestBody {
GPT35Turbo,
GPT35Turbo0301,
GPT4Turbo,
GPT4TurboVision,
GPT4o,
GPT4oMini
)
Expand Down
Loading