@cdklabs/cdk-appmod-catalog-blueprints 1.16.1 → 1.17.1

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 (81) hide show
  1. package/.jsii +963 -146
  2. package/lib/document-processing/adapter/queued-s3-adapter.js +39 -5
  3. package/lib/document-processing/agentic-document-processing.js +6 -4
  4. package/lib/document-processing/base-document-processing.js +16 -4
  5. package/lib/document-processing/bedrock-document-processing.d.ts +1 -0
  6. package/lib/document-processing/bedrock-document-processing.js +117 -70
  7. package/lib/document-processing/default-document-processing-config.js +3 -5
  8. package/lib/document-processing/index.d.ts +2 -0
  9. package/lib/document-processing/index.js +3 -1
  10. package/lib/document-processing/localstack-agentic-document-processing.d.ts +20 -0
  11. package/lib/document-processing/localstack-agentic-document-processing.js +99 -0
  12. package/lib/document-processing/localstack-bedrock-document-processing.d.ts +16 -0
  13. package/lib/document-processing/localstack-bedrock-document-processing.js +69 -0
  14. package/lib/document-processing/resources/cleanup/handler.py +16 -1
  15. package/lib/document-processing/resources/default-localstack-invoke/index.py +184 -0
  16. package/lib/document-processing/resources/default-localstack-invoke/provider_runtime.py +251 -0
  17. package/lib/document-processing/resources/default-localstack-invoke/requirements.txt +5 -0
  18. package/lib/document-processing/resources/default-sqs-consumer/index.py +17 -2
  19. package/lib/document-processing/resources/pdf-chunking/handler.py +16 -1
  20. package/lib/document-processing/tests/base-document-processing-nag.test.js +3 -1
  21. package/lib/document-processing/tests/base-document-processing-schema.test.js +6 -1
  22. package/lib/document-processing/tests/base-document-processing.test.js +12 -1
  23. package/lib/document-processing/tests/localstack-agentic-document-processing.test.d.ts +1 -0
  24. package/lib/document-processing/tests/localstack-agentic-document-processing.test.js +111 -0
  25. package/lib/document-processing/tests/localstack-document-processing.test.d.ts +1 -0
  26. package/lib/document-processing/tests/localstack-document-processing.test.js +149 -0
  27. package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +3 -1
  28. package/lib/document-processing/tests/queued-s3-adapter.test.js +3 -1
  29. package/lib/framework/agents/base-agent.js +31 -4
  30. package/lib/framework/agents/batch-agent.d.ts +1 -0
  31. package/lib/framework/agents/batch-agent.js +42 -7
  32. package/lib/framework/agents/default-agent-config.js +3 -5
  33. package/lib/framework/agents/index.d.ts +1 -0
  34. package/lib/framework/agents/index.js +2 -1
  35. package/lib/framework/agents/interactive-agent.js +115 -23
  36. package/lib/framework/agents/knowledge-base/base-knowledge-base.js +30 -4
  37. package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +81 -5
  38. package/lib/framework/agents/localstack-batch-agent.d.ts +15 -0
  39. package/lib/framework/agents/localstack-batch-agent.js +64 -0
  40. package/lib/framework/agents/resources/default-ollama-agent/batch.py +396 -0
  41. package/lib/framework/agents/resources/default-ollama-agent/models.py +7 -0
  42. package/lib/framework/agents/resources/default-ollama-agent/requirements.txt +9 -0
  43. package/lib/framework/agents/resources/default-ollama-agent/runtime_support.py +237 -0
  44. package/lib/framework/agents/resources/default-ollama-agent/utils.py +77 -0
  45. package/lib/framework/agents/tests/agent-knowledge-base-nag.test.js +35 -2
  46. package/lib/framework/bedrock/bedrock.d.ts +9 -0
  47. package/lib/framework/bedrock/bedrock.js +20 -12
  48. package/lib/framework/custom-resource/default-runtimes.js +20 -22
  49. package/lib/framework/foundation/access-log.js +50 -7
  50. package/lib/framework/foundation/eventbridge-broker.js +5 -4
  51. package/lib/framework/foundation/network.js +4 -4
  52. package/lib/framework/index.d.ts +1 -0
  53. package/lib/framework/index.js +2 -1
  54. package/lib/framework/localstack/index.d.ts +1 -0
  55. package/lib/framework/localstack/index.js +18 -0
  56. package/lib/framework/localstack/localstack-config.d.ts +79 -0
  57. package/lib/framework/localstack/localstack-config.js +47 -0
  58. package/lib/framework/tests/base-agent-knowledge-base.test.js +35 -2
  59. package/lib/framework/tests/batch-agent.test.js +35 -2
  60. package/lib/framework/tests/framework-nag.test.js +35 -2
  61. package/lib/framework/tests/interactive-agent-nag.test.js +35 -2
  62. package/lib/framework/tests/interactive-agent.test.js +35 -2
  63. package/lib/framework/tests/localstack-batch-agent.test.d.ts +1 -0
  64. package/lib/framework/tests/localstack-batch-agent.test.js +100 -0
  65. package/lib/utilities/data-loader.js +50 -5
  66. package/lib/utilities/lambda-iam-utils.js +38 -7
  67. package/lib/utilities/lambda_layers/data-masking/layer-construct.js +40 -3
  68. package/lib/utilities/observability/bedrock-observability.js +38 -2
  69. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +3 -4
  70. package/lib/utilities/observability/cloudwatch-transaction-search.js +36 -5
  71. package/lib/utilities/observability/default-observability-config.js +6 -8
  72. package/lib/utilities/observability/lambda-observability-property-injector.js +4 -4
  73. package/lib/utilities/observability/log-group-data-protection-utils.js +2 -4
  74. package/lib/utilities/observability/observability.js +47 -6
  75. package/lib/utilities/observability/powertools-config.js +2 -4
  76. package/lib/utilities/observability/state-machine-observability-property-injector.js +4 -4
  77. package/lib/webapp/frontend-construct.js +46 -5
  78. package/lib/webapp/tests/frontend-construct-nag.test.js +36 -3
  79. package/lib/webapp/tests/frontend-construct.test.js +36 -3
  80. package/package.json +60 -61
  81. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -1,14 +1,12 @@
1
1
  "use strict";
2
- var _a;
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  exports.DefaultDocumentProcessingConfig = void 0;
5
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
5
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
7
6
  // SPDX-License-Identifier: Apache-2.0
8
7
  class DefaultDocumentProcessingConfig {
8
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DefaultDocumentProcessingConfig", version: "1.17.1" };
9
+ static DEFAULT_OBSERVABILITY_METRIC_SVC_NAME = 'document-processing';
9
10
  }
10
11
  exports.DefaultDocumentProcessingConfig = DefaultDocumentProcessingConfig;
11
- _a = JSII_RTTI_SYMBOL_1;
12
- DefaultDocumentProcessingConfig[_a] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.DefaultDocumentProcessingConfig", version: "1.16.1" };
13
- DefaultDocumentProcessingConfig.DEFAULT_OBSERVABILITY_METRIC_SVC_NAME = 'document-processing';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1kb2N1bWVudC1wcm9jZXNzaW5nLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3VzZS1jYXNlcy9kb2N1bWVudC1wcm9jZXNzaW5nL2RlZmF1bHQtZG9jdW1lbnQtcHJvY2Vzc2luZy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBRXRDLE1BQWEsK0JBQStCOztBQUE1QywwRUFFQzs7O0FBRHdCLHFFQUFxQyxHQUFHLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdERvY3VtZW50UHJvY2Vzc2luZ0NvbmZpZyB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9PQlNFUlZBQklMSVRZX01FVFJJQ19TVkNfTkFNRSA9ICdkb2N1bWVudC1wcm9jZXNzaW5nJztcbn0iXX0=
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1kb2N1bWVudC1wcm9jZXNzaW5nLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3VzZS1jYXNlcy9kb2N1bWVudC1wcm9jZXNzaW5nL2RlZmF1bHQtZG9jdW1lbnQtcHJvY2Vzc2luZy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLHFFQUFxRTtBQUNyRSxzQ0FBc0M7QUFFdEMsTUFBYSwrQkFBK0I7O0lBQ25DLE1BQU0sQ0FBVSxxQ0FBcUMsR0FBRyxxQkFBcUIsQ0FBQzs7QUFEdkYsMEVBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0RG9jdW1lbnRQcm9jZXNzaW5nQ29uZmlnIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX09CU0VSVkFCSUxJVFlfTUVUUklDX1NWQ19OQU1FID0gJ2RvY3VtZW50LXByb2Nlc3NpbmcnO1xufSJdfQ==
@@ -1,6 +1,8 @@
1
1
  export * from './base-document-processing';
2
2
  export * from './bedrock-document-processing';
3
3
  export * from './agentic-document-processing';
4
+ export * from './localstack-bedrock-document-processing';
5
+ export * from './localstack-agentic-document-processing';
4
6
  export * from './adapter';
5
7
  export * from './default-document-processing-config';
6
8
  export * from './chunking-config';
@@ -17,7 +17,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./base-document-processing"), exports);
18
18
  __exportStar(require("./bedrock-document-processing"), exports);
19
19
  __exportStar(require("./agentic-document-processing"), exports);
20
+ __exportStar(require("./localstack-bedrock-document-processing"), exports);
21
+ __exportStar(require("./localstack-agentic-document-processing"), exports);
20
22
  __exportStar(require("./adapter"), exports);
21
23
  __exportStar(require("./default-document-processing-config"), exports);
22
24
  __exportStar(require("./chunking-config"), exports);
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkRBQTJDO0FBQzNDLGdFQUE4QztBQUM5QyxnRUFBOEM7QUFDOUMsNENBQTBCO0FBQzFCLHVFQUFxRDtBQUNyRCxvREFBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Jhc2UtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2FnZW50aWMtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2FkYXB0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9kZWZhdWx0LWRvY3VtZW50LXByb2Nlc3NpbmctY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vY2h1bmtpbmctY29uZmlnJzsiXX0=
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkRBQTJDO0FBQzNDLGdFQUE4QztBQUM5QyxnRUFBOEM7QUFDOUMsMkVBQXlEO0FBQ3pELDJFQUF5RDtBQUN6RCw0Q0FBMEI7QUFDMUIsdUVBQXFEO0FBQ3JELG9EQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vbG9jYWxzdGFjay1iZWRyb2NrLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuZXhwb3J0ICogZnJvbSAnLi9sb2NhbHN0YWNrLWFnZW50aWMtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5leHBvcnQgKiBmcm9tICcuL2FkYXB0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9kZWZhdWx0LWRvY3VtZW50LXByb2Nlc3NpbmctY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vY2h1bmtpbmctY29uZmlnJztcbiJdfQ==
@@ -0,0 +1,20 @@
1
+ import { Construct } from 'constructs';
2
+ import { AgenticDocumentProcessing, AgenticDocumentProcessingProps } from './agentic-document-processing';
3
+ import { DocumentProcessingStepType } from './base-document-processing';
4
+ import { LocalStackEndpointOverrides } from '../framework/localstack';
5
+ export interface LocalStackAgenticDocumentProcessingProps extends AgenticDocumentProcessingProps {
6
+ /**
7
+ * LocalStack endpoint routing configuration for Lambda runtime SDK calls.
8
+ *
9
+ * @default { enabled: true }
10
+ */
11
+ readonly localStack?: LocalStackEndpointOverrides;
12
+ }
13
+ export declare class LocalStackAgenticDocumentProcessing extends AgenticDocumentProcessing {
14
+ private _localStackBatchAgent?;
15
+ private _localStackProcessingStepCounter?;
16
+ constructor(scope: Construct, id: string, props: LocalStackAgenticDocumentProcessingProps);
17
+ protected resolveBedrockInvokeEntry(): string;
18
+ protected processingStep(): DocumentProcessingStepType;
19
+ private applyLocalStackEnvironment;
20
+ }
@@ -0,0 +1,99 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.LocalStackAgenticDocumentProcessing = void 0;
37
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
+ const path = __importStar(require("path"));
39
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
40
+ const aws_stepfunctions_tasks_1 = require("aws-cdk-lib/aws-stepfunctions-tasks");
41
+ const agentic_document_processing_1 = require("./agentic-document-processing");
42
+ const localstack_batch_agent_1 = require("../framework/agents/localstack-batch-agent");
43
+ const localstack_1 = require("../framework/localstack");
44
+ class LocalStackAgenticDocumentProcessing extends agentic_document_processing_1.AgenticDocumentProcessing {
45
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.LocalStackAgenticDocumentProcessing", version: "1.17.1" };
46
+ _localStackBatchAgent;
47
+ _localStackProcessingStepCounter;
48
+ constructor(scope, id, props) {
49
+ super(scope, id, {
50
+ ...props,
51
+ _skipBedrockVpcEndpoints: true,
52
+ });
53
+ this.applyLocalStackEnvironment(props.localStack || {});
54
+ }
55
+ resolveBedrockInvokeEntry() {
56
+ return path.join(__dirname, 'resources/default-localstack-invoke');
57
+ }
58
+ processingStep() {
59
+ if (!this._localStackBatchAgent) {
60
+ const agentProps = this.bedrockDocumentProcessingProps;
61
+ const processingAgentProps = agentProps.processingAgentParameters;
62
+ this._localStackBatchAgent = new localstack_batch_agent_1.LocalStackBatchAgent(this, 'IDPLocalStackBatchAgent', {
63
+ ...processingAgentProps,
64
+ localStack: agentProps.localStack,
65
+ });
66
+ const adapterPolicyStatements = this.ingressAdapter.generateAdapterIAMPolicies();
67
+ for (const statement of adapterPolicyStatements) {
68
+ this._localStackBatchAgent.agentRole.addToPrincipalPolicy(statement);
69
+ }
70
+ }
71
+ if (this._localStackProcessingStepCounter === undefined) {
72
+ this._localStackProcessingStepCounter = 0;
73
+ }
74
+ const stepId = `ProcessingStep-${this._localStackProcessingStepCounter}`;
75
+ this._localStackProcessingStepCounter++;
76
+ return new aws_stepfunctions_tasks_1.LambdaInvoke(this, stepId, {
77
+ lambdaFunction: this._localStackBatchAgent.agentFunction,
78
+ resultPath: '$.processingResult',
79
+ resultSelector: {
80
+ 'result.$': '$.Payload.result',
81
+ },
82
+ });
83
+ }
84
+ applyLocalStackEnvironment(localStack) {
85
+ const localStackEnv = localstack_1.LocalStackIntegrationUtils.toLambdaEnvironment({
86
+ enabled: true,
87
+ ...localStack,
88
+ });
89
+ for (const child of this.node.findAll()) {
90
+ if (child instanceof aws_lambda_1.Function) {
91
+ for (const [key, value] of Object.entries(localStackEnv)) {
92
+ child.addEnvironment(key, value);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ exports.LocalStackAgenticDocumentProcessing = LocalStackAgenticDocumentProcessing;
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdGFjay1hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy9sb2NhbHN0YWNrLWFnZW50aWMtZG9jdW1lbnQtcHJvY2Vzc2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBQzdCLHVEQUFvRTtBQUNwRSxpRkFBbUU7QUFFbkUsK0VBQTBHO0FBRTFHLHVGQUFrRjtBQUNsRix3REFBa0c7QUFXbEcsTUFBYSxtQ0FBb0MsU0FBUSx1REFBeUI7O0lBQ3hFLHFCQUFxQixDQUF3QjtJQUM3QyxnQ0FBZ0MsQ0FBVTtJQUVsRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStDO1FBQ3ZGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1Isd0JBQXdCLEVBQUUsSUFBSTtTQUNHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRVMseUJBQXlCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRVMsY0FBYztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDaEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLDhCQUEwRSxDQUFDO1lBQ25HLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDLHlCQUF5QixDQUFDO1lBRWxFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLDZDQUFvQixDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRTtnQkFDckYsR0FBRyxvQkFBb0I7Z0JBQ3ZCLFVBQVUsRUFBRSxVQUFVLENBQUMsVUFBVTthQUNsQyxDQUFDLENBQUM7WUFFSCxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNqRixLQUFLLE1BQU0sU0FBUyxJQUFJLHVCQUF1QixFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkUsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxnQ0FBZ0MsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7UUFDekUsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7UUFFeEMsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUNwQyxjQUFjLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWM7WUFDekQsVUFBVSxFQUFFLG9CQUFvQjtZQUNoQyxjQUFjLEVBQUU7Z0JBQ2QsVUFBVSxFQUFFLGtCQUFrQjthQUMvQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTywwQkFBMEIsQ0FBQyxVQUF1QztRQUN4RSxNQUFNLGFBQWEsR0FBRyx1Q0FBMEIsQ0FBQyxtQkFBbUIsQ0FBQztZQUNuRSxPQUFPLEVBQUUsSUFBSTtZQUNiLEdBQUcsVUFBVTtTQUNkLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksS0FBSyxZQUFZLHFCQUFjLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztvQkFDekQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBN0RILGtGQThEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBGdW5jdGlvbiBhcyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgTGFtYmRhSW52b2tlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nLCBBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgfSBmcm9tICcuL2FnZW50aWMtZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB9IGZyb20gJy4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmltcG9ydCB7IExvY2FsU3RhY2tCYXRjaEFnZW50IH0gZnJvbSAnLi4vZnJhbWV3b3JrL2FnZW50cy9sb2NhbHN0YWNrLWJhdGNoLWFnZW50JztcbmltcG9ydCB7IExvY2FsU3RhY2tFbmRwb2ludE92ZXJyaWRlcywgTG9jYWxTdGFja0ludGVncmF0aW9uVXRpbHMgfSBmcm9tICcuLi9mcmFtZXdvcmsvbG9jYWxzdGFjayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxTdGFja0FnZW50aWNEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyBleHRlbmRzIEFnZW50aWNEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyB7XG4gIC8qKlxuICAgKiBMb2NhbFN0YWNrIGVuZHBvaW50IHJvdXRpbmcgY29uZmlndXJhdGlvbiBmb3IgTGFtYmRhIHJ1bnRpbWUgU0RLIGNhbGxzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7IGVuYWJsZWQ6IHRydWUgfVxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWxTdGFjaz86IExvY2FsU3RhY2tFbmRwb2ludE92ZXJyaWRlcztcbn1cblxuZXhwb3J0IGNsYXNzIExvY2FsU3RhY2tBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nIGV4dGVuZHMgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyB7XG4gIHByaXZhdGUgX2xvY2FsU3RhY2tCYXRjaEFnZW50PzogTG9jYWxTdGFja0JhdGNoQWdlbnQ7XG4gIHByaXZhdGUgX2xvY2FsU3RhY2tQcm9jZXNzaW5nU3RlcENvdW50ZXI/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IExvY2FsU3RhY2tBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgX3NraXBCZWRyb2NrVnBjRW5kcG9pbnRzOiB0cnVlLFxuICAgIH0gYXMgQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzKTtcbiAgICB0aGlzLmFwcGx5TG9jYWxTdGFja0Vudmlyb25tZW50KHByb3BzLmxvY2FsU3RhY2sgfHwge30pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVCZWRyb2NrSW52b2tlRW50cnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3Jlc291cmNlcy9kZWZhdWx0LWxvY2Fsc3RhY2staW52b2tlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIGlmICghdGhpcy5fbG9jYWxTdGFja0JhdGNoQWdlbnQpIHtcbiAgICAgIGNvbnN0IGFnZW50UHJvcHMgPSB0aGlzLmJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcyBhcyBMb2NhbFN0YWNrQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZ1Byb3BzO1xuICAgICAgY29uc3QgcHJvY2Vzc2luZ0FnZW50UHJvcHMgPSBhZ2VudFByb3BzLnByb2Nlc3NpbmdBZ2VudFBhcmFtZXRlcnM7XG5cbiAgICAgIHRoaXMuX2xvY2FsU3RhY2tCYXRjaEFnZW50ID0gbmV3IExvY2FsU3RhY2tCYXRjaEFnZW50KHRoaXMsICdJRFBMb2NhbFN0YWNrQmF0Y2hBZ2VudCcsIHtcbiAgICAgICAgLi4ucHJvY2Vzc2luZ0FnZW50UHJvcHMsXG4gICAgICAgIGxvY2FsU3RhY2s6IGFnZW50UHJvcHMubG9jYWxTdGFjayxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhZGFwdGVyUG9saWN5U3RhdGVtZW50cyA9IHRoaXMuaW5ncmVzc0FkYXB0ZXIuZ2VuZXJhdGVBZGFwdGVySUFNUG9saWNpZXMoKTtcbiAgICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGFkYXB0ZXJQb2xpY3lTdGF0ZW1lbnRzKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsU3RhY2tCYXRjaEFnZW50LmFnZW50Um9sZS5hZGRUb1ByaW5jaXBhbFBvbGljeShzdGF0ZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9sb2NhbFN0YWNrUHJvY2Vzc2luZ1N0ZXBDb3VudGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2xvY2FsU3RhY2tQcm9jZXNzaW5nU3RlcENvdW50ZXIgPSAwO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXBJZCA9IGBQcm9jZXNzaW5nU3RlcC0ke3RoaXMuX2xvY2FsU3RhY2tQcm9jZXNzaW5nU3RlcENvdW50ZXJ9YDtcbiAgICB0aGlzLl9sb2NhbFN0YWNrUHJvY2Vzc2luZ1N0ZXBDb3VudGVyKys7XG5cbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCBzdGVwSWQsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLl9sb2NhbFN0YWNrQmF0Y2hBZ2VudC5hZ2VudEZ1bmN0aW9uISxcbiAgICAgIHJlc3VsdFBhdGg6ICckLnByb2Nlc3NpbmdSZXN1bHQnLFxuICAgICAgcmVzdWx0U2VsZWN0b3I6IHtcbiAgICAgICAgJ3Jlc3VsdC4kJzogJyQuUGF5bG9hZC5yZXN1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlMb2NhbFN0YWNrRW52aXJvbm1lbnQobG9jYWxTdGFjazogTG9jYWxTdGFja0VuZHBvaW50T3ZlcnJpZGVzKTogdm9pZCB7XG4gICAgY29uc3QgbG9jYWxTdGFja0VudiA9IExvY2FsU3RhY2tJbnRlZ3JhdGlvblV0aWxzLnRvTGFtYmRhRW52aXJvbm1lbnQoe1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIC4uLmxvY2FsU3RhY2ssXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMubm9kZS5maW5kQWxsKCkpIHtcbiAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIExhbWJkYUZ1bmN0aW9uKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGxvY2FsU3RhY2tFbnYpKSB7XG4gICAgICAgICAgY2hpbGQuYWRkRW52aXJvbm1lbnQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { Construct } from 'constructs';
2
+ import { BedrockDocumentProcessing, BedrockDocumentProcessingProps } from './bedrock-document-processing';
3
+ import { LocalStackEndpointOverrides } from '../framework/localstack';
4
+ export interface LocalStackBedrockDocumentProcessingProps extends BedrockDocumentProcessingProps {
5
+ /**
6
+ * LocalStack endpoint routing configuration for Lambda runtime SDK calls.
7
+ *
8
+ * @default { enabled: true }
9
+ */
10
+ readonly localStack?: LocalStackEndpointOverrides;
11
+ }
12
+ export declare class LocalStackBedrockDocumentProcessing extends BedrockDocumentProcessing {
13
+ constructor(scope: Construct, id: string, props: LocalStackBedrockDocumentProcessingProps);
14
+ protected resolveBedrockInvokeEntry(): string;
15
+ private applyLocalStackEnvironment;
16
+ }
@@ -0,0 +1,69 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.LocalStackBedrockDocumentProcessing = void 0;
37
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
+ const path = __importStar(require("path"));
39
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
40
+ const bedrock_document_processing_1 = require("./bedrock-document-processing");
41
+ const localstack_1 = require("../framework/localstack");
42
+ class LocalStackBedrockDocumentProcessing extends bedrock_document_processing_1.BedrockDocumentProcessing {
43
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdklabs/cdk-appmod-catalog-blueprints.LocalStackBedrockDocumentProcessing", version: "1.17.1" };
44
+ constructor(scope, id, props) {
45
+ super(scope, id, {
46
+ ...props,
47
+ _skipBedrockVpcEndpoints: true,
48
+ });
49
+ this.applyLocalStackEnvironment(props.localStack);
50
+ }
51
+ resolveBedrockInvokeEntry() {
52
+ return path.join(__dirname, 'resources/default-localstack-invoke');
53
+ }
54
+ applyLocalStackEnvironment(localStack) {
55
+ const localStackEnv = localstack_1.LocalStackIntegrationUtils.toLambdaEnvironment({
56
+ enabled: true,
57
+ ...localStack,
58
+ });
59
+ for (const child of this.node.findAll()) {
60
+ if (child instanceof aws_lambda_1.Function) {
61
+ for (const [key, value] of Object.entries(localStackEnv)) {
62
+ child.addEnvironment(key, value);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ exports.LocalStackBedrockDocumentProcessing = LocalStackBedrockDocumentProcessing;
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdGFjay1iZWRyb2NrLWRvY3VtZW50LXByb2Nlc3NpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy9sb2NhbHN0YWNrLWJlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBQzdCLHVEQUFvRTtBQUVwRSwrRUFBMEc7QUFDMUcsd0RBQWtHO0FBV2xHLE1BQWEsbUNBQW9DLFNBQVEsdURBQXlCOztJQUNoRixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQStDO1FBQ3ZGLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1Isd0JBQXdCLEVBQUUsSUFBSTtTQUNHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFUyx5QkFBeUI7UUFDakMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTywwQkFBMEIsQ0FBQyxVQUF3QztRQUN6RSxNQUFNLGFBQWEsR0FBRyx1Q0FBMEIsQ0FBQyxtQkFBbUIsQ0FBQztZQUNuRSxPQUFPLEVBQUUsSUFBSTtZQUNiLEdBQUcsVUFBVTtTQUNkLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksS0FBSyxZQUFZLHFCQUFjLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztvQkFDekQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25DLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBMUJILGtGQTJCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBGdW5jdGlvbiBhcyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nLCBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgfSBmcm9tICcuL2JlZHJvY2stZG9jdW1lbnQtcHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBMb2NhbFN0YWNrRW5kcG9pbnRPdmVycmlkZXMsIExvY2FsU3RhY2tJbnRlZ3JhdGlvblV0aWxzIH0gZnJvbSAnLi4vZnJhbWV3b3JrL2xvY2Fsc3RhY2snO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsU3RhY2tCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMgZXh0ZW5kcyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMge1xuICAvKipcbiAgICogTG9jYWxTdGFjayBlbmRwb2ludCByb3V0aW5nIGNvbmZpZ3VyYXRpb24gZm9yIExhbWJkYSBydW50aW1lIFNESyBjYWxscy5cbiAgICpcbiAgICogQGRlZmF1bHQgeyBlbmFibGVkOiB0cnVlIH1cbiAgICovXG4gIHJlYWRvbmx5IGxvY2FsU3RhY2s/OiBMb2NhbFN0YWNrRW5kcG9pbnRPdmVycmlkZXM7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2NhbFN0YWNrQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyBleHRlbmRzIEJlZHJvY2tEb2N1bWVudFByb2Nlc3Npbmcge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTG9jYWxTdGFja0JlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmdQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBfc2tpcEJlZHJvY2tWcGNFbmRwb2ludHM6IHRydWUsXG4gICAgfSBhcyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nUHJvcHMpO1xuICAgIHRoaXMuYXBwbHlMb2NhbFN0YWNrRW52aXJvbm1lbnQocHJvcHMubG9jYWxTdGFjayk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzb2x2ZUJlZHJvY2tJbnZva2VFbnRyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4oX19kaXJuYW1lLCAncmVzb3VyY2VzL2RlZmF1bHQtbG9jYWxzdGFjay1pbnZva2UnKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlMb2NhbFN0YWNrRW52aXJvbm1lbnQobG9jYWxTdGFjaz86IExvY2FsU3RhY2tFbmRwb2ludE92ZXJyaWRlcyk6IHZvaWQge1xuICAgIGNvbnN0IGxvY2FsU3RhY2tFbnYgPSBMb2NhbFN0YWNrSW50ZWdyYXRpb25VdGlscy50b0xhbWJkYUVudmlyb25tZW50KHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAuLi5sb2NhbFN0YWNrLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLm5vZGUuZmluZEFsbCgpKSB7XG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBMYW1iZGFGdW5jdGlvbikge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhsb2NhbFN0YWNrRW52KSkge1xuICAgICAgICAgIGNoaWxkLmFkZEVudmlyb25tZW50KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -36,8 +36,23 @@ except ImportError:
36
36
  logger = logging.getLogger()
37
37
  logger.setLevel(os.environ.get('LOG_LEVEL', 'INFO'))
38
38
 
39
+ def _resolve_endpoint_url(*service_env_keys: str) -> str | None:
40
+ for key in service_env_keys:
41
+ endpoint = os.getenv(key)
42
+ if endpoint:
43
+ return endpoint
44
+ return None
45
+
46
+
47
+ def _create_boto3_client(service_name: str, *service_env_keys: str):
48
+ endpoint_url = _resolve_endpoint_url(*service_env_keys, 'AWS_ENDPOINT_URL')
49
+ if endpoint_url:
50
+ return boto3.client(service_name, endpoint_url=endpoint_url)
51
+ return boto3.client(service_name)
52
+
53
+
39
54
  # Initialize S3 client
40
- s3_client = boto3.client('s3')
55
+ s3_client = _create_boto3_client('s3', 'AWS_ENDPOINT_URL_S3')
41
56
 
42
57
 
43
58
  def handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:
@@ -0,0 +1,184 @@
1
+ import base64
2
+ import logging
3
+ import os
4
+ from aws_lambda_powertools import Metrics, Tracer
5
+ from aws_lambda_powertools.metrics import MetricUnit
6
+
7
+ from provider_runtime import (
8
+ MODEL_PROVIDER_OLLAMA,
9
+ create_boto3_client,
10
+ extract_pdf_text_for_ollama,
11
+ invoke_model,
12
+ normalize_model_response,
13
+ resolve_model_provider,
14
+ )
15
+
16
+ s3 = create_boto3_client('s3', 'AWS_ENDPOINT_URL_S3')
17
+ bedrock = create_boto3_client('bedrock-runtime', 'AWS_ENDPOINT_URL_BEDROCK_RUNTIME')
18
+ metrics = Metrics()
19
+ tracer = Tracer()
20
+ logger = logging.getLogger()
21
+ logger.setLevel(os.getenv('LOG_LEVEL', 'INFO').upper())
22
+
23
+
24
+ def parse_chunk_metadata(event):
25
+ """
26
+ Parse optional chunk metadata from the event payload.
27
+
28
+ Returns a dictionary with chunk information if present, None otherwise.
29
+ Supports both direct chunk metadata and nested chunk object format.
30
+ """
31
+ # Check for direct chunkMetadata field
32
+ if 'chunkMetadata' in event:
33
+ return event['chunkMetadata']
34
+
35
+ # Check for chunk object (from Map State iteration)
36
+ if 'chunk' in event:
37
+ chunk = event['chunk']
38
+ return {
39
+ 'chunkIndex': chunk.get('chunkIndex', event.get('chunkIndex', 0)),
40
+ 'totalChunks': event.get('totalChunks', 1),
41
+ 'startPage': chunk.get('startPage', 0),
42
+ 'endPage': chunk.get('endPage', 0),
43
+ 'pageCount': chunk.get('pageCount', 0),
44
+ 'estimatedTokens': chunk.get('estimatedTokens', 0),
45
+ 'overlapPages': chunk.get('overlapPages', 0),
46
+ }
47
+
48
+ return None
49
+
50
+
51
+ def build_chunk_context_prompt(chunk_metadata):
52
+ """
53
+ Build a context prompt for chunk-aware processing.
54
+
55
+ Args:
56
+ chunk_metadata: Dictionary containing chunk information
57
+
58
+ Returns:
59
+ String with chunk context to prepend to the main prompt
60
+ """
61
+ if not chunk_metadata:
62
+ return ""
63
+
64
+ chunk_index = chunk_metadata.get('chunkIndex', 0)
65
+ total_chunks = chunk_metadata.get('totalChunks', 1)
66
+ start_page = chunk_metadata.get('startPage', 0)
67
+ end_page = chunk_metadata.get('endPage', 0)
68
+ overlap_pages = chunk_metadata.get('overlapPages', 0)
69
+
70
+ # Build context string
71
+ context_parts = [
72
+ f"You are analyzing chunk {chunk_index + 1} of {total_chunks} from pages {start_page + 1} to {end_page + 1}."
73
+ ]
74
+
75
+ # Add overlap information if applicable
76
+ if overlap_pages > 0 and chunk_index > 0:
77
+ context_parts.append(
78
+ f"Note: This chunk includes {overlap_pages} overlapping pages from the previous chunk for context."
79
+ )
80
+
81
+ return "\n".join(context_parts) + "\n\n"
82
+
83
+
84
+ @metrics.log_metrics
85
+ @tracer.capture_lambda_handler
86
+ def handler(event, context):
87
+ invoke_type = os.environ["INVOKE_TYPE"]
88
+ tracer.put_annotation(key="invoke_type", value=invoke_type)
89
+ tracer.put_annotation(key="documentId", value=event["documentId"])
90
+ metrics.add_dimension(name="invoke_type", value=invoke_type)
91
+ content_type = event["contentType"]
92
+
93
+ # Parse optional chunk metadata
94
+ chunk_metadata = parse_chunk_metadata(event)
95
+ if chunk_metadata:
96
+ tracer.put_annotation(key="chunkIndex", value=str(chunk_metadata.get('chunkIndex', 0)))
97
+ tracer.put_annotation(key="totalChunks", value=str(chunk_metadata.get('totalChunks', 1)))
98
+ metrics.add_dimension(name="is_chunked", value="true")
99
+ else:
100
+ metrics.add_dimension(name="is_chunked", value="false")
101
+
102
+ # Format prompt if classification result exists
103
+ prompt = os.environ['PROMPT']
104
+ if 'classificationResult' in event:
105
+ classification = event['classificationResult']['documentClassification']
106
+ prompt = prompt.replace("[ACTUAL_CLASSIFICATION]", classification)
107
+
108
+ # Add chunk context to prompt if processing a chunk
109
+ chunk_context = build_chunk_context_prompt(chunk_metadata)
110
+ if chunk_context:
111
+ prompt = chunk_context + prompt
112
+
113
+ model_provider = resolve_model_provider()
114
+
115
+ # Build content based on file type
116
+ content = [{'type': 'text', 'text': prompt}]
117
+ if content_type == 'file':
118
+ content_location = event['content']['location']
119
+
120
+ if content_location == 's3':
121
+ # Use chunk-specific S3 location if available, otherwise use original content
122
+ if chunk_metadata and 'bucket' in chunk_metadata and 'key' in chunk_metadata:
123
+ bucket = chunk_metadata['bucket']
124
+ key = chunk_metadata['key']
125
+ else:
126
+ bucket = event['content']['bucket']
127
+ key = event['content']['key']
128
+
129
+ # Check file type
130
+ ext = key.lower().split('.')[-1]
131
+ if ext not in ['jpg', 'jpeg', 'png', 'pdf']:
132
+ raise ValueError(f"Unsupported file type: {ext}")
133
+
134
+ media_type = {'jpg': 'image/jpeg', 'jpeg': 'image/jpeg', 'png': 'image/png', 'pdf': 'application/pdf'}[ext]
135
+
136
+ # Download file to /tmp
137
+ local_path = f"/tmp/{key.split('/')[-1]}"
138
+ s3.download_file(bucket, key, local_path)
139
+
140
+ if model_provider == MODEL_PROVIDER_OLLAMA:
141
+ if ext == 'pdf':
142
+ extracted_text = extract_pdf_text_for_ollama(local_path)
143
+ if extracted_text:
144
+ content.append({
145
+ 'type': 'text',
146
+ 'text': f'Document text extract:\n\n{extracted_text}'
147
+ })
148
+ else:
149
+ content.append({
150
+ 'type': 'text',
151
+ 'text': (
152
+ 'Document is PDF, but text extraction returned no content. '
153
+ 'Classify based on any other provided context.'
154
+ )
155
+ })
156
+ else:
157
+ content.append({
158
+ 'type': 'text',
159
+ 'text': (
160
+ f'Input includes an image ({media_type}). '
161
+ 'Direct Ollama mode does not attach image bytes in this workflow.'
162
+ )
163
+ })
164
+ else:
165
+ # Read and encode file
166
+ with open(local_path, 'rb') as f:
167
+ file_data = base64.b64encode(f.read()).decode('utf-8')
168
+
169
+ if ext == 'pdf':
170
+ content.append({'type': 'document', 'source': {'type': 'base64', 'media_type': media_type, 'data': file_data}})
171
+ else:
172
+ content.append({'type': 'image', 'source': {'type': 'base64', 'media_type': media_type, 'data': file_data}})
173
+
174
+ elif content_type == 'data':
175
+ content.append({
176
+ 'type': 'text',
177
+ 'text': event['content']['data']
178
+ })
179
+
180
+ model_id = os.environ['MODEL_ID']
181
+ max_tokens = int(os.getenv('INVOKE_MAX_TOKENS', '1000'))
182
+ response_text = invoke_model(content, max_tokens, model_id, bedrock, logger)
183
+ metrics.add_metric(name="SuccessfulInvocation", unit=MetricUnit.Count, value=1)
184
+ return normalize_model_response(response_text, invoke_type)