Landry Bodjona
LB-01

Support Desk Agent

Triages customer tickets, drafts replies that cite policy, and sends each one to a person for approval.

Open the evaluation board
Phase 1Django · Size M

What a visitor does Files a ticket, then approves the cited reply

Problem

Small support teams spend their day on repeat questions about late orders, damaged bags and subscription changes. Generic chatbots answer fast and invent policies.

Try it live

File a ticket as a customer, for example a torn bag. Switch to the agent console, read the cited draft, then approve, edit or escalate it. Deflection and accuracy counters update as you work.

Proves

Retrieval you can audit, human-in-the-loop design, and Django at production depth.

  • RAG
  • Tool use
  • Citations
  • Human in the loop

Signal chain

Figure 1. Time per stepThe Torn bag sample as recorded: 9 steps in 10.9 s on October 7, 2026. Each bar is drawn against the longest step.
  1. 01redact PIIunder 10 ms
  2. 02screen for injection862 ms
  3. 03classify784 ms
  4. 04hybrid search603 ms
  5. 05rerank6.1 s
  6. 06look up orderunder 10 ms
  7. 07draft with citations2.5 s
  8. 08check claimsunder 10 ms
  9. 09routeunder 10 ms
  • Model
  • Tool
  • Retrieval
  • Guard

Stack

Django 5.2 · Django Ninja · Celery · Postgres + pgvector · Vue agent console · SSE

Engineering highlights

  • A reply can go out automatically only when every claim in it cites a policy passage or a tool result.
  • Hybrid keyword and vector search, with recall measured on a labelled set in CI.
  • The policy corpus is embedded once at build time, so a ticket costs one injection check, one query embedding, one rerank and at most three model calls.
Table 1. Operating limits
Operating limitValue
Tickets per visitor per day20
Visitor data kept24 h
Auto-send for visitorsOff
Model calls per ticket (est.)6
Table 2. Measured characteristics
SampleLanguageStepsModel callsTokens in / outTimeOutcome
Torn bag English951,351 / 1,12610.9 sDraft, awaiting approval
Late parcel English951,302 / 9354.6 sDraft, awaiting approval
Wrong grind English962,482 / 1,8006.7 sDraft, awaiting approval
Someone else's order English951,181 / 3572.2 sDraft, awaiting approval
Injection attempt English3135 / 0457 msHanded to a person: injection attempt
Stale decaf Czech962,557 / 1,6375.2 sDraft, awaiting approval
Broken grinder Czech951,493 / 6462.7 sDraft, awaiting approval
Cancel an order Czech951,312 / 5443.2 sDraft, awaiting approval

Measured on October 7, 2026 on a development machine, through the gateway and the providers' free tiers. A live run's figures vary with the providers' load.

Status The evaluation board for this part is open. It starts on curated samples, and your own text runs live within your daily allowance. Open the evaluation board