Extract OpenAI.Completion struct

This commit is contained in:
Claudio Ortolina
2024-12-11 23:24:16 +03:00
parent 8d7fe4d660
commit 3c85f9e974
3 changed files with 18 additions and 11 deletions
+8 -6
View File
@@ -191,15 +191,17 @@ defmodule MusicLibrary.Records do
|> Enum.map(fn a -> a.name end) |> Enum.map(fn a -> a.name end)
|> Enum.join(",") |> Enum.join(",")
prompt = """ completion = %OpenAI.Completion{
Provide a list of music genres applicable to the album "#{record.title}" by #{artists}. content: """
Provide a list of music genres applicable to the album "#{record.title}" by #{artists}.
Limit the list to 5 genres, ordered by decreasing specificity, all lowercase. Limit the list to 5 genres, ordered by decreasing specificity, all lowercase.
Return a valid JSON list. Return a valid JSON list.
""" """
}
{:ok, response} = OpenAI.gpt(prompt) {:ok, response} = OpenAI.gpt(completion)
record record
|> Record.add_genres(response["genres"]) |> Record.add_genres(response["genres"])
+5 -5
View File
@@ -1,8 +1,8 @@
defmodule OpenAI do defmodule OpenAI do
def gpt(prompt) do def gpt(completion) do
{:ok, collector} = Agent.start_link(fn -> "" end) {:ok, collector} = Agent.start_link(fn -> "" end)
gpt_stream(prompt, fn data -> gpt_stream(completion, fn data ->
case get_in(data, ["choices", Access.at(0), "delta", "content"]) do case get_in(data, ["choices", Access.at(0), "delta", "content"]) do
nil -> :ok nil -> :ok
data -> Agent.update(collector, fn current -> current <> data end) data -> Agent.update(collector, fn current -> current <> data end)
@@ -15,7 +15,7 @@ defmodule OpenAI do
end end
# Lifted from https://fly.io/phoenix-files/streaming-openai-responses/ # Lifted from https://fly.io/phoenix-files/streaming-openai-responses/
defp gpt_stream(prompt, cb) do defp gpt_stream(completion, cb) do
fun = fn request, finch_request, finch_name, finch_options -> fun = fn request, finch_request, finch_name, finch_options ->
fun = fn fun = fn
{:status, status}, response -> {:status, status}, response ->
@@ -49,10 +49,10 @@ defmodule OpenAI do
Req.post!("https://api.openai.com/v1/chat/completions", Req.post!("https://api.openai.com/v1/chat/completions",
json: %{ json: %{
model: "gpt-4o-mini", model: "gpt-4o-mini",
messages: [%{role: "user", content: prompt}], messages: [Map.take(completion, [:content, :role])],
response_format: %{type: "json_object"}, response_format: %{type: "json_object"},
stream: true, stream: true,
temperature: 0.2 temperature: completion.temperature
}, },
auth: {:bearer, api_key()}, auth: {:bearer, api_key()},
finch_request: fun finch_request: fun
+5
View File
@@ -0,0 +1,5 @@
defmodule OpenAI.Completion do
defstruct content: "",
temperature: 0.2,
role: "user"
end