Current section

Files

Jump to
openai_ex lib openai_ex beta assistant.ex
Raw

lib/openai_ex/beta/assistant.ex

defmodule OpenaiEx.Beta.Assistant do
@moduledoc """
This module provides an implementation of the OpenAI assistants API. The API reference can be found at https://platform.openai.com/docs/api-reference/assistants.
## API Fields
The following fields can be used as parameters when creating a new assistant:
- `:model`
- `:name`
- `:description`
- `:instructions`
- `:tools`
- `:file_ids`
- `:metadata`
"""
@api_fields [
:model,
:name,
:description,
:instructions,
:tools,
:file_ids,
:metadata
]
defp ep_url(assistant_id \\ nil) do
"/assistants" <> if is_nil(assistant_id), do: "", else: "/#{assistant_id}"
end
@doc """
Creates a new assistants request with the given arguments.
## Arguments
- `args`: A list of key-value pairs, or a map, representing the fields of the assistant request.
## Returns
A map containing the fields of the assistant request.
The `:model` field is required.
Example usage:
iex> _request = OpenaiEx.Beta.Assistant.new(model: "gpt-4-turbo")
%{model: "gpt-4-turbo"}
"""
def new(args = [_ | _]) do
args |> Enum.into(%{}) |> new()
end
def new(args = %{model: model}) do
%{
model: model
}
|> Map.merge(args)
|> Map.take(@api_fields)
end
@doc """
Calls the assistant 'create' endpoint.
## Arguments
- `openai`: The OpenAI configuration.
- `assistant`: The assistant 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/assistants/createAssistant for more information.
"""
def create(openai = %OpenaiEx{}, assistant = %{}) do
openai
|> OpenaiEx.with_assistants_beta()
|> OpenaiEx.Http.post(ep_url(), json: assistant |> Map.take(@api_fields))
end
@doc """
Calls the assistant retrieve endpoint.
## Arguments
- `openai`: The OpenAI configuration.
- `assistant_id`: The ID of the assistant to retrieve.
## Returns
A map containing the fields of the file retrieve response.
https://platform.openai.com/docs/api-reference/assistants/getAssistant
"""
def retrieve(openai = %OpenaiEx{}, assistant_id) do
openai
|> OpenaiEx.with_assistants_beta()
|> OpenaiEx.Http.get(ep_url(assistant_id))
end
@doc """
Calls the assistant update endpoint.
## Arguments
- `openai`: The OpenAI configuration.
- `assistant_id`: The ID of the assistant to update.
- `assistant`: The assistant 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/assistants/modifyAssistant for more information.
"""
def update(openai = %OpenaiEx{}, assistant_id, assistant = %{}) do
openai
|> OpenaiEx.with_assistants_beta()
|> OpenaiEx.Http.post(ep_url(assistant_id), json: assistant |> Map.take(@api_fields))
end
@doc """
Calls the assistant delete endpoint.
## Arguments
- `openai`: The OpenAI configuration.
- `assistant_id`: The ID of the file to delete.
## Returns
A map containing the fields of the assistant delete response.
https://platform.openai.com/docs/api-reference/assistants/deleteAssistant
"""
def delete(openai = %OpenaiEx{}, assistant_id) do
openai
|> OpenaiEx.with_assistants_beta()
|> OpenaiEx.Http.delete(ep_url(assistant_id))
end
@doc """
Creates a new list assistants request with the given arguments.
## Arguments
- `args`: A list of key-value pairs, or a map, representing the fields of the list assistants request.
## Returns
A map containing the fields of the list assistants request.
"""
def new_list(args = [_ | _]) do
args |> Enum.into(%{}) |> new_list()
end
def new_list(args = %{}) do
args
|> Map.take(OpenaiEx.list_query_fields())
end
@doc """
Returns a list of assistant objects.
https://platform.openai.com/docs/api-reference/assistants/listAssistants
"""
def list(openai = %OpenaiEx{}, params = %{} \\ %{}) do
openai
|> OpenaiEx.with_assistants_beta()
|> OpenaiEx.Http.get(ep_url(), params |> Map.take(OpenaiEx.list_query_fields()))
end
end