Packages
openai_ex
0.9.20
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.2
0.4.1
0.4.0
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Community maintained Elixir library for OpenAI API
Current section
Files
Jump to
Current section
Files
lib/openai_ex/beta/threads_runs.ex
defmodule OpenaiEx.Beta.Threads.Runs do
@moduledoc """
This module provides an implementation of the OpenAI run API. The API
reference can be found at https://platform.openai.com/docs/api-reference/runs.
"""
alias OpenaiEx.{Http, HttpSse}
@api_fields [
:assistant_id,
:model,
:instructions,
:additional_instructions,
:additional_messages,
:tools,
:metadata,
:temperature,
:top_p,
:max_prompt_tokens,
:max_completion_tokens,
:truncation_strategy,
:tool_choice,
:response_format
]
@query_params [
:include
]
@ep_url "/threads/runs"
defp ep_url(thread_id, run_id \\ nil, action \\ nil) do
"/threads/#{thread_id}/runs" <>
if(is_nil(run_id), do: "", else: "/#{run_id}") <>
if(is_nil(action), do: "", else: "/#{action}")
end
@doc """
Creates a new run request
Example usage:
iex> _request = OpenaiEx.Beta.Threads.Runs.new(thread_id: "thread_foo", assistant_id: "assistant_bar")
%{assistant_id: "assistant_bar", thread_id: "thread_foo"}
"""
def new(args = [_ | _]) do
args |> Enum.into(%{}) |> new()
end
def new(args = %{thread_id: _}) do
args |> Map.take([:thread_id] ++ @api_fields ++ @query_params)
end
@doc """
Calls the run create endpoint.
See https://platform.openai.com/docs/api-reference/runs/createRun for more information.
"""
def create!(openai = %OpenaiEx{}, run = %{thread_id: _, assistant_id: _}, stream: true) do
openai |> create(run, stream: true) |> Http.bang_it!()
end
def create(openai = %OpenaiEx{}, run = %{thread_id: thread_id, assistant_id: _}, stream: true) do
json = run |> Map.take(@api_fields) |> Map.put(:stream, true)
url = Http.build_url(ep_url(thread_id), run |> Map.take(@query_params))
openai |> OpenaiEx.with_assistants_beta() |> HttpSse.post(url, json: json)
end
def create!(openai = %OpenaiEx{}, run = %{thread_id: _, assistant_id: _}) do
openai |> create(run) |> Http.bang_it!()
end
def create(openai = %OpenaiEx{}, run = %{thread_id: thread_id, assistant_id: _}) do
json = run |> Map.take(@api_fields)
url = Http.build_url(ep_url(thread_id), run |> Map.take(@query_params))
openai |> OpenaiEx.with_assistants_beta() |> Http.post(url, json: json)
end
@doc """
Calls the run retrieve endpoint.
https://platform.openai.com/docs/api-reference/runs/getRun
"""
def retrieve!(openai = %OpenaiEx{}, params = %{thread_id: _, run_id: _}) do
openai |> retrieve(params) |> Http.bang_it!()
end
def retrieve(openai = %OpenaiEx{}, %{thread_id: thread_id, run_id: run_id}) do
openai |> OpenaiEx.with_assistants_beta() |> Http.get(ep_url(thread_id, run_id))
end
@doc """
Calls the run update endpoint.
See https://platform.openai.com/docs/api-reference/assistants/modifyAssistant for more information.
"""
def update!(openai = %OpenaiEx{}, params = %{thread_id: _, run_id: _, metadata: _}) do
openai |> update(params) |> Http.bang_it!()
end
def update(openai = %OpenaiEx{}, %{thread_id: thread_id, run_id: run_id, metadata: metadata}) do
json = %{metadata: metadata}
openai |> OpenaiEx.with_assistants_beta() |> Http.post(ep_url(thread_id, run_id), json: json)
end
@doc """
Creates a new list runs request
"""
def new_list(args = [_ | _]) do
args |> Enum.into(%{}) |> new_list()
end
def new_list(args = %{}) do
args
|> Map.take(OpenaiEx.list_query_fields() ++ @query_params)
end
@doc """
Returns a list of runs objects.
https://platform.openai.com/docs/api-reference/runs/listRuns
"""
def list!(openai = %OpenaiEx{}, opts) when is_list(opts) do
openai |> list(opts) |> Http.bang_it!()
end
def list(openai = %OpenaiEx{}, opts) when is_list(opts) do
thread_id = Keyword.fetch!(opts, :thread_id)
params =
opts
|> Keyword.drop([:thread_id])
|> Enum.into(%{})
|> Map.take(OpenaiEx.list_query_fields() ++ @query_params)
openai |> OpenaiEx.with_assistants_beta() |> Http.get(ep_url(thread_id), params)
end
def submit_tool_outputs!(
openai = %OpenaiEx{},
params = %{thread_id: _, run_id: _, tool_outputs: _},
stream: true
) do
openai |> submit_tool_outputs(params, stream: true) |> Http.bang_it!()
end
def submit_tool_outputs(
openai = %OpenaiEx{},
%{thread_id: thread_id, run_id: run_id, tool_outputs: tool_outputs},
stream: true
) do
openai
|> OpenaiEx.with_assistants_beta()
|> HttpSse.post(
ep_url(thread_id, run_id, "submit_tool_outputs"),
json: %{tool_outputs: tool_outputs} |> Map.put(:stream, true)
)
end
def submit_tool_outputs!(
openai = %OpenaiEx{},
params = %{thread_id: _, run_id: _, tool_outputs: _}
) do
openai |> submit_tool_outputs(params) |> Http.bang_it!()
end
def submit_tool_outputs(
openai = %OpenaiEx{},
%{thread_id: thread_id, run_id: run_id, tool_outputs: tool_outputs}
) do
openai
|> OpenaiEx.with_assistants_beta()
|> Http.post(
ep_url(thread_id, run_id, "submit_tool_outputs"),
json: %{tool_outputs: tool_outputs}
)
end
def cancel!(openai = %OpenaiEx{}, params = %{thread_id: _, run_id: _}) do
openai |> cancel(params) |> Http.bang_it!()
end
def cancel(openai = %OpenaiEx{}, %{thread_id: thread_id, run_id: run_id}) do
openai |> OpenaiEx.with_assistants_beta() |> Http.post(ep_url(thread_id, run_id, "cancel"))
end
@car_fields [
:assistant_id,
:thread,
:model,
:instructions,
:tools,
:tool_resources,
:metadata,
:temperature,
:top_p,
:max_prompt_tokens,
:max_completion_tokens,
:truncation_strategy,
:tool_choice,
:response_format
]
def create_and_run!(openai = %OpenaiEx{}, params = %{assistant_id: _}, stream: true) do
openai |> create_and_run(params, stream: true) |> Http.bang_it!()
end
def create_and_run(openai = %OpenaiEx{}, params = %{assistant_id: _}, stream: true) do
openai
|> OpenaiEx.with_assistants_beta()
|> HttpSse.post(@ep_url,
json: params |> Map.take(@car_fields) |> Map.put(:stream, true)
)
end
def create_and_run!(openai = %OpenaiEx{}, params = %{assistant_id: _}) do
openai |> create_and_run(params) |> Http.bang_it!()
end
def create_and_run(openai = %OpenaiEx{}, params = %{assistant_id: _}) do
openai
|> OpenaiEx.with_assistants_beta()
|> Http.post(@ep_url, json: params |> Map.take(@car_fields))
end
end