Packages

AI integration layer for the Jido ecosystem - Actions, Workflows, and LLM orchestration

Current section

Files

Jump to
jido_ai lib examples tools unit_converter.ex
Raw

lib/examples/tools/unit_converter.ex

defmodule Jido.AI.Examples.Tools.ConvertTemperature do
@moduledoc "Converts temperature between Celsius, Fahrenheit, and Kelvin."
use Jido.Action,
name: "convert_temperature",
description: "Converts temperature between Celsius, Fahrenheit, and Kelvin.",
schema: [
value: [type: :float, required: true, doc: "The temperature value to convert"],
from: [type: :string, required: true, doc: "Source unit: celsius, fahrenheit, or kelvin"],
to: [type: :string, required: true, doc: "Target unit: celsius, fahrenheit, or kelvin"]
]
@impl true
def run(params, _context) do
value = params.value
from = String.downcase(params.from)
to = String.downcase(params.to)
result =
value
|> to_celsius(from)
|> from_celsius(to)
{:ok, %{result: Float.round(result, 2), from: from, to: to, original: value}}
end
defp to_celsius(value, "celsius"), do: value
defp to_celsius(value, "fahrenheit"), do: (value - 32) * 5 / 9
defp to_celsius(value, "kelvin"), do: value - 273.15
defp to_celsius(value, _), do: value
defp from_celsius(value, "celsius"), do: value
defp from_celsius(value, "fahrenheit"), do: value * 9 / 5 + 32
defp from_celsius(value, "kelvin"), do: value + 273.15
defp from_celsius(value, _), do: value
end
defmodule Jido.AI.Examples.Tools.ConvertDistance do
@moduledoc "Converts distance between metric and imperial units."
use Jido.Action,
name: "convert_distance",
description: "Converts distance between meters, kilometers, miles, feet, inches, and yards.",
schema: [
value: [type: :float, required: true, doc: "The distance value to convert"],
from: [type: :string, required: true, doc: "Source unit"],
to: [type: :string, required: true, doc: "Target unit"]
]
@impl true
def run(params, _context) do
value = params.value
from = String.downcase(params.from)
to = String.downcase(params.to)
result =
value
|> to_meters(from)
|> from_meters(to)
{:ok, %{result: Float.round(result, 2), from: from, to: to, original: value}}
end
defp to_meters(value, "meters"), do: value
defp to_meters(value, "kilometers"), do: value * 1000
defp to_meters(value, "miles"), do: value * 1609.344
defp to_meters(value, "feet"), do: value * 0.3048
defp to_meters(value, "inches"), do: value * 0.0254
defp to_meters(value, "yards"), do: value * 0.9144
defp to_meters(value, _), do: value
defp from_meters(value, "meters"), do: value
defp from_meters(value, "kilometers"), do: value / 1000
defp from_meters(value, "miles"), do: value / 1609.344
defp from_meters(value, "feet"), do: value / 0.3048
defp from_meters(value, "inches"), do: value / 0.0254
defp from_meters(value, "yards"), do: value / 0.9144
defp from_meters(value, _), do: value
end
defmodule Jido.AI.Examples.Tools.ConvertWeight do
@moduledoc "Converts weight between metric and imperial units."
use Jido.Action,
name: "convert_weight",
description: "Converts weight between kilograms, pounds, ounces, grams, and stones.",
schema: [
value: [type: :float, required: true, doc: "The weight value to convert"],
from: [type: :string, required: true, doc: "Source unit"],
to: [type: :string, required: true, doc: "Target unit"]
]
@impl true
def run(params, _context) do
value = params.value
from = String.downcase(params.from)
to = String.downcase(params.to)
result =
value
|> to_kilograms(from)
|> from_kilograms(to)
{:ok, %{result: Float.round(result, 2), from: from, to: to, original: value}}
end
defp to_kilograms(value, "kilograms"), do: value
defp to_kilograms(value, "grams"), do: value / 1000
defp to_kilograms(value, "pounds"), do: value * 0.453592
defp to_kilograms(value, "ounces"), do: value * 0.0283495
defp to_kilograms(value, "stones"), do: value * 6.35029
defp to_kilograms(value, _), do: value
defp from_kilograms(value, "kilograms"), do: value
defp from_kilograms(value, "grams"), do: value * 1000
defp from_kilograms(value, "pounds"), do: value / 0.453592
defp from_kilograms(value, "ounces"), do: value / 0.0283495
defp from_kilograms(value, "stones"), do: value / 6.35029
defp from_kilograms(value, _), do: value
end