# Intent Router Node

> Classifies input with the Jev decision model and routes per class, with a low-confidence fallback handle.

**URL:** https://caywork.com/learn/docs/node/intent-router-node

## Content

The **Intent Router Node** classifies the user's input with the Jev decision model (TypeSafe System One, via OpenRouter) and routes execution to one of its class handles — no LLM prompt, no text parsing. One typed decision call, typically 70-500ms.

## How it works

1. The node sends the input text plus your class definitions to Jev as a single **Choice** question.
2. Jev returns the chosen class with calibrated confidence and a probability for every class.
3. The flow routes to the `route:<class_id>` edge whose class was chosen. If confidence is below your threshold, it routes to the `route:low_confidence` handle instead.

## Parameters

* **question** (string): The routing question Jev answers (e.g. "Which category does this user request belong to?").
* **classes** (array): One entry per route. Each class has:
  * **id** (string): The handle identifier — wire the edge from `route:<id>`.
  * **description** (string): What belongs in this class. Descriptions, not names, drive zero-shot quality.
* **confidence_threshold** (number, 0-1, default 0.7): Below this, the low-confidence handle is used.
* **input_key** (string, default "user_message"): Which state field to classify.

## Output Handles

* `route:<class_id>` — one per class.
* `route:low_confidence` — fallback when the decision is not confident enough. Wire this to an LLM-based router or a human review path.

## State

Writes `intent = { id, confidence, probabilities }` — readable by a Condition Node via dotted paths like `intent.confidence`.

## Use Cases

1. **Intent routing**: `UserChatInput → IntentRouter → {billing_flow, support_flow, sales_flow}` with a low-confidence fallback to a general agent.
2. **Language/team triage**: pick the department that should own a ticket.
3. **Topic gating**: separate FAQ-style questions from deep research requests.

## Tips

* Always add an "other"/catch-all class so Jev can say none of the classes fit.
* Write descriptions that separate the classes from each other ("Invoices, payments, refunds" vs "Delivery status, delays").
* If the decision service is unavailable, the node routes to low_confidence — the flow never dead-ends.