"My card hasn't shown up and it's been two weeks"
{ "intent": "card_not_arrived" }
Where intent detection usually starts
Most teams detect intents with a frontier model and a prompt that lists every intent, or with a classifier that needs hundreds of labeled messages per intent. The prompt slows down and grows costly as intents are added, and the classifier needs labels nobody has time to write. A Facet model learns your intents from a description and a few real messages.
How it works
- Describe the task. Paste the prompt you use today, or write it plainly: “Name the intent of each banking chat message from this list of 40, or other if none fits.” Add a few real examples if you have them.
- Agree on what good looks like. Facet writes plain statements of a good answer, like “a card that hasn’t arrived is card_not_arrived, never card_lost”, each with examples. Edit any that are off.
- Create, then correct. Facet builds the model on its own, in the background, and tests it against every statement before it goes live. When it confuses two intents, say which one was right. Facet quotes the fix before it spends anything.
Two ways to use it
- From your agent: connect Claude, Cursor, ChatGPT, Codex or VS Code to Facet, then paste:
Use Facet to build a model that names the intent of each banking chat message
from this list: ... Here are twenty real messages: ... Show me the draft and the
price before you approve anything.
- In your code: keep your OpenAI SDK and change two lines, the address and the model name.
import os
from openai import OpenAI
client = OpenAI(base_url=os.environ["FACET_BASE_URL"], api_key=os.environ["FACET_API_KEY"])
reply = client.chat.completions.create(model="chat-intents", messages=[{"role": "user", "content": message}])
Why Facet for intent detection
- Many intents, one call. Dozens of intents cost no more per message than a few.
- Small enough for every message. A small model answers each call, at a cost that works for every message.
- Checked before every update. An update goes live only if it keeps every statement the live version passes, and any update rolls back in one step.
- Yours. Export it any time, free, and run it wherever you like.
Questions
How many examples does each intent need?
None are required. Facet writes its own practice messages from your description, and a few real ones for the intents that get mixed up help most.
What happens with a message that fits no intent?
You decide. Add an other or unknown intent and a rule for when to use it, and Facet tests every version against it.
Can I add intents later?
Yes. Ask in plain words with a few examples. Facet quotes the change before it builds anything, and the new version goes live only if every rule the live one passes still holds.