From 7494bd0e3e1081369221783db9e0dc57d80382fe Mon Sep 17 00:00:00 2001 From: Ernest-Gray <99225408+Ernest-Gray@users.noreply.github.com> Date: Tue, 17 Mar 2026 11:34:11 -0400 Subject: [PATCH 01/15] Fix localhost development by adding ALLOW_LOCALHOST flag (#356) * feat(auth): add ALLOW_LOCALHOST flag for local development support - Add ALLOW_LOCALHOST environment variable to auth config - Allow localhost:3000 redirect URLs when flag is enabled - Set SameSite=None on session cookies for cross-site requests - Add warning log when ALLOW_LOCALHOST is enabled in production - Update frontend auth context to support localhost development * ran precommit --- .pre-commit-config.yaml | 1 + .../ml_space_lambda/auth/lambda_functions.py | 48 +++++++++++++++++-- frontend/src/contexts/AuthContext.tsx | 16 +++++-- lib/constants.ts | 7 +++ lib/constructs/api/authConstruct.ts | 3 +- lib/utils/configTypes.ts | 9 ++-- 6 files changed, 70 insertions(+), 14 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c7d845bb..491c08ed 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,6 +30,7 @@ repos: - id: eslint files: \.[jt]sx?$ # *.js, *.jsx, *.ts and *.tsx types: [file] + language_version: system - repo: https://github.com/Lucas-C/pre-commit-hooks rev: v1.5.5 diff --git a/backend/src/ml_space_lambda/auth/lambda_functions.py b/backend/src/ml_space_lambda/auth/lambda_functions.py index 9df39950..2c6973ff 100644 --- a/backend/src/ml_space_lambda/auth/lambda_functions.py +++ b/backend/src/ml_space_lambda/auth/lambda_functions.py @@ -90,6 +90,7 @@ def _get_auth_config() -> Dict[str, str]: "token_encryption_key_secret_name": os.environ.get("AUTH_TOKEN_ENCRYPTION_KEY_SECRET_NAME", ""), "session_table_name": os.environ.get("AUTH_SESSION_TABLE_NAME", ""), "sync_domains": os.environ.get("AUTH_SYNC_DOMAINS", ""), + "ALLOW_LOCALHOST": os.environ.get("ALLOW_LOCALHOST", "false").lower() == "true", } # Validate IdP type first @@ -112,6 +113,9 @@ def _get_auth_config() -> Dict[str, str]: if not config["session_table_name"]: raise Exception("AUTH_SESSION_TABLE_NAME environment variable is required") + if config["ALLOW_LOCALHOST"]: + logger.warning("ALLOW_LOCALHOST enabled; please disable for production deployments") + return config @@ -433,7 +437,7 @@ def _get_auth_path(event: Dict) -> str: return "/auth" -def _validate_redirect_url(redirect_url: str, host_header: str) -> bool: +def _validate_redirect_url(redirect_url: str, host_header: str, allow_localhost: bool = False) -> bool: """ Validate that redirect URL is safe and belongs to the same origin. @@ -447,6 +451,10 @@ def _validate_redirect_url(redirect_url: str, host_header: str) -> bool: if not redirect_url: return False + if allow_localhost: + if redirect_url == "http://localhost:3000" or redirect_url == "http://localhost:3000/Prod": + return True + try: parsed = urlparse(redirect_url) @@ -490,7 +498,7 @@ def login(event, context): host_header = event.get("headers", {}).get("Host") or event.get("headers", {}).get("host", "") # Validate redirect URL - if not _validate_redirect_url(redirect_url, host_header): + if not _validate_redirect_url(redirect_url, host_header, config["ALLOW_LOCALHOST"]): logger.warning(f"Invalid redirect URL: {redirect_url}") redirect_url = root_path @@ -840,9 +848,19 @@ def callback(event, context): secure_flag = should_set_secure_flag(host_header) domain = extract_domain_from_host(host_header) root_path = _get_root_path(event) + same_site = "Strict" + + # For localhost development: use None for cross-site requests + if config["ALLOW_LOCALHOST"]: + same_site = "None" # Allows cross-site requests (localhost -> AWS) session_cookie = create_session_cookie( - session_id=session_id, max_age_seconds=int(expires_at), domain=domain, secure=secure_flag, path=root_path + session_id=session_id, + max_age_seconds=int(expires_at), + domain=domain, + secure=secure_flag, + path=root_path, + same_site=same_site, ) # Clear state cookie @@ -1222,9 +1240,19 @@ def _attempt_token_refresh( secure_flag = should_set_secure_flag(host_header) domain = extract_domain_from_host(host_header) root_path = _get_root_path(event) + same_site = "Strict" + + # For localhost development: use None for cross-site requests + if config.get("ALLOW_LOCALHOST"): + same_site = "None" # Allows cross-site requests (localhost -> AWS) new_session_cookie = create_session_cookie( - session_id=session_id, max_age_seconds=int(access_expires), domain=domain, secure=secure_flag, path=root_path + session_id=session_id, + max_age_seconds=int(access_expires), + domain=domain, + secure=secure_flag, + path=root_path, + same_site=same_site, ) logger.info(f"Token refresh successful for session: {session_id}") @@ -1457,12 +1485,22 @@ def _set_session_cookie_for_domain(session_id, event, config) -> str: secure_flag = should_set_secure_flag(host_header) domain = extract_domain_from_host(host_header) root_path = _get_root_path(event) + same_site = "Strict" + + # For localhost development: use None for cross-site requests + if config.get("ALLOW_LOCALHOST"): + same_site = "None" # Allows cross-site requests (localhost -> AWS) # Use default session TTL (24 hours) for sync cookies session_ttl = int(config.get("session_ttl_hours", "24")) * 3600 return create_session_cookie( - session_id=session_id, max_age_seconds=session_ttl, domain=domain, secure=secure_flag, path=root_path + session_id=session_id, + max_age_seconds=session_ttl, + domain=domain, + secure=secure_flag, + path=root_path, + same_site=same_site, ) diff --git a/frontend/src/contexts/AuthContext.tsx b/frontend/src/contexts/AuthContext.tsx index 15556cdb..09193729 100644 --- a/frontend/src/contexts/AuthContext.tsx +++ b/frontend/src/contexts/AuthContext.tsx @@ -188,13 +188,19 @@ export const AuthProvider: React.FC = ({ - const login = (redirectUrl?: string) => { + const login = () => { // For login redirect, we need to construct the full URL since it's a page redirect - const baseUrl = (window as any).env?.LAMBDA_ENDPOINT || window.location.origin; - const loginUrl = new URL('auth/login', baseUrl); - if (redirectUrl) { - loginUrl.searchParams.set('redirectUrl', redirectUrl); + const baseUrl: string | undefined = (window as any).env?.LAMBDA_ENDPOINT || undefined; + if (!baseUrl) { + throw new Error('LAMBDA_ENDPOINT is not defined'); } + + // Remove trailing slashes and extract the stage + const stage = baseUrl.replace(/\/+$/, '').split('/').at(-1); + const loginUrl = new URL(`${stage}/auth/login`, baseUrl.split(stage || '')[0]); + + loginUrl.searchParams.set('redirectUrl', `${window.location.origin}/${stage}`); + window.location.href = loginUrl.toString(); }; diff --git a/lib/constants.ts b/lib/constants.ts index 01eefab1..84eda823 100644 --- a/lib/constants.ts +++ b/lib/constants.ts @@ -144,6 +144,13 @@ export const AUTH_TOKEN_ENCRYPTION_KEY_SECRET_NAME = 'mlspace/auth/token-encrypt export const AUTH_STATE_ENCRYPTION_KEY_SECRET_NAME = 'mlspace/auth/state-encryption-key'; // Simple secret for state encryption key (deploy-time generated) export const AUTH_KEY_VERSIONS_TO_KEEP = 3; // Number of key versions to retain during rotation +// DEVELOPMENT ONLY - allow localhost specific configuration for auth cookie +// To disable CORS use the following command to run chrome without CORS *DEVELOPMENT ONLY* +// eslint-disable-next-line spellcheck/spell-checker +// "C:\Program Files\Google\Chrome\Application\chrome.exe" --user-data-dir=C:\chrome-dev-data\ --disable-web-security +// Without setting this to true, localhost login will redirect to the deployed frontend, not the locally hosted react app. +export const ALLOW_LOCALHOST = undefined; // Allow localhost:3000 redirects for local development (SECURITY: set to false in production) + // Legacy OIDC configuration (deprecated - maintained for backward compatibility during migration) // Use AUTH_OIDC_URL, AUTH_OIDC_CLIENT_ID, and other AUTH_* constants instead export const IDP_ENDPOINT_SSM_PARAM = undefined; // Deprecated: Use AUTH_OIDC_URL instead diff --git a/lib/constructs/api/authConstruct.ts b/lib/constructs/api/authConstruct.ts index f2b55a5b..e315a2ff 100644 --- a/lib/constructs/api/authConstruct.ts +++ b/lib/constructs/api/authConstruct.ts @@ -48,7 +48,8 @@ export class AuthApiConstruct extends Construct { AUTH_STATE_ENCRYPTION_KEY_SECRET_NAME: props.mlspaceConfig.AUTH_STATE_ENCRYPTION_KEY_SECRET_NAME, AUTH_KEY_VERSIONS_TO_KEEP: String(props.mlspaceConfig.AUTH_KEY_VERSIONS_TO_KEEP), NEW_USERS_SUSPENDED: props.mlspaceConfig.NEW_USERS_SUSPENDED ? 'True' : 'False', - WEB_CUSTOM_DOMAIN_NAME: props.mlspaceConfig.WEB_CUSTOM_DOMAIN_NAME || '' + WEB_CUSTOM_DOMAIN_NAME: props.mlspaceConfig.WEB_CUSTOM_DOMAIN_NAME || '', + ALLOW_LOCALHOST: props.mlspaceConfig.ALLOW_LOCALHOST ? 'True' : 'False' }; // OIDC-specific environment variables diff --git a/lib/utils/configTypes.ts b/lib/utils/configTypes.ts index 067f06e0..2b29987c 100644 --- a/lib/utils/configTypes.ts +++ b/lib/utils/configTypes.ts @@ -92,7 +92,8 @@ import { WEBSITE_BUCKET_NAME, SYSTEM_ROLE_ARN, SHOW_MIGRATION_OPTIONS, - WEB_CUSTOM_DOMAIN_NAME + WEB_CUSTOM_DOMAIN_NAME, + ALLOW_LOCALHOST } from '../constants'; import * as fs from 'fs'; import { Architecture, Runtime } from 'aws-cdk-lib/aws-lambda'; @@ -188,7 +189,8 @@ export type MLSpaceConfig = { BACKGROUND_REFRESH_INTERVAL: number, SHOW_MIGRATION_OPTIONS?: boolean, - WEB_CUSTOM_DOMAIN_NAME?: string + WEB_CUSTOM_DOMAIN_NAME?: string, + ALLOW_LOCALHOST?: boolean }; const validateRequiredProperty = (val: string, name: string) => { @@ -291,7 +293,8 @@ export function generateConfig (accountId?: string) { BACKGROUND_REFRESH_INTERVAL: BACKGROUND_REFRESH_INTERVAL, SHOW_MIGRATION_OPTIONS: SHOW_MIGRATION_OPTIONS, - WEB_CUSTOM_DOMAIN_NAME: WEB_CUSTOM_DOMAIN_NAME + WEB_CUSTOM_DOMAIN_NAME: WEB_CUSTOM_DOMAIN_NAME, + ALLOW_LOCALHOST: ALLOW_LOCALHOST }; //Try to load account-specific config or config generated by config-helper From f697c697290871e38e313d70a8dc22587b80d941 Mon Sep 17 00:00:00 2001 From: Ernest-Gray <99225408+Ernest-Gray@users.noreply.github.com> Date: Thu, 2 Apr 2026 12:44:38 -0400 Subject: [PATCH 02/15] Ground Truth (GT) Enhancement --- .gitignore | 3 + .../labeling_job/lambda_functions.py | 109 +++++- .../utils/groundtruth_utils.py | 61 +++ .../VerificationBoundingBox.html | 45 +++ .../VerificationSemanticSegmentation.html | 49 +++ .../utils/test_generate_custom_ui_template.py | 362 ++++++++++++++++++ .../test/utils/test_get_groundtruth_utils.py | 4 + frontend/docs/user-guide/labeling-jobs.md | 7 +- .../console/groundtruth/tasktype-custom.png | Bin 0 -> 118786 bytes .../labeling/create/labeling-job-create.tsx | 93 ++++- .../labeling/create/labeling-job-custom.tsx | 111 ++++++ ...abeling-job-input-label-attribute-name.tsx | 64 ++++ .../create/labeling-job-select-workers.tsx | 2 + .../create/labeling-job-task-config.tsx | 75 +++- .../create/labeling-job-task-type.tsx | 13 + .../jobs/labeling/labeling-job.common.ts | 16 +- .../jobs/labeling/labeling-job.model.ts | 7 + .../jobs/labeling/labeling-job.reducer.ts | 3 +- 18 files changed, 986 insertions(+), 38 deletions(-) create mode 100644 backend/src/ml_space_lambda/utils/labeling_job_templates/VerificationBoundingBox.html create mode 100644 backend/src/ml_space_lambda/utils/labeling_job_templates/VerificationSemanticSegmentation.html create mode 100644 backend/test/utils/test_generate_custom_ui_template.py create mode 100644 frontend/src/content/images/console/groundtruth/tasktype-custom.png create mode 100644 frontend/src/entities/jobs/labeling/create/labeling-job-custom.tsx create mode 100644 frontend/src/entities/jobs/labeling/create/labeling-job-input-label-attribute-name.tsx diff --git a/.gitignore b/.gitignore index fdb99b48..ad8d3245 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,6 @@ cdk.context.json # Cypress Tests cypress/cypress/screenshots/ + +# Environment-specific config +lib/config.json diff --git a/backend/src/ml_space_lambda/labeling_job/lambda_functions.py b/backend/src/ml_space_lambda/labeling_job/lambda_functions.py index ee8f3189..949b80f9 100644 --- a/backend/src/ml_space_lambda/labeling_job/lambda_functions.py +++ b/backend/src/ml_space_lambda/labeling_job/lambda_functions.py @@ -19,6 +19,7 @@ import os import boto3 +from botocore.exceptions import ClientError from ml_space_lambda.data_access_objects.project_user import ProjectUserDAO from ml_space_lambda.data_access_objects.resource_metadata import ResourceMetadataDAO @@ -27,6 +28,7 @@ from ml_space_lambda.utils.groundtruth_utils import ( LambdaTypes, TaskTypes, + generate_custom_ui_template, generate_labels_configuration_file, generate_ui_template, get_auto_labeling_arn, @@ -77,13 +79,75 @@ def create(event, context): env_variables = get_environment_variables() data_bucket_name = param_file["pSMSDataBucketName"] task_type = TaskTypes[labeling_job_request["TaskType"]] - labeling_job = labeling_job_request["JobDefinition"] + labeling_job: dict = labeling_job_request["JobDefinition"] description = labeling_job["HumanTaskConfig"]["TaskDescription"] full_instructions = labeling_job_request["FullInstruction"] short_instructions = labeling_job_request["ShortInstruction"] labeling_job_name = labeling_job["LabelingJobName"] labeling_job["LabelingJobName"] = labeling_job_name + # Check to see if InputLabelAttributeName was included in the request. + label_attr = labeling_job.pop( + "InputLabelAttributeName", None + ) # pop removes it from the dict, needed for clean sagemaker api call + if task_type == TaskTypes.VerificationBoundingBox or task_type == TaskTypes.VerificationSemanticSegmentation: + logger.info("Verification job - Locating LabelAttributeName for the input manifest") + + # If the label_attr was found, dont search the manifest file + if label_attr and label_attr != "": + logger.info(f"Found InputLabelAttributeName in request: {label_attr}") + + else: # If not provided, look in the manfiest file + + logger.warning(f"No InputLabelAttributeName found in request event. Searching input manifest") + + # Pull the input manifest file + manifest_s3_uri = labeling_job["InputConfig"]["DataSource"]["S3DataSource"]["ManifestS3Uri"] + + # Parse S3 URI + s3_uri_parts = manifest_s3_uri.replace("s3://", "").split("/", 1) + bucket = s3_uri_parts[0] + key = s3_uri_parts[1] + + # Read first line from S3 manifest file + s3_client = boto3.client("s3", config=retry_config) + logger.info("Reading manifest file from S3...") + + try: + response = s3_client.get_object(Bucket=bucket, Key=key) + first_line = response["Body"].read().decode("utf-8").split("\n")[0] + + # Parse JSON and get the second key + manifest_entry = json.loads(first_line) + + except ClientError as e: + error_code = e.response.get("Error", {}).get("Code", "Unknown") + logger.error(f"S3 error reading manifest file {manifest_s3_uri}: {error_code} - {e}") + raise ValueError(f"Could not read manifest file from {manifest_s3_uri}. Error: {error_code}") + + except json.JSONDecodeError as e: + logger.error(f"Invalid JSON in manifest file {manifest_s3_uri}: {e}") + raise ValueError(f"Manifest file contains invalid JSON at {manifest_s3_uri}: {str(e)}") + + except Exception as e: + logger.error(f"Unexpected error reading manifest file {manifest_s3_uri}: {e}") + raise ValueError(f"Failed to process manifest file from {manifest_s3_uri}: {str(e)}") + keys = list(manifest_entry.keys()) + + # Check the 2nd item in the keys, this should be the LabelAttributeName + if len(keys) >= 2: + label_attr = keys[1] + logger.info(f"Extracted LabelAttributeName: {label_attr}") + else: + label_attr = None + logger.warning(f"Manifest entry has fewer than 2 keys. Keys: {keys}") + + if not label_attr or not label_attr.strip(): + logger.error("The input manifest's LabelAttributeName is missing or empty for VerificationBoundingBox job") + raise ValueError("The input manifest's LabelAttributeName is required for VerificationBoundingBox jobs") + + logger.info(f"Successfully found the LabelAttributeName for the input manifest: {label_attr}") + # Generate labels config file and store in S3 bucket stripped_protocol_output_path = labeling_job["OutputConfig"]["S3OutputPath"].removeprefix("s3://") stripped_bucket_output_path = os.path.join(*stripped_protocol_output_path.split("/")[1:]) @@ -103,15 +167,40 @@ def create(event, context): get_groundtruth_lambda_arn(LambdaTypes.ACS, task_type) ) - template_uri = generate_ui_template( - labeling_job_name, - task_type, - description, - full_instructions, - short_instructions, - data_bucket_name, - output_path, - ) + # Check for custom labeling job fields + custom_labeling_job_fields = labeling_job_request.get("CustomLabelingJobVars") + + if custom_labeling_job_fields and task_type == TaskTypes.PassThrough: + + custom_template_html = custom_labeling_job_fields.get("CustomTaskTemplate", "") + + if custom_template_html == "": + raise Exception("CustomTaskTemplate is required for Custom task type") + + logger.info("PassThrough task type, using custom UI template") + # Use custom template + template_uri = generate_custom_ui_template( + custom_template_html, + labeling_job_name, + description, + full_instructions, + short_instructions, + data_bucket_name, + output_path, + label_attr, + ) + else: + # Use standard template based on task type + template_uri = generate_ui_template( + labeling_job_name, + task_type, + description, + full_instructions, + short_instructions, + data_bucket_name, + output_path, + label_attr, + ) if template_uri is not None: labeling_job["HumanTaskConfig"]["UiConfig"]["UiTemplateS3Uri"] = template_uri diff --git a/backend/src/ml_space_lambda/utils/groundtruth_utils.py b/backend/src/ml_space_lambda/utils/groundtruth_utils.py index 7d39ca56..dad0bf1a 100644 --- a/backend/src/ml_space_lambda/utils/groundtruth_utils.py +++ b/backend/src/ml_space_lambda/utils/groundtruth_utils.py @@ -63,6 +63,8 @@ class LambdaTypes(str, Enum): class TaskTypes(str, Enum): BoundingBox = auto() + VerificationBoundingBox = auto() + VerificationSemanticSegmentation = auto() ImageMultiClass = auto() ImageMultiClassMultiLabel = auto() SemanticSegmentation = auto() @@ -70,10 +72,13 @@ class TaskTypes(str, Enum): TextMultiClass = auto() TextMultiClassMultiLabel = auto() NamedEntityRecognition = auto() + PassThrough = auto() _auto_labeling_task_arn_map = { TaskTypes.BoundingBox: "image-classification", + TaskTypes.VerificationBoundingBox: "image-classification", + TaskTypes.VerificationSemanticSegmentation: "image-classification", TaskTypes.ImageMultiClass: "image-classification", TaskTypes.ImageMultiClassMultiLabel: "image-classification", TaskTypes.SemanticSegmentation: "semantic-segmentation", @@ -125,6 +130,59 @@ def generate_labels_configuration_file(labels: list, job_name: str, data_bucket_ return f"s3://{data_bucket_name}/{s3_key}" +def generate_custom_ui_template( + custom_template_html: str, + job_name: str, + description: str, + full_instructions: str, + short_instructions: str, + data_bucket_name: str, + output_dir_key: str, + label_attribute_name: str = None, +) -> str: + """ + Generate a UI template from a custom HTML template string. + Processes the template by replacing placeholders and uploads it to S3. + + :param custom_template_html: The HTML template as a string + :param job_name: Name of the labeling job + :param description: Task description + :param full_instructions: Full instructions for the task + :param short_instructions: Short instructions for the task + :param data_bucket_name: S3 bucket name for storing the template + :param output_dir_key: Output directory key in S3 + :param label_attribute_name: Label attribute name for verification jobs + :return: S3 URI of the uploaded template + """ + file_content: list[str] = [] + + for line in custom_template_html.splitlines(): + if "{ASSET_JS}" in line: + file_content.append( + line.replace( + "{ASSET_JS}", + f"https://{get_groundtruth_assets_domain()}/crowd-html-elements.js", + ) + ) + elif "" in line: + file_content.append(line) + file_content.append(full_instructions) + elif "" in line: + file_content.append(line) + file_content.append(short_instructions) + elif "DESCRIPTION_STUB" in line: + file_content.append(line.replace("DESCRIPTION_STUB", description)) + elif "label-attribute-name-from-prior-job" in line and label_attribute_name: + file_content.append(line.replace("label-attribute-name-from-prior-job", label_attribute_name)) + else: + file_content.append(line) + + template_key = os.path.join(output_dir_key, job_name, "annotation-tool/template.liquid") + s3.put_object(Bucket=data_bucket_name, Key=template_key, Body="\n".join(file_content)) + + return f"s3://{data_bucket_name}/{template_key}" + + def generate_ui_template( job_name: str, task_type: TaskTypes, @@ -133,6 +191,7 @@ def generate_ui_template( short_instructions: str, data_bucket_name: str, output_dir_key: str, + label_attribute_name: str = None, ) -> str: template_key = None template_path = os.path.join( @@ -159,6 +218,8 @@ def generate_ui_template( file_content.append(short_instructions) elif "DESCRIPTION_STUB" in line: file_content.append(line.replace("DESCRIPTION_STUB", description)) + elif "label-attribute-name-from-prior-job" in line and label_attribute_name: + file_content.append(line.replace("label-attribute-name-from-prior-job", label_attribute_name)) else: file_content.append(line) diff --git a/backend/src/ml_space_lambda/utils/labeling_job_templates/VerificationBoundingBox.html b/backend/src/ml_space_lambda/utils/labeling_job_templates/VerificationBoundingBox.html new file mode 100644 index 00000000..7f0e526c --- /dev/null +++ b/backend/src/ml_space_lambda/utils/labeling_job_templates/VerificationBoundingBox.html @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + diff --git a/backend/src/ml_space_lambda/utils/labeling_job_templates/VerificationSemanticSegmentation.html b/backend/src/ml_space_lambda/utils/labeling_job_templates/VerificationSemanticSegmentation.html new file mode 100644 index 00000000..6379ee8b --- /dev/null +++ b/backend/src/ml_space_lambda/utils/labeling_job_templates/VerificationSemanticSegmentation.html @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + diff --git a/backend/test/utils/test_generate_custom_ui_template.py b/backend/test/utils/test_generate_custom_ui_template.py new file mode 100644 index 00000000..746e5257 --- /dev/null +++ b/backend/test/utils/test_generate_custom_ui_template.py @@ -0,0 +1,362 @@ +# +# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). +# You may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import unittest +from unittest import mock + +from ml_space_lambda.utils.groundtruth_utils import generate_custom_ui_template + + +class GenerateCustomUITemplateTest(unittest.TestCase): + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_with_asset_js_replacement(self, mock_s3, mock_boto3): + """Test that {ASSET_JS} placeholder is replaced with correct assets domain URL""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = '\n
Test
' + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Test Description", + full_instructions="Full Instructions", + short_instructions="Short Instructions", + data_bucket_name="test-bucket", + output_dir_key="output-dir", + ) + + # Verify S3 put_object was called + mock_s3.put_object.assert_called_once() + call_args = mock_s3.put_object.call_args + + # Check the uploaded content contains the replaced asset URL + uploaded_content = call_args[1]["Body"] + assert "https://assets.crowd.aws/crowd-html-elements.js" in uploaded_content + assert "{ASSET_JS}" not in uploaded_content + + # Check return value + assert result == "s3://test-bucket/output-dir/test-job/annotation-tool/template.liquid" + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_with_full_instructions_marker(self, mock_s3, mock_boto3): + """Test that full instructions are added after the full-instructions start marker""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = """
+ + +
""" + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Test Description", + full_instructions="

These are the full instructions

", + short_instructions="Short Instructions", + data_bucket_name="test-bucket", + output_dir_key="output-dir", + ) + + # Verify the full instructions were inserted + call_args = mock_s3.put_object.call_args + uploaded_content = call_args[1]["Body"] + + assert "" in uploaded_content + assert "

These are the full instructions

" in uploaded_content + # Verify the instruction appears after the marker + marker_pos = uploaded_content.index("") + instruction_pos = uploaded_content.index("

These are the full instructions

") + assert instruction_pos > marker_pos + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_with_short_instructions_marker(self, mock_s3, mock_boto3): + """Test that short instructions are added after the short-instructions start marker""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = """
+ + +
""" + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Test Description", + full_instructions="Full Instructions", + short_instructions="

Brief instructions here

", + data_bucket_name="test-bucket", + output_dir_key="output-dir", + ) + + # Verify the short instructions were inserted + call_args = mock_s3.put_object.call_args + uploaded_content = call_args[1]["Body"] + + assert "" in uploaded_content + assert "

Brief instructions here

" in uploaded_content + # Verify the instruction appears after the marker + marker_pos = uploaded_content.index("") + instruction_pos = uploaded_content.index("

Brief instructions here

") + assert instruction_pos > marker_pos + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_with_description_stub(self, mock_s3, mock_boto3): + """Test that DESCRIPTION_STUB is replaced with actual description""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = '
Content
' + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Custom Task Description", + full_instructions="Full Instructions", + short_instructions="Short Instructions", + data_bucket_name="test-bucket", + output_dir_key="output-dir", + ) + + # Verify the description was replaced + call_args = mock_s3.put_object.call_args + uploaded_content = call_args[1]["Body"] + + assert "Custom Task Description" in uploaded_content + assert "DESCRIPTION_STUB" not in uploaded_content + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_with_label_attribute_name(self, mock_s3, mock_boto3): + """Test that label-attribute-name-from-prior-job is replaced when label_attribute_name is provided""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = 'Content' + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Test Description", + full_instructions="Full Instructions", + short_instructions="Short Instructions", + data_bucket_name="test-bucket", + output_dir_key="output-dir", + label_attribute_name="my-label-attribute", + ) + + # Verify the label attribute name was replaced + call_args = mock_s3.put_object.call_args + uploaded_content = call_args[1]["Body"] + + assert "my-label-attribute" in uploaded_content + assert "label-attribute-name-from-prior-job" not in uploaded_content + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_without_label_attribute_name(self, mock_s3, mock_boto3): + """Test that label-attribute-name-from-prior-job is NOT replaced when label_attribute_name is None""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = 'Content' + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Test Description", + full_instructions="Full Instructions", + short_instructions="Short Instructions", + data_bucket_name="test-bucket", + output_dir_key="output-dir", + label_attribute_name=None, + ) + + # Verify the label attribute name was NOT replaced + call_args = mock_s3.put_object.call_args + uploaded_content = call_args[1]["Body"] + + assert "label-attribute-name-from-prior-job" in uploaded_content + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_with_all_replacements(self, mock_s3, mock_boto3): + """Test complete template with all possible replacements""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = """ + + + + + + + + + + + + +""" + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="verification-job", + description="Verify the bounding boxes", + full_instructions="

Carefully review each bounding box

", + short_instructions="

Click approve or reject

", + data_bucket_name="my-bucket", + output_dir_key="my-output", + label_attribute_name="previous-job-label", + ) + + # Verify all replacements were made + call_args = mock_s3.put_object.call_args + uploaded_content = call_args[1]["Body"] + + # Check all replacements occurred + assert "https://assets.crowd.aws/crowd-html-elements.js" in uploaded_content + assert "previous-job-label" in uploaded_content + assert "Verify the bounding boxes" in uploaded_content + assert "

Carefully review each bounding box

" in uploaded_content + assert "

Click approve or reject

" in uploaded_content + + # Check original placeholders are gone + assert "{ASSET_JS}" not in uploaded_content + assert "label-attribute-name-from-prior-job" not in uploaded_content + assert "DESCRIPTION_STUB" not in uploaded_content + + # Check S3 key and return value + assert call_args[1]["Key"] == "my-output/verification-job/annotation-tool/template.liquid" + assert result == "s3://my-bucket/my-output/verification-job/annotation-tool/template.liquid" + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_iso_region(self, mock_s3, mock_boto3): + """Test that ISO regions use correct assets domain""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-iso-east-1" + + custom_template_html = '' + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Test Description", + full_instructions="Full Instructions", + short_instructions="Short Instructions", + data_bucket_name="test-bucket", + output_dir_key="output-dir", + ) + + # Verify ISO region assets domain is used + call_args = mock_s3.put_object.call_args + uploaded_content = call_args[1]["Body"] + + assert "crowd-html-elements-us-iso-east-1.s3.us-iso-east-1.c2s.ic.gov" in uploaded_content + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_with_trailing_slash(self, mock_s3, mock_boto3): + """Test that output_dir_key with trailing slash is handled correctly""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = "
Test
" + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Test Description", + full_instructions="Full Instructions", + short_instructions="Short Instructions", + data_bucket_name="test-bucket", + output_dir_key="output-dir/", + ) + + # Verify S3 key is correct even with trailing slash + call_args = mock_s3.put_object.call_args + s3_key = call_args[1]["Key"] + + # Should still produce valid path + assert s3_key == "output-dir/test-job/annotation-tool/template.liquid" + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_with_multiple_asset_js_references(self, mock_s3, mock_boto3): + """Test that multiple {ASSET_JS} placeholders are all replaced""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = """ +""" + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Test Description", + full_instructions="Full Instructions", + short_instructions="Short Instructions", + data_bucket_name="test-bucket", + output_dir_key="output-dir", + ) + + # Verify all instances were replaced + call_args = mock_s3.put_object.call_args + uploaded_content = call_args[1]["Body"] + + assert uploaded_content.count("https://assets.crowd.aws/crowd-html-elements.js") == 2 + assert "{ASSET_JS}" not in uploaded_content + + @mock.patch("ml_space_lambda.utils.groundtruth_utils.boto3") + @mock.patch("ml_space_lambda.utils.groundtruth_utils.s3") + def test_generate_custom_ui_template_preserves_unmatched_lines(self, mock_s3, mock_boto3): + """Test that lines without placeholders are preserved as-is""" + mock_session = mock_boto3.session.Session() + mock_session.region_name = "us-east-1" + + custom_template_html = """
Regular content
+

Another line without placeholders

+{{ task.input.data }}""" + + result = generate_custom_ui_template( + custom_template_html=custom_template_html, + job_name="test-job", + description="Test Description", + full_instructions="Full Instructions", + short_instructions="Short Instructions", + data_bucket_name="test-bucket", + output_dir_key="output-dir", + ) + + # Verify original content is preserved + call_args = mock_s3.put_object.call_args + uploaded_content = call_args[1]["Body"] + + assert "
Regular content
" in uploaded_content + assert "

Another line without placeholders

" in uploaded_content + assert "{{ task.input.data }}" in uploaded_content diff --git a/backend/test/utils/test_get_groundtruth_utils.py b/backend/test/utils/test_get_groundtruth_utils.py index 4d3df058..5f29f23e 100644 --- a/backend/test/utils/test_get_groundtruth_utils.py +++ b/backend/test/utils/test_get_groundtruth_utils.py @@ -54,6 +54,10 @@ def test_get_auto_labeling_arn(self, mock_boto3): mock_session.get_partition_for_region.return_value = "aws" for task_type in TaskTypes: + # Skip PassThrough as it's only used for custom labeling jobs and doesn't + # have a labeling-job-algorithm-specification + if task_type == TaskTypes.PassThrough: + continue assert ( get_auto_labeling_arn(task_type) == f"arn:aws:sagemaker:us-east-1:432418664414:labeling-job-algorithm-specification/{_auto_labeling_task_arn_map[task_type]}" diff --git a/frontend/docs/user-guide/labeling-jobs.md b/frontend/docs/user-guide/labeling-jobs.md index 14d00840..e9d30060 100644 --- a/frontend/docs/user-guide/labeling-jobs.md +++ b/frontend/docs/user-guide/labeling-jobs.md @@ -24,7 +24,7 @@ In the Job overview section, provide the following information: In the Task type section, provide the following information: -- Task category – Use the drop down menu to select Image or Text. Ground Truth will use all images found in the S3 manifest for input datasets as input for your labeling job. +- Task category – Use the drop down menu to select Image, Text, or Custom. Ground Truth will use all images found in the S3 manifest for input datasets as input for your labeling job. - Task selection – Select one of the tiles to use the supported task types. Choose Next to move on to configuring your labeling job. @@ -45,4 +45,9 @@ In the Label verification tool section, provide the following information: - Short instructions – Provides instructions that are displayed on the page with the image that your workers are labeling. - Full instructions – Provides more detailed instructions for your workers. Expand the Additional instructions section to include full instructions. +### Custom Tasks +Custom tasks allow you to upload your own html template file. This template file will be what your labeling workforce will see when labeling the input dataset. +- Select 'Custom' from the task category dropdown +- Fill out the custom task title and description + Both instructions areas are rich text editors enabling you to format your instructions in an organized and clean way. You can also add links and images to your instructions. To add a link, highlight the text you want to turn into a hyperlink and select the link icon. When you add an image by selecting the image icon, a tooltip will pop up allowing you to include a URL or an S3 URI to an image. When adding a S3 URI, enter `{{ 'https://s3.amazonaws.com/your-bucket-name/image-file-name' | grant_read_access }}`. This renders the image URL with a short-lived, one-time access code appended so the worker's browser can display it. \ No newline at end of file diff --git a/frontend/src/content/images/console/groundtruth/tasktype-custom.png b/frontend/src/content/images/console/groundtruth/tasktype-custom.png new file mode 100644 index 0000000000000000000000000000000000000000..037921cea3dbcf51eb3d81057b24940a709fc338 GIT binary patch literal 118786 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 { + // If the tasktype is PassThrough (Custom) ensure the template isn't blank + if (data.taskSelection === LabelingJobTypes.PassThrough) { + return data.custom_task_template && data.custom_task_template.trim().length > 0; + } + return true; + }, { + message: 'Custom task template is required.', + path: ['custom_task_template'], }); const { state, setState, setFields, touchFields } = useValidationReducer(formSchema, { @@ -181,6 +215,7 @@ export function LabelingJobCreate () { TASK_TYPE_CONFIG[LabelingJobCategory.Image][LabelingJobTypes.ImageMultiClass] .fullInstruction, description: '', + custom_task_template: '', }, activeStepIndex: 0, } as LabelingJobCreateState); @@ -194,6 +229,8 @@ export function LabelingJobCreate () { ); } + const isCustomTask = state.form.taskSelection === LabelingJobTypes.PassThrough; + const stepValidator = [ [ 'job.LabelingJobName', @@ -201,7 +238,9 @@ export function LabelingJobCreate () { 'job.InputConfig.DataSource.S3DataSource.ManifestS3Uri', 'job.OutputConfig.S3OutputPath', ], - ['job.HumanTaskConfig'], + isCustomTask + ? ['job.HumanTaskConfig.WorkteamArn', 'job.HumanTaskConfig.TaskTitle', 'job.HumanTaskConfig.TaskDescription', 'custom_task_template'] + : ['job.HumanTaskConfig'], ]; function isStepValid (fields: string[], formErrors: any) { return fields.filter((field) => _.has(formErrors, field)).length === 0; @@ -250,6 +289,11 @@ export function LabelingJobCreate () { ...state.form.job, LabelAttributeName: labelAttributeNameComponents.join(''), }, + ...(state.form.taskSelection === LabelingJobTypes.PassThrough ? { + CustomLabelingJobVars: { + CustomTaskTemplate: state.form.custom_task_template, + } + } : {}) }) ).then((result: any) => { setState({ formSubmitting: false }); @@ -268,6 +312,32 @@ export function LabelingJobCreate () { }); }; + const step2 = isCustomTask ? { + title: 'Select workers and setup custom labeling job', + content: ( + + ), + } : { + title: 'Select workers and configure tool', + content: ( + + ), + }; + return ( ), }, - { - title: 'Select workers and configure tool', - content: ( - - ), - }, + step2, ]} onCancel={() => { navigate(`/project/${projectName}/jobs/labeling`, { @@ -357,6 +415,7 @@ export function LabelingJobCreate () { }} onSubmit={() => { const parseResult = formSchema.safeParse(state.form); + if (parseResult.success) { handleSubmit(); } else { diff --git a/frontend/src/entities/jobs/labeling/create/labeling-job-custom.tsx b/frontend/src/entities/jobs/labeling/create/labeling-job-custom.tsx new file mode 100644 index 00000000..790d7572 --- /dev/null +++ b/frontend/src/entities/jobs/labeling/create/labeling-job-custom.tsx @@ -0,0 +1,111 @@ +/** + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"). + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +import { FormProps } from '../../form-props'; +import { ILabelingJobCreateForm } from './labeling-job-create'; +import { + Container, + FormField, + Header, + Input, + SpaceBetween, + Textarea +} from '@cloudscape-design/components'; +import LabelingJobWorkers from './labeling-job-workers'; +import { useEffect } from 'react'; + +export type LabelingJobCustomProps = FormProps; + +export function LabelingJobCustom (props: LabelingJobCustomProps) { + const { item, formErrors, setFields, touchFields } = props; + + // Adjust the default task title to remove the hard-coded value + useEffect(() => { + if (item.job.HumanTaskConfig.TaskTitle === 'Custom: ') { + setFields({ + 'job.HumanTaskConfig.TaskTitle': 'Custom Task', + 'job.HumanTaskConfig.TaskDescription': 'Custom Description', + description: 'Custom Description' // This is a placeholder to pass zod checks + }); + } + }, [item.job.HumanTaskConfig.TaskTitle, item.job.HumanTaskConfig.TaskDescription, setFields, item.description]); + + return ( + + + Custom labeling task setup}> + + + { + setFields({ + 'job.HumanTaskConfig.TaskTitle': event.detail.value, + labels: [{ label: 'custom-label-job-dummy-label-1' }, {label: 'custom-label-job-dummy-label-2'}] + }); + }} + onBlur={() => touchFields(['job.HumanTaskConfig.TaskTitle'])} + data-cy='job.HumanTaskConfig.TaskTitle' + /> + + + { + setFields({ + 'job.HumanTaskConfig.TaskDescription': event.detail.value, + description: event.detail.value, + labels: [{ label: 'custom-label-job-dummy-label-1' }, {label: 'custom-label-job-dummy-label-2'}] + }); + }} + onBlur={() => touchFields(['job.HumanTaskConfig.TaskDescription'])} + data-cy='job.HumanTaskConfig.TaskDescription' + /> + + +