defmodule GenAI.ChatCompletion do
@moduledoc """
Encodes a LLM ChatCompletion response.
"""
@vsn 1.0
use GenAI.Graph.NodeBehaviour
@derive GenAI.Graph.NodeProtocol
# @derive GenAI.Thread.SessionProtocol
defnodestruct(
model: nil,
provider: nil,
seed: nil,
choices: nil,
usage: nil,
details: nil
)
defnodetype(
model: term,
provider: term,
seed: term,
choices: term,
usage: term,
details: term
)
def inspect_custom_details(subject, opts) do
[
"model:", Inspect.Algebra.to_doc(subject.model, opts), ", ",
"seed:", Inspect.Algebra.to_doc(subject.seed, opts), ", ",
"choices:", Inspect.Algebra.to_doc(subject.choices, opts), ", ",
"usage:", Inspect.Algebra.to_doc(subject.usage, opts), ", ",
]
end
def from_json(options)
def from_json(options) when is_struct(options) do
from_json(Map.from_struct(options))
end
def from_json(options) do
keys =
__MODULE__.__info__(:struct)
|> Enum.map(& &1.field)
|> MapSet.new()
details =
options
|> Enum.to_list()
|> Enum.filter(&(!MapSet.member?(keys, elem(&1, 0))))
|> Enum.into(%{})
option_details =
(options[:details] || %{})
|> Enum.into(%{})
details = Map.merge(details, option_details)
options
|> put_in([:details], details)
|> new()
end
end