<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Heena Meheraj</title>
    <description>The latest articles on DEV Community by Heena Meheraj (@heena_meheraj_66).</description>
    <link>https://dev.to/heena_meheraj_66</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4149042%2F09b8f8cc-2e95-4196-8854-0225583022d1.png</url>
      <title>DEV Community: Heena Meheraj</title>
      <link>https://dev.to/heena_meheraj_66</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/heena_meheraj_66"/>
    <language>en</language>
    <item>
      <title>Building a Customer Support UI with Streamlit</title>
      <dc:creator>Heena Meheraj</dc:creator>
      <pubDate>Tue, 29 Sep 2026 08:56:37 +0000</pubDate>
      <link>https://dev.to/heena_meheraj_66/building-a-customer-support-ui-with-streamlit-2277</link>
      <guid>https://dev.to/heena_meheraj_66/building-a-customer-support-ui-with-streamlit-2277</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br&gt;
Customer support systems need to provide responses that are not only useful but also easy to understand. When an AI system uses customer-specific memory, the interface should make it clear what the customer asked, what the AI generated, and what information was recalled.&lt;/p&gt;

&lt;p&gt;For our ResolveIQ Lite project, I worked on the UI layer using Streamlit. My main responsibility was to build an interface where users can select a customer, enable or disable memory, send support queries, and clearly see how memory affects the generated response.&lt;/p&gt;

&lt;p&gt;The goal was to make the memory feature visible instead of keeping it hidden inside the backend.&lt;/p&gt;

&lt;p&gt;My Role in ResolveIQ Lite&lt;br&gt;
My contribution was focused on the Streamlit frontend/UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The main requirements were:&lt;/strong&gt;&lt;br&gt;
Customer selection&lt;br&gt;
Hindsight memory ON/OFF toggle&lt;br&gt;
Start new session functionality&lt;br&gt;
Customer message input&lt;br&gt;
Send button&lt;br&gt;
Current query display&lt;br&gt;
Generated response display&lt;br&gt;
Recalled memory display&lt;br&gt;
Session history&lt;/p&gt;

&lt;p&gt;The interface was designed around a simple three-panel layout.&lt;/p&gt;

&lt;p&gt;Designing the Streamlit Interface&lt;br&gt;
I created the main application in:&lt;br&gt;
&lt;code&gt;app.py&lt;/code&gt;&lt;br&gt;
The application uses Streamlit to create the interface.&lt;/p&gt;

&lt;p&gt;The page configuration was kept simple:&lt;br&gt;
`st.set_page_config(&lt;br&gt;
    page_title="ResolveIQ Lite",&lt;br&gt;
    layout="wide"&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;st.title("ResolveIQ Lite: Support agent with memory")`&lt;br&gt;
I used a wide layout because the application needs to display three sections side by side.&lt;/p&gt;

&lt;p&gt;Customer Selection and Memory Toggle&lt;br&gt;
The sidebar contains the main controls.&lt;/p&gt;

&lt;p&gt;The customer can be selected from the available customer data.&lt;br&gt;
&lt;code&gt;Customer&lt;br&gt;
[C101 - Aarav Sharma ▼]&lt;/code&gt;&lt;br&gt;
I also added a memory toggle:&lt;br&gt;
&lt;code&gt;Hindsight memory ON/OFF&lt;/code&gt;&lt;br&gt;
This allows the same query to be tested with and without customer-specific memory.&lt;/p&gt;

&lt;p&gt;The interface also contains a Start new session button.&lt;/p&gt;

&lt;p&gt;The purpose of this button is to clear the current screen/session history while keeping the stored Hindsight memory available.&lt;/p&gt;

&lt;p&gt;The Three-Panel UI&lt;br&gt;
One of the main parts of my work was making the memory behavior visible through three separate sections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Current Query&lt;/strong&gt;&lt;br&gt;
This displays exactly what the customer entered.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I still haven't received my replacement.&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;2. Generated Response&lt;/strong&gt;&lt;br&gt;
This displays the response generated by the AI agent.&lt;/p&gt;

&lt;p&gt;When memory is available, the response can use information from the customer's previous interaction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Recalled Memory&lt;/strong&gt;&lt;br&gt;
This shows the information retrieved from the customer's previous interactions.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;code&gt;Customer's order A104 arrived damaged&lt;br&gt;
and they requested a replacement.&lt;/code&gt;&lt;br&gt;
This makes it possible to see what information the system actually recalled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connecting the UI With the Backend&lt;/strong&gt;&lt;br&gt;
Initially, I used stand-in functions so that I could build and test the interface before the backend components were completed.&lt;/p&gt;

&lt;p&gt;The temporary functions were later replaced with the actual functions from the team members' memory.py and agent.py.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The final application uses:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;from memory import retain_incident, recall_incidents&lt;br&gt;
from agent import generate_reply&lt;/code&gt;&lt;br&gt;
This allowed the Streamlit UI to communicate with the actual memory and AI layers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The overall flow became:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Customer&lt;br&gt;
   ↓&lt;br&gt;
Streamlit UI&lt;br&gt;
   ↓&lt;br&gt;
Recall Customer Memory&lt;br&gt;
   ↓&lt;br&gt;
Generate AI Response&lt;br&gt;
   ↓&lt;br&gt;
Display Response + Memory&lt;br&gt;
   ↓&lt;br&gt;
Store Interaction&lt;/code&gt;&lt;br&gt;
Making Memory ON/OFF Visible&lt;br&gt;
One of the important requirements was to demonstrate the difference between memory-enabled and memory-disabled responses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory ON&lt;/strong&gt;&lt;br&gt;
The customer sends:&lt;br&gt;
&lt;code&gt;I still haven't received my replacement.&lt;/code&gt;&lt;br&gt;
The UI can retrieve the previous A104 incident.&lt;/p&gt;

&lt;p&gt;The recalled-memory section displays information such as:&lt;br&gt;
&lt;code&gt;Customer's order A104 arrived damaged&lt;br&gt;
and they requested a replacement.&lt;/code&gt;&lt;br&gt;
The generated response can then understand what replacement the customer is referring to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory OFF&lt;/strong&gt;&lt;br&gt;
I then switched the memory toggle OFF and sent the same query again:&lt;br&gt;
&lt;code&gt;I still haven't received my replacement.&lt;/code&gt;&lt;br&gt;
The UI displays:&lt;br&gt;
&lt;code&gt;Memory is OFF for this message&lt;/code&gt;&lt;br&gt;
The response becomes more generic because the previous customer-specific memory is not supplied to the AI for that message.&lt;/p&gt;

&lt;p&gt;This ON/OFF comparison makes the effect of memory easy to understand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing the UI&lt;/strong&gt;&lt;br&gt;
I tested the application using the fictional customer data provided for the project.&lt;/p&gt;

&lt;p&gt;The main test scenario was based on order A104.&lt;/p&gt;

&lt;p&gt;First, the customer interaction established that:&lt;br&gt;
&lt;code&gt;My order A104 arrived damaged.&lt;br&gt;
I want a replacement.&lt;/code&gt;&lt;br&gt;
Later, the customer asked:&lt;br&gt;
&lt;code&gt;I still haven't received my replacement.&lt;/code&gt;&lt;br&gt;
With memory enabled, the UI displayed the relevant previous information.&lt;/p&gt;

&lt;p&gt;I then repeated the same query with memory disabled.&lt;/p&gt;

&lt;p&gt;This allowed me to verify that the UI correctly reflected the difference between the two cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Problem I Encountered&lt;/strong&gt;&lt;br&gt;
During integration, the UI initially produced an error when connecting to the memory layer.&lt;/p&gt;

&lt;p&gt;The problem was related to the Hindsight configuration because the required environment variables were initially empty.&lt;/p&gt;

&lt;p&gt;The project uses configuration values such as:&lt;br&gt;
&lt;code&gt;HINDSIGHT_BASE_URL&lt;br&gt;
HINDSIGHT_API_KEY&lt;br&gt;
GROQ_API_KEY&lt;/code&gt;&lt;br&gt;
After the required configuration was added to the local .env file, the application was able to communicate with the Hindsight service.&lt;/p&gt;

&lt;p&gt;Another integration issue occurred because the temporary retain_incident() function in the UI had a different function signature from the actual function in memory.py.&lt;/p&gt;

&lt;p&gt;After the backend code was available, I removed the stand-in functions and connected the UI to the real implementations.&lt;/p&gt;

&lt;p&gt;These issues helped me understand that integrating different modules requires the function interfaces and environment configuration to match correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Making the UI Easy to Understand&lt;/strong&gt;&lt;br&gt;
The main design decision was to keep the interface simple rather than adding unnecessary features.&lt;br&gt;
The user can immediately see:&lt;br&gt;
&lt;code&gt;Customer&lt;br&gt;
Memory ON/OFF&lt;br&gt;
New Session&lt;br&gt;
      ↓&lt;br&gt;
Customer Query&lt;br&gt;
      ↓&lt;br&gt;
Generated Response&lt;br&gt;
      ↓&lt;br&gt;
Recalled Memory&lt;/code&gt;&lt;br&gt;
This makes the relationship between the customer query, AI response, and memory visible.&lt;/p&gt;

&lt;p&gt;The UI therefore acts not only as the frontend but also as a simple demonstration of how the memory system affects the AI response.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final UI&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;The completed interface contains:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Customer dropdown&lt;br&gt;
Hindsight memory toggle&lt;br&gt;
Start new session button&lt;br&gt;
Customer message box&lt;br&gt;
Send button&lt;br&gt;
Current query panel&lt;br&gt;
Generated response panel&lt;br&gt;
Recalled memory panel&lt;br&gt;
Session history&lt;/p&gt;

&lt;p&gt;The final UI allowed us to demonstrate the main idea of ResolveIQ Lite without requiring the user to inspect the backend code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned&lt;/strong&gt;&lt;br&gt;
Working on the Streamlit interface gave me practical experience with:&lt;/p&gt;

&lt;p&gt;Streamlit UI development&lt;br&gt;
Python application integration&lt;br&gt;
Connecting frontend components with backend functions&lt;br&gt;
Environment variables&lt;br&gt;
API-based services&lt;br&gt;
Session state&lt;br&gt;
Testing AI application workflows&lt;br&gt;
Git and GitHub collaboration&lt;br&gt;
Debugging integration errors&lt;/p&gt;

&lt;p&gt;One of the most useful things I learned was that an AI application's interface should make its behavior understandable.&lt;/p&gt;

&lt;p&gt;Instead of simply showing an AI-generated answer, showing the current query, generated response, and recalled memory separately makes it much easier to understand why the system responded in a particular way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overall Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Customer Message&lt;br&gt;
       ↓&lt;br&gt;
   Streamlit UI&lt;br&gt;
       ↓&lt;br&gt;
Memory ON? ────── No ──────→ Generate Response&lt;br&gt;
       │&lt;br&gt;
      Yes&lt;br&gt;
       ↓&lt;br&gt;
Hindsight Recall&lt;br&gt;
       ↓&lt;br&gt;
Generate Response&lt;br&gt;
       ↓&lt;br&gt;
Display Response&lt;br&gt;
       ↓&lt;br&gt;
Display Recalled Memory&lt;br&gt;
       ↓&lt;br&gt;
Store Interaction&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Working as the UI Engineer for ResolveIQ Lite gave me experience in building an interface around an AI-powered application rather than treating the AI model as a standalone component.&lt;/p&gt;

&lt;p&gt;The main focus of my work was making customer-specific memory visible through the interface.&lt;/p&gt;

&lt;p&gt;The three-panel design helped demonstrate the complete flow from the customer's query to the generated response and the memory used by the system.&lt;/p&gt;

&lt;p&gt;The Memory ON vs Memory OFF test was especially useful because it made the difference between a context-aware response and a generic response clearly visible.&lt;/p&gt;

&lt;p&gt;Overall, this project helped me understand how UI, AI, memory, APIs, and backend services need to work together to create a complete AI application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main UI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw9wzsi6kuq0j0cgvkvrx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw9wzsi6kuq0j0cgvkvrx.jpg" alt=" " width="799" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory ON&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq2c9k9rb9r20oumys868.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq2c9k9rb9r20oumys868.jpg" alt=" " width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory OFF&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9ukimflijzxpn90ytyr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9ukimflijzxpn90ytyr.jpg" alt=" " width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>python</category>
      <category>software</category>
    </item>
  </channel>
</rss>
