Add AI Studio with agentic system, SnapGen video gen, Perchance image gen

Features:
- AI Studio module with 4 tabs: Video Generation, Image Generation, Lesson Plan, AI Agent Chat
- SnapGen AI API integration for video lesson generation (https://api.snapgen.ai/uapi/v1/generate)
  - Educational prompt enhancement with subject/topic/language context
  - Async polling for video generation status
  - Fallback to z-ai-web-dev-sdk if SnapGen not configured
- Perchance AI API integration for image generation (https://perchance.org/text-to-image-plugin)
  - Multiple styles: realistic, cartoon, watercolor, pixel, sketch, 3D
  - Fallback to z-ai-web-dev-sdk if Perchance not configured
- Agentic AI chat with teacher assistant context
- AI lesson plan generation

Fixes:
- Fix duplicate close button in onboarding tour (removed default Dialog close, kept custom one)
- Add SnapGen and Perchance fields to AISettings model

Navigation:
- AI Studio added to Insights section (teachers) and Student nav
- Digital Notebook confirmed available for both students and teachers
This commit is contained in:
Z User committed 2026-08-10 16:33:23 +00:00
1 parent c078ec36aa
commit 763ebef22b
8 files changed
+1278 -2

No files matched your search

+5
View File
@@ -177,6 +177,7 @@ import SubjectsView from './subjects-view';
import CounselingView from './counseling-view';
import DisciplinaryView from './disciplinary-view';
import AITestsView from './ai-tests-view';
import AIStudioView from './ai-studio-view';
import AIChatWidget from './ai-chat-widget';
import VirtualCharacter from './virtual-character';
import ParentPortalView from './parent-portal-view';
@@ -285,6 +286,8 @@ const navSections: NavSection[] = [
{ key: 'grade-analytics', icon: BarChart3, labelKey: 'nav.grade-analytics' },
{ key: 'reports', icon: FileText, labelKey: 'nav.reports' },
{ key: 'ai-tests', icon: Brain, labelKey: 'ai_tests.title' },
{ key: 'ai-studio', icon: Sparkles, labelKey: 'nav.ai-studio' },
{ key: 'ai-studio', icon: Sparkles, labelKey: 'nav.ai-studio' },
{ key: 'data-import-export', icon: Database, labelKey: 'nav.data-import-export' },
],
},
@@ -321,6 +324,7 @@ const studentNavSections: NavSection[] = [
{ key: 'communication', icon: MessageSquare, labelKey: 'nav.communication' },
{ key: 'counseling', icon: Heart, labelKey: 'counseling.title' },
{ key: 'ai-tests', icon: Brain, labelKey: 'ai_tests.title' },
{ key: 'ai-studio', icon: Sparkles, labelKey: 'nav.ai-studio' },
{ key: 'tablet-grading', icon: Tablet, labelKey: 'nav.tablet_grading' },
{ key: 'exam-calendar', icon: CalendarClock, labelKey: 'nav.exam_calendar' },
{ key: 'peer-assessment', icon: UsersRound, labelKey: 'nav.peer-assessment' },
@@ -509,6 +513,7 @@ function renderView(view: ViewName) {
case 'counseling': return <CounselingView />;
case 'disciplinary': return <DisciplinaryView />;
case 'ai-tests': return <AITestsView />;
case 'ai-studio': return <AIStudioView />;
case 'parent-portal': return <ParentPortalView />;
case 'notification-center': return <NotificationCenterView />;
case 'announcements': return <SchoolAnnouncementsView />;