Skip to main content
Customer support automation handles high-volume, repetitive queries at low cost - order status, return policies, FAQs, basic troubleshooting. The key constraint is cost: support tickets can be in the thousands per day, and each one needs to be cheap. Savings on this workload: typically 70–80% vs Claude Sonnet 4.6 baseline.
SettingValueReason
Tier floorLIGHTHandles most support queries - one step above casual chat
Tier ceilingSTANDARDCaps escalation cost; only complex complaints reach STANDARD
Cost cap$0.01/requestHard ceiling per ticket - prevents budget surprises
VisionOffUnless agents handle image attachments
Tool callingOnIf the bot looks up orders, policies, or account status
Tool quality60%+Reliable enough for order lookups without over-restricting

Step 1 - Create the profile

  1. Go to Playground → Configure
  2. Name it Support Bot
  3. Set tier floor: LIGHT, ceiling: STANDARD
  4. Set cost cap: $0.01
  5. Enable Tool calling if the bot calls APIs (order lookup, account fetch)
  6. Click Save & get API key

Step 2 - Integrate the profile

Node.js - with order lookup tool

import OpenAI from "openai";

const client = new OpenAI({
  apiKey:  "sk-routor-YOUR_PROFILE_KEY",
  baseURL: "https://api.routor.io/v1",
});

const SYSTEM_PROMPT = `You are a customer support agent for Acme Store.
Be concise and helpful. For order questions, use the lookup_order tool.
Escalate to a human agent if the customer is very upset or the issue is complex.`;

const tools: OpenAI.Chat.ChatCompletionTool[] = [
  {
    type: "function",
    function: {
      name:        "lookup_order",
      description: "Look up order status and details by order ID",
      parameters: {
        type:       "object",
        properties: {
          order_id: { type: "string", description: "The order ID (e.g. ORD-12345)" },
        },
        required: ["order_id"],
      },
    },
  },
];

async function handleTicket(userMessage: string): Promise<string> {
  const response = await client.chat.completions.create({
    model:    "auto",
    messages: [
      { role: "system", content: SYSTEM_PROMPT },
      { role: "user",   content: userMessage },
    ],
    tools,
    tool_choice: "auto",
    max_tokens:  500,
  });

  const choice = response.choices[0];

  // Handle tool call
  if (choice.finish_reason === "tool_calls") {
    const call = choice.message.tool_calls![0];
    const args = JSON.parse(call.function.arguments);
    const orderData = await lookupOrderFromDB(args.order_id);

    // Continue conversation with tool result
    const followUp = await client.chat.completions.create({
      model:    "auto",
      messages: [
        { role: "system",    content: SYSTEM_PROMPT },
        { role: "user",      content: userMessage },
        choice.message,
        { role: "tool", tool_call_id: call.id, content: JSON.stringify(orderData) },
      ],
    });
    return followUp.choices[0].message.content ?? "";
  }

  return choice.message.content ?? "";
}

Python

from openai import OpenAI

client = OpenAI(
    api_key="sk-routor-YOUR_PROFILE_KEY",
    base_url="https://api.routor.io/v1",
)

SYSTEM_PROMPT = """You are a customer support agent for Acme Store.
Be concise and helpful. Escalate to a human if the issue is complex."""

def handle_ticket(user_message: str) -> str:
    response = client.chat.completions.create(
        model="auto",
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user",   "content": user_message},
        ],
        max_tokens=400,
    )
    return response.choices[0].message.content

How routing looks for support tasks

Ticket typeExpected tierTypical model
”What are your return hours?”LIGHTGemini 3.1 Flash-Lite
”Where is my order ORD-12345?”LIGHTGemini 3.1 Flash-Lite / GLM-4.7 Flash
”My item arrived damaged, I want a refund”STANDARDClaude Haiku 4.5
”I ordered 3 months ago and never received it, this is unacceptable”STANDARDClaude Sonnet 4.6 / GPT-5.4
The cost cap of $0.01 means even if a ticket escalates to STANDARD, you’ll never pay more than $0.01 for a single response. Routor will truncate model selection to stay within the cap.

Handling escalation

For tickets that need a human, detect the intent and route accordingly in your application logic:
const response = await client.chat.completions.create({
  model:    "auto",
  messages: [
    { role: "system", content: `${SYSTEM_PROMPT}\nIf the ticket needs a human agent, respond with ESCALATE as the first word.` },
    { role: "user",   content: userMessage },
  ],
});

const reply = response.choices[0].message.content ?? "";
if (reply.startsWith("ESCALATE")) {
  await createHumanTicket(userMessage);
} else {
  await sendReply(reply);
}

Cost estimate

On a support system handling 5,000 tickets/day:
ScenarioDaily costMonthly cost
All requests to Claude Sonnet 4.6~$75~$2,250
With Routor ($0.01 cap, LIGHT→STANDARD)~$15–20~$450–600
Savings~$55–60/day~$1,650–1,800/month

Tips

  • Set max_tokens to 400–600 for support responses - they should be concise, not essays. This also reduces cost.
  • Use a system prompt with explicit guidelines so lighter models can follow your company voice without needing a smarter model to infer it.
  • Pre-filter by intent before calling Routor - if a ticket is clearly “track order,” you can skip the LLM entirely and return a templated response.
  • Monitor the cost cap - if you hit the cap frequently, consider raising the ceiling to COMPLEX for edge cases.