aws-lex-conversation 3.1.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +28 -6
  3. data/lib/aws/lex/conversation.rb +8 -20
  4. data/lib/aws/lex/conversation/base.rb +13 -10
  5. data/lib/aws/lex/conversation/handler/delegate.rb +1 -3
  6. data/lib/aws/lex/conversation/response/base.rb +11 -10
  7. data/lib/aws/lex/conversation/response/close.rb +5 -11
  8. data/lib/aws/lex/conversation/response/confirm_intent.rb +4 -13
  9. data/lib/aws/lex/conversation/response/delegate.rb +4 -11
  10. data/lib/aws/lex/conversation/response/elicit_intent.rb +4 -7
  11. data/lib/aws/lex/conversation/response/elicit_slot.rb +5 -12
  12. data/lib/aws/lex/conversation/slot/elicitation.rb +6 -4
  13. data/lib/aws/lex/conversation/support/mixins/responses.rb +14 -20
  14. data/lib/aws/lex/conversation/type/base.rb +8 -4
  15. data/lib/aws/lex/conversation/type/bot.rb +3 -1
  16. data/lib/aws/lex/conversation/type/checkpoint.rb +57 -0
  17. data/lib/aws/lex/conversation/type/{confirmation_status.rb → confirmation_state.rb} +1 -1
  18. data/lib/aws/lex/conversation/type/context.rb +4 -4
  19. data/lib/aws/lex/conversation/type/{slot_detail.rb → dialog_action.rb} +4 -4
  20. data/lib/aws/lex/conversation/type/dialog_action_type.rb +3 -3
  21. data/lib/aws/lex/conversation/type/event.rb +24 -17
  22. data/lib/aws/lex/conversation/type/{output_dialog_mode.rb → input_mode.rb} +3 -2
  23. data/lib/aws/lex/conversation/type/intent.rb +14 -23
  24. data/lib/aws/lex/conversation/type/intent_confidence.rb +5 -5
  25. data/lib/aws/lex/conversation/type/interpretation.rb +23 -0
  26. data/lib/aws/lex/conversation/type/message.rb +4 -2
  27. data/lib/aws/lex/conversation/type/message/content_type.rb +2 -1
  28. data/lib/aws/lex/conversation/type/response.rb +3 -4
  29. data/lib/aws/lex/conversation/type/response_card.rb +5 -6
  30. data/lib/aws/lex/conversation/type/{sentiment_label.rb → sentiment.rb} +1 -1
  31. data/lib/aws/lex/conversation/type/sentiment_response.rb +3 -3
  32. data/lib/aws/lex/conversation/type/sentiment_score.rb +10 -20
  33. data/lib/aws/lex/conversation/type/session_attributes.rb +31 -0
  34. data/lib/aws/lex/conversation/type/session_state.rb +25 -0
  35. data/lib/aws/lex/conversation/type/slot.rb +54 -29
  36. data/lib/aws/lex/conversation/type/{slot_resolution.rb → slot_shape.rb} +4 -3
  37. data/lib/aws/lex/conversation/type/slot_value.rb +32 -0
  38. data/lib/aws/lex/conversation/version.rb +1 -1
  39. metadata +12 -10
  40. data/lib/aws/lex/conversation/type/recent_intent_summary_view.rb +0 -70
  41. data/lib/aws/lex/conversation/type/response_card/content_type.rb +0 -17
  42. data/lib/aws/lex/conversation/type/response_card/generic_attachment.rb +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ff0a95434c51f2167b1bb1fb891b650ffa120aaa91ac31dbf016fae8e590f7da
4
- data.tar.gz: 20df3f469a293b19d0ec3d1bea8e0c549897141a30bad818d1c3f6f25dcf98e3
3
+ metadata.gz: f57f415463cb7d78d0ddb4f48232b1c0038bc91e4813fb9d6de6455fa7f0a4d9
4
+ data.tar.gz: 7ba9cdf27e3f2368862bc7584eb1ce555a24a253d2a1ce3dd4c1d8500264fd0c
5
5
  SHA512:
6
- metadata.gz: f935b611747cbf6484f50058eeea3db776eb47fb901ac1be240e0362677c1ddca1fe99e638df6601bacd316975da6182e83edd0707e2f5ef1a65e157d3816da1
7
- data.tar.gz: d8ca9865f6981a0b6e5d233681b95ce995cae0821f6ef29b9395d379bb88d5bfe0687ee1c62728ea7bbdd785e0c9f5434720921f8c4df45076d51ebecaf4795e
6
+ metadata.gz: 168eb69456d693dbf0f2618a23e4ec13fef7daca4921871b2d0b5a532ef39f4a1fdceb435b3122518aee7e4ae9495546b85f58e4d95bceab255fb2b91f8fcfc6
7
+ data.tar.gz: 2d9577a331c617a681c3f961daaa1d1825812c907f6d40ebe838db4ce471b37ea948d9f0b75985430795d449ffcf4a59968180a591f9cfbc66a8f115864d75eb
data/README.md CHANGED
@@ -6,10 +6,30 @@ Have you played around with [AWS Lex](https://aws.amazon.com/lex/) and quickly r
6
6
 
7
7
  ## Installation
8
8
 
9
+ ### Lex V1
10
+
11
+ Version 3.x is the last major version of this gem that will support Lex V1.
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ ```ruby
16
+ gem 'aws-lex-conversation', '~> 3.0'
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ ```bash
22
+ bundle install
23
+ ```
24
+
25
+ ### Lex V2
26
+
27
+ Version 4.x and higher support Lex V2.
28
+
9
29
  Add this line to your application's Gemfile:
10
30
 
11
31
  ```ruby
12
- gem 'aws-lex-conversation'
32
+ gem 'aws-lex-conversation', '>= 4.0'
13
33
  ```
14
34
 
15
35
  And then execute:
@@ -73,15 +93,17 @@ class SayHello < Aws::Lex::Conversation::Handler::Base
73
93
  #
74
94
  # conversation.close(
75
95
  # fulfillment_state: 'Fulfilled',
76
- # message: { content: "Hello, #{name}!", contentType: 'PlainText' }
96
+ # messages: [{ content: "Hello, #{name}!", contentType: 'PlainText' }]
77
97
  # )
78
98
  #
79
99
  conversation.close(
80
100
  fulfillment_state: Aws::Lex::Conversation::Type::FulfillmentState.new('Fulfilled'),
81
- message: Aws::Lex::Conversation::Type::Message.new(
82
- content: "Hello, #{name}!",
83
- content_type: Aws::Lex::Conversation::Type::Message::ContentType.new('PlainText')
84
- )
101
+ messages: [
102
+ Aws::Lex::Conversation::Type::Message.new(
103
+ content: "Hello, #{name}!",
104
+ content_type: Aws::Lex::Conversation::Type::Message::ContentType.new('PlainText')
105
+ )
106
+ ]
85
107
  )
86
108
  end
87
109
  end
@@ -55,52 +55,40 @@ module Aws
55
55
  end
56
56
 
57
57
  def session
58
- lex.session_attributes
58
+ lex.session_state.session_attributes
59
59
  end
60
60
 
61
- # rubocop:disable Metrics/AbcSize
62
61
  def checkpoint!(opts = {})
63
62
  label = opts.fetch(:label)
64
- intent = opts.fetch(:intent_name) { intent_name }
65
63
  params = {
66
- checkpoint_label: label,
67
- confirmation_status: opts.fetch(:confirmation_status) { lex.current_intent.confirmation_status },
64
+ label: label,
68
65
  dialog_action_type: opts.fetch(:dialog_action_type),
69
66
  fulfillment_state: opts[:fulfillment_state],
70
- intent_name: intent,
71
- slots: opts.fetch(:slots) { lex.current_intent.raw_slots },
67
+ intent: lex.current_intent,
72
68
  slot_to_elicit: opts[:slot_to_elicit]
73
69
  }.compact
74
70
 
75
- # flag that we need to send a new checkpoint back in the response
76
- stash[:checkpoint_pending] = true
77
-
78
71
  if checkpoint?(label: label)
79
72
  # update the existing checkpoint
80
73
  checkpoint(label: label).assign_attributes!(params)
81
74
  else
82
75
  # push a new checkpoint to the recent_intent_summary_view
83
- lex.recent_intent_summary_view.unshift(
84
- Type::RecentIntentSummaryView.new(params)
76
+ checkpoints.unshift(
77
+ Type::Checkpoint.new(params)
85
78
  )
86
79
  end
87
80
  end
88
- # rubocop:enable Metrics/AbcSize
89
81
 
90
82
  def checkpoint?(label:)
91
83
  !checkpoint(label: label).nil?
92
84
  end
93
85
 
94
86
  def checkpoint(label:)
95
- lex.recent_intent_summary_view.find { |v| v.checkpoint_label == label }
87
+ checkpoints.find { |v| v.label == label }
96
88
  end
97
89
 
98
- # NOTE: lex responses should only include a recent_intent_summary_view
99
- # block if we want to change/add an existing checkpoint. If we don't
100
- # send a recent_intent_summary_view back in the response, lex retains
101
- # the previous intent history.
102
- def pending_checkpoints
103
- stash[:checkpoint_pending] && lex.recent_intent_summary_view
90
+ def checkpoints
91
+ lex.session_state.session_attributes.checkpoints
104
92
  end
105
93
 
106
94
  def stash
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'base64'
3
4
  require 'json'
4
5
  require 'shrink/wrap'
5
6
 
@@ -18,29 +19,31 @@ require_relative 'slot/elicitation'
18
19
  require_relative 'slot/elicitor'
19
20
  require_relative 'type/base'
20
21
  require_relative 'type/enumeration'
21
- require_relative 'type/sentiment_label'
22
+ require_relative 'type/input_mode'
23
+ require_relative 'type/sentiment'
22
24
  require_relative 'type/sentiment_score'
23
25
  require_relative 'type/sentiment_response'
24
26
  require_relative 'type/invocation_source'
25
27
  require_relative 'type/dialog_action_type'
26
- require_relative 'type/confirmation_status'
28
+ require_relative 'type/dialog_action'
29
+ require_relative 'type/confirmation_state'
27
30
  require_relative 'type/fulfillment_state'
28
31
  require_relative 'type/intent_confidence'
29
32
  require_relative 'type/time_to_live'
30
- require_relative 'type/recent_intent_summary_view'
33
+ require_relative 'type/slot_shape'
34
+ require_relative 'type/slot_value'
31
35
  require_relative 'type/slot'
32
- require_relative 'type/slot_resolution'
33
- require_relative 'type/slot_detail'
34
36
  require_relative 'type/context'
35
37
  require_relative 'type/intent'
36
- require_relative 'type/output_dialog_mode'
38
+ require_relative 'type/checkpoint'
39
+ require_relative 'type/session_attributes'
40
+ require_relative 'type/session_state'
41
+ require_relative 'type/interpretation'
37
42
  require_relative 'type/bot'
38
- require_relative 'type/message/content_type'
39
- require_relative 'type/message'
40
- require_relative 'type/response_card/content_type'
41
43
  require_relative 'type/response_card/button'
42
- require_relative 'type/response_card/generic_attachment'
43
44
  require_relative 'type/response_card'
45
+ require_relative 'type/message/content_type'
46
+ require_relative 'type/message'
44
47
  require_relative 'type/response'
45
48
  require_relative 'type/event'
46
49
  require_relative 'handler/base'
@@ -6,9 +6,7 @@ module Aws
6
6
  module Handler
7
7
  class Delegate < Base
8
8
  def response(conversation)
9
- conversation.delegate(
10
- slots: conversation.lex.current_intent.slots
11
- )
9
+ conversation.delegate
12
10
  end
13
11
  end
14
12
  end
@@ -6,15 +6,17 @@ module Aws
6
6
  module Response
7
7
  class Base
8
8
  attr_accessor(
9
- :active_contexts,
10
- :recent_intent_summary_view,
11
- :session_attributes
9
+ :session_state,
10
+ :messages,
11
+ :request_attributes,
12
+ :fulfillment_state
12
13
  )
13
14
 
14
15
  def initialize(opts = {})
15
- self.active_contexts = opts[:active_contexts]
16
- self.recent_intent_summary_view = opts[:recent_intent_summary_view]
17
- self.session_attributes = opts[:session_attributes]
16
+ self.session_state = opts[:session_state]
17
+ self.messages = opts[:messages]
18
+ self.request_attributes = opts[:request_attributes]
19
+ session_state.intent.state = opts.fetch(:fulfillment_state) { session_state.intent.state }
18
20
  end
19
21
 
20
22
  def dialog_action
@@ -23,10 +25,9 @@ module Aws
23
25
 
24
26
  def to_lex
25
27
  Type::Response.new(
26
- active_contexts: active_contexts,
27
- dialog_action: dialog_action,
28
- recent_intent_summary_view: recent_intent_summary_view,
29
- session_attributes: session_attributes
28
+ session_state: session_state,
29
+ messages: messages,
30
+ request_attributes: request_attributes
30
31
  ).to_lex
31
32
  end
32
33
  end
@@ -5,22 +5,16 @@ module Aws
5
5
  class Conversation
6
6
  module Response
7
7
  class Close < Base
8
- attr_accessor :fulfillment_state, :message, :response_card
9
-
10
8
  def initialize(opts = {})
11
9
  super
12
- self.fulfillment_state = opts.fetch(:fulfillment_state)
13
- self.message = opts[:message]
14
- self.response_card = opts[:response_card]
10
+ session_state.dialog_action = dialog_action
11
+ session_state.intent.state = opts.fetch(:fulfillment_state)
15
12
  end
16
13
 
17
14
  def dialog_action
18
- {
19
- type: 'Close',
20
- fulfillmentState: fulfillment_state,
21
- message: message,
22
- responseCard: response_card
23
- }.compact
15
+ Aws::Lex::Conversation::Type::DialogAction.shrink_wrap(
16
+ type: 'Close'
17
+ )
24
18
  end
25
19
  end
26
20
  end
@@ -5,24 +5,15 @@ module Aws
5
5
  class Conversation
6
6
  module Response
7
7
  class ConfirmIntent < Base
8
- attr_accessor :intent_name, :message, :response_card, :slots
9
-
10
8
  def initialize(opts = {})
11
9
  super
12
- self.intent_name = opts.fetch(:intent_name)
13
- self.slots = opts[:slots]
14
- self.message = opts[:message]
15
- self.response_card = opts[:response_card]
10
+ session_state.dialog_action = dialog_action
16
11
  end
17
12
 
18
13
  def dialog_action
19
- {
20
- type: 'ConfirmIntent',
21
- intentName: intent_name,
22
- slots: slots,
23
- message: message,
24
- responseCard: response_card
25
- }.compact
14
+ Aws::Lex::Conversation::Type::DialogAction.shrink_wrap(
15
+ type: 'ConfirmIntent'
16
+ )
26
17
  end
27
18
  end
28
19
  end
@@ -5,22 +5,15 @@ module Aws
5
5
  class Conversation
6
6
  module Response
7
7
  class Delegate < Base
8
- attr_accessor :slots, :kendra_query_request_payload, :kendra_query_filter_string
9
-
10
8
  def initialize(opts = {})
11
9
  super
12
- self.slots = opts[:slots]
13
- self.kendra_query_request_payload = opts[:kendra_query_request_payload]
14
- self.kendra_query_filter_string = opts[:kendra_query_filter_string]
10
+ session_state.dialog_action = dialog_action
15
11
  end
16
12
 
17
13
  def dialog_action
18
- {
19
- type: 'Delegate',
20
- slots: slots,
21
- kendraQueryRequestPayload: kendra_query_request_payload,
22
- kendraQueryFilterString: kendra_query_filter_string
23
- }.compact
14
+ Aws::Lex::Conversation::Type::DialogAction.shrink_wrap(
15
+ type: 'Delegate'
16
+ )
24
17
  end
25
18
  end
26
19
  end
@@ -9,16 +9,13 @@ module Aws
9
9
 
10
10
  def initialize(opts = {})
11
11
  super
12
- self.message = opts[:message]
13
- self.response_card = opts[:response_card]
12
+ session_state.dialog_action = dialog_action
14
13
  end
15
14
 
16
15
  def dialog_action
17
- {
18
- type: 'ElicitIntent',
19
- message: message,
20
- responseCard: response_card
21
- }.compact
16
+ Aws::Lex::Conversation::Type::DialogAction.shrink_wrap(
17
+ type: 'ElicitIntent'
18
+ )
22
19
  end
23
20
  end
24
21
  end
@@ -5,26 +5,19 @@ module Aws
5
5
  class Conversation
6
6
  module Response
7
7
  class ElicitSlot < Base
8
- attr_accessor :intent_name, :message, :response_card, :slots, :slot_to_elicit
8
+ attr_accessor :slot_to_elicit
9
9
 
10
10
  def initialize(opts = {})
11
11
  super
12
- self.intent_name = opts.fetch(:intent_name)
13
12
  self.slot_to_elicit = opts.fetch(:slot_to_elicit)
14
- self.slots = opts.fetch(:slots)
15
- self.message = opts[:message]
16
- self.response_card = opts[:response_card]
13
+ session_state.dialog_action = dialog_action
17
14
  end
18
15
 
19
16
  def dialog_action
20
- {
17
+ Aws::Lex::Conversation::Type::DialogAction.shrink_wrap(
21
18
  type: 'ElicitSlot',
22
- intentName: intent_name,
23
- slots: slots,
24
- slotToElicit: slot_to_elicit,
25
- message: message,
26
- responseCard: response_card
27
- }.compact
19
+ slotToElicit: slot_to_elicit
20
+ )
28
21
  end
29
22
  end
30
23
  end
@@ -27,10 +27,12 @@ module Aws
27
27
  increment_slot_elicitations!
28
28
  conversation.elicit_slot(
29
29
  slot_to_elicit: name,
30
- message: {
31
- contentType: content_type,
32
- content: elicitation_content
33
- }
30
+ messages: [
31
+ {
32
+ contentType: content_type,
33
+ content: elicitation_content
34
+ }
35
+ ]
34
36
  )
35
37
  end
36
38
 
@@ -8,51 +8,45 @@ module Aws
8
8
  module Responses
9
9
  def close(opts = {})
10
10
  params = {
11
- active_contexts: lex.active_contexts,
12
- recent_intent_summary_view: pending_checkpoints,
13
- session_attributes: lex.session_attributes
11
+ session_state: lex.session_state,
12
+ request_attributes: lex.request_attributes
14
13
  }.merge(opts)
15
14
  Response::Close.new(params).to_lex
16
15
  end
17
16
 
18
17
  def confirm_intent(opts = {})
19
18
  params = {
20
- active_contexts: lex.active_contexts,
21
- intent_name: lex.current_intent.name,
22
- recent_intent_summary_view: pending_checkpoints,
23
- session_attributes: lex.session_attributes,
24
- slots: lex.current_intent.slots
19
+ session_state: lex.session_state,
20
+ request_attributes: lex.request_attributes,
21
+ intent: lex.current_intent
25
22
  }.merge(opts)
23
+ lex.session_state.intent = params.fetch(:intent)
26
24
  Response::ConfirmIntent.new(params).to_lex
27
25
  end
28
26
 
29
27
  def delegate(opts = {})
30
28
  params = {
31
- active_contexts: lex.active_contexts,
32
- recent_intent_summary_view: pending_checkpoints,
33
- session_attributes: lex.session_attributes,
34
- slots: lex.current_intent.slots
29
+ session_state: lex.session_state,
30
+ request_attributes: lex.request_attributes
35
31
  }.merge(opts)
36
32
  Response::Delegate.new(params).to_lex
37
33
  end
38
34
 
39
35
  def elicit_intent(opts = {})
40
36
  params = {
41
- active_contexts: lex.active_contexts,
42
- recent_intent_summary_view: pending_checkpoints,
43
- session_attributes: lex.session_attributes
37
+ session_state: lex.session_state,
38
+ request_attributes: lex.request_attributes
44
39
  }.merge(opts)
45
40
  Response::ElicitIntent.new(params).to_lex
46
41
  end
47
42
 
48
43
  def elicit_slot(opts = {})
49
44
  params = {
50
- active_contexts: lex.active_contexts,
51
- intent_name: lex.current_intent.name,
52
- recent_intent_summary_view: pending_checkpoints,
53
- session_attributes: lex.session_attributes,
54
- slots: lex.current_intent.slots
45
+ session_state: lex.session_state,
46
+ request_attributes: lex.request_attributes,
47
+ intent: lex.current_intent
55
48
  }.merge(opts)
49
+ lex.session_state.intent = params.fetch(:intent)
56
50
  Response::ElicitSlot.new(params).to_lex
57
51
  end
58
52
  end