Packages
openai_ex
0.9.21
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.2
0.4.1
0.4.0
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Community maintained Elixir library for OpenAI API
Current section
Files
Jump to
Current section
Files
lib/openai_ex/container_files.ex
defmodule OpenaiEx.ContainerFiles do
@moduledoc """
This module provides an implementation of the OpenAI Container Files API. The API reference can be found at https://platform.openai.com/docs/api-reference/container-files.
"""
alias OpenaiEx.Http
defp ep_url(container_id, file_id \\ nil, action \\ nil) do
base = "/containers/#{container_id}/files"
base
|> append_file_id(file_id)
|> append_action(action)
end
defp append_file_id(url, nil), do: url
defp append_file_id(url, file_id), do: "#{url}/#{file_id}"
defp append_action(url, nil), do: url
defp append_action(url, action), do: "#{url}/#{action}"
@doc """
Creates a new file upload request with the given arguments.
## Examples
iex> OpenaiEx.ContainerFiles.new_upload(file: {"test.txt", "content"})
%{file: {"test.txt", "content"}}
iex> OpenaiEx.ContainerFiles.new_upload(file: {"/path/to/file.txt"})
%{file: {"/path/to/file.txt"}}
"""
def new_upload(args) when is_list(args) do
args |> Enum.into(%{}) |> new_upload()
end
def new_upload(args) when is_map(args) do
args |> Map.take([:file]) |> validate_upload_request()
end
@doc """
Creates a new file reference request with the given arguments.
Example usage:
iex> OpenaiEx.ContainerFiles.new_reference(file_id: "file-123")
%{file_id: "file-123"}
"""
def new_reference(args) when is_list(args) do
args |> Enum.into(%{}) |> new_reference()
end
def new_reference(args) when is_map(args) do
args |> Map.take([:file_id]) |> validate_reference_request()
end
defp validate_upload_request(request) do
if Map.has_key?(request, :file) do
request
else
raise ArgumentError, "Upload request must include :file"
end
end
defp validate_reference_request(request) do
if Map.has_key?(request, :file_id) do
request
else
raise ArgumentError, "Reference request must include :file_id"
end
end
@doc """
Lists all files in a container.
See https://platform.openai.com/docs/api-reference/container-files/listContainerFiles
"""
def list!(openai = %OpenaiEx{}, container_id, params \\ %{}) do
openai |> list(container_id, params) |> Http.bang_it!()
end
def list(openai = %OpenaiEx{}, container_id, params \\ %{}) do
query_params = params |> Map.take(OpenaiEx.list_query_fields())
openai |> Http.get(ep_url(container_id), query_params)
end
@doc """
Creates a new container file via upload or file reference.
See https://platform.openai.com/docs/api-reference/container-files/createContainerFile
"""
def create!(openai = %OpenaiEx{}, container_id, request) do
openai |> create(container_id, request) |> Http.bang_it!()
end
def create(openai = %OpenaiEx{}, container_id, request) do
cond do
Map.has_key?(request, :file) ->
# Handle file upload with multipart
multipart = request |> Http.to_multi_part_form_data([:file])
openai |> Http.post(ep_url(container_id), multipart: multipart)
Map.has_key?(request, :file_id) ->
# Handle file reference with JSON
openai |> Http.post(ep_url(container_id), json: request)
true ->
{:error, "Request must include either :file or :file_id"}
end
end
@doc """
Retrieves a specific container file by ID.
See https://platform.openai.com/docs/api-reference/container-files/retrieveContainerFile
"""
def retrieve!(openai = %OpenaiEx{}, container_id, file_id) do
openai |> retrieve(container_id, file_id) |> Http.bang_it!()
end
def retrieve(openai = %OpenaiEx{}, container_id, file_id) do
openai |> Http.get(ep_url(container_id, file_id))
end
@doc """
Retrieves the content of a container file.
See https://platform.openai.com/docs/api-reference/container-files/retrieveContainerFileContent
"""
def content!(openai = %OpenaiEx{}, container_id, file_id) do
openai |> content(container_id, file_id) |> Http.bang_it!()
end
def content(openai = %OpenaiEx{}, container_id, file_id) do
openai |> Http.get_no_decode(ep_url(container_id, file_id, "content"))
end
@doc """
Deletes a container file.
See https://platform.openai.com/docs/api-reference/container-files/deleteContainerFile
"""
def delete!(openai = %OpenaiEx{}, container_id, file_id) do
openai |> delete(container_id, file_id) |> Http.bang_it!()
end
def delete(openai = %OpenaiEx{}, container_id, file_id) do
openai |> Http.delete(ep_url(container_id, file_id))
end
@doc false
def file_fields() do
[:file]
end
end