Packages

community-maintained OpenAI API Wrapper written in Elixir. Modded for mt.

Current section

Files

Jump to
openaimt lib openai client.ex
Raw

lib/openai/client.ex

defmodule OpenAI.Client do
@moduledoc false
alias OpenAI.Config
use HTTPoison.Base
def process_url(url), do: Config.api_url() <> url
def process_response_body(body), do: JSON.decode(body)
def handle_response(httpoison_response) do
case httpoison_response do
{:ok, %HTTPoison.Response{status_code: 200, body: {:ok, body}}} ->
res =
body
|> Enum.map(fn {k, v} -> {String.to_atom(k), v} end)
|> Map.new()
{:ok, res}
{:ok, %HTTPoison.Response{body: {:ok, body}}} ->
{:error, body}
{:error, %HTTPoison.Error{reason: reason}} ->
{:error, reason}
end
end
def add_organization_header(headers, config) do
if Map.has_key?(config, :org_key) do
[{"OpenAI-Organization", config[:org_key]} | headers]
else
headers
end
end
def request_headers(config) do
[
bearer(config),
{"Content-type", "application/json"}
]
|> add_organization_header(config)
end
def bearer(config), do: {"Authorization", "Bearer #{config[:api_key]}"}
def request_options(), do: Config.http_options()
def api_get(url, custom_config, request_options \\ []) do
request_options = Keyword.merge(request_options(), request_options)
url
|> get(request_headers(custom_config), request_options)
|> handle_response()
end
def api_post(url, custom_config, params \\ [], request_options \\ []) do
body =
params
|> Enum.into(%{})
|> JSON.Encoder.encode()
|> elem(1)
request_options = Keyword.merge(request_options(), request_options)
url
|> post(body, request_headers(custom_config), request_options)
|> handle_response()
end
def multipart_api_post(url, config, file_path, file_param, params, request_options \\ []) do
body_params = params |> Enum.map(fn {k, v} -> {Atom.to_string(k), v} end)
body = {
:multipart,
[
{:file, file_path,
{"form-data", [{:name, file_param}, {:filename, Path.basename(file_path)}]}, []}
] ++ body_params
}
request_options = Keyword.merge(request_options(), request_options)
url
|> post(body, request_headers(config), request_options)
|> handle_response()
end
def api_delete(url, custom_config, request_options \\ []) do
request_options = Keyword.merge(request_options(), request_options)
url
|> delete(request_headers(custom_config), request_options)
|> handle_response()
end
end