View Source Continuation Kino App

Mix.install([
  {:openai_ex, "~> 0.1.9"},
  {:kino, "~> 0.9.2"}
])

alias OpenaiEx
alias OpenaiEx.Completion

simple-kino-ui

Simple Kino UI

openai = System.fetch_env!("LB_OPENAI_API_KEY") |> OpenaiEx.new()

Set default parameters for continuation fields

comp_models = [
  "text-davinci-003",
  "text-davinci-002",
  "text-curie-001",
  "text-babbage-001",
  "text-ada-001"
]

model = comp_models |> Enum.at(0)
max_tokens = 100
temperature = 1

prompt-response-ui

Prompt / Response UI

frame = Kino.Frame.new()
inputs = [prompt: Kino.Input.textarea("Prompt")]
form = Kino.Control.form(inputs, submit: "Send", reset_on_submit: [:prompt])

Kino.listen(form, fn %{data: %{prompt: prompt}} ->
  Kino.Frame.append(frame, Kino.Markdown.new("**Me** #{prompt}"))

  text =
    openai
    |> Completion.create(%{
      model: model,
      prompt: prompt,
      max_tokens: max_tokens,
      temperature: temperature
    })
    |> Map.get("choices")
    |> Enum.at(0)
    |> Map.get("text")

  Kino.Frame.append(frame, Kino.Markdown.new("**#{model}** #{text}"))
end)

Kino.Layout.grid([frame, form], boxed: true, gap: 16)