
Model Deployment
- 121 installs
- 850 repo stars
- Updated August 3, 2026
- awslabs/agent-plugins
model-deployment is a Claude skill that generates code to deploy LoRA fine-tuned Nova or OSS models from SageMaker Serverless Model Customization to a SageMaker endpoint or Bedrock.
About
This skill generates code to deploy fine-tuned models from SageMaker Serverless Model Customization to a SageMaker endpoint or Bedrock. It identifies the model type (Nova vs OSS), lets the user choose a deployment target, displays the license, and generates the deployment code. A developer uses it when they want to make a LoRA fine-tuned model available for inference.
- Deploys fine-tuned Nova and OSS models from SageMaker Serverless Model Customization
- Identifies the correct pathway and targets: SageMaker endpoint or Bedrock
- Generates deployment code and handles endpoint configuration and license display
Model Deployment by the numbers
- 121 all-time installs (skills.sh)
- Ranked #765 of 2,064 Data Science & ML skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
model-deployment capabilities & compatibility
- Capabilities
- model evaluation · finetuning technique · model selection
- Works with
- aws
- Use cases
- devops · orchestration
What model-deployment says it does
Generates code that deploys fine-tuned models from SageMaker Serverless Model Customization to SageMaker endpoints or Bedrock.
Full Fine-Tuning (FFT) — only LoRA fine-tuned models are supported
npx skills add https://github.com/awslabs/agent-plugins --skill model-deploymentAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 121 |
|---|---|
| repo stars | ★ 850 |
| Last updated | August 3, 2026 |
| Repository | awslabs/agent-plugins ↗ |
What it does
Deploy a LoRA fine-tuned Nova or OSS model to a SageMaker endpoint or Bedrock.
Who is it for?
Developers deploying a LoRA fine-tuned Nova or OSS model for inference
Skip if: Base models, non-SageMaker fine-tuning, or full fine-tuned (FFT) models
When should I use this skill?
User says deploy my model, create an endpoint, or asks about deployment options
What you get
Generated deployment code plus a running SageMaker endpoint or Bedrock deployment for the model.
- Deployment code
- A configured SageMaker endpoint or Bedrock deployment
- Post-deployment summary with invoke code and cost
By the numbers
- 6-step deployment workflow
- 2 deployment targets (SageMaker, Bedrock)
Files
Model Deployment
Identifies the correct deployment pathway based on model characteristics and generates deployment code.
Scope
This skill supports deploying Nova and OSS models that were fine-tuned through SageMaker Serverless Model Customization only.
Not supported:
- Base models (not fine-tuned)
- Models fine-tuned through other processes
- Full Fine-Tuning (FFT) — only LoRA fine-tuned models are supported
Prerequisites
- The SDK environment has been verified (SDK version, region, execution role). If not done, activate the
sdk-getting-startedskill first.
---
Principles
1. One thing at a time. Each response advances exactly one decision. 2. Confirm before proceeding. Wait for the user to agree before moving on. But don't re-ask questions already answered in the conversation — use what you know. 3. Don't read files until you need them. Only read pathway references after the pathway is confirmed. 4. Use what you know. If conversation history or artifacts already answer a question, confirm your understanding instead of asking again.
Workflow
Step 1: Identify the Training Job
You need the training job name or ARN. Check the conversation history first — the user may have already mentioned it, or it may be available from earlier steps in the workflow (e.g., fine-tuning). If not, ask the user.
Once you have the training job name or ARN, use the AWS MCP tool to look it up:
1. Use the AWS MCP tool describe-training-job and extract:
- S3 output path (from
ModelArtifacts.S3ModelArtifactsorOutputDataConfig.S3OutputPath) - IAM role ARN (from
RoleArn) - Region
2. Use the AWS MCP tool list-tags on the training job ARN and extract:
- Model ID from the
sagemaker-studio:jumpstart-model-idtag
3. Determine the model type from the model ID:
- Contains "nova" (nova-micro, nova-lite, nova-pro) → Nova
- Llama, Mistral, Qwen, GPT-OSS, DeepSeek, etc. → OSS
Unsupported models: This skill only supports OSS and Nova models that were LoRA fine-tuned through SageMaker Serverless Model Customization. If the model doesn't match, tell the user this skill can't help and suggest the finetuning skill.
Step 2: Determine Eligible Deployment Targets
Use the following table:
| Model Type | Eligible Targets |
|---|---|
| OSS | SageMaker, Bedrock |
| Nova | SageMaker, Bedrock |
If only one target is eligible, confirm it with the user. Use details from Step 5.
If multiple targets are eligible, help the user decide. Use details from Step 5.
If no targets are eligible, tell the user and explain why.
Step 3: Let the User Choose a Deployment Target
Present the eligible options to the user. Present these details to help them decide between SageMaker and Bedrock, if both are available options:
SageMaker Endpoint:
- Dedicated compute resources for consistent performance
- Control instance types and scaling
- Best for predictable workloads with specific latency requirements
Bedrock:
- Fully managed serverless inference
- Auto-scales instantly with no capacity planning
- Pay per request
- Best for variable workloads with fluctuating demand
Do NOT make a recommendation. Let the user choose.
Do NOT mention technical details like merged/unmerged weights, reference files, or APIs, unless the user asks.
⏸ Wait for user to select a deployment option.
Step 4: Display License Agreement
Before proceeding to deployment, display the model's license or service terms to the user.
1. Read references/model-licenses.md and look up the model by its model ID (determined in Step 1). 2. Follow the instructions in the Notes column — use the exact phrasing provided. 3. If the model ID is not found in the table, warn the user that you could not find license information for their model and recommend they verify the license independently before proceeding.
⏸ Wait for the user to confirm before proceeding.
Step 5: Follow Pathway Workflow
Read the reference file for the selected pathway and follow its instructions.
| Model Type | Deployment Target | Reference |
|---|---|---|
| OSS | SageMaker | references/deploy-oss-sagemaker.md |
| OSS | Bedrock | references/deploy-oss-bedrock.md |
| Nova | SageMaker | references/deploy-nova-sagemaker.md |
| Nova | Bedrock | references/deploy-nova-bedrock.md |
Step 6: Post-Deployment Summary
After deployment completes, provide the user with a summary. Cover these topics, using details from the pathway reference doc you followed in Step 5:
- What was deployed — endpoint or model name, ARN, status
- How to use it — sample invoke code for the specific deployment target
- Cost — billing model (instance-based vs. pay-per-request) and what to expect
- Cleanup — how to delete the endpoint or model when done
Troubleshooting
How to check if a model was LoRA or FFT fine-tuned
If deployment fails unexpectedly, the model may have been full fine-tuned (FFT) rather than LoRA. To check, download the training job's hydra config from its S3 output path at .hydra/config.yaml:
peft_configpopulated (r, alpha, dropout, etc.) → LoRA (supported)peft_config: null→ FFT (not supported by this skill)
# Cell 0 [markdown]: Model Deployment — Bedrock
# Cell 1: Setup
%pip install --upgrade sagemaker>=3.7.1 --quiet # NOTEBOOK_ONLY
# Cell 2: Configuration
import os
import json
import boto3
os.environ["AWS_DEFAULT_REGION"] = "[REGION]"
from sagemaker.core.resources import TrainingJob
from sagemaker.serve.bedrock_model_builder import BedrockModelBuilder
from sagemaker.core import Attribution, set_attribution
from pprint import pprint
set_attribution(Attribution.SAGEMAKER_AGENT_PLUGIN)
REGION = "[REGION]"
TRAINING_JOB_NAME = "[TRAINING_JOB_NAME]"
ROLE_ARN = "[ROLE_ARN]"
CUSTOM_MODEL_NAME = "[CUSTOM_MODEL_NAME]"
# Cell 3: Build and Deploy to Bedrock
training_job = TrainingJob.get(training_job_name=TRAINING_JOB_NAME)
print(f"Training job status: {training_job.training_job_status}")
bedrock_builder = BedrockModelBuilder(model=training_job)
deployment_result = bedrock_builder.deploy(
role_arn=ROLE_ARN,
custom_model_name=CUSTOM_MODEL_NAME,
)
deployment_arn = deployment_result["customModelDeploymentArn"]
pprint(f"Deployment Result: {deployment_result}")
# Cell 4: Test Inference
bedrock_runtime = boto3.client("bedrock-runtime", region_name=REGION)
message = "What is the capital of France?"
print(f"Model Inference Message: {message}")
resp = bedrock_runtime.converse(
modelId=deployment_arn,
messages=[{"role": "user", "content": [{"text": message}]}],
inferenceConfig={"maxTokens": 100, "temperature": 0.7},
)
response_str = resp["output"]["message"]["content"][0]["text"]
print(f"Model Response: {response_str}")
# Save manifest
from pathlib import Path
manifest_dir = Path("[PROJECT_DIR]") / "manifests"
manifest_dir.mkdir(parents=True, exist_ok=True)
manifest_path = manifest_dir / f"deploy-{CUSTOM_MODEL_NAME}.json"
manifest_path.write_text(json.dumps({
"custom_model_name": CUSTOM_MODEL_NAME,
}, indent=2))
print(f"Manifest saved: {manifest_path}")
# Cell 0 [markdown]: Model Deployment — SageMaker
# Cell 1: Setup
%pip install --upgrade sagemaker>=3.7.1 --quiet # NOTEBOOK_ONLY
# Cell 2: Configuration
import os
import json
os.environ["AWS_DEFAULT_REGION"] = "[REGION]"
from sagemaker.core.resources import TrainingJob
from sagemaker.serve import ModelBuilder
from sagemaker.core import Attribution, set_attribution
set_attribution(Attribution.SAGEMAKER_AGENT_PLUGIN)
TRAINING_JOB_NAME = "[TRAINING_JOB_NAME]"
ROLE_ARN = "[ROLE_ARN]"
INSTANCE_TYPE = "[INSTANCE_TYPE]"
ENDPOINT_NAME = "[ENDPOINT_NAME]"
# Cell 3: Build Model
training_job = TrainingJob.get(training_job_name=TRAINING_JOB_NAME)
print(f"Training job: {training_job.training_job_name}")
model_builder = ModelBuilder(
model=training_job,
role_arn=ROLE_ARN,
instance_type=INSTANCE_TYPE,
)
model = model_builder.build()
print(f"Model: {model.model_name}")
print(f"Image: {model_builder.image_uri}")
print(f"Env vars: {model_builder.env_vars}")
# Cell 4: Deploy Endpoint
endpoint = model_builder.deploy(endpoint_name=ENDPOINT_NAME)
print(f"Endpoint: {endpoint.endpoint_name}")
print(f"Status: {endpoint.endpoint_status}")
# Cell 5: Test Inference
output = endpoint.invoke(
body=json.dumps({
"messages": [{"role": "user", "content": "What is the capital of France?"}],
"max_tokens": 50,
}),
content_type="application/json",
)
print(f"Response: {json.loads(output.body.read())}")
# Save manifest
from pathlib import Path
manifest_dir = Path("[PROJECT_DIR]") / "manifests"
manifest_dir.mkdir(parents=True, exist_ok=True)
manifest_path = manifest_dir / f"deploy-{ENDPOINT_NAME}.json"
manifest_path.write_text(json.dumps({
"endpoint_name": ENDPOINT_NAME,
}, indent=2))
print(f"Manifest saved: {manifest_path}")
# Cell 0 [markdown]: Model Deployment — Bedrock
# Cell 1: Setup
%pip install --upgrade sagemaker>=3.7.1 --quiet # NOTEBOOK_ONLY
# Cell 2: Configuration
import boto3
import json
import time
from sagemaker.serve.bedrock_model_builder import BedrockModelBuilder
from sagemaker.core.resources import TrainingJob
from sagemaker.core import Attribution, set_attribution
set_attribution(Attribution.SAGEMAKER_AGENT_PLUGIN)
REGION = "[REGION]"
TRAINING_JOB_NAME = "[TRAINING_JOB_NAME]"
ROLE_ARN = "[ROLE_ARN]"
MODEL_NAME = "[MODEL_NAME]"
sm = boto3.client("sagemaker", region_name=REGION)
s3 = boto3.client("s3", region_name=REGION)
# Cell 3: Flatten S3 Structure and Start Import
# BedrockModelBuilder passes the root model artifacts path to Bedrock CMI,
# but Bedrock expects config.json at the root of the URI. This cell copies
# files from checkpoints/hf_merged/ to the model artifacts root (server-side).
tj = sm.describe_training_job(TrainingJobName=TRAINING_JOB_NAME)
root = tj["ModelArtifacts"]["S3ModelArtifacts"]
parts = root.replace("s3://", "").split("/", 1)
bucket, root_prefix = parts[0], parts[1].rstrip("/") + "/"
hf_prefix = root_prefix + "checkpoints/hf_merged/"
resp = s3.list_objects_v2(Bucket=bucket, Prefix=root_prefix + "config.json", MaxKeys=1)
if resp.get("KeyCount", 0) > 0:
print("Files already at root, skipping copy")
else:
paginator = s3.get_paginator("list_objects_v2")
copied = 0
for page in paginator.paginate(Bucket=bucket, Prefix=hf_prefix):
for obj in page.get("Contents", []):
filename = obj["Key"].replace(hf_prefix, "")
if not filename or filename.endswith("/"):
continue
s3.copy_object(
Bucket=bucket,
CopySource={"Bucket": bucket, "Key": obj["Key"]},
Key=root_prefix + filename,
)
copied += 1
print(f"Copied {copied} files to root")
training_job = TrainingJob.get(training_job_name=TRAINING_JOB_NAME, region=REGION)
builder = BedrockModelBuilder(model=training_job)
result = builder.deploy(
job_name=MODEL_NAME,
imported_model_name=MODEL_NAME,
role_arn=ROLE_ARN,
)
job_arn = result["jobArn"]
print(f"Import job created: {job_arn}")
# Cell 4: Wait for Import to Complete
bedrock = boto3.client("bedrock", region_name=REGION)
while True:
resp = bedrock.get_model_import_job(jobIdentifier=job_arn)
status = resp["status"]
print(f"Status: {status}")
if status == "Completed":
model_arn = resp["importedModelArn"]
print(f"\nModel imported successfully!")
print(f"Model ARN: {model_arn}")
break
elif status in ("Failed", "Stopped"):
raise RuntimeError(f"Import {status}: {resp.get('failureMessage', 'Unknown error')}")
time.sleep(30)
# Cell 5: Test Inference
print("Testing inference (model may need a few minutes to warm up)...")
bedrock_runtime = boto3.client("bedrock-runtime", region_name=REGION)
for attempt in range(1, 25):
try:
response = bedrock_runtime.invoke_model(
modelId=model_arn,
body=json.dumps({
"prompt": "What is the capital of France?",
"max_gen_len": 50,
"temperature": 0.7,
}),
)
result = json.loads(response["body"].read())
print(f"Response: {json.dumps(result)[:300]}")
break
except bedrock_runtime.exceptions.ModelNotReadyException:
print(f" Attempt {attempt}: Model not ready, waiting 30s...")
time.sleep(30)
else:
print("Model did not become ready after 12 minutes.")
# Save manifest
from pathlib import Path
manifest_dir = Path("[PROJECT_DIR]") / "manifests"
manifest_dir.mkdir(parents=True, exist_ok=True)
manifest_path = manifest_dir / f"deploy-{TRAINING_JOB_NAME}.json"
manifest_path.write_text(json.dumps({
"model_id": model_arn,
}, indent=2))
print(f"Manifest saved: {manifest_path}")
# Cell 0 [markdown]: Model Deployment — SageMaker
# Cell 1: Setup
%pip install --upgrade sagemaker>=3.7.1 --quiet # NOTEBOOK_ONLY
# Cell 2: Configuration
import os
import json
os.environ["AWS_DEFAULT_REGION"] = "[REGION]"
from sagemaker.core.resources import TrainingJob
from sagemaker.serve import ModelBuilder
from sagemaker.core import Attribution, set_attribution
set_attribution(Attribution.SAGEMAKER_AGENT_PLUGIN)
TRAINING_JOB_NAME = "[TRAINING_JOB_NAME]"
ROLE_ARN = "[ROLE_ARN]"
INSTANCE_TYPE = "[INSTANCE_TYPE]"
ENDPOINT_NAME = "[ENDPOINT_NAME]"
ADAPTER_IC_NAME = f"{ENDPOINT_NAME}-adapter"
ACCEPT_EULA = [ACCEPT_EULA] # True if user accepted the license in Step 4, False otherwise
# Cell 3: Build Model
training_job = TrainingJob.get(training_job_name=TRAINING_JOB_NAME)
print(f"Training job: {training_job.training_job_name}")
print(f"Model package: {training_job.output_model_package_arn}")
model_builder = ModelBuilder(
model=training_job,
role_arn=ROLE_ARN,
instance_type=INSTANCE_TYPE,
)
model_builder.accept_eula = ACCEPT_EULA
model = model_builder.build(model_name=ENDPOINT_NAME)
print(f"Model: {model.model_arn}")
# Cell 4: Deploy Endpoint
endpoint = model_builder.deploy(
endpoint_name=ENDPOINT_NAME,
inference_component_name=ADAPTER_IC_NAME,
)
print(f"Endpoint: {endpoint.endpoint_name}")
# Cell 5: Test Inference
output = endpoint.invoke(
body=json.dumps({
"inputs": "What is the capital of France?",
"parameters": {"max_new_tokens": 50},
}),
inference_component_name=ADAPTER_IC_NAME,
)
print(f"Response: {output.body.read()}")
# Save manifest
from pathlib import Path
manifest_dir = Path("[PROJECT_DIR]") / "manifests"
manifest_dir.mkdir(parents=True, exist_ok=True)
manifest_path = manifest_dir / f"deploy-{ENDPOINT_NAME}.json"
manifest_path.write_text(json.dumps({
"endpoint_name": ENDPOINT_NAME,
}, indent=2))
print(f"Manifest saved: {manifest_path}")
Code Output Guide
Mode Selection
Ask the user once before generating code: "Would you like me to generate a Jupyter notebook or a Python script?"
If the output format has already been decided in the conversation context, keep consistent — do not re-ask.
Shared Rules (Both Modes)
- Use EXACTLY the imports shown in each code template — do not add extras
- Replace
[PLACEHOLDER]values with user-specific configuration - Include
set_attribution(Attribution.SAGEMAKER_AGENT_PLUGIN)in the setup cell/section
Reading Code Templates
Templates use # Cell N: Label markers to delimit sections. # NOTEBOOK_ONLY skips a line in script mode; # NOTEBOOK_ONLY_SECTION on a # Cell N: line skips the entire section.
Notebook Mode
Write a .ipynb file in <project-dir>/notebooks/.
Naming and appending:
- Notebook path:
<project-dir>/notebooks/<project-name>.ipynb - If the notebook already exists → ask: _"Would you like me to append cells to the existing notebook, or create a new one?"_
- If it doesn't exist → create it
- When appending, use the template's
# Cell 0 [markdown]:cell as the section divider before the new cells
Formatting:
- Use your file write tool to create the complete notebook JSON, OR use notebook MCP tools (
create_notebook,add_cell) if available - Do NOT use bash commands, shell scripts, or
echo/catpiping - 2-space JSON indentation
- Each source line is a separate string ending with
\n(except the last) - Escape quotes:
\" - No trailing commas
Structure:
- Wrap cells in
{"cells": [...], "metadata": {...}, "nbformat": 4, "nbformat_minor": 4} - Code cells:
cell_type,execution_count: null,metadata: {},outputs: [],source: [...] - Markdown cells:
cell_type: "markdown", noexecution_countoroutputs # Cell 0 [markdown]:becomes a markdown cell; all others become code cells
Execution:
- If notebook execution tools are available (e.g.,
run_cellMCP), offer to run cells for the user. If not available, tell the user to run cells themselves. - Do NOT use bash commands or inline scripts to execute notebook cells.
Script Mode
Write a numbered .py file in <project-dir>/scripts/.
Naming:
- Format:
NN_<descriptive_name>.py(e.g.,01_sft_finetuning.py) — use the next available number in<project-dir>/scripts/
Formatting:
- Plain Python file, standard text
- Use
# %%cell markers to preserve logical sections (IDE-compatible) - Include a docstring at the top describing what the script does
# Cell 0 [markdown]:→ a comment block or docstring
Dependencies:
- Install any required pip packages directly (e.g.,
pip install sagemaker>=3.7.1) before writing or running the script. Do not embed install commands in the script itself.
Execution:
- Run the script using standard Python execution (
python3 <script>.py).
Resumption After Interruption
If the conversation was interrupted while a job was running (e.g., context compaction, user stopped and restarted, connection drop), do NOT re-run the script. Instead, check for an existing job by name or ARN from the conversation context or PLAN.md, and monitor its status rather than launching a duplicate.
Deploy Nova LoRA to Bedrock (PySDK BedrockModelBuilder)
Scenario
- Model Type: Nova
- Fine-tuning Method: LoRA
- Deployment Target: Bedrock Custom Model
- Approach: SageMaker PySdk
BedrockModelBuilder
Overview
Uses the SageMaker PySdk BedrockModelBuilder to deploy a Nova fine-tuned LoRA model to Bedrock as a Custom Model. The builder auto-detects Nova models and calls CreateCustomModel.
Required inputs (collected in the steps below):
- Training job name
- Custom model name
- IAM role ARN
- AWS region
Prerequisites
Requires SageMaker Python SDK >= 3.7.0 with BedrockModelBuilder Nova support (installed by Cell 1).
Workflow
Important Instructions
- Make sure to use dedicated tools instead of bash commands whenever possible
Step 1: Gather Training Job Name
The training job name was identified in Step 1 of the main workflow. Confirm you have it.
Step 2: Gather Custom Model Name
For this step, you need: a name for the deployed custom model.
Suggest a name based on the training job or use case, e.g., nova-micro-bedrock-<timestamp>. Ask the user to confirm or provide their own.
⏸ Wait for user before moving on.
Step 3: Verify IAM Role
Use the IAM role from the training job (extracted in Step 1 of the main workflow via describe-training-job). We'll assume this role has the necessary permissions for Bedrock deployment.
Step 4: Confirm Region
The region was identified in Step 1 of the main workflow. Nova → Bedrock deployment is currently only supported in us-east-1. If the training job is in a different region, tell the user that Bedrock deployment is not supported for this model in this region.
Step 5: Confirm Configuration
"Here's the deployment setup:
>
- Deployment target: Bedrock (Custom Model)
- Training Job: [job-name]
- Custom Model Name: [name]
- IAM Role: [arn]
- Region: us-east-1
>
Does this look right?"
⏸ Wait for user approval.
Step 6: Generate Code
Read ../references/code_output_guide.md for output format rules.
If a project directory already exists (from earlier in the workflow), use it. Otherwise, activate the directory-management skill to set one up.
⏸ Wait for user.
Code Structure
Markdown Header
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deploy Nova to Bedrock"
]
}Cells
Each cell's content comes from ../code_templates/deploy-nova-bedrock.py, split on the # Cell N: comments. Each marker starts a new notebook cell — everything between one marker and the next becomes that cell's content.
- Cell 1: Setup (pip install)
- Cell 2: Configuration (env vars, imports, placeholders)
- Cell 3: Build and Deploy to Bedrock (blocks until deployment is Active)
- Cell 4: Test Inference
Placeholders
Cell 2:
[REGION]→ AWS region (us-east-1)[TRAINING_JOB_NAME]→ SageMaker training job name[ROLE_ARN]→ IAM role ARN[CUSTOM_MODEL_NAME]→ Name for the custom model
All other cells have no placeholders.
Step 7: Provide Run Instructions
To run:
1. Cell 1 — install SDK packages
2. Cell 2 — set configuration values
3. Cell 3 — creates custom model via BedrockModelBuilder and deploys (blocks until Active)
4. Cell 4 — test inference with a sample prompt via Converse APICommon Issues
- "ServiceQuotaExceededException: The number of custom models in Creating status has reached the quota limit": Too many concurrent model creations. Wait for in-progress models to finish, or delete old custom models.
- "No module named 'sagemaker.serve.bedrock_model_builder'": Re-run Cell 1 to install the required packages, then restart the kernel.
- "Access denied to S3": Add S3 read permissions to the IAM role for the model artifacts bucket.
- "Provided IAM role could not be assumed": Ensure role has trust policy for
bedrock.amazonaws.com. - Deployment status "Failed": Check CloudTrail for the
CreateCustomModelevent to see the failure reason.
Deploy Nova LoRA to SageMaker
Scenario
- Model Type: Nova
- Fine-tuning Method: LoRA
- Deployment Target: SageMaker Single Model Endpoint
- Approach: SageMaker ModelBuilder
Overview
Deploys a Nova fine-tuned model to a SageMaker endpoint using ModelBuilder.
Nova deploys as a model-on-variant (no inference components), so you invoke the endpoint directly without specifying an InferenceComponentName.
Required inputs (collected in the steps below):
- Training job name
- Instance type
- IAM execution role ARN
- AWS region
- Endpoint name
Prerequisites
Requires SageMaker Python SDK >= 3.7.0 (installed by Cell 1).
Workflow
Important Instructions
- Make sure to use dedicated tools instead of bash commands whenever possible
Step 1: Gather Training Job Name
The training job name was identified in Step 1 of the main workflow. Confirm you have it.
Step 2: Determine Instance Type
For this step, you need: the instance type.
First, determine the Nova variant from the training job's model package. Use your AWS tool to run sagemaker describe-training-job for the training job name and extract the OutputModelPackageArn from the response. Then inspect the model package to find the hub_content_name (e.g., nova-textgeneration-micro).
Supported instances by Nova variant (smallest to largest). Larger instances support longer context lengths.
Nova Micro (nova-textgeneration-micro): ml.g5.12xlarge, ml.g5.24xlarge, ml.g6.12xlarge, ml.g6.24xlarge, ml.g6.48xlarge, ml.p5.48xlarge
Nova Lite (nova-textgeneration-lite): ml.g6.48xlarge, ml.p5.48xlarge
Nova Lite v2 (nova-textgeneration-lite-v2): ml.p5.48xlarge
Nova Pro (nova-textgeneration-pro): ml.g6.48xlarge, ml.p5.48xlarge
Present the supported instance types and ask which one the user would like to use. The larger instances will be more expensive, but have larger context windows.
⏸ Wait for user to confirm before moving on.
Step 3: Verify IAM Role
Use the IAM role from the training job (extracted in Step 1 of the main workflow via describe-training-job). This role should already have the necessary SageMaker and S3 permissions. Confirm with the user.
Step 4: Confirm Region
The region was identified in Step 1 of the main workflow. Nova deployment is only supported in: us-east-1, us-west-2, eu-west-2, ap-northeast-1. If the region isn't supported, tell the user that SageMaker deployment is not supported for this model in this region.
Step 5: Choose Endpoint Name
Suggest a name based on the model, e.g., nova-micro-deploy-<timestamp>. Ask the user to confirm or provide their own.
⏸ Wait for user before moving on.
Step 6: Confirm Configuration
"Here's the deployment setup:
>
- Model: [base-model-name] fine-tuned with LoRA (e.g., "Nova Micro fine-tuned with LoRA")
- Deployment target: SageMaker Endpoint
- Training Job: [name]
- Instance Type: [type]
- IAM Role: [arn]
- Region: [region]
- Endpoint Name: [name]
>
Does this look right?"
⏸ Wait for user approval.
Step 7: Generate Code
Read ../references/code_output_guide.md for output format rules.
If a project directory already exists (from earlier in the workflow), use it. Otherwise, activate the directory-management skill to set one up.
⏸ Wait for user.
Code Structure
Markdown Header
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deploy Nova Fine-Tuned Model to SageMaker"
]
}Cells
Each cell's content comes from ../code_templates/deploy-nova-sagemaker.py, split on the # Cell N: comments. Each marker starts a new notebook cell — everything between one marker and the next becomes that cell's content.
- Cell 1: Setup (pip install)
- Cell 2: Configuration
- Cell 3: Build Model
- Cell 4: Deploy Endpoint
- Cell 5: Test Inference
Placeholders
Cell 2:
[REGION]→ AWS region[TRAINING_JOB_NAME]→ Training job name[ROLE_ARN]→ IAM execution role ARN[INSTANCE_TYPE]→ SageMaker instance type (e.g.,ml.g5.12xlarge)[ENDPOINT_NAME]→ Endpoint name
Step 8: Provide Run Instructions
To run:
1. Cell 1 — install SDK packages, then restart the kernel before continuing
2. Cell 2 — set configuration values
3. Cell 3 — build model via ModelBuilder (~30s, creates SageMaker Model resource)
4. Cell 4 — deploy endpoint (waits for InService, ~10-15 min)
5. Cell 5 — test inference with a sample promptCommon Issues
- "No module named 'sagemaker.core'" or "No module named 'sagemaker.train'": Re-run Cell 1 to install the required packages, then restart the kernel.
- "Must setup local AWS configuration with a region": Set
AWS_DEFAULT_REGIONenv var or configure~/.aws/config - "Cannot create already existing endpoint configuration": An endpoint with that name already exists. Use a different name or delete the existing one first.
- Endpoint fails to reach InService: Check CloudWatch logs for the endpoint. Common causes: wrong instance type for the model size, or IAM role missing permissions.
Deploy OSS Merged LoRA to Bedrock CMI
Scenario
- Model Type: OSS (Open Source)
- Fine-tuning Method: LoRA
- Merge Status: Merged (
merge_weights: true) - Deployment Target: Bedrock Custom Model Import (CMI)
- Approach: SageMaker PySdk
BedrockModelBuilder
Overview
Uses the SageMaker PySdk BedrockModelBuilder to import a fine-tuned model into Bedrock as a Custom Model Import (CMI). The builder auto-resolves model artifacts from a training job.
Required inputs (collected in the steps below):
- Training job name
- Model name
- IAM role ARN (with Bedrock trust policy and S3 read access)
- AWS region (must be us-east-1, us-east-2, us-west-2, or eu-central-1)
Prerequisites
Model Size Limit
Bedrock CMI has a 200GB limit for text models (100GB for multimodal). Check before proceeding using the AWS MCP tool list-objects-v2 (S3 service) with the bucket and prefix <prefix>/checkpoints/hf_merged/. Sum the Size field from all returned objects to determine total size. If the model exceeds 200GB, this pathway cannot be used.
Required Files
The hf_merged/ folder must contain: .safetensors files, config.json, tokenizer.json, tokenizer_config.json.
SDK Version
Requires sagemaker>=3.7.0 with BedrockModelBuilder support.
Workflow
Step 1: Gather Training Job Name
The training job name was identified in Step 1 of the main workflow. Confirm you have it.
Step 2: Gather Model Name
Suggest a name for the deployed model based on the training job or use case. Format: lowercase, alphanumeric with hyphens. Confirm with the user.
Step 3: Verify IAM Role
Use the IAM role from the training job (extracted in Step 1 of the main workflow via describe-training-job). We'll assume this role has the necessary permissions for Bedrock deployment.
Step 4: Confirm Region
Bedrock CMI is available in: us-east-1, us-east-2, us-west-2, eu-central-1.
The region was identified in Step 1. Confirm it's in the supported list. If not, tell the user that Bedrock deployment is not supported for this model in this region.
Step 5: Confirm Configuration
"Here's the deployment setup:
>
- Deployment target: Bedrock
- Training Job: [job-name]
- Model Name: [name]
- IAM Role: [arn]
- Region: [region]
>
Does this look right?"
⏸ Wait for user approval.
Step 6: Generate Code
Read ../references/code_output_guide.md for output format rules.
If a project directory already exists (from earlier in the workflow), use it. Otherwise, activate the directory-management skill to set one up.
⏸ Wait for user.
Code Structure
Markdown Header
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deploy to Bedrock"
]
}Cells
Each cell's content comes from ../code_templates/deploy-oss-bedrock.py, split on the # Cell N: comments. Each marker starts a new notebook cell — everything between one marker and the next becomes that cell's content.
- Cell 1: Setup (pip install)
- Cell 2: Configuration
- Cell 3: Flatten S3 Structure and Start Import
- Cell 4: Wait for Import to Complete
- Cell 5: Test Inference
Placeholders
Cell 2:
[REGION]→ AWS region[TRAINING_JOB_NAME]→ SageMaker training job name[ROLE_ARN]→ IAM role ARN with Bedrock trust policy and S3 read permissions[MODEL_NAME]→ Name for the imported model
All other cells have no placeholders.
Step 7: Provide Run Instructions
To run:
1. Cell 1 — install/upgrade SageMaker SDK
2. Cell 2 — configuration and imports
3. Cell 3 — flattens S3 structure and starts import job via BedrockModelBuilder
4. Cell 4 — waits for import to complete (typically a few minutes)
5. Cell 5 — test inference with a sample promptCommon Issues
- "Model weights are larger than 200GB": Cannot use this pathway.
- "No module named 'sagemaker.serve.bedrock_model_builder'": Upgrade SDK:
pip install --upgrade sagemaker>=3.7.1 - Import starts but uses wrong region: Known issue —
BedrockModelBuilderdefaults to us-east-1. The notebook code overrides this. - "Access denied to S3": Add S3 read permissions to the IAM role for the model bucket.
- "Provided IAM role could not be assumed": Ensure role has trust policy for
bedrock.amazonaws.com.
Post-Deployment Summary
After the notebook runs successfully, tell the user:
- Model:
[MODEL_NAME]has been imported to Bedrock - How to invoke: Use the Bedrock
invoke_modelAPI with the imported model ARN - Billing: Pay per request — no cost while idle
- Cleanup: When done, delete the imported model using the AWS MCP tool
delete-imported-model(Bedrock service) with the model name.
Deploy OSS LoRA to SageMaker Multi-Adapter Endpoint
Scenario
- Model Type: OSS (Open Source)
- Fine-tuning Method: LoRA
- Merge Status: Unmerged (
merge_weights: false) - Deployment Target: SageMaker Multi-Adapter Endpoint
- Approach: SageMaker PySdk
JumpStartModel
Overview
Uses the SageMaker PySdk JumpStartModel to resolve the base model S3 URI and container image, rather than manually querying describe_hub_content and parsing the hub content document JSON. Requires sagemaker>=3.7.0.
Required inputs (collected in the steps below):
- Training job name (to resolve JumpStart model ID from tags)
- Instance type
- IAM execution role ARN
- AWS region
- EULA acceptance (from Step 4 of the main workflow)
Prerequisites
SDK Version
Requires sagemaker>=3.7.0 with JumpStartModel support.
Key Gotchas
- ArtifactUrl for adapter ICs: An S3 prefix (directory) works despite docs saying it must be
.tar.gz. No need to repackage. - Container version: LMI 0.31.0 does NOT have the
vllm_async_serviceentrypoint. UseOPTION_ROLLING_BATCH=lmi-distinstead. - Gated models: Use JumpStart S3 cache via ModelDataSource to avoid needing HF_TOKEN.
- Endpoint config: Including ExecutionRoleArn enables inference-component mode. Do NOT include ModelName in ProductionVariants.
Workflow
Step 1: Gather Training Job Name
The training job name was identified in Step 1 of the main workflow. Confirm you have it.
This is needed to look up the JumpStart model ID (from training job tags), which JumpStartModel uses to resolve the base model S3 URI and container image automatically.
Step 2: Determine Instance Type
For this step, you need: the instance type.
Recommend an instance based on model size:
- Small models (<3B):
ml.g5.2xlarge(1 GPU, ~24GB) - Medium models (<10B):
ml.g5.12xlarge(4 GPUs, ~96GB) - Large models (>10B):
ml.g6e.48xlarge(8 GPUs, ~1TB)
Give your suggestion to the user with reasoning and ask them to confirm. If they would like a different instance type, accept their choice. If you think it will cause issues (e.g., not enough GPU memory for the model), call that out.
⏸ Wait for user to confirm before moving on.
Step 3: Verify IAM Role
Use the IAM role from the training job (extracted in Step 1 of the main workflow via describe-training-job). This role should already have the necessary SageMaker and S3 permissions. Confirm with the user.
Step 4: Confirm Region
The region was identified in Step 1 of the main workflow. Confirm it with the user.
Step 5: Confirm Configuration
"Here's the deployment setup:
>
- Target: SageMaker Multi-Adapter Endpoint
- Training Job: [name]
- Instance Type: [type]
- IAM Role: [arn]
- Region: [region]
>
Does this look right?"
⏸ Wait for user approval.
Step 6: Generate Code
Read ../references/code_output_guide.md for output format rules.
If a project directory already exists (from earlier in the workflow), use it. Otherwise, activate the directory-management skill to set one up.
⏸ Wait for user.
Code Structure
Markdown Header
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Deploy to SageMaker Multi-Adapter Endpoint"
]
}Cells
Each cell's content comes from ../code_templates/deploy-oss-sagemaker.py, split on the # Cell N: comments. Each marker starts a new notebook cell — everything between one marker and the next becomes that cell's content.
- Cell 1: Setup (pip install)
- Cell 2: Configuration
- Cell 3: Create Model and Endpoint
- Cell 4: Create Base Model and Adapter Inference Components
- Cell 5: Test Inference
Placeholders
Cell 2:
[REGION]→ AWS region[INSTANCE_TYPE]→ SageMaker instance type (e.g.,ml.g5.2xlarge)[TRAINING_JOB_NAME]→ Training job name (used to look up JumpStart model ID from tags)[ROLE_ARN]→ IAM execution role ARN[ENDPOINT_NAME]→ Name for the endpoint (agent should generate a reasonable default)[ACCEPT_EULA]→Trueif the user accepted the license in Step 4 of the main workflow,Falseotherwise
Step 7: Explicitly State EULA Acceptance
Before running the notebook (either via run_cell or by the user), confirm the EULA acceptance from Step 4 of the main workflow. Tell the user: "Since you accepted the license agreement, I've set EULA acceptance to True in the deployment code." If the user did not accept the license, tell them deployment cannot continue without license acceptance.
Step 8: Provide Run Instructions
To run:
1. Cell 1 — install/upgrade SageMaker SDK
2. Cell 2 — configuration (resolves adapter path and base model metadata via JumpStartModel)
3. Cell 3 — creates model and endpoint (waits for endpoint to be InService, ~5-10 min)
4. Cell 4 — creates base model and adapter inference components (waits for both to be InService, ~5-10 min)
5. Cell 5 — test inference with a sample promptCommon Issues
- "No module named 'sagemaker.jumpstart'": Upgrade SDK:
pip install --upgrade sagemaker>=3.7.1 - "ModuleNotFoundError" for vllm_async_service: Using LMI 0.31.0 container. Use
OPTION_ROLLING_BATCH=lmi-distinstead ofOPTION_ENTRYPOINT. - Base IC fails health check: Check
MinMemoryRequiredInMbfits within instance memory. Reduce if needed. - "Inference Component Name header is required": Must pass
InferenceComponentNamewhen invoking the endpoint. - Console shows "Missing required key 'ModelName'": This is a console UI issue, not a deployment issue. The endpoint works correctly.
- Adapter IC fails: Verify adapter weights exist at
<model-s3-uri>/checkpoints/hf/. Check that the S3 prefix is accessible.
Post-Deployment Summary
After the notebook runs successfully, tell the user:
- Endpoint:
[ENDPOINT_NAME]is now InService - How to invoke: Use SageMaker runtime
InvokeEndpointwithInferenceComponentNameset to the adapter IC name (derived from the endpoint name) - Billing: This endpoint is billed by the hour while running, even when idle. Delete it when you're done testing.
- Cleanup: Delete the adapter inference component first, then the base inference component, then the endpoint using the AWS MCP tool:
1. Use delete-inference-component (SageMaker service) with the adapter IC name 2. Wait for deletion to complete, then use delete-inference-component with the base IC name 3. Wait for deletion to complete, then use delete-endpoint with the endpoint name
Model Licenses
License URLs for models supported by the deployment skill. Look up the model by its JumpStart model ID (from the sagemaker-studio:jumpstart-model-id training job tag).
Display the license or service terms to the user and follow any instructions in the Notes column.
| Model ID | License | License URL | Notes |
|---|---|---|---|
huggingface-reasoning-qwen3-32b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-32B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-reasoning-qwen3-14b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-14B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-reasoning-qwen3-8b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-8B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-reasoning-qwen3-4b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-4B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-reasoning-qwen3-1-7b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-1.7B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-reasoning-qwen3-06b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-llm-qwen2-5-72b-instruct | Qwen License Agreement | https://huggingface.co/Qwen/Qwen2.5-72B-Instruct/blob/main/LICENSE | Say: "This model is licensed under the Qwen License Agreement. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-llm-qwen2-5-32b-instruct | Apache 2.0 | https://huggingface.co/Qwen/Qwen2.5-32B-Instruct/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-llm-qwen2-5-14b-instruct | Apache 2.0 | https://huggingface.co/Qwen/Qwen2.5-14B-Instruct/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-llm-qwen2-5-7b-instruct | Apache 2.0 | https://huggingface.co/Qwen/Qwen2.5-7B-Instruct/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
deepseek-llm-r1-distill-llama-70b | MIT | https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Llama-70B/blob/main/LICENSE | Say: "This model is licensed under MIT. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
deepseek-llm-r1-distill-qwen-32b | MIT | https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-32B/blob/main/LICENSE | Say: "This model is licensed under MIT. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
deepseek-llm-r1-distill-qwen-14b | MIT | https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-14B/blob/main/LICENSE | Say: "This model is licensed under MIT. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
deepseek-llm-r1-distill-llama-8b | MIT | https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Llama-8B/blob/main/LICENSE | Say: "This model is licensed under MIT. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
deepseek-llm-r1-distill-qwen-7b | MIT | https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B/blob/main/LICENSE | Say: "This model is licensed under MIT. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
deepseek-llm-r1-distill-qwen-1-5b | MIT | https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B/blob/main/LICENSE | Say: "This model is licensed under MIT. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
openai-reasoning-gpt-oss-120b | Apache 2.0 | https://huggingface.co/openai/gpt-oss-120b/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
openai-reasoning-gpt-oss-20b | Apache 2.0 | https://huggingface.co/openai/gpt-oss-20b/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
meta-textgeneration-llama-3-3-70b-instruct | Llama 3.3 Community | https://huggingface.co/meta-llama/Llama-3.3-70B-Instruct/blob/main/LICENSE | Say: "This model is licensed under Llama 3.3 Community License. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
meta-textgeneration-llama-3-2-3b-instruct | Llama 3.2 Community | https://huggingface.co/meta-llama/Llama-3.2-3B-Instruct/blob/main/LICENSE.txt | Say: "This model is licensed under Llama 3.2 Community License. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
meta-textgeneration-llama-3-2-1b-instruct | Llama 3.2 Community | https://huggingface.co/meta-llama/Llama-3.2-1B-Instruct/blob/main/LICENSE.txt | Say: "This model is licensed under Llama 3.2 Community License. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
meta-textgeneration-llama-3-1-8b-instruct | Llama 3.1 Community | https://huggingface.co/meta-llama/Llama-3.1-8B-Instruct/blob/main/LICENSE | Say: "This model is licensed under Llama 3.1 Community License. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
nova-textgeneration-pro | AWS Service Terms | https://aws.amazon.com/service-terms/ | Say: "This model is subject to the AWS Service Terms: {URL}. Would you like to proceed?" |
nova-textgeneration-micro | AWS Service Terms | https://aws.amazon.com/service-terms/ | Say: "This model is subject to the AWS Service Terms: {URL}. Would you like to proceed?" |
nova-textgeneration-lite | AWS Service Terms | https://aws.amazon.com/service-terms/ | Say: "This model is subject to the AWS Service Terms: {URL}. Would you like to proceed?" |
nova-textgeneration-lite-v2 | AWS Service Terms | https://aws.amazon.com/service-terms/ | Say: "This model is subject to the AWS Service Terms: {URL}. Would you like to proceed?" |
huggingface-reasoning-nvidia-nemotron-3-nano-30b-a3b-bf16 | NVIDIA Open Model License | https://huggingface.co/nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16/blob/main/LICENSE | Say: "This model is licensed under the NVIDIA Open Model License. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-vlm-qwen3-6-27b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-VL-27B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-vlm-qwen3-5-27b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-VL-27B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-vlm-qwen3-5-9b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-VL-9B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-vlm-qwen3-5-4b | Apache 2.0 | https://huggingface.co/Qwen/Qwen3-VL-4B/blob/main/LICENSE | Say: "This model is licensed under Apache 2.0. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
huggingface-vlm-gemma-4-31b-it | Gemma Terms of Use | https://huggingface.co/google/gemma-4-31b-it/blob/main/LICENSE | Say: "This model is licensed under Gemma Terms of Use. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
meta-vlm-llama-4-scout-17b-16e-instruct | Llama 4 Community | https://huggingface.co/meta-llama/Llama-4-Scout-17B-16E-Instruct/blob/main/LICENSE | Say: "This model is licensed under Llama 4 Community License. Please review the license terms here: {URL}. Say 'yes' to accept and proceed." |
Related skills
FAQ
Which models can it deploy?
Only Nova and OSS models LoRA fine-tuned through SageMaker Serverless Model Customization; base models and full fine-tuned (FFT) models are not supported.
What deployment targets are available?
SageMaker endpoints and Bedrock; the skill presents both and lets the user choose without recommending one.