All demosAgent Assist

Agent Assist

A contact-centre copilot across eight live chats: intent, churn and frustration gauges, five signal flags and a macro suggestion, refreshed after every customer message.

/classify/rate/yes-no

How it works

The Jev original asked one model nine questions about every customer message: the best macro, the intent, a churn score, a frustration score and five yes/no flags. decision-machine-1 answers the same nine from three routes, and one batch covers every chat whose message landed in the same moment.

Each judgment sees the same short text: a profile line (Profile: pro plan, 14 months, 2 prior tickets.), then the last six messages as Customer: and Agent: lines, with the newest customer line marked LATEST Customer:. Frustration is about that newest line alone, so it is sent on its own.

  • /classify — best macro. Thirteen described labels: the twelve macros as {id: "Title: summary"}, plus none for "no canned reply fits; write a custom reply". At or above 60% confidence the macro body is filled into the reply box and sent 1.5 s later; below it the top three are listed with probabilities for the agent to pick.
  • /classify — intent. The ten Jev intents. Two descriptions needed sharpening to keep a confused first-time user out of bug_report: general_help is now "needs guidance using the product or is confused by the interface; nothing is technically broken", and bug_report is "software is malfunctioning and the customer describes errors, logs or failure rates". The ten labels: billing_dispute, account_access, cancellation_threat, feature_question, data_privacy_request, shipping_delay, bug_report, general_help, gratitude_or_closing, other.
  • /rate — churn risk. Four levels, low to high: satisfied or only asking · mildly dissatisfied, no mention of leaving · repeated failures or a competitor comparison · says outright they will cancel. The score comes back on that 0–3 scale and drives the gauge.
  • /rate — frustration. No complaint: a greeting, a question, thanks, or a plain factual report · reports a problem or makes a small complaint, with no emotive words · openly frustrated: emphatic words, repeated complaints · furious: ultimatums, insults, threats or CAPITALS. Short anchors matter here: wordier ones collapsed every calm bug report onto 2.0.
  • /yes-no — the five flags, eight statements, one call. "The customer asks for a manager, a supervisor or a human decision maker." · "The customer says they will cancel, leave or switch to a competitor." · "The customer makes a demand under a law or regulation, such as GDPR, CCPA, erasure or data access." · "The customer asks for money back: a refund, chargeback, reimbursement or account credit." · "Something on the company's side went wrong for this customer, rather than a neutral question, a user-side issue, or the customer thanking us." · "The customer's request is a simple question or a standard account action." · "The issue is beyond what a front-line agent can settle alone, or the customer is too angry to close the chat today." · "The chat is over: the line marked LATEST Customer is the customer's goodbye or thank-you. Whatever they asked for earlier does not count here — judge that one line alone." A batch shares its when_true/when_false hints, so each statement carries its own criteria. Needs supervisor is the strongest of the first four arms. The last statement is the veto that keeps none alive: above 47% the copilot refuses to auto-send any macro, so a chat that ends in "thank you" does not get answered with a canned reply. Refund eligible is not a model answer at all: it is the plan-and-tenure policy, computed in code.

Batching. The eight scripts deliver forty messages on a three-second grid, so chats collide on purpose. Every judgment queued inside a 120 ms window leaves together: one classify per label set, one rate per scale and one yes-no carry up to thirty-two chats in their texts array. A whole run is about seventy calls instead of two hundred. The shared client queues at two calls a second for the whole page and retries 429s; the run stops by itself after the last message, or after 60 seconds.

The numbers. Model is x-inference-ms from each response. It is per batch, not per chat: one call judging eight transcripts at once reports a few seconds, which is a few hundred milliseconds of model time per chat. Round trip is the browser's fetch time, around a second for a batch that size. Panel is customer message on screen to copilot refreshed, and it is the slow one here: a judgment needs five calls, the shared demo key allows two calls a second for the whole page, so the fifth call waits about two seconds in the client queue. On a key of your own the panel tracks the round trip. The 4 s LLM toggle is a stand-in for a prompt-and-parse copilot; that wait is artificial and everything else on the strip is measured.

Ported from the agent-assist Jev experiment. Every request here is live; the shared demo key allows about 2 requests per second across all visitors.