Packages
openai_ex
0.5.8
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
@doc false
def headers(openai = %OpenaiEx{}) do
openai._http_headers
end
def request_options(openai = %OpenaiEx{}) do
[receive_timeout: openai |> Map.get(:receive_timeout)]
end
def build_finch(method, openai = %OpenaiEx{}, url) do
Finch.build(method, openai.base_url <> url, headers(openai))
end
@doc false
def post(openai = %OpenaiEx{}, url) do
post(openai, url, json: %{})
end
@doc false
def post(openai = %OpenaiEx{}, url, multipart: multipart) do
:post
|> Finch.build(
openai.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(openai)
end
@doc false
def post(openai = %OpenaiEx{}, url, json: json) do
build_post(openai, url, json: json)
|> finch_run(openai)
end
@doc false
def post_no_decode(openai = %OpenaiEx{}, url, json: json) do
build_post(openai, url, json: json)
|> finch_run_no_decode(openai)
end
@doc false
def build_post(openai = %OpenaiEx{}, url, json: json) do
:post
|> Finch.build(
openai.base_url <> url,
headers(openai) ++ [{"Content-Type", "application/json"}],
Jason.encode_to_iodata!(json)
)
end
@doc false
def get(openai = %OpenaiEx{}, base_url, params) do
query =
base_url
|> URI.new!()
|> URI.append_query(params |> URI.encode_query())
|> URI.to_string()
openai |> get(query)
end
@doc false
def get(openai = %OpenaiEx{}, url) do
:get |> build_finch(openai, url) |> finch_run(openai)
end
def get_no_decode(openai = %OpenaiEx{}, url) do
:get |> build_finch(openai, url) |> finch_run_no_decode(openai)
end
@doc false
def delete(openai = %OpenaiEx{}, url) do
:delete |> build_finch(openai, url) |> finch_run(openai)
end
@doc false
def finch_run(finch_request, openai = %OpenaiEx{}) do
finch_request |> finch_run_no_decode(openai) |> Jason.decode!()
end
def finch_run_no_decode(finch_request, openai = %OpenaiEx{}) do
finch_request
|> Finch.request!(Map.get(openai, :finch_name), request_options(openai))
|> 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