Skip to content
TheThinkLoop

Template - Support

Score

Ticket urgency

How urgently a support ticket needs a response, on a four-level rubric.

A score decision that places each ticket on an ordered urgency scale, so queues can be sorted by need instead of arrival time.

The decision

ScoreA position on the ordered levels (0 = first level), a confidence value, and a probability for every level.

How urgent is this support ticket?

Levels, lowest to highest

  1. 0Low: No time pressure. A question, feedback, or a minor cosmetic issue.
  2. 1Normal: A real problem with a workaround, or affecting one person.
  3. 2High: Blocks an important workflow or has a near deadline.
  4. 3Critical: Outage, data loss, or revenue impact affecting many users.

Evidence checks (asked in the same request)

  • Blocking issue: The customer is blocked from using the product.
  • Wide customer impact: Multiple users or production systems are affected.
  • Negative sentiment: The customer expresses frustration or dissatisfaction.

Expected output: A score from 0 to 3 (a probability-weighted average that can fall between levels), a probability for each level, and a confidence value, plus one probability per evidence check.

Input

The Decisions API reads one input. Combine these fields into it as labeled text so the model sees the facts the decision depends on.

Input fields
FieldTypeRequiredDescription
messagestringYesThe customer's message, verbatim. Include the subject line if there is one.
planstringNoThe customer's plan, if urgency targets differ by tier.

Worked examples

  1. Checkout outage affecting all customers

    Our checkout has been down for 40 minutes. All of our customers get a 502 error and we are losing sales. Need help immediately.

    A careful reviewer would say: Critical. An outage with revenue impact across all customers is the top of the rubric.

    Run this example
  2. A how-to question with no deadline

    No rush. When you get a chance, could you tell me how to export the monthly report as CSV?

    A careful reviewer would say: Low. A usage question, explicitly not time-sensitive.

    Run this example

Expected answers are human judgments written for this template, not model output.

How it works

Urgency is ordered, so it is a score rather than a choice. The difference matters: a score tells you a ticket sits between High and Critical, where a choice would treat the four labels as unrelated categories.

The level descriptions are the rubric. Write them in terms of observable facts, such as who is affected and whether there is a workaround, rather than adjectives like "serious".

Because the score is a weighted average, a 1.5 can mean "probably Normal or High" or "split between Low and Critical". The per-level probabilities tell you which. Check them before acting on a mid-range score.

Human review and thresholds

Recommended review policy

Sorting a queue by score is low-risk and can be fully automated. Paging someone is not: require a high probability on the Critical level, or a person's confirmation, before waking an on-call engineer.

Choosing thresholds

Under-rating a critical ticket is far more expensive than over-rating a normal one. If that holds for you, act on the probability of the top level rather than the rounded score, and accept more false alarms in exchange for fewer misses.

Starting automation threshold
80%
Starting don’t-decide threshold
50%

Starting points for the playground, not recommendations. The right values depend on your costs and on how the model’s confidence tracks accuracy on your data. Calibrate them.

Limitations

  • Customers who write "URGENT" in every message will score higher than calm customers with worse problems. The evidence checks help, and account data helps more.
  • The rubric encodes one company's priorities. A level that means "respond within the hour" for you needs to be written that way.
  • Urgency is not importance. Combine it with account tier if high-value customers should be seen first. See the customer priority template.

Use it in your code

The template definition is plain JSON: the question, the evidence checks, the input fields, and the starting policy. The SDK call below sends the same question and checks to the Decisions API from your server.

ticket-urgency.jsonjson
{
  "$format": "thethinkloop.template/v1",
  "slug": "ticket-urgency",
  "title": "Ticket urgency",
  "decides": "How urgently a support ticket needs a response, on a four-level rubric.",
  "question": {
    "name": "decision",
    "type": "score",
    "instructions": "How urgent is this support ticket?",
    "levels": [
      {
        "label": "Low",
        "description": "No time pressure. A question, feedback, or a minor cosmetic issue."
      },
      {
        "label": "Normal",
        "description": "A real problem with a workaround, or affecting one person."
      },
      {
        "label": "High",
        "description": "Blocks an important workflow or has a near deadline."
      },
      {
        "label": "Critical",
        "description": "Outage, data loss, or revenue impact affecting many users."
      }
    ]
  },
  "evidenceChecks": [
    {
      "name": "factor_1",
      "label": "Blocking issue",
      "type": "predicate",
      "instructions": "The customer is blocked from using the product."
    },
    {
      "name": "factor_2",
      "label": "Wide customer impact",
      "type": "predicate",
      "instructions": "Multiple users or production systems are affected."
    },
    {
      "name": "factor_3",
      "label": "Negative sentiment",
      "type": "predicate",
      "instructions": "The customer expresses frustration or dissatisfaction."
    }
  ],
  "inputs": [
    {
      "name": "message",
      "type": "string",
      "required": true,
      "description": "The customer's message, verbatim. Include the subject line if there is one."
    },
    {
      "name": "plan",
      "type": "string",
      "required": false,
      "description": "The customer's plan, if urgency targets differ by tier."
    }
  ],
  "expectedOutput": "A score from 0 to 3 (a probability-weighted average that can fall between levels), a probability for each level, and a confidence value, plus one probability per evidence check.",
  "examples": [
    {
      "title": "Checkout outage affecting all customers",
      "input": "Our checkout has been down for 40 minutes. All of our customers get a 502 error and we are losing sales. Need help immediately.",
      "expected": "Critical"
    },
    {
      "title": "A how-to question with no deadline",
      "input": "No rush. When you get a chance, could you tell me how to export the monthly report as CSV?",
      "expected": "Low"
    }
  ],
  "startingPolicy": {
    "automateAt": 0.8,
    "abstainBelow": 0.5,
    "note": "A starting point for exploration, not a recommendation. Calibrate against your own labeled examples."
  }
}
Equivalent SDK calljavascript
import OpenAI from "openai"; // openai >= 7.30.0

const client = new OpenAI(); // reads OPENAI_API_KEY on the server

const decision = await client.decisions.create({
  model: "gpt-6-luna",
  input: "Our checkout has been down for 40 minutes. All of our customers get a 502 error and we are losing sales. Need help immediately.",
  questions: [
    {
      type: "score",
      name: "decision",
      instructions: "How urgent is this support ticket?",
      levels: [
        {
          label: "Low",
          description: "No time pressure. A question, feedback, or a minor cosmetic issue."
        },
        {
          label: "Normal",
          description: "A real problem with a workaround, or affecting one person."
        },
        {
          label: "High",
          description: "Blocks an important workflow or has a near deadline."
        },
        {
          label: "Critical",
          description: "Outage, data loss, or revenue impact affecting many users."
        }
      ]
    },
    {
      type: "predicate",
      name: "factor_1",
      instructions: "The customer is blocked from using the product."
    },
    {
      type: "predicate",
      name: "factor_2",
      instructions: "Multiple users or production systems are affected."
    },
    {
      type: "predicate",
      name: "factor_3",
      instructions: "The customer expresses frustration or dissatisfaction."
    }
  ],
});

// Answers come back in question order. A question can also be refused.
const [main, ...checks] = decision.answers;
if (main.type === "refusal") throw new Error("The model declined to answer.");
if (main.type === "score") {
  console.log(main.score, main.confidence, main.probabilities);
}

Download it as ticket-urgency.json, or browse all developer resources.

Need this decision tuned to your policy?

We are running a small number of pilots with B2B teams: your policy, your examples, your thresholds. Request early access.