NOUKAI

Support Ticket Triage

Classify intent, extract entities and sentiment in parallel, then draft a grounded response.

A support ticket comes in. The pipeline classifies the intent, extracts entities and sentiment in parallel, then drafts a response grounded in the classification.

Tree

Flow: "ticket-triage"
├── Block: "classify-intent" (llm)
├── Container (parallel)
│     ├── Block: "extract-entities" (llm)
│     └── Block: "score-sentiment" (llm)
└── Block: "draft-response" (llm)

Blocks

classify-intent (llm)

Classify the support ticket into one of: billing, bug_report, feature_request, account_access, other.

Ticket: {{message}}

Output schema:

{
  "type": "object",
  "properties": {
    "intent": { "type": "string", "enum": ["billing", "bug_report", "feature_request", "account_access", "other"] },
    "confidence": { "type": "number" }
  }
}

extract-entities (llm) — runs in parallel with sentiment

Extract any order numbers, product names, error codes, and dates from the ticket. Return empty arrays if none.

Ticket: {{message}}

score-sentiment (llm) — runs in parallel with entity extraction

Score the sentiment of the ticket as a number from -1 (furious) to 1 (delighted), and identify the dominant emotion in one word.

Ticket: {{message}}

draft-response (llm)

You are a support agent. Draft a reply to the ticket below.

- Intent: {{classify_intent.intent}}
- Entities: {{extract_entities}}
- Sentiment: {{score_sentiment}}

Match the tone to the sentiment. If the sentiment score is below -0.3, lead with an apology.

Ticket: {{message}}

Why this shape?

  • Intent classification first, because the response draft depends on it. Everything downstream is conditioned on knowing what the ticket is about.
  • Entities and sentiment in parallel because they don't depend on each other. Sequential would just add latency for no reason.
  • Final block sees all three signals. Naming each upstream block clearly (classify_intent, extract_entities, score_sentiment) lets the response prompt reference them explicitly without a code block to reshape the data.
  • The original ticket is re-passed to draft-response because the response needs the actual customer's words, not just structured signals. This is one of the few times re-passing raw input is correct.

On this page