Task Management
This guide shows how to create, edit, and delete task groups, tasks, and missions. Tasks are Exacta Maestro™'s basic unit of work. By creating a task, you are scheduling work for autonomous vehicles in your facility. Exacta Maestro™ can intelligently assign tasks to the best agent for the job. You can also require a task be assigned to a specific agent.
Task groups are loose collections of tasks which are released for assignment together. Other systems may refer to this structure as a wave. Tasks in a task group are not eligible for assignment until the task group is activated. This allows users to delay assignment until Exacta Maestro™ has a complete picture of the priorities and due dates of the tasks to assign.
New Task Group
This sample shows how to create a task group through the GraphQL interface. The task group will start in a 'New' status. Tasks created against this task group will not be eligible for assignment until the task group is activated.
# Query
mutation newTaskGroup($taskGroupName:String!) {
taskAssignmentMutation {
newTaskGroup(request: { name: $taskGroupName }) {
isSuccess
error {
key
collectionName
message
}
value {
id
name
dateCreated
taskGroupState
}
}
}
}
# Variables
{
"taskGroupName":"My Task Group"
}
Set Task Group Active
This sample shows how to activate a task group so that tasks created against it become eligible for assignment.
# Query
mutation setTaskGroupActive($taskGroupName:String!) {
taskAssignmentMutation {
setTaskGroupActive(taskGroupName:$taskGroupName) {
isSuccess
error
}
}
}
# Variables
{
"taskGroupName": "My Task Group"
}
Get Task Groups
Get TaskGroup by Name
This sample shows how to fetch a single task group by name. You can optionally
retrieve tasks belonging to the group with this query. To return data about the
task group only, omit the tasks
field selection from the sample query.
# Query
query getTaskGroup($taskGroupName: String!) {
taskAssignmentQuery {
getTaskGroupByName(taskGroupName: $taskGroupName) {
isSuccess
error
value {
name
taskGroupState
id
dateCreated
taskGroupMetrics {
numberOfTasks
numberOfAssignedTasks
numberOfDispatchedTasks
numberOfCancelledTasks
numberOfCompletedTasks
numberOfFaultedTasks
}
# omit tasks to get task group data only
tasks {
isSuccess
error
value {
name
taskType
agentId
assignmentStatus
executionStatus
taskStateChange {
dateStamp
taskMutationType
message
}
# other task fields...
}
}
}
}
}
}
# Variables
{
"taskGroupName": "My Task Group"
}
Get TaskGroups Query
This sample shows how to query for multiple task groups using various criteria such as state or date created filters. All criteria shown can be combined or omitted as needed.
When filtering by task group states, provide an array of states to include. The following states are valid:
- New = 0
- Active = 100
- Paused = 200
- Completed = 300
- Cancelled = 400
When filtering by date, provide a string in ISO 8601 datetime format.
# Query
query getTaskGroups($input: TaskGroupQueryInput!) {
taskAssignmentQuery {
getTaskGroups(queryTaskGroupInput: $input) {
id
name
dateCreated
taskGroupState
taskGroupMetrics {
numberOfTasks
numberOfAssignedTasks
numberOfDispatchedTasks
numberOfCancelledTasks
numberOfCompletedTasks
numberOfFaultedTasks
}
}
}
}
# Variables
{
"input": {
"taskGroupStates": [0, 100],
"minDateCreated": "2019-11-12T00:00:00Z",
"maxDateCreated": "2019-11-13T00:00:00Z"
}
}
Create Tasks
Exacta Maestro™ supports a few different task payload types, as well as a few different task relationships. Within AgentHub, each AgentType can be configured to handle one or more task types. However, depending on the agent integration, not all agent services are actually capable of handling all types of task payloads.
TaskType | Description | Payload |
---|---|---|
TransferTask | Move a container from a source location to a destination location | Container, SourceLocationQuery, DestinationLocationQuery |
MoveTask | Move an agent through a series of locations | Locations |
MacroTask | Perform the collection of related tasks | TaskInputs |
Mission | Perform the specified child tasks sequentially | ChildTaskNames |
PalletPickTask | Pick a container from a location | LocationId |
PalletPlaceTask | Drop a container to a location | LocationId |
ProductPickTask | Pick a specified number of products from a location | LocationId, Quantity |
When a task is created, the loose CriteriaPayload
("TaskPayload") is defined. Then during the assignment process the task's InstructionPayload
is resolved. For example, the criteria payload for a TransferTask may use a regex to specify that a container should get dropped into a specific aisle, but the final location doesn't get resolved until the task is getting assigned to an agent.
New Transfer Task
The most common type of task within Exacta Maestro™ is the TransferTask
, which can be PickOnly (destination null), DropOnly (source null), or PickAndDrop.
Furthermore, TransferTasks can be standalone (executed by a single agent), a host macro task (container movement broken into multiple child tasks for multiple different agents), a macro child task (1 part of moving a container through the warehouse), or a mission child task (one of many things that an agent must do sequentially).
# Query
mutation newTransferTask($newTransferTask:TransferTaskInput!) {
taskAssignmentMutation {
newTransferTask(request:$newTransferTask) {
isSuccess
error {
key
collectionName
message
}
value {
name
}
}
}
}
# Variables
{
"newTransferTask": {
"name": "Child Task 1",
"taskGroupName": "My Task Group",
"priority": 1,
"dueDate": "2019-08-14T12:00:00.000Z",
"container": {
"id": "Test Container 1",
"dimensions": {
"x": 1,
"y": 2,
"z": 3
},
"type": "1",
"weight": 4.56,
"customDetails": [
{
"key": "a",
"value": "value a"
},
{
"key": "b",
"value": "value b"
},
{
"key": "c",
"value": "value c"
}
]
},
"sourceLocationQuery": {
"locationId": "host system location id",
"containerId": "host system container id",
"locationPatterns": "regex pattern targeting Exacta Maestro™ system location ids",
"excludedLocations": []
},
"destinationLocationQuery": {
"locationId": "host system location id",
"containerId": "host system container id",
"locationPatterns": "regex pattern targeting Exacta Maestro™ system location ids",
"excludedLocations": []
}
}
}
New Move Task
The MoveTask
moves an agent through a series of locations. The task can be used to move an agent to a specific location such as a charging station.
# Query
mutation newMoveTask($newMoveTask:MoveTaskInput!) {
taskAssignmentMutation {
newMoveTask(request:$newMoveTask) {
isSuccess
error {
key
collectionName
message
}
value {
name
}
}
}
}
# Variables
{
"newMoveTask": {
"name": "Child Task 1",
"taskGroupName": "My Task Group",
"priority": 1,
"dueDate": "2019-08-14T12:00:00.000Z",
"locations": [
{
"locationId": "location 1"
}
]
}
}
New Macro Task
The MacroTask
is a high-level task that contains a collection of related child tasks to achieve an objective. Different agents can perform macro child tasks. The child tasks can be TransferTask
, MoveTask
, or Mission
.
For example, a macro task can be a TransferTask
for one agent to transport a container to the 1st location, and another TransferTask
for another agent to transport the container to the second location.
# Query
mutation newMacroTask($newMacroTask:MacroTaskInput!) {
taskAssignmentMutation {
newMacroTask(request:$newMacroTask) {
results {
error
id
isFailure
isSuccess
}
}
}
}
# Variables
{
"newMacroTask": {
"name": "PalletSwap",
"tasks": [
{
"transferTaskInputModel": {
"name": "OID_t1",
"sourceLocationQuery": {
"locationId": "PS:B"
}
}
},
{
"transferTaskInputModel": {
"name": "OID_t2",
"destinationLocationQuery": {
"locationId": "PS:C"
},
"taskLinks": [
{
"successorToPredecessorTaskCriteria": {
"predecessorTaskName": "OID_t1",
"requireSameAgent": false,
"useSameLocation": false,
"preventIntermediateTasks": false
}
}
]
}
}
]
}
}
New Mission
Missions are used to ensure that a single agent handles multiple different child tasks sequentially. Not all agent integrations support missions, while some agent integrations require them. The mission can be created before or after the creation of the individual child tasks. The child tasks can be of any task payload type other than Mission (missions cannot be nested).
The mission itself should not have a MissionName
specified, the MissionName
should only contain a value on the individual child tasks.
# Query
mutation newMission($newMission:MissionTaskInput!) {
taskAssignmentMutation {
newMission(request:$newMission) {
isSuccess
error {
key
collectionName
message
}
value {
name
}
}
}
}
# Variables
{
"newMission": {
"name": "Mission 1",
"taskGroupName": "My Task Group",
"priority": 1,
"dueDate": "2019-08-14T12:00:00.000Z",
"taskNames": [
"Child Task 1",
"Child Task 2",
"Child Task 3",
"Child Task 4"
]
}
}
New Pallet Pick Task
# Query
mutation newPalletPickTask($newPalletPick:PalletPickTaskInput!) {
taskAssignmentMutation {
newPalletPickTask(request:$newPalletPick) {
isSuccess
error {
key
collectionName
message
}
value {
name
}
}
}
}
# Variables
{
"newPalletPick": {
"name": "Child Task 2",
"missionName": "Mission 1",
"taskGroupName": "My Task Group",
"priority": 1,
"dueDate": "2019-08-14T12:00:00.000Z",
"locationId": "host system location id"
}
}
New Pallet Place Task
# Query
mutation newPalletPlaceTask($newPalletPlace:PalletPlaceTaskInput!) {
taskAssignmentMutation {
newPalletPlaceTask(request:$newPalletPlace) {
isSuccess
error {
key
collectionName
message
}
value {
name
}
}
}
}
# Variables
{
"newPalletPlace": {
"name": "Child Task 3",
"missionName": "Mission 1",
"taskGroupName": "My Task Group",
"priority": 1,
"dueDate": "2019-08-14T12:00:00.000Z",
"locationId": "host system location id"
}
}
New Product Pick Task
# Query
mutation newProductPickTask($newProdPick:ProductPickTaskInput!) {
taskAssignmentMutation {
newProductPickTask(request:$newProdPick) {
isSuccess
error {
key
collectionName
message
}
value {
name
}
}
}
}
# Variables
{
"newProdPick": {
"name": "Child Task 4",
"missionName": "Mission 1",
"taskGroupName": "My Task Group",
"priority": 1,
"dueDate": "2019-08-14T12:00:00.000Z",
"quantity": 10,
"locationId": "host system location id"
}
}
Get Tasks
Tasks in Exacta Maestro™ can have different types of payloads, as described in the Create Tasks section. To resolve these different types of CriteriaPayload
and InstructionPayload
, the GraphQL schema uses "Fragments".
Get Task by Name
query getTask {
taskAssignmentQuery {
getTaskByName(taskName: "TG1 T1") {
isSuccess
error
value {
name
taskType
__typename
assignmentStatus
executionStatus
agentId
requiredAgentId
agentTypeId
endReason
endingUserId
creationDate
dispatchDate
dueDate
... on TransferTask {
criteriaPayload {
sourceLocationQuery {
containerId
locationId
locationPatterns
excludedLocations
}
destinationLocationQuery {
containerId
locationId
locationPatterns
excludedLocations
}
container {
id
type
dimensions {
x
y
z
}
weight
customDetails {
key
value
}
}
agentPayloadPosition {
positionId
payloadPositionIdConstraints
}
}
instructionPayload {
sourceLocationId
destinationLocationId
destinationReservationToken
container {
id
type
dimensions {
x
y
z
}
weight
customDetails {
key
value
}
}
}
}
... on MissionTask {
criteriaPayload {
taskNames
}
instructionPayload {
childTasks {
name
type
}
taskTypes
}
}
... on ProductPickTask {
criteriaPayload {
locationId
quantity
}
instructionPayload {
locationId
quantity
}
}
... on PalletPickTask {
criteriaPayload {
locationId
}
instructionPayload {
locationId
}
}
... on PalletPlaceTask {
criteriaPayload {
locationId
}
instructionPayload {
locationId
}
}
}
}
}
}
Get Tasks Paged
The getTasks
endpoint is used to get a page of tasks at a time. A request
parameter can also be used to filter while tasks are returned. Note that this example only resolves the task name, but it could request all of the fields and fragments as shown in the previous example.
query getTasks {
taskAssignmentQuery {
getTasks(
first: 20
last: null
before: null
pageRequest: {
previousItems: 0
nextItems: 20
beforeCursor: null
afterCursor: null
}
) {
__typename
nodes {
name
}
}
}
}
Update Task
Limited support is available for updating the properties of a task, including the properties dueDate, priority, requiredAgentId, and OnHold. Once a task is assigned, no properties can be changed.
# Query
mutation updateTasksOperation($input:UpdateTaskBatchCommandInput!) {
taskAssignmentMutation {
updateTasks(request:$input) {
errors {
results {
id
isSuccess
error
}
}
updatedTaskNames
}
}
}
# Variables
{
"input": {
"taskGroupName": "Task Group Name",
"updateTaskCommands": [
{
"name": "Task Name",
"dueDate": "2019-08-14T12:00:00.000Z",
"priority": 1,
"onHold": false,
"requiredAgentId": "Agent 2"
}
]
}
}
Force End Task
Host systems may request that a task gets immediately Completed
, Cancelled
, or Faulted
. When the call is made the request is queued for asynchronous processing. Therefore, a success result only indicates that the request will be processed, not that the task was successfully ended.
CustomDetails can be passed with the request, used to control how the system updates in response to the ended task. For example, the keys InventoryPicked
and InventoryPlaced
can be used to control whether or not the inventory updates should occur.
Complete Task
Use this to forcefully end an agent's task in a successful state. This is useful when the agent faulted and required manual intervention to complete its task. Issue the following query to start the process, then monitor the task's status. If the task ends before completion is processed, the operation will fail silently.
# Query
mutation beginCompleteTaskOperation($input:BeginCompleteTaskCommandInput!) {
taskAssignmentMutation {
beginCompleteTask(request: $input) {
isSuccess
error
}
}
}
# Variables
{
"input": {
"taskName": "Task Name",
"taskGroupName": "Task group name",
"endReason": "Test",
"endingUserId": "Admin"
}
}
Cancel Task
Issue the following query to start the process of cancelling the execution of a task, then monitor the task's status. If the task ends before cancellation is processed, or if the assigned agent doesn't support cancellation, the operation will fail silently.
# Query
mutation beginCancelTaskOperation($input:BeginCancelTaskCommandInput!) {
taskAssignmentMutation {
beginCancelTask(request: $input) {
isSuccess
error
}
}
}
# Variables
{
"input": {
"taskName": "Task Name",
"taskGroupName": "Task group name"
"endReason": "Test",
"endingUserId": "Admin",
"customDetails": [
{ "key": "InventoryPicked", "value": "true" },
{ "key": "InventoryPlaced", "value": "false" }
]
}
}
Fault Task
Use this to forcefully end an agent's task in a faulted state. This is useful when the task was invalid or otherwise could not be completed. Issue the following query to start the process, then monitor the task's status. If the task ends before faulting is processed, the operation will fail silently.
# Query
mutation beginFaultTaskOperation($input:BeginFaultTaskCommandInput!) {
taskAssignmentMutation {
beginFaultTask(request: $input) {
isSuccess
error
}
}
}
# Variables
{
"input": {
"taskName": "Task Name",
"taskGroupName": "Task group name",
"endReason": "Test",
"endingUserId": "Admin"
}
}