5.9 KiB
Enhanced Token Usage UX/UI Implementation
Overview
This implementation provides a beautiful, modern token usage display for Suna's chat input interface that shows users their current token usage with an expand/collapse feature, as requested in the Slack thread.
Features Implemented
🎯 Core Features
- Compact Display: Shows remaining balance in format "$X.XX left" with status indicator
- Expand/Collapse: Click to expand for detailed usage statistics
- Smart Color Coding:
- Green/muted for normal usage
- Amber for 80%+ usage (near limit)
- Red for reached limit
- Upgrade Integration: Direct "Upgrade" button that opens billing modal
- Configurable: Can be enabled/disabled via
showTokenUsage
prop
🎨 Visual Design
- Modern Design: Glassmorphic background with backdrop blur
- Smooth Animations: Transitions for expand/collapse and color changes
- Progress Bar: Visual representation of usage percentage
- Status Indicators: Icons and badges for plan type and usage status
- Mobile Friendly: Responsive design that works on all screen sizes
📊 Data Display
- Current Usage: Shows used amount vs. total limit
- Remaining Balance: Prominently displays money left
- Usage Percentage: Visual progress bar with percentage
- Plan Information: Shows current plan name (Free, Pro, etc.)
- Warning States: Special UI for near-limit and at-limit scenarios
Implementation Details
New Component: TokenUsageDisplay
Located at: frontend/src/components/thread/chat-input/token-usage-display.tsx
Key Props:
subscriptionData
: Current subscription information from APIonUpgradeClick
: Callback to open billing modalshowUsageDisplay
: Boolean to control visibilityclassName
: Optional styling override
Features:
- Automatically hides in local development mode
- Only displays for users with usage limits (free tier or paid plans with limits)
- Responsive design with different layouts for mobile/desktop
- Accessible with keyboard navigation support
Integration Points
Modified Components:
-
MessageInput (
message-input.tsx
)- Added
showTokenUsage
prop - Integrated
TokenUsageDisplay
component - Conditionally hides old upgrade text when new display is active
- Uses subscription data from React Query
- Added
-
ChatInput (
chat-input.tsx
)- Added
showTokenUsage
prop passthrough - Maintains backward compatibility
- Added
-
Thread Page (
[threadId]/page.tsx
)- Enabled token usage display with
showTokenUsage={true}
- Enabled token usage display with
-
Dashboard (
dashboard-content.tsx
)- Enabled token usage display for main chat interface
Data Integration
Subscription Data Source:
- Uses
useSubscription()
hook from React Query - Fetches real-time usage data from
/billing/subscription
endpoint - Automatically updates when usage changes
Key Data Points:
current_usage
: Amount spent this month (in dollars)cost_limit
: Monthly spending limit (in dollars)status
: Subscription status ('no_subscription', 'active', etc.)plan_name
: Display name for current plan
Usage Examples
Basic Implementation
<ChatInput
// ... other props
showTokenUsage={true}
/>
Conditional Display
<ChatInput
// ... other props
showTokenUsage={userTier === 'free' || showUsageForPaidUsers}
/>
Benefits Over Previous Implementation
🆚 Before vs After
Before:
- Simple text: "Upgrade for more usage"
- No usage information displayed
- Only shown for free tier
- Static, non-interactive
After:
- Dynamic usage display: "$X.XX left"
- Detailed breakdown when expanded
- Works for all subscription tiers
- Interactive with smooth animations
- Better visual hierarchy
🎯 UX Improvements
- Information at a Glance: Users immediately see their remaining balance
- Progressive Disclosure: Detailed info available on demand via expand
- Visual Feedback: Color coding provides instant status understanding
- Clear Call-to-Action: Prominent upgrade button when needed
- Non-Intrusive: Compact by default, doesn't interfere with chat
Configuration Options
The component can be customized for different contexts:
// Always show (recommended for main chat interfaces)
showTokenUsage={true}
// Conditional based on subscription
showTokenUsage={subscriptionData?.status === 'no_subscription'}
// Disabled for specific contexts (agent testing, etc.)
showTokenUsage={false}
Technical Implementation Notes
Performance Considerations
- Uses React Query for efficient data fetching and caching
- Minimal re-renders with proper dependency management
- Lightweight component with optimized animations
Accessibility
- Proper ARIA labels for screen readers
- Keyboard navigation support
- High contrast color scheme
- Semantic HTML structure
Browser Compatibility
- Modern CSS features with fallbacks
- Responsive design patterns
- Cross-browser tested animations
Future Enhancements
Potential improvements that could be added:
- Usage Trends: Historical usage graph in expanded view
- Notifications: Toast alerts when approaching limits
- Customizable Thresholds: User-defined warning levels
- Usage Breakdown: Per-model or per-project usage details
- Predictive Insights: Estimated time until limit reached
Conclusion
This implementation successfully addresses the Slack request for improved UX/UI around token usage display. It provides users with clear, actionable information about their usage while maintaining a clean, modern interface that enhances rather than clutters the chat experience.
The solution is:
- ✅ Configurable - Can be enabled/disabled as needed
- ✅ Beautiful - Modern design with smooth interactions
- ✅ Functional - Shows real usage data with upgrade path
- ✅ Scalable - Works across different subscription tiers
- ✅ Accessible - Follows best practices for all users