ToTask Action - User Guide
The to_task action provides automated task annotation capabilities, supporting both file-based and AI inference-based annotation methods with comprehensive validation and progress tracking.
Overview
The ToTask action annotates tasks in your Synapse project by:
- Retrieving annotation data from JSON files (file-based method)
- Running model inference through pre-processors (inference-based method)
- Applying annotations to task data automatically
- Tracking progress and metrics in real-time
- Handling errors gracefully with automatic rollback
Prerequisites
Common Requirements
- Valid Synapse project with tasks
- Data collection linked to the project
- Agent with appropriate permissions
- Tasks matching your filter criteria
File-based Method Requirements
- Data units must have files matching the
target_specification_name - JSON files must be accessible via HTTP/HTTPS URLs
- JSON structure must match task object format
Inference-based Method Requirements
- Deployed and active pre-processor plugin
- Pre-processor must support the data types in your tasks
- Tasks must have primary images or compatible input data
Basic Usage
File-based Annotation
Annotate tasks using JSON data from file URLs stored in data units.
from synapse_sdk.plugins.categories.pre_annotation.actions.to_task import ToTaskAction
# Configuration
params = {
'name': 'File_Based_Annotation',
'description': 'Annotate tasks from JSON files',
'project': 123,
'agent': 1,
'task_filters': {
'status': 'pending',
'data_collection': 456
},
'method': 'file',
'target_specification_name': 'annotation_data',
'pre_processor_params': {}
}
# Execute
action = ToTaskAction(run=run_instance, params=params)
result = action.start()
# Check result
if result['status'] == 'SUCCEEDED':
print(f"Success: {result['message']}")
else:
print(f"Failed: {result['message']}")
How it works:
- System finds tasks matching the filters
- For each task, retrieves the data unit
- Finds files with specification name
annotation_data - Downloads JSON data from the file URL
- Applies the JSON data to the task
- Tracks success/failure for each task
Inference-based Annotation
Annotate tasks using AI model inference through a pre-processor.
params = {
'name': 'Inference_Based_Annotation',
'description': 'Auto-annotate using AI model',
'project': 123,
'agent': 1,
'task_filters': {
'status': 'pending',
'assignee': None # Unassigned tasks only
},
'method': 'inference',
'pre_processor': 789, # Pre-processor plugin release ID
'pre_processor_params': {
'confidence_threshold': 0.8,
'model_config': {
'batch_size': 16,
'device': 'cuda'
}
}
}
action = ToTaskAction(run=run_instance, params=params)
result = action.start()
How it works:
- System validates the pre-processor is active
- Finds tasks matching the filters
- For each task, extracts the primary image URL
- Calls pre-processor API with image and parameters
- Converts inference results to task object format
- Updates task with generated annotations
Parameter Reference
Required Parameters
name (string)
- Action name identifier
- Must not contain whitespace
- Example:
"File_Annotation_Job"
project (integer)
- Synapse project ID
- Must be a valid, accessible project
- Example:
123
agent (integer)
- Agent ID for execution
- Agent must have permissions on the project
- Example:
1
task_filters (object)
- Dictionary of filter criteria for task selection
- Supports all task query parameters
- Example:
{"status": "pending", "data_collection": 456}
method (string)
- Annotation method type
- Values:
"file"or"inference" - Determines which annotation strategy to use
Method-Specific Parameters
For File-based Method
target_specification_name (string, required for file method)
- Name of the file specification containing annotation JSON
- Must exist in the project's file specifications
- Example:
"annotation_data"
For Inference-based Method
pre_processor (integer, required for inference method)
- Pre-processor plugin release ID
- Pre-processor must be deployed and active
- Example:
789
pre_processor_params (object, optional)
- Configuration parameters passed to the pre-processor
- Structure depends on the pre-processor implementation
- Example:
{
'confidence_threshold': 0.8,
'model_config': {
'batch_size': 16,
'device': 'cuda',
'use_fp16': True
},
'post_processing': {
'nms_threshold': 0.5,
'min_size': 10
}
}
Optional Parameters
description (string)
- Human-readable description of the action
- Example:
"Annotate all pending tasks with model v2 predictions"
Task Filtering
The task_filters parameter supports rich filtering options:
Common Filter Examples
# Filter by status
task_filters = {'status': 'pending'}
# Filter by data collection
task_filters = {'data_collection': 456}
# Filter by assignee
task_filters = {'assignee': 12} # Specific user
task_filters = {'assignee': None} # Unassigned tasks
# Multiple filters (AND logic)
task_filters = {
'status': 'pending',
'data_collection': 456,
'assignee': None
}
# Filter by creation date
task_filters = {
'created_at__gte': '2025-01-01',
'created_at__lte': '2025-01-31'
}
Advanced Filtering
# Combine multiple criteria
task_filters = {
'status__in': ['pending', 'in_progress'],
'data_collection': 456,
'created_at__gte': '2025-01-01'
}
Progress and Metrics
Real-time Progress Updates
The action provides continuous progress updates:
# Progress is logged automatically during execution
# Example log output:
# [annotate_task_data] Progress: 25.0% (25/100)
# [annotate_task_data] Progress: 50.0% (50/100)
# [annotate_task_data] Progress: 100.0% (100/100)
Metrics Categories
Success Metrics:
- Total tasks processed
- Successfully annotated count
- Failed annotation count
- Standby (not yet processed) count
Status Messages:
# Example metrics output
{
'total': 100,
'success': 95,
'failed': 5,
'stand_by': 0
}
Accessing Metrics
Metrics are automatically logged to the run logger and can be accessed through the Synapse platform UI or API.
File-based Annotation Details
Expected JSON Structure
The JSON files must follow the task data object format:
{
"objects": [
{
"id": "obj_001",
"class_id": 1,
"type": "bbox",
"coordinates": {
"x": 100,
"y": 150,
"width": 200,
"height": 180
},
"properties": {
"confidence": 0.95,
"label": "person"
}
}
]
}
File Specification Setup
- Define file specification in your project with the target name (e.g.,
annotation_data) - Upload annotation JSON files to data units under this specification
- Ensure files are accessible via HTTP/HTTPS URLs
- Run the ToTask action with
target_specification_namematching your specification
Example Workflow
# Step 1: Prepare your data
# - Upload images to data collection
# - Upload annotation JSON files with specification "annotations"
# Step 2: Configure and run
params = {
'name': 'Apply_Pregenerated_Annotations',
'project': 123,
'agent': 1,
'task_filters': {'status': 'pending'},
'method': 'file',
'target_specification_name': 'annotations'
}
action = ToTaskAction(run=run_instance, params=params)
result = action.start()
Inference-based Annotation Details
Pre-processor Requirements
Your pre-processor must:
- Be deployed and in
RUNNINGstatus - Accept image URLs as input
- Return results in task-compatible format
- Support the data types in your tasks
Pre-processor Parameters
Configure inference behavior through pre_processor_params:
pre_processor_params = {
# Model configuration
'model_config': {
'batch_size': 16,
'device': 'cuda',
'use_fp16': True
},
# Inference thresholds
'confidence_threshold': 0.8,
'nms_threshold': 0.5,
# Post-processing
'min_object_size': 10,
'max_objects': 100,
# Output formatting
'include_masks': True,
'output_format': 'coco'
}
Inference Workflow
# Step 1: Deploy your pre-processor
# (See Pre-processor Plugin documentation)
# Step 2: Configure inference annotation
params = {
'name': 'AI_Auto_Annotation',
'project': 123,
'agent': 1,
'task_filters': {
'status': 'pending',
'data_collection': 456
},
'method': 'inference',
'pre_processor': 789,
'pre_processor_params': {
'confidence_threshold': 0.85,
'model_config': {
'device': 'cuda'
}
}
}
# Step 3: Execute
action = ToTaskAction(run=run_instance, params=params)
result = action.start()
# Step 4: Review results
# Check success/failed counts in metrics
# Review annotated tasks in Synapse UI
Pre-processor Management
The system automatically:
- Checks if pre-processor is running
- Starts the pre-processor if needed
- Waits for pre-processor to be ready
- Handles pre-processor errors gracefully
Error Handling
Task-level Errors
Individual task failures don't stop the workflow:
# Example: 100 tasks to process
# - 95 succeed
# - 5 fail (e.g., invalid JSON, network errors)
# Result: Job completes with success=95, failed=5
Failed tasks are logged with error details:
[Task 123] Failed: Invalid JSON format in annotation file
[Task 456] Failed: Pre-processor inference timeout
Critical Errors
System-level errors trigger immediate rollback:
# Critical error examples:
# - Project not found
# - No data collection linked
# - Target specification doesn't exist
# - Pre-processor not deployed
# On critical error:
# 1. Workflow stops immediately
# 2. Completed steps are rolled back
# 3. Temporary files are cleaned up
# 4. Error is raised with detailed message
Common Errors and Solutions
"Project has no data collection"
Solution: Link a data collection to your project before running.
"Target specification not found"
Solution: Verify the target_specification_name exists in project file specifications.
"Pre-processor not active"
Solution: Deploy and start your pre-processor before running inference annotation.
"No tasks found matching filters"
Solution: Check your task_filters criteria and verify tasks exist.
"Failed to download JSON from URL"
Solution: Ensure annotation files are accessible and URLs are valid.
Best Practices
Performance Optimization
-
Batch size for inference
pre_processor_params = {
'model_config': {
'batch_size': 32 # Adjust based on GPU memory
}
} -
Filter tasks effectively
# Good: Specific filters
task_filters = {
'status': 'pending',
'data_collection': 456,
'created_at__gte': '2025-01-01'
}
# Avoid: Too broad
task_filters = {'status': 'pending'} # May match thousands -
Use appropriate confidence thresholds
# Higher threshold = fewer false positives
pre_processor_params = {
'confidence_threshold': 0.9 # Strict
}
# Lower threshold = more detections
pre_processor_params = {
'confidence_threshold': 0.5 # Permissive
}
Reliability
-
Validate data before processing
- Check that tasks have required data (images, files)
- Verify file specifications exist
- Ensure pre-processors are tested and stable
-
Monitor progress
- Review progress logs during execution
- Check metrics after completion
- Investigate failed tasks
-
Handle partial failures
# After execution, check metrics
if result['status'] == 'SUCCEEDED':
# Check if all tasks succeeded
# Review failed count
# Re-run for failed tasks if needed
Security
-
File access validation
- Ensure JSON files are from trusted sources
- Validate file content before upload
- Use secure HTTPS URLs
-
Input validation
- Validate pre-processor parameters
- Check confidence thresholds are reasonable
- Verify task filters don't expose sensitive data
Complete Examples
Example 1: Bulk File-based Annotation
"""
Scenario: You have 1000 images with pre-generated annotation JSON files.
Goal: Apply all annotations to pending tasks.
"""
from synapse_sdk.plugins.categories.pre_annotation.actions.to_task import ToTaskAction
params = {
'name': 'Bulk_File_Annotation_Jan2025',
'description': 'Apply pre-generated annotations from external tool',
'project': 123,
'agent': 1,
'task_filters': {
'status': 'pending',
'data_collection': 456,
'created_at__gte': '2025-01-01'
},
'method': 'file',
'target_specification_name': 'external_annotations',
'pre_processor_params': {}
}
action = ToTaskAction(run=run_instance, params=params)
result = action.start()
print(f"Status: {result['status']}")
print(f"Message: {result['message']}")
Example 2: AI-powered Auto-annotation
"""
Scenario: You have a trained object detection model deployed as a pre-processor.
Goal: Auto-annotate all unassigned tasks with high-confidence predictions.
"""
params = {
'name': 'AI_Object_Detection_v2',
'description': 'Auto-detect objects using YOLOv8 model',
'project': 123,
'agent': 1,
'task_filters': {
'status': 'pending',
'assignee': None, # Only unassigned
'data_collection': 789
},
'method': 'inference',
'pre_processor': 456,
'pre_processor_params': {
'confidence_threshold': 0.85,
'nms_threshold': 0.5,
'model_config': {
'batch_size': 16,
'device': 'cuda',
'use_fp16': True
},
'class_filter': [1, 2, 3], # Only detect specific classes
'min_object_size': 20
}
}
action = ToTaskAction(run=run_instance, params=params)
result = action.start()
# Check results
if result['status'] == 'SUCCEEDED':
print("Auto-annotation completed successfully")
# Review tasks in Synapse UI for quality check
else:
print(f"Failed: {result['message']}")
Example 3: Active Learning Workflow
"""
Scenario: Iterative model improvement with active learning.
Goal: Auto-annotate with model, review uncertain cases manually.
"""
# Step 1: Auto-annotate with medium confidence
params_high_confidence = {
'name': 'Active_Learning_Round1_High',
'project': 123,
'agent': 1,
'task_filters': {'status': 'pending'},
'method': 'inference',
'pre_processor': 789,
'pre_processor_params': {
'confidence_threshold': 0.9 # High confidence only
}
}
action = ToTaskAction(run=run_instance, params=params_high_confidence)
result = action.start()
# Step 2: Low confidence cases go to manual review
# (These remain pending for human annotators)
# Step 3: After manual review, retrain model and repeat
Troubleshooting
Debugging Failed Tasks
-
Check logs for specific errors
Look for messages like:
[Task 123] Failed: <error_message> -
Verify task data structure
- Ensure tasks have required fields
- Check data units exist
- Validate file URLs are accessible
-
Test with small batch first
# Test with 10 tasks first
task_filters = {
'status': 'pending',
'limit': 10
}
Performance Issues
- Reduce batch size if experiencing timeouts
- Filter tasks more narrowly to process smaller groups
- Check pre-processor resource usage for inference method
Validation Errors
- "No tasks found" - Verify filters and task existence
- "Invalid project" - Check project ID and permissions
- "Target specification not found" - Verify file specification name
- "Pre-processor not found" - Check pre-processor ID and status
Next Steps
- Architecture Details: Read ToTask Action Development for technical architecture
- Custom Strategies: Learn how to extend the ToTask action with custom validation and annotation strategies
- Pre-processor Guide: See Pre-processor Plugin documentation for model deployment
Related Documentation
- Pre-annotation Plugin Overview
- Upload Plugins
- Plugin Development Guide
- API Reference