1
1
AWSTemplateFormatVersion: "2010-09-09"
2
2
3
- Description: Amazon Transcribe Post Call Analytics - PCA (v0.7.11 ) (uksb-1sn29lk73, SO9071)
3
+ Description: Amazon Transcribe Post Call Analytics - PCA (v0.7.12 ) (uksb-1sn29lk73, SO9071)
4
4
5
5
Parameters:
6
6
@@ -352,10 +352,10 @@ Parameters:
352
352
- PROD
353
353
Default: PROD
354
354
355
- DatabaseName :
355
+ GlueDatabaseName :
356
356
Type: String
357
- Default: 'pca'
358
- Description: Glue catalog database name used to contain tables/views for SQL integration.
357
+ AllowedPattern: "^$|[a-z0-9_-]+"
358
+ Description: (Optional) Glue catalog database name in lowercase characters used to contain tables/views for SQL integration.
359
359
360
360
EnablePcaDashboards:
361
361
Type: String
@@ -384,14 +384,17 @@ Parameters:
384
384
385
385
GenAIQueryBedrockModelId:
386
386
Type: String
387
- Default: anthropic.claude-3-haiku-20240307 -v1:0
387
+ Default: us.amazon.nova-lite -v1:0
388
388
AllowedValues:
389
389
- anthropic.claude-3-haiku-20240307-v1:0
390
390
- anthropic.claude-3-sonnet-20240229-v1:0
391
- - amazon.titan-text-express-v1
392
- - anthropic.claude-v1
393
- - anthropic.claude-instant-v1
394
- - anthropic.claude-v2
391
+ - us.amazon.nova-micro-v1:0
392
+ - us.amazon.nova-lite-v1:0
393
+ - us.amazon.nova-pro-v1:0
394
+ - us.anthropic.claude-3-5-haiku-20241022-v1:0
395
+ - us.anthropic.claude-3-5-sonnet-20241022-v2:0
396
+ - eu.anthropic.claude-3-5-sonnet-20240620-v1:0
397
+ - apac.anthropic.claude-3-5-sonnet-20240620-v1:0
395
398
Description: (Optional) If 'GenAIQuery' is BEDROCK, which Bedrock model to use.
396
399
397
400
CallSummarization:
@@ -417,14 +420,17 @@ Parameters:
417
420
418
421
SummarizationBedrockModelId:
419
422
Type: String
420
- Default: anthropic.claude-3-haiku-20240307 -v1:0
423
+ Default: us.amazon.nova-lite -v1:0
421
424
AllowedValues:
422
425
- anthropic.claude-3-haiku-20240307-v1:0
423
426
- anthropic.claude-3-sonnet-20240229-v1:0
424
- - amazon.titan-text-express-v1
425
- - anthropic.claude-v1
426
- - anthropic.claude-instant-v1
427
- - anthropic.claude-v2
427
+ - us.amazon.nova-micro-v1:0
428
+ - us.amazon.nova-lite-v1:0
429
+ - us.amazon.nova-pro-v1:0
430
+ - us.anthropic.claude-3-5-haiku-20241022-v1:0
431
+ - us.anthropic.claude-3-5-sonnet-20241022-v2:0
432
+ - eu.anthropic.claude-3-5-sonnet-20240620-v1:0
433
+ - apac.anthropic.claude-3-5-sonnet-20240620-v1:0
428
434
Description: (Optional) If 'CallSummarization' is BEDROCK, which Bedrock model to use.
429
435
430
436
TestBedrockModelId:
@@ -495,7 +501,7 @@ Metadata:
495
501
default: Advanced analytics and reporting
496
502
Parameters:
497
503
- EnablePcaDashboards
498
- - DatabaseName
504
+ - GlueDatabaseName
499
505
- Label:
500
506
default: S3 Bucket Names and Retention Policy
501
507
Parameters:
@@ -673,6 +679,19 @@ Resources:
673
679
- ServerSideEncryptionByDefault:
674
680
SSEAlgorithm: AES256
675
681
682
+ ########################################################
683
+ # Glue Database
684
+ ########################################################
685
+
686
+ PCADatabase:
687
+ Type: AWS::Glue::Database
688
+ Properties:
689
+ CatalogId: !Ref AWS::AccountId
690
+ DatabaseInput:
691
+ Name: !Ref GlueDatabaseName
692
+ Description: Post Call Analytics
693
+ LocationUri: !Sub 's3://${OutputBucket}/${OutputBucketParsedResults}/'
694
+
676
695
########################################################
677
696
# If Bedrock Models are selected, verify that Bedrock
678
697
# is available in the region, and that models are enabled
@@ -701,6 +720,12 @@ Resources:
701
720
Resource:
702
721
- !Sub "arn:${AWS::Partition}:bedrock:*::foundation-model/*"
703
722
- !Sub "arn:${AWS::Partition}:bedrock:*:${AWS::AccountId}:custom-model/*"
723
+ - !Sub "arn:aws:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/*"
724
+ - Effect: Allow
725
+ Action:
726
+ - "bedrock:GetInferenceProfile"
727
+ Resource:
728
+ - !Sub "arn:aws:bedrock:${AWS::Region}:${AWS::AccountId}:inference-profile/*"
704
729
PolicyName: BedrockPolicy
705
730
706
731
TestBedrockModelFunction:
@@ -723,76 +748,38 @@ Resources:
723
748
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--target', '/tmp', 'boto3'])
724
749
sys.path.insert(0,'/tmp')
725
750
import boto3
726
-
751
+ from botocore.config import Config
752
+
727
753
# Defaults
728
754
AWS_REGION = os.environ["AWS_REGION_OVERRIDE"] if "AWS_REGION_OVERRIDE" in os.environ else os.environ["AWS_REGION"]
729
755
ENDPOINT_URL = os.environ.get("ENDPOINT_URL", f'https://bedrock-runtime.{AWS_REGION}.amazonaws.com')
730
756
DEFAULT_MAX_TOKENS = 128
731
757
732
- def get_request_body(modelId, parameters, prompt):
733
- provider = modelId.split(".")[0]
734
- request_body = None
735
- if provider == "anthropic":
736
- if 'claude-3' in modelId:
737
- request_body = {
738
- "max_tokens": DEFAULT_MAX_TOKENS,
739
- "messages": [{"role": "user", "content": prompt}],
740
- "anthropic_version": "bedrock-2023-05-31"
741
- }
742
- else:
743
- request_body = {
744
- "prompt": prompt,
745
- "max_tokens_to_sample": DEFAULT_MAX_TOKENS
746
- }
747
-
748
- request_body.update(parameters)
749
- elif provider == "ai21":
750
- request_body = {
751
- "prompt": prompt,
752
- "maxTokens": DEFAULT_MAX_TOKENS
753
- }
754
- request_body.update(parameters)
755
- elif provider == "amazon":
756
- textGenerationConfig = {
757
- "maxTokenCount": DEFAULT_MAX_TOKENS
758
- }
759
- textGenerationConfig.update(parameters)
760
- request_body = {
761
- "inputText": prompt,
762
- "textGenerationConfig": textGenerationConfig
758
+ def get_generate_text(response):
759
+ return response["output"]["message"]["content"][0]["text"]
760
+
761
+ def call_llm(prompt, modelId):
762
+ client = boto3.client(
763
+ service_name='bedrock-runtime',
764
+ region_name=AWS_REGION,
765
+ endpoint_url=ENDPOINT_URL,
766
+ config=Config(retries={'max_attempts': 50, 'mode': 'adaptive'})
767
+ )
768
+
769
+ message = {
770
+ 'role': 'user',
771
+ 'content': [{'text': prompt}]
772
+ }
773
+
774
+ response = client.converse(
775
+ modelId=modelId,
776
+ messages=[message],
777
+ inferenceConfig={
778
+ 'maxTokens': DEFAULT_MAX_TOKENS,
779
+ 'temperature': 0
763
780
}
764
- else:
765
- raise Exception("Unsupported provider: ", provider)
766
- return request_body
767
-
768
- def get_generate_text(modelId, response):
769
- provider = modelId.split(".")[0]
770
- generated_text = None
771
- if provider == "anthropic":
772
- if 'claude-3' in modelId:
773
- response_raw = json.loads(response.get("body").read().decode())
774
- generated_text = response_raw.get('content')[0].get('text')
775
-
776
- else:
777
- response_body = json.loads(response.get("body").read().decode())
778
- generated_text = response_body.get("completion")
779
- elif provider == "ai21":
780
- response_body = json.loads(response.get("body").read())
781
- generated_text = response_body.get("completions")[0].get("data").get("text")
782
- elif provider == "amazon":
783
- response_body = json.loads(response.get("body").read())
784
- generated_text = response_body.get("results")[0].get("outputText")
785
- else:
786
- raise Exception("Unsupported provider: ", provider)
787
- return generated_text
788
-
789
- def call_llm(parameters, prompt):
790
- modelId = parameters.pop("modelId")
791
- body = get_request_body(modelId, parameters, prompt)
792
- print("ModelId", modelId, "- Body: ", body)
793
- client = boto3.client(service_name='bedrock-runtime', region_name=AWS_REGION, endpoint_url=ENDPOINT_URL)
794
- response = client.invoke_model(body=json.dumps(body), modelId=modelId, accept='application/json', contentType='application/json')
795
- generated_text = get_generate_text(modelId, response)
781
+ )
782
+ generated_text = get_generate_text(response)
796
783
return generated_text
797
784
798
785
def lambda_handler(event, context):
@@ -808,12 +795,8 @@ Resources:
808
795
# Test LLMModel
809
796
llmModelId = event['ResourceProperties'].get('LLMModelId', '')
810
797
modelId = llmModelId
811
- parameters = {
812
- "modelId": modelId,
813
- "temperature": 0
814
- }
815
798
print(f"Testing {modelId}")
816
- call_llm(parameters, prompt)
799
+ call_llm(prompt, modelId)
817
800
except Exception as e:
818
801
status = cfnresponse.FAILED
819
802
reason = f"Exception thrown testing ModelId='{modelId}'. Check that Amazon Bedrock is available in your region, and that model is activated in your Amazon Bedrock account - {e}"
@@ -848,6 +831,7 @@ Resources:
848
831
Properties:
849
832
TemplateURL: pca-ssm/cfn/ssm.template
850
833
Parameters:
834
+ StackName: !Ref 'AWS::StackName'
851
835
BulkUploadBucketName:
852
836
!If
853
837
- ShouldCreateBulkUploadBucket
@@ -911,13 +895,15 @@ Resources:
911
895
- 'None'
912
896
- 'None'
913
897
# WebUri: !GetAtt PCAUI.Outputs.WebUri
914
- DatabaseName: !Ref DatabaseName
898
+ DatabaseName: !Ref PCADatabase
915
899
916
900
PythonUtilsLayer:
917
901
DependsOn: SSM
918
902
Type: AWS::CloudFormation::Stack
919
903
Properties:
920
904
TemplateURL: pca-server/cfn/lib/python-utilities.template
905
+ Parameters:
906
+ ParentStackName: !Ref 'AWS::StackName'
921
907
922
908
BedrockBoto3Layer:
923
909
Type: AWS::CloudFormation::Stack
@@ -944,6 +930,8 @@ Resources:
944
930
Properties:
945
931
TemplateURL: pca-server/cfn/pca-server.template
946
932
Parameters:
933
+ DatabaseName: !Ref PCADatabase
934
+ ParentStackName: !Ref 'AWS::StackName'
947
935
ffmpegDownloadUrl: !Ref ffmpegDownloadUrl
948
936
CallSummarization: !Ref CallSummarization
949
937
SummarizationBedrockModelId: !Ref SummarizationBedrockModelId
@@ -966,6 +954,7 @@ Resources:
966
954
Properties:
967
955
TemplateURL: pca-ui/cfn/pca-ui.template
968
956
Parameters:
957
+ ParentStackName: !Ref 'AWS::StackName'
969
958
AdminUsername: !Ref AdminUsername
970
959
AdminEmail: !Ref AdminEmail
971
960
AllowedSignUpEmailDomain: !Ref AllowedSignUpEmailDomain
@@ -1005,7 +994,7 @@ Resources:
1005
994
Properties:
1006
995
TemplateURL: build/pca-dashboards.yaml
1007
996
Parameters:
1008
- PcaGlueCatalogDatabaseName: !Ref DatabaseName
997
+ PcaGlueCatalogDatabaseName: !Ref PCADatabase
1009
998
PcaOutputBucket:
1010
999
!If
1011
1000
- ShouldCreateOutputBucket
@@ -1023,6 +1012,7 @@ Resources:
1023
1012
Properties:
1024
1013
TemplateURL: pca-samples/copy-samples.template
1025
1014
Parameters:
1015
+ ParentStackName: !Ref 'AWS::StackName'
1026
1016
DependsOnPCAServer: !Ref PCAServer
1027
1017
DependsOnPCAUI: !If [ShouldEnableGui, !Ref PCAUI, !Ref AWS::NoValue]
1028
1018
DependsOnPCADashboards: !If
0 commit comments