defmodule Noizu.OpenAI.Api.File do @moduledoc """ Noizu.OpenAI.Api.File is a module that provides functionality for managing files using OpenAI's API. This module offers several functions for file management: 1. `list/1` - Lists all the files. 2. `info/2` - Retrieves information about a specific file. 3. `fetch/2` - Fetches the content of a specific file. 4. `create/2` - Creates a new file with the given file and options. 5. `delete/2` - Deletes a specific file. ## Usage {:ok, files} = Noizu.OpenAI.Api.File.list(options) {:ok, file_info} = Noizu.OpenAI.Api.File.info(file, options) {:ok, file_content} = Noizu.OpenAI.Api.File.fetch(file, options) {:ok, new_file} = Noizu.OpenAI.Api.File.create(file, options) {:ok, deleted_file} = Noizu.OpenAI.Api.File.delete(file, options) """ require Noizu.OpenAI import Noizu.OpenAI #------------------------------- # #------------------------------- @doc """ Fetches a list of files from the OpenAI API. ## Parameters - options: A map or keyword list of options, such as stream (for streaming API calls) ## Returns Returns a tuple {:ok, response} on successful retrieval, where response is a map containing the list of files. Returns {:error, term} on failure, where term contains error details. ## Example {:ok, response} = Noizu.OpenAI.Api.File.list() """ @type files_response() :: map() @type files_options() :: Noizu.OpenAI.stream_options() @spec list(files_options) :: {:ok, files_response()} | {:error, term} def list(options \\ nil) do url = openai_base() <> "files" body = nil api_call(:get, url, body, Noizu.OpenAI.Files, options) end #------------------------------- # #------------------------------- @doc """ Fetches a list of files from the OpenAI API. ## Parameters - options: A map or keyword list of options, such as stream (for streaming API calls) ## Returns Returns a tuple {:ok, response} on successful retrieval, where response is a map containing the list of files. Returns {:error, term} on failure, where term contains error details. ## Example {:ok, response} = Noizu.OpenAI.Api.File.info() """ @type file_info_response() :: map() @type file_info_options() :: Noizu.OpenAI.stream_options() @spec info(file_id :: String.t(), file_info_options()) :: {:ok, file_info_response()} | {:error, term} def info(file, options \\ nil) do url = openai_base() <> "files/#{file}" body = nil api_call(:get, url, body, Noizu.OpenAI.File, options) end #------------------------------- # #------------------------------- @doc """ Retrieves the content of a specific file by its ID from the OpenAI API. ## Parameters - file: The ID of the file to retrieve content from - options: Optional keyword list or map containing stream options ## Returns Returns a tuple {:ok, file_response()} on success, where file_response() is a map containing file content. Returns {:error, term} on failure, where term contains error details. """ @type file_response() :: map() @type file_options() :: Noizu.OpenAI.stream_options() @spec fetch(file :: String.t(), file_options) :: {:ok, file_response()} | {:error, term} def fetch(file, options \\ nil) do url = openai_base() <> "files/#{file}/content" body = nil options = put_in(options || [], [:raw], true) api_call(:get, url, body, Noizu.OpenAI.File.Content, options) end #------------------------------- # #------------------------------- @doc """ Uploads a file to OpenAI's API for use in various features like fine-tuning. ## Parameters - file: The URL of the file to be uploaded - options: A keyword list or map containing optional parameters - :purpose (String.t()): The purpose of the uploaded file (e.g., "fine-tuning") - :stream (boolean): A boolean value to indicate whether the request should be processed as a stream or not (default: false) ## Returns Returns a tuple {:ok, upload_file_response()} on successful file upload, where upload_file_response() is a map containing the response data. Returns {:error, term} on failure, where term contains error details. ## Example file_url = "https://example.com/my_file.txt" options = [purpose: "fine-tuning"] {:ok, response} = Noizu.OpenAI.upload_file(file_url, options) """ @type upload_file_response() :: map() @type upload_file_options() :: %{ optional(:purpose) => Noizu.OpenAI.purpose_option(), optional(:stream) => Noizu.OpenAI.stream_option(), } | Keyword.t() @spec create(file :: String.t(), options :: upload_file_options()) :: {:ok, upload_file_response()} | {:error, term} def create(file, options \\ nil) do url = openai_base() <> "files" body = %{file: file} |> put_field(:purpose, options) api_call(:post, url, body, Noizu.OpenAI.File, options) end #------------------------------- # #------------------------------- @doc """ Deletes a file from the OpenAI API. ## Parameters - file: The ID of the file to be deleted - options: An optional keyword list or map containing stream options ## Returns Returns a tuple {:ok, delete_file_response()} on successful file deletion. Returns {:error, term} on failure, where term contains error details. ## Example file_id = "your_file_id_here" {:ok, response} = Noizu.OpenAI.delete_file(file_id) """ @type delete_file_response() :: map() @type delete_file_options() :: Noizu.OpenAI.stream_options() @spec delete(file :: String.t(), delete_file_options) :: {:ok, delete_file_response()} | {:error, term} def delete(file, options \\ nil) do url = openai_base() <> "files/#{file}" body = nil api_call(:delete, url, body, Noizu.OpenAI.File.Delete, options) end end