-
Notifications
You must be signed in to change notification settings - Fork 1
/
template.yaml
711 lines (652 loc) · 22.3 KB
/
template.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
AWSTemplateFormatVersion: '2010-09-09'
Transform:
- AWS::Serverless-2016-10-31
- AWS::LanguageExtensions
Description: >
AWS Chime Voice SDK SMA
Parameters:
CONNECTID:
Description: AWS Connect Instance ID (last part of the ARN)
Type: String
Default: f837ec93-b6e5-4429-acb7-XXXXXXXXXXXX
SMAID:
Description: Chime Voice Sip Media Application (SMA) ID
Type: String
Default: cf3e17cd-f4e5-44c3-ab04-XXXXXXXXXXXX
OPENAIAPIKEY:
Description: OpenAI Key stored in parameter store
Type: AWS::SSM::Parameter::Value<String>
Default: OPENAI_API_KEY
OPENAIMODEL:
Description: OpenAI ChatGPT Model
Type: String
Default: gpt-4o-mini
AllowedValues: # https://platform.openai.com/docs/models/overview
- gpt-3.5-turbo-1106
- gpt-3.5-turbo
- gpt-4
- gpt-4o-mini
VOICEIDEN:
Description: The voice used for LEX and prompt generation for English
Type: String
Default: Joanna
AllowedValues: # https://docs.aws.amazon.com/polly/latest/dg/ntts-voices-main.html
- Ivy # Female (child)
- Joanna # Female
- Kendra # Female
- Kimberly # Female
- Salli # Female
- Joey # Male
- Justin # Male (child)
- Kevin # Male (child)
- Matthew # Male
- Ruth # Female
- Stephen # Male
VOICEIDES:
Description: The voice used for LEX and prompt generation for Spanish
Type: String
Default: Lupe
AllowedValues:
- Mia # Female (Mexican)
- Andrés # Male (Mexican)
- Lupe # Female (US)
- Pedro # Male (US)
CALLSTABLENAME:
Description: Name of Global Dynamo Table to store info on calls from Chime
Type: String
Default: chime-voicesdk-sma-calls
REGIONS:
Description: TWO Regions where were are deploying (to create the global table and where Chime exists)
Type: CommaDelimitedList
Default: us-east-1,us-west-2
AllowedValues:
- us-east-1
- us-west-2
- eu-central-1
- eu-west-2
Conditions:
CreateCallTable: !Equals
- !Ref AWS::Region
- !Select [ 0, !Ref REGIONS ]
Globals:
Function:
Runtime: java21
Timeout: 30
MemorySize: 3009
Resources:
PromptBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Delete
PromptBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref PromptBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: AllowChimeAccessRead
Effect: Allow
Principal:
Service: voiceconnector.chime.amazonaws.com
Action:
- s3:GetObject
Resource:
- !GetAtt PromptBucket.Arn
- !Join [ "", [ !GetAtt PromptBucket.Arn , '/*' ] ]
Condition:
StringEquals:
"aws:SourceAccount": !Sub "${AWS::AccountId}"
PromptCopier:
Type: AWS::Serverless::Function
DependsOn: PromptCopierLogGroup
Properties:
FunctionName: !Sub ${AWS::StackName}-PromptCopier
Description: Copy Static prompts in repo to S3 to be used in Chime SMA
Handler: cloud.cleo.chimesma.PromptCopier
CodeUri: ./PollyPromptCreation
Architectures:
- arm64
Environment:
Variables:
PROMPT_BUCKET: !Ref PromptBucket
Policies:
- S3CrudPolicy:
BucketName: !Ref PromptBucket
PromptCopierLogGroup:
Type: AWS::Logs::LogGroup
UpdateReplacePolicy: Retain
DeletionPolicy: Delete
Properties:
LogGroupName: !Sub '/aws/lambda/${AWS::StackName}-PromptCopier'
RetentionInDays: 30
StaticPrompts:
Type: Custom::PromptCopier
Properties:
ServiceToken: !GetAtt PromptCopier.Arn
RecordBucket:
Type: AWS::S3::Bucket
UpdateReplacePolicy: Retain
DeletionPolicy: Retain
RecordBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref RecordBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: AllowChimeAccessRecord
Effect: Allow
Principal:
Service: voiceconnector.chime.amazonaws.com
Action:
- s3:PutObject
- s3:PutObjectAcl
- s3:GetObject
Resource:
- !GetAtt RecordBucket.Arn
- !Join [ "", [ !GetAtt RecordBucket.Arn , '/*' ] ]
Condition:
StringEquals:
"aws:SourceAccount": !Sub "${AWS::AccountId}"
PromptCreator:
Type: AWS::Serverless::Function
DependsOn: PromptCreatorLogGroup
Properties:
FunctionName: !Sub ${AWS::StackName}-PromptCreator
Description: Creates Static prompts to be used in Chime Voice SDK
Handler: cloud.cleo.chimesma.PollyPromptGenerator
CodeUri: ./PollyPromptCreation
Architectures: # Must use x86 due to sox naitive libraries included
- x86_64
Environment:
Variables:
PROMPT_BUCKET: !Ref PromptBucket
Policies:
- S3CrudPolicy:
BucketName: !Ref PromptBucket
- Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- polly:SynthesizeSpeech
Resource: '*'
PromptCreatorLogGroup:
Type: AWS::Logs::LogGroup
UpdateReplacePolicy: Retain
DeletionPolicy: Delete
Properties:
LogGroupName: !Sub '/aws/lambda/${AWS::StackName}-PromptCreator'
RetentionInDays: 30
MainPromptEast:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDEN
PromptName: us-east-1-welcome.wav
PromptText: |
<speak>
<break time="1s"/>Welcome to the Chime SMA demo in the <emphasis>US East One</emphasis> region.
</speak>
MainPromptWest:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDEN
PromptName: us-west-2-welcome.wav
PromptText: |
<speak>
<break time="1s"/>Welcome to the Chime SMA demo in the <emphasis>US West Two</emphasis> region.
</speak>
MainMenuEN:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDEN
PromptName: main-menu-en-US.wav
PromptText: |
Main menu.
Press One for Chat GPT Bot English. Press Two for Chat GPT Bot Spanish.
Press Three for Connect take back and transfer.
Press Four for recording functions.
Any other key to end the call.
MainMenuES:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDES
PromptName: main-menu-es-US.wav
PromptText: |
Menú principal.
Presiona Uno para Chat GPT Bot Inglés. Presiona Dos para Chat GPT Bot Español.
Presione Tres para la devolución y transferencia de Connect.
Presione Cuatro para las funciones de grabación.
Cualquier otra tecla para finalizar la llamada.
TryAgainEN:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDEN
PromptName: try-again-en-US.wav
PromptText: Please try again.
TryAgainES:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDES
PromptName: try-again-es-US.wav
PromptText: Inténtalo de nuevo.
TansferPromptEN:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDEN
PromptName: transfer-en-US.wav
PromptText: |
<speak>
Transferring <break time="10s"/>
</speak>
TansferPromptES:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDES
PromptName: transfer-es-US.wav
PromptText: |
<speak>
Transfiriendo <break time="10s"/>
</speak>
GoodbyePromptEN:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDEN
PromptName: goodbye-en-US.wav
PromptText: Thank you for calling, good bye.
GoodbyePromptES:
Type: Custom::PromptCreator
Properties:
ServiceToken: !GetAtt PromptCreator.Arn
VoiceId: !Ref VOICEIDES
PromptName: goodbye-es-US.wav
PromptText: Gracias por llamar, adiós.
ChimeSMA:
Type: AWS::Serverless::Function
DependsOn: ChimeSMALogGroup
Properties:
FunctionName: !Sub ${AWS::StackName}-ChimeSMA
Description: Chime SMA Call FLow Director Example
Handler: cloud.cleo.chimesma.examples.actions.ExampleFlow
AutoPublishAlias: SNAPSTART
CodeUri: ./Examples
Architectures: # SnapStart now supports ARM
- arm64
Environment:
Variables:
PROMPT_BUCKET: !Ref PromptBucket
RECORD_BUCKET: !Ref RecordBucket
CALLS_TABLE_NAME: !Ref CALLSTABLENAME
BOT_ALIAS_ARN: !GetAtt BotAliasGPT.Arn
THROW_EXCEPTION: false
LANGUAGE_VOICE_MAP:
Fn::ToJsonString:
- Locale: en-US
VoiceId: !Ref VOICEIDEN
- Locale: es-US
VoiceId: !Ref VOICEIDES
Policies:
- DynamoDBWritePolicy:
TableName: !Ref CALLSTABLENAME
SnapStart:
ApplyOn: PublishedVersions
ChimeSMALogGroup:
Type: AWS::Logs::LogGroup
UpdateReplacePolicy: Retain
DeletionPolicy: Delete
Properties:
LogGroupName: !Sub '/aws/lambda/${AWS::StackName}-ChimeSMA'
RetentionInDays: 90
ChimeSMAPerm:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref ChimeSMA
Action: lambda:InvokeFunction
Principal: voiceconnector.chime.amazonaws.com
SourceAccount: !Ref 'AWS::AccountId'
ChimeSMASnapPerm:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref ChimeSMA.Alias
Action: lambda:InvokeFunction
Principal: voiceconnector.chime.amazonaws.com
SourceAccount: !Ref 'AWS::AccountId'
CallTable:
Type: AWS::DynamoDB::GlobalTable
# Only create this once when deploying to us-east-1
Condition: CreateCallTable
DeletionPolicy: Delete
Properties:
TableName: !Ref CALLSTABLENAME
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: phoneNumber
AttributeType: S
KeySchema:
- AttributeName: phoneNumber
KeyType: HASH
TimeToLiveSpecification:
AttributeName: ttl
Enabled: true
StreamSpecification:
StreamViewType: KEYS_ONLY
Replicas:
- Region: !Select [0, !Ref REGIONS]
- Region: !Select [1, !Ref REGIONS]
TransferCall:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub ${AWS::StackName}-TransferCall
Description: Lambda that will send message to Chime SMA to indicate transfer
Handler: index.handler
Runtime: nodejs18.x
MemorySize: 512
Timeout: 5
Environment:
Variables:
CALLS_TABLE_NAME: !Ref CALLSTABLENAME
Policies:
- !Ref ChimePolicy
- DynamoDBReadPolicy:
TableName: !Ref CALLSTABLENAME
InlineCode: |
const {ChimeClient, UpdateSipMediaApplicationCallCommand} = require("@aws-sdk/client-chime");
const { DynamoDBClient, GetItemCommand } = require("@aws-sdk/client-dynamodb")
const ddb = new DynamoDBClient();
const regex = /(\+[0-9]+)/;
const table_name = process.env.CALLS_TABLE_NAME;
exports.handler = async function (event) {
console.log(JSON.stringify(event));
let match = event.Details.Parameters.Diversion.match(regex);
console.log('Extracted phone is ' + match[1] );
const dparams = {
Key : {
phoneNumber : {
S: match[1]
}
},
TableName: table_name
};
const dresponse = await ddb.send(new GetItemCommand(dparams));
console.log(JSON.stringify(dresponse))
const cparams = {
SipMediaApplicationId: dresponse.Item.sipMediaApplicationId.S,
TransactionId: dresponse.Item.transactionId.S,
Arguments: {
phoneNumber: event.Details.Parameters.transferTo
}
};
// We need to know region before initializing client
const chime = new ChimeClient({ region: dresponse.Item.region.S, });
const cresponse = await chime.send(new UpdateSipMediaApplicationCallCommand(cparams));
console.log(JSON.stringify(cresponse));
return {status: 'OK'};
};
TransferCallLogGroup:
Type: AWS::Logs::LogGroup
UpdateReplacePolicy: Retain
DeletionPolicy: Delete
Properties:
LogGroupName: !Sub '/aws/lambda/${TransferCall}'
RetentionInDays: 90
TransferCallConnectIntegration:
Type: AWS::Connect::IntegrationAssociation
Properties:
InstanceId: !Sub arn:aws:connect:${AWS::Region}:${AWS::AccountId}:instance/${CONNECTID}
IntegrationType: LAMBDA_FUNCTION
IntegrationArn: !GetAtt TransferCall.Arn
ChimePolicy:
Type: 'AWS::IAM::ManagedPolicy'
Properties:
Description: Allow Lambda to call Chime API to update SMA
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- chime:*
Resource: '*'
BotRuntimeRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- lex.amazonaws.com
- lexv2.amazonaws.com
Action:
- "sts:AssumeRole"
Path: "/"
Policies:
- PolicyName: !Sub ${AWS::StackName}-${AWS::Region}-Bot-Role-Policy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- "polly:SynthesizeSpeech"
- "comprehend:DetectSentiment"
- "lambda:invokeFunction"
Resource: "*"
LexBotGPT:
Type: AWS::Lex::Bot
Properties:
Name: !Sub ${AWS::StackName}-Lex-Bot-GPT
Description: ChatGPT Bot
RoleArn: !GetAtt BotRuntimeRole.Arn
DataPrivacy:
ChildDirected: false
AutoBuildBotLocales: true
IdleSessionTTLInSeconds: 300
BotLocales:
- LocaleId: en_US
Description: ChatGPT Bot English
NluConfidenceThreshold: 0.40
VoiceSettings:
VoiceId: !Ref VOICEIDEN
Intents:
- Name: "Quit"
Description: "Hang Up the call"
SampleUtterances:
- Utterance: "quit"
- Utterance: "I'm done"
- Utterance: "good bye"
- Utterance: "talk to you later"
- Utterance: "see ya"
- Utterance: "later"
- Utterance: "exit"
- Utterance: "Thank you"
- Utterance: "all done"
- Utterance: "That's it'"
- Utterance: "nothing else"
- Name: "Transfer"
Description: "Send Call to a Person"
SampleUtterances:
- Utterance: "speak with someone"
- Utterance: "talk to someone"
- Utterance: "speak with a person"
- Utterance: "Representative"
- Utterance: "real person"
- Utterance: "someone real"
- Name: "FallbackIntent"
Description: "Default intent when no other intent matches, send to GPT"
ParentIntentSignature: "AMAZON.FallbackIntent"
FulfillmentCodeHook:
Enabled: true
InitialResponseSetting:
InitialResponse:
AllowInterrupt: false
MessageGroupsList:
- Message:
PlainTextMessage:
Value: Thinking
Variations:
- PlainTextMessage:
Value: Working
- PlainTextMessage:
Value: Processing
- LocaleId: es_US
Description: ChatGPT Bot Spanish
NluConfidenceThreshold: 0.40
VoiceSettings:
VoiceId: !Ref VOICEIDES
Intents:
- Name: "Quit"
Description: "Hang Up the call"
SampleUtterances:
- Utterance: "abandonar"
- Utterance: "He terminado"
- Utterance: "adiós"
- Utterance: "Hablaré contigo más tarde"
- Utterance: "salida"
- Utterance: "gracias"
- Name: "Transfer"
Description: "Send Call to a Person"
SampleUtterances:
- Utterance: "hablar con alguien"
- Utterance: "hablar con una persona"
- Utterance: "Representante"
- Name: "FallbackIntent"
Description: "Default intent when no other intent matches, send to GPT"
ParentIntentSignature: "AMAZON.FallbackIntent"
FulfillmentCodeHook:
Enabled: true
InitialResponseSetting:
InitialResponse:
AllowInterrupt: false
MessageGroupsList:
- Message:
PlainTextMessage:
Value: Pensamiento
Variations:
- PlainTextMessage:
Value: trabajador
- PlainTextMessage:
Value: "la transformación"
BotVersionGPT:
Type: AWS::Lex::BotVersion
Properties:
BotId: !Ref LexBotGPT
BotVersionLocaleSpecification:
- LocaleId: en_US
BotVersionLocaleDetails:
SourceBotVersion: DRAFT
- LocaleId: es_US
BotVersionLocaleDetails:
SourceBotVersion: DRAFT
Description: ChatGPT Bot V1
BotAliasGPT:
Type: AWS::Lex::BotAlias
Properties:
BotId: !Ref LexBotGPT
BotAliasName: "Latest"
BotVersion: !GetAtt BotVersionGPT.BotVersion
SentimentAnalysisSettings:
DetectSentiment: false
BotAliasLocaleSettings:
- LocaleId: en_US
BotAliasLocaleSetting:
Enabled: true
CodeHookSpecification:
LambdaCodeHook:
CodeHookInterfaceVersion: "1.0"
LambdaArn: !Ref ChatGPT.Alias
- LocaleId: es_US
BotAliasLocaleSetting:
Enabled: true
CodeHookSpecification:
LambdaCodeHook:
CodeHookInterfaceVersion: "1.0"
LambdaArn: !Ref ChatGPT.Alias
ChatGPT:
Type: AWS::Serverless::Function
DependsOn: ChatGPTLogGroup
Properties:
FunctionName: !Sub ${AWS::StackName}-ChatGPT
Description: Lex fullfilment that talks to ChatGPT service
Handler: cloud.cleo.connectgpt.ChatGPTLambda
AutoPublishAlias: SNAPSTART
CodeUri: ./ChatGPT
Architectures: # SnapStart now supports ARM
- arm64
Environment:
Variables:
OPENAI_MODEL: !Ref OPENAIMODEL
OPENAI_API_KEY: !Ref OPENAIAPIKEY
SESSION_TABLE_NAME: !Ref SessionTable
SnapStart:
ApplyOn: PublishedVersions
Policies:
- DynamoDBReadPolicy:
TableName: !Ref SessionTable
- DynamoDBWritePolicy:
TableName: !Ref SessionTable
ChatGPTLogGroup:
Type: AWS::Logs::LogGroup
UpdateReplacePolicy: Retain
DeletionPolicy: Delete
Properties:
LogGroupName: !Sub '/aws/lambda/${AWS::StackName}-ChatGPT'
RetentionInDays: 90
LexToChatGPTPerm:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref ChatGPT
Action: lambda:InvokeFunction
Principal: lexv2.amazonaws.com
SourceAccount: !Ref 'AWS::AccountId'
LexToChatGPTSnapPerm:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref ChatGPT.Alias
Action: lambda:InvokeFunction
Principal: lexv2.amazonaws.com
SourceAccount: !Ref 'AWS::AccountId'
SessionTable:
Type: AWS::DynamoDB::Table
DeletionPolicy: Delete
Properties:
TableName: !Sub ${AWS::StackName}-session
BillingMode: PAY_PER_REQUEST
AttributeDefinitions:
- AttributeName: phoneNumber
AttributeType: S
- AttributeName: date
AttributeType: S
KeySchema:
- AttributeName: phoneNumber
KeyType: HASH
- AttributeName: date
KeyType: RANGE
TimeToLiveSpecification:
AttributeName: ttl
Enabled: true
ChimeCallLexGPT:
Type: AWS::Lex::ResourcePolicy
Properties:
ResourceArn: !GetAtt BotAliasGPT.Arn
Policy:
Version: '2012-10-17'
Statement:
- Sid: AllowChimePstnAudioUseBotGPT
Effect: Allow
Principal:
Service: voiceconnector.chime.amazonaws.com
Action: lex:StartConversation
Resource: !Sub ${BotAliasGPT.Arn}
Condition:
StringEquals:
AWS:SourceAccount: !Sub ${AWS::AccountId}
ArnEquals:
AWS:SourceArn: !Sub arn:aws:voiceconnector:${AWS::Region}:${AWS::AccountId}:sma/${SMAID}