Gurjit Chahal
← Selected work

Enterprise AI product case study

AI Customer Support Assistant

I led frontend development of an AI-assisted support experience that delivered real-time recommendations inside an agent's existing workflow. The central engineering challenge was not simply generating an answer, it was making AI useful at production scale without allowing latency, malformed output, or service failure to interrupt a live customer interaction.

My role

Technical leadership, frontend architecture, API contracts, AI workflow integration, resiliency, observability, and production ownership

Delivery

Walmart · Senior Software Engineer · production delivery

Outcome

20% lower average handle time and more than 30% improvement in overall agent efficiency

20%

Reduction in average handle time

30%+

Improvement in overall agent efficiency

Millions

Customer interactions supported by the surrounding platform

System design

Agent workflow and service architecture

View full size ↗
Conceptual AI Agent Assistant system design showing the agent workflow, customer care frontend, backend services, Python AI service, data layer, event streaming, enterprise integrations, and operational requirements
A conceptual view of the agent workflow and system boundaries. Some infrastructure labels are generalized to respect employer confidentiality. The key design remains the same, AI assistance is asynchronous and the customer support workflow stays available when the AI path fails.
01

Start with the support workflow

Support agents already had to listen, investigate, navigate tools, and make decisions while a customer waited. A separate AI destination would add another surface to manage. We instead treated assistance as part of the live workflow: recommendations needed to arrive in context, remain clearly optional, and reduce effort without changing who owned the customer decision.

  • Optimize for time-to-useful-guidance, not generation alone.
  • Keep the agent in control of every customer-facing action.
  • Fit assistance into existing chat and call navigation patterns.
  • Measure operational outcomes rather than model novelty.
02

Separate the interface from AI orchestration

I separated React rendering and agent interaction from the orchestration lifecycle through explicit API contracts. The interface initiated work, tracked request state, and rendered validated recommendations; backend services owned context assembly, AI interaction, and failure semantics. This boundary kept model-specific behavior from leaking into the support UI and allowed each side to evolve independently.

  • Contracts represented pending, successful, invalid, timed-out, and unavailable states.
  • The UI consumed structured assistance instead of depending on raw model text.
  • Request identity prevented results from being attached to the wrong active interaction.
  • Service boundaries made failures visible and independently diagnosable.
03

Make real-time assistance compatible with agent navigation

AI work does not always complete within a normal synchronous request. I created a long-polling interface so agents could move between active chats or calls while recommendations continued through their lifecycle. The client could reconnect to the correct request state rather than freezing navigation or coupling the screen to one long-running connection.

  • Request state lived beyond a single component render or navigation event.
  • Polling was bounded so slow AI work did not create an endless loading state.
  • Late results were correlated before display to avoid stale recommendations.
  • The core customer-support path remained responsive while assistance was pending.
04

Choose long polling over a persistent connection

WebSockets could have pushed results with less repeated request overhead, but they would also introduce connection lifecycle, reconnection, and routing complexity for a workflow that only needed an eventual response to a known request. Long polling matched the interaction model: it worked with existing HTTP infrastructure, survived screen navigation, and made timeout and retry behavior explicit. The tradeoff was additional request volume, so polling remained bounded and stopped on terminal states.

  • Synchronous HTTP was simpler but could not safely hold the UI to unpredictable AI latency.
  • WebSockets were better suited to continuous bidirectional updates than one eventual recommendation.
  • Long polling reused familiar authentication, observability, and failure semantics.
  • Bounded intervals and terminal states controlled avoidable API load.
05

Design graceful degradation as a product behavior

In a live support environment, the assistant is useful but the underlying workflow is essential. I added retries, validation guardrails, clear fallback states, and graceful degradation so unavailable or invalid AI output could never block an agent. Failure was treated as an expected state with an intentional experience, not an exceptional blank screen.

  • Bounded retries handled transient failures without creating retry storms.
  • Invalid responses were withheld instead of presented as trustworthy guidance.
  • Timeout and unavailable states returned control to the agent quickly.
  • Existing support capabilities stayed usable independently of AI health.
06

Operate the complete distributed path

The experience crossed a React application, Node.js services, Java and Python APIs, Kafka consumers, and cloud-native infrastructure. I helped investigate production issues across those boundaries and built Splunk dashboards, alerting, and operational monitoring to shorten the path from a user-visible symptom to the failing dependency.

  • Trace request outcomes across frontend, orchestration, APIs, and event consumers.
  • Distinguish AI latency from application, messaging, and infrastructure failures.
  • Monitor errors, timeouts, invalid responses, and downstream availability.
  • Use production behavior to refine resiliency and workflow decisions after launch.
07

Measure impact where agents feel it

The assistant reduced average handle time by 20%. Other workflow improvements that I shipped with product and operations partners helped improve overall agent efficiency by more than 30%. The result was simple, agents could get through support work faster without losing control of the customer conversation.

08

Production risks we designed around

The biggest risks crossed system boundaries. A result could arrive after an agent switched conversations, retries could add unnecessary load, malformed output could look trustworthy, or a slow AI dependency could hold up the main workflow. We used request identifiers, bounded retries, response validation, clear end states, and fallbacks to handle each risk where it occurred.

09

What I learned

A useful AI product needs more than good model output. It has to fit the way people already work and behave predictably when something goes wrong. The assistant worked because agents did not have to leave the support flow to use it. I also learned how important end-to-end monitoring is. Without it, a slow asynchronous request is difficult to diagnose and even harder to improve.

10

What this demonstrates

The senior engineering work was defining where AI could help, where it could fail, and where it could never become a dependency. By isolating orchestration, modeling asynchronous state, preserving agent control, and operating the full distributed path, we turned probabilistic output into a dependable product capability without pretending the model itself was dependable infrastructure.