# SPDX-FileCopyrightText: 2024 Isaak Tsalicoglou # SPDX-License-Identifier: Apache-2.0 defmodule Ollamex.ChatMessage do @moduledoc """ Defines the struct used to store data of a chat message and provides helper functions to create a list of chat messages using the pipeline operator. """ @moduledoc since: "0.1.0" @enforce_keys [:role, :content] defstruct role: "user", content: nil, images: [] def create(role, content, images \\ []) @doc """ Create the first message (`%Ollamex.ChatMessage{}`) in a list. """ @doc since: "0.1.0" def create(role, content, images) when is_bitstring(role) and is_bitstring(content) and is_list(images) do valid_roles = ["system", "user", "assistant"] if role in valid_roles do {:ok, %Ollamex.ChatMessage{role: role, content: content, images: images}} else {:error, "Given role #{role} not one of " <> Enum.join(valid_roles, ", ")} end end @doc """ Append a message (`%Ollamex.ChatMessage{}`) to a list of existing ones. """ @doc since: "0.1.0" def append(cm, role, content, images \\ []) def append({:ok, %Ollamex.ChatMessage{} = cm}, role, content, images) do next = create(role, content, images) case next do {:ok, new_cm} -> [cm] ++ [new_cm] {:error, _} -> [cm] end end def append(cmlist, role, content, images) when is_list(cmlist) do next = create(role, content, images) case next do {:ok, new_cm} -> cmlist ++ [new_cm] {:error, _} -> cmlist end end end