class Aws::Lex::Conversation::Simulator

Attributes

lex[RW]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 9
def initialize(opts = {})
  self.lex = opts.fetch(:lex) do
    Type::Event.shrink_wrap(
      bot: default_bot,
      inputMode: 'Text',
      inputTranscript: '',
      interpretations: [],
      invocationSource: 'DialogCodeHook',
      messageVersion: '1.0',
      requestAttributes: {},
      responseContentType: 'text/plain; charset=utf-8',
      sessionId: '1234567890000',
      sessionState: default_session_state
    )
  end
  interpretation(name: 'SIMULATION')
end

Public Instance Methods

bot(opts = {}) click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 31
def bot(opts = {})
  changes = {
    aliasName: opts[:alias_name],
    aliasId: opts[:alias_id],
    name: opts[:name],
    version: opts[:version],
    localeId: opts[:locale_id],
    id: opts[:id]
  }.compact
  lex.bot = Type::Bot.shrink_wrap(lex.bot.to_lex.merge(changes))
  self
end
context(opts = {}) click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/aws/lex/conversation/simulator.rb, line 82
def context(opts = {})
  data = {
    name: opts.fetch(:name),
    contextAttributes: opts.fetch(:context_attributes) { {} },
    timeToLive: {
      timeToLiveInSeconds: opts.fetch(:seconds) { 600 },
      turnsToLive: opts.fetch(:turns) { 100 }
    }
  }
  context = Type::Context.shrink_wrap(data)
  lex.session_state.active_contexts.delete_if { |c| c.name == context.name }
  lex.session_state.active_contexts << context
  self
end
event() click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 27
def event
  lex.to_lex
end
input_mode(mode) click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 118
def input_mode(mode)
  lex.input_mode = Type::InputMode.new(mode)
  self
end
intent(opts = {}) click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 49
def intent(opts = {})
  data = default_intent(opts)
  intent = Type::Intent.shrink_wrap(data)
  lex.session_state.intent = intent
  interpretation(data)
end
interpretation(opts = {}) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/aws/lex/conversation/simulator.rb, line 57
def interpretation(opts = {})
  name = opts.fetch(:name)
  slots = opts.fetch(:slots) { {} }
  sentiment_score = opts.dig(:sentiment_response, :sentiment_score)
  sentiment = opts.dig(:sentiment_response, :sentiment)
  sentiment_response = opts[:sentiment_response] && {
    sentiment: sentiment,
    sentimentScore: sentiment_score
  }
  data = {
    intent: default_intent(opts),
    sentimentResponse: sentiment_response,
    nluConfidence: opts[:nlu_confidence]
  }.compact
  lex.interpretations.delete_if { |i| i.intent.name == name }
  lex.interpretations << Type::Interpretation.shrink_wrap(data)
  slots.each do |key, value|
    slot_data = { name: key }.merge(value)
    slot(slot_data)
  end
  reset_computed_properties!
  self
end
invocation_source(source) click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 113
def invocation_source(source)
  lex.invocation_source = Type::InvocationSource.new(source)
  self
end
session(data) click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 123
def session(data)
  lex.session_state.session_attributes.merge!(Type::SessionAttributes[data])
  self
end
slot(opts = {}) click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 97
def slot(opts = {})
  name = opts.fetch(:name).to_sym
  raw_slots = {
    shape: opts.fetch(:shape) { 'Scalar' },
    value: {
      originalValue: opts.fetch(:original_value) { opts.fetch(:value) },
      resolvedValues: opts.fetch(:resolved_values) { [opts.fetch(:value)] },
      interpretedValue: opts.fetch(:interpreted_value) { opts.fetch(:value) }
    }
  }
  lex.session_state.intent.raw_slots[name] = raw_slots
  current_interpretation.intent.raw_slots[name] = raw_slots
  reset_computed_properties!
  self
end
transcript(message) click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 44
def transcript(message)
  lex.input_transcript = message
  self
end

Private Instance Methods

current_interpretation() click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 130
def current_interpretation
  lex.interpretations.find { |i| i.intent.name == lex.session_state.intent.name }
end
default_bot() click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 149
def default_bot
  {
    aliasId: 'TSTALIASID',
    aliasName: 'TestBotAlias',
    id: 'BOT_ID',
    localeId: 'en_US',
    name: 'SIMULATOR',
    version: 'DRAFT'
  }
end
default_intent(opts = {}) click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 174
def default_intent(opts = {})
  {
    confirmationState: opts.fetch(:confirmation_state) { 'None' },
    kendraResponse: opts[:kendra_response],
    name: opts.fetch(:name),
    nluConfidence: opts[:nlu_confidence],
    originatingRequestId: opts.fetch(:originating_request_id) { SecureRandom.uuid },
    slots: opts.fetch(:slots) { {} },
    state: opts.fetch(:state) { 'InProgress' }
  }.compact
end
default_session_state() click to toggle source
# File lib/aws/lex/conversation/simulator.rb, line 160
def default_session_state
  {
    activeContexts: [],
    sessionAttributes: {},
    intent: {
      confirmationState: 'None',
      name: 'SIMULATION',
      slots: {},
      state: 'InProgress',
      originatingRequestId: SecureRandom.uuid
    }
  }
end
reset_computed_properties!() click to toggle source

computed properties are memoized using instance variables, so we must uncache the values when things change

# File lib/aws/lex/conversation/simulator.rb, line 136
def reset_computed_properties!
  %w[
    @alternate_intents
    @current_intent
    @intents
  ].each do |variable|
    lex.instance_variable_set(variable, nil)
  end

  lex.session_state.intent.instance_variable_set('@slots', nil)
  current_interpretation.intent.instance_variable_set('@slots', nil)
end