Skip to main content

examples/branching/actions/direct_answer.ex

defmodule Jido.Runic.Examples.Branching.Actions.DirectAnswer do
  @moduledoc """
  Generate a concise answer for questions routed to the direct path.
  """

  @output_schema [
    branch: [type: :atom, required: true],
    branch_result: [type: :string, required: true],
    explanation: [type: :string, required: true],
    route_confidence: [type: :float, required: true]
  ]

  use Jido.Action,
    name: "branching_direct_answer",
    description: "Fast direct-answer branch",
    schema: [
      question: [type: :string, required: true],
      route: [type: :atom, required: true],
      detail_level: [type: :atom, required: true],
      confidence: [type: :float, required: true],
      reasoning: [type: :string, required: true]
    ],
    output_schema: @output_schema

  alias Jido.Runic.Examples.Studio.Actions.Helpers

  @impl true
  def run(
        %{question: question, route: :direct, detail_level: detail_level, confidence: confidence, reasoning: reasoning},
        _context
      ) do
    prompt = """
    You are a concise technical assistant.
    Answer the question below in markdown.

    Question: "#{question}"

    Requirements:
    - Start with a one-sentence direct answer.
    - Provide 2-4 bullet points.
    - Keep it #{detail_instruction(detail_level)}.
    """

    case Helpers.llm_call(prompt, model: :fast, temperature: 0.3, max_tokens: 380) do
      {:ok, text} ->
        {:ok,
         %{
           branch: :direct,
           branch_result: text,
           explanation: reasoning,
           route_confidence: confidence
         }}

      {:error, reason} ->
        {:error, reason}
    end
  end

  def run(%{route: route}, _context) do
    {:error, {:invalid_branch_input, {:expected_direct_route, route}}}
  end

  defp detail_instruction(:detailed), do: "detailed but focused"
  defp detail_instruction(_), do: "short and crisp"
end