aws-lex-conversation 3.1.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +28 -6
- data/lib/aws/lex/conversation.rb +8 -20
- data/lib/aws/lex/conversation/base.rb +13 -10
- data/lib/aws/lex/conversation/handler/delegate.rb +1 -3
- data/lib/aws/lex/conversation/response/base.rb +11 -10
- data/lib/aws/lex/conversation/response/close.rb +5 -11
- data/lib/aws/lex/conversation/response/confirm_intent.rb +4 -13
- data/lib/aws/lex/conversation/response/delegate.rb +4 -11
- data/lib/aws/lex/conversation/response/elicit_intent.rb +4 -7
- data/lib/aws/lex/conversation/response/elicit_slot.rb +5 -12
- data/lib/aws/lex/conversation/slot/elicitation.rb +6 -4
- data/lib/aws/lex/conversation/support/mixins/responses.rb +14 -20
- data/lib/aws/lex/conversation/type/base.rb +8 -4
- data/lib/aws/lex/conversation/type/bot.rb +3 -1
- data/lib/aws/lex/conversation/type/checkpoint.rb +57 -0
- data/lib/aws/lex/conversation/type/{confirmation_status.rb → confirmation_state.rb} +1 -1
- data/lib/aws/lex/conversation/type/context.rb +4 -4
- data/lib/aws/lex/conversation/type/{slot_detail.rb → dialog_action.rb} +4 -4
- data/lib/aws/lex/conversation/type/dialog_action_type.rb +3 -3
- data/lib/aws/lex/conversation/type/event.rb +24 -17
- data/lib/aws/lex/conversation/type/{output_dialog_mode.rb → input_mode.rb} +3 -2
- data/lib/aws/lex/conversation/type/intent.rb +14 -23
- data/lib/aws/lex/conversation/type/intent_confidence.rb +5 -5
- data/lib/aws/lex/conversation/type/interpretation.rb +23 -0
- data/lib/aws/lex/conversation/type/message.rb +4 -2
- data/lib/aws/lex/conversation/type/message/content_type.rb +2 -1
- data/lib/aws/lex/conversation/type/response.rb +3 -4
- data/lib/aws/lex/conversation/type/response_card.rb +5 -6
- data/lib/aws/lex/conversation/type/{sentiment_label.rb → sentiment.rb} +1 -1
- data/lib/aws/lex/conversation/type/sentiment_response.rb +3 -3
- data/lib/aws/lex/conversation/type/sentiment_score.rb +10 -20
- data/lib/aws/lex/conversation/type/session_attributes.rb +31 -0
- data/lib/aws/lex/conversation/type/session_state.rb +25 -0
- data/lib/aws/lex/conversation/type/slot.rb +54 -29
- data/lib/aws/lex/conversation/type/{slot_resolution.rb → slot_shape.rb} +4 -3
- data/lib/aws/lex/conversation/type/slot_value.rb +32 -0
- data/lib/aws/lex/conversation/version.rb +1 -1
- metadata +12 -10
- data/lib/aws/lex/conversation/type/recent_intent_summary_view.rb +0 -70
- data/lib/aws/lex/conversation/type/response_card/content_type.rb +0 -17
- data/lib/aws/lex/conversation/type/response_card/generic_attachment.rb +0 -26
@@ -27,7 +27,7 @@ module Aws
|
|
27
27
|
|
28
28
|
def to_lex
|
29
29
|
self.class.attributes.each_with_object({}) do |attribute, hash|
|
30
|
-
value = transform_to_lex(
|
30
|
+
value = transform_to_lex(public_send(attribute))
|
31
31
|
hash[self.class.mapping.fetch(attribute)] = value
|
32
32
|
end
|
33
33
|
end
|
@@ -37,8 +37,12 @@ module Aws
|
|
37
37
|
def transform_to_lex(value)
|
38
38
|
case value
|
39
39
|
when Hash
|
40
|
-
value.
|
41
|
-
|
40
|
+
if value.respond_to?(:to_lex)
|
41
|
+
value.to_lex
|
42
|
+
else
|
43
|
+
value.each_with_object({}) do |(key, val), hash|
|
44
|
+
hash[key.to_sym] = transform_to_lex(val)
|
45
|
+
end
|
42
46
|
end
|
43
47
|
when Array
|
44
48
|
value.map { |v| transform_to_lex(v) }
|
@@ -62,7 +66,7 @@ module Aws
|
|
62
66
|
end
|
63
67
|
|
64
68
|
def symbolize_hash!
|
65
|
-
->(v) { v.
|
69
|
+
->(v) { v.deep_transform_keys(&:to_sym) }
|
66
70
|
end
|
67
71
|
|
68
72
|
def computed_property(attribute, callable)
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Lex
|
5
|
+
class Conversation
|
6
|
+
module Type
|
7
|
+
class Checkpoint
|
8
|
+
include Base
|
9
|
+
|
10
|
+
required :dialog_action_type
|
11
|
+
required :intent
|
12
|
+
|
13
|
+
optional :label
|
14
|
+
optional :fulfillment_state
|
15
|
+
optional :slot_to_elicit
|
16
|
+
|
17
|
+
coerce(
|
18
|
+
intent: Intent,
|
19
|
+
dialog_action_type: DialogActionType,
|
20
|
+
fulfillment_state: FulfillmentState
|
21
|
+
)
|
22
|
+
|
23
|
+
# rubocop:disable Metrics/MethodLength
|
24
|
+
def restore(conversation, opts = {})
|
25
|
+
case dialog_action_type.raw
|
26
|
+
when 'Close'
|
27
|
+
conversation.close(
|
28
|
+
fulfillment_state: opts.fetch(:fulfillment_state) { fulfillment_state },
|
29
|
+
messages: opts.fetch(:messages)
|
30
|
+
)
|
31
|
+
when 'ConfirmIntent'
|
32
|
+
conversation.confirm_intent(
|
33
|
+
intent: intent,
|
34
|
+
messages: opts.fetch(:messages)
|
35
|
+
)
|
36
|
+
when 'Delegate'
|
37
|
+
conversation.delegate
|
38
|
+
when 'ElicitIntent'
|
39
|
+
conversation.elicit_intent(
|
40
|
+
messages: opts.fetch(:messages)
|
41
|
+
)
|
42
|
+
when 'ElicitSlot'
|
43
|
+
conversation.elicit_slot(
|
44
|
+
intent: intent,
|
45
|
+
messages: opts.fetch(:messages),
|
46
|
+
slot_to_elicit: slot_to_elicit
|
47
|
+
)
|
48
|
+
else
|
49
|
+
raise ArgumentError, "invalid DialogActionType: `#{dialog_action_type.raw}`"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
# rubocop:enable Metrics/MethodLength
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -7,13 +7,13 @@ module Aws
|
|
7
7
|
class Context
|
8
8
|
include Base
|
9
9
|
|
10
|
-
required :
|
10
|
+
required :context_attributes
|
11
11
|
required :name
|
12
|
-
required :
|
12
|
+
required :time_to_live
|
13
13
|
|
14
14
|
coerce(
|
15
|
-
|
16
|
-
|
15
|
+
context_attributes: symbolize_hash!,
|
16
|
+
time_to_live: TimeToLive
|
17
17
|
)
|
18
18
|
end
|
19
19
|
end
|
@@ -4,14 +4,14 @@ module Aws
|
|
4
4
|
module Lex
|
5
5
|
class Conversation
|
6
6
|
module Type
|
7
|
-
class
|
7
|
+
class DialogAction
|
8
8
|
include Base
|
9
9
|
|
10
|
-
|
11
|
-
required :
|
10
|
+
optional :slot_to_elicit
|
11
|
+
required :type
|
12
12
|
|
13
13
|
coerce(
|
14
|
-
|
14
|
+
type: DialogActionType
|
15
15
|
)
|
16
16
|
end
|
17
17
|
end
|
@@ -7,11 +7,11 @@ module Aws
|
|
7
7
|
class DialogActionType
|
8
8
|
include Enumeration
|
9
9
|
|
10
|
-
enumeration('
|
11
|
-
enumeration('ElicitSlot')
|
10
|
+
enumeration('Close')
|
12
11
|
enumeration('ConfirmIntent')
|
13
12
|
enumeration('Delegate')
|
14
|
-
enumeration('
|
13
|
+
enumeration('ElicitIntent')
|
14
|
+
enumeration('ElicitSlot')
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -7,36 +7,43 @@ module Aws
|
|
7
7
|
class Event
|
8
8
|
include Base
|
9
9
|
|
10
|
-
required :active_contexts, default: -> { [] }
|
11
|
-
required :alternative_intents, default: -> { [] }
|
12
|
-
required :current_intent
|
13
10
|
required :bot
|
14
|
-
required :
|
11
|
+
required :input_mode
|
15
12
|
required :input_transcript
|
13
|
+
required :interpretations
|
16
14
|
required :invocation_source
|
17
|
-
required :output_dialog_mode
|
18
15
|
required :message_version
|
19
|
-
required :session_attributes, default: -> { {} }
|
20
|
-
required :recent_intent_summary_view, default: -> { [] }
|
21
16
|
required :request_attributes, default: -> { {} }
|
22
|
-
|
23
|
-
|
17
|
+
required :response_content_type
|
18
|
+
required :session_id
|
19
|
+
required :session_state
|
20
|
+
|
21
|
+
computed_property :current_intent, ->(instance) do
|
22
|
+
instance.session_state.intent.tap do |intent|
|
23
|
+
intent.nlu_confidence = instance.interpretations.find { |i| i.intent.name == intent.name }.nlu_confidence
|
24
|
+
end
|
25
|
+
end
|
24
26
|
|
25
27
|
computed_property :intents, ->(instance) do
|
26
|
-
|
28
|
+
instance.interpretations.map(&:intent).tap do |intents|
|
29
|
+
intents.map do |intent|
|
30
|
+
intent.nlu_confidence = instance.interpretations.find { |i| i.intent.name == intent.name }.nlu_confidence
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
computed_property :alternate_intents, ->(instance) do
|
36
|
+
instance.intents.reject { |intent| intent.name == instance.current_intent.name }
|
27
37
|
end
|
28
38
|
|
29
39
|
coerce(
|
30
|
-
active_contexts: Array[Context],
|
31
|
-
alternative_intents: Array[Intent],
|
32
|
-
current_intent: Intent,
|
33
40
|
bot: Bot,
|
41
|
+
input_mode: InputMode,
|
42
|
+
interpretations: Array[Interpretation],
|
34
43
|
invocation_source: InvocationSource,
|
35
|
-
output_dialog_mode: OutputDialogMode,
|
36
|
-
session_attributes: symbolize_hash!,
|
37
44
|
request_attributes: symbolize_hash!,
|
38
|
-
|
39
|
-
|
45
|
+
response_content_type: Message::ContentType,
|
46
|
+
session_state: SessionState
|
40
47
|
)
|
41
48
|
end
|
42
49
|
end
|
@@ -7,46 +7,37 @@ module Aws
|
|
7
7
|
class Intent
|
8
8
|
include Base
|
9
9
|
|
10
|
+
required :confirmation_state
|
11
|
+
optional :kendra_response
|
10
12
|
required :name
|
11
13
|
required :raw_slots, from: :slots, virtual: true
|
12
|
-
required :
|
13
|
-
|
14
|
-
optional :
|
14
|
+
required :state
|
15
|
+
optional :originating_request_id
|
16
|
+
optional :nlu_confidence
|
15
17
|
|
16
18
|
computed_property :slots, ->(instance) do
|
17
19
|
# any keys indexed without a value will return an empty Slot instance
|
18
20
|
default_hash = Hash.new do |_hash, key|
|
19
|
-
Slot.
|
21
|
+
Slot.shrink_wrap(active: false, name: key.to_sym, value: nil, shape: 'Scalar')
|
20
22
|
end
|
21
23
|
|
22
24
|
instance.raw_slots.each_with_object(default_hash) do |(key, value), hash|
|
25
|
+
value ||= { shape: 'Scalar' }
|
23
26
|
hash[key.to_sym] = Slot.shrink_wrap(
|
24
27
|
active: true,
|
25
28
|
name: key,
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
current_intent: instance
|
29
|
+
shape: value[:shape],
|
30
|
+
value: value[:value],
|
31
|
+
values: value[:values]
|
30
32
|
)
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
34
|
-
class << self
|
35
|
-
def slot_details!
|
36
|
-
->(val) do
|
37
|
-
val
|
38
|
-
.compact
|
39
|
-
.each_with_object({}) do |(key, value), hash|
|
40
|
-
hash[key.to_sym] = SlotDetail.shrink_wrap(value)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
36
|
coerce(
|
47
|
-
|
48
|
-
|
49
|
-
|
37
|
+
raw_slots: symbolize_hash!,
|
38
|
+
slots: Array[Slot],
|
39
|
+
confirmation_state: ConfirmationState,
|
40
|
+
nlu_confidence: float!(nilable: true)
|
50
41
|
)
|
51
42
|
end
|
52
43
|
end
|
@@ -28,9 +28,9 @@ module Aws
|
|
28
28
|
def candidates(threshold: standard_deviation)
|
29
29
|
intents = event.intents.select do |intent|
|
30
30
|
diff = event.current_intent
|
31
|
-
.
|
31
|
+
.nlu_confidence
|
32
32
|
.to_f
|
33
|
-
.-(intent.
|
33
|
+
.-(intent.nlu_confidence.to_f)
|
34
34
|
.abs
|
35
35
|
|
36
36
|
diff <= threshold
|
@@ -38,7 +38,7 @@ module Aws
|
|
38
38
|
|
39
39
|
# sort descending
|
40
40
|
intents.sort do |a, b|
|
41
|
-
b.
|
41
|
+
b.nlu_confidence.to_f <=> a.nlu_confidence.to_f
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -58,13 +58,13 @@ module Aws
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def calculate_mean
|
61
|
-
sum = event.intents.sum { |i| i.
|
61
|
+
sum = event.intents.sum { |i| i.nlu_confidence.to_f }
|
62
62
|
sum / event.intents.size
|
63
63
|
end
|
64
64
|
|
65
65
|
def calculate_standard_deviation
|
66
66
|
normalized = event.intents.map do |intent|
|
67
|
-
(intent.
|
67
|
+
(intent.nlu_confidence.to_f - mean) ** 2
|
68
68
|
end
|
69
69
|
normalized_mean = normalized.sum / normalized.size
|
70
70
|
Math.sqrt(normalized_mean)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Aws
|
4
|
+
module Lex
|
5
|
+
class Conversation
|
6
|
+
module Type
|
7
|
+
class Interpretation
|
8
|
+
include Base
|
9
|
+
|
10
|
+
required :intent
|
11
|
+
optional :nlu_confidence
|
12
|
+
optional :sentiment_response
|
13
|
+
|
14
|
+
coerce(
|
15
|
+
intent: Intent,
|
16
|
+
nlu_confidence: float!(nilable: true),
|
17
|
+
sentiment_response: SentimentResponse
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -7,11 +7,13 @@ module Aws
|
|
7
7
|
class Message
|
8
8
|
include Base
|
9
9
|
|
10
|
-
|
10
|
+
required :content_type, default: -> { 'PlainText' }
|
11
11
|
required :content
|
12
|
+
optional :image_response_card
|
12
13
|
|
13
14
|
coerce(
|
14
|
-
content_type: Message::ContentType
|
15
|
+
content_type: Message::ContentType,
|
16
|
+
image_response_card: Aws::Lex::Conversation::Type::ResponseCard
|
15
17
|
)
|
16
18
|
end
|
17
19
|
end
|
@@ -7,10 +7,9 @@ module Aws
|
|
7
7
|
class Response
|
8
8
|
include Base
|
9
9
|
|
10
|
-
required :
|
11
|
-
|
12
|
-
|
13
|
-
optional :active_contexts
|
10
|
+
required :session_state
|
11
|
+
required :messages
|
12
|
+
required :request_attributes
|
14
13
|
end
|
15
14
|
end
|
16
15
|
end
|
@@ -7,14 +7,13 @@ module Aws
|
|
7
7
|
class ResponseCard
|
8
8
|
include Base
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
required :title
|
11
|
+
required :buttons, default: -> { [] }
|
12
|
+
optional :sub_title
|
13
|
+
optional :image_url
|
13
14
|
|
14
15
|
coerce(
|
15
|
-
|
16
|
-
content_type: ResponseCard::ContentType,
|
17
|
-
generic_attachments: Array[GenericAttachment]
|
16
|
+
buttons: Array[ResponseCard::Button]
|
18
17
|
)
|
19
18
|
end
|
20
19
|
end
|