defmodule Replicate.Client do
@moduledoc """
Documentation for the Client
"""
@host Application.compile_env(:replicate, :replicate_base_url, "https://api.replicate.com")
@behaviour Replicate.Client.Behaviour
@poll_interval Application.compile_env(:replicate, :replicate_poll_interval, 500)
@timeout Application.compile_env(:replicate, :replicate_timeout, 60_000)
alias Replicate.Predictions
alias Replicate.Predictions.Prediction
defp header() do
token = Application.fetch_env!(:replicate, :replicate_api_token)
[
Authorization: "Token #{token}",
"Content-Type": "application/json"
]
end
def request(method, path), do: request(method, path, [])
def request(method, path, body) do
case HTTPoison.request!(method, "#{@host}#{path}", body, header(),
timeout: @timeout,
recv_timeout: @timeout
) do
%HTTPoison.Response{status_code: 200, body: body} ->
{:ok, body}
%HTTPoison.Response{status_code: 201, body: body} ->
{:ok, body}
%HTTPoison.Response{body: body} ->
detail = Jason.decode!(body)["detail"]
{:error, detail}
end
end
def wait({:ok, %Prediction{id: id, status: status} = prediction}) do
cond do
status in ["starting", "processing"] ->
Process.sleep(@poll_interval)
Predictions.get(id)
|> wait()
true ->
{:ok, prediction}
end
end
def wait({:error, message}), do: {:error, message}
end