Skip to content

Agent example: a multi-agent help desk

The job: customers ask about deliveries and about invoices. A front desk agent reads each question and hands it to the right specialist. Each specialist has its own tool and instructions.

Tools used: the OpenAI Agents SDK on /v1/responses, with function tools and handoffs, all on the Fast tier.

from agents import Agent, OpenAIResponsesModel, Runner, function_tool, set_tracing_disabled
from openai import AsyncOpenAI
set_tracing_disabled(True) # keep every prompt and answer on your own server
client = AsyncOpenAI(base_url="https://dummydomain/v1", api_key="YOUR_API_KEY")
fast = OpenAIResponsesModel(model="Fast", openai_client=client)
ORDERS = {"SO-4471": "shipped on 12-10-2026, delivery expected 15-10-2026"}
INVOICES = {"SO-4471": {"invoice": "INV-2026-0587", "amount_inr": 42500, "status": "unpaid, due 30-10-2026"}}
@function_tool
def get_order_status(order_id: str) -> str:
"""Look up where an order is."""
return ORDERS.get(order_id, "no such order")
@function_tool
def get_invoice(order_id: str) -> str:
"""Look up the invoice for an order."""
return str(INVOICES.get(order_id, "no invoice for this order"))
orders_agent = Agent(
name="Orders desk",
handoff_description="Questions about where an order is and when it will arrive",
instructions="Answer delivery questions with get_order_status. Be brief and polite.",
model=fast, tools=[get_order_status],
)
billing_agent = Agent(
name="Billing desk",
handoff_description="Questions about invoices, amounts and payment due dates",
instructions="Answer invoice questions with get_invoice. Write amounts as Rs with Indian grouping.",
model=fast, tools=[get_invoice],
)
triage = Agent(
name="Front desk",
instructions="Send each customer to the right desk. Do not answer yourself.",
model=fast, handoffs=[orders_agent, billing_agent],
)
for question in ["Where is my order SO-4471?", "How much do I owe for order SO-4471, and by when?"]:
result = Runner.run_sync(triage, question)
print(f"[{result.last_agent.name}] {result.final_output}")
[Orders desk] Your order SO-4471 was shipped on 12-10-2026 and is expected to be delivered by 15-10-2026.
[Billing desk] You owe Rs 42,500 for order SO-4471, which is due by 30-10-2026.
  1. Handoffs are tools. The SDK gives the front desk one tool per specialist. Calling it moves the conversation to that agent, which result.last_agent reports.
  2. Each desk sees only its tools. The billing desk can’t look up deliveries, and the orders desk can’t read invoices. Smaller tool lists give steadier answers.
  3. Everything stays on your server. set_tracing_disabled(True) stops the SDK from uploading run traces to OpenAI.

An IT help desk (passwords, laptops, access requests), an HR desk (leave, payslips, policies), a hospital front desk (appointments, reports, billing), or a college office (admissions, fees, exams).

Common questions

Does the OpenAI Agents SDK work with ZenithAI?

Yes, through OpenAIResponsesModel pointed at your server. Agents, tools and handoffs between agents all run on /v1/responses. Turn tracing off so the SDK sends nothing to OpenAI.

Why split a help desk into several agents?

Each desk gets short instructions and only the tools it needs, so it answers more reliably. The front desk only decides who should answer, and you can add a desk without touching the others.