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