Video
Code
openai_api_key = System.fetch_env!("LB_OPENAI_API_KEY")
form =
  Kino.Control.form(
    [
      prompt: Kino.Input.textarea("Prompt"),
      size:
        Kino.Input.select(
          "Image size",
          ["1024x1024", "1792x1024", "1024x1792"] |> Enum.map(&{&1, &1})
        )
    ],
    submit: "Generate"
  )
frame = Kino.Frame.new()
Kino.listen(form, fn %{data: %{prompt: prompt, size: size}} ->
  IO.inspect("Generating...")
  case Req.post("https://api.openai.com/v1/images/generations",
         json: %{model: "dall-e-3", prompt: prompt, n: 1, size: size},
         auth: {:bearer, openai_api_key}
       ) do
    {:ok, response} ->
      IO.inspect("Got url")
      [image | _] = response.body["data"]
      image_url = image["url"]
      image_contents = Req.get!(image_url).body
      Kino.Frame.append(frame, Kino.Image.new(image_contents, :png))
    _ ->
      nil
  end
end)
Kino.Layout.grid([form, frame])