@cdklabs/cdk-appmod-catalog-blueprints 1.2.2 → 1.3.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.
Files changed (48) hide show
  1. package/.jsii +802 -171
  2. package/lib/document-processing/adapter/queued-s3-adapter.js +1 -1
  3. package/lib/document-processing/agentic-document-processing.d.ts +5 -28
  4. package/lib/document-processing/agentic-document-processing.js +8 -63
  5. package/lib/document-processing/base-document-processing.js +4 -20
  6. package/lib/document-processing/bedrock-document-processing.d.ts +4 -32
  7. package/lib/document-processing/bedrock-document-processing.js +10 -37
  8. package/lib/document-processing/default-document-processing-config.js +1 -1
  9. package/lib/document-processing/tests/agentic-document-processing-nag.test.js +12 -11
  10. package/lib/document-processing/tests/agentic-document-processing.test.js +36 -11
  11. package/lib/document-processing/tests/bedrock-document-processing-nag.test.js +3 -2
  12. package/lib/document-processing/tests/bedrock-document-processing.test.js +12 -7
  13. package/lib/framework/agents/base-agent.d.ts +90 -0
  14. package/lib/framework/agents/base-agent.js +55 -0
  15. package/lib/framework/agents/batch-agent.d.ts +11 -0
  16. package/lib/framework/agents/batch-agent.js +64 -0
  17. package/lib/framework/agents/default-agent-config.d.ts +3 -0
  18. package/lib/framework/agents/default-agent-config.js +12 -0
  19. package/lib/framework/agents/index.d.ts +3 -0
  20. package/lib/framework/agents/index.js +20 -0
  21. package/lib/framework/agents/resources/default-strands-agent/batch.py +99 -0
  22. package/lib/framework/agents/resources/default-strands-agent/models.py +7 -0
  23. package/lib/framework/agents/resources/default-strands-agent/requirements.txt +7 -0
  24. package/lib/framework/agents/resources/default-strands-agent/utils.py +36 -0
  25. package/lib/framework/bedrock/bedrock.d.ts +38 -0
  26. package/lib/framework/bedrock/bedrock.js +54 -0
  27. package/lib/framework/bedrock/index.d.ts +1 -0
  28. package/lib/framework/bedrock/index.js +18 -0
  29. package/lib/framework/custom-resource/default-runtimes.js +1 -1
  30. package/lib/framework/foundation/access-log.js +1 -1
  31. package/lib/framework/foundation/eventbridge-broker.js +1 -1
  32. package/lib/framework/foundation/network.js +1 -1
  33. package/lib/framework/index.d.ts +2 -0
  34. package/lib/framework/index.js +3 -1
  35. package/lib/tsconfig.tsbuildinfo +1 -1
  36. package/lib/utilities/data-loader.js +1 -1
  37. package/lib/utilities/lambda-iam-utils.js +4 -3
  38. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +1 -1
  39. package/lib/utilities/observability/default-observability-config.js +1 -1
  40. package/lib/utilities/observability/index.d.ts +1 -0
  41. package/lib/utilities/observability/index.js +2 -1
  42. package/lib/utilities/observability/lambda-observability-property-injector.js +1 -1
  43. package/lib/utilities/observability/log-group-data-protection-utils.d.ts +6 -0
  44. package/lib/utilities/observability/log-group-data-protection-utils.js +37 -0
  45. package/lib/utilities/observability/powertools-config.js +1 -1
  46. package/lib/utilities/observability/state-machine-observability-property-injector.js +1 -1
  47. package/lib/webapp/frontend-construct.js +1 -1
  48. package/package.json +1 -1
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const aws_cdk_lib_1 = require("aws-cdk-lib");
4
4
  const assertions_1 = require("aws-cdk-lib/assertions");
5
5
  const aws_bedrock_1 = require("aws-cdk-lib/aws-bedrock");
6
+ const framework_1 = require("../../framework");
6
7
  const bedrock_document_processing_1 = require("../bedrock-document-processing");
7
8
  describe('BedrockDocumentProcessing', () => {
8
9
  let defaultStack;
@@ -17,13 +18,17 @@ describe('BedrockDocumentProcessing', () => {
17
18
  new bedrock_document_processing_1.BedrockDocumentProcessing(defaultStack, 'DefaultTest', {});
18
19
  customStack = new aws_cdk_lib_1.Stack();
19
20
  new bedrock_document_processing_1.BedrockDocumentProcessing(customStack, 'CustomTest', {
20
- classificationModelId: aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_3_HAIKU_20240307_V1_0,
21
- useCrossRegionInference: false,
21
+ classificationBedrockModel: {
22
+ fmModelId: aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_3_HAIKU_20240307_V1_0,
23
+ useCrossRegionInference: false,
24
+ },
22
25
  });
23
26
  crossRegionStack = new aws_cdk_lib_1.Stack();
24
27
  new bedrock_document_processing_1.BedrockDocumentProcessing(crossRegionStack, 'CrossRegionTest', {
25
- useCrossRegionInference: true,
26
- crossRegionInferencePrefix: bedrock_document_processing_1.BedrockCrossRegionInferencePrefix.EU,
28
+ classificationBedrockModel: {
29
+ useCrossRegionInference: true,
30
+ crossRegionInferencePrefix: framework_1.BedrockCrossRegionInferencePrefix.EU,
31
+ },
27
32
  });
28
33
  // Generate templates once after all constructs are created
29
34
  defaultTemplate = assertions_1.Template.fromStack(defaultStack);
@@ -41,7 +46,7 @@ describe('BedrockDocumentProcessing', () => {
41
46
  defaultTemplate.hasResourceProperties('AWS::Lambda::Function', {
42
47
  Environment: {
43
48
  Variables: {
44
- MODEL_ID: 'anthropic.claude-3-7-sonnet-20250219-v1:0',
49
+ MODEL_ID: 'anthropic.claude-sonnet-4-20250514-v1:0',
45
50
  },
46
51
  },
47
52
  });
@@ -59,7 +64,7 @@ describe('BedrockDocumentProcessing', () => {
59
64
  crossRegionTemplate.hasResourceProperties('AWS::Lambda::Function', {
60
65
  Environment: {
61
66
  Variables: {
62
- MODEL_ID: 'eu.anthropic.claude-3-7-sonnet-20250219-v1:0',
67
+ MODEL_ID: 'eu.anthropic.claude-sonnet-4-20250514-v1:0',
63
68
  },
64
69
  },
65
70
  });
@@ -76,4 +81,4 @@ describe('BedrockDocumentProcessing', () => {
76
81
  });
77
82
  });
78
83
  });
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy90ZXN0cy9iZWRyb2NrLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFvQztBQUNwQyx1REFBa0Q7QUFDbEQseURBQW9FO0FBQ3BFLGdGQUE4RztBQUU5RyxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLElBQUksWUFBbUIsQ0FBQztJQUN4QixJQUFJLFdBQWtCLENBQUM7SUFDdkIsSUFBSSxnQkFBdUIsQ0FBQztJQUM1QixJQUFJLGVBQXlCLENBQUM7SUFDOUIsSUFBSSxjQUF3QixDQUFDO0lBQzdCLElBQUksbUJBQTZCLENBQUM7SUFFbEMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLHlDQUF5QztRQUN6QyxZQUFZLEdBQUcsSUFBSSxtQkFBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSx1REFBeUIsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRS9ELFdBQVcsR0FBRyxJQUFJLG1CQUFLLEVBQUUsQ0FBQztRQUMxQixJQUFJLHVEQUF5QixDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUU7WUFDdkQscUJBQXFCLEVBQUUsdUNBQXlCLENBQUMsc0NBQXNDO1lBQ3ZGLHVCQUF1QixFQUFFLEtBQUs7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsZ0JBQWdCLEdBQUcsSUFBSSxtQkFBSyxFQUFFLENBQUM7UUFDL0IsSUFBSSx1REFBeUIsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRTtZQUNqRSx1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLDBCQUEwQixFQUFFLCtEQUFpQyxDQUFDLEVBQUU7U0FDakUsQ0FBQyxDQUFDO1FBRUgsMkRBQTJEO1FBQzNELGVBQWUsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuRCxjQUFjLEdBQUcscUJBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDakQsbUJBQW1CLEdBQUcscUJBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7UUFDeEMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RCxlQUFlLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ2xHLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5RSxlQUFlLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtRQUNoRSxlQUFlLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLEVBQUU7WUFDN0QsV0FBVyxFQUFFO2dCQUNYLFNBQVMsRUFBRTtvQkFDVCxRQUFRLEVBQUUsMkNBQTJDO2lCQUN0RDthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1FBQ3pELGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtZQUM1RCxXQUFXLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFO29CQUNULFFBQVEsRUFBRSx3Q0FBd0M7aUJBQ25EO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7UUFDakQsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLEVBQUU7WUFDakUsV0FBVyxFQUFFO2dCQUNYLFNBQVMsRUFBRTtvQkFDVCxRQUFRLEVBQUUsOENBQThDO2lCQUN6RDthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRTtZQUN0RCx3QkFBd0IsRUFBRTtnQkFDeEIsU0FBUyxFQUFFLENBQUM7d0JBQ1YsTUFBTSxFQUFFLGdCQUFnQjt3QkFDeEIsTUFBTSxFQUFFLE9BQU87d0JBQ2YsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFO3FCQUMvQyxDQUFDO2FBQ0g7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJ2F3cy1jZGstbGliL2Fzc2VydGlvbnMnO1xuaW1wb3J0IHsgRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrJztcbmltcG9ydCB7IEJlZHJvY2tDcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeCwgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyB9IGZyb20gJy4uL2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5cbmRlc2NyaWJlKCdCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nJywgKCkgPT4ge1xuICBsZXQgZGVmYXVsdFN0YWNrOiBTdGFjaztcbiAgbGV0IGN1c3RvbVN0YWNrOiBTdGFjaztcbiAgbGV0IGNyb3NzUmVnaW9uU3RhY2s6IFN0YWNrO1xuICBsZXQgZGVmYXVsdFRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgbGV0IGN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgbGV0IGNyb3NzUmVnaW9uVGVtcGxhdGU6IFRlbXBsYXRlO1xuXG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGFsbCBzdGFja3MgYW5kIGNvbnN0cnVjdHMgZmlyc3RcbiAgICBkZWZhdWx0U3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICBuZXcgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyhkZWZhdWx0U3RhY2ssICdEZWZhdWx0VGVzdCcsIHt9KTtcblxuICAgIGN1c3RvbVN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgbmV3IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcoY3VzdG9tU3RhY2ssICdDdXN0b21UZXN0Jywge1xuICAgICAgY2xhc3NpZmljYXRpb25Nb2RlbElkOiBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfM19IQUlLVV8yMDI0MDMwN19WMV8wLFxuICAgICAgdXNlQ3Jvc3NSZWdpb25JbmZlcmVuY2U6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgY3Jvc3NSZWdpb25TdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIG5ldyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nKGNyb3NzUmVnaW9uU3RhY2ssICdDcm9zc1JlZ2lvblRlc3QnLCB7XG4gICAgICB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSxcbiAgICAgIGNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4OiBCZWRyb2NrQ3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXguRVUsXG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZXMgb25jZSBhZnRlciBhbGwgY29uc3RydWN0cyBhcmUgY3JlYXRlZFxuICAgIGRlZmF1bHRUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhkZWZhdWx0U3RhY2spO1xuICAgIGN1c3RvbVRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKGN1c3RvbVN0YWNrKTtcbiAgICBjcm9zc1JlZ2lvblRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKGNyb3NzUmVnaW9uU3RhY2spO1xuICB9KTtcblxuICB0ZXN0KCdjcmVhdGVzIGJhc2ljIGluZnJhc3RydWN0dXJlJywgKCkgPT4ge1xuICAgIGRlZmF1bHRUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgICBkZWZhdWx0VGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlNRUzo6UXVldWUnLCB7fSk7XG4gICAgZGVmYXVsdFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7IEJpbGxpbmdNb2RlOiAnUEFZX1BFUl9SRVFVRVNUJyB9KTtcbiAgICBkZWZhdWx0VGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHt9KTtcbiAgICBkZWZhdWx0VGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCA1KTtcbiAgfSk7XG5cbiAgdGVzdCgndXNlcyBkZWZhdWx0IG1vZGVsIHdpdGggY3Jvc3MtcmVnaW9uIHByZWZpeCBkaXNhYmxlZCcsICgpID0+IHtcbiAgICBkZWZhdWx0VGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICBWYXJpYWJsZXM6IHtcbiAgICAgICAgICBNT0RFTF9JRDogJ2FudGhyb3BpYy5jbGF1ZGUtMy03LXNvbm5ldC0yMDI1MDIxOS12MTowJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3VzZXMgY3VzdG9tIG1vZGVsIHdpdGhvdXQgY3Jvc3MtcmVnaW9uIHByZWZpeCcsICgpID0+IHtcbiAgICBjdXN0b21UZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIFZhcmlhYmxlczoge1xuICAgICAgICAgIE1PREVMX0lEOiAnYW50aHJvcGljLmNsYXVkZS0zLWhhaWt1LTIwMjQwMzA3LXYxOjAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnY29uZmlndXJlcyBjdXN0b20gY3Jvc3MtcmVnaW9uIHByZWZpeCcsICgpID0+IHtcbiAgICBjcm9zc1JlZ2lvblRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJywge1xuICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgVmFyaWFibGVzOiB7XG4gICAgICAgICAgTU9ERUxfSUQ6ICdldS5hbnRocm9waWMuY2xhdWRlLTMtNy1zb25uZXQtMjAyNTAyMTktdjE6MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdjcmVhdGVzIGJlZHJvY2sgcGVybWlzc2lvbnMnLCAoKSA9PiB7XG4gICAgZGVmYXVsdFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlJvbGUnLCB7XG4gICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgU3RhdGVtZW50OiBbe1xuICAgICAgICAgIEFjdGlvbjogJ3N0czpBc3N1bWVSb2xlJyxcbiAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgUHJpbmNpcGFsOiB7IFNlcnZpY2U6ICdsYW1iZGEuYW1hem9uYXdzLmNvbScgfSxcbiAgICAgICAgfV0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy90ZXN0cy9iZWRyb2NrLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFvQztBQUNwQyx1REFBa0Q7QUFDbEQseURBQW9FO0FBQ3BFLCtDQUFvRTtBQUNwRSxnRkFBMkU7QUFFM0UsUUFBUSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRTtJQUN6QyxJQUFJLFlBQW1CLENBQUM7SUFDeEIsSUFBSSxXQUFrQixDQUFDO0lBQ3ZCLElBQUksZ0JBQXVCLENBQUM7SUFDNUIsSUFBSSxlQUF5QixDQUFDO0lBQzlCLElBQUksY0FBd0IsQ0FBQztJQUM3QixJQUFJLG1CQUE2QixDQUFDO0lBRWxDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYix5Q0FBeUM7UUFDekMsWUFBWSxHQUFHLElBQUksbUJBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksdURBQXlCLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUvRCxXQUFXLEdBQUcsSUFBSSxtQkFBSyxFQUFFLENBQUM7UUFDMUIsSUFBSSx1REFBeUIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFO1lBQ3ZELDBCQUEwQixFQUFFO2dCQUMxQixTQUFTLEVBQUUsdUNBQXlCLENBQUMsc0NBQXNDO2dCQUMzRSx1QkFBdUIsRUFBRSxLQUFLO2FBQy9CO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsZ0JBQWdCLEdBQUcsSUFBSSxtQkFBSyxFQUFFLENBQUM7UUFDL0IsSUFBSSx1REFBeUIsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRTtZQUNqRSwwQkFBMEIsRUFBRTtnQkFDMUIsdUJBQXVCLEVBQUUsSUFBSTtnQkFDN0IsMEJBQTBCLEVBQUUsNkNBQWlDLENBQUMsRUFBRTthQUNqRTtTQUNGLENBQUMsQ0FBQztRQUVILDJEQUEyRDtRQUMzRCxlQUFlLEdBQUcscUJBQVEsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkQsY0FBYyxHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELG1CQUFtQixHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1FBQ3hDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RCxlQUFlLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0QsZUFBZSxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixFQUFFLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUNsRyxlQUFlLENBQUMscUJBQXFCLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUUsZUFBZSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxzREFBc0QsRUFBRSxHQUFHLEVBQUU7UUFDaEUsZUFBZSxDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixFQUFFO1lBQzdELFdBQVcsRUFBRTtnQkFDWCxTQUFTLEVBQUU7b0JBQ1QsUUFBUSxFQUFFLHlDQUF5QztpQkFDcEQ7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRTtRQUN6RCxjQUFjLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLEVBQUU7WUFDNUQsV0FBVyxFQUFFO2dCQUNYLFNBQVMsRUFBRTtvQkFDVCxRQUFRLEVBQUUsd0NBQXdDO2lCQUNuRDthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO1FBQ2pELG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixFQUFFO1lBQ2pFLFdBQVcsRUFBRTtnQkFDWCxTQUFTLEVBQUU7b0JBQ1QsUUFBUSxFQUFFLDRDQUE0QztpQkFDdkQ7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtRQUN2QyxlQUFlLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLEVBQUU7WUFDdEQsd0JBQXdCLEVBQUU7Z0JBQ3hCLFNBQVMsRUFBRSxDQUFDO3dCQUNWLE1BQU0sRUFBRSxnQkFBZ0I7d0JBQ3hCLE1BQU0sRUFBRSxPQUFPO3dCQUNmLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRTtxQkFDL0MsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9jayc7XG5pbXBvcnQgeyBCZWRyb2NrQ3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXggfSBmcm9tICcuLi8uLi9mcmFtZXdvcmsnO1xuaW1wb3J0IHsgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyB9IGZyb20gJy4uL2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5cbmRlc2NyaWJlKCdCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nJywgKCkgPT4ge1xuICBsZXQgZGVmYXVsdFN0YWNrOiBTdGFjaztcbiAgbGV0IGN1c3RvbVN0YWNrOiBTdGFjaztcbiAgbGV0IGNyb3NzUmVnaW9uU3RhY2s6IFN0YWNrO1xuICBsZXQgZGVmYXVsdFRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgbGV0IGN1c3RvbVRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgbGV0IGNyb3NzUmVnaW9uVGVtcGxhdGU6IFRlbXBsYXRlO1xuXG4gIGJlZm9yZUFsbCgoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGFsbCBzdGFja3MgYW5kIGNvbnN0cnVjdHMgZmlyc3RcbiAgICBkZWZhdWx0U3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICBuZXcgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyhkZWZhdWx0U3RhY2ssICdEZWZhdWx0VGVzdCcsIHt9KTtcblxuICAgIGN1c3RvbVN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgbmV3IEJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcoY3VzdG9tU3RhY2ssICdDdXN0b21UZXN0Jywge1xuICAgICAgY2xhc3NpZmljYXRpb25CZWRyb2NrTW9kZWw6IHtcbiAgICAgICAgZm1Nb2RlbElkOiBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyLkFOVEhST1BJQ19DTEFVREVfM19IQUlLVV8yMDI0MDMwN19WMV8wLFxuICAgICAgICB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogZmFsc2UsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY3Jvc3NSZWdpb25TdGFjayA9IG5ldyBTdGFjaygpO1xuICAgIG5ldyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nKGNyb3NzUmVnaW9uU3RhY2ssICdDcm9zc1JlZ2lvblRlc3QnLCB7XG4gICAgICBjbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbDoge1xuICAgICAgICB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZTogdHJ1ZSxcbiAgICAgICAgY3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXg6IEJlZHJvY2tDcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeC5FVSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBHZW5lcmF0ZSB0ZW1wbGF0ZXMgb25jZSBhZnRlciBhbGwgY29uc3RydWN0cyBhcmUgY3JlYXRlZFxuICAgIGRlZmF1bHRUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhkZWZhdWx0U3RhY2spO1xuICAgIGN1c3RvbVRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKGN1c3RvbVN0YWNrKTtcbiAgICBjcm9zc1JlZ2lvblRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKGNyb3NzUmVnaW9uU3RhY2spO1xuICB9KTtcblxuICB0ZXN0KCdjcmVhdGVzIGJhc2ljIGluZnJhc3RydWN0dXJlJywgKCkgPT4ge1xuICAgIGRlZmF1bHRUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHt9KTtcbiAgICBkZWZhdWx0VGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlNRUzo6UXVldWUnLCB7fSk7XG4gICAgZGVmYXVsdFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7IEJpbGxpbmdNb2RlOiAnUEFZX1BFUl9SRVFVRVNUJyB9KTtcbiAgICBkZWZhdWx0VGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHt9KTtcbiAgICBkZWZhdWx0VGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCA1KTtcbiAgfSk7XG5cbiAgdGVzdCgndXNlcyBkZWZhdWx0IG1vZGVsIHdpdGggY3Jvc3MtcmVnaW9uIHByZWZpeCBkaXNhYmxlZCcsICgpID0+IHtcbiAgICBkZWZhdWx0VGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICBWYXJpYWJsZXM6IHtcbiAgICAgICAgICBNT0RFTF9JRDogJ2FudGhyb3BpYy5jbGF1ZGUtc29ubmV0LTQtMjAyNTA1MTQtdjE6MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCd1c2VzIGN1c3RvbSBtb2RlbCB3aXRob3V0IGNyb3NzLXJlZ2lvbiBwcmVmaXgnLCAoKSA9PiB7XG4gICAgY3VzdG9tVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICBWYXJpYWJsZXM6IHtcbiAgICAgICAgICBNT0RFTF9JRDogJ2FudGhyb3BpYy5jbGF1ZGUtMy1oYWlrdS0yMDI0MDMwNy12MTowJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NvbmZpZ3VyZXMgY3VzdG9tIGNyb3NzLXJlZ2lvbiBwcmVmaXgnLCAoKSA9PiB7XG4gICAgY3Jvc3NSZWdpb25UZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIFZhcmlhYmxlczoge1xuICAgICAgICAgIE1PREVMX0lEOiAnZXUuYW50aHJvcGljLmNsYXVkZS1zb25uZXQtNC0yMDI1MDUxNC12MTowJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRlc3QoJ2NyZWF0ZXMgYmVkcm9jayBwZXJtaXNzaW9ucycsICgpID0+IHtcbiAgICBkZWZhdWx0VGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OklBTTo6Um9sZScsIHtcbiAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICBTdGF0ZW1lbnQ6IFt7XG4gICAgICAgICAgQWN0aW9uOiAnc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICBQcmluY2lwYWw6IHsgU2VydmljZTogJ2xhbWJkYS5hbWF6b25hd3MuY29tJyB9LFxuICAgICAgICB9XSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,90 @@
1
+ import { PythonFunction } from '@aws-cdk/aws-lambda-python-alpha';
2
+ import { RemovalPolicy } from 'aws-cdk-lib';
3
+ import { PolicyStatement, Role } from 'aws-cdk-lib/aws-iam';
4
+ import { Key } from 'aws-cdk-lib/aws-kms';
5
+ import { LayerVersion } from 'aws-cdk-lib/aws-lambda';
6
+ import { Asset } from 'aws-cdk-lib/aws-s3-assets';
7
+ import { Construct } from 'constructs';
8
+ import { LogGroupDataProtectionProps, ObservableProps } from '../../utilities';
9
+ import { BedrockModelProps } from '../bedrock';
10
+ import { Network } from '../foundation';
11
+ export interface AgentToolsLocationDefinition {
12
+ readonly bucketName: string;
13
+ readonly key: string;
14
+ readonly isFile: boolean;
15
+ readonly isZipArchive: boolean;
16
+ }
17
+ /**
18
+ * Parameters that influences the behavior of the agent
19
+ */
20
+ export interface AgentDefinitionProps {
21
+ /**
22
+ * Configuration for the Bedrock Model to be used
23
+ */
24
+ readonly bedrockModel: BedrockModelProps;
25
+ /**
26
+ * The system prompt of the agent
27
+ *
28
+ */
29
+ readonly systemPrompt: Asset;
30
+ /**
31
+ * List of tools defined in python files. This tools would automatically
32
+ * be loaded by the agent. You can also use this to incorporate other specialized
33
+ * agents as tools.
34
+ */
35
+ readonly tools?: Asset[];
36
+ /**
37
+ * Any dependencies needed by the provided tools
38
+ */
39
+ readonly lambdaLayers?: LayerVersion[];
40
+ /**
41
+ * If tools need additional IAM permissions, these statements
42
+ * would be attached to the Agent's IAM role
43
+ */
44
+ readonly additionalPolicyStatementsForTools?: PolicyStatement[];
45
+ }
46
+ export interface BaseAgentProps extends ObservableProps {
47
+ /**
48
+ * Name of the agent
49
+ */
50
+ readonly agentName: string;
51
+ /**
52
+ * Agent related parameters
53
+ */
54
+ readonly agentDefinition: AgentDefinitionProps;
55
+ /**
56
+ * Enable observability
57
+ *
58
+ * @default false
59
+ */
60
+ readonly enableObservability?: boolean;
61
+ /**
62
+ * If the Agent would be running inside a VPC
63
+ *
64
+ * @default Agent would not be in a VPC
65
+ */
66
+ readonly network?: Network;
67
+ /**
68
+ * Encryption key to encrypt agent environment variables
69
+ *
70
+ * @default new KMS Key would be created
71
+ */
72
+ readonly encryptionKey?: Key;
73
+ /**
74
+ * Removal policy for resources created by this
75
+ * construct
76
+ *
77
+ * @default RemovalPolicy.DESTROY
78
+ */
79
+ readonly removalPolicy?: RemovalPolicy;
80
+ }
81
+ export declare abstract class BaseAgent extends Construct {
82
+ abstract readonly agentFunction: PythonFunction;
83
+ readonly bedrockModel?: BedrockModelProps;
84
+ readonly agentRole: Role;
85
+ readonly encryptionKey: Key;
86
+ /** log group data protection configuration */
87
+ protected readonly logGroupDataProtection: LogGroupDataProtectionProps;
88
+ protected readonly agentToolsLocationDefinitions: AgentToolsLocationDefinition[];
89
+ constructor(scope: Construct, id: string, props: BaseAgentProps);
90
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BaseAgent = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
8
+ const aws_kms_1 = require("aws-cdk-lib/aws-kms");
9
+ const constructs_1 = require("constructs");
10
+ const utilities_1 = require("../../utilities");
11
+ const bedrock_1 = require("../bedrock");
12
+ class BaseAgent extends constructs_1.Construct {
13
+ constructor(scope, id, props) {
14
+ super(scope, id);
15
+ this.bedrockModel = props.agentDefinition.bedrockModel;
16
+ this.encryptionKey = props.encryptionKey || new aws_kms_1.Key(this, 'AgentEncryptionKey', {
17
+ enableKeyRotation: true,
18
+ removalPolicy: props.removalPolicy || aws_cdk_lib_1.RemovalPolicy.DESTROY,
19
+ });
20
+ const inlinePolicies = {};
21
+ if (props.agentDefinition.additionalPolicyStatementsForTools && props.agentDefinition.additionalPolicyStatementsForTools.length > 0) {
22
+ inlinePolicies.ToolPermissions = new aws_iam_1.PolicyDocument({
23
+ statements: props.agentDefinition.additionalPolicyStatementsForTools,
24
+ });
25
+ }
26
+ this.agentRole = new aws_iam_1.Role(this, `Agent-${props.agentName}-Role`, {
27
+ assumedBy: new aws_iam_1.ServicePrincipal('lambda.amazonaws.com'),
28
+ inlinePolicies,
29
+ });
30
+ if (props.network) {
31
+ this.agentRole.addToPrincipalPolicy(utilities_1.LambdaIamUtils.generateLambdaVPCPermissions());
32
+ }
33
+ this.agentToolsLocationDefinitions = [];
34
+ if (props.agentDefinition.tools) {
35
+ for (const tool of props.agentDefinition.tools) {
36
+ tool.grantRead(this.agentRole);
37
+ this.agentToolsLocationDefinitions.push({
38
+ bucketName: tool.s3BucketName,
39
+ key: tool.s3ObjectKey,
40
+ isFile: tool.isFile,
41
+ isZipArchive: tool.isZipArchive,
42
+ });
43
+ }
44
+ }
45
+ this.agentRole.addToPrincipalPolicy(bedrock_1.BedrockModelUtils.generateModelIAMPermissions(this, this.bedrockModel));
46
+ this.logGroupDataProtection = utilities_1.LogGroupDataProtectionUtils.handleDefault(this, props.logGroupDataProtection, props.removalPolicy);
47
+ if (props.enableObservability) {
48
+ aws_cdk_lib_1.PropertyInjectors.of(this).add(new utilities_1.LambdaObservabilityPropertyInjector(this.logGroupDataProtection));
49
+ }
50
+ }
51
+ }
52
+ exports.BaseAgent = BaseAgent;
53
+ _a = JSII_RTTI_SYMBOL_1;
54
+ BaseAgent[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BaseAgent", version: "1.3.0" };
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1hZ2VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3VzZS1jYXNlcy9mcmFtZXdvcmsvYWdlbnRzL2Jhc2UtYWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSw2Q0FBK0Q7QUFDL0QsaURBQThGO0FBQzlGLGlEQUEwQztBQUcxQywyQ0FBdUM7QUFDdkMsK0NBQWlLO0FBQ2pLLHdDQUFrRTtBQXNGbEUsTUFBc0IsU0FBVSxTQUFRLHNCQUFTO0lBUy9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUI7UUFDN0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLGFBQUcsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7WUFDOUUsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSwyQkFBYSxDQUFDLE9BQU87U0FDNUQsQ0FBQyxDQUFDO1FBR0gsTUFBTSxjQUFjLEdBQW1DLEVBQUUsQ0FBQztRQUUxRCxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsa0NBQWtDLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxrQ0FBa0MsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEksY0FBYyxDQUFDLGVBQWUsR0FBRyxJQUFJLHdCQUFjLENBQUM7Z0JBQ2xELFVBQVUsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLGtDQUFrQzthQUNyRSxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGNBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxLQUFLLENBQUMsU0FBUyxPQUFPLEVBQUU7WUFDL0QsU0FBUyxFQUFFLElBQUksMEJBQWdCLENBQUMsc0JBQXNCLENBQUM7WUFDdkQsY0FBYztTQUNmLENBQUMsQ0FBQztRQUVILElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsMEJBQWMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELElBQUksQ0FBQyw2QkFBNkIsR0FBRyxFQUFFLENBQUM7UUFFeEMsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRS9CLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUM7b0JBQ3RDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWTtvQkFDN0IsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXO29CQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtpQkFDaEMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLDJCQUFpQixDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsdUNBQTJCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWpJLElBQUksS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDOUIsK0JBQWlCLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FDNUIsSUFBSSwrQ0FBbUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FDckUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOztBQTFESCw4QkEyREMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFB5dGhvbkZ1bmN0aW9uIH0gZnJvbSAnQGF3cy1jZGsvYXdzLWxhbWJkYS1weXRob24tYWxwaGEnO1xuaW1wb3J0IHsgUHJvcGVydHlJbmplY3RvcnMsIFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBQb2xpY3lEb2N1bWVudCwgUG9saWN5U3RhdGVtZW50LCBSb2xlLCBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IExheWVyVmVyc2lvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQXNzZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtYXNzZXRzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTGFtYmRhSWFtVXRpbHMsIExhbWJkYU9ic2VydmFiaWxpdHlQcm9wZXJ0eUluamVjdG9yLCBMb2dHcm91cERhdGFQcm90ZWN0aW9uUHJvcHMsIExvZ0dyb3VwRGF0YVByb3RlY3Rpb25VdGlscywgT2JzZXJ2YWJsZVByb3BzIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzJztcbmltcG9ydCB7IEJlZHJvY2tNb2RlbFByb3BzLCBCZWRyb2NrTW9kZWxVdGlscyB9IGZyb20gJy4uL2JlZHJvY2snO1xuaW1wb3J0IHsgTmV0d29yayB9IGZyb20gJy4uL2ZvdW5kYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb24ge1xuICByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICByZWFkb25seSBpc0ZpbGU6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzWmlwQXJjaGl2ZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIHRoYXQgaW5mbHVlbmNlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGFnZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnREZWZpbml0aW9uUHJvcHMge1xuICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQmVkcm9jayBNb2RlbCB0byBiZSB1c2VkXG4gICAgICovXG4gIHJlYWRvbmx5IGJlZHJvY2tNb2RlbDogQmVkcm9ja01vZGVsUHJvcHM7XG5cbiAgLyoqXG4gICAgICogVGhlIHN5c3RlbSBwcm9tcHQgb2YgdGhlIGFnZW50XG4gICAgICpcbiAgICAgKi9cbiAgcmVhZG9ubHkgc3lzdGVtUHJvbXB0OiBBc3NldDtcblxuICAvKipcbiAgICAgKiBMaXN0IG9mIHRvb2xzIGRlZmluZWQgaW4gcHl0aG9uIGZpbGVzLiBUaGlzIHRvb2xzIHdvdWxkIGF1dG9tYXRpY2FsbHlcbiAgICAgKiBiZSBsb2FkZWQgYnkgdGhlIGFnZW50LiBZb3UgY2FuIGFsc28gdXNlIHRoaXMgdG8gaW5jb3Jwb3JhdGUgb3RoZXIgc3BlY2lhbGl6ZWRcbiAgICAgKiBhZ2VudHMgYXMgdG9vbHMuXG4gICAgICovXG4gIHJlYWRvbmx5IHRvb2xzPzogQXNzZXRbXTtcblxuICAvKipcbiAgICAgKiBBbnkgZGVwZW5kZW5jaWVzIG5lZWRlZCBieSB0aGUgcHJvdmlkZWQgdG9vbHNcbiAgICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhTGF5ZXJzPzogTGF5ZXJWZXJzaW9uW107XG5cbiAgLyoqXG4gICAgICogSWYgdG9vbHMgbmVlZCBhZGRpdGlvbmFsIElBTSBwZXJtaXNzaW9ucywgdGhlc2Ugc3RhdGVtZW50c1xuICAgICAqIHdvdWxkIGJlIGF0dGFjaGVkIHRvIHRoZSBBZ2VudCdzIElBTSByb2xlXG4gICAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxQb2xpY3lTdGF0ZW1lbnRzRm9yVG9vbHM/OiBQb2xpY3lTdGF0ZW1lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQWdlbnRQcm9wcyBleHRlbmRzIE9ic2VydmFibGVQcm9wcyB7XG5cbiAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWdlbnRcbiAgICAgKi9cbiAgcmVhZG9ubHkgYWdlbnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAgICogQWdlbnQgcmVsYXRlZCBwYXJhbWV0ZXJzXG4gICAgICovXG4gIHJlYWRvbmx5IGFnZW50RGVmaW5pdGlvbjogQWdlbnREZWZpbml0aW9uUHJvcHM7XG5cbiAgLyoqXG4gICAgICogRW5hYmxlIG9ic2VydmFiaWxpdHlcbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gIHJlYWRvbmx5IGVuYWJsZU9ic2VydmFiaWxpdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgICAqIElmIHRoZSBBZ2VudCB3b3VsZCBiZSBydW5uaW5nIGluc2lkZSBhIFZQQ1xuICAgICAqXG4gICAgICogQGRlZmF1bHQgQWdlbnQgd291bGQgbm90IGJlIGluIGEgVlBDXG4gICAgICovXG4gIHJlYWRvbmx5IG5ldHdvcms/OiBOZXR3b3JrO1xuXG4gIC8qKlxuICAgICAqIEVuY3J5cHRpb24ga2V5IHRvIGVuY3J5cHQgYWdlbnQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBuZXcgS01TIEtleSB3b3VsZCBiZSBjcmVhdGVkXG4gICAgICovXG4gIHJlYWRvbmx5IGVuY3J5cHRpb25LZXk/OiBLZXk7XG5cbiAgLyoqXG4gICAgICogUmVtb3ZhbCBwb2xpY3kgZm9yIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoaXNcbiAgICAgKiBjb25zdHJ1Y3RcbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VBZ2VudCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBhZ2VudEZ1bmN0aW9uOiBQeXRob25GdW5jdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGJlZHJvY2tNb2RlbD86IEJlZHJvY2tNb2RlbFByb3BzO1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRSb2xlOiBSb2xlO1xuICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogS2V5O1xuICAvKiogbG9nIGdyb3VwIGRhdGEgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsb2dHcm91cERhdGFQcm90ZWN0aW9uOiBMb2dHcm91cERhdGFQcm90ZWN0aW9uUHJvcHM7XG4gIHByb3RlY3RlZCByZWFkb25seSBhZ2VudFRvb2xzTG9jYXRpb25EZWZpbml0aW9uczogQWdlbnRUb29sc0xvY2F0aW9uRGVmaW5pdGlvbltdO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBCYXNlQWdlbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5iZWRyb2NrTW9kZWwgPSBwcm9wcy5hZ2VudERlZmluaXRpb24uYmVkcm9ja01vZGVsO1xuICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IHByb3BzLmVuY3J5cHRpb25LZXkgfHwgbmV3IEtleSh0aGlzLCAnQWdlbnRFbmNyeXB0aW9uS2V5Jywge1xuICAgICAgZW5hYmxlS2V5Um90YXRpb246IHRydWUsXG4gICAgICByZW1vdmFsUG9saWN5OiBwcm9wcy5yZW1vdmFsUG9saWN5IHx8IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICB9KTtcblxuXG4gICAgY29uc3QgaW5saW5lUG9saWNpZXM6IFJlY29yZDxzdHJpbmcsIFBvbGljeURvY3VtZW50PiA9IHt9O1xuXG4gICAgaWYgKHByb3BzLmFnZW50RGVmaW5pdGlvbi5hZGRpdGlvbmFsUG9saWN5U3RhdGVtZW50c0ZvclRvb2xzICYmIHByb3BzLmFnZW50RGVmaW5pdGlvbi5hZGRpdGlvbmFsUG9saWN5U3RhdGVtZW50c0ZvclRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlubGluZVBvbGljaWVzLlRvb2xQZXJtaXNzaW9ucyA9IG5ldyBQb2xpY3lEb2N1bWVudCh7XG4gICAgICAgIHN0YXRlbWVudHM6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5hZGRpdGlvbmFsUG9saWN5U3RhdGVtZW50c0ZvclRvb2xzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZ2VudFJvbGUgPSBuZXcgUm9sZSh0aGlzLCBgQWdlbnQtJHtwcm9wcy5hZ2VudE5hbWV9LVJvbGVgLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBTZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgaW5saW5lUG9saWNpZXMsXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMubmV0d29yaykge1xuICAgICAgdGhpcy5hZ2VudFJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koTGFtYmRhSWFtVXRpbHMuZ2VuZXJhdGVMYW1iZGFWUENQZXJtaXNzaW9ucygpKTtcbiAgICB9XG5cbiAgICB0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zID0gW107XG5cbiAgICBpZiAocHJvcHMuYWdlbnREZWZpbml0aW9uLnRvb2xzKSB7XG4gICAgICBmb3IgKGNvbnN0IHRvb2wgb2YgcHJvcHMuYWdlbnREZWZpbml0aW9uLnRvb2xzKSB7XG4gICAgICAgIHRvb2wuZ3JhbnRSZWFkKHRoaXMuYWdlbnRSb2xlKTtcblxuICAgICAgICB0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zLnB1c2goe1xuICAgICAgICAgIGJ1Y2tldE5hbWU6IHRvb2wuczNCdWNrZXROYW1lLFxuICAgICAgICAgIGtleTogdG9vbC5zM09iamVjdEtleSxcbiAgICAgICAgICBpc0ZpbGU6IHRvb2wuaXNGaWxlLFxuICAgICAgICAgIGlzWmlwQXJjaGl2ZTogdG9vbC5pc1ppcEFyY2hpdmUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYWdlbnRSb2xlLmFkZFRvUHJpbmNpcGFsUG9saWN5KEJlZHJvY2tNb2RlbFV0aWxzLmdlbmVyYXRlTW9kZWxJQU1QZXJtaXNzaW9ucyh0aGlzLCB0aGlzLmJlZHJvY2tNb2RlbCkpO1xuICAgIHRoaXMubG9nR3JvdXBEYXRhUHJvdGVjdGlvbiA9IExvZ0dyb3VwRGF0YVByb3RlY3Rpb25VdGlscy5oYW5kbGVEZWZhdWx0KHRoaXMsIHByb3BzLmxvZ0dyb3VwRGF0YVByb3RlY3Rpb24sIHByb3BzLnJlbW92YWxQb2xpY3kpO1xuXG4gICAgaWYgKHByb3BzLmVuYWJsZU9ic2VydmFiaWxpdHkpIHtcbiAgICAgIFByb3BlcnR5SW5qZWN0b3JzLm9mKHRoaXMpLmFkZChcbiAgICAgICAgbmV3IExhbWJkYU9ic2VydmFiaWxpdHlQcm9wZXJ0eUluamVjdG9yKHRoaXMubG9nR3JvdXBEYXRhUHJvdGVjdGlvbiksXG4gICAgICApO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -0,0 +1,11 @@
1
+ import { PythonFunction } from '@aws-cdk/aws-lambda-python-alpha';
2
+ import { Construct } from 'constructs';
3
+ import { BaseAgent, BaseAgentProps } from './base-agent';
4
+ export interface BatchAgentProps extends BaseAgentProps {
5
+ readonly prompt: string;
6
+ readonly expectJson?: boolean;
7
+ }
8
+ export declare class BatchAgent extends BaseAgent {
9
+ readonly agentFunction: PythonFunction;
10
+ constructor(scope: Construct, id: string, props: BatchAgentProps);
11
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BatchAgent = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
+ // SPDX-License-Identifier: Apache-2.0
8
+ const path = require("path");
9
+ const aws_lambda_python_alpha_1 = require("@aws-cdk/aws-lambda-python-alpha");
10
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
11
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
12
+ const base_agent_1 = require("./base-agent");
13
+ const utilities_1 = require("../../utilities");
14
+ const bedrock_1 = require("../bedrock");
15
+ const custom_resource_1 = require("../custom-resource");
16
+ const default_agent_config_1 = require("./default-agent-config");
17
+ class BatchAgent extends base_agent_1.BaseAgent {
18
+ constructor(scope, id, props) {
19
+ super(scope, id, props);
20
+ const modelId = bedrock_1.BedrockModelUtils.deriveActualModelId(this.bedrockModel);
21
+ const metricNamespace = props.metricNamespace || utilities_1.DefaultObservabilityConfig.DEFAULT_METRIC_NAMESPACE;
22
+ const metricServiceName = props.metricServiceName || default_agent_config_1.DefaultAgentConfig.DEFAULT_OBSERVABILITY_METRIC_SVC_NAME;
23
+ const env = {
24
+ SYSTEM_PROMPT_S3_BUCKET_NAME: props.agentDefinition.systemPrompt.s3BucketName,
25
+ SYSTEM_PROMPT_S3_KEY: props.agentDefinition.systemPrompt.s3ObjectKey,
26
+ TOOLS_CONFIG: JSON.stringify(this.agentToolsLocationDefinitions),
27
+ MODEL_ID: modelId,
28
+ INVOKE_TYPE: 'batch',
29
+ PROMPT: props.prompt,
30
+ EXPECT_JSON: props.expectJson ? 'True' : '',
31
+ ...utilities_1.PowertoolsConfig.generateDefaultLambdaConfig(props.enableObservability, metricNamespace, metricServiceName),
32
+ };
33
+ const { account, region } = aws_cdk_lib_1.Stack.of(this);
34
+ const agentLambdaLogPermissionsResult = utilities_1.LambdaIamUtils.createLogsPermissions({
35
+ account,
36
+ region,
37
+ scope: this,
38
+ functionName: props.agentName,
39
+ enableObservability: props.enableObservability,
40
+ });
41
+ this.agentFunction = new aws_lambda_python_alpha_1.PythonFunction(this, 'BatchAgentFunction', {
42
+ functionName: agentLambdaLogPermissionsResult.uniqueFunctionName,
43
+ architecture: aws_lambda_1.Architecture.X86_64,
44
+ entry: path.join(__dirname, 'resources/default-strands-agent'),
45
+ role: this.agentRole,
46
+ index: 'batch.py',
47
+ runtime: custom_resource_1.DefaultRuntimes.PYTHON,
48
+ layers: props.agentDefinition.lambdaLayers,
49
+ timeout: aws_cdk_lib_1.Duration.minutes(10),
50
+ memorySize: 1024,
51
+ environment: env,
52
+ environmentEncryption: this.encryptionKey,
53
+ vpc: props.network ? props.network.vpc : undefined,
54
+ vpcSubnets: props.network ? props.network.applicationSubnetSelection() : undefined,
55
+ });
56
+ for (const s of agentLambdaLogPermissionsResult.policyStatements) {
57
+ this.agentRole.addToPrincipalPolicy(s);
58
+ }
59
+ }
60
+ }
61
+ exports.BatchAgent = BatchAgent;
62
+ _a = JSII_RTTI_SYMBOL_1;
63
+ BatchAgent[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BatchAgent", version: "1.3.0" };
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2gtYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9iYXRjaC1hZ2VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsNkJBQTZCO0FBQzdCLDhFQUFrRTtBQUNsRSw2Q0FBOEM7QUFDOUMsdURBQXNEO0FBRXRELDZDQUF5RDtBQUN6RCwrQ0FBK0Y7QUFDL0Ysd0NBQStDO0FBQy9DLHdEQUFxRDtBQUNyRCxpRUFBNEQ7QUFPNUQsTUFBYSxVQUFXLFNBQVEsc0JBQVM7SUFHdkMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUM5RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4QixNQUFNLE9BQU8sR0FBRywyQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekUsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLGVBQWUsSUFBSSxzQ0FBMEIsQ0FBQyx3QkFBd0IsQ0FBQztRQUNyRyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSx5Q0FBa0IsQ0FBQyxxQ0FBcUMsQ0FBQztRQUU5RyxNQUFNLEdBQUcsR0FBMkI7WUFDbEMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsWUFBWTtZQUM3RSxvQkFBb0IsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxXQUFXO1lBQ3BFLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQztZQUNoRSxRQUFRLEVBQUUsT0FBTztZQUNqQixXQUFXLEVBQUUsT0FBTztZQUNwQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMzQyxHQUFHLDRCQUFnQixDQUFDLDJCQUEyQixDQUM3QyxLQUFLLENBQUMsbUJBQW1CLEVBQ3pCLGVBQWUsRUFDZixpQkFBaUIsQ0FDbEI7U0FDRixDQUFDO1FBRUYsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLCtCQUErQixHQUFHLDBCQUFjLENBQUMscUJBQXFCLENBQUM7WUFDM0UsT0FBTztZQUNQLE1BQU07WUFDTixLQUFLLEVBQUUsSUFBSTtZQUNYLFlBQVksRUFBRSxLQUFLLENBQUMsU0FBUztZQUM3QixtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1NBQy9DLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSx3Q0FBYyxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNsRSxZQUFZLEVBQUUsK0JBQStCLENBQUMsa0JBQWtCO1lBQ2hFLFlBQVksRUFBRSx5QkFBWSxDQUFDLE1BQU07WUFDakMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlDQUFpQyxDQUFDO1lBQzlELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUztZQUNwQixLQUFLLEVBQUUsVUFBVTtZQUNqQixPQUFPLEVBQUUsaUNBQWUsQ0FBQyxNQUFNO1lBQy9CLE1BQU0sRUFBRSxLQUFLLENBQUMsZUFBZSxDQUFDLFlBQVk7WUFDMUMsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixVQUFVLEVBQUUsSUFBSTtZQUNoQixXQUFXLEVBQUUsR0FBRztZQUNoQixxQkFBcUIsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUN6QyxHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDbEQsVUFBVSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNuRixDQUFDLENBQUM7UUFFSCxLQUFLLE1BQU0sQ0FBQyxJQUFJLCtCQUErQixDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQzs7QUFwREgsZ0NBcURDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgUHl0aG9uRnVuY3Rpb24gfSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhLXB5dGhvbi1hbHBoYSc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgQmFzZUFnZW50LCBCYXNlQWdlbnRQcm9wcyB9IGZyb20gJy4vYmFzZS1hZ2VudCc7XG5pbXBvcnQgeyBEZWZhdWx0T2JzZXJ2YWJpbGl0eUNvbmZpZywgTGFtYmRhSWFtVXRpbHMsIFBvd2VydG9vbHNDb25maWcgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQmVkcm9ja01vZGVsVXRpbHMgfSBmcm9tICcuLi9iZWRyb2NrJztcbmltcG9ydCB7IERlZmF1bHRSdW50aW1lcyB9IGZyb20gJy4uL2N1c3RvbS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBEZWZhdWx0QWdlbnRDb25maWcgfSBmcm9tICcuL2RlZmF1bHQtYWdlbnQtY29uZmlnJztcblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaEFnZW50UHJvcHMgZXh0ZW5kcyBCYXNlQWdlbnRQcm9wcyB7XG4gIHJlYWRvbmx5IHByb21wdDogc3RyaW5nO1xuICByZWFkb25seSBleHBlY3RKc29uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEJhdGNoQWdlbnQgZXh0ZW5kcyBCYXNlQWdlbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgYWdlbnRGdW5jdGlvbjogUHl0aG9uRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJhdGNoQWdlbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIGNvbnN0IG1vZGVsSWQgPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVBY3R1YWxNb2RlbElkKHRoaXMuYmVkcm9ja01vZGVsKTtcbiAgICBjb25zdCBtZXRyaWNOYW1lc3BhY2UgPSBwcm9wcy5tZXRyaWNOYW1lc3BhY2UgfHwgRGVmYXVsdE9ic2VydmFiaWxpdHlDb25maWcuREVGQVVMVF9NRVRSSUNfTkFNRVNQQUNFO1xuICAgIGNvbnN0IG1ldHJpY1NlcnZpY2VOYW1lID0gcHJvcHMubWV0cmljU2VydmljZU5hbWUgfHwgRGVmYXVsdEFnZW50Q29uZmlnLkRFRkFVTFRfT0JTRVJWQUJJTElUWV9NRVRSSUNfU1ZDX05BTUU7XG5cbiAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBTWVNURU1fUFJPTVBUX1MzX0JVQ0tFVF9OQU1FOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzQnVja2V0TmFtZSxcbiAgICAgIFNZU1RFTV9QUk9NUFRfUzNfS0VZOiBwcm9wcy5hZ2VudERlZmluaXRpb24uc3lzdGVtUHJvbXB0LnMzT2JqZWN0S2V5LFxuICAgICAgVE9PTFNfQ09ORklHOiBKU09OLnN0cmluZ2lmeSh0aGlzLmFnZW50VG9vbHNMb2NhdGlvbkRlZmluaXRpb25zKSxcbiAgICAgIE1PREVMX0lEOiBtb2RlbElkLFxuICAgICAgSU5WT0tFX1RZUEU6ICdiYXRjaCcsXG4gICAgICBQUk9NUFQ6IHByb3BzLnByb21wdCxcbiAgICAgIEVYUEVDVF9KU09OOiBwcm9wcy5leHBlY3RKc29uID8gJ1RydWUnIDogJycsXG4gICAgICAuLi5Qb3dlcnRvb2xzQ29uZmlnLmdlbmVyYXRlRGVmYXVsdExhbWJkYUNvbmZpZyhcbiAgICAgICAgcHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICAgICAgbWV0cmljTmFtZXNwYWNlLFxuICAgICAgICBtZXRyaWNTZXJ2aWNlTmFtZSxcbiAgICAgICksXG4gICAgfTtcblxuICAgIGNvbnN0IHsgYWNjb3VudCwgcmVnaW9uIH0gPSBTdGFjay5vZih0aGlzKTtcbiAgICBjb25zdCBhZ2VudExhbWJkYUxvZ1Blcm1pc3Npb25zUmVzdWx0ID0gTGFtYmRhSWFtVXRpbHMuY3JlYXRlTG9nc1Blcm1pc3Npb25zKHtcbiAgICAgIGFjY291bnQsXG4gICAgICByZWdpb24sXG4gICAgICBzY29wZTogdGhpcyxcbiAgICAgIGZ1bmN0aW9uTmFtZTogcHJvcHMuYWdlbnROYW1lLFxuICAgICAgZW5hYmxlT2JzZXJ2YWJpbGl0eTogcHJvcHMuZW5hYmxlT2JzZXJ2YWJpbGl0eSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWdlbnRGdW5jdGlvbiA9IG5ldyBQeXRob25GdW5jdGlvbih0aGlzLCAnQmF0Y2hBZ2VudEZ1bmN0aW9uJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBhZ2VudExhbWJkYUxvZ1Blcm1pc3Npb25zUmVzdWx0LnVuaXF1ZUZ1bmN0aW9uTmFtZSxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLlg4Nl82NCxcbiAgICAgIGVudHJ5OiBwYXRoLmpvaW4oX19kaXJuYW1lLCAncmVzb3VyY2VzL2RlZmF1bHQtc3RyYW5kcy1hZ2VudCcpLFxuICAgICAgcm9sZTogdGhpcy5hZ2VudFJvbGUsXG4gICAgICBpbmRleDogJ2JhdGNoLnB5JyxcbiAgICAgIHJ1bnRpbWU6IERlZmF1bHRSdW50aW1lcy5QWVRIT04sXG4gICAgICBsYXllcnM6IHByb3BzLmFnZW50RGVmaW5pdGlvbi5sYW1iZGFMYXllcnMsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEwKSxcbiAgICAgIG1lbW9yeVNpemU6IDEwMjQsXG4gICAgICBlbnZpcm9ubWVudDogZW52LFxuICAgICAgZW52aXJvbm1lbnRFbmNyeXB0aW9uOiB0aGlzLmVuY3J5cHRpb25LZXksXG4gICAgICB2cGM6IHByb3BzLm5ldHdvcmsgPyBwcm9wcy5uZXR3b3JrLnZwYyA6IHVuZGVmaW5lZCxcbiAgICAgIHZwY1N1Ym5ldHM6IHByb3BzLm5ldHdvcmsgPyBwcm9wcy5uZXR3b3JrLmFwcGxpY2F0aW9uU3VibmV0U2VsZWN0aW9uKCkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgYWdlbnRMYW1iZGFMb2dQZXJtaXNzaW9uc1Jlc3VsdC5wb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICB0aGlzLmFnZW50Um9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzKTtcbiAgICB9XG4gIH1cbn0iXX0=
@@ -0,0 +1,3 @@
1
+ export declare class DefaultAgentConfig {
2
+ static readonly DEFAULT_OBSERVABILITY_METRIC_SVC_NAME = "agent";
3
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.DefaultAgentConfig = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ class DefaultAgentConfig {
7
+ }
8
+ exports.DefaultAgentConfig = DefaultAgentConfig;
9
+ _a = JSII_RTTI_SYMBOL_1;
10
+ DefaultAgentConfig[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DefaultAgentConfig", version: "1.3.0" };
11
+ DefaultAgentConfig.DEFAULT_OBSERVABILITY_METRIC_SVC_NAME = 'agent';
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1hZ2VudC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9kZWZhdWx0LWFnZW50LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE1BQWEsa0JBQWtCOztBQUEvQixnREFFQzs7O0FBRHdCLHdEQUFxQyxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBEZWZhdWx0QWdlbnRDb25maWcge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfT0JTRVJWQUJJTElUWV9NRVRSSUNfU1ZDX05BTUUgPSAnYWdlbnQnO1xufSJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './base-agent';
2
+ export * from './batch-agent';
3
+ export * from './default-agent-config';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./base-agent"), exports);
18
+ __exportStar(require("./batch-agent"), exports);
19
+ __exportStar(require("./default-agent-config"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZnJhbWV3b3JrL2FnZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQTZCO0FBQzdCLGdEQUE4QjtBQUM5Qix5REFBdUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Jhc2UtYWdlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXRjaC1hZ2VudCc7XG5leHBvcnQgKiBmcm9tICcuL2RlZmF1bHQtYWdlbnQtY29uZmlnJzsiXX0=
@@ -0,0 +1,99 @@
1
+ import os
2
+ import json
3
+ from strands import Agent, tool
4
+ from strands_tools import file_read
5
+ from aws_lambda_powertools import Metrics, Tracer
6
+ from aws_lambda_powertools.metrics import MetricUnit
7
+ from utils import download_and_load_system_prompt, download_tools, convert_tools_config_into_model
8
+ import boto3
9
+
10
+ metrics = Metrics()
11
+ tracer = Tracer()
12
+ s3 = boto3.client('s3')
13
+
14
+ def extract_json_from_text(text):
15
+ """Extract JSON object from text body enclosed in ```json blocks or raw JSON."""
16
+ import re
17
+
18
+ # First try to find JSON in ```json blocks
19
+ match = re.search(r'```json\s*({.*?})\s*```', text, re.DOTALL)
20
+ if match:
21
+ try:
22
+ return json.loads(match.group(1))
23
+ except json.JSONDecodeError:
24
+ pass
25
+
26
+ # If no ```json blocks, look for raw JSON objects in the text
27
+ json_match = re.search(r'({[^{}]*(?:{[^{}]*}[^{}]*)*})', text, re.DOTALL)
28
+ if json_match:
29
+ try:
30
+ return json.loads(json_match.group(1))
31
+ except json.JSONDecodeError:
32
+ pass
33
+
34
+ return None
35
+
36
+ def parse_s3_path(s3_path):
37
+ # Remove s3:// prefix if present
38
+ path = s3_path.replace('s3://', '')
39
+
40
+ # Split into parts
41
+ parts = path.split('/', 1)
42
+ bucket = parts[0]
43
+
44
+ if len(parts) == 1:
45
+ return bucket, '', ''
46
+
47
+ # Key is the prefix (includes filename)
48
+ prefix = parts[1]
49
+ filename = prefix.split('/')[-1]
50
+
51
+ return bucket, prefix, filename
52
+
53
+ def download_attached_document(event):
54
+ bucket = event['content']['bucket']
55
+ key = event['content']['key']
56
+
57
+ # Download file to /tmp
58
+ local_path = f"/tmp/{key.split('/')[-1]}"
59
+ s3.download_file(bucket, key, local_path)
60
+
61
+ return local_path
62
+
63
+ tools_config = convert_tools_config_into_model(os.getenv('TOOLS_CONFIG', '{}'))
64
+ agent_tools = download_tools(tools_config)
65
+ system_prompt = download_and_load_system_prompt(os.environ['SYSTEM_PROMPT_S3_BUCKET_NAME'], os.environ['SYSTEM_PROMPT_S3_KEY'])
66
+
67
+ @metrics.log_metrics
68
+ @tracer.capture_lambda_handler
69
+ def handler(event, context):
70
+ model_id = os.getenv("MODEL_ID")
71
+ prompt = os.getenv("PROMPT")
72
+ expect_json:bool = bool(os.getenv("EXPECT_JSON", ""))
73
+ invoke_type = os.environ["INVOKE_TYPE"]
74
+ content_type = event['contentType']
75
+
76
+ tracer.put_annotation(key="invoke_type", value=invoke_type)
77
+ metrics.add_dimension(name="invoke_type", value=invoke_type)
78
+
79
+ if prompt is None:
80
+ prompt = "Analyze the attached document and verify the information using the provided tools."
81
+
82
+ if 'classificationResult' in event:
83
+ classification = event['classificationResult']['documentClassification']
84
+ prompt = prompt.replace("[ACTUAL_CLASSIFICATION]", classification)
85
+
86
+ if content_type == 'file' and event['content']['location'] == 's3':
87
+ local_path_attached_doc = download_attached_document(event)
88
+ prompt += f" Attached document is located in {local_path_attached_doc}"
89
+ elif content_type == 'data':
90
+ prompt += f" Attached document content are as follows: {event['content']['data']}"
91
+
92
+ agent = Agent(model=model_id, tools=agent_tools + [file_read], system_prompt=system_prompt)
93
+ response = agent(prompt)
94
+
95
+ metrics.add_metric(name="SuccessfulAgentInvocation", unit=MetricUnit.Count, value=1)
96
+ response_text = response.message["content"][0]["text"] # type: ignore
97
+ return {
98
+ "result": extract_json_from_text(response_text) if expect_json else response_text
99
+ }
@@ -0,0 +1,7 @@
1
+ from pydantic import BaseModel
2
+
3
+ class ToolLocationDefinition(BaseModel):
4
+ bucketName: str
5
+ key: str
6
+ isFile: bool
7
+ isZipArchive: bool
@@ -0,0 +1,7 @@
1
+ strands-agents>=1.0.0
2
+ boto3>=1.0.0
3
+ strands-agents-tools[file_read]
4
+ urllib3>=1.26.0,<2.0.0
5
+ aws-lambda-powertools
6
+ aws-xray-sdk
7
+ pydantic
@@ -0,0 +1,36 @@
1
+ import os
2
+ import boto3
3
+ import json
4
+ from models import ToolLocationDefinition
5
+
6
+ s3 = boto3.client('s3')
7
+
8
+ def convert_tools_config_into_model(config: str) -> list[ToolLocationDefinition]:
9
+ definitions: list[ToolLocationDefinition] = []
10
+
11
+ tools_raw = json.loads(config)
12
+
13
+ for t in tools_raw:
14
+ definitions.append(ToolLocationDefinition.model_validate_json(json.dumps(t)))
15
+
16
+ return definitions
17
+
18
+ def download_tools(tools: list[ToolLocationDefinition]) -> list[str]:
19
+ local_tools_location: list[str] = []
20
+
21
+ for t in tools:
22
+ if t.isFile:
23
+ local_location = f"/tmp/{os.path.basename(t.key)}"
24
+ s3.download_file(t.bucketName, t.key, local_location)
25
+ local_tools_location.append(local_location)
26
+
27
+ return local_tools_location
28
+
29
+ def download_and_load_system_prompt(bucketName, key) -> str:
30
+ local_location = '/tmp/system_prompt.txt'
31
+ s3.download_file(bucketName, key, local_location)
32
+
33
+ with open(local_location, 'r') as file:
34
+ data = file.read()
35
+
36
+ return data
@@ -0,0 +1,38 @@
1
+ import { FoundationModelIdentifier } from 'aws-cdk-lib/aws-bedrock';
2
+ import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
3
+ import { Construct } from 'constructs';
4
+ /**
5
+ * Cross-region inference prefix options for Bedrock models.
6
+ * Used to configure inference profiles for improved availability and performance.
7
+ */
8
+ export declare enum BedrockCrossRegionInferencePrefix {
9
+ /** US-based cross-region inference profile */
10
+ US = "us",
11
+ /** EU-based cross-region inference profile */
12
+ EU = "eu"
13
+ }
14
+ export interface BedrockModelProps {
15
+ /**
16
+ * Foundation model to use
17
+ *
18
+ * @default FoundationModelIdentifier.ANTHROPIC_CLAUDE_SONNET_4_20250514_V1_0
19
+ */
20
+ readonly fmModelId?: FoundationModelIdentifier;
21
+ /**
22
+ * Enable cross-region inference for Bedrock models to improve availability and performance.
23
+ * When enabled, uses inference profiles instead of direct model invocation.
24
+ * @default false
25
+ */
26
+ readonly useCrossRegionInference?: boolean;
27
+ /**
28
+ * Prefix for cross-region inference configuration.
29
+ * Only used when useCrossRegionInference is true.
30
+ * @default BedrockCrossRegionInferencePrefix.US
31
+ */
32
+ readonly crossRegionInferencePrefix?: BedrockCrossRegionInferencePrefix;
33
+ }
34
+ export declare class BedrockModelUtils {
35
+ static deriveActualModelId(props?: BedrockModelProps): string;
36
+ static generateModelIAMPermissions(scope: Construct, props?: BedrockModelProps): PolicyStatement;
37
+ private static deriveDefaults;
38
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BedrockModelUtils = exports.BedrockCrossRegionInferencePrefix = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
+ // SPDX-License-Identifier: Apache-2.0
8
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
9
+ const aws_bedrock_1 = require("aws-cdk-lib/aws-bedrock");
10
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
11
+ /**
12
+ * Cross-region inference prefix options for Bedrock models.
13
+ * Used to configure inference profiles for improved availability and performance.
14
+ */
15
+ var BedrockCrossRegionInferencePrefix;
16
+ (function (BedrockCrossRegionInferencePrefix) {
17
+ /** US-based cross-region inference profile */
18
+ BedrockCrossRegionInferencePrefix["US"] = "us";
19
+ /** EU-based cross-region inference profile */
20
+ BedrockCrossRegionInferencePrefix["EU"] = "eu";
21
+ })(BedrockCrossRegionInferencePrefix || (exports.BedrockCrossRegionInferencePrefix = BedrockCrossRegionInferencePrefix = {}));
22
+ class BedrockModelUtils {
23
+ static deriveActualModelId(props) {
24
+ const { fmModelId, crossRegionPrefix } = BedrockModelUtils.deriveDefaults(props);
25
+ return props?.useCrossRegionInference ? `${crossRegionPrefix}.${fmModelId.modelId}` : fmModelId.modelId;
26
+ }
27
+ static generateModelIAMPermissions(scope, props) {
28
+ const { account, region } = aws_cdk_lib_1.Stack.of(scope);
29
+ const { fmModelId, crossRegionPrefix } = BedrockModelUtils.deriveDefaults(props);
30
+ return new aws_iam_1.PolicyStatement({
31
+ effect: aws_iam_1.Effect.ALLOW,
32
+ actions: [
33
+ 'bedrock:InvokeModel',
34
+ 'bedrock:InvokeModelWithResponseStream',
35
+ ],
36
+ resources: [
37
+ `arn:aws:bedrock:*::foundation-model/${fmModelId.modelId}`,
38
+ `arn:aws:bedrock:${region}:${account}:inference-profile/${crossRegionPrefix}.${fmModelId.modelId}`,
39
+ ],
40
+ });
41
+ }
42
+ static deriveDefaults(props) {
43
+ const fmModelId = props?.fmModelId || aws_bedrock_1.FoundationModelIdentifier.ANTHROPIC_CLAUDE_SONNET_4_20250514_V1_0;
44
+ const crossRegionPrefix = props?.crossRegionInferencePrefix || BedrockCrossRegionInferencePrefix.US;
45
+ return {
46
+ fmModelId,
47
+ crossRegionPrefix,
48
+ };
49
+ }
50
+ }
51
+ exports.BedrockModelUtils = BedrockModelUtils;
52
+ _a = JSII_RTTI_SYMBOL_1;
53
+ BedrockModelUtils[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.BedrockModelUtils", version: "1.3.0" };
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVkcm9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3VzZS1jYXNlcy9mcmFtZXdvcmsvYmVkcm9jay9iZWRyb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscUVBQXFFO0FBQ3JFLHNDQUFzQztBQUV0Qyw2Q0FBb0M7QUFDcEMseURBQW9FO0FBQ3BFLGlEQUE4RDtBQUc5RDs7O0dBR0c7QUFDSCxJQUFZLGlDQUtYO0FBTEQsV0FBWSxpQ0FBaUM7SUFDM0MsOENBQThDO0lBQzlDLDhDQUFTLENBQUE7SUFDVCw4Q0FBOEM7SUFDOUMsOENBQVMsQ0FBQTtBQUNYLENBQUMsRUFMVyxpQ0FBaUMsaURBQWpDLGlDQUFpQyxRQUs1QztBQXdCRCxNQUFhLGlCQUFpQjtJQUNyQixNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBeUI7UUFDekQsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRixPQUFPLEtBQUssRUFBRSx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDMUcsQ0FBQztJQUVNLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxLQUFnQixFQUFFLEtBQXlCO1FBQ25GLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVqRixPQUFPLElBQUkseUJBQWUsQ0FBQztZQUN6QixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO1lBQ3BCLE9BQU8sRUFBRTtnQkFDUCxxQkFBcUI7Z0JBQ3JCLHVDQUF1QzthQUN4QztZQUNELFNBQVMsRUFBRTtnQkFDVCx1Q0FBdUMsU0FBUyxDQUFDLE9BQU8sRUFBRTtnQkFDMUQsbUJBQW1CLE1BQU0sSUFBSSxPQUFPLHNCQUFzQixpQkFBaUIsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFO2FBQ25HO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBeUI7UUFDckQsTUFBTSxTQUFTLEdBQUcsS0FBSyxFQUFFLFNBQVMsSUFBSSx1Q0FBeUIsQ0FBQyx1Q0FBdUMsQ0FBQztRQUN4RyxNQUFNLGlCQUFpQixHQUFHLEtBQUssRUFBRSwwQkFBMEIsSUFBSSxpQ0FBaUMsQ0FBQyxFQUFFLENBQUM7UUFFcEcsT0FBTztZQUNMLFNBQVM7WUFDVCxpQkFBaUI7U0FDbEIsQ0FBQztJQUNKLENBQUM7O0FBL0JILDhDQWdDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBGb3VuZGF0aW9uTW9kZWxJZGVudGlmaWVyIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2snO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIENyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcHJlZml4IG9wdGlvbnMgZm9yIEJlZHJvY2sgbW9kZWxzLlxuICogVXNlZCB0byBjb25maWd1cmUgaW5mZXJlbmNlIHByb2ZpbGVzIGZvciBpbXByb3ZlZCBhdmFpbGFiaWxpdHkgYW5kIHBlcmZvcm1hbmNlLlxuICovXG5leHBvcnQgZW51bSBCZWRyb2NrQ3Jvc3NSZWdpb25JbmZlcmVuY2VQcmVmaXgge1xuICAvKiogVVMtYmFzZWQgY3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBwcm9maWxlICovXG4gIFVTID0gJ3VzJyxcbiAgLyoqIEVVLWJhc2VkIGNyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcHJvZmlsZSAqL1xuICBFVSA9ICdldScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmVkcm9ja01vZGVsUHJvcHMge1xuICAvKipcbiAgICAgKiBGb3VuZGF0aW9uIG1vZGVsIHRvIHVzZVxuICAgICAqXG4gICAgICogQGRlZmF1bHQgRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllci5BTlRIUk9QSUNfQ0xBVURFX1NPTk5FVF80XzIwMjUwNTE0X1YxXzBcbiAgICAgKi9cbiAgcmVhZG9ubHkgZm1Nb2RlbElkPzogRm91bmRhdGlvbk1vZGVsSWRlbnRpZmllcjtcblxuICAvKipcbiAgICAgKiBFbmFibGUgY3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBmb3IgQmVkcm9jayBtb2RlbHMgdG8gaW1wcm92ZSBhdmFpbGFiaWxpdHkgYW5kIHBlcmZvcm1hbmNlLlxuICAgICAqIFdoZW4gZW5hYmxlZCwgdXNlcyBpbmZlcmVuY2UgcHJvZmlsZXMgaW5zdGVhZCBvZiBkaXJlY3QgbW9kZWwgaW52b2NhdGlvbi5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICByZWFkb25seSB1c2VDcm9zc1JlZ2lvbkluZmVyZW5jZT86IGJvb2xlYW47XG4gIC8qKlxuICAgICAqIFByZWZpeCBmb3IgY3Jvc3MtcmVnaW9uIGluZmVyZW5jZSBjb25maWd1cmF0aW9uLlxuICAgICAqIE9ubHkgdXNlZCB3aGVuIHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlIGlzIHRydWUuXG4gICAgICogQGRlZmF1bHQgQmVkcm9ja0Nyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4LlVTXG4gICAgICovXG4gIHJlYWRvbmx5IGNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4PzogQmVkcm9ja0Nyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4O1xufVxuXG5leHBvcnQgY2xhc3MgQmVkcm9ja01vZGVsVXRpbHMge1xuICBwdWJsaWMgc3RhdGljIGRlcml2ZUFjdHVhbE1vZGVsSWQocHJvcHM/OiBCZWRyb2NrTW9kZWxQcm9wcyk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBmbU1vZGVsSWQsIGNyb3NzUmVnaW9uUHJlZml4IH0gPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVEZWZhdWx0cyhwcm9wcyk7XG4gICAgcmV0dXJuIHByb3BzPy51c2VDcm9zc1JlZ2lvbkluZmVyZW5jZSA/IGAke2Nyb3NzUmVnaW9uUHJlZml4fS4ke2ZtTW9kZWxJZC5tb2RlbElkfWAgOiBmbU1vZGVsSWQubW9kZWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVNb2RlbElBTVBlcm1pc3Npb25zKHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzPzogQmVkcm9ja01vZGVsUHJvcHMpOiBQb2xpY3lTdGF0ZW1lbnQge1xuICAgIGNvbnN0IHsgYWNjb3VudCwgcmVnaW9uIH0gPSBTdGFjay5vZihzY29wZSk7XG4gICAgY29uc3QgeyBmbU1vZGVsSWQsIGNyb3NzUmVnaW9uUHJlZml4IH0gPSBCZWRyb2NrTW9kZWxVdGlscy5kZXJpdmVEZWZhdWx0cyhwcm9wcyk7XG5cbiAgICByZXR1cm4gbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgJ2JlZHJvY2s6SW52b2tlTW9kZWwnLFxuICAgICAgICAnYmVkcm9jazpJbnZva2VNb2RlbFdpdGhSZXNwb25zZVN0cmVhbScsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIGBhcm46YXdzOmJlZHJvY2s6Kjo6Zm91bmRhdGlvbi1tb2RlbC8ke2ZtTW9kZWxJZC5tb2RlbElkfWAsXG4gICAgICAgIGBhcm46YXdzOmJlZHJvY2s6JHtyZWdpb259OiR7YWNjb3VudH06aW5mZXJlbmNlLXByb2ZpbGUvJHtjcm9zc1JlZ2lvblByZWZpeH0uJHtmbU1vZGVsSWQubW9kZWxJZH1gLFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGRlcml2ZURlZmF1bHRzKHByb3BzPzogQmVkcm9ja01vZGVsUHJvcHMpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCBmbU1vZGVsSWQgPSBwcm9wcz8uZm1Nb2RlbElkIHx8IEZvdW5kYXRpb25Nb2RlbElkZW50aWZpZXIuQU5USFJPUElDX0NMQVVERV9TT05ORVRfNF8yMDI1MDUxNF9WMV8wO1xuICAgIGNvbnN0IGNyb3NzUmVnaW9uUHJlZml4ID0gcHJvcHM/LmNyb3NzUmVnaW9uSW5mZXJlbmNlUHJlZml4IHx8IEJlZHJvY2tDcm9zc1JlZ2lvbkluZmVyZW5jZVByZWZpeC5VUztcblxuICAgIHJldHVybiB7XG4gICAgICBmbU1vZGVsSWQsXG4gICAgICBjcm9zc1JlZ2lvblByZWZpeCxcbiAgICB9O1xuICB9XG59Il19
@@ -0,0 +1 @@
1
+ export * from './bedrock';