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)
- Start Call → cycle persona + intent for variety
- ISR greeting → agent-generated opening
- Spoof customer → simulates realistic caller turns (may signal
[CALL_END]) - After each customer turn → Resolution agent ingests transcript-so-far and returns structured JSON: sentiment,
suggested_response, resolution steps, cross-sell, escalation - ISR reply → agent-driven response to latest customer message
- End call → Summary agent → structured
CallRecord→POST /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)
- Open Dashboard — show populated KPIs
- Go to Co-Pilot → Start Call — highlight persona cycling, live transcript, AI suggestions
- Use Chat Assist for a quick policy/equipment question
- End call — watch post-call summary generation
- 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)
Log in or sign up for Devpost to join the conversation.