9e1dbfd530
Closes #108
53 lines
1.5 KiB
Elixir
53 lines
1.5 KiB
Elixir
defmodule MusicLibrary.RecordChat do
|
|
@moduledoc """
|
|
Chat implementation for records using OpenAI streaming with web search.
|
|
"""
|
|
|
|
@behaviour MusicLibrary.Chat
|
|
|
|
alias MusicLibrary.Records.Record
|
|
|
|
@impl true
|
|
@spec stream_response([map()], {Record.t(), String.t() | nil}, (String.t() -> any())) ::
|
|
:ok | {:error, term()}
|
|
def stream_response(messages, {record, embedding_text}, callback) do
|
|
instructions = build_instructions(record, embedding_text)
|
|
|
|
OpenAI.chat_stream(messages, on_chunk: callback, instructions: instructions)
|
|
end
|
|
|
|
defp build_instructions(%Record{} = record, embedding_text) do
|
|
context =
|
|
case embedding_text do
|
|
nil -> basic_context(record)
|
|
"" -> basic_context(record)
|
|
text -> text
|
|
end
|
|
|
|
"""
|
|
You are a knowledgeable music assistant. Answer questions about the album \
|
|
the user is currently viewing. Use the provided album information as your \
|
|
primary reference, and use web search to find additional up-to-date \
|
|
information when helpful. Be concise and accurate. When unsure, say so.
|
|
|
|
Album information:
|
|
#{context}
|
|
"""
|
|
end
|
|
|
|
defp basic_context(%Record{} = record) do
|
|
artist_names = Record.artist_names(record)
|
|
genres = Enum.join(record.genres || [], ", ")
|
|
|
|
"""
|
|
Album: #{record.title}
|
|
Artists: #{artist_names}
|
|
Genres: #{genres}
|
|
Released: #{record.release_date || "Unknown"}
|
|
Type: #{record.type}
|
|
Format: #{record.format}
|
|
"""
|
|
|> String.trim()
|
|
end
|
|
end
|