Skip to main content
Back to how-to guides Use this pattern when you must understand why the platform treats a message as one request or as several, and tune that decision.

Concept

This article covers detection: how the platform decides that a message holds more than one intent. To choose what happens next, such as queueing, running in sequence, or running in parallel, see Handle messages that contain multiple user intents and Run multiple agents in parallel with multi-intent fan-out. Detection has one main path and three narrower paths. The platform does not detect intents with embeddings in production. You cannot set the detection prompt, the classifier timeout, or a classifier cap in ABL.

Minimal working example

A service desk supervisor lets the classifier detect billing and shipping intents in one message. It sets both thresholds and a minimum confidence for each detected request. The specialists are short stand-ins in the same project. Replace them with your real agents. agents/service-desk.agent.abl
agents/billing-agent.agent.abl
agents/shipping-agent.agent.abl

How it works

What the classifier sees and returns

The classifier reads:
  • The current message and the last 4 earlier messages.
  • Each intent category and its description from INTENTS:.
  • The names and descriptions of the agent’s domain tools.
  • The agent goal and limitations, when set.
It returns a list of intents. Each entry has a category, a confidence from 0 to 1, and a short summary of that request. It also returns a relationship: independent, dependent, or ambiguous. What the platform does with the answer:
  • A category that is not in your list is dropped.
  • A reply that cannot be read, a reply cut off by the output limit, or an empty list becomes one intent with no category and confidence 0.
  • Fewer than two intents means the multi-intent path does not run.
  • If the relationship is missing, the platform sets it. An intent without a route makes it ambiguous. All intents on one agent make it dependent. Otherwise it is ambiguous.
You cannot change the classifier timeout, its output size, or its prompt in ABL. It uses the project pipeline model.

Two thresholds in sequence

A message passes through up to two confidence checks, then the MULTI_INTENT filter. Example: intents at 0.9 and 0.7 do not pass step 1 at 0.85, because 0.7 is below it. They pass step 2 at 0.5, and the 0.6 filter keeps both. max_intents applies after detection, and only to some plans. It limits the queue, which holds the requests that wait their turn, and the menu choices of the disambiguate strategy. It is not part of the classifier prompt. It does not cap a parallel plan, and it does not cap the tasks that a sequential plan runs after a classifier detection. Every detected request that passes the confidence filter runs. The classifier output limit is the practical bound on how many intents it returns. The pipeline settings in an agent file must use camelCase keys: shortCircuit, confidenceThreshold, intentBridge, guidedThreshold. Snake_case keys are dropped without a message. The agent setting EXECUTION pipeline enabled: true has no effect unless the project runtime configuration also enables the pipeline.

Detection in a flow

A FLOW step checks each ON_INPUT branch alone. A branch with no condition, or a branch that ends in COMPLETE, is skipped. Two or more matches make a multi-intent message. The confidence does not come from a model. It comes from English wording in the message: Each later intent subtracts 0.04, with a floor of 0.55. A confidence_threshold above 0.92 drops every flow detection. A value above 0.68 drops a message with none of these words. A message in another language gets 0.68.

When the classifier fails

Three failures in a row open a circuit breaker for the tenant. It resets after 60 seconds. While it is open, detection stops silently and the supervisor routes with its normal model-driven path.

What a route can read

A route WHEN can read intent.category and intent.confidence. A condition on intent.intent_count compiles but is not available to routes. Do not use it.

Common variations

Tighten detection

Raise MULTI_INTENT confidence_threshold to drop weak second requests. Raise shortCircuit.confidenceThreshold to send fewer messages to the fast path.

Loosen detection

Lower intentBridge.guidedThreshold and confidence_threshold. Expect more false multi-intent plans. Two intents that map to one agent become dependent.

Turn detection off

Set MULTI_INTENT enabled: false. The supervisor makes one routing call per turn.

Verification

  1. Run the validator on all three files. Expect no errors and no warnings.
  2. Say “I was charged twice and where is my parcel”. Expect a plan with both intents.
  3. In the trace, open the pipeline_classify event. Check the intents, their confidence, and their summaries.
  4. Open pipeline_routing_resolve for the matching routes. Open pipeline_tiered_action for the tier chosen.
  5. Open multi_intent_plan_built for the strategy, the relationship, and the targets.
  6. Compare the intents in pipeline_classify with the targets in the plan. An intent that is missing from the plan was dropped by a threshold. No event reports the drop.
  7. Say “I was charged twice”. Expect a single intent and the normal route.

Production readiness checklist

  • The project enables the reasoning pipeline. Without it the agent setting does nothing.
  • Pipeline keys in the agent file are camelCase.
  • Every intent has a description that separates it from the others.
  • Both thresholds are tested with confidences on each side.
  • confidence_threshold is at most 0.9 if you use flow detection.
  • Tests cover a compound message, a single message, a message with an unknown request, and two intents for one agent.
  • Traces are checked for pipeline_classifier_unavailable during tests.

Common mistakes

Troubleshooting

Related articles: