AWSTemplateFormatVersion: "2010-09-09" Description: Amazon Transcribe Post Call Analytics - PCA Server - PCA State Machine Transform: AWS::Serverless-2016-10-31 Parameters: TableName: Type: String FFMPEGZipName: Type: String Default: ffmpeg.zip Boto3Layer: Type: String PyUtilsLayer: Type: String SupportFilesBucketName: Type: AWS::SSM::Parameter::Value Default: SupportFilesBucketName StepFunctionName: Type: AWS::SSM::Parameter::Value Default: StepFunctionName InputBucketName: Type: AWS::SSM::Parameter::Value Default: InputBucketName CallSummarization: Type: String Default: 'DISABLED' SummarizationSagemakerEndpointName: Type: String SummarizationSagemakerEndpointArn: Type: String SummarizationLLMThirdPartyApiKey: Type: String SummarizationLambdaFunctionArn: Type: String Globals: Function: Runtime: python3.8 MemorySize: 1024 Timeout: 60 Conditions: ProvisionedSageMakerEndpoint: !Equals [!Ref CallSummarization, "SAGEMAKER"] HasCustomSummarizerLambda: !Equals [!Ref CallSummarization, "LAMBDA"] Resources: FFMPEGLayer: Type: "AWS::Lambda::LayerVersion" Properties: Content: S3Bucket: !Ref SupportFilesBucketName S3Key: !Ref FFMPEGZipName TranscribeRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: - transcribe.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole - arn:aws:iam::aws:policy/AmazonS3FullAccess - arn:aws:iam::aws:policy/AmazonTranscribeFullAccess - arn:aws:iam::aws:policy/AWSLambda_ReadOnlyAccess - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess TranscribeLambdaRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole - arn:aws:iam::aws:policy/AmazonTranscribeFullAccess Policies: - PolicyName: PassRoleToTranscribe PolicyDocument: Statement: - Effect: Allow Action: - iam:PassRole Resource: - !GetAtt TranscribeRole.Arn - PolicyName: S3BucketReadWritePolicy PolicyDocument: Statement: - Effect: Allow Action: - s3:ListBucket - s3:GetObject - s3:PutObject - s3:DeleteObject Resource: - !Sub arn:aws:s3:::${InputBucketName} - !Sub arn:aws:s3:::${InputBucketName}/* - PolicyName: SSMGetParameterPolicy PolicyDocument: Statement: - Effect: Allow Action: - ssm:GetParameter - ssm:GetParameters Resource: !Sub arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/* SFStartTranscribeJob: Type: "AWS::Serverless::Function" Properties: CodeUri: ../../src/pca Handler: pca-aws-sf-start-transcribe-job.lambda_handler EphemeralStorage: Size: 4096 Timeout: 300 Layers: - !Ref FFMPEGLayer - !Ref Boto3Layer Environment: Variables: RoleArn: !GetAtt TranscribeRole.Arn AWS_DATA_PATH: "/opt/models" Role: !GetAtt TranscribeLambdaRole.Arn SFExtractJobHeader: Type: "AWS::Serverless::Function" Properties: CodeUri: ../../src/pca Handler: pca-aws-sf-extract-job-header.lambda_handler MemorySize: 1024 Timeout: 900 Layers: - !Ref Boto3Layer Environment: Variables: AWS_DATA_PATH: "/opt/models" Policies: - arn:aws:iam::aws:policy/AmazonTranscribeReadOnlyAccess - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess SFExtractTranscriptHeader: Type: "AWS::Serverless::Function" Properties: CodeUri: ../../src/pca Handler: pca-aws-sf-extract-transcript-header.lambda_handler MemorySize: 1024 Timeout: 900 Layers: - !Ref Boto3Layer - !Ref FFMPEGLayer Environment: Variables: AWS_DATA_PATH: "/opt/models" Policies: - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess SFProcessTurn: Type: "AWS::Serverless::Function" Properties: CodeUri: ../../src/pca Handler: pca-aws-sf-process-turn-by-turn.lambda_handler MemorySize: 1024 Timeout: 900 Layers: - !Ref FFMPEGLayer - !Ref Boto3Layer Environment: Variables: AWS_DATA_PATH: "/opt/models" Policies: - arn:aws:iam::aws:policy/AmazonTranscribeReadOnlyAccess - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess - arn:aws:iam::aws:policy/ComprehendFullAccess - arn:aws:iam::aws:policy/AmazonKendraFullAccess SFFinalProcessing: Type: "AWS::Serverless::Function" Properties: CodeUri: ../../src/pca Handler: pca-aws-sf-post-processing.lambda_handler Layers: - !Ref Boto3Layer Environment: Variables: AWS_DATA_PATH: "/opt/models" Policies: - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess SFCTRGenesys: Type: "AWS::Serverless::Function" Properties: CodeUri: ../../src/pca Handler: pca-aws-sf-ctr-genesys.lambda_handler Layers: - !Ref Boto3Layer Environment: Variables: AWS_DATA_PATH: "/opt/models" Policies: - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess SFPostCTRProcessing: Type: "AWS::Serverless::Function" Properties: CodeUri: ../../src/pca Handler: pca-aws-sf-post-ctr-processing.lambda_handler Layers: - !Ref Boto3Layer Environment: Variables: AWS_DATA_PATH: "/opt/models" Policies: - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess SFFetchTranscript: Type: "AWS::Serverless::Function" Properties: Runtime: python3.9 CodeUri: ../../src/pca Handler: pca-aws-fetch-transcript.lambda_handler Timeout: 900 Policies: - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess SFSummarize: Type: "AWS::Serverless::Function" Properties: Runtime: python3.9 CodeUri: ../../src/pca Handler: pca-aws-sf-summarize.lambda_handler Timeout: 900 Layers: - !Ref PyUtilsLayer Environment: Variables: AWS_DATA_PATH: "/opt/models" FETCH_TRANSCRIPT_LAMBDA_ARN: !GetAtt SFFetchTranscript.Arn SUMMARY_TYPE: !Ref CallSummarization SUMMARY_SAGEMAKER_ENDPOINT: !Ref SummarizationSagemakerEndpointName ANTHROPIC_API_KEY: !Ref SummarizationLLMThirdPartyApiKey SUMMARY_LAMBDA_ARN: !Ref SummarizationLambdaFunctionArn SUMMARY_PROMPT_TEMPLATE: "

Human:
{transcript}

Summarize the above transcript in no more than 5 sentences, using gender neutral pronouns. Were the caller's needs met during the call?

Assistant: Here is a summary in 5 sentences:" ANTHROPIC_MODEL_IDENTIFIER: "claude-v1.3-100k" ANTHROPIC_ENDPOINT_URL: "https://api.anthropic.com/v1/complete" TOKEN_COUNT: !If - ProvisionedSageMakerEndpoint - 1024 - 0 Policies: - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess - Statement: - Sid: InvokeGetTranscript Effect: Allow Action: - lambda:InvokeFunction Resource: !GetAtt SFFetchTranscript.Arn - !If - ProvisionedSageMakerEndpoint - Sid: InvokeSummarizer Effect: Allow Action: - sagemaker:InvokeEndpoint Resource: !Ref SummarizationSagemakerEndpointArn - !Ref "AWS::NoValue" - !If - HasCustomSummarizerLambda - Sid: SummarizationLambda Effect: Allow Action: - lambda:InvokeFunction Resource: !Ref SummarizationLambdaFunctionArn - !Ref "AWS::NoValue" SFAwaitNotification: Type: "AWS::Serverless::Function" Properties: CodeUri: ../../src/pca Handler: pca-aws-sf-wait-for-transcribe-notification.lambda_handler Environment: Variables: TableName: !Ref TableName Policies: - arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess SFTranscribeFailed: Type: "AWS::Serverless::Function" Properties: CodeUri: ../../src/pca Handler: pca-aws-sf-transcribe-failed.lambda_handler Environment: Variables: RoleArn: !GetAtt TranscribeRole.Arn Policies: - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess - arn:aws:iam::aws:policy/AmazonS3FullAccess LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub '/aws/vendedlogs/${StepFunctionName}' RetentionInDays: 90 Role: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: states.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: AllowInvokeFunctions PolicyDocument: Statement: - Effect: Allow Action: lambda:InvokeFunction Resource: - !GetAtt SFExtractJobHeader.Arn - !GetAtt SFExtractTranscriptHeader.Arn - !GetAtt SFProcessTurn.Arn - !GetAtt SFStartTranscribeJob.Arn - !GetAtt SFAwaitNotification.Arn - !GetAtt SFTranscribeFailed.Arn - !GetAtt SFFinalProcessing.Arn - !GetAtt SFCTRGenesys.Arn - !GetAtt SFPostCTRProcessing.Arn - !GetAtt SFSummarize.Arn - PolicyName: CloudWatchLogs PolicyDocument: Statement: - Effect: Allow Action: - logs:CreateLogDelivery - logs:GetLogDelivery - logs:UpdateLogDelivery - logs:DeleteLogDelivery - logs:ListLogDeliveries - logs:PutResourcePolicy - logs:DescribeResourcePolicies - logs:DescribeLogGroups Resource: "*" StateMachine: Type: "AWS::StepFunctions::StateMachine" Properties: StateMachineName: !Ref StepFunctionName DefinitionS3Location: ./pca-definition.json DefinitionSubstitutions: SFExtractJobHeaderArn: !GetAtt SFExtractJobHeader.Arn SFExtractTranscriptHeaderArn: !GetAtt SFExtractTranscriptHeader.Arn SFProcessTurnArn: !GetAtt SFProcessTurn.Arn SFStartTranscribeJobArn: !GetAtt SFStartTranscribeJob.Arn SFAwaitNotificationArn: !GetAtt SFAwaitNotification.Arn SFTranscribeFailedArn: !GetAtt SFTranscribeFailed.Arn SFFinalProcessingArn: !GetAtt SFFinalProcessing.Arn SFCTRGenesysArn: !GetAtt SFCTRGenesys.Arn SFPostCTRProcessingArn: !GetAtt SFPostCTRProcessing.Arn SFSummarizeArn: !GetAtt SFSummarize.Arn LoggingConfiguration: Level: ERROR IncludeExecutionData: true Destinations: - CloudWatchLogsLogGroup: LogGroupArn: !GetAtt LogGroup.Arn RoleArn: !GetAtt Role.Arn Outputs: RolesForKMSKey: Value: !Join - ', ' - - !Sub '"${TranscribeLambdaRole.Arn}"' - !Sub '"${TranscribeRole.Arn}"' - !Sub '"${SFProcessTurnRole.Arn}"' - !Sub '"${SFFinalProcessingRole.Arn}"' - !Sub '"${SFCTRGenesysRole.Arn}"' - !Sub '"${SFTranscribeFailedRole.Arn}"' - !Sub '"${SFPostCTRProcessingRole.Arn}"' FetchTranscriptArn: Value: !GetAtt SFFetchTranscript.Arn