About the Project - ISR Co-Pilot

Elevator pitch

Real-time AI guidance for every rental call — from first ring to post-call insight.


United Rentals ISR Co-Pilot

Real-time AI guidance for equipment-rental contact centers — from live call to post-call analytics.


Inspiration

Inside Sales Representatives (ISRs) at large rental companies like United Rentals juggle high-stakes phone calls across reservations, billing disputes, field service, and compliance — often while switching between RentalMan, dispatch, and policy docs. A single missed cue (frustrated tone, wrong escalation, or an unverified rate promise) can cost trust, time, and revenue.

We built this prototype for the hackathon to answer one question:

What if every ISR had a whisper coach that knows United Rentals policy, equipment specs, and next-best actions — without ever speaking to the customer?

We chose United Rentals because the domain is rich (1,181+ branches, diverse equipment categories, strict billing rules) and because AI can add the most value when accuracy and speed matter together. Our goal was a demo-ready, production-feeling experience judges could click through in under five minutes — not a slide deck.


What we learned

1. Multi-agent beats one mega-prompt

Splitting responsibilities — real-time resolution, spoof customer simulation, post-call summary, and in-call Q&A — kept each agent focused and improved JSON reliability.

2. UX is part of the model

ISRs scan suggestions in under ~5 seconds. We learned to design for scannable panels (sentiment, next best action, escalation flags) rather than long prose.

3. Resilience is non-negotiable for demos

LLM outputs vary (markdown fences, partial JSON, error strings). We invested heavily in parsers, retries, and local fallbacks so a flaky inference never blanks the UI.

4. Domain knowledge is a product feature

Grounding agents in a curated knowledge base (RPP rules, United Academy certs, troubleshooting flows) made suggestions feel credible — and taught us that RAG + strict scope beats generic chat for enterprise use cases.

5. Demo storytelling needs engineering

Persona + intent cycling across calls (sessionStorage) turned repeated demos into fresh narratives without redeploying.


How we built it

Architecture

flowchart LR
  ISR[ISR UI - Next.js] --> Transcript[Live Transcript]
  Transcript --> Resolution[Resolution Agent]
  Transcript --> Spoof[Spoof Customer Agent]
  Resolution --> Suggestions[AI Suggestions Panel]
  ISR --> ChatAssist[Chat Assist API]
  ChatAssist --> KB[Knowledge Base]
  Transcript --> Summary[Post-Call Summary Agent]
  Summary --> Mongo[(MongoDB - optional)]
  Mongo --> History[Call History and Analytics]

Tech stack

Layer Choices
Frontend Next.js 15, React 19, Tailwind CSS v4, shadcn/ui, Radix
AI platform Lyzr AI Agent Studio — GPT-4o-mini agents with KB search (Weaviate + embeddings)
Persistence MongoDB (call_summaries) with graceful degradation if unset
Orchestration src/lib/ur-agents.ts + src/app/copilot/page.tsx

Agent pipeline (per demo call)

  1. Start Call → cycle persona + intent for variety
  2. ISR greeting → agent-generated opening
  3. Spoof customer → simulates realistic caller turns (may signal [CALL_END])
  4. After each customer turn → Resolution agent ingests transcript-so-far and returns structured JSON: sentiment, suggested_response, resolution steps, cross-sell, escalation
  5. ISR reply → agent-driven response to latest customer message
  6. End call → Summary agent → structured CallRecordPOST /api/call-history

Knowledge and policy

  • Curated markdown KB: equipment specs, billing (RPP, fuel/cleaning charges), service troubleshooting, query exemplars
  • Resolution agent scoped to United Rentals operations only (off-topic guard)
  • RAI / policy config for toxicity and fairness checks on agent features

Screens shipped for the hackathon

  • Dashboard & Analytics — always-on KPIs (seed + history-derived)
  • Co-Pilot — live transcript, AI suggestions, Customer Info, Chat Assist
  • Call History — saved summaries + full transcript
  • Reports & Integrations — stakeholder-ready demo surfaces

Latency mental model

We targeted sub–5-second “whisper” readability. If (T_{\text{turn}}) is wall-clock time per customer turn and (L_{\text{agent}}) is inference latency, we designed the UI to stay usable when:

[ T_{\text{turn}} \approx L_{\text{spoof}} + L_{\text{resolution}} + L_{\text{isr}} + \varepsilon ]

where (\varepsilon) is UI/render overhead. Parallel fetches and non-blocking suggestion updates keep the ISR from staring at a frozen screen.

For (n) customer turns in a call, cumulative agent time is approximately:

[ T_{\text{call}} \approx \sum_{i=1}^{n} \left( L_{\text{spoof}}^{(i)} + L_{\text{resolution}}^{(i)} + L_{\text{isr}}^{(i)} \right) + L_{\text{summary}} ]


Challenges we faced

Challenge What happened How we solved it
Unstable JSON from agents Models wrapped JSON in markdown or returned prose tryParseJson, brace-slicing, shape normalization in ur-agents.ts
Summary agent failures mid-demo Occasional error-like LLM responses Up to 4 retries + buildLocalFallbackCallRecord() — UI never exposes “fallback mode”
No live caller for judges Hard to demo “real time” alone Spoof customer agent with persona/intent cycling and scripted “first-time caller” mode
Mongo optional in hackathon env DB not always configured API returns savedToHistory: false; demo still completes end-to-end
Enterprise trust bar Hallucinated rates/specs destroy credibility Prompts: “Verify in RentalMan”; KB retrieval; escalation triggers; no competitor bashing
Polished demo in limited time Empty dashboards kill momentum Centralized mock data + history-driven analytics fallback

The hardest part was not calling the API — it was making five agent touchpoints per call feel like one coherent product.

Retry policy (summary agent)

We model summary reliability as a Bernoulli trial per attempt with success probability (p). With up to (k = 4) independent retries, the probability of eventually getting a usable summary is:

[ P(\text{success}) = 1 - (1 - p)^k ]

When (p) is low (noisy model output), local heuristic fallback ensures (P(\text{UI complete}) \approx 1) for the judge demo.


Impact and what’s next

Today (hackathon): Judges can run a full call loop — live guidance → end call → persisted history → analytics — without a phone bridge or production RentalMan access.

Tomorrow: Telephony integration (Twilio/WebRTC), auth/RBAC, PII redaction, human-in-the-loop approval for suggestions, and deeper RentalMan/Total Control APIs.


Demo flow (for judges)

  1. Open Dashboard — show populated KPIs
  2. Go to Co-PilotStart Call — highlight persona cycling, live transcript, AI suggestions
  3. Use Chat Assist for a quick policy/equipment question
  4. End call — watch post-call summary generation
  5. Open Call History — review saved record and transcript

Disclaimer

Built with Next.js and Lyzr AI Agent Studio for the hackathon. United Rentals trademarks belong to their respective owners; this is an independent prototype for demonstration.

Built With

  • css-frameworks-react-19
  • gpt-4o
  • gpt-4o-mini
  • html
  • javascript
  • languages-typescript
  • lucide
  • mongodb-atlas-(optional)-tooling-eslint
  • next-themes-ai-/-ml-lyzr-ai-agent-studio
  • next.js-15
  • next.js-rest-routes
  • node.js-18+-ui-tailwind-css-4
  • perplexity-ai
  • radix-ui
  • rag-knowledge-base-database-mongodb-(optional)-apis-lyzr-inference-api
  • shadcn/ui
  • text-embedding-3-large
  • typescript-5
  • weaviate
  • web-speech-api-cloud-/-hosting-vercel-(recommended)
Share this project:

Updates