defmodule OpenaiEx.Completion do
@moduledoc """
This module provides an implementation of the OpenAI completions API. The API reference can be found at https://platform.openai.com/docs/api-reference/completions.
## API Fields
The following fields can be used as parameters when creating a new completion:
- `:model`
- `:prompt`
- `:best_of`
- `:echo`
- `:frequency_penalty`
- `:logit_bias`
- `:logprobs`
- `:max_tokens`
- `:n`
- `:presence_penalty`
- `:stop`
- `:suffix`
- `:temperature`
- `:top_p`
- `:user`
"""
@api_fields [
:model,
:prompt,
:best_of,
:echo,
:frequency_penalty,
:logit_bias,
:logprobs,
:max_tokens,
:n,
:presence_penalty,
:stop,
:suffix,
:temperature,
:top_p,
:user
]
@doc """
Creates a new completion request with the given arguments.
## Arguments
- `args`: A list of key-value pairs, or a map, representing the fields of the completion request.
## Returns
A map containing the fields of the completion request.
The `:model` field is required.
Example usage:
iex> _request = OpenaiEx.Completion.new(model: "davinci")
%{model: "davinci"}
iex> _request = OpenaiEx.Completion.new(%{model: "davinci"})
%{model: "davinci"}
"""
def new(args = [_ | _]) do
args |> Enum.into(%{}) |> new()
end
def new(args = %{model: _}) do
args |> Map.take(@api_fields)
end
@ep_url "/completions"
@doc """
Calls the completion 'create' endpoint.
## Arguments
- `openai`: The OpenAI configuration.
- `completion`: The completion request, as a map with keys corresponding to the API fields.
## Returns
A map containing the API response.
See https://platform.openai.com/docs/api-reference/completions/create for more information.
"""
def create(openai = %OpenaiEx{}, completion = %{}, stream: true) do
openai
|> OpenaiEx.HttpSse.post(@ep_url,
json: completion |> Map.take(@api_fields) |> Map.put(:stream, true)
)
end
def create(openai = %OpenaiEx{}, completion = %{}) do
openai |> OpenaiEx.Http.post(@ep_url, json: completion |> Map.take(@api_fields))
end
end