Enable chat for artists

This commit is contained in:
Claudio Ortolina
2026-02-22 15:31:09 +00:00
parent b9ee7a6ce9
commit 60d81e14de
10 changed files with 156 additions and 51 deletions
+44
View File
@@ -0,0 +1,44 @@
defmodule MusicLibrary.ArtistChat do
@behaviour MusicLibrary.Chat
alias MusicLibrary.Artists.ArtistInfo
@impl true
def stream_response(messages, {artist, artist_info}, callback) do
instructions = build_instructions(artist, artist_info)
OpenAI.chat_stream(messages, on_chunk: callback, instructions: instructions)
end
defp build_instructions(artist, artist_info) do
context = build_context(artist, artist_info)
"""
You are a knowledgeable music assistant. Answer questions about the artist \
the user is currently viewing. Use the provided artist 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.
Artist information:
#{context}
"""
end
defp build_context(artist, artist_info) do
country = ArtistInfo.country(artist_info)
description = ArtistInfo.wikipedia_description(artist_info)
summary = ArtistInfo.wikipedia_summary(artist_info)
parts =
[
{"Name", artist.name},
{"Country", country.name},
{"Description", description},
{"Biography", summary}
]
|> Enum.reject(fn {_label, value} -> value in [nil, ""] end)
|> Enum.map_join("\n", fn {label, value} -> "#{label}: #{value}" end)
parts
end
end
+7
View File
@@ -0,0 +1,7 @@
defmodule MusicLibrary.Chat do
@callback stream_response(
messages :: list(map()),
context :: term(),
callback :: (String.t() -> any())
) :: :ok | {:error, term()}
end
+4 -1
View File
@@ -1,7 +1,10 @@
defmodule MusicLibrary.RecordChat do
@behaviour MusicLibrary.Chat
alias MusicLibrary.Records.Record
def stream_response(messages, record, embedding_text, callback) do
@impl true
def stream_response(messages, {record, embedding_text}, callback) do
instructions = build_instructions(record, embedding_text)
OpenAI.chat_stream(messages, on_chunk: callback, instructions: instructions)