Packages
llm_composer
0.19.1
0.20.2
0.20.1
0.20.0
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.0
0.14.2
0.14.1
0.14.0
0.13.1
0.13.0
0.12.3
0.12.2
0.12.0
0.11.2
0.11.1
0.11.0
0.10.0
0.8.0
0.7.0
0.6.0
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
LlmComposer is an Elixir library that facilitates chat interactions with language models, providing tools to handle user messages, generate responses, and execute functions automatically based on model outputs.
Current section
Files
Jump to
Current section
Files
lib/llm_composer/helpers.ex
defmodule LlmComposer.Helpers do
@moduledoc """
Provides helper functions for the `LlmComposer` module for handling language model responses.
"""
@doc """
Normalizes JSON-like decoded data into maps with string keys.
This handles decoders that may emit ordered objects as lists of `{key, value}`
tuples or maps keyed by atoms.
"""
@spec normalize_json(term()) :: term()
def normalize_json(data) when is_map(data) do
Enum.reduce(data, %{}, fn {key, value}, acc ->
Map.put(acc, normalize_key(key), normalize_json(value))
end)
end
def normalize_json(data) when is_list(data) do
if ordered_object?(data) do
Enum.reduce(data, %{}, fn {key, value}, acc ->
Map.put(acc, normalize_key(key), normalize_json(value))
end)
else
Enum.map(data, &normalize_json/1)
end
end
def normalize_json(data), do: data
defp ordered_object?(data) do
data != [] and
Enum.all?(data, fn
{key, _value} when is_binary(key) or is_atom(key) -> true
_other -> false
end)
end
@doc """
Returns the configured JSON engine module.
Reads `:json_engine` from application config. Defaults to `JSON` if available,
otherwise falls back to `Jason`.
"""
@spec json_engine() :: module()
def json_engine do
case Application.get_env(:llm_composer, :json_engine) do
nil -> if Code.ensure_loaded?(JSON), do: JSON, else: Jason
engine -> engine
end
end
defp normalize_key(key) when is_binary(key), do: key
defp normalize_key(key) when is_atom(key), do: Atom.to_string(key)
defp normalize_key(key), do: to_string(key)
end