AgentSkillsCN

Tickets

当您需要管理SuperOps.ai工单时,可使用此技能:创建、更新、搜索或管理服务台相关业务。本技能覆盖工单字段、状态、优先级、任务分配、备注、工时记录,以及工作流自动化,内置了验证逻辑与常见的MSP工作流程,是MSP技术人员通过SuperOps.ai PSA高效处理服务交付的必备工具。

SKILL.md
--- frontmatter
description: >
  Use this skill when working with SuperOps.ai tickets - creating, updating,
  searching, or managing service desk operations. Covers ticket fields,
  statuses, priorities, assignments, notes, time entries, and workflow automations.
  Includes business logic for validation and common MSP workflows.
  Essential for MSP technicians handling service delivery through SuperOps.ai PSA.
triggers:
  - superops ticket
  - service ticket superops
  - create ticket superops
  - ticket status superops
  - ticket priority
  - superops service desk
  - ticket triage
  - escalate ticket
  - resolve ticket superops
  - ticket notes superops
  - time entry ticket

SuperOps.ai Ticket Management

Overview

SuperOps.ai tickets are the core unit of service delivery in the PSA. Every client request, incident, and service task flows through the ticketing system. This skill covers comprehensive ticket management including creation, updates, notes, time entries, and workflow automation using the GraphQL API.

Ticket Status Values

StatusDescriptionBusiness Logic
OpenNewly created or reopenedDefault for new tickets
In ProgressActively being workedTechnician assigned
PendingWaiting for external actionSLA clock may pause
ResolvedIssue addressedAwaiting confirmation
ClosedTicket completeNo further action

Ticket Priority Levels

PriorityDescriptionTypical Response
CriticalBusiness-stopping issueImmediate response
HighMajor productivity impact1-2 hours
MediumSingle user/workaround exists4-8 hours
LowMinor issue/enhancementNext business day

Key Ticket Fields

Core Fields

FieldTypeRequiredDescription
ticketIdIDSystemAuto-generated unique identifier
ticketNumberStringSystemHuman-readable ticket number
subjectStringYesBrief issue summary
descriptionStringNoDetailed description
ticketTypeEnumNoIncident, Service Request, Problem, Change
requestTypeEnumNoClassification type
sourceEnumNoHow ticket was created (email, portal, phone)

Assignment Fields

FieldTypeRequiredDescription
clientClientIdentifierYesClient/account reference
siteSiteIdentifierNoSite within client
requesterRequesterIdentifierNoPerson who reported
assigneeTechnicianIdentifierNoAssigned technician
techGroupTechGroupIdentifierNoTechnician group

Classification Fields

FieldTypeRequiredDescription
priorityEnumNoCritical, High, Medium, Low
impactEnumNoImpact level
urgencyEnumNoUrgency level
categoryCategoryIdentifierNoService category

GraphQL Operations

Create a Ticket

graphql
mutation createTicket($input: CreateTicketInput!) {
  createTicket(input: $input) {
    ticketId
    ticketNumber
    subject
    status
    priority
    createdTime
    client {
      accountId
      name
    }
    assignee {
      id
      name
    }
  }
}

Variables:

json
{
  "input": {
    "subject": "Unable to access email - Outlook disconnected",
    "description": "User reports Outlook showing disconnected status since 9am. Webmail works fine.",
    "client": {
      "accountId": "abc123"
    },
    "priority": "HIGH",
    "requester": {
      "email": "john.smith@acme.com"
    },
    "techGroup": {
      "name": "Service Desk"
    },
    "category": {
      "name": "Email"
    }
  }
}

List Tickets

graphql
query getTicketList($input: ListInfoInput!) {
  getTicketList(input: $input) {
    tickets {
      ticketId
      ticketNumber
      subject
      status
      priority
      createdTime
      lastUpdatedTime
      client {
        accountId
        name
      }
      assignee {
        id
        name
      }
      requester {
        id
        name
        email
      }
    }
    listInfo {
      totalCount
      hasNextPage
      endCursor
    }
  }
}

Variables with Filters:

json
{
  "input": {
    "first": 50,
    "filter": {
      "status": ["Open", "In Progress"],
      "priority": ["Critical", "High"],
      "client": {
        "accountId": "abc123"
      }
    },
    "orderBy": {
      "field": "createdTime",
      "direction": "DESC"
    }
  }
}

Get Single Ticket

graphql
query getTicket($input: TicketIdentifierInput!) {
  getTicket(input: $input) {
    ticketId
    ticketNumber
    subject
    description
    status
    priority
    impact
    urgency
    createdTime
    lastUpdatedTime
    client {
      accountId
      name
    }
    site {
      id
      name
    }
    requester {
      id
      name
      email
      phone
    }
    assignee {
      id
      name
      email
    }
    techGroup {
      id
      name
    }
    category {
      id
      name
    }
    customFields {
      name
      value
    }
  }
}

Variables:

json
{
  "input": {
    "ticketId": "ticket-uuid-here"
  }
}

Update a Ticket

graphql
mutation updateTicket($input: UpdateTicketInput!) {
  updateTicket(input: $input) {
    ticketId
    ticketNumber
    status
    priority
    assignee {
      id
      name
    }
    lastUpdatedTime
  }
}

Variables - Assign and Change Status:

json
{
  "input": {
    "ticketId": "ticket-uuid-here",
    "status": "In Progress",
    "assignee": {
      "id": "tech-uuid"
    },
    "priority": "HIGH"
  }
}

Variables - Resolve Ticket:

json
{
  "input": {
    "ticketId": "ticket-uuid-here",
    "status": "Resolved",
    "resolution": "Cleared Outlook cache and repaired Office installation. Email flow restored."
  }
}

Add Ticket Note

graphql
mutation addTicketNote($input: AddTicketNoteInput!) {
  addTicketNote(input: $input) {
    noteId
    content
    createdTime
    isPublic
    createdBy {
      id
      name
    }
  }
}

Variables - Internal Note:

json
{
  "input": {
    "ticketId": "ticket-uuid-here",
    "content": "Checked event logs - found KB5034441 update correlation. Known Outlook cache issue.",
    "isPublic": false
  }
}

Variables - Public Note (visible to client):

json
{
  "input": {
    "ticketId": "ticket-uuid-here",
    "content": "We've identified the cause of the issue. A technician is working on the fix and will have it resolved within the hour.",
    "isPublic": true
  }
}

Add Time Entry

graphql
mutation addTicketTimeEntry($input: AddTimeEntryInput!) {
  addTicketTimeEntry(input: $input) {
    timeEntryId
    ticketId
    duration
    description
    technician {
      id
      name
    }
    createdTime
  }
}

Variables:

json
{
  "input": {
    "ticketId": "ticket-uuid-here",
    "duration": 30,
    "description": "Troubleshooting Outlook connectivity, cleared cache, repaired Office installation",
    "workType": "Remote Support",
    "billable": true
  }
}

Common Workflows

Ticket Creation Flow

  1. Validate client exists - Query client by name or ID
  2. Check for duplicates - Search recent tickets with similar subject
  3. Set defaults:
    • Status: Open
    • Priority: Medium (if not specified)
  4. Create ticket - Use createTicket mutation
  5. Send acknowledgment - Note auto-reply to requester

Ticket Triage Workflow

graphql
# 1. Get unassigned tickets
query getUnassignedTickets($input: ListInfoInput!) {
  getTicketList(input: $input) {
    tickets {
      ticketId
      ticketNumber
      subject
      priority
      client { name }
      createdTime
    }
  }
}

Variables:

json
{
  "input": {
    "filter": {
      "status": ["Open"],
      "assignee": null
    },
    "orderBy": {
      "field": "priority",
      "direction": "DESC"
    }
  }
}

Escalation Workflow

graphql
mutation escalateTicket($input: UpdateTicketInput!) {
  updateTicket(input: $input) {
    ticketId
    status
    priority
    techGroup { name }
  }
}

Variables:

json
{
  "input": {
    "ticketId": "ticket-uuid",
    "priority": "CRITICAL",
    "techGroup": {
      "name": "Tier 2 Support"
    },
    "escalationReason": "Complex Exchange hybrid configuration issue"
  }
}

Error Handling

Common Errors

ErrorCauseResolution
Client not foundInvalid client IDVerify client exists
Invalid status transitionWorkflow rule violationCheck allowed transitions
Required field missingMissing subject/clientAdd required fields
Permission deniedInsufficient accessCheck user permissions
Rate limit exceededOver 800 req/minImplement backoff

Validation Patterns

javascript
// Validate before creating ticket
function validateTicketInput(input) {
  const errors = [];

  if (!input.subject || input.subject.trim().length === 0) {
    errors.push('Subject is required');
  }

  if (!input.client?.accountId) {
    errors.push('Client is required');
  }

  if (input.priority && !['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'].includes(input.priority)) {
    errors.push('Invalid priority level');
  }

  return errors;
}

Best Practices

  1. Validate before creating - Search for duplicates, verify client
  2. Use descriptive subjects - Include who's affected and symptoms
  3. Set accurate priority - Use impact/urgency matrix
  4. Log time immediately - Don't batch at end of day
  5. Update status promptly - Keeps queues accurate
  6. Document thoroughly - Future technicians will thank you
  7. Use internal notes for technical details - Keep public notes professional

Related Skills