Model Evaluation
AWS LabsOfficialPublished by AWS Labs
- Skill
- Workflow
- Software development
- Apache-2.0
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured workflow for evaluating SageMaker models, supporting both open-source and Nova models. It guides users through selecting an evaluation strategy—either LLM-as-Judge for qualitative assessment or a Custom Scorer for programmatic validation—and generates the necessary Python code or Jupyter notebooks to execute these benchmarks within the SageMaker environment.
What it does
- Determines the appropriate evaluation type based on model architecture and user requirements.
- Validates compatibility between the chosen evaluation method and the target model.
- Generates Python scripts or Jupyter notebooks for model evaluation.
- Supports LLM-as-Judge for OSS models.
- Facilitates the creation and registration of Lambda-based custom scorers.
- Integrates with SageMaker SDK for streamlined model benchmarking.
When to use it
- When you need to benchmark the performance of a fine-tuned or base SageMaker model.
- When you want to use an LLM to grade model outputs.
- When you require custom programmatic logic to score model responses.
- When you need to compare different model versions or configurations.
Advantages
- Ensures consistent evaluation workflows through guided steps.
- Prevents incompatible configurations by validating model types early.
- Automates the generation of boilerplate code for evaluation tasks.
- Provides flexibility by supporting both automated LLM grading and custom logic.
Usage examples
- “Evaluate my model.”
- The agent will initiate the evaluation workflow, asking you to choose between LLM-as-Judge or Custom Scorer, and verify your model type.
- “How did my model perform?”
- The agent will guide you through setting up a benchmark or custom scorer to generate performance metrics.
- “Run a benchmark on my fine-tuned Llama model.”
- The agent will confirm the model type and guide you through the LLM-as-Judge or Custom Scorer setup process.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/awslabs/model-evaluation/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip model-evaluation.zip -d .agents/skills
Documentation by AWS Labs
Model Evaluation
Generate code that evaluates a SageMaker model.
Prerequisites
The SDK environment has been verified (SDK version, region, execution role). If not done, activate the
sdk-getting-startedskill first.
Principles
One thing at a time. Each response advances exactly one decision. Never combine multiple questions in a single turn.
Confirm before proceeding. Wait for the user to agree before moving to the next step.
Don't read files until you need them. Only read reference files when you've reached the step that requires them.
Don't ask what you already know. If the answer is in conversation history, workflow_state.json, plan.md, or any file you've already read — use it. Confirm if unsure, but don't re-ask.
No narration. Share outcomes and ask questions. Keep responses short.
No repetition. If you said something before a tool call, don't repeat it after.
Scope
This skill supports the evaluation feature for SageMaker Serverless Model Customization. It can evaluate any base or fine-tuned model supported by SageMaker serverless model customization — both OSS models (Llama, Mistral, Qwen, etc.) and Nova models.
Tell the user when the skill is activated:
"I can help evaluate any base or fine-tuned model supported by SageMaker serverless model customization."
If the user requests help evaluating a model that isn't supported by SageMaker serverless model customization, explain that it is not supported by this skill.
Evaluation Types
There are two evaluation types:
LLM-as-Judge — an LLM grades your model's responses. (OSS models only — not supported for Nova.)
Custom Scorer — programmatic evaluation via Lambda function (includes built-in math and code scorers). Works with both OSS and Nova models.
Workflow
Step 1: Determine evaluation type
Do you already know which evaluation type to use?
Check conversation history, plan.md, workflow_state.json, or anything else you've already read.
If yes: confirm with the user.
"It sounds like you want to run [evaluation type]. Is that right?"
⏸ Wait for confirmation. If confirmed → go to Step 2.
If no: ask.
"What kind of evaluation would you like to run? I support:
LLM-as-Judge — an LLM grades your model's responses
Custom Scorer — programmatic scoring (math, code, or your own logic)
Pick one, or say 'help me decide' if you're not sure."
⏸ Wait for user.
If user picks one → go to Step 2.
If user indicates uncertainty, by saying something like "help me decide," "whatever you think," "I'm not sure" → read
references/evaluation-type-guide.mdand follow its instructions. It will guide the user to a choice and then return here. You MUST NEVER make a recommendation to the user on eval type without readingreferences/evaluation-type-guide.md.
Step 2: Validate and hand off to evaluation workflow
Before reading the reference file, validate that the chosen evaluation type is compatible with the user's situation. You may already know these answers from conversation context — don't ask if you don't need to.
LLM-as-Judge validation
What model type are we evaluating? LLM-as-Judge is not supported for Nova models. To determine model type (if you don't already know it):
If you have the training job name or ARN, use the AWS MCP tool
list-tagson the training job ARN and look for thesagemaker-studio:jumpstart-model-idtag. Contains "nova" → Nova. Anything else → OSS.If you have a Model Package ARN, use the AWS MCP tool
describe-model-packageand check the model description or source tags.If neither is available, ask the user.
Does the user have an evaluation dataset? LLM-as-Judge requires one.
Custom Scorer validation
Does the user have an evaluation dataset? Custom Scorer requires one. (Works with both OSS and Nova models, though for Nova only custom lambdas are supported.)
If validation fails, tell the user which requirement(s) aren't met and offer alternatives:
"[Evaluation type] won't work because [reason]."
If the failure reason was lack of an eval dataset, there's nothing we can do. Inform the user:
"Unfortunately all of the supported eval types require an eval dataset. I can't help you with model evaluation."
If the failure reason is something else, offer to help them pick a different evaluation type.
⏸ Wait for user.
If they say they do want help choosing a different eval type → read references/evaluation-type-guide.md.
If validation passes, read the corresponding reference file:
| User chose | Read |
|---|---|
| LLM-as-Judge | references/llmaaj-evaluation.md |
| Custom Scorer | references/custom-scorer-evaluation.md |
Follow the reference file's instructions from the beginning.
Files
- ATTRIBUTION.mdAdded by AutoGineer916 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer89 B
- SKILL.md5.2 KiB
- code_templates/custom_scorer_evaluator.pyScript2.5 KiB
- code_templates/llmaaj_evaluator.pyScript2.4 KiB
- references/code_output_guide.md3.3 KiB
- references/create-reward-function.md3.0 KiB
- references/custom-lambda-scorer.md4.4 KiB
- references/custom-scorer-evaluation.md10.2 KiB
- references/evaluation-type-guide.md8.0 KiB
- references/llmaaj-builtin-evaluation.md5.0 KiB
- references/llmaaj-custom-evaluation.md2.3 KiB
- references/llmaaj-evaluation.md13.7 KiB
- references/supported-judge-models.md2.5 KiB
- scripts/nova_reward_function_source_template.pyScript13.0 KiB
- scripts/reward_function_source_template.pyScript9.3 KiB
- scripts/validate_custom_metrics.pyScript3.6 KiB
references/llmaaj-evaluation.md
LLMaaJ evaluation
Guide the user through the process for evaluating a model with LLMaaJ.
Workflow
Step 0: Consider prior context
Before proceeding, silently think about the context you have about the user's project, including conversation history and file reads. You should use that knowledge, and avoid asking questions you already know the answer to.
Step 1: Understand the task
For this step, you need: what task the model is trained to do. If you know this already, skip this step. If not, ask the user:
"What task is this model trained to do?"
Step 2: Get evaluation dataset
For this step, you need: the evaluation dataset S3 path. If you know this already, skip this step. If not, ask the user:
"Where's your evaluation dataset stored in S3?"
Step 3: Understand the data
For this step, you need: to understand what the data looks like to inform metric recommendations. If you already know what the data looks like, skip this step. If not, ask the user:
"Can you tell me a bit about your evaluation dataset — what format is it in, and what do the input/output fields look like?"
If the user isn't sure, offer to peek at the data:
"May I read a few records of your dataset to help inform my recommendations?"
If they say yes, use the AWS tool to call s3api get-object with a Range header to read the first few KB.
If you fail to get a sample, move on and rely on the user's description.
Step 4: Validate dataset format
If the evaluation dataset was already validated via the dataset-evaluation skill — either earlier in this conversation, or in a previous session (as recorded in plan.md) — skip this step.
Otherwise, activate the dataset-evaluation skill to validate it. If it fails, offer to activate the dataset-transformation skill to convert it. Do not proceed until the dataset is valid.
Step 5: Dataset size warning
After dataset validation, warn the user about the Bedrock evaluation dataset size limit:
"One thing to note — Bedrock LLM-as-Judge evaluation supports a maximum of 1,000 rows per job. If your dataset is larger than that, the job will fail. You may need to trim it before running the evaluation."
Step 6: Check for custom metrics
For this step, you need: whether the user has predefined custom metrics.
"Do you have predefined custom metrics you'd like to use? If so, they must follow the Bedrock custom metrics format: https://docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation-custom-metrics-prompt-formats.html
If not, no worries — I can recommend built-in metrics for your task."
⏸ Wait for user.
If the user has custom metrics → Read
references/llmaaj-custom-evaluation.mdand follow its instructions to collect and validate the metrics JSON.If the user does not have custom metrics → Move to Step 7.
Step 7: Select built-in metrics
For this step, you need: user agreement on which built-in metrics to use (if any).
If the user provided custom metrics in Step 6, ask whether they also want built-in metrics:
"Would you also like to include any built-in metrics alongside your custom ones?"
If they say no, skip to Step 8.
For built-in metric selection, read references/llmaaj-builtin-evaluation.md and follow its instructions.
Step 8: Determine evaluation scope
For this step, you need: which model(s) to evaluate.
If you already know from context (e.g., the user said "compare my model to the base"), confirm and move on. Otherwise, ask:
"Would you like to evaluate:
Just your fine-tuned model
Just a base model
Both, with a comparison
Which would you prefer?"
⏸ Wait for user.
Step 9: Resolve Model Package ARN
This step only applies if the evaluation scope includes the fine-tuned model (option 1 or 3 from Step 8). If the user chose base model only, skip to Step 10.
For this step, you need: the Model Package ARN of the fine-tuned model.
Use this priority order:
Model Package ARN from workflow state or conversation: If you already have a model package ARN from prior context or from earlier in the conversation, confirm it with the user and move on.
Ask the user: If you don't have the ARN, ask:
"What's the Model Package ARN (or group name) of your fine-tuned model?" If they provide a group name, resolve the ARN by calling
list-model-packagesvia the AWS tool with the group name. Use the latest version'sModelPackageArnfrom the response.
Validate the resolved ARN (whether from API lookup, conversation context, or user input):
A valid versioned model package ARN looks like:
arn:aws:sagemaker:REGION:ACCOUNT:model-package/NAME/VERSIONIf the ARN contains
:model-package-group/, this is a group ARN, not a package ARN. Resolve it using the lookup in #2.If the ARN contains
:model-package/but does NOT end with a version number (e.g.,/1), resolve it: extract the group name from the ARN and use the lookup in #2.If it contains
/DataSet/,/TrainingJob/, or other non-model-package resource types, flag it: "That looks like a [Dataset/TrainingJob] ARN, not a model package ARN. Could you double-check?"Verify the ARN exists before proceeding by calling
describe-model-packagevia the AWS tool. If this fails, tell the user the ARN wasn't found and ask them to double-check.
Step 10: Resolve base model
This step only applies if the evaluation scope includes the base model (option 2 or 3 from Step 8). If the user chose fine-tuned only, skip to Step 11.
For comparison mode (option 3): the base model is resolved automatically from the fine-tuned model's lineage — no additional input needed.
For base model only (option 2): you need a JumpStart model ID (e.g., meta-textgeneration-llama-3-2-1b-instruct). This is a string identifier, not an ARN. Check if you already know it from conversation context (e.g., the user mentioned which base model they used for fine-tuning). If not, ask:
"What's the JumpStart model ID of the base model you'd like to evaluate?"
<!-- TODO: Add guidance for helping the user find their JumpStart model ID (e.g., list_hub_contents API, or looking at training job tags). See model-selection skill for patterns. -->
Step 11: Select judge model
For this step, you need: which judge model to use for evaluation. This step always runs — both built-in and custom metrics require a judge model.
Read references/supported-judge-models.md for the canonical list, selection guidance, and validation steps.
Before presenting options, run the validation checks from the reference doc against the user's account and region. Only include models that pass all checks.
Present the available models as a numbered list:
"Here are the judge models available in your region:
[model A]
[model B] ...
Which model would you like to use?"
EXTREMELY IMPORTANT: NEVER recommend or suggest any particular model based on the context you have. YOU ARE ALLOWED ONLY to display the list of models. DO NOT add your own recommendation or suggestion after displaying the list.
Step 12: Resolve IAM role ARN
For this step, you need: an IAM role ARN with permissions for Bedrock evaluation.
If you already know the IAM role ARN from conversation context, confirm with the user and move on.
If not, but you know the training job name, look up the role from that training job, since it should be a suitable role:
Call
describe-training-jobvia the AWS tool and extractRoleArn.Confirm with the user: "I found the IAM role from your training job: [ARN]. Should I use this for evaluation?"
If you don't have either, ask:
"What IAM role ARN should I use for the evaluation job? It needs
bedrock.amazonaws.comin its trust policy."
Step 13: Resolve AWS Region
For this step, you need: the AWS region for the evaluation job. If you already know it from context (e.g., the training job region), confirm and move on. Otherwise, ask.
Step 14: Resolve S3 output path
For this step, you need: an S3 path for evaluation output. If you already know it from context, confirm and move on. Otherwise, ask.
Step 15: MLflow experiment name (optional)
For this step, you need to know: the MLflow experiment name.
If you already know this from context, confirm and move on. If not, the name should follow this pattern:
<project-name>-eval.
Perform this step quietly. The user does not need to know about this. This is to make sure their results are viewable alongside other experimental work they're doing.
Step 16: Confirm configuration
Summarize everything and ask for approval:
"Here's the evaluation setup:
Task: [task]
Dataset: [path]
Custom metrics: [Yes — N metrics / No]
Built-in metrics: [list, or None]
Judge: [model]
Model: [Model Package ARN or JumpStart model ID]
Evaluation scope: [fine-tuned only / base only / both with comparison]
IAM role: [ARN]
Region: [region]
S3 output: [path]
MLflow experiment name: [MLflow experiment name]
Does this look right?"
⏸ Wait for user approval.
Step 17: Bedrock Evaluations agreement
This step is mandatory. Do not skip it. Do not proceed without explicit user confirmation.
Before generating the notebook, present the following agreement language:
Important: Amazon Bedrock Evaluations Terms
This feature is powered by Amazon Bedrock Evaluations. Your use of this feature is subject to pricing of Amazon Bedrock Evaluations, the Service Terms applicable to Amazon Bedrock, and the terms that apply to your usage of third-party models. Amazon Bedrock Evaluations may securely transmit data across AWS Regions within your geography for processing. For more information, access Amazon Bedrock Evaluations documentation.
Do you acknowledge and agree to proceed?
⏸ Hard stop. Wait for the user to explicitly confirm. Acceptable responses include "yes", "I agree", "proceed", "ok", or similar affirmative statements. If the user asks questions about the terms, answer them, then re-ask for confirmation. Do NOT generate the notebook until the user has confirmed.
Step 18: 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.
Read code_templates/llmaaj_evaluator.py, substitute the collected values into the placeholders, and write the cells. The template uses # Cell N: Label markers — each marker starts a new notebook cell, with everything between one marker and the next becoming that cell's content. BUILTIN_METRICS must be a Python list of strings, e.g. ["Faithfulness", "Correctness"].
Step 19: Post-generation
Notebook mode:
To run:
1. Cell 1 — configuration and SDK install
2. Cell 2 — start evaluation
3. Cell 3 — polls status automatically (~25-60 min)
4. Cell 4 — show resultsScript mode:
Evaluation can take hours depending on your dataset. Present the user with options:
"Would you like me to:
Leave it to you — run with
python scripts/[script_name]Run it and wait until it's done
Start it but don't wait — we can check status later"
Option 1: Done. Wait for user to come back.
Option 2: Execute the script as-is.
execution.wait()polls until complete. Report results.Option 3: Remove the
execution.wait()call, execute, report the evaluation ARN.
Note: evaluate() does not accept a wait parameter. It always returns immediately. Blocking is done via execution.wait(target_status="Succeeded").
Checking status:
describe-pipeline-execution --pipeline-execution-arn ARN→PipelineExecutionStatuslist-pipeline-execution-steps --pipeline-execution-arn ARN→ per-stepStepStatus,FailureReason
Showing results after completion:
Run:
EvaluationPipelineExecution.get(arn=ARN).show_results()
FAQ
Q: Can I combine custom and built-in metrics in the same evaluation? A: Yes. You can use up to 10 custom metrics alongside any number of built-in metrics in a single evaluation job.
Troubleshooting
Evaluation job fails with "access denied when attempting to assume role"
The Bedrock evaluation job needs to assume your IAM role, which requires bedrock.amazonaws.com in the role's trust policy. This is common when running from a local IDE with temporary or SSO credentials.
To check, inspect your current role's trust policy using the AWS MCP tool:
Use the AWS MCP tool
get-caller-identity(STS service) to get your current role ARN.Extract the role name from the ARN (the part after
role/orassumed-role/).Use the AWS MCP tool
get-role(IAM service) with the role name, and extractRole.AssumeRolePolicyDocumentfrom the response.
Look for bedrock.amazonaws.com in Principal.Service. If it's missing, either add it to the trust policy or switch to a role that already trusts Bedrock (e.g., your SageMaker execution role).
Helping a user find their Model Package ARN
If the user doesn't know their model package ARN and can only provide partial info (dataset ARN, training job name, etc.), guide them through these steps:
Ask for keywords from the model or training job name (e.g., "medication-simplification").
Search model package groups via the AWS tool:
list-model-package-groupswithname-contains <keyword>.List packages in the group via the AWS tool:
list-model-packageswith the group name.Verify the match via the AWS tool:
describe-model-packagewith the ARN. Check that theS3UriinInferenceSpecification.Containersmatches the expected training output path.
Always confirm the resolved ARN with the user before proceeding.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS Labs
- Publisher
- AWS Labs (Official)
- Source
- awslabs/agent-plugins · plugins/sagemaker-ai/skills/model-evaluation · commit fbefb37
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by AWS Labs.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download model-evaluation.zip