Packages
openai_ex
0.3.0
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/http.ex
defmodule OpenaiEx.Http do
@moduledoc false
@base_url "https://api.openai.com/v1"
@doc false
def headers(openai = %OpenaiEx{}) do
headers = [{"Authorization", "Bearer #{openai.token}"}]
if is_nil(openai.organization) do
headers
else
headers ++ [{"OpenAI-Organization", openai.organization}]
end
end
@doc false
def post(openai = %OpenaiEx{}, url, multipart: multipart) do
:post
|> Finch.build(
@base_url <> url,
headers(openai) ++
[
{"Content-Type", Multipart.content_type(multipart, "multipart/form-data")},
{"Content-Length", to_string(Multipart.content_length(multipart))}
],
{:stream, Multipart.body_stream(multipart)}
)
|> finch_run()
end
@doc false
def post(openai = %OpenaiEx{}, url, json: json) do
build_post(openai, url, json: json)
|> finch_run()
end
@doc false
def build_post(openai = %OpenaiEx{}, url, json: json) do
:post
|> Finch.build(
@base_url <> url,
headers(openai) ++ [{"Content-Type", "application/json"}],
Jason.encode_to_iodata!(json)
)
end
@doc false
def get(openai = %OpenaiEx{}, url) do
:get
|> Finch.build(@base_url <> url, headers(openai))
|> finch_run()
end
def get_no_decode(openai = %OpenaiEx{}, url) do
:get
|> Finch.build(@base_url <> url, headers(openai))
|> finch_run_no_decode()
end
@doc false
def delete(openai = %OpenaiEx{}, url) do
:delete
|> Finch.build(@base_url <> url, headers(openai))
|> finch_run()
end
@doc false
def finch_run(finch_request) do
finch_request
|> finch_run_no_decode()
|> Jason.decode!()
end
def finch_run_no_decode(finch_request) do
finch_request
|> Finch.request!(OpenaiEx.Finch, receive_timeout: 45_000)
|> Map.get(:body)
end
@doc false
def to_multi_part_form_data(req, file_fields) do
mp =
req
|> Map.drop(file_fields)
|> Enum.reduce(Multipart.new(), fn {k, v}, acc ->
acc |> Multipart.add_part(Multipart.Part.text_field(v, k))
end)
req
|> Map.take(file_fields)
|> Enum.reduce(mp, fn {k, v}, acc ->
acc |> Multipart.add_part(to_file_field_part(k, v))
end)
end
@doc false
defp to_file_field_part(k, v) do
case v do
{path} ->
Multipart.Part.file_field(path, k)
{filename, content} ->
Multipart.Part.file_content_field(filename, content, k, filename: filename)
content ->
Multipart.Part.file_content_field("", content, k, filename: "")
end
end
end