Draft a customer-facing reply in a given tone, grounded only in provided context, with a human-review gate.
Draft a customer-facing support reply in a tone you choose — and get back a strict JSON object that tells you whether it's safe to send. The reply is grounded only in the context you provide; when the prompt can't answer from that context, it flags requires_human: true and lists exactly what's missing instead of inventing a policy.
This is the part of a support pipeline most likely to embarrass you if it hallucinates. The design treats that head-on: the draft never states a fact, price, policy, or promise that isn't in the customer's message or your knowledgeContext. It's a draft for a human to review, not an auto-send.
| Entrypoint | Renders | Inputs |
|---|---|---|
system | Drafting instructions + tone + knowledge context + embedded output schema | tone, optional knowledgeContext, agentName, company |
user | The delimited customer message/thread to reply to | text |
text (string, required) — the customer's message or the full thread to reply to.tone (string, required) — how the reply should sound, e.g. "warm and apologetic", "concise and professional", "friendly and upbeat".knowledgeContext (string, optional) — the facts, policies, or account details the reply may rely on. This is the only external information the reply may state as fact. Omit it and the prompt will refuse to assert any product specifics.agentName (string, optional) — name to sign off with.company (string, optional) — the company the agent represents.{
"reasoning": "Customer asks for a refund on an annual plan; refund eligibility is not in the knowledge context, so the reply acknowledges and escalates.",
"reply": "Hi there — I'm sorry for the trouble with your annual plan...",
"requires_human": true,
"unresolved_points": ["refund eligibility for annual plans is not specified in the provided context"]
}
reasoning is emitted first — a brief plan of what the reply covers and what it can't answer.reply is the draft body in your tone, with no invented facts and no placeholders/subject line.requires_human is the safety gate: true whenever the message can't be fully and safely resolved from the provided context — missing info, or any refund / cancellation / legal / churn-risk matter. Route those to an agent.unresolved_points lists what the draft couldn't supply. Empty array when the reply fully resolves the message.Unlike the classifiers in this collection (all temperature: 0), reply-drafting is open-ended generation, where a little sampling variety yields more natural, less templated prose. The safety here comes from the prompt rules (never invent facts; the requires_human gate), not from greedy decoding — so a small temperature is safe and improves the writing. The choice is documented in the version metadata.
text, tone, knowledgeContext, agentName, company — special characters are never HTML-escaped.requires_human: true + unresolved_points, never a fabricated answer.additionalProperties: false, complete required.Verified by local render and a live no-hallucination battle-test (a refund question with no policy in context correctly escalates rather than inventing a policy). Suggested default model claude-sonnet-4-6 at temperature: 0.3.