16 KiB
16 KiB
Priority 2 Alerts Integration Guide
Overview
This guide explains how to integrate Priority 2 features from the cost transparency review as alerts in the main dashboard and individual tool components.
Priority 2 Features (from BILLING_DASHBOARD_COST_TRANSPARENCY_REVIEW.md):
- Dynamic Pricing Display - Show pricing changes and OSS model recommendations
- Cost Estimation Before Operations - Warn users before expensive operations
- Historical Cost Trends - Alert on high spending velocity and budget projections
Architecture
Components
-
usePriority2AlertsHook (frontend/src/hooks/usePriority2Alerts.ts)- Fetches dashboard data and generates Priority 2 alerts
- Monitors cost trends, spending velocity, and OSS recommendations
- Auto-refreshes at configurable intervals
-
Priority2AlertBannerComponent (frontend/src/components/shared/Priority2AlertBanner.tsx)- Displays alerts in a prominent banner format
- Supports dismissible alerts with localStorage persistence
- Shows action buttons for alerts
-
Tool-Specific Alert Components:
BlogWriterCostAlerts- Blog Writer integrationCreateStudioCostAlerts- Image Studio integration
Main Dashboard Integration
Step 1: Add Priority 2 Alerts to Main Dashboard
// In your main dashboard component (e.g., MainDashboard.tsx or Dashboard.tsx)
import React from 'react';
import { usePriority2Alerts } from '../hooks/usePriority2Alerts';
import Priority2AlertBanner from '../components/shared/Priority2AlertBanner';
import { useSubscription } from '../contexts/SubscriptionContext';
const MainDashboard: React.FC = () => {
const { subscription } = useSubscription();
const userId = subscription?.user_id; // Get from your auth context
const { alerts, refreshAlerts, dismissAlert } = usePriority2Alerts({
userId,
enabled: !!userId && subscription?.active,
checkInterval: 120000, // Check every 2 minutes
});
return (
<Box>
{/* Priority 2 Alert Banner - Show at top of dashboard */}
<Priority2AlertBanner
alerts={alerts}
onDismiss={dismissAlert}
maxAlerts={3}
/>
{/* Rest of dashboard content */}
{/* ... */}
</Box>
);
};
Step 2: Integrate with Existing Alert System
The Priority 2 alerts complement the existing UsageAlerts component:
// In EnhancedBillingDashboard or CompactBillingDashboard
import Priority2AlertBanner from '../shared/Priority2AlertBanner';
import UsageAlerts from '../billing/UsageAlerts';
// Show both alert types
<Grid container spacing={3}>
<Grid item xs={12}>
{/* Priority 2 Alerts (cost trends, OSS recommendations) */}
<Priority2AlertBanner
alerts={priority2Alerts}
onDismiss={dismissPriority2Alert}
/>
</Grid>
<Grid item xs={12} md={4}>
{/* Existing Usage Alerts (limit warnings) */}
<UsageAlerts
alerts={dashboardData.alerts}
onMarkRead={handleMarkRead}
/>
</Grid>
</Grid>
Blog Writer Integration Example
Full Integration
// In BlogWriter.tsx
import React from 'react';
import { BlogWriterCostAlerts, useBlogWriterCostEstimation } from './BlogWriterUtils/BlogWriterCostAlerts';
import { useSubscription } from '../../contexts/SubscriptionContext';
export const BlogWriter: React.FC = () => {
const { subscription } = useSubscription();
const userId = subscription?.user_id;
const { estimateAndProceed } = useBlogWriterCostEstimation();
// Wrap research action with cost estimation
const handleResearchAction = async () => {
await estimateAndProceed('research', () => {
// Your actual research logic here
blogWriterApi.startResearch(payload);
}, userId);
};
// Wrap outline generation with cost estimation
const handleOutlineGeneration = async () => {
await estimateAndProceed('outline', () => {
// Your actual outline generation logic here
outlineGenRef.current?.generateNow();
}, userId);
};
// Wrap content generation with cost estimation
const handleContentGeneration = async () => {
await estimateAndProceed('content', () => {
// Your actual content generation logic here
generateContent();
}, userId);
};
return (
<div>
{/* Priority 2 Alerts Banner */}
<BlogWriterCostAlerts
userId={userId}
onResearchStart={handleResearchAction}
onOutlineStart={handleOutlineGeneration}
onContentStart={handleContentGeneration}
/>
{/* Rest of Blog Writer UI */}
{/* ... */}
</div>
);
};
Minimal Integration (Just Alerts)
// Simple integration - just show alerts, no cost estimation
import { BlogWriterCostAlerts } from './BlogWriterUtils/BlogWriterCostAlerts';
// In your Blog Writer component
<BlogWriterCostAlerts userId={userId} />
Image Studio Integration Example
Full Integration
// In CreateStudio.tsx
import React, { useState } from 'react';
import { CreateStudioCostAlerts, useImageStudioCostEstimation } from './CreateStudioCostAlerts';
import { useSubscription } from '../../contexts/SubscriptionContext';
export const CreateStudio: React.FC = () => {
const { subscription } = useSubscription();
const userId = subscription?.user_id;
const [provider, setProvider] = useState('wavespeed');
const [model, setModel] = useState('qwen-image');
const [numVariations, setNumVariations] = useState(1);
const { estimateAndGenerate } = useImageStudioCostEstimation();
const handleGenerate = async () => {
await estimateAndGenerate(
provider,
model,
numVariations,
() => {
// Your actual image generation logic
generateImage(prompt, { provider, model, numVariations });
},
userId
);
};
return (
<Box>
{/* Priority 2 Alerts with Cost Estimation */}
<CreateStudioCostAlerts
userId={userId}
provider={provider}
model={model}
numVariations={numVariations}
onGenerate={handleGenerate}
/>
{/* Image generation form */}
{/* ... */}
</Box>
);
};
Operation Type Examples
Blog Writer Operations
// Research Phase
const researchOperations: PreflightOperation[] = [
{
provider: 'exa',
operation_type: 'research',
tokens_requested: 0, // Exa is per-search, not token-based
},
{
provider: 'exa',
operation_type: 'research',
tokens_requested: 0,
},
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'research',
tokens_requested: 2000, // Analysis tokens
}
];
// Outline Generation
const outlineOperations: PreflightOperation[] = [
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'outline_generation',
tokens_requested: 1500,
}
];
// Content Generation (per section)
const contentOperations: PreflightOperation[] = [
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'content_generation',
tokens_requested: 3000, // Per section
},
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'content_generation',
tokens_requested: 3000,
}
];
Image Studio Operations
// Single Image Generation (OSS Model)
const singleImageOperation: PreflightOperation[] = [
{
provider: 'stability', // WaveSpeed OSS models use 'stability' provider
model: 'qwen-image', // OSS model
operation_type: 'image_generation',
tokens_requested: 0, // Not token-based
}
];
// Multiple Images (Batch)
const batchImageOperations: PreflightOperation[] = Array(5).fill(null).map(() => ({
provider: 'stability',
model: 'ideogram-v3-turbo', // Premium OSS model
operation_type: 'image_generation',
tokens_requested: 0,
}));
// Image Editing
const imageEditOperation: PreflightOperation[] = [
{
provider: 'image_edit',
model: 'qwen-edit', // OSS model
operation_type: 'image_editing',
tokens_requested: 0,
}
];
Story Writer Operations
// Complete Story Generation (with images, audio, video)
const storyOperations: PreflightOperation[] = [
// Outline
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'outline_generation',
tokens_requested: 1500,
},
// Script
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'content_generation',
tokens_requested: 2000,
},
// Images (5 scenes)
...Array(5).fill(null).map(() => ({
provider: 'stability',
model: 'qwen-image',
operation_type: 'image_generation',
tokens_requested: 0,
})),
// Audio (5 scenes)
...Array(5).fill(null).map(() => ({
provider: 'audio',
model: 'minimax-speech-02-hd',
operation_type: 'audio_generation',
tokens_requested: 2000, // ~2000 characters per scene
})),
// Videos (5 scenes)
...Array(5).fill(null).map(() => ({
provider: 'video',
model: 'wan-2.5',
operation_type: 'video_generation',
tokens_requested: 0,
})),
];
Podcast Maker Operations
// Podcast Generation Workflow
const podcastOperations: PreflightOperation[] = [
// Research
{
provider: 'exa',
operation_type: 'research',
tokens_requested: 0,
},
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'research',
tokens_requested: 2000,
},
// Script Generation
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'content_generation',
tokens_requested: 5000, // Longer script
},
// Audio Generation (10 minutes = ~1500 words = ~7500 characters)
{
provider: 'audio',
model: 'minimax-speech-02-hd',
operation_type: 'audio_generation',
tokens_requested: 7500, // Characters = tokens for audio
},
// Optional: Video Generation (5 scenes)
...Array(5).fill(null).map(() => ({
provider: 'video',
model: 'wan-2.5',
operation_type: 'video_generation',
tokens_requested: 0,
})),
];
Video Studio Operations
// Text-to-Video Generation
const textToVideoOperation: PreflightOperation[] = [
{
provider: 'video',
model: 'wan-2.5', // OSS model (default)
operation_type: 'video_generation',
tokens_requested: 0,
}
];
// Image-to-Video Generation
const imageToVideoOperation: PreflightOperation[] = [
{
provider: 'video',
model: 'wan-2.5',
operation_type: 'video_generation',
tokens_requested: 0,
}
];
// Premium Video (Longer Duration)
const premiumVideoOperation: PreflightOperation[] = [
{
provider: 'video',
model: 'seedance-1.5-pro', // OSS model for longer videos
operation_type: 'video_generation',
tokens_requested: 0,
}
];
Social Media Writer Operations
// Facebook/LinkedIn Post Generation
const socialPostOperations: PreflightOperation[] = [
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'content_generation',
tokens_requested: 1000, // Short post
},
// Optional: Image Generation
{
provider: 'stability',
model: 'qwen-image',
operation_type: 'image_generation',
tokens_requested: 0,
}
];
// Twitter Thread Generation
const twitterThreadOperations: PreflightOperation[] = [
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'content_generation',
tokens_requested: 2000, // Multiple tweets
}
];
SEO Tools Operations
// SEO Analysis
const seoAnalysisOperations: PreflightOperation[] = [
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'seo_analysis',
tokens_requested: 2500, // Comprehensive analysis
}
];
// Content Gap Analysis
const contentGapOperations: PreflightOperation[] = [
{
provider: 'exa',
operation_type: 'research',
tokens_requested: 0,
},
{
provider: 'gemini',
model: 'gemini-2.5-flash',
operation_type: 'research',
tokens_requested: 3000,
}
];
Alert Types Generated
1. Cost Trend Alerts
Triggered When:
- Spending velocity projects budget exhaustion
- Projected cost exceeds 95% of monthly limit
- Daily spending rate is unusually high
Example Alert:
{
id: 'cost-velocity-high',
type: 'cost_trend',
severity: 'warning',
title: 'High Spending Velocity Detected',
message: 'Your current spending rate projects to $42.50 this month (94% of limit). At this rate, you'll exhaust your budget in ~8 days.',
action: {
label: 'View Cost Trends',
onClick: () => window.location.href = '/billing'
}
}
2. OSS Recommendation Alerts
Triggered When:
- User is using expensive models when cheaper OSS alternatives exist
- Significant cost savings available by switching models
Example Alert:
{
id: 'oss-image-recommendation',
type: 'oss_recommendation',
severity: 'info',
title: '💡 Cost Savings Opportunity',
message: 'You've spent $2.00 on image generation. Switch to Qwen Image OSS model to save ~$0.50 (25% cheaper at $0.03/image vs $0.04/image).',
action: {
label: 'Learn More',
onClick: () => showToastNotification('OSS models are automatically used as defaults in Basic tier', 'info')
}
}
3. Cost Estimation Alerts
Triggered When:
- User is about to perform an expensive operation (>$0.01)
- Operation represents significant portion of monthly budget (>5%)
Example Alert:
{
id: 'cost-estimation-high',
type: 'cost_estimation',
severity: 'warning',
title: 'High-Cost Operation Warning',
message: 'This video generation will cost approximately $1.25. This represents 2.8% of your monthly budget.',
action: {
label: 'Proceed',
onClick: () => performOperation()
}
}
Integration Checklist
Main Dashboard
- Import
usePriority2Alertshook - Import
Priority2AlertBannercomponent - Add alert banner at top of dashboard
- Configure refresh interval (default: 2 minutes)
- Test alert generation and dismissal
Blog Writer
- Import
BlogWriterCostAlertscomponent - Add component to Blog Writer layout
- Wrap research/outline/content actions with cost estimation
- Test cost estimation before operations
- Verify OSS recommendations appear
Image Studio
- Import
CreateStudioCostAlertscomponent - Add component to Create Studio layout
- Pass provider/model/numVariations props
- Integrate cost estimation with generate button
- Test OSS model recommendations
Other Tools
- Story Writer: Add cost alerts for story generation
- Podcast Maker: Add cost alerts for podcast generation
- Video Studio: Add cost alerts for video generation
- Social Media Writers: Add cost alerts for post generation
Testing
Test Cases
-
Cost Trend Alerts
- High spending velocity detected
- Budget exhaustion projection shown
- Alert appears at correct thresholds
-
OSS Recommendations
- Recommendation appears when using expensive models
- Savings calculation is accurate
- Alert is dismissible
-
Cost Estimation
- Estimation shown before expensive operations
- User can proceed or cancel
- Estimation is accurate (±10%)
-
Alert Persistence
- Dismissed alerts don't reappear
- Alerts refresh at configured interval
- Critical alerts cannot be dismissed
Best Practices
- Don't Block Users: Always allow operations to proceed even if estimation fails
- Cache Alerts: Use localStorage to prevent showing same alert repeatedly
- Progressive Enhancement: Alerts enhance UX but shouldn't break functionality
- Clear Actions: Provide actionable buttons in alerts (e.g., "View Billing", "Upgrade Plan")
- Contextual Alerts: Show alerts relevant to current tool/operation
- Respect User Preferences: Allow users to dismiss non-critical alerts
Next Steps
- Integrate into Main Dashboard: Add
Priority2AlertBannerto main dashboard - Add to Blog Writer: Integrate
BlogWriterCostAlertscomponent - Add to Image Studio: Integrate
CreateStudioCostAlertscomponent - Extend to Other Tools: Add similar integrations to Story Writer, Podcast Maker, etc.
- Monitor Performance: Track alert generation performance and user engagement
Last Updated: January 2026