lib/url_generator.ex

defmodule ExOpenAi.URLGenerator do
  @moduledoc """
  Generates the URL for the API request.
  """

  @doc """
  Infers the URL for the API request based on the module name.
  """
  @spec infer_url(module) :: String.t()
  def infer_url(module) do
    case Module.split(module) do
      # Completions is being deprecated.
      ["ExOpenAi", "Completion"] -> "https://api.openai.com/v1/completions"
      ["ExOpenAi", "Images", "Image"] -> "https://api.openai.com/v1/images/generations"
      ["ExOpenAi", "Images", "Edit"] -> "https://api.openai.com/v1/images/edits"
      ["ExOpenAi", "Images", "Variation"] -> "https://api.openai.com/v1/images/variations"
      ["ExOpenAi", "Chat"] -> "https://api.openai.com/v1/chat/completions"
      ["ExOpenAi", "Edit"] -> "https://api.openai.com/v1/edits"
      ["ExOpenAi", "Embedding"] -> "https://api.openai.com/v1/embeddings"
      ["ExOpenAi", "Audio", "Speech"] -> "https://api.openai.com/v1/audio/speech"
      ["ExOpenAi", "Audio", "Translation"] -> "https://api.openai.com/v1/audio/translations"
      ["ExOpenAi", "Audio", "Transcription"] -> "https://api.openai.com/v1/audio/transcriptions"
      ["ExOpenAi", "FineTuningJob"] -> "https://api.openai.com/v1/fine_tuning/jobs"
      ["ExOpenAi", "Files", "File"] -> "https://api.openai.com/v1/files"
      ["ExOpenAi", "Model"] -> "https://api.openai.com/v1/models"
      ["ExOpenAi", "Moderation"] -> "https://api.openai.com/v1/moderations"

      # "As of the time of V1 release the below endpoints are considered in Beta"
      ["ExOpenAi", "Assistants", "Assistant"] -> "https://api.openai.com/v1/assistants"
      ["ExOpenAi", "Thread"] -> "https://api.openai.com/v1/threads"
      ["ExOpenAi", "Message"] -> "https://api.openai.com/v1/threads"
      ["ExOpenAi", "Run"] -> "https://api.openai.com/v1/threads"
      _ -> "https://api.openai.com/v1"
    end
  end
end