Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
13 changes: 13 additions & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,19 @@ module.exports = {
rules: {
'property-test-rules/no-hardcoded-numruns': 'error'
}
},
{
// Module-header convention (docs/architecture/module-header-convention.md).
// WARNING during the consolidation program (Waves 1-8); promoted to
// 'error' in Wave 9 once every pattern-participating module conforms.
// Scope expands wave by wave; starts at the shared MCP server libs
// (Wave 2 factory lands here). Test files are excluded.
files: ['servers/lib/**/*.js'],
excludedFiles: ['**/*.test.js'],
plugins: ['property-test-rules'],
rules: {
'property-test-rules/require-module-header': 'warn'
}
}
],
ignorePatterns: [
Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ jobs:
if: matrix.node-version == '24.x'
run: node scripts/validate-servers.js

# MCP-server unit suites (servers/*/test/*.test.js). These use a custom
# node:assert harness (not mocha) and were previously orphaned from CI.
# Now a blocking gate — the runner (scripts/run-server-tests.js) discovers
# every suite by glob and exits non-zero if any fail.
- name: MCP server unit tests
if: matrix.node-version == '24.x'
run: npm run test:servers:unit

- name: Python tests
if: matrix.node-version == '24.x'
run: |
Expand All @@ -74,6 +82,10 @@ jobs:
if: matrix.node-version == '24.x'
run: node scripts/schema-template-coverage.js --strict

- name: Validate serve-engine manifests
if: matrix.node-version == '24.x'
run: node scripts/validate-serve-manifests.js

integration:
name: Integration
runs-on: ubuntu-latest
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,9 @@ infra/bootstrap-modules/.hyperpod-helm-cache/
docs/dev/*-pr-summary.md
docs/dev/*-pr-description.md
docs/dev/v*-release-notes.md

# MLflow local tracking store (created when logging without a remote MLFLOW_TRACKING_URI)
mlruns/
mlflow.db
mlflow.db-journal
mlflow.db-wal
11 changes: 10 additions & 1 deletion .husky/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,19 @@ fi
# 1. Lint staged JS files (fast — only changed files)
npx lint-staged

# 2. Python syntax check on staged .py files in templates/do/lib/python/
# 2. Python syntax check on staged .py files.
# Skips EJS templates (files containing <% %> tags, e.g.
# templates/deploy_notebook_generator.py and templates/code/*.py): those are
# only valid Python AFTER the generator renders them, so ast.parse on the raw
# template is a false positive. Real runtime Python (templates/do/lib/python/,
# scripts/, servers/) has no EJS tags and is still checked.
STAGED_PY=$(git diff --cached --name-only --diff-filter=ACM | grep '\.py$' || true)
if [ -n "$STAGED_PY" ]; then
for pyfile in $STAGED_PY; do
# Skip EJS templates — they are not raw Python until rendered.
if grep -q '<%' "$pyfile" 2>/dev/null; then
continue
fi
if ! python3 -c "import ast; ast.parse(open('$pyfile').read())" 2>/dev/null; then
echo "❌ Python syntax error in: $pyfile"
exit 1
Expand Down
3 changes: 2 additions & 1 deletion bin/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ program.configureHelp({
' ./do/deploy && ./do/test',
'',
' # 4. Benchmark performance',
' ./do/benchmark --workload multi_turn_chat',
' ./do/benchmark --workload multi-turn-chat',
'',
helper.styleTitle('All generation options:'),
''
Expand Down Expand Up @@ -243,6 +243,7 @@ program
.option('--non-interactive', 'Run without prompts (requires --profile and --region)')
.option('--name <name>', 'Bootstrap profile name (default: "default")')
.option('--with <modules>', 'Comma-separated modules to provision (non-interactive; default: core,registry)')
.option('--module <name>', 'Redeploy only the named module\'s CDK stack (for update)')
.option('--force', 'Force removal without confirmation')
.option('--dry-run', 'Preview module changes (stacks, resources, profile updates) without provisioning or destroying anything')
.option('--verify', 'Verify resources exist (for status)')
Expand Down
92 changes: 72 additions & 20 deletions config/parameter-schema-v2.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,15 @@
"transformers-tensorrt-llm",
"transformers-lmi",
"transformers-djl",
"transformers-llama-cpp",
"triton-fil",
"triton-onnxruntime",
"triton-tensorflow",
"triton-pytorch",
"triton-vllm",
"triton-tensorrtllm",
"triton-python",
"diffusors-vllm-omni",
"marketplace"
"diffusors-vllm-omni"
]
},
"phase": "model",
Expand All @@ -91,7 +91,7 @@
},
"modelName": {
"type": "string",
"description": "Model identifier (hf-org/model, s3://..., registry://..., marketplace://...)",
"description": "Model identifier (hf-org/model, s3://..., registry://...)",
"cliFlag": "--model-name",
"cliArgName": "name",
"envVar": "ML_MODEL_NAME",
Expand Down Expand Up @@ -127,7 +127,7 @@
},
"deploymentTarget": {
"type": "enum",
"description": "Deployment target (managed-inference, async-inference, batch-transform, hyperpod-eks)",
"description": "Deployment target (managed-inference, async-inference, batch-transform, hyperpod-eks, eks)",
"cliFlag": "--deployment-target",
"cliArgName": "target",
"envVar": "ML_DEPLOYMENT_TARGET",
Expand All @@ -140,7 +140,8 @@
"realtime-inference",
"async-inference",
"batch-transform",
"hyperpod-eks"
"hyperpod-eks",
"eks"
]
},
"phase": "infrastructure",
Expand Down Expand Up @@ -193,7 +194,7 @@
"prompt": {
"message": "Instance type?",
"type": "input",
"when": "deploymentTarget !== 'hyperpod-eks'"
"when": "deploymentTarget !== 'hyperpod-eks' && deploymentTarget !== 'eks'"
},
"deprecated": false,
"since": "0.1.0"
Expand Down Expand Up @@ -317,7 +318,11 @@
"group": "lora",
"appliesTo": {
"deploymentTargets": [
"managed-inference"
"managed-inference",
"hyperpod-eks",
"async-inference",
"batch-transform",
"eks"
],
"architectures": [
"transformers"
Expand Down Expand Up @@ -356,7 +361,11 @@
"group": "lora",
"appliesTo": {
"deploymentTargets": [
"managed-inference"
"managed-inference",
"hyperpod-eks",
"async-inference",
"batch-transform",
"eks"
],
"architectures": [
"transformers"
Expand Down Expand Up @@ -395,7 +404,11 @@
"group": "lora",
"appliesTo": {
"deploymentTargets": [
"managed-inference"
"managed-inference",
"hyperpod-eks",
"async-inference",
"batch-transform",
"eks"
],
"architectures": [
"transformers"
Expand Down Expand Up @@ -1708,7 +1721,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand All @@ -1718,7 +1732,7 @@
"prompt": {
"message": "HyperPod cluster name?",
"type": "input",
"when": "deploymentTarget === 'hyperpod-eks'"
"when": "deploymentTarget === 'hyperpod-eks' || deploymentTarget === 'eks'"
},
"deprecated": false,
"since": "0.4.0"
Expand All @@ -1737,7 +1751,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand All @@ -1764,7 +1779,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand All @@ -1789,7 +1805,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand Down Expand Up @@ -1817,7 +1834,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand All @@ -1842,7 +1860,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand All @@ -1867,7 +1886,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand All @@ -1892,7 +1912,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand All @@ -1917,7 +1938,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand All @@ -1942,7 +1964,8 @@
"group": "hyperpod",
"appliesTo": {
"deploymentTargets": [
"hyperpod-eks"
"hyperpod-eks",
"eks"
],
"architectures": [
"*"
Expand Down Expand Up @@ -2040,6 +2063,35 @@
"deprecated": false,
"since": "0.12.0"
},
"engineFeature": {
"type": "string",
"description": "Enable an engine-specific feature declared in the selected engine's serve plugin (engine_features). Form NAME=VALUE, repeatable (e.g. radix_attention=true for SGLang, rolling_batch_backend=vllm for LMI). Resolved to the engine's real env var and validated against the manifest.",
"cliFlag": "--engine-feature",
"cliArgName": "NAME=VALUE",
"envVar": null,
"templateVar": null,
"configKey": "engineFeature",
"default": [],
"validation": {},
"phase": "features",
"group": "model",
"appliesTo": {
"deploymentTargets": [
"*"
],
"architectures": [
"*"
]
},
"widget": {
"section": "env-vars",
"inputType": "repeatable-kv"
},
"prompt": null,
"repeatable": true,
"deprecated": false,
"since": "1.8.0"
},
"includeSample": {
"type": "boolean",
"description": "Include sample model code",
Expand Down
Loading
Loading