Packages

The official Elixir client for Replicate. It lets you run models from your Elixir code, and everything else you can do with Replicate's HTTP API.

Current section

Files

Jump to
replicate lib models.ex
Raw

lib/models.ex

defmodule Replicate.Models do
@moduledoc """
Documentation for `Models`.
"""
@behaviour Replicate.Models.Behaviour
@replicate_client Application.compile_env(:replicate, :replicate_client, Replicate.Client)
alias Replicate.Models.Model
@doc """
Gets a model from a owner/name string. Raises an error if the model doesn't exist.
## Examples
```
iex> %Model{owner: owner, name: name} = Replicate.Models.get!("replicate/hello-world")
iex> owner
"replicate"
iex> name
"hello-world"
```
"""
def get!(name) do
[username, name] = String.split(name, "/")
{:ok, result} = @replicate_client.request(:get, "/v1/models/#{username}/#{name}")
model = Jason.decode!(result) |> string_to_atom()
struct(Model, model)
end
@doc """
Returns a list of all versions for a model.
## Examples
```
iex> model = Replicate.Models.get!("replicate/hello-world")
iex> versions = Replicate.Models.list_versions(model)
iex> %Replicate.Versions.Version{id: id, cog_version: cog_version} = List.first(versions)
iex> id
"v1"
iex> cog_version
"0.3.0"
```
"""
def list_versions(%Model{owner: owner, name: name}) do
case @replicate_client.request(:get, "/v1/models/#{owner}/#{name}/versions") do
{:ok, results} ->
%{"results" => versions} = Jason.decode!(results)
versions
|> Enum.map(fn v ->
atom_map = string_to_atom(v)
struct(Replicate.Versions.Version, atom_map)
end)
{:error, message} ->
raise message
end
end
defp string_to_atom(body) do
for {k, v} <- body, into: %{}, do: {String.to_atom(k), v}
end
end