class Adapt::Intent::Processor

Public Class Methods

_intents() click to toggle source
# File lib/adapt/processor.rb, line 27
def _intents
  @_intents ||= {}
end
engine() click to toggle source
# File lib/adapt/processor.rb, line 17
def engine
  unless @_python_loaded
    self.pyfrom 'adapt.intent', import: :IntentBuilder
    self.pyfrom 'adapt.engine', import: :IntentDeterminationEngine
    @_python_loaded = true
  end

  @_engine ||= IntentDeterminationEngine.new
end
new() click to toggle source
# File lib/adapt/processor.rb, line 68
def initialize
  self.class.setup
  @engine = self.class.engine

  @parser = self.class.parser
end
parser() click to toggle source
# File lib/adapt/processor.rb, line 38
def parser
  return @_parser if @_parser_initialized

  @_parser = Adapt::Helpers::Parser.get(Adapt.locale)
  @_parser_initialized = true
  puts "No language helper for locale '#{Adapt.locale}' available" if @_parser.nil?
end
setup() click to toggle source
# File lib/adapt/processor.rb, line 31
def setup
  return if @_initialized
  @_initialized = true

  load_files
end

Private Class Methods

load_files() click to toggle source
# File lib/adapt/processor.rb, line 48
def load_files
  # Seek skill folders
  Charyf::Skill.list.each do |skill_klass|
    root = skill_klass.skill_root

    Dir[root.join('intents', '**', '*.adapt.rb')].each do |intent_definition_file|
      require intent_definition_file
    end
  end

  # Load additional paths
  Adapt.config.lookup_paths.flatten.each do |path|
    Dir[Pathname.new(path.to_s).join('**', '*.adapt.rb')].each do |intent_definition_file|
      require intent_definition_file
    end
  end

end

Public Instance Methods

define(&block) click to toggle source
# File lib/adapt/processor.rb, line 75
def define(&block)
  builder = Adapt::RoutingBuilder.new

  block.call(builder)

  intents = builder.build(@engine, IntentBuilder)

  intents.each do |intent|
    # TODO handle already existing
    raise NameCollisionError.new("Intent name '#{intent.name}' already in use.") if self.class._intents[intent.name]

    self.class._intents[intent.name] = intent
  end
end
determine(request) click to toggle source
# File lib/adapt/processor.rb, line 90
def determine(request)
  adapt_intent = nil

  # Normalize text
  text = @parser ? @parser.normalize(request.text) : request.text

  generator = @engine.determine_intent(text)
  begin
    adapt_intent = PyCall.builtins.next(generator)
  rescue PyCall::PyError
    # ignored
  end

  return unknown unless adapt_intent

  confidence = adapt_intent['confidence']
  app_intent = self.class._intents[adapt_intent['intent_type']]


  entities = app_intent.entities.map { |e| e.keys.first }.inject({}) do |h, entity|
    h[entity] = {
        value: adapt_intent[entity]
    }

    h
  end

  return Charyf::Engine::Intent.new(app_intent.name, confidence, entities)
end