Packages
openai_ex
0.1.3
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.ex
defmodule OpenaiEx do
@moduledoc """
`OpenaiEx` is an Elixir library that provides a community-maintained client for the OpenAI API.
The library closely follows the structure of the [official OpenAI API client libraries](https://platform.openai.com/docs/api-reference)
for [Python](https://github.com/openai/openai-python)
and [JavaScript](https://github.com/openai/openai-node),
making it easy to understand and reuse existing documentation and code.
"""
@enforce_keys [:token]
defstruct token: nil, organization: nil
@doc """
Creates a new OpenaiEx struct with the specified token and organization.
See https://platform.openai.com/docs/api-reference/authentication for details.
"""
def new(token, organization \\ nil) do
%OpenaiEx{
token: token,
organization: organization
}
end
@doc false
def middleware(openai = %OpenaiEx{}) do
mw = [{Tesla.Middleware.BaseUrl, "https://api.openai.com/v1"}]
headers = [{"Authorization", "Bearer #{openai.token}"}]
if is_nil(openai.organization) do
mw ++ [{Tesla.Middleware.Headers, headers}]
else
mw ++
[{Tesla.Middleware.Headers, headers ++ [{"OpenAI-Organization", openai.organization}]}]
end
end
@doc false
def post(openai = %OpenaiEx{}, url, json: json) do
(middleware(openai) ++ [Tesla.Middleware.JSON])
|> Tesla.client()
|> Tesla.post!(url, json)
|> Map.get(:body)
end
def post(openai = %OpenaiEx{}, url, multipart: multipart) do
(middleware(openai) ++ [Tesla.Middleware.DecodeJson])
|> Tesla.client()
|> Tesla.post!(url, multipart)
|> Map.get(:body)
end
@doc false
def get(openai = %OpenaiEx{}, url) do
(middleware(openai) ++ [Tesla.Middleware.JSON])
|> Tesla.client()
|> Tesla.get!(url)
|> Map.get(:body)
end
@doc false
def to_multi_part_form_data(req, file_keys) do
mp =
req
|> Map.drop(file_keys)
|> Enum.reduce(Tesla.Multipart.new(), fn {k, v}, acc ->
acc |> Tesla.Multipart.add_field(to_string(k), v)
end)
req
|> Map.take(file_keys)
|> Enum.reduce(mp, fn {k, v}, acc ->
{filename, content} =
case v do
{f, c} -> {f, c}
c -> {"", c}
end
acc |> Tesla.Multipart.add_file_content(content, filename, name: to_string(k))
end)
end
end