feat: Implement smart AI features - contextual follow-up questions
Smart Features Completed: 1. Growth Spurt Detection - Already fully implemented ✅ - Backend: Pattern analysis service with 20%+ feeding spike detection - Frontend: GrowthSpurtAlert component with collapsible details - Age-based probability calculation (2,3,6,12,16,24,36 weeks) - Integrated into analytics dashboard 2. AI Personalization System - Already fully implemented ✅ - Backend: PersonalizationService with preference tracking - Response style adaptation (Concise/Detailed/Balanced) - Tone customization (Friendly/Professional/Casual/Empathetic) - Topic weight learning and feedback integration - Formatting preferences (bullets, step-by-step, examples) 3. Suggested Follow-Up Questions - NEW IMPLEMENTATION 🧠 - Created SuggestedQuestions component with animated Chip buttons - Context-aware question generation based on topic detection - 7 topic categories: sleep, feeding, development, health, crying, schedule, growth - Smart question selection using keyword matching - One-tap to ask follow-up (auto-sends message) - Framer Motion animations with glass morphism design - Integrated into AIChatInterface after each AI response Files Changed: Frontend: - components/features/ai-chat/SuggestedQuestions.tsx (new) - lib/ai/suggestedQuestions.ts (new) - components/features/ai-chat/AIChatInterface.tsx (modified) Documentation: - docs/REMAINING_FEATURES.md (updated) * 76/139 features complete (55%) * All high-priority + smart features complete! * Updated statistics and checklists Technical Implementation: - Topic detection with regex pattern matching - Generic follow-up questions as fallback - Response-specific question prioritization - Duplicate removal and smart limiting - Integration with existing chat message flow 🎉 Result: ParentFlow AI is now smart, personalized, and interactive! Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -55,12 +55,15 @@ import remarkGfm from 'remark-gfm';
|
||||
import { useTranslation } from '@/hooks/useTranslation';
|
||||
import { useStreamingChat } from '@/hooks/useStreamingChat';
|
||||
import { MessageFeedback } from './MessageFeedback';
|
||||
import { SuggestedQuestions } from './SuggestedQuestions';
|
||||
import { generateFollowUpQuestions } from '@/lib/ai/suggestedQuestions';
|
||||
|
||||
interface Message {
|
||||
id: string;
|
||||
role: 'user' | 'assistant';
|
||||
content: string;
|
||||
timestamp: Date;
|
||||
suggestedQuestions?: string[];
|
||||
}
|
||||
|
||||
interface Conversation {
|
||||
@@ -374,12 +377,20 @@ export const AIChatInterface: React.FC = () => {
|
||||
},
|
||||
// On complete
|
||||
() => {
|
||||
// Generate suggested follow-up questions
|
||||
const suggestedQuestions = generateFollowUpQuestions(
|
||||
messageText,
|
||||
accumulatedMessage,
|
||||
3
|
||||
);
|
||||
|
||||
// Add the complete message to messages
|
||||
const assistantMessage: Message = {
|
||||
id: (Date.now() + 1).toString(),
|
||||
role: 'assistant',
|
||||
content: accumulatedMessage,
|
||||
timestamp: new Date(),
|
||||
suggestedQuestions,
|
||||
};
|
||||
setMessages((prev) => [...prev, assistantMessage]);
|
||||
setStreamingMessage('');
|
||||
@@ -418,11 +429,20 @@ export const AIChatInterface: React.FC = () => {
|
||||
});
|
||||
|
||||
const responseData = response.data.data;
|
||||
|
||||
// Generate suggested follow-up questions
|
||||
const suggestedQuestions = generateFollowUpQuestions(
|
||||
messageText,
|
||||
responseData.message,
|
||||
3
|
||||
);
|
||||
|
||||
const assistantMessage: Message = {
|
||||
id: (Date.now() + 1).toString(),
|
||||
role: 'assistant',
|
||||
content: responseData.message,
|
||||
timestamp: new Date(responseData.timestamp),
|
||||
suggestedQuestions,
|
||||
};
|
||||
|
||||
setMessages((prev) => [...prev, assistantMessage]);
|
||||
@@ -801,6 +821,17 @@ export const AIChatInterface: React.FC = () => {
|
||||
</Avatar>
|
||||
)}
|
||||
</Box>
|
||||
|
||||
{/* Suggested Follow-up Questions */}
|
||||
{message.role === 'assistant' && message.suggestedQuestions && message.suggestedQuestions.length > 0 && (
|
||||
<Box sx={{ maxWidth: '70%', ml: 7 }}>
|
||||
<SuggestedQuestions
|
||||
questions={message.suggestedQuestions}
|
||||
onQuestionClick={handleSuggestedQuestion}
|
||||
loading={isLoading}
|
||||
/>
|
||||
</Box>
|
||||
)}
|
||||
</motion.div>
|
||||
))}
|
||||
</AnimatePresence>
|
||||
|
||||
Reference in New Issue
Block a user