Image Generation Kino App
Mix.install([
{:openai_ex, "~> 0.9.22"},
{:kino, "~> 0.19.0"}
])
alias OpenaiEx
alias OpenaiEx.Images
Simple Kino UI
Image generation regularly exceeds the 15 second default receive timeout, so we raise it.
openai =
System.fetch_env!("LB_OPENAI_API_KEY")
|> OpenaiEx.new()
|> OpenaiEx.with_receive_timeout(120_000)
Set default parameters for image generation. The GPT image models return base64 image data directly, so there is nothing to download.
model = "gpt-image-1"
size = "1024x1024"
n = 2
Prompt / Response UI
text_input = Kino.Input.textarea("Describe Image")
form = Kino.Control.form([text: text_input], submit: "Generate")
frame = Kino.Frame.new()
Kino.listen(form, fn %{data: %{text: prompt}} ->
Kino.Frame.render(frame, Kino.Text.new("Running..."))
images =
openai
|> Images.generate!(%{
model: model,
prompt: prompt,
n: n,
size: size
})
# |> IO.inspect()
|> Map.get("data")
|> Enum.map(fn x -> x["b64_json"] |> Base.decode64!() end)
images
|> Enum.map(fn x -> x |> Kino.Image.new("image/png") end)
|> Kino.Layout.grid(columns: 2)
|> then(&Kino.Frame.render(frame, &1))
end)
Kino.Layout.grid([form, frame], boxed: true, gap: 16)