lib/vnext_genai/records/directive.ex

# ===============================================================================
# Copyright (c) 2025, Noizu Labs, Inc.
# ===============================================================================
defmodule GenAI.Records.Directive do
  @moduledoc """
  Records used by for directive processing.
  """

  require Record

  # =============================================================================
  # Support Entries
  # =============================================================================
  @typedoc "type of supported parm"
  @type param_type :: :float | :int | :bool | :string | :list | :map

  @typedoc "input key for param: value pulled from effective settings"
  @type param :: term

  @typedoc "alias to inject param as when building model request."
  @type as :: term

  @typedoc "Optional lambda method to check (model, setting, settings, session, context, options) to determine if setting is valid/supported."
  @type sentinel :: term

  @typedoc "Optional lambda method to adjust setting value before setting in inference request."
  @type adjuster :: term

  @typedoc "allowed range of values for param"
  #  {{:"(", 23.32}, :infinity}
  @type range :: term()

  @typedoc "flag if field is required"
  @type required :: boolean()

  @typedoc "Default value is only used for required settings if not provided."
  @type default :: number

  @typedoc """
  Supported Parameter Record.
  """
  @type hyper_param ::
          record(:hyper_param,
            name: param,
            type: param_type,
            as: as,
            required: required,
            sentinel: sentinel,
            adjuster: adjuster,
            min: number | :infnity,
            max: number | :infinity,
            default: number
          )
  Record.defrecord(:hyper_param,
    name: nil,
    type: :float,
    as: nil,
    required: false,
    sentinel: nil,
    adjuster: nil,
    min: :infinity,
    max: :infinity,
    default: nil
  )

  # =============================================================================
  # entry value records
  # =============================================================================

  @typedoc """
  Concrete Entry Value.
  """
  @type concrete_value :: record(:concrete_value, value: any)
  Record.defrecord(:concrete_value, value: nil)

  # =============================================================================
  # entry selector records
  # =============================================================================

  # ----------------------------
  # message_entry Record
  # ----------------------------
  @typedoc """
  Reference to a message list.
  """
  @type message_entry :: record(:message_entry, msg: any)
  Record.defrecord(:message_entry, msg: nil)

  # ----------------------------
  # monitor_entry Record
  # ----------------------------
  @typedoc """
  Reference to a monitor entry.
  """
  @type monitor_entry :: record(:monitor_entry, monitor: any)
  Record.defrecord(:monitor_entry, monitor: nil)

  # ----------------------------
  # data_generator_entry Record
  # ----------------------------
  @typedoc """
  Reference to a data generator entry.
  """
  @type data_generator_entry :: record(:data_generator_entry, generator: any)
  Record.defrecord(:data_generator_entry, generator: nil)

  # ----------------------------
  # stack_entry Record
  # ----------------------------
  @typedoc """
  Reference to a stack entry.
  """
  @type stack_entry :: record(:stack_entry, element: any)
  Record.defrecord(:stack_entry, element: nil)

  # ----------------------------
  # option_entry Record
  # ----------------------------
  @typedoc """
  Reference to an option entry.
  """
  @type option_entry :: record(:option_entry, option: any)
  Record.defrecord(:option_entry, option: nil)

  # ----------------------------
  # setting_entry Record
  # ----------------------------
  @typedoc """
  Reference to a setting entry.
  """
  @type setting_entry :: record(:setting_entry, setting: any)
  Record.defrecord(:setting_entry, setting: nil)

  # ----------------------------
  # tool_entry Record
  # ----------------------------
  @typedoc """
  Reference to a tool entry.
  """
  @type tool_entry :: record(:tool_entry, tool: any)
  Record.defrecord(:tool_entry, tool: nil)

  # ----------------------------
  # model_entry Record
  # ----------------------------
  @typedoc """
  Reference to a model entry.
  """
  @type model_entry :: record(:model_entry, [])
  Record.defrecord(:model_entry, [])

  # ----------------------------
  # model_setting_entry Record
  # ----------------------------
  @typedoc """
  Reference to a model-specific setting entry.
  """
  @type model_setting_entry ::
          record(:model_setting_entry, model: any, setting: any)
  Record.defrecord(:model_setting_entry, model: nil, setting: nil)

  # ----------------------------
  # provider_setting_entry Record
  # ----------------------------

  @typedoc """
  Reference to a provider-specific setting entry.
  """
  @type provider_setting_entry ::
          record(:provider_setting_entry, provider: any, setting: any)
  Record.defrecord(:provider_setting_entry, provider: nil, setting: nil)

  # ----------------------------
  # safety_setting_entry Record
  # ----------------------------

  @typedoc """
  Reference to a safety setting entry.
  """
  @type safety_setting_entry ::
          record(:safety_setting_entry, category: any)
  Record.defrecord(:safety_setting_entry, category: nil)
end