8d38512712
- Add Task.Supervisor to app supervision tree - Use tagged tuples instead of rescue for error handling - Pass embedding_text from parent LiveView as prop - Remove dead Completion struct fields - Extract socket assigns before Task closure - Log errors server-side, show generic user message - Make build_system_prompt private, remove thin wrapper - Extract do_send_message for retry reuse Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
39 lines
1.0 KiB
Elixir
39 lines
1.0 KiB
Elixir
defmodule OpenAI do
|
|
alias OpenAI.API
|
|
|
|
def gpt(completion) do
|
|
{:ok, collector} = Agent.start_link(fn -> "" end)
|
|
|
|
API.gpt_stream(completion, api_key(), fn data ->
|
|
case get_in(data, ["choices", Access.at(0), "delta", "content"]) do
|
|
nil -> :ok
|
|
data -> Agent.update(collector, fn current -> current <> data end)
|
|
end
|
|
end)
|
|
|
|
result = Agent.get(collector, & &1) |> JSON.decode!()
|
|
Agent.stop(collector)
|
|
{:ok, result}
|
|
end
|
|
|
|
def chat_stream(messages, opts \\ []) when is_list(messages) do
|
|
model = Keyword.get(opts, :model, "gpt-4o-mini")
|
|
temperature = Keyword.get(opts, :temperature, 0.7)
|
|
on_chunk = Keyword.fetch!(opts, :on_chunk)
|
|
|
|
case API.chat_stream(messages, model, temperature, api_key(), on_chunk) do
|
|
:ok -> :ok
|
|
{:error, _reason} = error -> error
|
|
end
|
|
end
|
|
|
|
def embeddings(text) do
|
|
API.get_embeddings(text, api_key())
|
|
end
|
|
|
|
defp api_key do
|
|
Application.get_env(:music_library, __MODULE__)
|
|
|> Keyword.fetch!(:api_key)
|
|
end
|
|
end
|