Pattern
Fan-out: ask many questions at once
Like working down a checklist. You ask several small questions in one call. Then your code uses the answers it needs and ignores the rest.
curl
bash
curl -X POST https://api.typesafe.ai/v1/systemone \
-H "Authorization: Bearer $TYPESAFE_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<'EOF'
{
"state": "Hi, I've been trying to connect my Stripe account for 3 days and it keeps failing. I'm losing sales. Please help ASAP.",
"model": "jev-latest",
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle this",
"criteria": {
"billing": "Payment or subscription issues",
"technical": "Bugs or integration problems",
"sales": "Pricing or account questions"
}
},
"frustration": {
"type": "score",
"instructions": "How frustrated the customer appears",
"criteria": [
"Calm, just stating facts",
"Frustrated but civil",
"Very angry, strong language"
]
},
"is_urgent": {
"type": "noul",
"instructions": "The message conveys urgency or time-sensitivity"
}
}
}
EOFJavaScript
js
const key = process.env.TYPESAFE_API_KEY;
if (!key) throw new Error("TYPESAFE_API_KEY is not set");
const res = await fetch("https://api.typesafe.ai/v1/systemone", {
method: "POST",
headers: {
Authorization: `Bearer ${key}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
state:
"Hi, I've been trying to connect my Stripe account for 3 days and it keeps failing. I'm losing sales. Please help ASAP.",
model: "jev-latest",
questions: {
department: {
type: "choice",
instructions: "Which team should handle this",
criteria: {
billing: "Payment or subscription issues",
technical: "Bugs or integration problems",
sales: "Pricing or account questions",
},
},
frustration: {
type: "score",
instructions: "How frustrated the customer appears",
criteria: [
"Calm, just stating facts",
"Frustrated but civil",
"Very angry, strong language",
],
},
is_urgent: {
type: "noul",
instructions: "The message conveys urgency or time-sensitivity",
},
},
}),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { answers } = await res.json();
// Compose in code — ignore answers that are irrelevant for this branch.
console.log({
route: answers.department.choice,
urgent: answers.is_urgent.noul > 0.8,
frustration: answers.frustration.score,
});Notes
- The questions run in parallel against the same state. See the Introduction and fan-out docs.
- The request body matches the public Quick start sample.