@aws/ml-container-creator 0.2.5 → 0.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.
- package/bin/cli.js +45 -4
- package/config/bootstrap-stack.json +14 -0
- package/infra/ci-harness/package-lock.json +22 -9
- package/package.json +7 -8
- package/servers/base-image-picker/index.js +3 -3
- package/servers/base-image-picker/manifest.json +4 -2
- package/servers/instance-sizer/index.js +564 -0
- package/servers/instance-sizer/lib/instance-ranker.js +270 -0
- package/servers/instance-sizer/lib/model-resolver.js +269 -0
- package/servers/instance-sizer/lib/vram-estimator.js +177 -0
- package/servers/instance-sizer/manifest.json +17 -0
- package/servers/instance-sizer/package.json +15 -0
- package/servers/{instance-recommender → lib}/catalogs/instances.json +136 -34
- package/servers/{base-image-picker → lib}/catalogs/model-servers.json +302 -254
- package/servers/lib/catalogs/model-sizes.json +131 -0
- package/servers/lib/catalogs/models.json +632 -0
- package/servers/{model-picker → lib}/catalogs/popular-diffusors.json +32 -10
- package/servers/{model-picker → lib}/catalogs/popular-transformers.json +59 -26
- package/servers/{base-image-picker → lib}/catalogs/python-slim.json +12 -12
- package/servers/lib/schemas/image-catalog.schema.json +6 -12
- package/servers/lib/schemas/instances.schema.json +29 -0
- package/servers/lib/schemas/model-catalog.schema.json +12 -10
- package/servers/lib/schemas/unified-model-catalog.schema.json +129 -0
- package/servers/model-picker/index.js +4 -4
- package/servers/model-picker/manifest.json +2 -3
- package/servers/region-picker/index.js +1 -1
- package/servers/region-picker/manifest.json +1 -1
- package/src/app.js +36 -0
- package/src/lib/architecture-sync.js +171 -0
- package/src/lib/arn-detection.js +22 -0
- package/src/lib/bootstrap-command-handler.js +120 -0
- package/src/lib/cli-handler.js +3 -3
- package/src/lib/config-manager.js +47 -1
- package/src/lib/configuration-manager.js +2 -2
- package/src/lib/cross-cutting-checker.js +460 -0
- package/src/lib/deployment-entry-schema.js +1 -2
- package/src/lib/dry-run-validator.js +78 -0
- package/src/lib/generation-validator.js +102 -0
- package/src/lib/mcp-validator-config.js +89 -0
- package/src/lib/payload-builder.js +153 -0
- package/src/lib/prompt-runner.js +866 -149
- package/src/lib/prompts.js +2 -2
- package/src/lib/registry-command-handler.js +236 -0
- package/src/lib/registry-loader.js +5 -5
- package/src/lib/schema-sync.js +203 -0
- package/src/lib/schema-validation-engine.js +195 -0
- package/src/lib/secret-classification.js +56 -0
- package/src/lib/secrets-command-handler.js +550 -0
- package/src/lib/service-model-parser.js +102 -0
- package/src/lib/validate-runner.js +216 -0
- package/src/lib/validation-report.js +140 -0
- package/src/lib/validators/base-validator.js +36 -0
- package/src/lib/validators/catalog-validator.js +177 -0
- package/src/lib/validators/enum-validator.js +120 -0
- package/src/lib/validators/required-field-validator.js +150 -0
- package/src/lib/validators/type-validator.js +313 -0
- package/src/prompt-adapter.js +3 -2
- package/templates/Dockerfile +1 -1
- package/templates/do/build +37 -5
- package/templates/do/config +15 -3
- package/templates/do/deploy +60 -5
- package/templates/do/logs +18 -3
- package/templates/do/run +15 -1
- package/templates/do/validate +61 -0
- package/servers/instance-recommender/LICENSE +0 -202
- package/servers/instance-recommender/index.js +0 -284
- package/servers/instance-recommender/manifest.json +0 -16
- package/servers/instance-recommender/package.json +0 -15
- /package/servers/{model-picker → lib}/catalogs/jumpstart-public.json +0 -0
- /package/servers/{region-picker → lib}/catalogs/regions.json +0 -0
- /package/servers/{base-image-picker → lib}/catalogs/triton-backends.json +0 -0
- /package/servers/{base-image-picker → lib}/catalogs/triton.json +0 -0
package/bin/cli.js
CHANGED
|
@@ -90,6 +90,9 @@ program
|
|
|
90
90
|
|
|
91
91
|
// --- Authentication ---
|
|
92
92
|
.addOption(new Option('--hf-token <token>', 'HuggingFace token (or "$HF_TOKEN" for env var reference)'))
|
|
93
|
+
.addOption(new Option('--hf-token-arn <arn>', 'HuggingFace token ARN from Secrets Manager'))
|
|
94
|
+
.addOption(new Option('--ngc-token <token>', 'NVIDIA NGC token (or "$NGC_API_KEY" for env var reference)'))
|
|
95
|
+
.addOption(new Option('--ngc-token-arn <arn>', 'NVIDIA NGC token ARN from Secrets Manager'))
|
|
93
96
|
|
|
94
97
|
// --- Optional Features ---
|
|
95
98
|
.addOption(new Option('--include-sample', 'Include sample model code'))
|
|
@@ -101,11 +104,23 @@ program
|
|
|
101
104
|
.addOption(new Option('--discover', 'Enable live registry lookups via MCP discovery'))
|
|
102
105
|
|
|
103
106
|
// --- Validation ---
|
|
107
|
+
.addOption(new Option('--no-validate', 'Skip schema-driven validation at generation time'))
|
|
104
108
|
.addOption(new Option('--validate-env-vars', 'Enable environment variable validation (default: true)'))
|
|
105
109
|
.addOption(new Option('--validate-with-docker', 'Enable Docker introspection validation (opt-in)'))
|
|
106
110
|
.addOption(new Option('--offline', 'Disable HuggingFace API lookups'))
|
|
107
111
|
|
|
108
|
-
.action((projectNameArgs, options) =>
|
|
112
|
+
.action((projectNameArgs, options) => {
|
|
113
|
+
// Mutual exclusion validation: plaintext token and ARN flags cannot both be provided
|
|
114
|
+
if (options.hfToken && options.hfTokenArn) {
|
|
115
|
+
console.error('❌ Cannot specify both --hf-token and --hf-token-arn. Use one or the other.');
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
if (options.ngcToken && options.ngcTokenArn) {
|
|
119
|
+
console.error('❌ Cannot specify both --ngc-token and --ngc-token-arn. Use one or the other.');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
return run(projectNameArgs?.[0] || null, options);
|
|
123
|
+
});
|
|
109
124
|
|
|
110
125
|
// Custom help formatting — group options into logical sections (root command only)
|
|
111
126
|
program.configureHelp({
|
|
@@ -173,13 +188,13 @@ program.configureHelp({
|
|
|
173
188
|
groups.hyperpod.push(opt);
|
|
174
189
|
} else if (['--model-env', '--server-env'].includes(long)) {
|
|
175
190
|
groups.env.push(opt);
|
|
176
|
-
} else if (['--hf-token'].includes(long)) {
|
|
191
|
+
} else if (['--hf-token', '--hf-token-arn', '--ngc-token', '--ngc-token-arn'].includes(long)) {
|
|
177
192
|
groups.auth.push(opt);
|
|
178
193
|
} else if (['--include-sample', '--include-testing', '--test-types'].includes(long)) {
|
|
179
194
|
groups.features.push(opt);
|
|
180
195
|
} else if (['--smart', '--discover'].includes(long)) {
|
|
181
196
|
groups.mcp.push(opt);
|
|
182
|
-
} else if (['--validate-env-vars', '--validate-with-docker', '--offline'].includes(long)) {
|
|
197
|
+
} else if (['--validate-env-vars', '--validate-with-docker', '--offline', '--no-validate'].includes(long)) {
|
|
183
198
|
groups.validation.push(opt);
|
|
184
199
|
} else {
|
|
185
200
|
groups.general.push(opt);
|
|
@@ -241,7 +256,7 @@ program
|
|
|
241
256
|
.command('bootstrap')
|
|
242
257
|
.description('Set up AWS infrastructure (IAM role, ECR repo, S3 buckets)')
|
|
243
258
|
.passThroughOptions()
|
|
244
|
-
.argument('[action]', 'Bootstrap action (status, use, list, remove, scan, prune, update)')
|
|
259
|
+
.argument('[action]', 'Bootstrap action (status, use, list, remove, scan, prune, update, sync-schemas)')
|
|
245
260
|
.argument('[args...]', 'Additional arguments')
|
|
246
261
|
.option('--profile <profile>', 'AWS profile name')
|
|
247
262
|
.option('--region <region>', 'AWS region')
|
|
@@ -250,6 +265,11 @@ program
|
|
|
250
265
|
.option('--force', 'Force removal without confirmation')
|
|
251
266
|
.option('--verify', 'Verify resources exist (for status)')
|
|
252
267
|
.option('--delete-stack', 'Delete CloudFormation stack on remove')
|
|
268
|
+
.option('--ignore-staleness', 'Suppress schema staleness warnings')
|
|
269
|
+
.option('--ci', 'Provision CI integration infrastructure')
|
|
270
|
+
.option('--skip-ci', 'Skip CI infrastructure provisioning')
|
|
271
|
+
.option('--skip-s3', 'Skip S3 bucket creation')
|
|
272
|
+
.option('--skip-post-setup', 'Skip post-setup chain (mcp init, sync-architectures, sync-schemas)')
|
|
253
273
|
.action(async (action, args, options) => {
|
|
254
274
|
const { default: BootstrapCommandHandler } = await import('../src/lib/bootstrap-command-handler.js');
|
|
255
275
|
const handler = new BootstrapCommandHandler();
|
|
@@ -309,12 +329,33 @@ program
|
|
|
309
329
|
.option('--project', 'Use project-level registry')
|
|
310
330
|
.option('--parameters <json>', 'Parameters JSON string')
|
|
311
331
|
.option('--generator-version <version>', 'Generator version')
|
|
332
|
+
// Options used by `registry list-architectures`
|
|
333
|
+
.option('--server <name>', 'Filter by server name (for list-architectures)')
|
|
334
|
+
.option('--verbose', 'Show full list of supported model types (for list-architectures)')
|
|
312
335
|
.action(async (action, args, options) => {
|
|
313
336
|
const { default: RegistryCommandHandler } = await import('../src/lib/registry-command-handler.js');
|
|
314
337
|
const handler = new RegistryCommandHandler();
|
|
315
338
|
await handler.handle([action, ...args], options);
|
|
316
339
|
});
|
|
317
340
|
|
|
341
|
+
program
|
|
342
|
+
.command('secrets')
|
|
343
|
+
.description('Manage secrets in AWS Secrets Manager (create, list, describe)')
|
|
344
|
+
.argument('[action]', 'Secrets action (create, list, describe)')
|
|
345
|
+
.argument('[args...]', 'Additional arguments')
|
|
346
|
+
.option('--type <type>', 'Secret type (e.g., hf-token, ngc-token)')
|
|
347
|
+
.option('--name <label>', 'Secret label (used in naming convention)')
|
|
348
|
+
.option('--secret-value <value>', 'Secret value (masked in terminal)')
|
|
349
|
+
.option('--description <text>', 'Secret description')
|
|
350
|
+
.option('--kms-key-id <key>', 'KMS key for encryption')
|
|
351
|
+
.option('--json <json-or-path>', 'JSON input (inline or file://path)')
|
|
352
|
+
.action(async (action, args, options) => {
|
|
353
|
+
const { default: SecretsCommandHandler } = await import('../src/lib/secrets-command-handler.js');
|
|
354
|
+
const handler = new SecretsCommandHandler();
|
|
355
|
+
const allArgs = action ? [action, ...args] : [];
|
|
356
|
+
await handler.handle(allArgs, options);
|
|
357
|
+
});
|
|
358
|
+
|
|
318
359
|
program
|
|
319
360
|
.command('configure')
|
|
320
361
|
.description('Interactive configuration setup (experimental)')
|
|
@@ -105,6 +105,20 @@
|
|
|
105
105
|
"arn:aws:s3:::ml-container-creator-*",
|
|
106
106
|
"arn:aws:s3:::ml-container-creator-*/*"
|
|
107
107
|
]
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"Sid": "SecretsManagerRead",
|
|
111
|
+
"Effect": "Allow",
|
|
112
|
+
"Action": [
|
|
113
|
+
"secretsmanager:GetSecretValue",
|
|
114
|
+
"secretsmanager:DescribeSecret"
|
|
115
|
+
],
|
|
116
|
+
"Resource": "arn:aws:secretsmanager:*:*:secret:mlcc/*",
|
|
117
|
+
"Condition": {
|
|
118
|
+
"StringEquals": {
|
|
119
|
+
"aws:ResourceTag/mlcc:managed-by": "ml-container-creator"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
108
122
|
}
|
|
109
123
|
]
|
|
110
124
|
}
|
|
@@ -48,7 +48,6 @@
|
|
|
48
48
|
"semver"
|
|
49
49
|
],
|
|
50
50
|
"license": "Apache-2.0",
|
|
51
|
-
"peer": true,
|
|
52
51
|
"dependencies": {
|
|
53
52
|
"jsonschema": "~1.4.1",
|
|
54
53
|
"semver": "^7.7.4"
|
|
@@ -2151,7 +2150,6 @@
|
|
|
2151
2150
|
"integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==",
|
|
2152
2151
|
"dev": true,
|
|
2153
2152
|
"license": "MIT",
|
|
2154
|
-
"peer": true,
|
|
2155
2153
|
"dependencies": {
|
|
2156
2154
|
"undici-types": "~6.21.0"
|
|
2157
2155
|
}
|
|
@@ -2791,8 +2789,7 @@
|
|
|
2791
2789
|
"version": "10.6.0",
|
|
2792
2790
|
"resolved": "https://registry.npmjs.org/constructs/-/constructs-10.6.0.tgz",
|
|
2793
2791
|
"integrity": "sha512-TxHOnBO5zMo/G76ykzGF/wMpEHu257TbWiIxP9K0Yv/+t70UzgBQiTqjkAsWOPC6jW91DzJI0+ehQV6xDRNBuQ==",
|
|
2794
|
-
"license": "Apache-2.0"
|
|
2795
|
-
"peer": true
|
|
2792
|
+
"license": "Apache-2.0"
|
|
2796
2793
|
},
|
|
2797
2794
|
"node_modules/create-require": {
|
|
2798
2795
|
"version": "1.1.1",
|
|
@@ -2937,9 +2934,9 @@
|
|
|
2937
2934
|
}
|
|
2938
2935
|
},
|
|
2939
2936
|
"node_modules/fast-xml-builder": {
|
|
2940
|
-
"version": "1.
|
|
2941
|
-
"resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.
|
|
2942
|
-
"integrity": "sha512-
|
|
2937
|
+
"version": "1.2.0",
|
|
2938
|
+
"resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz",
|
|
2939
|
+
"integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==",
|
|
2943
2940
|
"dev": true,
|
|
2944
2941
|
"funding": [
|
|
2945
2942
|
{
|
|
@@ -2949,7 +2946,8 @@
|
|
|
2949
2946
|
],
|
|
2950
2947
|
"license": "MIT",
|
|
2951
2948
|
"dependencies": {
|
|
2952
|
-
"path-expression-matcher": "^1.
|
|
2949
|
+
"path-expression-matcher": "^1.5.0",
|
|
2950
|
+
"xml-naming": "^0.1.0"
|
|
2953
2951
|
}
|
|
2954
2952
|
},
|
|
2955
2953
|
"node_modules/fast-xml-parser": {
|
|
@@ -3696,7 +3694,6 @@
|
|
|
3696
3694
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
|
3697
3695
|
"dev": true,
|
|
3698
3696
|
"license": "Apache-2.0",
|
|
3699
|
-
"peer": true,
|
|
3700
3697
|
"bin": {
|
|
3701
3698
|
"tsc": "bin/tsc",
|
|
3702
3699
|
"tsserver": "bin/tsserver"
|
|
@@ -3837,6 +3834,22 @@
|
|
|
3837
3834
|
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
|
3838
3835
|
}
|
|
3839
3836
|
},
|
|
3837
|
+
"node_modules/xml-naming": {
|
|
3838
|
+
"version": "0.1.0",
|
|
3839
|
+
"resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz",
|
|
3840
|
+
"integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==",
|
|
3841
|
+
"dev": true,
|
|
3842
|
+
"funding": [
|
|
3843
|
+
{
|
|
3844
|
+
"type": "github",
|
|
3845
|
+
"url": "https://github.com/sponsors/NaturalIntelligence"
|
|
3846
|
+
}
|
|
3847
|
+
],
|
|
3848
|
+
"license": "MIT",
|
|
3849
|
+
"engines": {
|
|
3850
|
+
"node": ">=16.0.0"
|
|
3851
|
+
}
|
|
3852
|
+
},
|
|
3840
3853
|
"node_modules/y18n": {
|
|
3841
3854
|
"version": "5.0.8",
|
|
3842
3855
|
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aws/ml-container-creator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Generator for SageMaker AI BYOC paradigm for predictive inference use-cases.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/app.js",
|
|
@@ -19,25 +19,23 @@
|
|
|
19
19
|
"bin/",
|
|
20
20
|
"src/",
|
|
21
21
|
"templates/",
|
|
22
|
-
"servers/
|
|
22
|
+
"servers/lib/catalogs/",
|
|
23
23
|
"servers/base-image-picker/index.js",
|
|
24
24
|
"servers/base-image-picker/manifest.json",
|
|
25
25
|
"servers/base-image-picker/package.json",
|
|
26
|
-
"servers/instance-recommender/catalogs/",
|
|
27
|
-
"servers/instance-recommender/index.js",
|
|
28
|
-
"servers/instance-recommender/manifest.json",
|
|
29
|
-
"servers/instance-recommender/package.json",
|
|
30
|
-
"servers/model-picker/catalogs/",
|
|
31
26
|
"servers/model-picker/index.js",
|
|
32
27
|
"servers/model-picker/manifest.json",
|
|
33
28
|
"servers/model-picker/package.json",
|
|
34
|
-
"servers/region-picker/catalogs/",
|
|
35
29
|
"servers/region-picker/index.js",
|
|
36
30
|
"servers/region-picker/manifest.json",
|
|
37
31
|
"servers/region-picker/package.json",
|
|
38
32
|
"servers/hyperpod-cluster-picker/index.js",
|
|
39
33
|
"servers/hyperpod-cluster-picker/manifest.json",
|
|
40
34
|
"servers/hyperpod-cluster-picker/package.json",
|
|
35
|
+
"servers/instance-sizer/lib/",
|
|
36
|
+
"servers/instance-sizer/index.js",
|
|
37
|
+
"servers/instance-sizer/manifest.json",
|
|
38
|
+
"servers/instance-sizer/package.json",
|
|
41
39
|
"servers/lib/bedrock-client.js",
|
|
42
40
|
"servers/lib/custom-validators.js",
|
|
43
41
|
"servers/lib/dynamic-resolver.js",
|
|
@@ -91,6 +89,7 @@
|
|
|
91
89
|
"dev": "npm link && ml-container-creator",
|
|
92
90
|
"clean": "rm -rf test-output-*",
|
|
93
91
|
"validate": "npm run lint && npm run test:all",
|
|
92
|
+
"validate:catalogs": "node scripts/validate-catalog-enums.js",
|
|
94
93
|
"validate:namespaces": "node scripts/validate-namespaces.js",
|
|
95
94
|
"docs:serve": "mkdocs serve",
|
|
96
95
|
"docs:build": "mkdocs build",
|
|
@@ -104,9 +104,9 @@ let PYTHON_SLIM_CATALOG
|
|
|
104
104
|
let TRITON_IMAGE_CATALOG
|
|
105
105
|
|
|
106
106
|
try {
|
|
107
|
-
TRANSFORMER_IMAGE_CATALOG = loadCatalog('
|
|
108
|
-
PYTHON_SLIM_CATALOG = loadCatalog('
|
|
109
|
-
TRITON_IMAGE_CATALOG = loadCatalog('
|
|
107
|
+
TRANSFORMER_IMAGE_CATALOG = loadCatalog('../lib/catalogs/model-servers.json')
|
|
108
|
+
PYTHON_SLIM_CATALOG = loadCatalog('../lib/catalogs/python-slim.json')
|
|
109
|
+
TRITON_IMAGE_CATALOG = loadCatalog('../lib/catalogs/triton.json')
|
|
110
110
|
} catch (err) {
|
|
111
111
|
process.stderr.write(`[base-image-picker] Fatal: ${err.message}\n`)
|
|
112
112
|
process.exit(1)
|
|
@@ -8,8 +8,10 @@
|
|
|
8
8
|
"discover": true
|
|
9
9
|
},
|
|
10
10
|
"catalogs": {
|
|
11
|
-
"model-servers": "
|
|
12
|
-
"python-slim": "
|
|
11
|
+
"model-servers": "../lib/catalogs/model-servers.json",
|
|
12
|
+
"python-slim": "../lib/catalogs/python-slim.json",
|
|
13
|
+
"triton": "../lib/catalogs/triton.json",
|
|
14
|
+
"triton-backends": "../lib/catalogs/triton-backends.json"
|
|
13
15
|
},
|
|
14
16
|
"tool": {
|
|
15
17
|
"name": "get_base_images"
|