@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.
- package/.jsii +963 -146
- package/lib/document-processing/adapter/queued-s3-adapter.js +39 -5
- package/lib/document-processing/agentic-document-processing.js +6 -4
- package/lib/document-processing/base-document-processing.js +16 -4
- package/lib/document-processing/bedrock-document-processing.d.ts +1 -0
- package/lib/document-processing/bedrock-document-processing.js +117 -70
- package/lib/document-processing/default-document-processing-config.js +3 -5
- package/lib/document-processing/index.d.ts +2 -0
- package/lib/document-processing/index.js +3 -1
- package/lib/document-processing/localstack-agentic-document-processing.d.ts +20 -0
- package/lib/document-processing/localstack-agentic-document-processing.js +99 -0
- package/lib/document-processing/localstack-bedrock-document-processing.d.ts +16 -0
- package/lib/document-processing/localstack-bedrock-document-processing.js +69 -0
- package/lib/document-processing/resources/cleanup/handler.py +16 -1
- package/lib/document-processing/resources/default-localstack-invoke/index.py +184 -0
- package/lib/document-processing/resources/default-localstack-invoke/provider_runtime.py +251 -0
- package/lib/document-processing/resources/default-localstack-invoke/requirements.txt +5 -0
- package/lib/document-processing/resources/default-sqs-consumer/index.py +17 -2
- package/lib/document-processing/resources/pdf-chunking/handler.py +16 -1
- package/lib/document-processing/tests/base-document-processing-nag.test.js +3 -1
- package/lib/document-processing/tests/base-document-processing-schema.test.js +6 -1
- package/lib/document-processing/tests/base-document-processing.test.js +12 -1
- package/lib/document-processing/tests/localstack-agentic-document-processing.test.d.ts +1 -0
- package/lib/document-processing/tests/localstack-agentic-document-processing.test.js +111 -0
- package/lib/document-processing/tests/localstack-document-processing.test.d.ts +1 -0
- package/lib/document-processing/tests/localstack-document-processing.test.js +149 -0
- package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +3 -1
- package/lib/document-processing/tests/queued-s3-adapter.test.js +3 -1
- package/lib/framework/agents/base-agent.js +31 -4
- package/lib/framework/agents/batch-agent.d.ts +1 -0
- package/lib/framework/agents/batch-agent.js +42 -7
- package/lib/framework/agents/default-agent-config.js +3 -5
- package/lib/framework/agents/index.d.ts +1 -0
- package/lib/framework/agents/index.js +2 -1
- package/lib/framework/agents/interactive-agent.js +115 -23
- package/lib/framework/agents/knowledge-base/base-knowledge-base.js +30 -4
- package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +81 -5
- package/lib/framework/agents/localstack-batch-agent.d.ts +15 -0
- package/lib/framework/agents/localstack-batch-agent.js +64 -0
- package/lib/framework/agents/resources/default-ollama-agent/batch.py +396 -0
- package/lib/framework/agents/resources/default-ollama-agent/models.py +7 -0
- package/lib/framework/agents/resources/default-ollama-agent/requirements.txt +9 -0
- package/lib/framework/agents/resources/default-ollama-agent/runtime_support.py +237 -0
- package/lib/framework/agents/resources/default-ollama-agent/utils.py +77 -0
- package/lib/framework/agents/tests/agent-knowledge-base-nag.test.js +35 -2
- package/lib/framework/bedrock/bedrock.d.ts +9 -0
- package/lib/framework/bedrock/bedrock.js +20 -12
- package/lib/framework/custom-resource/default-runtimes.js +20 -22
- package/lib/framework/foundation/access-log.js +50 -7
- package/lib/framework/foundation/eventbridge-broker.js +5 -4
- package/lib/framework/foundation/network.js +4 -4
- package/lib/framework/index.d.ts +1 -0
- package/lib/framework/index.js +2 -1
- package/lib/framework/localstack/index.d.ts +1 -0
- package/lib/framework/localstack/index.js +18 -0
- package/lib/framework/localstack/localstack-config.d.ts +79 -0
- package/lib/framework/localstack/localstack-config.js +47 -0
- package/lib/framework/tests/base-agent-knowledge-base.test.js +35 -2
- package/lib/framework/tests/batch-agent.test.js +35 -2
- package/lib/framework/tests/framework-nag.test.js +35 -2
- package/lib/framework/tests/interactive-agent-nag.test.js +35 -2
- package/lib/framework/tests/interactive-agent.test.js +35 -2
- package/lib/framework/tests/localstack-batch-agent.test.d.ts +1 -0
- package/lib/framework/tests/localstack-batch-agent.test.js +100 -0
- package/lib/utilities/data-loader.js +50 -5
- package/lib/utilities/lambda-iam-utils.js +38 -7
- package/lib/utilities/lambda_layers/data-masking/layer-construct.js +40 -3
- package/lib/utilities/observability/bedrock-observability.js +38 -2
- package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +3 -4
- package/lib/utilities/observability/cloudwatch-transaction-search.js +36 -5
- package/lib/utilities/observability/default-observability-config.js +6 -8
- package/lib/utilities/observability/lambda-observability-property-injector.js +4 -4
- package/lib/utilities/observability/log-group-data-protection-utils.js +2 -4
- package/lib/utilities/observability/observability.js +47 -6
- package/lib/utilities/observability/powertools-config.js +2 -4
- package/lib/utilities/observability/state-machine-observability-property-injector.js +4 -4
- package/lib/webapp/frontend-construct.js +46 -5
- package/lib/webapp/tests/frontend-construct-nag.test.js +36 -3
- package/lib/webapp/tests/frontend-construct.test.js +36 -3
- package/package.json +60 -61
- 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
|
-
|
|
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,
|
|
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 =
|
|
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)
|